master c339b33f2eb8 cached
133 files
2.2 MB
576.6k tokens
424 symbols
1 requests
Download .txt
Showing preview only (2,343K chars total). Download the full file or copy to clipboard to get everything.
Repository: WMJonssen/Centcount-Analytics
Branch: master
Commit: c339b33f2eb8
Files: 133
Total size: 2.2 MB

Directory structure:
gitextract_wovxv__r/

├── README.md
├── api/
│   ├── api_ca.php
│   └── api_manage.php
├── ca.php
├── ca_version.php
├── cache_settings.php
├── command.php
├── common.php
├── config/
│   ├── config_common.php
│   ├── config_mail.php
│   ├── config_redis.php
│   └── config_security.php
├── core.php
├── css/
│   ├── common.css
│   ├── ichart.css
│   ├── icontrol.css
│   └── manager.css
├── errlog.php
├── forgot.php
├── host/
│   └── hosts_host_status.php
├── html.php
├── install.php
├── ipdb/
│   └── README.md
├── ipdb.class.php
├── js/
│   ├── common.js
│   ├── ichart.js
│   ├── icontrol.js
│   ├── iline.js
│   ├── ilog.js
│   ├── imap.js
│   ├── iprocess.js
│   └── itable.js
├── kernel.func.php
├── kernel.php
├── kernel.sql.php
├── language/
│   ├── lan-de-DE.php
│   ├── lan-en-US.php
│   ├── lan-ja-JP.php
│   ├── lan-zh-CN.php
│   └── lan-zh-TW.php
├── language.php
├── license.txt
├── login.php
├── logout.php
├── manager.php
├── maps/
│   ├── china.js
│   └── world.js
├── passport.php
├── persistence.php
├── relogin.php
├── report/
│   ├── actions_all_page.php
│   ├── actions_bounce_page.php
│   ├── actions_entry_page.php
│   ├── actions_exit_page.php
│   ├── actions_robot_crawled_page.php
│   ├── dashboard.php
│   ├── referrers_all_referrer.php
│   ├── referrers_channel.php
│   ├── referrers_se_keyword.php
│   ├── referrers_website.php
│   ├── visitors_active.php
│   ├── visitors_active_visitor.php
│   ├── visitors_day_trend.php
│   ├── visitors_device.php
│   ├── visitors_location.php
│   ├── visitors_log.php
│   ├── visitors_map.php
│   ├── visitors_overview.php
│   ├── visitors_realtime.php
│   ├── visitors_robot_log.php
│   ├── visitors_software.php
│   └── visitors_times.php
├── reset_pw.php
├── robots.txt
├── setting/
│   ├── settings.php
│   └── settings_about_ca.php
├── site/
│   ├── sites_add_site.php
│   ├── sites_all_sites.php
│   ├── sites_blocked_ids.php
│   ├── sites_blocked_ips.php
│   ├── sites_blocked_pages.php
│   ├── sites_blocked_sites.php
│   ├── sites_delete_site.php
│   ├── sites_domains.php
│   ├── sites_filtered_domains.php
│   ├── sites_get_js_code.php
│   ├── sites_modify_site_config.php
│   └── sites_visitor_password.php
├── validcode.php
├── vendor/
│   ├── autoload.php
│   ├── composer/
│   │   ├── ClassLoader.php
│   │   ├── autoload_classmap.php
│   │   ├── autoload_namespaces.php
│   │   ├── autoload_psr4.php
│   │   ├── autoload_real.php
│   │   └── autoload_static.php
│   ├── geoip2/
│   │   └── geoip2/
│   │       └── src/
│   │           ├── Compat/
│   │           │   └── JsonSerializable.php
│   │           ├── Database/
│   │           │   └── Reader.php
│   │           ├── Exception/
│   │           │   ├── AddressNotFoundException.php
│   │           │   ├── AuthenticationException.php
│   │           │   ├── GeoIp2Exception.php
│   │           │   ├── HttpException.php
│   │           │   ├── InvalidRequestException.php
│   │           │   └── OutOfQueriesException.php
│   │           ├── Model/
│   │           │   ├── AbstractModel.php
│   │           │   ├── AnonymousIp.php
│   │           │   ├── City.php
│   │           │   ├── ConnectionType.php
│   │           │   ├── Country.php
│   │           │   ├── Domain.php
│   │           │   ├── Enterprise.php
│   │           │   ├── Insights.php
│   │           │   └── Isp.php
│   │           ├── ProviderInterface.php
│   │           ├── Record/
│   │           │   ├── AbstractPlaceRecord.php
│   │           │   ├── AbstractRecord.php
│   │           │   ├── City.php
│   │           │   ├── Continent.php
│   │           │   ├── Country.php
│   │           │   ├── Location.php
│   │           │   ├── MaxMind.php
│   │           │   ├── Postal.php
│   │           │   ├── RepresentedCountry.php
│   │           │   ├── Subdivision.php
│   │           │   └── Traits.php
│   │           └── WebService/
│   │               └── Client.php
│   └── maxmind-db/
│       └── reader/
│           └── src/
│               └── MaxMind/
│                   └── Db/
│                       ├── Reader/
│                       │   ├── Decoder.php
│                       │   ├── InvalidDatabaseException.php
│                       │   ├── Metadata.php
│                       │   └── Util.php
│                       └── Reader.php
├── verify.php
└── visitor.php

================================================
FILE CONTENTS
================================================

================================================
FILE: README.md
================================================
# Centcount Analytics 1.0
## An open-source web analytics software
## Centcount Analytics 2.0 Pro is available now! <a href="https://www.centcount.com">Read More</a>
<br>
<h2>What is Centcount Analytics:</h2><br>
    Centcount Analytics is an open-source web analytics software. Developed by PHP + MySQL + Redis, Can be easily deployed on your own server, 100% data ownership. Data accuracy is the biggest feature of CA system. Centcount Analytics collects & analyzes visitor's data as many as possible, so as to provide a very accurate statistical data for the site administrator, and to dig potential value.
<br><br><br>

<h2>Features:</h2><br>

<b>1. Performance:</b> Centcount Analytics is FAST! A lower-configured VPS can handle 1 million PV per day easily.<br>

<b>2. Project:</b> Open-source, self-deployment, 100% data ownership for data security & privacy.<br>

<b>3. Rich Reports:</b> Centcount Analytics offers 37 fixed reports.<br>

<b>4. Heatmap:</b> A new & direct way to show the visitor's actions on your page!<br>

<b>5. Custom Report:</b> Play data in any possible ways. Multi-Dimension, Multi-Condition, Multi-Metric. Return data by group and order. Get the data what you want without any limitation.<br><br><br>

<h2>Development History:</h2><br>

In past 5 years, I rewrote Centcount Analytics 3 times for high performance. Finally, Centcount Analytics 1.00 is coming now! Light, Stable, Powerful, High Performance... <br>

<b>1st Edition:</b>  No queue, no cache, develped by PHP + MySQL, single-process, Computing was mixed with data storage.  Can not handle high-concurrence request.  Lower performance.<br>

<b>2nd Edition:</b>  Request queue + part of data cache, developed by PHP + MySQL + Redis, multi-process, Computing was mixed with data storage.  Can handle high-concurrence request but still low performance.<br>

<b>3rd Edition:</b>  Request queue + full data cache, developed by PHP + MySQL + Redis, multi-process, Separation of computing and storage. high-concurrency & high performance.<br><br><br>

<h2>Online Demo:</h2><br>

Check out the online demo for Centcount Analytics at <a href="https://www.centcount.com/visitor.php?id=1801250000001&siteid=1801250000001001">www.centcount.com</a><br><br><br>

<h2>Online Installation Instructions:</h2><br>

Check out the online installation instructions at <a href="https://www.centcount.com/doc.php?doc=Centcount%20Analytics&article=Install%20Centcount%20Analytics">https://www.centcount.com/doc.php</a><br><br><br>

<h2>Contact:</h2><br>

Website: <a href="https://www.centcount.com">centcount.com</a><br>

About us: <a href="https://www.centcount.com/about.php">https://www.centcount.com/about.php</a><br>

Email: <a href="mailto:wm.jonssen@gmail.com">wm.jonssen@gmail.com</a><br>

Twitter: <a href="https://twitter.com/WM_Jonssen">@WM_Jonssen</a><br>

QQ Group: <a href="https://jq.qq.com/?_wv=1027&k=5i0fPxN">551802546</a><br><br><br>

<h2>License:</h2><br>
    Centcount Analytics is dual-licensed under the Free License and Commercial License.
<br><br><br><br><br><br> 
    
    

<h2>END USER LICENSE AGREEMENT</h2><br>
<b>Please read this agreement carefully before installing and using our software.</b>

Copyright © 2015-2020, WM Jonssen.
All Rights Reserved.

This software license agreement (hereinafter the “Agreement”) is a legal agreement between the user (hereinafter “You” or the “User”) and Author/Owner of Centcount Analytics (hereinafter “Author”) for the software products (hereinafter the “Software”) and related services (hereinafter the “Service”) that accompanies this Agreement, as may be updated or replaced by feature enhancements, software updates or maintenance releases and any services that may be provided by Author under this Agreement. You are not allowed to download, install or use the Software or to use Services unless you accept all the terms and conditions of this Agreement. Your download, installation and use of the Software shall be regarded as your acceptance of the Agreement and your agreement to be bound by all the terms and conditions of this Agreement.

This Agreement, between the User and Author, is an agreement regarding the User's downloading, installation, use and copying of the Software, and the use of Services provided by Author. This Agreement stipulates the rights and duties of You and Author regarding the licensed use and related services. "The User" or "You" refers to a person (who is 18 years of age or older, any parent or guardian of a person under the age of 18 may accept this Agreement on behalf of a user) or entity who obtains the Software authorization license and/or the Software products by means of the Software license and the account registration as provided by Author.

This Agreement may be updated by Author at any time and without prior notice to the User. After the updated Agreement is issued, it shall replace the original Agreement effectively. Users can read the updated Agreement by logging in the Software or checking on the Website at any time. After Author has updated the clauses of Agreement, the User should stop using software and services provided by Author if he/she does not agree with the clauses amended, otherwise it will be deemed that the user has accepted the Agreement as amended.

Except those explicitly stated in the Agreement, the Agreement does not stipulate the terms of service for other services offered by Author which the User visits when using the “Software”. Those services are usually regulated by other separate terms of service and the User should be familiar with and confirm his/her acceptance of those terms of service when using the relevant services. If there are conflicts between separate terms of service and this Agreement, the separate terms of service will govern. By using those services, the User shall be regarded as having accepted the relevant terms of service.

<b>1. Grant of License</b><br>
Subject to the terms and conditions of this Agreement, Author grants to you a limited, non-exclusive, worldwide license to install, download and use a single instance of the Software on a single website server through a single installation for non-commercial purposes for free.

You can modify the source code (if being provided) or interface of the Software if your modification is strictly under the Agreement and to beautify your website.

When using the Software, the User shall comply with the relevant national laws and policies, protect the national interests, safeguard the national security and comply with this Agreement. The User, but not Author, shall be fully responsible for all liabilities resulting from the illegal use of the Software or breach of the Agreement. If the User's misbehavior causes loss to Author, Author is entitled to demand the User to provide compensation, cease provision of the service immediately and keep relevant records. Moreover, if the User violates laws or the Agreement and correlative clauses of services stipulated in other services of Author by using the Software, Author has the right to take these measures including, but not limited to, interruption of use license, stopping of services, restriction of use, legal investigation, etc. considering the nature of the User’s behaviors and without a prior notice to the User.

You have the entire property of all the members’ data, information and articles in your website which is powered by the Software; that is to say, you must assume solely all the relevant liabilities concerns to the contents in your website.

You may use the Software for commercial means after purchase of the commercial license. Moreover, according to the license you purchase you will get technical support from Author in specified term and manner. Commercial users are prior to submitting ideas and opinions to Author, but without any guarantee of acceptance.

You can download application(s) for your website from Centcount Analytics official website after you have paid appropriate fee to the author/owner of the application(s).

<b>2. License Restrictions</b><br>
You cannot use the Software for commercial or profit purposes (include but are not limited to company websites, operating websites or other for-profit websites) unless you have been licensed to. To purchase the license, please visit https://www.centcount.com/pricing.php or email to wm.jonssen@gmail.com for more information.

You may not rent, sublicense, assign, lease, loan, resell, distribute, publish or network the Software or related materials or create derivative works based upon the Software or any part thereof.

You may not use the Software to engage in or allow others to engage in any illegal activity. You may not use the Software to engage in any activity that will violate the rights of third parties, including, without limitation, copyrights, trademarks, publicity rights, privacy rights, other proprietary rights, or rights against defamation of third parties.

You cannot remove or modify the copyright information and relevant links under any circumstances, such as https://www.centcount.com, in the foot of web pages without the prior written consent of Author.

You cannot reverse engineer, decompile or disassemble, copy, modify, link, reproduce, publish or develop derivative products of the applications that you download from Centcount Analytics official website without the prior written permission from the application author/owner.

<b>3. Disclaimer of Warranties and Limitations of Liabilities</b><br>
The software and the accompanying files are provided “as-is”, and to the maximum extent permitted by applicable law, Author disclaims all other warranties, express or implied, by statute or otherwise, regarding the software and any related materials, including their fitness for a particular purpose, their quality, their merchantability, or any related services or content is secure, or is free from bugs, viruses, errors, or other program limitations nor does it warrant access to the internet or to any other services through the software.

To the maximum extent permitted by applicable law, Author will not be liable for any indirect, special, incidental, or consequential damages(including damages for loss of business, loss of profits, or the like), whatever based on breach of contract, tort(including negligence), product liability or otherwise, even Author has been advised of the possibility of such damages. Author’ total liability to you for actual damages for any cause whatsoever will be limited to the purchase price amount paid by you for the software.

Author is not liable for the content of any message in the websites powered by the Software.

Author does not guarantee the legality, safety, integrity, authenticity and quality of the applications which uploaded into Centcount Analytics official website by any third party. You agree to judge on yourself and take fully responsibilities to the action of download from Centcount Analytics official website. But in any case, Author may stop the Store’s service and take appropriate actions, including but not limited to uninstall the associated applications, suspend the Store’s service in whole or in part, keep the relevant records to the relevant authorities, and Author will not undertake any direct, indirect or consequential liability to the actions thereof.

<b>4. Termination</b><br>
The License is effective until terminated. You may terminate the License at any time by uninstalling the Software and destroying all copies of the Software in any media. This Agreement may be terminated by Author immediately and without notice if you fail to comply with any term or condition of the License or this Agreement. Upon such termination, you must immediately cease using the Software, and assume relevant liabilities.

Author reserves the right to change or add to the terms of this Agreement at any time (including but are not limited to Internet-based Solutions, pricing, technical support options, and other product-related policies), and to change, discontinue or impose conditions on any feature or aspect of the Software, or any Internet-based Solutions provided to you or made available to you in the official websites. Such changes will be effective upon notification by any means reasonable to give you actual or constructive notice including by posting such terms on the discuz.net website, or another website designated by Author. Your continued use of the Software will indicate your agreement to any such change.

<b>5. Controlling Law</b><br>
The Agreement is governed by and construed in accordance with the laws of P.R China. You hereby consent to the exclusive jurisdiction and venue in the HuiShan District court of the City of Wuxi.


Author/Owner: WM Jonssen<br>
05-09-2020


================================================
FILE: api/api_ca.php
================================================
<?php
/*!
* ATTENTION: THIS FREE LICENSE IS ONLY FOR PERSONAL NON-COMMERCIAL USER. FOR COMMERCIAL PURPOSES, PLEASE PURCHASE A COMMERCIAL LICENSE! *
* module: Centcount Analyticsb Free Access Data API PHP Code *
* version: 1.00 Free *
* author: WM Jonssen *
* date: 05/23/2018 *
* copyright 2015-2018 WM Jonssen <wm.jonssen@gmail.com> - All rights reserved.*
* license: Dual licensed under the Free License and Commercial License. *
* https://www.centcount.com *
*/

header('Access-Control-Allow-Origin: *');
header('Content-type: text/html; charset=utf-8');
@require '../config/config_common.php';
	$sid = SDATA_OUT('sid', 6, 'EXIT');
	$t = SDATA_OUT('t', 6, 'EXIT');
	$v = SDATA_OUT('v', 4, 'EXIT', 32);
	$id = substr($sid, 0, -3);
	$q = SDATA_OUT('q', 0, '', 32);
	$q === 'heatmap' ? verify_cahm($sid, $t, $v) : verify_user($sid, $t, $v);
	$period = SDATA_OUT('period', 6, 0);
	$from = SDATA_OUT('from', 6, 0);
	$to = SDATA_OUT('to', 6, 0);
	$start = SDATA_OUT('start', 6, 0);
	$end = SDATA_OUT('end', 6, 20);
	$sortorder = SDATA_OUT('sortorder', 6, 0) ? 'ASC' : 'DESC';
	$tz = SDATA_OUT('tz', 0, '', 32);
	!date_default_timezone_set($tz) AND exit;
	$db_site = 'site' . $sid; 
	$tb_log  = 'log' . $from; 
	$tb_act  = 'act' . $from; 
	$tb_clk  = 'clk' . $from; 
	$tb_vid  = 'vid' . $from; 
	$tb_ind  = 'ind' . $from; 
	$db_con = false;
	switch ($q) {
	case 'overview':
		$type = SDATA_OUT('type', 9, 'EXIT');
		$where = "WHERE Type=0 AND MD5='01'";
		$today = $from;
		$from = strtotime($from);
		$yesterday = date('Ymd', $from - 86400);
		$day7 = date('Ymd', $from - 86400 * 8);
		$day30 = date('Ymd', $from - 86400 * 31);
		$arr_data = array();
		$arr_data[] = array(4,0,4,4,4,4,4);
		$tmp_arr = array('PV'=>0, 'UV'=>0, 'UPV'=>0, 'NV'=>0, 'RV'=>0, 'RVS'=>0, 'Visits'=>0, 'Bounces'=>0,'BounceRate'=>0, 'Exits'=>0, 'ExitRate'=>0, 'RV'=>0, 'AvgDelay'=>0, 'AvgReady'=>0, 'AvgLoad'=>0, 'AvgOnline'=>0, 'AvgMRX'=>0, 'AvgMRY'=>0, 'DREntry'=>0, 'SEEntry'=>0, 'RFEntry'=>0, 'Detail'=>'Today', 'Clicks'=>0, 'ValidClicks'=>0);
		$db_con = use_db(DB_HOST_LOCAL, ROOT_USER_LOCAL, ROOT_PASSWORD_LOCAL, $db_site);
		$sql = gen_sql('ind', $db_con, $today, $today, 3, $where, '', '', '', '');
		if (isset($sql['MERGE'])) {
			$result = mysqli_query($db_con, $sql['MERGE']);
			if ($result && mysqli_num_rows($result)) {
				$arr_data[] =  mysqli_fetch_assoc($result);
				mysqli_free_result($result);
			} else {
				$arr_data[] = $tmp_arr;
			}
		} else {
			$arr_data[] = $tmp_arr;
		}
		$arr_data[1]['Detail'] = 'Today';
		$sql = gen_sql('ind', $db_con, $yesterday, $yesterday, 3, $where, '', '', '', '');
		if (isset($sql['MERGE'])) {
			$result = mysqli_query($db_con, $sql['MERGE']);
			if ($result && mysqli_num_rows($result)) {
				$arr_data[] =  mysqli_fetch_assoc($result);
				mysqli_free_result($result);
			} else {
				$arr_data[] = $tmp_arr;
			}
		} else {
			$arr_data[] = $tmp_arr;
		}
		$arr_data[2]['Detail'] = 'Yesterday';
		$sql = gen_sql('ind', $db_con, $day7, $yesterday, 3, $where, '', '', '', '');
		if (isset($sql['MERGE'])) {
			$result = mysqli_query($db_con, $sql['MERGE']);
			if ($result && mysqli_num_rows($result)) {
				$arr_data[] =  mysqli_fetch_assoc($result);
				mysqli_free_result($result);
			} else {
				$arr_data[] = $tmp_arr;
			}
		} else {
			$arr_data[] = $tmp_arr;
		}
		$arr_data[3]['Detail'] = 'Avg 7 Days';
		$sql = gen_sql('ind', $db_con, $day30, $yesterday, 3, $where, '', '', '', '');
		if (isset($sql['MERGE'])) {
			$result = mysqli_query($db_con, $sql['MERGE']);
			if ($result && mysqli_num_rows($result)) {
				$arr_data[] =  mysqli_fetch_assoc($result);
				mysqli_free_result($result);
			} else {
				$arr_data[] = $tmp_arr;
			}
		} else{
			$arr_data[] = $tmp_arr;
		}
		$arr_data[4]['Detail'] = 'Avg 30 Days';
		echo json_encode($arr_data);
		get_json_error($q);
		break;
	case 'map':
	case 'geo map':
		$type = SDATA_OUT('type', 9, 'EXIT');
		$where = 'WHERE Type=' . $type;
		$key = SDATA_OUT('key', 9, 'EXIT');
		get_mysql_query_string($key, $order, $title, $sqltext);
		$db_con = use_db(DB_HOST_LOCAL, ROOT_USER_LOCAL, ROOT_PASSWORD_LOCAL, $db_site);
		$from = SDATA_OUT('from', 6, 'EXIT');
		$to = SDATA_OUT('to', 6, 'EXIT');
		$sql = gen_sql('ind', $db_con, $from, $to, ($q === 'map' ? 7 : 8), $where, $order, $order, $start, $end);
		$result = mysqli_query($db_con, $sql['COUNT']);
		if ($result && mysqli_num_rows($result)) {
			$row = mysqli_fetch_row($result);
			$total = (int)$row[0];
			mysqli_free_result($result);
		} else {
			exit;
		}
		$result = mysqli_query($db_con, $sql['SUM']);
		if ($result && mysqli_num_rows($result)) {
			$sum = mysqli_fetch_row($result);
			mysqli_free_result($result);
		} else {
			exit;
		}
		$result = mysqli_query($db_con, $sql['MERGE']);
		if ($result && mysqli_num_rows($result)) {
			$arr_data = array();
			$arr_data[] = array($total, (int)$sum[0]);
			while ($row = mysqli_fetch_row($result))
			{
				$arr_data[] = $row;
			}
			mysqli_free_result($result);
			$REDIS = new Redis();
			$REDIS->CONNECT(REDIS_IP_2, REDIS_PORT_2);
			if ($REDIS->PING() !== '+PONG') exit;
			$REDIS->SELECT(REDIS_DB_2);
			$ipdb = $REDIS->GET($sid.'-IPDatabase');
			if (is_null($ipdb)) $ipdb = 0;
			$arr_data[0][2] = (int)$ipdb;
			echo json_encode($arr_data);
			get_json_error($q);
		} else {
			echo '';
		}
		break;
	case 'realtime map':
		$RANG_MINUTE = floor((time() - 60) / 60) * 60;
		$REDIS = new Redis();
		$REDIS->CONNECT(REDIS_IP_1, REDIS_PORT_1);
		if ($REDIS->PING() !== '+PONG') exit;
		$REDIS->SELECT(REDIS_DB_1);
		$REDIS->ZREMRANGEBYSCORE('SVIDS'.$_GET['sid'], 0, $RANG_MINUTE);
		$total = $REDIS->ZCARD('SVIDS'.$_GET['sid']);
		if (($start + $end) > $total) $end = $total - $start;
		$CHECK_ARRAY = $REDIS->ZREVRANGE('SVIDS'.$_GET['sid'], $start, ($start + $end));
		$LEN = count($CHECK_ARRAY);
		$arr_data = array();
		if ($LEN) {
			$arr_data[] = array($LEN, $total);
			$arr_tmp = array();
			$ipdb = NULL;
			include '../ipdb.class.php';
			$IPH1 = new \IP2Location\Database('../ipdb/IP2LOCATION-LITE-DB11.BIN', \IP2Location\Database::FILE_IO);
			define('IP_ALL', \IP2Location\Database::ALL);
			include '../vendor/autoload.php';
			$IPH2 = new \GeoIp2\Database\Reader('../ipdb/GeoLite2-City.mmdb');
			for ($i = 0; $i < $LEN; $i++) {
				$tmp = $REDIS->GET($CHECK_ARRAY[$i]);			
				$ip = $tmp ? get_data($tmp,'&ip') : '';
				if ($ip) {
					$ips = array();
					if ($ipdb === NULL) $ipdb = (int)get_data($tmp, '&ipdb');
					switch ($ipdb) {
					case 0:
						$ips = $IPH1->lookup($ip, IP_ALL);
						$Country = $ips['countryName']; 
						$Region = $ips['regionName']; 
						$City = $ips['cityName']; 
						$Latitude = $ips['latitude'];
						$Longitude = $ips['longitude'];
						break;
					case 1:
					case 2:
						$ips = $IPH2->city($ip);
						if ($ipdb === 1) {
							$Country = $ips->country->names['zh-CN']; 
							$Region = isset($ips->mostSpecificSubdivision->names['zh-CN']) ? $ips->mostSpecificSubdivision->names['zh-CN'] : $ips->mostSpecificSubdivision->name; 
							$City = isset($ips->city->names['zh-CN']) ? $ips->city->names['zh-CN'] : $ips->city->name; 
						} else {
							$Country = $ips->country->name; 
							$Region = $ips->mostSpecificSubdivision->name; 
							$City = $ips->city->name; 
						}
						$Latitude = $ips->location->latitude; 
						$Longitude = $ips->location->longitude; 
						break;
					}
					if (isset($arr_tmp[$City])) {
						$arr_tmp[$City][1]++;
					} else {
						$arr_tmp[$City] = array($Country . ($Region ? ' - ' . $Region : '') . ($City ? ' - ' . $City : ''), 1, $Longitude . ',' . $Latitude);
					}
				} else {
					$arr_data[0][0]--;
					$arr_data[0][1]--;
				}
			}
			$arr_data[0][2] = (int)$ipdb;
			foreach($arr_tmp as $val) {
				$arr_data[] = $val;
			}
		} else {
			$arr_data[] = array(0, 0);
		}
		echo json_encode($arr_data);
		get_json_error($q);
		break;
	case 'visitsofsite':
		$db_con = use_db(DB_HOST_LOCAL, ROOT_USER_LOCAL, ROOT_PASSWORD_LOCAL, $db_site);
		$arr_data = array();
		$time = time();
		$tmp = 'ind' . date('Ymd', $time);
		$sql = "SELECT PV,UV,Visits,RV FROM {$tmp} WHERE MD5='01'";
		$result = mysqli_query($db_con, $sql);
		if ($result && mysqli_num_rows($result)) {			
			$row = mysqli_fetch_assoc($result);
			$arr_data[0] = array((int)$row['PV'], (int)$row['UV'], (int)$row['Visits'], (int)$row['RV']);
			mysqli_free_result($result);
		} else {
			$arr_data[0] = array(0, 0, 0, 0);
		}
		$time -= 86400;
		$tmp = 'ind' . date('Ymd', $time);
		$sql = "SELECT PV,UV,Visits,RV FROM {$tmp} WHERE MD5='01'";
		$result = mysqli_query($db_con, $sql);
		if ($result && mysqli_num_rows($result)) {			
			$row = mysqli_fetch_assoc($result);
			$arr_data[1] = array((int)$row['PV'], (int)$row['UV'], (int)$row['Visits'], (int)$row['RV']);
			mysqli_free_result($result);
		} else {
			$arr_data[1] = array(0, 0, 0, 0);
		}
		echo json_encode($arr_data);
		get_json_error($q);
		break;
	case 'rtline':
		$time = time();
		$RT = floor(($time - 900) / 60) * 60;
		$RANG_MINUTE = $RT - 60;
		$arr_data = array();
		for ($i = 0; $i < 15; $i++) {
			$RT += 60;
			$RM = date('H:i', $RT);
			$arr_data[$RM] = array($RM, 0, 0, 0);
		}
		$REDIS = new Redis();
		$REDIS->CONNECT(REDIS_IP_1, REDIS_PORT_1);
		if ($REDIS->PING() !== '+PONG') exit;
		$REDIS->SELECT(REDIS_DB_1);
		$REDIS->ZREMRANGEBYSCORE('SMINS'.$_GET['sid'], 0, ($RANG_MINUTE - 60));
		$CHECK_ARRAY = $REDIS->ZRANGE('SMINS'.$_GET['sid'], 0, -1, false);
		$LEN = count($CHECK_ARRAY);
		if ($LEN > 0) {			
			for ($i = 0; $i < $LEN; $i++)
			{
				$row = explode(',', $CHECK_ARRAY[$i]);
				if (count($row) === 4) $arr_data[$row[0]] = array($row[0], (int)$row[1], (int)$row[2], (int)$row[3]);
			}
		}
		$CHECK_ARRAY = $REDIS->GET('MinData'.$_GET['sid']);
		if ($CHECK_ARRAY) {
			$tmp = substr($CHECK_ARRAY,10,5);
			$row = explode(',', substr($CHECK_ARRAY,16));
			if (count($row) === 3) $arr_data[$tmp] = array($tmp, (int)$row[0], (int)$row[1], (int)$row[2]);
		}
		$arr_out = array();
		$arr_out[] = array('PV', 'UV', 'IP');
		foreach ($arr_data as $key=>$value)
		{
			$arr_out[] = $value;
		}
		echo json_encode($arr_out);
		get_json_error($q);
		break;
	case 'online':
	case 'online log':
	case 'online no':
		$RANG_MINUTE = floor((time() - 60) / 60) * 60;
		$REDIS = new Redis();
		$REDIS->CONNECT(REDIS_IP_1, REDIS_PORT_1);
		if ($REDIS->PING() !== '+PONG') exit;
		$REDIS->SELECT(REDIS_DB_1);
		$REDIS->ZREMRANGEBYSCORE('SVIDS'.$_GET['sid'], 0, $RANG_MINUTE);
		$total = $REDIS->ZCARD('SVIDS'.$_GET['sid']);
		if (($start + $end) > $total) $end = $total - $start;
		$PEAK_PV = $REDIS->GET('PeakPV'.$_GET['sid']);
		$PEAK_UV = $REDIS->GET('PeakUV'.$_GET['sid']);
		$PEAK_IP = $REDIS->GET('PeakIP'.$_GET['sid']);
		$arr_data = array();
		$arr_data[] = array($total, $start, $end, $PEAK_PV, $PEAK_UV, $PEAK_IP);
		if ($q === 'online no') {
			echo json_encode($arr_data);
			get_json_error($q);
			break;
		}
		$CHECK_ARRAY = $REDIS->ZREVRANGE('SVIDS'.$_GET['sid'], $start, ($start + $end -1));
		$LEN = count($CHECK_ARRAY);
		if ($LEN) {
			$ipdb = NULL;
			include '../ipdb.class.php';
			$IPH1 = new \IP2Location\Database('../ipdb/IP2LOCATION-LITE-DB11.BIN', \IP2Location\Database::FILE_IO);
			define('IP_ALL', \IP2Location\Database::ALL);
			include '../vendor/autoload.php';
			$IPH2 = new \GeoIp2\Database\Reader('../ipdb/GeoLite2-City.mmdb');
			for ($i = 0; $i < $LEN; $i++) {
				$tmp = $REDIS->GET($CHECK_ARRAY[$i]);			
				$ip = $tmp ? get_data($tmp,'&ip') : '';
				if ($ip) {
					$ips = array();
					if ($ipdb === NULL) $ipdb = (int)get_data($tmp,'&ipdb');
					switch ($ipdb) {
					case 0:
						$ips = $IPH1->lookup($ip, IP_ALL);
						$Country = $ips['countryName']; 
						$Region = $ips['regionName']; 
						$City = $ips['cityName']; 
						$CountryCode = $ips['countryCode']; 
						break;
					case 1:
					case 2:
						$ips = $IPH2->city($ip);
						if ($ipdb === 1) {
							$Country = $ips->country->names['zh-CN']; 
							$Region = isset($ips->mostSpecificSubdivision->names['zh-CN']) ? $ips->mostSpecificSubdivision->names['zh-CN'] : $ips->mostSpecificSubdivision->name; 
							$City = isset($ips->city->names['zh-CN']) ? $ips->city->names['zh-CN'] : $ips->city->name; 
						} else {
							$Country = $ips->country->name; 
							$Region = $ips->mostSpecificSubdivision->name; 
							$City = $ips->city->name; 
						}
						$CountryCode = $ips->country->isoCode; 
						break;
					case 3:
					case 4:
						$ips = $ipdb === 3 ? \IPIP\IPZH::find($ip) : \IPIP\IPEN::find($ip); 
						$Country = $ips[0]; 
						$Region = $ips[1]; 
						$City = $ips[2]; 
						$CountryCode = $City;
						break;
					}
					$Country = rawurlencode($Country);
					$Region = rawurlencode($Region); 
					$City = rawurlencode($City); 
					$tmp .= '&l1=' . $Country . '&l2=' . $Region . '&l3=' . $City . '&l4=' . $CountryCode;
				} else {
					$tmp .= '&l1=Unknown&l2=Unknown&l3=Unknown&l4=Mars';
				}
				$arr_data[] = $tmp;
			}
		}
		echo json_encode($arr_data);
		get_json_error($q);
		break;
	case 'visitor log':
	case 'robot log':
		$type = SDATA_OUT('type', 9, 'EXIT');
		switch ($type) {
		case 0:
			$where = 'WHERE VID>30000000000';
			break;
		case 2:
			$where = 'WHERE VID<30000000000';
			break;
		}
		$db_con = use_db(DB_HOST_LOCAL, ROOT_USER_LOCAL, ROOT_PASSWORD_LOCAL, $db_site);
		$from = SDATA_OUT('from', 6, 'EXIT');
		$to = SDATA_OUT('to', 6, 'EXIT');
		$sql = gen_sql('vid', $db_con, $from, $to, 5, $where, '', '', $start, $end);
		$result = mysqli_query($db_con, $sql['SUM']);
		if ($result && mysqli_num_rows($result)) {
			$row = mysqli_fetch_row($result);
			$total = (int)$row[0];
			if (($start + $end) > $total) $end = $total - $start;
			mysqli_free_result($result);
		} else {
			exit;
		}
		$sql = gen_sql('vid', $db_con, $from, $to, 6, $where, 'RecordNo', 'DESC', $start, $end);
		$result = mysqli_query($db_con, $sql['MERGE']);
		if ($result && mysqli_num_rows($result)) {
			$arr_data = array();
			$arr_data[] = array($total,$start,$end);
			while ($row = mysqli_fetch_assoc($result)) {
				$last_rn = 0;
				$tb = 'log' . date('Ymd', (int)($row['RecordNo'] / 1E6));
				$sql_1 = "SELECT RecordNo,DelaySecond,ReadySecond,LoadSecond,OnlineSecond,Page,Referrer,SE,Keyword,Device,IP,Country,Region,City,MinReadX,MinReadY,MaxReadX,MaxReadY,CountryISO,EntryCode,ExitCode,Visits,PageViews,IsFakeData,PageAction FROM {$tb} WHERE VID={$row['VID']}";	
				$arr_data_1 = read_record($db_con, $sql_1, $last_rn);
				$sql_2 = "SELECT * FROM {$tb} WHERE RecordNo={$last_rn}";
				$arr_data_2 = read_record($db_con, $sql_2, $last_rn);
				if ($arr_data_1 !== NULL && $arr_data_2 !== NULL) {
					$arr_data[] = array($arr_data_2, $arr_data_1);
				} else {
					$arr_data[0][0]--;
				}
			}
			mysqli_free_result($result);
			echo json_encode($arr_data);
			get_json_error($q);
		} else {
			echo '';
		}
		break;	
	case 'table':
	case 'clicks':
	case 'exitpage':
	case 'bouncepage':
	case 'allpage':
		$type = SDATA_OUT('type', 9, 'EXIT');
		switch ($type) {
			case 63:
				$where = 'WHERE Type=1 AND Visits>0';
				break;
			case 64:
				$where = 'WHERE Type=1 AND Bounces>0';
				break;
			case 65:
				$where = 'WHERE Type=1 AND Exits>0';
				break;
			case 66:
				$where = 'WHERE Type=1 AND Clicks>0';
				break;
			case 67:
				$where = 'WHERE Type=3 OR Type=4 OR Type=5';
				break;
			default:
				$where = 'WHERE Type=' . $type;
				break;
		}
		$key = SDATA_OUT('key', 9, 'EXIT');
		get_mysql_query_string($key, $order, $title, $sqltext);
		$db_con = use_db(DB_HOST_LOCAL, ROOT_USER_LOCAL, ROOT_PASSWORD_LOCAL, $db_site);
		$from = SDATA_OUT('from', 6, 'EXIT');
		$to = SDATA_OUT('to', 6, 'EXIT');
		$sql = gen_sql('ind', $db_con, $from, $to, 0, $where, $order, $sortorder, $start, $end);
		$result = mysqli_query($db_con, $sql['COUNT']);
		if ($result && mysqli_num_rows($result)) {
			$row = mysqli_fetch_row($result);
			$total = (int)$row[0];
			if (($start + $end) > $total) $end = $total - $start;
			$count = array($total, $start, $end);
			mysqli_free_result($result);
		} else {
			exit;
		}
		$result = mysqli_query($db_con, $sql['SUM']);
		if ($result && mysqli_num_rows($result)) {
			$sum = mysqli_fetch_assoc($result);
			$sum['Detail'] = 'Total';
			mysqli_free_result($result);
		} else {
			exit;
		}
		$result = mysqli_query($db_con, $sql['MERGE']);
		if ($result && mysqli_num_rows($result)) {
			$arr_data = array();
			$arr_data[] = $count;
			$arr_data[] = $sum;
			while ($row = mysqli_fetch_assoc($result))
			{
				$arr_data[] = $row;
			}
			mysqli_free_result($result);
			echo json_encode($arr_data);
			get_json_error($q);
		} else {
			echo '';
		}
		break;
	case 'pie':
		$type = SDATA_OUT('type', 9, 'EXIT');
		$key =  SDATA_OUT('key', 9, 'EXIT');
		switch ($type) {
			case 63:
			case 64:
				$where = 'WHERE Type=1 AND Visits>0';
				break;
			case 65:
				$where = 'WHERE Type=1 AND PV>0';
				break;
			case 66:
				$where = 'WHERE Type=1 AND Clicks>0';
				break;
			case 67:
				$where = 'WHERE Type=3 OR Type=4 OR Type=5';
				break;
			default:
				if ($key === 5) {
					$where = 'WHERE Type=1 AND Visits>0';
				} else{
					$where = 'WHERE Type=' . $type;
				}
				break;
		}
		get_mysql_query_string($key, $order, $title, $sqltext);
		$db_con = use_db(DB_HOST_LOCAL, ROOT_USER_LOCAL, ROOT_PASSWORD_LOCAL, $db_site);
		$from = SDATA_OUT('from', 6, 'EXIT');
		$to = SDATA_OUT('to', 6, 'EXIT');
		$sql = gen_sql('ind', $db_con, $from, $to, 1, $where, $order, $sortorder, 0, $end);
		$result = mysqli_query($db_con, $sql['COUNT']);
		if ($result && mysqli_num_rows($result)) {
			$row = mysqli_fetch_row($result);
			$start = 0;
			$total = (int)$row[0];
			if (($start + $end) > $total) $end = $total - $start;
			mysqli_free_result($result);
		} else {
			exit;
		}
		$result = mysqli_query($db_con, $sql['SUM']);
		if ($result && mysqli_num_rows($result)) {
			$sum = mysqli_fetch_row($result);
			mysqli_free_result($result);
		} else {
			exit;
		}
		$result = mysqli_query($db_con, $sql['MERGE']);
		if ($result && mysqli_num_rows($result)) {
			$arr_data = array();
			$arr_data[] = array($total,$start,$end,$title,(int)$sum[0]);
			while ($row = mysqli_fetch_row($result))
			{
				$arr_data[] = $row;
			}
			mysqli_free_result($result);
			echo json_encode($arr_data);
			get_json_error($q);
		} else {
			echo '';
		}
		break;
	case 'bar':
		$type = SDATA_OUT('type', 9, 'EXIT');
		$key =  SDATA_OUT('key', 9, 'EXIT');
		switch ($type) {
			case 63:
			case 64:
				$where = 'WHERE Type=1 AND Visits>0';
				break;
			case 65:
				$where = 'WHERE Type=1 AND PV>0';
				break;
			case 66:
				$where = 'WHERE Type=1 AND Clicks>0';
				break;
			case 67:
				$where = 'WHERE Type=3 OR Type=4 OR Type=5';
				break;
			default:
				if ($key === 5) {
					$where = 'WHERE Type=1 AND Visits>0';
				} else{
					$where = 'WHERE Type=' . $type;
				}
				break;
		}
		get_mysql_query_string($key, $order, $title, $sqltext);
		$db_con = use_db(DB_HOST_LOCAL, ROOT_USER_LOCAL, ROOT_PASSWORD_LOCAL, $db_site);
		$from = SDATA_OUT('from', 6, 'EXIT');
		$to = SDATA_OUT('to', 6, 'EXIT');
		$sql = gen_sql('ind', $db_con, $from, $to, 1, $where, $order, $sortorder, 0, $end);
		$result = mysqli_query($db_con, $sql['COUNT']);
		if ($result && mysqli_num_rows($result)) {
			$row = mysqli_fetch_row($result);
			$total = (int)$row[0];
			if (($start + $end) > $total) $end = $total - $start;
			mysqli_free_result($result);
		} else {
			exit;
		}
		$result = mysqli_query($db_con, $sql['SUM']);
		if ($result && mysqli_num_rows($result)) {
			$sum = mysqli_fetch_row($result);
			mysqli_free_result($result);
		} else {
			exit;
		}
		$result = mysqli_query($db_con, $sql['MERGE']);
		if ($result && mysqli_num_rows($result)) {
			$arr_data = array();
			$arr_data[] = array($total, $start, $end, $title, (int)$sum[0]);
			while ($row = mysqli_fetch_row($result)) {
				$arr_data[] = $row;
			}
			mysqli_free_result($result);
			echo json_encode($arr_data);
			get_json_error($q);
		} else {
			echo '';
		}
		break;
	case 'line':
		$type = SDATA_OUT('type', 9, 'EXIT');
		switch ($type) {
		case 0:
			$key = 'PV,UPV,Visits,UV,NV,RV';
			$title = 'PV,UPV,Visits,UV,NV,RV';
			break;
		case 1:
			$key = 'BounceRate,ExitRate';
			$title = 'Bounce Rate,Exit Rate';
			break;
		case 2:
			$key = 'AvgMRX,AvgMRY';
			$title = 'Avg MRX,Avg MRY';
			break;
		case 3:
			$key = 'AvgDelay,AvgReady,AvgLoad,AvgOnline';
			$title = 'Avg Delay,Avg DOM Ready,Avg Load,Avg Page Duration';
			break;
		case 11:
			$key = 'Visits';
			$title = 'Visits';
			break;
		case 12:
			$key = 'UV';
			$title = 'UV';
			break;
		case 13:
			$key = 'PV';
			$title = 'PV';
			break;
		case 14:
			$key = 'UPV';
			$title = 'UPV';
			break;
		case 15:
			$key = 'RV';
			$title = 'RV';
			break;
		case 16:
			$key = 'BounceRate';
			$title = 'Bounce Rate';
			break;
		case 17:
			$key = 'ExitRate';
			$title = 'Exit Rate';
			break;
		case 18:
			$key = 'AvgMRX';
			$title = 'Avg MRX';
			break;
		case 19:
			$key = 'AvgMRY';
			$title = 'Avg MRY';
			break;
		case 20:
			$key = 'AvgReady';
			$title = 'Avg DOM Ready';
			break;
		case 21:
			$key = 'AvgLoad';
			$title = 'Avg Load';
			break;
		case 22:
			$key = 'AvgOnline';
			$title = 'Avg Online';
			break;
		case 23:
			$key = 'Detail';
			$title = 'Server Time';
			break;
		case 24:
			$key = 'Detail';
			$title = 'Local Time';
			break;
		default:
			exit;
		}
		$time = time();
		$db_con = use_db(DB_HOST_LOCAL, ROOT_USER_LOCAL, ROOT_PASSWORD_LOCAL, $db_site);
		$RT = floor($time - 2592E3);
		$arr_data = array();
		$arr_data[0] = explode(',', $title);
		if ($period == 2) {
			$from = $RT;
			$to = $RT + 2592E3;
		} else {
			$from = strtotime($from);
			$to = strtotime($to);
		}
		if ($to === $from) $arr_data[] = array('', array(0, 0, 0, 0, 0), ''); 
		for ($i = $from; $i <= $to; $i+=86400) {
			$RT = $i;
			$RD = date('m/d', $RT);
			$RW = ($to === $from) ? '0' : date('w', $RT);
			$tmp = 'ind' . date('Ymd', $RT);
			$sql = "SELECT {$key} FROM {$tmp} WHERE MD5='01'";
			$result = mysqli_query($db_con, $sql);
			if ($result && mysqli_num_rows($result)) {			
				$row = mysqli_fetch_row($result);
				$arr_data[] = array($RD, $row, $RW);
				mysqli_free_result($result);
			} else {
				$arr_data[] = array($RD, array(0, 0, 0, 0, 0), $RW);
			}
		}
		if ($to === $from) $arr_data[] = array('', array(0, 0, 0, 0, 0), ''); 
		echo json_encode($arr_data);
		get_json_error($q);
		break;
	case 'heatmap':
		$key =  SDATA_OUT('key', 1, 'EXIT', 32);
		$type = SDATA_OUT('type', 9, 'EXIT');
		switch ($type) {
		case 0:
			$where = "WHERE PageMD5='{$key}'";
			break;
		case 1:
			$where = 'WHERE VID=' . $key;
			break;
		case 2:
			$where = 'WHERE NodeActionType=' . $key;
			break;
		default:
			exit;
		}
		$db_con = use_db(DB_HOST_LOCAL, ROOT_USER_LOCAL, ROOT_PASSWORD_LOCAL, $db_site);
		$from = SDATA_OUT('from', 6, 'EXIT');
		$to = SDATA_OUT('to', 6, 'EXIT');
		$sql = gen_sql('clk', $db_con, $from, $to, 2, $where, '', '', $start, $end);
		$result = mysqli_query($db_con, $sql['COUNT']);
		if ($result && mysqli_num_rows($result)) {
			$row = mysqli_fetch_row($result);
			$total = (int)$row[0];
			if (($start + $end) > $total) $end = $total - $start;
			mysqli_free_result($result);
		} else {
			exit;
		}
		$result = mysqli_query($db_con, $sql['MERGE']);
		if ($result && mysqli_num_rows($result)) {
			$arr_data = array();
			$arr_data[] = array($total, $start, $end);
			while ($row = mysqli_fetch_row($result))
			{
				$arr_data[] = $row;
			}
			mysqli_free_result($result);
			echo json_encode($arr_data);
			get_json_error($q);
		} else {
			echo '';
		}
		break;
	case 'daytrend':
		$type = SDATA_OUT('type', 9, 'EXIT');
		$type = 'Type=' . $type;
		$key = 'PV,UPV,Visits,UV,NV,RV';
		$time = time();
		if ($from != date('Ymd', $time)) {
			$RN = '24:00';
		} else {
			$RN = date('H:i', $time);
		}
		$db_con = use_db(DB_HOST_LOCAL, ROOT_USER_LOCAL, ROOT_PASSWORD_LOCAL, $db_site);
		$sql = "SELECT Detail,{$key} FROM {$tb_ind} WHERE {$type}";
		$result = mysqli_query($db_con, $sql);
		if ($result && mysqli_num_rows($result)) {
			$arr_data = array();
			$arr_data[] = explode(',', $key);
			$arr_data[0][6] = $RN; 
			while ($row = mysqli_fetch_row($result))
			{
				$arr_data[] = $row;
			}
			mysqli_free_result($result);
			echo json_encode($arr_data);
			get_json_error($q);
		} else {
			echo '';
		}
		break;
	}
	if ($db_con) mysqli_close($db_con);
exit;
function use_db($host, $user, $pw, $db) {
		$server = $_SERVER['HTTP_HOST'];
		$con = mysqli_connect($host, $user, $pw);
		if (mysqli_connect_errno($con)) {
			exit;
 		}
		$db_selected = mysqli_select_db($con, $db);
		if (!$db_selected) {
			mysqli_close($con);
			exit;
  		}
		return $con;
}
function read_record($con, $sql, &$last_rn) {
		$result = mysqli_query($con, $sql);
		if ($result && mysqli_num_rows($result)) {
			$arr = array();
			while ($row = mysqli_fetch_assoc($result)) { 
				$last_rn = $row['RecordNo'];
				$arr[] = $row;
			}
			mysqli_free_result($result);
			return $arr;
		}
		return NULL;	
}
function SDATA_OUT($key, $opt, $def, $maxL=0, $minL=0) {
		if (isset($_GET[$key])) {
			$val = $_GET[$key];
		} else {
			if ($def === 'EXIT') {
				exit;
			} else {
				return $def;
			}
		}
		switch ($opt) {
			case 0:
				$mval = filter_var($val, FILTER_SANITIZE_STRING);
				if (strlen($mval) !== strlen($val)) {
					return '';
				} else {
					if (strlen($val) > $maxL) {
						return substr($val, 0, $maxL);
					} else {
						return $val;
					}
				}
			case 1:
				$mval = filter_var($val, FILTER_SANITIZE_STRING);
				if (strlen($mval) > $maxL) {
					return substr($mval, 0, $maxL);
				} else {
					return $mval;
				}
			case 2:
				$tmp=(int)$val;
				return ($tmp > $maxL || $tmp < $minL ? 0 : $tmp);
			case 3:
				$mval = filter_var($val, FILTER_SANITIZE_NUMBER_FLOAT, FILTER_FLAG_ALLOW_FRACTION + FILTER_FLAG_ALLOW_THOUSAND);
				if (strlen($mval) !== strlen($val)) {
					return '';
				} else {
					if (strlen($val) > $maxL) {
						return '';
					} else {
						return $val;
					}
				}
			case 4:
				$mval = filter_var($val, FILTER_SANITIZE_STRING);
				if (strlen($mval) === $maxL) {
					return $val;
				} else {
					exit;
				}
			case 5:
				$mval = filter_var($val, FILTER_VALIDATE_EMAIL);
				if (strlen($mval) !== strlen($val)) {
					return '';
				} else {
					if (strlen($val) > $maxL) {
						return '';
					} else {
						return $val;
					}
				}
			case 6:
				$tmp = (int)$val;
				if ((string)$tmp !== (string)$val) {
					exit;
				} else {
					return $tmp;
				}
			case 7:
				if (strlen($val) > $maxL) {
					return substr($val, 0, $maxL);
				} else {
					return $val;
				}
			case 8:
				$tmp = (int)$val;
				if ((string)$tmp !== (string)$val) {
					exit;
				} else {
					return ($tmp - 20000000);
				}
			case 9:
				return (int)$val;
			case 10:
				return (float)$val;
		}
		return NULL;
}
function verify_user($sid, $t, $v) {
		$n = time();
		if ($t < $n) exit;
		$matchvisa = md5($sid . $t . ENCODE_FACTOR);
		if ($v === $matchvisa) return true;
		exit;
}
function verify_cahm($sid, $t, $v) {
		$n = time();
		if ($t < $n) die('911');
		$matchvisa = md5($sid . $t . ENCODE_FACTOR);
		if ($v === $matchvisa) return true;
		die('911');
}
function get_ip() {
		foreach (array('HTTP_CLIENT_IP', 'HTTP_X_FORWARDED_FOR', 'HTTP_X_FORWARDED', 'HTTP_X_CLUSTER_CLIENT_IP', 'HTTP_FORWARDED_FOR', 'HTTP_FORWARDED', 'REMOTE_ADDR') as $key) {
			if (array_key_exists($key, $_SERVER)) {
				foreach (explode(',', $_SERVER[$key]) as $ip) {
					if ((bool) filter_var($ip, FILTER_VALIDATE_IP, FILTER_FLAG_IPV4 | FILTER_FLAG_NO_PRIV_RANGE | FILTER_FLAG_NO_RES_RANGE)) {
						return $ip;
					}
				}
			}
		}
		return '';
}
function get_mysql_query_string($key, &$order, &$title, &$sql='') {
	switch ($key) {
		case 1:
			$order = 'Visits';
			$title = 'Visits';
			break;
		case 2:
			$order = 'PV';
			$title = 'PV';
			break;
		case 3:
			$order = 'UV';
			$title = 'UV';
			break;
		case 4:
			$order = 'UPV';
			$title = 'UPV';
			break;
		case 5:
			$order = 'BounceRate';
			$title = 'Bounce Rate';
			$sql = 'IFNULL(SUM(Bounces)/SUM(Visits),0)*10000 AS BounceRate';
			break;
		case 6:
			$order = 'ExitRate';
			$title = 'Exit Rate';
			$sql = 'IFNULL(SUM(Exits)/SUM(PV),0)*10000 AS ExitRate';
			break;
		case 7:
			$order = 'AvgMRX';
			$title = 'Avg MRX';
			break;
		case 8:
			$order = 'AvgMRY';
			$title = 'Avg MRY';
			break;
		case 9:
			$order = 'AvgReady';
			$title = 'Avg DOM Ready';
			$sql = 'IFNULL(SUM(TotalReady)/SUM(ReadyTimes),0) AS AvgReady';
			break;
		case 10:
			$order = 'AvgLoad';
			$title = 'Avg Load';
			$sql = 'IFNULL(SUM(TotalLoad)/SUM(LoadTimes),0) AS AvgLoad';
			break;
		case 11:
			$order = 'AvgOnline';
			$title = 'Avg Online';
			$sql = 'IFNULL(SUM(TotalOnline)/SUM(PV),0) AS AvgOnline';
			break;
		case 12:
			$order = 'Detail';
			$title = 'Detail';
			break;
		case 13:
			$order = 'Exits';
			$title = 'Exits';
			break;
		case 14:
			$order = 'ValidClicks';
			$title = 'Valid Clicks';
			break;
		case 15:
			$order = 'Clicks';
			$title = 'Clicks';
			break;
		case 16:
			$order = 'Bounces';
			$title = 'Bounces';
			break;
		case 17:
			$order = 'SEEntry';
			$title = 'SE Entry';
			break;
		case 18:
			$order = 'RFEntry';
			$title = 'Backlink Entry';
			break;
		case 19:
			$order = 'DREntry';
			$title = 'Direct Entry';
			break;
		case 20:
			$order = 'AvgDelay';
			$title = 'Avg Delay';
			$sql = 'IFNULL(SUM(TotalDelay)/SUM(DelayTimes),0) AS AvgDelay';
			break;
		case 21:
			$order = 'NV';
			$title = 'NV';
			break;
		case 22:
			$order = 'RV';
			$title = 'RV';
			break;
		case 23:
			$order = 'RVS';
			$title = 'RVS';
			break;
		case 24:
			$order = 'Detail';
			$title = 'Local Time';
			break;
		case 25:
			$order = 'Detail';
			$title = 'Server Time';
			break;
		case 30:
			$order = 'AvgOnlinePerVisit';
			$title = 'Avg Online Per Visit';
			$sql = 'IFNULL(SUM(TotalOnline)/SUM(Visits),0) AS AvgOnlinePerVisit';
			break;
		default:
			exit;
	}
	$sql OR $sql = $order;
}
function get_json_error($func) {
	switch (json_last_error()) {
		case JSON_ERROR_NONE:
		break;
		case JSON_ERROR_DEPTH:
			echo $func, ' - Maximum stack depth exceeded';
		break;
		case JSON_ERROR_STATE_MISMATCH:
			echo $func, ' - Underflow or the modes mismatch';
		break;
		case JSON_ERROR_CTRL_CHAR:
			echo $func, ' - Unexpected control character found';
		break;
		case JSON_ERROR_SYNTAX:
			echo $func, ' - Syntax error, malformed JSON';
		break;
		case JSON_ERROR_UTF8:
			echo $func, ' - Malformed UTF-8 characters, possibly incorrectly encoded';
		break;
		default:
			echo $func, ' - Unknown error';
		break;
	}
}
function get_data($request, $key) {
		$val = '';
		$key .= '='; 
		$spos = strpos($request, $key);
		if ($spos !== false) {
			$spos += strlen($key);
			$epos = strpos($request, '&', $spos);
			if ($epos === false) $epos = strlen($request);
			if ($epos > $spos) $val = substr($request, $spos, ($epos - $spos));
		}
		return $val;
}
function check_table_exist($tb, &$tb_arr) {
		foreach ($tb_arr as $val) 
		{
			if ($tb == $val) return true;
		}
		return false;
}
function gen_sql($tbname, $con, $from, $to, $type, $where, $order, $sortorder, $start, $end, $key='') {
		$sql = array();
		if ($from === $to) {
			$tb = $tbname . $from;
			$sql['COUNT'] = "SELECT COUNT(MD5) FROM {$tb} {$where}";
			switch ($type) {
			case 0:
				$sql['SUM'] = "SELECT SUM(PV) AS PV,SUM(UV) AS UV,SUM(UPV) AS UPV,SUM(Visits) AS Visits,SUM(NV) AS NV,SUM(RV) AS RV,SUM(RVS) AS RVS,SUM(Bounces) AS Bounces,IFNULL(SUM(Bounces)/SUM(Visits),0)*10000 AS BounceRate,SUM(Exits) AS Exits,IFNULL(SUM(Exits)/SUM(PV),0)*10000 AS ExitRate,SUM(TotalDelay) AS TotalDelay,SUM(DelayTimes) AS DelayTimes,IFNULL(SUM(TotalDelay)/SUM(DelayTimes),0) AS AvgDelay,SUM(TotalReady) AS TotalReady,SUM(ReadyTimes) AS ReadyTimes,IFNULL(SUM(TotalReady)/SUM(ReadyTimes),0) AS AvgReady,SUM(TotalLoad) AS TotalLoad,SUM(LoadTimes) AS LoadTimes,IFNULL(SUM(TotalLoad)/SUM(LoadTimes),0) AS AvgLoad,SUM(TotalOnline) AS TotalOnline,SUM(OnlineTimes) AS OnlineTimes,IFNULL(SUM(TotalOnline)/SUM(OnlineTimes),0) AS AvgOnline,SUM(MaxReadX) AS MaxReadX,SUM(MaxReadY) AS MaxReadY,SUM(MRTimes) AS MRTimes,IFNULL(SUM(MaxReadX)/SUM(MRTimes),0) AS AvgMRX,IFNULL(SUM(MaxReadY)/SUM(MRTimes),0) AS AvgMRY,SUM(DREntry) AS DREntry,SUM(SEEntry) AS SEEntry,SUM(RFEntry) AS RFEntry,SUM(Clicks) AS Clicks,SUM(ValidClicks) AS ValidClicks FROM {$tb} {$where}";
				$sql['MERGE'] = "SELECT * FROM {$tb} {$where} ORDER BY {$order} {$sortorder} LIMIT {$start},{$end}";
				break;
			case 1:
				$sql['SUM'] = "SELECT SUM({$order}) FROM {$tb} {$where}";
				$sql['MERGE'] = "SELECT {$order},Detail FROM {$tb} {$where} ORDER BY {$order} {$sortorder} LIMIT 0,{$end}";
				break;
			case 2:
				$sql['COUNT'] = "SELECT COUNT(pKey) FROM {$tb} {$where}";
				$sql['MERGE'] = "SELECT VID,NodeIDMD5,NodeHtmlMD5,NodeTagMD5,NodeNodeMD5,NodeActionType,NodeRepeatClick,X,Y,MX,MY,RecordTime FROM {$tb} {$where} LIMIT {$start},{$end}";
				break;
			case 3:
				$sql['MERGE'] = "SELECT * FROM {$tb} {$where}";
				break;
			case 5:
				$sql['SUM'] = "SELECT COUNT(VID) FROM {$tb} {$where}";
				break;
			case 6:
				$sql['MERGE'] = "SELECT VID,RecordNo FROM {$tb} {$where} ORDER BY {$order} {$sortorder} LIMIT {$start},{$end}";
				break;
			case 7:
				$sql['SUM'] = "SELECT SUM({$order}) FROM {$tb} {$where}";
				$sql['MERGE'] = "SELECT Detail,{$order},MD5 FROM {$tb} {$where} ORDER BY {$sortorder} DESC";
				break;
			case 8:
				$sql['SUM'] = "SELECT SUM({$order}) FROM {$tb} {$where}";
				$sql['MERGE'] = "SELECT Detail,{$order},Extra,MD5 FROM {$tb} {$where} ORDER BY {$sortorder} DESC";
				break;
			}
		} else {
			$from = strtotime($from);
			$to = strtotime($to);
			$tb_arr = array();
			$sql2 = "SHOW TABLES LIKE '{$tbname}%'";
			$result = mysqli_query($con, $sql2);
			if ($result && mysqli_num_rows($result)) {
				while ($row = mysqli_fetch_row($result))
				{
					array_push($tb_arr, $row[0]);
				}
				mysqli_free_result($result);
			} else {
				return '';
			}
			$sql['COUNT'] = 'SELECT COUNT(MD5) FROM (';
			switch ($type) {
			case 0:
				$sql['SUM'] = 'SELECT SUM(PV) AS PV,SUM(UV) AS UV,SUM(UPV) AS UPV,SUM(Visits) AS Visits,SUM(NV) AS NV,SUM(RV) AS RV,SUM(RVS) AS RVS,SUM(Bounces) AS Bounces,IFNULL(SUM(Bounces)/SUM(Visits),0)*10000 AS BounceRate,SUM(Exits) AS Exits,IFNULL(SUM(Exits)/SUM(PV),0)*10000 AS ExitRate,SUM(TotalDelay) AS TotalDelay,SUM(DelayTimes) AS DelayTimes,IFNULL(SUM(TotalDelay)/SUM(DelayTimes),0) AS AvgDelay,SUM(TotalReady) AS TotalReady,SUM(ReadyTimes) AS ReadyTimes,IFNULL(SUM(TotalReady)/SUM(ReadyTimes),0) AS AvgReady,SUM(TotalLoad) AS TotalLoad,SUM(LoadTimes) AS LoadTimes,IFNULL(SUM(TotalLoad)/SUM(LoadTimes),0) AS AvgLoad,SUM(TotalOnline) AS TotalOnline,SUM(OnlineTimes) AS OnlineTimes,IFNULL(SUM(TotalOnline)/SUM(OnlineTimes),0) AS AvgOnline,SUM(MaxReadX) AS MaxReadX,SUM(MaxReadY) AS MaxReadY,SUM(MRTimes) AS MRTimes,IFNULL(SUM(MaxReadX)/SUM(MRTimes),0) AS AvgMRX,IFNULL(SUM(MaxReadY)/SUM(MRTimes),0) AS AvgMRY,SUM(DREntry) AS DREntry,SUM(SEEntry) AS SEEntry,SUM(RFEntry) AS RFEntry,SUM(Clicks) AS Clicks,SUM(ValidClicks) AS ValidClicks FROM (';
				$sql['MERGE'] = 'SELECT MD5,Type,SUM(PV) AS PV,SUM(UV) AS UV,SUM(UPV) AS UPV,SUM(Visits) AS Visits,SUM(NV) AS NV,SUM(RV) AS RV,SUM(RVS) AS RVS,SUM(Bounces) AS Bounces,IFNULL(SUM(Bounces)/SUM(Visits),0)*10000 AS BounceRate,SUM(Exits) AS Exits,IFNULL(SUM(Exits)/SUM(PV),0)*10000 AS ExitRate,SUM(TotalDelay) AS TotalDelay,SUM(DelayTimes) AS DelayTimes,IFNULL(SUM(TotalDelay)/SUM(DelayTimes),0) AS AvgDelay,SUM(TotalReady) AS TotalReady,SUM(ReadyTimes) AS ReadyTimes,IFNULL(SUM(TotalReady)/SUM(ReadyTimes),0) AS AvgReady,SUM(TotalLoad) AS TotalLoad,SUM(LoadTimes) AS LoadTimes,IFNULL(SUM(TotalLoad)/SUM(LoadTimes),0) AS AvgLoad,SUM(TotalOnline) AS TotalOnline,SUM(OnlineTimes) AS OnlineTimes,IFNULL(SUM(TotalOnline)/SUM(OnlineTimes),0) AS AvgOnline,SUM(MaxReadX) AS MaxReadX,SUM(MaxReadY) AS MaxReadY,SUM(MRTimes) AS MRTimes,IFNULL(SUM(MaxReadX)/SUM(MRTimes),0) AS AvgMRX,IFNULL(SUM(MaxReadY)/SUM(MRTimes),0) AS AvgMRY,SUM(DREntry) AS DREntry,SUM(SEEntry) AS SEEntry,SUM(RFEntry) AS RFEntry,Detail,SUM(Clicks) AS Clicks,SUM(ValidClicks) AS ValidClicks,Extra,ExtraMD5 FROM (';
				break;
			case 1:
				$sql['SUM'] = "SELECT SUM({$order}) AS {$order} FROM (";
				$sql['MERGE'] = "SELECT SUM({$order}) AS {$order},Detail,MD5 FROM (";
				break;
			case 2:
				$sql['COUNT'] = "SELECT COUNT(pKey) FROM (";
				$sql['MERGE'] = "SELECT VID,NodeIDMD5,NodeHtmlMD5,NodeTagMD5,NodeNodeMD5,NodeActionType,NodeRepeatClick,X,Y,MX,MY,RecordTime FROM (";
				break;
			case 3:
				$sql['MERGE'] = 'SELECT MD5,Type,AVG(PV) AS PV,AVG(UV) AS UV,AVG(NV) AS NV,AVG(UPV) AS UPV,AVG(RV) AS RV,AVG(RVS) AS RVS,AVG(Visits) AS Visits,AVG(Bounces) AS Bounces,IFNULL(SUM(Bounces)/SUM(Visits),0)*10000 AS BounceRate,AVG(Exits) AS Exits,IFNULL(SUM(Exits)/SUM(PV),0)*10000 AS ExitRate,AVG(RV) AS RV,IFNULL(SUM(TotalDelay)/SUM(DelayTimes),0) AS AvgDelay,IFNULL(SUM(TotalReady)/SUM(ReadyTimes),0) AS AvgReady,IFNULL(SUM(TotalLoad)/SUM(LoadTimes),0) AS AvgLoad,IFNULL(SUM(TotalOnline)/SUM(OnlineTimes),0) AS AvgOnline,IFNULL(SUM(MaxReadX)/SUM(MRTimes),0) AS AvgMRX,IFNULL(SUM(MaxReadY)/SUM(MRTimes),0) AS AvgMRY,AVG(DREntry) AS DREntry,AVG(SEEntry) AS SEEntry,AVG(RFEntry) AS RFEntry,Detail,AVG(Clicks) AS Clicks,AVG(ValidClicks) AS ValidClicks,Extra,ExtraMD5 FROM (';
				break;
			case 5:
				$sql['SUM'] = "SELECT COUNT(VID) FROM (";
				break;
			case 6:
				$sql['MERGE'] = "SELECT VID,RecordNo FROM (";
				break;
			case 7:
				$sql['SUM'] = "SELECT SUM({$order}) AS Visits FROM (";
				$sql['MERGE'] = "SELECT Detail,SUM({$order}) AS {$order},MD5 FROM (";
				break;
			case 8:
				$sql['SUM'] = "SELECT SUM({$order}) AS Visits FROM (";
				$sql['MERGE'] = "SELECT Detail,SUM({$order}) AS {$order},Extra,MD5 FROM (";
				break;
			}
			$bool = 1;
			for ($i = $from; $i <= $to; $i+=86400) {
				$tb = $tbname . date('Ymd', $i);
				if (check_table_exist($tb, $tb_arr)) {
					if ($bool) {
						switch ($type) {
						case 0:
							$sql['COUNT'] .= "(SELECT MD5 FROM {$tb} {$where})";
							$sql['SUM'] .= "(SELECT * FROM {$tb} {$where})";
							$sql['MERGE'] .= "(SELECT * FROM {$tb} {$where})";
							break;
						case 1:
							$sql['COUNT'] .= "(SELECT MD5 FROM {$tb} {$where})";
							$sql['SUM'] .= "(SELECT {$order} FROM {$tb} {$where})";
							$sql['MERGE'] .= "(SELECT {$order},Detail,MD5 FROM {$tb} {$where})";
							break;
						case 2:
							$sql['COUNT'] .= "(SELECT pKey FROM {$tb} {$where})";
							$sql['MERGE'] .= "(SELECT VID,NodeIDMD5,NodeHtmlMD5,NodeTagMD5,NodeNodeMD5,NodeActionType,NodeRepeatClick,X,Y,MX,MY,RecordTime FROM {$tb} {$where})";
							break;
						case 3:
							$sql['MERGE'] .= "(SELECT * FROM {$tb} {$where})";
							break;
						case 5:
							$sql['SUM'] .= "(SELECT VID FROM {$tb} {$where})";
							break;
						case 6:
							$sql['MERGE'] .= "(SELECT VID,RecordNo FROM {$tb} {$where})";
							break;
						case 7:
							$sql['COUNT'] .= "(SELECT MD5 FROM {$tb} {$where})";
							$sql['SUM'] .= "(SELECT {$order} FROM {$tb} {$where})";
							$sql['MERGE'] .= "(SELECT Detail,{$order},MD5 FROM {$tb} {$where})";
							break;
						case 8:
							$sql['COUNT'] .= "(SELECT MD5 FROM {$tb} {$where})";
							$sql['SUM'] .= "(SELECT {$order} FROM {$tb} {$where})";
							$sql['MERGE'] .= "(SELECT Detail,{$order},Extra,MD5 FROM {$tb} {$where})";
							break;
						}
						$bool = 0;
					} else {
						switch ($type) {
						case 0:
							$sql['COUNT'] .= " UNION (SELECT MD5 FROM {$tb} {$where})";
							$sql['SUM'] .= " UNION ALL (SELECT * FROM {$tb} {$where})";
							$sql['MERGE'] .= " UNION ALL (SELECT * FROM {$tb} {$where})";
							break;
						case 1:
							$sql['COUNT'] .= " UNION (SELECT MD5 FROM {$tb} {$where})";
							$sql['SUM'] .= " UNION ALL (SELECT {$order} FROM {$tb} {$where})";
							$sql['MERGE'] .= " UNION ALL (SELECT {$order},Detail,MD5 FROM {$tb} {$where})";
							break;
						case 2:
							$sql['COUNT'] .= " UNION ALL (SELECT pKey FROM {$tb} {$where})";
							$sql['MERGE'] .= " UNION ALL (SELECT VID,NodeIDMD5,NodeHtmlMD5,NodeTagMD5,NodeNodeMD5,NodeActionType,NodeRepeatClick,X,Y,MX,MY,RecordTime FROM {$tb} {$where})";
							break;
						case 3:
							$sql['MERGE'] .= " UNION ALL (SELECT * FROM {$tb} {$where})";
							break;
						case 5:
							$sql['SUM'] .= " UNION ALL (SELECT VID FROM {$tb} {$where})";
							break;
						case 6:
							$sql['MERGE'] .= " UNION ALL (SELECT VID,RecordNo FROM {$tb} {$where})";
							break;
						case 7:
							$sql['COUNT'] .= " UNION (SELECT MD5 FROM {$tb} {$where})";
							$sql['SUM'] .= " UNION ALL (SELECT {$order} FROM {$tb} {$where})";
							$sql['MERGE'] .= " UNION ALL (SELECT Detail,{$order},MD5 FROM {$tb} {$where})";
							break;
						case 8:
							$sql['COUNT'] .= " UNION (SELECT MD5 FROM {$tb} {$where})";
							$sql['SUM'] .= " UNION ALL (SELECT {$order} FROM {$tb} {$where})";
							$sql['MERGE'] .= " UNION ALL (SELECT Detail,{$order},Extra,MD5 FROM {$tb} {$where})";
							break;
						}
					}
				}
			}
			switch ($type) {
			case 0:
			case 1:
			case 4:
				$sql['COUNT'] .= ')CACHETABLE';
				$sql['SUM'] .= ')CACHETABLE';
				$sql['MERGE'] .= ")CACHETABLE GROUP BY MD5 ORDER BY {$order} {$sortorder} LIMIT {$start},{$end}";
				break;
			case 3:
				$sql['MERGE'] .= ')CACHETABLE';
				break;
			case 2:
				$sql['COUNT'] .= ')CACHETABLE';
				$sql['MERGE'] .= ")CACHETABLE LIMIT {$start},{$end}";
				break;
			case 5:
				$sql['SUM'] .= ')CACHETABLE';
				break;
			case 6:
				$sql['MERGE'] .= ")CACHETABLE ORDER BY RecordNo DESC LIMIT {$start},{$end}";
				break;
			case 7:
			case 8:
				$sql['COUNT'] .= ')CACHETABLE';
				$sql['SUM'] .= ')CACHETABLE';
				$sql['MERGE'] .= ")CACHETABLE GROUP BY MD5 ORDER BY {$sortorder} DESC";
			}
		}
		return $sql;
}


?>

================================================
FILE: api/api_manage.php
================================================
<?php
/*!
* ATTENTION: THIS FREE LICENSE IS ONLY FOR PERSONAL NON-COMMERCIAL USER. FOR COMMERCIAL PURPOSES, PLEASE PURCHASE A COMMERCIAL LICENSE! *
* module: Centcount Analyticsb Free Manage Site API PHP Code *
* version: 1.00 Free *
* author: WM Jonssen *
* date: 05/23/2018 *
* copyright 2015-2018 WM Jonssen <wm.jonssen@gmail.com> - All rights reserved.*
* license: Dual licensed under the Free License and Commercial License. *
* https://www.centcount.com *
*/

header('Access-Control-Allow-Origin:*');
header('Content-type: text/html; charset=utf-8');

@require '../config/config_common.php';

$sid = SDATA_IN('sid',23,'EXIT');
$t = SDATA_IN('t',23,'EXIT');
$v = SDATA_IN('v',14,'EXIT',32);
$id = substr($sid,0,-3);
if (!verify_user($sid, $t, $v)) exit;

$q = SDATA_IN('q',16,'EXIT',32);
$sort = SDATA_IN('sort',23,0);
$sort = ($sort === 0) ? 'DESC' : 'ASC';
$tz = SDATA_IN('tz',16,'',32);
if ($tz) date_default_timezone_set($tz);
$db_site = 'site' . $sid; 

switch ($q) {
case 'add site':
	echo add_site($db_site);
	exit;
case 'set site':
	echo change_site_setting($db_site);
	exit;
case 'clear site':
	echo clear_site_data($db_site);
	break;
case 'del site':
	echo delete_site($db_site, $sid);
	exit;
case 'get domain':
	get_domains($sid);
	exit;
case 'set domain':
	echo set_domains($sid);
	exit;
}

exit;

function con_db($host, $user, $pw) {
		$server = $_SERVER['HTTP_HOST'];
		$con = mysqli_connect($host, $user, $pw);
		if (mysqli_connect_errno($con)) {
 			die('Could not connect mysql host - Manage API Function[con_db]');
 		}
		return $con;
}

function use_db($host,$user,$pw,$db) {
		$server = $_SERVER['HTTP_HOST'];
		$con = mysqli_connect($host, $user, $pw);
		if (mysqli_connect_errno($con)) {
 			die('Could not connect mysql host - Manage API Function[use_db]');
 		}
		$db_selected = mysqli_select_db($con, $db);
		if (!$db_selected) {
			mysqli_close($con);
			die('Database is not existed - Manage API Function[use_db]');
		}
		return $con;
}

function SDATA_IN($key, $opt, $def, $maxL=0, $minL=0, $con=0) {
		if (isset($_POST[$key])) {
			$val = $_POST[$key];
		} else {
			if ($def === 'EXIT') {
				exit;
			} else {
				return $def;
			}
		}
		switch ($opt) {
		case 10:
			$mval = filter_var($val, FILTER_SANITIZE_STRING);
			if (strlen($mval) != strlen($val)) {
				return '';
			} else {
				if (strlen($mval) > $maxL) $mval = substr($mval,0,$maxL);
				return mysqli_real_escape_string($con, $mval);
			}
		case 11:
			$mval = filter_var($val, FILTER_SANITIZE_STRING);
			if (strlen($mval) > $maxL) $mval = substr($mval,0,$maxL);
			return mysqli_real_escape_string($con, $mval);
		case 12:
			$mval = filter_var($val, FILTER_SANITIZE_STRING);
			if (strlen($mval) != strlen($val)) {
				return '';
			} else {
				if (strlen($mval) > $maxL) {
					return substr($mval,0,$maxL);
				} else {
					return $mval;
				}
			}
		case 13:
			$mval = filter_var($val, FILTER_SANITIZE_STRING);
			if (strlen($mval) == $maxL) {
				return mysqli_real_escape_string($con, $val);
			} else {
				exit;
			}
		case 14:
			$mval = filter_var($val, FILTER_SANITIZE_STRING);
			if (strlen($mval) == $maxL) {
				return $val;
			} else {
				exit;
			}
		case 15:
			$mval = filter_var($val, FILTER_VALIDATE_EMAIL);
			$mval = mysqli_real_escape_string($con, $mval);
			if (strlen($mval) != strlen($val)) {
				return '';
			} else {
				if (strlen($val) > $maxL) {
					return '';
				} else {
					return $val;
				}
			}
		case 16:
			if (strlen($val) > $maxL) {
				return substr($val, 0, $maxL);
			} else {
				return $val;
			}
		case 20:
			$tmp = (int)$val;
			return ($tmp > $maxL || $tmp < $minL) ? 0 : $tmp;
		case 21:
			return (int)$val;
		case 22:
			$tmp = (int)$val;
			if ((string)$tmp != (string)$val) {
				exit;
			} else {
				return ($tmp - 20000000);
			}
		case 23:
			$tmp = (int)$val;
			if ((string)$tmp != (string)$val) {
				exit;
			} else {
				return $tmp;
			}
		case 30:
			$mval = filter_var($val, FILTER_SANITIZE_NUMBER_FLOAT, FILTER_FLAG_ALLOW_FRACTION + FILTER_FLAG_ALLOW_THOUSAND);
			if (strlen($mval) != strlen($val)) {
				return '';
			} else {
				if (strlen($val) > $maxL) {
					return '';
				} else {
					return $val;
				}
			}
		case 31:
			return (float)$val;
		}
		return NULL;
}

function check_table($con, $cTable, $cDB) {
		$ret = false;
		$sql = "SHOW TABLES FROM {$cDB}";
		$result = mysqli_query($con, $sql);
		if ($result && mysqli_num_rows($result)) {
			while ($row = mysqli_fetch_row($result)) {
				if ($row[0] == $cTable) {
					$ret = true;
					break;
				}
			}
			mysqli_free_result($result);
		}
		return $ret;
}

function check_value($value, $type) {
		switch($type) {
		case 1:
			return check_domain_ip(trim($value));
		case 2:
			return check_site_url(trim($value));
		case 3:
			return check_site_url(trim($value));
		case 4:
			return check_page_url(trim($value));
		case 5:
			return check_ip(trim($value));
		case 6:
			return check_id(trim($value));
		}
		return '';
}

function check_domain_ip($x) {
		$tmp = parse_url($x, PHP_URL_HOST);
		if (!$tmp) $tmp = $x;
		if (preg_match("/^[0-9a-zA-Z]+[0-9a-zA-Z\.-]*\.[a-zA-Z]{2,6}$/", $tmp)) {
			return strtolower($tmp);
		} else {
			if ((bool)filter_var($tmp, FILTER_VALIDATE_IP, FILTER_FLAG_IPV4 | FILTER_FLAG_NO_PRIV_RANGE | FILTER_FLAG_NO_RES_RANGE)) {
				return $tmp;
			}
		}
		return '';
}

function check_ip($x) {
		if ((bool)filter_var($x, FILTER_VALIDATE_IP, FILTER_FLAG_IPV4 | FILTER_FLAG_NO_PRIV_RANGE | FILTER_FLAG_NO_RES_RANGE)) {
			return $x;
		}
		return '';
}

function check_id($x) {
		if ((bool)filter_var($x, FILTER_SANITIZE_STRING)) {
			if (strlen($x) === 16) return strtoupper($x);
		}
		return '';
}

function check_site_url($x) {
		$tmp = parse_url($x, PHP_URL_SCHEME) . '://' . parse_url($x, PHP_URL_HOST);
		if ((bool)filter_var($tmp, FILTER_VALIDATE_URL)) {
			return $tmp;
		}
		return '';
}

function check_page_url($x) {
		$tmp = parse_url($x, PHP_URL_SCHEME) . '://' . parse_url($x, PHP_URL_HOST);
		if ((bool)filter_var($tmp, FILTER_VALIDATE_URL)) {
			if (strlen($x) > (strlen($tmp) + 1)) return $x;
		}
		return '';
}

function get_ip() {
		foreach(array('HTTP_CLIENT_IP', 'HTTP_X_FORWARDED_FOR', 'HTTP_X_FORWARDED', 'HTTP_X_CLUSTER_CLIENT_IP', 'HTTP_FORWARDED_FOR', 'HTTP_FORWARDED', 'REMOTE_ADDR') as $key) {
			if (array_key_exists($key, $_SERVER)) {
				foreach(explode(',', $_SERVER[$key]) as $ip) {
					if ((bool)filter_var($ip, FILTER_VALIDATE_IP, FILTER_FLAG_IPV4 | FILTER_FLAG_NO_PRIV_RANGE | FILTER_FLAG_NO_RES_RANGE)) {
						return $ip;
					}
				}
			}
		}
		return '';
}

function set_domains($sid) {
		$err = '';
		$param = SDATA_IN('param',12,'',64);
		$key = SDATA_IN('key',12,'',32);
		$value = preg_replace('/(^\s*)|(\s*$)/','',SDATA_IN('value',16,'',2048));
		$type = SDATA_IN('type',23,'EXIT');
		if ($param === '' && ($key === '' && $value === '')) {
			$err = '<br/>Miss Argument - Manage API Function[set_domains]';
			return $err;
		}
		$REDIS = new Redis();
		$REDIS->CONNECT(REDIS_IP_2, REDIS_PORT_2) !== true AND exit;
		$REDIS->SELECT(REDIS_DB_2);
		$con = mysqli_connect(DB_HOST_LOCAL, ROOT_USER_LOCAL, ROOT_PASSWORD_LOCAL);
		if (mysqli_connect_errno($con)) {
			$err .= '<br/>Could not connect mysql host. Please contact Administrator! - Manage API Function[set_domains]';
			return $err;
	 	}
		$db_selected = mysqli_select_db($con, 'site'.$sid);
		if (!$db_selected) {
			$err .= create_site($con, 'site'.$sid);
			if ($err === '') {
				$db_selected = mysqli_select_db($con, 'site'.$sid);
			} else {
				return $err . '[set_domains]';
			}
		}
		if (!$db_selected) {
	 		mysqli_close($con);
			$err .= '<br/>Could not use database. Please contact Administrator! - Manage API Function[set_domains]';
			return $err;
	 	} else {
			switch($param) {
			case 'delete':
				$sql = "DELETE FROM domain WHERE MD5='{$key}'";
				if (!mysqli_query($con, $sql)) {
					mysqli_close($con);
					$err .= '<br/>Delete ('.$value.') failed - Manage API Function[set_domains]';
					return $err;
				} else {
					$REDIS->SREM($sid.'-'.$type, $key);
				}
				break;
			case 'add':
				$domain = check_value($value, $type);
				if (!$domain) {
					mysqli_close($con);
					$err .= '<br/>('.$value.') is not valid - Manage API Function[set_domains]';
					return $err;
				}
				$now = time();
				$md5 = md5($domain);
				$sql = "INSERT INTO domain(Domain, MD5, DomainType, CreateTime, UpdateTime) VALUES('{$domain}', '{$md5}', {$type}, {$now}, {$now})";
				if (!mysqli_query($con, $sql)) {
					mysqli_close($con);
					$err .= '<br/>Add domain ('.$domain.') failed, or it is already existed - Manage API Function[set_domains]';
					return $err;
				} else {
					$REDIS->SADD($sid.'-'.$type, $md5);
				}
				break;
			case 'modify':
				$domain = check_value($value, $type);
				if (!$domain) {
					mysqli_close($con);
					$err .= '<br/>('.$value.') is not valid - Manage API Function[set_domains]';
					return $err;
				}
				$md5 = md5($domain);
				$sql = "UPDATE domain SET Domain='{$domain}',MD5='{$md5}' WHERE MD5='{$key}'";
				if (!mysqli_query($con, $sql)) {
					mysqli_close($con);
					$err .= '<br/>Modify ('.$domain.') failed, or it is already existed - Manage API Function[set_domains]';
					return $err;
				} else {
					$REDIS->SREM($sid.'-'.$type, $key);
					$REDIS->SADD($sid.'-'.$type, $md5);
				}
				break;
			case 'batch':
				$domains = array();
				$arrVal = array();
				if ($value) {
					strpos($value,PHP_EOL) !== false ? $arrVal = explode(PHP_EOL, $value) : $arrVal[0] = $value;
					foreach ($arrVal as $val) {
						$tmp = check_value($val, $type);
						if ($tmp) {
							$domains[] = $tmp;
						} else {
							$err .= '<br/>('.$val.') is not valid - Manage API Function[set_domains]';
						}
					}
					if (count($domains) === 0) {
						mysqli_close($con);
						return $err;
					}
				} else {
					mysqli_close($con);
					$err .= '<br/>No data to be added - Manage API Function[set_domains]';
					return $err;
				}
				$now = time();
				foreach($domains as $tmp) {
					$md5 = md5($tmp);
					$sql = "INSERT INTO domain(Domain, MD5, DomainType, CreateTime, UpdateTime) VALUES('{$tmp}', '{$md5}', {$type}, {$now}, {$now})";
					if (!mysqli_query($con, $sql)) {
						$err .= '<br/>Batch Add ('.$tmp.') failed, or it is already existed - Manage API Function[set_domains]';
					} else {
						$REDIS->SADD($sid.'-'.$type, $md5);
					}
				}
				break;
			case 'addto':
				$sql="UPDATE domain SET DomainType=1 WHERE MD5='{$key}'";
				if (!mysqli_query($con, $sql)) {
					mysqli_close($con);
					$err .= '<br/>Add ('.$domain.') failed, or it is already existed.';
					return $err;
				} else {
					$REDIS->SREM($sid.'-2', $key);
					$REDIS->SADD($sid.'-1', $key);
				}
				break;
			}
		}
		mysqli_close($con);
		if ($err === '') $err = 'OK';
		return $err;
}

function get_domains($sid) {
		$db_site = 'site' . $sid;
		$con = mysqli_connect(DB_HOST_LOCAL, ROOT_USER_LOCAL, ROOT_PASSWORD_LOCAL);
		if (mysqli_connect_errno($con))
		{
			die ('<br/>Could not connect mysql host. Please contact Administrator! - Manage API Function[get_domains]');
 		}
		$db_selected = mysqli_select_db($con, $db_site);
		if (!$db_selected)
 		{
 			mysqli_close($con);
			die ('<br/>Could not use database. Please contact Administrator! - Manage API Function[get_domains]');
		} else {
			if (!check_table($con,'domain',$db_site)) { 
$sql = 'CREATE TABLE IF NOT EXISTS domain (
Domain varchar(1024) NOT NULL DEFAULT "", 
MD5 varchar(32) NOT NULL PRIMARY KEY,
BlockedTimes bigint NOT NULL DEFAULT 0,
DomainType tinyint NOT NULL DEFAULT 0, 
CreateTime int NOT NULL DEFAULT 0,
UpdateTime int NOT NULL DEFAULT 0
) ENGINE=InnoDB DEFAULT CHARACTER SET=utf8 COLLATE=utf8_general_ci';
				if (!mysqli_query($con, $sql)) {
					die ('<br/>Create domain table failed. Please contact Administrator! - Manage API Function[get_domains]');
				}
			}
			$REDIS = new Redis();
			$REDIS->CONNECT(REDIS_IP_2, REDIS_PORT_2) !== true AND exit;
			$REDIS->SELECT(REDIS_DB_2);
			if ($REDIS->ZCARD($sid . 'BlockedTime') > 0) {
				$ARR_RETURN = $REDIS->ZRANGE($sid . 'BlockedTime', 0, -1, 'WITHSCORES');
				if (!empty($ARR_RETURN)) {
					foreach ($ARR_RETURN as $key=>$val) {
						if (!empty($key) AND !empty($val)) {
							$md5 = md5($key);
							$sql = "UPDATE domain SET UpdateTime={$val} WHERE MD5='{$md5}'";
							if (!mysqli_query($con, $sql)) {
								$sql = "INSERT INTO domain(Domain, MD5, BlockedTimes, DomainType, CreateTime, UpdateTime) VALUES('{$key}', '{$md5}', 1, 2, {$val}, {$val})";
								mysqli_query($con, $sql);
							}
						}
					}
					$REDIS->DEL($sid . 'BlockedTime');
				}
			}
			if ($REDIS->ZCARD($sid . 'BlockedCount') > 0) {
				$ARR_RETURN = $REDIS->ZRANGE($sid . 'BlockedCount', 0, -1, 'WITHSCORES');
				if (!empty($ARR_RETURN)) {
					foreach ($ARR_RETURN as $key=>$val) {
						if (!empty($key) AND !empty($val)) {
							$md5 = md5($key);
							$sql = "UPDATE domain SET BlockedTimes=BlockedTimes+{$val} WHERE MD5='{$md5}'";
							mysqli_query($con, $sql);
						}
					}
					$REDIS->DEL($sid . 'BlockedCount');
				}
			}
			global $sort;
			$sql = 'SELECT * FROM domain ORDER BY CreateTime ' . $sort;
			$result = mysqli_query($con, $sql);
			if ($result && mysqli_num_rows($result)) {
				$GLOBAL_DOMAINS = array();
				while ($row = mysqli_fetch_assoc($result)) {
					$GLOBAL_DOMAINS[] = $row;
				}
				mysqli_free_result($result);
			} else {
				mysqli_close($con);
				die ('<br/>Could not list domains');
			}
		}
		mysqli_close($con);
		echo json_encode($GLOBAL_DOMAINS);
}

function add_site($db_site) {
		$err = '';
		$value = preg_replace('/(^\s*)|(\s*$)/','',SDATA_IN('value',16,'',2048));
		$type = SDATA_IN('type',23,'EXIT');
		$domains = array();
		$arrVal = array();
		if ($value) {
			strpos($value,PHP_EOL) !== false ? $arrVal = explode(PHP_EOL, $value) : $arrVal[0] = $value;
			foreach ($arrVal as $val) {
				$tmp = check_value($val, $type);
				if ($tmp) {
					$domains[] = $tmp;
				} else {
					$err .= '<br/>('.$val.') are not valid - Manage API Function[add_site]';
				}
			}
			if (count($domains) == 0) {
				$err .= '<br/>('.$value.') are not valid - Manage API Function[add_site]';
			}
		} else {
			$err .= '<br/>No data to be added - Manage API Function[add_site]';
		}
		if ($err) return $err;
		$con = mysqli_connect(DB_HOST_LOCAL, ROOT_USER_LOCAL, ROOT_PASSWORD_LOCAL);
		if (mysqli_connect_errno($con))
		{
			$err .= '<br/>Could not connect mysql host. Please contact Administrator!';
			return $err;
 		}
		$db_selected = mysqli_select_db($con, $db_site);
		if (!$db_selected) {
			if (!mysqli_query($con, "CREATE DATABASE IF NOT EXISTS {$db_site} DEFAULT CHARACTER SET=utf8 COLLATE=utf8_general_ci")) {
				mysqli_close($con);
				$err .= '<br/>Create site database failed. Please contact Administrator!';
				return $err;
			}
		}
		$db_selected = mysqli_select_db($con, $db_site);
		if (!$db_selected) {
			$err .= '<br/>Could not use database. Please contact Administrator!';
		} else {
$sql = 'CREATE TABLE IF NOT EXISTS domain (
Domain varchar(1024) NOT NULL DEFAULT "",
MD5 varchar(32) NOT NULL PRIMARY KEY,
BlockedTimes bigint NOT NULL DEFAULT 0,
DomainType tinyint NOT NULL DEFAULT 0,
CreateTime int NOT NULL DEFAULT 0,
UpdateTime int NOT NULL DEFAULT 0
) ENGINE=InnoDB DEFAULT CHARACTER SET=utf8 COLLATE=utf8_general_ci';
			if (mysqli_query($con, $sql)) {
				$now = time();
				foreach ($domains as $tmp) {
					$md5 = md5($tmp);
					$sql = "INSERT INTO domain(Domain, MD5, DomainType, CreateTime) VALUES('{$tmp}','{$md5}',1,{$now})";
					if (!mysqli_query($con, $sql)) {
						$err .= "<br/>Add domain ({$tmp}) failed";
					}
				}
			} else {
				$err .= '<br/>Create domain table failed';
			}
		}
		mysqli_close($con);
		if ($err === '') $err = 'OK';
		return $err;
}

function change_site_setting($db_site) {
		$err = '';
		$IS_TB_EXIST = 1;
		$param = SDATA_IN('param',23,'EXIT');
		$key = SDATA_IN('key',12,'',32);
		$value = SDATA_IN('value',12,'',32);
		if ($key === 'TimeZone') $value = '\'' . $value . '\'';
		$con = mysqli_connect(DB_HOST_LOCAL, ROOT_USER_LOCAL, ROOT_PASSWORD_LOCAL);
		if (mysqli_connect_errno($con)) {
			$err .= '<br/>Could not connect mysql host. Please contact Administrator! - Manage API Function [change_site_setting]';
			return $err;
 		}
		$db_selected = mysqli_select_db($con, $db_site);
		if (!$db_selected) {
 			mysqli_close($con);
			$err .= '<br/>Could not use database. Please contact Administrator! - Manage API Function [change_site_setting]';
			return $err;
 		}
		if (!check_table($con, 'setting', $db_site)) {
$sql = 'CREATE TABLE IF NOT EXISTS setting (
pKey int NOT NULL PRIMARY KEY DEFAULT 0,
TimeZone varchar(32) NOT NULL DEFAULT "PRC",
IPDatabase tinyint NOT NULL DEFAULT 0,
SiteStatus tinyint NOT NULL DEFAULT 0,
MD5Type tinyint NOT NULL DEFAULT 0,
SessionPeriod int NOT NULL DEFAULT 180000,
CreateTime int NOT NULL DEFAULT 0
) ENGINE=InnoDB DEFAULT CHARACTER SET=utf8 COLLATE=utf8_general_ci';
			if (!mysqli_query($con, $sql)) {
				$err .= '<br/>Create table (setting) failed - Manage API Function [change_site_setting]';
				mysqli_close($con);
				return $err;
			}
			$IS_TB_EXIST = 0;
		}
		switch ($param) {
		case 1:
			$now = time();
			$key2 = SDATA_IN('key2',12,'',32);
			$value2 = SDATA_IN('value2',20,0,2,0);
			$sql = "INSERT INTO setting(pKey, {$key}, {$key2}, CreateTime) VALUES(0, {$value}, {$value2}, {$now}) ON DUPLICATE KEY UPDATE {$key}={$value}, {$key2}={$value2}";
			if (!mysqli_query($con, $sql)) {
				mysqli_close($con);
				$err .= "<br/>Insert {$key} : {$value} failed - Manage API Function [change_site_setting]";
				return $err;
			}
			break;
		case 2:
			$now = time();
			$sql = "INSERT INTO setting(pKey, {$key}, CreateTime) VALUES(0, {$value}, {$now}) ON DUPLICATE KEY UPDATE {$key}={$value}";
			if (!mysqli_query($con, $sql)) {
				mysqli_close($con);
				$err .= "<br/>Update {$key} : {$value} failed - Manage API Function [change_site_setting]";
				return $err;	
			}
			break;
		case 3:
			if ($IS_TB_EXIST === 1) {
				$sql = "DELETE FROM setting WHERE {$key}={$value}";
				if (!mysqli_query($con, $sql)) {
					mysqli_close($con);
					$err .= "<br/>Delete {$key} : {$value} failed - Manage API Function [change_site_setting]";
					return $err;
				}
			}
			break;
		}
		mysqli_close($con);
		if ($err === '') $err = 'OK';
		return $err;
}

function clear_site_data($db_site) {
		$err = '';
		$con = mysqli_connect(DB_HOST_LOCAL, ROOT_USER_LOCAL, ROOT_PASSWORD_LOCAL);
		if (mysqli_connect_errno($con)) {
			$err .= '<br/>Could not connect mysql host. Please contact Administrator! - Manage API Function [clear_site_data]';
			return $err;
 		}
		$db_selected = mysqli_select_db($con, $db_site);
		if (!$db_selected) {
 		 	mysqli_close($con);
			$err .= '<br/>Could not use database. Please contact Administrator!';
			return $err;
		} else {
			$sql = 'SHOW TABLES';
			$result = mysqli_query($con, $sql);
			if ($result && mysqli_num_rows($result)) {
				$savedtb = 'domain,setting';
				while ($row = mysqli_fetch_row($result)) {
					if (stripos($savedtb,$row[0]) === false) {
						if (!mysqli_query($con, "DROP TABLE {$row[0]}")) {
							mysqli_close($con);
							$err .= "<br/>Drop table {$row[0]} failed";
							return $err;
						}
					}
				}
				mysqli_free_result($result);
			} else {
				mysqli_close($con);
				$err .= '<br/>Could not list tables';
				return $err;
			}
		}
		mysqli_close($con);
		$err .= '<br/>Clear site analytics data successfully';
		return $err;
}

function delete_site($db_site, $sid) {
		$err = '';
		$con = mysqli_connect(DB_HOST_LOCAL, ROOT_USER_LOCAL, ROOT_PASSWORD_LOCAL);
		if (mysqli_connect_errno($con)) {
			$err .= '<br/>Could not connect mysql host. Please contact Administrator! - Manage API Function[delete_site]';
			return $err;
 		}
		$sql = 'SHOW DATABASES';
		$result = mysqli_query($con, $sql);
		if (!$result) {
			mysqli_close($con);
			$err .= '<br/>Could not list databases';
			return $err;
		} else if (mysqli_num_rows($result)) {
			while ($row = mysqli_fetch_row($result)) {
				if ($row[0] == $db_site) {
					if (!mysqli_query($con, "DROP DATABASE {$db_site}")) {
						mysqli_close($con);
						$err .= '<br/>delete site failed';
						return $err;
					}
					break;
				}
			}
		}
		mysqli_free_result($result);
		mysqli_close($con);	
		$REDIS = new Redis();
		$REDIS->CONNECT(REDIS_IP_2, REDIS_PORT_2) !== true AND exit;
		$REDIS->SELECT(REDIS_DB_2);
		$RETURN_ARRAY = $REDIS->KEYS($sid.'*');
		$REDIS->DEL($RETURN_ARRAY);
		$err = 'OK';
		return $err;
}

function create_site($con, $db_site) {
		$err = '';
		if (!mysqli_query($con, "CREATE DATABASE IF NOT EXISTS {$db_site} DEFAULT CHARACTER SET=utf8 COLLATE=utf8_general_ci")) {
			mysqli_close($con);
			$err .= '<br/>Create site database failed. Please contact Administrator! - Manage API Function[create_site]';
			return $err;
		}
		$db_selected = mysqli_select_db($con, $db_site);
		if (!$db_selected) {
			$err .= '<br/>Could not use database. Please contact Administrator! - Manage API Function[create_site]';
		} else {
$sql = 'CREATE TABLE IF NOT EXISTS domain (
Domain varchar(1024) NOT NULL DEFAULT "",
MD5 varchar(32) NOT NULL PRIMARY KEY,
BlockedTimes bigint NOT NULL DEFAULT 0,
DomainType tinyint NOT NULL DEFAULT 0,
CreateTime int NOT NULL DEFAULT 0,
UpdateTime int NOT NULL DEFAULT 0
) ENGINE=InnoDB DEFAULT CHARACTER SET=utf8 COLLATE=utf8_general_ci';
			if (!mysqli_query($con, $sql)) $err .= '<br/>Create domain table failed - Manage API Function[create_site]';
$sql = 'CREATE TABLE IF NOT EXISTS setting (
pKey int NOT NULL PRIMARY KEY DEFAULT 0,
TimeZone varchar(32) NOT NULL DEFAULT "PRC",
IPDatabase tinyint NOT NULL DEFAULT 0,
SiteStatus tinyint NOT NULL DEFAULT 0,
MD5Type tinyint NOT NULL DEFAULT 0,
SessionPeriod int NOT NULL DEFAULT 1800000,
CreateTime int NOT NULL DEFAULT 0
) ENGINE=InnoDB DEFAULT CHARACTER SET=utf8 COLLATE=utf8_general_ci';
			if (mysqli_query($con, $sql)) {
				$now = time();
				global $tz;
				$sql = "INSERT INTO setting Set pKey=0, TimeZone='{$tz}', IPDatabase=0, SiteStatus=0, MD5Type=0, SessionPeriod=1800000, CreateTime={$now}";
				if (!mysqli_query($con, $sql)) $err .= "Set default site setting failed - Manage API Function[create_site]";
			} else {
				$err .= '<br/>Create setting table failed - Manage API Function[create_site]';
			}
		}
		return $err;
}

function verify_user($sid, $t, $v) {
		$n = time();
		if ($t < $n) exit;
		$matchvisa = md5($sid . $t . ENCODE_FACTOR);
		if ($v === $matchvisa) return true;
		exit;
}

?>


================================================
FILE: ca.php
================================================
<?php
/*!
* ATTENTION: THIS FREE LICENSE IS ONLY FOR PERSONAL NON-COMMERCIAL USER. FOR COMMERCIAL PURPOSES, PLEASE PURCHASE A COMMERCIAL LICENSE! *
* module: Centcount Analytics Free JS Code Generate PHP Code *
* version: 1.00 Free *
* author: WM Jonssen *
* date: 03/26/2018 *
* copyright 2015-2018 WM Jonssen <wm.jonssen@gmail.com> - All rights reserved.*
* license: Dual licensed under the Free License and Commercial License. *
* https://www.centcount.com *
*/

if ($_GET) {
		header('Access-Control-Allow-Origin: *');
		$t = $_SERVER['REQUEST_TIME_FLOAT'];
		empty($t) && $t = microtime(true);
		$rn = (int)($t * 1E6); 
		if (isset($_GET['wakeup'])) {
			isset($_GET['tz']) ? $tz = $_GET['tz'] : exit;
			date_default_timezone_set($tz) || exit;
			$ft = date('Ynd', (int)$t);
			header('Content-type: application/javascript');
			echo "var _caq = _caq || [];_caq.push(['_wakeupEventCA', '{$ft}', {$rn}]);";
			exit;
		}
echo '//1, ';
		isset($_GET['siteid']) ? $sid = (int)$_GET['siteid'] : exit;
		$sid < 1E15 || $sid > 2E15 AND exit;
		empty($_SERVER['HTTP_HOST']) ? exit : $host = $_SERVER['HTTP_HOST'];
		empty($_SERVER['HTTP_REFERER']) ? exit : $referer = $_SERVER['HTTP_REFERER'];
echo '2, ';
		@require './config/config_common.php';
		$REDIS_2 = new Redis();
		if ($REDIS_2->CONNECT(REDIS_IP_2, REDIS_PORT_2) !== true) exit;
		$REDIS_2->SELECT(REDIS_DB_2);
echo '3, ';
		$ip = get_ip();
		if ($ip === '' || $REDIS_2->SISMEMBER('BlockedIPList', $ip) === true) exit;
echo '4, ';
		$cahm_visa = '';
		if (isset($_GET['cahm_visa'])) {
			$cahm_visa = $_GET['cahm_visa'];
		} else {
			$len = strpos($referer, 'cahm_visa=');
			if ($len !== false) $cahm_visa = substr($referer, $len + 10);
		}
		$verify_result = 1;
		if (strlen($cahm_visa) >= 42) $verify_result = verify_cahm($sid, $ip, $cahm_visa);
echo '5 -> ', $verify_result, ', ';
		if ($cahm_visa === '' || $verify_result === 0) {
			check_block($referer, $sid, $ip, $tz, $ipdb, $REDIS_2);
echo '6 -> ', ((empty($tz) || is_null($ipdb)) ? '0, ' : '1, ');
			empty($tz) || is_null($ipdb) AND exit;
			date_default_timezone_set($tz) || exit;
			$ft = date('Ynd', (int)$t);
			$IS_CAHM = false;
		} else {
echo '7, ';
			$tz = $REDIS_2->GET($sid.'-TimeZone');
			empty($tz) AND exit;
			$IS_CAHM = true;
		}
echo '8, ';
		$errHost = ERROR_LOG_HOST;
echo '9, ';
		
		if ($IS_CAHM) {

			$ca = "";
		} else {
			$ca = "

/*!
* ATTENTION: THIS FREE LICENSE IS ONLY FOR PERSONAL NON-COMMERCIAL USER. FOR COMMERCIAL PURPOSES, PLEASE PURCHASE A COMMERCIAL LICENSE! *
* module: Centcount Analytics JS Code *
* version: 1.00.180326001 Free *
* author: WM Jonssen *
* date: 03/26/2018 *
* copyright 2015-2018 WM Jonssen <wm.jonssen@gmail.com> - All rights reserved. *
* license: Dual licensed under the Free License and Commercial License. *
* https://www.centcount.com *
*/
(function(){function L(a){try{return Q(decodeURIComponent(a))}catch(c){try{return Q(a)}catch(n){t(n,'U failed')}}}function Cb(a){try{var b=(new Date).getTime();return a?b-R:St-R+b}catch(n){t(n,'Gt failed')}}function P(a,c){try{var b='';if(0<m.cookie.length){var p='; '+a+'=';var z=m.cookie.indexOf(p);0>z&&(p=a+'=',z=m.cookie.indexOf(p));if(-1<z){z+=p.length;var r=m.cookie.indexOf(';',z);0>r&&(r=m.cookie.length);b=Db(m.cookie.substring(z,r))}}return b?'number'===typeof c?O(b):b:c}catch(y){t(y,'gC failed')}}
function A(a,c,n,p){try{var b=new Date;p?b.setDate(b.getDate()+n):b.setTime(b.getTime()+n);m.cookie=a+'='+Q(c)+(n?';expires='+b.toUTCString():'')+';path=/'}catch(r){t(r,'sC failed')}}function Eb(){try{q._caq={push:function(){return Fb.apply(this,arguments)}}}catch(b){t(b,'aL failed')}}function Fb(b){try{if('[object Array]'==={}.toString.call(b))switch(b[0]){case '_customVariableCA':Y=b[1];J(6);break;case '_wakeupEventCA':ua=b[1];C=b[2];St=O(C/1E3);if(ua&&C)try{Z&&(Z=0,R=S=(new Date).getTime(),ia=
T=ja=ka=la=ma=M=N=na=va=ca=0,aa=[],v=[0,0,0,0,0,0,0,0,0,0,0,0],wa=[],Va=oa=0,da=K=Wa='',xa=S,ea=Xa=0,U=1,ya=0,Ya=za=!1,jb(),Aa=!1,kb(),a.nt=0,a.lr=0,A('CA_PPI','',0,0),lb(),a.se='',a.sen='',a.kw='',a.rd='',a.rf='',a.fmt=3,J(9))}catch(c){t(c,'iW failed')}break;case '_responseStatusCA':if(!1===F||1>ca)ca=Ba(0);if(1===O(b[1])){D=!0;clearInterval(Za);try{q.addEventListener?(q.removeEventListener('unload',Ca),q.removeEventListener('mousemove',Da),q.removeEventListener('mousedown',Ea),q.removeEventListener('mouseup',
Fa),q.removeEventListener('mousewheel',Ga),q.removeEventListener('touchstart',mb),q.removeEventListener('touchmove',nb),q.removeEventListener('click',Ha),q.removeEventListener('scroll',Ia),m.removeEventListener('submit',Ja),q.removeEventListener('load',Ka),q.removeEventListener('beforeunload',La)):(q.detachEvent('onunload',Ca),m.detachEvent('onmousemove',Da),m.detachEvent('onmousedown',Ea),m.detachEvent('onmouseup',Fa),m.detachEvent('onmousewheel',Ga),m.detachEvent('onclick',Ha),m.detachEvent('onscroll',
Ia),m.detachEvent('onsubmit',Ja),q.detachEvent('onload',Ka),q.detachEvent('onbeforeunload',La))}catch(c){t(c,'RE failed')}}}}catch(c){t(c,'aP failed')}}function t(a,c){try{var b=[];b.push('siteid='+xc);b.push('rn='+C);b.push('vid='+W);b.push('name='+Q(a.name));b.push('msg='+Q(a.message));b.push('pos='+Q('Line: '+a.lineNumber+', Col: '+a.columnNumber));b.push('rf='+Q(m.referrer));b.push('page='+Q(q.location.href));b.push('agent='+Q(ab));b.push('ex='+Q(c));(new Image).src=bb+b.join('&')+'&rnd='+Math.random()}catch(p){}}
function J(b){try{if(!Z){var c=[];Xa++;c.push('stp='+Xa);c.push('stat='+b);c.push('sid='+xc);c.push('vid='+W);c.push('rn='+C);c.push('tz='+ob);c.push('ipdb='+Gb);c.push('rbt='+pb);c.push('ds='+(2<b&&1>ca?S-R:ca));c.push('rs='+qb);c.push('ls='+rb);c.push('ols='+Cb(1));c.push('mxrx='+Ma);c.push('mxry='+Na);c.push('mnrx='+Oa);c.push('mnry='+Pa);c.push('pa='+a.pa);c.push('tvs='+pa);switch(b){case 9:case 1:case 2:case 3:for(var n in a)c.push(n+'='+a[n]);break;case 4:case 5:if(Ya)return;Ya=!0;var p=(new Date).getTime();
0<oa&&Va>p&&c.push('et='+oa);aa.length&&(1===U&&ea++,c.push('uar='+ea),c.push('uas='+U),c.push('va='+aa.join('.')));(new Image).src=Qa+c.join('&')+Wa+'&rnd='+Math.random();A('CA_LAT',5===b?p:0,fa,0);A('CA_PPI',cb+'-'+p+'-'+C,fa,0);return;case 6:Y.length&&(c.push('cvn='+Y[0]),c.push('cvg='+Y[1]),c.push('cvc='+Y[2]),c.push('cvv='+Y[3]),c.push('cvt='+Y[4]));break;case 7:aa.length&&(1===U&&ea++,c.push('uar='+ea),c.push('uas='+U),c.push('dct='+a.dct),c.push('va='+aa.join('.')));break;case 8:ya++;c.push('ucr='+
ya);c.push('dct='+a.dct);c.push('tpv='+a.tpv);c.push('pg='+a.pg);c.push('cs='+a.cs);for(var z in K)c.push(z+'='+K[z]);break;default:return}var r=c.join('&');1===b||9===b?(va=(new Date).getTime(),Ra(Qa+r+'&rnd='+Math.random())):7===b&&4===U?Ra(Qa+r+'&rnd='+Math.random()):(new Image).src=Qa+r+'&rnd='+Math.random();8===b&&(Wa=r.substr(r.indexOf('&ucr=')))}}catch(y){t(y,'MSG failed')}}function Hb(){try{var a=P('CA_VID',0);W=a?a:C;if(2E15<W||1E15>W||W>C)W=C;A('CA_VID',W,365,1)}catch(c){t(c,'cV failed')}}
function db(){try{if(a.dst=G.scrollTop||u.scrollTop,a.dsl=G.scrollLeft||u.scrollLeft,a.bct=G.clientTop||u.clientTop,a.bcl=G.clientLeft||u.clientLeft,a.dsw=G.scrollWidth||u.scrollWidth,a.dsh=G.scrollHeight||u.scrollHeight,a.bcw=G.clientWidth||u.clientWidth,a.bch=G.clientHeight||u.clientHeight,a.dsw&&a.dsh&&sb){var b=Math.round((a.dsl+a.bcw)/a.dsw*100);100<b&&(b=100);if(b<Oa||!Oa)Oa=b;if(b>Ma||!Ma)Ma=b;var c=Math.round((a.dst+a.bch)/a.dsh*100);100<c&&(c=100);if(c<Pa||!Pa)Pa=c;if(c>Na||!Na)Na=c}}catch(n){t(n,
'gWH failed')}}function Ib(){try{a.ua=ab;a.pf=tb;a.app=ba.appName;a.os='';a.osc='';a.osv='';a.dc='';a.dct=0;a.cpu='';a.bn='';a.bv='';a.bc='';a.bcv='';a.bd='';a.md='';a.sp='';var b=ab.toLowerCase(),c=tb.toLowerCase(),n=b.indexOf('('),p=b.indexOf(')'),z='',r='',y='';-1<n&&(z=b.substring(0,n),z=qa(z),-1<p&&(r=b.substring(n+1,p),r=qa(r),y=b.substring(p+1),y=qa(y)))}catch(H){t(H,'gUA Ini failed');return}if(r){try{p={'windows phone os':'Windows Phone','windows phone':'Windows Phone','windows ce':'Windows CE',
mobile:'Windows Mobile'};var q={'10.0':'10','6.1':'7','6.3':'8.1','6.2':'8','5.1':'XP','6.4':'10','6.0':'Vista','5.2':'Server 2003','5.0':'2000'},h={'arch linux':'Arch Linux',linux:'Linux',freebsd:'FreeBSD',cros:'Chrome OS',fedora:'Fedora',sunos:'SunOS',openbsd:'OpenBSD',netbsd:'NetBSD'},k={ubuntu:'Ubuntu',fedora:'Fedora',suse:'SUSE',centos:'CentOS',debian:'Debian','red hat':'Red Hat',gentoo:'Gentoo',mint:'Mint',slackware:'Slackware',mandriva:'Mandriva'},g={iphone:'iPhone OS',macintosh:'Mac OS X',
ipad:'CPU OS',ipod:'iPhone OS','iPhone OS':'iOS','Mac OS X':'Mac OS X','CPU OS':'iOS'},f={iphone:'iPhone',macintosh:'Macintosh',ipad:'iPad',ipod:'iPod'};n={wow64:'Intel64',x86_64:'Intel64',x64:'Intel64',win64:'Intel64',amd64:'AMD64',' arm':'ARM',ppc64:'PPC64',ppc:'PPC',powerpc:'PPC',intel:'Intel',i686:'i686',win32:'IA-32',x86:'IA-32'};OST=r.split(';');var e=qa(OST[0]).split(' ');switch(e[0]){case 'windows':if('undefined'!==typeof e[1]&&'nt'===e[1]){a.os='Windows';e[2]+='';a.osv=e[2];a.osc='undefined'===
typeof q[e[2]]?'NT':q[e[2]];a.dc='PC';a.dct=1;for(var d in n)if(-1<r.indexOf(d)){a.cpu=d;break}'Windows'===a.os&&' arm'===a.cpu&&(a.os='Windows RT');break}case 'compatible':case 'mobile':if(-1<r.indexOf('windows')){if(-1<r.indexOf('windows nt'))a.os='Windows',a.osv=x(r,'windows nt',[';'],[';'],1,0,0),a.osc='undefined'===typeof q[a.osv]?'NT':q[a.osv],a.dc='PC',a.dct=1;else for(d in a.os='Windows',p)if(-1<r.indexOf(d)){a.os=p[d];a.osv=x(r,d,[';'],[';'],1,0,0);a.dc=d;a.dct=2;break}for(d in n)if(-1<r.indexOf(d)){a.cpu=
d;break}'Windows'===a.os&&' arm'===a.cpu&&(a.os='Windows RT')}break;case 'linux':if(-1===r.indexOf('android')){a.os='Linux';for(var m in k)if(-1<b.indexOf(m)){a.os=k[m];a.osv=x(b,m,[' ',';',')','(','/'],[';',' '],1,0,0);break}a.cpu=x(r,'linux',[';'],[';'],1,0,0);a.dc='PC';a.dct=1;break}case 'android':if(-1<r.indexOf('android')){a.os='Android';a.osv=x(r,'android',[';'],[';'],1,0,0);48E4<=a.sw*a.sh?(a.dc='Android Tablet',a.dct=3):(a.dc=a.os,a.dct=2);a.cpu=x(c,'linux',[],[],1,0,0);var u=OST.length-1;
if(0<u)for(var v=[],w=u;0<w;w--)if(OST[w]=qa(OST[w].toUpperCase()),0<OST[w].indexOf('BUILD')){v=OST[w].split(' ');if(2<v.length)a.bd=v[0],a.md=x(OST[w],' ',[' BUILD'],[],0,0,0);else{var I=v[0];m=[' ','-','_','/'];p=a;try{h=q=-1;k=0;l=m.length;for(g=0;g<l;g++)h=I.indexOf(m[g]),-1<h&&(-1===q||q>h)&&(q=h,k=m[g].length);-1<q?(p.bd=I.substring(0,q),p.md=I.substring(q+k)):p.bd=I}catch(H){t(H,'iStrS failed')}}break}}break;case 'iphone':a.dct=2;case 'macintosh':0===a.dct&&(a.dct=1);case 'ipad':0===a.dct&&
(a.dct=3);case 'ipod':0===a.dct&&(a.dct=2);a.bd='Apple';a.os=g[e[0]];d=a.os.toLowerCase();a.osv=ub(x(r,d,[' ',';'],[';'],1,0,0),0);''===a.osv&&'ipad'===e[0]&&(a.os='iPhone OS',d='iphone os',a.osv=ub(x(r,d,[' ',';'],[';'],1,0,0),0));a.dc=f[e[0]];for(d in n)if(-1<b.indexOf(d)){a.cpu=d;break}a.os=g[a.os];break;case 'x11':for(d in h)if(-1<r.indexOf(d)){a.os=h[d];if(-1<d.indexOf('linux'))for(m in k)if(-1<b.indexOf(m)){a.os=k[m];a.osv=x(b,m,[' ',';',')','(','/'],[';',' '],1,0,0);break}a.cpu=x(r,d,[';'],
[';'],1,0,0);a.dc='PC';a.dct=1;break}break;case 'blackberry':a.bd='BlackBerry',a.md=x(r,'blackberry',[' ',';','/'],[],1,1,0),a.os='BlackBerry OS',a.osv=x(b,'version',[' '],[' '],1,0,0),a.dc='BlackBerry',a.dct=2}a.cpu&&(a.cpu='undefined'===typeof n[a.cpu]?a.cpu.toUpperCase():n[a.cpu]);''===a.osc&&a.osv&&(a.osc=Sa(a.osv))}catch(H){t(H,'gOS failed')}try{I={edge:'Edge','opera mini':'Opera Mini','opera mobi':'Opera Mobi',opr:'Opera',opera:'Opera',firefox:'Firefox',chrome:'Chrome'};n={ucbrowser:'UC Browser',
micromessenger:'WeChat',mqqbrowser:'MQQ Browser',qqbrowser:'QQ Browser',qq:'QQ',oppobrowser:'Oppo Browser',samsungbrowser:'Samsung Browser',miuibrowser:'XiaoMi Browser',baidubrowser:'Baidu Browser',bidubrowser:'Baidu Browser',taobrowser:'TaoBao Browser',maxthon:'Maxthon','sogoumse,sogoumobilebrowser':'Sogou Browser',sogoumobilebrowser:'Sogou Browser',metasr:'SouGou Browser',oupeng:'Opera',lbbrowser:'LieBao Browser',baiduboxapp:'BaiduBoxApp',mb2345browser:'2345 Browser','360browser':'360 Browser',
yabrowser:'Yandex Browser',rockmelt:'RockMelt',seamonkey:'SeaMonkey'};m={iemobile:'IE Mobile',msie:'IE',' rv':'IE'};p={'opera mini':'Opera Mini','opera mobi':'Opera Mobi',opr:'Opera',opera:'Opera',version:'Opera'};if(y){BST=y.split(' ');var E=[];for(d=0;d<BST.length;d++)E.push(BST[d].split('/'))}if(-1<z.indexOf('opera')){a.bn='Opera';v=r+y;for(d in p)if(-1<v.indexOf(d)){a.bn=p[d];'Opera Mobi'===a.bn&&(d='version');a.bv=x(v,d,['/',' ',';',')','('],[],1,0,0);break}y.indexOf('webkit')>y.indexOf('presto')?
(a.bc=15<=Math.floor(a.bv)?'Blink':'WebKit',a.bcv=x(y,'webkit',['/',' ',';',')','('],[],1,1,0)):(a.bc='Presto',a.bcv=x(y,'presto',['/',' ',';',')','('],[],1,1,0))}else{if(y){for(w=u=E.length-1;0<=w;w--)if('undefined'!==typeof n[E[w][0]]){a.bn=n[E[w][0]];a.bv=x(y,E[w][0],['/',' ',';',')','('],[],1,1,0);break}else if('undefined'!==typeof n[E[w][1]]){a.bn=n[E[w][1]];a.bv=x(y,E[w][1],['/',' ',';',')','('],[],1,1,0);break}if(''===a.bn)for(w=u;0<=w;w--)if('undefined'!==typeof I[E[w][0]]){a.bn=I[E[w][0]];
a.bv=x(y,E[w][0],['/',' ',';',')','('],[],1,1,0);break}''===a.bn&&-1<y.indexOf('version')&&-1<y.indexOf('safari')&&(a.bn='Safari',a.bv=x(y,'version',['/',' ',';',')','('],[],1,1,0))}var X=a.bn;switch(e[0]){case 'windows':case 'compatible':case 'mobile':if(''===a.bn)for(d in m)if(-1<r.indexOf(d)){a.bn=m[d];a.bv=x(r,d,[' ',';','/',')','('],[],1,0,0);break}break;case 'android':case 'iphone':case 'ipad':case 'ipod':case 'blackberry':a.bn=a.bn?'Mobile '+a.bn:'Unknown Mobile Browser';break;default:-1<y.indexOf('mobile')&&
(a.bn=a.bn?'Mobile '+a.bn:'Unknown Mobile Browser')}if(y)for(z={presto:'Presto',gecko:'Gecko',applewebkit:'WebKit'},w=0;w<u;w++)if('undefined'!==typeof z[E[w][0]]){a.bc=z[E[w][0]];a.bcv='Gecko'===a.bc?x(r,'rv:',['/',' ',';',')','('],[],0,0,0):E[w][1];break}''===a.bc&&-1<r.indexOf('trident')&&(a.bc='Trident',a.bcv=x(r,'trident',['/',' ',';',')','('],[],1,0,0));'Edge'===X?(a.bc='EdgeHTML',a.bcv=a.bv):'WebKit'===a.bc&&('Chrome'===X&&28<=Sa(a.bv)||'Opera'===X&&15<=Sa(a.bv)?a.bc='Blink':-1<y.indexOf('chrome')&&
28<=Sa(x(y,'chrome',['/',' ',';',')','('],[],1,0,0))&&(a.bc='Blink'))}}catch(H){t(H,'gBS failed')}}if(''===a.os&&''!==c)try{for(d in r={win:'Windows','linux arm':'Android','linux arrch':'Android',ip:'iPhone OS',macintel:'Macintosh',linux:'Linux'},r)if(-1<c.indexOf(d)){a.os=r[d];break}}catch(H){t(H,'gOSPF failed')}if(b)try{for(d in c={'baiduspider-ads':'BaiduSpider-Ads','baiduspider-image':'BaiduSpider-Image',baiduspider:'BaiduSpider','googlebot-image':'GoogleBot-Image','adsbot-google-mobile':'Google-AdsBot-Mobile',
'adsbot-google':'Google-AdsBot',googlebot:'GoogleBot',bingbot:'BingBot',bingpreview:'BingBot','sogou spider':'SogouSpider','sogou web spider':'SogouSpider',haosouspider:'HaosouSpider','360spider':'HaosouSpider',yisouspider:'YisouSpider',sosospider:'SosoSpider','spider-ads':'BaiduSpider-Ads',yandexbot:'YandexBot',yandexmobilebot:'YandexMobileBot',yandeximages:'YandexBot-Image','cloudflare-alwaysonline':'CloudFlare-Cache',dnyzbot:'DnyzBot'},c)if(-1<b.indexOf(d)){pb=1;a.dc='Robot';a.dct=4;a.sp=c[d];
break}}catch(H){t(H,'gRBT failed')}}function qa(a){try{return a.replace(/(^\\s*)|(\\s*$)/g,'')}catch(c){t(c,'iTrim failed')}}function x(a,c,n,p,m,r,q){try{var b=a;a=0===q?a:1===q?a.toLowerCase():2===q?a.toUpperCase():a;var h=0===r?a.indexOf(c):a.lastIndexOf(c);if(-1<h){h+=c.length;var k=p.length;for(c=0;c<k;c++)if(b.substring(h,h+1)===p[c])return'';r=p=-1;k=n.length;for(c=0;c<k;c++)r=a.indexOf(n[c],h+1),-1<r&&(-1===p||p>r)&&(p=r);h+=m;return-1<p?b.substring(h,p):b.substring(h)}return''}catch(g){t(g,
'iStrR failed')}}function ub(a,c){try{switch(c){case 0:return a.replace(/_/g,'.')}return a}catch(n){t(n,'iFormat failed')}}function Ba(a){try{var b=(new Date).getTime();if(0===a)return b-va;if(!1===F)return 1<a?b-R:0;switch(a){case 1:return F.responseEnd>=F.requestStart?F.responseEnd-F.requestStart:b-va;case 2:return F.domContentLoadedEventEnd>=F.navigationStart?F.domContentLoadedEventEnd-F.navigationStart:b-R;case 3:return F.loadEventEnd>=F.navigationStart?F.loadEventEnd-F.navigationStart:b-R}}catch(n){return t(n,
'gTI failed'),1<a?b-R:0}}function eb(a){try{if(a){var b=a.match(/.*:\/\/([^\/]*).*/);return b?b[1].toLowerCase():''}return''}catch(n){t(n,'gDM failed')}}function Jb(){try{var b;a.cs=m.charset||m.characterSet;a.dt=L(m.title+'');if(b=q.location.href+''){var c=b.indexOf('cahm_visa=');-1<c&&(b=b.substring(0,c-1))}a.pg=b?L(b):'';cb=b?ha(b,vb):'';c=b.toLowerCase();-1<c.indexOf('utm_source=')&&(a.utms=L(x(b,'utm_source',['&'],[],1,0,1)),a.utmm=L(x(b,'utm_medium',['&'],[],1,0,1)),a.utmt=L(x(b,'utm_term',
['&'],[],1,0,1)),a.utmc=L(x(b,'utm_content',['&'],[],1,0,1)),a.utmp=L(x(b,'utm_campaign',['&'],[],1,0,1)));if(b=m.referrer+'')c=b.indexOf('cahm_visa='),-1<c&&(b=b.substring(0,c-1));a.rf=b?L(b):'';fb=b?ha(b,vb):'';a:try{if(a.se='',a.sen='',a.kw='',b){try{c=[];var n='baidu:wd:Baidu baidu:word:Baidu baidu:query:Baidu baidu:src:Baidu google:q:Google www.google:+:Google/Organic android.googlequicksearchbox:+:Google/Android so.com/link:+:So sogou.com/link:+:Sogou 360.cn:q:360 haosou:q:Haosou sogou:query:Sogou sogou:w:Sogou sogou:keyword:Sogou sm.cn:q:SM so.com:q:So yahoo:p:Yahoo yahoo:q:Yahoo bing:q:Bing yandex:text:Yandex go.mail.ru:q:Mail duckduckgo:q:Duckduckgo msn:q:MSN aol:query:AOL aol:q:AOL auone:q:Auone 58:key:58 youdao:q:Youdao ask:q:Ask lycos:q:Lycos lycos:query:Lycos cnn:query:CNN virgilio:qs:Virgilio alice:qs:Alice najdi:q:Najdi seznam:q:Seznam rakuten:qt:Rakuten biglobe:q:Biglobe goo.ne:MT:Goo search.smt.docomo:MT:Docomo onet:qt:Onet onet:q:Onet kvasir:q:Kvasir terra:query:Terra rambler:query:Rambler rambler:q:Rambler babylon:q:Babylon search-results:q:Search-results avg:q:Avg comcast:q:Comcast incredimail:q:Incredimail startsiden:q:Startsiden centrum.cz:q:Centrum tut.by:query:TUT globo:q:Globo ukr:q:Ukr daum:q:Daum eniro:search_word:Eniro naver:query:Naver pchome:q:PCHome'.split(' ');
for(var p=0;p<n.length;p++)c.push(n[p].split(':'))}catch(f){t(f,'Init SE failed')}var z=eb(b);n='';p='';if(z)for(var r=0;r<c.length;r++){var y=c[r][0];0>y.indexOf('.')&&(y+='.');if(-1<z.indexOf(y)||-1<m.referrer.indexOf(y)){var u=c[r][1];if('+'===u){a.se=z;a.sen=c[r][2];a.kw='Keyword Not Defined';break a}n='&'+u+'=';var h=b.indexOf(n);-1===h&&(n='?'+u+'=',h=b.indexOf(n));if(-1<h){a.se=z;a.sen=c[r][2];var k=n.length;var g=b.indexOf('&',h+k);-1===g&&(g=b.length);p=b.substr(h+k,g-h-k);a.kw=p?L(p):'Keyword Not Defined';
'Baidu'!==a.sen||p||(a.sen='Baidu/Organic');break a}}}}}catch(f){t(f,'gSW failed')}}catch(f){t(f,'gDI failed')}}function Kb(){try{a.plugin='';var b=ba.plugins||'';if(b){for(var c=[],n=b.length,p=0;p<n;p++)c.push(b[p].name);return a.plugin=L(c.join('|'))}}catch(z){t(z,'gPI failed')}}function jb(){try{if(a.lvt=P('CA_LVT',0)||C,2E15<a.lvt||1E15>a.lvt||a.lvt>C)a.lvt=C}catch(b){t(b,'gVT failed')}}function Lb(){try{a.rd='';Aa=!1;var b=eb(q.location.href),c=eb(m.referrer);a.pd=b;if(a.se||(b.length>c.length?
0>b.indexOf(c):0>c.indexOf(b)))a.rd=c;a.se&&P('CA_RF5','')!==fb&&(Aa=!0,A('CA_RF5',fb,365,1))}catch(n){t(n,'cNS failed')}}function kb(){try{a.nv=0,a.vs=0,a.pv=0,V=!1,ua!==P('CA_VSD','')?(za=V=!0,a.vs=1,a.pv=1):P('CA_LAT',0)+fa<S?V=!0:Aa&&(V=!0),V&&(a.nv=1,a.pv=1,A('CA_LVT',C,365,1)),A('CA_LAT',S,fa,0),A('CA_VSD',ua,3,1)}catch(b){t(b,'cNV failed')}}function Mb(){try{a.nt=!1===ra?0:ra.type;var b=R-3E4,c=P('CA_PPI','');if(c){var n=c.split('-');2<n.length&&(!V&&!1===ra&&b<n[1]&&n[0]===cb&&(a.nt=1),a.lr=
n[2])}A('CA_PPI','',fa,0)}catch(p){t(p,'gLR failed')}}function lb(){try{if(!1===za){var b=P('CA_PV',0);a.pv=V?1:b?++b:1}A('CA_PV',a.pv,3,1);!1===za&&(b=P('CA_VS',0),a.vs=b?V?++b:b:1);A('CA_VS',a.vs,3,1);b=P('CA_TPV',0);a.tpv=b?++b:a.pv;a.tpv<a.pv&&(a.tpv=a.pv);A('CA_TPV',a.tpv,365,1);pa=(b=P('CA_TVS',0))?V?++b:b:a.vs;pa<a.vs&&(pa=a.vs);A('CA_TVS',pa,365,1)}catch(c){t(c,'gVV failed')}}function Nb(){try{if(D)clearInterval(Za);else if(!Z){na++;var b=na;try{if(db(),a.mx!==v[1]||a.my!==v[2]||a.dst!==v[3]||
a.mbi!==v[4]||a.dsl!==v[5]||a.dsh!==v[6]||a.dsw!==v[7]||a.bcw!==v[8]||a.bch!==v[9]||a.bcl!==v[10]||a.bct!==v[11]){T&&!a.mbi&&(a.mx=ma,a.my=la);a.mbi&&ia&&(a.mx=ka,a.my=ja);a.mbi=T;ia&&(ja=ka=la=ma=ia=T=0);wa=[b-v[0],a.mx-v[1]||'',a.my-v[2]||'',a.dst-v[3]||'',a.mbi-v[4]||'',a.dsl-v[5]||'',a.dsh-v[6]||'',a.dsw-v[7]||'',a.bcw-v[8]||'',a.bch-v[9]||'',a.bcl-v[10]||'',a.bct-v[11]||''];for(var c=0,n=[],p=0;12>p;p++)wa[p]&&(c=p);for(p=0;p<=c;p++)n[p]=wa[p];aa.push(n);v=[b,a.mx,a.my,a.dst,a.mbi,a.dsl,a.dsh,
a.dsw,a.bcw,a.bch,a.bcl,a.bct]}}catch(z){t(z,'gRS failed')}0===na%150?(J(7),aa=[],v=[0,0,0,0,0,0,0,0,0,0,0,0],4===U?U=1:U++):50===na&&(J(7),ea=0)}}catch(z){t(z,'RVA failed')}}function Ob(){try{(new Date).getTime()-xa>fa&&(J(4),Z=1)}catch(b){t(b,'CT failed')}}function Ta(){try{1===Z&&(Z=3,Ra(sa+'/ca.php?wakeup=1&tz='+ob+'&r='+Math.random()))}catch(b){t(b,'eW failed')}}function Pb(){try{if(!D){try{q.addEventListener?(q.addEventListener('click',Ha),q.addEventListener('mousedown',Ea),q.addEventListener('mouseup',
Fa),q.addEventListener('mousemove',Da),q.addEventListener('mousewheel',Ga),q.addEventListener('touchstart',mb),q.addEventListener('touchmove',nb),q.addEventListener('scroll',Ia),m.addEventListener('submit',Ja),m.addEventListener('keydown',wb)):q.attachEvent&&(m.attachEvent('onclick',Ha),m.attachEvent('onmousedown',Ea),m.attachEvent('onmouseup',Fa),m.attachEvent('onmousemove',Da),m.attachEvent('onmousewheel',Ga),m.attachEvent('onscroll',Ia),m.attachEvent('onsubmit',Ja),m.attachEvent('onkeydown',wb))}catch(b){t(b,
'AE failed')}qb=Ba(2);a.cs=(m.charset||m.characterSet)+'';a.dt=L(m.title+'');db();J(2);Za=setInterval(Nb,100);setInterval(Ob,1E3)}}catch(b){t(b,'eR failed')}}function Ka(){try{if(!D){u=m.body;G=m.documentElement;rb=Ba(3);a.cs=(m.charset||m.characterSet)+'';a.dt=L(m.title+'');sb=1;db();J(3);Qb();try{var b=document.getElementsByTagName('video');if(!(1>b.length||'function'!==typeof b[0].addEventListener))for(var c=0;c<b.length;c++)new Rb(b[c])}catch(n){t(n,'addVideoEvent failed')}}}catch(n){t(n,'eL failed')}}
function La(){D||J(5)}function Ca(){D||J(5)}function Ha(b){try{if(!D){b=b||window.event;var c=b.srcElement||b.target;if(!('undefined'===typeof c||''!==da&&gb+450>(new Date).getTime())){var n=N!==a.mx||M!==a.my?0:1;N=a.mx;M=a.my;K=Ua(c,n,'INPUT'!==c.tagName&&'BUTTON'!==c.tagName||'submit'!==c.type?0:3);''!==K&&J(8)}}}catch(p){t(p,'eC failed')}}function Ea(b){try{if(!D){Ta();1>a.pa&&(a.pa=1);b=b||window.event;if(b.pageX||b.pageY)ma=b.pageX,la=b.pageY,T=b.button+1;else switch(ma=b.clientX+u.scrollLeft-
u.clientLeft,la=b.clientY+u.scrollTop-u.clientTop,b.button){case 1:T=1;break;case 4:T=2;break;case 2:T=3;break;default:T=b.button+1}xa=(new Date).getTime()}}catch(c){t(c,'eD failed')}}function Fa(a){try{D||(a=a||window.event,a.pageX||a.pageY?(ka=a.pageX,ja=a.pageY):(ka=a.clientX+u.scrollLeft-u.clientLeft,ja=a.clientY+u.scrollTop-u.clientTop),ia=1)}catch(c){t(c,'eP failed')}}function Da(b){try{D||(Ta(),2>a.pa&&(CPA++,2<CPA&&(a.pa=2)),b=b||window.event,b.pageX||b.pageY?(a.mx=b.pageX,a.my=b.pageY):(a.mx=
b.clientX+u.scrollLeft-u.clientLeft,a.my=b.clientY+u.scrollTop-u.clientTop),N!==a.mx&&(N=-1),M!==a.my&&(M=-1),xa=(new Date).getTime())}catch(c){}}function Ga(b){try{2>a.pa&&(a.pa=2)}catch(c){t(c,'eMW failed')}}function mb(b){try{3>a.pa&&(a.pa=3)}catch(c){t(c,'eTS failed')}}function nb(b){try{a.pa=4}catch(c){t(c,'eTM failed')}}function Ia(){try{D||Ta()}catch(b){t(b,'eS failed')}}function wb(b){try{if(!D){Ta();b=b||window.event;var c=b.srcElement||b.target;13!==(b.which?b.which:b.keyCode)||'INPUT'!==
c.tagName&&'BUTTON'!==c.tagName||(N=a.mx,M=a.my,da=Ua(c,0,4),gb=(new Date).getTime())}}catch(n){t(n,'eS failed')}}function Sb(a){function b(){try{u=m.body,G=m.documentElement,G.scrollLeft,u.scrollLeft,G.scrollTop,u.scrollTop,G.scrollWidth,u.scrollWidth,G.scrollHeight,u.scrollHeight,a&&a()}catch(n){setTimeout(b,1)}}setTimeout(b,1)}function Ra(a){try{if(!a)return!1;var b=m.getElementsByTagName('head')[0],n=m.createElement('script');n.setAttribute('src',a);n.setAttribute('type','text/javascript');b.appendChild(n);
return!0}catch(p){t(p,'dL failed')}}function Ua(a,c,n){try{if('undefined'===typeof a||1===Tb[a.tagName])return'';var b='',m='',r='',t='',v='',h='',k='',g='',f='',e='',d='',x='',D='',F='',w=0,I=0,E=0,X=0,H=0,xb=0,yb=0,B={},C,A;for(A=a;A;)0===xb&&(X=A.offsetWidth||0,H=A.offsetHeight||0,xb=1),0===yb&&'fixed'===(q.getComputedStyle?q.getComputedStyle(A,null).position:A.currentStyle.position)&&(I+=u.scrollLeft||G.scrollLeft||0,E+=u.scrollTop||G.scrollTop||0,yb=1),I+=A.offsetLeft||0,E+=A.offsetTop||0,A=
A.offsetParent;f=3===n?'Submit By Click':4===n?'Submit By Enter':'';e=hb(a.innerText,256);x=a.id;do{if('undefined'===typeof a.tagName)break;''===v&&(v=hb(a.href,1024));''===t&&(t=hb(a.onclick,1024));''===g&&(g=Ub(a.outerHTML));''===k&&(k=a.id?a.id:'');m=a.tagName;d=a.className?a.className:'';w=0;for(C=a.previousSibling;C;)F=C.tagName+'',F===m&&w++,C=C.previousSibling;''===k&&(b=m+'('+d+')->'+b);''===h&&k&&(h=k+':'+b);D=m+'['+w+']('+d+')->'+D;r=m+'['+w+']->'+r;a=a.parentNode}while('HTML'!==a.tagName);
h+='HTML('+g+')'+(v||t?'{'+(v||t)+'}':'');B.id=ha(x,2);B.html=ha(h,2);B.tag=ha(D,2);B.node=ha(r,2);B.href=v||t||f;B.act=n?n:v?1:t?2:0;B.txt=B.act?e:'';B.rpc=c;B.x=N>I&&N<I+X?O((N-I)/X*100):-1;B.y=M>E&&M<E+H?O((M-E)/H*100):-1;B.bcl=u.clientLeft||G.clientLeft||0;B.bct=u.clientTop||G.clientTop||0;B.bcw=u.clientWidth||G.clientWidth||0;B.bch=u.clientHeight||G.clientHeight||0;-1===B.x?(B.mx=O(I+Math.random()*X),B.x=O(100*Math.random())):B.mx=N;-1===B.y?(B.my=O(E+Math.random()*H),B.y=O(100*Math.random())):
B.my=M;oa=B.act;Va=0<oa?(new Date).getTime()+1E3:0;return B}catch(Xb){return''}}function Ub(a){try{if(!a)return'';a+='';a=a.replace(/\\s/g,'');512<a.length&&(a=a.substring(0,384)+'...'+a.substr(-128,128));return a}catch(c){return''}}function hb(a,c){try{if(!a)return'';a+='';a=a.replace(/(^\\s*)|(\\s*$)/g,'');a.length>c&&(a=a.substring(0,c-3)+'...');return L(a)}catch(n){return''}}function Ja(){try{D||(''!==da&&gb+500>(new Date).getTime()?(K=da,J(8)):3!==K.act&&(ya--,K.act=3,K.href='Submit By Click',
K.fix=1,J(8)),da='')}catch(b){t(b,'submitEvent failed')}}function Rb(a){try{this.obj=a,this.maxtime=this.duration=0,a.addEventListener('play',zb),a.addEventListener('pause',zb)}catch(c){t(c,'videoEvent failed')}}function zb(b){try{if(!D&&(N!==a.mx||M!==a.my)){b=b||window.event;N=a.mx;M=a.my;var c=b.srcElement||b.target;'undefined'!==typeof c&&(K=Ua(c,0,5),''!==K&&J(8))}}catch(n){t(n,'getVideoClick failed')}}function Qb(){try{for(var b=m.getElementsByTagName('iframe'),c=0;c<b.length;c++)Vb.track(b[c],
function(){D||(N=a.mx,M=a.my,K=Ua(this,0,6),''!==K&&J(8))})}catch(n){t(n,'addIframeEvent failed')}}function ha(a,c){try{var b=function(a){var b='',c;for(c=0;3>=c;c++){var d=a>>>8*c&255;d='0'+d.toString(16);b+=d.substr(d.length-2,2)}return b},p=function(a,b,c,d,g,e,f){a=u(a,u(u(c^(b|~d),g),f));return u(a<<e|a>>>32-e,b)},m=function(a,b,c,d,g,e,f){a=u(a,u(u(b^c^d,g),f));return u(a<<e|a>>>32-e,b)},r=function(a,b,c,d,e,g,f){a=u(a,u(u(b&d|c&~d,e),f));return u(a<<g|a>>>32-g,b)},q=function(a,b,c,d,g,e,f){a=
u(a,u(u(b&c|~b&d,g),f));return u(a<<e|a>>>32-e,b)},u=function(a,b){var c=a&2147483648;var d=b&2147483648;var e=a&1073741824;var g=b&1073741824;var f=(a&1073741823)+(b&1073741823);return e&g?f^2147483648^c^d:e|g?f&1073741824?f^3221225472^c^d:f^1073741824^c^d:f^c^d};if(''===a)return'';var h=[],k;a=function(a){a=a.replace(/\\r\\n/g,'\\n');for(var b='',c=0;c<a.length;c++){var d=a.charCodeAt(c);128>d?b+=String.fromCharCode(d):(127<d&&2048>d?b+=String.fromCharCode(d>>6|192):(b+=String.fromCharCode(d>>12|
224),b+=String.fromCharCode(d>>6&63|128)),b+=String.fromCharCode(d&63|128))}return b}(a);h=function(a){var b=a.length;var c=b+8;for(var d=16*((c-c%64)/64+1),e=Array(d-1),g,f=0;f<b;)c=(f-f%4)/4,g=f%4*8,e[c]|=a.charCodeAt(f)<<g,f++;c=(f-f%4)/4;e[c]|=128<<f%4*8;e[d-2]=b<<3;e[d-1]=b>>>29;return e}(a);var g=1732584193;var f=4023233417;var e=2562383102;var d=271733878;for(k=0;k<h.length;k+=16){var v=g;var x=f;var A=e;var w=d;g=q(g,f,e,d,h[k+0],7,3614090360);d=q(d,g,f,e,h[k+1],12,3905402710);e=q(e,d,g,f,
h[k+2],17,606105819);f=q(f,e,d,g,h[k+3],22,3250441966);g=q(g,f,e,d,h[k+4],7,4118548399);d=q(d,g,f,e,h[k+5],12,1200080426);e=q(e,d,g,f,h[k+6],17,2821735955);f=q(f,e,d,g,h[k+7],22,4249261313);g=q(g,f,e,d,h[k+8],7,1770035416);d=q(d,g,f,e,h[k+9],12,2336552879);e=q(e,d,g,f,h[k+10],17,4294925233);f=q(f,e,d,g,h[k+11],22,2304563134);g=q(g,f,e,d,h[k+12],7,1804603682);d=q(d,g,f,e,h[k+13],12,4254626195);e=q(e,d,g,f,h[k+14],17,2792965006);f=q(f,e,d,g,h[k+15],22,1236535329);g=r(g,f,e,d,h[k+1],5,4129170786);d=
r(d,g,f,e,h[k+6],9,3225465664);e=r(e,d,g,f,h[k+11],14,643717713);f=r(f,e,d,g,h[k+0],20,3921069994);g=r(g,f,e,d,h[k+5],5,3593408605);d=r(d,g,f,e,h[k+10],9,38016083);e=r(e,d,g,f,h[k+15],14,3634488961);f=r(f,e,d,g,h[k+4],20,3889429448);g=r(g,f,e,d,h[k+9],5,568446438);d=r(d,g,f,e,h[k+14],9,3275163606);e=r(e,d,g,f,h[k+3],14,4107603335);f=r(f,e,d,g,h[k+8],20,1163531501);g=r(g,f,e,d,h[k+13],5,2850285829);d=r(d,g,f,e,h[k+2],9,4243563512);e=r(e,d,g,f,h[k+7],14,1735328473);f=r(f,e,d,g,h[k+12],20,2368359562);
g=m(g,f,e,d,h[k+5],4,4294588738);d=m(d,g,f,e,h[k+8],11,2272392833);e=m(e,d,g,f,h[k+11],16,1839030562);f=m(f,e,d,g,h[k+14],23,4259657740);g=m(g,f,e,d,h[k+1],4,2763975236);d=m(d,g,f,e,h[k+4],11,1272893353);e=m(e,d,g,f,h[k+7],16,4139469664);f=m(f,e,d,g,h[k+10],23,3200236656);g=m(g,f,e,d,h[k+13],4,681279174);d=m(d,g,f,e,h[k+0],11,3936430074);e=m(e,d,g,f,h[k+3],16,3572445317);f=m(f,e,d,g,h[k+6],23,76029189);g=m(g,f,e,d,h[k+9],4,3654602809);d=m(d,g,f,e,h[k+12],11,3873151461);e=m(e,d,g,f,h[k+15],16,530742520);
f=m(f,e,d,g,h[k+2],23,3299628645);g=p(g,f,e,d,h[k+0],6,4096336452);d=p(d,g,f,e,h[k+7],10,1126891415);e=p(e,d,g,f,h[k+14],15,2878612391);f=p(f,e,d,g,h[k+5],21,4237533241);g=p(g,f,e,d,h[k+12],6,1700485571);d=p(d,g,f,e,h[k+3],10,2399980690);e=p(e,d,g,f,h[k+10],15,4293915773);f=p(f,e,d,g,h[k+1],21,2240044497);g=p(g,f,e,d,h[k+8],6,1873313359);d=p(d,g,f,e,h[k+15],10,4264355552);e=p(e,d,g,f,h[k+6],15,2734768916);f=p(f,e,d,g,h[k+13],21,1309151649);g=p(g,f,e,d,h[k+4],6,4149444226);d=p(d,g,f,e,h[k+11],10,3174756917);
e=p(e,d,g,f,h[k+2],15,718787259);f=p(f,e,d,g,h[k+9],21,3951481745);g=u(g,v);f=u(f,x);e=u(e,A);d=u(d,w)}switch(c){default:case 0:temp=b(g)+b(f)+b(e)+b(d);break;case 1:temp=b(f)+b(e);break;case 2:temp=b(f)}return temp.toLowerCase()}catch(I){return t(I,'MD5 failed'),''}}try{var fa=18E5,vb=1,C='{$rn}',ua='{$ft}',xc='{$sid}',ob='{$tz}',Gb='{$ipdb}',sa='{$host}',bb='{$errHost}/errlog.php?',ta='{$verify_result}',S=(new Date).getTime(),q=window,m=document,u=document.body,G=document.documentElement,Ab=location.protocol+
'//',ib=screen,ba=navigator,ab=ba.userAgent+'',tb=ba.platform+'',O=parseInt,Sa=parseFloat,Q=encodeURIComponent,Db=decodeURIComponent,R=q._caq_rt||S,va=0,ca=0,qb=0,rb=0,pa=0,F=!1,ra=!1,D=!1;CPA=0;try{'undefined'!==typeof q.performance.timing.responseEnd&&null!==q.performance.timing.responseEnd&&(F=q.performance.timing)}catch(b){F=!1}try{'undefined'!==typeof q.performance.navigation.type&&null!==q.performance.navigation.type&&(ra=q.performance.navigation)}catch(b){ra=!1}sa=Ab+sa;bb=Ab+bb;var Qa=sa+
'/core.php?',Wb=sa+'/ca.php?siteid='+xc;C=O(C);St=O(C/1E3);'1'===ta?ta=P('CAHM_VISA',''):A('CAHM_VISA','',0,0);if(58===ta.length){var Bb=1E3*O(ta.substr(32,10));if(S>Bb||S+9E7<Bb)A('CAHM_VISA','',0,0),console.log('CA: Visa has been expired, Please apply a new visa!');else{Ra(Wb+'&cahm_visa='+ta+'&rnd='+Math.random());D=!0;return}}var Za,na=0,sb=0,N=0,M=0,ma=0,la=0,ka=0,ja=0,T=0,ia=0,aa=[],v=[0,0,0,0,0,0,0,0,0,0,0,0],wa=[],Y=[],xa=S,Z=0,oa=0,Va=0,K='',Wa='',da='',gb=0,cb='',fb='',W=0,Xa=0,V=!1,Aa=
!1,Ma=0,Na=0,Oa=0,Pa=0,ea=0,U=1,ya=0,pb=0,za=!1,Ya=!1}catch(b){t(b,'Init CA data failed');return}var Vb={arr:[],timer:null,obj:function(a,c){this.el=a;this.fn=c;this.tf=!1},track:function(a,c){try{if(this.arr.push(new this.obj(a,c)),!this.timer){var b=this;this.timer=setInterval(function(){b.check()},100)}}catch(p){t(p,'iframe track failed')}},del:function(a){for(var b in this.arr)a==this.arr[b].el&&this.arr.pop(this.arr[b])},destory:function(){for(var a in this.arr)this.arr.pop(this.arr[a])},check:function(){try{if(m.activeElement){var a=
m.activeElement,c;for(c in this.arr)a===this.arr[c].el?0==this.arr[c].tf&&(this.arr[c].fn.apply(a,[]),this.arr[c].tf=!0):this.arr[c].tf=!1}}catch(n){t(n,'iframe check failed')}}};try{if(D)return;var a={};a.ct=(new Date).getHours();a.pg='';a.pv=0;a.dt='';a.pa=0;try{Hb();try{a.sw=ib.width+0,a.sh=ib.height+0,a.cd=ib.colorDepth+0,a.tc=q.hasOwnProperty?q.hasOwnProperty('ontouchstart')?1:0:0}catch(b){a.tc=0,t(b,'gMI failed')}Ib();Jb();try{a.ce=ba.cookieEnabled?1:0,a.lan=(ba.systemLanguage||ba.language)+'',a.lan=a.lan.toLowerCase()}catch(b){t(b,
'gNI failed')}Kb();jb();Lb();kb();Mb();lb();try{2===a.nt?(a.se='',a.sen='',a.kw='',a.rd='',a.rf='',a.fmt=2):a.fmt=a.se?4:a.rd?5:a.rf?2:3}catch(b){t(b,'gRI failed')}Eb()}catch(b){t(b,'Init CA property failed')}!1!==F&&(ca=Ba(1));J(1);a.mx=0;a.my=0;a.mbi=0}catch(b){t(b,'Build CA failed');return}try{if(D)return;Sb(Pb);q.addEventListener?(q.addEventListener('load',Ka),q.addEventListener('beforeunload',La),q.addEventListener('unload',Ca)):q.attachEvent&&(q.attachEvent('onload',Ka),q.attachEvent('onbeforeunload',
La),q.attachEvent('onunload',Ca))}catch(b){t(b,'add events failed');return}var Tb={BR:1,SCRIPT:1,STYLE:1}})();

			";
		}
		
		header('Content-type: application/javascript');
		
		echo $ca;

	//****************** RECORD PERFORMANCE BEGIN *****************
	//*********** connect redis start ************
	$REDIS_0 = new Redis();
	if ($REDIS_0->CONNECT(REDIS_IP_0, REDIS_PORT_0) !== true) exit('//*/');
	$REDIS_0->SELECT(REDIS_DB_0);//select redis No 0 database for record process infomation & query list
	//************ connect redis end *************
	$REDIS_0->MULTI()
			->INCRBY('PerformanceConsumeJS', (int)(microtime(true) * 1E6) - $rn)//set performance consume
			->INCR('PerformanceCountJS')//set performance count
			->EXEC();
	//******************* RECORD PERFORMANCE END ******************	

}


exit('//*/');



function verify_cahm($sid, $ip, $visa) {

		$v = substr($visa, 0, 32); 
		$t = substr($visa, 32, 10);
		$n = time();
		if ($t < $n) return 0;
		
		if (empty($ip)) return 0;
		
		$matchvisa = md5($sid . $t . ENCODE_FACTOR);

		if ($v === $matchvisa) return 1;

		return 0;
	
}

function get_ip() {
		foreach (array('HTTP_CLIENT_IP', 'HTTP_X_FORWARDED_FOR', 'HTTP_X_FORWARDED', 'HTTP_X_CLUSTER_CLIENT_IP', 'HTTP_FORWARDED_FOR', 'HTTP_FORWARDED', 'REMOTE_ADDR') as $key) {
			if (array_key_exists($key, $_SERVER)) {
				foreach (explode(',', $_SERVER[$key]) as $ip) {
					if ((bool) filter_var($ip, FILTER_VALIDATE_IP, FILTER_FLAG_IPV4 | FILTER_FLAG_NO_PRIV_RANGE | FILTER_FLAG_NO_RES_RANGE)) return $ip;
				}
			}
		}
		return '';
}


function use_db($siteid) {

		$con = mysqli_connect(DB_HOST_LOCAL, ROOT_USER_LOCAL, ROOT_PASSWORD_LOCAL);
		if (mysqli_connect_errno($con)) {
			exit('//*/');
 		}
	
		$db_selected = mysqli_select_db($con, 'site'.$siteid);
		if (!$db_selected) {
 			mysqli_close($con);
			exit('//*/');
  		}
		
		return $con;

}

function check_block($ref, $siteid, $ip, &$tz, &$ipdb, &$REDIS_2) {

//echo '5-1, ';
		if ($REDIS_2->EXISTS($siteid.'-Updating') === true) return check_block_mysql($ref, $siteid, $ip, $tz, $ipdb);
//echo '5-2, ';
		if ($REDIS_2->EXISTS($siteid.'-UpdateTime') === true AND $REDIS_2->SCARD($siteid.'-1') > 0) {//return data from redis cache
//echo '5-3, ';	
			return check_block_redis($ref, $siteid, $ip, $tz, $ipdb, $REDIS_2);
		} else {//return data from mysql
//echo '5-4, ';
			pclose(popen('php -f ' . __DIR__ . '/cache_settings.php ' . $siteid . ' 0 &', 'r'));//argv[2] = 0, normal update domains & settings cache data
			return check_block_mysql($ref, $siteid, $ip, $tz, $ipdb);
		}
	
}

function check_block_redis($ref, $siteid, $ip, &$tz, &$ipdb, &$REDIS_2) {
//echo '5-3-0, ';
		//check sitestatus
		$RETURN_ARRAY = $REDIS_2->MGET(array($siteid.'-SiteStatus', $siteid.'-TimeZone', $siteid.'-IPDatabase'));
		if ($RETURN_ARRAY[0] !== '0') exit('//*/');
//echo '5-3-1, ';
		//check blocked IP of setting
		check_block_url_redis(5, $ip, $siteid, $REDIS_2);
//echo '5-3-2, ';
		//get settings
		$tz = $RETURN_ARRAY[1];//$REDIS_2->GET($siteid.'-TimeZone');
		$ipdb = $RETURN_ARRAY[2];//$REDIS_2->GET($siteid.'-IPDatabase');
		if (empty($tz) || is_null($ipdb)) {
			pclose(popen('php -f ' . __DIR__ . '/cache_settings.php ' . $siteid . ' 1 &', 'r'));//argv[2] = 1, force update domains & settings cache data
			return check_block_mysql($ref, $siteid, $ip, $tz, $ipdb);
		}

		//check blocked site
		$siteurl = parse_url($ref, PHP_URL_SCHEME) . '://' . parse_url($ref, PHP_URL_HOST);
		if ($siteurl) {
			check_block_url_redis(3, $siteurl, $siteid, $REDIS_2);
		} else {
			exit('//*/');
		}
//echo '5-3-3, ';
		//check blocked page
		check_block_url_redis(4, $ref, $siteid, $REDIS_2);

		//check domain
		$subdomain = parse_url($ref, PHP_URL_HOST);
		$domain = substr($subdomain, stripos($subdomain, '.') + 1);
		if (stripos($domain, '.') === false) $domain = '';
		if ($domain) {
			if (check_block_url_redis(1, $domain, $siteid, $REDIS_2) === false) {
				if (check_block_url_redis(1, $subdomain, $siteid, $REDIS_2) === false) {
					check_block_url_redis(2, $subdomain, $siteid, $REDIS_2);
				}
			}
		} else if ($subdomain) {
			if (check_block_url_redis(1, $subdomain, $siteid, $REDIS_2) === false) {
				check_block_url_redis(2, $subdomain, $siteid, $REDIS_2);
			}
		} else {
			exit('//*/');
		}

}

function check_block_url_redis($type, $ref, $siteid, &$REDIS_2) {

		switch ($type) {
		case 1://check domain
//echo '5-8-1, ';
			$md5 = md5($ref);
			if ($REDIS_2->SISMEMBER($siteid.'-1', $md5)) return true;
			return false;
		case 2://record filter domain
//echo '5-8-2, ';
			$REDIS_2->ZADD($siteid.'-BlockedTime', time(), $ref);
			$REDIS_2->ZINCRBY($siteid.'-BlockedCount', 1, $ref);
			exit('//*/');
		case 3://check blocked site
		case 4://check blocked page
		case 5://check blocked IP
//echo '5-8-3, ';
			$md5 = md5($ref);
			if ($REDIS_2->SISMEMBER($siteid.'-'.$type, $md5)) {
				$REDIS_2->ZADD($siteid.'-BlockedTime', time(), $ref);
				$REDIS_2->ZINCRBY($siteid.'-BlockedCount', 1, $ref);
				exit('//*/');
			}
			break;
		}
	
}



function check_block_mysql($ref, $siteid, $ip, &$tz, &$ipdb) {
//echo '5-4-0, ';
		//connect database
		$con = use_db($siteid);
//echo '5-4-1, ';
		//check blocked ip
		check_block_url_mysql(5, $ip, $con);
//echo '5-4-2, ';
		//get settings
		$result = mysqli_query($con, "SELECT TimeZone,IPDatabase,SiteStatus FROM setting WHERE pKey=0");
		if ($result && mysqli_num_rows($result)) {
			$row = mysqli_fetch_assoc($result);
			mysqli_free_result($result);
			if ($row['SiteStatus'] !== '0') {
				mysqli_close($con);
				exit('//*/');
			}
			$tz = $row['TimeZone'];		
			$ipdb = $row['IPDatabase'];	
		} else {
			exit('//*/');
		}
//echo '5-4-3, ';
		//check blocked site
		$siteurl = parse_url($ref, PHP_URL_SCHEME) . '://' . parse_url($ref, PHP_URL_HOST);
		if ($siteurl) {
			check_block_url_mysql(3, $siteurl, $con);
		} else {
			mysqli_close($con);
			exit('//*/');
		}
//echo '5-4-4, ';
		//check blocked page
		check_block_url_mysql(4, $ref, $con);

		//check domain
		$subdomain = parse_url($ref, PHP_URL_HOST);
		$domain = substr($subdomain, stripos($subdomain,'.') + 1);
		if (stripos($domain,'.') === false) $domain = '';
		if ($domain) {
			if (!check_block_url_mysql(1, $domain, $con)) {
				if (!check_block_url_mysql(1, $subdomain, $con)) {
					check_block_url_mysql(2, $subdomain, $con);
					mysqli_close($con);
					exit('//*/');
				}
			}
		} else if ($subdomain) {
			if (!check_block_url_mysql(1, $subdomain, $con)) {
				check_block_url_mysql(2, $subdomain, $con);
				mysqli_close($con);
				exit('//*/');
			}
		} else {
			mysqli_close($con);
			exit('//*/');
		}

		mysqli_close($con);

}

function check_block_url_mysql($type, $ref, $con) {

		switch ($type) {
		case 1://check domain
//echo '5-9-1, ';
			$md5 = md5($ref);
			$result = mysqli_query($con, "SELECT DomainType FROM domain WHERE MD5='$md5'");
			if ($result && mysqli_num_rows($result)) {
				while ($row = mysqli_fetch_assoc($result)) {
					$domainType = (int)$row['DomainType'];
					if ($domainType === 1) {
						mysqli_free_result($result);
						return true;
					} else if ($domainType === 2) {
						mysqli_query($con, "UPDATE domain SET BlockedTimes=BlockedTimes+1 WHERE MD5='$md5'");
						mysqli_free_result($result);
						mysqli_close($con);
						exit('//*/');
					}
				}
				mysqli_free_result($result);
				return true;
			} else {
				return false;
			}
			break;
		case 2://insert fliter domain
//echo '5-9-2, ';
			$now = time();
			$md5 = md5($ref);
			mysqli_query($con, "INSERT INTO domain(Domain,MD5,BlockedTimes,DomainType,CreateTime) VALUES('{$ref}','{$md5}',1,2,{$now})");
			break;
		case 3://check blocked site
		case 4://check blocked page
		case 5://check blocked IP
//echo '5-9-3, ';
			$md5 = md5($ref);
			$result = mysqli_query($con, "SELECT MD5 FROM domain WHERE MD5='{$md5}'");
			if ($result && mysqli_num_rows($result)) {
				mysqli_query($con, "UPDATE domain SET BlockedTimes=BlockedTimes+1 WHERE MD5='{$md5}'");
				mysqli_free_result($result);
				mysqli_close($con);
				exit('//*/');
			}
			break;
		}
	
}

?>

================================================
FILE: ca_version.php
================================================
<?php
/*!
* ATTENTION: THIS FREE LICENSE IS ONLY FOR PERSONAL NON-COMMERCIAL USER. FOR COMMERCIAL PURPOSES, PLEASE PURCHASE A COMMERCIAL LICENSE! *
* module: Centcount Analytics Free CA Version PHP Code *
* version: 1.00 Free *
* author: WM Jonssen *
* date: 05/23/2018 *
* copyright 2015-2018 WM Jonssen <wm.jonssen@gmail.com> - All rights reserved.*
* license: Dual licensed under the Free License and Commercial License. *
* https://www.centcount.com *
*/

defined('CA_VERSION') || define('CA_VERSION', "1.00.180523001");
defined('CA_UPDATE') || define('CA_UPDATE' , "2018/05/23");


?>

================================================
FILE: cache_settings.php
================================================
<?php
/*!
* ATTENTION: THIS FREE LICENSE IS ONLY FOR PERSONAL NON-COMMERCIAL USER. FOR COMMERCIAL PURPOSES, PLEASE PURCHASE A COMMERCIAL LICENSE! *
* module: Centcount Analyticsb Free Settings Cache PHP Code *
* version: 1.00 Free *
* author: WM Jonssen *
* date: 05/23/2018 *
* copyright 2015-2018 WM Jonssen <wm.jonssen@gmail.com> - All rights reserved.*
* license: Dual licensed under the Free License and Commercial License. *
* https://www.centcount.com *
*/


		if (isset($_SERVER['argv'][1])) {
			$siteid = (int)$_SERVER['argv'][1];   
			$force_update = (int)$_SERVER['argv'][2]; 
		} else if (isset($_GET['siteid'])) {
			$siteid = (int)$_GET['siteid'];
		}
		empty($siteid) AND exit;
		@require './config/config_common.php';
		ignore_user_abort(1); 
		set_time_limit(0); 
		$REDIS = new Redis();
		$REDIS->CONNECT(REDIS_IP_2, REDIS_PORT_2) !== true AND exit;
		$REDIS->SELECT(REDIS_DB_2);
		$con = mysqli_connect(DB_HOST_LOCAL, ROOT_USER_LOCAL, ROOT_PASSWORD_LOCAL);
		if (mysqli_connect_errno($con))	exit;
		$db_selected = mysqli_select_db($con, 'site'.$siteid);
		if (!$db_selected) {
 			mysqli_close($con);
			exit;
  		}
		if ($REDIS->SETNX($siteid.'-Updating', '') !== true && $force_update === 0) exit;
		$REDIS->SET($siteid.'-UpdateTime', time());
		$REDIS->DEL($siteid.'-1');
		$REDIS->DEL($siteid.'-2');
		$REDIS->DEL($siteid.'-3');
		$REDIS->DEL($siteid.'-4');
		$REDIS->DEL($siteid.'-5');
		$REDIS->DEL($siteid.'-6');
		$result = mysqli_query($con, 'SELECT MD5, DomainType FROM domain');
		if ($result && mysqli_num_rows($result)) {
			while ($row = mysqli_fetch_assoc($result)) {
				$REDIS->SADD($siteid.'-'.$row['DomainType'], $row['MD5']);
			}
			mysqli_free_result($result);
		}
		$result = mysqli_query($con, "SELECT TimeZone,IPDatabase,SiteStatus FROM setting WHERE pKey=0");
		if ($result && mysqli_num_rows($result)) {
			$row = mysqli_fetch_assoc($result);
			$REDIS->SET($siteid.'-SiteStatus', $row['SiteStatus']);
			$REDIS->SET($siteid.'-TimeZone', $row['TimeZone']);
			$REDIS->SET($siteid.'-IPDatabase', $row['IPDatabase']);
			mysqli_free_result($result);
		}
		$result = mysqli_query($con, 'SELECT NIP, DomainType FROM robot');
		if ($result && mysqli_num_rows($result)) {
			while ($row = mysqli_fetch_assoc($result)) {
				$REDIS->SADD($siteid.'-'.$row['DomainType'], $row['MD5']);
			}
			mysqli_free_result($result);
		}
		$REDIS->DEL($siteid.'-Updating');
		mysqli_close($con);
		if (isset($_GET['siteid'])) echo 'Update OK!';


?>

================================================
FILE: command.php
================================================
<?php
/*!
* ATTENTION: THIS FREE LICENSE IS ONLY FOR PERSONAL NON-COMMERCIAL USER. FOR COMMERCIAL PURPOSES, PLEASE PURCHASE A COMMERCIAL LICENSE! *
* module: Centcount Analyticsb Free Contorl Host Command PHP Code *
* version: 1.00 Free *
* author: WM Jonssen *
* date: 05/23/2018 *
* copyright 2015-2018 WM Jonssen <wm.jonssen@gmail.com> - All rights reserved.*
* license: Dual licensed under the Free License and Commercial License. *
* https://www.centcount.com *
*/

header('Access-Control-Allow-Origin:*');
header('Content-type: text/html; charset=utf-8');
@require './config/config_common.php';

	$uid = SDATA_OUT('uid', 6, 'EXIT');
	$t = SDATA_OUT('t', 6, 'EXIT');
	$v = SDATA_OUT('v', 4, 'EXIT', 32);
	$q = SDATA_OUT('q', 0, '', 32);
	verify_admin($uid, $t, $v);
	$REDIS_0 = new Redis();
	if ($REDIS_0->CONNECT(REDIS_IP_0, REDIS_PORT_0) !== true) exit('Conect REDIS_0 Failed.');
	$REDIS_0->SELECT(REDIS_DB_0);
	switch ($q) {
	case 'process info':
		$REDIS_2 = new Redis();
		if ($REDIS_2->CONNECT(REDIS_IP_2, REDIS_PORT_2) !== true) exit('Conect REDIS_2 Failed.');
		$REDIS_2->SELECT(REDIS_DB_2);
		$arr_data = array();
		$PROCESS_ARRAY = $REDIS_0->MGET(array('ProcessGlobalCount','ProcessGlobalConsume','ProcessMax','ProcessMin','ProcessLimit','KernelVersion','PersistenceStatus', 'PersistenceVersion'));
		$Requests = $REDIS_0->LLEN('TicketListL');
		$TotalProcessed = $PROCESS_ARRAY[0]; 
		$TotalConsume = $PROCESS_ARRAY[1]; 
		$FatalErrors = $REDIS_0->LLEN('ErrorFatal');
		$BadRequests = $REDIS_2->LLEN('BadRequests');
		$ExecuteFailures = $REDIS_0->LLEN('ErrorExecute');
		$PROCESS_MAX= $PROCESS_ARRAY[2]; 
		$PROCESS_MIN = $PROCESS_ARRAY[3]; 
		$PROCESS_LIMIT = $PROCESS_ARRAY[4]; 
		$KERNEL_VERSION = $PROCESS_ARRAY[5]; 
		$PERSISTENCE_STATUS = $PROCESS_ARRAY[6];
		$PERSISTENCE_VERSION = $PROCESS_ARRAY[7]; 
		$arr_data[0] = array((int)$Requests, (int)$TotalProcessed, (int)$TotalConsume, (int)$FatalErrors, (int)$BadRequests, (int)$ExecuteFailures, (int)$PROCESS_MAX, (int)$PROCESS_MIN, (int)$PROCESS_LIMIT, $KERNEL_VERSION, (int)$PERSISTENCE_STATUS, $PERSISTENCE_VERSION);
		$PROCESS_ARRAY = $REDIS_0->SMEMBERS('ProcessList');
		if (count($PROCESS_ARRAY) > 0) {
			foreach ($PROCESS_ARRAY as $PID) {
				$PROCESS_STRUCTURE = $REDIS_0->HGETALL($PID);
				if (count($PROCESS_STRUCTURE) === 11) {
					$arr_data[] = array($PROCESS_STRUCTURE['PID'], $PROCESS_STRUCTURE['Status'], $PROCESS_STRUCTURE['StartTime'], $PROCESS_STRUCTURE['LastResponseTime'], $PROCESS_STRUCTURE['TotalCount'], $PROCESS_STRUCTURE['TotalConsume'], $PROCESS_STRUCTURE['CurrentCount'], $PROCESS_STRUCTURE['PeakCount'], $PROCESS_STRUCTURE['MaxConsume'], $PROCESS_STRUCTURE['MinConsume'], $PROCESS_STRUCTURE['MemoryUsage']);
				}
			}
		}
		$PROCESS_ARRAY = $REDIS_0->ZREVRANGEBYSCORE('SSIDS', '+INF', '-INF', array('withscores'=>true, 'limit'=>array(0, 20))); 
		$arr_data[] = $PROCESS_ARRAY;
		$PROCESS_ARRAY = $REDIS_0->MGET(array('PerformanceCountJS', 'PerformanceConsumeJS', 'PerformanceCount0', 'PerformanceConsume0','PerformanceCount1', 'PerformanceConsume1','PerformanceCount2', 'PerformanceConsume2','PerformanceCount3', 'PerformanceConsume3','PerformanceCount4', 'PerformanceConsume4','PerformanceCount5', 'PerformanceConsume5','PerformanceCount6', 'PerformanceConsume6','PerformanceCount7', 'PerformanceConsume7','PerformanceCount8', 'PerformanceConsume8','PerformanceCount9', 'PerformanceConsume9','PerformanceCount10', 'PerformanceConsume10','PerformanceCount11', 'PerformanceConsume11','PerformanceCount12', 'PerformanceConsume12', 'TotalMemory','UsedMemory','FreeMemory', 'TotalDisk','UsedDisk')); 
		$arr_data[] = $PROCESS_ARRAY;
		echo json_encode($arr_data);
		break;
	case 'process sum':
		$REDIS_2 = new Redis();
		if ($REDIS_2->CONNECT(REDIS_IP_2, REDIS_PORT_2) !== true) exit('Conect REDIS_2 Failed.');
		$REDIS_2->SELECT(REDIS_DB_2);
		$arr_data = array();
		$PROCESS_ARRAY = $REDIS_0->MGET(array('ProcessGlobalCount','ProcessGlobalConsume','ProcessMax','ProcessMin','ProcessLimit','KernelVersion','PersistenceStatus', 'PersistenceVersion'));
		$Requests = $REDIS_0->LLEN('TicketListL');
		$TotalProcessed = $PROCESS_ARRAY[0]; 
		$TotalConsume = $PROCESS_ARRAY[1]; 
		$FatalErrors = $REDIS_0->LLEN('ErrorFatal');
		$BadRequests = $REDIS_2->LLEN('BadRequests');
		$ExecuteFailures = $REDIS_0->LLEN('ErrorExecute');
		$PROCESS_MAX= $PROCESS_ARRAY[2]; 
		$PROCESS_MIN = $PROCESS_ARRAY[3]; 
		$PROCESS_LIMIT = $PROCESS_ARRAY[4]; 
		$KERNEL_VERSION = $PROCESS_ARRAY[5]; 
		$PERSISTENCE_STATUS = $PROCESS_ARRAY[6];
		$PERSISTENCE_VERSION = $PROCESS_ARRAY[7]; 
		$arr_data[0] = array((int)$Requests, (int)$TotalProcessed, (int)$TotalConsume, (int)$FatalErrors, (int)$BadRequests, (int)$ExecuteFailures, (int)$PROCESS_MAX, (int)$PROCESS_MIN, (int)$PROCESS_LIMIT, $KERNEL_VERSION, (int)$PERSISTENCE_STATUS, $PERSISTENCE_VERSION);
		$PROCESS_ARRAY = $REDIS_0->SMEMBERS('ProcessList');
		if (count($PROCESS_ARRAY) > 0) {
			foreach ($PROCESS_ARRAY as $PID) {
				$PROCESS_STRUCTURE = $REDIS_0->HGETALL($PID);
				if (count($PROCESS_STRUCTURE) === 11) {
					$arr_data[] = array($PROCESS_STRUCTURE['PID'], $PROCESS_STRUCTURE['Status'], $PROCESS_STRUCTURE['StartTime'], $PROCESS_STRUCTURE['LastResponseTime'], $PROCESS_STRUCTURE['TotalCount'], $PROCESS_STRUCTURE['TotalConsume'], $PROCESS_STRUCTURE['CurrentCount'], $PROCESS_STRUCTURE['PeakCount'], $PROCESS_STRUCTURE['MaxConsume'], $PROCESS_STRUCTURE['MinConsume'], $PROCESS_STRUCTURE['MemoryUsage']);
				}
			}
		}
		echo json_encode($arr_data);
		break;
	case 'set process':
		$opt = SDATA_OUT('opt', 6, 'EXIT');
		$pid = SDATA_OUT('pid', 0, 'EXIT', 32);
		switch ($opt) {
		case 0:
			$REDIS_0->HSET($pid, 'Status', 0);
			echo $pid . ' is terminated successful!';
			break;
		case 1:
			$REDIS_0->HSET($pid, 'Status', 1);
			echo $pid . ' is running now!';
			break;
		case 2:
			$REDIS_0->HSET($pid, 'Status', 2);
			echo $pid . ' is paused successful!';
			break;
		case 4:
			$PROCESS_MIN = $REDIS_0->GET('ProcessMin');
			if ((int)$pid > 8) {
				echo 'Error: Max Processes is setted up 8 by administrator!';
				exit;
			}
			if ((int)$PROCESS_MIN <= (int)$pid) {
				$REDIS_0->SET('ProcessMax', (int)$pid);
				echo 'Max Processes is ' . $pid . ' now!';
			} else {
				echo 'Error: Max Processes must be larger than Min Processes!';
			}
			break;
		case 5:
			$PROCESS_MAX = $REDIS_0->GET('ProcessMax');
			if ((int)$PROCESS_MAX >= (int)$pid) {
				$REDIS_0->SET('ProcessMin', (int)$pid);
				echo 'Min Processes is ' . $pid . ' now!';
			} else {
				echo 'Error: Min Processes must be less than Max Processes!';
			}
			break;
		case 13:
			$PROCESS_COUNT = $REDIS_0->SCARD('ProcessList');
			$PROCESS_MAX = $REDIS_0->GET('ProcessMax');
			if ($PROCESS_COUNT < $PROCESS_MAX) {
				pclose(popen('php -f ' . __DIR__ . '/kernel.php &', 'r'));
				echo 'A new process is running now!';
			} else {
				echo 'Error: The count of process exceeds maximum limit.';
			}
			break;
		case 14:
			$REDIS_0->SET('ProcessLimit', 1);
			$PROCESS_COUNT = $REDIS_0->SCARD('ProcessList');
			if ((int)$PROCESS_COUNT > 0) {
				$PROCESS_ARRAY = $REDIS_0->LRANGE('ProcessList',0,($PROCESS_COUNT - 1));
				for ($i = 0; $i < $PROCESS_COUNT; $i++) {
					$PID = $PROCESS_ARRAY[$i];
					$REDIS_0->LSET($PID, 1, 0);
				}
			}
			sleep(3);
			$PROCESS_ARRAY = $REDIS_0->KEYS('PID*');
			$PROCESS_COUNT = count($PROCESS_ARRAY);
			if ($PROCESS_COUNT > 0) for ($i = 0; $i < $PROCESS_COUNT; $i++) {
				$REDIS_0->DEL($PROCESS_ARRAY[$i]);
			}
			$REDIS_0->DEL('ProcessList');
			echo 'This host is disabled now!';
			break;
		case 15:
			$REDIS_0->SET('ProcessLimit', 0);
			$PROCESS_MAX = $REDIS_0->GET('ProcessMax');
			for ($i = 0; $i < (int)$PROCESS_MAX; $i++) {
				pclose(popen('php -f ' . __DIR__ . '/kernel.php &', 'r'));
			}
			echo 'This host is enabled now!';
			break;
		case 20:
			$REDIS_0->SET('PersistenceStatus', 1);
			sleep(3);
			echo 'Persistence is disabled now!';
			break;
		case 21:
			$REDIS_0->SET('PersistenceStatus', 0);
			$REDIS_0->DEL('PersistenceMutualExclusion');
			pclose(popen('php -f ' . __DIR__ . '/persistence.php &', 'r'));
			echo 'Persistence is enabled now!';
			break;
		case 30:
			$REDIS_0->SET('ProcessLimit', 1);
			$PROCESS_ARRAY = $REDIS_0->SMEMBERS('ProcessList');
			if (count($PROCESS_ARRAY) > 0) {
				foreach ($PROCESS_ARRAY as $PID) {
					$REDIS_0->HSET($PID, 'Status', 0);
				}
			}
			sleep(3);
			$PROCESS_ARRAY = $REDIS_0->KEYS('PID*');
			if (count($PROCESS_ARRAY) > 0) {
				foreach ($PROCESS_ARRAY as $PID) $REDIS_0->DEL($PID);
			}
			$REDIS_0->DEL('ProcessList');
			$REDIS_0->SET('PersistenceStatus', 1);
			sleep(3);
			echo 'This host is disabled now!';
			break;
		case 31:
			$REDIS_0->SET('ProcessLimit', 0);
			$PROCESS_MAX = (int)$REDIS_0->GET('ProcessMax');
			for ($i = 0; $i < $PROCESS_MAX; $i++) {
				pclose(popen('php -f ' . __DIR__ . '/kernel.php &', 'r'));
			}
			$REDIS_0->SET('PersistenceStatus', 0);
			$REDIS_0->DEL('PersistenceMutualExclusion');
			pclose(popen('php -f ' . __DIR__ . '/persistence.php &', 'r'));
			echo 'This host is enabled now!';
			break;
		case 90:
			$REDIS_0->DEL('PerformanceCountJS', 'PerformanceConsumeJS','PerformanceCount0', 'PerformanceConsume0','PerformanceCount1', 'PerformanceConsume1','PerformanceCount2', 'PerformanceConsume2','PerformanceCount3', 'PerformanceConsume3','PerformanceCount4', 'PerformanceConsume4','PerformanceCount5', 'PerformanceConsume5','PerformanceCount6', 'PerformanceConsume6','PerformanceCount7', 'PerformanceConsume7','PerformanceCount8', 'PerformanceConsume8','PerformanceCount9', 'PerformanceConsume9','PerformanceCount10', 'PerformanceConsume10','PerformanceCount11', 'PerformanceConsume11','PerformanceCount12', 'PerformanceConsume12','ProcessGlobalCount','ProcessGlobalConsume', 'MissedCA', 'MissedVA', 'MissedVC', 'MissedVID', 'MissedIND');
			$REDIS_0->DEL('SSIDS');
			echo 'Clean all log successfully!';
			break;
		case 91:
			$REDIS = new Redis();
			$REDIS->CONNECT(REDIS_IP_2, REDIS_PORT_2) !== true AND exit;
			$REDIS->SELECT(REDIS_DB_2);
			$RETURN_ARRAY = $REDIS->KEYS('1*');
			$REDIS->DEL($RETURN_ARRAY);
			echo 'Clean settings cache successfully!';
			break;
		case 99:
			$REDIS_0->SET('ProcessLimit', 1);
			$PROCESS_ARRAY = $REDIS_0->SMEMBERS('ProcessList');
			if (count($PROCESS_ARRAY) > 0) {
				foreach ($PROCESS_ARRAY as $PID) {
					$REDIS_0->HSET($PID, 'Status', 0);
				}
			}
			$REDIS_0->SET('PersistenceStatus', 1);
			sleep(3);
			$PROCESS_ARRAY = $REDIS_0->KEYS('PID*');
			if (count($PROCESS_ARRAY) > 0) {
				foreach ($PROCESS_ARRAY as $PID) $REDIS_0->DEL($PID);
			}
			$REDIS_0->DEL('ProcessList');
			$REDIS_ARR = $REDIS_0->SMEMBERS('DayPeriod');
			if (count($REDIS_ARR) > 0) $REDIS_0->DEL($REDIS_ARR);
			$REDIS_0->DEL('DayPeriod', 'TimeLine');
			$REDIS_1 = new Redis();
			if ($REDIS_1->CONNECT(REDIS_IP_1, REDIS_PORT_1) !== true) exit('Clean today data failed from redis 1.');
			$REDIS_1->SELECT(REDIS_DB_1);
			$REDIS_1->FLUSHDB();
			$REDIS_3 = new Redis();
			if ($REDIS_3->CONNECT(REDIS_IP_3, REDIS_PORT_3) !== true) exit('Clean today data failed from redis 3.');
			$REDIS_3->SELECT(REDIS_DB_3);
			$REDIS_3->FLUSHDB();
			$DB = con_db(DB_HOST_LOCAL, ROOT_USER_LOCAL, ROOT_PASSWORD_LOCAL);
			if ($DB === false) exit('Clean today data failed from connecting database');
			foreach($REDIS_ARR AS $redis_tb) {
				$TMP	 = explode('-', $redis_tb);
				$SID	 = $TMP[0];
				$TB_DATE = $TMP[1];
				if (use_db($DB, 'site' . $SID)) {
					$sql = "DROP TABLE log{$TB_DATE}";
					mysqli_query($DB, $sql);
					$sql = "DROP TABLE act{$TB_DATE}";
					mysqli_query($DB, $sql);
					$sql = "DROP TABLE clk{$TB_DATE}";
					mysqli_query($DB, $sql);
					$sql = "DROP TABLE vid{$TB_DATE}";
					mysqli_query($DB, $sql);
					$sql = "DROP TABLE ind{$TB_DATE}";
					mysqli_query($DB, $sql);
				}
			}
			echo 'Clean today data successfully!';
			break;
		}
		break;
	case 'error':
		$REDIS = $REDIS_0;
		$opt = SDATA_OUT('opt', 6, 'EXIT');
		switch ($opt) {
		case 1:
			$error_type = 'ErrorExecute';
			break;
		case 2:
			$error_type = 'ErrorFatal';
			break;
		case 3:
			$REDIS = new Redis();
			if ($REDIS->CONNECT(REDIS_IP_2, REDIS_PORT_2) !== true) exit('Conect REDIS_2 Failed.');
			$REDIS->SELECT(REDIS_DB_2);
			$error_type = 'BadRequests';
			break;
		case 101:
			$error_type = 'ErrorExecute';
			break;
		case 102:
			$error_type = 'ErrorFatal';
			break;
		case 103:
			$REDIS = new Redis();
			if ($REDIS->CONNECT(REDIS_IP_2, REDIS_PORT_2) !== true) exit('Conect REDIS_2 Failed.');
			$REDIS->SELECT(REDIS_DB_2);
			$error_type = 'BadRequests';
			break;
		}
		if ($opt > 100) {
			if ($REDIS->DEL($error_type) > 0) {
				echo 'Delete successfully!';
			} else {
				echo 'Delete failed!';
			}
			exit;
		}
		$start = SDATA_OUT('start', 6, 0);
		$row = 20;
		$arr_data = array();
		$PROCESS_COUNT = $REDIS->LLEN($error_type);
		if ($PROCESS_COUNT > 0) {
			if ($start === -1 || $start > $PROCESS_COUNT) $start = ($PROCESS_COUNT > $row ? $PROCESS_COUNT - $row : 0);
			$arr_data = $REDIS->LRANGE($error_type, $start, ($start + $row - 1));
		} else {
			$start = 0;
		}
		$arr_data[] = array($PROCESS_COUNT, $start);
		echo json_encode($arr_data);
		break;
	}
exit;
function SDATA_OUT($key, $opt, $def, $maxL=0, $minL=0) {
		if (isset($_GET[$key])) {
			$val = $_GET[$key];
		} else {
			if ($def === 'EXIT') {
				exit;
			} else {
				return $def;
			}
		}
		switch ($opt) {
		case 0:
			$mval = filter_var($val, FILTER_SANITIZE_STRING);
			if (strlen($mval) !== strlen($val)) {
				return '';
			} else {
				if (strlen($val) > $maxL) {
					return substr($val, 0, $maxL);
				} else {
					return $val;
				}
			}
		case 4:
			$mval = filter_var($val, FILTER_SANITIZE_STRING);
			if (strlen($mval) === $maxL) {
				return $val;
			} else {
				exit;
			}
		case 6:
			$tmp = (int)$val;
			if ((string)$tmp !== (string)$val) {
				exit;
			} else {
				return $tmp;
			}
		}
		return NULL;
}
function verify_admin($uid, $t, $v) {
		$n = time();
		if ($t < $n) exit;
		$matchvisa = md5($uid . $t . ENCODE_FACTOR . '4');
		if ($v === $matchvisa) return true;
		exit;
}
function con_db($host, $user, $pw) {
		$con = mysqli_connect($host,$user,$pw);
		if (mysqli_connect_errno($con)) return false;
		return $con;
}
function use_db(&$con, $db) {
		$db_selected = mysqli_select_db($con, $db);
		if ($db_selected) return true;
		return false;
}


?>

================================================
FILE: common.php
================================================
<?php
/*!
* ATTENTION: THIS FREE LICENSE IS ONLY FOR PERSONAL NON-COMMERCIAL USER. FOR COMMERCIAL PURPOSES, PLEASE PURCHASE A COMMERCIAL LICENSE! *
* module: Centcount Analytics Free Common PHP Code *
* version: 1.00 Free *
* author: WM Jonssen *
* date: 04/19/2018 *
* copyright 2015-2018 WM Jonssen <wm.jonssen@gmail.com> - All rights reserved.*
* license: Dual licensed under the Free License and Commercial License. *
* https://www.centcount.com *
*/

isset($_SESSION['admin']) || die(header('Location: relogin.php?tip=Session has expired, Please re-login.'));
function get_guide_menu_html() {
	$menu_html = '<div id="accountmenu" class="popup"><span>' . $GLOBALS['USER'] . '</span>';	
	if ($_SESSION['admin'] == 2 || $_SESSION['admin'] == 4) {
		$menu_html .= '<a href="manager.php?id=' . $GLOBALS['USERID'] . '&siteid=' . $GLOBALS['SITEID'] . '&menu=Settings&action=Settings">' . $GLOBALS['language']['guideSettings'] . '</a>';
	} else if ($_SESSION['admin'] == 1 || $_SESSION['admin'] == 0) {
		$menu_html .= '<a href="login.php">' . $GLOBALS['language']['guideLogin'] . '</a>';
	}
	$menu_html .= '<a href="manager.php?id=' . $GLOBALS['USERID'] . '&siteid=' . $GLOBALS['SITEID'] . '&menu=Settings&action=About CA"  name="About CA">' . $GLOBALS['language']['submenuSettingsAboutCA'] . '</a>';
	$menu_html .= '<a href="logout.php">' . $GLOBALS['language']['guideLogOut'] . '</a>
			</div>';
	$menu_html .= '<div id="languagemenu" class="popup">
				<a href="manager.php?id=' . $GLOBALS['USERID'] . '&siteid=' . $GLOBALS['SITEID'] . '&menu=' . $GLOBALS['MENU'] . '&action=' . $GLOBALS['ACTION'] . '&lan=en-US">English</a>
				<a href="manager.php?id=' . $GLOBALS['USERID'] . '&siteid=' . $GLOBALS['SITEID'] . '&menu=' . $GLOBALS['MENU'] . '&action=' . $GLOBALS['ACTION'] . '&lan=zh-CN">简体中文</a>
				<a href="manager.php?id=' . $GLOBALS['USERID'] . '&siteid=' . $GLOBALS['SITEID'] . '&menu=' . $GLOBALS['MENU'] . '&action=' . $GLOBALS['ACTION'] . '&lan=zh-TW">繁體中文</a>
				<a href="manager.php?id=' . $GLOBALS['USERID'] . '&siteid=' . $GLOBALS['SITEID'] . '&menu=' . $GLOBALS['MENU'] . '&action=' . $GLOBALS['ACTION'] . '&lan=de-DE">Deutsch</a>
				<a href="manager.php?id=' . $GLOBALS['USERID'] . '&siteid=' . $GLOBALS['SITEID'] . '&menu=' . $GLOBALS['MENU'] . '&action=' . $GLOBALS['ACTION'] . '&lan=ja-JP">日本語</a>
			</div>';
	return $menu_html;
}
function get_side_menu_html() {
	$menu_url =  'manager.php?id=' . $GLOBALS['USERID'] . '&siteid=' . $GLOBALS['SITEID'];
	return '<div id="leftbox" class="body_left_side">
		<div id="side_menu_bar" class="div_side_menu_bar">
			<div class="div_logo">
				<a href="#" onclick="switch_menu()"><img class="img_logo" src="images/logo-free.png" alt="Centcount Analytics Professional Pro Logo" /></a>
			</div>
			<div id="side_menu" class="div_side_menu">
			<ul style="display:block;">
				<li><a class="'. ($GLOBALS['MENU']=='Dashboard' ? 'menu_shown' : 'menu_hidden').'" onclick="menu_click(this)" name="Dashboard">'.$GLOBALS['language']['menuDashboard'].'</a>
					<ul '. ($GLOBALS['MENU']=='Dashboard' ? 'style="display:block;"' : '').'>
						<li><a class="submenubtn" href="'.$menu_url.'&menu=Dashboard&action=Dashboard" name="Dashboard">'.$GLOBALS['language']['submenuDashboardDashboard'].'</a></li>
					</ul>
				</li>
				<li><a class="'. ($GLOBALS['MENU']=='Visitor' ? 'menu_shown' : 'menu_hidden').'" onclick="menu_click(this)" name="Visitor">'.$GLOBALS['language']['menuVisitor'].'</a>
					<ul '. ($GLOBALS['MENU']=='Visitor' ? 'style="display:block;"' : '').'>
						<li><a class="submenubtn" href="'.$menu_url.'&menu=Visitor&action=Visits Overview" name="Visits Overview">'.$GLOBALS['language']['submenuVisitorVisitsOverview'].'</a></li>
						<li><a class="submenubtn" href="'.$menu_url.'&menu=Visitor&action=Day Trend" name="Day Trend">'.$GLOBALS['language']['submenuVisitorDayTrend'].'</a></li>
						<li><a class="submenubtn" href="'.$menu_url.'&menu=Visitor&action=Realtime Visitor" name="Realtime Visitor">'.$GLOBALS['language']['submenuVisitorRealtimeVisitor'].'</a></li>
						<li><a class="submenubtn" href="'.$menu_url.'&menu=Visitor&action=Visitor Log" name="Visitor Log">'.$GLOBALS['language']['submenuVisitorVisitorLog'].'</a></li>
						<li><a class="submenubtn" href="'.$menu_url.'&menu=Visitor&action=Robot Log" name="Robot Log">'.$GLOBALS['language']['submenuVisitorRobotLog'].'</a></li>
						<li><a class="submenubtn" href="'.$menu_url.'&menu=Visitor&action=Devices" name="Devices">'.$GLOBALS['language']['submenuVisitorDevices'].'</a></li>
						<li><a class="submenubtn" href="'.$menu_url.'&menu=Visitor&action=Software" name="Software">'.$GLOBALS['language']['submenuVisitorSoftware'].'</a></li>
						<li><a class="submenubtn" href="'.$menu_url.'&menu=Visitor&action=Locations" name="Locations">'.$GLOBALS['language']['submenuVisitorLocations'].'</a></li>
						<li><a class="submenubtn" href="'.$menu_url.'&menu=Visitor&action=Times" name="Times">'.$GLOBALS['language']['submenuVisitorTimes'].'</a></li>
						<li><a class="submenubtn" href="'.$menu_url.'&menu=Visitor&action=Visitor Map" name="Visitor Map">'.$GLOBALS['language']['submenuVisitorVisitorMap'].'</a></li>
						<li><a class="submenubtn" href="'.$menu_url.'&menu=Visitor&action=Active Visitor" name="Active Visitor">'.$GLOBALS['language']['submenuVisitorActiveVisitor'].'</a></li>
					</ul>
				</li>
				<li><a class="'. ($GLOBALS['MENU']=='Action' ? 'menu_shown' : 'menu_hidden').'" onclick="menu_click(this)" name="Action">'.$GLOBALS['language']['menuAction'].'</a>
					<ul '. ($GLOBALS['MENU']=='Action' ? 'style="display:block;"' : '').'>
						<li><a class="submenubtn" href="'.$menu_url.'&menu=Action&action=All Pages" name="All Pages">'.$GLOBALS['language']['submenuActionAllPages'].'</a></li>
						<li><a class="submenubtn" href="'.$menu_url.'&menu=Action&action=Entry Pages" name="Entry Pages">'.$GLOBALS['language']['submenuActionEntryPages'].'</a></li>
						<li><a class="submenubtn" href="'.$menu_url.'&menu=Action&action=Bounce Pages" name="Bounce Pages">'.$GLOBALS['language']['submenuActionBouncePages'].'</a></li>
						<li><a class="submenubtn" href="'.$menu_url.'&menu=Action&action=Exit Pages" name="Exit Pages">'.$GLOBALS['language']['submenuActionExitPages'].'</a></li>
						<li><a class="submenubtn" href="'.$menu_url.'&menu=Action&action=Robot Crawled Pages" name="Robot Crawled Pages">'.$GLOBALS['language']['submenuActionRobotCrawledPages'].'</a></li>
					</ul>
				</li>
				<li><a class="'. ($GLOBALS['MENU']=='Referrer' ? 'menu_shown' : 'menu_hidden').'" onclick="menu_click(this)" name="Referrer">'.$GLOBALS['language']['menuReferrer'].'</a>
					<ul '. ($GLOBALS['MENU']=='Referrer' ? 'style="display:block;"' : '').'>
						<li><a class="submenubtn" href="'.$menu_url.'&menu=Referrer&action=All Referrers" name="All Referrers">'.$GLOBALS['language']['submenuReferrerAllReferrers'].'</a></li>
						<li><a class="submenubtn" href="'.$menu_url.'&menu=Referrer&action=Search Engines" name="Search Engines">'.$GLOBALS['language']['submenuReferrerSearchEngines'].'</a></li>
						<li><a class="submenubtn" href="'.$menu_url.'&menu=Referrer&action=Websites" name="Websites">'.$GLOBALS['language']['submenuReferrerWebsites'].'</a></li>
						<li><a class="submenubtn" href="'.$menu_url.'&menu=Referrer&action=Channels" name="Channels">'.$GLOBALS['language']['submenuReferrerChannels'].'</a></li>
					</ul>
				</li>'.
				($_SESSION['admin'] > 1 ? 
				'<li><a class="'. ($GLOBALS['MENU']=='Sites' ? 'menu_shown' : 'menu_hidden').'" onclick="menu_click(this)" name="Sites">'.$GLOBALS['language']['menuManageSites'].'</a>
					<ul '. ($GLOBALS['MENU']=='Sites' ? 'style="display:block;"' : '').'>
						<li><a class="submenubtn" href="'.$menu_url.'&menu=Sites&action=All Sites"  name="All Sites">'.$GLOBALS['language']['submenuSitesAllSites'].'</a></li>
						<li><a class="submenubtn" href="'.$menu_url.'&menu=Sites&action=Add Site"  name="Add Site">'.$GLOBALS['language']['submenuSitesAddSite'].'</a></li>
						<li><a class="submenubtn" href="'.$menu_url.'&menu=Sites&action=Site Configuration"  name="Site Configuration">'.$GLOBALS['language']['submenuSitesSiteConfiguration'].'</a></li>
						<li><a class="submenubtn" href="'.$menu_url.'&menu=Sites&action=Get JS Code"  name="Get JS Code">'.$GLOBALS['language']['submenuSitesGetJSCode'].'</a></li>
						<li><a class="submenubtn" href="'.$menu_url.'&menu=Sites&action=Domains"  name="Domains">'.$GLOBALS['language']['submenuSitesDomains'].'</a></li>
						<li><a class="submenubtn" href="'.$menu_url.'&menu=Sites&action=Blocked Sites"  name="Blocked Sites">'.$GLOBALS['language']['submenuSitesBlockedSites'].'</a></li>
						<li><a class="submenubtn" href="'.$menu_url.'&menu=Sites&action=Blocked Pages"  name="Blocked Pages">'.$GLOBALS['language']['submenuSitesBlockedPages'].'</a></li>
						<li><a class="submenubtn" href="'.$menu_url.'&menu=Sites&action=Blocked IPs"  name="Blocked IPs">'.$GLOBALS['language']['submenuSitesBlockedIPs'].'</a></li>
						<li><a class="submenubtn" href="'.$menu_url.'&menu=Sites&action=Blocked IDs"  name="Blocked IDs">'.$GLOBALS['language']['submenuSitesBlockedIDs'].'</a></li>
						<li><a class="submenubtn" href="'.$menu_url.'&menu=Sites&action=Filtered Domains"  name="Filtered Domains">'.$GLOBALS['language']['submenuSitesFilteredDomains'].'</a></li>
						<li><a class="submenubtn" href="'.$menu_url.'&menu=Sites&action=Visitor Password"  name="Visitor Password">'.$GLOBALS['language']['submenuSitesVisitorPassword'].'</a></li>
						<li><a class="submenubtn" href="'.$menu_url.'&menu=Sites&action=Delete Site"  name="Delete Site">'.$GLOBALS['language']['submenuSitesDeleteSite'].'</a></li>
					</ul>
				</li>' : ''). 
				($_SESSION['admin'] == 4 ? '
				<li><a class="'. ($GLOBALS['MENU']=='Hosts' ? 'menu_shown' : 'menu_hidden').'" onclick="menu_click(this)" name="Hosts">'.$GLOBALS['language']['menuManageHosts'].'</a>
					<ul '. ($GLOBALS['MENU']=='Hosts' ? 'style="display:block;"' : '').'>
						<li><a class="submenubtn" href="'.$menu_url.'&menu=Hosts&action=Host Status" name="Host Status">'.$GLOBALS['language']['submenuHostsHostStatus'].'</a></li>
					</ul>
				</li>' : '').
				'<li><a class="'. ($GLOBALS['MENU']=='Language' ? 'menu_shown' : 'menu_hidden').'" onclick="menu_click(this)" name="Language">'.$GLOBALS['language']['menuLanguage'].'</a>
					<ul '. ($GLOBALS['MENU']=='Language' ? 'style="display:block;"' : '').'>
						<li><a href="manager.php?id=' . $GLOBALS['USERID'] . '&siteid=' . $GLOBALS['SITEID'] . '&menu=' . $GLOBALS['MENU'] . '&action=' . $GLOBALS['ACTION'] . '&lan=en-US">English</a></li>
						<li><a href="manager.php?id=' . $GLOBALS['USERID'] . '&siteid=' . $GLOBALS['SITEID'] . '&menu=' . $GLOBALS['MENU'] . '&action=' . $GLOBALS['ACTION'] . '&lan=zh-CN">简体中文</a></li>
						<li><a href="manager.php?id=' . $GLOBALS['USERID'] . '&siteid=' . $GLOBALS['SITEID'] . '&menu=' . $GLOBALS['MENU'] . '&action=' . $GLOBALS['ACTION'] . '&lan=zh-TW">繁體中文</a></li>
						<li><a href="manager.php?id=' . $GLOBALS['USERID'] . '&siteid=' . $GLOBALS['SITEID'] . '&menu=' . $GLOBALS['MENU'] . '&action=' . $GLOBALS['ACTION'] . '&lan=de-DE">Deutsch</a></li>
						<li><a href="manager.php?id=' . $GLOBALS['USERID'] . '&siteid=' . $GLOBALS['SITEID'] . '&menu=' . $GLOBALS['MENU'] . '&action=' . $GLOBALS['ACTION'] . '&lan=ja-JP">日本語</a></li>
					</ul>
				</li>
				<li><a class="'. ($GLOBALS['MENU']=='Settings' ? 'menu_shown' : 'menu_hidden').'" onclick="menu_click(this)" name="Settings">'.$GLOBALS['language']['menuSettings'].'</a>
					<ul '. ($GLOBALS['MENU']=='Settings' ? 'style="display:block;"' : '').'>'.
						($_SESSION['admin'] == 2 || $_SESSION['admin'] == 4 ? 
						'<li><a href="manager.php?id=' . $GLOBALS['USERID'] . '&siteid=' . $GLOBALS['SITEID'] . '&menu=Settings&action=Settings">' . $GLOBALS['language']['guideSettings'] . '</a></li>' : 
						'<li><a href="login.php">' . $GLOBALS['language']['guideLogin'] . '</a></li>').
						'<li><a href="https://www.centcount.com/doc.php" target="_blank" title="Help" alt="Help">' . $GLOBALS['language']['guideDoc'] . '</a>
						<li><a href="manager.php?id=' . $GLOBALS['USERID'] . '&siteid=' . $GLOBALS['SITEID'] . '&menu=Settings&action=About CA"  name="About CA">' . $GLOBALS['language']['submenuSettingsAboutCA'] . '</a></li>
						<li><a href="logout.php">' . $GLOBALS['language']['guideLogOut'] . '</a></li>
					</ul>
				</li>
			</ul>
			</div>
			<div id="copyright" class="div_copyright">
				Powered by <a href="https://www.centcount.com">Centcount Analytics</a>
			</div>
		</div>
		<div id="hidebtn" class="div_side_menu_hide_btn" onclick="switch_menu()">
			<div class="title">
				'.$GLOBALS['language']['submenu'.$GLOBALS['MENU']. str_replace(' ', '', $GLOBALS['ACTION'])].'
			</div>
		</div>
	</div>';
}
function get_sites_menu_html() {
		$i = count($GLOBALS['SITES']);
		$sn = '';
		if ($i) {	
			if ($_SESSION['admin'] == 2 || $_SESSION['admin'] == 4) {
				for ($row = 0; $row < $i; $row++) {
					if (empty($GLOBALS['SITEID'])) $GLOBALS['SITEID'] = $GLOBALS['SITES'][$row]['SiteID'];
					if ($GLOBALS['SITES'][$row]['SiteID'] == $GLOBALS['SITEID']) {
						$sn .= '<a class="active">' . $GLOBALS['SITES'][$row]['SiteName'] . '</a>';
					} else {
						$sn .= '<a onclick="selectSite(' . $GLOBALS['SITES'][$row]['SiteID'] . ')">' . $GLOBALS['SITES'][$row]['SiteName'] . '</a>';
					}
				}
				return $sn;
			} else if ($_SESSION['admin'] < 2) {
				for ($row = 0; $row < $i; $row++) {
					if ($GLOBALS['SITES'][$row]['SiteID'] == $GLOBALS['SITEID']) {
						$sn .= '<a class="active">' . $GLOBALS['SITES'][$row]['SiteName'] . '</a>';
						break;
					}
				}
				return $sn;
			}
		}
		return '';
}
function get_hosts_menu_html() {
		$i = count($GLOBALS['HOSTS']);
		$sn = '';
		if ($i) {	
			if ($_SESSION['admin'] == 1 || $_SESSION['admin'] == 4) {
				for ($row = 0; $row < $i; $row++) {
					if ($GLOBALS['HOSTS'][$row]['Domain'] == $GLOBALS['DOMAIN_NAME']) {
						$sn .= '<a class="active">' . $GLOBALS['HOSTS'][$row]['Hostname'] . '</a>';
						$_SESSION['HOSTNAME'] = $GLOBALS['HOSTS'][$row]['Hostname'];
					} else {
						$sn .= '<a onclick="selectHost(\'' . $GLOBALS['HOSTS'][$row]['Domain'] . '\')">' . $GLOBALS['HOSTS'][$row]['Hostname'] . '</a>';
					}
				}
				return $sn;
			} 
		}
		return '';
}
function get_option_html() {
		switch($GLOBALS['MENU']) {
		case 'Settings':
			return '';
			break;
		case 'Hosts':
			switch($GLOBALS['ACTION']) {
			default:
			case 'Hosts':
			case 'Add Host':
				return '';
				break;
			case 'Host Status':
				return '
					<div class="frameoptionsites">
					<div id="option" class="frameoption"> 
						<div class="d_clone"> 
							<div id="sites" class="d_frame" onclick="DropDown(this, \'hostsmenu\')"> 
								<div class="dd_title">'. $GLOBALS['indicator']['HOST'] .' : ' . $_SESSION['HOSTNAME'] . '</div> 
								<div id="hostsmenu" class="dd_body"> 
									' . get_hosts_menu_html() . ' 
								</div> 
							</div> 
						</div>
						<div id="refresh" class="d_refresh" onclick="RefreshPage()" ></div> 
					</div></div>';
				break;
			}
			break;	
		}
		if (empty($GLOBALS['SITEID'])) return '<div class="framespace"></div>';
		return '
			<div class="frameoptionsites">
				<div id="option" class="frameoption"> 
					<div class="d_clone"> 
						<div id="sites" class="d_frame" onclick="DropDown(this, \'sitesmenu\')"> 
							<div class="dd_title">'. $GLOBALS['indicator']['WEBSITE'] .' : ' . $GLOBALS['SITENAME'] . '</div> 
							<div id="sitesmenu" class="dd_body"> 
								' . get_sites_menu_html() . ' 
							</div> 
						</div> 
					</div> 
					<div class="d_clone"> 
						<div id="period" class="d_frame"> 
							<div id="period_date" class="dp_title" onClick="from_date.Draw();to_date.Draw();from_dp.Status();"><span id="period_from">' . $GLOBALS['TODAY'] . '</span><span id="period_to">' . $GLOBALS['TODAY'] . '</span></div>
							<div class="d_body"> 
								<div style="width:auto; height:auto; line-height:22px; margin-right:25px;">
									<a href="javascript:SetPeriod(0);" style="margin-right:5px; color:#555;">'. $GLOBALS['indicator']['Today'] .' </a>
									<a href="javascript:SetPeriod(1);" style="margin-left:5px; margin-right:5px; color:#555;">'. $GLOBALS['indicator']['Yesterday'] .' </a>
									<a href="javascript:SetPeriod(2);" style="margin-left:5px; margin-right:5px; color:#555;">'. $GLOBALS['indicator']['Past 7 Days'] .' </a>
									<a href="javascript:SetPeriod(3);" style="margin-left:5px; margin-right:5px; color:#555;">'. $GLOBALS['indicator']['Past 30 Days'] .' </a>
									<a href="javascript:SetPeriod(4);" style="margin-left:5px; margin-right:5px; color:#555;">'. $GLOBALS['indicator']['Last Week'] .' </a>
									<a href="javascript:SetPeriod(5);" style="margin-left:5px; color:#555;">'. $GLOBALS['indicator']['Last Month'] .' </a>
								</div>
								<div class="c_body"> 
									<div class="c_box"> 
										<div class="c_year"> 
											<ul> 
												<li><a id="last_from" class="last" onclick="from_date.LastMonth()"></a></li> 
												<li><a id="year_from" class="year" onclick="selectButton(this)">2001</a> 
													<ul id="yearlist_from"> 
														??? 
													</ul> 
												</li> 
												<li><a id="month_from" class="year" onclick="selectButton(this)">01</a> 
													<ul id="monthlist_from"> 
														??? 
													</ul> 
												</li> 
												<li><a id="next_from" class="next" onclick="from_date.NextMonth()"></a></li> 
											</ul> 
										</div> 
									</div> 
									<div id="weekday_from" class="c_box"> 
										<weekday>'. $GLOBALS['indicator']['Sun'] .'</weekday> 
										<weekday>'. $GLOBALS['indicator']['Mon'] .'</weekday> 
										<weekday>'. $GLOBALS['indicator']['Tue'] .'</weekday> 
										<weekday>'. $GLOBALS['indicator']['Wed'] .'</weekday> 
										<weekday>'. $GLOBALS['indicator']['Thu'] .'</weekday> 
										<weekday>'. $GLOBALS['indicator']['Fri'] .'</weekday> 
										<weekday>'. $GLOBALS['indicator']['Sat'] .'</weekday> 
									</div> 
									<div id="day_from" class="c_box" style="height:180px;"> 
										??? 
									</div> 
								</div>
								<div class="c_body"> 
									<div class="c_box"> 
										<div class="c_year"> 
											<ul> 
												<li><a id="last_to" class="last" onclick="to_date.LastMonth()"></a></li> 
												<li><a id="year_to" class="year" onclick="selectButton(this)">2001</a> 
													<ul id="yearlist_to"> 
														
													</ul> 
												</li> 
												<li><a id="month_to" class="year" onclick="selectButton(this)">01</a> 
													<ul id="monthlist_to"> 
														
													</ul> 
												</li> 
												<li><a id="next_to" class="next" onclick="to_date.NextMonth()"></a></li> 
											</ul> 
										</div> 
									</div> 
									<div id="weekday_to" class="c_box"> 
										<weekday>'. $GLOBALS['indicator']['Sun'] .'</weekday> 
										<weekday>'. $GLOBALS['indicator']['Mon'] .'</weekday> 
										<weekday>'. $GLOBALS['indicator']['Tue'] .'</weekday> 
										<weekday>'. $GLOBALS['indicator']['Wed'] .'</weekday> 
										<weekday>'. $GLOBALS['indicator']['Thu'] .'</weekday> 
										<weekday>'. $GLOBALS['indicator']['Fri'] .'</weekday> 
										<weekday>'. $GLOBALS['indicator']['Sat'] .'</weekday> 
									</div> 
									<div id="day_to" class="c_box" style="height:180px;"> 
										??? 
									</div> 
								</div>
								<div style="width:100%; height:1px; float:none;"></div>
								<div style="width:100%; height:auto; margin-right:20px; float:left;">
									<a href="javascript:from_dp.Status();SetDay(0);" class="d_btn">OK</a>
									<a href="javascript:from_dp.Status();SetDay(1);" class="d_btn">Cancel</a>
								</div>
							</div>
						</div> 
					</div>
					<div id="refresh" class="d_refresh" onclick="RefreshPage()" ></div> 
				</div>
			</div>';
}
function SDATA($val, $opt, $maxL=0, $minL=0, $con=0) {
	if ($con) {
		$val = rawurldecode($val);
		$encoding = mb_detect_encoding($val, 'UTF-8, GB18030', true);
		switch ($encoding) {
		case 'UTF-8':
			break;
		case 'GB18030':
			$val = mb_convert_encoding($val, 'UTF-8', 'GB18030');
			break;
		default:
			$val = mb_convert_encoding($val, 'UTF-8', 'UTF-8');
			break;
		}
		if (mb_detect_encoding($val, 'UTF-8', true) === false) return ''; 
	}
	switch ($opt) {
	case 0:
		if ($con) $val = mysqli_real_escape_string($con, $val);
		$mval = filter_var($val, FILTER_SANITIZE_STRING);
		if (mb_strlen($mval,'UTF-8') !== mb_strlen($val,'UTF-8')) {
			return '';
		} else {
			if (mb_strlen($val,'UTF-8') > $maxL) {
				return mb_substr($val, 0, $maxL, 'UTF-8');
			} else {
				return $val;
			}
		}
	case 1:
		$val = filter_var($val, FILTER_SANITIZE_STRING);
		if ($con) $val = mysqli_real_escape_string($con, $val);
		if (mb_strlen($val,'UTF-8') > $maxL) {
			return mb_substr($val, 0, $maxL, 'UTF-8');
		} else {
			return $val;
		}
	case 2:
		$tmp = (int)$val;
		return ($tmp > $maxL || $tmp < $minL) ? 0 : $tmp;
	case 3:
		$mval = filter_var($val, FILTER_SANITIZE_NUMBER_FLOAT, FILTER_FLAG_ALLOW_FRACTION + FILTER_FLAG_ALLOW_THOUSAND);
		if (strlen($mval) !== strlen($val)) {
			return '';
		} else {
			if (strlen($val) > $maxL) {
				return '';
			} else {
				return $val;
			}
		}
	case 4:
		$mval = filter_var($val, FILTER_SANITIZE_STRING);
		if ($con) $mval = mysqli_real_escape_string($con, $mval);
		if (strlen($mval) === $maxL) {
			return $val;
		} else {
			exit;
		}
	case 5:
		$mval = filter_var($val, FILTER_VALIDATE_EMAIL);
		if ($con) $mval = mysqli_real_escape_string($con, $mval);
		if (strlen($mval) !== strlen($val)) {
			return '';
		} else {
			if (strlen($val) > $maxL) {
				return '';
			} else {
				return $val;
			}
		}
	case 6:
		$tmp = (int)$val;
		if ((string)$tmp !== (string)$val) {
			return false;
		} else {
			return $tmp;
		}
	case 7:
		if (mb_strlen($val,'UTF-8') > $maxL) {
			return mb_substr($val, 0, $maxL, 'UTF-8');
		} else {
			return $val;
		}
	}
	return NULL;
}
function check_sites() {
		$GLOBALS['PERIOD_FROM'] = '';
		$GLOBALS['PERIOD_TO'] = '';
		$con = mysqli_connect(DB_HOST_LOCAL, ROOT_USER_LOCAL, ROOT_PASSWORD_LOCAL);
		if (mysqli_connect_errno($con)) {
	 		die('Could not connect database host. Please contact Administrator!');
	 	}
		$db_selected = mysqli_select_db($con, DB_NAME_USER);
		if (!$db_selected) {
			mysqli_close($con);
			die( 'Could not select database. Please contact Administrator!');
		} else {
			$result = mysqli_query($con, "SELECT * FROM st{$GLOBALS['SITELIST_TABLE']} WHERE UserID={$GLOBALS['USERID']}");
			if ($result && mysqli_num_rows($result)) {
				$GLOBALS['SITES'] = array();
				while ($row = mysqli_fetch_assoc($result)) {
					$GLOBALS['SITES'][] = $row; 
				}
				mysqli_free_result($result);
			}
			mysqli_close($con);
		}
		if (empty($GLOBALS['SITES']) && $GLOBALS['ACTION'] !== 'Add Site' && $GLOBALS['MENU'] !== 'Hosts') {
			header("Location: manager.php?id={$GLOBALS['USERID']}&menu=Sites&action=Add Site"); 
			exit;
		} else if (!empty($GLOBALS['SITES']) && count($GLOBALS['SITES']) > 0) {
			if (empty($GLOBALS['SITEID'])) {
				$GLOBALS['SITEID']		= $GLOBALS['SITES'][0]['SiteID'];
				$GLOBALS['TIMEZONE']	= $GLOBALS['SITES'][0]['TimeZone'];
				$GLOBALS['SITENAME']	= $GLOBALS['SITES'][0]['SiteName'];
				$GLOBALS['PERIOD_FROM'] = $GLOBALS['SITES'][0]['CreateTime'];
			} else {
				$i = count($GLOBALS['SITES']);
				$t = 0;
				for ($row = 0; $row < $i; $row++) {
					if ($GLOBALS['SITEID'] == $GLOBALS['SITES'][$row]['SiteID']) {
						$GLOBALS['TIMEZONE']	= $GLOBALS['SITES'][$row]['TimeZone'];
						$GLOBALS['SITENAME']	= $GLOBALS['SITES'][$row]['SiteName'];
						$GLOBALS['PERIOD_FROM'] = $GLOBALS['SITES'][$row]['CreateTime'];
						$t = 1;
						break;
					}
				}
				if ($t == 0) $GLOBALS['SITEID'] = 0;
			}
		}
		if (!empty($GLOBALS['SITEID'])) {
			date_default_timezone_set($GLOBALS['TIMEZONE']) ? $today = time() : exit;
			$GLOBALS['TODAY'] = date("Y-m-d", $today);
			$GLOBALS['PERIOD_TO'] = date("Ymd", $today);
			$GLOBALS['PERIOD_FROM'] = date("Ymd", $GLOBALS['PERIOD_FROM']);
		}
}
function get_sites() {
		$GLOBALS['SITES'] = array();
		$err = '';
		$con = mysqli_connect(DB_HOST_LOCAL, ROOT_USER_LOCAL, ROOT_PASSWORD_LOCAL);
		if (mysqli_connect_errno($con)) {
	 		die('Could not connect database host. Please contact Administrator! - Common Function[get_sites]');
	 	}
		$db_selected = mysqli_select_db($con, DB_NAME_USER);
		if (!$db_selected) {
			mysqli_close($con);
			die('Could not select database. Please contact Administrator! - Common Function[get_sites]');
		} else {
			$result = mysqli_query($con, "SELECT * FROM st{$GLOBALS['SITELIST_TABLE']} WHERE UserID={$GLOBALS['USERID']}");
			if ($result && mysqli_num_rows($result)) {
				while ($row = mysqli_fetch_assoc($result)) {
					$GLOBALS['SITES'][] = $row;
				}
				mysqli_free_result($result);	
			}
			mysqli_close($con);
		}
		return true;
}
function get_hosts() {
		$err = '';
		$con = mysqli_connect(DB_HOST_LOCAL, ROOT_USER_LOCAL, ROOT_PASSWORD_LOCAL);
		if (mysqli_connect_errno($con)) {
	 		die('Could not connect database. Please contact Administrator! - Common Function[get_hosts]');
	 	}
		$db_selected = mysqli_select_db($con, DB_NAME_USER);
		if (!$db_selected) {
			mysqli_close($con);
			die('Could not use database. Please contact Administrator! - Common Function[get_hosts]');
		} else {
			$result = mysqli_query($con, "SELECT * FROM host");
			if ($result && mysqli_num_rows($result)) {
				$GLOBALS['HOSTS'] = array();
				while ($row = mysqli_fetch_assoc($result)) {
					$GLOBALS['HOSTS'][] = $row;
					if ($row['Domain'] == $GLOBALS['DOMAIN_NAME']) $_SESSION['HOSTNAME'] = $row['Hostname'];
				}
				mysqli_free_result($result);	
			} else if ($GLOBALS['ACTION'] !== 'Add Host') {
				mysqli_close($con);
				header("Location: manager.php?id={$GLOBALS['USERID']}&menu=Hosts&action=Add Host"); 
				exit;
			}
			mysqli_close($con);
		}
		return true;
}
function get_datacenter_region($server) {
	$len = count($GLOBALS['HOSTS']);
	for ($i=0; $i<$len; $i++) if ($GLOBALS['HOSTS'][$i]['Domain'] == $server) return $GLOBALS['HOSTS'][$i]['Hostname'];
	return '';
}
function get_site_info($info) {
		if (empty($GLOBALS['SITES'])) return '';
		$i = count($GLOBALS['SITES']);
		for ($row = 0; $row < $i; $row++) {
			if ($GLOBALS['SITES'][$row]['SiteID'] == $GLOBALS['SITEID']) {
				return $GLOBALS['SITES'][$row][$info];
			}
		}
		return '';
}
function get_domains() {
		$v = get_visa();
		$host = get_site_info('DataCenter');
		$curl = CURL_PROTOCOL . $host . '/api/api_manage.php';
		$q = $v . 'sid='.$GLOBALS['SITEID'].'&q=get domain';
		$ch = curl_init();
		curl_setopt($ch, CURLOPT_URL, $curl);
		curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
		curl_setopt($ch, CURLOPT_HEADER, 0);
		curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 30);
		curl_setopt($ch, CURLOPT_POSTFIELDS, $q);
		$ret = curl_exec($ch);
		$GLOBALS['DOMAINS'] = empty($ret) ? '' : json_decode($ret, true);
		curl_close($ch);
}
function check_table($con, $tb, $db) {
		$ret = false;
		$sql = "SHOW TABLES FROM {$db}";
		$result = mysqli_query($con, $sql);
		if ($result && mysqli_num_rows($result)) {
			while ($row = mysqli_fetch_row($result)) {
				if ($row[0] == $tb) {
					$ret = true;
					break;
				}
			}
			mysqli_free_result($result);
		}
		return $ret;
}
function con_db($host, $username, $pw) {
		$con = mysqli_connect($host, $username, $pw);
		if (mysqli_connect_errno($con)) {
			$GLOBALS['ERROR'] .= '<br/>Could not connect mysql. Please contact Administrator! - Common Function[con_db]';
			return 0;
 		}
		return $con;
}
function use_db($host, $username, $pw, $db, $mod, $func) {
		$con = mysqli_connect($host, $username, $pw);
		if (mysqli_connect_errno($con)) {
			$GLOBALS['ERROR'] .= "<br/>Could not connect mysql - Common Function[use_db], Called From Module[{$mod}] Function[{$func}]";
			return 0;
 		}
		$db_selected = mysqli_select_db($con, $db);
		if (!$db_selected) {
			$GLOBALS['ERROR'] .= "<br/>Could not select database - Common Function[use_db], Called From Module[{$mod}] Function[{$func}]";
			mysqli_close($con);
			return 0;
		}
		return $con;
}
function verify_login_for_change($pw, &$success) {
		$success = false;
		$err = '';
		$con = mysqli_connect(DB_HOST_LOCAL, ROOT_USER_LOCAL, ROOT_PASSWORD_LOCAL);
		if (mysqli_connect_errno($con)) {
 			return 'Could not connect mysql. Please contact Administrator! - Common Function[verify_login_for_change]';
 		}
		$db_selected = mysqli_select_db($con, DB_NAME_USER);
		if (!$db_selected) {
 			$err .= '<br/>Could not select database. Please contact Administrator! - Common Function[verify_login_for_change]';
			mysqli_close($con);
			return $err;
		}
		$result = mysqli_query($con, "SELECT * FROM User WHERE UserID={$GLOBALS['USERID']}");
		if ($result && mysqli_num_rows($result) == 1) {
			while ($row = mysqli_fetch_array($result))
			{
				$apw = $row['Password'];
				break;
			}
			mysqli_free_result($result);
			mysqli_close($con);
		} else {
			$err .= '<br/>Login failed! User is not existed';
			mysqli_close($con);
			return $err;
		}
		$md5pw = md5($pw);
		if ($md5pw === $apw && strlen($md5pw) !== 0) {
			$success = true;
		} else {
			$err .= '<br/>Wrong password';
		}
		return $err;
}
function get_visa($sid=0) {
		if ($sid === 0) $sid = $GLOBALS['SITEID'];
		if (!$sid) return false;
		$t = time() + 30;
		$v = md5($sid . $t . ENCODE_FACTOR);
		return 't=' . $t . '&v=' . $v . '&';
}
function get_cahm_visa() {	
		if (empty($GLOBALS['SITEID'])) return false;
		$t = time() + 86400;
		$pass = md5($GLOBALS['SITEID'] . $t . ENCODE_FACTOR);
		return 'cahm_visa=' . $pass . $t;
}
function verify_user() {
		if (!isset($_SESSION['admin'])) {
			return false;
		}
		if (empty($_SESSION['visa'])) {
			return false;
		} else {
			$visa = $_SESSION['visa'];
		}
		if (empty($_SESSION['r'])) {
			return false;
		} else {
			$r = $_SESSION['r'];
		}
		if (empty($GLOBALS['USERID'])) return false;
		if ($_SESSION['admin'] === 4) {
			$matchvisa = md5($r . ENCODE_FACTOR);
			if ($visa === $matchvisa) return true;
		} else if ($_SESSION['admin'] === 2) {
			$matchvisa = md5($GLOBALS['USERID'] . $r . ENCODE_FACTOR);
			if ($visa === $matchvisa) return true;
		} else if ($_SESSION['admin'] < 2) {
			if (empty($GLOBALS['SITEID'])) return false;
			$matchvisa = md5($GLOBALS['USERID'] . $GLOBALS['SITEID'] . $r . ENCODE_FACTOR);
			if ($visa === $matchvisa) return true;
		}
		return false;
}
function get_ip() {
		foreach (array('HTTP_CLIENT_IP', 'HTTP_X_FORWARDED_FOR', 'HTTP_X_FORWARDED', 'HTTP_X_CLUSTER_CLIENT_IP', 'HTTP_FORWARDED_FOR', 'HTTP_FORWARDED', 'REMOTE_ADDR') as $key) {
			if (array_key_exists($key, $_SERVER)) {
				foreach (explode(',', $_SERVER[$key]) as $ip) {
					if ((bool)filter_var($ip, FILTER_VALIDATE_IP, FILTER_FLAG_IPV4 | FILTER_FLAG_NO_PRIV_RANGE | FILTER_FLAG_NO_RES_RANGE)) {
						return $ip;
					}
				}
			}
		}
		return '';
}

	
?> 

================================================
FILE: config/config_common.php
================================================
<?php
/*!
* ATTENTION: THIS FREE LICENSE IS ONLY FOR PERSONAL NON-COMMERCIAL USER. FOR COMMERCIAL PURPOSES, PLEASE PURCHASE A COMMERCIAL LICENSE! *
* module: Centcount Analytics Free COMMON CONFIG *
* version: 1.00 Free *
* author: WM Jonssen *
* date: 05/31/2018 *
* copyright 2015-2018 WM Jonssen <wm.jonssen@gmail.com> - All rights reserved.*
* license: Dual licensed under the Free License and Commercial License. *
* https://www.centcount.com *
*/


/*********** Load Other Config Start **********/
@require 'config_redis.php';//load Redis Config
@require 'config_mail.php';//load Mail Config
/********* Load Other Config End ********/


/*************** COMMON CONFIG BEGIN **************/
//encode factor
define('ENCODE_FACTOR', 'abcdef123456');//RESET YOUR PRIVATE ENCODE FACTOR, IT IS VERY IMPORTANT
//mysql local host name
define('DB_HOST_LOCAL', '127.0.0.1');//set your mysql host name or ip
//mysql local root name
define('ROOT_USER_LOCAL', 'root');//set your mysql login username here (Creating Database Permission Is Necessary)
//mysql local root password
define('ROOT_PASSWORD_LOCAL', 'password');//set your mysql login password here
//administrator's timezone: PRC
define('ADMIN_TIMEZONE', 'PRC');//set administrator's timezone
//default timezone: PRC
define('DEFAULT_TIME_ZONE', 'PRC');//set default timezone
//error log host
define('ERROR_LOG_HOST', 'www.yourdomainname.com');//set Error Log host 
/**************** COMMON CONFIG END ***************/





/**********************************************/
/****** DO NOT CHANGE ANY CONSTANT BELOW ******/
/**********************************************/


/****** Local Database Information Start ******/
//mysql user database name
define('DB_NAME_USER', 'ccdata');
//mysql robot database name
define('DB_NAME_ROBOT', 'ccrobot');
//mysql error database name
define('DB_NAME_ERROR', 'ccerror');
/******* Local Database Information End *******/



//************* CA Constant Begin *************
//max bigint
define('MAX_BIGINT', 2^63-1 );
//max int
define('MAX_INT', 2147483647);
//max smallint
define('MAX_SMALLINT', 32767);
//max tinyint
define('MAX_TINYINT', 127);


//CA Realtime Array Length
define('CA_READY_ARRAY_LENGTH', 23);//23
//CA BASIC INFO Array Length
define('CA_BASIC_ARRAY_LENGTH', 91);//91
//CA TOTAL Array Length
define('CA_TOTAL_ARRAY_LENGTH', 112);//112
//CA Indicator Array Length
define('CA_INDICATOR_ARRAY_LENGTH', 31);//31
//CA Visitor Action Array Length
define('CA_VA_ARRAY_LENGTH', 8);//8
//CA Visitor Click Array Length
define('CA_VC_ARRAY_LENGTH', 35);//35
//************** CA Constant End **************


?>

================================================
FILE: config/config_mail.php
================================================
<?php
/*!
* ATTENTION: THIS FREE LICENSE IS ONLY FOR PERSONAL NON-COMMERCIAL USER. FOR COMMERCIAL PURPOSES, PLEASE PURCHASE A COMMERCIAL LICENSE! *
* module: Centcount Analytics Free MAIL CONFIG *
* version: 1.00 Free *
* author: WM Jonssen *
* date: 03/12/2018 *
* copyright 2015-2018 WM Jonssen <wm.jonssen@gmail.com> - All rights reserved.*
* license: Dual licensed under the Free License and Commercial License. *
* https://www.centcount.com *
*/


/************* Config Mail Start ***********/
//administrator mail
defined('ADMIN_MAIL') || define('ADMIN_MAIL', 'admin@centcount.com');
//auto response mail
defined('AUTORESPONSE_MAIL') || define('AUTORESPONSE_MAIL', 'autoresponse@centcount.com');
//notification mail
defined('NOTIFICATION_MAIL') || define('NOTIFICATION_MAIL', 'notification@centcount.com');
//fatal error mail
defined('FATALERROR_MAIL') || define('FATALERROR_MAIL', 'fatalerror@centcount.com');
/************** Config Mail End ************/


?>

================================================
FILE: config/config_redis.php
================================================
<?php
/*!
* ATTENTION: THIS FREE LICENSE IS ONLY FOR PERSONAL NON-COMMERCIAL USER. FOR COMMERCIAL PURPOSES, PLEASE PURCHASE A COMMERCIAL LICENSE! *
* module: Centcount Analytics Free REDIS CONFIG *
* version: 1.00 Free *
* author: WM Jonssen *
* date: 03/12/2018 *
* copyright 2015-2018 WM Jonssen <wm.jonssen@gmail.com> - All rights reserved.*
* license: Dual licensed under the Free License and Commercial License. *
* https://www.centcount.com *
*/


/************* Redis Config Start *************/
//redis instance 0 for kernel process (information of process, ticket, session)
define('REDIS_IP_0', '127.0.0.1');
define('REDIS_PORT_0', 6379);
define('REDIS_DB_0', 0);
//redis instance 1 for realtime visitor data (all information of realtime)
define('REDIS_IP_1', '127.0.0.1');
define('REDIS_PORT_1', 6379);
define('REDIS_DB_1', 1);
//redis instance 2 for CA javascript (site settings, site domains, robots list)
define('REDIS_IP_2', '127.0.0.1');
define('REDIS_PORT_2', 6379);
define('REDIS_DB_2', 2);
//redis instance 3 for session (session information)
define('REDIS_IP_3', '127.0.0.1');
define('REDIS_PORT_3', 6379);
define('REDIS_DB_3', 3);
/************** Redis Config End **************/


?>

================================================
FILE: config/config_security.php
================================================
<?php
/*!
* ATTENTION: THIS FREE LICENSE IS ONLY FOR PERSONAL NON-COMMERCIAL USER. FOR COMMERCIAL PURPOSES, PLEASE PURCHASE A COMMERCIAL LICENSE! *
* module: Centcount Analytics Free SECURITY CONFIG  *
* version: 1.00 Free *
* author: WM Jonssen *
* date: 04/02/2018 *
* copyright 2015-2018 WM Jonssen <wm.jonssen@gmail.com> - All rights reserved.*
* license: Dual licensed under the Free License and Commercial License. *
* https://www.centcount.com *
*/

/************* Security Config Start *************/
//force ssl
define('FORCE_SSL', true);//If you don't have SSL Certificate, please set this const to "false".
//check ssl
define('IS_HTTPS', isset($_SERVER['HTTPS']) && ($_SERVER['HTTPS'] === 1 || $_SERVER['HTTPS'] === 'on') ? true : false);
//define security transfer protocol
define('PROTOCOL', IS_HTTPS ? 'https://' : 'http://');
//define API transfer protocol
define('CURL_PROTOCOL', 'https://');//If you don't have SSL Certificate, please set this const to "http://".
/************** Security Config End **************/

//check protocol
FORCE_SSL && (IS_HTTPS || die(header('Location: https://' . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'])));


@require 'config_mail.php';//load Mail Config


?>

================================================
FILE: core.php
================================================
<?php
/*!
* ATTENTION: THIS FREE LICENSE IS ONLY FOR PERSONAL NON-COMMERCIAL USER. FOR COMMERCIAL PURPOSES, PLEASE PURCHASE A COMMERCIAL LICENSE! *
* module: Centcount Analyticsb Free Core PHP Code *
* version: 1.00 Free *
* author: WM Jonssen *
* date: 04/24/2018 *
* copyright 2015-2018 WM Jonssen <wm.jonssen@gmail.com> - All rights reserved. *
* license: Dual licensed under the Free License and Commercial License. *
* https://www.centcount.com *
*/

ignore_user_abort(1); 
$START_TIME = $_SERVER['REQUEST_TIME_FLOAT'];
empty($START_TIME) && $START_TIME = microtime(true);
$TIMESTAMP = (int)$START_TIME;
$START_TIME = (int)($START_TIME * 1E6);
if (isset($_GET['rn']) === true) ((int)$_GET['rn'] > 15E14 && (int)$_GET['rn'] < ($START_TIME - 36E8)) AND exit;

@require './config/config_redis.php';

$REDIS_2 = new Redis();
if ($REDIS_2->CONNECT(REDIS_IP_2, REDIS_PORT_2) !== true) exit;
$REDIS_2->SELECT(REDIS_DB_2);
$IP = '';
foreach (array('HTTP_CLIENT_IP', 'HTTP_X_FORWARDED_FOR', 'HTTP_X_FORWARDED', 'HTTP_X_CLUSTER_CLIENT_IP', 'HTTP_FORWARDED_FOR', 'HTTP_FORWARDED', 'REMOTE_ADDR') as $key) {
	if (array_key_exists($key, $_SERVER)) {
		foreach (explode(',', $_SERVER[$key]) as $val) {
			if ((bool)filter_var($val, FILTER_VALIDATE_IP, FILTER_FLAG_IPV4 | FILTER_FLAG_NO_PRIV_RANGE | FILTER_FLAG_NO_RES_RANGE)) {
				$IP = $val;
				goto skip;
			}
		}
	}
}
skip:
if ($REDIS_2->SISMEMBER('NewRobots', $IP) === true) goto SkipAttackCheck;
$IPB = substr($IP, 0, strrpos($IP, '.'));
if ($REDIS_2->SISMEMBER('NewRobots', $IPB) === true) goto SkipAttackCheck;
foreach (array('stp','stat','sid','vid','rn','ipdb','ls','tvs') as $key) isset($_GET[$key]) === false AND Record_BadRequest($REDIS_2, $IP, $TIMESTAMP, 1);
((int)$_GET['rn'] > $START_TIME || (int)$_GET['rn'] < 15E14 || (int)$_GET['vid'] > $START_TIME || (int)$_GET['vid'] < 1E15 || (int)$_GET['sid'] > 2E15 ||  (int)$_GET['sid'] < 15E14 || empty($_GET['tz'])) AND Record_BadRequest($REDIS_2, $IP, $TIMESTAMP, 2);
SkipAttackCheck:
$REDIS_2->GET($_GET['sid'].'-SiteStatus') !== '0' AND Record_BadRequest($REDIS_2, $IP, $TIMESTAMP, 3);
$REDIS_0 = new Redis();
if ($REDIS_0->CONNECT(REDIS_IP_0, REDIS_PORT_0) !== true) exit;
$REDIS_0->SELECT(REDIS_DB_0);
$RC = $_GET['rn'];
$RC_EXIST = (bool)$REDIS_0->EXISTS($RC);
if ($REDIS_0->RPUSH($RC, '&' . $_SERVER['QUERY_STRING'] . '&ip=' . $IP . '&ts=' . $START_TIME) > 0) {
	$RC_EXIST === false AND $REDIS_0->RPUSH('TicketListL', $RC);
	if ($_GET['stat'] === '1' || $_GET['stat'] === '9') {
		header('Content-type: application/javascript');
		echo "var _caq = _caq || [];_caq.push(['_responseStatusCA',0]);";
	}
	$REDIS_0->ZINCRBY('SSIDS', 1, $_GET['sid']);
}
$REDIS_1 = new Redis();
if ($REDIS_1->CONNECT(REDIS_IP_1, REDIS_PORT_1) !== true) exit;
$REDIS_1->SELECT(REDIS_DB_1);
$EXPIRE = 900;
switch ((int)$_GET['stat']) {
case 1:
case 9:
	if (!date_default_timezone_set($_GET['tz'])) exit;
	$DAY_PERIOD_NOW = date('ymd', $TIMESTAMP);
	$DAY_PERIOD = $REDIS_1->GET('DayPeriod'.$_GET['sid']);
	if ($DAY_PERIOD_NOW !== $DAY_PERIOD) {
		$REDIS_1->MSET(array('PeakPV'.$_GET['sid'] => 1, 'RealPV'.$_GET['sid'] => 1, 'PeakUV'.$_GET['sid'] => 1, 'RealUV'.$_GET['sid'] => 1, 'PeakIP'.$_GET['sid'] => 1, 'RealIP'.$_GET['sid'] => 1, 'DayPeriod'.$_GET['sid'] => $DAY_PERIOD_NOW));
	}
	$REAL_MINUTE = date('H:i', $TIMESTAMP);
	$RANG_MINUTE = floor(($TIMESTAMP - 840) / 60) * 60;
	$LAST_MINUTE = $REDIS_1->GETSET('MinPeriod'.$_GET['sid'], $REAL_MINUTE);
	if ($LAST_MINUTE != $REAL_MINUTE) {
		$CHECK_ARRAY = $REDIS_1->MGET(array('PeakPV'.$_GET['sid'], 'RealPV'.$_GET['sid'], 'PeakUV'.$_GET['sid'], 'RealUV'.$_GET['sid'], 'PeakIP'.$_GET['sid'], 'RealIP'.$_GET['sid'], 'MinData'.$_GET['sid']));
		$REDIS_ARRAY = array();
		if ($CHECK_ARRAY[0] < $CHECK_ARRAY[1]) $REDIS_ARRAY['PeakPV'.$_GET['sid']] = $CHECK_ARRAY[1];
		if ($CHECK_ARRAY[2] < $CHECK_ARRAY[3]) $REDIS_ARRAY['PeakUV'.$_GET['sid']] = $CHECK_ARRAY[3];
		if ($CHECK_ARRAY[4] < $CHECK_ARRAY[5]) $REDIS_ARRAY['PeakIP'.$_GET['sid']] = $CHECK_ARRAY[5];
		$REDIS_1->PIPELINE();
		$REDIS_1->MSET($REDIS_ARRAY);
		if ($CHECK_ARRAY[6]) $REDIS_1->ZADD('SMINS'.$_GET['sid'], (int)substr($CHECK_ARRAY[6], 0, 10), substr($CHECK_ARRAY[6], 10));
		$REDIS_1->DEL('VIDS'.$_GET['sid'],'IPS'.$_GET['sid']);
		$REDIS_1->MSET(array('RealPV'.$_GET['sid'] => 1, 'RealUV'.$_GET['sid'] => 1, 'RealIP'.$_GET['sid'] => 1, 'MinData'.$_GET['sid'] => $TIMESTAMP . $REAL_MINUTE . ',1,1,1'));
		$REDIS_1->SADD('VIDS'.$_GET['sid'], $_GET['vid']);
		$REDIS_1->SADD('IPS'.$_GET['sid'], $IP);
		$REDIS_1->EXPIRE('MinData'.$_GET['sid'], 900);
		$REDIS_1->ZREMRANGEBYSCORE('SVIDS'.$_GET['sid'], 0, ($RANG_MINUTE-60));
		$REDIS_1->ZREMRANGEBYSCORE('SMINS'.$_GET['sid'], 0, ($RANG_MINUTE-60));
		$REDIS_1->EXEC();
	} else {
		$REAL_PV = $REDIS_1->INCR('RealPV'.$_GET['sid']);
		if ($REDIS_1->SISMEMBER('VIDS'.$_GET['sid'], $_GET['vid']) === false) {
			$REAL_UV = $REDIS_1->INCR('RealUV'.$_GET['sid']);
			$REDIS_1->SADD('VIDS'.$_GET['sid'], $_GET['vid']);
		} else {
			$REAL_UV = $REDIS_1->GET('RealUV'.$_GET['sid']);
		}
		if ($REDIS_1->SISMEMBER('IPS'.$_GET['sid'], $IP) === false) {
			$REAL_IP = $REDIS_1->INCR('RealIP'.$_GET['sid']);
			$REDIS_1->SADD('IPS'.$_GET['sid'], $IP);
		} else {
			$REAL_IP = $REDIS_1->GET('RealIP'.$_GET['sid']);
		}
		$CHECK_ARRAY = $REDIS_1->GET('MinData'.$_GET['sid']);
		$CHECK_ARRAY = $CHECK_ARRAY ? substr($CHECK_ARRAY, 0, 10) : $TIMESTAMP;
		$REDIS_1->SET('MinData'.$_GET['sid'], $CHECK_ARRAY . $REAL_MINUTE . ',' . $REAL_PV . ',' . $REAL_UV . ',' . $REAL_IP);	
		$REDIS_1->EXPIRE('MinData'.$_GET['sid'], 900);
	}
case 2:
	$RET  = $REDIS_1->GET($_GET['vid']);
	$REDIS_1->PIPELINE();
	if ($RET) {
		$TMP  = '&pv=' . $_GET['pv'] .
				'&dt=' . $_GET['dt'] .
				'&ds=' . $_GET['ds'] .
				'&rs=' . $_GET['rs'];
		$TMP = MDATA($RET, '&pv=', $TMP);
		$REDIS_1->SET($_GET['vid'], $TMP);
	} else {
		$REDIS_1->ZADD('SVIDS'.$_GET['sid'], $TIMESTAMP, $_GET['vid']);	
		$REDIS_1->APPEND($_GET['vid'], 
			'stat=' . $_GET['stat'] .
			'&rn=' 	. $_GET['rn'] .
			'&vid='	. $_GET['vid'] .
			'&ip=' 	. $IP .
			'&ipdb='. $_GET['ipdb'] .
			'&pg='	. rawurlencode($_GET['pg']) .
			'&rf=' 	. (empty($_GET['rf']) ? '' : parse_url($_GET['rf'], PHP_URL_HOST)) .
			'&kw=' 	. (empty($_GET['kw']) ? '' : $_GET['kw']) .
			'&pv=' 	. $_GET['pv'] .
			'&dt=' 	. $_GET['dt'] .
			'&ds=' 	. $_GET['ds'] .
			'&rs='  . $_GET['rs']
		);
	}
	$REDIS_1->EXPIRE($_GET['vid'], $EXPIRE);
	$REDIS_1->EXEC();
	break;
case 3:
	$RET  = $REDIS_1->GET($_GET['vid']);
	$REDIS_1->PIPELINE();
	if ($RET) {		
		$TMP  = '&pv='  . $_GET['pv'] .
				'&dt='  . $_GET['dt'] .
				'&ds='  . $_GET['ds'] .
				'&rs='  . $_GET['rs'] .
				'&ls='  . $_GET['ls'] .
				'&mnrx='. $_GET['mnrx'] .
				'&mnry='. $_GET['mnry'] .
				'&mxrx='. $_GET['mxrx'] .
				'&mxry='. $_GET['mxry'];
		$TMP = MDATA($RET, '&pv=', $TMP);
		$REDIS_1->SET($_GET['vid'], $TMP);	
	} else {
		$REDIS_1->APPEND($_GET['vid'], 
			'stat='. $_GET['stat'] .
			'&rn=' 	. $_GET['rn'] .
			'&vid='	. $_GET['vid'] .
			'&ip=' 	. $IP .
			'&ipdb='. $_GET['ipdb'] .
			'&pg='	. rawurlencode($_GET['pg']) .
			'&rf=' 	. (empty($_GET['rf']) ? '' : parse_url($_GET['rf'], PHP_URL_HOST)) .
			'&kw=' 	. (empty($_GET['kw']) ? '' : $_GET['kw']) .
			'&pv=' 	. $_GET['pv'] .
			'&dt=' 	. $_GET['dt'] .
			'&ds=' 	. $_GET['ds'] .
			'&rs='  . $_GET['rs'] .
			'&ls='  . $_GET['ls'] .
			'&mnrx='. $_GET['mnrx'] .
			'&mnry='. $_GET['mnry'] .
			'&mxrx='. $_GET['mxrx'] .
			'&mxry='. $_GET['mxry']
		);
	}
	$REDIS_1->EXPIRE($_GET['vid'], $EXPIRE);
	$REDIS_1->EXEC();
	break;
case 4:
case 5:
	$REDIS_1->PIPELINE();
	$REDIS_1->DEL($_GET['vid']);
	$REDIS_1->ZREM('SVIDS'.$_GET['sid'], $_GET['vid']);
	$REDIS_1->EXEC();
	break;
case 6:
	break;
case 7:
	if ((bool)$REDIS_1->EXISTS($_GET['vid']) === false) break;
	$RET  = $REDIS_1->GET($_GET['vid']);
	$TMP  = '&ds='	. $_GET['ds'] .
			'&rs='	. $_GET['rs'] .
			'&ls='	. $_GET['ls'] .
			'&ols=' . $_GET['ols'] .
			'&mnrx='. $_GET['mnrx'] .
			'&mnry='. $_GET['mnry'] .
			'&mxrx='. $_GET['mxrx'] .
			'&mxry='. $_GET['mxry'];
	$TMP = MDATA($RET, '&ds=', $TMP);
	$REDIS_1->PIPELINE();
	$REDIS_1->SET($_GET['vid'], $TMP);
	$REDIS_1->EXPIRE($_GET['vid'], $EXPIRE);
	$REDIS_1->ZADD('SVIDS'.$_GET['sid'], $TIMESTAMP, $_GET['vid']);
	$REDIS_1->EXEC();
	break;
}

$CHECK_ARRAY = $REDIS_0->MGET(array('ProcessLimit', 'ProcessCheckTime', 'ProcessMax', 'ProcessMin'));
if ($CHECK_ARRAY[0] !== '1') {
	$PROCESS_CHECK_TIME = (int)$CHECK_ARRAY[1];
	if (($START_TIME - $PROCESS_CHECK_TIME) > 6E7) {
		$PROCESS_MAX = (int)$CHECK_ARRAY[2];
		if ($PROCESS_MAX < 1 || $PROCESS_MAX > 128) $PROCESS_MAX = 4;
		$PROCESS_MIN = (int)$CHECK_ARRAY[3];
		if ($PROCESS_MIN < 1 || $PROCESS_MAX > 128) $PROCESS_MIN = 2;
		$REDIS_0->MSET(array('ProcessCheckTime' => $START_TIME, 'ProcessMax' => $PROCESS_MAX, 'ProcessMin' => $PROCESS_MIN));
		$PROCESS_ENABLED = 0;
		$PROCESS_ARRAY = $REDIS_0->SMEMBERS('ProcessList');
		if (count($PROCESS_ARRAY) > 0) {
			foreach ($PROCESS_ARRAY as $PID) {
				$PROCESS_STRUCTURE = $REDIS_0->HMGET($PID, array('Status', 'LastResponseTime'));
				if (count($PROCESS_STRUCTURE) < 2 OR $PROCESS_STRUCTURE['Status'] === '1' && ($START_TIME - $PROCESS_STRUCTURE['LastResponseTime']) > 6E7) {
					$REDIS_0->DEL($PID);
					$REDIS_0->SREM('ProcessList', $PID);
				} else {
					$PROCESS_ENABLED++;
					if ($PROCESS_ENABLED > $PROCESS_MAX) $REDIS_0->HSET($PID, 'Status', 0);
				}
			}
		}
		if ($PROCESS_ENABLED < $PROCESS_MIN) {
			$n = $PROCESS_MIN - $PROCESS_ENABLED;		
			for ($i = 0; $i < $n; $i++) {
				pclose(popen('php -f ' . __DIR__ . '/kernel.php &', 'r'));
			}
		}
	}
}

$REDIS_0->MULTI()
		->INCRBY('PerformanceConsume0', (int)(microtime(true) * 1E6) - $START_TIME)
		->INCR('PerformanceCount0')
		->EXEC();

exit;

function Record_BadRequest(&$redis, $ip, $time, $type) {
	$redis->PIPELINE();
	$redis->INCR('BlockedIPCount');
	$redis->RPUSH('BadRequests', $_SERVER['QUERY_STRING'] . '&ip=' . $ip . '&time=' . $time . '&type=' . $type);
	if ($type > 0) {
		$redis->SADD('BlockedIPList', $ip);
		$redis->SADD('BlockedIPHistory', $ip);
	}
	$redis->EXEC();
	exit;
}

function MDATA($request, $key, $value) {
		$ret = $request;
		$spos = strpos($request, $key);
		if ($spos !== false) {
			$ret = substr($request, 0, $spos) . $value;
		} else {
			$ret = $request . $value;
		}
		return $ret;
}

?> 


================================================
FILE: css/common.css
================================================
/*!
* ATTENTION: THIS FREE LICENSE IS ONLY FOR PERSONAL NON-COMMERCIAL USER. FOR COMMERCIAL PURPOSES, PLEASE PURCHASE A COMMERCIAL LICENSE! *
* module: Centcount Analytics Free CA Common CSS Code *
* version: 1.00 Free *
* author: WM Jonssen *
* date: 03/12/2018 *
* copyright 2015-2018 WM Jonssen <wm.jonssen@gmail.com> - All rights reserved.*
* license: Dual licensed under the Free License and Commercial License. *
* https://www.centcount.com *
*/
 
@charset "utf-8";

*{color:#555; font-family:"Microsoft Yahei",Arial,Verdana; font-weight:300; padding:0px; margin:auto; border:0; border-radius:0;}
h1{color:#333; letter-spacing:3px; margin-top:15px; margin-bottom:15px;}
a{color:#39F; text-decoration:none;}
a:hover{text-decoration:underline;}


.errmsg, .successmsg, .retmsg, .successbtn{width:calc(100% - 32px); height:auto; font-size:13px; line-height:18px; text-align:center; color:rgb(181,68,123); display:none; padding:15px; background-color:rgb(242,222,222); border-radius:4px; border:rgb(235,204,209) 1px solid; word-wrap:break-word; float:left;}
.successmsg, .successbtn{width:calc(100% - 26px); display:block; padding:12px;}
.successbtn{border-color:rgb(6,105,161); background-color:rgb(16,151,228); color:#fff; margin-top:15px;}
.successbtn:hover{opacity:0.7; text-decoration:none;}
.retmsg{display:block; text-align:left;}



#header{width:100%; min-width:360px; height:auto; font-size:12px; text-align:left; color:#aaa; float:left; border-bottom:#ccc 1px solid;}

#logo{width:auto; height:auto; line-height:16px; font-size:12px; text-align:left; color:#222; float:left; padding:10px;}
img.mid{vertical-align:middle; float:left;}

#guide{width:auto; height:auto; line-height:36px; font-size:12px; text-align:right; color:#aaa; float:right; padding:0; padding-left:10px; padding-right:10px;}
.guidebtn,.guidespan,.langbtn,.lastbtn{width:auto; height:12px; line-height:12px; color:#4283C4; text-align:center; padding-left:10px; padding-right:11px; font-size:12px;}
.langbtn{background:url(../images/menu.png) top right no-repeat; padding-right:21px;}
.lastbtn{background:none; padding-right:10px;}
.guidebtn:hover,.langbtn:hover,.lastbtn:hover{text-decoration:none;}
.guidespan{background:none; padding-right:10px; color:#333;}

#guide ul{background-color:#fff; list-style:none; width:auto; height:auto; float:right; margin:0; padding:0;}
#guide li{background-color:#fff; width:auto; height:auto; font-size:12px; float:left;}
#guide li:hover{background-color:#eee;}

#guide li ul{display:none; width:auto; height:auto; border:#ddd 1px solid; position:absolute; z-index:999; background-color:#fff; overflow:hidden;}
#guide li:hover ul{display:block;}
#guide li li {display:block; width:auto; height:auto; float:none; text-align:left; overflow:hidden;}

#guide li ul li a{display:block;height:30px; line-height:30px; font-size:12px;text-align:left;}
#guide li ul li a:hover{text-decoration:none; background-color:#eee;}

#title, .title{width:100%; min-width:360px; font-size:14px; text-align:center; padding-top:20px; padding-bottom:20px; float:left; border-bottom:#ccc 1px solid;}

#bodyframe{border-bottom:#ccc 1px solid; text-align:center; padding-top:30px; padding-bottom:30px; width:100%; min-width:360px; float:left; font-size:14px;}

.framebody{margin:auto; text-align:center; width:330px; min-width:330px; height:auto; font-size:12px;}
p{font-size:14px; color:#555;}




.section{width:100%; height:auto; font-size:14px; margin:auto; text-align:center; float:left;}
.sImgL, .sImgR, .sTxtL, .sTxtR, .sBoxC, .sLogL, .sLogR{width:50%; height:450px; margin:auto; background-color:#f7f7f7; text-align:left; float:right; overflow:hidden;}
.sImgL{background-position:top right; background-repeat:no-repeat; background-size:100% auto; float:left;}
.sImgR{background-position:top left;  background-repeat:no-repeat; background-size:100% auto; float:right;}
.sTxtL{text-align:right; float:left;}
.sBoxC{height:auto; background-color:#fff; float:left; overflow:hidden;}
.sLogL, .sLogR{height:auto; float:left;}
.logoImg{width:550px; height:550px; margin:auto; margin-top:-50px;}

.sText{width:auto; height:auto; padding:60px; padding-left:80px; padding-right:80px; text-align:left; float:none;}
.pBoxL, .pBoxC{max-width:480px; line-height:24px; font-size:16px; font-family:Verdana,"Microsoft Yahei",Arial; float:none;}
.pBoxL{float:left;}
.sWord{max-width:960px; line-height:42px; margin:auto; color:#fff; font-family:Serif,Tahoma,"Microsoft Yahei",Arial; font-size:28px; font-weight:300; letter-spacing:1px;}

.bBox{width:250px; text-align:center; margin:auto; padding:30px;}
.word{font-size:15px; font-family:Tahoma,"Microsoft Yahei",Arial,Verdana; color:#555; letter-spacing:1px;}
.btnB, .btnR{display:block; margin:auto; text-align:center; width:220px; height:auto; line-height:18px; margin-top:10px; margin-bottom:10px; padding:10px; background-color:rgb(16,151,228); color:#fff; font-size:14px; border-radius:4px; float:none;}
.btnR{background-color:#e50e0e;}
.btnB:hover, .btnR:hover{opacity:0.7; text-decoration:none;}
.bImgC{width:auto; height:480px; margin:30px;}

.sRed{background-color:#e50e0e;}
.sBlue{background-color:#00b0ff;}
.sGray{background-color:#f7f7f7;}
.sWhite{background-color:#fff;}
.sP30{padding:30px;}
.sP15{padding:15px;}
.bTop{border-top:#ddd 1px solid;}
.bBot{border-bottom:#ddd 1px solid;}
.fR, .tR{float:right;}
.fL, .tL{float:left;}
.tC{text-align:center;}
.h545{height:545px;}
.h480{height:480px;}
.h475{height:475px;}
.mh450{max-height:450px;}
.h415{height:415px;}


@media only screen and (max-width: 1920px) {
.sImgL, .sImgR{background-size:100% 100%;}
}


@media only screen and (max-width: 1800px) {
.sImgL, .sImgR{background-size:auto 100%;}
}


@media only screen and (max-width: 960px) {
.sBoxC, .sImgL, .sLogL, .sImgR{width:100%; float:left;}
.sBoxC{text-align:center;}
.sTxtL, .sTxtR, .sLogR{width:100%; height:auto; float:left;}
.sText{padding:45px; float:left;}
.fR{max-width:640px; float:left; margin:auto;}
.bBox{padding:30px;}
.logoImg{width:450px; height:450px; margin-top:30px;}
}


@media only screen and (max-width: 768px) {
.guidespan{display:none;}
}


@media only screen and (max-width: 640px) {
#logo, .title{display:none;}
.sWord{font-size:20px; line-height:32px;}
.sImgL, .sImgR{width:100%; height:360px; float:left; background-size:auto 100%;}
.sLogL{width:100%; float:left;}
.bBox{padding-left:15px; padding-right:15px;}
.sText, .sP30{padding:15px;}
.logoImg{width:300px; height:300px;}
}


#footer{font-size:12px; line-height:18px; font-family:Arial,"Microsoft Yahei",Verdana; color:#777; text-align:center; float:left; width:100%; min-width:360px; padding-top:30px; padding-bottom:30px;}



td{width:100%; height:auto; min-height:20px; line-height:16px; text-align:left; margin-top:15px; float:left;}
tr, tbody, table, form{width:100%; border:0px; margin:0px; padding:0px; outline-style:none; outline-width:0px; border-spacing:0px; float:left;}
.email{width:calc(100% - 37px); padding-left:30px; background:url(../images/login.png) top left no-repeat;}
.pwd{width:calc(100% - 37px); padding-left:30px; background:url(../images/login.png) no-repeat; background-position:0px -30px;}
.fresh{width:30px; height:34px; float:right; background:url(../images/login.png) no-repeat; background-position:0px -88px; background-size:30px;}
.name{width:65px; font-size:12px; text-align:right; float:none;}
.sug{width:100%; height:20px; line-height:20px; font-size:12px; text-align:center; margin-top:5px; float:left;}

input{width:calc(100% - 12px); height:32px; line-height:32px; font-size:13px; border:#ccc 1px solid; ime-mode:disabled; outline-style:none; outline-width:0px; background-size:30px; float:left; padding-left:5px; padding-right:5px;} 
button, select{width:100%; height:34px; line-height:33px; color:#333; border:#ccc 1px solid; float:left; padding-left:5px; padding-right:5px;}
button{background:url(../images/login.png) bottom left repeat-x;}
button:hover{border:#777 1px solid;}
textarea{width:100%; font-size:13px; color:#333; border:#ccc 1px solid; resize:none; float:left; padding-left:5px; padding-right:5px;}
.short{width:98px; margin-right:15px; padding-left:30px; background:url(../images/login.png) no-repeat; background-position:0px -60px;}
.vcode{width:135px; height:34px; float:left; margin-right:10px;}
.suggestion{text-align:left; width:auto; float:left;}
.strength{width:255px; height:16px; background-image:url(../images/cc_images.png); background-position:5px -39px; background-repeat: no-repeat; float:right;}



.frameform{width:100%; margin:auto; text-align:center; float:left;}

.frameagree{width:100%; height:100%; display:none; position:fixed; top:0; left:0; text-align:center; margin:auto; background:rgba(0,0,0,1); float:left;}
.agreebox{width:auto; max-width:600px; min-width:330px; height:-moz-calc(100% - 120px); height:-webkit-calc(100% - 120px); height:calc(100% - 120px); line-height:20px; text-align:justify; font-size:14px; margin:auto; background:#eee; color:#555; float:none; overflow-y:auto; border-radius:5px;}
.agreebtn{width:100%; height:60px; line-height:60px; font-size:16px; font-weight:700; color:#fff; text-align:center; margin:auto; background-color:transparent; float:left;}

.mTop{margin-top:0px;}
.mTop15{margin-top:15px;}
.dShow{display:block;}


================================================
FILE: css/ichart.css
================================================
/*!
* ATTENTION: THIS FREE LICENSE IS ONLY FOR PERSONAL NON-COMMERCIAL USER. FOR COMMERCIAL PURPOSES, PLEASE PURCHASE A COMMERCIAL LICENSE! *
* module: Centcount Analytics Free CA Chart CSS Code
* version: 1.00 Free *
* author: WM Jonssen *
* date: 03/12/2018 *
* copyright 2015-2018 WM Jonssen <wm.jonssen@gmail.com> - All rights reserved.*
* license: Dual licensed under the Free License and Commercial License. *
* https://www.centcount.com *
 */
 
@charset "utf-8";

/*box*/
.selectframe{font-size:14px; font-family:"Microsoft Yahei",Arial,Verdana; width:100%; min-width:360px; height:auto; float:left; border-bottom:#ccc 1px solid; margin:auto; text-align:center;}	

.framebody{width:auto; min-width:345px; height:auto; float:none; margin:0px; margin-left:15px; text-align:left; overflow-x:auto; overflow-y:hidden;}
.errmsg{margin-bottom:10px;}
.frametable{width:100%; height:auto; text-align:center; float:none;}
.frameinner, .framesum{width:100%; height:auto; text-align:center; float:left;}

.innertable{width:100%; min-width:330px; height:auto; margin:0px; text-align:left; float:left;}
.innertitle{width:calc(100% - 27px); height:45px; line-height:45px; padding-left:10px; margin-right:15px; text-align:left; font-size:20px; color:#111; font-family:Verdana,"Microsoft Yahei",Arial; border:1px #ccc solid; border-bottom:0px; float:left;}
.i
Download .txt
gitextract_wovxv__r/

├── README.md
├── api/
│   ├── api_ca.php
│   └── api_manage.php
├── ca.php
├── ca_version.php
├── cache_settings.php
├── command.php
├── common.php
├── config/
│   ├── config_common.php
│   ├── config_mail.php
│   ├── config_redis.php
│   └── config_security.php
├── core.php
├── css/
│   ├── common.css
│   ├── ichart.css
│   ├── icontrol.css
│   └── manager.css
├── errlog.php
├── forgot.php
├── host/
│   └── hosts_host_status.php
├── html.php
├── install.php
├── ipdb/
│   └── README.md
├── ipdb.class.php
├── js/
│   ├── common.js
│   ├── ichart.js
│   ├── icontrol.js
│   ├── iline.js
│   ├── ilog.js
│   ├── imap.js
│   ├── iprocess.js
│   └── itable.js
├── kernel.func.php
├── kernel.php
├── kernel.sql.php
├── language/
│   ├── lan-de-DE.php
│   ├── lan-en-US.php
│   ├── lan-ja-JP.php
│   ├── lan-zh-CN.php
│   └── lan-zh-TW.php
├── language.php
├── license.txt
├── login.php
├── logout.php
├── manager.php
├── maps/
│   ├── china.js
│   └── world.js
├── passport.php
├── persistence.php
├── relogin.php
├── report/
│   ├── actions_all_page.php
│   ├── actions_bounce_page.php
│   ├── actions_entry_page.php
│   ├── actions_exit_page.php
│   ├── actions_robot_crawled_page.php
│   ├── dashboard.php
│   ├── referrers_all_referrer.php
│   ├── referrers_channel.php
│   ├── referrers_se_keyword.php
│   ├── referrers_website.php
│   ├── visitors_active.php
│   ├── visitors_active_visitor.php
│   ├── visitors_day_trend.php
│   ├── visitors_device.php
│   ├── visitors_location.php
│   ├── visitors_log.php
│   ├── visitors_map.php
│   ├── visitors_overview.php
│   ├── visitors_realtime.php
│   ├── visitors_robot_log.php
│   ├── visitors_software.php
│   └── visitors_times.php
├── reset_pw.php
├── robots.txt
├── setting/
│   ├── settings.php
│   └── settings_about_ca.php
├── site/
│   ├── sites_add_site.php
│   ├── sites_all_sites.php
│   ├── sites_blocked_ids.php
│   ├── sites_blocked_ips.php
│   ├── sites_blocked_pages.php
│   ├── sites_blocked_sites.php
│   ├── sites_delete_site.php
│   ├── sites_domains.php
│   ├── sites_filtered_domains.php
│   ├── sites_get_js_code.php
│   ├── sites_modify_site_config.php
│   └── sites_visitor_password.php
├── validcode.php
├── vendor/
│   ├── autoload.php
│   ├── composer/
│   │   ├── ClassLoader.php
│   │   ├── autoload_classmap.php
│   │   ├── autoload_namespaces.php
│   │   ├── autoload_psr4.php
│   │   ├── autoload_real.php
│   │   └── autoload_static.php
│   ├── geoip2/
│   │   └── geoip2/
│   │       └── src/
│   │           ├── Compat/
│   │           │   └── JsonSerializable.php
│   │           ├── Database/
│   │           │   └── Reader.php
│   │           ├── Exception/
│   │           │   ├── AddressNotFoundException.php
│   │           │   ├── AuthenticationException.php
│   │           │   ├── GeoIp2Exception.php
│   │           │   ├── HttpException.php
│   │           │   ├── InvalidRequestException.php
│   │           │   └── OutOfQueriesException.php
│   │           ├── Model/
│   │           │   ├── AbstractModel.php
│   │           │   ├── AnonymousIp.php
│   │           │   ├── City.php
│   │           │   ├── ConnectionType.php
│   │           │   ├── Country.php
│   │           │   ├── Domain.php
│   │           │   ├── Enterprise.php
│   │           │   ├── Insights.php
│   │           │   └── Isp.php
│   │           ├── ProviderInterface.php
│   │           ├── Record/
│   │           │   ├── AbstractPlaceRecord.php
│   │           │   ├── AbstractRecord.php
│   │           │   ├── City.php
│   │           │   ├── Continent.php
│   │           │   ├── Country.php
│   │           │   ├── Location.php
│   │           │   ├── MaxMind.php
│   │           │   ├── Postal.php
│   │           │   ├── RepresentedCountry.php
│   │           │   ├── Subdivision.php
│   │           │   └── Traits.php
│   │           └── WebService/
│   │               └── Client.php
│   └── maxmind-db/
│       └── reader/
│           └── src/
│               └── MaxMind/
│                   └── Db/
│                       ├── Reader/
│                       │   ├── Decoder.php
│                       │   ├── InvalidDatabaseException.php
│                       │   ├── Metadata.php
│                       │   └── Util.php
│                       └── Reader.php
├── verify.php
└── visitor.php
Download .txt
SYMBOL INDEX (424 symbols across 103 files)

FILE: api/api_ca.php
  function use_db (line 793) | function use_db($host, $user, $pw, $db) {
  function read_record (line 806) | function read_record($con, $sql, &$last_rn) {
  function SDATA_OUT (line 819) | function SDATA_OUT($key, $opt, $def, $maxL=0, $minL=0) {
  function verify_user (line 907) | function verify_user($sid, $t, $v) {
  function verify_cahm (line 914) | function verify_cahm($sid, $t, $v) {
  function get_ip (line 921) | function get_ip() {
  function get_mysql_query_string (line 933) | function get_mysql_query_string($key, &$order, &$title, &$sql='') {
  function get_json_error (line 1051) | function get_json_error($func) {
  function get_data (line 1075) | function get_data($request, $key) {
  function check_table_exist (line 1087) | function check_table_exist($tb, &$tb_arr) {
  function gen_sql (line 1094) | function gen_sql($tbname, $con, $from, $to, $type, $where, $order, $sort...

FILE: api/api_manage.php
  function con_db (line 54) | function con_db($host, $user, $pw) {
  function use_db (line 63) | function use_db($host,$user,$pw,$db) {
  function SDATA_IN (line 77) | function SDATA_IN($key, $opt, $def, $maxL=0, $minL=0, $con=0) {
  function check_table (line 179) | function check_table($con, $cTable, $cDB) {
  function check_value (line 195) | function check_value($value, $type) {
  function check_domain_ip (line 213) | function check_domain_ip($x) {
  function check_ip (line 226) | function check_ip($x) {
  function check_id (line 233) | function check_id($x) {
  function check_site_url (line 240) | function check_site_url($x) {
  function check_page_url (line 248) | function check_page_url($x) {
  function get_ip (line 256) | function get_ip() {
  function set_domains (line 269) | function set_domains($sid) {
  function get_domains (line 399) | function get_domains($sid) {
  function add_site (line 475) | function add_site($db_site) {
  function change_site_setting (line 542) | function change_site_setting($db_site) {
  function clear_site_data (line 614) | function clear_site_data($db_site) {
  function delete_site (line 652) | function delete_site($db_site, $sid) {
  function create_site (line 688) | function create_site($con, $db_site) {
  function verify_user (line 729) | function verify_user($sid, $t, $v) {

FILE: ca.php
  function verify_cahm (line 169) | function verify_cahm($sid, $ip, $visa) {
  function get_ip (line 186) | function get_ip() {
  function use_db (line 198) | function use_db($siteid) {
  function check_block (line 215) | function check_block($ref, $siteid, $ip, &$tz, &$ipdb, &$REDIS_2) {
  function check_block_redis (line 231) | function check_block_redis($ref, $siteid, $ip, &$tz, &$ipdb, &$REDIS_2) {
  function check_block_url_redis (line 279) | function check_block_url_redis($type, $ref, $siteid, &$REDIS_2) {
  function check_block_mysql (line 309) | function check_block_mysql($ref, $siteid, $ip, &$tz, &$ipdb) {
  function check_block_url_mysql (line 371) | function check_block_url_mysql($type, $ref, $con) {

FILE: command.php
  function SDATA_OUT (line 319) | function SDATA_OUT($key, $opt, $def, $maxL=0, $minL=0) {
  function verify_admin (line 358) | function verify_admin($uid, $t, $v) {
  function con_db (line 365) | function con_db($host, $user, $pw) {
  function use_db (line 370) | function use_db(&$con, $db) {

FILE: common.php
  function get_guide_menu_html (line 14) | function get_guide_menu_html() {
  function get_side_menu_html (line 33) | function get_side_menu_html() {
  function get_sites_menu_html (line 134) | function get_sites_menu_html() {
  function get_hosts_menu_html (line 160) | function get_hosts_menu_html() {
  function get_option_html (line 178) | function get_option_html() {
  function SDATA (line 308) | function SDATA($val, $opt, $maxL=0, $minL=0, $con=0) {
  function check_sites (line 395) | function check_sites() {
  function get_sites (line 448) | function get_sites() {
  function get_hosts (line 471) | function get_hosts() {
  function get_datacenter_region (line 499) | function get_datacenter_region($server) {
  function get_site_info (line 504) | function get_site_info($info) {
  function get_domains (line 514) | function get_domains() {
  function check_table (line 529) | function check_table($con, $tb, $db) {
  function con_db (line 544) | function con_db($host, $username, $pw) {
  function use_db (line 552) | function use_db($host, $username, $pw, $db, $mod, $func) {
  function verify_login_for_change (line 566) | function verify_login_for_change($pw, &$success) {
  function get_visa (line 601) | function get_visa($sid=0) {
  function get_cahm_visa (line 608) | function get_cahm_visa() {
  function verify_user (line 614) | function verify_user() {
  function get_ip (line 642) | function get_ip() {

FILE: core.php
  function Record_BadRequest (line 246) | function Record_BadRequest(&$redis, $ip, $time, $type) {
  function MDATA (line 258) | function MDATA($request, $key, $value) {

FILE: errlog.php
  function autoresponse (line 90) | function autoresponse($siteid,$rn,$vid,$name,$msg,$pos,$rf,$page,$agent,...
  function get_ip (line 140) | function get_ip() {
  function check_table (line 151) | function check_table($con, $tb, $db) {
  function check_table_exist (line 168) | function check_table_exist($con, $cTB) {
  function SDATA (line 179) | function SDATA($con, $val, $opt, $maxL, $minL=0) {

FILE: forgot.php
  function forgot (line 54) | function forgot($user, &$success) {
  function autoresponse (line 111) | function autoresponse($to, $cc_id, $cc_code) {

FILE: host/hosts_host_status.php
  function host_status_html (line 15) | function host_status_html() {

FILE: html.php
  function JS_COMMON (line 17) | function JS_COMMON() {
  function HTML_HEADER (line 23) | function HTML_HEADER($flag=0, $id=0, $verify_code=0) {
  function HTML_FOOTER (line 53) | function HTML_FOOTER() {
  function META_TEXT (line 58) | function META_TEXT($keywords=NULL, $description=NULL) {
  function CSS_TEXT (line 75) | function CSS_TEXT() {

FILE: install.php
  function InstallCA (line 76) | function InstallCA($DB_User, $DB_PW, $user, $pw) {
  function CheckEnv (line 242) | function CheckEnv() {
  function autoresponse (line 534) | function autoresponse($to, $cc_pw, $cc_id, $cc_code) {
  function check_table (line 586) | function check_table($con, $tb, $db) {

FILE: ipdb.class.php
  class Database (line 6) | class Database {
    method __construct (line 170) | public function __construct($file = null, $mode = self::FILE_IO, $defa...
    method __destruct (line 250) | public function __destruct() {
    method shmTeardown (line 268) | public static function shmTeardown($file) {
    method getMemoryLimit (line 286) | private static function getMemoryLimit() {
    method findFile (line 308) | private static function findFile($file = null) {
    method wrap8 (line 330) | private static function wrap8($x) {
    method wrap32 (line 334) | private static function wrap32($x) {
    method getShmKey (line 338) | private static function getShmKey($filename) {
    method ipBetween (line 342) | private static function ipBetween($version, $ip, $low, $high) {
    method ipVersionAndNumber (line 366) | private static function ipVersionAndNumber($ip) {
    method bcBin2Dec (line 380) | private static function bcBin2Dec($data) {
    method read (line 394) | private function read($pos, $len) {
    method readString (line 406) | private function readString($pos, $additional = 0) {
    method readFloat (line 411) | private function readFloat($pos) {
    method readQuad (line 415) | private function readQuad($pos) {
    method readWord (line 419) | private function readWord($pos) {
    method readByte (line 423) | private function readByte($pos) {
    method readCountryNameAndCode (line 427) | private function readCountryNameAndCode($pointer) {
    method readRegionName (line 441) | private function readRegionName($pointer) {
    method readCityName (line 452) | private function readCityName($pointer) {
    method readLatitudeAndLongitude (line 463) | private function readLatitudeAndLongitude($pointer) {
    method readIsp (line 477) | private function readIsp($pointer) {
    method readDomainName (line 488) | private function readDomainName($pointer) {
    method readZipCode (line 499) | private function readZipCode($pointer) {
    method readTimeZone (line 510) | private function readTimeZone($pointer) {
    method readNetSpeed (line 521) | private function readNetSpeed($pointer) {
    method readIddAndAreaCodes (line 532) | private function readIddAndAreaCodes($pointer) {
    method readWeatherStationNameAndCode (line 546) | private function readWeatherStationNameAndCode($pointer) {
    method readMccMncAndMobileCarrierName (line 560) | private function readMccMncAndMobileCarrierName($pointer) {
    method readElevation (line 577) | private function readElevation($pointer) {
    method readUsageType (line 588) | private function readUsageType($pointer) {
    method readIp (line 599) | private function readIp($version, $pos) {
    method binSearch (line 609) | private function binSearch($version, $ipNumber) {
    method getDate (line 654) | public function getDate() {
    method getType (line 658) | public function getType() {
    method getFields (line 662) | public function getFields($asNames = false) {
    method getModuleVersion (line 677) | public function getModuleVersion() {
    method getDatabaseVersion (line 681) | public function getDatabaseVersion() {
    method lookup (line 685) | public function lookup($ip, $fields = null, $asNamed = true) {

FILE: js/common.js
  function hasClass (line 30) | function hasClass(obj, cls) {
  function addClass (line 34) | function addClass(obj, cls) {
  function removeClass (line 38) | function removeClass(obj, cls) {
  function toggleClass (line 45) | function toggleClass(obj,cls) {
  function hasClassByID (line 50) | function hasClassByID(id, cls) {
  function addClassByID (line 54) | function addClassByID(id, cls) {
  function removeClassByID (line 58) | function removeClassByID(id, cls) {
  function exist_id (line 66) | function exist_id(id) {
  function display_id (line 70) | function display_id(id, val) {
  function hide_frame (line 74) | function hide_frame(o) {
  function hide_me (line 78) | function hide_me(o) {
  function hide_id (line 82) | function hide_id() {
  function show_id (line 86) | function show_id() {
  function set_val (line 90) | function set_val(id, val) {
  function get_val (line 94) | function get_val(id) {
  function set_txt (line 98) | function set_txt(id, txt) {
  function get_txt (line 102) | function get_txt(id) {
  function set_style (line 106) | function set_style(id, key, val) {
  function get_style (line 110) | function get_style(id, key) {
  function set_prop (line 114) | function set_prop(id, key, val) {
  function get_prop (line 118) | function get_prop(id, key) {
  function set_focus (line 122) | function set_focus(id) {
  function set_enabled (line 126) | function set_enabled(id) {
  function set_disabled (line 131) | function set_disabled(id) {
  function I (line 136) | function I(a) {
  function preload (line 140) | function preload(){
  function sC (line 144) | function sC(a, b, c, d) {//set Cookie: a is name, b is value, c is expir...
  function gC (line 154) | function gC(a, f) {//get Cookie, f is default value
  function GetOffset (line 182) | function GetOffset(o, offset) {
  function GetOffsetA (line 190) | function GetOffsetA(e, p, offset) {
  function DropDown (line 208) | function DropDown($, obj) {
  function PopupMenu (line 302) | function PopupMenu($, O, Style, Pos) {//$: popup position object; O: pop...
  function selectButton (line 353) | function selectButton($, offset) {
  function SetDay (line 405) | function SetDay(cancel) {
  function GetPeriod (line 460) | function GetPeriod(from, to) {
  function SetPeriod (line 483) | function SetPeriod(Period) {
  function GenPeriods (line 500) | function GenPeriods() {
  function FormatDate (line 538) | function FormatDate(ptime, fmt) {
  function pGet (line 563) | function pGet(a) {// a:url, b:element ID
  function IncludeJS (line 585) | function IncludeJS(x) {
  function RefreshPage (line 601) | function RefreshPage() {
  function Visitor_API (line 615) | function Visitor_API(sid, date) {
  function selectSite (line 665) | function selectSite(x) {
  function selectHost (line 669) | function selectHost(x) {
  function selectLanguage (line 673) | function selectLanguage($) {
  function menu_click (line 717) | function menu_click(o) {
  function side_menu_resize (line 729) | function side_menu_resize(x) {
  function switch_menu (line 758) | function switch_menu(x) {

FILE: js/ichart.js
  function CHARTAPI (line 13) | function CHARTAPI(sid, r, from, to, period, type, timezone, key, timer, ...

FILE: js/icontrol.js
  function DatePick (line 12) | function DatePick(obj) {
  function Calendar (line 118) | function Calendar(o, from, to, period, current, lan) {

FILE: js/iline.js
  function ILINE (line 13) | function ILINE(sid, r, from, to, period, type, timezone, timer, host, bo...
  function IDTLINE (line 324) | function IDTLINE(sid, r, from, to, period, type, timezone, timer, host, ...
  function IRTLINE (line 679) | function IRTLINE(sid, r, from, to, period, type, timezone, timer, host, ...

FILE: js/ilog.js
  function LOGAPI (line 13) | function LOGAPI(sid, r, from, to, period, type, timezone, key, timer, cT...

FILE: js/imap.js
  function MAPAPI (line 13) | function MAPAPI(sid, r, from, to, period, type, timezone, key, timer, cT...

FILE: js/iprocess.js
  function IPROCESS (line 13) | function IPROCESS(uid, r, timer, host, box, Lan, Extra) {
  function ISUMMARY (line 663) | function ISUMMARY(uid, r, timer, host, hostname, box, Lan, Extra) {

FILE: js/itable.js
  function RTTBAPI (line 12) | function RTTBAPI(sid, r, type, timezone, timer, host, box, box2, Lan, Ex...

FILE: kernel.func.php
  function processSession (line 18) | function processSession(&$pid, &$session, &$redis_0, &$redis_2, &$redis_...
  function exitStatus (line 93) | function exitStatus($rn, &$redis_3, $redis_ca, $redis_ind, $redis_ses, $...
  function viewStatus (line 293) | function viewStatus($rn, &$redis_2, &$redis_3, $redis_ca, $redis_ind, $r...
  function sessionDuration (line 591) | function sessionDuration(&$redis_3, $session, $redis_ind, $redis_ses) {
  function con_db (line 718) | function con_db($host, $user, $pw) {
  function use_db (line 724) | function use_db(&$con, $db) {
  function create_table (line 730) | function create_table(&$con, $tbname, $tbrows) {
  function record_data (line 739) | function record_data(&$con, &$sql, $op, $row, &$Error) {
  function SDATA (line 782) | function SDATA(&$con, &$request, $k, $opt, $def, $maxL=0, $minL=0, $deco...
  function smd5 (line 848) | function smd5($str) {
  function tmd5 (line 852) | function tmd5($str) {
  function check_blocked_id (line 856) | function check_blocked_id(&$redis, $sid, $vid, $stp) {
  function record_robot_ip (line 868) | function record_robot_ip(&$redis, $ip, $rbn) {
  function check_robot_ip (line 886) | function check_robot_ip(&$redis, $ip, $rbn) {
  function filter_robot_ip (line 895) | function filter_robot_ip(&$redis, $ip) {
  function get_server_info (line 923) | function get_server_info(&$redis) {
  function export_array (line 963) | function export_array(&$Arr) {
  function autoresponse (line 971) | function autoresponse($from, $to, $subject, $errmsg) {

FILE: kernel.php
  function execute (line 296) | function execute(&$db_con, $pid, &$request, $start_time, &$IPH, &$redis_...

FILE: kernel.sql.php
  function INIT_CA (line 241) | function INIT_CA() {
  function get_redis_array (line 378) | function get_redis_array($a, &$CA) {
  function init_ind_insert (line 702) | function init_ind_insert($name, $type=0) {
  function get_ca_insert_value (line 935) | function get_ca_insert_value(&$CA){
  function get_ind_insert_value (line 1051) | function get_ind_insert_value(&$CA) {
  function get_vc_insert_value (line 1105) | function get_vc_insert_value(&$CA) {

FILE: language.php
  function init_language (line 15) | function init_language() {

FILE: login.php
  function login (line 62) | function login($user, $pw, &$success) {

FILE: persistence.php
  function persistence (line 89) | function persistence($redis_tb, &$db_con, &$redis_0, &$redis_2, &$redis_...
  function restartPersistence (line 457) | function restartPersistence() {

FILE: report/actions_all_page.php
  function actions_all_page_html (line 14) | function actions_all_page_html() {

FILE: report/actions_bounce_page.php
  function actions_bounce_page_html (line 15) | function actions_bounce_page_html() {

FILE: report/actions_entry_page.php
  function actions_entry_page_html (line 14) | function actions_entry_page_html() {

FILE: report/actions_exit_page.php
  function actions_exit_page_html (line 14) | function actions_exit_page_html() {

FILE: report/actions_robot_crawled_page.php
  function actions_robot_crawled_page_html (line 14) | function actions_robot_crawled_page_html() {

FILE: report/dashboard.php
  function dashboard_body_html (line 14) | function dashboard_body_html() {
  function dashboard_html (line 321) | function dashboard_html() {

FILE: report/referrers_all_referrer.php
  function referrers_all_referrer_html (line 14) | function referrers_all_referrer_html() {

FILE: report/referrers_channel.php
  function referrers_channel_html (line 14) | function referrers_channel_html() {

FILE: report/referrers_se_keyword.php
  function referrers_se_keyword_html (line 14) | function referrers_se_keyword_html() {

FILE: report/referrers_website.php
  function referrers_website_html (line 14) | function referrers_website_html() {

FILE: report/visitors_active.php
  function visitors_active_visitor_html (line 14) | function visitors_active_visitor_html() {

FILE: report/visitors_active_visitor.php
  function visitors_active_visitor_html (line 14) | function visitors_active_visitor_html() {

FILE: report/visitors_day_trend.php
  function visitors_day_trend_html (line 14) | function visitors_day_trend_html() {

FILE: report/visitors_device.php
  function visitors_device_html (line 14) | function visitors_device_html() {

FILE: report/visitors_location.php
  function visitors_location_html (line 15) | function visitors_location_html() {

FILE: report/visitors_log.php
  function visitors_log_html (line 14) | function visitors_log_html() {

FILE: report/visitors_map.php
  function visitors_map_html (line 15) | function visitors_map_html() {

FILE: report/visitors_overview.php
  function visitors_overview_html (line 14) | function visitors_overview_html() {

FILE: report/visitors_realtime.php
  function visitors_realtime_html (line 14) | function visitors_realtime_html() {

FILE: report/visitors_robot_log.php
  function visitors_robot_log_html (line 14) | function visitors_robot_log_html() {

FILE: report/visitors_software.php
  function visitors_software_html (line 15) | function visitors_software_html() {

FILE: report/visitors_times.php
  function visitors_times_html (line 14) | function visitors_times_html() {

FILE: reset_pw.php
  function reset_pw (line 70) | function reset_pw($id, $verify_code, $pw, &$success) {

FILE: setting/settings.php
  function change_settings (line 14) | function change_settings() {
  function settings_html (line 137) | function settings_html() {

FILE: setting/settings_about_ca.php
  function settings_about_ca_html (line 17) | function settings_about_ca_html() {

FILE: site/sites_add_site.php
  function add_site (line 14) | function add_site(&$success) {
  function check_domain_ip (line 200) | function check_domain_ip($x) {
  function add_site_html (line 214) | function add_site_html() {
  function get_dc_list (line 311) | function get_dc_list() {
  function get_tz_list (line 326) | function get_tz_list() {
  function get_tz_city (line 341) | function get_tz_city($tz) {

FILE: site/sites_all_sites.php
  function all_sites (line 14) | function all_sites() {
  function get_visits (line 45) | function get_visits($sid, $host, $tz) {
  function all_sites_html (line 68) | function all_sites_html() {
  function get_tz_city (line 198) | function get_tz_city($tz) {

FILE: site/sites_blocked_ids.php
  function blocked_ids_operation (line 13) | function blocked_ids_operation() {
  function blocked_ids_table_html (line 42) | function blocked_ids_table_html() {
  function blocked_ids (line 65) | function blocked_ids() {
  function blocked_ids_html (line 100) | function blocked_ids_html() {

FILE: site/sites_blocked_ips.php
  function status_html (line 13) | function status_html($status) {
  function blocked_ips_operation (line 39) | function blocked_ips_operation() {
  function blocked_ips_table_html (line 68) | function blocked_ips_table_html() {
  function blocked_ips_html (line 174) | function blocked_ips_html() {

FILE: site/sites_blocked_pages.php
  function blocked_pages_operation (line 65) | function blocked_pages_operation() {
  function blocked_pages_table_html (line 94) | function blocked_pages_table_html() {
  function blocked_pages_html (line 198) | function blocked_pages_html() {

FILE: site/sites_blocked_sites.php
  function blocked_sites_operation (line 66) | function blocked_sites_operation() {
  function blocked_sites_table_html (line 95) | function blocked_sites_table_html() {
  function blocked_sites_html (line 199) | function blocked_sites_html() {

FILE: site/sites_delete_site.php
  function delete_site (line 14) | function delete_site(&$success) {
  function delete_site_html (line 157) | function delete_site_html() {

FILE: site/sites_domains.php
  function domains_operation (line 62) | function domains_operation() {
  function domains_table_html (line 91) | function domains_table_html() {
  function domains_html (line 190) | function domains_html() {

FILE: site/sites_filtered_domains.php
  function filtered_domains_operation (line 66) | function filtered_domains_operation() {
  function filtered_domains_table_html (line 95) | function filtered_domains_table_html() {
  function filtered_domains_html (line 179) | function filtered_domains_html() {

FILE: site/sites_get_js_code.php
  function get_js_code_html (line 14) | function get_js_code_html() {

FILE: site/sites_modify_site_config.php
  function modify_site_config (line 13) | function modify_site_config() {
  function site_config_html (line 106) | function site_config_html() {
  function get_ipdb_list (line 218) | function get_ipdb_list($ipdb) {
  function get_tz_list (line 235) | function get_tz_list($timezone) {
  function get_tz_city (line 251) | function get_tz_city($tz) {

FILE: site/sites_visitor_password.php
  function modify_visitor_password (line 14) | function modify_visitor_password() {
  function visitor_password_html (line 59) | function visitor_password_html() {

FILE: vendor/composer/ClassLoader.php
  class ClassLoader (line 43) | class ClassLoader
    method getPrefixes (line 60) | public function getPrefixes()
    method getPrefixesPsr4 (line 69) | public function getPrefixesPsr4()
    method getFallbackDirs (line 74) | public function getFallbackDirs()
    method getFallbackDirsPsr4 (line 79) | public function getFallbackDirsPsr4()
    method getClassMap (line 84) | public function getClassMap()
    method addClassMap (line 92) | public function addClassMap(array $classMap)
    method add (line 109) | public function add($prefix, $paths, $prepend = false)
    method addPsr4 (line 156) | public function addPsr4($prefix, $paths, $prepend = false)
    method set (line 201) | public function set($prefix, $paths)
    method setPsr4 (line 219) | public function setPsr4($prefix, $paths)
    method setUseIncludePath (line 238) | public function setUseIncludePath($useIncludePath)
    method getUseIncludePath (line 249) | public function getUseIncludePath()
    method setClassMapAuthoritative (line 260) | public function setClassMapAuthoritative($classMapAuthoritative)
    method isClassMapAuthoritative (line 270) | public function isClassMapAuthoritative()
    method setApcuPrefix (line 280) | public function setApcuPrefix($apcuPrefix)
    method getApcuPrefix (line 290) | public function getApcuPrefix()
    method register (line 300) | public function register($prepend = false)
    method unregister (line 308) | public function unregister()
    method loadClass (line 319) | public function loadClass($class)
    method findFile (line 335) | public function findFile($class)
    method findFileWithExtension (line 370) | private function findFileWithExtension($class, $ext)
  function includeFile (line 442) | function includeFile($file)

FILE: vendor/composer/autoload_real.php
  class ComposerAutoloaderInit0b5bbac11d8e604cd8ca0d8fc4c4e445 (line 5) | class ComposerAutoloaderInit0b5bbac11d8e604cd8ca0d8fc4c4e445
    method loadClassLoader (line 9) | public static function loadClassLoader($class)
    method getLoader (line 16) | public static function getLoader()

FILE: vendor/composer/autoload_static.php
  class ComposerStaticInit0b5bbac11d8e604cd8ca0d8fc4c4e445 (line 7) | class ComposerStaticInit0b5bbac11d8e604cd8ca0d8fc4c4e445
    method getInitializer (line 44) | public static function getInitializer(ClassLoader $loader)

FILE: vendor/geoip2/geoip2/src/Compat/JsonSerializable.php
  type JsonSerializable (line 15) | interface JsonSerializable extends \JsonSerializable
    method jsonSerialize (line 25) | public function jsonSerialize();
  type JsonSerializable (line 19) | interface JsonSerializable
    method jsonSerialize (line 25) | public function jsonSerialize();

FILE: vendor/geoip2/geoip2/src/Database/Reader.php
  class Reader (line 37) | class Reader implements ProviderInterface
    method __construct (line 51) | public function __construct($filename, $locales = array('en'))
    method city (line 69) | public function city($ipAddress)
    method country (line 86) | public function country($ipAddress)
    method anonymousIp (line 103) | public function anonymousIp($ipAddress)
    method connectionType (line 120) | public function connectionType($ipAddress)
    method domain (line 137) | public function domain($ipAddress)
    method enterprise (line 154) | public function enterprise($ipAddress)
    method isp (line 171) | public function isp($ipAddress)
    method modelFor (line 180) | private function modelFor($class, $type, $ipAddress)
    method flatModelFor (line 191) | private function flatModelFor($class, $type, $ipAddress)
    method getRecord (line 202) | private function getRecord($class, $type, $ipAddress)
    method metadata (line 241) | public function metadata()
    method close (line 249) | public function close()

FILE: vendor/geoip2/geoip2/src/Exception/AddressNotFoundException.php
  class AddressNotFoundException (line 8) | class AddressNotFoundException extends GeoIp2Exception

FILE: vendor/geoip2/geoip2/src/Exception/AuthenticationException.php
  class AuthenticationException (line 8) | class AuthenticationException extends GeoIp2Exception

FILE: vendor/geoip2/geoip2/src/Exception/GeoIp2Exception.php
  class GeoIp2Exception (line 8) | class GeoIp2Exception extends \Exception

FILE: vendor/geoip2/geoip2/src/Exception/HttpException.php
  class HttpException (line 9) | class HttpException extends GeoIp2Exception
    method __construct (line 16) | public function __construct(

FILE: vendor/geoip2/geoip2/src/Exception/InvalidRequestException.php
  class InvalidRequestException (line 9) | class InvalidRequestException extends HttpException
    method __construct (line 16) | public function __construct(

FILE: vendor/geoip2/geoip2/src/Exception/OutOfQueriesException.php
  class OutOfQueriesException (line 8) | class OutOfQueriesException extends GeoIp2Exception

FILE: vendor/geoip2/geoip2/src/Model/AbstractModel.php
  class AbstractModel (line 10) | abstract class AbstractModel implements JsonSerializable
    method __construct (line 17) | public function __construct($raw)
    method get (line 25) | protected function get($field)
    method __get (line 41) | public function __get($attr)
    method __isset (line 53) | public function __isset($attr)
    method jsonSerialize (line 58) | public function jsonSerialize()

FILE: vendor/geoip2/geoip2/src/Model/AnonymousIp.php
  class AnonymousIp (line 27) | class AnonymousIp extends AbstractModel
    method __construct (line 39) | public function __construct($raw)

FILE: vendor/geoip2/geoip2/src/Model/City.php
  class City (line 57) | class City extends Country
    method __construct (line 79) | public function __construct($raw, $locales = array('en'))
    method createSubdivisions (line 90) | private function createSubdivisions($raw, $locales)
    method __get (line 107) | public function __get($attr)
    method __isset (line 119) | public function __isset($attr)
    method mostSpecificSubdivision (line 130) | private function mostSpecificSubdivision()

FILE: vendor/geoip2/geoip2/src/Model/ConnectionType.php
  class ConnectionType (line 16) | class ConnectionType extends AbstractModel
    method __construct (line 24) | public function __construct($raw)

FILE: vendor/geoip2/geoip2/src/Model/Country.php
  class Country (line 35) | class Country extends AbstractModel
    method __construct (line 48) | public function __construct($raw, $locales = array('en'))

FILE: vendor/geoip2/geoip2/src/Model/Domain.php
  class Domain (line 16) | class Domain extends AbstractModel
    method __construct (line 24) | public function __construct($raw)

FILE: vendor/geoip2/geoip2/src/Model/Enterprise.php
  class Enterprise (line 54) | class Enterprise extends City

FILE: vendor/geoip2/geoip2/src/Model/Insights.php
  class Insights (line 54) | class Insights extends City

FILE: vendor/geoip2/geoip2/src/Model/Isp.php
  class Isp (line 25) | class Isp extends AbstractModel
    method __construct (line 36) | public function __construct($raw)

FILE: vendor/geoip2/geoip2/src/ProviderInterface.php
  type ProviderInterface (line 5) | interface ProviderInterface
    method country (line 12) | public function country($ipAddress);
    method city (line 19) | public function city($ipAddress);

FILE: vendor/geoip2/geoip2/src/Record/AbstractPlaceRecord.php
  class AbstractPlaceRecord (line 5) | abstract class AbstractPlaceRecord extends AbstractRecord
    method __construct (line 12) | public function __construct($record, $locales = array('en'))
    method __get (line 21) | public function __get($attr)
    method __isset (line 33) | public function __isset($attr)
    method name (line 42) | private function name()
    method firstSetNameLocale (line 48) | private function firstSetNameLocale()

FILE: vendor/geoip2/geoip2/src/Record/AbstractRecord.php
  class AbstractRecord (line 7) | abstract class AbstractRecord implements JsonSerializable
    method __construct (line 14) | public function __construct($record)
    method __get (line 22) | public function __get($attr)
    method __isset (line 40) | public function __isset($attr)
    method attributeToKey (line 46) | private function attributeToKey($attr)
    method validAttribute (line 51) | private function validAttribute($attr)
    method jsonSerialize (line 56) | public function jsonSerialize()

FILE: vendor/geoip2/geoip2/src/Record/City.php
  class City (line 26) | class City extends AbstractPlaceRecord

FILE: vendor/geoip2/geoip2/src/Record/Continent.php
  class Continent (line 25) | class Continent extends AbstractPlaceRecord

FILE: vendor/geoip2/geoip2/src/Record/Country.php
  class Country (line 30) | class Country extends AbstractPlaceRecord

FILE: vendor/geoip2/geoip2/src/Record/Location.php
  class Location (line 43) | class Location extends AbstractRecord

FILE: vendor/geoip2/geoip2/src/Record/MaxMind.php
  class MaxMind (line 13) | class MaxMind extends AbstractRecord

FILE: vendor/geoip2/geoip2/src/Record/Postal.php
  class Postal (line 21) | class Postal extends AbstractRecord

FILE: vendor/geoip2/geoip2/src/Record/RepresentedCountry.php
  class RepresentedCountry (line 31) | class RepresentedCountry extends Country

FILE: vendor/geoip2/geoip2/src/Record/Subdivision.php
  class Subdivision (line 34) | class Subdivision extends AbstractPlaceRecord

FILE: vendor/geoip2/geoip2/src/Record/Traits.php
  class Traits (line 89) | class Traits extends AbstractRecord

FILE: vendor/geoip2/geoip2/src/WebService/Client.php
  class Client (line 45) | class Client implements ProviderInterface
    method __construct (line 68) | public function __construct(
    method userAgent (line 91) | private function userAgent()
    method city (line 123) | public function city($ipAddress = 'me')
    method country (line 155) | public function country($ipAddress = 'me')
    method insights (line 187) | public function insights($ipAddress = 'me')
    method responseFor (line 192) | private function responseFor($endpoint, $class, $ipAddress)

FILE: vendor/maxmind-db/reader/src/MaxMind/Db/Reader.php
  class Reader (line 14) | class Reader
    method __construct (line 38) | public function __construct($database)
    method get (line 86) | public function get($ipAddress)
    method findAddressInTree (line 119) | private function findAddressInTree($ipAddress)
    method startNode (line 150) | private function startNode($length)
    method ipV4StartNode (line 162) | private function ipV4StartNode()
    method readNode (line 182) | private function readNode($nodeNumber, $index)
    method resolveDataPointer (line 215) | private function resolveDataPointer($pointer)
    method findMetadataStart (line 234) | private function findMetadataStart($filename)
    method metadata (line 265) | public function metadata()
    method close (line 290) | public function close()

FILE: vendor/maxmind-db/reader/src/MaxMind/Db/Reader/Decoder.php
  class Decoder (line 8) | class Decoder
    method __construct (line 36) | public function __construct(
    method decode (line 49) | public function decode($offset)
    method decodeByType (line 101) | private function decodeByType($type, $offset, $size)
    method verifySize (line 140) | private function verifySize($expected, $actual)
    method decodeArray (line 149) | private function decodeArray($size, $offset)
    method decodeBoolean (line 161) | private function decodeBoolean($size)
    method decodeDouble (line 166) | private function decodeDouble($bits)
    method decodeFloat (line 173) | private function decodeFloat($bits)
    method decodeInt32 (line 180) | private function decodeInt32($bytes)
    method decodeMap (line 187) | private function decodeMap($size, $offset)
    method decodePointer (line 208) | private function decodePointer($ctrlByte, $offset)
    method decodeUint (line 226) | private function decodeUint($bytes)
    method decodeBigUint (line 232) | private function decodeBigUint($bytes, $byteLength)
    method decodeString (line 267) | private function decodeString($bytes)
    method sizeFromCtrlByte (line 274) | private function sizeFromCtrlByte($ctrlByte, $offset)
    method zeroPadLeft (line 293) | private function zeroPadLeft($content, $desiredLength)
    method maybeSwitchByteOrder (line 298) | private function maybeSwitchByteOrder($bytes)
    method isPlatformLittleEndian (line 303) | private function isPlatformLittleEndian()

FILE: vendor/maxmind-db/reader/src/MaxMind/Db/Reader/InvalidDatabaseException.php
  class InvalidDatabaseException (line 8) | class InvalidDatabaseException extends \Exception

FILE: vendor/maxmind-db/reader/src/MaxMind/Db/Reader/Metadata.php
  class Metadata (line 42) | class Metadata
    method __construct (line 56) | public function __construct($metadata)
    method __get (line 73) | public function __get($var)

FILE: vendor/maxmind-db/reader/src/MaxMind/Db/Reader/Util.php
  class Util (line 7) | class Util
    method read (line 9) | public static function read($stream, $offset, $numberOfBytes)

FILE: verify.php
  function verify (line 31) | function verify($id, $verify_code, &$success) {

FILE: visitor.php
  function login (line 82) | function login($id, $siteid) {
  function get_visitor_password (line 94) | function get_visitor_password(&$visitpw, &$visittype, $id, $siteid) {
Condensed preview — 133 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (2,478K chars).
[
  {
    "path": "README.md",
    "chars": 12761,
    "preview": "# Centcount Analytics 1.0\n## An open-source web analytics software\n## Centcount Analytics 2.0 Pro is available now! <a h"
  },
  {
    "path": "api/api_ca.php",
    "chars": 43193,
    "preview": "<?php\r\n/*!\r\n* ATTENTION: THIS FREE LICENSE IS ONLY FOR PERSONAL NON-COMMERCIAL USER. FOR COMMERCIAL PURPOSES, PLEASE PUR"
  },
  {
    "path": "api/api_manage.php",
    "chars": 23313,
    "preview": "<?php\r\n/*!\r\n* ATTENTION: THIS FREE LICENSE IS ONLY FOR PERSONAL NON-COMMERCIAL USER. FOR COMMERCIAL PURPOSES, PLEASE PUR"
  },
  {
    "path": "ca.php",
    "chars": 41725,
    "preview": "<?php\r\n/*!\r\n* ATTENTION: THIS FREE LICENSE IS ONLY FOR PERSONAL NON-COMMERCIAL USER. FOR COMMERCIAL PURPOSES, PLEASE PUR"
  },
  {
    "path": "ca_version.php",
    "chars": 605,
    "preview": "<?php\r\n/*!\r\n* ATTENTION: THIS FREE LICENSE IS ONLY FOR PERSONAL NON-COMMERCIAL USER. FOR COMMERCIAL PURPOSES, PLEASE PUR"
  },
  {
    "path": "cache_settings.php",
    "chars": 2545,
    "preview": "<?php\r\n/*!\r\n* ATTENTION: THIS FREE LICENSE IS ONLY FOR PERSONAL NON-COMMERCIAL USER. FOR COMMERCIAL PURPOSES, PLEASE PUR"
  },
  {
    "path": "command.php",
    "chars": 14764,
    "preview": "<?php\r\n/*!\r\n* ATTENTION: THIS FREE LICENSE IS ONLY FOR PERSONAL NON-COMMERCIAL USER. FOR COMMERCIAL PURPOSES, PLEASE PUR"
  },
  {
    "path": "common.php",
    "chars": 31708,
    "preview": "<?php\r\n/*!\r\n* ATTENTION: THIS FREE LICENSE IS ONLY FOR PERSONAL NON-COMMERCIAL USER. FOR COMMERCIAL PURPOSES, PLEASE PUR"
  },
  {
    "path": "config/config_common.php",
    "chars": 2687,
    "preview": "<?php\r\n/*!\r\n* ATTENTION: THIS FREE LICENSE IS ONLY FOR PERSONAL NON-COMMERCIAL USER. FOR COMMERCIAL PURPOSES, PLEASE PUR"
  },
  {
    "path": "config/config_mail.php",
    "chars": 992,
    "preview": "<?php\r\n/*!\r\n* ATTENTION: THIS FREE LICENSE IS ONLY FOR PERSONAL NON-COMMERCIAL USER. FOR COMMERCIAL PURPOSES, PLEASE PUR"
  },
  {
    "path": "config/config_redis.php",
    "chars": 1237,
    "preview": "<?php\r\n/*!\r\n* ATTENTION: THIS FREE LICENSE IS ONLY FOR PERSONAL NON-COMMERCIAL USER. FOR COMMERCIAL PURPOSES, PLEASE PUR"
  },
  {
    "path": "config/config_security.php",
    "chars": 1245,
    "preview": "<?php\r\n/*!\r\n* ATTENTION: THIS FREE LICENSE IS ONLY FOR PERSONAL NON-COMMERCIAL USER. FOR COMMERCIAL PURPOSES, PLEASE PUR"
  },
  {
    "path": "core.php",
    "chars": 10580,
    "preview": "<?php\r\n/*!\r\n* ATTENTION: THIS FREE LICENSE IS ONLY FOR PERSONAL NON-COMMERCIAL USER. FOR COMMERCIAL PURPOSES, PLEASE PUR"
  },
  {
    "path": "css/common.css",
    "chars": 9439,
    "preview": "/*!\r\n* ATTENTION: THIS FREE LICENSE IS ONLY FOR PERSONAL NON-COMMERCIAL USER. FOR COMMERCIAL PURPOSES, PLEASE PURCHASE A"
  },
  {
    "path": "css/ichart.css",
    "chars": 13568,
    "preview": "/*!\r\n* ATTENTION: THIS FREE LICENSE IS ONLY FOR PERSONAL NON-COMMERCIAL USER. FOR COMMERCIAL PURPOSES, PLEASE PURCHASE A"
  },
  {
    "path": "css/icontrol.css",
    "chars": 10977,
    "preview": "/*!\r\n* ATTENTION: THIS FREE LICENSE IS ONLY FOR PERSONAL NON-COMMERCIAL USER. FOR COMMERCIAL PURPOSES, PLEASE PURCHASE A"
  },
  {
    "path": "css/manager.css",
    "chars": 5773,
    "preview": "/*!\r\n* ATTENTION: THIS FREE LICENSE IS ONLY FOR PERSONAL NON-COMMERCIAL USER. FOR COMMERCIAL PURPOSES, PLEASE PURCHASE A"
  },
  {
    "path": "errlog.php",
    "chars": 6279,
    "preview": "<?php\r\n/*!\r\n* ATTENTION: THIS FREE LICENSE IS ONLY FOR PERSONAL NON-COMMERCIAL USER. FOR COMMERCIAL PURPOSES, PLEASE PUR"
  },
  {
    "path": "forgot.php",
    "chars": 8460,
    "preview": "<?php\r\n/*!\r\n* ATTENTION: THIS FREE LICENSE IS ONLY FOR PERSONAL NON-COMMERCIAL USER. FOR COMMERCIAL PURPOSES, PLEASE PUR"
  },
  {
    "path": "host/hosts_host_status.php",
    "chars": 10082,
    "preview": "<?php\r\n/*!\r\n* ATTENTION: THIS FREE LICENSE IS ONLY FOR PERSONAL NON-COMMERCIAL USER. FOR COMMERCIAL PURPOSES, PLEASE PUR"
  },
  {
    "path": "html.php",
    "chars": 2671,
    "preview": "<?php\r\n/*!\r\n* ATTENTION: THIS FREE LICENSE IS ONLY FOR PERSONAL NON-COMMERCIAL USER. FOR COMMERCIAL PURPOSES, PLEASE PUR"
  },
  {
    "path": "install.php",
    "chars": 36952,
    "preview": "<?php\r\n/*!\r\n* ATTENTION: THIS FREE LICENSE IS ONLY FOR PERSONAL NON-COMMERCIAL USER. FOR COMMERCIAL PURPOSES, PLEASE PUR"
  },
  {
    "path": "ipdb/README.md",
    "chars": 43,
    "preview": "Unzip file \"ipdb.zip\" to current directory\n"
  },
  {
    "path": "ipdb.class.php",
    "chars": 31448,
    "preview": "<?php\r\n/* Copyright (C) 2005-2016 IP2Location.com  All Rights Reserved */\r\n\r\nnamespace IP2Location;\r\n\r\nclass Database {\r"
  },
  {
    "path": "js/common.js",
    "chars": 21303,
    "preview": "/*!\r\n* ATTENTION: THIS FREE LICENSE IS ONLY FOR PERSONAL NON-COMMERCIAL USER. FOR COMMERCIAL PURPOSES, PLEASE PURCHASE A"
  },
  {
    "path": "js/ichart.js",
    "chars": 75232,
    "preview": "/*!\r\n* ATTENTION: THIS FREE LICENSE IS ONLY FOR PERSONAL NON-COMMERCIAL USER. FOR COMMERCIAL PURPOSES, PLEASE PURCHASE A"
  },
  {
    "path": "js/icontrol.js",
    "chars": 10134,
    "preview": "/*!\r\n* ATTENTION: THIS FREE LICENSE IS ONLY FOR PERSONAL NON-COMMERCIAL USER. FOR COMMERCIAL PURPOSES, PLEASE PURCHASE A"
  },
  {
    "path": "js/iline.js",
    "chars": 26000,
    "preview": "/*!\r\n* ATTENTION: THIS FREE LICENSE IS ONLY FOR PERSONAL NON-COMMERCIAL USER. FOR COMMERCIAL PURPOSES, PLEASE PURCHASE A"
  },
  {
    "path": "js/ilog.js",
    "chars": 51158,
    "preview": "/*!\r\n* ATTENTION: THIS FREE LICENSE IS ONLY FOR PERSONAL NON-COMMERCIAL USER. FOR COMMERCIAL PURPOSES, PLEASE PURCHASE A"
  },
  {
    "path": "js/imap.js",
    "chars": 19661,
    "preview": "/*!\r\n* ATTENTION: THIS FREE LICENSE IS ONLY FOR PERSONAL NON-COMMERCIAL USER. FOR COMMERCIAL PURPOSES, PLEASE PURCHASE A"
  },
  {
    "path": "js/iprocess.js",
    "chars": 36567,
    "preview": "/*!\r\n* ATTENTION: THIS FREE LICENSE IS ONLY FOR PERSONAL NON-COMMERCIAL USER. FOR COMMERCIAL PURPOSES, PLEASE PURCHASE A"
  },
  {
    "path": "js/itable.js",
    "chars": 24089,
    "preview": "/*!\r\n* ATTENTION: THIS FREE LICENSE IS ONLY FOR PERSONAL NON-COMMERCIAL USER. FOR COMMERCIAL PURPOSES, PLEASE PURCHASE A"
  },
  {
    "path": "kernel.func.php",
    "chars": 33854,
    "preview": "<?php\r\n/*!\r\n* ATTENTION: THIS FREE LICENSE IS ONLY FOR PERSONAL NON-COMMERCIAL USER. FOR COMMERCIAL PURPOSES, PLEASE PUR"
  },
  {
    "path": "kernel.php",
    "chars": 46800,
    "preview": "<?php\r\n/*!\r\n* ATTENTION: THIS FREE LICENSE IS ONLY FOR PERSONAL NON-COMMERCIAL USER. FOR COMMERCIAL PURPOSES, PLEASE PUR"
  },
  {
    "path": "kernel.sql.php",
    "chars": 28619,
    "preview": "<?php\r\n/*!\r\n* ATTENTION: THIS FREE LICENSE IS ONLY FOR PERSONAL NON-COMMERCIAL USER. FOR COMMERCIAL PURPOSES, PLEASE PUR"
  },
  {
    "path": "language/lan-de-DE.php",
    "chars": 13877,
    "preview": "<?php\r\n/*!\r\n* ATTENTION: THIS FREE LICENSE IS ONLY FOR PERSONAL NON-COMMERCIAL USER. FOR COMMERCIAL PURPOSES, PLEASE PUR"
  },
  {
    "path": "language/lan-en-US.php",
    "chars": 13842,
    "preview": "<?php\r\n/*!\r\n* ATTENTION: THIS FREE LICENSE IS ONLY FOR PERSONAL NON-COMMERCIAL USER. FOR COMMERCIAL PURPOSES, PLEASE PUR"
  },
  {
    "path": "language/lan-ja-JP.php",
    "chars": 13595,
    "preview": "<?php\r\n/*!\r\n* ATTENTION: THIS FREE LICENSE IS ONLY FOR PERSONAL NON-COMMERCIAL USER. FOR COMMERCIAL PURPOSES, PLEASE PUR"
  },
  {
    "path": "language/lan-zh-CN.php",
    "chars": 11073,
    "preview": "<?php\r\n/*!\r\n* ATTENTION: THIS FREE LICENSE IS ONLY FOR PERSONAL NON-COMMERCIAL USER. FOR COMMERCIAL PURPOSES, PLEASE PUR"
  },
  {
    "path": "language/lan-zh-TW.php",
    "chars": 11072,
    "preview": "<?php\r\n/*!\r\n* ATTENTION: THIS FREE LICENSE IS ONLY FOR PERSONAL NON-COMMERCIAL USER. FOR COMMERCIAL PURPOSES, PLEASE PUR"
  },
  {
    "path": "language.php",
    "chars": 1430,
    "preview": "<?php\r\n/*!\r\n* ATTENTION: THIS FREE LICENSE IS ONLY FOR PERSONAL NON-COMMERCIAL USER. FOR COMMERCIAL PURPOSES, PLEASE PUR"
  },
  {
    "path": "license.txt",
    "chars": 12784,
    "preview": "English Version of EULA, for non-Chinese-Speaking Users Only\r\n\r\nEND USER LICENSE AGREEMENT\r\nPlease read this agreement "
  },
  {
    "path": "login.php",
    "chars": 9210,
    "preview": "<?php\r\n/*!\r\n* ATTENTION: THIS FREE LICENSE IS ONLY FOR PERSONAL NON-COMMERCIAL USER. FOR COMMERCIAL PURPOSES, PLEASE PUR"
  },
  {
    "path": "logout.php",
    "chars": 825,
    "preview": "<?php\r\n/*!\r\n* ATTENTION: THIS FREE LICENSE IS ONLY FOR PERSONAL NON-COMMERCIAL USER. FOR COMMERCIAL PURPOSES, PLEASE PUR"
  },
  {
    "path": "manager.php",
    "chars": 13736,
    "preview": "<?php\r\n/*!\r\n* ATTENTION: THIS FREE LICENSE IS ONLY FOR PERSONAL NON-COMMERCIAL USER. FOR COMMERCIAL PURPOSES, PLEASE PUR"
  },
  {
    "path": "maps/china.js",
    "chars": 41870,
    "preview": "(function (root, factory) {\n    if (typeof define === 'function' && define.amd) {\n        // AMD. Register as an anonymo"
  },
  {
    "path": "maps/world.js",
    "chars": 1014969,
    "preview": "(function (root, factory) {\r\n    if (typeof define === 'function' && define.amd) {\r\n        // AMD. Register as an anony"
  },
  {
    "path": "passport.php",
    "chars": 2507,
    "preview": "<?php\r\n/*!\r\n* ATTENTION: THIS FREE LICENSE IS ONLY FOR PERSONAL NON-COMMERCIAL USER. FOR COMMERCIAL PURPOSES, PLEASE PUR"
  },
  {
    "path": "persistence.php",
    "chars": 16944,
    "preview": "<?php\r\n/*!\r\n* ATTENTION: THIS FREE LICENSE IS ONLY FOR PERSONAL NON-COMMERCIAL USER. FOR COMMERCIAL PURPOSES, PLEASE PUR"
  },
  {
    "path": "relogin.php",
    "chars": 1634,
    "preview": "<?php\r\n/*!\r\n* ATTENTION: THIS FREE LICENSE IS ONLY FOR PERSONAL NON-COMMERCIAL USER. FOR COMMERCIAL PURPOSES, PLEASE PUR"
  },
  {
    "path": "report/actions_all_page.php",
    "chars": 4276,
    "preview": "<?php\r\n/*!\r\n* ATTENTION: THIS FREE LICENSE IS ONLY FOR PERSONAL NON-COMMERCIAL USER. FOR COMMERCIAL PURPOSES, PLEASE PUR"
  },
  {
    "path": "report/actions_bounce_page.php",
    "chars": 3413,
    "preview": "<?php\r\n/*!\r\n* ATTENTION: THIS FREE LICENSE IS ONLY FOR PERSONAL NON-COMMERCIAL USER. FOR COMMERCIAL PURPOSES, PLEASE PUR"
  },
  {
    "path": "report/actions_entry_page.php",
    "chars": 3260,
    "preview": "<?php\r\n/*!\r\n* ATTENTION: THIS FREE LICENSE IS ONLY FOR PERSONAL NON-COMMERCIAL USER. FOR COMMERCIAL PURPOSES, PLEASE PUR"
  },
  {
    "path": "report/actions_exit_page.php",
    "chars": 3244,
    "preview": "<?php\r\n/*!\r\n* ATTENTION: THIS FREE LICENSE IS ONLY FOR PERSONAL NON-COMMERCIAL USER. FOR COMMERCIAL PURPOSES, PLEASE PUR"
  },
  {
    "path": "report/actions_robot_crawled_page.php",
    "chars": 6493,
    "preview": "<?php\r\n/*!\r\n* ATTENTION: THIS FREE LICENSE IS ONLY FOR PERSONAL NON-COMMERCIAL USER. FOR COMMERCIAL PURPOSES, PLEASE PUR"
  },
  {
    "path": "report/dashboard.php",
    "chars": 19186,
    "preview": "<?php\r\n/*!\r\n* ATTENTION: THIS FREE LICENSE IS ONLY FOR PERSONAL NON-COMMERCIAL USER. FOR COMMERCIAL PURPOSES, PLEASE PUR"
  },
  {
    "path": "report/referrers_all_referrer.php",
    "chars": 3283,
    "preview": "<?php\r\n/*!\r\n* ATTENTION: THIS FREE LICENSE IS ONLY FOR PERSONAL NON-COMMERCIAL USER. FOR COMMERCIAL PURPOSES, PLEASE PUR"
  },
  {
    "path": "report/referrers_channel.php",
    "chars": 6983,
    "preview": "<?php\r\n/*!\r\n* ATTENTION: THIS FREE LICENSE IS ONLY FOR PERSONAL NON-COMMERCIAL USER. FOR COMMERCIAL PURPOSES, PLEASE PUR"
  },
  {
    "path": "report/referrers_se_keyword.php",
    "chars": 5270,
    "preview": "<?php\r\n/*!\r\n* ATTENTION: THIS FREE LICENSE IS ONLY FOR PERSONAL NON-COMMERCIAL USER. FOR COMMERCIAL PURPOSES, PLEASE PUR"
  },
  {
    "path": "report/referrers_website.php",
    "chars": 4356,
    "preview": "<?php\r\n/*!\r\n* ATTENTION: THIS FREE LICENSE IS ONLY FOR PERSONAL NON-COMMERCIAL USER. FOR COMMERCIAL PURPOSES, PLEASE PUR"
  },
  {
    "path": "report/visitors_active.php",
    "chars": 6492,
    "preview": "<?php\r\n/*!\r\n* ATTENTION: THIS FREE LICENSE IS ONLY FOR PERSONAL NON-COMMERCIAL USER. FOR COMMERCIAL PURPOSES, PLEASE PUR"
  },
  {
    "path": "report/visitors_active_visitor.php",
    "chars": 6492,
    "preview": "<?php\r\n/*!\r\n* ATTENTION: THIS FREE LICENSE IS ONLY FOR PERSONAL NON-COMMERCIAL USER. FOR COMMERCIAL PURPOSES, PLEASE PUR"
  },
  {
    "path": "report/visitors_day_trend.php",
    "chars": 3127,
    "preview": "<?php\r\n/*!\r\n* ATTENTION: THIS FREE LICENSE IS ONLY FOR PERSONAL NON-COMMERCIAL USER. FOR COMMERCIAL PURPOSES, PLEASE PUR"
  },
  {
    "path": "report/visitors_device.php",
    "chars": 4421,
    "preview": "<?php\r\n/*!\r\n* ATTENTION: THIS FREE LICENSE IS ONLY FOR PERSONAL NON-COMMERCIAL USER. FOR COMMERCIAL PURPOSES, PLEASE PUR"
  },
  {
    "path": "report/visitors_location.php",
    "chars": 7199,
    "preview": "<?php\r\n/*!\r\n* ATTENTION: THIS FREE LICENSE IS ONLY FOR PERSONAL NON-COMMERCIAL USER. FOR COMMERCIAL PURPOSES, PLEASE PUR"
  },
  {
    "path": "report/visitors_log.php",
    "chars": 3053,
    "preview": "<?php\r\n/*!\r\n* ATTENTION: THIS FREE LICENSE IS ONLY FOR PERSONAL NON-COMMERCIAL USER. FOR COMMERCIAL PURPOSES, PLEASE PUR"
  },
  {
    "path": "report/visitors_map.php",
    "chars": 3483,
    "preview": "<?php\r\n/*!\r\n* ATTENTION: THIS FREE LICENSE IS ONLY FOR PERSONAL NON-COMMERCIAL USER. FOR COMMERCIAL PURPOSES, PLEASE PUR"
  },
  {
    "path": "report/visitors_overview.php",
    "chars": 5033,
    "preview": "<?php\r\n/*!\r\n* ATTENTION: THIS FREE LICENSE IS ONLY FOR PERSONAL NON-COMMERCIAL USER. FOR COMMERCIAL PURPOSES, PLEASE PUR"
  },
  {
    "path": "report/visitors_realtime.php",
    "chars": 4503,
    "preview": "<?php\r\n/*!\r\n* ATTENTION: THIS FREE LICENSE IS ONLY FOR PERSONAL NON-COMMERCIAL USER. FOR COMMERCIAL PURPOSES, PLEASE PUR"
  },
  {
    "path": "report/visitors_robot_log.php",
    "chars": 3036,
    "preview": "<?php\r\n/*!\r\n* ATTENTION: THIS FREE LICENSE IS ONLY FOR PERSONAL NON-COMMERCIAL USER. FOR COMMERCIAL PURPOSES, PLEASE PUR"
  },
  {
    "path": "report/visitors_software.php",
    "chars": 7276,
    "preview": "<?php\r\n/*!\r\n* ATTENTION: THIS FREE LICENSE IS ONLY FOR PERSONAL NON-COMMERCIAL USER. FOR COMMERCIAL PURPOSES, PLEASE PUR"
  },
  {
    "path": "report/visitors_times.php",
    "chars": 4435,
    "preview": "<?php\r\n/*!\r\n* ATTENTION: THIS FREE LICENSE IS ONLY FOR PERSONAL NON-COMMERCIAL USER. FOR COMMERCIAL PURPOSES, PLEASE PUR"
  },
  {
    "path": "reset_pw.php",
    "chars": 11262,
    "preview": "<?php\r\n/*!\r\n* ATTENTION: THIS FREE LICENSE IS ONLY FOR PERSONAL NON-COMMERCIAL USER. FOR COMMERCIAL PURPOSES, PLEASE PUR"
  },
  {
    "path": "robots.txt",
    "chars": 238,
    "preview": "User-agent: *\r\nDisallow: /vendor/\r\nDisallow: /js/\r\nDisallow: /api/\r\nDisallow: /css/\r\nDisallow: /config/\r\nDisallow: /lang"
  },
  {
    "path": "setting/settings.php",
    "chars": 12465,
    "preview": "<?php\r\n/*!\r\n* ATTENTION: THIS FREE LICENSE IS ONLY FOR PERSONAL NON-COMMERCIAL USER. FOR COMMERCIAL PURPOSES, PLEASE PUR"
  },
  {
    "path": "setting/settings_about_ca.php",
    "chars": 3617,
    "preview": "<?php\r\n/*!\r\n* ATTENTION: THIS FREE LICENSE IS ONLY FOR PERSONAL NON-COMMERCIAL USER. FOR COMMERCIAL PURPOSES, PLEASE PUR"
  },
  {
    "path": "site/sites_add_site.php",
    "chars": 18286,
    "preview": "<?php\r\n/*!\r\n* ATTENTION: THIS FREE LICENSE IS ONLY FOR PERSONAL NON-COMMERCIAL USER. FOR COMMERCIAL PURPOSES, PLEASE PUR"
  },
  {
    "path": "site/sites_all_sites.php",
    "chars": 14803,
    "preview": "<?php\r\n/*!\r\n* ATTENTION: THIS FREE LICENSE IS ONLY FOR PERSONAL NON-COMMERCIAL USER. FOR COMMERCIAL PURPOSES, PLEASE PUR"
  },
  {
    "path": "site/sites_blocked_ids.php",
    "chars": 12724,
    "preview": "<?php\r\n/*!\r\n* ATTENTION: THIS FREE LICENSE IS ONLY FOR PERSONAL NON-COMMERCIAL USER. FOR COMMERCIAL PURPOSES, PLEASE PUR"
  },
  {
    "path": "site/sites_blocked_ips.php",
    "chars": 12995,
    "preview": "<?php\r\n/*!\r\n* ATTENTION: THIS FREE LICENSE IS ONLY FOR PERSONAL NON-COMMERCIAL USER. FOR COMMERCIAL PURPOSES, PLEASE PUR"
  },
  {
    "path": "site/sites_blocked_pages.php",
    "chars": 14209,
    "preview": "<?php\r\n/*!\r\n* ATTENTION: THIS FREE LICENSE IS ONLY FOR PERSONAL NON-COMMERCIAL USER. FOR COMMERCIAL PURPOSES, PLEASE PUR"
  },
  {
    "path": "site/sites_blocked_sites.php",
    "chars": 14140,
    "preview": "<?php\r\n/*!\r\n* ATTENTION: THIS FREE LICENSE IS ONLY FOR PERSONAL NON-COMMERCIAL USER. FOR COMMERCIAL PURPOSES, PLEASE PUR"
  },
  {
    "path": "site/sites_delete_site.php",
    "chars": 10637,
    "preview": "<?php\r\n/*!\r\n* ATTENTION: THIS FREE LICENSE IS ONLY FOR PERSONAL NON-COMMERCIAL USER. FOR COMMERCIAL PURPOSES, PLEASE PUR"
  },
  {
    "path": "site/sites_domains.php",
    "chars": 13248,
    "preview": "<?php\r\n/*!\r\n* ATTENTION: THIS FREE LICENSE IS ONLY FOR PERSONAL NON-COMMERCIAL USER. FOR COMMERCIAL PURPOSES, PLEASE PUR"
  },
  {
    "path": "site/sites_filtered_domains.php",
    "chars": 11328,
    "preview": "<?php\r\n/*!\r\n* ATTENTION: THIS FREE LICENSE IS ONLY FOR PERSONAL NON-COMMERCIAL USER. FOR COMMERCIAL PURPOSES, PLEASE PUR"
  },
  {
    "path": "site/sites_get_js_code.php",
    "chars": 3869,
    "preview": "<?php\r\n/*!\r\n* ATTENTION: THIS FREE LICENSE IS ONLY FOR PERSONAL NON-COMMERCIAL USER. FOR COMMERCIAL PURPOSES, PLEASE PUR"
  },
  {
    "path": "site/sites_modify_site_config.php",
    "chars": 15749,
    "preview": "<?php\r\n/*!\r\n* ATTENTION: THIS FREE LICENSE IS ONLY FOR PERSONAL NON-COMMERCIAL USER. FOR COMMERCIAL PURPOSES, PLEASE PUR"
  },
  {
    "path": "site/sites_visitor_password.php",
    "chars": 9520,
    "preview": "<?php\r\n/*!\r\n* ATTENTION: THIS FREE LICENSE IS ONLY FOR PERSONAL NON-COMMERCIAL USER. FOR COMMERCIAL PURPOSES, PLEASE PUR"
  },
  {
    "path": "validcode.php",
    "chars": 2013,
    "preview": "<?php\r\n/*!\r\n* ATTENTION: THIS FREE LICENSE IS ONLY FOR PERSONAL NON-COMMERCIAL USER. FOR COMMERCIAL PURPOSES, PLEASE PUR"
  },
  {
    "path": "vendor/autoload.php",
    "chars": 178,
    "preview": "<?php\n\n// autoload.php @generated by Composer\n\nrequire_once __DIR__ . '/composer/autoload_real.php';\n\nreturn ComposerAut"
  },
  {
    "path": "vendor/composer/ClassLoader.php",
    "chars": 13451,
    "preview": "<?php\n\n/*\n * This file is part of Composer.\n *\n * (c) Nils Adermann <naderman@naderman.de>\n *     Jordi Boggiano <j.bogg"
  },
  {
    "path": "vendor/composer/autoload_classmap.php",
    "chars": 147,
    "preview": "<?php\n\n// autoload_classmap.php @generated by Composer\n\n$vendorDir = dirname(dirname(__FILE__));\n$baseDir = dirname($ven"
  },
  {
    "path": "vendor/composer/autoload_namespaces.php",
    "chars": 149,
    "preview": "<?php\n\n// autoload_namespaces.php @generated by Composer\n\n$vendorDir = dirname(dirname(__FILE__));\n$baseDir = dirname($v"
  },
  {
    "path": "vendor/composer/autoload_psr4.php",
    "chars": 434,
    "preview": "<?php\n\n// autoload_psr4.php @generated by Composer\n\n$vendorDir = dirname(dirname(__FILE__));\n$baseDir = dirname($vendorD"
  },
  {
    "path": "vendor/composer/autoload_real.php",
    "chars": 1762,
    "preview": "<?php\n\n// autoload_real.php @generated by Composer\n\nclass ComposerAutoloaderInit0b5bbac11d8e604cd8ca0d8fc4c4e445\n{\n    p"
  },
  {
    "path": "vendor/composer/autoload_static.php",
    "chars": 1388,
    "preview": "<?php\n\n// autoload_static.php @generated by Composer\n\nnamespace Composer\\Autoload;\n\nclass ComposerStaticInit0b5bbac11d8e"
  },
  {
    "path": "vendor/geoip2/geoip2/src/Compat/JsonSerializable.php",
    "chars": 535,
    "preview": "<?php\n\nnamespace GeoIp2\\Compat;\n\n// @codingStandardsIgnoreFile\n\n/**\n  * This interface exists to provide backwards compa"
  },
  {
    "path": "vendor/geoip2/geoip2/src/Database/Reader.php",
    "chars": 8553,
    "preview": "<?php\r\n\r\nnamespace GeoIp2\\Database;\r\n\r\nuse GeoIp2\\Exception\\AddressNotFoundException;\r\nuse GeoIp2\\ProviderInterface;\r\nus"
  },
  {
    "path": "vendor/geoip2/geoip2/src/Exception/AddressNotFoundException.php",
    "chars": 145,
    "preview": "<?php\n\nnamespace GeoIp2\\Exception;\n\n/**\n * This class represents a generic error.\n */\nclass AddressNotFoundException ext"
  },
  {
    "path": "vendor/geoip2/geoip2/src/Exception/AuthenticationException.php",
    "chars": 144,
    "preview": "<?php\n\nnamespace GeoIp2\\Exception;\n\n/**\n * This class represents a generic error.\n */\nclass AuthenticationException exte"
  },
  {
    "path": "vendor/geoip2/geoip2/src/Exception/GeoIp2Exception.php",
    "chars": 131,
    "preview": "<?php\n\nnamespace GeoIp2\\Exception;\n\n/**\n * This class represents a generic error.\n */\nclass GeoIp2Exception extends \\Exc"
  },
  {
    "path": "vendor/geoip2/geoip2/src/Exception/HttpException.php",
    "chars": 427,
    "preview": "<?php\n\nnamespace GeoIp2\\Exception;\n\n/**\n *  This class represents an HTTP transport error.\n */\n\nclass HttpException exte"
  },
  {
    "path": "vendor/geoip2/geoip2/src/Exception/InvalidRequestException.php",
    "chars": 519,
    "preview": "<?php\n\nnamespace GeoIp2\\Exception;\n\n/**\n * This class represents an error returned by MaxMind's GeoIP2\n * web service.\n "
  },
  {
    "path": "vendor/geoip2/geoip2/src/Exception/OutOfQueriesException.php",
    "chars": 142,
    "preview": "<?php\n\nnamespace GeoIp2\\Exception;\n\n/**\n * This class represents a generic error.\n */\nclass OutOfQueriesException extend"
  },
  {
    "path": "vendor/geoip2/geoip2/src/Model/AbstractModel.php",
    "chars": 1074,
    "preview": "<?php\n\nnamespace GeoIp2\\Model;\n\nuse GeoIp2\\Compat\\JsonSerializable;\n\n/**\n * @ignore\n */\nabstract class AbstractModel imp"
  },
  {
    "path": "vendor/geoip2/geoip2/src/Model/AnonymousIp.php",
    "chars": 1472,
    "preview": "<?php\n\nnamespace GeoIp2\\Model;\n\n/**\n * This class provides the GeoIP2 Anonymous IP model.\n *\n * @property-read boolean $"
  },
  {
    "path": "vendor/geoip2/geoip2/src/Model/City.php",
    "chars": 4159,
    "preview": "<?php\n\nnamespace GeoIp2\\Model;\n\n/**\n * Model class for the data returned by GeoIP2 City web service and database.\n *\n * "
  },
  {
    "path": "vendor/geoip2/geoip2/src/Model/ConnectionType.php",
    "chars": 742,
    "preview": "<?php\n\nnamespace GeoIp2\\Model;\n\n/**\n * This class provides the GeoIP2 Connection-Type model.\n *\n * @property-read string"
  },
  {
    "path": "vendor/geoip2/geoip2/src/Model/Country.php",
    "chars": 2422,
    "preview": "<?php\n\nnamespace GeoIp2\\Model;\n\n/**\n * Model class for the data returned by GeoIP2 Country web service and database.\n *\n"
  },
  {
    "path": "vendor/geoip2/geoip2/src/Model/Domain.php",
    "chars": 688,
    "preview": "<?php\n\nnamespace GeoIp2\\Model;\n\n/**\n * This class provides the GeoIP2 Domain model.\n *\n * @property-read string|null $do"
  },
  {
    "path": "vendor/geoip2/geoip2/src/Model/Enterprise.php",
    "chars": 2283,
    "preview": "<?php\n\nnamespace GeoIp2\\Model;\n\n/**\n * Model class for the data returned by GeoIP2 Enterprise database lookups.\n *\n * Th"
  },
  {
    "path": "vendor/geoip2/geoip2/src/Model/Insights.php",
    "chars": 2283,
    "preview": "<?php\n\nnamespace GeoIp2\\Model;\n\n/**\n * Model class for the data returned by GeoIP2 Precision: Insights web service.\n *\n "
  },
  {
    "path": "vendor/geoip2/geoip2/src/Model/Isp.php",
    "chars": 1352,
    "preview": "<?php\n\nnamespace GeoIp2\\Model;\n\n/**\n * This class provides the GeoIP2 Connection-Type model.\n *\n * @property-read intege"
  },
  {
    "path": "vendor/geoip2/geoip2/src/ProviderInterface.php",
    "chars": 478,
    "preview": "<?php\n\nnamespace GeoIp2;\n\ninterface ProviderInterface\n{\n    /**\n     * @param ipAddress\n     *            IPv4 or IPv6 a"
  },
  {
    "path": "vendor/geoip2/geoip2/src/Record/AbstractPlaceRecord.php",
    "chars": 1138,
    "preview": "<?php\n\nnamespace GeoIp2\\Record;\n\nabstract class AbstractPlaceRecord extends AbstractRecord\n{\n    private $locales;\n\n    "
  },
  {
    "path": "vendor/geoip2/geoip2/src/Record/AbstractRecord.php",
    "chars": 1326,
    "preview": "<?php\n\nnamespace GeoIp2\\Record;\n\nuse GeoIp2\\Compat\\JsonSerializable;\n\nabstract class AbstractRecord implements JsonSeria"
  },
  {
    "path": "vendor/geoip2/geoip2/src/Record/City.php",
    "chars": 1058,
    "preview": "<?php\n\nnamespace GeoIp2\\Record;\n\n/**\n * City-level data associated with an IP address.\n *\n * This record is returned by "
  },
  {
    "path": "vendor/geoip2/geoip2/src/Record/Continent.php",
    "chars": 1077,
    "preview": "<?php\n\nnamespace GeoIp2\\Record;\n\n/**\n * Contains data for the continent record associated with an IP address\n *\n * This "
  },
  {
    "path": "vendor/geoip2/geoip2/src/Record/Country.php",
    "chars": 1340,
    "preview": "<?php\n\nnamespace GeoIp2\\Record;\n\n/**\n * Contains data for the country record associated with an IP address\n *\n * This re"
  },
  {
    "path": "vendor/geoip2/geoip2/src/Record/Location.php",
    "chars": 2142,
    "preview": "<?php\n\nnamespace GeoIp2\\Record;\n\n/**\n * Contains data for the location record associated with an IP address\n *\n * This r"
  },
  {
    "path": "vendor/geoip2/geoip2/src/Record/MaxMind.php",
    "chars": 405,
    "preview": "<?php\n\nnamespace GeoIp2\\Record;\n\n/**\n * Contains data about your account.\n *\n * This record is returned by all location "
  },
  {
    "path": "vendor/geoip2/geoip2/src/Record/Postal.php",
    "chars": 843,
    "preview": "<?php\n\nnamespace GeoIp2\\Record;\n\n/**\n * Contains data for the postal record associated with an IP address\n *\n * This rec"
  },
  {
    "path": "vendor/geoip2/geoip2/src/Record/RepresentedCountry.php",
    "chars": 1410,
    "preview": "<?php\n\nnamespace GeoIp2\\Record;\n\n/**\n * Contains data for the represented country associated with an IP address\n *\n * Th"
  },
  {
    "path": "vendor/geoip2/geoip2/src/Record/Subdivision.php",
    "chars": 1507,
    "preview": "<?php\n\nnamespace GeoIp2\\Record;\n\n/**\n *\n * Contains data for the subdivisions associated with an IP address\n *\n * This r"
  },
  {
    "path": "vendor/geoip2/geoip2/src/Record/Traits.php",
    "chars": 3985,
    "preview": "<?php\n\nnamespace GeoIp2\\Record;\n\n/**\n *\n * Contains data for the traits record associated with an IP address\n *\n * This "
  },
  {
    "path": "vendor/geoip2/geoip2/src/WebService/Client.php",
    "chars": 9808,
    "preview": "<?php\n\nnamespace GeoIp2\\WebService;\n\nuse GeoIp2\\Exception\\AddressNotFoundException;\nuse GeoIp2\\Exception\\AuthenticationE"
  },
  {
    "path": "vendor/maxmind-db/reader/src/MaxMind/Db/Reader/Decoder.php",
    "chars": 8866,
    "preview": "<?php\n\nnamespace MaxMind\\Db\\Reader;\n\nuse MaxMind\\Db\\Reader\\InvalidDatabaseException;\nuse MaxMind\\Db\\Reader\\Util;\n\nclass "
  },
  {
    "path": "vendor/maxmind-db/reader/src/MaxMind/Db/Reader/InvalidDatabaseException.php",
    "chars": 177,
    "preview": "<?php\n\nnamespace MaxMind\\Db\\Reader;\n\n/**\n * This class should be thrown when unexpected data is found in the database.\n "
  },
  {
    "path": "vendor/maxmind-db/reader/src/MaxMind/Db/Reader/Metadata.php",
    "chars": 2876,
    "preview": "<?php\n\nnamespace MaxMind\\Db\\Reader;\n\n/**\n * This class provides the metadata for the MaxMind DB file.\n *\n * @property in"
  },
  {
    "path": "vendor/maxmind-db/reader/src/MaxMind/Db/Reader/Util.php",
    "chars": 749,
    "preview": "<?php\n\nnamespace MaxMind\\Db\\Reader;\n\nuse MaxMind\\Db\\Reader\\InvalidDatabaseException;\n\nclass Util\n{\n    public static fun"
  },
  {
    "path": "vendor/maxmind-db/reader/src/MaxMind/Db/Reader.php",
    "chars": 10140,
    "preview": "<?php\n\nnamespace MaxMind\\Db;\n\nuse MaxMind\\Db\\Reader\\Decoder;\nuse MaxMind\\Db\\Reader\\InvalidDatabaseException;\nuse MaxMind"
  },
  {
    "path": "verify.php",
    "chars": 4234,
    "preview": "<?php\r\n/*!\r\n* ATTENTION: THIS FREE LICENSE IS ONLY FOR PERSONAL NON-COMMERCIAL USER. FOR COMMERCIAL PURPOSES, PLEASE PUR"
  },
  {
    "path": "visitor.php",
    "chars": 8845,
    "preview": "<?php\r\n/*!\r\n* ATTENTION: THIS FREE LICENSE IS ONLY FOR PERSONAL NON-COMMERCIAL USER. FOR COMMERCIAL PURPOSES, PLEASE PUR"
  }
]

About this extraction

This page contains the full source code of the WMJonssen/Centcount-Analytics GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 133 files (2.2 MB), approximately 576.6k tokens, and a symbol index with 424 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.

Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.

Copied to clipboard!