Merge pull request #4 from AliasIO/master

Update
main
DaAwesomeP 9 years ago
commit 21e0bca00d

1
.gitignore vendored

@ -6,6 +6,7 @@ drivers/npm/node_modules
drivers/npm/npm-debug.log
node_modules/
npm-debug.log
Thumbs.db
ehthumbs.db

@ -1,12 +1,15 @@
language: node_js
node_js:
- "0.12"
sudo: false
- "4.1.0"
sudo: required
before_install:
- export WAPPALYZER_ROOT=$TRAVIS_BUILD_DIR
- export WAPPALYZER_NODE_PATH=$TRAVIS_BUILD_DIR
- export PATH=$PATH:$TRAVIS_BUILD_DIR/bin
install:
- sudo apt-get update -y
- sudo apt-get install -y curl zip sudo -y --force-yes
- sudo apt-get clean
- npm install jsonlint jpm imagemin-cli -g
- ln -s docker/node/package.json package.json && npm install
- mkdir phantomjs && curl -L https://bitbucket.org/ariya/phantomjs/downloads/phantomjs-1.9.8-linux-x86_64.tar.bz2 | tar xvjC phantomjs && ln -s $WAPPALYZER_ROOT/phantomjs/phantomjs-*-linux-x86_64/bin/phantomjs bin/phantomjs

