HTML preprocessors can make writing HTML more powerful or convenient. For instance, Markdown is designed to be easier to write and read for text documents and you could write a loop in Pug.
In CodePen, whatever you write in the HTML editor is what goes within the <body>
tags in a basic HTML5 template. So you don't have access to higher-up elements like the <html>
tag. If you want to add classes there that can affect the whole document, this is the place to do it.
In CodePen, whatever you write in the HTML editor is what goes within the <body>
tags in a basic HTML5 template. If you need things in the <head>
of the document, put that code here.
The resource you are linking to is using the 'http' protocol, which may not work when the browser is using https.
CSS preprocessors help make authoring CSS easier. All of them offer things like variables and mixins to provide convenient abstractions.
It's a common practice to apply CSS to a page that styles elements such that they are consistent across all browsers. We offer two of the most popular choices: normalize.css and a reset. Or, choose Neither and nothing will be applied.
To get the best cross-browser support, it is a common practice to apply vendor prefixes to CSS properties and values that require them to work. For instance -webkit-
or -moz-
.
We offer two popular choices: Autoprefixer (which processes your CSS server-side) and -prefix-free (which applies prefixes via a script, client-side).
Any URLs added here will be added as <link>
s in order, and before the CSS in the editor. You can use the CSS from another Pen by using its URL and the proper URL extension.
You can apply CSS to your Pen from any stylesheet on the web. Just put a URL to it here and we'll apply it, in the order you have them, before the CSS in the Pen itself.
You can also link to another Pen here (use the .css
URL Extension) and we'll pull the CSS from that Pen and include it. If it's using a matching preprocessor, use the appropriate URL Extension and we'll combine the code before preprocessing, so you can use the linked Pen as a true dependency.
JavaScript preprocessors can help make authoring JavaScript easier and more convenient.
Babel includes JSX processing.
Any URL's added here will be added as <script>
s in order, and run before the JavaScript in the editor. You can use the URL of any other Pen and it will include the JavaScript from that Pen.
You can apply a script from anywhere on the web to your Pen. Just put a URL to it here and we'll add it, in the order you have them, before the JavaScript in the Pen itself.
If the script you link to has the file extension of a preprocessor, we'll attempt to process it before applying.
You can also link to another Pen here, and we'll pull the JavaScript from that Pen and include it. If it's using a matching preprocessor, we'll combine the code before preprocessing, so you can use the linked Pen as a true dependency.
Search for and use JavaScript packages from npm here. By selecting a package, an import
statement will be added to the top of the JavaScript editor for this package.
Using packages here is powered by esm.sh, which makes packages from npm not only available on a CDN, but prepares them for native JavaScript ESM usage.
All packages are different, so refer to their docs for how they work.
If you're using React / ReactDOM, make sure to turn on Babel for the JSX processing.
If active, Pens will autosave every 30 seconds after being saved once.
If enabled, the preview panel updates automatically as you code. If disabled, use the "Run" button to update.
If enabled, your code will be formatted when you actively save your Pen. Note: your code becomes un-folded during formatting.
Visit your global Editor Settings.
<hr/>
<div class="info-big">Your Fingerprint:</div><div id="fingerprint" class="fp"></div>
<br/><hr/><br/>
<div class="info">try opening this pen in incognito mode and it should still assign you the same fingerprint id</div>
<br/><br/><br/>
<div class="info">Browser:</div><div id="browser" class="fp"></div>
<br/>
<div class="info">Flash:</div><div id="flash" class="fp"></div>
<br/>
<div class="info">Canvas:</div><div id="canvas" class="fp"></div>
<br/>
<div class="info">Connection:</div><div id="connection" class="fp"></div>
<br/>
<div class="info">Cookie:</div><div id="cookie" class="fp"></div>
<br/>
<div class="info">Display:</div><div id="display" class="fp"></div>
<br/>
<div class="info">Font Smoothing:</div><div id="fontsmoothing" class="fp"></div>
<br/>
<div class="info">Fonts:</div><div id="fonts" class="fp"></div>
<br/>
<div class="info">Form Fields:</div><div id="formfields" class="fp"></div>
<br/>
<div class="info">Java:</div><div id="java" class="fp"></div>
<br/>
<div class="info">Language:</div><div id="language" class="fp"></div>
<br/>
<div class="info">Silverlight:</div><div id="silverlight" class="fp"></div>
<br/>
<div class="info">OS:</div><div id="os" class="fp"></div>
<br/>
<div class="info">Time Zone:</div><div id="timezone" class="fp"></div>
<br/>
<div class="info">Touch:</div><div id="touch" class="fp"></div>
<br/>
<div class="info">True Browser:</div><div id="truebrowser" class="fp"></div>
<br/>
<div class="info">Plug Ins:</div><div id="plugins" class="fp"></div>
<br/>
<div class="info">User Agent:</div><div id="useragent" class="fp"></div>
.info {
font-family: courier;
font-size: 18px;
color: #999;
float: left;
padding-right: 10px;
}
.info-big {
font-family: courier;
font-size: 32px;
font-weight: bold;
color: #999;
float: left;
padding-right: 10px;
}
.fp {
font-family: courier;
font-size: 18px;
color: #069;
float: left;
}
#fingerprint {
font-family: courier;
font-size: 32px;
font-weight: bold;
color: #069;
float: left;
}
br { clear: both; }
/*
***************************************************
** http://davealger.info
***************************************************
This is a javascript only way to fingerprint a user with better than 90% accuracy in as few bytes as possible and no cookie storage!
Special thanks to Valentin Vasilyev for the original fingerprintjs slightly modified and to Open Source Device Fingerprinting by Dark Wave Tech for the various identity functions
***************************************************
*/
;(function(name,context,definition) { if (typeof module !== 'undefined' && module.exports) { module.exports = definition(); } else if (typeof define === 'function' && define.amd) { define(definition); } else { context[name] = definition(); } } ) ('Fingerprint', this, function() { 'use strict'; var Fingerprint = function(options) { var nativeForEach, nativeMap; nativeForEach = Array.prototype.forEach; nativeMap = Array.prototype.map; this.each = function(obj, iterator, context) { if (obj === null) { return; } if (nativeForEach && obj.forEach === nativeForEach) { obj.forEach(iterator, context); } else if (obj.length === +obj.length) { for (var i = 0, l = obj.length; i < l; i++) { if (iterator.call(context, obj[i], i, obj) === {}) return; } } else { for (var key in obj) { if (obj.hasOwnProperty(key)) { if (iterator.call(context, obj[key], key, obj) === {}) return; } } } }; this.map = function(obj, iterator, context) { var results = []; if (obj == null) return results; if (nativeMap && obj.map === nativeMap) return obj.map(iterator, context); this.each(obj, function(value, index, list) { results[results.length] = iterator.call(context, value, index, list); }); return results; }; if (typeof options == 'object') { this.hasher = options.hasher; this.screen_resolution = options.screen_resolution; this.screen_orientation = options.screen_orientation; this.canvas = options.canvas; this.ie_activex = options.ie_activex; } else if (typeof options == 'function') { this.hasher = options; } }; Fingerprint.prototype = { get: function() { var keys = []; keys.push(navigator.userAgent); keys.push(navigator.language); keys.push(screen.colorDepth); if (this.screen_resolution) { var resolution = this.getScreenResolution(); if (typeof resolution !== 'undefined') { keys.push(this.getScreenResolution().join('x')); } } keys.push(new Date().getTimezoneOffset()); keys.push(this.hasSessionStorage()); keys.push(this.hasLocalStorage()); keys.push(!!window.indexedDB); if (document.body) { keys.push(typeof(document.body.addBehavior)); } else { keys.push(typeof undefined); } keys.push(typeof(window.openDatabase)); keys.push(navigator.cpuClass); keys.push(navigator.platform); keys.push(navigator.doNotTrack); keys.push(this.getPluginsString()); if (this.canvas && this.isCanvasSupported()) { keys.push(this.getCanvasFingerprint()); } if (this.hasher) { return this.hasher(keys.join('###'), 31); } else { return this.murmurhash3_32_gc(keys.join('###'), 31); } }, murmurhash3_32_gc: function(key, seed) { var remainder, bytes, h1, h1b, c1, c2, k1, i; remainder = key.length & 3; bytes = key.length - remainder; h1 = seed; c1 = 0xcc9e2d51; c2 = 0x1b873593; i = 0; while (i < bytes) { k1 = ((key.charCodeAt(i) & 0xff)) | ((key.charCodeAt(++i) & 0xff) << 8) | ((key.charCodeAt(++i) & 0xff) << 16) | ((key.charCodeAt(++i) & 0xff) << 24); ++i; k1 = ((((k1 & 0xffff) * c1) + ((((k1 >>> 16) * c1) & 0xffff) << 16))) & 0xffffffff; k1 = (k1 << 15) | (k1 >>> 17); k1 = ((((k1 & 0xffff) * c2) + ((((k1 >>> 16) * c2) & 0xffff) << 16))) & 0xffffffff; h1 ^= k1; h1 = (h1 << 13) | (h1 >>> 19); h1b = ((((h1 & 0xffff) * 5) + ((((h1 >>> 16) * 5) & 0xffff) << 16))) & 0xffffffff; h1 = (((h1b & 0xffff) + 0x6b64) + ((((h1b >>> 16) + 0xe654) & 0xffff) << 16)); } k1 = 0; switch (remainder) { case 3: k1 ^= (key.charCodeAt(i + 2) & 0xff) << 16; case 2: k1 ^= (key.charCodeAt(i + 1) & 0xff) << 8; case 1: k1 ^= (key.charCodeAt(i) & 0xff); k1 = (((k1 & 0xffff) * c1) + ((((k1 >>> 16) * c1) & 0xffff) << 16)) & 0xffffffff; k1 = (k1 << 15) | (k1 >>> 17); k1 = (((k1 & 0xffff) * c2) + ((((k1 >>> 16) * c2) & 0xffff) << 16)) & 0xffffffff; h1 ^= k1; } h1 ^= key.length; h1 ^= h1 >>> 16; h1 = (((h1 & 0xffff) * 0x85ebca6b) + ((((h1 >>> 16) * 0x85ebca6b) & 0xffff) << 16)) & 0xffffffff; h1 ^= h1 >>> 13; h1 = ((((h1 & 0xffff) * 0xc2b2ae35) + ((((h1 >>> 16) * 0xc2b2ae35) & 0xffff) << 16))) & 0xffffffff; h1 ^= h1 >>> 16; return h1 >>> 0; }, hasLocalStorage: function() { try { return !!window.localStorage; } catch (e) { return true; } }, hasSessionStorage: function() { try { return !!window.sessionStorage; } catch (e) { return true; } }, isCanvasSupported: function() { var elem = document.createElement('canvas'); return !!(elem.getContext && elem.getContext('2d')); }, isIE: function() { if (navigator.appName === 'Microsoft Internet Explorer') { return true; } else if (navigator.appName === 'Netscape' && /Trident/.test(navigator.userAgent)) { return true; } return false; }, getPluginsString: function() { if (this.isIE() && this.ie_activex) { return this.getIEPluginsString(); } else { return this.getRegularPluginsString(); } }, getRegularPluginsString: function() { return this.map(navigator.plugins, function(p) { var mimeTypes = this.map(p, function(mt) { return [mt.type, mt.suffixes].join('~'); }).join(','); return [p.name, p.description, mimeTypes].join('::'); }, this).join(';'); }, getIEPluginsString: function() { if (window.ActiveXObject) { var names = ['ShockwaveFlash.ShockwaveFlash', 'AcroPDF.PDF', 'PDF.PdfCtrl', 'QuickTime.QuickTime', 'rmocx.RealPlayer G2 Control', 'rmocx.RealPlayer G2 Control.1', 'RealPlayer.RealPlayer(tm) ActiveX Control (32-bit)', 'RealVideo.RealVideo(tm) ActiveX Control (32-bit)', 'RealPlayer', 'SWCtl.SWCtl', 'WMPlayer.OCX', 'AgControl.AgControl', 'Skype.Detection' ]; return this.map(names, function(name) { try { new ActiveXObject(name); return name; } catch (e) { return null; } }).join(';'); } else { return ""; } }, getScreenResolution: function() { var resolution; if (this.screen_orientation) { resolution = (screen.height > screen.width) ? [screen.height, screen.width] : [screen.width, screen.height]; } else { resolution = [screen.height, screen.width]; } return resolution; }, getCanvasFingerprint: function() { var canvas = document.createElement('canvas'); var ctx = canvas.getContext('2d'); var txt = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz!@#$%^&*()_+-={}|[]\:"<>?;,.'; ctx.textBaseline = "top"; ctx.font = "14px 'Arial'"; ctx.textBaseline = "alphabetic"; ctx.fillStyle = "#f60"; ctx.fillRect(125, 1, 62, 20); ctx.fillStyle = "#069"; ctx.fillText(txt, 2, 15); ctx.fillStyle = "rgba(102, 204, 0, 0.7)"; ctx.fillText(txt, 4, 17); return canvas.toDataURL(); } }; return Fingerprint;});
/**************************************************/
/**
http://www.darkwavetech.com/fingerprint/fingerprint_code.html
**/
function fingerprint_flash() {
"use strict";
var strOnError, objPlayerVersion, strVersion, strOut;
strOnError = "N/A";
objPlayerVersion = null;
strVersion = null;
strOut = null;
try {
objPlayerVersion = swfobject.getFlashPlayerVersion();
strVersion = objPlayerVersion.major + "." + objPlayerVersion.minor + "." + objPlayerVersion.release;
if (strVersion === "0.0.0") {
strVersion = "N/A";
}
strOut = strVersion;
return strOut;
} catch (err) {
return strOnError;
}
}
function fingerprint_browser() {
"use strict";
var strOnError, strUserAgent, numVersion, strBrowser, strOut;
strOnError = "Error";
strUserAgent = null;
numVersion = null;
strBrowser = null;
strOut = null;
try {
strUserAgent = navigator.userAgent.toLowerCase();
if (/msie (\d+\.\d+);/.test(strUserAgent)) { //test for MSIE x.x;
numVersion = Number(RegExp.$1); // capture x.x portion and store as a number
if (strUserAgent.indexOf("trident/6") > -1) {
numVersion = 10;
}
if (strUserAgent.indexOf("trident/5") > -1) {
numVersion = 9;
}
if (strUserAgent.indexOf("trident/4") > -1) {
numVersion = 8;
}
strBrowser = "Internet Explorer " + numVersion;
} else if (strUserAgent.indexOf("trident/7") > -1) { //IE 11+ gets rid of the legacy 'MSIE' in the user-agent string;
numVersion = 11;
strBrowser = "Internet Explorer " + numVersion;
} else if (/firefox[\/\s](\d+\.\d+)/.test(strUserAgent)) { //test for Firefox/x.x or Firefox x.x (ignoring remaining digits);
numVersion = Number(RegExp.$1); // capture x.x portion and store as a number
strBrowser = "Firefox " + numVersion;
} else if (/opera[\/\s](\d+\.\d+)/.test(strUserAgent)) { //test for Opera/x.x or Opera x.x (ignoring remaining decimal places);
numVersion = Number(RegExp.$1); // capture x.x portion and store as a number
strBrowser = "Opera " + numVersion;
} else if (/chrome[\/\s](\d+\.\d+)/.test(strUserAgent)) { //test for Chrome/x.x or Chrome x.x (ignoring remaining digits);
numVersion = Number(RegExp.$1); // capture x.x portion and store as a number
strBrowser = "Chrome " + numVersion;
} else if (/version[\/\s](\d+\.\d+)/.test(strUserAgent)) { //test for Version/x.x or Version x.x (ignoring remaining digits);
numVersion = Number(RegExp.$1); // capture x.x portion and store as a number
strBrowser = "Safari " + numVersion;
} else if (/rv[\/\s](\d+\.\d+)/.test(strUserAgent)) { //test for rv/x.x or rv x.x (ignoring remaining digits);
numVersion = Number(RegExp.$1); // capture x.x portion and store as a number
strBrowser = "Mozilla " + numVersion;
} else if (/mozilla[\/\s](\d+\.\d+)/.test(strUserAgent)) { //test for Mozilla/x.x or Mozilla x.x (ignoring remaining digits);
numVersion = Number(RegExp.$1); // capture x.x portion and store as a number
strBrowser = "Mozilla " + numVersion;
} else if (/binget[\/\s](\d+\.\d+)/.test(strUserAgent)) { //test for BinGet/x.x or BinGet x.x (ignoring remaining digits);
numVersion = Number(RegExp.$1); // capture x.x portion and store as a number
strBrowser = "Library (BinGet) " + numVersion;
} else if (/curl[\/\s](\d+\.\d+)/.test(strUserAgent)) { //test for Curl/x.x or Curl x.x (ignoring remaining digits);
numVersion = Number(RegExp.$1); // capture x.x portion and store as a number
strBrowser = "Library (cURL) " + numVersion;
} else if (/java[\/\s](\d+\.\d+)/.test(strUserAgent)) { //test for Java/x.x or Java x.x (ignoring remaining digits);
numVersion = Number(RegExp.$1); // capture x.x portion and store as a number
strBrowser = "Library (Java) " + numVersion;
} else if (/libwww-perl[\/\s](\d+\.\d+)/.test(strUserAgent)) { //test for libwww-perl/x.x or libwww-perl x.x (ignoring remaining digits);
numVersion = Number(RegExp.$1); // capture x.x portion and store as a number
strBrowser = "Library (libwww-perl) " + numVersion;
} else if (/microsoft url control -[\s](\d+\.\d+)/.test(strUserAgent)) { //test for Microsoft URL Control - x.x (ignoring remaining digits);
numVersion = Number(RegExp.$1); // capture x.x portion and store as a number
strBrowser = "Library (Microsoft URL Control) " + numVersion;
} else if (/peach[\/\s](\d+\.\d+)/.test(strUserAgent)) { //test for Peach/x.x or Peach x.x (ignoring remaining digits);
numVersion = Number(RegExp.$1); // capture x.x portion and store as a number
strBrowser = "Library (Peach) " + numVersion;
} else if (/php[\/\s](\d+\.\d+)/.test(strUserAgent)) { //test for PHP/x.x or PHP x.x (ignoring remaining digits);
numVersion = Number(RegExp.$1); // capture x.x portion and store as a number
strBrowser = "Library (PHP) " + numVersion;
} else if (/pxyscand[\/\s](\d+\.\d+)/.test(strUserAgent)) { //test for pxyscand/x.x or pxyscand x.x (ignoring remaining digits);
numVersion = Number(RegExp.$1); // capture x.x portion and store as a number
strBrowser = "Library (pxyscand) " + numVersion;
} else if (/pycurl[\/\s](\d+\.\d+)/.test(strUserAgent)) { //test for pycurl/x.x or pycurl x.x (ignoring remaining digits);
numVersion = Number(RegExp.$1); // capture x.x portion and store as a number
strBrowser = "Library (PycURL) " + numVersion;
} else if (/python-urllib[\/\s](\d+\.\d+)/.test(strUserAgent)) { //test for python-urllib/x.x or python-urllib x.x (ignoring remaining digits);
numVersion = Number(RegExp.$1); // capture x.x portion and store as a number
strBrowser = "Library (Python URLlib) " + numVersion;
} else if (/appengine-google/.test(strUserAgent)) { //test for AppEngine-Google;
numVersion = Number(RegExp.$1); // capture x.x portion and store as a number
strBrowser = "Cloud (Google AppEngine) " + numVersion;
} else {
strBrowser = "Unknown";
}
strOut = strBrowser;
return strOut;
} catch (err) {
return strOnError;
}
}
function fingerprint_canvas() {
"use strict";
var strOnError, canvas, strCText, strText, strOut;
strOnError = "Error";
canvas = null;
strCText = null;
strText = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ`~1!2@3#4$5%6^7&8*9(0)-_=+[{]}|;:',<.>/?";
strOut = null;
try {
canvas = document.createElement('canvas');
strCText = canvas.getContext('2d');
strCText.textBaseline = "top";
strCText.font = "14px 'Arial'";
strCText.textBaseline = "alphabetic";
strCText.fillStyle = "#f60";
strCText.fillRect(125, 1, 62, 20);
strCText.fillStyle = "#069";
strCText.fillText(strText, 2, 15);
strCText.fillStyle = "rgba(102, 204, 0, 0.7)";
strCText.fillText(strText, 4, 17);
strOut = canvas.toDataURL();
return strOut;
} catch (err) {
return strOnError;
}
}
function fingerprint_connection() {
"use strict";
var strOnError, strConnection, strOut;
strOnError = "N/A";
strConnection = null;
strOut = null;
try {
// only on android
strConnection = navigator.connection.type;
strOut = strConnection;
} catch (err) {
// return N/A if navigator.connection object does not apply to this device
return strOnError;
}
return strOut;
}
function fingerprint_cookie() {
"use strict";
var strOnError, bolCookieEnabled, bolOut;
strOnError = "Error";
bolCookieEnabled = null;
bolOut = null;
try {
bolCookieEnabled = (navigator.cookieEnabled) ? true : false;
//if not IE4+ nor NS6+
if (typeof navigator.cookieEnabled === "undefined" && !bolCookieEnabled) {
document.cookie = "testcookie";
bolCookieEnabled = (document.cookie.indexOf("testcookie") !== -1) ? true : false;
}
bolOut = bolCookieEnabled;
return bolOut;
} catch (err) {
return strOnError;
}
}
function fingerprint_display() {
"use strict";
var strSep, strPair, strOnError, strScreen, strDisplay, strOut;
strSep = "|";
strPair = "=";
strOnError = "Error";
strScreen = null;
strDisplay = null;
strOut = null;
try {
strScreen = window.screen;
if (strScreen) {
strDisplay = strScreen.colorDepth + strSep + strScreen.width + strSep + strScreen.height + strSep + strScreen.availWidth + strSep + strScreen.availHeight;
}
strOut = strDisplay;
return strOut;
} catch (err) {
return strOnError;
}
}
function fingerprint_fontsmoothing() {
"use strict";
var strOnError, strFontSmoothing, canvasNode, ctx, i, j, imageData, alpha, strOut;
strOnError = "Unknown";
strFontSmoothing = null;
canvasNode = null;
ctx = null;
imageData = null;
alpha = null;
strOut = null;
if (typeof(screen.fontSmoothingEnabled) !== "undefined") {
strFontSmoothing = screen.fontSmoothingEnabled;
} else {
try {
fontsmoothing = "false";
canvasNode = document.createElement('canvas');
canvasNode.width = "35";
canvasNode.height = "35";
canvasNode.style.display = 'none';
document.body.appendChild(canvasNode);
ctx = canvasNode.getContext('2d');
ctx.textBaseline = "top";
ctx.font = "32px Arial";
ctx.fillStyle = "black";
ctx.strokeStyle = "black";
ctx.fillText("O", 0, 0);
for (j = 8; j <= 32; j = j + 1) {
for (i = 1; i <= 32; i = i + 1) {
imageData = ctx.getImageData(i, j, 1, 1).data;
alpha = imageData[3];
if (alpha !== 255 && alpha !== 0) {
strFontSmoothing = "true"; // font-smoothing must be on.
}
}
}
strOut = strFontSmoothing;
} catch (err) {
return strOnError;
}
}
strOut = strFontSmoothing;
return strOut;
}
function fingerprint_fonts() {
"use strict";
var strOnError, style, fonts, count, template, fragment, divs, i, font, div, body, result, e;
strOnError = "Error";
style = null;
fonts = null;
font = null;
count = 0;
template = null;
divs = null;
e = null;
div = null;
body = null;
i = 0;
try {
style = "position: absolute; visibility: hidden; display: block !important";
fonts = ["Abadi MT Condensed Light", "Adobe Fangsong Std", "Adobe Hebrew", "Adobe Ming Std", "Agency FB", "Aharoni", "Andalus", "Angsana New", "AngsanaUPC", "Aparajita", "Arab", "Arabic Transparent", "Arabic Typesetting", "Arial Baltic", "Arial Black", "Arial CE", "Arial CYR", "Arial Greek", "Arial TUR", "Arial", "Batang", "BatangChe", "Bauhaus 93", "Bell MT", "Bitstream Vera Serif", "Bodoni MT", "Bookman Old Style", "Braggadocio", "Broadway", "Browallia New", "BrowalliaUPC", "Calibri Light", "Calibri", "Californian FB", "Cambria Math", "Cambria", "Candara", "Castellar", "Casual", "Centaur", "Century Gothic", "Chalkduster", "Colonna MT", "Comic Sans MS", "Consolas", "Constantia", "Copperplate Gothic Light", "Corbel", "Cordia New", "CordiaUPC", "Courier New Baltic", "Courier New CE", "Courier New CYR", "Courier New Greek", "Courier New TUR", "Courier New", "DFKai-SB", "DaunPenh", "David", "DejaVu LGC Sans Mono", "Desdemona", "DilleniaUPC", "DokChampa", "Dotum", "DotumChe", "Ebrima", "Engravers MT", "Eras Bold ITC", "Estrangelo Edessa", "EucrosiaUPC", "Euphemia", "Eurostile", "FangSong", "Forte", "FrankRuehl", "Franklin Gothic Heavy", "Franklin Gothic Medium", "FreesiaUPC", "French Script MT", "Gabriola", "Gautami", "Georgia", "Gigi", "Gisha", "Goudy Old Style", "Gulim", "GulimChe", "GungSeo", "Gungsuh", "GungsuhChe", "Haettenschweiler", "Harrington", "Hei S", "HeiT", "Heisei Kaku Gothic", "Hiragino Sans GB", "Impact", "Informal Roman", "IrisUPC", "Iskoola Pota", "JasmineUPC", "KacstOne", "KaiTi", "Kalinga", "Kartika", "Khmer UI", "Kino MT", "KodchiangUPC", "Kokila", "Kozuka Gothic Pr6N", "Lao UI", "Latha", "Leelawadee", "Levenim MT", "LilyUPC", "Lohit Gujarati", "Loma", "Lucida Bright", "Lucida Console", "Lucida Fax", "Lucida Sans Unicode", "MS Gothic", "MS Mincho", "MS PGothic", "MS PMincho", "MS Reference Sans Serif", "MS UI Gothic", "MV Boli", "Magneto", "Malgun Gothic", "Mangal", "Marlett", "Matura MT Script Capitals", "Meiryo UI", "Meiryo", "Menlo", "Microsoft Himalaya", "Microsoft JhengHei", "Microsoft New Tai Lue", "Microsoft PhagsPa", "Microsoft Sans Serif", "Microsoft Tai Le", "Microsoft Uighur", "Microsoft YaHei", "Microsoft Yi Baiti", "MingLiU", "MingLiU-ExtB", "MingLiU_HKSCS", "MingLiU_HKSCS-ExtB", "Miriam Fixed", "Miriam", "Mongolian Baiti", "MoolBoran", "NSimSun", "Narkisim", "News Gothic MT", "Niagara Solid", "Nyala", "PMingLiU", "PMingLiU-ExtB", "Palace Script MT", "Palatino Linotype", "Papyrus", "Perpetua", "Plantagenet Cherokee", "Playbill", "Prelude Bold", "Prelude Condensed Bold", "Prelude Condensed Medium", "Prelude Medium", "PreludeCompressedWGL Black", "PreludeCompressedWGL Bold", "PreludeCompressedWGL Light", "PreludeCompressedWGL Medium", "PreludeCondensedWGL Black", "PreludeCondensedWGL Bold", "PreludeCondensedWGL Light", "PreludeCondensedWGL Medium", "PreludeWGL Black", "PreludeWGL Bold", "PreludeWGL Light", "PreludeWGL Medium", "Raavi", "Rachana", "Rockwell", "Rod", "Sakkal Majalla", "Sawasdee", "Script MT Bold", "Segoe Print", "Segoe Script", "Segoe UI Light", "Segoe UI Semibold", "Segoe UI Symbol", "Segoe UI", "Shonar Bangla", "Showcard Gothic", "Shruti", "SimHei", "SimSun", "SimSun-ExtB", "Simplified Arabic Fixed", "Simplified Arabic", "Snap ITC", "Sylfaen", "Symbol", "Tahoma", "Times New Roman Baltic", "Times New Roman CE", "Times New Roman CYR", "Times New Roman Greek", "Times New Roman TUR", "Times New Roman", "TlwgMono", "Traditional Arabic", "Trebuchet MS", "Tunga", "Tw Cen MT Condensed Extra Bold", "Ubuntu", "Umpush", "Univers", "Utopia", "Utsaah", "Vani", "Verdana", "Vijaya", "Vladimir Script", "Vrinda", "Webdings", "Wide Latin", "Wingdings"];
count = fonts.length;
template = '<b style="display:inline !important; width:auto !important; font:normal 10px/1 \'X\',sans-serif !important">ww</b>' + '<b style="display:inline !important; width:auto !important; font:normal 10px/1 \'X\',monospace !important">ww</b>';
fragment = document.createDocumentFragment();
divs = [];
for (i = 0; i < count; i = i + 1) {
font = fonts[i];
div = document.createElement('div');
font = font.replace(/['"<>]/g, '');
div.innerHTML = template.replace(/X/g, font);
div.style.cssText = style;
fragment.appendChild(div);
divs.push(div);
}
body = document.body;
body.insertBefore(fragment, body.firstChild);
result = [];
for (i = 0; i < count; i = i + 1) {
e = divs[i].getElementsByTagName('b');
if (e[0].offsetWidth === e[1].offsetWidth) {
result.push(fonts[i]);
}
}
// do not combine these two loops, remove child will cause reflow
// and induce severe performance hit
for (i = 0; i < count; i = i + 1) {
body.removeChild(divs[i]);
}
return result.join('|');
} catch (err) {
return strOnError;
}
}
function fingerprint_formfields() {
"use strict";
var i, j, numOfForms, numOfInputs, strFormsInPage, strFormsInputsData, strInputsInForm, strTmp, strOut;
i = 0;
j = 0;
numOfForms = 0;
numOfInputs = 0;
strFormsInPage = "";
strFormsInputsData = [];
strInputsInForm = "";
strTmp = "";
strOut = "";
strFormsInPage = document.getElementsByTagName('form');
numOfForms = strFormsInPage.length;
strFormsInputsData.push("url=" + window.location.href);
for (i = 0; i < numOfForms; i = i + 1) {
strFormsInputsData.push("FORM=" + strFormsInPage[i].name);
strInputsInForm = strFormsInPage[i].getElementsByTagName('input');
numOfInputs = strInputsInForm.length;
for (j = 0; j < numOfInputs; j = j + 1) {
if (strInputsInForm[j].type !== "hidden") {
strFormsInputsData.push("Input=" + strInputsInForm[j].name);
}
}
}
strTmp = strFormsInputsData.join("|");
strOut = strTmp;
return strOut;
}
function fingerprint_java() {
"use strict";
var strOnError, strJavaEnabled, strOut;
strOnError = "Error";
strJavaEnabled = null;
strOut = null;
try {
if (navigator.javaEnabled()) {
strJavaEnabled = "true";
} else {
strJavaEnabled = "false";
}
strOut = strJavaEnabled;
return strOut;
} catch (err) {
return strOnError;
}
}
function fingerprint_language() {
"use strict";
var strSep, strPair, strOnError, strLang, strTypeLng, strTypeBrLng, strTypeSysLng, strTypeUsrLng, strOut;
strSep = "|";
strPair = "=";
strOnError = "Error";
strLang = null;
strTypeLng = null;
strTypeBrLng = null;
strTypeSysLng = null;
strTypeUsrLng = null;
strOut = null;
try {
strTypeLng = typeof (navigator.language);
strTypeBrLng = typeof (navigator.browserLanguage);
strTypeSysLng = typeof (navigator.systemLanguage);
strTypeUsrLng = typeof (navigator.userLanguage);
if (strTypeLng !== "undefined") {
strLang = "lang" + strPair + navigator.language + strSep;
} else if (strTypeBrLng !== "undefined") {
strLang = "lang" + strPair + navigator.browserLanguage + strSep;
} else {
strLang = "lang" + strPair + strSep;
}
if (strTypeSysLng !== "undefined") {
strLang += "syslang" + strPair + navigator.systemLanguage + strSep;
} else {
strLang += "syslang" + strPair + strSep;
}
if (strTypeUsrLng !== "undefined") {
strLang += "userlang" + strPair + navigator.userLanguage;
} else {
strLang += "userlang" + strPair;
}
strOut = strLang;
return strOut;
} catch (err) {
return strOnError;
}
}
function fingerprint_silverlight() {
"use strict";
var strOnError, objControl, objPlugin, strSilverlightVersion, strOut;
strOnError = "Error";
objControl = null;
objPlugin = null;
strSilverlightVersion = null;
strOut = null;
try {
try {
objControl = new ActiveXObject('AgControl.AgControl');
if (objControl.IsVersionSupported("5.0")) {
strSilverlightVersion = "5.x";
} else if (objControl.IsVersionSupported("4.0")) {
strSilverlightVersion = "4.x";
} else if (objControl.IsVersionSupported("3.0")) {
strSilverlightVersion = "3.x";
} else if (objControl.IsVersionSupported("2.0")) {
strSilverlightVersion = "2.x";
} else {
strSilverlightVersion = "1.x";
}
objControl = null;
} catch (e) {
objPlugin = navigator.plugins["Silverlight Plug-In"];
if (objPlugin) {
if (objPlugin.description === "1.0.30226.2") {
strSilverlightVersion = "2.x";
} else {
strSilverlightVersion = parseInt(objPlugin.description[0], 10);
}
} else {
strSilverlightVersion = "N/A";
}
}
strOut = strSilverlightVersion;
return strOut;
} catch (err) {
return strOnError;
}
}
function fingerprint_os() {
"use strict";
var strSep, strOnError, strUserAgent, strPlatform, strOS, strOSBits, strOut;
strSep = "|";
strOnError = "Error";
strUserAgent = null;
strPlatform = null;
strOS = null;
strOSBits = null;
strOut = null;
try {
/* navigator.userAgent is supported by all major browsers */
strUserAgent = navigator.userAgent.toLowerCase();
/* navigator.platform is supported by all major browsers */
strPlatform = navigator.platform.toLowerCase();
if (strUserAgent.indexOf("windows nt 6.3") !== -1) {
strOS = "Windows 8.1";
} else if (strUserAgent.indexOf("windows nt 6.2") !== -1) {
strOS = "Windows 8";
} else if (strUserAgent.indexOf("windows nt 6.1") !== -1) {
strOS = "Windows 7";
} else if (strUserAgent.indexOf("windows nt 6.0") !== -1) {
strOS = "Windows Vista/Windows Server 2008";
} else if (strUserAgent.indexOf("windows nt 5.2") !== -1) {
strOS = "Windows XP x64/Windows Server 2003";
} else if (strUserAgent.indexOf("windows nt 5.1") !== -1) {
strOS = "Windows XP";
} else if (strUserAgent.indexOf("windows nt 5.01") !== -1) {
strOS = "Windows 2000, Service Pack 1 (SP1)";
} else if (strUserAgent.indexOf("windows xp") !== -1) {
strOS = "Windows XP";
} else if (strUserAgent.indexOf("windows 2000") !== -1) {
strOS = "Windows 2000";
} else if (strUserAgent.indexOf("windows nt 5.0") !== -1) {
strOS = "Windows 2000";
} else if (strUserAgent.indexOf("windows nt 4.0") !== -1) {
strOS = "Windows NT 4.0";
} else if (strUserAgent.indexOf("windows nt") !== -1) {
strOS = "Windows NT 4.0";
} else if (strUserAgent.indexOf("winnt4.0") !== -1) {
strOS = "Windows NT 4.0";
} else if (strUserAgent.indexOf("winnt") !== -1) {
strOS = "Windows NT 4.0";
} else if (strUserAgent.indexOf("windows me") !== -1) {
strOS = "Windows ME";
} else if (strUserAgent.indexOf("win 9x 4.90") !== -1) {
strOS = "Windows ME";
} else if (strUserAgent.indexOf("windows 98") !== -1) {
strOS = "Windows 98";
} else if (strUserAgent.indexOf("win98") !== -1) {
strOS = "Windows 98";
} else if (strUserAgent.indexOf("windows 95") !== -1) {
strOS = "Windows 95";
} else if (strUserAgent.indexOf("windows_95") !== -1) {
strOS = "Windows 95";
} else if (strUserAgent.indexOf("win95") !== -1) {
strOS = "Windows 95";
} else if (strUserAgent.indexOf("ce") !== -1) {
strOS = "Windows CE";
} else if (strUserAgent.indexOf("win16") !== -1) {
strOS = "Windows 3.11";
} else if (strUserAgent.indexOf("iemobile") !== -1) {
strOS = "Windows Mobile";
} else if (strUserAgent.indexOf("wm5 pie") !== -1) {
strOS = "Windows Mobile";
} else if (strUserAgent.indexOf("windows") !== -1) {
strOS = "Windows (Unknown Version)";
} else if (strUserAgent.indexOf("openbsd") !== -1) {
strOS = "Open BSD";
} else if (strUserAgent.indexOf("sunos") !== -1) {
strOS = "Sun OS";
} else if (strUserAgent.indexOf("ubuntu") !== -1) {
strOS = "Ubuntu";
} else if (strUserAgent.indexOf("ipad") !== -1) {
strOS = "iOS (iPad)";
} else if (strUserAgent.indexOf("ipod") !== -1) {
strOS = "iOS (iTouch)";
} else if (strUserAgent.indexOf("iphone") !== -1) {
strOS = "iOS (iPhone)";
} else if (strUserAgent.indexOf("mac os x beta") !== -1) {
strOS = "Mac OSX Beta (Kodiak)";
} else if (strUserAgent.indexOf("mac os x 10.0") !== -1) {
strOS = "Mac OSX Cheetah";
} else if (strUserAgent.indexOf("mac os x 10.1") !== -1) {
strOS = "Mac OSX Puma";
} else if (strUserAgent.indexOf("mac os x 10.2") !== -1) {
strOS = "Mac OSX Jaguar";
} else if (strUserAgent.indexOf("mac os x 10.3") !== -1) {
strOS = "Mac OSX Panther";
} else if (strUserAgent.indexOf("mac os x 10.4") !== -1) {
strOS = "Mac OSX Tiger";
} else if (strUserAgent.indexOf("mac os x 10.5") !== -1) {
strOS = "Mac OSX Leopard";
} else if (strUserAgent.indexOf("mac os x 10.6") !== -1) {
strOS = "Mac OSX Snow Leopard";
} else if (strUserAgent.indexOf("mac os x 10.7") !== -1) {
strOS = "Mac OSX Lion";
} else if (strUserAgent.indexOf("mac os x") !== -1) {
strOS = "Mac OSX (Version Unknown)";
} else if (strUserAgent.indexOf("mac_68000") !== -1) {
strOS = "Mac OS Classic (68000)";
} else if (strUserAgent.indexOf("68K") !== -1) {
strOS = "Mac OS Classic (68000)";
} else if (strUserAgent.indexOf("mac_powerpc") !== -1) {
strOS = "Mac OS Classic (PowerPC)";
} else if (strUserAgent.indexOf("ppc mac") !== -1) {
strOS = "Mac OS Classic (PowerPC)";
} else if (strUserAgent.indexOf("macintosh") !== -1) {
strOS = "Mac OS Classic";
} else if (strUserAgent.indexOf("googletv") !== -1) {
strOS = "Android (GoogleTV)";
} else if (strUserAgent.indexOf("xoom") !== -1) {
strOS = "Android (Xoom)";
} else if (strUserAgent.indexOf("htc_flyer") !== -1) {
strOS = "Android (HTC Flyer)";
} else if (strUserAgent.indexOf("android") !== -1) {
strOS = "Android";
} else if (strUserAgent.indexOf("symbian") !== -1) {
strOS = "Symbian";
} else if (strUserAgent.indexOf("series60") !== -1) {
strOS = "Symbian (Series 60)";
} else if (strUserAgent.indexOf("series70") !== -1) {
strOS = "Symbian (Series 70)";
} else if (strUserAgent.indexOf("series80") !== -1) {
strOS = "Symbian (Series 80)";
} else if (strUserAgent.indexOf("series90") !== -1) {
strOS = "Symbian (Series 90)";
} else if (strUserAgent.indexOf("x11") !== -1) {
strOS = "UNIX";
} else if (strUserAgent.indexOf("nix") !== -1) {
strOS = "UNIX";
} else if (strUserAgent.indexOf("linux") !== -1) {
strOS = "Linux";
} else if (strUserAgent.indexOf("qnx") !== -1) {
strOS = "QNX";
} else if (strUserAgent.indexOf("os/2") !== -1) {
strOS = "IBM OS/2";
} else if (strUserAgent.indexOf("beos") !== -1) {
strOS = "BeOS";
} else if (strUserAgent.indexOf("blackberry95") !== -1) {
strOS = "Blackberry (Storm 1/2)";
} else if (strUserAgent.indexOf("blackberry97") !== -1) {
strOS = "Blackberry (Bold)";
} else if (strUserAgent.indexOf("blackberry96") !== -1) {
strOS = "Blackberry (Tour)";
} else if (strUserAgent.indexOf("blackberry89") !== -1) {
strOS = "Blackberry (Curve 2)";
} else if (strUserAgent.indexOf("blackberry98") !== -1) {
strOS = "Blackberry (Torch)";
} else if (strUserAgent.indexOf("playbook") !== -1) {
strOS = "Blackberry (Playbook)";
} else if (strUserAgent.indexOf("wnd.rim") !== -1) {
strOS = "Blackberry (IE/FF Emulator)";
} else if (strUserAgent.indexOf("blackberry") !== -1) {
strOS = "Blackberry";
} else if (strUserAgent.indexOf("palm") !== -1) {
strOS = "Palm OS";
} else if (strUserAgent.indexOf("webos") !== -1) {
strOS = "WebOS";
} else if (strUserAgent.indexOf("hpwos") !== -1) {
strOS = "WebOS (HP)";
} else if (strUserAgent.indexOf("blazer") !== -1) {
strOS = "Palm OS (Blazer)";
} else if (strUserAgent.indexOf("xiino") !== -1) {
strOS = "Palm OS (Xiino)";
} else if (strUserAgent.indexOf("kindle") !== -1) {
strOS = "Kindle";
} else if (strUserAgent.indexOf("wii") !== -1) {
strOS = "Nintendo (Wii)";
} else if (strUserAgent.indexOf("nintendo ds") !== -1) {
strOS = "Nintendo (DS)";
} else if (strUserAgent.indexOf("playstation 3") !== -1) {
strOS = "Sony (Playstation Console)";
} else if (strUserAgent.indexOf("playstation portable") !== -1) {
strOS = "Sony (Playstation Portable)";
} else if (strUserAgent.indexOf("webtv") !== -1) {
strOS = "MSN TV (WebTV)";
} else if (strUserAgent.indexOf("inferno") !== -1) {
strOS = "Inferno";
} else {
strOS = "Unknown";
}
if (strPlatform.indexOf("x64") !== -1) {
strOSBits = "64 bits";
} else if (strPlatform.indexOf("wow64") !== -1) {
strOSBits = "64 bits";
} else if (strPlatform.indexOf("win64") !== -1) {
strOSBits = "64 bits";
} else if (strPlatform.indexOf("win32") !== -1) {
strOSBits = "32 bits";
} else if (strPlatform.indexOf("x64") !== -1) {
strOSBits = "64 bits";
} else if (strPlatform.indexOf("x32") !== -1) {
strOSBits = "32 bits";
} else if (strPlatform.indexOf("x86") !== -1) {
strOSBits = "32 bits*";
} else if (strPlatform.indexOf("ppc") !== -1) {
strOSBits = "64 bits";
} else if (strPlatform.indexOf("alpha") !== -1) {
strOSBits = "64 bits";
} else if (strPlatform.indexOf("68k") !== -1) {
strOSBits = "64 bits";
} else if (strPlatform.indexOf("iphone") !== -1) {
strOSBits = "32 bits";
} else if (strPlatform.indexOf("android") !== -1) {
strOSBits = "32 bits";
} else {
strOSBits = "Unknown";
}
strOut = strOS + strSep + strOSBits;
return strOut;
} catch (err) {
return strOnError;
}
}
function fingerprint_useragent() {
"use strict";
var strSep, strTmp, strUserAgent, strOut;
strSep = "|";
strTmp = null;
strUserAgent = null;
strOut = null;
/* navigator.userAgent is supported by all major browsers */
strUserAgent = navigator.userAgent.toLowerCase();
/* navigator.platform is supported by all major browsers */
strTmp = strUserAgent + strSep + navigator.platform;
/* navigator.cpuClass only supported in IE */
if (navigator.cpuClass) {
strTmp += strSep + navigator.cpuClass;
}
/* navigator.browserLanguage only supported in IE, Safari and Chrome */
if (navigator.browserLanguage) {
strTmp += strSep + navigator.browserLanguage;
} else {
strTmp += strSep + navigator.language;
}
strOut = strTmp;
return strOut;
}
function fingerprint_timezone() {
"use strict";
var strOnError, dtDate, numOffset, numGMTHours, numOut;
strOnError = "Error";
dtDate = null;
numOffset = null;
numGMTHours = null;
numOut = null;
try {
dtDate = new Date();
numOffset = dtDate.getTimezoneOffset();
numGMTHours = (numOffset / 60) * (-1);
numOut = numGMTHours;
return numOut;
} catch (err) {
return strOnError;
}
}
function fingerprint_touch() {
"use strict";
var bolTouchEnabled, bolOut;
bolTouchEnabled = false;
bolOut = null;
try {
if (document.createEvent("TouchEvent")) {
bolTouchEnabled = true;
}
bolOut = bolTouchEnabled;
return bolOut;
} catch (ignore) {
bolOut = bolTouchEnabled
return bolOut;
}
}
function fingerprint_truebrowser() {
"use strict";
var strBrowser, strUserAgent, strOut;
strBrowser = "Unknown";
strUserAgent = null;
strOut = null;
strUserAgent = navigator.userAgent.toLowerCase();
/* Checks for different browsers, cannot use Try/Catch block */
if (document.all && document.getElementById && navigator.savePreferences && (strUserAgent.indexOf("Netfront") < 0) && navigator.appName !== "Blazer") {
strBrowser = "Escape 5";
} else if (navigator.vendor === "KDE") {
strBrowser = "Konqueror";
} else if (document.childNodes && !document.all && !navigator.taintEnabled && !navigator.accentColorName) {
strBrowser = "Safari";
} else if (document.childNodes && !document.all && !navigator.taintEnabled && navigator.accentColorName) {
strBrowser = "OmniWeb 4.5+";
} else if (navigator.__ice_version) {
strBrowser = "ICEBrowser";
} else if (window.ScriptEngine && ScriptEngine().indexOf("InScript") + 1 && document.createElement) {
strBrowser = "iCab 3+";
} else if (window.ScriptEngine && ScriptEngine().indexOf("InScript") + 1) {
strBrowser = "iCab 2-";
} else if (strUserAgent.indexOf("hotjava") + 1 && (navigator.accentColorName) === "undefined") {
strBrowser = "HotJava";
} else if (document.layers && !document.classes) {
strBrowser = "Omniweb 4.2-";
} else if (document.layers && !navigator.mimeTypes["*"]) {
strBrowser = "Escape 4";
} else if (document.layers) {
strBrowser = "Netscape 4";
} else if (window.opera && document.getElementsByClassName) {
strBrowser = "Opera 9.5+";
} else if (window.opera && window.getComputedStyle) {
strBrowser = "Opera 8";
} else if (window.opera && document.childNodes) {
strBrowser = "Opera 7";
} else if (window.opera) {
strBrowser = "Opera " + window.opera.version();
} else if (navigator.appName.indexOf("WebTV") + 1) {
strBrowser = "WebTV";
} else if (strUserAgent.indexOf("netgem") + 1) {
strBrowser = "Netgem NetBox";
} else if (strUserAgent.indexOf("opentv") + 1) {
strBrowser = "OpenTV";
} else if (strUserAgent.indexOf("ipanel") + 1) {
strBrowser = "iPanel MicroBrowser";
} else if (document.getElementById && !document.childNodes) {
strBrowser = "Clue browser";
} else if (navigator.product && navigator.product.indexOf("Hv") === 0) {
strBrowser = "Tkhtml Hv3+";
} else if (typeof InstallTrigger !== 'undefined') {
strBrowser = "Firefox";
} else if (window.atob) {
strBrowser = "Internet Explorer 10+";
} else if (XDomainRequest && window.performance) {
strBrowser = "Internet Explorer 9";
} else if (XDomainRequest) {
strBrowser = "Internet Explorer 8";
} else if (document.documentElement && document.documentElement.style.maxHeight !== "undefined") {
strBrowser = "Internet Explorer 7";//xxxxx
} else if (document.compatMode && document.all) {
strBrowser = "Internet Explorer 6";//xxxxx
} else if (window.createPopup) {
strBrowser = "Internet Explorer 5.5";
} else if (window.attachEvent) {
strBrowser = "Internet Explorer 5";
} else if (document.all && navigator.appName !== "Microsoft Pocket Internet Explorer") {
strBrowser = "Internet Explorer 4";
} else if ((strUserAgent.indexOf("msie") + 1) && window.ActiveXObject) {
strBrowser = "Pocket Internet Explorer";
} else if (document.getElementById && ((strUserAgent.indexOf("netfront") + 1) || navigator.appName === "Blazer" || navigator.product === "Gecko" || (navigator.appName.indexOf("PSP") + 1) || (navigator.appName.indexOf("PLAYSTATION 3") + 1))) {
strBrowser = "NetFront 3+";
} else if (navigator.product === "Gecko" && !navigator.savePreferences) {
strBrowser = "Gecko engine (Mozilla, Netscape 6+ etc.)";
} else if (window.chrome) {
strBrowser = "Chrome";
}
strOut = strBrowser;
return strOut;
}
var glbOnError = 'N/A'
var glbSep = '|';
function activeXDetect(componentClassID) {
"use strict";
var strComponentVersion, strOut;
strComponentVersion = "";
strOut = "";
try {
strComponentVersion = document.body.getComponentVersion('{' + componentClassID + '}', 'ComponentID');
if (strComponentVersion !== null) {
strOut = strComponentVersion;
} else {
strOut = false;
}
return strOut;
} catch (err) {
return glbOnError;
}
}
function stripIllegalChars(strValue) {
"use strict";
var iCounter, strOriginal, strOut;
iCounter = 0;
strOriginal = "";
strOut = "";
try {
strOriginal = strValue.toLowerCase();
for (iCounter = 0; iCounter < strOriginal.length; iCounter = iCounter + 1) {
if (strOriginal.charAt(iCounter) !== '\n' && strOriginal.charAt(iCounter) !== '/' && strOriginal.charAt(iCounter) !== "\\") {
strOut = strOut + strOriginal.charAt(iCounter);
} else if (strOriginal.charAt(iCounter) === '\n') {
strOut = strOut + "n";
}
}
return strOut;
} catch (err) {
return glbOnError;
}
}
function hashtable_containsKey(key) {
"use strict";
var bolExists, iCounter;
bolExists = false;
iCounter = 0;
for (iCounter = 0; iCounter < this.hashtable.length; iCounter = iCounter + 1) {
if (iCounter === key && this.hashtable[iCounter] !== null) {
bolExists = true;
break;
}
}
return bolExists;
}
function hashtable_get(key) {
"use strict";
return this.hashtable[key];
}
function hashtable_keys() {
"use strict";
var keys, iCounter;
keys = [];
iCounter = 0;
for (iCounter in this.hashtable) {
if (this.hashtable[iCounter] !== null) {
keys.push(iCounter);
}
}
return keys;
}
function hashtable_put(key, value) {
"use strict";
if (key === null || value === null) {
throw "NullPointerException {" + key + "},{" + value + "}";
}
this.hashtable[key] = value;
}
function hashtable_size() {
"use strict";
var iSize, iCounter, iOut;
iSize = 0;
iCounter = 0;
iOut = 0;
for (iCounter in this.hashtable) {
if (this.hashtable[iCounter] !== null) {
iSize = iSize + 1;
}
}
iOut = iSize;
return iOut;
}
function Hashtable() {
"use strict";
this.containsKey = hashtable_containsKey;
this.get = hashtable_get;
this.keys = hashtable_keys;
this.put = hashtable_put;
this.size = hashtable_size;
this.hashtable = [];
}
/* Detect Plugins */
function fingerprint_plugins() {
"use strict";
var htIEComponents, strKey, strName, strVersion, strTemp, bolFirst, iCount, strMimeType, strOut;
try {
/* Create hashtable of IE components */
htIEComponents = new Hashtable();
htIEComponents.put('7790769C-0471-11D2-AF11-00C04FA35D02', 'AddressBook'); // Address Book
htIEComponents.put('47F67D00-9E55-11D1-BAEF-00C04FC2D130', 'AolArtFormat'); // AOL ART Image Format Support
htIEComponents.put('76C19B38-F0C8-11CF-87CC-0020AFEECF20', 'ArabicDS'); // Arabic Text Display Support
htIEComponents.put('76C19B34-F0C8-11CF-87CC-0020AFEECF20', 'ChineseSDS'); // Chinese (Simplified) Text Display Support
htIEComponents.put('76C19B33-F0C8-11CF-87CC-0020AFEECF20', 'ChineseTDS'); // Chinese (traditional) Text Display Support
htIEComponents.put('238F6F83-B8B4-11CF-8771-00A024541EE3', 'CitrixICA'); // Citrix ICA Client
htIEComponents.put('283807B5-2C60-11D0-A31D-00AA00B92C03', 'DirectAnim'); // DirectAnimation
htIEComponents.put('44BBA848-CC51-11CF-AAFA-00AA00B6015C', 'DirectShow'); // DirectShow
htIEComponents.put('9381D8F2-0288-11D0-9501-00AA00B911A5', 'DynHTML'); // Dynamic HTML Data Binding
htIEComponents.put('4F216970-C90C-11D1-B5C7-0000F8051515', 'DynHTML4Java'); // Dynamic HTML Data Binding for Java
htIEComponents.put('D27CDB6E-AE6D-11CF-96B8-444553540000', 'Flash'); // Macromedia Flash
htIEComponents.put('76C19B36-F0C8-11CF-87CC-0020AFEECF20', 'HebrewDS'); // Hebrew Text Display Support
htIEComponents.put('630B1DA0-B465-11D1-9948-00C04F98BBC9', 'IEBrwEnh'); // Internet Explorer Browsing Enhancements
htIEComponents.put('08B0E5C0-4FCB-11CF-AAA5-00401C608555', 'IEClass4Java'); // Internet Explorer Classes for Java
htIEComponents.put('45EA75A0-A269-11D1-B5BF-0000F8051515', 'IEHelp'); // Internet Explorer Help
htIEComponents.put('DE5AED00-A4BF-11D1-9948-00C04F98BBC9', 'IEHelpEng'); // Internet Explorer Help Engine
htIEComponents.put('89820200-ECBD-11CF-8B85-00AA005B4383', 'IE5WebBrw'); // Internet Explorer 5/6 Web Browser
htIEComponents.put('5A8D6EE0-3E18-11D0-821E-444553540000', 'InetConnectionWiz'); // Internet Connection Wizard
htIEComponents.put('76C19B30-F0C8-11CF-87CC-0020AFEECF20', 'JapaneseDS'); // Japanese Text Display Support
htIEComponents.put('76C19B31-F0C8-11CF-87CC-0020AFEECF20', 'KoreanDS'); // Korean Text Display Support
htIEComponents.put('76C19B50-F0C8-11CF-87CC-0020AFEECF20', 'LanguageAS'); // Language Auto-Selection
htIEComponents.put('08B0E5C0-4FCB-11CF-AAA5-00401C608500', 'MsftVM'); // Microsoft virtual machine
htIEComponents.put('5945C046-LE7D-LLDL-BC44-00C04FD912BE', 'MSNMessengerSrv'); // MSN Messenger Service
htIEComponents.put('44BBA842-CC51-11CF-AAFA-00AA00B6015B', 'NetMeetingNT'); // NetMeeting NT
htIEComponents.put('3AF36230-A269-11D1-B5BF-0000F8051515', 'OfflineBrwPack'); // Offline Browsing Pack
htIEComponents.put('44BBA840-CC51-11CF-AAFA-00AA00B6015C', 'OutlookExpress'); // Outlook Express
htIEComponents.put('76C19B32-F0C8-11CF-87CC-0020AFEECF20', 'PanEuropeanDS'); // Pan-European Text Display Support
htIEComponents.put('4063BE15-3B08-470D-A0D5-B37161CFFD69', 'QuickTime'); // Apple Quick Time
htIEComponents.put('DE4AF3B0-F4D4-11D3-B41A-0050DA2E6C21', 'QuickTimeCheck'); // Apple Quick Time Check
htIEComponents.put('3049C3E9-B461-4BC5-8870-4C09146192CA', 'RealPlayer'); // RealPlayer Download and Record Plugin for IE
htIEComponents.put('2A202491-F00D-11CF-87CC-0020AFEECF20', 'ShockwaveDir'); // Macromedia Shockwave Director
htIEComponents.put('3E01D8E0-A72B-4C9F-99BD-8A6E7B97A48D', 'Skype'); // Skype
htIEComponents.put('CC2A9BA0-3BDD-11D0-821E-444553540000', 'TaskScheduler'); // Task Scheduler
htIEComponents.put('76C19B35-F0C8-11CF-87CC-0020AFEECF20', 'ThaiDS'); // Thai Text Display Support
htIEComponents.put('3BF42070-B3B1-11D1-B5C5-0000F8051515', 'Uniscribe'); // Uniscribe
htIEComponents.put('4F645220-306D-11D2-995D-00C04F98BBC9', 'VBScripting'); // Visual Basic Scripting Support v5.6
htIEComponents.put('76C19B37-F0C8-11CF-87CC-0020AFEECF20', 'VietnameseDS'); // Vietnamese Text Display Support
htIEComponents.put('10072CEC-8CC1-11D1-986E-00A0C955B42F', 'VML'); // Vector Graphics Rendering (VML)
htIEComponents.put('90E2BA2E-DD1B-4CDE-9134-7A8B86D33CA7', 'WebEx'); // WebEx Productivity Tools
htIEComponents.put('73FA19D0-2D75-11D2-995D-00C04F98BBC9', 'WebFolders'); // Web Folders
htIEComponents.put('89820200-ECBD-11CF-8B85-00AA005B4340', 'WinDesktopUpdateNT'); // Windows Desktop Update NT
htIEComponents.put('9030D464-4C02-4ABF-8ECC-5164760863C6', 'WinLive'); // Windows Live ID Sign-in Helper
htIEComponents.put('6BF52A52-394A-11D3-B153-00C04F79FAA6', 'WinMediaPlayer'); // Windows Media Player (Versions 7, 8 or 9)
htIEComponents.put('22D6F312-B0F6-11D0-94AB-0080C74C7E95', 'WinMediaPlayerTrad'); // Windows Media Player (Traditional Versions)
strTemp = "";
bolFirst = true;
/* strOpera gives full path of the file, extract the filenames, ignoring description and length */
if (navigator.plugins.length > 0) {
for (iCount = 0; iCount < navigator.plugins.length; iCount = iCount + 1) {
if (bolFirst === true) {
strTemp += navigator.plugins[iCount].name;
bolFirst = false;
} else {
strTemp += glbSep + navigator.plugins[iCount].name;
}
}
} else if (navigator.mimeTypes.length > 0) {
strMimeType = navigator.mimeTypes;
for (iCount = 0; iCount < strMimeType.length; iCount = iCount + 1) {
if (bolFirst === true) {
strTemp += strMimeType[iCount].description;
bolFirst = false;
} else {
strTemp += glbSep + strMimeType[iCount].description;
}
}
} else {
document.body.addBehavior("#default#clientCaps");
strKey = htIEComponents.keys();
for (iCount = 0; iCount < htIEComponents.size(); iCount = iCount + 1) {
strVersion = activeXDetect(strKey[iCount]);
strName = htIEComponents.get(strKey[iCount]);
if (strVersion) {
if (bolFirst === true) {
strTemp = strName + glbPair + strVersion;
bolFirst = false;
} else {
strTemp += glbSep + strName + glbPair + strVersion;
}
}
}
strTemp = strTemp.replace(/,/g, ".");
}
strTemp = stripIllegalChars(strTemp);
if (strTemp === "") {
strTemp = "None";
}
strOut = strTemp;
return strOut;
} catch (err) {
return glbOnError;
}
}
var fp = new Fingerprint({
canvas: true,
ie_activex: true,
screen_resolution: true
});
var uid = fp.get();
document.getElementById('fingerprint').innerHTML = uid;
document.getElementById('browser').innerHTML = fingerprint_browser();
document.getElementById('flash').innerHTML = fingerprint_flash();
document.getElementById('canvas').innerHTML = fingerprint_canvas();
document.getElementById('connection').innerHTML = fingerprint_connection();
document.getElementById('cookie').innerHTML = fingerprint_cookie();
document.getElementById('display').innerHTML = fingerprint_display();
document.getElementById('fontsmoothing').innerHTML = fingerprint_fontsmoothing();
document.getElementById('fonts').innerHTML = fingerprint_fonts();
document.getElementById('formfields').innerHTML = fingerprint_formfields();
document.getElementById('java').innerHTML = fingerprint_java();
document.getElementById('language').innerHTML = fingerprint_language();
document.getElementById('silverlight').innerHTML = fingerprint_silverlight();
document.getElementById('os').innerHTML = fingerprint_os();
document.getElementById('timezone').innerHTML = fingerprint_timezone();
document.getElementById('touch').innerHTML = fingerprint_touch();
document.getElementById('plugins').innerHTML = fingerprint_plugins();
document.getElementById('useragent').innerHTML = fingerprint_useragent();
document.getElementById('truebrowser').innerHTML = fingerprint_truebrowser();
Also see: Tab Triggers