View file core/components/tools.php

File size: 55.65Kb
<?php 
# @*************************************************************************@
# @ Software author: Mansur Altamirov (Mansur_TL)                           @
# @ Author_url 1: https://www.instagram.com/mansur_tl                       @
# @ Author_url 2: http://codecanyon.net/user/mansur_tl                      @
# @ Author E-mail: vayart.help@gmail.com                                    @
# @*************************************************************************@
# @ ColibriSM - The Ultimate Modern Social Media Sharing Platform           @
# @ Copyright (c) 2020 - 2021 ColibriSM. All rights reserved.               @
# @*************************************************************************@

function cl_full_path($path = "") {
	if (empty($path) != true && is_string($path)) {
		return (PROJ_RP . "/" . $path);
	}
	else {
		return PROJ_RP;
	}
}

function cl_ikon($icon_name = "") {
    global $config;

    $path1 = cl_strf("themes/%s/statics/ikons/%s.svg", $config['theme'], $icon_name);

    if (file_exists(cl_full_path($path1))) {
        return file_get_contents(cl_full_path($path1));
    }
    else{
        return "<b>?</b>";
    }
}

function cl_icon($icon_name = "") {
    global $config;

    $path1 = cl_strf("themes/%s/statics/md_icons/%s.svg", $config['theme'], $icon_name);

    if (file_exists(cl_full_path($path1))) {
        return file_get_contents(cl_full_path($path1));
    }
    else{
        return "<b>?</b>";
    }
}

function cl_banner($icon_name = "") {
	global $config;

	$path = cl_strf("themes/%s/statics/banners/%s.svg",$config['theme'],$icon_name);
    $path = cl_full_path($path);

	if (file_exists($path)) {
		return file_get_contents($path);
	}
	else{
		return "<b>?</b>";
	}
}

function cl_banner_url($icon_name = "") {
    global $config;

    return cl_get_media(cl_strf("themes/%s/statics/banners/%s.svg", $config['theme'], $icon_name));
}

function cl_slug($str, $delimiter = '_'){
    $slug = trim(preg_replace("#(\p{P}|\p{C}|\p{S}|\p{Z})+#u", mb_strtolower($delimiter,'UTF-8'), $str), $delimiter);
    return mb_strtolower($slug);
}

function cl_croptxt($text = "", $len = 100,$end = "") {
    if (empty($text) || is_string($text) != true || not_num($len) || $len < 1) {
        return "";
    }
    if (mb_strlen($text) > $len) {
        $text = mb_substr($text, 0, $len, 'utf-8') . $end;
    }
    return $text;
}

function cl_html_el($tag_name = "html", $cont = "", $attrs = array()) {

    $tag_attrs = "";

    if (not_empty($attrs)) {
        $tag_attrs = cl_html_attrs($attrs);
    }
    
    return cl_strf("<%s %s>%s</%s>",$tag_name,$tag_attrs,$cont,$tag_name);
}

function cl_html_attrs($attrs = array()) {
    $tag_attrs = array();

    if (not_empty($attrs) && is_array($attrs)) {

        foreach ($attrs as $attr => $value) {
            array_push($tag_attrs, cl_strf("%s=\"%s\"",$attr,$value));
        }
    }
    
    return implode(" ", $tag_attrs);
}

function cl_text_secure($text = "") {
    global $mysqli;
    $text = trim($text);
    $text = stripslashes($text);
    $text = strip_tags($text);
    $text = mysqli_real_escape_string($mysqli, $text);
    $text = htmlspecialchars($text, ENT_NOQUOTES);
    $text = str_replace('&amp;#', '&#', $text);
    $text = preg_replace('/\{\%(.*?)\%\}/', '', $text);
    $text = preg_replace('/\&#[0-9]{1,9}\;/', '', $text);

    return $text;
}

function cl_link($path = "") {
    global $url;
    return (($path == "/") ? $url : "$url/$path");
}

function cl_redirect($link = '') {
    global $spa_load;

    if ($spa_load == '1') {

        header('Content-Type: application/json');

        $data = array(
            'status' => 302,
            'redirect_url' => cl_link($link)
        );

        echo json_encode($data, JSON_UNESCAPED_UNICODE|JSON_PRETTY_PRINT);
        exit();
    }
    else {
        header(cl_strf("Location: %s", cl_link($link)));
        exit();
    }
}

function cl_redirect_after($link = '', $seconds = 0) {
    header(cl_strf("Refresh: %d; url=%s", $seconds, cl_link($link)));
    exit();
}

function cl_location($link = '') {
    header(cl_strf("Location: %s", $link));
    exit();
}

function cl_static_file_path($path = "") {
    global $config;

    $full_path = cl_strf("%s/%s",$config['theme_url'],$path);

    return $full_path;
}

function cl_generate_csrf_token() {
    if (not_empty($_SESSION['csrf'])) {
        return $_SESSION['csrf'];
    }
    
    $hash = substr(sha1(rand(1111, 9999)), 0, 70);
    $slat = time();
    $hash = cl_strf('%d:%s',$slat,$hash);

    $_SESSION['csrf'] = $hash;

    return $hash;
}

function cl_verify_csrf_token($hash = '') {
    if (empty($_SESSION['csrf']) || empty($hash)) {
        return false;
    }

    return ($hash == $_SESSION['csrf']) ? true : false;
}

function cl_queryset($data = null, $type = 'array') {
    $query = false;
    if ($type == 'object') {
        $query = (is_object($data) && not_empty($data));
    } 

    else {
        $query = (is_array($data) && not_empty($data));
    }
    
    return $query;
}

function cl_get_media($media = '', $is_upload = false){
    global $config;
    if (empty($media)) {
        return '';
    }
    
    if ($config['as3_storage'] == 'on') {
        $as3_bucket = $config['as3_bucket_name'];
        $media_url  = cl_strf("https://%s.s3.amazonaws.com/%s", $as3_bucket, $media);
        return $media_url;
    }
    else {
        $media_url = cl_strf("%s/%s", $config['url'], $media);
        return $media_url;
    }
}

function cl_get_media_placeholder($media = ""){
    global $config;

    if (empty($media)) {
        return "";
    }
    
    if ($config['as3_storage'] == "on") {
        $as3_bucket = $config['as3_bucket_name'];
        $media_url  = cl_strf("https://%s.s3.amazonaws.com/upload/default/%s.png", $as3_bucket, $media);
        return $media_url;
    }
    else {
        $media_url = cl_strf("%s/upload/default/%s.png", $config['url'], $media);
        return $media_url;
    }
}

function cl_send_mail($data = array()) {
    global $cl, $db;

    try {
        require_once(cl_full_path('core/libs/configs/mailer.php'));

        $email_from      = $data['from_email'] = cl_text_secure($data['from_email']);
        $to_email        = $data['to_email']   = cl_text_secure($data['to_email']);
        $subject         = $data['subject'];
        $data['charSet'] = cl_text_secure($data['charSet']);
        $mail->SMTPDebug = true;

        if ($cl['config']['smtp_or_mail'] == 'mail') {
            $mail->IsMail();
        } 

        else if ($cl['config']['smtp_or_mail'] == 'smtp') {
            $mail->isSMTP();
            $mail->Timeout     = 30;
            $mail->SMTPDebug   = false;
            $mail->Host        = $cl['config']['smtp_host'];
            $mail->SMTPAuth    = true;
            $mail->Username    = $cl['config']['smtp_username'];
            $mail->Password    = $cl['config']['smtp_password'];
            $mail->SMTPSecure  = $cl['config']['smtp_encryption'];
            $mail->Port        = $cl['config']['smtp_port'];
            $mail->SMTPOptions = array(
                'ssl'          => array(
                    'verify_peer'       => false,
                    'verify_peer_name'  => false,
                    'allow_self_signed' => true
                )
            );  
        } 

        else {
            return false;
        }

        $mail->IsHTML($data['is_html']);
        $mail->setFrom($data['from_email'], $data['from_name']);
        $mail->addAddress($data['to_email'], $data['to_name']);
        $mail->Subject = $data['subject'];
        $mail->CharSet = $data['charSet'];
        $mail->MsgHTML($data['message_body']);

        if ($mail->send()) {
            $mail->ClearAddresses();

            return true;
        }
    } 

    catch (Exception $e) {
       return false; 
    }
}

function cl_curl_httpreq($url = "", $payload = array()) {

    if (empty($url)) {
        return false;
    }

    $curl = curl_init($url);

    curl_setopt($curl, CURLOPT_FOLLOWLOCATION, true);
    curl_setopt($curl, CURLOPT_HEADER, false);
    curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, 0);
    curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, 0);
    curl_setopt($curl, CURLOPT_USERAGENT, "Mozilla/5.0 (Windows; U; Windows NT 5.0; en-US; rv:1.7.12) Gecko/20050915 Firefox/1.0.7");
    
    if (not_empty($payload['post_data'])) {
        curl_setopt($curl, CURLOPT_POST, 1);
        curl_setopt($curl, CURLOPT_POSTFIELDS, $payload['post_data']);
    }

    if (not_empty($payload['bearer'])) {

        curl_setopt($curl, CURLOPT_HTTPHEADER, array(
            cl_strf("Authorization: Bearer %s", $config['bearer'])
        ));
    }

    $curl_response = curl_exec($curl);

    curl_close($curl);

    $curl_response = json($curl_response);

    if (is_array($curl_response)) {
        return $curl_response;
    }
    
    return false;
}

function http_referer() {
    global $cl;

    $ref = fetch_or_get($_SERVER['HTTP_REFERER'], $cl['config']['url']);

    return $ref;
}

