From 5d070fc9a5428e9349cce1c5caa8260ba5809306 Mon Sep 17 00:00:00 2001 From: Serghey Rodin Date: Wed, 28 Oct 2015 16:39:39 +0200 Subject: [PATCH] Fixes for FM --- web/css/file_manager.css | 3 +- web/css/file_manager_editor.css | 11 +- web/css/styles.min.css | 156 +++- web/file_manager/UploadHandler.php | 1343 --------------------------- web/file_manager/index.php | 15 - web/file_manager/upload_file.php | 38 - web/images/sprite.png | Bin 52380 -> 50443 bytes web/js/events.js | 69 +- web/js/file_manager.js | 5 +- web/js/i18n.js.php | 2 +- web/templates/file_manager/main.php | 22 +- web/templates/footer.html | 83 +- web/upload/UploadHandler.php | 16 +- 13 files changed, 274 insertions(+), 1489 deletions(-) delete mode 100644 web/file_manager/UploadHandler.php delete mode 100644 web/file_manager/index.php delete mode 100644 web/file_manager/upload_file.php diff --git a/web/css/file_manager.css b/web/css/file_manager.css index bd805998e..c78137077 100644 --- a/web/css/file_manager.css +++ b/web/css/file_manager.css @@ -556,11 +556,12 @@ input[type="checkbox"] { .menu div.button { display: none; } .menu div.button.medium, .menu div.button.small { display: inline-block; } - .listing li .filename-holder { max-width: 20%; } } @media (max-width: 1080px) { + .listing li .filename-holder { max-width: 36%; } .listing li .owner { display: none; } + .listing li .mode { display: none; } } @media (max-width: 890px) { diff --git a/web/css/file_manager_editor.css b/web/css/file_manager_editor.css index 1730e5410..f0800e777 100644 --- a/web/css/file_manager_editor.css +++ b/web/css/file_manager_editor.css @@ -1,11 +1,10 @@ body, form { padding: 0; margin: 0; background: #333; } -input.save { +input.save { background-color: rgba(247, 165, 48, 0.8); border: 1px solid #f79b44; border-radius: 3px; -/* bottom: 17px;*/ top: 9px; color: #fafafa; cursor: pointer; @@ -32,13 +31,5 @@ input.save:active { border: 1px solid #FFCC00; background-color: #FFCC00; color: .ace-twilight .ace_gutter-active-line { margin-top: 10px; } .ace_gutter-cell { color: #777; } -/* -.ace_gutter-cell { color: #777; padding: 9px 0px 0px 4px; } -.ace_line { padding: 9px 0px 0px 4px; } - -.ace_editor, -.ace-twilight .ace_cursor, -.ace_text-input { font-size: 17px; } -*/ .ace_editor { font-size: 19px !important; } diff --git a/web/css/styles.min.css b/web/css/styles.min.css index 9fcace9d2..bb5c3b3ec 100644 --- a/web/css/styles.min.css +++ b/web/css/styles.min.css @@ -663,7 +663,7 @@ input[type="checkbox"] { height: 22px; margin-top: 4px; width: 73px; - margin-left: -11px; + margin-left: -2px; } .l-header { @@ -746,7 +746,8 @@ input[type="checkbox"] { float: left; color: #a4abad; font-weight: 700; - padding: 10px 5px; + padding: 10px 0 0 10px; + margin-right: 12px; } .l-profile__username:hover { color: #ffd62e; @@ -759,8 +760,8 @@ input[type="checkbox"] { .l-profile__logout { float: left; color: #fff; - margin-left: 40px; - padding: 10px 5px; +/* margin-left: 40px; */ + padding: 10px 0 0 10px; } .l-profile__logout:hover { color: #C0E60E; @@ -775,6 +776,111 @@ input[type="checkbox"] { padding: 8px 5px; } +.l-profile__notifications { + background: url("/images/sprite.png") no-repeat scroll -129px -135px; + border-radius: 30px; + color: #fff; + cursor: pointer; + float: left; + font-weight: bold; + height: 15px; + margin-right: 4px; + margin-top: 5px; + padding: 10px 5px 0; + width: 15px; +} +.l-profile__notifications.active { + background-color: #454545; +} +.l-profile__notifications:hover { + background-color: #333; +} +.l-profile__notifications:active { + background-color: #c4da5e; +} +.l-profile__notifications.updates { + background-position: -165px -135px; +} + +.l-profile__notifications.updates2 { +/* background-position: -202px -135px; */ + background-position: -202px -157px; +} + +.notification-container { + background-color: #454545; + box-shadow: 0 2px 7px 0 rgba(0, 0, 0, 0.3); + list-style-type: none; + margin: 0; + overflow: hidden; + padding-left: 0; + position: fixed; + top: 34px; + width: 351px; + z-index: 21; + font-size: 12px; + padding: 0; + color: #9E9E9E; +} +.notification-container li { + border-bottom: 1px solid #555; + padding: 10px 15px 24px; +} +.notification-container .mark-seen { + background: rgba(0, 0, 0, 0) url("/images/sprite.png") repeat scroll -427px -486px; + border: 5px solid #454545; + border-radius: 12px; + cursor: pointer; + display: inline-block; + float: right; + height: 9px; + margin-right: -8px; + margin-top: -3px; + width: 9px; +} +.notification-container .mark-seen:hover { + background-color: #333; + border-color: #333; +} +.notification-container .mark-seen:active { + background-color: #777; + border-color: #777; +} +.notification-container .title { + color: #9e9e9e; + font-weight: bold; + line-height: 30px; + padding: 0; + text-transform: none; + float: none; + display: block; +} +.notification-container .title a { + color: #9e9e9e; +} + +.notification-container .unseen .title a, +.notification-container .unseen .title { + color: #C4DA5E; +} +.notification-container .unseen .title a:hover { + color: #ffcc00; +} +.notification-container .unseen .title a:active { + color: #dacf2e; +} + + +.notification-container a { + color: #5ABDB5;/* #eee;*/ +} +.notification-container a:hover { + color: #2CA99B; +} +.notification-container a:active { + color: #00C0C0; +} + .l-stat { @@ -1406,7 +1512,7 @@ div.l-content > div.l-separator:nth-of-type(4) { width: 250px; } .l-unit__stat-col--left.wide-4 { - width: 575px; + width: 550px; } @@ -2686,6 +2792,7 @@ form#vstobjects.suspended { padding: 3px 14px 3px 27px; position: absolute; text-transform: uppercase; + word-break: keep-all; z-index: -1; } @@ -2838,7 +2945,7 @@ form#vstobjects.suspended { .description { font-weight: normal; line-height: 25px; - padding-bottom: 20px; + padding-bottom: 45px; margin-left: 50px; } .description ul{ @@ -2857,13 +2964,13 @@ form#vstobjects.suspended { color: #2c9491; } .description a.purchase { - color: #86A307; + color: #FFF; background-color: #9fbf0c; + border: none; border-radius: 3px; - color: #fff; font-size: 13px; font-weight: bold; - padding: 7px; + padding: 7px 15px;; text-transform: capitalize; text-decoration: none; } @@ -2871,6 +2978,30 @@ form#vstobjects.suspended { background-color: #c0e60f; color: #555; } +.description a.purchase:active { + background-color: #D9F210; + color: #555; +} + +.description a.cancel { + background-color: #999; + border: none; + border-radius: 3px; + color: #fff; + font-size: 13px; + font-weight: bold; + padding: 7px 15px; + text-transform: capitalize; + text-decoration: none; +} +.description a.cancel:hover { + background-color: #2c9491; +} +.description a.cancel:active { + background-color: #5f9491; +} + + .description .licence { padding: 20px 0; color: #2c9491; @@ -2887,3 +3018,10 @@ form#vstobjects.suspended { padding-top: 20px; } +.description .twoco { + font-style: italic; + line-height: 15px; + font-size: 12px; +} + + diff --git a/web/file_manager/UploadHandler.php b/web/file_manager/UploadHandler.php deleted file mode 100644 index 56b67c541..000000000 --- a/web/file_manager/UploadHandler.php +++ /dev/null @@ -1,1343 +0,0 @@ - 'The uploaded file exceeds the upload_max_filesize directive in php.ini', - 2 => 'The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form', - 3 => 'The uploaded file was only partially uploaded', - 4 => 'No file was uploaded', - 6 => 'Missing a temporary folder', - 7 => 'Failed to write file to disk', - 8 => 'A PHP extension stopped the file upload', - 'post_max_size' => 'The uploaded file exceeds the post_max_size directive in php.ini', - 'max_file_size' => 'File is too big', - 'min_file_size' => 'File is too small', - 'accept_file_types' => 'Filetype not allowed', - 'max_number_of_files' => 'Maximum number of files exceeded', - 'max_width' => 'Image exceeds maximum width', - 'min_width' => 'Image requires a minimum width', - 'max_height' => 'Image exceeds maximum height', - 'min_height' => 'Image requires a minimum height', - 'abort' => 'File upload aborted', - 'image_resize' => 'Failed to resize image' - ); - - protected $image_objects = array(); - - function __construct($options = null, $initialize = true, $error_messages = null) { - $this->options = array( - 'script_url' => $this->get_full_url().'/', - 'upload_dir' => dirname($this->get_server_var('SCRIPT_FILENAME')).'/files/', - 'upload_url' => $this->get_full_url().'/files/', - 'user_dirs' => false, - 'mkdir_mode' => 0755, - 'param_name' => 'files', - // Set the following option to 'POST', if your server does not support - // DELETE requests. This is a parameter sent to the client: - 'delete_type' => 'DELETE', - 'access_control_allow_origin' => '*', - 'access_control_allow_credentials' => false, - 'access_control_allow_methods' => array( - 'OPTIONS', - 'HEAD', - 'GET', - 'POST', - 'PUT', - 'PATCH', - 'DELETE' - ), - 'access_control_allow_headers' => array( - 'Content-Type', - 'Content-Range', - 'Content-Disposition' - ), - // Enable to provide file downloads via GET requests to the PHP script: - // 1. Set to 1 to download files via readfile method through PHP - // 2. Set to 2 to send a X-Sendfile header for lighttpd/Apache - // 3. Set to 3 to send a X-Accel-Redirect header for nginx - // If set to 2 or 3, adjust the upload_url option to the base path of - // the redirect parameter, e.g. '/files/'. - 'download_via_php' => false, - // Read files in chunks to avoid memory limits when download_via_php - // is enabled, set to 0 to disable chunked reading of files: - 'readfile_chunk_size' => 10 * 1024 * 1024, // 10 MiB - // Defines which files can be displayed inline when downloaded: - 'inline_file_types' => '/\.(gif|jpe?g|png)$/i', - // Defines which files (based on their names) are accepted for upload: - 'accept_file_types' => '/.+$/i', - // The php.ini settings upload_max_filesize and post_max_size - // take precedence over the following max_file_size setting: - 'max_file_size' => null, - 'min_file_size' => 0, - // The maximum number of files for the upload directory: - 'max_number_of_files' => null, - // Defines which files are handled as image files: - 'image_file_types' => '/\.(gif|jpe?g|png)$/i', - // Use exif_imagetype on all files to correct file extensions: - 'correct_image_extensions' => false, - // Image resolution restrictions: - 'max_width' => null, - 'max_height' => null, - 'min_width' => 1, - 'min_height' => 1, - // Set the following option to false to enable resumable uploads: - 'discard_aborted_uploads' => true, - // Set to 0 to use the GD library to scale and orient images, - // set to 1 to use imagick (if installed, falls back to GD), - // set to 2 to use the ImageMagick convert binary directly: - 'image_library' => 1, - // Uncomment the following to define an array of resource limits - // for imagick: - /* - 'imagick_resource_limits' => array( - imagick::RESOURCETYPE_MAP => 32, - imagick::RESOURCETYPE_MEMORY => 32 - ), - */ - // Command or path for to the ImageMagick convert binary: - 'convert_bin' => 'convert', - // Uncomment the following to add parameters in front of each - // ImageMagick convert call (the limit constraints seem only - // to have an effect if put in front): - /* - 'convert_params' => '-limit memory 32MiB -limit map 32MiB', - */ - // Command or path for to the ImageMagick identify binary: - 'identify_bin' => 'identify', - 'image_versions' => array( - // The empty image version key defines options for the original image: - '' => array( - // Automatically rotate images based on EXIF meta data: - 'auto_orient' => true - ), - // Uncomment the following to create medium sized images: - /* - 'medium' => array( - 'max_width' => 800, - 'max_height' => 600 - ), - */ - 'thumbnail' => array( - // Uncomment the following to use a defined directory for the thumbnails - // instead of a subdirectory based on the version identifier. - // Make sure that this directory doesn't allow execution of files if you - // don't pose any restrictions on the type of uploaded files, e.g. by - // copying the .htaccess file from the files directory for Apache: - //'upload_dir' => dirname($this->get_server_var('SCRIPT_FILENAME')).'/thumb/', - //'upload_url' => $this->get_full_url().'/thumb/', - // Uncomment the following to force the max - // dimensions and e.g. create square thumbnails: - //'crop' => true, - 'max_width' => 80, - 'max_height' => 80 - ) - ) - ); - if ($options) { - $this->options = $options + $this->options; - } - if ($error_messages) { - $this->error_messages = $error_messages + $this->error_messages; - } - if ($initialize) { - $this->initialize(); - } - } - - protected function initialize() { - switch ($this->get_server_var('REQUEST_METHOD')) { - case 'OPTIONS': - case 'HEAD': - $this->head(); - break; - case 'GET': - $this->get(); - break; - case 'PATCH': - case 'PUT': - case 'POST': - $this->post(); - break; - case 'DELETE': - $this->delete(); - break; - default: - $this->header('HTTP/1.1 405 Method Not Allowed'); - } - } - - protected function get_full_url() { - $https = !empty($_SERVER['HTTPS']) && strcasecmp($_SERVER['HTTPS'], 'on') === 0 || - !empty($_SERVER['HTTP_X_FORWARDED_PROTO']) && - strcasecmp($_SERVER['HTTP_X_FORWARDED_PROTO'], 'https') === 0; - return - ($https ? 'https://' : 'http://'). - (!empty($_SERVER['REMOTE_USER']) ? $_SERVER['REMOTE_USER'].'@' : ''). - (isset($_SERVER['HTTP_HOST']) ? $_SERVER['HTTP_HOST'] : ($_SERVER['SERVER_NAME']. - ($https && $_SERVER['SERVER_PORT'] === 443 || - $_SERVER['SERVER_PORT'] === 80 ? '' : ':'.$_SERVER['SERVER_PORT']))). - substr($_SERVER['SCRIPT_NAME'],0, strrpos($_SERVER['SCRIPT_NAME'], '/')); - } - - protected function get_user_id() { - @session_start(); - return session_id(); - } - - protected function get_user_path() { - if ($this->options['user_dirs']) { - return $this->get_user_id().'/'; - } - return ''; - } - - protected function get_upload_path($file_name = null, $version = null) { - $file_name = $file_name ? $file_name : ''; - if (empty($version)) { - $version_path = ''; - } else { - $version_dir = @$this->options['image_versions'][$version]['upload_dir']; - if ($version_dir) { - return $version_dir.$this->get_user_path().$file_name; - } - $version_path = $version.'/'; - } - return $this->options['upload_dir'].$this->get_user_path() - .$version_path.$file_name; - } - - protected function get_query_separator($url) { - return strpos($url, '?') === false ? '?' : '&'; - } - - protected function get_download_url($file_name, $version = null, $direct = false) { - if (!$direct && $this->options['download_via_php']) { - $url = $this->options['script_url'] - .$this->get_query_separator($this->options['script_url']) - .$this->get_singular_param_name() - .'='.rawurlencode($file_name); - if ($version) { - $url .= '&version='.rawurlencode($version); - } - return $url.'&download=1'; - } - if (empty($version)) { - $version_path = ''; - } else { - $version_url = @$this->options['image_versions'][$version]['upload_url']; - if ($version_url) { - return $version_url.$this->get_user_path().rawurlencode($file_name); - } - $version_path = rawurlencode($version).'/'; - } - return $this->options['upload_url'].$this->get_user_path() - .$version_path.rawurlencode($file_name); - } - - protected function set_additional_file_properties($file) { - $file->deleteUrl = $this->options['script_url'] - .$this->get_query_separator($this->options['script_url']) - .$this->get_singular_param_name() - .'='.rawurlencode($file->name); - $file->deleteType = $this->options['delete_type']; - if ($file->deleteType !== 'DELETE') { - $file->deleteUrl .= '&_method=DELETE'; - } - if ($this->options['access_control_allow_credentials']) { - $file->deleteWithCredentials = true; - } - } - - // Fix for overflowing signed 32 bit integers, - // works for sizes up to 2^32-1 bytes (4 GiB - 1): - protected function fix_integer_overflow($size) { - if ($size < 0) { - $size += 2.0 * (PHP_INT_MAX + 1); - } - return $size; - } - - protected function get_file_size($file_path, $clear_stat_cache = false) { - if ($clear_stat_cache) { - if (version_compare(PHP_VERSION, '5.3.0') >= 0) { - clearstatcache(true, $file_path); - } else { - clearstatcache(); - } - } - return $this->fix_integer_overflow(filesize($file_path)); - } - - protected function is_valid_file_object($file_name) { - $file_path = $this->get_upload_path($file_name); - if (is_file($file_path) && $file_name[0] !== '.') { - return true; - } - return false; - } - - protected function get_file_object($file_name) { - if ($this->is_valid_file_object($file_name)) { - $file = new \stdClass(); - $file->name = $file_name; - $file->size = $this->get_file_size( - $this->get_upload_path($file_name) - ); - $file->url = $this->get_download_url($file->name); - foreach($this->options['image_versions'] as $version => $options) { - if (!empty($version)) { - if (is_file($this->get_upload_path($file_name, $version))) { - $file->{$version.'Url'} = $this->get_download_url( - $file->name, - $version - ); - } - } - } - $this->set_additional_file_properties($file); - return $file; - } - return null; - } - - protected function get_file_objects($iteration_method = 'get_file_object') { - $upload_dir = $this->get_upload_path(); - if (!is_dir($upload_dir)) { - return array(); - } - return array_values(array_filter(array_map( - array($this, $iteration_method), - scandir($upload_dir) - ))); - } - - protected function count_file_objects() { - return count($this->get_file_objects('is_valid_file_object')); - } - - protected function get_error_message($error) { - return array_key_exists($error, $this->error_messages) ? - $this->error_messages[$error] : $error; - } - - function get_config_bytes($val) { - $val = trim($val); - $last = strtolower($val[strlen($val)-1]); - switch($last) { - case 'g': - $val *= 1024; - case 'm': - $val *= 1024; - case 'k': - $val *= 1024; - } - return $this->fix_integer_overflow($val); - } - - protected function validate($uploaded_file, $file, $error, $index) { - if ($error) { - $file->error = $this->get_error_message($error); - return false; - } - $content_length = $this->fix_integer_overflow(intval( - $this->get_server_var('CONTENT_LENGTH') - )); - $post_max_size = $this->get_config_bytes(ini_get('post_max_size')); - if ($post_max_size && ($content_length > $post_max_size)) { - $file->error = $this->get_error_message('post_max_size'); - return false; - } - if (!preg_match($this->options['accept_file_types'], $file->name)) { - $file->error = $this->get_error_message('accept_file_types'); - return false; - } - if ($uploaded_file && is_uploaded_file($uploaded_file)) { - $file_size = $this->get_file_size($uploaded_file); - } else { - $file_size = $content_length; - } - if ($this->options['max_file_size'] && ( - $file_size > $this->options['max_file_size'] || - $file->size > $this->options['max_file_size']) - ) { - $file->error = $this->get_error_message('max_file_size'); - return false; - } - if ($this->options['min_file_size'] && - $file_size < $this->options['min_file_size']) { - $file->error = $this->get_error_message('min_file_size'); - return false; - } - if (is_int($this->options['max_number_of_files']) && - ($this->count_file_objects() >= $this->options['max_number_of_files']) && - // Ignore additional chunks of existing files: - !is_file($this->get_upload_path($file->name))) { - $file->error = $this->get_error_message('max_number_of_files'); - return false; - } - $max_width = @$this->options['max_width']; - $max_height = @$this->options['max_height']; - $min_width = @$this->options['min_width']; - $min_height = @$this->options['min_height']; - if (($max_width || $max_height || $min_width || $min_height) - && preg_match($this->options['image_file_types'], $file->name)) { - list($img_width, $img_height) = $this->get_image_size($uploaded_file); - } - if (!empty($img_width)) { - if ($max_width && $img_width > $max_width) { - $file->error = $this->get_error_message('max_width'); - return false; - } - if ($max_height && $img_height > $max_height) { - $file->error = $this->get_error_message('max_height'); - return false; - } - if ($min_width && $img_width < $min_width) { - $file->error = $this->get_error_message('min_width'); - return false; - } - if ($min_height && $img_height < $min_height) { - $file->error = $this->get_error_message('min_height'); - return false; - } - } - return true; - } - - protected function upcount_name_callback($matches) { - $index = isset($matches[1]) ? intval($matches[1]) + 1 : 1; - $ext = isset($matches[2]) ? $matches[2] : ''; - return ' ('.$index.')'.$ext; - } - - protected function upcount_name($name) { - return preg_replace_callback( - '/(?:(?: \(([\d]+)\))?(\.[^.]+))?$/', - array($this, 'upcount_name_callback'), - $name, - 1 - ); - } - - protected function get_unique_filename($file_path, $name, $size, $type, $error, - $index, $content_range) { - while(is_dir($this->get_upload_path($name))) { - $name = $this->upcount_name($name); - } - // Keep an existing filename if this is part of a chunked upload: - $uploaded_bytes = $this->fix_integer_overflow(intval($content_range[1])); - while(is_file($this->get_upload_path($name))) { - if ($uploaded_bytes === $this->get_file_size( - $this->get_upload_path($name))) { - break; - } - $name = $this->upcount_name($name); - } - return $name; - } - - protected function fix_file_extension($file_path, $name, $size, $type, $error, - $index, $content_range) { - // Add missing file extension for known image types: - if (strpos($name, '.') === false && - preg_match('/^image\/(gif|jpe?g|png)/', $type, $matches)) { - $name .= '.'.$matches[1]; - } - if ($this->options['correct_image_extensions'] && - function_exists('exif_imagetype')) { - switch(@exif_imagetype($file_path)){ - case IMAGETYPE_JPEG: - $extensions = array('jpg', 'jpeg'); - break; - case IMAGETYPE_PNG: - $extensions = array('png'); - break; - case IMAGETYPE_GIF: - $extensions = array('gif'); - break; - } - // Adjust incorrect image file extensions: - if (!empty($extensions)) { - $parts = explode('.', $name); - $extIndex = count($parts) - 1; - $ext = strtolower(@$parts[$extIndex]); - if (!in_array($ext, $extensions)) { - $parts[$extIndex] = $extensions[0]; - $name = implode('.', $parts); - } - } - } - return $name; - } - - protected function trim_file_name($file_path, $name, $size, $type, $error, - $index, $content_range) { - // Remove path information and dots around the filename, to prevent uploading - // into different directories or replacing hidden system files. - // Also remove control characters and spaces (\x00..\x20) around the filename: - $name = trim(basename(stripslashes($name)), ".\x00..\x20"); - // Use a timestamp for empty filenames: - if (!$name) { - $name = str_replace('.', '-', microtime(true)); - } - return $name; - } - - protected function get_file_name($file_path, $name, $size, $type, $error, - $index, $content_range) { - $name = $this->trim_file_name($file_path, $name, $size, $type, $error, - $index, $content_range); - return $this->get_unique_filename( - $file_path, - $this->fix_file_extension($file_path, $name, $size, $type, $error, - $index, $content_range), - $size, - $type, - $error, - $index, - $content_range - ); - } - - protected function handle_form_data($file, $index) { - // Handle form data, e.g. $_REQUEST['description'][$index] - } - - protected function get_scaled_image_file_paths($file_name, $version) { - $file_path = $this->get_upload_path($file_name); - if (!empty($version)) { - $version_dir = $this->get_upload_path(null, $version); - if (!is_dir($version_dir)) { - mkdir($version_dir, $this->options['mkdir_mode'], true); - } - $new_file_path = $version_dir.'/'.$file_name; - } else { - $new_file_path = $file_path; - } - return array($file_path, $new_file_path); - } - - protected function gd_get_image_object($file_path, $func, $no_cache = false) { - if (empty($this->image_objects[$file_path]) || $no_cache) { - $this->gd_destroy_image_object($file_path); - $this->image_objects[$file_path] = $func($file_path); - } - return $this->image_objects[$file_path]; - } - - protected function gd_set_image_object($file_path, $image) { - $this->gd_destroy_image_object($file_path); - $this->image_objects[$file_path] = $image; - } - - protected function gd_destroy_image_object($file_path) { - $image = (isset($this->image_objects[$file_path])) ? $this->image_objects[$file_path] : null ; - return $image && imagedestroy($image); - } - - protected function gd_imageflip($image, $mode) { - if (function_exists('imageflip')) { - return imageflip($image, $mode); - } - $new_width = $src_width = imagesx($image); - $new_height = $src_height = imagesy($image); - $new_img = imagecreatetruecolor($new_width, $new_height); - $src_x = 0; - $src_y = 0; - switch ($mode) { - case '1': // flip on the horizontal axis - $src_y = $new_height - 1; - $src_height = -$new_height; - break; - case '2': // flip on the vertical axis - $src_x = $new_width - 1; - $src_width = -$new_width; - break; - case '3': // flip on both axes - $src_y = $new_height - 1; - $src_height = -$new_height; - $src_x = $new_width - 1; - $src_width = -$new_width; - break; - default: - return $image; - } - imagecopyresampled( - $new_img, - $image, - 0, - 0, - $src_x, - $src_y, - $new_width, - $new_height, - $src_width, - $src_height - ); - return $new_img; - } - - protected function gd_orient_image($file_path, $src_img) { - if (!function_exists('exif_read_data')) { - return false; - } - $exif = @exif_read_data($file_path); - if ($exif === false) { - return false; - } - $orientation = intval(@$exif['Orientation']); - if ($orientation < 2 || $orientation > 8) { - return false; - } - switch ($orientation) { - case 2: - $new_img = $this->gd_imageflip( - $src_img, - defined('IMG_FLIP_VERTICAL') ? IMG_FLIP_VERTICAL : 2 - ); - break; - case 3: - $new_img = imagerotate($src_img, 180, 0); - break; - case 4: - $new_img = $this->gd_imageflip( - $src_img, - defined('IMG_FLIP_HORIZONTAL') ? IMG_FLIP_HORIZONTAL : 1 - ); - break; - case 5: - $tmp_img = $this->gd_imageflip( - $src_img, - defined('IMG_FLIP_HORIZONTAL') ? IMG_FLIP_HORIZONTAL : 1 - ); - $new_img = imagerotate($tmp_img, 270, 0); - imagedestroy($tmp_img); - break; - case 6: - $new_img = imagerotate($src_img, 270, 0); - break; - case 7: - $tmp_img = $this->gd_imageflip( - $src_img, - defined('IMG_FLIP_VERTICAL') ? IMG_FLIP_VERTICAL : 2 - ); - $new_img = imagerotate($tmp_img, 270, 0); - imagedestroy($tmp_img); - break; - case 8: - $new_img = imagerotate($src_img, 90, 0); - break; - default: - return false; - } - $this->gd_set_image_object($file_path, $new_img); - return true; - } - - protected function gd_create_scaled_image($file_name, $version, $options) { - if (!function_exists('imagecreatetruecolor')) { - error_log('Function not found: imagecreatetruecolor'); - return false; - } - list($file_path, $new_file_path) = - $this->get_scaled_image_file_paths($file_name, $version); - $type = strtolower(substr(strrchr($file_name, '.'), 1)); - switch ($type) { - case 'jpg': - case 'jpeg': - $src_func = 'imagecreatefromjpeg'; - $write_func = 'imagejpeg'; - $image_quality = isset($options['jpeg_quality']) ? - $options['jpeg_quality'] : 75; - break; - case 'gif': - $src_func = 'imagecreatefromgif'; - $write_func = 'imagegif'; - $image_quality = null; - break; - case 'png': - $src_func = 'imagecreatefrompng'; - $write_func = 'imagepng'; - $image_quality = isset($options['png_quality']) ? - $options['png_quality'] : 9; - break; - default: - return false; - } - $src_img = $this->gd_get_image_object( - $file_path, - $src_func, - !empty($options['no_cache']) - ); - $image_oriented = false; - if (!empty($options['auto_orient']) && $this->gd_orient_image( - $file_path, - $src_img - )) { - $image_oriented = true; - $src_img = $this->gd_get_image_object( - $file_path, - $src_func - ); - } - $max_width = $img_width = imagesx($src_img); - $max_height = $img_height = imagesy($src_img); - if (!empty($options['max_width'])) { - $max_width = $options['max_width']; - } - if (!empty($options['max_height'])) { - $max_height = $options['max_height']; - } - $scale = min( - $max_width / $img_width, - $max_height / $img_height - ); - if ($scale >= 1) { - if ($image_oriented) { - return $write_func($src_img, $new_file_path, $image_quality); - } - if ($file_path !== $new_file_path) { - return copy($file_path, $new_file_path); - } - return true; - } - if (empty($options['crop'])) { - $new_width = $img_width * $scale; - $new_height = $img_height * $scale; - $dst_x = 0; - $dst_y = 0; - $new_img = imagecreatetruecolor($new_width, $new_height); - } else { - if (($img_width / $img_height) >= ($max_width / $max_height)) { - $new_width = $img_width / ($img_height / $max_height); - $new_height = $max_height; - } else { - $new_width = $max_width; - $new_height = $img_height / ($img_width / $max_width); - } - $dst_x = 0 - ($new_width - $max_width) / 2; - $dst_y = 0 - ($new_height - $max_height) / 2; - $new_img = imagecreatetruecolor($max_width, $max_height); - } - // Handle transparency in GIF and PNG images: - switch ($type) { - case 'gif': - case 'png': - imagecolortransparent($new_img, imagecolorallocate($new_img, 0, 0, 0)); - case 'png': - imagealphablending($new_img, false); - imagesavealpha($new_img, true); - break; - } - $success = imagecopyresampled( - $new_img, - $src_img, - $dst_x, - $dst_y, - 0, - 0, - $new_width, - $new_height, - $img_width, - $img_height - ) && $write_func($new_img, $new_file_path, $image_quality); - $this->gd_set_image_object($file_path, $new_img); - return $success; - } - - protected function imagick_get_image_object($file_path, $no_cache = false) { - if (empty($this->image_objects[$file_path]) || $no_cache) { - $this->imagick_destroy_image_object($file_path); - $image = new \Imagick(); - if (!empty($this->options['imagick_resource_limits'])) { - foreach ($this->options['imagick_resource_limits'] as $type => $limit) { - $image->setResourceLimit($type, $limit); - } - } - $image->readImage($file_path); - $this->image_objects[$file_path] = $image; - } - return $this->image_objects[$file_path]; - } - - protected function imagick_set_image_object($file_path, $image) { - $this->imagick_destroy_image_object($file_path); - $this->image_objects[$file_path] = $image; - } - - protected function imagick_destroy_image_object($file_path) { - $image = (isset($this->image_objects[$file_path])) ? $this->image_objects[$file_path] : null ; - return $image && $image->destroy(); - } - - protected function imagick_orient_image($image) { - $orientation = $image->getImageOrientation(); - $background = new \ImagickPixel('none'); - switch ($orientation) { - case \imagick::ORIENTATION_TOPRIGHT: // 2 - $image->flopImage(); // horizontal flop around y-axis - break; - case \imagick::ORIENTATION_BOTTOMRIGHT: // 3 - $image->rotateImage($background, 180); - break; - case \imagick::ORIENTATION_BOTTOMLEFT: // 4 - $image->flipImage(); // vertical flip around x-axis - break; - case \imagick::ORIENTATION_LEFTTOP: // 5 - $image->flopImage(); // horizontal flop around y-axis - $image->rotateImage($background, 270); - break; - case \imagick::ORIENTATION_RIGHTTOP: // 6 - $image->rotateImage($background, 90); - break; - case \imagick::ORIENTATION_RIGHTBOTTOM: // 7 - $image->flipImage(); // vertical flip around x-axis - $image->rotateImage($background, 270); - break; - case \imagick::ORIENTATION_LEFTBOTTOM: // 8 - $image->rotateImage($background, 270); - break; - default: - return false; - } - $image->setImageOrientation(\imagick::ORIENTATION_TOPLEFT); // 1 - return true; - } - - protected function imagick_create_scaled_image($file_name, $version, $options) { - list($file_path, $new_file_path) = - $this->get_scaled_image_file_paths($file_name, $version); - $image = $this->imagick_get_image_object( - $file_path, - !empty($options['no_cache']) - ); - if ($image->getImageFormat() === 'GIF') { - // Handle animated GIFs: - $images = $image->coalesceImages(); - foreach ($images as $frame) { - $image = $frame; - $this->imagick_set_image_object($file_name, $image); - break; - } - } - $image_oriented = false; - if (!empty($options['auto_orient'])) { - $image_oriented = $this->imagick_orient_image($image); - } - $new_width = $max_width = $img_width = $image->getImageWidth(); - $new_height = $max_height = $img_height = $image->getImageHeight(); - if (!empty($options['max_width'])) { - $new_width = $max_width = $options['max_width']; - } - if (!empty($options['max_height'])) { - $new_height = $max_height = $options['max_height']; - } - if (!($image_oriented || $max_width < $img_width || $max_height < $img_height)) { - if ($file_path !== $new_file_path) { - return copy($file_path, $new_file_path); - } - return true; - } - $crop = !empty($options['crop']); - if ($crop) { - $x = 0; - $y = 0; - if (($img_width / $img_height) >= ($max_width / $max_height)) { - $new_width = 0; // Enables proportional scaling based on max_height - $x = ($img_width / ($img_height / $max_height) - $max_width) / 2; - } else { - $new_height = 0; // Enables proportional scaling based on max_width - $y = ($img_height / ($img_width / $max_width) - $max_height) / 2; - } - } - $success = $image->resizeImage( - $new_width, - $new_height, - isset($options['filter']) ? $options['filter'] : \imagick::FILTER_LANCZOS, - isset($options['blur']) ? $options['blur'] : 1, - $new_width && $new_height // fit image into constraints if not to be cropped - ); - if ($success && $crop) { - $success = $image->cropImage( - $max_width, - $max_height, - $x, - $y - ); - if ($success) { - $success = $image->setImagePage($max_width, $max_height, 0, 0); - } - } - $type = strtolower(substr(strrchr($file_name, '.'), 1)); - switch ($type) { - case 'jpg': - case 'jpeg': - if (!empty($options['jpeg_quality'])) { - $image->setImageCompression(\imagick::COMPRESSION_JPEG); - $image->setImageCompressionQuality($options['jpeg_quality']); - } - break; - } - if (!empty($options['strip'])) { - $image->stripImage(); - } - return $success && $image->writeImage($new_file_path); - } - - protected function imagemagick_create_scaled_image($file_name, $version, $options) { - list($file_path, $new_file_path) = - $this->get_scaled_image_file_paths($file_name, $version); - $resize = @$options['max_width'] - .(empty($options['max_height']) ? '' : 'X'.$options['max_height']); - if (!$resize && empty($options['auto_orient'])) { - if ($file_path !== $new_file_path) { - return copy($file_path, $new_file_path); - } - return true; - } - $cmd = $this->options['convert_bin']; - if (!empty($this->options['convert_params'])) { - $cmd .= ' '.$this->options['convert_params']; - } - $cmd .= ' '.escapeshellarg($file_path); - if (!empty($options['auto_orient'])) { - $cmd .= ' -auto-orient'; - } - if ($resize) { - // Handle animated GIFs: - $cmd .= ' -coalesce'; - if (empty($options['crop'])) { - $cmd .= ' -resize '.escapeshellarg($resize.'>'); - } else { - $cmd .= ' -resize '.escapeshellarg($resize.'^'); - $cmd .= ' -gravity center'; - $cmd .= ' -crop '.escapeshellarg($resize.'+0+0'); - } - // Make sure the page dimensions are correct (fixes offsets of animated GIFs): - $cmd .= ' +repage'; - } - if (!empty($options['convert_params'])) { - $cmd .= ' '.$options['convert_params']; - } - $cmd .= ' '.escapeshellarg($new_file_path); - exec($cmd, $output, $error); - if ($error) { - error_log(implode('\n', $output)); - return false; - } - return true; - } - - protected function get_image_size($file_path) { - if ($this->options['image_library']) { - if (extension_loaded('imagick')) { - $image = new \Imagick(); - try { - if (@$image->pingImage($file_path)) { - $dimensions = array($image->getImageWidth(), $image->getImageHeight()); - $image->destroy(); - return $dimensions; - } - return false; - } catch (Exception $e) { - error_log($e->getMessage()); - } - } - if ($this->options['image_library'] === 2) { - $cmd = $this->options['identify_bin']; - $cmd .= ' -ping '.escapeshellarg($file_path); - exec($cmd, $output, $error); - if (!$error && !empty($output)) { - // image.jpg JPEG 1920x1080 1920x1080+0+0 8-bit sRGB 465KB 0.000u 0:00.000 - $infos = preg_split('/\s+/', $output[0]); - $dimensions = preg_split('/x/', $infos[2]); - return $dimensions; - } - return false; - } - } - if (!function_exists('getimagesize')) { - error_log('Function not found: getimagesize'); - return false; - } - return @getimagesize($file_path); - } - - protected function create_scaled_image($file_name, $version, $options) { - if ($this->options['image_library'] === 2) { - return $this->imagemagick_create_scaled_image($file_name, $version, $options); - } - if ($this->options['image_library'] && extension_loaded('imagick')) { - return $this->imagick_create_scaled_image($file_name, $version, $options); - } - return $this->gd_create_scaled_image($file_name, $version, $options); - } - - protected function destroy_image_object($file_path) { - if ($this->options['image_library'] && extension_loaded('imagick')) { - return $this->imagick_destroy_image_object($file_path); - } - } - - protected function is_valid_image_file($file_path) { - if (!preg_match($this->options['image_file_types'], $file_path)) { - return false; - } - if (function_exists('exif_imagetype')) { - return @exif_imagetype($file_path); - } - $image_info = $this->get_image_size($file_path); - return $image_info && $image_info[0] && $image_info[1]; - } - - protected function handle_image_file($file_path, $file) { - $failed_versions = array(); - foreach($this->options['image_versions'] as $version => $options) { - if ($this->create_scaled_image($file->name, $version, $options)) { - if (!empty($version)) { - $file->{$version.'Url'} = $this->get_download_url( - $file->name, - $version - ); - } else { - $file->size = $this->get_file_size($file_path, true); - } - } else { - $failed_versions[] = $version ? $version : 'original'; - } - } - if (count($failed_versions)) { - $file->error = $this->get_error_message('image_resize') - .' ('.implode($failed_versions,', ').')'; - } - // Free memory: - $this->destroy_image_object($file_path); - } - - protected function handle_file_upload($uploaded_file, $name, $size, $type, $error, - $index = null, $content_range = null) { - $file = new \stdClass(); - $file->name = $this->get_file_name($uploaded_file, $name, $size, $type, $error, - $index, $content_range); - $file->size = $this->fix_integer_overflow(intval($size)); - $file->type = $type; - if ($this->validate($uploaded_file, $file, $error, $index)) { - $this->handle_form_data($file, $index); - $upload_dir = $this->get_upload_path(); - if (!is_dir($upload_dir)) { - mkdir($upload_dir, $this->options['mkdir_mode'], true); - } - $file_path = $this->get_upload_path($file->name); - $append_file = $content_range && is_file($file_path) && - $file->size > $this->get_file_size($file_path); - if ($uploaded_file && is_uploaded_file($uploaded_file)) { - // multipart/formdata uploads (POST method uploads) - if ($append_file) { - file_put_contents( - $file_path, - fopen($uploaded_file, 'r'), - FILE_APPEND - ); - } else { - move_uploaded_file($uploaded_file, $file_path); - } - } else { - // Non-multipart uploads (PUT method support) - file_put_contents( - $file_path, - fopen('php://input', 'r'), - $append_file ? FILE_APPEND : 0 - ); - } - $file_size = $this->get_file_size($file_path, $append_file); - if ($file_size === $file->size) { - $file->url = $this->get_download_url($file->name); - if ($this->is_valid_image_file($file_path)) { - $this->handle_image_file($file_path, $file); - } - } else { - $file->size = $file_size; - if (!$content_range && $this->options['discard_aborted_uploads']) { - unlink($file_path); - $file->error = $this->get_error_message('abort'); - } - } - $this->set_additional_file_properties($file); - } - return $file; - } - - protected function readfile($file_path) { - $file_size = $this->get_file_size($file_path); - $chunk_size = $this->options['readfile_chunk_size']; - if ($chunk_size && $file_size > $chunk_size) { - $handle = fopen($file_path, 'rb'); - while (!feof($handle)) { - echo fread($handle, $chunk_size); - @ob_flush(); - @flush(); - } - fclose($handle); - return $file_size; - } - return readfile($file_path); - } - - protected function body($str) { - echo $str; - } - - protected function header($str) { - header($str); - } - - protected function get_server_var($id) { - return isset($_SERVER[$id]) ? $_SERVER[$id] : ''; - } - - protected function generate_response($content, $print_response = true) { - if ($print_response) { - $json = json_encode($content); - $redirect = isset($_REQUEST['redirect']) ? - stripslashes($_REQUEST['redirect']) : null; - if ($redirect) { - $this->header('Location: '.sprintf($redirect, rawurlencode($json))); - return; - } - $this->head(); - if ($this->get_server_var('HTTP_CONTENT_RANGE')) { - $files = isset($content[$this->options['param_name']]) ? - $content[$this->options['param_name']] : null; - if ($files && is_array($files) && is_object($files[0]) && $files[0]->size) { - $this->header('Range: 0-'.( - $this->fix_integer_overflow(intval($files[0]->size)) - 1 - )); - } - } - $this->body($json); - } - return $content; - } - - protected function get_version_param() { - return isset($_GET['version']) ? basename(stripslashes($_GET['version'])) : null; - } - - protected function get_singular_param_name() { - return substr($this->options['param_name'], 0, -1); - } - - protected function get_file_name_param() { - $name = $this->get_singular_param_name(); - return isset($_REQUEST[$name]) ? basename(stripslashes($_REQUEST[$name])) : null; - } - - protected function get_file_names_params() { - $params = isset($_REQUEST[$this->options['param_name']]) ? - $_REQUEST[$this->options['param_name']] : array(); - foreach ($params as $key => $value) { - $params[$key] = basename(stripslashes($value)); - } - return $params; - } - - protected function get_file_type($file_path) { - switch (strtolower(pathinfo($file_path, PATHINFO_EXTENSION))) { - case 'jpeg': - case 'jpg': - return 'image/jpeg'; - case 'png': - return 'image/png'; - case 'gif': - return 'image/gif'; - default: - return ''; - } - } - - protected function download() { - switch ($this->options['download_via_php']) { - case 1: - $redirect_header = null; - break; - case 2: - $redirect_header = 'X-Sendfile'; - break; - case 3: - $redirect_header = 'X-Accel-Redirect'; - break; - default: - return $this->header('HTTP/1.1 403 Forbidden'); - } - $file_name = $this->get_file_name_param(); - if (!$this->is_valid_file_object($file_name)) { - return $this->header('HTTP/1.1 404 Not Found'); - } - if ($redirect_header) { - return $this->header( - $redirect_header.': '.$this->get_download_url( - $file_name, - $this->get_version_param(), - true - ) - ); - } - $file_path = $this->get_upload_path($file_name, $this->get_version_param()); - // Prevent browsers from MIME-sniffing the content-type: - $this->header('X-Content-Type-Options: nosniff'); - if (!preg_match($this->options['inline_file_types'], $file_name)) { - $this->header('Content-Type: application/octet-stream'); - $this->header('Content-Disposition: attachment; filename="'.$file_name.'"'); - } else { - $this->header('Content-Type: '.$this->get_file_type($file_path)); - $this->header('Content-Disposition: inline; filename="'.$file_name.'"'); - } - $this->header('Content-Length: '.$this->get_file_size($file_path)); - $this->header('Last-Modified: '.gmdate('D, d M Y H:i:s T', filemtime($file_path))); - $this->readfile($file_path); - } - - protected function send_content_type_header() { - $this->header('Vary: Accept'); - if (strpos($this->get_server_var('HTTP_ACCEPT'), 'application/json') !== false) { - $this->header('Content-type: application/json'); - } else { - $this->header('Content-type: text/plain'); - } - } - - protected function send_access_control_headers() { - $this->header('Access-Control-Allow-Origin: '.$this->options['access_control_allow_origin']); - $this->header('Access-Control-Allow-Credentials: ' - .($this->options['access_control_allow_credentials'] ? 'true' : 'false')); - $this->header('Access-Control-Allow-Methods: ' - .implode(', ', $this->options['access_control_allow_methods'])); - $this->header('Access-Control-Allow-Headers: ' - .implode(', ', $this->options['access_control_allow_headers'])); - } - - public function head() { - $this->header('Pragma: no-cache'); - $this->header('Cache-Control: no-store, no-cache, must-revalidate'); - $this->header('Content-Disposition: inline; filename="files.json"'); - // Prevent Internet Explorer from MIME-sniffing the content-type: - $this->header('X-Content-Type-Options: nosniff'); - if ($this->options['access_control_allow_origin']) { - $this->send_access_control_headers(); - } - $this->send_content_type_header(); - } - - public function get($print_response = true) { - if ($print_response && isset($_GET['download'])) { - return $this->download(); - } - $file_name = $this->get_file_name_param(); - if ($file_name) { - $response = array( - $this->get_singular_param_name() => $this->get_file_object($file_name) - ); - } else { - $response = array( - $this->options['param_name'] => $this->get_file_objects() - ); - } - return $this->generate_response($response, $print_response); - } - - public function post($print_response = true) { - if (isset($_REQUEST['_method']) && $_REQUEST['_method'] === 'DELETE') { - return $this->delete($print_response); - } - $upload = isset($_FILES[$this->options['param_name']]) ? - $_FILES[$this->options['param_name']] : null; - // Parse the Content-Disposition header, if available: - $file_name = $this->get_server_var('HTTP_CONTENT_DISPOSITION') ? - rawurldecode(preg_replace( - '/(^[^"]+")|("$)/', - '', - $this->get_server_var('HTTP_CONTENT_DISPOSITION') - )) : null; - // Parse the Content-Range header, which has the following form: - // Content-Range: bytes 0-524287/2000000 - $content_range = $this->get_server_var('HTTP_CONTENT_RANGE') ? - preg_split('/[^0-9]+/', $this->get_server_var('HTTP_CONTENT_RANGE')) : null; - $size = $content_range ? $content_range[3] : null; - $files = array(); - if ($upload && is_array($upload['tmp_name'])) { - // param_name is an array identifier like "files[]", - // $_FILES is a multi-dimensional array: - foreach ($upload['tmp_name'] as $index => $value) { - $files[] = $this->handle_file_upload( - $upload['tmp_name'][$index], - $file_name ? $file_name : $upload['name'][$index], - $size ? $size : $upload['size'][$index], - $upload['type'][$index], - $upload['error'][$index], - $index, - $content_range - ); - } - } else { - // param_name is a single object identifier like "file", - // $_FILES is a one-dimensional array: - $files[] = $this->handle_file_upload( - isset($upload['tmp_name']) ? $upload['tmp_name'] : null, - $file_name ? $file_name : (isset($upload['name']) ? - $upload['name'] : null), - $size ? $size : (isset($upload['size']) ? - $upload['size'] : $this->get_server_var('CONTENT_LENGTH')), - isset($upload['type']) ? - $upload['type'] : $this->get_server_var('CONTENT_TYPE'), - isset($upload['error']) ? $upload['error'] : null, - null, - $content_range - ); - } - return $this->generate_response( - array($this->options['param_name'] => $files), - $print_response - ); - } - - public function delete($print_response = true) { - $file_names = $this->get_file_names_params(); - if (empty($file_names)) { - $file_names = array($this->get_file_name_param()); - } - $response = array(); - foreach($file_names as $file_name) { - $file_path = $this->get_upload_path($file_name); - $success = is_file($file_path) && $file_name[0] !== '.' && unlink($file_path); - if ($success) { - foreach($this->options['image_versions'] as $version => $options) { - if (!empty($version)) { - $file = $this->get_upload_path($file_name, $version); - if (is_file($file)) { - unlink($file); - } - } - } - } - $response[$file_name] = $success; - } - return $this->generate_response($response, $print_response); - } - -} diff --git a/web/file_manager/index.php b/web/file_manager/index.php deleted file mode 100644 index 3ae1295ef..000000000 --- a/web/file_manager/index.php +++ /dev/null @@ -1,15 +0,0 @@ - 0 ) { - header("Location: /error/"); - exit; - } - $panel = json_decode(implode('', $output), true); -} - - -// Define a destination -//$targetFolder = '/home/admin/'; // Relative to the root -$targetFolder = $panel[$user]['HOME']; // Relative to the root - -$verifyToken = md5('unique_salt' . $_POST['timestamp']); - -if (!empty($_FILES) && $_POST['token'] == $verifyToken) { - $tempFile = $_FILES['Filedata']['tmp_name']; - $targetPath = $targetFolder; - $targetFile = rtrim($targetPath,'/') . '/' . $_FILES['Filedata']['name']; - - exec (VESTA_CMD . "v-copy-fs-file {$user} {$tempFile} {$targetFile}", $output, $return_var); - - $error = check_return_code($return_var, $output); - if ($return_var != 0) { - echo '0'; - } else { - echo '1'; - } -} - -?> diff --git a/web/images/sprite.png b/web/images/sprite.png index a20baf8a14705aa5de2e1993518bf59209bf3d7c..05535f56a1f09a88d4cb2cd386d1518aae826456 100644 GIT binary patch literal 50443 zcmaHSbyyVP+x0Bn-Q6H9sWeD~gmi;+cSv`aDBXy}0!v8e0@5WS-Q6YK@A`Y=ukZSX zU6!5UntAGubMEuRsHw?+ukPpjnco7&J2Vj46fNIsQ)=?(Ei__sQ>>9eY*I}D$GdNlAfV^MORh(YV>eh}lK> zxW3rKYLi$>;l}R6E2hiaoa4WyD?a#vS>F6qt6k(+Is*|P?O+Fmlh-kinD0*{zluET zQtCDa?h3Dxewb4c^rD?O=<)dSa{3tyf2XAFTzG)MqS)trH!{As11Iq1VKq+KjJ~X( zfTr>oTv6e;vDYWdnU0PX1wTJOj~Z1md)Svqx#;qArSt^}A}+3*kiTP;kh#Cf$Vw;9*ac{VYJ+f2wLO40Efy?nv0oR)F@S@_K9jiAK ziJgP|pQn2q9UaM(C*&Y8l|)_-{yzRMPJg`X>EBlms9r!iX}}Sl8+Bc8_?G7)7E1)o ztiK=ziM%G2Gc2J!9OZ9wUHrqOEa zxH#I-Z#|3svpts~SMi`$@D<&!g-WC?J>j#%Z|NJ+BjF+y=(8n_W@GiTN8b1OSlND; zx9;zd0*(A$S&_7zFNXHc&0BOU4U}NarGN4lc-~%p7WC5Uj7@M3Kmjs5_APIB^Pdo= zsRP2d1(&!@pN>zvVy<4aVw{&;1yAm0&;Y3IfMomi0@33hvpCA$P2bBchQ^h>BDS*NtzTxp znRB=iPWRCFUP+Y^5t(*C8?1ckAtN@uhs;d$u*K($j~N$T_W!a+ns7?V0DH#q3- zBU9jRM(7TeXbE|nX^K{RARWH@)Uqybhb#0sBm2CsySJIoT8Q&C2~cdh68g!;)<#M$ ziX5m3IwW#fs7K8faO^Q~KK&Vri2iFn5YG9r7H?6!^5@J=6TP_`*->ihT>bw0%S(@U z>H$6)i#rzC$V6@*FCrBmEvFXWc}SLt5g zQ2U%r4VDp~hhCjh_3UPf5+?|#Z)*D1*eFmKNW`vNwrst8yY*$+bSM0inO5I|p1YZf z0tgV%=|DcFG_MxYt*2 zIgr+j#Z;>lbaSi^-=%MQq{C-giLMCUlG0d9q%inDoKo!@+{~pvoUaOt^*6}qY(9tw z5}Y~(k~=#EI_sjKqhgvI)R~_p3tD-_^OqS1-fjOnys~k29ynQUTfewlyYe-w)!jI; z-v2<(q?{3*m*>=ev(jec=orGFAg`nZukJ6`R14lX-5u>s;C)QR>ssi552_OPrP7xD z7OfkBSDn@9L9x$m*2POXChE)Qd8ocg(K1FyKOL9N)bz2nw!%46K^wVp^P*+#_TbHq zp#XBaiR;_B#mH9r=f4Roi2M8d0bIG21M{0EYvm@7$SU>2&6e9u>eoTfxS8eU-|q8s z-je>X((8*MfCJb^AMZwh^qVL!mfgATxidEjoD?C@+S>YShN#QTDTM(soE0bo$BvJW zH_Jg*yBwZt)UF!6p}XhN(ON9$tzI9=VeZ#;`KQ20z($u$KV^^X!+qJ zr9bn|d|is@deusn^n8o^c-ZwQywrP}ysdEi5OiPKd6O?V9fQvr9+4>?gaOSM;k4o- zdu=^VvFFiBt9GoVlm22RF!Q;BeWdyM{yT|yU=L2&HJBK39&6YYbO**UExcyo-Cy`r%q@{r21(^{R>8oQEpY zQx7_kS1uf1^*%xJ^l;M(UAZn4-|3x6wyi9fcq+jNR1ua?7y8e)cTHg=(QUTI3ygAm z_A*qQvHT78Orj7&O9~|Xy9;;PUW?x=zL*7TwkD8!`*%dc=lJ_>0ng^n_aCn(d9Y3z zp{j+kZdenKM{oHa{F^UAqG&#Fq9$k|!cY5j^OKbIlS8^CJS)5T545`RnUpC2Er6RO z0rncq_?me}EfVw`Y9>yO)qJiw6hGe^C_v#N_uEk;>r8%JA&Bolp>N4U@NXp~SnVn5 z?ZCgdmiwNFgrBA>knTtIrbZBdu29^JHgkr-*|fE=A8~RIzjl5p(+4B|)a4riexIohP@UxfVyez;0bZ;Q}>e$e4rT zDq1V$>2t!jK+|cX>rp+0^RO%5Am<;$!-7ccT%4WsuO7eK8jYMjS{w#%lSA~0W}c13 z-;&P0cj#@vU#$5t4;yHBs-d?ru-JPh9MzTm0_y|MhmH)hgZ{u$Qhvw%W=BQ*f5F*= zy2B%b9D*8!9S{+N&f|K2n+eJvYrFOxoq9e!v4a-E=bNn`v(?<^3A;eod)}LLfgE>L zx~Jz+C&_3%XzhE#QE4Ul(>@=DqvA`2+KJH3l9#Apqk_#D-4gW5`$t_*wU{0;rw7J} zDl=!I`KKOj(UO`Ub2F8N5O1snp~V`Lf2yJsw9l69f~5VAe>QerM$tD6P?fz6w(W1R zIY_UPN#k`HpxmYY(Af3DWbA)cJvctzlalS+iwERgfAKl_E)LCvIz35AovXRK^Da3F zj^~Mz^J$tR>I6weSHT>KjJ>_R{9->EBTF+pXJzM^c@jdHE!~r=h$Y6-Z7=3C+vP zt68(-CMojr_thXONo*<_m`Bo{PF`26^FI%6xCuRoI9vm-OWU8}&%r*!(Q1( zG%Nkt#Igt8RR~v_3l&t}HOR*SVD%XZ4eynR-z_NE4 zlaAn{y*-rjcWPx?P2DUqBTfXYhUSbZ#hrs%@6Qm96v%6_h+CMlH$;uueh>10xYCB- z)qm9DCM|zPzYY6=FI~>eK)~F5;2~7s*vP~eV9I4^sV8e~?Y1RFuOM|0e!gdGAC({d~vwP8vzgbC@OMC504(Q}#cfQsarTYhvphEFE$+)Vm={1s`=!&gKgg2S0q!z)g;riW0FX69Dsf&Tb zziE=8_{x2zUqj0X)_8*LfUm*RhWcGW70vwNuw#Ry_Bu8iW^%nwXNjI$3yX^!hJ8YA zsTQO{?zhiU35Ite?d-`GQHoyNgkghdvZxaCri~y&_>`k|PUp=3z6Tzl4VtY5=@_Rs z#m{axNu>>gynwBOtLaasU!^`Mb%QbS7VFChY0AIO5<0{Xn`X{KM>px`R!D}f|DnZ6 zO-*0Kn;w3$>7Lqfdme4{n<)F@>7Kte&&7r~m8KT&Ha-Gikk+z$4S6^DNW{?BR2&z70C~T! zpJvqquQ};jGc$wG*8&|MgaC2cqJ)hZqS#b082nLehhr{pAY0Hmwk2K7mx?&(*2}OT zp2_cYvn;_pL3@jgO@`j>_{d}6L|U5B%@a9V`@#Uk83rbJrxjQD;gy8tGpngrusXaN zB*^mXS!*Z<4Qm9LAWVH2duJB;&Fllf2d_Ik8m1w@fozI&R(QQqX=EK{0-VWVf|)@_ zaLK4^yTA;F{w#s1xap3Gt(qvhDOa!_U~Ij^_YWv1c-F|GLuxgPU9M!fm6@nqD0AAg zs0T-WtHcvBSiehQm2e3)LuT8)?CH#`?-at0)uzPo3O0pT!zdx+up8S!Mu&S}HHki6 zBsmg?6o3V=MGr2$^o>>kODLwu!7b7rl))?D-Rc_?VyKm4OVw(f0kDJ&MK*nn%Yk&J z0U(&BG&e+qhjXIT$ihQvwToR6?oeZJAn@KyTEJFtk=27LmV@c=_p51{%f&3ghw=Hi zhos5-Cj(m7x6tipco|0hKl<=9X^2RNf5nm?zRi9I4r2D8EGI-ZK`&C$RL2YRSfQd(UDw;GH2Q&~T~G_wZ%hZ0M8pmd7#BHpRjwm-fSWUIfpkYi(GBR_XOBv5L8UaT}O zj_KDiH}xml-H2G_cXq}O8j;I;8beY>8di`yA_HfX;=Jj1x@P==XR7YeZNM_jbQ2l< z2xb){VKa|7&;~L!Ik>|_$|mm^1Z!12^jic8kUOd3xz?ekRiVM>yhJ=pLwEfzh-8Ln#|3A@1K3SL(C8i z+(@3F%5Xmqh3W42^+ynJp$aktney_Azms0YF6XmqL}ALEC4a!s zL-Uwddz&6zx$xRes)&qKY=H94XaGU?8`rnVXxpih?rpdApE3A*`}?GDOR(?jTSH%7 zbD>}PivGPoU-xQ@0{H0Z;V*W%qyqzK8y)Vrod$M8s*OT2cU*6iCa_IMGBpB5m`USx z#VpBYMjy$r8XDKWl=Qz2!tVdhp;+G{iwvQqytsO3x~~WsI&d~Y1ctHd{6`So5j$#5 zUvmpTy^OG+=UQG5MpH>tl@52h4TmPWttx8CqhQT(Wy?`bB>8Q%AxN3;KxD_x6M4m$szaF+k7#oI-Su=% z4#nl=C3M{dBbXK76BPVbSO|i#Q5igzilZH)`CS0h7gS_yDiXX@0e=4Vv-JrWcypb% zOdr^uBQSD%m8O~*N!)es4`_nc4AYT=Dqqm9D35Qux6w_1@Ap4;l))=B-a-kvvwr`Y zoWxzAXCD~IXHeiK!`ve?oAFiHD4aCNNz5<)LPLsimavwjb#O88&jfo<->*B!Zvkqf zun3dz6@9LYG8F)-M=Ai@7ja!RMJ`Qbu;4uk)GmC+)t0+}5}4t>00A#(Yw8?sqGUgJ zq85$rM^fUVGjt=hu*J9F4j%W0ETHU{CH-4FpKFm4%ThRH9GLG4*=q%js07QZa?l6ud!8G82ewfpe)MkmFa`O?+G8f+^ckt`EAL{sT)FDBtIbbuoXh zKo^B(L{vaJPxjI*c=+6BjzF3I0?sR6HJ@P_6F+nnynMZN&a6IGQjsP)qhr{qw%m_R zq#61dla4&&7^rI?i0n)LjuuRrjQYG?cBx8>Tp>`ELm6!TlP2i6< z707BuT3U2e1Q|NEu*+X`OIcV_yzq#?ODJa_guwc|X?&sK4O?hTiB5Y5jvDV36i9z} zE||P}^~%M*T+SSEcID~84_+_<$MWI9@vKF?ls%JgT*%#2vG*PXvS zr8A;}xxG!Ric)>vs3Hsw4Q(b(7v{3=M;xR+nm*${hhuA^ei(sTAeZx-4w-QCrrJ;1 zF%mSsOY=3;S3JBCrTnQA^af3L6@%MvQUt*6UKMyih%ahV{Ui~~es+=S8$xXLRze+pjtvgf6=ZeMS$i?NDoSgYL zf&RBxYj5BFSazb?zLjW2r1#G8wKqaV;z+M%`+VYmNn> zdpFic6T$X)7xMYIdPN3RQ?~(iyaC}+@omP)liIc$_t7%~uH-&Fz^~6--2DL*PkqUQ zuTCGlxUSkMt`TRP02nhAMMcf4Hji+!m$SspLr}LjB2l?MiU!>CF{$Ro$KXdLPVtc? zWQYfec?eN<-rJcPm~$CE=#0sN10KMpwYs14O}MvsJB*VE*_=Z9KK6yczhjGpu{E;s zt-X_RCa|>RcIXk#B6}*z|9Q-I{&px7j<415*8T|!A?$Fm^gLQxC`!1Z!|7;#Aql2) z1i#_H71x5ZK>RkB->Bx6LoFk3N$;VJMzG&LHo6GU-h~VmrFXbN4L;162PCiy;-cF@ zGX|8Vddq8v>Ctwam-fD!E0@l$81}9xgDbj@fpnz4Xi5D1e0&n6Q?$aumeDUy{yV2bZwe%rV>CYdgB0!AAc37kyQRYsoc^(Jd-%R$|2)Zq;I zr#hpou^^P1$U<0!q7W7zbPQb)E4A%c|9)Xs-GIeJ78Vw0v+JhI)wB*a`t0*QGX3Px z7v^7o{)AUR^y5c3+lrj;GI=rQI{b)^&9*ZR00|K!G6o+(HzI|gE-?B!RI|Q3fl>ys zGOjL9#;d>SwfUo{&vvy=4^R1%h+&M|>YVkU;s(Zh1vZ70UsF?I90rXDIaY2rC(F(E z2NiPR_Iy8}o}Qo1R{UNlYqIV-ZdUqWZQ`LbY-?-#=Ibvq>a%-f>k#;4X-Z;~grrkl z!FyK?@5+XPnt<6+JCTeCCF3ZA3+~t%aPe$hKeCMk=Wy-$gB|eYMEsi*sl@~3J58ah zL$1&f+J>-ZtU4pfo83Dqzs?Yq3PS=}d)xBVpuBZS?}oRzQnN$i1G|NAu@z#Uy(?x0l%Zx9*6wx}~Iu zgCQAz@kcWsMJ-g@k*~SBLIftdLHUQ4=tP#{aY|LI6mZkVpOz#p^a$~J`!2ld*M!V^ z5b7HmFcnf4CMQEEg}tCQd_~{CGjaxEAi*;zkZpV?hQKB_Iy?Q@<=Dv+tDNZB{z?5$ zV`KcXI~QjVZDDP7_4qTA%1x>Kq@G#!#dYwY7MFo3?2l-*l-9RI#Jo4wt9<_OO~PqJIwqP*A~A|0+7D2>&Qly^#Vl?z{=m z{PuZ4M~5SHZBN>!Kc0PSml)~MVInVS^4G6qwV)9mrp?cK>4=X<=_XV?#@6l_bblU8 zf#DOSL2OpUH^g{4!LMe!a$-T6XJL0(zGfzWF8XkWuwoQ>V!O$NQb7y&xJIcgxU;W|ELN4i$x zeNN2GM>-2|Y$F4_k>2VYA~L6_?dL0b`ZRpP`Z%)gY??__8%a^lql1EgRo&CmQ=IuV zV0&0gfnU-eMv2h4Mo1U3`fyA9upU3)aFG0ZYc4`k(AVe9klNJ^EW1qCl|5`C|E;6> z2e5wK2YhOWtf>Q*3rGB39KK^n%^9rulZ$t(I>>xC9-s52inaW2DOEtX0ya>tJA zlQ5ss`@_AXwd9H*g%60j5#e~KGwWObO*X4=ZTr(mcX*;}oM7;F+*WEG}{rG^T{l6PYiPfnk9Znyz5 z>g~+9-KieugICBqYj#%VV;`E5IHvy?3L4E;s-zyGb%IVRrgn_ z%f#GYY>XSXXsC=dACId}C?A7@w*QYw?3nHddpWK4J2i^aG5++5_OrdS=jqzZL&e_` z1NFz*Cb~q!{l2FGAEQ9T=%Z(O0+L#d6!y0buQn-6-R!3ONDyZ7ZPgE`a;j4TuqCu5 zu%(Yj{V|}c+!sQ0`l`|#XH6q$5oNGExzUwNG2?NUm!!F_sE1cENa`c!-6SQQculg} zZ`n#ZxA%#I(FJjyL{1!(Jt#94A+N<>ghP46^k;)ZdnLE59&Rx6<}Vl6=lElkp~IpAOBHZ z2)(IV$Ru86vG@q&Qkj$y^-|f91S_Y#;z@RB!P^TD&qAVmh;$1mYfhL5t4J>Kndyj6 zycwmhFZf(X@@9=9a=9u}?9h=QDawO6WB_Coi`(sGz$lk1j-Hi)FA~bSmL<`gq6xp@ zAfGa3(x-H-PG^W7{E=I+yT%UpWQ}!T<@yg{*vicTb&QQ<*KClj%M*PtDew$HQPu*i zI(ec^UL!(XkFSz88bz!5?{bkXhO$RSw`qG*TYA`9+=J>%E`r~rz<4(eLtd_{9)3MP zbQt>v`~3slvkRj+iF%|5W9=f?EyL!~Qb%aMgw1YuNgv)+QJMt=5&S$t_>5U>wfU%) z^-S}$Xa*G$*?mH#>g*kD0G>&ov6RJ0EPo)~M$G{dS;2=AwihL0jb`~Rc&w?W;Z(gT z;aLhA#aSAq?Upa^>P!2Tg}qNkKWH@|1i$w~1V^~yea?+$#YB2%X=Y|NT9+$&qvx6C zWrT4kXEy!niv_Y;CY?g+jY%FculQ`>t#O*bS0`O@H7#a_ArjMm!PaJqqFkuSAwib8Oq}`<*wir4ur*G2R7Sx zp1fHV(niEO*LRA8XfV(#Rjk=yb+(pM1p@By_u04Nqt>Lp`5P?@~-5fG3c zM8esV3dDw{O3GFY09!q)`{l&(={I?3>J$SQbyBV$w6s$DHqSMY;A?Pc42oD3&l?>V zS<^U;$kc@AaaK{3DmS` zMxZq#pb2-5VS-FN^Ja-EN+lL3)h~V zZq`P&ax&3SE>0IzHCruiS-AOltL+s!h_-`U#Y9^1xo@8z=Unu{sE44M&#<{D)^rd=VAR-3dXwB%Xdd=klv&5(iza8n&tJD(;^XO7jUGaf!GuzouEaZvCG zTOY4);1yU~cEY@=-#6OR+Z}68hT4yEMzeJDTQSqIx?nnD8TtmkggkSpYoehdGGlu6 zx!$+_Jzi`|nj_Z;Gg^8SxzW3d4&KTB4=`lFTHwCV%B7{r6&1H(#ORuV2fk z^3jnh|K}D(jn1o`+&P8(wzjr|BO|@>q`b-L>BLU+yv1XG|1H5tp?X<5sVtQ!ev>vl zwvyeoMfaWVvZ)C8S=vCz-P&@*I!4uGX$jrLN13$AaFIB|`!g!B*e}~cG5a)rARUkn zZ6UfcE%6HM{{Mmb`eYipDp7YAyHSSMIG_0?JYD1iE$E8(uXOnj-S!wseHB6z8J0wa zJ(`CZ^x!p-qx}6Z%gc4S$Kmug!GHGr`7AX)Miso5vkl&TPHgRQ>`q9@utmC zC1%=b)9`^!R9oSl+uJV;sIuQcMn*=oE4HqGOaG5Eb(4~pXL-dJ^z5H8W(5RK?2_X& zG&VHAsDsOH&(+R=y_1tfg)_-Oz+5Y_>pmSQ)2}0sK|ymjA*_)OKlOJMW5uGDQ1TZ1 zt#SEUSS($yN^Z+$S0vuszM1&haqFradB0jUKq7`t!LRo_QULDWswpo-s1hp>c9v?tuBDFz=f4ak&!!G zp?pf=NVXq!Fqu}jsf2k2zFU^9GE{36=U?rUz>;4;ps1n(9X2>`e9qRAD;>r1vD>_k zrC}>O_g@%?9%zSWx()oJAeXomOhnns*6zPxf^6ljHvCF3pQ-H(hIjgT# zTTsZiee!1W99qTdQh_Gs=p5$#>v6e~<@RXqHJ_i~nx(9gDz>hAfk$fy3G+dW;?Jxj zBthquddAGhO2ZZ~OUkj%aic1{3t=!DFp9v9D&b78#2oAn9Dw|>*1o*gSyYMrs3^~3 zYaxf@9?KdV3M&rc&hEo%`p2?a6pk4sHS1Y9Yhb(i zZu0S={&KG@1g+xQB@vqq4U3;Yp>_PT??AGpVyWNlpcdtZT(Bp}JZE^D>lM{Q06+!Q zF#J4jg!ggX{J1z$qzo%;S4I!wRt&uf4S|V(5+y5yLl>BNzXo=ClBxN1gA@N|M}}1> zr_iqqSTi*L{T;<3^BgtS;9 zOakjlqTCKgY+}9*R7;DJy88CM)}mP@)Xp6CSOZ-XKM&pzN>ebPevYDs80>&U7&fgK zvsPJM6;KX=a30cyAGib01R%`^d)i=e+Xn(XJjGzXn(3dLZE*E1SebJV>ul&ff4{-e za9Ck7eLTjV4RnOOd-V739di{H11%VSvD&!6?S_$R_T{j9#zOhYlzaV0-=T(3UR^b) z8Zt<9SilBS0Ko1uy}_A+`~d&^-qc8Ou_5>w7y}uB*Nr7*dzlC~d~j%YGdn%a(XMv-2Gi%1?q}m4oCXAF z+dmh5KAXa*lxJlnSGLG6C)~-G!jD`jlWU-6X}m} zpue1|UoRrv=G4AzTV}U6Ft7*@*iig=_eQ>1+iueBgS;Sy<_{DHWSqG2AU9NpYS={P z^4rhUqMvmx2JdM;C6+`icykcSF8Ls4Hu`KALm*uw6(5R--3qPXQGtO8NjRQGFV69U2C6N=S^OsY55= z2>!NDd)x+#jvIHHZ5Bg{;dAQDf7P6;B2`{^uu(#%5=K&DsToOA|Dow;Srot@W{=v!ib8+1=jw1sgn z0pesNPE-a0x{ej(c1N&_^!M!*fdbmRYK@Cl23wv{rwD_%o1NWYU}yvzn_}OJmN(<} zZQ#C$=3#n>I*~VWd|j;=ft=EF@*tKTIzKi{o#3ho!y=2YN&gp;sLCaw4VR6JP6p)Q z{0FWHd%xS^P`Zfe~CVHW?Bnz;WUDV z#XM95orw8D?!|xYrxS-IQBSYS>|Xy_dqN0hV~Y(V>}&L%Hd1B2xRMACvcU|o$J^^I z=c$9Yv{`8Xq@npcCu3|M0MaYyi=JTaFBVCr!X2Q9`Ln7S_5vrgyp1J(YpqP&5&`2x zDqx9`c=sq{_xLgxv$PzfMrAkc%Ug60C3XE3Ldhj6yV z8+Fb3<>^8W`SKg=A98H@r!fR&`N6S?^ZXfOF|`) zRtNRX4R2C%m2)yc`9%f$OY>*mMRX;m{F%zhA9<5j`6uTTtiT}O*tu20vr@JAE`n8R zzzKAg@Y?;V;ub!*_-1s}yr=Y+1cyHv!Sn=fnHU&z8~&lN*FlMKS-Nv zd-_sdwxTc($1qra1QN)tNpaM(m2J5*f8PgCc7Kc+R$FH4owtd6T~!?-{C>vlLo6t> zJhF4blFlM~wD82ss)&;TuFiJradN24As%zWystDl83&;JoP~~6MWvgc0_U70{`8eW z;n)6Uf#jsNq9U4ay=SNvEDUS&)x937i-&DufD49|eiN^+y>M{jW$B4HNBf#xiHb{; z-g$cqiank^$#*&Fmys7M;yvH}jiA9%@ey+UJ%yTyg0J!6T;h6`yEh|pzn||-hv@Bk zcSqro?*}^0qG{?NpK>&1B<_n5CUtm>vBU@8#>L}wo(l_L zv(aJxBP%PbTiiz_d6uDWG&OnE9_jE`8YKV?tnz&c(oVC4O+?7ouLOG<9|~B|RB}ad zKmJmj2k4M0idf1ZD{+~;?k+=&8r-fQ`|pyStgry+dRbJjI(33MiQ9FVlU84~J+^t@ zRyj+(%1^@mXCv-l!b}YiAUu)NA2pUxcp}6>MLY%;HK2l1Ko*|<^X?_!YWlcx%JR-S zgXY`#VkY8R+@jZ!{Oph@x_r@{GdriEj~7cI4t9tu4iZJti?lF-h3yksyxM2PHS|vE zefe%U?wzR%`RH9(Q9}e_jRu#pZrtC8qWeS_(9^ZD&~JcUK(ZwUaLJ^s;r zIsMJj&ctdtZ>eO;c5#cT!<7Ms%@%X!^eEr8$7-$ph-BGt;fn1S%QEqH^BcK~m=5%e zK_K-IV5mRa#UlYkP^Fk!C&#ciXoBAbu*u)jibvnkum_{T2Z#GSuZ3YhiiId!ovhSZ zjsW@6m%Xt5k0RFuXX5W@z*690Q$!$X03P-Vn~X-qXSxn4@93aRuqOKj+tku@vNq(q z$?x%j*Ew)qvj1kGOk z_dW~OM4na8Ti@CW&ghlv(IjZY&>m=HeE^y&&kz%41z&+l;k-G>O9N zgK78xEu`?-LK@mU=l1h{2&|<`i18a!)w7v*dg|c`q8*)Fj)e$ya6m;4N9~ry-Q(@7 z@P(1Vm+6P={`!bYyA{d#@QWXh$v?*#zX)S9RNPbxRgU<+=xA;Y|Gx8xW9@!Bdla8_ z6YWc}Z?O!}B#;X_$xp1U+#%p2&cf=qKrn3U5G^Akp^i}liH`AG>{6B7cp^j9NOWzu zv#TKuNgz+Co_gO`v{Trdsxvh;?4abwI`qm=ByqpLBF!1G#&a6NA%H_=ww4I$iaQ6R z1zxMpvae>c3ldfhXafd!W^+&<1d(67DAl27?4nWOzMQPA3uvYl%T7(NFX%};96;@g z(h~~~jk!2v_`c@(v`XsRACcx!G%*@pEK5bh!Mh{7}^r*Y6LG=EPrLU)QXWjZ;MRK6B?{>FLea z=vLm|Zc>(2Tui)WQNTk(C#Ge#7O=BVf~n8)LAp2xvf4Ol%B=|Vw)?je6LvKX-PpdF z43)X=h-s?1iAgH?D1?x!^L7_OBMpl#^I17`3BH=M^xG$K4&%J9h~lEi!s5}0px~>( zqQV6ef$XtP%aOETF+|OQNP#0>uCQ1hnX6qB>{pdE!-&Zv;VH18P@&^YAJlP`3)C^} zcXx7>?@H1t*HrJxO726VD`QWGjRge)rz&r~4uOiqsC7a4_BoNWa5})ErFW=6-4ntL zMT*3XucLRIA;THoO>~bG!O%n_w%TMTg1I%9gDr)6KEchU7WX#+2MnY8`x)G38_8FG z>tJy2JCW9lA9!LfkM2h+9q4jNfzwTw7Zccpt*v$dY$pK!pS)4PD`HaxX+6yR%I73b z_1sK6xbssb5m(UF9SqJ!RS4aFb}bM~vhH@Z*Gff&V%L`z8JYU;RIe2Mw%|CrmCU)p zID)$q?G+EQ_-!+i#sMEd_cj0xbNcY%H<42rk8_CPHOqUukCr7oGSjmTWr}h8#f*z8 z--AX1hwJk7z<`Wp+7Ab$)V5Z3egoB{xbmCc;~D2qi!G5T+tTVJc{?vpgmMd&4-Y!@ z$cQs~Kdd4MPa2yV)<-iVJ5?kAm+K?F9I*g24vsNUlR5z+B_*XATu;dHq{yIHKJlwp zz7(SO+rMxweuVWp5hEF{q7RtxYBnd7`)~mgg2HxDFGjFUPG5Y8Xv)QAztLpL#J|Iv z3izdPgSQ6I-Xw||Jd3?j67Bg0Sb^Rkz-l-yTmUjj%Og$7kbAzWRcBH(%xNug7^Gaz zp_#qYTKJa2I{niojhl@o)p^c-<>kJ!zD(s_eHt$A=}&XIW(w;!gg?Q-4f%}@5IafD z-F3)??vKQJ13`Q>Qo;fxpmMl|dcOuqG%ll9hCFrM-=uVezu4}^VRP`E^gj)+J&R#x zQC>wxbaGl6kz4Xeq8VrNg;_se| zEVcRH{rv`8-KSHliN;`=dMO2XO#+kbVB zXjo%<3t7EBv0oo2On%~ivr)%+d0l`c;d+FQ^Oe%J$qBN3{!NVJR>?yFg0kx;m0R!4 z(9EMQ;{fTN>m`K7eZGyuGc<{}maMyLJsc0+e}%K$bPg`+j4DddAwCWc_lwz^9ZF*f z&Fj^}$qS8ruz9+p3b};ylIZII0&_89=o|zV^#Ik^7XdOdyGf4f>XTTQkS?Max)gM< z=?_W?1&Xej;qYN`?e8*tMqB@!v9U^3jQUq02ZXX)58U3X=#f?&v?ChbO`oN>fMW-0 zOh|xqWpzcBT!!tG@1knvyX@%5f0Ad~k(7Xc+d)C-XDnk*y`y_aM-;UQg2_lp?vx^J z@2j;>YiDUf-|A(O!uBD&kq*+2DuIU~W;a>}hOa$=`s^((W=(~)*#Na$_aa%cmV1K4Pge>QbhFI# zSHzNAzTJ$qM0j{=n4E5@nnP47+4fR}U>OK!QXiFFwtY___|r`T_9|CdH9`Jc_v?|* z9yDm=5U~DTLv;WL=Vtv!)Y*hM$83;DKF}=o(%&HHKqQlstmgk+t2d1ygs`GmtuGS1 z25PvvY%aw^D*?Gs5`Qq=K3w~2asF%>byfbEUK?Q5c>PGpw1J=lQGe4(Y{g~hNju(; z&tOO`n?ae`6MlFtsIzok!?FQ`a22yR-#LnXJT%cd*9H-PhyDFg)!iQdS^C{Zv|^(` zG4iywfAMk_J2r1%=xarI%sx^z-+wH`>oSsHUMv?+p5hHy&A9P4UoLdW;vl;~l%N@@ zP#8oJ{l^5yMYJFw9VVs7VJz3g`q?n0%*{GqGa+)|qm*mt1 z1^qbb8u;~DOXL%dQGSf_H@aoA6*_0~e|eS#;IecCK}V9l(FZEJQxX~;_M%BrmIuUvPI@$+8U%8uco zAzKa7Mwc&g2=Rubgt4*Va^Ul5!-l;pGoXn+6uchz`49v&p_jp`wkp-9N(LmDW%u96 zq@LqVt~x$=Y<|O+bX~ii+LNsauhx5h@Arh~`$}jfKpu5(c{k3ARaL5FJ$>QuMY804 za_)OW&>x|X^u{VGDvP5z^K6nVG8tOEWQMsIb=!mlmG7mq?LyaE^~lZjL(jlbP59~x z+X<_q0k9D-x~Wc9gOgD_s>AnenP$l>UJ|?}t&2p^vO5A-x3v{*8Xa!(N`uMTMipbh zvi3TCk|7N`yw*D+qVC$`%HpQ)NK<;fk~Ni6a&q(YyZGmwvvj+);EzUNwwMN&fga>` zH4FHo6(9x|b?DbyR@)wqE;r9Ldi-P4a9~^$T-}FJG@tzRUo#ZBQpW1rfSCF2@-dx9 zy-c6q^;*2LoZ(Ew>mkt6jT&(4uWsvlB-}}x@HX=;@2)MN3gdw+an(5surwHZuwI(y zSVX#OEaG+p%(;uZcisCPUi6*Txj>JlEZ@V!`xEP3i{@(|v69FEO@ACkjV0b zlR?<0%;DPO+bNGoP?>y_^p4S$I03~Taex0CZ0^EunDR~B9<75r7%$-7)+77<@hY?T z9+3B^UKkRi_`*wp561?5954<1R~LmH!?N0!tUaiwsWA5sg7k2-$zZmN0s)7_03H-8 zX+%hDtf8Ir*SG(x1po{fU7P;x9YDlabk#)^`HY3PAJq<5XYf$D_)X3)j&Gy&+n^8& zzJ~5+0ZHW0z(IS4Q;r0o=7nP1S;|beuy(iR1_UAC9;lY+(!j2vf(TIhi+%d(Dd&Hk z@@VXNDHiOF;C=~0X*+9T{j?&%ECYpfcrVM*CsYQ zRXz0WmoC8r-}H%Q;ltM0ridEg!sX}!r&I*}b` zv`1q9VksNtESOjyAg-CUn|LcW$Bh0IK$8F0`x`{?)svGlPc^B8n*yB3ffJus#E#K) zk-bqJmd6RRf!nGBOt7gH33DiahjN7c{&=$6z6GV{y9VZ{oyxwo{^QwC3ST|7p;GDH z!Pn{?=A;d+X_+GK^j0TihmqD_=j1*f6Y9ot`F2EX?vn$pBI<`66xOE*&Z@T^u$}Nl zM0jM23vJ$~foQL7LAYaE5;@;@Mw9n6_c_u9?%Ze)CTd!Vil z&#C&kYVUpU?6D)I*Tdcw5tfk{mWZO1T$+VF(x)%b|m@zj$Q02r%J=kyte!2$XB9tUixU{GFct(&ciz4 z?rC0D$7%v62idzmpf)wt4PK86^}KbLBs*WLH;3->dTsL=<`_U7&_>IEQ9F`%53v_8|2igyjAUsSnj1?@z6;IYZ_8h zOZaPnoJmdX9|V=;Ulij6XJ>tw_qfQ~=OeB*f^Q<--}fe-r*8_veaP(HRT`GYA@i~% zN2}B9RjzM$pF83d*)Nz*a3u7I1Bsys55BW|G>x+)go}=6f(aKP`NQYN91YSt_smNG zw}6RO++}JwgJuu+w`-B(TLHRcqgp zDLVz29nZ_Y_caD7woHqZ2Mn~NOe4`1{!V|B!=G5~%@)9ZXhr@fM-fiw`MkU?gf~*P z5KvNuz?z=-YBWTL3lG6~l? z)4%>Lh%VyWmwjzV=uyNBODtvsM@cIt5zpvHRjglnPi%)WLX#|IhMv0aV5Bnskt{Wi z&x)Q{WBc4^mhT;wb~ez0a4>=M?p3U!Tlm&=2ZNIqDS!D5w+Jigo`N*_p~V$SEfWQ+ zh*Y;QD5MHXgn|%Z?6rIfC~AgilB7NyV|YJ^&TV|35E<_C`$xiiFj8&u&te^x6TEzpFF};C=XbrD3btw2pA#`NxWML5oMJK{_WELGx?**Q9x3 z(u(g-f7f)m!~}~^;Ld~}#mK;q zuMdb2KFMa&;0R;>KCPYCt-ih6^L)9T2lDyuRguD^x|W3RRmH6A`Z&CMuyGrrHLGpK z%{u7#Q9fkYSivN)D{IuWJX4K+?2L;|o_+LP_A?_)?FTjp488}l6lQWC8s3pMu+4-8 z&aAmI_1A{i=I4JXv`a9)&!=u|-=P}}7W$2C$d8{panZD&2GKP&eFkRI9TteysgZHm z2&bsyAA!ifkv94Hms&7w{m-ufrka)z_Z(3>=uS=|(&VL70YkB(`D~7*eKu**WRkUr zJE(ronULDz;$jwQG}A}>=Yyl8BS?C5G*&Il^vui*elC2qKolTzGP$}+itSA-Pukt5 z-0!DL_O3u@RpIF|Ci{Rz)?65c-TRfTWA`Pq$X}C$MYKqIJ>Gb& zqzLDNK=AcJ9uYtDtZ_dr;T(8s`GleRP)&sCpiy&AY`Zh$qpTDctv@&GvAUFfD)@IG z&T0;?F%8vpwDEB41A>{UwDHc+$nN|YiKeIQtxGMHkfB&{`0VVYZ}!*rBZwVa60}4R zyV))(4?9prNCePFmej}pSadv}xASkfB3#uw?iNA40^5qn0~Sr2l3>l`3%A>{YgIH_ zD(Y6R38^5@>Djt00`Vf)4CoFl&@|K^Pz9;T;Cw2N9AC6j;tjV zEx04g!gPsN@RNnqvU6U@n7fx0yJrPods4ndzMzBGDM!-!NYc(N z7)MR2C^K6W2P_Pw?34mDBJ={%!a$wzaaHa7qmfM2*__F-;gwhVR}6Ej^U~eY*7fn` zx#qQ7^zhD;bgpI@onwylF?9Uh#;2~T_HAE&MSHX3kK^pa*eA1;NDMK`;_hW+3y(+4R-!FoL3~0kBX*Va%-|dt)r@!2izkp{HdW zL50|1D!|P|U7X#UKvd?MYvENe4Ghw|tQp{oK=!z)hOv1OgoG=F8?T2 zB>$?kM4FfW@0oVv2t&lqvJg*O7;S?OgbdOtp=f8WYsGtC%ndo3rOiY>YGeLoM|!pF zqxOL#*-Yc3HsOWu=0Phr1nmk>N5RO{U?+sO8gPReqvSb+<**4Ms zJf=BG0vJumYIP?kysFl`Y9l`^XL$>CpZ4&L_6yX^Vr*IsEeaP}pSI?)tnrCD+8`8u2gEGCR&k*{e6Ot$&+v#lkKfojRrLS* zu&9f3qFgczS5hleoN7ESlZUGmrDPVX$iYRAZ?b%PP_0z3<0s4S2}@dXc5C8!crHu0 zS>py~n`;~6jIYPMO?hg5lZfQXGvAM+yE2e*qHs%aW2?d|O{c4N8N!B;=e{)dsaIQc z2bJT+;g*CF#~S_O{JApzviO$iu68jkFZ^Ny@`mX^b@|KMXvBrSp-1L%kV&pmeED=J z@6A^%sP{MoE;7Xcod{KVsimmtRhJfVAVzx%TrFKpbwfZ0qPt+Qwe0)J_i zt6$5G+7WxqC0>OkGq?C-?=t#THBW;ytwsPEF2WHzg}~nb)5L^CnVZAQ7aFyC%w)78 zas+!}AKHS&`X>UOo637x&{^au7_9)$Sl+tb@^kI`6vJmEPstju-5n>rgJf;!P@9nx zF-(;2{qgxupKzY>n`jeC^ftX~Gy!vOEUT00PmnCR@mW-j{V;IxZh=m5#v-U55&l;`RXV80;9z6;D%+;L-0FA|kvR`hq z^+?PQso~V<>O{nva7@c}!o7;Ox$)0d8mmL!5TKzzK7+kiAAshpDq2Ad-_^bXE%Lks8Z<04hoQyBWL)6 z;i13N=viXFhU)T9BBN3XKSf@n5U&=!{;el#=Z@PHOFKgLtL@28&1dWI1$W`)Vv*Ztq-&57Eob?Hz+U+fk&y!(GZBF^Tl!2+30UjXw`S1Mf%Mjg_ zO&UL==MQH^=KCVIa@n3Z^pH?V6i_hG8a24_Mv6m{UXMzXQ6n2$+n_R!;^J6XuvF1{ zVbjwdZ4`AL77CKi$EUwm&1ahh>oOZc05P`w9UtOKy;u43#?!p33%Khp4gdR%L{1dG zj}A-$ZLvQgj3CPikK6fA{-xSF2wY?m7~!k8WY`u(RNgT&_JBm#mIf)&YKve0h$<8V zCLl60%cLEO$i&3tf&!)tn|;8w$Hhv%PCK$X8xjYyKFif}mB^{c$3jWlXI+8ztKRP=HCgt8JgmSg;c(M0 z|CYLJ!BkzT4<5HE;8FkY>%yLN#2SmAR3>0*5@6j=M@D zHx?nz5}MQRXacR%Z~!Dc{#ljh$5vHbYe7!-46%m3Dz8;eKg*Tx`%U<1>k20Z#a;XS zMroF(-@rJoLJdcsqfG^wC^HHh;bLN9l3$=kmKG5}5=QKPpV4IMEq}ZeG!iO$TijKC z5kj2R&dz=tMcrTn<>NCxtZ#3HX%{Gvp1@VM-nBX|2-mw#ypVId;DgMp(2Z@F2RH~1xtt-`OrPuX8-Ie)VnNS1=sERA!xdE8@$SWGI(diLczYPt;3nlbijpO5f5 zSMl+9kkpc3k1?&s{^pAo?eg%kcJU%dc}7N;2^sJTzqJ6(f7aR2&ga8wV6M~gxrL6> zR2@7o(Sp%%fF2-H)489rYf3uS|HcD}?7;f{#S>J;2VeXpJJRPEs|ciTfm{tEl0_en z2<(b2@)@8imJDQDcta^UYb8&Nvdtato#o5{)t!wz8rhOjm2ktZm!%GJwwZGv}?SLAa|6B zta(eiZ&d?0Llq7#2Y&@8fX^q*M7dcU*7lv?=;LBdsRMzDjyd|_8ccZ&Os>45yZNA! zK#egSC_^K^yElk1k?Z(IK|1|Lh2McK&!q9=A=0u&Za{+;m~~6OsFe51UNcKS z{w?bz?;LW+@8sW=e>^$d4*q%n3>t1~ZRW3EZ+TMi(jP4|Z6#aR`;G$Is7_$%M2m-0 zpIVBq8rRc#R{T3#OWunxt*pK<^GlXo^_aFrz_BSd#D@vRMy6^N_KUYDL)q_}hdSdf z5Ai-uCHkv0)*6FoT#yKZ)PbG3xScW9xg*kN+S#%2E+e4#;QxOl1NyBVtQz`49BR`p zT$eua2RGrQw2hNjxtWHv$bpH2EAL1Ak8hRH8S2yKTG6K{#3}Eh%;Mo?gDr>JWRLh( zeI;T0U$AL3<>Gg6?QOTOPd|P_JweC^u>qg1jSf&#Qsn7EmN3j<`W&Cw`tQQ@U=%!S zFPILrPXo!I6DWWs+6_`;Qmb;+b@B|d51$a&#VyOU*qazHi+^Z`VY{znqzYG9;1WG4JL zt#$DvQ{L7uMhcPx`N%P|U_X4~1r_J?(@0UQ`44^jx@kE@lYtEKCco^CoXSt?KM|w= zfTbKJ;}=i~Fv5D;75dktv#+nfZf{jo>hP9bbEec%(=s=xQdAX^}{YWEWhW817q7|S;kUq!x z7>3r70f3YWCLqXHrZ#XiH3K^aDjJ%}vs*@Sv6T+zsrz1%*$Bw7mm?KJ;GzRgXCeof z&K12rMB{(a1{{$ArHUREkmtGEg~~pY`Q-8B)P&DDQ!`-{HEM*X5771C)w^Rw8`I{f#ru+M;FGsAb0%2w+~(N5iL6L_nJjp$`*JZ+_T$%1u119 z7i@05(a3Ki`7hC_({NHpoQB8R))N5Z-sDqb*c} z5ZLmG?Wd!Sm(dWpam$vKw?t7dD;lQT+{*2E`Kw8hc5yF^z*YZ&66PZRLo+$(jHl zwzmlc-7c=xTKsKrR{iyr3suOFwMWg>#d%u~0@6~9ZbS9J?rjVtX~a0>c_vWZ%uhiK zp@$8ModP)i4?P!tVZ%y-#ORyWJh493KbVi#b(~<*_+HWFz7>YDUGC&I+@+CrrtE)J zZWn?Fd&*pwgnou~!+tZni}%}pSU5oFwD@s%MZ@mXu;SgXRmy8?aX0M=u(5ArG8%w8n~SjPZ<%ZF=$Vmfak#2%svNgg4~&=# zR@F*54;FTV&KG_A_>qEI#i^`IhDJ`yV(xHa(pvgb^X)LG?9Vfcg^lP>-AErsvkp$S z!{D_UXsLu|>37&P8#l%LXMB^_TM^N3XLzk-fKOvWqxaDyBD&~KQQKd6`)7u^o63vA zDmWL`_Hj7@r&xzAN3j=EvAPGFL{gFK1pB)yZ<2%xs%UD#{2XX-$G0A^{-3|e71-W1 zj0aEW%Ntl)7BQ2dDsSTwT%LCR-b{xAMWDYCJ-ubvOQ_gDK4Aw%q11!0Rri;!lK zEL|Eq*plL@CpTdms1i+qAczkVPtAQL#;TJ$Y}~N|-dFy`b*P19f-W<87Ub@q>^E!7 zwn>$s2L-780LlhiJ4h@*<$jPkN0>d2wo`*{>%;KFUnaZFDtFgS*K*;IR0OgPyE`wW z%>kYrR!j8x+`arsmq}X=F}n^F1hSqqSF#=%J1-;ycam2mJRra>s>N|k@F+OmX+|7i zgRc73ChT!>HDCct$-eCkbTLb+JH|Sp2QKg@@GH#wS8dH{&%fAkA{RQefqHpc*#cDi zvBwp?C5XF!EcfKP^9IMu;f6KM?ONZu-Qn-kPNhbfiClw6%)Ifc{B=KJt_w2Yi9j16 zl-mfH!a>sl3sPzovglj&ik#YS%Z$p7VIk(!Co|MI)@(`klf5WVAQXJ&uAUy)zCNYt zs_xB-B^XQFG9(qS&b<++BRTSwV82f&+*R&X;FcB*W?G+v6YMQJ4cv5PgNCfyk>+24 zvG5=8=Mgze`|0{1Wac(8YDW~L*)KVE->Eb;F-so=W*^?xlP@;?H#piR95_K6^B*EN z@%vw4LI2zVeFpMJl#kCai(Or5Kur507IrFT%j|GioA6bR>iw|WGM!EG;$8f7x8WE9WwZgdH34sCs(@7NGC~6bvVn%PBh5aVIOD&mSV6*UNRgD?7=7nm z1}AJ|)OxG9X-RP36+$;$r5pZe^~53Cnj_8fh-|-;1v3fE8y7(Tn@iumrH**T%yl@~ za0~tcWRM>GKWt){*2}vAo8sDOF3xI?jG1luZ*W+H(qgcM6wP{0E5eE@rK`^4adgww zYpD>R6ajM!%fT7k_tUBzHUIGS*d7Hx50n-hKS-H-r<9r20|9 zLIgXKleB1BS=sG=l`3Q}^aVWaBpZCRc*%WHESN6A6V0Dgl$>^)mG_JtDh*=Y^M+}^ z{sC{mTkqNB1Q=HCGCgl+E{jn-Bj9;kI5$N(2zs7huZE;PK+3{&&qoYeuz^C`x;J3O zvJ|HkSInP@70(ISKT_ofS?F_&@Ym40jmf@G!K+K)kE2Z?IPr?xOZ~WP!~|C~d!sGm zYso1%FD`q(%{M$9djDZuP?$j_W|L2dRsbl@DuR@9ml7HWY5jCcMGL;T+u>P5Lcmsb z911L^9ELeG*k~Za@vkN+=hV=Bqh7lT-yFTX?sYG4-zZ}J!~4w6r<1PMo*BH`BUAmV zmh4I63%I&U;{r99vY$-F(m|G-8<;!WlXvAFAvTVU_ffU@!E~o+=WARm&anyGf-G!)rRxFjlqYCP&1Vs9lS{Xu~8Zm z#2Yohg{{GLNK2h}zcBpygVRJ2g@#Hj+*m?Ic}#-p*hBWcT#;q@;21$Z zgjVCg@AsJTK7cXMFn8%dH8j0lkDnc;*DBlZr*0qXK82@hXq}gn0A#E6>-49S%*DH9 zqeNG8Rr8ui^%Ms~rX0x=w_etBg++ZDN)qAkINPNGn414_0k)S^m8Y=EWYNI-{c9{+ z3m4bPi}^I#G>?vd$F41YJ=~d_rpMc(@q%ql?Z2YN>q_~_D6%Q7mX0j4-*#2CVMrAh zyqmy`c3}otiCZx`ce<78=xiVBt z>-1bh{;`iO+F4Iv&$v0~(G`0Ml=NXMj_EQ-4 z?+CKfPH5a}H9+F#d{GdgkVwlbf3s^ruLq@*f- zmahH&PP)lq&F6+FGRMhbl%CtN{~EZt*h}JQ!}Zhc0u%E(^<&@hv)1&+?b7WGIOsmg->^ zJ%9a09Gb3SfG!`yAoM~Dz{ZR)JeL<2F~dvU(tD+}iihH(fdNODWyirm)+Mk{A&Z%_ z?lGH1tX9Z*0jKE=$BhuZ6$8~oo%g3${?Qvp%7}M*>yH|v`P-+TnBAORc3OxPd*RUX zF==>7$RwjZ<>OD*|9IbD8hsre8!#{(-Dt9Y48zH{xE`jJJ()%>OPPaHI&n(>lwhOB zF{If!+v-r-o^i6AQGL8?o#Z0XFC-0b{_*1?k~Kxe{6w=iN`@&q%;0wA3Hw2|+S5}f zcIImtB--O7jmI8vI$W$V>}yoCN+-zFKNArcoGC0<*H%;cBKSfxka7|?X{C;qzfUK3 zhAqDWkc{fND!XJOb;dbZoK`(9OSN-SSE)a|_M*k}o4p+I0I$|TJ*ECER#_aVINrV# zR-H4zs#72B)^!yo@21l`VX~41^J)}c;oXTw1Wd?tNES@VfpXQYWOV7J{U^Zb>8Rb1 zqAvEA91naa^VdCl=cF6Rj8p3E3FgM>9ScY^+;1r|s@tK~`N>`f5^>>2U^#6F#$EVq z%|Ib`LbKO)n%)ADsXf*0G}`M6nGy}->&|q;h+EB>zRd+I(@S`iz7k;KG0VrHqg?+R zI>ppfjnmIEVxGtiAKGGLVcm$58(7-f`QTI1Xujd?NIC1%R6|QyFY~>}q!hx0fy|Zg zX-vBI+yfruILtlKAH?PLTB~#Kvk*q2ya4h6v0%H$!M8GiN7pUs)ZV={{=+;?bQb!4 zwE(C$R7|}uTA7XO8m}%xv(efv9!TpS+JF*XyTDQlQDuC*iAHK6Bk1|xJQ@%@1 zy`kA|k2c7cz$dI4mvte+_@kNYIXti4ek>S)R8nSw^&pG+mY>aIHNGJq8RU_@m5Fc{ ziM=qK!PqLk7>uGYvVy#EwO~ckK}gA`L8Vm&Z(q2S-bG0H6eFU)dpoQ(CxEcQOT9}z z5<2FKJjiPSvF=S`sszvG%s&M{m)#T(#NQ8e+5&*mfkEeNP!ft_sDd(e&) zLV?)M95?;gMa_<}Jpz=_JMEiW{|{fr;?@|!EmVxh*vq2RJMa~Afc41?G)@J@DzFQT zG^N?UAzS?rs25TAOXfpiF})u$pw;1^2YcZvmGT|tK??+tX&8Zo6mTQ-w83s%gKQO2 zu|OTv?Cppf?vzj7(RXjKKHgIY-!sB2*A1=Ud=eG2gTil_h> zd5&Crd(AM_RZJ)R)Mtj>0ZgQazgm4jgjVfkZDOb0v~Yiz7)DP3UH% z3d%utnkc4|lc&tiPd8}UM(ch0Z_*gPO!_>aD!;*@_W^%&RkxvRcP1?9+VDsL1@~R7V;{`@pE>X1--`E%fWqPLc7NE{+TJY7=Ki7Ir2(?9d6Ol zB&OUj^ShvAl`6chh_Vw3?S~J;*L4JSLw^rpMYDhDC(RPlgsJriNnwmM!xHf7_S6nl z&KY*+dHMss-}!vn$XZ1k^gfuHfenjcAd7YRS45^C@go7O@|S;$!>^F4XydO&=WVYS z*u#8Dx1NXVp=su=t+;9tgGs!K@82T9O0$2mBUc1J!)jN8; z(+kYX{^7V)z6CIe7LnPC9iDxETAJ~F5<*sCdt3Lg-t?JlfP}fTBMukkLdOB9@H9f8 zkV`7~1LI(LJ_0NY`$~>Kq;L?d7W}#0crd!tqm8cp3CUY$8GM{#HYdRuUn4eR3-8-0 z1pOn3wywYRbF1QIKz{BYGMgkv3eFXjFP4d1^KQ((D5GLO;5t}+WDL*k7(iUyFbC2> z?3k&hdp92=FghUOe%2H|=eeIbk@bmvT#eR_TtKe^hu19Z*D0Vos0Y!s>Gi~$Hw;5k zzaMql=o?xVDffM48aN%YplB;@@029hca!9BSi`VKP|DmmRWKDF`mIfW!@VcQv_|Er zL$7^GT+E#x92;lCP-9B6n6D_*GDxL@zVSi%MC`*SnD3utjY_&=Hlj=U9boS_y-Xb~ zdbxE~L7^hxsD~oAoX|U$iXHeulaSTBiP#@$S!~er={f(y_`O=nkhAjr)4*$*;JeAT z_57v#1aA%DyHC#tX2LQzH8YLbgT)gSkvRoSt(r4-$E#x1jpUApjzNIs48XoLl4HyDtFtV z9vr6fPC+DMH@YX+KcW7vgI+0LG!Z%CVN`BDU*oDTl*SlCXrPE;icpB~HQ!e#M^;ov z`*@nIWQ`fnoW@_lboYzsi4r%4L6ztpn?!OvqA6(wJ=Mua9}Nm|M}MhAjuD(yucDUs zRz%rUwq8QPc(-Bf7x`JpD0_<@zsSMQF85W^c36T*w4%765J^A)%~Tg^BW+<%E9r4O^0~Ph=-sR~my$D3&(`GsDg?a5f8@K0yoLnu%jbFhYoVKS-uspj+b>w$iCxJmB zG?zTu4MSYKe7ZrbGwZhls47rC9ylGAC!`)Vm9Bd2cnY$A9(`Z7(NgZvj%XH9^4e7V z3s`2>T`&YIyjOt8ZzLmuAJmYvi3kMr=)#pH)rb|e$8!R@D_u3?!B_6};vU7aprshD zaA-G*af-L3JFm*V`p&GJxAc)o-vt;>vD8z7Oz2ExuEtP$xY+>4k(v9GD2wMgio{x; z&9i$gJ}T=QKyTZUEe9tW9x&qN;J%v5mx}-s|1NtlY*AsIR%VBj+tgJE=r~wAX}Gn} z#ZwhzOdF``ak-(rI4Fq>6>RbX5)r(-)z_GWJPewgRBa9|wNwAOKBjRTKV+g=%w!W`YJLX54 zf#GT#2E-cdkAuur&L=s3@HKnjb%^Km3n&1b#Ix|x+Vda$@S|x=pbxt zKk~tfIlE3Bdt3fk%$@NOm!q@jk8<-vzE;Wo*yvN_N9T2|?yF|Tn?}zNT}_K0p^pZ; ze3DD{zd7#HDk0qbQn5Zo*YRXnKR2$#!tMbcdf`SOR~)4I3p`b z@GIcZgPK0?JsFF0Zq{qzPt~7SlJKK7Q#peyv9z^3P*&Z|QTGZ;Tmc#m`*`-w(uN?Wc5OwEG<0Ii*y^PEnpC`bwH~E%V0jW0usYwUX(iH;!IA!-kVoO6OW+)LK0(yt-H7Rwe&wOix8v zVZiNJG0jW@$7PZtq?;3~&j+w!u}5hFz?+POb-{$XDEgus@)&KWs46~$nxyIzft2-5 zIHS^Dioc^4e4svF4WwqFIgE>)Hufm3-(3_=QTxoa#JYUUAm#IhJ;O;c?SkP$I`S8z za>O{3w*XjCv8l~k7is7?ie;OFWLMu;%_kj_`YJ4!bSqS)litoygw(Rmx%M%&LYI(3 z_lD8CO>sefg@?(c$|pD0WkuWZek>I{S{WWL6lY>(H}Um}h$?Zyb$I$SZJW6G3t6^$ za7$3w|AfJpL$oxYhDr@b&paY@Uc~{#g{!Fy_U50(5W-C@FINXRD0W;59@)526=rr-+3Krf_Suk_lrN+bR!} zMQf&TlQ#E$5$0`arXG}Ob-_F5N(ll9D0eX6YwIY0BL{1#mlL4=3e;(9;|jpEQ7+2} zdOtq12c)sc$bSsRspbx$L7;Y>?CUFssM#uf>T563RLjQj^F zxFxR)ZWk!@D+>Pev_u~Fc7WwQ8cy7D-klwn=XnOLy=eK3F+;Ad9Q!1`LxZFyh18tu zV(mF`Q{fWZmPTzrUO#6pXE78O{?5L~^ep{0ev1Kml{bB50ksa0?6(57m`RT;hRG8AEX97YShJLWS;w#FIayJv z>R(z}L6sWvETEPG4oNFpC0}fXXWg~<@Qv0bUDM*x@%{R(g{|5>T`gFrgQw^pGG=r> zk`2;^6*Xz!f( zXyW(o5t(U$IWRrzs3}*6EsQKX^M2&?Ifd)S_Zgs2d8x50uLPfQCMe;XVM(rAcpZI#wxMk7Q z2A5kh750;ciQhQgbkAQ=FUH>x|2`C+*mEY$jK4mT&w3V@suugmruYPtkD<@+nch~* zrp$QCC{Sz{{QjW!9U+w=k^y-o4BFLP^GXG#?B8qES@%8d+y^HfypPuk-t$x=(F|$0 zzpy+O7xPwoT6*?49_BhWGaV?O+Ce{{IyP$}g-1v3kppJ)owW(=W>=i4tmn^sPM1iN zJ6(>UlwF}Z=(T<(pY@|%d!rxw?brGhmul+k%sk-WaSMivhs#?yb>*;Ciu-etpo@k| z0P?Nu8$`iHo#tXH@t^qk{^c%Ko8RQW`V30xAJ!(>hl{!#)<%7x-MDnS_)M*&^DLJJ zo0sRqP&N=?MN$OT_BDU+gKgIyeu-742i#;BG{o^d#V6vz*(CqnKZIhoP>8P8N~^)U zH;6#xd{8Z?ec+G_DU##x4WRxFY|YLwJBr;1_@E8^Ie!X7_Byo%tq)#4m5P{o(P<|s z6y09+8%${FPiS%YGvv-gm;0RZv27pK_0QzhZb|^igq2&KGON~Mhth0LGwEK?^K67{ z_sdd8oPOxC7MA)~fbhJLj6UnSF6ei7Xz@)}Ru#X@n-5yxVLr)T*8eDln9J}ewcCvw zr-WHsJ`I-4TL8NZINIcP^_+6&cI!pIg1X_~tb%gDFr_DSf2SDT-F-KLj_;~+B@f=8 zHw`Kv#Cg-TI@=CYi{&a$1ByOM}{E9~)+f`JpuQsrlZCav2DalHR)DwFhiWqLJlf~cax-|0mK-ulR(xF6Km1$EP zxnaIOvmJWFQB|?@iD}0rj9@SQdFmus`7m zZBHK$Llhke0GZa8fWFx)SeDAmw@6fGy1vCnIps1frqEVYPecdtw#=mXDqX`Uf-(KK zA>Go~k*I1bh=4|D;xnirI_!ewr$09k8Y70ZzCZg-y@2Y`*u6pUBtfW`I?Dc%fvhh( zH(Pz;jjJ@TPfC%60UH#sWp6W)wEyQcFNoNoyCr>m@YvS2fgEUj37YzJze;x1ue?1| zZO>cIi9=`iO`>1!dT}o%%Ka+4p-45_-lVn*RfJ7*b1n9sEF?uOo)$($lOmvSnfMK= z^=Gmi0cD3UUj~z;x1^Q_ULXc=q4DXU7PxU^Cz17Q3>Ua1nE^$=!Z%I7R_f~4i zcHmpLJmawnj$9#W3G4FEg-VRz^yZC?m~)X|`-yMOeY)`;%l_hs2jwEK7)jfGz zXraaWpK5-_=ZmHEwor5DGqhENFWw!Y)xv&Rv9=H(jbaTXqX3ondFqX)v*xew!X>K7 z$Wh@lKT7ZJHJM7OK>HBaS<7|Yj-nA`rv4f6cz|rO`i1#f5v3GC&nmCKFoXWxj4pIp ze%rIo$I1(Lu7)Ct!S(*_)_&aqyu{uy>e50Qhwvik0?n;V8MpGn^U1i9*w z1iqCpz3LVIT9#a1foW!<0U-5-8 zJQ?ZVA-+J_MXrPwutgm3Ojw#qDqYs$pH}V-y{4w6sTpWy>=U5}V{ezm1s%=s2Y3A#wr=QrlC8d~530Z#==%mZTnMk| z-672)@rm9d@zJ>lwGfS|T9i;@i6CI5k`s%!j!z`Bv1F?yNK!efc-zI*E$OnPBPYxo zaRRh2)iq8ls4jyI-X^99?A||p$RPcf-w44o13gId<(U>je*AcSJV%QPl+_( zfkhV~T`@}Zm49pPrF-7LI7)raJsMvfq5C(i3+RMO>Es`p_;1r^U^b6In6wx_NO8;- zcaj;;Ho8Xzn!~w}zSHzZ-v~a8ME7ZjzF+~pLUr`jjDG+LNQlMw>ATST(SBNVZrJm; z#L^G*E2bV@SmGp4Hh!1e?ZQ<+yYy(dNk2LRKX2hYI=#sUxOIBGGU<`EEYVJ(b@z9e z5)whxrf+?leBQ6nzkZ>Pd$hT+#h4mwdcPnU#~|6+F2{2|bED4(3JSWN7v`G@u4-t& z`%Nze1|q<}v$5<~%W*uaqdw>8ZHlLy^VZaKLC=J)R}tc=AKBbk3HQWV~{tvqs<%kf)%rs`arc`o2DVDR)e&!MFct{C{R9i zITd8ZRgl+R8&$z-CYS0Y>K|vbWv|-ZwM}r{?)#V*xgTK3r;UPyQr_4jOz`%`S=!dw zjlBe0uF}9p+wU9o1B>F3`lgB4=?f=mSzth5Lh_GbX=nz}A7SBmr@tKN^V9h#;~0}f zWl!XH*)%-i+HDuW4B7PjOO7IxK4(As^4#9dBN(ntr$kYXZ^muM{O|*=Gj0PmpN1V1 ztp}fHUZ#qhS0f~&-uO5hvl`7}cM|ac5ss!gqAJ*iV28aAD-J8|l*2^B!XE(uE?scV zvA3sf!wB_m|b#1K#fYPJ1r)-3;y;x{F3%vJr8 zASoMsKMFUSwON!CXKdq5elO!wTRK9FwYqA`gM=7LVT8xdIWqNElGac%Iklhs;sIW6pNa*87 z+d#xjW!Tb=8TngDDcg|S@iLe1InNQG51 z9XAS0CmI&_Q||@9KZEb`)`@_r9Gp`rEE;2oA}?c$8+!uNX=`rm>P8fCvqKp=Kq^ej zChLi;Pt##$ZpaTTbpk8xhN1$Z>QIj#AqAzBwPB$L3F2qMI#9&uP&_%E?s*KA?I4Rz zBA-4hf7;+cPG5#f2G6(IpU}boz)y2^Hg--%Z883IgtBPnWP|2TA74qas`$>^92;U-e!qN>|YPju7`GG<0Z_I5`}LbHB}9|eqjf)4r8(nSOY00DdD)S!I?op zKw7uND6O&!T?YA;d9Telq*#O&16v!m?%e|a@*ho#Opl5Ecm#QCQp<^!-}A_2sALZ- zSNd~Z^s5QqY#q`+-GAN=B&+eWIy&)H;pE6*!J2$cwt@qPMok$^TAAnr%BUfTnF_WBB$q>kGY+4M4C0#0DbdVNO=pG^6moJD=yKn!@A$C>- zw}nX_P1)JgjESzqFm3vGwt4Rtk^RR7=v&M50_rHrRoNT3xP~HHQdf}ON|QTosiN;A z7-${q5aO;hIeo2Crs|#7di2FRkU_wKH$YSrNB1|wH=clalJXD>?*3R7g_zhNHb*Sp zPF!#fNKRd|Ggw#Bv4KG1iv3c`>6%saBV#-tyQ|t*R@%GdsNH94RR_C#@Bxm7qC;SQ zOhysbOs~%e!Q%2MhC@Uo)hVmhI=%J&Lo0-Ng0g*y*t9i>zx%LHUyB-lh7Ma4y!~w} z#LaL{)%vD%C+Y(rWg@c?hYS|?waKo2fbKyl;b*swG*T3s^ZBB&^+ z^^1M8Sb$-`f$Q&z2c&%<^urEd==$l&U zUj5~ZlhQHxfqXU#OIfIa3wQQcRq_2=p`RlT(K|rm0ef#k(&vH^T&sY9qc41^D=-;`xK}8F4E}BsXeME zRln@X(B3M&nC@*gj(gQSB_6<%cv`vIKoVE7t_=V#6aJfS8Ri}rTxUOO5;KlDi&xf1 z>&8`vX3coFGGF)9_B%JVkXbuPr=B@!fY2p|-hCUXVeIqxEx=si0Q#0dZ)$XbKlToE z<&!Dp@SdG|`x6&EGXP`0S2}rrX5`lmfJlbQ_Q3g(Jf1)nEJ`j+-3rLn;{GelV`~)8 zDk#M>*o3EAnb$q8kMlUowP_0k&scoDGs-h4 zCpu8$4&eG`2+o&^R`|-=zSCfsLN})6Xe6dm76ghMHyd@g$X8yxelpP?uf|Ct55-U9 zOjjN^9YaSr;v+PSog51b7+k6jK}O>z0Ek4Z>`x-6v+PzSkeLK1_gcaF@S3S2yI9sU zx7v%f7OOK7Oykc({~#P<1d#&C{`W*CzgqG|rZUfExSu&?wFTHLfFpNNRkDmg1q{ou zw3|k1Ck*9@j2}OL^HG%qenf4S=RGir;b3ZP4?IzOF9XX&dMUs7ciTi(d_fXR-Ug*4{g=sV!(14xo4h5e1PB7Mh@dQUw7UAiej{qzNJPP(rl;7Rmtx zBnU|Fp&5FU-a7;mdZ-CSO6cX=@x15W_rCXg??3m(MD{Obt-aS?Yv!3}X3dloGN>i~ zt;r7ZY*@W+>-Lq#(3Vz-$zo4>lkmKChasfRVo#&u@w1GJ8IvzR=O0IR=3Sv>-!qXi zdRw+O>cS*@ZIbSnk6ONS@pvoC%N%K40eH;yEE zrx(YPaVj~Cie6khp5Mmso?GiYd3*0H`S!#sOIj|JQ)PsWGpa0zdbGq|#aCCq?0xzb z>gxq`wsFX>stfmcsSW?!^_;F-i+u3Eir;onaUbev=kKDG!}zP6HMl<+^ry00(j6-Rs_|@7Pvw}LmxhQ64u$-SzXhaos}gF&~1Z*S^z6Gn&iK|EBelA`8u04 zEjQiu!sx#T*hT}{-Z%z&cKl4bOo0K3(HBSG@hM-IkV%8LU{+&A!q+#3m)^6Gi%}F0 z=1hxtXB8R{=s6R9dUVql&}h1Y^ph<%qm)#4d-f9L~mGx^MvFj^r~u4G849-`3V;Gy>L9)6lSUO#Jrksc5|eG@OBkQlwm-=k()P zCy}0xuB!-ebEs&!=`rN7{DP6<9|~UeA;6OFM&+jTx4k%l=AK?e*ComCjqe*!7Er#w zZDj%gpscJcJUJ5XZ<~RABYNlBUn3X6_rCZ?n}x1;Xf^`jT~|L^y1nf%7NPi9a3v;x zycv*I5eh^KJ)&-zH!?GhqEwMV0gq%D|v?#?Kf`$LsqdVPoK$%QWp6RD@nO`S*A z6y)g&KCgfK+ufxS_CiZDyzho*PHvjZ@;iu;Mcp0(QUWI;T8@znrp1P~QcqDKgvEIC zh`zo^-f1CI_ybiQoq7MlIgHyx=C|__0{tcy34Rw6x0EoW23%E+APQpy9RNjmPmaQ#?N3M=s?+?Gd0MtFe_v!>EH;-#p2LZS>~RruYsy)_o`#qYduN6gSw1#?s5z7=V4s6F~dft6Ld(zTt% z$s&E1q;KCk@TO>LaC3}^xIB3kwc%gD#?aBwiqA(>WZC6g-?6MyuxcX5$gfHVj+Nz~ zrg3vQ%g1-)iqhqhxl6PQ;arzjZgu_pMnWGJwP=7;(1a;qi5wXf6ec7(Mx3vc5J^ z2BSbP2*bctO{1N+ka7O0JIiH_o_97Mx>-;uC-pQl&>a;kS(c(3ViOX&9$HM`r`(uB zu3#6HHgXd`Wcroo=dXUH9UCmUKg+V;3kRcS5l`x+aF&;BWdxb7=(pA{2)o?Lxc03s zxnzx&bisN?4Uz*xN-#EMH48Cn!!ojbj@F56A^X=g$$~|d?S+>O+e^Ja;AG98wF3dz z^hUJ}PaDk#N=AbqZu8pnWPC2Epg*D4%Gy774xDQ6GXwRrXP+k!rQfQl?yEU&*0+Ri zsQ3x9>g#oRnB2rTygrW2k|@sE%2g&8CmSpM{JY3#I9v=;ef?^vit%Hf0M&9Tb>j|) z^$(+%PcD*S7IE8egBwxNd#2S(o_vFR3*@ycV3*NE<6Em9X`}RXd9@NY!+B%JHgPqs z35!l1_YWRT%kD7s9qqp%pz?%SRNuyg1mg>-liNE+8h#N1*-}@O)SxqBj`)b88Th#K z>W4H_rtwJ^xgMH*oZo>W6OGK(i}VOg0PqpmVVix(T1Nl-1nnc&k7YIyRRaGPT)7Z z_FU2SzOZZM(2yn>8q*Zps>^me^>Jaum-;a2qM7%RX4{32Z7R$j zrKb}uJxqVH0{)~FopM4)Sa5ixrBe6ppQ{ZSYQAQdy<;iR%K6|*eQld&6ct(nP}fb+ zuhZ`$O^+T-`kZozuJpKf?J1lxRQ7F)A{~4k`%L#KSE=qh!C5%%k6;sXmj3ciVTPss zx=G@@uE+c|UD|V)fw4UJkI#3EnQy1kCOp5+`9v|LjkP`bd3Wt)QKmP2;~TWeLG8y( z>dEJiZ<-4}%T9mnF{Ls8b<;IW@r)*GYkGXe7|P#HQmU7k%08(#s)MZv}O~%dd~7 z{3qRjspM-3Q3Ndlsk7{f3#Opu3PKzxP`1g=rp!jZ2P{XFmT&U6~8|WGQ3y z=v?=jts~%MSKVuNo|V3-RHpN@Z#({(?6$Mf(GN6C87RE}WGs4?-?hmzc$NZkZgMs9 z{I6`kNIMV;T*;qd=H)Nu^y;5tI8}n$GWu#=1U1zp(pDA6nVr?=G6QL|T^Vq7rM8;X zXZBA67igdUr172hxpud{>9g?-YP7fOUm!zZhD$wh8Z6Lp@!Xzq>DrfkzTNo_DnyAS z<#W-a$PWVk{XGDVzw_&X{q6zHm8qbul6i0mP-Oi;W;Ka??1xVA`J}^lcKz8DzP`P8 zbBG&FW7Rq?9@{u3=|H+x^+O?YB!vhMDX-XNh77w<<4B0!$3Uq@`DVTKHxxUJ+8mXo z$Mu5en1u)b5u`MVm-5C8l0(L}8$YY8e(jluJ~}8#2Wv=d0Gr;G4>QFZ9P5K1i^R$Uy30=|E~`;g{h$IFh##t- z*bmKHhrBT9M~PPQ@QPmlm2gFGt^_DnETBp@{;9)k{C%(49XF-uh3eBitN>*gDN~4G zXDLOGC;yLUR*i~bWCkaJK!QRXxt{wV1iE^W zD|>ADLAQI|H{W`{;}Q2VaXKKnEA?4iVO%m{h;R~zJnT5W&$j5Z)N#T0<47S((xQ}Qa&PuPm?D@l6`0xa z9FJ*?d%hR`z;9y^v!Ol5|Ezr4&t|Ez_>~!5)5cVd@23vatGc6RB9GGsb9k4CafQU9 zO?=#)>l%+W!--2!_)8grIqTYJ3o=Q%7f4Pr-t!W<&B9w6G#jQl?oUeC(V8S#@$xtJ zSAox6bHC^GHB`a;AdlYmN_F1-py50b`ycc4h;cnW-M25vC~L+%#Clu zryl;~rM0E4SBZ;hg_l?MRV}E@Xjo#hX=Wp8xpg_v@Kdr|=`u@dvC3qUyGn`)#}h68 ze$o6db`f=3rz0;HFUy4sLcKl1Vhs{y%kj2c9tzjSAV{`Oo|u28{l;ESlQ=M8nf zG)`r*zh%yRJ<6QQ+1jsq{^c38D|&%kkS0EvXLi6d-VL%E=Tsp)Tr5;xgLO|8S)YK~ zNwurmz1e3o^VnCdnUcsBeo^r~_~wc>1}bfF>nDwkQK*ZOieQB6YhF*b?f|atNWp#| zOO=w>-Er13+w{xF36{?@+PBTO>HSXwo$yHFn%IqpBO{KxKJF76=V!T?;Cs%BU*=_4 zabCV_;9d!u3Yhne2s~DwXYh2n;+vRU!^!F3r_;?yHNU4Ja0oj(>l;t4+3{Oi)0;D= zbKTlDDeF%Sg@oM|*Y-wsd@<#xjX_Xoh68`r)uQHGs7H9zB8Txpees`kbw zB!9sXuH3E2rYvhDYcBRZMNFJzqZ7=Jn%Wmu?%8ZQfA=0hzY*=$EP@uT@vD`O*kR#~ zoI8&7^^omNfzu-d*eAEjXKIZ_*tIQI0KUIeq#S*8seZL<3nqWAAMMd|qAz3nH!QGO z{7SkH9DYQmL>mW=D*JQ^Uvk;|*M9FJocn?MM$u^_zu&cyWZ!_pZnHjTnLz&~;~jY= zp|cgDg+brmdI^;H%Es*FOZdw!qRJ=5vt6lCfA-2ME4-FcWWC=bH#I@RloeJ%!|2lb z1VZ@AF+fe7Pg;$PP6o4ZeBGV>)w!g>G{g%vk+Ct=Z5sP9H+VN>clVfuS6{RYsb+|- zk|{8EhZ#ypjPVu})ov>r2*&4om*a_WVk)hF&PsWm@4o&nQ#o|gh`%5Nx|y40dhX`G z^K*7Ww2rW6BNtIC2NvS~eDj#z*aj#SmIF z0=8q)$__WH34*f9rEO;mn30l`#5%6iZo*)+iBfIXm7WKiRPKze=h33RmY)_>e_Df^ zX>8Bk3^ekx3)SfR7tT-F5}Y==Y?a$b>BWxv>)=Cqp<+S_s{CwMYdkNesAH&tr;h6% zN_|hP*~ofPCW76_T_Ti@f(ekh0@#i~QSA_FTrWYEcqCw|oGno_MsUgyk%{JbaEd7G zlM>nAfh!n(5t-QOa}@3GFX=b!u5fB79@#aWEWOViqlB)nWQK?%oov)GEbM)c4;AWs z#8QCr45qusz9JKP?C5AtFjU&L&!I}LSnp&SG%iH#)Ff@(ubNp^&6up4yZDLkI#Q924_nWm~CVHD<^E^@< z>L$;R1dwcKf1%U)T5k%A6n+atxpx!K+x{F)H-s}QsBeCSjPZm1v5=Bl!!yUhR z)`+5}kQPY?YU}ZfI1hiLPy3}l^9C@aUWvLoHz$k?6c~C~>Z8>o735CFU&+ z8?EN#!_SzxCCJF=P*Wtz{*dUO%uiUeFxCH&eJ67tbVhBq%;?jobw2ljNxc4@MQcYc5O0HRjMv!?_+c?bt;xT#nzSXw$y@~>A zLFmfaIzTw(bTT<&k@&aD>niNe9GTkEW@h3jzXzO_x!3UC1V(jcCfUUetna4{ z5*%R8=Sq^4%}7XK1{&`wU%x0adUozz_r|9Po&WTfW`#de&SzatAem{TrR9UQ(D&T4 zlWlV1zIYQ!9si7?5^ulyZ@|bT*h2TJ;;2m20)IVJ zlTX+3VLbHy2o|hZ+23bs3v#rR=(fwYqrJ6FNlranH9~luZyw@qkk^%^UCMRwwc3|c zo{@Hw8^s}Z1w(5AI?cj2!WC?ox)u2ndmZ5L>fb0G9Ub{+NR;bNP^l+)E~iV1IH24v zc2iDR`ff!=%h&al1G)r?ZAzZefKQ6akIZ}o=+TvrrR$B?+)?p9>3z0k%Gv!Jk*Yi~ zkJQ|MX*F(n*DkD=L%T(L<;~kkh0q4qOEkcN!(Y0?OtQ6y?abRfjO|5IenbRD)5AnXCx$u)i32JeRE^DBubKB#>g zhbR$jBM=3dmsEsmYF8pQ8?F_)`ISd!an%3xQ;4o1oAoRee&Oksm*O4E!jlR!xA5q0p zUbmbZIlaZ_tkcMnT%u3c;r4Egs|d~KyJUPqDaft%Shhaoht^&Xte&L@93S@b*0r2Y zo@4jGzHWb2Q}woCmGdTCtPo3XCnV(|eb?gtMb@@x92_5qO&NT297IvVM;jkMq(%iea_d=GOH8?!4Ee0+&xD8C`F1Ley8 z?I>=Vsld^1w2j!zdG@=+O*X75&Nb=#_Y>>K-I(qB$0e?)FbGDJlMl9adU)bFdp*{5 z!L4u}k)W>j4fn#=+m~E$pjf#q#lZ@pgPgiQDfe5AoeAE7N(_!nm>GJtw}~$|l4QHO zuiPCt_BwnX;|t{d-Vn0;#p_(V$~*zjP;6_uHNzCL|?o?O8bR7{6vX+@#xw%zUXKM|0oHG8Zf zgF1ckck{v^fqXaMKZb>7`Y9r=DBjY?{mJHfCFk3#k&|aXex8I?V=6J_ zNA9u^T4xoIWuZMdseGtXs_@}bt`xHQeXKu#N`PiVo9CQH1Ik=xlDwu5-$v^B{O+Zf z_H0S1EwS_Jm7vD%J;e|R0efTH;%f0938!sqq2*{%WcjW~pEI%eGSjUBu}Fwa0T+^} z2?Z~kzDRYH_FVfI`aG56fjf)(Mc4JZojz$V^gPUazAgC}+I&#{K&?O$S)Q!!-89wj zzp%$(-mp!Yt8X6Q98_k`T9-E(5_8Buj7C+Csi0g7;~j9u;q1T(d97n$6;N!q6N}j$ zqZcpq5 zJs_SfM9R&L$9`Gr6RA7iSUxARVE3NfvhUY+MTz?IhhHHwm!EbBZJh4dc~g^*CFcp* z8-7y0s(#dn;w zYz&J{AOwrLn_Ax_NNG$JLmIGcq7v`@Z8zjVjC>k(_1BNV1{`Sky8A`YzYk4q(+DbL zOBJWb*@%utwS%A6%;{>{)>K(hzZk9zN|f=j>UYwIfDC0g%*a8YzXU*_4-6ns6V-oz zYzedud?!e6QNS+MLO91l_-C5)S5+Qsqqw^oX(*IlVIfoi9yT{e57b4E2y-^EQZ*14 zD_VJICL@w%)p-GOA5;)rT<+xv-jblYKrRKtXWZ3zz1){*aKcn#Shlx*9DWx^s7v#0 zjT~f%z|VQjybiwziWl(Jap6fq;#n6;jTTFdCdvyP#R=o|O8SozRk9ys4#z#=h)l;x z11JPfpi2k?o=uOwy1V#+f}}!6Mb&8PB>3DN^42a%WM_$r?k3;wj)r0%sSTHS(_G~k z77ExBp}Bfh_qQ0uQL9h@())=ZwmkL~7aQx$7puERU5Q1jg`J;D-ygMXk@>rxJB$4- z%8k`;Q@v&Ya(QgdO>OsxIXpbv!R-+;E{;eQ@|^p<)I(Q=1l6pSJwI^zU{0-B5k=Wp zhFRe04D8_dZRkvZTIVV9{d)>2@89g)F`dEBRJd+@ddbE-Q)2y`mSeIA8vby~eQPQD z*z{OIakpdkHaFv^H*KmNjNu))#sd%tb`_FrW5mMDtS`)@>%LR{+(Kt~n1xfWZsD1- zdb?iq{8r`OhQCr_VIig(W^%h2@C8V@Se%z$y7!pbKnd>4kGw>?frj-Gh=<4rn1O5e zFAzWBC|FRoac37pE6E!%R1h=%*rAS&V)D07Z&xnnD1z-?NM+Uenrq*`DR7|zOzI>+ z!qvDTQL+#?+3>!MI2wGFD^WtMOZdvzYmlLUWs=njio!dGWW;x zRG_OX>+9BpJf{1? z87?D-q;tLK^6X_%QAI^XduNXFk%F`HCOZEU#K=;{)$dg~G(ODgahJ@GTo$3)-vT~Q z%rdoe^V;nYOVRtwfDkLHJw!BZ^VPiDN&W|9q19S6N)<+D{SEm1O4ooq|Ai=@=~5 zcV@ESpniIKx}859B7aF}G4c%d2q_T7nG)k_dUDX?duF7*~f7*wF8=kLho%8dkRE>Bo{0T*huJh?YM zxrE)3D`<(WB!8OJj1gL$^8+uR`Bh?cUW1wS=aqpdcd>bX`>sMQQ&+=Jq&uYdk$_H$ zz$^E~5Jz5v{`nyeZ=7r_bB)w^5KBmGC7l82X?U|T_>%zWnttfKJn7)yM=>R{VkDdA zsA3uzKCvjDGIsj^K=uTQ-5hh1V`#%|@d19x)61yx@;KD@nN5THH}j7V%EjXLWw7Kl z4%DK>A>@rdZ3dl9Z=XJ0XJ?J=wzV;edz29ND52+_4Im`mrT)!jKf4lDEt6n)KPySv zSziizk0VkbL6t8-HMvZ+>?EMU*aXX^1SFSEuMRH~VAI-Um;!7ZmRAUtBqjS1<)kuI zT~=U@M!Y2A6CTQ(Y?u^ef{Nps5lY#MJIB;>;4Y6x_WihTYz+_;!8cJO@d>GxC5#0%d{L2;s z5-hSk{S}vX{8pW$r?yZ;()Xzz?6r|47v1aTTamLs&*>uf*ptEpWFOya#zhIS+y=If z-E4-7CzmA#>E!Bm+PGDH=en2J+a=mt-AZ(P62rpEYO?)!p*`Uh7yhP!5+E!@9eP*R zbG=v5LekQ*((yWf1ft;=OX8s)#zQGv+dWa85!;SP>4iVx@ToInm;9|TH4lV+6M+&; zu7JSoyXZM5J2o-l_%fiuJXP~mq}*9Q>4AJb1{ z@&di{Q%KWzqI?R=tL8Y_l-@dstqE^LY6w(P7?L%aE6sH&&HrF%c_N zIU+meD4xHywUtH@|2={**BmPP#4qhPb))vNVcEoY_3x6Y9vJ?~We;$Qv=6vJS|qDH zWI`t{4%6;n=Z=x{t33!+1CupwCFErYsW^PywZWEiB1Mr5n^s8;hhDk<1&5W%-K&*L z`$fveo}7e}oG}69;c0$!+;ls=%Q!tr4->>9b0@XPhO#HW>0$QyPILbR-NPp?{@Qx5ujs z#M}Uc0Sf{szqCB*X`UIWvn4xb!KXVYJEpx{B6XcK)(%i;VnrnCJJTh+xO<(GX+F}? zLC}|z5F1`14@d{H#yWl~2%t#DSMFVWpIWwD0`H$_N2oKZw?1~a_3LcUhk@JM6o^NJ zqFewu%(+-Qc^dl}wVp&Z+4Y4%-n@D9=PNVG-v_)R*hXT*d%IKG9n|p^ym8E&BwZq1 z04Q0PsE=;(rs@xHz}_}$#!q~9e#=fgo>Iv4G1a*{*SiB|R233lGUM(dL9_e}=0L7% zA5$YnbfiMM14O_%#!(ho4lO#k44s0@18+AR%&S$;e}>w~*vcYNOfxc!UbzBnMs5kk z==>>GDUZ==;$pZ^l0MJlUd$DX-co1{wtT(4uWG%diXx(KhMA_|i1Zqo z=&j%Boq6Kt!H*O=-ODV+8Grdr5yZ+IGU$xmYd);(J3VwkF}k{_8M;?}@5u!Q_u1je zSrf36L7m42VLL~DeX$M3J+%6h^3tUd3?|D(Qv1O9Ar6-<_UMsz<X<`5NPxKtE^7p4y~4IncBhb1`kM(X*=2dceIU> zP3X_Dwzf8^Wu$RjrY2vlMH$K-L3(pK`7>jmX|HjdR2`Xo-(l;*h=+Ezw&U2vAny4i zSay1Kw1D(s-f7c`sz+v`a}wQO7er-}z9pqGf!v_t5O4jXKdK4j!1PCnfyAx~{G**h|NphqwST_$ zuadgoDhXdG&X2;t1<+nGh06znO zZ%{Eg=&2#ue|vnZ00gp#ZNf}Xr|#`tMay=Y)T9g-PW4xL`k{Y5$%hyx+dwY_i8UI0 zxpX5acGfcLquiC#+4LvarR8(pRj5Uifc(OL74#oER{0;$|j!bogjSLuDU z?1Zixz}1O~zlQK9TNPdaHT}`QjZwvP1^`0(@aMW4@xj1G$Zp)d(@e7>gAzl>(Rs`S zyoS8qu=AMW?3*B=(rR?Rx_-{nCwvG8`Q&7v;vo&JB7sx2ZfW=E(2(|irIUSwK?Rst>9ii;G+0S_^3dO5x!>cMCK3W!u7gDqs;X1NX_0Vh_ksD-^)KRP<#t{m=n@uX(Pf6gf6M%ZQ9Pc?$8(|Tt>Yt zGP{QM)5X3vfbhtqmK?A~<7$NuhE^>Q#gbHe_rr%Y;;x( zF%n`XI?gQub9|-?;GBZ3;$&8IZDyL(IRVd3IzYsi;5pGvkeGyl9p|%&G%Wxo6}L6R zoxt6n@D6RL?>R_YaAD7ffa$=*w%)~dpu@&GeZRt4KQN$bjkJ=^VMA-V(!`GhRb?A_ z6d$sbflAsJ3LrIJ_2sV5_>)RyunBP8V8flLUGFD=*~GwpYSLe+94#cwsw&Yo${CZU z^kT{SP{an92pc-XUJJms*R5>q2&Al-E4V4dk0Ibdy-u83McX7)aWJdvPM@tM$gtUx z8`;7D`YWH}BLUw+>|t`fSiA=)nWyaaiWT`y)zSZ&^Yc=!m?d+zAnISdglnVDx~v9@ zk?>p|BvDrlOvpu4l7sZwM*rx!MTdF(!CVFjG&UaI&}$anh{>pu6Ntz!;&|ViqK+Hu zx1$NBQR_w$vZj@B{EPfj43|Kf%+10_+*4kC(ETc>wyvJo1OX8E6&`LwMuMln(yROk z#riv)ae%350r+_bSY_ArL7>S_uiXwygQRBHRhxK5_N1NvBh0jDqXIS3(O>!>@;Vkg z91pB#K|^;&XKzVPbd?-ua!nHO4nT@*I= zHL3sqY%Sy2#+H^~4o+sv7~U!vfdNxZq(Vn*CV#2%=x;SG2nQ8Y9yrjA!OFCfzDeSS zik)J(*q=(>MTh-TnvER&2?*o_xcQ zKO_E33dcWf(!G2WW zx&N!JpvXEF#|dz8MsnOf|H)>C{A6wWm}l1CmyItrY9J$ zb0;bX0^Xsd%YxJH2_*C?M`Oroj{ML!O&gG?;;^LddsaLj0ol-6ycBstqj)Deqoiao zEoaFYAbPfs{DAugs7=6NN2-8#6wf?89KUj{WA_u&a+HS%Md!zkC+Xps5*!>LGWIq% zi~fAcOoFlR{B$ER82C<(Sh`{)`w)>}40~ZxBkMa67|kUUus{ne-!W@LG((EEmC;yQ zw^3ZC1z$!Sk-)74Tr4c1YAN!pSA{3$i(tGe55rZ(pHOUUbjIoNG2xMWFXySWT*h+O z%+0N1;zak1`CkGe1|Y-tmPwNCS$xHSk)EJxJNLei-A^Ro$V1C7DT46py))xQaki^M zENBQ7nz4492zgWs2?xsUfD3Jqt(>5Gw3-HW1PVwr%gv$M6>ud`022s^FThe908 zu8p18&P()%t!~{7H2lp(8Y@l1o%`L|l5|?Y)7Ljt8>lGm!VQ>z@h5O>IkkvE5yi4Y z8;%~oGM+=~v}%V3uv2bcG>8U(RJ>oRjYwn>3x+dM}1tj z24THodZgpG%UpfboMqkVo(YQ_up3QP0Vsx}BC9WpobXX>8+%=jP&XmnsnZojjW_3K z=X{eDf#-oMigIx6(5rO<-H3b4r|vl8?kyTFHSR~uGJ*3lr>)cGt6R+tLX-Okb29{? zy)$Lfvijr!?=&KuR3h6LGC&|PLf0Ux0g=@_2vj;E7VSHnpS>A;tJ2+y(icHnb$+OKn-xp? zhJA8+5G8km{Zv5d{I`CC_=Oizu?Vv>Vxok5?6)ewxM$S2-ved55#=8iwZlm{k4ecj zE+RP5#@~RA#awh+ccS=ubQ#-*3RWHhL~(G*ZkXTT$49nl!a6brkF`v%p;^Ld0fwYl znID`tAlloc3gZT79fl&b$wx>)R<-t_Ci-1F;XwRQ&1Gl(d<6xKezC# zXdRtlik%zUA_L*sfJ?wFe6L1m7q&5edI@GlH`x^doXV|&U`eKse4GPQNDc5GFrWVV zgK9zT|6slU3S!$O;kzrnPAmhN@n%Q!Ck^K_%jrm#nUtB=H^VnGE%(Fve~;7G2r94H zp(uk!aWP2*caya*XRkX(aorPU`(Z-)vPv~Zg=7{)m&$wpll%P-j<=YSP1>`^)6EA^ zd6hprU@+#zw(ao}D^CN1_-6nNHnap!(dhvnN^autSvhq2phh2dg9`arK#BHYE2|&= zQK8dqqv2YnT88g`{eZ~b0!L#Kz4&Lp0Fbz(QT+@Cddje^1#8X~6QhCnwktp}9-j~h z1o*IN26HOnf7B*{f)1P4xcN;HQbuW@&MRpH%LfMJAO;24Sr4rDgI@F#vm)cM3Wwn= z6~I4fx=-=f0Rna!*D##z?5AUb*@R6UysKA-LeG#$d!IPw`ykzGqfaE-P&`;Se}L%0 zist~P@h^)3m|WPKVioC%0F4Syx$HgL{fh-vmf6*4ITZ`CAMbLi#gJlCN-S4^GLj`) z>+9^>hknT8Uq2-_hYF|UND%)X%bEw&Vute=$x@qiqCyUe_1Y~;oX2+zD*n=Zl_i;TaY+ zJ#0p(atsgRgaDdmu4^kH*GfwCAUY(3@*w`=>^r^Hdty$K7qgeJkg|j@1w}<*4T3#< zCD}Y%Y3%_hebziPntzFte^UH`NoujQdT8k*dN^@l20ze2yEKK+F}ak@M$vfqBg+!d zmSZbGbV%96yrE&7zuyfwX4;7CRovS9OUZeN*;jv>%g774IIA#>oyvzafP zL%AZC_|K~S!0&HAma6A$fM@c=yk`hxcfAPm%0HT#z-{TWb99$lBeEQ^Rq1KHJ!H9E zg0}bX*>??Y$zwxw*AreXWfTt1u|b4D1)0V0Iy3q7!8{zI*Oomz9}VGS(;Ic|wMhzx zycp0t=H>v-GYuQ2Nxb8D$ z&1WYGop#a`5p&`&9NlUKl7w*_eSbIImxk4uct*p0ruC_ZY)l(W zcw?2$gL4g!OhF#gQysjITE6xO2*`n*iV@sQPV&1;1 z=2T57!coPSTkm_7I|$HP=X0dBNK1D>m2NjiVWS$5U(E^jrAzY&erlz zB{mp;#Mi&4T|F4@4nAf%c?eyvHHi0`%!MY_=KvuLSHn+!AaU5C-QMTABp-H1OSgQ( z4M+P1jif@aH#!SN)>*VG3%hbW(_q36o$ zbNx!u0n_KM;i_w<#XYm*8l!cG`S|G*F_P@!DX2qqUM`rd=8U z@*ZW|+Lbo%nWeS~wf-WGqeS_11X}Jlpzl0Y zh9!(t$SfX&i~?*r6O~f5f}+NQnv*Tui?Xsw?!DGA?M6l&-yP(HF#B0wX?KI)Y+z5X z+h$Jp!I;FPU<$9kq_@Lkph;FGV>k2rpxGx^A-Asm&6S{|(`8%69S^a$A3UCEK&|9h zGzL{XHF zj|O8|PkLFx8&U%S#v>wJASN+MUh%z3m=Ha>|JXSuHbGNm7w_{6I#ziY5+MECuAqb@ zBM>t`S>L?T6lHl(H3^8q+sNQq+eaj9mXNhN9(;G3(eDkF*XsP3DR(?8z+AM5IRm|M zZk_@W$T($_^1HaiVq02$V1c|KGk5Gw1Ba96yp zp`jsEDFm1W)kcQ^nGG@DP)=DL${Cg#m3vdo>LD71IfFD1Kbo6c0Rz?zE+?C@ye$Bu=uWU$W5v%8? z^rE}eW4^_e6nqBwjDW>WwV$x0D{raB6BBHR?yB^83dChKlRC+(^NDvFKSDM6x3`-i z`3iC~xF){zf%9WK*aje0H2`PKnL`2-5-IHFUyE^~AkYO(rI*iixeeZSE!s*@#{;ky z)E8geSD(8q3czT(tWS9;Jj}NFgSD13)JpL=DC3e^aWYPNprSA&UelU;Eh;3s4_^*E< z>!oY|lb#In{nu&uhuYcr2Q9nY-s;qJHl4>@)8t9aUAl7(#+)K&!I#*1PiOA;m1bo3 z0Rlmj8C~AfIn+H~ddV=8L<;@$P$c;p;lI=<0Iu?ZJm&~>vvN=mCt`LC-8zsx_mK!M zn(^Kp6e=;MXvA+RDMWU+cL0>cG7YT|(8h=Vh;{f6y!$8a;lCV{C|}b1jd|O8JMxJ_ zb&eA@lo1?8b#}y>nfnbrFizvTEt&0(?e4XSX3S+!k6}N6Uje2Z=|6wk`Qecu$4tkr zD1;YuZLF+xqCj=n0}76*`ab<#y;>X@vnmRpmw(4e@%n!|PB1FSqg=2!VY-qhW@zNA zFW~CvJ0n@ty}5Yu>lD0-fbURsShxIh;}VXA6sD)Jo-*3Ysnu3aT=LNF1S9d4W(-u_ z%Pj|IM@6wHC=E9qBKNgl%<50BT$vlMX#lkH&??rNDTHKqn-vMzA!VBf^iqqPlKFWT zul9rMLQ>VDKC5y=8nSiX(}0|1WhAUC<`{&!&1WBq6D1fu|; zgi*%ffBvsCbCGL7qJt0`xzVHr!@Hxmw;80(AsXsn38apa)N zBq-MF6@rgJ4_og0tpuPE-;zqVqk$Mfuf85wQ~7#w!%26;qz1`wG6I`2{xO`)an=3h k>#UPE_5LqTGU({=-0+jZW!1P;45=9%ze*gdg literal 52380 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 diff --git a/web/js/events.js b/web/js/events.js index 9b7ceb38c..66d793272 100644 --- a/web/js/events.js +++ b/web/js/events.js @@ -238,6 +238,7 @@ VE.navigation.enter_focused = function() { } } +/* VE.navigation.move_focus_left = function(){ var index = parseInt($(VE.navigation.state.menu_selector).index($(VE.navigation.state.menu_selector+'.focus'))); if(index == -1) @@ -248,6 +249,8 @@ VE.navigation.move_focus_left = function(){ } else { $($(VE.navigation.state.menu_selector)[0]).addClass('focus'); } + + } VE.navigation.move_focus_right = function(){ @@ -286,6 +289,71 @@ VE.navigation.switch_menu = function(){ $($(VE.navigation.state.menu_selector)[index]).addClass('focus'); } } +*/ + + +VE.navigation.move_focus_left = function(){ + var index = parseInt($(VE.navigation.state.menu_selector).index($(VE.navigation.state.menu_selector+'.focus'))); + if(index == -1) + index = parseInt($(VE.navigation.state.menu_selector).index($(VE.navigation.state.menu_active_selector))); + + $(VE.navigation.state.menu_selector).removeClass('focus'); + + if(index > 0){ + $($(VE.navigation.state.menu_selector)[index-1]).addClass('focus'); + } else { + VE.navigation.switch_menu('last'); + } +} + +VE.navigation.move_focus_right = function(){ + var max_index = $(VE.navigation.state.menu_selector).length-1; + var index = parseInt($(VE.navigation.state.menu_selector).index($(VE.navigation.state.menu_selector+'.focus'))); + if(index == -1) + index = parseInt($(VE.navigation.state.menu_selector).index($(VE.navigation.state.menu_active_selector))) || 0; + + $(VE.navigation.state.menu_selector).removeClass('focus'); + + if(index < max_index){ + $($(VE.navigation.state.menu_selector)[index+1]).addClass('focus'); + } else { + VE.navigation.switch_menu('first'); + } +} + +VE.navigation.switch_menu = function(position){ + position = position || 'first'; // last + + if(VE.navigation.state.active_menu == 0){ + VE.navigation.state.active_menu = 1; + VE.navigation.state.menu_selector = '.l-stat__col'; + VE.navigation.state.menu_active_selector = '.l-stat__col--active'; + $('.l-menu').removeClass('active'); + $('.l-stat').addClass('active'); + + if(position == 'first'){ + $($(VE.navigation.state.menu_selector)[0]).addClass('focus'); + } else { + var max_index = $(VE.navigation.state.menu_selector).length-1; + $($(VE.navigation.state.menu_selector)[max_index]).addClass('focus'); + } + } else { + VE.navigation.state.active_menu = 0; + VE.navigation.state.menu_selector = '.l-menu__item'; + VE.navigation.state.menu_active_selector = '.l-menu__item--active'; + $('.l-menu').addClass('active'); + $('.l-stat').removeClass('active'); + + if(position == 'first'){ + $($(VE.navigation.state.menu_selector)[0]).addClass('focus'); + } else { + var max_index = $(VE.navigation.state.menu_selector).length-1; + $($(VE.navigation.state.menu_selector)[max_index]).addClass('focus'); + } + } +} + + VE.navigation.init = function(){ if($('.l-menu__item.l-menu__item--active').length){ @@ -295,7 +363,6 @@ VE.navigation.init = function(){ VE.navigation.state.menu_active_selector = '.l-menu__item--active'; $('.l-menu').addClass('active'); $('.l-stat').removeClass('active'); - } else { $('.l-stat').addClass('active'); } diff --git a/web/js/file_manager.js b/web/js/file_manager.js index d54097c8a..ae3ab5df2 100644 --- a/web/js/file_manager.js +++ b/web/js/file_manager.js @@ -663,9 +663,8 @@ FM.generate_listing = function(reply, box) { tpl.set(':SIZE_VALUE', o.type == 'f' ? FM.humanFileSizeValue(o.size) : ' '); tpl.set(':SIZE_UNIT', o.type == 'f' ? FM.humanFileSizeUnit(o.size) : ' '); tpl.set(':TIME', (psDate.getFullYear() != new Date().getFullYear()) ? psDate.getFullYear() || "" : time); - tpl.set(':DATE', o.date.trim() != '' ? psDate.format('mmm d') : ' '/*o.date*/); - - + tpl.set(':DATE', o.date.trim() != '' ? App.Constants.FM_TRANSLATED_DATES[psDate.format('mmm')] + psDate.format(' d'): ' '/*o.date*/); + if (o.name == '..' || o.type == 'd') { tpl.set(':SUBMENU_CLASS', 'hidden'); } diff --git a/web/js/i18n.js.php b/web/js/i18n.js.php index d3f2a7e0f..d84c95801 100644 --- a/web/js/i18n.js.php +++ b/web/js/i18n.js.php @@ -83,6 +83,6 @@ App.Constants.FM_FILE = ''; App.Constants.FM_ALREADY_EXISTS = ''; App.Constants.FM_CREATE_FILE = ''; App.Constants.FM_CREATE_DIRECTORY = ''; - +App.Constants.FM_TRANSLATED_DATES = {'Jan': '', 'Feb': '','Mar': '','Apr': '','May': '','Jun': '','Jul': '','Aug': '','Sep': '','Oct': '','Nov': '','Dec': ''}; diff --git a/web/templates/file_manager/main.php b/web/templates/file_manager/main.php index d395633c4..7fed618e5 100644 --- a/web/templates/file_manager/main.php +++ b/web/templates/file_manager/main.php @@ -86,11 +86,11 @@
  • n
  • F7
  • d
  • -
  • F2 / <Shift>+F6
  • +
  • F2 / Shift+F6
  • F5
  • a
  • F8 / Del
  • -
  • <Ctrl> + s
  • +
  • Ctrl + s
  • h
  • Esc
  • @@ -99,15 +99,15 @@
  • -
  • <Tab>
  • -
  • <Home>
  • -
  • <End>
  • -
  • <Enter>
  • -
  • <Backspace>
  • -
  • <Insert> / <Space>
  • -
  • <Shift> + click
  • -
  • <Ctrl> + click
  • -
  • <Ctrl> + a
  • +
  • Tab
  • +
  • Home
  • +
  • End
  • +
  • Enter
  • +
  • Backspace
  • +
  • Insert / Space
  • +
  • Shift + click
  • +
  • Ctrl + click
  • +
  • Ctrl + a
    • Midnight Commander file manager')?>
    diff --git a/web/templates/footer.html b/web/templates/footer.html index 23503e660..361b516da 100644 --- a/web/templates/footer.html +++ b/web/templates/footer.html @@ -177,19 +177,26 @@ } ); - shortcut.add("a", function(evt){ - if (!evt.ctrlKey && !evt.shiftKey) { - if ($('.l-sort__create-btn')[0]) { - location.href=$('.l-sort__create-btn').attr('href'); + $(window).bind('keypress', function(evt) { + if (evt.charCode == 97) { + evt.preventDefault(); + if (!evt.ctrlKey && !evt.shiftKey) { + if ($('.l-sort__create-btn')[0]) { + location.href=$('.l-sort__create-btn').attr('href'); + } } - } - }, { - 'type': 'keyup', - 'propagate': false, - 'disable_in_input': true, - 'target': document - } - ); + else { + if ($('.l-unit .ch-toggle:eq(0)').attr('checked')) { + $('.l-unit').removeClass('selected'); + $('.l-unit .ch-toggle').attr('checked', false); + } + else { + $('.l-unit').addClass('selected'); + $('.l-unit .ch-toggle').attr('checked', true); + } + } + } + }); shortcut.add("n", function(evt){ if (!evt.ctrlKey && !evt.shiftKey) { @@ -205,29 +212,6 @@ } ); - - shortcut.add("Ctrl+m", function(evt){ - console.log('ctrl+m'); - }, { - 'type': 'keyup', - 'propagate': false, - 'disable_in_input': true, - 'target': document - } - ); - - shortcut.add("m", function(evt){ - console.log('m'); - }, { - 'type': 'keyup', - 'propagate': false, - 'disable_in_input': true, - 'target': document - } - ); - - - shortcut.add("a+1", function(){ location.href='/add/user/'; }, { @@ -238,9 +222,6 @@ } ); - - - shortcut.add("1", function(){ if(VE.tmp.form_changed){ VE.helpers.createConfirmationDialog($('.confirmation-text-redirect'), '', $('.l-stat .l-stat__col:nth-of-type(1) a').attr('href')); @@ -393,17 +374,6 @@ } ); - shortcut.add("Alt", function(){ - VE.navigation.switch_menu(); - }, { - 'type': 'keydown', - 'propagate': false, - 'disable_in_input': false, - 'target': document - } - ); - - $('.shortcuts .close').click(function(){ $('.shortcuts').hide(); }); @@ -412,13 +382,21 @@ $('.shortcuts').toggle(); }); + $('.l-profile__notifications').click(function(){ + $('.notification-container').toggle(); + $('.l-profile__notifications').toggleClass('active'); + + left = $('.l-profile__notifications').offset().left - $('.notification-container').outerWidth() + 28; + $('.notification-container').css({left: left+'px'}); + }); + VE.navigation.init(); VE.core.register(); if (location.href.search(/list/) != -1) { var shift_select_ref = $('body').finderSelect({ - children: '.l-unit', + children: '.l-unit', 'onFinish': function(evt) { var ref = $(evt.target); $('.l-content').find('.l-unit .ch-toggle').attr('checked', false); @@ -462,7 +440,7 @@
    • n
    • -
    • <Ctrl> + Enter
    • +
    • Ctrl + Enter
    • Backspace
    • 1
    • @@ -479,8 +457,7 @@
    • -
    • <Alt>
    • -
    • <Enter>
    • +
    • Enter
    diff --git a/web/upload/UploadHandler.php b/web/upload/UploadHandler.php index 19078b53d..f26387eab 100755 --- a/web/upload/UploadHandler.php +++ b/web/upload/UploadHandler.php @@ -116,7 +116,7 @@ class UploadHandler // The php.ini settings upload_max_filesize and post_max_size // take precedence over the following max_file_size setting: 'max_file_size' => null, - 'min_file_size' => 1, + 'min_file_size' => null, // The maximum number of files for the upload directory: 'max_number_of_files' => null, // Defines which files are handled as image files: @@ -476,9 +476,17 @@ class UploadHandler 1 ); } + + protected function sanitizeFileName($file) { + $file = preg_replace("/[^a-z0-9\._-]+/", '', $file); + + return $file; + } protected function get_unique_filename($file_path, $name, $size, $type, $error, $index, $content_range) { + $name = $this->sanitizeFileName($name); + while(is_dir($this->get_upload_path($name))) { $name = $this->upcount_name($name); } @@ -1074,8 +1082,8 @@ class UploadHandler protected function handle_file_upload($uploaded_file, $name, $size, $type, $error, $index = null, $content_range = null) { - - + + $file = new \stdClass(); $file->name = $this->get_file_name($uploaded_file, $name, $size, $type, $error, $index, $content_range); @@ -1162,7 +1170,7 @@ class UploadHandler protected function body($str) { echo $str; } - + protected function header($str) { header($str); }