@ -0,0 +1,3 @@
# Contributing
You can find our contribution guide [in our wiki](https://github.com/AliasIO/Wappalyzer/wiki/Contributing).

@ -29,9 +29,9 @@ echo "Validating apps.json..."
jsonlint --quiet -V $WAPPALYZER_ROOT/schema.json $path/apps.json
echo "Validating regular expressions..."
wappalyzer validate-regex
# echo "Validating regular expressions..."
#
# wappalyzer validate-regex
echo "Validating icons..."

@ -25,12 +25,43 @@ for ( app in json.apps ) {
patterns.forEach(function(pattern) {
var
attrs = pattern.split('\\;'),
regex = '/' + attrs.shift().replace('/', '\/') + '/';
regex = '/' + attrs.shift().replace('/', '\/') + '/',
version = attrs.find( function (attr){
return attr.indexOf('version:')===0;
} ),
amountOfCaptureGroups,
captureGroupsNeeded,
amountOfCaptureGroupsNeeded,
highestBackReference;
//Check if the pattern is a valid RegExp
//Note: unlike when used in Wappalyzer, the modifier i isn't added here
new RegExp(regex);
//Actual amount of capture groups
amountOfCaptureGroups = ''.match(new RegExp('(?:'+pattern+')?')).length - 1;
//Capture groups of which the result is used
captureGroupsNeeded = version ? (version.match(/\\\d/g) || []).filter( function(value, index, self){
return self.indexOf(value) === index;
}).map( function(value){//Because Math.max needs the integers only
return parseInt(value.charAt(1), 10);//Will only work if backreferences cannot be any longer than a single digit
}) : [];
//Amount of capture groups needed
amountOfCaptureGroupsNeeded = captureGroupsNeeded.length;
//Highest back reference number used
highestBackReference = Math.max.apply(null, captureGroupsNeeded);
//Report error
if(amountOfCaptureGroups > amountOfCaptureGroupsNeeded) {
throw new Error('The pattern uses more capture groups than needed. Use non-capturing roups where appropriate.\n' + app + ': ' + type + ': ' + pattern);
}else if(amountOfCaptureGroups < amountOfCaptureGroupsNeeded){
throw new Error('The version string references more capture groups than there are in the pattern! Remove any incorrect back references from the version string and/or add the missing capture groups to the pattern.\n' + app + ': ' + type + ': ' + pattern);
} else if(highestBackReference > amountOfCaptureGroups){
throw new Error('The version string references one or more capture groups whose index is higher than the amount of capture groups in the pattern. Please use the correct index instead of \\\\'+highestBackReference+'.\n' + app + ': ' + type + ': ' + pattern);
}
if ( /^\/(?:\^\$|\.\+|\.\*)\/$/.test(regex) ) {
throw new Error('Pattern should be replaced with empty string.\n' + app + ': ' + type + ': ' + pattern);

@ -9,7 +9,7 @@ ENV WAPPALYZER_NODE_PATH /home/wappalyzer/node
# Install packages
RUN apt-get update && apt-get install -y curl zip libfreetype6 libfontconfig
RUN curl -sL https://deb.nodesource.com/setup_0.12 | bash -
RUN curl -sL https://deb.nodesource.com/setup_4.x | bash -
RUN apt-get install -y nodejs
RUN apt-get clean && rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/*

@ -182,18 +182,6 @@
"script": "addthis\\.com/js/",
"website": "www.addthis.com"
},
"Adobe CQ5": {
"cats": [
1
],
"html": [
"<div class=\"[^\"]*parbase",
"<div[^>]+data-component-path=\"[^\"+]jcr:"
],
"implies": "Java",
"script": "/etc/designs/",
"website": "adobe.com/products/cq.html"
},
"Adobe ColdFusion": {
"cats": [
18
@ -208,6 +196,18 @@
"url": "\\.cfm(?:$|\\?)",
"website": "adobe.com/products/coldfusion-family.html"
},
"Adobe Experience Manager": {
"cats": [
1
],
"html": [
"<div class=\"[^\"]*parbase",
"<div[^>]+data-component-path=\"[^\"+]jcr:"
],
"implies": "Java",
"script": "/etc/designs/",
"website": "www.adobe.com/au/marketing-cloud/enterprise-content-management.html"
},
"Adobe GoLive": {
"cats": [
20
@ -663,6 +663,15 @@
"script": "bittads\\.com/js/bitt\\.js$",
"website": "bittads.com"
},
"Blesta": {
"cats": [
6
],
"headers": {
"Set-Cookie": "blesta_sid"
},
"website": "www.blesta.com"
},
"Blip.tv": {
"cats": [
14
@ -1073,6 +1082,13 @@
"script": "static\\.getclicky\\.com",
"website": "getclicky.com"
},
"Clientexec": {
"cats": [
6
],
"html": "clientexec\\.[^>]*\\s?=\\s?[^>]*;",
"website": "www.clientexec.com"
},
"CloudFlare": {
"cats": [
31
@ -1426,7 +1442,7 @@
},
"DataTables": {
"cats": [
12
12
],
"implies": "jQuery",
"script": "dataTables.*\\.js",
@ -1697,6 +1713,13 @@
},
"website": "www.dynamicweb.dk"
},
"Dynatrace": {
"cats": [
10
],
"script": "dtagent.*\\.js",
"website": "dynatrace.com"
},
"E-Merchant": {
"cats": [
6
@ -2724,6 +2747,14 @@
"script": "jscripts/ips_",
"website": "www.invisionpower.com"
},
"Immutable.js": {
"cats": [
12
],
"env": "^Immutable$",
"script": "^immutable\\.(?:min\\.)?js$",
"website": "facebook.github.io/immutable-js/"
},
"ImpressCMS": {
"cats": [
1
@ -3397,8 +3428,7 @@
],
"env": [
"^fyre$",
"^FyreLoader$",
"^LF$"
"^FyreLoader$"
],
"html": "<[^>]+(?:id|class)=\"livefyre",
"script": "livefyre_init\\.js",
@ -3483,25 +3513,25 @@
],
"website": "mrincworld.com"
},
"M.R. Inc Webserver": {
"M.R. Inc SiteFrame": {
"cats": [
22
18
],
"headers": {
"Server": "M\\.R\\. Inc Webserver"
"Powered-By": "M\\.R\\. Inc SiteFrame"
},
"implies": [
"M.R. Inc BoxyOS"
],
"website": "mrincworld.com"
},
"M.R. Inc SiteFrame": {
"M.R. Inc Webserver": {
"cats": [
18
22
],
"headers": {
"Powered-By": "M\\.R\\. Inc SiteFrame"
"Server": "M\\.R\\. Inc Webserver"
},
"implies": [
"M.R. Inc BoxyOS"
],
"website": "mrincworld.com"
},
"MOBOTIX": {
@ -3979,7 +4009,7 @@
"PHP",
"MySQL"
],
"website": "www.mybboard.net"
"website": "www.mybb.com"
},
"MyBlogLog": {
"cats": [
@ -4381,19 +4411,6 @@
},
"website": "orchardproject.net"
},
"osTicket": {
"cats": [
13
],
"implies": [
"PHP",
"MySQL"
],
"headers": {
"Set-Cookie": "OSTSESSID"
},
"website": "osticket.com"
},
"Outbrain": {
"cats": [
5
@ -4813,22 +4830,6 @@
},
"website": "???"
},
"RainLoop": {
"cats": [
30
],
"env": "^rainloop",
"headers": {
"Server": "RainLoop"
},
"html": [
"<meta [^>]*(?:content=\"([^\"]+)[^>]+ id=\"rlAppVersion\"|id=\"rlAppVersion\"[^>]+ content=\"([^\"]+))\\;version:\\1?\\1:\\2",
"<link[^>]* href=\"[^\"]*rainloop/v/([^/]+)\\;version:\\1"
],
"implies": "PHP",
"script": "rainloop/v/([^/]+)\\;version:\\1",
"website": "rainloop.net"
},
"RBS Change": {
"cats": [
1,
@ -4871,6 +4872,22 @@
"implies": "Ruby",
"website": "github.com/rtomayko/rack-cache"
},
"RainLoop": {
"cats": [
30
],
"env": "^rainloop",
"headers": {
"Server": "RainLoop"
},
"html": [
"<meta [^>]*(?:content=\"([^\"]+)[^>]+ id=\"rlAppVersion\"|id=\"rlAppVersion\"[^>]+ content=\"([^\"]+))\\;version:\\1?\\1:\\2",
"<link[^>]* href=\"[^\"]*rainloop/v/([^/]+)\\;version:\\1"
],
"implies": "PHP",
"script": "rainloop/v/([^/]+)\\;version:\\1",
"website": "rainloop.net"
},
"Ramda": {
"cats": [
12
@ -4900,6 +4917,7 @@
12
],
"env": "^React$",
"html": "<[^>]+data-react",
"script": [
"react(?:\\-with\\-addons)?(?:\\-|\\.)([\\d.]*\\d)[^/]*\\.js\\;version:\\1",
"/([\\d.]+)/react(\\.min)?\\.js\\;version:\\1",
@ -5060,6 +5078,13 @@
"script": "/assets/application-[a-z\\d]{32}/\\.js\\;confidence:50",
"website": "rubyonrails.org"
},
"Ruxit": {
"cats": [
10
],
"script": "ruxitagentjs",
"website": "ruxit.com"
},
"RxJS": {
"cats": [
12
@ -6213,6 +6238,24 @@
"script": "vs350\\.js",
"website": "www.vpasp.com"
},
"VTEX Enterprise": {
"cats": [
6
],
"headers": {
"powered": "vtex"
},
"website": "vtex.com"
},
"VTEX Integrated Store": {
"cats": [
6
],
"headers": {
"X-Powered-By": "vtex-integrated-store"
},
"website": "lojaintegrada.com.br"
},
"Vanilla": {
"cats": [
2
@ -6373,6 +6416,15 @@
"script": "w3counter\\.com/tracker\\.js",
"website": "www.w3counter.com"
},
"WHMCS": {
"cats": [
6
],
"headers": {
"Set-Cookie": "^WHMCS.*"
},
"website": "www.whmcs.com"
},
"WP Rocket": {
"cats": [
23
@ -6630,7 +6682,7 @@
],
"html": "<!--[^>]+WP-Super-Cache",
"implies": "WordPress",
"website": "ocaoimh.ie/wp-super-cache/"
"website": "z9.io/wp-super-cache/"
},
"Wowza Media Server": {
"cats": [
@ -6736,6 +6788,15 @@
},
"website": "xitami.com"
},
"XpressEngine": {
"cats": [
1
],
"meta": {
"generator": "XpressEngine"
},
"website": "www.xpressengine.com/"
},
"YUI": {
"cats": [
12
@ -7413,6 +7474,19 @@
"html": "(?:<a[^>]*(?:\\?|&)osCsid|Powered by (?:<[^>]+>)?osCommerce</a>|<[^>]+class=\"[^>]*infoBoxHeading)",
"website": "www.oscommerce.com"
},
"osTicket": {
"cats": [
13
],
"headers": {
"Set-Cookie": "OSTSESSID"
},
"implies": [
"PHP",
"MySQL"
],
"website": "osticket.com"
},
"ownCloud": {
"cats": [
19
@ -7633,6 +7707,24 @@
},
"website": "ucore.io"
},
"uKnowva": {
"cats": [
1,
2,
18,
50
],
"headers": {
"X-Content-Encoded-By": "uKnowva ([\\d.]+)\\;version:\\1"
},
"html": "<a[^>]+>Powered by uKnowva</a>",
"implies": "PHP",
"meta": {
"generator": "uKnowva (?: ([\\d.]+))?\\;version:\\1"
},
"script": "/media/conv/js/jquery.js",
"website": "uknowva.com"
},
"vBulletin": {
"cats": [
2
@ -7772,4 +7864,4 @@
"50": "document-management-systems",
"51": "landing-page-builders"
}
}
}

@ -3,30 +3,87 @@
var exports = {};
(function(exports) {
var utils = {
pageMeta: {
url: window.location.hostname,
isHP: window.location.pathname === '/',
referrer: window.document.referrer,
rand: Math.floor(Math.random() * 10e12),
startTime: new Date().getTime()
getReferrer: function() {
return this.hashUrl(document.referrer) || null;
},
getPageUrl: function() {
return this.hashUrl(window.location.href) || null;
},
hashUrl: function(url) {
var a,
result;
if ( !url || url.indexOf('http') !== 0 ) {
return null;
}
a = document.createElement('a');
a.href = url;
result = a.protocol + '//' + a.hostname + '/';
if ( a.pathname !== '/' ) {
result += this.hashCode(a.pathname);
}
if ( a.search ) {
result += '?' + this.hashCode(a.search);
}
if ( a.hash ) {
result += '#' + this.hashCode(a.hash);
}
return result;
},
hashCode: function(str) {
var hash = 0,
kar,
i;
if ( str.length === 0 ) {
return hash;
}
for ( i = 0; i < str.length; i++ ) {
kar = str.charCodeAt(i);
hash = ((hash << 5) - hash) + kar;
hash = hash & hash;
}
return hash + Math.pow(2, 32);
},
realArray: function(a) {
return Array.prototype.slice.apply(a);
},
SCRIPT_IN_WINDOW_TOP: window === window.top,
onDocLoaded: function(doc, callback) {
if ( doc.readyState === 'loading' ) {
doc.addEventListener('DOMContentLoaded', callback);
} else {
callback();
}
},
SCRIPT_IN_WINDOW_TOP: window === window.top,
isFriendlyWindow: function(win) {
var href;
var href;
try {
href = win.location.href;
} catch(e) {
return false;
}
return true;
},
@ -39,68 +96,65 @@ var exports = {};
},
parseQS: function(qs) {
if (qs.indexOf('http') === 0) {
if ( qs.indexOf('http') === 0 ) {
qs = qs.split('?')[1];
}
var i, kvs, key, val;
var dict = {};
qs = qs.split('&');
for ( i = 0; i < qs.length; i++ ) {
kvs = qs[i].split('=');
key = kvs[0];
val = kvs.slice(1).join('=');
try {
dict[key] = window.decodeURIComponent(val);
} catch (e) {
this.log('URI decode error', kvs);
continue;
}
}
return dict;
},
};
makeLog: function(opt_adData, opt_msgNum, opt_pageTags) {
var assets = [opt_adData] || [];
utils.SCRIPT_IN_FRIENDLY_IFRAME = !utils.SCRIPT_IN_WINDOW_TOP && utils.isFriendlyWindow(window.parent);
utils.SCRIPT_IN_HOSTILE_IFRAME = !utils.SCRIPT_IN_WINDOW_TOP && !utils.SCRIPT_IN_FRIENDLY_IFRAME;
function LogGenerator() {
this.msgNum = 0;
this.pageMeta = {
'url': utils.getPageUrl(),
'isHP': window.location.pathname === '/',
'referrer': utils.getReferrer(),
'rand': Math.floor(Math.random() * 10e12),
'startTime': new Date().getTime()
};
}
return {
LogGenerator.prototype = {
log: function(event, opt_assets, opt_pageTags) {
var result = {
doc: this.pageMeta,
assets: assets,
event: event,
assets: opt_assets || [],
version: '3',
msgNum: opt_msgNum || 0,
msgNum: this.msgNum,
timestamp: new Date().getTime(),
pageVis: document.visibilityState,
pageFoc: document.hasFocus(),
pageTags: opt_pageTags || []
};
},
expBackoff: function(callback, initTimeoutMS, opt_maxTimeoutMS) {
var curTimeout = initTimeoutMS;
var wrapped = function() {
callback();
var nextTimeout = 2 * curTimeout;
curTimeout = opt_maxTimeoutMS ? Math.min(nextTimeout, opt_maxTimeoutMS) : nextTimeout;
setTimeout(wrapped, curTimeout);
};
setTimeout(wrapped, curTimeout);
},
this.msgNum++;
return result;
}
};
utils.SCRIPT_IN_FRIENDLY_IFRAME = !utils.SCRIPT_IN_WINDOW_TOP && utils.isFriendlyWindow(window.parent);
utils.SCRIPT_IN_HOSTILE_IFRAME = !utils.SCRIPT_IN_WINDOW_TOP && !utils.SCRIPT_IN_FRIENDLY_IFRAME;
utils.LogGenerator = LogGenerator;
exports.utils = utils;
})(exports);
(function(exports) {
var VALID_AD_SIZES = [
[160, 600],
[300, 250],
@ -115,39 +169,38 @@ var exports = {};
[970, 90],
[970, 250],
[970, 400],
[970, 415]
];
var
PX_SIZE_TOL = 10,
MIN_WINDOW_PX = 10,
MAX_SEARCHES_PER_WINDOW = 10,
MAX_SEARCHES_PER_ELEMENT = 2;
var SIZE_SET = (function makeSizeSet() {
var
set = {},
i,
xfuz,
yfuz,
size,
width,
height;
for ( i = 0; i < VALID_AD_SIZES.length; i++ ) {
for (xfuz = -PX_SIZE_TOL; xfuz <= PX_SIZE_TOL; xfuz++ ) {
for ( yfuz = -PX_SIZE_TOL; yfuz <= PX_SIZE_TOL; yfuz++ ) {
size = VALID_AD_SIZES[i];
[970, 415],
[1280, 100]
];
var PX_SIZE_TOL = 10;
var MIN_WINDOW_PX = 10;
var MAX_SEARCHES_PER_WINDOW = 10;
var MAX_SEARCHES_PER_ELEMENT = 2;
function makeSizeSet(validAdSizes, sizeTol) {
var set = {};
var i;
var xfuz;
var yfuz;
var size;
var width;
var height;
for ( i = 0; i < validAdSizes.length; i++ ) {
for ( xfuz = -sizeTol; xfuz <= sizeTol; xfuz++ ) {
for ( yfuz = -sizeTol; yfuz <= sizeTol; yfuz++ ) {
size = validAdSizes[i];
width = size[0] + xfuz;
height = size[1] + yfuz;
set[width] = set[width] || {};
set[width][height] = true;
set[width + 'x' + height] = size;
}
}
}
return set;
})();
}
var SIZE_SET = makeSizeSet(VALID_AD_SIZES, PX_SIZE_TOL);
function elementIsAd(el) {
if ( typeof el.searches !== 'number' ) {
@ -158,33 +211,119 @@ var exports = {};
return false;
}
el.searches ++;
el.searches += 1;
var w = el.offsetWidth;
var isImgWithoutSrc = el.tagName === 'IMG' && !el.src;
var isImgWithoutAnchor = el.tagName === 'IMG' && !(el.parentNode.tagName === 'A' || el.getAttribute('onclick'));
return SIZE_SET[w] && SIZE_SET[w][el.offsetHeight];
return isAdShaped(el) && !isImgWithoutSrc && !isImgWithoutAnchor;
}
function windowMightContainAds(win) {
return win.innerWidth >= MIN_WINDOW_PX && win.innerHeight >= MIN_WINDOW_PX;
return (win.innerWidth >= MIN_WINDOW_PX &&
win.innerHeight >= MIN_WINDOW_PX);
}
function isNewAd(el) {
return el.mp_adFound !== true;
function isNewAd(el, win) {
return !el.mp_adFound && (win === win.top || !win.mp_adFound);
}
function getFriendlyIframes(win) {
var iframes = win.document.querySelectorAll('iframe');
iframes = exports.utils.realArray(iframes);
var friendlyIframes = iframes.filter(function(ifr) {
return exports.utils.isFriendlyWindow(ifr.contentWindow);
});
return friendlyIframes;
}
function isAdShaped(el, opt_win, opt_retMatched) {
var rect, width, height, result;
if ( opt_win ) {
width = opt_win.innerWidth;
height = opt_win.innerHeight;
} else {
rect = el.getBoundingClientRect();
width = rect.width;
height = rect.height;
}
result = SIZE_SET[width + 'x' + height];
if ( opt_retMatched ) {
return result;
} else {
return !!result;
}
}
function containsLargeIframes(win) {
var iframes = win.document.querySelectorAll('iframe');
var rect;
var i;
for ( i = 0; i < iframes.length; i++ ) {
rect = iframes[i].getBoundingClientRect();
if ( rect.width > 10 || rect.height > 10 ) {
return true;
}
}
return false;
}
var HTML5_SIGNAL_ELEMENTS = 'canvas, button, video, svg, img';
function iframeGetHTMLAd(win) {
var body = win.document.body,
elements, i, el, divs, div, numElements,
winSize, elSize;
if ( !body ) {
return null;
}
winSize = isAdShaped(null, win, true);
if ( !winSize ) {
return null;
}
elements = body.querySelectorAll(HTML5_SIGNAL_ELEMENTS);
for ( i = 0; i < elements.length; i++ ) {
el = elements[i];
elSize = isAdShaped(el, null, true);
if ( elSize && elSize[0] === winSize[0] && elSize[1] === winSize[1] ) {
return el;
}
}
numElements = body.querySelectorAll('*').length;
if ( numElements < 5 ) {
return null;
}
divs = body.querySelectorAll('div');
for ( i = 0; i < divs.length; i++ ) {
div = divs[i];
elSize = isAdShaped(div, null, true);
if ( elSize && elSize[0] === winSize[0] && elSize[1] === winSize[1] ) {
return div;
}
}
return null;
}
function mainGetHTMLAd(win) {
var styles = win.document.querySelectorAll('div > style, div > link[rel="stylesheet"]'),
i, div;
for ( i = 0; i < styles.length; i++ ) {
div = styles[i].parentNode;
if ( isAdShaped(div) ) {
return div;
}
}
}
function findAds(win, opt_ads) {
if ( !windowMightContainAds(win) ) {
return;
@ -195,25 +334,52 @@ var exports = {};
}
var ads = opt_ads || [];
var adsFound = 0;
if ( exports.utils.SCRIPT_IN_WINDOW_TOP || win.searches < MAX_SEARCHES_PER_WINDOW ) {
var adCandidates = win.document.querySelectorAll('img, object, embed');
adCandidates = exports.utils.realArray(adCandidates);
adCandidates.forEach(function(el) {
if (elementIsAd(el) && isNewAd(el)) {
if ( elementIsAd(el) && isNewAd(el, win) ) {
el.mp_adFound = true;
el.inIframe = win !== win.top;
win.mp_adFound = true;
ads.push(el);
adsFound += 1;
}
});
win.searches ++;
var htmlAd, adSizeMeta;
if ( win === win.top ) {
htmlAd = mainGetHTMLAd(win);
} else {
if ( adsFound === 0 && !containsLargeIframes(win) ) {
htmlAd = iframeGetHTMLAd(win);
}
}
if ( htmlAd && isNewAd(htmlAd, win) ) {
htmlAd.html5 = true;
htmlAd.inIframe = win !== win.top;
if ( htmlAd.inIframe ) {
adSizeMeta = win.document.querySelectorAll('meta[name="ad.size"]');
if ( adSizeMeta.length > 0 ) {
htmlAd.adSizeMeta = adSizeMeta[0].content;
}
if ( win.clickTag ) {
htmlAd.winClickTag = win.clickTag;
}
}
htmlAd.mp_adFound = true;
win.mp_adFound = true;
ads.push(htmlAd);
}
win.searches += 1;
}
var iframes = getFriendlyIframes(win);
iframes.forEach(function(ifr) {
findAds(ifr.contentWindow, ads);
});
@ -222,11 +388,13 @@ var exports = {};
}
exports.adfinder = {
SIZE_SET: SIZE_SET,
findAds: findAds
};
})(exports);
(function(exports) {
var parser = {
TAGS_WITH_SRC_ATTR: {
'IMG': true,
@ -242,8 +410,10 @@ var exports = {};
if ( this.TAGS_WITH_SRC_ATTR.hasOwnProperty(el.tagName) ) {
url = el.src;
} else if ( el.tagName === 'OBJECT' ) {
url = el.data || (params && params.movie) || null;
} else if ( el.tagName === 'A' ) {
url = el.href;
}
@ -263,22 +433,19 @@ var exports = {};
var i, child;
var params = {};
var children = el.children;
for ( i = 0; i < children.length; i++ ) {
child = children[i];
if ( child.tagName === 'PARAM' && child.name ) {
params[child.name.toLowerCase()] = child.value;
}
}
return params;
},
getPosition: function(el) {
var rect = el.getBoundingClientRect();
var win = exports.utils.elementWindow(el);
return {
width: rect.width,
height: rect.height,
@ -293,7 +460,8 @@ var exports = {};
if ( el.tagName === 'EMBED' ) {
flashvars = el.getAttribute('flashvars') || urlQS;
} else if (el.tagName === 'OBJECT') {
} else if ( el.tagName === 'OBJECT' ) {
flashvars = params.flashvars || el.getAttribute('flashvars') || urlQS;
}
@ -302,19 +470,18 @@ var exports = {};
findClickThru: function(el, flashvars) {
var key;
if ( el.tagName === 'IMG' && el.parentElement.tagName === 'A' ) {
return el.parentElement.href;
} else if ( flashvars ) {
for ( key in flashvars ) {
if ( flashvars.hasOwnProperty(key) ) {
if (key.toLowerCase().indexOf('clicktag') === 0) {
if ( key.toLowerCase().indexOf('clicktag') === 0 ) {
return flashvars[key];
}
}
}
}
return null;
},
@ -322,6 +489,7 @@ var exports = {};
var val = el.getAttribute(name);
if ( val && val.slice && val.toString ) {
return val.slice(0, this.MAX_ATTR_LEN).toString();
} else {
return null;
@ -329,14 +497,13 @@ var exports = {};
},
putPropIfExists: function(obj, name, val) {
if (val) {
if ( val ) {
obj[name] = val;
}
},
putAttrIfExists: function(obj, el, name) {
var val = this.getAttr(el, name);
this.putPropIfExists(obj, name, val);
},
@ -355,7 +522,8 @@ var exports = {};
children: []
};
if (params) {
if ( params ) {
delete params.flashvars;
}
@ -376,6 +544,7 @@ var exports = {};
})(exports);
(function(exports) {
var ContextManager = function(adData) {
this.adData = adData;
};
@ -385,6 +554,7 @@ var exports = {};
ASPECT_RATIO_FOR_LEADERBOARDS: 2,
isValidContainer: function(el, opt_curWin) {
var cWidth = el.clientWidth;
var cHeight = el.clientHeight;
@ -399,7 +569,7 @@ var exports = {};
var similarSizeY = this.withinTol(adHeight, cHeight);
var adAspect = adWidth / adHeight;
return similarWin || el.tagName === 'A' || ( adAspect >= this.ASPECT_RATIO_FOR_LEADERBOARDS && similarSizeY ) || (similarSizeX && similarSizeY);
return similarWin || el.tagName === 'A' || (adAspect >= this.ASPECT_RATIO_FOR_LEADERBOARDS && similarSizeY) || (similarSizeX && similarSizeY);
},
withinTol: function(adlen, conlen) {
@ -412,7 +582,6 @@ var exports = {};
if ( !el ) {
return;
}
var i;
var ifrWin;
var adId = this.adData.adId;
@ -426,14 +595,21 @@ var exports = {};
if ( elIsAd ) {
json.adId = adId;
this.adData.element = json;
this.adData.element = {};
var keys = Object.keys(json);
for ( i = 0; i < keys.length; i++ ) {
var key = keys[i];
if ( key !== 'children' && key !== 'contents' ) {
this.adData.element[key] = json[key];
}
}
}
var children = exports.utils.realArray(el.children).filter(function(el) {
var param = el.tagName === 'PARAM';
var inlineScript = el.tagName === 'SCRIPT' && !(el.src && el.src.indexOf('http') >= 0);
var noScript = el.tagName === 'NOSCRIPT';
return !(param || inlineScript || noScript);
});
@ -445,12 +621,13 @@ var exports = {};
ifrWin = el.contentWindow;
if ( adId && el[adId] && el[adId].needsWindow ) {
json.contents = this.adData.serializedIframeContents;
json.contents = this.adData.serializedIframeContents;
el[adId].needsWindow = false;
delete this.adData.serializedIframeContents;
} else if ( exports.utils.isFriendlyWindow(ifrWin) ) {
json.contents = this.serializeElements(ifrWin.document.documentElement);
}
}
@ -460,10 +637,6 @@ var exports = {};
captureHTML: function(containerEl) {
this.adData.context = this.serializeElements(containerEl);
if ( this.adData.html ) {
this.adData.html.push(containerEl.outerHTML);
}
},
nodeCount: function(el) {
@ -481,8 +654,7 @@ var exports = {};
while ( true ) {
parentContainer = curContainer.parentElement;
if (this.isValidContainer(parentContainer)) {
if ( this.isValidContainer(parentContainer) ) {
curContainer = parentContainer;
} else {
return curContainer;
@ -492,7 +664,9 @@ var exports = {};
};
var tagfinder = {
prepToSend: function(adData) {
adData.matchedSize = exports.adfinder.SIZE_SET[adData.width + 'x' + adData.height];
delete adData.width;
delete adData.height;
},
@ -525,25 +699,24 @@ var exports = {};
var curWin = exports.utils.elementWindow(referenceElement);
var highestContainer;
while (true) {
while ( true ) {
highestContainer = mgr.highestContainer(curWin, referenceElement);
mgr.captureHTML(highestContainer);
if (curWin === window.top) {
if ( curWin === window.top ) {
break;
} else {
mgr.adData.serializedIframeContents = mgr.adData.context;
if (exports.utils.isFriendlyWindow(curWin.parent)) {
if ( exports.utils.isFriendlyWindow(curWin.parent) ) {
referenceElement = curWin.frameElement;
referenceElement[mgr.adData.adId] = { needsWindow: true };
referenceElement[mgr.adData.adId] = {needsWindow: true};
curWin = curWin.parent;
} else {
break;
}
}
}
return {
referenceElement:referenceElement,
highestContainer: highestContainer
@ -556,8 +729,7 @@ var exports = {};
(function(exports) {
var _onAdFound;
var _getFullHTML;
var _logsSent = 0;
var _logGen = new exports.utils.LogGenerator();
var _pageTags;
var INIT_MS_BW_SEARCHES = 2000;
var PAGE_TAG_RE = new RegExp('gpt|oascentral');
@ -565,23 +737,19 @@ var exports = {};
function getPageTags(doc) {
var scripts = doc.getElementsByTagName('script');
var pageTags = [];
scripts = exports.utils.realArray(scripts);
scripts.forEach(function(script) {
if (PAGE_TAG_RE.exec(script.src)) {
if ( PAGE_TAG_RE.exec(script.src) ) {
pageTags.push({'tagName': 'SCRIPT', 'url': script.src});
}
});
return pageTags;
}
function messageAllParentFrames(adData) {
adData.dummyId = true;
adData.dummyId = true;
var win = window;
while ( win !== win.top ) {
win = win.parent;
win.postMessage(adData, '*');
@ -590,26 +758,20 @@ var exports = {};
function appendTagsAndSendToParent(adData, referenceElement) {
var results = exports.tagfinder.appendTags(adData, referenceElement);
if ( exports.utils.SCRIPT_IN_HOSTILE_IFRAME ) {
messageAllParentFrames(adData);
} else if ( exports.utils.SCRIPT_IN_WINDOW_TOP ) {
exports.tagfinder.setPositions(adData);
exports.tagfinder.prepToSend(adData);
var html = adData.html;
delete adData.html;
adData.curPageUrl = window.location.href;
adData.curPageUrl = exports.utils.getPageUrl();
_pageTags = _pageTags || getPageTags(document);
var log = exports.utils.makeLog(adData, _logsSent, _pageTags);
var log = _logGen.log('ad', [adData], _pageTags);
if ( _onAdFound ) {
_onAdFound(log, html, results.referenceElement);
_logsSent++;
_onAdFound(log, results.referenceElement);
}
}
}
@ -619,6 +781,7 @@ var exports = {};
}
function extractAds() {
var ads = exports.adfinder.findAds(window);
if ( !ads ) {
@ -626,6 +789,7 @@ var exports = {};
}
ads.forEach(function(ad) {
var startTime = new Date().getTime();
var adId = startTime + '-' + Math.floor(Math.random() * 10e12);
@ -633,59 +797,110 @@ var exports = {};
width: ad.offsetWidth,
height: ad.offsetHeight,
startTime: startTime,
html: ( _getFullHTML && [] ) || null,
adId: adId
adId: adId,
html5: ad.html5 || false,
inIframe: ad.inIframe
};
if ( ad.html5 && ad.inIframe ) {
adData.adSizeMeta = ad.adSizeMeta || null;
adData.winClickTag = ad.winClickTag || null;
}
ad[adId] = { isAd: true };
appendTagsAndSendToParent(adData, ad);
});
}
function onPostMessage(event) {
var adData = event.data;
var ifrTag;
if ( !adData.dummyId ) {
return;
function isChildWin(myWin, otherWin) {
var parentWin = otherWin.parent;
while ( parentWin !== otherWin ) {
if ( parentWin === myWin ) {
return true;
}
otherWin = parentWin;
parentWin = parentWin.parent;
}
return false;
}
delete adData.dummyId;
function iframeFromWindow(win, winToMatch) {
var i, ifr, ifrWin,
iframes = win.document.querySelectorAll('iframe');
try {
ifrTag = event.source.frameElement;
} catch(e) {
return false;
for ( i = 0; i < iframes.length; i++ ) {
ifr = iframes[i];
if ( ifr.contentWindow === winToMatch ) {
return ifr;
}
}
for ( i = 0; i < iframes.length; i++ ) {
ifrWin = iframes[i].contentWindow;
if ( exports.utils.isFriendlyWindow(ifrWin) ) {
ifr = iframeFromWindow(ifrWin, winToMatch);
if ( ifr ) {
return ifr;
}
}
}
}
function onPostMessage(event) {
var adData = event.data,
ifrWin = event.source,
ifrTag;
if ( adData.dummyId ) {
delete adData.dummyId;
if ( isChildWin(window, ifrWin) ) {
if ( exports.utils.isFriendlyWindow(ifrWin) ) {
ifrTag = ifrWin.frameElement;
} else {
ifrTag = iframeFromWindow(window, ifrWin);
}
ifrTag[adData.adId] = {needsWindow: true};
if ( ifrTag ) {
appendTagsAndSendToParent(adData, ifrTag);
ifrTag[adData.adId] = {needsWindow: true};
appendTagsAndSendToParent(adData, ifrTag);
}
}
}
}
exports.coordinator = {
init: function(onAdFound, opt_getFullHTML) {
if (exports.utils.SCRIPT_IN_FRIENDLY_IFRAME) {
init: function(onAdFound, onPage) {
if ( exports.utils.SCRIPT_IN_FRIENDLY_IFRAME ) {
return false;
}
_onAdFound = onAdFound;
_getFullHTML = opt_getFullHTML;
if ( exports.utils.SCRIPT_IN_WINDOW_TOP ) {
chrome.runtime.sendMessage({ event: 'new-page', url: window.location.href });
var log = _logGen.log('page');
onPage(log);
}
window.addEventListener('message', onPostMessage, false);
if ( document.readyState !== 'loading' ) {
extractAdsWrapper();
} else {
document.addEventListener('DOMContentLoaded', extractAdsWrapper);
if ( exports.utils.SCRIPT_IN_WINDOW_TOP ) {
window.addEventListener('beforeunload', function(event) {
var log = _logGen.log('unload');
log.timing = window.performance.timing;
onPage(log);
});
}
exports.utils.onDocLoaded(document, extractAdsWrapper);
}
};
})(exports);
(function(exports) {
@ -693,7 +908,5 @@ var exports = {};
chrome.extension.sendRequest({ id: 'ad_log', subject: log });
};
var getFullHTML = false;
exports.coordinator.init(onAdFound, getFullHTML);
exports.coordinator.init(onAdFound, onAdFound);
})(exports);

@ -12,8 +12,7 @@
upgraded = false,
tab,
tabCache = {},
headersCache = {},
adCache = [];
headersCache = {};
w.driver = {
/**
@ -91,7 +90,7 @@
break;
case 'ad_log':
adCache.push(request.subject);
w.adCache.push(request.subject);
break;
case 'get_apps':
@ -217,11 +216,9 @@
w.ping = { hostnames: {} };
w.driver.post('https://ad.wappalyzer.com/log/wp/', adCache);
w.driver.post('https://ad.wappalyzer.com/log/wp/', w.adCache);
w.log('adCache: ' + JSON.stringify(adCache)); //
adCache = [];
w.adCache = [];
}
},

@ -1,19 +0,0 @@
/**
* Google Analytics
*/
var _gaq = _gaq || [];
_gaq.push(['_setAccount', 'UA-216336-23']);
_gaq.push(['_trackPageview']);
(function() {
var ga = document.createElement('script');
ga.src = 'https://ssl.google-analytics.com/ga.js';
ga.async = true;
var s = document.getElementsByTagName('script')[0];
s.parentNode.insertBefore(ga, s);
})();

@ -1,7 +1,7 @@
{ "name": "Wappalyzer",
"homepage_url": "https://wappalyzer.com?pk_campaign=chrome&pk_kwd=context",
"description": "Identifies software on the web",
"version": "2.38",
"version": "2.41",
"default_locale": "en",
"manifest_version": 2,
"icons": {

@ -196,6 +196,7 @@ var wappalyzer = (function() {
apps: {},
cats: null,
ping: { hostnames: {} },
adCache: [],
detected: {},
config: {
@ -508,7 +509,7 @@ var wappalyzer = (function() {
}
}
if ( Object.keys(w.ping.hostnames).length >= 20 ) {
if ( Object.keys(w.ping.hostnames).length >= 20 || w.adCache.length >= 40 ) {
driver('ping');
}

@ -16,11 +16,11 @@ website = Zu wappalyzer.com browsen
cat1 = CMS
cat2 = Message Board
cat3 = Database Manager
cat4 = Documentation Tool
cat3 = Datenbank-Manager
cat4 = Dokumentationstool
cat5 = Widget
cat6 = eCommerce
cat7 = Photo Gallery
cat7 = Fotogallery
cat8 = Wiki
cat9 = Hosting Panel
cat10 = Analytics
@ -28,40 +28,40 @@ cat11 = Blog
cat12 = JavaScript Framework
cat13 = Issue Tracker
cat14 = Video Player
cat15 = Comment System
cat15 = Kommentarsystem
cat16 = CAPTCHA
cat17 = Font Script
cat18 = Web Framework
cat19 = Miscellaneous
cat19 = Diverses
cat20 = Editor
cat21 = LMS
cat22 = Web Server
cat22 = Web-Server
cat23 = Cache Tool
cat24 = Rich Text Editor
cat25 = Javascript Graphics
cat26 = Mobile Framework
cat27 = Programming Language
cat28 = Operating System
cat29 = Search Engine
cat27 = Programmiersprache
cat28 = Betriebssystem
cat29 = Such-Engine
cat30 = Web mail
cat31 = CDN
cat32 = Marketing Automation
cat33 = Web Server Extension
cat34 = Database
cat35 = Map
cat36 = Advertizing Network
cat37 = Network Device
cat38 = Media Server
cat33 = Web-Server-Erweiterung
cat34 = Datenbank
cat35 = Karte
cat36 = Werbenetzwerk
cat37 = Netzwerkgerät
cat38 = Medienserver
cat39 = Webcam
cat40 = Printer
cat40 = Drucker
cat41 = Payment Processor
cat42 = Tag Manager
cat43 = Paywall
cat44 = Build/CI System
cat45 = SCADA System
cat46 = Remote Access
cat46 = Fernzugriff
cat47 = Development Tool
cat48 = Network Storage
cat49 = Feed Readers
cat48 = Netzwerkspeicher
cat49 = Feed-Leser
cat50 = Document Management Systems
cat51 = Landing Page Builder

@ -133,11 +133,11 @@ class Wappalyzer
$headers = trim(substr($response, 0, $headerSize));
$headers = preg_split('/^\s*$/m', $headers);
$headers = end($headers);
$lines = array_slice(explode("\r\n", $headers), 1);
$lines = array_slice(explode("\n", $headers), 1);
foreach ( $lines as $line ) {
if ( strpos(trim($line), ': ') !== false ) {
list($key, $value) = explode(': ', $line);
list($key, $value) = explode(': ', trim($line, "\r"));
$result->headers[strtolower($key)] = $value;
}

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.6 KiB

After

Width:  |  Height:  |  Size: 1.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 735 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 720 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 469 B

After

Width:  |  Height:  |  Size: 321 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 170 B

After

Width:  |  Height:  |  Size: 132 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.0 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 327 B

After

Width:  |  Height:  |  Size: 274 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.9 KiB

After

Width:  |  Height:  |  Size: 1.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.6 KiB

After

Width:  |  Height:  |  Size: 1.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.9 KiB

After

Width:  |  Height:  |  Size: 2.9 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.8 KiB

After

Width:  |  Height:  |  Size: 2.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.4 KiB

After

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.4 KiB

After

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.4 KiB

After

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.4 KiB

After

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.4 KiB

After

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.2 KiB

After

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.5 KiB

After

Width:  |  Height:  |  Size: 1.4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.1 KiB

After

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 704 B

After

Width:  |  Height:  |  Size: 595 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 367 B

After

Width:  |  Height:  |  Size: 330 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 765 B

After

Width:  |  Height:  |  Size: 728 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 587 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 422 B

After

Width:  |  Height:  |  Size: 392 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.5 KiB

After

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.4 KiB

After

Width:  |  Height:  |  Size: 1.4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.5 KiB

After

Width:  |  Height:  |  Size: 1.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 422 B

After

Width:  |  Height:  |  Size: 418 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.5 KiB

After

Width:  |  Height:  |  Size: 1.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.8 KiB

After

Width:  |  Height:  |  Size: 1.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 837 B

After

Width:  |  Height:  |  Size: 633 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 202 B

After

Width:  |  Height:  |  Size: 194 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.1 KiB

After

Width:  |  Height:  |  Size: 2.0 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 391 KiB

After

Width:  |  Height:  |  Size: 1.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.8 KiB

After

Width:  |  Height:  |  Size: 1.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.8 KiB

After

Width:  |  Height:  |  Size: 1.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 524 B

After

Width:  |  Height:  |  Size: 438 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 524 B

After

Width:  |  Height:  |  Size: 438 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 418 B

After

Width:  |  Height:  |  Size: 398 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 156 B

After

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.6 KiB

After

Width:  |  Height:  |  Size: 1.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 18 KiB

After

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.4 KiB

After

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.4 KiB

After

Width:  |  Height:  |  Size: 2.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.1 KiB

After

Width:  |  Height:  |  Size: 1.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.4 KiB

After

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.0 KiB

After

Width:  |  Height:  |  Size: 480 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.4 KiB

After

Width:  |  Height:  |  Size: 2.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.6 KiB

After

Width:  |  Height:  |  Size: 1.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 661 B

After

Width:  |  Height:  |  Size: 524 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.5 KiB

After

Width:  |  Height:  |  Size: 1.4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.0 KiB

After

Width:  |  Height:  |  Size: 1.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.4 KiB

After

Width:  |  Height:  |  Size: 1.4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 862 B

After

Width:  |  Height:  |  Size: 772 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.7 KiB

After

Width:  |  Height:  |  Size: 1.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.7 KiB

After

Width:  |  Height:  |  Size: 421 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.7 KiB

After

Width:  |  Height:  |  Size: 1.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.4 KiB

After

Width:  |  Height:  |  Size: 936 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 757 B

After

Width:  |  Height:  |  Size: 744 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.6 KiB

After

Width:  |  Height:  |  Size: 1.4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 408 B

After

Width:  |  Height:  |  Size: 387 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.5 KiB

After

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 251 B

After

Width:  |  Height:  |  Size: 199 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 718 B

After

Width:  |  Height:  |  Size: 344 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 718 B

After

Width:  |  Height:  |  Size: 344 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.9 KiB

After

Width:  |  Height:  |  Size: 1.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.5 KiB

After

Width:  |  Height:  |  Size: 934 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.5 KiB

After

Width:  |  Height:  |  Size: 754 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.3 KiB

After

Width:  |  Height:  |  Size: 411 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.9 KiB

After

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 812 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 325 B

After

Width:  |  Height:  |  Size: 324 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.6 KiB

After

Width:  |  Height:  |  Size: 2.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 602 B

After

Width:  |  Height:  |  Size: 593 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 602 B

After

Width:  |  Height:  |  Size: 593 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 432 B

After

Width:  |  Height:  |  Size: 406 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.5 KiB

After

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.0 KiB

@ -196,6 +196,7 @@ var wappalyzer = (function() {
apps: {},
cats: null,
ping: { hostnames: {} },
adCache: [],
detected: {},
config: {
@ -508,7 +509,7 @@ var wappalyzer = (function() {
}
}
if ( Object.keys(w.ping.hostnames).length >= 20 ) {
if ( Object.keys(w.ping.hostnames).length >= 20 || w.adCache.length >= 40 ) {
driver('ping');
}