function cl_cropimg($max_width, $max_height, $source_file, $dst_dir, $quality = 80) {
    $imgsize = @getimagesize($source_file);
    $width   = $imgsize[0];
    $height  = $imgsize[1];
    $mime    = $imgsize['mime'];
    switch ($mime) {
        case 'image/gif':
            $image_create = "imagecreatefromgif";
            $image        = "imagegif";
            break;
        case 'image/png':
            $image_create = "imagecreatefrompng";
            $image        = "imagepng";
            break;
        case 'image/jpeg':
            $image_create = "imagecreatefromjpeg";
            $image        = "imagejpeg";
            break;
        default:
            return false;
            break;
    }

    $dst_img    = @imagecreatetruecolor($max_width, $max_height);
    $src_img    = $image_create($source_file);
    $width_new  = ($height * $max_width / $max_height);
    $height_new = ($width * $max_height / $max_width);

    if ($width_new > $width) {
        $h_point = (($height - $height_new) / 2);
        @imagecopyresampled($dst_img, $src_img, 0, 0, 0, $h_point, $max_width, $max_height, $width, $height_new);
    } 

    else {
        $w_point = (($width - $width_new) / 2);
        @imagecopyresampled($dst_img, $src_img, 0, 0, $w_point, 0, $max_width, $max_height, $width_new, $height);
    }

    @imagejpeg($dst_img, $dst_dir, $quality);
    if ($dst_img) {
        @imagedestroy($dst_img);
    }     
    if ($src_img) {
        @imagedestroy($src_img);
    }      
}

function cl_compress_img($source_url, $destination_url, $quality) {
    $info = getimagesize($source_url);
    if ($info['mime'] == 'image/jpeg') {
        $image = @imagecreatefromjpeg($source_url);
        $image = cl_imagerotate($image, $source_url);

        @imagejpeg($image, $destination_url, $quality);
    } 

    elseif ($info['mime'] == 'image/gif') {
        $image = @imagecreatefromgif($source_url);
        $image = cl_imagerotate($image, $source_url);

        @imagegif($image, $destination_url, $quality);
    } 

    elseif ($info['mime'] == 'image/png') {
        $image = @imagecreatefrompng($source_url);

        @imagepng($image, $destination_url);
    }
}

function cl_imagerotate($img_source = false, $source_url = false) {

    if (function_exists("exif_read_data")) {
        try {
            $file_exif = @exif_read_data($source_url);

            if (not_empty($file_exif["Orientation"])) {
                if ($file_exif["Orientation"] == 3) {
                    return imagerotate($img_source, 180, 0);
                }

                else if($file_exif["Orientation"] == 6) {
                    return imagerotate($img_source, -90, 0);
                }

                else if($file_exif["Orientation"] == 8) {
                    return imagerotate($img_source, 90, 0);
                }
            }
        } 

        catch (Exception $e) {
            return $img_source;
        }
    }

    return $img_source;
}

function cl_genkey($minlength = 20, $maxlength = 20, $uselower = true, $useupper = true, $usenumbers = true, $usespecial = false) {
    $charset = '';
    if ($uselower) {
        $charset .= "abcdefghijklmnopqrstuvwxyz";
    }
    if ($useupper) {
        $charset .= "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
    }
    if ($usenumbers) {
        $charset .= "123456789";
    }
    if ($usespecial) {
        $charset .= "~@#$%^*()_+-={}|][";
    }
    if ($minlength > $maxlength) {
        $length = mt_rand($maxlength, $minlength);
    } else {
        $length = mt_rand($minlength, $maxlength);
    }
    $key = '';
    for ($i = 0; $i < $length; $i++) {
        $key .= $charset[(mt_rand(0, mb_strlen($charset) - 1))];
    }
    return $key;
}

function cl_gen_path($data = array()) {
    $upload_dirs = array(
        cl_full_path(cl_strf("upload/avatars/%s/%s",date('Y'), date('m'))),
        cl_full_path(cl_strf("upload/covers/%s/%s",date('Y'), date('m'))),
        cl_full_path(cl_strf("upload/images/%s/%s",date('Y'), date('m'))),
        cl_full_path(cl_strf("upload/videos/%s/%s",date('Y'), date('m'))),
        cl_full_path(cl_strf("upload/audios/%s/%s",date('Y'), date('m')))
    );

    foreach ($upload_dirs as $upload_dir) {
        if (file_exists($upload_dir) !== true) {
            @mkdir($upload_dir, 0777, true);
        }
    }

    $folder    = $data['folder'];
    $file_ext  = fetch_or_get($data['file_ext'], 'jpg');
    $file_type = $data['file_type'];
    $slug      = $data['slug'];
    $file_type = (not_empty($slug)) ? cl_strf("%s_%s",$file_type,$slug) : $file_type;
    $dir       = cl_strf("upload/%s/%s/%s",$folder,date('Y'),date('m'));
    $filename  = cl_strf("%s/%s_%s_%s_%s.%s", $dir, cl_genkey(), date('d'), md5(time()),$file_type,$file_ext);

    return $filename;
}

function cl_upload($data = array()) {
    global $cl;

    if (empty($data)) {
        return false;
    }

    $allowed = 'jpg,png,jpeg,gif,webp';

    if (not_empty($data['allowed'])) {
        $allowed = $data['allowed'];
    }

    $extension_allowed = explode(',', $allowed);
    $file_extension    = pathinfo($data['name'], PATHINFO_EXTENSION);
    $file_extension    = strtolower($file_extension);
    $folder            = $data['folder'];
    $file_type         = $data['file_type'];
    $slug              = $data['slug'];

    if (in_array($data['type'], $cl["media_mime_types"]) != true) {
        return array(
            'error' => 'File format not supported'
        );
    }
    else if(in_array($file_extension, $extension_allowed) != true) {
        return array(
            'error' => 'File extension not supported'
        );
    }

    else if(intval($data["size"]) > intval($cl["config"]["max_upload_size"])) {
        return array(
            'error' => 'File is too large'
        );
    }

    $file_ext       = $file_extension;
    $result         = array();
    $filename       = cl_gen_path(array(
        "folder"    => $folder,
        "file_ext"  => $file_ext,
        "file_type" => $file_type,
        "slug"      => $slug,
    ));

    if (move_uploaded_file($data['file'], $filename)) {
        if (in_array($file_ext, array('gif','png','jpeg','jpg')) == true) {
            try {
                if ($file_ext != 'gif') {
                    cl_compress_img($filename, $filename, 90);
                }
            } catch (Exception $e) { /* pass */ }

            if (not_empty($data['crop'])) {
                $crop_size         = cl_strf("%sx%s",$data['crop']['width'],$data['crop']['height']);
                $cropped_img       = cl_gen_path(array(
                    "folder"       => $folder,
                    "file_ext"     => $file_ext,
                    "file_type"    => $file_type,
                    "slug"         => $crop_size,
                ));
                $crop_image        = cl_cropimg($data['crop']['width'], $data['crop']['height'], $filename, $cropped_img, 60);
                $result['cropped'] = $cropped_img;
            }
        }

        if ($cl['config']['as3_storage'] == 'on') {

            $aws_uploadfile = fetch_or_get($data["aws_uploadfile"], "Y");

            if ($aws_uploadfile == "Y") {
                try {
                    cl_upload2s3($filename);

                    if (not_empty($result['cropped'])) {
                        cl_upload2s3($result['cropped']);
                    }
                } catch (Exception $e) { /* pass */ }
            }
        }

        $result['filename'] = $filename;
        $result['name']     = $data['name'];

        return $result;
    }
}

function cl_upload2s3($filename = null, $del_localfile = "Y") {
    global $cl;
    
    if ($cl['config']['as3_storage'] == 'off') {
        return false;
    }
    else {
        if (empty($cl['config']['as3_api_key'])) {
            return false;
        }

        else if(empty($cl['config']['as3_api_secret_key'])) {
            return false;
        }

        else if(empty($cl['config']['as3_bucket_region'])) {
            return false;
        }

        else if(empty($cl['config']['as3_bucket_name'])) {
            return false;
        }

        else {
            try {

                include_once(cl_full_path("core/libs/s3/vendor/autoload.php"));

                $amazon_s3        = new \Aws\S3\S3Client(array(
                    'version'     => 'latest',
                    'region'      => $cl['config']['as3_bucket_region'],
                    'credentials' => array(
                        'key'     => $cl['config']['as3_api_key'],
                        'secret'  => $cl['config']['as3_api_secret_key']
                    )
                ));

                $up_aws_object     = $amazon_s3->putObject(array(
                    'Bucket'       => $cl['config']['as3_bucket_name'],
                    'Key'          => $filename,
                    'Body'         => fopen($filename, 'r+'),
                    'ACL'          => 'public-read',
                    'CacheControl' => 'max-age=3153600'
                ));

                if ($del_localfile == "Y") {
                    if ($amazon_s3->doesObjectExist($cl['config']['as3_bucket_name'], $filename)) {
                        cl_delete_loc_media($filename);
                    }
                }

                return true;
            } 
            catch (Exception $e) {
                return false;
            }
        }
    } 
}

function cl_delete_from_s3($filename = null) {
    global $cl;

    if ($cl['config']['as3_storage'] == 'off') {
        return false;
    }
    else {
        if (empty($cl['config']['as3_api_key'])) {
            return false;
        }

        else if(empty($cl['config']['as3_api_secret_key'])) {
            return false;
        }

        else if(empty($cl['config']['as3_bucket_region'])) {
            return false;
        }

        else if(empty($cl['config']['as3_bucket_name'])) {
            return false;
        }

        try {
            include_once(cl_full_path("core/libs/s3/vendor/autoload.php"));

            $amazon_s3        = new \Aws\S3\S3Client(array(
                'version'     => 'latest',
                'region'      => $cl['config']['as3_bucket_region'],
                'credentials' => array(
                    'key'     => $cl['config']['as3_api_key'],
                    'secret'  => $cl['config']['as3_api_secret_key']
                )
            ));

            $rm_aws_object = $amazon_s3->deleteObject(array(
                'Bucket'   => $cl['config']['as3_bucket_name'],
                'Key'      => $filename
            ));

            if ($amazon_s3->doesObjectExist($cl['config']['as3_bucket_name'], $filename) != true) {
                return true;
            }

            else {
                return false;
            }
        } 
        catch (Exception $e) {
            return false;
        }
    }
}

function cl_import_image($data = array()) {
    global $cl;

    if (empty($data['url']) || is_url($data['url']) != true) {
        return false;
    }

    try {
        $url       = $data['url'];
        $file_ext  = explode('.', $url);
        $file_ext  = end($file_ext);
        $file_ext  = (in_array($file_ext, array('png', 'jpg', 'jpeg', 'gif', 'webp'))) ? $file_ext : 'jpg';
        $get_media = file_get_contents($url);
        $file_name = cl_gen_path(array(
            "folder" => $data["folder"],
            "file_type" => $data["file_type"],
            "slug"      => $data["slug"],
        ));

        if (not_empty($get_media)) {
            $import_image = file_put_contents(cl_full_path($file_name), $get_media);
        }

        $file_name = ((file_exists(cl_full_path($file_name))) ? $file_name : false); 

        if (not_empty($file_name)) {
            if ($cl['config']['as3_storage'] == 'on') {
                try {
                    cl_upload2s3($file_name);
                } catch (Exception $e) { /* pass */ }
            }
        }

        return $file_name;
    } 

    catch (Exception $e) {
        return false;
    }
}

function cl_import_aws_media($file_name = false) {
    global $cl;

    if (empty($file_name)) {
        return false;
    }

    try {

        $get_media = file_get_contents(cl_get_media($file_name));

        if (not_empty($get_media)) {
            file_put_contents(cl_full_path($file_name), $get_media);
        }

        $file_name = ((file_exists(cl_full_path($file_name))) ? $file_name : false); 

        return $file_name;
    } 

    catch (Exception $e) {
        return false;
    }
}

function cl_delete_loc_media($path = null) {
    global $cl;

    if (not_empty($path) && file_exists(cl_full_path($path))) {
        try {

            $placeholders = array(
                'upload/default/avatar.png',
                'upload/default/cover.png',
                'upload/default/as3-do-not-delete.png',
                'upload/default/video.png',
                'upload/default/gif.png',
                'upload/default/image.png' 
            );
            
            if (in_array($path, $placeholders) != true) {
                @unlink(cl_full_path($path));
            }
            
        } catch (Exception $e) {/*pass*/ }
    }
}

function cl_delete_media($path = null) {
    global $cl;

    if (not_empty($path) && file_exists(cl_full_path($path))) {
        try {

            $placeholders = array(
                'upload/default/avatar-1.png',
                'upload/default/avatar-2.png',
                'upload/default/avatar-3.png',
                'upload/default/avatar-4.png',
                'upload/default/avatar-5.png',
                'upload/default/avatar-6.png',
                'upload/default/avatar-7.png',
                'upload/default/avatar-8.png',
                'upload/default/avatar-9.png',
                'upload/default/avatar-10.png',
                'upload/default/avatar-11.png',
                'upload/default/avatar-12.png',
                'upload/default/avatar-13.png',
                'upload/default/avatar-14.png',
                'upload/default/avatar-15.png',
                'upload/default/cover-1.png',
                'upload/default/cover-2.png',
                'upload/default/cover-3.png',
                'upload/default/cover-4.png',
                'upload/default/cover-5.png',
                'upload/default/cover-6.png',
                'upload/default/cover-7.png',
                'upload/default/cover-8.png',
                'upload/default/cover-9.png',
                'upload/default/cover-10.png',
                'upload/default/cover-11.png',
                'upload/default/cover-12.png',
                'upload/default/cover-13.png',
                'upload/default/cover-14.png',
                'upload/default/cover-15.png',
                'upload/default/as3-do-not-delete.png'
            );
            
            if (in_array($path, $placeholders) != true) {
                @unlink(cl_full_path($path));
            }
            
        } catch (Exception $e) {/*pass*/ }
    }
    else{
        if ($cl['config']['as3_storage'] == 'on') {
            cl_delete_from_s3($path);
        }
    }
}

function cl_is_ajax() {
    if (not_empty($_SERVER['HTTP_X_REQUESTED_WITH'])) {
        if (mb_strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) == 'xmlhttprequest') {
            return true;
        }
    }

    return false;
}

function cl_number($number = null) {
    if (is_numeric($number)) {
        return number_format($number, 0, '',', ');
    }

    return 0;
}

function cl_remove_emoji($text = ""){
    return preg_replace('/[\x{1F3F4}](?:\x{E0067}\x{E0062}\x{E0077}\x{E006C}\x{E0073}\x{E007F})|[\x{1F3F4}](?:\x{E0067}\x{E0062}\x{E0073}\x{E0063}\x{E0074}\x{E007F})|[\x{1F3F4}](?:\x{E0067}\x{E0062}\x{E0065}\x{E006E}\x{E0067}\x{E007F})|[\x{1F3F4}](?:\x{200D}\x{2620}\x{FE0F})|[\x{1F3F3}](?:\x{FE0F}\x{200D}\x{1F308})|[\x{0023}\x{002A}\x{0030}\x{0031}\x{0032}\x{0033}\x{0034}\x{0035}\x{0036}\x{0037}\x{0038}\x{0039}](?:\x{FE0F}\x{20E3})|[\x{1F441}](?:\x{FE0F}\x{200D}\x{1F5E8}\x{FE0F})|[\x{1F468}\x{1F469}](?:\x{200D}\x{1F467}\x{200D}\x{1F467})|[\x{1F468}\x{1F469}](?:\x{200D}\x{1F467}\x{200D}\x{1F466})|[\x{1F468}\x{1F469}](?:\x{200D}\x{1F467})|[\x{1F468}\x{1F469}](?:\x{200D}\x{1F466}\x{200D}\x{1F466})|[\x{1F468}\x{1F469}](?:\x{200D}\x{1F466})|[\x{1F468}](?:\x{200D}\x{1F468}\x{200D}\x{1F467}\x{200D}\x{1F467})|[\x{1F468}](?:\x{200D}\x{1F468}\x{200D}\x{1F466}\x{200D}\x{1F466})|[\x{1F468}](?:\x{200D}\x{1F468}\x{200D}\x{1F467}\x{200D}\x{1F466})|[\x{1F468}](?:\x{200D}\x{1F468}\x{200D}\x{1F467})|[\x{1F468}](?:\x{200D}\x{1F468}\x{200D}\x{1F466})|[\x{1F468}\x{1F469}](?:\x{200D}\x{1F469}\x{200D}\x{1F467}\x{200D}\x{1F467})|[\x{1F468}\x{1F469}](?:\x{200D}\x{1F469}\x{200D}\x{1F466}\x{200D}\x{1F466})|[\x{1F468}\x{1F469}](?:\x{200D}\x{1F469}\x{200D}\x{1F467}\x{200D}\x{1F466})|[\x{1F468}\x{1F469}](?:\x{200D}\x{1F469}\x{200D}\x{1F467})|[\x{1F468}\x{1F469}](?:\x{200D}\x{1F469}\x{200D}\x{1F466})|[\x{1F469}](?:\x{200D}\x{2764}\x{FE0F}\x{200D}\x{1F469})|[\x{1F469}\x{1F468}](?:\x{200D}\x{2764}\x{FE0F}\x{200D}\x{1F468})|[\x{1F469}](?:\x{200D}\x{2764}\x{FE0F}\x{200D}\x{1F48B}\x{200D}\x{1F469})|[\x{1F469}\x{1F468}](?:\x{200D}\x{2764}\x{FE0F}\x{200D}\x{1F48B}\x{200D}\x{1F468})|[\x{1F468}\x{1F469}](?:\x{1F3FF}\x{200D}\x{1F9B3})|[\x{1F468}\x{1F469}](?:\x{1F3FE}\x{200D}\x{1F9B3})|[\x{1F468}\x{1F469}](?:\x{1F3FD}\x{200D}\x{1F9B3})|[\x{1F468}\x{1F469}](?:\x{1F3FC}\x{200D}\x{1F9B3})|[\x{1F468}\x{1F469}](?:\x{1F3FB}\x{200D}\x{1F9B3})|[\x{1F468}\x{1F469}](?:\x{200D}\x{1F9B3})|[\x{1F468}\x{1F469}](?:\x{1F3FF}\x{200D}\x{1F9B2})|[\x{1F468}\x{1F469}](?:\x{1F3FE}\x{200D}\x{1F9B2})|[\x{1F468}\x{1F469}](?:\x{1F3FD}\x{200D}\x{1F9B2})|[\x{1F468}\x{1F469}](?:\x{1F3FC}\x{200D}\x{1F9B2})|[\x{1F468}\x{1F469}](?:\x{1F3FB}\x{200D}\x{1F9B2})|[\x{1F468}\x{1F469}](?:\x{200D}\x{1F9B2})|[\x{1F468}\x{1F469}](?:\x{1F3FF}\x{200D}\x{1F9B1})|[\x{1F468}\x{1F469}](?:\x{1F3FE}\x{200D}\x{1F9B1})|[\x{1F468}\x{1F469}](?:\x{1F3FD}\x{200D}\x{1F9B1})|[\x{1F468}\x{1F469}](?:\x{1F3FC}\x{200D}\x{1F9B1})|[\x{1F468}\x{1F469}](?:\x{1F3FB}\x{200D}\x{1F9B1})|[\x{1F468}\x{1F469}](?:\x{200D}\x{1F9B1})|[\x{1F468}\x{1F469}](?:\x{1F3FF}\x{200D}\x{1F9B0})|[\x{1F468}\x{1F469}](?:\x{1F3FE}\x{200D}\x{1F9B0})|[\x{1F468}\x{1F469}](?:\x{1F3FD}\x{200D}\x{1F9B0})|[\x{1F468}\x{1F469}](?:\x{1F3FC}\x{200D}\x{1F9B0})|[\x{1F468}\x{1F469}](?:\x{1F3FB}\x{200D}\x{1F9B0})|[\x{1F468}\x{1F469}](?:\x{200D}\x{1F9B0})|[\x{1F575}\x{1F3CC}\x{26F9}\x{1F3CB}](?:\x{FE0F}\x{200D}\x{2640}\x{FE0F})|[\x{1F575}\x{1F3CC}\x{26F9}\x{1F3CB}](?:\x{FE0F}\x{200D}\x{2642}\x{FE0F})|[\x{1F46E}\x{1F575}\x{1F482}\x{1F477}\x{1F473}\x{1F471}\x{1F9D9}\x{1F9DA}\x{1F9DB}\x{1F9DC}\x{1F9DD}\x{1F64D}\x{1F64E}\x{1F645}\x{1F646}\x{1F481}\x{1F64B}\x{1F647}\x{1F926}\x{1F937}\x{1F486}\x{1F487}\x{1F6B6}\x{1F3C3}\x{1F9D6}\x{1F9D7}\x{1F9D8}\x{1F3CC}\x{1F3C4}\x{1F6A3}\x{1F3CA}\x{26F9}\x{1F3CB}\x{1F6B4}\x{1F6B5}\x{1F938}\x{1F93D}\x{1F93E}\x{1F939}](?:\x{1F3FF}\x{200D}\x{2640}\x{FE0F})|[\x{1F46E}\x{1F575}\x{1F482}\x{1F477}\x{1F473}\x{1F471}\x{1F9D9}\x{1F9DA}\x{1F9DB}\x{1F9DC}\x{1F9DD}\x{1F64D}\x{1F64E}\x{1F645}\x{1F646}\x{1F481}\x{1F64B}\x{1F647}\x{1F926}\x{1F937}\x{1F486}\x{1F487}\x{1F6B6}\x{1F3C3}\x{1F9D6}\x{1F9D7}\x{1F9D8}\x{1F3CC}\x{1F3C4}\x{1F6A3}\x{1F3CA}\x{26F9}\x{1F3CB}\x{1F6B4}\x{1F6B5}\x{1F938}\x{1F93D}\x{1F93E}\x{1F939}](?:\x{1F3FE}\x{200D}\x{2640}\x{FE0F})|[\x{1F46E}\x{1F575}\x{1F482}\x{1F477}\x{1F473}\x{1F471}\x{1F9D9}\x{1F9DA}\x{1F9DB}\x{1F9DC}\x{1F9DD}\x{1F64D}\x{1F64E}\x{1F645}\x{1F646}\x{1F481}\x{1F64B}\x{1F647}\x{1F926}\x{1F937}\x{1F486}\x{1F487}\x{1F6B6}\x{1F3C3}\x{1F9D6}\x{1F9D7}\x{1F9D8}\x{1F3CC}\x{1F3C4}\x{1F6A3}\x{1F3CA}\x{26F9}\x{1F3CB}\x{1F6B4}\x{1F6B5}\x{1F938}\x{1F93D}\x{1F93E}\x{1F939}](?:\x{1F3FD}\x{200D}\x{2640}\x{FE0F})|[\x{1F46E}\x{1F575}\x{1F482}\x{1F477}\x{1F473}\x{1F471}\x{1F9D9}\x{1F9DA}\x{1F9DB}\x{1F9DC}\x{1F9DD}\x{1F64D}\x{1F64E}\x{1F645}\x{1F646}\x{1F481}\x{1F64B}\x{1F647}\x{1F926}\x{1F937}\x{1F486}\x{1F487}\x{1F6B6}\x{1F3C3}\x{1F9D6}\x{1F9D7}\x{1F9D8}\x{1F3CC}\x{1F3C4}\x{1F6A3}\x{1F3CA}\x{26F9}\x{1F3CB}\x{1F6B4}\x{1F6B5}\x{1F938}\x{1F93D}\x{1F93E}\x{1F939}](?:\x{1F3FC}\x{200D}\x{2640}\x{FE0F})|[\x{1F46E}\x{1F575}\x{1F482}\x{1F477}\x{1F473}\x{1F471}\x{1F9D9}\x{1F9DA}\x{1F9DB}\x{1F9DC}\x{1F9DD}\x{1F64D}\x{1F64E}\x{1F645}\x{1F646}\x{1F481}\x{1F64B}\x{1F647}\x{1F926}\x{1F937}\x{1F486}\x{1F487}\x{1F6B6}\x{1F3C3}\x{1F9D6}\x{1F9D7}\x{1F9D8}\x{1F3CC}\x{1F3C4}\x{1F6A3}\x{1F3CA}\x{26F9}\x{1F3CB}\x{1F6B4}\x{1F6B5}\x{1F938}\x{1F93D}\x{1F93E}\x{1F939}](?:\x{1F3FB}\x{200D}\x{2640}\x{FE0F})|[\x{1F46E}\x{1F9B8}\x{1F9B9}\x{1F482}\x{1F477}\x{1F473}\x{1F471}\x{1F9D9}\x{1F9DA}\x{1F9DB}\x{1F9DC}\x{1F9DD}\x{1F9DE}\x{1F9DF}\x{1F64D}\x{1F64E}\x{1F645}\x{1F646}\x{1F481}\x{1F64B}\x{1F647}\x{1F926}\x{1F937}\x{1F486}\x{1F487}\x{1F6B6}\x{1F3C3}\x{1F46F}\x{1F9D6}\x{1F9D7}\x{1F9D8}\x{1F3C4}\x{1F6A3}\x{1F3CA}\x{1F6B4}\x{1F6B5}\x{1F938}\x{1F93C}\x{1F93D}\x{1F93E}\x{1F939}](?:\x{200D}\x{2640}\x{FE0F})|[\x{1F46E}\x{1F575}\x{1F482}\x{1F477}\x{1F473}\x{1F471}\x{1F9D9}\x{1F9DA}\x{1F9DB}\x{1F9DC}\x{1F9DD}\x{1F64D}\x{1F64E}\x{1F645}\x{1F646}\x{1F481}\x{1F64B}\x{1F647}\x{1F926}\x{1F937}\x{1F486}\x{1F487}\x{1F6B6}\x{1F3C3}\x{1F9D6}\x{1F9D7}\x{1F9D8}\x{1F3CC}\x{1F3C4}\x{1F6A3}\x{1F3CA}\x{26F9}\x{1F3CB}\x{1F6B4}\x{1F6B5}\x{1F938}\x{1F93D}\x{1F93E}\x{1F939}](?:\x{1F3FF}\x{200D}\x{2642}\x{FE0F})|[\x{1F46E}\x{1F575}\x{1F482}\x{1F477}\x{1F473}\x{1F471}\x{1F9D9}\x{1F9DA}\x{1F9DB}\x{1F9DC}\x{1F9DD}\x{1F64D}\x{1F64E}\x{1F645}\x{1F646}\x{1F481}\x{1F64B}\x{1F647}\x{1F926}\x{1F937}\x{1F486}\x{1F487}\x{1F6B6}\x{1F3C3}\x{1F9D6}\x{1F9D7}\x{1F9D8}\x{1F3CC}\x{1F3C4}\x{1F6A3}\x{1F3CA}\x{26F9}\x{1F3CB}\x{1F6B4}\x{1F6B5}\x{1F938}\x{1F93D}\x{1F93E}\x{1F939}](?:\x{1F3FE}\x{200D}\x{2642}\x{FE0F})|[\x{1F46E}\x{1F575}\x{1F482}\x{1F477}\x{1F473}\x{1F471}\x{1F9D9}\x{1F9DA}\x{1F9DB}\x{1F9DC}\x{1F9DD}\x{1F64D}\x{1F64E}\x{1F645}\x{1F646}\x{1F481}\x{1F64B}\x{1F647}\x{1F926}\x{1F937}\x{1F486}\x{1F487}\x{1F6B6}\x{1F3C3}\x{1F9D6}\x{1F9D7}\x{1F9D8}\x{1F3CC}\x{1F3C4}\x{1F6A3}\x{1F3CA}\x{26F9}\x{1F3CB}\x{1F6B4}\x{1F6B5}\x{1F938}\x{1F93D}\x{1F93E}\x{1F939}](?:\x{1F3FD}\x{200D}\x{2642}\x{FE0F})|[\x{1F46E}\x{1F575}\x{1F482}\x{1F477}\x{1F473}\x{1F471}\x{1F9D9}\x{1F9DA}\x{1F9DB}\x{1F9DC}\x{1F9DD}\x{1F64D}\x{1F64E}\x{1F645}\x{1F646}\x{1F481}\x{1F64B}\x{1F647}\x{1F926}\x{1F937}\x{1F486}\x{1F487}\x{1F6B6}\x{1F3C3}\x{1F9D6}\x{1F9D7}\x{1F9D8}\x{1F3CC}\x{1F3C4}\x{1F6A3}\x{1F3CA}\x{26F9}\x{1F3CB}\x{1F6B4}\x{1F6B5}\x{1F938}\x{1F93D}\x{1F93E}\x{1F939}](?:\x{1F3FC}\x{200D}\x{2642}\x{FE0F})|[\x{1F46E}\x{1F575}\x{1F482}\x{1F477}\x{1F473}\x{1F471}\x{1F9D9}\x{1F9DA}\x{1F9DB}\x{1F9DC}\x{1F9DD}\x{1F64D}\x{1F64E}\x{1F645}\x{1F646}\x{1F481}\x{1F64B}\x{1F647}\x{1F926}\x{1F937}\x{1F486}\x{1F487}\x{1F6B6}\x{1F3C3}\x{1F9D6}\x{1F9D7}\x{1F9D8}\x{1F3CC}\x{1F3C4}\x{1F6A3}\x{1F3CA}\x{26F9}\x{1F3CB}\x{1F6B4}\x{1F6B5}\x{1F938}\x{1F93D}\x{1F93E}\x{1F939}](?:\x{1F3FB}\x{200D}\x{2642}\x{FE0F})|[\x{1F46E}\x{1F9B8}\x{1F9B9}\x{1F482}\x{1F477}\x{1F473}\x{1F471}\x{1F9D9}\x{1F9DA}\x{1F9DB}\x{1F9DC}\x{1F9DD}\x{1F9DE}\x{1F9DF}\x{1F64D}\x{1F64E}\x{1F645}\x{1F646}\x{1F481}\x{1F64B}\x{1F647}\x{1F926}\x{1F937}\x{1F486}\x{1F487}\x{1F6B6}\x{1F3C3}\x{1F46F}\x{1F9D6}\x{1F9D7}\x{1F9D8}\x{1F3C4}\x{1F6A3}\x{1F3CA}\x{1F6B4}\x{1F6B5}\x{1F938}\x{1F93C}\x{1F93D}\x{1F93E}\x{1F939}](?:\x{200D}\x{2642}\x{FE0F})|[\x{1F468}\x{1F469}](?:\x{1F3FF}\x{200D}\x{1F692})|[\x{1F468}\x{1F469}](?:\x{1F3FE}\x{200D}\x{1F692})|[\x{1F468}\x{1F469}](?:\x{1F3FD}\x{200D}\x{1F692})|[\x{1F468}\x{1F469}](?:\x{1F3FC}\x{200D}\x{1F692})|[\x{1F468}\x{1F469}](?:\x{1F3FB}\x{200D}\x{1F692})|[\x{1F468}\x{1F469}](?:\x{200D}\x{1F692})|[\x{1F468}\x{1F469}](?:\x{1F3FF}\x{200D}\x{1F680})|[\x{1F468}\x{1F469}](?:\x{1F3FE}\x{200D}\x{1F680})|[\x{1F468}\x{1F469}](?:\x{1F3FD}\x{200D}\x{1F680})|[\x{1F468}\x{1F469}](?:\x{1F3FC}\x{200D}\x{1F680})|[\x{1F468}\x{1F469}](?:\x{1F3FB}\x{200D}\x{1F680})|[\x{1F468}\x{1F469}](?:\x{200D}\x{1F680})|[\x{1F468}\x{1F469}](?:\x{1F3FF}\x{200D}\x{2708}\x{FE0F})|[\x{1F468}\x{1F469}](?:\x{1F3FE}\x{200D}\x{2708}\x{FE0F})|[\x{1F468}\x{1F469}](?:\x{1F3FD}\x{200D}\x{2708}\x{FE0F})|[\x{1F468}\x{1F469}](?:\x{1F3FC}\x{200D}\x{2708}\x{FE0F})|[\x{1F468}\x{1F469}](?:\x{1F3FB}\x{200D}\x{2708}\x{FE0F})|[\x{1F468}\x{1F469}](?:\x{200D}\x{2708}\x{FE0F})|[\x{1F468}\x{1F469}](?:\x{1F3FF}\x{200D}\x{1F3A8})|[\x{1F468}\x{1F469}](?:\x{1F3FE}\x{200D}\x{1F3A8})|[\x{1F468}\x{1F469}](?:\x{1F3FD}\x{200D}\x{1F3A8})|[\x{1F468}\x{1F469}](?:\x{1F3FC}\x{200D}\x{1F3A8})|[\x{1F468}\x{1F469}](?:\x{1F3FB}\x{200D}\x{1F3A8})|[\x{1F468}\x{1F469}](?:\x{200D}\x{1F3A8})|[\x{1F468}\x{1F469}](?:\x{1F3FF}\x{200D}\x{1F3A4})|[\x{1F468}\x{1F469}](?:\x{1F3FE}\x{200D}\x{1F3A4})|[\x{1F468}\x{1F469}](?:\x{1F3FD}\x{200D}\x{1F3A4})|[\x{1F468}\x{1F469}](?:\x{1F3FC}\x{200D}\x{1F3A4})|[\x{1F468}\x{1F469}](?:\x{1F3FB}\x{200D}\x{1F3A4})|[\x{1F468}\x{1F469}](?:\x{200D}\x{1F3A4})|[\x{1F468}\x{1F469}](?:\x{1F3FF}\x{200D}\x{1F4BB})|[\x{1F468}\x{1F469}](?:\x{1F3FE}\x{200D}\x{1F4BB})|[\x{1F468}\x{1F469}](?:\x{1F3FD}\x{200D}\x{1F4BB})|[\x{1F468}\x{1F469}](?:\x{1F3FC}\x{200D}\x{1F4BB})|[\x{1F468}\x{1F469}](?:\x{1F3FB}\x{200D}\x{1F4BB})|[\x{1F468}\x{1F469}](?:\x{200D}\x{1F4BB})|[\x{1F468}\x{1F469}](?:\x{1F3FF}\x{200D}\x{1F52C})|[\x{1F468}\x{1F469}](?:\x{1F3FE}\x{200D}\x{1F52C})|[\x{1F468}\x{1F469}](?:\x{1F3FD}\x{200D}\x{1F52C})|[\x{1F468}\x{1F469}](?:\x{1F3FC}\x{200D}\x{1F52C})|[\x{1F468}\x{1F469}](?:\x{1F3FB}\x{200D}\x{1F52C})|[\x{1F468}\x{1F469}](?:\x{200D}\x{1F52C})|[\x{1F468}\x{1F469}](?:\x{1F3FF}\x{200D}\x{1F4BC})|[\x{1F468}\x{1F469}](?:\x{1F3FE}\x{200D}\x{1F4BC})|[\x{1F468}\x{1F469}](?:\x{1F3FD}\x{200D}\x{1F4BC})|[\x{1F468}\x{1F469}](?:\x{1F3FC}\x{200D}\x{1F4BC})|[\x{1F468}\x{1F469}](?:\x{1F3FB}\x{200D}\x{1F4BC})|[\x{1F468}\x{1F469}](?:\x{200D}\x{1F4BC})|[\x{1F468}\x{1F469}](?:\x{1F3FF}\x{200D}\x{1F3ED})|[\x{1F468}\x{1F469}](?:\x{1F3FE}\x{200D}\x{1F3ED})|[\x{1F468}\x{1F469}](?:\x{1F3FD}\x{200D}\x{1F3ED})|[\x{1F468}\x{1F469}](?:\x{1F3FC}\x{200D}\x{1F3ED})|[\x{1F468}\x{1F469}](?:\x{1F3FB}\x{200D}\x{1F3ED})|[\x{1F468}\x{1F469}](?:\x{200D}\x{1F3ED})|[\x{1F468}\x{1F469}](?:\x{1F3FF}\x{200D}\x{1F527})|[\x{1F468}\x{1F469}](?:\x{1F3FE}\x{200D}\x{1F527})|[\x{1F468}\x{1F469}](?:\x{1F3FD}\x{200D}\x{1F527})|[\x{1F468}\x{1F469}](?:\x{1F3FC}\x{200D}\x{1F527})|[\x{1F468}\x{1F469}](?:\x{1F3FB}\x{200D}\x{1F527})|[\x{1F468}\x{1F469}](?:\x{200D}\x{1F527})|[\x{1F468}\x{1F469}](?:\x{1F3FF}\x{200D}\x{1F373})|[\x{1F468}\x{1F469}](?:\x{1F3FE}\x{200D}\x{1F373})|[\x{1F468}\x{1F469}](?:\x{1F3FD}\x{200D}\x{1F373})|[\x{1F468}\x{1F469}](?:\x{1F3FC}\x{200D}\x{1F373})|[\x{1F468}\x{1F469}](?:\x{1F3FB}\x{200D}\x{1F373})|[\x{1F468}\x{1F469}](?:\x{200D}\x{1F373})|[\x{1F468}\x{1F469}](?:\x{1F3FF}\x{200D}\x{1F33E})|[\x{1F468}\x{1F469}](?:\x{1F3FE}\x{200D}\x{1F33E})|[\x{1F468}\x{1F469}](?:\x{1F3FD}\x{200D}\x{1F33E})|[\x{1F468}\x{1F469}](?:\x{1F3FC}\x{200D}\x{1F33E})|[\x{1F468}\x{1F469}](?:\x{1F3FB}\x{200D}\x{1F33E})|[\x{1F468}\x{1F469}](?:\x{200D}\x{1F33E})|[\x{1F468}\x{1F469}](?:\x{1F3FF}\x{200D}\x{2696}\x{FE0F})|[\x{1F468}\x{1F469}](?:\x{1F3FE}\x{200D}\x{2696}\x{FE0F})|[\x{1F468}\x{1F469}](?:\x{1F3FD}\x{200D}\x{2696}\x{FE0F})|[\x{1F468}\x{1F469}](?:\x{1F3FC}\x{200D}\x{2696}\x{FE0F})|[\x{1F468}\x{1F469}](?:\x{1F3FB}\x{200D}\x{2696}\x{FE0F})|[\x{1F468}\x{1F469}](?:\x{200D}\x{2696}\x{FE0F})|[\x{1F468}\x{1F469}](?:\x{1F3FF}\x{200D}\x{1F3EB})|[\x{1F468}\x{1F469}](?:\x{1F3FE}\x{200D}\x{1F3EB})|[\x{1F468}\x{1F469}](?:\x{1F3FD}\x{200D}\x{1F3EB})|[\x{1F468}\x{1F469}](?:\x{1F3FC}\x{200D}\x{1F3EB})|[\x{1F468}\x{1F469}](?:\x{1F3FB}\x{200D}\x{1F3EB})|[\x{1F468}\x{1F469}](?:\x{200D}\x{1F3EB})|[\x{1F468}\x{1F469}](?:\x{1F3FF}\x{200D}\x{1F393})|[\x{1F468}\x{1F469}](?:\x{1F3FE}\x{200D}\x{1F393})|[\x{1F468}\x{1F469}](?:\x{1F3FD}\x{200D}\x{1F393})|[\x{1F468}\x{1F469}](?:\x{1F3FC}\x{200D}\x{1F393})|[\x{1F468}\x{1F469}](?:\x{1F3FB}\x{200D}\x{1F393})|[\x{1F468}\x{1F469}](?:\x{200D}\x{1F393})|[\x{1F468}\x{1F469}](?:\x{1F3FF}\x{200D}\x{2695}\x{FE0F})|[\x{1F468}\x{1F469}](?:\x{1F3FE}\x{200D}\x{2695}\x{FE0F})|[\x{1F468}\x{1F469}](?:\x{1F3FD}\x{200D}\x{2695}\x{FE0F})|[\x{1F468}\x{1F469}](?:\x{1F3FC}\x{200D}\x{2695}\x{FE0F})|[\x{1F468}\x{1F469}](?:\x{1F3FB}\x{200D}\x{2695}\x{FE0F})|[\x{1F468}\x{1F469}](?:\x{200D}\x{2695}\x{FE0F})|[\x{1F476}\x{1F9D2}\x{1F466}\x{1F467}\x{1F9D1}\x{1F468}\x{1F469}\x{1F9D3}\x{1F474}\x{1F475}\x{1F46E}\x{1F575}\x{1F482}\x{1F477}\x{1F934}\x{1F478}\x{1F473}\x{1F472}\x{1F9D5}\x{1F9D4}\x{1F471}\x{1F935}\x{1F470}\x{1F930}\x{1F931}\x{1F47C}\x{1F385}\x{1F936}\x{1F9D9}\x{1F9DA}\x{1F9DB}\x{1F9DC}\x{1F9DD}\x{1F64D}\x{1F64E}\x{1F645}\x{1F646}\x{1F481}\x{1F64B}\x{1F647}\x{1F926}\x{1F937}\x{1F486}\x{1F487}\x{1F6B6}\x{1F3C3}\x{1F483}\x{1F57A}\x{1F9D6}\x{1F9D7}\x{1F9D8}\x{1F6C0}\x{1F6CC}\x{1F574}\x{1F3C7}\x{1F3C2}\x{1F3CC}\x{1F3C4}\x{1F6A3}\x{1F3CA}\x{26F9}\x{1F3CB}\x{1F6B4}\x{1F6B5}\x{1F938}\x{1F93D}\x{1F93E}\x{1F939}\x{1F933}\x{1F4AA}\x{1F9B5}\x{1F9B6}\x{1F448}\x{1F449}\x{261D}\x{1F446}\x{1F595}\x{1F447}\x{270C}\x{1F91E}\x{1F596}\x{1F918}\x{1F919}\x{1F590}\x{270B}\x{1F44C}\x{1F44D}\x{1F44E}\x{270A}\x{1F44A}\x{1F91B}\x{1F91C}\x{1F91A}\x{1F44B}\x{1F91F}\x{270D}\x{1F44F}\x{1F450}\x{1F64C}\x{1F932}\x{1F64F}\x{1F485}\x{1F442}\x{1F443}](?:\x{1F3FF})|[\x{1F476}\x{1F9D2}\x{1F466}\x{1F467}\x{1F9D1}\x{1F468}\x{1F469}\x{1F9D3}\x{1F474}\x{1F475}\x{1F46E}\x{1F575}\x{1F482}\x{1F477}\x{1F934}\x{1F478}\x{1F473}\x{1F472}\x{1F9D5}\x{1F9D4}\x{1F471}\x{1F935}\x{1F470}\x{1F930}\x{1F931}\x{1F47C}\x{1F385}\x{1F936}\x{1F9D9}\x{1F9DA}\x{1F9DB}\x{1F9DC}\x{1F9DD}\x{1F64D}\x{1F64E}\x{1F645}\x{1F646}\x{1F481}\x{1F64B}\x{1F647}\x{1F926}\x{1F937}\x{1F486}\x{1F487}\x{1F6B6}\x{1F3C3}\x{1F483}\x{1F57A}\x{1F9D6}\x{1F9D7}\x{1F9D8}\x{1F6C0}\x{1F6CC}\x{1F574}\x{1F3C7}\x{1F3C2}\x{1F3CC}\x{1F3C4}\x{1F6A3}\x{1F3CA}\x{26F9}\x{1F3CB}\x{1F6B4}\x{1F6B5}\x{1F938}\x{1F93D}\x{1F93E}\x{1F939}\x{1F933}\x{1F4AA}\x{1F9B5}\x{1F9B6}\x{1F448}\x{1F449}\x{261D}\x{1F446}\x{1F595}\x{1F447}\x{270C}\x{1F91E}\x{1F596}\x{1F918}\x{1F919}\x{1F590}\x{270B}\x{1F44C}\x{1F44D}\x{1F44E}\x{270A}\x{1F44A}\x{1F91B}\x{1F91C}\x{1F91A}\x{1F44B}\x{1F91F}\x{270D}\x{1F44F}\x{1F450}\x{1F64C}\x{1F932}\x{1F64F}\x{1F485}\x{1F442}\x{1F443}](?:\x{1F3FE})|[\x{1F476}\x{1F9D2}\x{1F466}\x{1F467}\x{1F9D1}\x{1F468}\x{1F469}\x{1F9D3}\x{1F474}\x{1F475}\x{1F46E}\x{1F575}\x{1F482}\x{1F477}\x{1F934}\x{1F478}\x{1F473}\x{1F472}\x{1F9D5}\x{1F9D4}\x{1F471}\x{1F935}\x{1F470}\x{1F930}\x{1F931}\x{1F47C}\x{1F385}\x{1F936}\x{1F9D9}\x{1F9DA}\x{1F9DB}\x{1F9DC}\x{1F9DD}\x{1F64D}\x{1F64E}\x{1F645}\x{1F646}\x{1F481}\x{1F64B}\x{1F647}\x{1F926}\x{1F937}\x{1F486}\x{1F487}\x{1F6B6}\x{1F3C3}\x{1F483}\x{1F57A}\x{1F9D6}\x{1F9D7}\x{1F9D8}\x{1F6C0}\x{1F6CC}\x{1F574}\x{1F3C7}\x{1F3C2}\x{1F3CC}\x{1F3C4}\x{1F6A3}\x{1F3CA}\x{26F9}\x{1F3CB}\x{1F6B4}\x{1F6B5}\x{1F938}\x{1F93D}\x{1F93E}\x{1F939}\x{1F933}\x{1F4AA}\x{1F9B5}\x{1F9B6}\x{1F448}\x{1F449}\x{261D}\x{1F446}\x{1F595}\x{1F447}\x{270C}\x{1F91E}\x{1F596}\x{1F918}\x{1F919}\x{1F590}\x{270B}\x{1F44C}\x{1F44D}\x{1F44E}\x{270A}\x{1F44A}\x{1F91B}\x{1F91C}\x{1F91A}\x{1F44B}\x{1F91F}\x{270D}\x{1F44F}\x{1F450}\x{1F64C}\x{1F932}\x{1F64F}\x{1F485}\x{1F442}\x{1F443}](?:\x{1F3FD})|[\x{1F476}\x{1F9D2}\x{1F466}\x{1F467}\x{1F9D1}\x{1F468}\x{1F469}\x{1F9D3}\x{1F474}\x{1F475}\x{1F46E}\x{1F575}\x{1F482}\x{1F477}\x{1F934}\x{1F478}\x{1F473}\x{1F472}\x{1F9D5}\x{1F9D4}\x{1F471}\x{1F935}\x{1F470}\x{1F930}\x{1F931}\x{1F47C}\x{1F385}\x{1F936}\x{1F9D9}\x{1F9DA}\x{1F9DB}\x{1F9DC}\x{1F9DD}\x{1F64D}\x{1F64E}\x{1F645}\x{1F646}\x{1F481}\x{1F64B}\x{1F647}\x{1F926}\x{1F937}\x{1F486}\x{1F487}\x{1F6B6}\x{1F3C3}\x{1F483}\x{1F57A}\x{1F9D6}\x{1F9D7}\x{1F9D8}\x{1F6C0}\x{1F6CC}\x{1F574}\x{1F3C7}\x{1F3C2}\x{1F3CC}\x{1F3C4}\x{1F6A3}\x{1F3CA}\x{26F9}\x{1F3CB}\x{1F6B4}\x{1F6B5}\x{1F938}\x{1F93D}\x{1F93E}\x{1F939}\x{1F933}\x{1F4AA}\x{1F9B5}\x{1F9B6}\x{1F448}\x{1F449}\x{261D}\x{1F446}\x{1F595}\x{1F447}\x{270C}\x{1F91E}\x{1F596}\x{1F918}\x{1F919}\x{1F590}\x{270B}\x{1F44C}\x{1F44D}\x{1F44E}\x{270A}\x{1F44A}\x{1F91B}\x{1F91C}\x{1F91A}\x{1F44B}\x{1F91F}\x{270D}\x{1F44F}\x{1F450}\x{1F64C}\x{1F932}\x{1F64F}\x{1F485}\x{1F442}\x{1F443}](?:\x{1F3FC})|[\x{1F476}\x{1F9D2}\x{1F466}\x{1F467}\x{1F9D1}\x{1F468}\x{1F469}\x{1F9D3}\x{1F474}\x{1F475}\x{1F46E}\x{1F575}\x{1F482}\x{1F477}\x{1F934}\x{1F478}\x{1F473}\x{1F472}\x{1F9D5}\x{1F9D4}\x{1F471}\x{1F935}\x{1F470}\x{1F930}\x{1F931}\x{1F47C}\x{1F385}\x{1F936}\x{1F9D9}\x{1F9DA}\x{1F9DB}\x{1F9DC}\x{1F9DD}\x{1F64D}\x{1F64E}\x{1F645}\x{1F646}\x{1F481}\x{1F64B}\x{1F647}\x{1F926}\x{1F937}\x{1F486}\x{1F487}\x{1F6B6}\x{1F3C3}\x{1F483}\x{1F57A}\x{1F9D6}\x{1F9D7}\x{1F9D8}\x{1F6C0}\x{1F6CC}\x{1F574}\x{1F3C7}\x{1F3C2}\x{1F3CC}\x{1F3C4}\x{1F6A3}\x{1F3CA}\x{26F9}\x{1F3CB}\x{1F6B4}\x{1F6B5}\x{1F938}\x{1F93D}\x{1F93E}\x{1F939}\x{1F933}\x{1F4AA}\x{1F9B5}\x{1F9B6}\x{1F448}\x{1F449}\x{261D}\x{1F446}\x{1F595}\x{1F447}\x{270C}\x{1F91E}\x{1F596}\x{1F918}\x{1F919}\x{1F590}\x{270B}\x{1F44C}\x{1F44D}\x{1F44E}\x{270A}\x{1F44A}\x{1F91B}\x{1F91C}\x{1F91A}\x{1F44B}\x{1F91F}\x{270D}\x{1F44F}\x{1F450}\x{1F64C}\x{1F932}\x{1F64F}\x{1F485}\x{1F442}\x{1F443}](?:\x{1F3FB})|[\x{1F1E6}\x{1F1E7}\x{1F1E8}\x{1F1E9}\x{1F1F0}\x{1F1F2}\x{1F1F3}\x{1F1F8}\x{1F1F9}\x{1F1FA}](?:\x{1F1FF})|[\x{1F1E7}\x{1F1E8}\x{1F1EC}\x{1F1F0}\x{1F1F1}\x{1F1F2}\x{1F1F5}\x{1F1F8}\x{1F1FA}](?:\x{1F1FE})|[\x{1F1E6}\x{1F1E8}\x{1F1F2}\x{1F1F8}](?:\x{1F1FD})|[\x{1F1E6}\x{1F1E7}\x{1F1E8}\x{1F1EC}\x{1F1F0}\x{1F1F2}\x{1F1F5}\x{1F1F7}\x{1F1F9}\x{1F1FF}](?:\x{1F1FC})|[\x{1F1E7}\x{1F1E8}\x{1F1F1}\x{1F1F2}\x{1F1F8}\x{1F1F9}](?:\x{1F1FB})|[\x{1F1E6}\x{1F1E8}\x{1F1EA}\x{1F1EC}\x{1F1ED}\x{1F1F1}\x{1F1F2}\x{1F1F3}\x{1F1F7}\x{1F1FB}](?:\x{1F1FA})|[\x{1F1E6}\x{1F1E7}\x{1F1EA}\x{1F1EC}\x{1F1ED}\x{1F1EE}\x{1F1F1}\x{1F1F2}\x{1F1F5}\x{1F1F8}\x{1F1F9}\x{1F1FE}](?:\x{1F1F9})|[\x{1F1E6}\x{1F1E7}\x{1F1EA}\x{1F1EC}\x{1F1EE}\x{1F1F1}\x{1F1F2}\x{1F1F5}\x{1F1F7}\x{1F1F8}\x{1F1FA}\x{1F1FC}](?:\x{1F1F8})|[\x{1F1E6}\x{1F1E7}\x{1F1E8}\x{1F1EA}\x{1F1EB}\x{1F1EC}\x{1F1ED}\x{1F1EE}\x{1F1F0}\x{1F1F1}\x{1F1F2}\x{1F1F3}\x{1F1F5}\x{1F1F8}\x{1F1F9}](?:\x{1F1F7})|[\x{1F1E6}\x{1F1E7}\x{1F1EC}\x{1F1EE}\x{1F1F2}](?:\x{1F1F6})|[\x{1F1E8}\x{1F1EC}\x{1F1EF}\x{1F1F0}\x{1F1F2}\x{1F1F3}](?:\x{1F1F5})|[\x{1F1E6}\x{1F1E7}\x{1F1E8}\x{1F1E9}\x{1F1EB}\x{1F1EE}\x{1F1EF}\x{1F1F2}\x{1F1F3}\x{1F1F7}\x{1F1F8}\x{1F1F9}](?:\x{1F1F4})|[\x{1F1E7}\x{1F1E8}\x{1F1EC}\x{1F1ED}\x{1F1EE}\x{1F1F0}\x{1F1F2}\x{1F1F5}\x{1F1F8}\x{1F1F9}\x{1F1FA}\x{1F1FB}](?:\x{1F1F3})|[\x{1F1E6}\x{1F1E7}\x{1F1E8}\x{1F1E9}\x{1F1EB}\x{1F1EC}\x{1F1ED}\x{1F1EE}\x{1F1EF}\x{1F1F0}\x{1F1F2}\x{1F1F4}\x{1F1F5}\x{1F1F8}\x{1F1F9}\x{1F1FA}\x{1F1FF}](?:\x{1F1F2})|[\x{1F1E6}\x{1F1E7}\x{1F1E8}\x{1F1EC}\x{1F1EE}\x{1F1F2}\x{1F1F3}\x{1F1F5}\x{1F1F8}\x{1F1F9}](?:\x{1F1F1})|[\x{1F1E8}\x{1F1E9}\x{1F1EB}\x{1F1ED}\x{1F1F1}\x{1F1F2}\x{1F1F5}\x{1F1F8}\x{1F1F9}\x{1F1FD}](?:\x{1F1F0})|[\x{1F1E7}\x{1F1E9}\x{1F1EB}\x{1F1F8}\x{1F1F9}](?:\x{1F1EF})|[\x{1F1E6}\x{1F1E7}\x{1F1E8}\x{1F1EB}\x{1F1EC}\x{1F1F0}\x{1F1F1}\x{1F1F3}\x{1F1F8}\x{1F1FB}](?:\x{1F1EE})|[\x{1F1E7}\x{1F1E8}\x{1F1EA}\x{1F1EC}\x{1F1F0}\x{1F1F2}\x{1F1F5}\x{1F1F8}\x{1F1F9}](?:\x{1F1ED})|[\x{1F1E6}\x{1F1E7}\x{1F1E8}\x{1F1E9}\x{1F1EA}\x{1F1EC}\x{1F1F0}\x{1F1F2}\x{1F1F3}\x{1F1F5}\x{1F1F8}\x{1F1F9}\x{1F1FA}\x{1F1FB}](?:\x{1F1EC})|[\x{1F1E6}\x{1F1E7}\x{1F1E8}\x{1F1EC}\x{1F1F2}\x{1F1F3}\x{1F1F5}\x{1F1F9}\x{1F1FC}](?:\x{1F1EB})|[\x{1F1E6}\x{1F1E7}\x{1F1E9}\x{1F1EA}\x{1F1EC}\x{1F1EE}\x{1F1EF}\x{1F1F0}\x{1F1F2}\x{1F1F3}\x{1F1F5}\x{1F1F7}\x{1F1F8}\x{1F1FB}\x{1F1FE}](?:\x{1F1EA})|[\x{1F1E6}\x{1F1E7}\x{1F1E8}\x{1F1EC}\x{1F1EE}\x{1F1F2}\x{1F1F8}\x{1F1F9}](?:\x{1F1E9})|[\x{1F1E6}\x{1F1E8}\x{1F1EA}\x{1F1EE}\x{1F1F1}\x{1F1F2}\x{1F1F3}\x{1F1F8}\x{1F1F9}\x{1F1FB}](?:\x{1F1E8})|[\x{1F1E7}\x{1F1EC}\x{1F1F1}\x{1F1F8}](?:\x{1F1E7})|[\x{1F1E7}\x{1F1E8}\x{1F1EA}\x{1F1EC}\x{1F1F1}\x{1F1F2}\x{1F1F3}\x{1F1F5}\x{1F1F6}\x{1F1F8}\x{1F1F9}\x{1F1FA}\x{1F1FB}\x{1F1FF}](?:\x{1F1E6})|[\x{00A9}\x{00AE}\x{203C}\x{2049}\x{2122}\x{2139}\x{2194}-\x{2199}\x{21A9}-\x{21AA}\x{231A}-\x{231B}\x{2328}\x{23CF}\x{23E9}-\x{23F3}\x{23F8}-\x{23FA}\x{24C2}\x{25AA}-\x{25AB}\x{25B6}\x{25C0}\x{25FB}-\x{25FE}\x{2600}-\x{2604}\x{260E}\x{2611}\x{2614}-\x{2615}\x{2618}\x{261D}\x{2620}\x{2622}-\x{2623}\x{2626}\x{262A}\x{262E}-\x{262F}\x{2638}-\x{263A}\x{2640}\x{2642}\x{2648}-\x{2653}\x{2660}\x{2663}\x{2665}-\x{2666}\x{2668}\x{267B}\x{267E}-\x{267F}\x{2692}-\x{2697}\x{2699}\x{269B}-\x{269C}\x{26A0}-\x{26A1}\x{26AA}-\x{26AB}\x{26B0}-\x{26B1}\x{26BD}-\x{26BE}\x{26C4}-\x{26C5}\x{26C8}\x{26CE}-\x{26CF}\x{26D1}\x{26D3}-\x{26D4}\x{26E9}-\x{26EA}\x{26F0}-\x{26F5}\x{26F7}-\x{26FA}\x{26FD}\x{2702}\x{2705}\x{2708}-\x{270D}\x{270F}\x{2712}\x{2714}\x{2716}\x{271D}\x{2721}\x{2728}\x{2733}-\x{2734}\x{2744}\x{2747}\x{274C}\x{274E}\x{2753}-\x{2755}\x{2757}\x{2763}-\x{2764}\x{2795}-\x{2797}\x{27A1}\x{27B0}\x{27BF}\x{2934}-\x{2935}\x{2B05}-\x{2B07}\x{2B1B}-\x{2B1C}\x{2B50}\x{2B55}\x{3030}\x{303D}\x{3297}\x{3299}\x{1F004}\x{1F0CF}\x{1F170}-\x{1F171}\x{1F17E}-\x{1F17F}\x{1F18E}\x{1F191}-\x{1F19A}\x{1F201}-\x{1F202}\x{1F21A}\x{1F22F}\x{1F232}-\x{1F23A}\x{1F250}-\x{1F251}\x{1F300}-\x{1F321}\x{1F324}-\x{1F393}\x{1F396}-\x{1F397}\x{1F399}-\x{1F39B}\x{1F39E}-\x{1F3F0}\x{1F3F3}-\x{1F3F5}\x{1F3F7}-\x{1F3FA}\x{1F400}-\x{1F4FD}\x{1F4FF}-\x{1F53D}\x{1F549}-\x{1F54E}\x{1F550}-\x{1F567}\x{1F56F}-\x{1F570}\x{1F573}-\x{1F57A}\x{1F587}\x{1F58A}-\x{1F58D}\x{1F590}\x{1F595}-\x{1F596}\x{1F5A4}-\x{1F5A5}\x{1F5A8}\x{1F5B1}-\x{1F5B2}\x{1F5BC}\x{1F5C2}-\x{1F5C4}\x{1F5D1}-\x{1F5D3}\x{1F5DC}-\x{1F5DE}\x{1F5E1}\x{1F5E3}\x{1F5E8}\x{1F5EF}\x{1F5F3}\x{1F5FA}-\x{1F64F}\x{1F680}-\x{1F6C5}\x{1F6CB}-\x{1F6D2}\x{1F6E0}-\x{1F6E5}\x{1F6E9}\x{1F6EB}-\x{1F6EC}\x{1F6F0}\x{1F6F3}-\x{1F6F9}\x{1F910}-\x{1F93A}\x{1F93C}-\x{1F93E}\x{1F940}-\x{1F945}\x{1F947}-\x{1F970}\x{1F973}-\x{1F976}\x{1F97A}\x{1F97C}-\x{1F9A2}\x{1F9B0}-\x{1F9B9}\x{1F9C0}-\x{1F9C2}\x{1F9D0}-\x{1F9FF}]/u', '', $text);
}

function cl_add_http_scheme($url = "") {
    if ((substr($url, 0, 7) == "http://") || (substr($url, 0, 8) == "https://") ) {
        return $url;
    }

    else {
        return sprintf("http://%s",$url);
    }
}

function cl_linkify_urls($text = "") {
    if (empty($text)) {
        return $text;
    }

    else {
        try {
            $text = preg_replace_callback('/(?P<url>https?:\/\/(?:www\.|(?!www))[a-zA-Z0-9][a-zA-Z0-9-]+[a-zA-Z0-9]\.[^\s]{2,}|www\.[a-zA-Z0-9][a-zA-Z0-9-]+[a-zA-Z0-9]\.[^\s]{2,}|https?:\/\/(?:www\.|(?!www))[a-zA-Z0-9]+\.[^\s]{2,}|www\.[a-zA-Z0-9]+\.[^\s]{2,})/is', function($m) {
                if (isset($m['url'])) {

                    $url = cl_add_http_scheme($m['url']);

                    return cl_html_el('a', cl_croptxt($m['url'], 26, "..."), array(
                        'href' => $url,
                        'target' => '_blank',
                        'class' => 'inline-link'
                    ));
                }
            }, $text);

            return $text;
        } catch (Exception $e) { /*pass*/ }

        return $text;
    }
}

function cl_session($key = null, $val = null) { 
    if (not_empty($key) && is_string($key)) {
        if ($key && $val) {
            $_SESSION[$key] = $val;
            return true;
        } 
        else {
            return isset($_SESSION[$key]) ? $_SESSION[$key] : false;
        }
    }

    return false;
}

function cl_session_unset($key = null) { 
    if (not_empty($key) && isset($_SESSION[$key])) {
        unset($_SESSION[$key]);
    }
}

function cl_rn2br($text = "") {
    $text = str_ireplace("\r\n", "<br>", $text);
    $text = str_ireplace("\n\r", "<br>", $text);
    $text = str_ireplace("\r", "<br>", $text);
    $text = str_ireplace("\n", "<br>", $text);
    $text = str_ireplace('\r\n', "<br>", $text);
    $text = str_ireplace('\n\r', "<br>", $text);
    $text = str_ireplace('\r', "<br>", $text);
    $text = str_ireplace('\n', "<br>", $text);

    return $text;
}

function cl_strip_brs($content = "") {
    return preg_replace('/(<br\s{0,}\/{0,}>\s{0,}){3,}/i', '<br/><br/>', $content);
}

function cl_rn_strip($text = "") {
    $text = str_ireplace("\r\n", " ", $text);
    $text = str_ireplace("\n\r", " ", $text);
    $text = str_ireplace("\r", " ", $text);
    $text = str_ireplace("\n", " ", $text);
    $text = str_ireplace('\r\n', " ", $text);
    $text = str_ireplace('\n\r', " ", $text);
    $text = str_ireplace('\r', " ", $text);
    $text = str_ireplace('\n', " ", $text);

    return $text;
}

function cl_get_configurations() {
    global $db;

    $data    = array();
    $configs = $db->get(T_CONFIGS);

    foreach ($configs as $config) {
        $data[$config['name']] = $config['value'];
    }

    return $data;
}

function cl_json_server500_err($errno = false, $errstr = "", $errfile = "", $errline = "") {
    if ($errno) {
        $errors = array(
            'status'  => 500,
            'errno'   => $errno,
            'message' => "$errstr in [$errfile] at line $errline"
        );
    }
    else {
        $errors = array(
            'status'  => 500,
            'message' => $errstr
        );
    }
    
    echo json_encode($errors,JSON_UNESCAPED_UNICODE|JSON_PRETTY_PRINT);
    exit();
}

function cl_minify_js($code = ''){
    $code = preg_replace('/(\r\n|\n|\t|\s{2,})/is', '', $code);
    return $code;
}

function cl_minify_css($code = ''){
    $code = preg_replace('/(\r\n|\n|\t|\s{2,})/is', '', $code);
    return $code;
}

function cl_is_decimal($value = 0) {
    if(strpos($value, ".") !== false){
        return true;
    }

    else{
        return false;
    }
}

function cl_money($money = '0.00', $digits = 2) {
    global $cl;

    $digits = (cl_is_decimal($money)) ? $digits : 0;
    $curr   = $cl['site_currencies'][$cl['config']['site_currency']];


    if (is_numeric($money) != true) {
        if ($cl["config"]["currency_symbol_pos"] == "after") {
            return cl_strf("0.00%s", $curr['symbol']);
        }
        else{
            return cl_strf("%s0.00", $curr['symbol']);
        }
    }

    else {
        if ($cl["config"]["currency_symbol_pos"] == "after") {
            return cl_strf("%s%s", number_format($money, $digits, '.',  '.'), $curr['symbol']);
        }
        else{
            return cl_strf("%s%s", $curr['symbol'], number_format($money, $digits, '.',  '.'));
        }
    }
}

function cl_text($text = "") {
    $text = stripcslashes($text);
    $text = htmlspecialchars_decode($text, ENT_QUOTES);
    $text = cl_rn_strip($text);

    return $text;
}

function cl_encode_og_text($text = "") {
    $text  = stripcslashes($text);
    $text  = htmlspecialchars($text, ENT_QUOTES);
    $text  = cl_rn_strip($text);
    $text  = cl_croptxt($text, 180);
    $htags = cl_listify_htags($text);
    $text  = cl_tagify_htags($text, $htags);

    return $text;
}

function cl_get_host($url = "") { 

    $parse_url = parse_url(trim($url));

    if(isset($parse_url['host'])) {
        $host = $parse_url['host'];
    }

    else {
        $path = explode('/', $parse_url['path']);
        $host = $path[0];
    }
    
    return trim($host); 
}

function cl_db_insert($table = false, $data = array()) {
    global $db;

    $id = $db->insert($table, $data);

    return $id;
}

function cl_db_update($table = false, $data = array(), $fields = array()) {
    global $db;

    if (empty($data)) {
        return false;
    }

    foreach ($data as $k => $v) {
        $db = $db->where($k, $v);
    }

    return $db->update($table, $fields);
}

function cl_db_get_item($table = false, $data = array(), $fields = null) {
    global $db;

    if (empty($data)) {
        return false;
    }

    foreach ($data as $k => $v) {
        $db = $db->where($k, $v);
    }

    $item = $db->getOne($table, $fields);

    if (cl_queryset($item)) {
        return $item;
    }

    return false;
}

function cl_db_get_total($table = false, $data = array(), $fields = "COUNT(*)") {
    global $db;

    if (empty($data)) {
        return 0;
    }

    foreach ($data as $k => $v) {
        $db = $db->where($k, $v);
    }

    $total = $db->getValue($table, $fields);

    if (is_posnum($total)) {
        return $total;
    }

    return 0;
}

function cl_db_get_items($table = false, $data = array(), $limit = null, $fields = null) {
    global $db;

    if (empty($data)) {
        return false;
    }

    foreach ($data as $k => $v) {
        $db = $db->where($k, $v);
    }

    $item = $db->get($table, $limit, $fields);

    if (cl_queryset($item)) {
        return $item;
    }

    return false;
}

function cl_db_delete_item($table = false, $data = array()) {
    global $db;

    if (empty($data)) {
        return false;
    }

    foreach ($data as $k => $v) {
        $db = $db->where($k, $v);
    }

    $qr = $db->delete($table);

    return $qr;
}

function cl_is_valid_poll($poll = array()) {

    if (empty($poll) || is_array($poll) != true) {
        return false;
    }
    else if(count($poll) > 4) {
        return false;
    }

    else {
        foreach ($poll as $row) {
            if (empty($row["value"]) || is_string($row["value"]) != true || len_between($row["value"], 1, 25) != true) {
                return false;
            }
        }

        return true;
    }
}

function cl_get_youtube_video_id($video_url = "") {
    if (preg_match('#(?:youtube(?:-nocookie)?\.com/(?:[^/]+/.+/|(?:v|e(?:mbed)?)/|.*[?&]v=)|youtu\.be/)([^"&?/ ]{11})#i', $video_url, $matches)) {
        if (not_empty($matches)) {
            return $matches["1"];
        }
    }

    return false;
}

function cl_get_vimeo_video_id($video_url = "") {
    if (preg_match("#https?://vimeo.com/([0-9]+)#i", $video_url, $matches)) {
        if (not_empty($matches)) {
            return $matches["1"];
        }
    }

    return false;
}

function cl_is_google_mapurl($map_url = "") {
    if (preg_match("/@(-?\d+\.\d+),(-?\d+\.\d+),(\d+\.?\d?)+z/i", $map_url)) {
        return true;
    }

    return false;
}

function cl_show_feed_gad() {
    try {
        $gad_counter = @file_get_contents(cl_full_path("core/components/vars/gad_counter.num"));
        $gad_counter = intval($gad_counter);
        $show_ad     = false;

        if ($gad_counter >= GADS_TIMELINE_FREQ) {
            $gad_counter = 0;
            $show_ad     = true;
        }

        else {
            $gad_counter = ($gad_counter + 1);
        }

        @file_put_contents(cl_full_path("core/components/vars/gad_counter.num"), $gad_counter);

        return $show_ad;
    } 

    catch (Exception $e) {
        return false;
    }
}

function cl_time2str($ptime = 0) {

    return cl_date("d F, h:i", $ptime, true); 
}

function cl_date($format = "", $date = 0, $type = false) {
    global $cl;

    $months = array(
        "short" => array(
            "Jan"  => cl_translate("Jan"),
            "Feb"  => cl_translate("Feb"),
            "Mar"  => cl_translate("Mar"),
            "Apr"  => cl_translate("Apr"),
            "May"  => cl_translate("May"),
            "June" => cl_translate("June"),
            "July" => cl_translate("July"),
            "Aug"  => cl_translate("Aug"),
            "Sept" => cl_translate("Sept"),
            "Oct"  => cl_translate("Oct"),
            "Nov"  => cl_translate("Nov"),
            "Dec"  => cl_translate("Dec")
        )
    );

    
    // if ($type == true) {
    //     $format = str_ireplace("M", $months["short"][date("M")], $format);
    // }
    
    // else {
    //     $format = str_ireplace("F", $months["long"][date("F")], $format);
    // }

    $date = date($format, $date);

    
    return $date;
}

function cl_is_valid_og($og = array()) {
    global $cl;

    if (is_array($og)) {
        if (isset($og["title"]) && isset($og["description"]) && isset($og["image"]) && isset($og["type"]) && isset($og["url"])) {
            return true;
        }
    }

    return false;
}

function cl_decode_array($arr = array()) {
    if (is_array($arr)) {
        return $arr;
    }

    else if(is_string($arr)) {
        $arr = json($arr);

        if (is_array($arr) != true) {
            $arr = array();
        }

        return $arr;
    }
    else{
        return array();
    }
}

function cl_get_uicol() {
    global $cl;

    return $cl["ui_rand_colors"][array_rand($cl["ui_rand_colors"])];
}