Merge pull request #4 from AliasIO/master

Sync no.4
main
Daniel Zdziebko 8 years ago committed by GitHub
commit 37def36e11

@ -1,14 +1,9 @@
root = true
[*]
indent_style = tab
charset = utf-8
end_of_line = lf
indent_size = 2
indent_style = space
insert_final_newline = true
trim_trailing_whitespace = true
[*.{js,py}]
charset = utf-8
[*.py]
indent_style = space
indent_size = 4

1
.gitignore vendored

@ -2,6 +2,7 @@
/src/icons/converted/*
/node_modules
/npm-debug.log
/npm-debug.log
!.gitkeep

@ -4,11 +4,12 @@ MAINTAINER Elbert Alias <elbert@alias.io>
ENV WAPPALYZER_DIR=/opt/wappalyzer
RUN apk add --no-cache \
RUN apk update && apk add --no-cache \
bash \
curl \
fontconfig \
nodejs \
nodejs-npm \
optipng \
zip
@ -23,7 +24,8 @@ RUN apk del \
RUN npm i -g \
jsonlint-cli \
manifoldjs \
svg2png-many
svg2png-many \
yarn
RUN mkdir -p $WAPPALYZER_DIR

@ -0,0 +1,5 @@
#!/bin/bash
cd "$(dirname $0)/.."
yarn run dev

@ -4,11 +4,11 @@ cd "$(dirname $0)/../src"
echo "Creating links..."
ln -nsf ../../apps.json drivers/npm
ln -nsf ../../wappalyzer.js drivers/npm
ln -nf apps.json drivers/npm
ln -nf wappalyzer.js drivers/npm
ln -nsf ../../apps.json drivers/webextension
ln -nsf ../../../wappalyzer.js drivers/webextension/js
ln -nsf ../../../icons/ drivers/webextension/images/icons
ln -nf apps.json drivers/webextension
ln -nf wappalyzer.js drivers/webextension/js
ln -nsf ../../../icons/ drivers/webextension/images/icons
echo "Done."

15
run

@ -8,12 +8,15 @@ if [[ -z "$(which docker)" ]]; then
exit 1
fi
docker="docker run --rm -v "$(pwd):/opt/wappalyzer" -it wappalyzer/dev"
cmd="docker run --rm -v "$(pwd):/opt/wappalyzer" -it wappalyzer/dev"
if [[ ! -d "node_modules" ]]; then
$docker ./bin/run links
$cmd yarn install
$docker npm i
fi
pushd src/drivers/webextension
$cmd yarn install
popd
$docker ./bin/run $@
$cmd ./bin/run links
$cmd ./bin/run $@

@ -255,11 +255,13 @@
"cats": [
"36"
],
"env": "^ados(?:Results)?$",
"headers": {
"X-Advertising-By": "adnegah.net"
},
"html": "<iframe [^>]*src=\"[^\"]+adnegah\\.net",
"icon": "adnegah.png",
"script": "[^a-z]adnegah.*\\.js",
"website": "http://Adnegah.net"
"script": "[^a-z]adnegah.*\\.js$",
"website": "https://Adnegah.net"
},
"Adobe ColdFusion": {
"cats": [
@ -654,6 +656,17 @@
"icon": "Arc Forum.png",
"website": "http://arclanguage.org"
},
"ArcGIS API for JavaScript":{
"cats": [
"35"
],
"script": [
"js.arcgis.com",
"basemaps.arcgis.com"
],
"icon": "arcgis_icon.png",
"website": "https://developers.arcgis.com/javascript/"
},
"Artifactory": {
"cats": [
"47"
@ -1371,6 +1384,21 @@
},
"website": "http://www.chamilo.org"
},
"Chart.js": {
"cats": [
"25"
],
"env": "^Chart$\\;confidence:50",
"icon": "Chart.js.svg",
"script": [
"Chart(?:\\.bundle)?(?:\\.min)?\\.js\\;confidence:50",
"chartjs\\.org/dist/([\\d.]+(?:-[^/]+)?|master|latest)/Chart.*\\.js\\;version:\\1",
"cdnjs\\.cloudflare\\.com/ajax/libs/Chart\\.js/([\\d.]+(?:-[^/]+)?)/Chart.*\\.js\\;version:\\1",
"cdn\\.jsdelivr\\.net/npm/chart\\.js@([\\d.]+(?:-[^/]+)?|latest)/dist/Chart.*\\.js\\;version:\\1",
"cdn\\.jsdelivr\\.net/gh/chartjs/Chart\\.js@([\\d.]+(?:-[^/]+)?|latest)/dist/Chart.*\\.js\\;version:\\1"
],
"website": "http://www.chartjs.org"
},
"Chartbeat": {
"cats": [
"10"
@ -1633,6 +1661,14 @@
},
"website": "http://www.gocontentbox.org"
},
"Contentful": {
"cats": [
"1"
],
"html": "<[^>]+(?:https?:)?//(?:assets|downloads|images|videos)\\.contentful\\.com",
"icon": "Contentful.svg",
"website": "http://www.contentful.com"
},
"ConversionLab": {
"cats": [
"10"
@ -1710,7 +1746,7 @@
"Set-Cookie": "CraftSessionId=",
"X-Powered-By": "Craft CMS"
},
"icon": "Craft CMS.png",
"icon": "Craft CMS.svg",
"implies": "Yii",
"website": "https://craftcms.com"
},
@ -2709,6 +2745,14 @@
"icon": "FreeBSD.png",
"website": "http://freebsd.org"
},
"Freespee": {
"cats": [
"10"
],
"script": "analytics\\.freespee\\.com/js/external/fs\\.(?:min\\.)?js",
"icon": "Freespee.svg",
"website": "https://www.freespee.com"
},
"FreeTextBox": {
"cats": [
"24"
@ -3646,6 +3690,20 @@
"script": "^immutable\\.(?:min\\.)?js$",
"website": "http://facebook.github.io/immutable-js/"
},
"imperia CMS": {
"cats": [
"1"
],
"meta": {
"X-Imperia-Live-Info": "",
"GENERATOR": "^IMPERIA ([0-9.]{2,})+$\\;version:\\1"
},
"html": "<imp:live-info sysid=\"[0-9a-f-]+\"(?: node_id=\"[0-9/]*\")? *\/>",
"icon": "imperiaCMS.svg",
"implies": "Perl",
"url": "imperia/md/",
"website": "https://www.pirobase-imperia.com/de/produkte/produktuebersicht/imperia-cms"
},
"ImpressCMS": {
"cats": [
"1"
@ -4136,6 +4194,17 @@
"icon": "KeyCDN.png",
"website": "http://www.keycdn.com"
},
"Kemal": {
"cats": [
"18",
"22"
],
"headers": {
"X-Powered-By": "Kemal"
},
"icon": "kemalcr.png",
"website": "http://kemalcr.com"
},
"Kibana": {
"cats": [
"29",
@ -6122,6 +6191,21 @@
"env": "Phaser",
"icon": "Phaser.png",
"website": "http://phaser.io"
},
"Phenomic": {
"cats": [
"1",
"11"
],
"html":[
"<[^>]+id=\"phenomic(?:root)?\""
],
"icon": "Phenomic.svg",
"implies": [
"React"
],
"script": "/phenomic.browser.[a-f0-9]+.js",
"website": "https://phenomic.io/"
},
"Phusion Passenger": {
"cats": [
@ -6165,6 +6249,15 @@
"script": "//assets\\.pinterest\\.com/js/pinit\\.js",
"website": "http://pinterest.com"
},
"pirobase CMS": {
"cats": [
"1"
],
"html": "<[^<]+=\"[^\"]*site/[a-z0-9/._-]*/resourceCached/[a-z0-9/._-]*\"[^>]*>|[^<]+cbi:///cms/[^>]+",
"icon": "pirobaseCMS.svg",
"implies": "Java",
"website": "https://www.pirobase-imperia.com/de/produkte/produktuebersicht/pirobase-cms"
},
"Piwik": {
"cats": [
"10"
@ -6401,7 +6494,16 @@
"meta": {
"generator": "Proximis Omnichannel"
},
"website": "http://www.proximis.com"
"website": "https://www.proximis.com"
},
"Proximis Web to Store": {
"cats": [
"5",
"6"
],
"icon": "Proximis Omnichannel.png",
"script": "widget-commerce(?:\\.min)?\\.js",
"website": "https://www.proximis.com"
},
"PubMatic": {
"cats": [
@ -6417,7 +6519,7 @@
],
"headers": {
"Set-Cookie": "PUBLICCMS_USER",
"X-Powered-PublicCMS": ""
"X-Powered-PublicCMS": "(.*)\\;version:\\1"
},
"icon": "Public CMS.png",
"implies": "Java",
@ -7066,6 +7168,17 @@
},
"website": "http://sarka-spip.net"
},
"Sazito": {
"cats": [
"6"
],
"env": "^Sazito$",
"icon": "Sazito.svg",
"meta": {
"generator": "^Sazito"
},
"website": "http://sazito.com"
},
"Scala": {
"cats": [
"27"
@ -7548,6 +7661,18 @@
"implies": "Lucene",
"website": "http://lucene.apache.org/solr/"
},
"Solusquare OmniCommerce Cloud": {
"cats": [
"6"
],
"headers": {"Set-Cookie": "_solusquare=" },
"meta": {
"generator": "^Solusquare$"
},
"icon": "Solusquare.png",
"implies": "Adobe ColdFusion",
"website": "https://www.solusquare.com"
},
"Solve Media": {
"cats": [
"16",
@ -8144,6 +8269,16 @@
"icon": "TornadoServer.png",
"website": "http://tornadoweb.org"
},
"TotalCode": {
"cats": [
"6"
],
"headers": {
"X-Powered-By": "^TotalCode$"
},
"icon": "TotalCode.png",
"website": "http://www.totalcode.com"
},
"Trac": {
"cats": [
"13"
@ -8307,13 +8442,24 @@
"script": "use\\.typekit\\.com",
"website": "http://typekit.com"
},
"uCoz": {
"cats": [
"1"
],
"headers": {
"Set-Cookie": "uCoz="
},
"icon": "uCoz.svg",
"website": "https://ucoz.ru"
},
"UIKit": {
"cats": [
"18"
],
"icon": "UIKit.png",
"html": "<[^>]+class=\"[^\"]*(?:uk-container|uk-section)",
"script": "uikit.*\\.js",
"website": "http://getuikit.com"
"website": "https://getuikit.com"
},
"UNIX": {
"cats": [
@ -8373,6 +8519,17 @@
"url": "/umbraco/login\\.aspx(?:$|\\?)",
"website": "http://umbraco.com"
},
"UMI.CMS": {
"cats": [
1
],
"headers": {
"X-Generated-By": "UMI.CMS"
},
"icon": "UMI.CMS.png",
"implies": "PHP",
"website": "https://www.umi-cms.ru"
},
"Unbounce": {
"cats": [
"20",
@ -8400,6 +8557,15 @@
"icon": "Usabilla.svg",
"website": "http://usabilla.com"
},
"UserEngage": {
"cats": [
"10"
],
"env": "^UserEngage$",
"icon": "UserEngage.png",
"html": "<div[^>]+/id=\"ue_widget\"",
"website": "https://userengage.com"
},
"UserLike": {
"cats": [
"52"
@ -9711,7 +9877,7 @@
"cats": [
"6"
],
"env": "^JetshopData$",
"env": "^JetshopData$",
"html": "<(?:div|aside) id=\"jetshop-branding\">",
"icon": "Jetshop.png",
"website": "http://jetshop.se"
@ -9798,6 +9964,15 @@
"icon": "lighttpd.png",
"website": "http://www.lighttpd.net"
},
"LiveHelp": {
"cats": [
"52",
"53"
],
"script": "^https?://server\\.livehelp\\.it/widgetjs/[0-9]{5}/[0-9]{1,3}\\.js",
"icon": "LiveHelp.png",
"website": "http://www.livehelp.it"
},
"math.js": {
"cats": [
"12"
@ -9952,9 +10127,15 @@
"cats": [
"6"
],
"headers": {
"Set-Cookie": "Nop\\.customer="
},
"html": "(?:<!--Powered by nopCommerce|Powered by: <a[^>]+nopcommerce)",
"icon": "nopCommerce.png",
"implies": "Microsoft ASP.NET",
"meta": {
"generator": "^nopCommerce$"
},
"website": "http://www.nopcommerce.com"
},
"openEngine": {
@ -10004,6 +10185,16 @@
],
"website": "http://osticket.com"
},
"otrs": {
"cats": [
"13"
],
"html": "<!--\\s+OTRS: Copyright \\d+-\\d+, OTRS AG",
"script": "^/otrs-web/js/",
"icon": "otrs.png",
"implies": "perl",
"website": "https://www.otrs.com"
},
"ownCloud": {
"cats": [
"19"

@ -1,2 +1,3 @@
wappalyzer.js
apps.json
/apps.json
/wappalyzer.js
/node_modules

@ -1,24 +1,14 @@
FROM ubuntu:latest
FROM alpine
MAINTAINER Elbert Alias <elbert@alias.io>
ENV DEBIAN_FRONTEND noninteractive
ENV WAPPALYZER_ROOT /opt/wappalyzer
ENV WAPPALYZER_ROOT /usr/local/wappalyzer
RUN sed -i 's/archive\.ubuntu\.com/au.archive.ubuntu.com/g' /etc/apt/sources.list
RUN \
apt-get update && apt-get install -y \
libfreetype6 \
libfontconfig \
RUN apk update && apk add --no-cache \
nodejs \
npm \
&& apt-get clean && rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/*
RUN ln -s $(which nodejs) /usr/bin/node
nodejs-npm
RUN mkdir "$WAPPALYZER_ROOT"
RUN mkdir -p "$WAPPALYZER_ROOT"
WORKDIR "$WAPPALYZER_ROOT"

@ -21,7 +21,7 @@ $ npm i wappalyzer
## Run from the command line
```shell
$ node index.js https://wappalyzer.com --quiet
$ node index.js https://wappalyzer.com
```
@ -30,28 +30,11 @@ $ node index.js https://wappalyzer.com --quiet
```javascript
const wappalyzer = require('wappalyzer');
wappalyzer.run(['https://wappalyzer.com', '--quiet'], function(stdout, stderr) {
if ( stdout ) {
process.stdout.write(stdout);
}
if ( stderr ) {
process.stderr.write(stderr);
}
});
wappalyzer.analyze('https://wappalyzer.com')
.then(json => {
console.log(JSON.stringify(json, null, 2));
})
.catch(error => {
console.error(error);
});
```
## Arguments
**-v, --verbose**
Display debug output.
**-q, --quiet**
Suppress errors.
**--resource-timeout=ms**
Abort the connection after 'ms' milliseconds.

@ -1,228 +1,79 @@
/**
* PhantomJS driver
*/
/** global: phantom */
/** global: wappalyzer */
(function() {
var
url,
originalUrl,
scriptDir,
scriptPath = require('fs').absolute(require('system').args[0]),
resourceTimeout = 9000,
args = [], // TODO: Not used, maybe should be `arg`
debug = false, // Output debug messages
quiet = false; // Don't output errors
try {
// Working directory
scriptDir = scriptPath.split('/'); scriptDir.pop(); scriptDir = scriptDir.join('/');
require('fs').changeWorkingDirectory(scriptDir);
require('system').args.forEach(function(arg) {
var
value,
arr = /^(--[^=]+)=(.+)$/.exec(arg);
if ( arr && arr.length === 3 ) {
arg = arr[1];
value = arr[2];
}
switch ( arg ) {
case '-v':
case '--verbose':
debug = true;
break;
case '-q':
case '--quiet':
quiet = true;
break;
case '--resource-timeout':
if ( value ) {
resourceTimeout = value;
}
break;
default:
url = originalUrl = arg;
}
});
if ( !url ) {
throw new Error('Usage: phantomjs ' + require('system').args[0] + ' <url>');
}
if ( !phantom.injectJs('wappalyzer.js') ) {
throw new Error('Unable to open file js/wappalyzer.js');
}
wappalyzer.driver = {
timeout: 1000,
/**
* Log messages to console
*/
log: function(args) {
if ( args.type === 'error' ) {
if ( !quiet ) {
require('system').stderr.write(args.message + "\n");
}
} else if ( debug || args.type !== 'debug' ) {
require('system').stdout.write(args.message + "\n");
}
},
/**
* Display apps
*/
displayApps: function() {
var
app, cats,
apps = [];
wappalyzer.log('driver.displayApps');
for ( app in wappalyzer.detected[url] ) {
cats = [];
wappalyzer.apps[app].cats.forEach(function(cat) {
cats.push(wappalyzer.categories[cat].name);
});
apps.push({
name: app,
confidence: wappalyzer.detected[url][app].confidenceTotal.toString(),
version: wappalyzer.detected[url][app].version,
icon: wappalyzer.apps[app].icon || 'default.svg',
website: wappalyzer.apps[app].website,
categories: cats
});
}
wappalyzer.driver.sendResponse(apps);
},
/**
* Send response
*/
sendResponse: function(apps) {
apps = apps || [];
require('system').stdout.write(JSON.stringify({ url: url, originalUrl: originalUrl, applications: apps }) + "\n");
},
/**
* Initialize
*/
init: function() {
var
page, hostname,
headers = {},
a = document.createElement('a'),
json = JSON.parse(require('fs').read('apps.json'));
wappalyzer.log('driver.init');
a.href = url.replace(/#.*$/, '');
hostname = a.hostname;
wappalyzer.apps = json.apps;
wappalyzer.categories = json.categories;
page = require('webpage').create();
page.settings.loadImages = false;
page.settings.userAgent = 'Mozilla/5.0 (compatible; Wappalyzer; +https://github.com/AliasIO/Wappalyzer)';
page.settings.resourceTimeout = resourceTimeout;
page.onError = function(message) {
wappalyzer.log(message, 'error');
};
page.onResourceTimeout = function() {
wappalyzer.log('Resource timeout', 'error');
wappalyzer.driver.sendResponse();
phantom.exit(1);
};
page.onResourceReceived = function(response) {
if ( response.url.replace(/\/$/, '') === url.replace(/\/$/, '') ) {
if ( response.redirectURL ) {
url = response.redirectURL;
return;
}
if ( response.stage === 'end' && response.status === 200 && response.contentType.indexOf('text/html') !== -1 ) {
response.headers.forEach(function(header) {
headers[header.name.toLowerCase()] = header.value;
});
}
}
};
page.onResourceError = function(resourceError) {
wappalyzer.log(resourceError.errorString, 'error');
};
'use strict';
page.open(url, function(status) {
var html, environmentVars = '';
const wappalyzer = require('./wappalyzer');
const request = require('request');
const fs = require('fs');
const Browser = require('zombie');
if ( status === 'success' ) {
html = page.content;
const json = JSON.parse(fs.readFileSync(__dirname + '/apps.json'));
if ( html.length > 50000 ) {
html = html.substring(0, 25000) + html.substring(html.length - 25000, html.length);
}
wappalyzer.apps = json.apps;
wappalyzer.categories = json.categories;
// Collect environment variables
environmentVars = page.evaluate(function() {
var i, environmentVars = '';
const driver = {
quiet: true,
for ( i in window ) {
environmentVars += i + ' ';
}
analyze: url => {
return new Promise((resolve, reject) => {
wappalyzer.driver.log = (message, source, type) => {
if ( type === 'error' ) {
return reject(message);
}
return environmentVars;
});
if ( !driver.quiet ) {
console.log('[wappalyzer ' + type + ']', '[' + source + ']', message);
}
};
wappalyzer.log({ message: 'environmentVars: ' + environmentVars });
wappalyzer.driver.displayApps = detected => {
var apps = [];
environmentVars = environmentVars.split(' ').slice(0, 500);
Object.keys(detected).forEach(appName => {
const app = detected[appName];
wappalyzer.analyze(hostname, url, {
html: html,
headers: headers,
env: environmentVars
});
var categories = [];
phantom.exit(0);
} else {
wappalyzer.log('Failed to fetch page', 'error');
app.props.cats.forEach(id => {
var category = {};
wappalyzer.driver.sendResponse();
category[id] = wappalyzer.categories[id].name;
phantom.exit(1);
}
});
}
};
categories.push(category)
});
wappalyzer.init();
} catch ( e ) {
wappalyzer.log(e, 'error');
apps.push({
name: app.name,
confidence: app.confidenceTotal.toString(),
version: app.version,
icon: app.props.icon || 'default.svg',
website: app.props.website,
categories
});
});
wappalyzer.driver.sendResponse();
resolve(apps);
};
phantom.exit(1);
}
})();
const browser = new Browser();
browser.visit(url, error => {
wappalyzer.driver.document = browser.document;
const headers = browser.resources['0'].response.headers;
const vars = Object.getOwnPropertyNames(browser.window);
const html = browser.html();
const hostname = wappalyzer.parseUrl(url).hostname;
wappalyzer.analyze(hostname, url, {
headers,
html,
env: vars
});
});
});
}
}
module.exports = driver;

@ -1,32 +1,23 @@
'use strict';
const
path = require('path'),
spawn = require('child_process').spawn,
phantomjs = require('phantomjs-prebuilt');
const wappalyzer = require('./driver');
exports.run = function(args, callback) {
args.unshift.apply(args, [path.join(__dirname, 'driver.js'), '--web-security=false', '--load-images=false', '--ignore-ssl-errors=yes', '--ssl-protocol=any']);
const args = process.argv.slice(2);
var driver = phantomjs.exec.apply(this, args);
const url = args[0] || '';
driver.stdout.on('data', (data) => {
callback(`${data}`, null);
});
if ( !url ) {
process.stderr.write('No URL specified\n');
driver.stderr.on('data', (data) => {
callback(null, `${data}`);
});
process.exit(1);
}
if ( !module.parent ) {
exports.run(process.argv.slice(2), function(stdout, stderr) {
if ( stdout ) {
process.stdout.write(stdout);
}
wappalyzer.analyze(url)
.then(json => {
process.stdout.write(JSON.stringify(json) + '\n')
if ( stderr ) {
process.stderr.write(stderr);
}
});
}
process.exit();
})
.catch(error => {
throw error
});

@ -1,21 +1,23 @@
{
"name": "Wappalyzer",
"name": "wappalyzer",
"description": "Uncovers the technologies used on websites",
"homepage": "https://github.com/AliasIO/Wappalyzer",
"version": "4.1.4",
"version": "5.0.5",
"author": "Elbert Alias",
"license": "GPL-3.0",
"repository": {
"type": "git",
"url": "https://github.com/AliasIO/Wappalyzer"
},
"main": "index.js",
"files": [
"apps.json",
"driver.js",
"wappalyzer.js"
],
"main": "driver.js",
"files": [
"apps.json",
"index.js",
"driver.js",
"wappalyzer.js"
],
"dependencies": {
"phantomjs-prebuilt": "*"
"request": "^2.81.0",
"zombie": "^5.0.7"
}
}

@ -1,4 +1,7 @@
/apps.json
/images/icons/converted/*
/images/icons/*
/images/icons/converted/*
/js/wappalyzer.js
/node_modules
!.gitkeep

@ -1,15 +1,15 @@
{
{
"github": { "message": "Forker Wappalyzer sur GitHub!" },
"noAppsDetected": { "message": "Pas d'applications détectées." },
"nothingToDo": { "message": "Rien à faire ici." },
"optionTracking": { "message": "Envoyer anonymement des rapports sur les applications détectées à wappalyzer.com pour la recherche" },
"optionUpgradeMessage": { "message": "M'afficher les mises à jour" },
"optionDynamicIcon": { "message": "Use application icon instead of Wappalyzer logo" },
"optionDynamicIcon": { "message": "Utiliser l'icône de l'application au lieu du logo Wappalyzer" },
"options": { "message": "Options" },
"optionsSave": { "message": "Sauver les options" },
"optionsSaved": { "message": "Sauvé" },
"optionsSave": { "message": "Sauvegarder les options" },
"optionsSaved": { "message": "Sauvegardé" },
"twitter": { "message": "Suivre Wappalyzer sur Twitter" },
"website": { "message": "Aller à wappalyzer.com" },
"website": { "message": "Aller sur wappalyzer.com" },
"categoryName1": { "message": "CMS" },
"categoryName2": { "message": "Forum" },
"categoryName3": { "message": "Gestionnaire de base de données" },
@ -36,7 +36,7 @@
"categoryName24": { "message": "Editeur WYSIWYG" },
"categoryName25": { "message": "Graphismes JavaScript" },
"categoryName26": { "message": "Framework pour mobiles" },
"categoryName27": { "message": "Language de programmation" },
"categoryName27": { "message": "Langage de programmation" },
"categoryName28": { "message": "Système d'exploitation" },
"categoryName29": { "message": "Moteur de recherche" },
"categoryName30": { "message": "Web Mail" },
@ -45,7 +45,7 @@
"categoryName33": { "message": "Extension de serveur web" },
"categoryName34": { "message": "Base de données" },
"categoryName35": { "message": "Carte" },
"categoryName36": { "message": "Réseau publicitaire" },
"categoryName36": { "message": "Régie publicitaire" },
"categoryName37": { "message": "Périphérique réseau" },
"categoryName38": { "message": "Serveur multimédia" },
"categoryName39": { "message": "Webcam" },

@ -0,0 +1,66 @@
{
"github": { "message": "Salin Wappalyzer di GitHub!" },
"twitter": { "message": "Ikuti Wappalyzer di Twitter" },
"website": { "message": "Kunjungi wappalyzer.com" },
"options": { "message": "Pilihan" },
"optionsSave": { "message": "Simpan pilihan" },
"optionsSaved": { "message": "Tersimpan" },
"optionUpgradeMessage": { "message": "Beritahu Tentang Peningkatan Versi" },
"optionDynamicIcon": { "message": "Gunakan ikon aplikasi dan bukan logo Wappalyzer" },
"optionTracking": { "message": "Secara anonim kirimkan laporan tentang aplikasi yang terdeteksi ke wappalyzer.com untuk penelitian" },
"nothingToDo": { "message": "Tak ada yang dilakukan disini." },
"noAppsDetected": { "message": "Tidak ada aplikasi yang terdeteksi." },
"categoryName1": { "message": "Sistem Pengelola Konten" },
"categoryName2": { "message": "Papan Pesan" },
"categoryName3": { "message": "Pengelola Basis Data" },
"categoryName4": { "message": "Alat Dokumentasi" },
"categoryName5": { "message": "Widget" },
"categoryName6": { "message": "Toko Online" },
"categoryName7": { "message": "Galeri Foto" },
"categoryName8": { "message": "Wiki" },
"categoryName9": { "message": "Panel Hosting" },
"categoryName10": { "message": "Analistik" },
"categoryName11": { "message": "Blog" },
"categoryName12": { "message": "Bingkai Kerja JavaScript" },
"categoryName13": { "message": "Pelacak Masalah" },
"categoryName14": { "message": "Pemutar Video" },
"categoryName15": { "message": "Sistem Komentar" },
"categoryName16": { "message": "Captcha" },
"categoryName17": { "message": "Font Script" },
"categoryName18": { "message": "Bingkai Kerja Web" },
"categoryName19": { "message": "Serba Serbi" },
"categoryName20": { "message": "Editor" },
"categoryName21": { "message": "LMS" },
"categoryName22": { "message": "Server Website" },
"categoryName23": { "message": "Alat Cache" },
"categoryName24": { "message": "Rich Text Editor" },
"categoryName25": { "message": "JavaScript Graphics" },
"categoryName26": { "message": "Bingkai Kerja Mobile" },
"categoryName27": { "message": "Bahasa Pemrograman" },
"categoryName28": { "message": "Sistem Operasi" },
"categoryName29": { "message": "Mesin Pencari" },
"categoryName30": { "message": "Web Mail" },
"categoryName31": { "message": "CDN" },
"categoryName32": { "message": "Otomasi Pemasaran" },
"categoryName33": { "message": "Ekstensi Web Server" },
"categoryName34": { "message": "Basis Data" },
"categoryName35": { "message": "Peta" },
"categoryName36": { "message": "Jaringan Periklanan" },
"categoryName37": { "message": "Layanan Jaringan" },
"categoryName38": { "message": "Server Media" },
"categoryName39": { "message": "Webcam" },
"categoryName40": { "message": "Pencetak" },
"categoryName41": { "message": "Pemroses Pembayaran" },
"categoryName42": { "message": "Pengelola Tag" },
"categoryName43": { "message": "Paywall" },
"categoryName44": { "message": "Sistem Pembuatan/CI" },
"categoryName45": { "message": "Sistem SCADA" },
"categoryName46": { "message": "Akses Remote" },
"categoryName47": { "message": "Alat Pengembangan" },
"categoryName48": { "message": "Penyimpanan Jaringan" },
"categoryName49": { "message": "Umpan Pembaca" },
"categoryName50": { "message": "Sistem Manajemen Dokumen" },
"categoryName51": { "message": "Pembuat Laman Landas" },
"categoryName52": { "message": "Chat Langsung" },
"categoryName53": { "message": "CRM" }
}

@ -0,0 +1,66 @@
{
"github": { "message": "Форкнути на GitHub!" },
"twitter": { "message": "Читайте нас у Twitter" },
"website": { "message": "До wappalyzer.com" },
"options": { "message": "Налаштування" },
"optionsSave": { "message": "Зберегти налаштування" },
"optionsSaved": { "message": "Збережено" },
"optionUpgradeMessage": { "message": "Сповіщати про оновлення" },
"optionDynamicIcon": { "message": "Використовувати значок застосунку замість логотипу Wappalyzer" },
"optionTracking": { "message": "Анонімно надсилати статистику розпізнавань на сервер для досліджень" },
"nothingToDo": { "message": "Тут нічого робити." },
"noAppsDetected": { "message": "Нічого не знайдено." },
"categoryName1": { "message": "CMS" },
"categoryName2": { "message": "Форум" },
"categoryName3": { "message": "Менеджер БД" },
"categoryName4": { "message": "Документація" },
"categoryName5": { "message": "Віджет" },
"categoryName6": { "message": "Електронна комерція" },
"categoryName7": { "message": "Фотогалерея" },
"categoryName8": { "message": "Вікі" },
"categoryName9": { "message": "Панель керування хостингом" },
"categoryName10": { "message": "Аналітика" },
"categoryName11": { "message": "Блог" },
"categoryName12": { "message": "JS фреймворк" },
"categoryName13": { "message": "Багтрекер" },
"categoryName14": { "message": "Відеопрогравач" },
"categoryName15": { "message": "Система коментарів" },
"categoryName16": { "message": "Капча" },
"categoryName17": { "message": "Шрифт" },
"categoryName18": { "message": "Веб-фреймворк" },
"categoryName19": { "message": "Інше" },
"categoryName20": { "message": "HTML редактор" },
"categoryName21": { "message": "LMS" },
"categoryName22": { "message": "Веб-сервер" },
"categoryName23": { "message": "Кешування" },
"categoryName24": { "message": "WYSIWYG редактор" },
"categoryName25": { "message": "JS графіка" },
"categoryName26": { "message": "Мобільний фреймворк" },
"categoryName27": { "message": "Мова програмування" },
"categoryName28": { "message": "Операційна система" },
"categoryName29": { "message": "Пошуковий рушій" },
"categoryName30": { "message": "Веб-пошта" },
"categoryName31": { "message": "CDN" },
"categoryName32": { "message": "Керування маркетингом" },
"categoryName33": { "message": "Розширення веб-сервера" },
"categoryName34": { "message": "База даних" },
"categoryName35": { "message": "Мапа" },
"categoryName36": { "message": "Рекламна мережа" },
"categoryName37": { "message": "Мережева служба" },
"categoryName38": { "message": "Медіасервер" },
"categoryName39": { "message": "Веб-камера" },
"categoryName40": { "message": "Принтер" },
"categoryName41": { "message": "Платіжна система" },
"categoryName42": { "message": "Менеджер міток" },
"categoryName43": { "message": "Paywall" },
"categoryName44": { "message": "Системе неперервної інтеграції" },
"categoryName45": { "message": "Система SCADA" },
"categoryName46": { "message": "Віддалене керування" },
"categoryName47": { "message": "Інструмент розробника" },
"categoryName48": { "message": "Мережеве сховище" },
"categoryName49": { "message": "Потоковий агрегатор" },
"categoryName50": { "message": "Керування документами" },
"categoryName51": { "message": "Генератор лендінгів" },
"categoryName52": { "message": "Чат реального часу" },
"categoryName53": { "message": "CRM" }
}

@ -1,14 +0,0 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<script src="js/browser-polyfill.js"></script>
<script src="js/wappalyzer.js"></script>
<script src="js/driver.js"></script>
<script src="js/network.js"></script>
</head>
<body>
</body>
</html>

@ -0,0 +1,14 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<script src="../node_modules/webextension-polyfill/dist/browser-polyfill.js"></script>
<script src="../js/wappalyzer.js"></script>
<script src="../js/driver.js"></script>
<script src="../js/network.js"></script>
</head>
<body>
</body>
</html>

@ -6,19 +6,18 @@
<title data-i18n="options">Wappalyzer options</title>
<link rel="icon" href="images/icon_32.png">
<link rel="icon" href="../images/icon_32.png">
<link rel="stylesheet" href="css/options.css">
<link rel="stylesheet" href="../css/options.css">
<script src="js/browser-polyfill.js"></script>
<script src="js/wappalyzer.js"></script>
<script src="js/options.js"></script>
<script src="js/i18n.js"></script>
<script src="../node_modules/webextension-polyfill/dist/browser-polyfill.js"></script>
<script src="../js/wappalyzer.js"></script>
<script src="../js/options.js"></script>
</head>
<body>
<div class="hero">
<div class="container">
<img src="images/logo-white.svg">
<img src="../images/logo-white.svg">
</div>
</div>
@ -34,9 +33,9 @@
<div id="about">
<p>
<button id="github"><img src="images/github.png" width="16" height="16" alt=""/> <span data-i18n="github" >Fork Wappalyzer on GitHub!</span></button><!--
--><button id="twitter"><img src="images/twitter.png" width="16" height="16" alt=""/> <span data-i18n="twitter">Follow Wappalyzer on Twitter</span></button><!--
--><button id="wappalyzer"><img src="images/icon_16.png" width="16" height="16" alt=""/> <span data-i18n="website">Go to wappalyzer.com</span></button>
<button id="github"><img src="../images/github.png" width="16" height="16" alt=""/> <span data-i18n="github" >Fork Wappalyzer on GitHub!</span></button><!--
--><button id="twitter"><img src="../images/twitter.png" width="16" height="16" alt=""/> <span data-i18n="twitter">Follow Wappalyzer on Twitter</span></button><!--
--><button id="wappalyzer"><img src="../images/icon_16.png" width="16" height="16" alt=""/> <span data-i18n="website">Go to wappalyzer.com</span></button>
</p>
</div>
</div>

@ -0,0 +1,15 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<link rel="stylesheet" href="../css/popup.css">
<script src="../node_modules/webextension-polyfill/dist/browser-polyfill.js"></script>
<script src="../js/jsontodom.js"></script>
<script src="../js/popup.js"></script>
</head>
<body>
</body>
</html>

@ -1,851 +0,0 @@
/* webextension-polyfill - v0.1.0 - Sat Mar 11 2017 11:35:13 */
/* -*- Mode: indent-tabs-mode: nil; js-indent-level: 2 -*- */
/* vim: set sts=2 sw=2 et tw=80: */
/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
"use strict";
if (typeof browser === "undefined") {
// Wrapping the bulk of this polyfill in a one-time-use function is a minor
// optimization for Firefox. Since Spidermonkey does not fully parse the
// contents of a function until the first time it's called, and since it will
// never actually need to be called, this allows the polyfill to be included
// in Firefox nearly for free.
const wrapAPIs = () => {
const apiMetadata = {
"alarms": {
"clear": {
"minArgs": 0,
"maxArgs": 1
},
"clearAll": {
"minArgs": 0,
"maxArgs": 0
},
"get": {
"minArgs": 0,
"maxArgs": 1
},
"getAll": {
"minArgs": 0,
"maxArgs": 0
}
},
"bookmarks": {
"create": {
"minArgs": 1,
"maxArgs": 1
},
"export": {
"minArgs": 0,
"maxArgs": 0
},
"get": {
"minArgs": 1,
"maxArgs": 1
},
"getChildren": {
"minArgs": 1,
"maxArgs": 1
},
"getRecent": {
"minArgs": 1,
"maxArgs": 1
},
"getTree": {
"minArgs": 0,
"maxArgs": 0
},
"getSubTree": {
"minArgs": 1,
"maxArgs": 1
},
"import": {
"minArgs": 0,
"maxArgs": 0
},
"move": {
"minArgs": 2,
"maxArgs": 2
},
"remove": {
"minArgs": 1,
"maxArgs": 1
},
"removeTree": {
"minArgs": 1,
"maxArgs": 1
},
"search": {
"minArgs": 1,
"maxArgs": 1
},
"update": {
"minArgs": 2,
"maxArgs": 2
}
},
"browserAction": {
"getBadgeBackgroundColor": {
"minArgs": 1,
"maxArgs": 1
},
"getBadgeText": {
"minArgs": 1,
"maxArgs": 1
},
"getPopup": {
"minArgs": 1,
"maxArgs": 1
},
"getTitle": {
"minArgs": 1,
"maxArgs": 1
},
"setIcon": {
"minArgs": 1,
"maxArgs": 1
}
},
"commands": {
"getAll": {
"minArgs": 0,
"maxArgs": 0
}
},
"contextMenus": {
"update": {
"minArgs": 2,
"maxArgs": 2
},
"remove": {
"minArgs": 1,
"maxArgs": 1
},
"removeAll": {
"minArgs": 0,
"maxArgs": 0
}
},
"cookies": {
"get": {
"minArgs": 1,
"maxArgs": 1
},
"getAll": {
"minArgs": 1,
"maxArgs": 1
},
"getAllCookieStores": {
"minArgs": 0,
"maxArgs": 0
},
"remove": {
"minArgs": 1,
"maxArgs": 1
},
"set": {
"minArgs": 1,
"maxArgs": 1
}
},
"downloads": {
"download": {
"minArgs": 1,
"maxArgs": 1
},
"cancel": {
"minArgs": 1,
"maxArgs": 1
},
"erase": {
"minArgs": 1,
"maxArgs": 1
},
"getFileIcon": {
"minArgs": 1,
"maxArgs": 2
},
"open": {
"minArgs": 1,
"maxArgs": 1
},
"pause": {
"minArgs": 1,
"maxArgs": 1
},
"removeFile": {
"minArgs": 1,
"maxArgs": 1
},
"resume": {
"minArgs": 1,
"maxArgs": 1
},
"search": {
"minArgs": 1,
"maxArgs": 1
},
"show": {
"minArgs": 1,
"maxArgs": 1
}
},
"extension": {
"isAllowedFileSchemeAccess": {
"minArgs": 0,
"maxArgs": 0
},
"isAllowedIncognitoAccess": {
"minArgs": 0,
"maxArgs": 0
}
},
"history": {
"addUrl": {
"minArgs": 1,
"maxArgs": 1
},
"getVisits": {
"minArgs": 1,
"maxArgs": 1
},
"deleteAll": {
"minArgs": 0,
"maxArgs": 0
},
"deleteRange": {
"minArgs": 1,
"maxArgs": 1
},
"deleteUrl": {
"minArgs": 1,
"maxArgs": 1
},
"search": {
"minArgs": 1,
"maxArgs": 1
}
},
"i18n": {
"detectLanguage": {
"minArgs": 1,
"maxArgs": 1
},
"getAcceptLanguages": {
"minArgs": 0,
"maxArgs": 0
}
},
"idle": {
"queryState": {
"minArgs": 1,
"maxArgs": 1
}
},
"management": {
"get": {
"minArgs": 1,
"maxArgs": 1
},
"getAll": {
"minArgs": 0,
"maxArgs": 0
},
"getSelf": {
"minArgs": 0,
"maxArgs": 0
},
"uninstallSelf": {
"minArgs": 0,
"maxArgs": 1
}
},
"notifications": {
"clear": {
"minArgs": 1,
"maxArgs": 1
},
"create": {
"minArgs": 1,
"maxArgs": 2
},
"getAll": {
"minArgs": 0,
"maxArgs": 0
},
"getPermissionLevel": {
"minArgs": 0,
"maxArgs": 0
},
"update": {
"minArgs": 2,
"maxArgs": 2
}
},
"pageAction": {
"getPopup": {
"minArgs": 1,
"maxArgs": 1
},
"getTitle": {
"minArgs": 1,
"maxArgs": 1
},
"hide": {
"minArgs": 0,
"maxArgs": 0
},
"setIcon": {
"minArgs": 1,
"maxArgs": 1
},
"show": {
"minArgs": 0,
"maxArgs": 0
}
},
"runtime": {
"getBackgroundPage": {
"minArgs": 0,
"maxArgs": 0
},
"getBrowserInfo": {
"minArgs": 0,
"maxArgs": 0
},
"getPlatformInfo": {
"minArgs": 0,
"maxArgs": 0
},
"openOptionsPage": {
"minArgs": 0,
"maxArgs": 0
},
"requestUpdateCheck": {
"minArgs": 0,
"maxArgs": 0
},
"sendMessage": {
"minArgs": 1,
"maxArgs": 3
},
"sendNativeMessage": {
"minArgs": 2,
"maxArgs": 2
},
"setUninstallURL": {
"minArgs": 1,
"maxArgs": 1
}
},
"storage": {
"local": {
"clear": {
"minArgs": 0,
"maxArgs": 0
},
"get": {
"minArgs": 0,
"maxArgs": 1
},
"getBytesInUse": {
"minArgs": 0,
"maxArgs": 1
},
"remove": {
"minArgs": 1,
"maxArgs": 1
},
"set": {
"minArgs": 1,
"maxArgs": 1
}
},
"managed": {
"get": {
"minArgs": 0,
"maxArgs": 1
},
"getBytesInUse": {
"minArgs": 0,
"maxArgs": 1
}
},
"sync": {
"clear": {
"minArgs": 0,
"maxArgs": 0
},
"get": {
"minArgs": 0,
"maxArgs": 1
},
"getBytesInUse": {
"minArgs": 0,
"maxArgs": 1
},
"remove": {
"minArgs": 1,
"maxArgs": 1
},
"set": {
"minArgs": 1,
"maxArgs": 1
}
}
},
"tabs": {
"create": {
"minArgs": 1,
"maxArgs": 1
},
"captureVisibleTab": {
"minArgs": 0,
"maxArgs": 2
},
"detectLanguage": {
"minArgs": 0,
"maxArgs": 1
},
"duplicate": {
"minArgs": 1,
"maxArgs": 1
},
"executeScript": {
"minArgs": 1,
"maxArgs": 2
},
"get": {
"minArgs": 1,
"maxArgs": 1
},
"getCurrent": {
"minArgs": 0,
"maxArgs": 0
},
"getZoom": {
"minArgs": 0,
"maxArgs": 1
},
"getZoomSettings": {
"minArgs": 0,
"maxArgs": 1
},
"highlight": {
"minArgs": 1,
"maxArgs": 1
},
"insertCSS": {
"minArgs": 1,
"maxArgs": 2
},
"move": {
"minArgs": 2,
"maxArgs": 2
},
"reload": {
"minArgs": 0,
"maxArgs": 2
},
"remove": {
"minArgs": 1,
"maxArgs": 1
},
"query": {
"minArgs": 1,
"maxArgs": 1
},
"removeCSS": {
"minArgs": 1,
"maxArgs": 2
},
"sendMessage": {
"minArgs": 2,
"maxArgs": 3
},
"setZoom": {
"minArgs": 1,
"maxArgs": 2
},
"setZoomSettings": {
"minArgs": 1,
"maxArgs": 2
},
"update": {
"minArgs": 1,
"maxArgs": 2
}
},
"webNavigation": {
"getAllFrames": {
"minArgs": 1,
"maxArgs": 1
},
"getFrame": {
"minArgs": 1,
"maxArgs": 1
}
},
"webRequest": {
"handlerBehaviorChanged": {
"minArgs": 0,
"maxArgs": 0
}
},
"windows": {
"create": {
"minArgs": 0,
"maxArgs": 1
},
"get": {
"minArgs": 1,
"maxArgs": 2
},
"getAll": {
"minArgs": 0,
"maxArgs": 1
},
"getCurrent": {
"minArgs": 0,
"maxArgs": 1
},
"getLastFocused": {
"minArgs": 0,
"maxArgs": 1
},
"remove": {
"minArgs": 1,
"maxArgs": 1
},
"update": {
"minArgs": 2,
"maxArgs": 2
}
}
};
/**
* A WeakMap subclass which creates and stores a value for any key which does
* not exist when accessed, but behaves exactly as an ordinary WeakMap
* otherwise.
*
* @param {function} createItem
* A function which will be called in order to create the value for any
* key which does not exist, the first time it is accessed. The
* function receives, as its only argument, the key being created.
*/
class DefaultWeakMap extends WeakMap {
constructor(createItem, items = undefined) {
super(items);
this.createItem = createItem;
}
get(key) {
if (!this.has(key)) {
this.set(key, this.createItem(key));
}
return super.get(key);
}
}
/**
* Returns true if the given object is an object with a `then` method, and can
* therefore be assumed to behave as a Promise.
*
* @param {*} value The value to test.
* @returns {boolean} True if the value is thenable.
*/
const isThenable = value => {
return value && typeof value === "object" && typeof value.then === "function";
};
/**
* Creates and returns a function which, when called, will resolve or reject
* the given promise based on how it is called:
*
* - If, when called, `chrome.runtime.lastError` contains a non-null object,
* the promise is rejected with that value.
* - If the function is called with exactly one argument, the promise is
* resolved to that value.
* - Otherwise, the promise is resolved to an array containing all of the
* function's arguments.
*
* @param {object} promise
* An object containing the resolution and rejection functions of a
* promise.
* @param {function} promise.resolve
* The promise's resolution function.
* @param {function} promise.rejection
* The promise's rejection function.
*
* @returns {function}
* The generated callback function.
*/
const makeCallback = promise => {
return (...callbackArgs) => {
if (chrome.runtime.lastError) {
promise.reject(chrome.runtime.lastError);
} else if (callbackArgs.length === 1) {
promise.resolve(callbackArgs[0]);
} else {
promise.resolve(callbackArgs);
}
};
};
/**
* Creates a wrapper function for a method with the given name and metadata.
*
* @param {string} name
* The name of the method which is being wrapped.
* @param {object} metadata
* Metadata about the method being wrapped.
* @param {integer} metadata.minArgs
* The minimum number of arguments which must be passed to the
* function. If called with fewer than this number of arguments, the
* wrapper will raise an exception.
* @param {integer} metadata.maxArgs
* The maximum number of arguments which may be passed to the
* function. If called with more than this number of arguments, the
* wrapper will raise an exception.
*
* @returns {function(object, ...*)}
* The generated wrapper function.
*/
const wrapAsyncFunction = (name, metadata) => {
const pluralizeArguments = (numArgs) => numArgs == 1 ? "argument" : "arguments";
return function asyncFunctionWrapper(target, ...args) {
if (args.length < metadata.minArgs) {
throw new Error(`Expected at least ${metadata.minArgs} ${pluralizeArguments(metadata.minArgs)} for ${name}(), got ${args.length}`);
}
if (args.length > metadata.maxArgs) {
throw new Error(`Expected at most ${metadata.maxArgs} ${pluralizeArguments(metadata.maxArgs)} for ${name}(), got ${args.length}`);
}
return new Promise((resolve, reject) => {
target[name](...args, makeCallback({resolve, reject}));
});
};
};
/**
* Wraps an existing method of the target object, so that calls to it are
* intercepted by the given wrapper function. The wrapper function receives,
* as its first argument, the original `target` object, followed by each of
* the arguments passed to the orginal method.
*
* @param {object} target
* The original target object that the wrapped method belongs to.
* @param {function} method
* The method being wrapped. This is used as the target of the Proxy
* object which is created to wrap the method.
* @param {function} wrapper
* The wrapper function which is called in place of a direct invocation
* of the wrapped method.
*
* @returns {Proxy<function>}
* A Proxy object for the given method, which invokes the given wrapper
* method in its place.
*/
const wrapMethod = (target, method, wrapper) => {
return new Proxy(method, {
apply(targetMethod, thisObj, args) {
return wrapper.call(thisObj, target, ...args);
},
});
};
let hasOwnProperty = Function.call.bind(Object.prototype.hasOwnProperty);
/**
* Wraps an object in a Proxy which intercepts and wraps certain methods
* based on the given `wrappers` and `metadata` objects.
*
* @param {object} target
* The target object to wrap.
*
* @param {object} [wrappers = {}]
* An object tree containing wrapper functions for special cases. Any
* function present in this object tree is called in place of the
* method in the same location in the `target` object tree. These
* wrapper methods are invoked as described in {@see wrapMethod}.
*
* @param {object} [metadata = {}]
* An object tree containing metadata used to automatically generate
* Promise-based wrapper functions for asynchronous. Any function in
* the `target` object tree which has a corresponding metadata object
* in the same location in the `metadata` tree is replaced with an
* automatically-generated wrapper function, as described in
* {@see wrapAsyncFunction}
*
* @returns {Proxy<object>}
*/
const wrapObject = (target, wrappers = {}, metadata = {}) => {
let cache = Object.create(null);
let handlers = {
has(target, prop) {
return prop in target || prop in cache;
},
get(target, prop, receiver) {
if (prop in cache) {
return cache[prop];
}
if (!(prop in target)) {
return undefined;
}
let value = target[prop];
if (typeof value === "function") {
// This is a method on the underlying object. Check if we need to do
// any wrapping.
if (typeof wrappers[prop] === "function") {
// We have a special-case wrapper for this method.
value = wrapMethod(target, target[prop], wrappers[prop]);
} else if (hasOwnProperty(metadata, prop)) {
// This is an async method that we have metadata for. Create a
// Promise wrapper for it.
let wrapper = wrapAsyncFunction(prop, metadata[prop]);
value = wrapMethod(target, target[prop], wrapper);
} else {
// This is a method that we don't know or care about. Return the
// original method, bound to the underlying object.
value = value.bind(target);
}
} else if (typeof value === "object" && value !== null &&
(hasOwnProperty(wrappers, prop) ||
hasOwnProperty(metadata, prop))) {
// This is an object that we need to do some wrapping for the children
// of. Create a sub-object wrapper for it with the appropriate child
// metadata.
value = wrapObject(value, wrappers[prop], metadata[prop]);
} else {
// We don't need to do any wrapping for this property,
// so just forward all access to the underlying object.
Object.defineProperty(cache, prop, {
configurable: true,
enumerable: true,
get() {
return target[prop];
},
set(value) {
target[prop] = value;
},
});
return value;
}
cache[prop] = value;
return value;
},
set(target, prop, value, receiver) {
if (prop in cache) {
cache[prop] = value;
} else {
target[prop] = value;
}
return true;
},
defineProperty(target, prop, desc) {
return Reflect.defineProperty(cache, prop, desc);
},
deleteProperty(target, prop) {
return Reflect.deleteProperty(cache, prop);
},
};
return new Proxy(target, handlers);
};
/**
* Creates a set of wrapper functions for an event object, which handles
* wrapping of listener functions that those messages are passed.
*
* A single wrapper is created for each listener function, and stored in a
* map. Subsequent calls to `addListener`, `hasListener`, or `removeListener`
* retrieve the original wrapper, so that attempts to remove a
* previously-added listener work as expected.
*
* @param {DefaultWeakMap<function, function>} wrapperMap
* A DefaultWeakMap object which will create the appropriate wrapper
* for a given listener function when one does not exist, and retrieve
* an existing one when it does.
*
* @returns {object}
*/
const wrapEvent = wrapperMap => ({
addListener(target, listener, ...args) {
target.addListener(wrapperMap.get(listener), ...args);
},
hasListener(target, listener) {
return target.hasListener(wrapperMap.get(listener));
},
removeListener(target, listener) {
target.removeListener(wrapperMap.get(listener));
},
});
const onMessageWrappers = new DefaultWeakMap(listener => {
if (typeof listener !== "function") {
return listener;
}
/**
* Wraps a message listener function so that it may send responses based on
* its return value, rather than by returning a sentinel value and calling a
* callback. If the listener function returns a Promise, the response is
* sent when the promise either resolves or rejects.
*
* @param {*} message
* The message sent by the other end of the channel.
* @param {object} sender
* Details about the sender of the message.
* @param {function(*)} sendResponse
* A callback which, when called with an arbitrary argument, sends
* that value as a response.
* @returns {boolean}
* True if the wrapped listener returned a Promise, which will later
* yield a response. False otherwise.
*/
return function onMessage(message, sender, sendResponse) {
let result = listener(message, sender);
if (isThenable(result)) {
result.then(sendResponse, error => {
console.error(error);
sendResponse(error);
});
return true;
} else if (result !== undefined) {
sendResponse(result);
}
};
});
const staticWrappers = {
runtime: {
onMessage: wrapEvent(onMessageWrappers),
},
};
return wrapObject(chrome, staticWrappers, apiMetadata);
};
this.browser = wrapAPIs();
}

@ -1,75 +1,55 @@
/** global: browser */
(function() {
var c = {
init: function() {
var html = document.documentElement.outerHTML;
c.log('Function call: init()');
if ( html.length > 50000 ) {
html = html.substring(0, 25000) + html.substring(html.length - 25000, html.length);
}
browser.runtime.sendMessage({
id: 'analyze',
subject: { html: html },
source: 'content.js'
});
c.getEnvironmentVars();
},
log: function(message) {
browser.runtime.sendMessage({
id: 'log',
message: message,
source: 'content.js'
});
},
getEnvironmentVars: function() {
var container, script;
c.log('Function call: getEnvironmentVars()');
if ( typeof document.body === 'undefined' ) {
return;
}
try {
container = document.createElement('wappalyzerData');
container.setAttribute('id', 'wappalyzerData');
container.setAttribute('style', 'display: none');
script = document.createElement('script');
script.setAttribute('id', 'wappalyzerEnvDetection');
script.setAttribute('src', browser.extension.getURL('js/inject.js'));
container.addEventListener('wappalyzerEvent', (function(event) {
var environmentVars = event.target.childNodes[0].nodeValue;
document.documentElement.removeChild(container);
document.documentElement.removeChild(script);
environmentVars = environmentVars.split(' ').slice(0, 500);
browser.runtime.sendMessage({
id: 'analyze',
subject: { env: environmentVars },
source: 'content.js'
});
}), true);
document.documentElement.appendChild(container);
document.documentElement.appendChild(script);
} catch(e) {
c.log('Error: ' + e);
}
}
}
c.init();
}());
if ( document.body !== undefined ) {
var html = document.documentElement.outerHTML;
if ( html.length > 50000 ) {
html = html.substring(0, 25000) + html.substring(html.length - 25000, html.length);
}
browser.runtime.sendMessage({
id: 'analyze',
subject: { html },
source: 'content.js'
});
try {
var container = document.createElement('wappalyzerData');
container.setAttribute('id', 'wappalyzerData');
container.setAttribute('style', 'display: none');
var script = document.createElement('script');
script.setAttribute('id', 'wappalyzerEnvDetection');
script.setAttribute('src', browser.extension.getURL('js/inject.js'));
container.addEventListener('wappalyzerEvent', (event => {
var env = event.target.childNodes[0].nodeValue;
document.documentElement.removeChild(container);
document.documentElement.removeChild(script);
env = env.split(' ').slice(0, 500);
browser.runtime.sendMessage({
id: 'analyze',
subject: { env },
source: 'content.js'
});
}), true);
document.documentElement.appendChild(container);
document.documentElement.appendChild(script);
} catch(e) {
log('Error: ' + e);
}
}
function log(message) {
browser.runtime.sendMessage({
id: 'log',
message,
source: 'content.js'
});
}

@ -3,328 +3,322 @@
*/
/** global: browser */
/** global: chrome */
/** global: wappalyzer */
/** global: XMLHttpRequest */
(function() {
if ( wappalyzer == null ) {
return;
}
var w = wappalyzer,
firstRun = false,
upgraded = false,
tab,
tabCache = {},
headersCache = {};
w.driver = {
timeout: 1000,
/**
* Log messages to console
*/
log: function(args) {
console.log('[wappalyzer ' + args.type + ']', '[' + args.source + ']', JSON.parse(args.message));
},
/**
* Get a value from localStorage
*/
getOption: function(name, defaultValue, callback) {
var func = function(item) {
callback(item.hasOwnProperty(name) ? item[name] : defaultValue);
};
try {
// Chrome, Firefox
browser.storage.local.get(name).then(func);
} catch ( e ) {
// Edge
browser.storage.local.get(name, func);
}
},
/**
* Set a value in localStorage
*/
setOption: function(name, value) {
var option = {};
option[name] = value;
browser.storage.local.set(option);
},
/**
* Initialize
*/
init: function() {
w.log('Function call: w.driver.init()', 'driver');
// Load apps.json
var xhr = new XMLHttpRequest();
xhr.open('GET', 'apps.json', true);
xhr.overrideMimeType('application/json');
xhr.onload = function() {
var json = JSON.parse(xhr.responseText);
w.categories = json.categories;
w.apps = json.apps;
w.driver.categoryOrder = Object.keys(w.categories).sort(function(a, b) {
return w.categories[a].priority - w.categories[b].priority;
});
};
xhr.send(null);
// Version check
try {
var version = browser.runtime.getManifest().version;
w.driver.getOption('version', null, function(previousVersion) {
if ( previousVersion === null ) {
w.driver.goToURL({
url: w.config.websiteURL + 'installed'
});
} else if ( version !== previousVersion ) {
w.driver.getOption('upgradeMessage', true, function(upgradeMessage) {
if ( upgradeMessage ) {
w.driver.goToURL({
url: w.config.websiteURL + 'upgraded',
background: true
});
}
});
}
w.driver.setOption('version', version);
});
} catch(e) {
// Do nothing
}
( chrome || browser ).runtime.onMessage.addListener(w.driver.onMessage);
var callback = function(tabs) {
tabs.forEach(function(tab) {
if ( tab.url.match(/^https?:\/\//) ) {
browser.tabs.executeScript(tab.id, { file: 'js/content.js' });
}
})
};
try {
browser.tabs.query({}).then(callback);
} catch ( e ) {
browser.tabs.query({}, callback);
}
browser.tabs.onRemoved.addListener(function(tabId) {
tabCache[tabId] = null;
});
// Live intercept headers using webRequest API
browser.webRequest.onCompleted.addListener(function(details) {
var responseHeaders = {};
if ( details.responseHeaders ) {
var uri = details.url.replace(/#.*$/, ''); // Remove hash
details.responseHeaders.forEach(function(header) {
responseHeaders[header.name.toLowerCase()] = header.value || '' + header.binaryValue;
});
if ( headersCache.length > 50 ) {
headersCache = {};
}
if ( /text\/html/.test(responseHeaders['content-type']) ) {
if ( headersCache[uri] === undefined ) {
headersCache[uri] = {};
}
for ( var header in responseHeaders ) {
if ( responseHeaders.hasOwnProperty(header) ) {
headersCache[uri][header] = responseHeaders[header];
}
}
}
}
}, { urls: [ 'http://*/*', 'https://*/*' ], types: [ 'main_frame' ] }, [ 'responseHeaders' ]);
if ( firstRun ) {
w.driver.goToURL({ url: w.config.websiteURL + 'installed', medium: 'install' });
firstRun = false;
}
if ( upgraded ) {
w.driver.goToURL({ url: w.config.websiteURL + 'upgraded', medium: 'upgrade', background: true });
upgraded = false;
}
},
onMessage: function(message, sender, sendResponse) {
var
hostname,
response,
a = document.createElement('a');
if ( typeof message.id != 'undefined' ) {
if ( message.id !== 'log' ) {
w.log('Message received from ' + message.source + ': ' + message.id, 'driver');
}
switch ( message.id ) {
case 'log':
w.log(message.message, message.source);
break;
case 'analyze':
tab = sender.tab;
a.href = tab.url.replace(/#.*$/, '');
hostname = a.hostname;
if ( headersCache[a.href] !== undefined ) {
message.subject.headers = headersCache[a.href];
}
w.analyze(hostname, a.href, message.subject);
break;
case 'ad_log':
w.adCache.push(message.subject);
break;
case 'get_apps':
response = {
tabCache: tabCache[message.tab.id],
apps: w.apps,
categories: w.categories
};
break;
default:
}
sendResponse(response);
}
},
/**
* Open a tab
*/
goToURL: function(args) {
browser.tabs.create({
url: args.url,
active: args.background === undefined || !args.background
});
},
/**
* Display apps
*/
displayApps: function() {
var
url = tab.url.replace(/#.*$/, ''),
count = w.detected[url] ? Object.keys(w.detected[url]).length.toString() : '0';
if ( tabCache[tab.id] == null ) {
tabCache[tab.id] = {
count: 0,
appsDetected: []
};
}
tabCache[tab.id].count = count;
tabCache[tab.id].appsDetected = w.detected[url];
if ( count > 0 ) {
w.driver.getOption('dynamicIcon', true, function(dynamicIcon) {
var appName, found = false;
// Find the main application to display
w.driver.categoryOrder.forEach(function(match) {
for ( appName in w.detected[url] ) {
w.apps[appName].cats.forEach(function(cat) {
var icon = w.apps[appName].icon || 'default.svg';
if ( !dynamicIcon ) {
icon = 'default.svg';
}
if ( cat === match && !found ) {
if ( /\.svg$/i.test(icon) ) {
icon = 'converted/' + icon.replace(/\.svg$/, '.png');
}
browser.pageAction.setIcon({
tabId: tab.id,
path: 'images/icons/' + icon
});
found = true;
}
});
}
});
if ( typeof chrome !== 'undefined' ) {
// Browser polyfill doesn't seem to work here
chrome.pageAction.show(tab.id);
} else {
browser.pageAction.show(tab.id);
}
});
};
},
/**
* Anonymously track detected applications for research purposes
*/
ping: function() {
w.driver.getOption('tracking', true, function(tracking) {
if ( Object.keys(w.ping.hostnames).length && tracking ) {
w.driver.post('http://ping.wappalyzer.com/v2/', w.ping);
w.ping = { hostnames: {} };
w.driver.post('https://ad.wappalyzer.com/log/wp/', w.adCache);
w.adCache = [];
}
});
},
/**
* Make POST request
*/
post: function(url, data) {
var xhr = new XMLHttpRequest();
xhr.open('POST', url, true);
xhr.setRequestHeader('Content-type', 'application/x-www-form-urlencoded');
xhr.onreadystatechange = function() {
if ( xhr.readyState == 4 ) {
w.log({ 'POST request': { url: url, status: xhr.status, data: data } }, 'driver');
}
};
xhr.send('json=' + encodeURIComponent(JSON.stringify(data)));
}
};
w.init();
}());
var tabCache = {};
var headersCache = {};
var categoryOrder = [];
browser.tabs.onRemoved.addListener(tabId => {
tabCache[tabId] = null;
});
/**
* Get a value from localStorage
*/
function getOption(name, defaultValue) {
return new Promise((resolve, reject) => {
const callback = item => {
resolve(item.hasOwnProperty(name) ? item[name] : defaultValue);
};
try {
// Chrome, Firefox
browser.storage.local.get(name)
.then(callback)
.catch(console.error);
} catch ( e ) {
// Edge
browser.storage.local.get(name, callback);
}
});
}
/**
* Set a value in localStorage
*/
function setOption(name, value) {
var option = {};
option[name] = value;
browser.storage.local.set(option);
}
/**
* Open a tab
*/
function openTab(args) {
browser.tabs.create({
url: args.url,
active: args.background === undefined || !args.background
});
}
/**
* Make a POST request
*/
function post(url, body) {
fetch(url, {
method: 'POST',
body: JSON.stringify(body)
})
.then(response => {
wappalyzer.log('POST ' + url + ': ' + response.status, 'driver');
})
.catch(error => {
wappalyzer.log('POST ' + url + ': ' + error, 'driver', 'error');
});
}
fetch('../apps.json')
.then(response => {
return response.json();
})
.then(json => {
wappalyzer.apps = json.apps;
wappalyzer.categories = json.categories;
categoryOrder = Object.keys(wappalyzer.categories).sort((a, b) => wappalyzer.categories[a].priority - wappalyzer.categories[b].priority);
})
.catch(error => {
wappalyzer.log('GET apps.json: ' + error, 'driver', 'error');
});
// Version check
var version = browser.runtime.getManifest().version;
getOption('version')
.then(previousVersion => {
if ( previousVersion === null ) {
openTab({
url: wappalyzer.config.websiteURL + 'installed'
});
} else if ( version !== previousVersion ) {
getOption('upgradeMessage', true)
.then(upgradeMessage => {
if ( upgradeMessage ) {
openTab({
url: wappalyzer.config.websiteURL + 'upgraded',
background: true
});
}
});
}
setOption('version', version);
});
// Run content script
var callback = tabs => {
tabs.forEach(tab => {
if ( tab.url.match(/^https?:\/\//) ) {
browser.tabs.executeScript(tab.id, {
file: 'js/content.js'
});
}
})
};
try {
browser.tabs.query({})
.then(callback)
.catch(console.error);
} catch ( e ) {
browser.tabs.query({}, callback);
}
// Capture response headers
browser.webRequest.onCompleted.addListener(request => {
var responseHeaders = {};
if ( request.responseHeaders ) {
var url = wappalyzer.parseUrl(request.url);
request.responseHeaders.forEach(function(header) {
responseHeaders[header.name.toLowerCase()] = header.value || '' + header.binaryValue;
});
if ( headersCache.length > 50 ) {
headersCache = {};
}
if ( /text\/html/.test(responseHeaders['content-type']) ) {
if ( headersCache[url.canonical] === undefined ) {
headersCache[url.canonical] = {};
}
Object.keys(responseHeaders).forEach(header => {
headersCache[url.canonical][header] = responseHeaders[header];
});
}
}
}, { urls: [ 'http://*/*', 'https://*/*' ], types: [ 'main_frame' ] }, [ 'responseHeaders' ]);
// Listen for messages
( chrome || browser ).runtime.onMessage.addListener((message, sender, sendResponse) => {
if ( typeof message.id != 'undefined' ) {
if ( message.id !== 'log' ) {
wappalyzer.log('Message received from ' + message.source + ': ' + message.id, 'driver');
}
var response;
switch ( message.id ) {
case 'log':
wappalyzer.log(message.message, message.source);
break;
case 'analyze':
var url = wappalyzer.parseUrl(sender.tab.url);
if ( headersCache[url.canonical] !== undefined ) {
message.subject.headers = headersCache[url.canonical];
}
wappalyzer.analyze(url.hostname, url.canonical, message.subject, {
tab: sender.tab
});
break;
case 'ad_log':
wappalyzer.cacheDetectedAds(message.subject);
break;
case 'get_apps':
response = {
tabCache: tabCache[message.tab.id],
apps: wappalyzer.apps,
categories: wappalyzer.categories
};
break;
default:
}
sendResponse(response);
}
});
wappalyzer.driver.document = document;
/**
* Log messages to console
*/
wappalyzer.driver.log = (message, source, type) => {
console.log('[wappalyzer ' + type + ']', '[' + source + ']', message);
};
/**
* Display apps
*/
wappalyzer.driver.displayApps = (detected, context) => {
var tab = context.tab;
tabCache[tab.id] = tabCache[tab.id] || { detected: [] };
tabCache[tab.id].detected = detected;
if ( Object.keys(detected).length ) {
getOption('dynamicIcon', true)
.then(dynamicIcon => {
var appName, found = false;
// Find the main application to display
categoryOrder.forEach(match => {
Object.keys(detected).forEach(appName => {
var app = detected[appName];
app.props.cats.forEach(category => {
if ( category === match && !found ) {
var icon = app.props.icon || 'default.svg';
if ( !dynamicIcon ) {
icon = 'default.svg';
}
if ( /\.svg$/i.test(icon) ) {
icon = 'converted/' + icon.replace(/\.svg$/, '.png');
}
browser.pageAction.setIcon({
tabId: tab.id,
path: '../images/icons/' + icon
});
found = true;
}
});
});
});
if ( typeof chrome !== 'undefined' ) {
// Browser polyfill doesn't seem to work here
chrome.pageAction.show(tab.id);
} else {
browser.pageAction.show(tab.id);
}
});
}
};
/**
* Fetch and cache robots.txt for host
*/
wappalyzer.driver.getRobotsTxt = (host, secure = false) => {
return new Promise((resolve, reject) => {
getOption('robotsTxtCache')
.then(robotsTxtCache => {
robotsTxtCache = robotsTxtCache || {};
if ( host in robotsTxtCache ) {
resolve(robotsTxtCache[host]);
} else {
var url = 'http' + ( secure ? 's' : '' ) + '://' + host + '/robots.txt';
fetch('http' + ( secure ? 's' : '' ) + '://' + host + '/robots.txt')
.then(response => {
if ( !response.ok ) {
if (response.status === 404) {
return '';
} else {
throw 'GET ' + response.url + ' was not ok';
}
}
return response.text();
})
.then(robotsTxt => {
robotsTxtCache[host] = wappalyzer.parseRobotsTxt(robotsTxt);
setOption('robotsTxtCache', robotsTxtCache);
resolve(robotsTxtCache[host]);
var hostname = host.replace(/:[0-9]+$/, '')
})
.catch(reject);
}
});
});
};
/**
* Anonymously track detected applications for research purposes
*/
wappalyzer.driver.ping = (hostnameCache, adCache) => {
getOption('tracking', true)
.then(tracking => {
if ( tracking ) {
if ( Object.keys(hostnameCache).length ) {
post('http://ping.wappalyzer.com/v2/', hostnameCache);
}
if ( adCache.length ) {
post('https://ad.wappalyzer.com/log/wp/', adCache);
}
setOption('robotsTxtCache', {});
}
});
};

@ -1,9 +0,0 @@
/** global: browser */
document.addEventListener('DOMContentLoaded', function() {
var nodes = document.querySelectorAll('[data-i18n]');
Array.prototype.forEach.call(nodes, function (node) {
node.childNodes[0].nodeValue = browser.i18n.getMessage(node.dataset.i18n);
});
});

@ -131,14 +131,14 @@ var exports = {};
}
},
ifTrackingEnabled: function(callback, elseCallback) {
askIfTrackingEnabled: function(callback, elseCallback) {
this.sendToBackground(
'is_tracking_enabled',
'',
'tracking_enabled_response',
function(message) {
if ( message.tracking_enabled ) {
if ( message && message.tracking_enabled ) {
callback();
} else {
@ -181,7 +181,7 @@ var exports = {};
video_assets: opt_video_assets,
assets: opt_assets,
version: '3',
mrev: '9c4d5b3-c',
mrev: '082d7cb-d',
msgNum: this.msgNum,
timestamp: new Date().getTime(),
pageVis: document.visibilityState,
@ -890,7 +890,7 @@ var exports = {};
var _pageTags;
var INIT_MS_BW_SEARCHES = 2000;
var PAGE_TAG_RE = new RegExp('gpt|oascentral');
var POST_MSG_ID = '1490888598-28717-31700-14775-21098';
var POST_MSG_ID = '1501281986-4236-27733-5465-12184';
var AD_SERVER_RE = new RegExp('^(google_ads_iframe|oas_frame|atwAdFrame)');
function getPageTags(doc) {
@ -1136,12 +1136,12 @@ if ( exports.utils.SCRIPT_IN_WINDOW_TOP ) {
window.adparser = {
init: exports.coordinator.init,
addPostMessageListener: exports.coordinator.addPostMessageListener,
ifTrackingEnabled: exports.utils.ifTrackingEnabled,
askIfTrackingEnabled: exports.utils.askIfTrackingEnabled,
sendToBackground: exports.utils.sendToBackground
};
} else {
exports.coordinator.addPostMessageListener();
exports.utils.ifTrackingEnabled(
exports.utils.askIfTrackingEnabled(
function() {
exports.coordinator.init(function() {});
},
@ -1156,7 +1156,7 @@ if ( exports.utils.SCRIPT_IN_WINDOW_TOP ) {
if ( window === window.top ) {
adparser.addPostMessageListener();
adparser.ifTrackingEnabled(
adparser.askIfTrackingEnabled(
function() {
adparser.init(onAdFound);
},

@ -114,10 +114,33 @@
}
}
function isTrackingEnabled() {
function ifTrackingEnabled(url, ifCallback, elseCallback) {
return parseInt(localStorage.tracking, 10);
var fullIfCallback = function() {
allowedByRobotsTxt(url, ifCallback, elseCallback);
};
browser.storage.local.get('tracking').then(function(item) {
if ( item.hasOwnProperty('tracking') ) {
if ( item.tracking ) {
fullIfCallback();
} else {
elseCallback();
}
} else {
fullIfCallback();
}
});
}
function allowedByRobotsTxt(url, ifCallback, elseCallback) {
if ( ! url.startsWith('chrome://') ) {
wappalyzer.robotsTxtAllows(url).then(ifCallback, elseCallback);
} else {
elseCallback();
}
}
function isPixelRequest(request) {
@ -195,18 +218,22 @@
var tabId = details.tabId;
this.cleanupCollector(tabId);
if ( isTrackingEnabled() ) {
if ( !areListenersRegistered ) {
ifTrackingEnabled(
details.url,
function() {
if ( !areListenersRegistered ) {
registerListeners();
}
this.collectors[tabId] = new PageNetworkTrafficCollector(tabId);
} else {
if ( areListenersRegistered ) {
registerListeners();
}
this.collectors[tabId] = new PageNetworkTrafficCollector(tabId);
}.bind(this),
function() {
if ( areListenersRegistered ) {
unregisterListeners();
unregisterListeners();
}
}
}
);
},
onNavigationCommitted: function(details) {
@ -777,8 +804,17 @@
browserProxy.runtime.onMessage.addListener(function(request, sender, sendResponse) {
if ( request === 'is_tracking_enabled' ) {
sendResponse({'tracking_enabled': isTrackingEnabled()});
ifTrackingEnabled(
sender.tab.url,
function() {
try {sendResponse({'tracking_enabled': true});}
catch(err) {} },
function() {
try {sendResponse({'tracking_enabled': false});}
catch(err) {}}
);
}
return true;
});
})();

@ -1,72 +1,67 @@
/** global: browser */
/** global: wappalyzer */
document.addEventListener('DOMContentLoaded', function() {
var d = document;
function getOption(name, defaultValue, callback) {
browser.storage.local.get(name)
.then(item => {
callback(item.hasOwnProperty(name) ? item[name] : defaultValue);
});
}
var options = {
init: function() {
options.load();
function setOption(name, value) {
var option = {};
d.querySelector('#github').addEventListener('click', function() {
open(wappalyzer.config.githubURL);
});
option[name] = value;
d.querySelector('#twitter').addEventListener('click', function() {
open(wappalyzer.config.twitterURL);
});
browser.storage.local.set(option);
}
d.querySelector('#wappalyzer').addEventListener('click', function() {
open(wappalyzer.config.websiteURL);
});
},
document.addEventListener('DOMContentLoaded', () => {
var nodes = document.querySelectorAll('[data-i18n]');
get: function(name, defaultValue, callback) {
browser.storage.local.get(name).then(function(item) {
callback(item.hasOwnProperty(name) ? item[name] : defaultValue);
});
},
Array.prototype.forEach.call(nodes, node => {
node.childNodes[0].nodeValue = browser.i18n.getMessage(node.dataset.i18n);
});
set: function(name, value) {
var option = {};
document.querySelector('#github').addEventListener('click', () => {
open(wappalyzer.config.githubURL);
});
option[name] = value;
document.querySelector('#twitter').addEventListener('click', () => {
open(wappalyzer.config.twitterURL);
});
browser.storage.local.set(option);
},
document.querySelector('#wappalyzer').addEventListener('click', () => {
open(wappalyzer.config.websiteURL);
});
load: function() {
options.get('upgradeMessage', true, function(value) {
var el = d.querySelector('#option-upgrade-message');
getOption('upgradeMessage', true, value => {
const el = document.querySelector('#option-upgrade-message');
el.checked = value;
el.checked = value;
el.addEventListener('change', function() {
options.set('upgradeMessage', el.checked);
});
});
el.addEventListener('change', () => {
setOption('upgradeMessage', el.checked);
});
});
options.get('dynamicIcon', true, function(value) {
var el = d.querySelector('#option-dynamic-icon');
getOption('dynamicIcon', true, value => {
const el = document.querySelector('#option-dynamic-icon');
el.checked = value;
el.checked = value;
el.addEventListener('change', function() {
options.set('dynamicIcon', el.checked);
});
});
el.addEventListener('change', () => {
setOption('dynamicIcon', el.checked);
});
});
options.get('tracking', true, function(value) {
var el = d.querySelector('#option-tracking');
getOption('tracking', true, value => {
const el = document.querySelector('#option-tracking');
el.checked = value;
el.checked = value;
el.addEventListener('change', function() {
options.set('tracking', el.checked);
});
});
}
};
options.init();
el.addEventListener('change', () => {
setOption('tracking', el.checked);
});
});
});

@ -1,122 +1,133 @@
/** global: chrome */
/** global: browser */
(function() {
var popup = {
init: function() {
popup.update([ 'p', {}, ' ' ], document, {});
var func = function(tabs) {
( chrome || browser ).runtime.sendMessage({ id: 'get_apps', tab: tabs[0], source: 'popup.js' }, function(response) {
popup.update(popup.appsToDomTemplate(response));
});
};
try {
// Chrome, Firefox
browser.tabs.query({ active: true, currentWindow: true }).then(func);
} catch ( e ) {
// Edge
browser.tabs.query({ active: true, currentWindow: true }, func);
}
},
update: function(dom) {
if ( /complete|interactive|loaded/.test(document.readyState) ) {
popup.replaceDom(dom);
} else {
document.addEventListener('DOMContentLoaded', function() {
popup.replaceDom(dom);
});
}
},
replaceDom: function(domTemplate) {
var body = document.body;
while ( body.firstChild ) {
body.removeChild(body.firstChild);
}
body.appendChild(jsonToDOM(domTemplate, document, {}));
},
appsToDomTemplate: function(response) {
var
appName, confidence, version,
categories = [],
template = [];
if ( response.tabCache && response.tabCache.count > 0 ) {
for ( appName in response.tabCache.appsDetected ) {
confidence = response.tabCache.appsDetected[appName].confidenceTotal;
version = response.tabCache.appsDetected[appName].version;
categories = [];
response.apps[appName].cats.forEach(function(cat) {
categories.push(
[
'a', {
target: '_blank',
href: 'https://wappalyzer.com/categories/' + popup.slugify(response.categories[cat].name)
}, [
'span', {
class: 'category'
}, [
'span', {
class: 'name'
},
browser.i18n.getMessage('categoryName' + cat)
]
]
]
);
});
template.push(
[
'div', {
class: 'detected-app'
}, [
'a', {
target: '_blank',
href: 'https://wappalyzer.com/applications/' + popup.slugify(appName)
}, [
'img', {
src: 'images/icons/' + ( response.apps[appName].icon || 'default.svg' )
}
], [
'span', {
class: 'label'
}, [
'span', {
class: 'name'
},
appName
],
( version ? ' ' + version : '' ) + ( confidence < 100 ? ' (' + confidence + '% sure)' : '' )
]
],
categories
]
);
}
} else {
template = [
'div', {
class: 'empty'
},
browser.i18n.getMessage('noAppsDetected')
];
}
return template;
},
slugify: function(string) {
return string.toLowerCase().replace(/[^a-z0-9-]/g, '-').replace(/--+/g, '-').replace(/(?:^-|-$)/, '');
}
};
popup.init();
}());
var func = tabs => {
( chrome || browser ).runtime.sendMessage({
id: 'get_apps',
tab: tabs[0],
source: 'popup.js'
}, response => {
replaceDomWhenReady(appsToDomTemplate(response));
});
};
try {
// Chrome, Firefox
browser.tabs.query({ active: true, currentWindow: true })
.then(func)
.catch(console.error);
} catch ( e ) {
// Edge
browser.tabs.query({ active: true, currentWindow: true }, func);
}
function replaceDomWhenReady(dom) {
if ( /complete|interactive|loaded/.test(document.readyState) ) {
replaceDom(dom);
} else {
document.addEventListener('DOMContentLoaded', () => {
replaceDom(dom);
});
}
}
function replaceDom(domTemplate) {
var body = document.body;
while ( body.firstChild ) {
body.removeChild(body.firstChild);
}
body.appendChild(jsonToDOM(domTemplate, document, {}));
var nodes = document.querySelectorAll('[data-i18n]');
for ( let ms = 200; ms < 500; ms += 50 ) {
setTimeout(() => {
let div = document.createElement('div');
div.style.display = 'none';
body.appendChild(div);
}, ms);
};
Array.prototype.forEach.call(nodes, node => {
node.childNodes[0].nodeValue = browser.i18n.getMessage(node.dataset.i18n);
});
}
function appsToDomTemplate(response) {
var
appName, confidence, version, categories,
template = [];
if ( response.tabCache && Object.keys(response.tabCache.detected).length > 0 ) {
for ( appName in response.tabCache.detected ) {
confidence = response.tabCache.detected[appName].confidenceTotal;
version = response.tabCache.detected[appName].version;
categories = [];
response.apps[appName].cats.forEach(cat => {
categories.push(
[
'a', {
target: '_blank',
href: 'https://wappalyzer.com/categories/' + slugify(response.categories[cat].name)
}, [
'span', {
class: 'category'
}, [
'span', {
class: 'name'
},
browser.i18n.getMessage('categoryName' + cat)
]
]
]
);
});
template.push(
[
'div', {
class: 'detected-app'
}, [
'a', {
target: '_blank',
href: 'https://wappalyzer.com/applications/' + slugify(appName)
}, [
'img', {
src: '../images/icons/' + ( response.apps[appName].icon || 'default.svg' )
}
], [
'span', {
class: 'label'
}, [
'span', {
class: 'name'
},
appName
],
( version ? ' ' + version : '' ) + ( confidence < 100 ? ' (' + confidence + '% sure)' : '' )
]
],
categories
]
);
}
} else {
template = [
'div', {
class: 'empty'
},
browser.i18n.getMessage('noAppsDetected')
];
}
return template;
}
function slugify(string) {
return string.toLowerCase().replace(/[^a-z0-9-]/g, '-').replace(/--+/g, '-').replace(/(?:^-|-$)/, '');
}

@ -4,7 +4,7 @@
"author": "Elbert Alias",
"homepage_url": "https://wappalyzer.com/",
"description": "Identify web technologies",
"version": "4.1.4",
"version": "5.0.5",
"default_locale": "en",
"manifest_version": 2,
"icons": {
@ -23,10 +23,10 @@
"128": "images/icon_128.png"
},
"default_title": "Wappalyzer",
"default_popup": "popup.html"
"default_popup": "html/popup.html"
},
"background": {
"page": "background.html",
"page": "html/background.html",
"persistent": true
},
"content_scripts": [
@ -36,7 +36,7 @@
"https://*/*"
],
"js": [
"js/browser-polyfill.js",
"node_modules/webextension-polyfill/dist/browser-polyfill.js",
"js/content.js"
],
"run_at": "document_idle"
@ -57,7 +57,7 @@
"web_accessible_resources": [
"js/inject.js"
],
"options_page": "options.html",
"options_page": "html/options.html",
"permissions": [
"storage",
"tabs",

@ -4,7 +4,7 @@
"author": "Elbert Alias",
"homepage_url": "https://wappalyzer.com/",
"description": "Identify web technologies",
"version": "4.1.4",
"version": "5.0.5",
"default_locale": "en",
"manifest_version": 2,
"icons": {
@ -23,10 +23,10 @@
"128": "images/icon_128.png"
},
"default_title": "Wappalyzer",
"default_popup": "popup.html"
"default_popup": "html/popup.html"
},
"background": {
"page": "background.html"
"page": "html/background.html"
},
"content_scripts": [
@ -36,7 +36,7 @@
"https://*/*"
],
"js": [
"js/browser-polyfill.js",
"node_modules/webextension-polyfill/dist/browser-polyfill.js",
"js/content.js"
],
"run_at": "document_idle"
@ -47,7 +47,6 @@
"https://*/*"
],
"js": [
"js/browser-polyfill.js",
"js/iframe.js"
],
"run_at": "document_start",
@ -57,9 +56,9 @@
"web_accessible_resources": [
"js/inject.js"
],
"options_page": "options.html",
"options_page": "html/options.html",
"options_ui": {
"page": "options.html",
"page": "html/options.html",
"open_in_tab": false
},
"permissions": [

@ -0,0 +1,5 @@
{
"dependencies": {
"webextension-polyfill": "^0.1.1"
}
}

@ -1,16 +0,0 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<link rel="stylesheet" href="css/popup.css">
<script src="js/browser-polyfill.js"></script>
<script src="js/jsontodom.js"></script>
<script src="js/popup.js"></script>
<script src="js/i18n.js"></script>
</head>
<body>
</body>
</html>

@ -0,0 +1,7 @@
# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.
# yarn lockfile v1
webextension-polyfill@^0.1.1:
version "0.1.1"
resolved "https://registry.yarnpkg.com/webextension-polyfill/-/webextension-polyfill-0.1.1.tgz#1d172e59b9ee8706d5ce2c55eebfe0cf23972d70"

@ -0,0 +1 @@
<svg width="160" height="160" viewBox="0 0 160 160" xmlns="http://www.w3.org/2000/svg"><title>Artboard 6</title><g fill="none" fill-rule="evenodd"><path d="M144.086 80.568c-21.978.43-17.402 14.346-32.89 17.866C95.46 102.01 92.975 60 77.243 60c-15.733 0-19.216 40.806-38.918 68.823l-.56.794L80 154l64.086-37V80.568z" fill="#36A2EB"/><path d="M144.086 79.3C136.726 69.856 131.736 59 121 59c-19 0-14 31-35 31s-23.207-33.346-47-2c-7.58 9.988-13.682 21.124-18.475 31.662L80 154l64.086-37V79.3z" fill="#FFCE56"/><path d="M15.914 92.143C23.124 72.173 26.237 56 40 56c21 0 26 59 44 53s16-38 44-38c5.33 0 10.772 3.263 16.086 8.546V117L80 154l-64.086-37V92.143z" fill-opacity=".8" fill="#FE6184"/><path stroke="#E7E9ED" stroke-width="8" d="M80 6l64.086 37v74L80 154l-64.086-37V43z"/></g></svg>

After

Width:  |  Height:  |  Size: 783 B

@ -0,0 +1,7 @@
<svg width="18" height="20" viewBox="0 0 18 20" xmlns="http://www.w3.org/2000/svg">
<path d="M6.002 13.944l.002-.002a5.537 5.537 0 0 1 .002-7.845l-.003-.003a2.18 2.18 0 0 0-3.084-3.083 9.876 9.876 0 0 0-2.903 7.01 9.873 9.873 0 0 0 2.903 7.006 2.18 2.18 0 0 0 3.084-3.082" fill="#F8E418"/>
<path d="M6.003 6.095l.002.002a5.537 5.537 0 0 1 7.845.001l.003-.002a2.18 2.18 0 0 0 3.083-3.084A9.876 9.876 0 0 0 9.925.108 9.873 9.873 0 0 0 2.92 3.012a2.18 2.18 0 0 0 3.082 3.084v-.001" fill="#56AED2"/>
<path d="M13.852 13.944l-.002-.002a5.537 5.537 0 0 1-7.845-.001l-.003.002a2.18 2.18 0 0 0-3.083 3.084 9.876 9.876 0 0 0 7.01 2.904 9.873 9.873 0 0 0 7.006-2.904 2.18 2.18 0 0 0-3.082-3.084l-.001.001" fill="#E0534E"/>
<path d="M6.003 6.094a2.18 2.18 0 1 1-3.084-3.083 2.18 2.18 0 0 1 3.084 3.083" fill="#1D78A4"/>
<path d="M6.003 17.027a2.18 2.18 0 1 1-3.084-3.083 2.18 2.18 0 0 1 3.084 3.083" fill="#BE433B"/>
</svg>

After

Width:  |  Height:  |  Size: 923 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 681 B

@ -0,0 +1,12 @@
<?xml version="1.0" encoding="utf-8"?>
<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
viewBox="0 0 100 100" style="enable-background:new 0 0 100 100;" xml:space="preserve">
<style type="text/css">
.st0{fill:#EC4331;}
.st1{fill:#FFFFFF;}
</style>
<circle class="st0" cx="50" cy="50" r="50"/>
<path id="XMLID_21_" class="st1" d="M62.5,37.2c0.2,0.2,0.5,0.4,0.7,0.6l3.5-2.8l0.1-0.1c-0.5-0.5-1.1-1.1-1.7-1.5
C57,27.2,44.8,29.8,37.9,39c-7,9.2-6.1,21.6,2,27.7c6.6,5,15.9,4.2,22.9-1.3l0,0l-3.3-2.6c-5.2,3.3-11.6,3.6-16.3,0.1
c-6.2-4.7-6.9-14.2-1.5-21.3C47,34.4,56.3,32.5,62.5,37.2z"/>
</svg>

After

Width:  |  Height:  |  Size: 669 B

@ -0,0 +1,62 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="10.119996mm"
height="10.131281mm"
viewBox="0 0 10.119996 10.131281"
version="1.1"
id="svg4155"
inkscape:version="0.92.1 15371"
sodipodi:docname="freespee.svg">
<defs
id="defs4149" />
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="5.6"
inkscape:cx="-2.223803"
inkscape:cy="20.730676"
inkscape:document-units="mm"
inkscape:current-layer="layer1"
showgrid="false"
inkscape:window-width="2495"
inkscape:window-height="1416"
inkscape:window-x="65"
inkscape:window-y="24"
inkscape:window-maximized="1" />
<metadata
id="metadata4152">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
</cc:Work>
</rdf:RDF>
</metadata>
<g
inkscape:label="Capa 1"
inkscape:groupmode="layer"
id="layer1"
transform="translate(-96.2373,-134.75365)">
<path
inkscape:connector-curvature="0"
style="fill:#41a4ff;fill-opacity:1;stroke-width:0.26458332"
d="m 106.35057,140.41454 c -0.0529,-0.37042 -0.39687,-0.66146 -0.79375,-0.60854 l -1.66687,0.21166 1.79916,-1.71979 c 0.26459,-0.26458 0.29105,-0.71437 0.0265,-0.97896 -0.26458,-0.26458 -0.71437,-0.29104 -0.97896,-0.0264 l -1.21708,1.16416 0.44979,-2.46062 c 0.0794,-0.37042 -0.18521,-0.74084 -0.55562,-0.82021 v 0 c -0.37042,-0.0794 -0.74084,0.18521 -0.82021,0.55562 l -0.29104,1.64042 -1.05834,-2.2225 c -0.15875,-0.34396 -0.58208,-0.50271 -0.92604,-0.3175 -0.34396,0.15875 -0.50271,0.58208 -0.3175,0.92604 l 0.71438,1.50813 -2.196037,-1.19063 c -0.34396,-0.18521 -0.7673,-0.0794 -0.9525,0.26459 -0.18521,0.34395 -0.0529,0.76729 0.29104,0.9525 l 1.481657,0.79375 -2.487077,0.3175 c -0.37042,0.0529 -0.66146,0.39687 -0.60854,0.79375 0.0529,0.37041 0.39687,0.66145 0.79375,0.60854 l 1.66687,-0.21167 -1.79916,1.71979 c -0.26459,0.26459 -0.29104,0.71438 -0.0265,0.97896 0.26458,0.26458 0.71437,0.29104 0.97896,0.0265 l 1.21708,-1.16417 -0.47625,2.46063 c -0.0794,0.37041 0.18521,0.74083 0.55563,0.82021 0.370407,0.0794 0.740827,-0.18521 0.820197,-0.55563 l 0.29105,-1.64042 1.08479,2.24896 c 0.15875,0.34396 0.58208,0.50271 0.92604,0.3175 v 0 c 0.34396,-0.15875 0.50271,-0.58208 0.3175,-0.92604 l -0.71438,-1.50812 2.19605,1.19062 c 0.34395,0.18521 0.76729,0.0529 0.9525,-0.29104 0.1852,-0.34396 0.0529,-0.76729 -0.29105,-0.9525 l -1.48166,-0.79375 2.48708,-0.3175 c 0.39688,-0.0529 0.66146,-0.42333 0.60854,-0.79375 z m -5.05354,0.52917 c -0.635,0 -1.13771,-0.50271 -1.13771,-1.13771 0,-0.635 0.50271,-1.13771 1.13771,-1.13771 0.635,0 1.13771,0.50271 1.13771,1.13771 0,0.635 -0.50271,1.13771 -1.13771,1.13771 z"
id="path4120" />
</g>
</svg>

After

Width:  |  Height:  |  Size: 3.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.1 KiB

After

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 892 B

@ -0,0 +1,77 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg width="511px" height="511px" viewBox="0 0 511 511" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<!-- Generator: Sketch 3.8.1 (29687) - http://www.bohemiancoding.com/sketch -->
<title>phenomic-avatar-white</title>
<desc>Created with Sketch.</desc>
<defs>
<linearGradient x1="0%" y1="0%" x2="100%" y2="100%" id="linearGradient-1">
<stop stop-color="#006BF6" offset="0%"></stop>
<stop stop-color="#10E951" offset="100%"></stop>
</linearGradient>
<linearGradient x1="50%" y1="0%" x2="50%" y2="100%" id="linearGradient-2">
<stop stop-color="#FFFFFF" offset="0%"></stop>
<stop stop-color="#DEECF1" offset="100%"></stop>
</linearGradient>
<path d="M166.177063,407.147639 L16.2000677,320.450821 C6.20934603,314.756258 0.0522733949,304.064425 0.0522733949,292.559083 L0.0522733949,119.165448 C0.0522733949,107.660106 6.20934603,96.9682734 16.2000677,91.2737103 L166.177063,4.57689265 C176.167785,-1.11767045 188.48193,-1.11767045 198.356481,4.57689265 L348.333476,91.2737103 C358.324198,96.9682734 364.481271,107.660106 364.481271,119.165448 L364.481271,292.442868 C364.481271,303.94821 358.324198,314.640042 348.333476,320.334605 L198.356481,407.031423 C193.477291,409.936812 187.901074,411.447615 182.324858,411.447615 C176.748641,411.447615 171.172424,410.053028 166.177063,407.147639 Z M20.4984014,98.8277226 L24.9129063,106.381735 C20.3822302,109.054693 17.4779507,113.935747 17.4779507,119.165448 L17.4779507,292.442868 C17.4779507,297.672569 20.266059,302.669838 24.9129063,305.226581 L174.889902,391.923399 C179.420578,394.596357 185.112966,394.596357 189.643642,391.923399 L339.620638,305.226581 C344.151314,302.553623 347.055593,297.672569 347.055593,292.442868 L347.055593,119.165448 C347.055593,113.935747 344.267485,108.938477 339.620638,106.381735 L189.643642,19.6849172 C185.112966,17.011959 179.420578,17.011959 174.889902,19.6849172 L24.7967351,106.381735 L20.4984014,98.8277226 L20.4984014,98.8277226 Z" id="path-3"></path>
<filter x="-50%" y="-50%" width="200%" height="200%" filterUnits="objectBoundingBox" id="filter-4">
<feOffset dx="0" dy="2" in="SourceAlpha" result="shadowOffsetOuter1"></feOffset>
<feGaussianBlur stdDeviation="3" in="shadowOffsetOuter1" result="shadowBlurOuter1"></feGaussianBlur>
<feColorMatrix values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.35 0" type="matrix" in="shadowBlurOuter1"></feColorMatrix>
</filter>
<filter x="-50%" y="-50%" width="200%" height="200%" filterUnits="objectBoundingBox" id="filter-5">
<feGaussianBlur stdDeviation="2" in="SourceAlpha" result="shadowBlurInner1"></feGaussianBlur>
<feOffset dx="0" dy="2" in="shadowBlurInner1" result="shadowOffsetInner1"></feOffset>
<feComposite in="shadowOffsetInner1" in2="SourceAlpha" operator="arithmetic" k2="-1" k3="1" result="shadowInnerInner1"></feComposite>
<feColorMatrix values="0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 0 0 0 1 0" type="matrix" in="shadowInnerInner1"></feColorMatrix>
</filter>
<path d="M182.324858,335.675061 C178.723551,335.675061 175.006073,334.745336 171.75328,332.885887 L77.6546228,278.613215 C71.1490367,274.894316 67.0830453,267.805166 67.0830453,260.251154 L67.0830453,151.589593 C67.0830453,144.035581 71.1490367,137.062646 77.6546228,133.227532 L171.75328,78.9548596 C178.258866,75.2359612 186.390849,75.2359612 192.896435,78.9548596 L286.995092,133.227532 C293.500679,136.946431 297.56667,144.035581 297.56667,151.589593 L297.56667,260.251154 C297.56667,267.805166 293.500679,274.778101 286.995092,278.613215 L192.896435,332.885887 C189.643642,334.745336 185.926164,335.675061 182.324858,335.675061 L182.324858,335.675061 Z M182.324858,315.919563 C179.27186,315.919563 176.120378,315.131391 173.362831,313.555048 L93.5909461,267.545535 C88.0758528,264.392849 84.6289195,258.383041 84.6289195,251.979147 L84.6289195,159.8616 C84.6289195,153.457706 88.0758528,147.546419 93.5909461,144.295212 L173.362831,98.2856987 C178.877924,95.1330125 185.771791,95.1330125 191.286884,98.2856987 L271.058769,144.295212 C276.573863,147.447898 280.020796,153.457706 280.020796,159.8616 L280.020796,251.979147 C280.020796,258.383041 276.573863,264.294327 271.058769,267.545535 L191.286884,313.555048 C188.529338,315.131391 185.377856,315.919563 182.324858,315.919563 L182.324858,315.919563 Z" id="path-6"></path>
<filter x="-50%" y="-50%" width="200%" height="200%" filterUnits="objectBoundingBox" id="filter-7">
<feOffset dx="0" dy="2" in="SourceAlpha" result="shadowOffsetOuter1"></feOffset>
<feGaussianBlur stdDeviation="3" in="shadowOffsetOuter1" result="shadowBlurOuter1"></feGaussianBlur>
<feColorMatrix values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.35 0" type="matrix" in="shadowBlurOuter1"></feColorMatrix>
</filter>
<filter x="-50%" y="-50%" width="200%" height="200%" filterUnits="objectBoundingBox" id="filter-8">
<feGaussianBlur stdDeviation="2" in="SourceAlpha" result="shadowBlurInner1"></feGaussianBlur>
<feOffset dx="0" dy="2" in="shadowBlurInner1" result="shadowOffsetInner1"></feOffset>
<feComposite in="shadowOffsetInner1" in2="SourceAlpha" operator="arithmetic" k2="-1" k3="1" result="shadowInnerInner1"></feComposite>
<feColorMatrix values="0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 0 0 0 1 0" type="matrix" in="shadowInnerInner1"></feColorMatrix>
</filter>
<path d="M156.651026,258.972783 C155.140801,258.972783 153.630576,258.624136 152.352693,257.810627 C148.17053,255.3701 146.776476,250.024184 149.216071,245.956638 L200.447562,157.284156 C202.887157,153.100395 208.231031,151.705808 212.297023,154.146336 C216.479185,156.586863 217.873239,161.932779 215.433644,166.000324 L164.202153,254.556591 C162.575757,257.345765 159.671477,258.972783 156.651026,258.972783 L156.651026,258.972783 Z" id="path-9"></path>
<filter x="-50%" y="-50%" width="200%" height="200%" filterUnits="objectBoundingBox" id="filter-10">
<feOffset dx="0" dy="2" in="SourceAlpha" result="shadowOffsetOuter1"></feOffset>
<feGaussianBlur stdDeviation="3" in="shadowOffsetOuter1" result="shadowBlurOuter1"></feGaussianBlur>
<feColorMatrix values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.35 0" type="matrix" in="shadowBlurOuter1"></feColorMatrix>
</filter>
<filter x="-50%" y="-50%" width="200%" height="200%" filterUnits="objectBoundingBox" id="filter-11">
<feGaussianBlur stdDeviation="2" in="SourceAlpha" result="shadowBlurInner1"></feGaussianBlur>
<feOffset dx="0" dy="2" in="shadowBlurInner1" result="shadowOffsetInner1"></feOffset>
<feComposite in="shadowOffsetInner1" in2="SourceAlpha" operator="arithmetic" k2="-1" k3="1" result="shadowInnerInner1"></feComposite>
<feColorMatrix values="0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 0 0 0 1 0" type="matrix" in="shadowInnerInner1"></feColorMatrix>
</filter>
</defs>
<g id="Phenomic" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
<g id="logo-on-background" transform="translate(-2.000000, -1.000000)">
<rect id="bg-avatar-dark" fill="url(#linearGradient-1)" x="1" y="0" width="512" height="512"></rect>
<g id="Group-3">
<g id="Phenomic-Logo" transform="translate(74.000000, 50.000000)">
<polygon id="Shape" fill-opacity="0.02" fill="#000000" points="10.2753374 105.684441 180.466119 204.002816 351.237756 105.684441 351.237756 304.413072 180.814632 403.080094 8.06808494 303.134701"></polygon>
<g id="Shape">
<use fill="black" fill-opacity="1" filter="url(#filter-4)" xlink:href="#path-3"></use>
<use fill="url(#linearGradient-2)" fill-rule="evenodd" xlink:href="#path-3"></use>
<use fill="black" fill-opacity="1" filter="url(#filter-5)" xlink:href="#path-3"></use>
</g>
<g id="Shape">
<use fill="black" fill-opacity="1" filter="url(#filter-7)" xlink:href="#path-6"></use>
<use fill="url(#linearGradient-2)" fill-rule="evenodd" xlink:href="#path-6"></use>
<use fill="black" fill-opacity="1" filter="url(#filter-8)" xlink:href="#path-6"></use>
</g>
<g id="Shape">
<use fill="black" fill-opacity="1" filter="url(#filter-10)" xlink:href="#path-9"></use>
<use fill="url(#linearGradient-2)" fill-rule="evenodd" xlink:href="#path-9"></use>
<use fill="black" fill-opacity="1" filter="url(#filter-11)" xlink:href="#path-9"></use>
</g>
</g>
</g>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 8.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 970 B

After

Width:  |  Height:  |  Size: 1.8 KiB

@ -0,0 +1,45 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg width="512px" height="512px" viewBox="0 0 512 512" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<!-- Generator: Sketch 45.2 (43514) - http://www.bohemiancoding.com/sketch -->
<title>Group 2</title>
<desc>Created with Sketch.</desc>
<defs>
<linearGradient x1="78.90488%" y1="84.3963716%" x2="21.0954612%" y2="15.6033058%" id="linearGradient-1">
<stop stop-color="#606CEC" offset="0%"></stop>
<stop stop-color="#A85FBF" offset="43.9216%"></stop>
<stop stop-color="#F15292" offset="100%"></stop>
</linearGradient>
<linearGradient x1="18.0093967%" y1="82.0245002%" x2="81.9909188%" y2="17.9759054%" id="linearGradient-2">
<stop stop-color="#ED488A" offset="0%"></stop>
<stop stop-color="#F6C54F" offset="100%"></stop>
</linearGradient>
<linearGradient x1="28.169417%" y1="72.4215476%" x2="71.8308986%" y2="27.578858%" id="linearGradient-3">
<stop stop-color="#F287A6" offset="0%"></stop>
<stop stop-color="#F6C54F" offset="100%"></stop>
</linearGradient>
<linearGradient x1="64.1238204%" y1="85.7635195%" x2="35.8762192%" y2="14.2360792%" id="linearGradient-4">
<stop stop-color="#AE93CD" offset="0%"></stop>
<stop stop-color="#ED488A" offset="100%"></stop>
</linearGradient>
</defs>
<g id="Page-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
<g id="Artboard-Copy">
<g id="Group-2">
<rect id="Rectangle" fill="#FFFFFF" x="0" y="0" width="512" height="512" rx="70"></rect>
<g id="logo-copy" transform="translate(41.000000, 117.000000)">
<g id="Layer_x0020_1">
<g id="_1363946464">
<g id="Group">
<path d="M236.428826,139.847946 C239.390903,157.95944 238.130652,176.737603 232.737953,194.28018 C217.183142,244.888354 168.998594,280.614762 113.678489,278.137726 C48.0262844,275.197345 -2.81553604,219.560807 0.123094219,153.869496 C3.47008466,79.0442364 66.9026852,41.3354181 131.964819,30.2210137 C134.635768,29.7693994 137.169946,31.5680365 137.623245,34.2425317 C138.004251,36.4869181 136.794802,38.6394175 134.811617,39.534826 C100.091231,55.3022264 64.1809353,90.1821013 61.2618438,137.853805 C58.3427523,185.527464 94.2960338,221.525622 139.573214,223.554954 C170.303783,224.931302 197.835857,209.208868 212.990123,184.804099 L236.428826,139.847946 Z" id="Shape" fill="url(#linearGradient-1)"></path>
<path d="M236.428826,139.847946 C239.390903,157.95944 238.130652,176.737603 232.737953,194.28018 C217.183142,244.888354 168.998594,280.614762 113.678489,278.137726 C48.0262844,275.197345 -2.81553604,219.560807 0.123094219,153.869496 C3.47008466,79.0442364 66.9026852,41.3354181 131.964819,30.2210137 C134.635768,29.7693994 137.169946,31.5680365 137.623245,34.2425317 C138.004251,36.4869181 136.794802,38.6394175 134.811617,39.534826 C100.091231,55.3022264 64.1809353,90.1821013 61.2618438,137.853805 C58.3427523,185.527464 94.2960338,221.525622 139.573214,223.554954 C170.303783,224.931302 197.835857,209.208868 212.990123,184.804099 L236.428826,139.847946 Z" id="Shape"></path>
<path d="M225.598488,138.506789 C225.909155,135.814698 228.343685,133.885073 231.034173,134.195925 C234.603905,134.420754 235.89151,137.499943 236.428826,139.847946 C236.571459,159.951626 230.479272,173.173564 212.990123,184.804099 C211.296112,186.010359 209.551301,187.079766 207.765458,188.024051 C201.175032,191.504022 194.070737,193.222503 186.984027,193.545085 C181.132167,193.81097 175.577296,193.419962 170.364354,192.448307 C155.688787,189.71125 143.551306,182.42286 134.913218,172.250785 C126.290761,162.09435 121.179421,149.079647 120.532687,134.864548 C120.296268,129.630905 120.657736,124.258455 121.66789,118.837128 C125.356808,99.034524 136.089452,82.1977165 150.530553,69.0500701 C166.581649,54.4400536 187.259524,44.3755059 207.880736,39.8925984 C221.999448,36.82123 237.003266,36.0646293 252.149716,36.0040231 L252.149716,36.000113 L253.177455,36.000113 L255.463491,36.000113 L355.296811,36.000113 C383.172767,34.9033354 405.26134,21.1222559 418.074862,5.72631319 C419.657502,3.82601397 421.380821,1.30596695 423.49687,0.369502626 C424.958369,-0.27761573 426.476531,-0.0527860895 427.742643,0.881723198 C429.46987,2.15445447 429.75709,3.37830973 429.604688,5.50539363 C429.465962,7.40764789 428.903246,9.593383 428.52224,11.2062913 C420.624671,44.6081557 404.884242,72.725546 381.076257,91.6171009 C373.272474,97.5095925 364.319812,101.892793 353.75911,104.89769 C344.161668,107.628881 334.499749,109.132307 324.536933,109.132307 L228.736414,109.132307 C227.456625,109.122532 226.155343,109.122532 224.83843,109.132307 C218.122957,109.187049 211.120264,109.544821 204.408698,110.481285 C199.408728,111.179235 194.568976,112.524302 190.155169,114.469568 C182.03095,117.7208 175.131812,123.77165 171.360831,129.539019 C168.58828,133.783411 166.878638,138.80591 166.634403,144.240922 C165.911469,160.403241 178.42214,174.092433 194.574837,174.817753 C209.088232,175.466826 221.606719,165.425739 224.521902,151.65639 C225.444132,147.28883 225.076803,142.91736 225.598488,138.506789 Z" id="Shape" fill="url(#linearGradient-2)"></path>
<path d="M212.990123,184.804099 C211.296112,186.010359 209.551301,187.079766 207.765458,188.024051 C201.175032,191.504022 194.070737,193.222503 186.984027,193.545085 C181.132167,193.81097 175.577296,193.419962 170.364354,192.448307 C155.688787,189.71125 143.551306,182.42286 134.913218,172.250785 C126.290761,162.09435 121.179421,149.079647 120.532687,134.864548 C120.296268,129.630905 120.657736,124.258455 121.66789,118.837128 C125.356808,99.034524 136.089452,82.1977165 150.530553,69.0500701 C166.581649,54.4400536 187.259524,44.3755059 207.880736,39.8925984 C221.999448,36.82123 237.003266,36.0646293 252.149716,36.0040231 L253.177455,36.000113 L255.463491,36.000113 L355.296811,36.000113 C357.682494,35.9062711 360.021284,35.7166322 362.319043,35.4448816 C362.702002,35.3979606 363.083008,35.3510396 363.464014,35.3021636 C371.064594,34.2992279 378.161073,32.3598279 384.679205,29.7400738 C386.091858,29.169202 387.352108,28.6237458 388.590866,28.054829 C390.519342,27.1652857 392.309093,26.260102 394.048043,25.3099524 L394.899933,24.8368326 L395.742054,24.3558927 L396.740485,23.7713356 L397.576744,23.2669352 L398.407142,22.7566697 L399.229724,22.2346739 C400.228154,21.5895106 401.00189,21.0733799 401.761948,20.5474741 L402.559129,19.9883325 L403.350449,19.4233259 L404.178893,18.8113983 L404.968259,18.217066 L405.781072,17.589498 L406.535268,16.9912557 L407.271879,16.3969234 L408.092507,15.7146143 L408.823257,15.0929115 L409.598946,14.4184226 L410.663809,13.4643629 L411.359389,12.8211546 L412.023707,12.1935867 L412.779857,11.4624016 L413.444175,10.803553 L414.073323,10.1642548 L414.714195,9.49954106 L415.315989,8.85828783 L416.0526,8.05672128 L416.673933,7.36072692 L417.469161,6.44576804 C417.672364,6.20725311 417.875567,5.96678315 418.074862,5.72631319 C419.657502,3.82601397 421.380821,1.30596695 423.49687,0.369502626 C424.958369,-0.27761573 426.476531,-0.0527860895 427.742643,0.881723198 C429.46987,2.15445447 429.75709,3.37830973 429.604688,5.50539363 C417.349974,48.3090471 392.137152,79.5056259 351.432043,82.6336905 C303.343234,86.3326268 252.558076,66.9972778 210.575132,70.4146883 C130.843294,76.9093323 118.254467,152.888065 153.998684,180.358337 C165.790329,189.419949 184.145045,192.313409 198.619362,189.631094 C203.009722,188.817797 207.742011,187.333921 212.990123,184.804099 Z" id="Shape" fill="url(#linearGradient-3)"></path>
<path d="M132.230546,40.746951 C0.375144288,88.6845404 19.0502959,254.868835 131.878848,260.163085 C179.358047,262.38792 220.711843,230.280293 234.062681,184.800189 C235.774277,178.968304 237.001312,172.98588 237.737923,166.93894 C237.138083,176.203877 235.467519,185.400387 232.737953,194.28018 C217.183142,244.888354 168.998594,280.614762 113.678489,278.137726 C48.0262844,275.197345 -2.81553604,219.560807 0.123094219,153.869496 C3.47008466,79.0442364 66.9026852,41.3354181 131.964819,30.2210137 C134.635768,29.7693994 137.169946,31.5680365 137.623245,34.2425317 C138.004251,36.4869181 136.794802,38.6394175 134.811617,39.534826 C133.951911,39.9277891 133.092206,40.3324824 132.230546,40.746951 Z" id="Shape" fill="url(#linearGradient-4)"></path>
</g>
</g>
</g>
</g>
</g>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 8.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 39 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 432 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.2 KiB

After

Width:  |  Height:  |  Size: 674 B

@ -0,0 +1,9 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg width="258px" height="258px" viewBox="0 0 258 258" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<g id="Page-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
<rect id="Rectangle-11" fill="#00B74F" x="-23" y="-17" width="307" height="306"></rect>
<path d="M66.181,129.179 C66.181,94.536 88.786,65.189 120.044,55.038 L110.403,25.366 C66.64,39.575 35,80.678 35,129.179 C35,177.68 66.64,218.783 110.403,232.993 L120.044,203.32 C88.786,193.17 66.181,163.821 66.181,129.179" id="Fill-13" fill="#FFFFFF"></path>
<path d="M181.967,101.692 C187.583,109.409 190.905,118.904 190.905,129.179 C190.905,155.011 169.966,175.951 144.133,175.951 C139.087,175.951 134.233,175.142 129.68,173.664 L120.039,203.336 C127.626,205.8 135.724,207.132 144.133,207.132 C187.188,207.132 222.086,172.231 222.086,129.179 C222.086,112.053 216.55,96.229 207.189,83.367 L181.967,101.692" id="Fill-14" fill="#FFFFFF"></path>
<path d="M128.544,129.179 L128.544,129.179 C128.544,120.569 135.523,113.589 144.134,113.589 C149.319,113.589 153.9,116.13 156.734,120.025 L181.967,101.692 C173.464,90.009 159.69,82.408 144.133,82.408 C118.303,82.408 97.362,103.347 97.362,129.179 L128.544,129.179" id="Fill-15" fill="#FFFFFF"></path>
</g>
</svg>

After

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 814 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.0 KiB

@ -0,0 +1,9 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg width="258px" height="258px" viewBox="0 0 258 258" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<g id="Page-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
<rect id="Rectangle-11" fill="#4B9FE2" x="-23" y="-17" width="307" height="306"></rect>
<path d="M66.181,129.179 C66.181,94.536 88.786,65.189 120.044,55.038 L110.403,25.366 C66.64,39.575 35,80.678 35,129.179 C35,177.68 66.64,218.783 110.403,232.993 L120.044,203.32 C88.786,193.17 66.181,163.821 66.181,129.179" id="Fill-13" fill="#FFFFFF"></path>
<path d="M181.967,101.692 C187.583,109.409 190.905,118.904 190.905,129.179 C190.905,155.011 169.966,175.951 144.133,175.951 C139.087,175.951 134.233,175.142 129.68,173.664 L120.039,203.336 C127.626,205.8 135.724,207.132 144.133,207.132 C187.188,207.132 222.086,172.231 222.086,129.179 C222.086,112.053 216.55,96.229 207.189,83.367 L181.967,101.692" id="Fill-14" fill="#FFFFFF"></path>
<path d="M128.544,129.179 L128.544,129.179 C128.544,120.569 135.523,113.589 144.134,113.589 C149.319,113.589 153.9,116.13 156.734,120.025 L181.967,101.692 C173.464,90.009 159.69,82.408 144.133,82.408 C118.303,82.408 97.362,103.347 97.362,129.179 L128.544,129.179" id="Fill-15" fill="#FFFFFF"></path>
</g>
</svg>

After

Width:  |  Height:  |  Size: 1.3 KiB

@ -0,0 +1,15 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg width="1100px" height="1100px" viewBox="0 0 1100 1100" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:sketch="http://www.bohemiancoding.com/sketch/ns">
<!-- Generator: Sketch 3.0.4 (8054) - http://www.bohemiancoding.com/sketch -->
<title>LOGO</title>
<desc>Created with Sketch.</desc>
<defs></defs>
<g id="Page-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd" sketch:type="MSPage">
<g id="Dimensions-3" sketch:type="MSArtboardGroup" transform="translate(-260.000000, -3512.000000)">
<g id="LOGO" sketch:type="MSLayerGroup" transform="translate(260.000000, 3512.000000)">
<path d="M550,1100 C853.756612,1100 1100,853.756612 1100,550 C1100,246.243388 853.756612,0 550,0 C246.243388,0 0,246.243388 0,550 C0,853.756612 246.243388,1100 550,1100 Z" id="Oval-150" fill="#498BFA" sketch:type="MSShapeGroup"></path>
<path d="M679.259063,305.221016 L679.259063,633.813477 C679.259063,701.84971 624.126021,758.89182 556.132871,761.213261 C556.132871,761.213261 551.424989,761.384302 551.010202,761.384302 C550.352535,761.384302 545.080102,761.191144 545.080102,761.191144 C476.472336,758.878634 420.854753,701.351813 420.854753,632.711738 L420.854753,305.221016 L340.350514,305.221016 L340.350514,631.322425 C340.350514,747.090137 434.205902,840.734323 549.976105,840.482583 L551.0102,840.480335 L551.0102,840.480335 C666.205614,840.480335 759.589947,746.63277 759.589947,630.851732 L759.589947,305.221016 L679.259063,305.221016 Z" id="Oval-20" fill="#FFFFFF" sketch:type="MSShapeGroup"></path>
</g>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 1.7 KiB

@ -1 +1 @@
<svg width="256" height="296" viewBox="0 0 256 296" xmlns="http://www.w3.org/2000/svg" preserveAspectRatio="xMidYMid"><defs><radialGradient fx="50%" fy="50%" id="a"><stop stop-color="#93B4E7" offset="0%"/><stop stop-color="#B9D1F8" offset="59.273%"/><stop stop-color="#9CB6E0" offset="100%"/></radialGradient></defs><path d="M128.032.456L.298 74.203v147.495l127.734 73.748 127.735-73.748V74.203L128.032.456z" fill="url(#a)"/><path d="M128.034 75.263L64.69 111.834v73.144l63.344 36.572 63.344-36.572v-73.144l-63.344-36.571z" fill="#6F95DB"/><path d="M128 0L0 74.25l128 69.693 128-69.238L128 0zm0 153.509L0 221.38l128 73.793 127.544-74.249L128 153.51z" fill="#FFF" fill-opacity=".1"/></svg>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1200 1200"><title>icon-square-big</title><path fill="#FFF" d="M600 0l530.3 300v600L600 1200 69.7 900V300z"/><path fill="#8ED6FB" class="st1" d="M1035.6 879.3l-418.1 236.5V931.6L878 788.3l157.6 91zm28.6-25.9V358.8l-153 88.3V765l153 88.4zm-901.5 25.9l418.1 236.5V931.6L320.3 788.3l-157.6 91zm-28.6-25.9V358.8l153 88.3V765l-153 88.4zM152 326.8L580.8 84.2v178.1L306.1 413.4l-2.1 1.2-152-87.8zm894.3 0L617.5 84.2v178.1l274.7 151.1 2.1 1.2 152-87.8z"/><path fill="#1C78C0" d="M580.8 889.7l-257-141.3v-280l257 148.4v272.9zm36.7 0l257-141.3v-280l-257 148.4v272.9zm-18.3-283.6zM341.2 436l258-141.9 258 141.9-258 149-258-149z"/></svg>

Before

Width:  |  Height:  |  Size: 688 B

After

Width:  |  Height:  |  Size: 678 B

File diff suppressed because it is too large Load Diff

@ -0,0 +1,814 @@
# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.
# yarn lockfile v1
ansi-regex@^2.0.0:
version "2.1.1"
resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df"
ansi-styles@^2.2.1:
version "2.2.1"
resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe"
asn1@~0.2.3:
version "0.2.3"
resolved "https://registry.yarnpkg.com/asn1/-/asn1-0.2.3.tgz#dac8787713c9966849fc8180777ebe9c1ddf3b86"
assert-plus@1.0.0, assert-plus@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-1.0.0.tgz#f12e0f3c5d77b0b1cdd9146942e4e96c1e4dd525"
assert-plus@^0.2.0:
version "0.2.0"
resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-0.2.0.tgz#d74e1b87e7affc0db8aadb7021f3fe48101ab234"
async@~1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/async/-/async-1.0.0.tgz#f8fc04ca3a13784ade9e1641af98578cfbd647a9"
asynckit@^0.4.0:
version "0.4.0"
resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79"
aws-sign2@~0.6.0:
version "0.6.0"
resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.6.0.tgz#14342dd38dbcc94d0e5b87d763cd63612c0e794f"
aws4@^1.2.1:
version "1.6.0"
resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.6.0.tgz#83ef5ca860b2b32e4a0deedee8c771b9db57471e"
bcrypt-pbkdf@^1.0.0:
version "1.0.1"
resolved "https://registry.yarnpkg.com/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.1.tgz#63bc5dcb61331b92bc05fd528953c33462a06f8d"
dependencies:
tweetnacl "^0.14.3"
boom@2.x.x:
version "2.10.1"
resolved "https://registry.yarnpkg.com/boom/-/boom-2.10.1.tgz#39c8918ceff5799f83f9492a848f625add0c766f"
dependencies:
hoek "2.x.x"
builtin-modules@^1.0.0:
version "1.1.1"
resolved "https://registry.yarnpkg.com/builtin-modules/-/builtin-modules-1.1.1.tgz#270f076c5a72c02f5b65a47df94c5fe3a278892f"
camelcase@^3.0.0:
version "3.0.0"
resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-3.0.0.tgz#32fc4b9fcdaf845fcdf7e73bb97cac2261f0ab0a"
caseless@~0.11.0:
version "0.11.0"
resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.11.0.tgz#715b96ea9841593cc33067923f5ec60ebda4f7d7"
chalk@^1.1.1:
version "1.1.3"
resolved "https://registry.yarnpkg.com/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98"
dependencies:
ansi-styles "^2.2.1"
escape-string-regexp "^1.0.2"
has-ansi "^2.0.0"
strip-ansi "^3.0.0"
supports-color "^2.0.0"
cliui@^3.2.0:
version "3.2.0"
resolved "https://registry.yarnpkg.com/cliui/-/cliui-3.2.0.tgz#120601537a916d29940f934da3b48d585a39213d"
dependencies:
string-width "^1.0.1"
strip-ansi "^3.0.1"
wrap-ansi "^2.0.0"
code-point-at@^1.0.0:
version "1.1.0"
resolved "https://registry.yarnpkg.com/code-point-at/-/code-point-at-1.1.0.tgz#0d070b4d043a5bea33a2f1a40e2edb3d9a4ccf77"
colors@1.0.x:
version "1.0.3"
resolved "https://registry.yarnpkg.com/colors/-/colors-1.0.3.tgz#0433f44d809680fdeb60ed260f1b0c262e82a40b"
combined-stream@^1.0.5, combined-stream@~1.0.5:
version "1.0.5"
resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.5.tgz#938370a57b4a51dea2c77c15d5c5fdf895164009"
dependencies:
delayed-stream "~1.0.0"
commander@^2.9.0:
version "2.11.0"
resolved "https://registry.yarnpkg.com/commander/-/commander-2.11.0.tgz#157152fd1e7a6c8d98a5b715cf376df928004563"
concat-stream@1.5.0:
version "1.5.0"
resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.5.0.tgz#53f7d43c51c5e43f81c8fdd03321c631be68d611"
dependencies:
inherits "~2.0.1"
readable-stream "~2.0.0"
typedarray "~0.0.5"
core-util-is@~1.0.0:
version "1.0.2"
resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7"
cryptiles@2.x.x:
version "2.0.5"
resolved "https://registry.yarnpkg.com/cryptiles/-/cryptiles-2.0.5.tgz#3bdfecdc608147c1c67202fa291e7dca59eaa3b8"
dependencies:
boom "2.x.x"
cycle@1.0.x:
version "1.0.3"
resolved "https://registry.yarnpkg.com/cycle/-/cycle-1.0.3.tgz#21e80b2be8580f98b468f379430662b046c34ad2"
dashdash@^1.12.0:
version "1.14.1"
resolved "https://registry.yarnpkg.com/dashdash/-/dashdash-1.14.1.tgz#853cfa0f7cbe2fed5de20326b8dd581035f6e2f0"
dependencies:
assert-plus "^1.0.0"
debug@0.7.4:
version "0.7.4"
resolved "https://registry.yarnpkg.com/debug/-/debug-0.7.4.tgz#06e1ea8082c2cb14e39806e22e2f6f757f92af39"
decamelize@^1.1.1:
version "1.2.0"
resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290"
delayed-stream@~1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619"
ecc-jsbn@~0.1.1:
version "0.1.1"
resolved "https://registry.yarnpkg.com/ecc-jsbn/-/ecc-jsbn-0.1.1.tgz#0fc73a9ed5f0d53c38193398523ef7e543777505"
dependencies:
jsbn "~0.1.0"
error-ex@^1.2.0:
version "1.3.1"
resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.1.tgz#f855a86ce61adc4e8621c3cda21e7a7612c3a8dc"
dependencies:
is-arrayish "^0.2.1"
es6-promise@~4.0.3:
version "4.0.5"
resolved "https://registry.yarnpkg.com/es6-promise/-/es6-promise-4.0.5.tgz#7882f30adde5b240ccfa7f7d78c548330951ae42"
escape-string-regexp@^1.0.2:
version "1.0.5"
resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4"
extend@~3.0.0:
version "3.0.1"
resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.1.tgz#a755ea7bc1adfcc5a31ce7e762dbaadc5e636444"
extract-zip@~1.5.0:
version "1.5.0"
resolved "https://registry.yarnpkg.com/extract-zip/-/extract-zip-1.5.0.tgz#92ccf6d81ef70a9fa4c1747114ccef6d8688a6c4"
dependencies:
concat-stream "1.5.0"
debug "0.7.4"
mkdirp "0.5.0"
yauzl "2.4.1"
extsprintf@1.0.2:
version "1.0.2"
resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.0.2.tgz#e1080e0658e300b06294990cc70e1502235fd550"
eyes@0.1.x:
version "0.1.8"
resolved "https://registry.yarnpkg.com/eyes/-/eyes-0.1.8.tgz#62cf120234c683785d902348a800ef3e0cc20bc0"
fd-slicer@~1.0.1:
version "1.0.1"
resolved "https://registry.yarnpkg.com/fd-slicer/-/fd-slicer-1.0.1.tgz#8b5bcbd9ec327c5041bf9ab023fd6750f1177e65"
dependencies:
pend "~1.2.0"
file-type@3.8.*:
version "3.8.0"
resolved "https://registry.yarnpkg.com/file-type/-/file-type-3.8.0.tgz#bcadf6a8f624ebe4a10e5ad26727b6b93f16d78d"
find-up@^1.0.0:
version "1.1.2"
resolved "https://registry.yarnpkg.com/find-up/-/find-up-1.1.2.tgz#6b2e9822b1a2ce0a60ab64d610eccad53cb24d0f"
dependencies:
path-exists "^2.0.0"
pinkie-promise "^2.0.0"
forever-agent@~0.6.1:
version "0.6.1"
resolved "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91"
form-data@~2.1.1:
version "2.1.4"
resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.1.4.tgz#33c183acf193276ecaa98143a69e94bfee1750d1"
dependencies:
asynckit "^0.4.0"
combined-stream "^1.0.5"
mime-types "^2.1.12"
fs-extra@~1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-1.0.0.tgz#cd3ce5f7e7cb6145883fcae3191e9877f8587950"
dependencies:
graceful-fs "^4.1.2"
jsonfile "^2.1.0"
klaw "^1.0.0"
generate-function@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/generate-function/-/generate-function-2.0.0.tgz#6858fe7c0969b7d4e9093337647ac79f60dfbe74"
generate-object-property@^1.1.0:
version "1.2.0"
resolved "https://registry.yarnpkg.com/generate-object-property/-/generate-object-property-1.2.0.tgz#9c0e1c40308ce804f4783618b937fa88f99d50d0"
dependencies:
is-property "^1.0.0"
get-caller-file@^1.0.1:
version "1.0.2"
resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-1.0.2.tgz#f702e63127e7e231c160a80c1554acb70d5047e5"
getpass@^0.1.1:
version "0.1.7"
resolved "https://registry.yarnpkg.com/getpass/-/getpass-0.1.7.tgz#5eff8e3e684d569ae4cb2b1282604e8ba62149fa"
dependencies:
assert-plus "^1.0.0"
graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.1.9:
version "4.1.11"
resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.1.11.tgz#0e8bdfe4d1ddb8854d64e04ea7c00e2a026e5658"
har-validator@~2.0.6:
version "2.0.6"
resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-2.0.6.tgz#cdcbc08188265ad119b6a5a7c8ab70eecfb5d27d"
dependencies:
chalk "^1.1.1"
commander "^2.9.0"
is-my-json-valid "^2.12.4"
pinkie-promise "^2.0.0"
has-ansi@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/has-ansi/-/has-ansi-2.0.0.tgz#34f5049ce1ecdf2b0649af3ef24e45ed35416d91"
dependencies:
ansi-regex "^2.0.0"
hasha@~2.2.0:
version "2.2.0"
resolved "https://registry.yarnpkg.com/hasha/-/hasha-2.2.0.tgz#78d7cbfc1e6d66303fe79837365984517b2f6ee1"
dependencies:
is-stream "^1.0.1"
pinkie-promise "^2.0.0"
hawk@~3.1.3:
version "3.1.3"
resolved "https://registry.yarnpkg.com/hawk/-/hawk-3.1.3.tgz#078444bd7c1640b0fe540d2c9b73d59678e8e1c4"
dependencies:
boom "2.x.x"
cryptiles "2.x.x"
hoek "2.x.x"
sntp "1.x.x"
hoek@2.x.x:
version "2.16.3"
resolved "https://registry.yarnpkg.com/hoek/-/hoek-2.16.3.tgz#20bb7403d3cea398e91dc4710a8ff1b8274a25ed"
hosted-git-info@^2.1.4:
version "2.5.0"
resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.5.0.tgz#6d60e34b3abbc8313062c3b798ef8d901a07af3c"
html-comment-regex@^1.1.0:
version "1.1.1"
resolved "https://registry.yarnpkg.com/html-comment-regex/-/html-comment-regex-1.1.1.tgz#668b93776eaae55ebde8f3ad464b307a4963625e"
http-signature@~1.1.0:
version "1.1.1"
resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-1.1.1.tgz#df72e267066cd0ac67fb76adf8e134a8fbcf91bf"
dependencies:
assert-plus "^0.2.0"
jsprim "^1.2.2"
sshpk "^1.7.0"
inherits@~2.0.1:
version "2.0.3"
resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de"
invert-kv@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/invert-kv/-/invert-kv-1.0.0.tgz#104a8e4aaca6d3d8cd157a8ef8bfab2d7a3ffdb6"
is-arrayish@^0.2.1:
version "0.2.1"
resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d"
is-builtin-module@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/is-builtin-module/-/is-builtin-module-1.0.0.tgz#540572d34f7ac3119f8f76c30cbc1b1e037affbe"
dependencies:
builtin-modules "^1.0.0"
is-fullwidth-code-point@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz#ef9e31386f031a7f0d643af82fde50c457ef00cb"
dependencies:
number-is-nan "^1.0.0"
is-my-json-valid@^2.12.4:
version "2.16.0"
resolved "https://registry.yarnpkg.com/is-my-json-valid/-/is-my-json-valid-2.16.0.tgz#f079dd9bfdae65ee2038aae8acbc86ab109e3693"
dependencies:
generate-function "^2.0.0"
generate-object-property "^1.1.0"
jsonpointer "^4.0.0"
xtend "^4.0.0"
is-property@^1.0.0:
version "1.0.2"
resolved "https://registry.yarnpkg.com/is-property/-/is-property-1.0.2.tgz#57fe1c4e48474edd65b09911f26b1cd4095dda84"
is-stream@^1.0.1:
version "1.1.0"
resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44"
is-svg@2.0.*:
version "2.0.1"
resolved "https://registry.yarnpkg.com/is-svg/-/is-svg-2.0.1.tgz#f93ab3bf1d6bbca30e9753cd3485b1300eebc013"
dependencies:
html-comment-regex "^1.1.0"
is-typedarray@~1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a"
is-utf8@^0.2.0:
version "0.2.1"
resolved "https://registry.yarnpkg.com/is-utf8/-/is-utf8-0.2.1.tgz#4b0da1442104d1b336340e80797e865cf39f7d72"
isarray@~1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11"
isexe@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10"
isstream@0.1.x, isstream@~0.1.2:
version "0.1.2"
resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a"
jsbn@~0.1.0:
version "0.1.1"
resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513"
json-schema@0.2.3:
version "0.2.3"
resolved "https://registry.yarnpkg.com/json-schema/-/json-schema-0.2.3.tgz#b480c892e59a2f05954ce727bd3f2a4e882f9e13"
json-stringify-safe@~5.0.1:
version "5.0.1"
resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb"
jsonfile@^2.1.0:
version "2.4.0"
resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-2.4.0.tgz#3736a2b428b87bbda0cc83b53fa3d633a35c2ae8"
optionalDependencies:
graceful-fs "^4.1.6"
jsonpointer@^4.0.0:
version "4.0.1"
resolved "https://registry.yarnpkg.com/jsonpointer/-/jsonpointer-4.0.1.tgz#4fd92cb34e0e9db3c89c8622ecf51f9b978c6cb9"
jsprim@^1.2.2:
version "1.4.0"
resolved "https://registry.yarnpkg.com/jsprim/-/jsprim-1.4.0.tgz#a3b87e40298d8c380552d8cc7628a0bb95a22918"
dependencies:
assert-plus "1.0.0"
extsprintf "1.0.2"
json-schema "0.2.3"
verror "1.3.6"
kew@~0.7.0:
version "0.7.0"
resolved "https://registry.yarnpkg.com/kew/-/kew-0.7.0.tgz#79d93d2d33363d6fdd2970b335d9141ad591d79b"
klaw@^1.0.0:
version "1.3.1"
resolved "https://registry.yarnpkg.com/klaw/-/klaw-1.3.1.tgz#4088433b46b3b1ba259d78785d8e96f73ba02439"
optionalDependencies:
graceful-fs "^4.1.9"
lcid@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/lcid/-/lcid-1.0.0.tgz#308accafa0bc483a3867b4b6f2b9506251d1b835"
dependencies:
invert-kv "^1.0.0"
linerstream@^0.1.4:
version "0.1.4"
resolved "https://registry.yarnpkg.com/linerstream/-/linerstream-0.1.4.tgz#5de7bf69faa2b0f9d85e8332099b70e419a845d5"
load-json-file@^1.0.0:
version "1.1.0"
resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-1.1.0.tgz#956905708d58b4bab4c2261b04f59f31c99374c0"
dependencies:
graceful-fs "^4.1.2"
parse-json "^2.2.0"
pify "^2.0.0"
pinkie-promise "^2.0.0"
strip-bom "^2.0.0"
lodash.assign@^4.0.3, lodash.assign@^4.0.6:
version "4.2.0"
resolved "https://registry.yarnpkg.com/lodash.assign/-/lodash.assign-4.2.0.tgz#0d99f3ccd7a6d261d19bdaeb9245005d285808e7"
mime-db@~1.27.0:
version "1.27.0"
resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.27.0.tgz#820f572296bbd20ec25ed55e5b5de869e5436eb1"
mime-types@^2.1.12, mime-types@~2.1.7:
version "2.1.15"
resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.15.tgz#a4ebf5064094569237b8cf70046776d09fc92aed"
dependencies:
mime-db "~1.27.0"
minimist@0.0.8:
version "0.0.8"
resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d"
mkdirp@0.5.0:
version "0.5.0"
resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.0.tgz#1d73076a6df986cd9344e15e71fcc05a4c9abf12"
dependencies:
minimist "0.0.8"
normalize-package-data@^2.3.2:
version "2.4.0"
resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.4.0.tgz#12f95a307d58352075a04907b84ac8be98ac012f"
dependencies:
hosted-git-info "^2.1.4"
is-builtin-module "^1.0.0"
semver "2 || 3 || 4 || 5"
validate-npm-package-license "^3.0.1"
number-is-nan@^1.0.0:
version "1.0.1"
resolved "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d"
oauth-sign@~0.8.1:
version "0.8.2"
resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.8.2.tgz#46a6ab7f0aead8deae9ec0565780b7d4efeb9d43"
os-locale@^1.4.0:
version "1.4.0"
resolved "https://registry.yarnpkg.com/os-locale/-/os-locale-1.4.0.tgz#20f9f17ae29ed345e8bde583b13d2009803c14d9"
dependencies:
lcid "^1.0.0"
parse-json@^2.2.0:
version "2.2.0"
resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-2.2.0.tgz#f480f40434ef80741f8469099f8dea18f55a4dc9"
dependencies:
error-ex "^1.2.0"
path-exists@^2.0.0:
version "2.1.0"
resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-2.1.0.tgz#0feb6c64f0fc518d9a754dd5efb62c7022761f4b"
dependencies:
pinkie-promise "^2.0.0"
path-type@^1.0.0:
version "1.1.0"
resolved "https://registry.yarnpkg.com/path-type/-/path-type-1.1.0.tgz#59c44f7ee491da704da415da5a4070ba4f8fe441"
dependencies:
graceful-fs "^4.1.2"
pify "^2.0.0"
pinkie-promise "^2.0.0"
pend@~1.2.0:
version "1.2.0"
resolved "https://registry.yarnpkg.com/pend/-/pend-1.2.0.tgz#7a57eb550a6783f9115331fcf4663d5c8e007a50"
phantom@^2.0.x:
version "2.1.21"
resolved "https://registry.yarnpkg.com/phantom/-/phantom-2.1.21.tgz#76b7790ff62cf09fbe922ae844b9fb745ce8bb28"
dependencies:
linerstream "^0.1.4"
phantomjs-prebuilt "^2.1.4"
winston "^2.2.0"
phantomjs-prebuilt@^2.1.4:
version "2.1.14"
resolved "https://registry.yarnpkg.com/phantomjs-prebuilt/-/phantomjs-prebuilt-2.1.14.tgz#d53d311fcfb7d1d08ddb24014558f1188c516da0"
dependencies:
es6-promise "~4.0.3"
extract-zip "~1.5.0"
fs-extra "~1.0.0"
hasha "~2.2.0"
kew "~0.7.0"
progress "~1.1.8"
request "~2.79.0"
request-progress "~2.0.1"
which "~1.2.10"
pify@^2.0.0, pify@^2.3.0:
version "2.3.0"
resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c"
pinkie-promise@^2.0.0:
version "2.0.1"
resolved "https://registry.yarnpkg.com/pinkie-promise/-/pinkie-promise-2.0.1.tgz#2135d6dfa7a358c069ac9b178776288228450ffa"
dependencies:
pinkie "^2.0.0"
pinkie@^2.0.0:
version "2.0.4"
resolved "https://registry.yarnpkg.com/pinkie/-/pinkie-2.0.4.tgz#72556b80cfa0d48a974e80e77248e80ed4f7f870"
process-nextick-args@~1.0.6:
version "1.0.7"
resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-1.0.7.tgz#150e20b756590ad3f91093f25a4f2ad8bff30ba3"
progress@~1.1.8:
version "1.1.8"
resolved "https://registry.yarnpkg.com/progress/-/progress-1.1.8.tgz#e260c78f6161cdd9b0e56cc3e0a85de17c7a57be"
punycode@^1.4.1:
version "1.4.1"
resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e"
qs@~6.3.0:
version "6.3.2"
resolved "https://registry.yarnpkg.com/qs/-/qs-6.3.2.tgz#e75bd5f6e268122a2a0e0bda630b2550c166502c"
read-chunk@2.0.*:
version "2.0.0"
resolved "https://registry.yarnpkg.com/read-chunk/-/read-chunk-2.0.0.tgz#3246e877829116cec059674c4d5f300f7a9261f3"
dependencies:
pify "^2.3.0"
read-pkg-up@^1.0.1:
version "1.0.1"
resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-1.0.1.tgz#9d63c13276c065918d57f002a57f40a1b643fb02"
dependencies:
find-up "^1.0.0"
read-pkg "^1.0.0"
read-pkg@^1.0.0:
version "1.1.0"
resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-1.1.0.tgz#f5ffaa5ecd29cb31c0474bca7d756b6bb29e3f28"
dependencies:
load-json-file "^1.0.0"
normalize-package-data "^2.3.2"
path-type "^1.0.0"
readable-stream@~2.0.0:
version "2.0.6"
resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.0.6.tgz#8f90341e68a53ccc928788dacfcd11b36eb9b78e"
dependencies:
core-util-is "~1.0.0"
inherits "~2.0.1"
isarray "~1.0.0"
process-nextick-args "~1.0.6"
string_decoder "~0.10.x"
util-deprecate "~1.0.1"
request-progress@~2.0.1:
version "2.0.1"
resolved "https://registry.yarnpkg.com/request-progress/-/request-progress-2.0.1.tgz#5d36bb57961c673aa5b788dbc8141fdf23b44e08"
dependencies:
throttleit "^1.0.0"
request@~2.79.0:
version "2.79.0"
resolved "https://registry.yarnpkg.com/request/-/request-2.79.0.tgz#4dfe5bf6be8b8cdc37fcf93e04b65577722710de"
dependencies:
aws-sign2 "~0.6.0"
aws4 "^1.2.1"
caseless "~0.11.0"
combined-stream "~1.0.5"
extend "~3.0.0"
forever-agent "~0.6.1"
form-data "~2.1.1"
har-validator "~2.0.6"
hawk "~3.1.3"
http-signature "~1.1.0"
is-typedarray "~1.0.0"
isstream "~0.1.2"
json-stringify-safe "~5.0.1"
mime-types "~2.1.7"
oauth-sign "~0.8.1"
qs "~6.3.0"
stringstream "~0.0.4"
tough-cookie "~2.3.0"
tunnel-agent "~0.4.1"
uuid "^3.0.0"
require-directory@^2.1.1:
version "2.1.1"
resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42"
require-main-filename@^1.0.1:
version "1.0.1"
resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-1.0.1.tgz#97f717b69d48784f5f526a6c5aa8ffdda055a4d1"
"semver@2 || 3 || 4 || 5":
version "5.3.0"
resolved "https://registry.yarnpkg.com/semver/-/semver-5.3.0.tgz#9b2ce5d3de02d17c6012ad326aa6b4d0cf54f94f"
set-blocking@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7"
sntp@1.x.x:
version "1.0.9"
resolved "https://registry.yarnpkg.com/sntp/-/sntp-1.0.9.tgz#6541184cc90aeea6c6e7b35e2659082443c66198"
dependencies:
hoek "2.x.x"
spdx-correct@~1.0.0:
version "1.0.2"
resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-1.0.2.tgz#4b3073d933ff51f3912f03ac5519498a4150db40"
dependencies:
spdx-license-ids "^1.0.2"
spdx-expression-parse@~1.0.0:
version "1.0.4"
resolved "https://registry.yarnpkg.com/spdx-expression-parse/-/spdx-expression-parse-1.0.4.tgz#9bdf2f20e1f40ed447fbe273266191fced51626c"
spdx-license-ids@^1.0.2:
version "1.2.2"
resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-1.2.2.tgz#c9df7a3424594ade6bd11900d596696dc06bac57"
sshpk@^1.7.0:
version "1.13.1"
resolved "https://registry.yarnpkg.com/sshpk/-/sshpk-1.13.1.tgz#512df6da6287144316dc4c18fe1cf1d940739be3"
dependencies:
asn1 "~0.2.3"
assert-plus "^1.0.0"
dashdash "^1.12.0"
getpass "^0.1.1"
optionalDependencies:
bcrypt-pbkdf "^1.0.0"
ecc-jsbn "~0.1.1"
jsbn "~0.1.0"
tweetnacl "~0.14.0"
stack-trace@0.0.x:
version "0.0.10"
resolved "https://registry.yarnpkg.com/stack-trace/-/stack-trace-0.0.10.tgz#547c70b347e8d32b4e108ea1a2a159e5fdde19c0"
string-width@^1.0.1:
version "1.0.2"
resolved "https://registry.yarnpkg.com/string-width/-/string-width-1.0.2.tgz#118bdf5b8cdc51a2a7e70d211e07e2b0b9b107d3"
dependencies:
code-point-at "^1.0.0"
is-fullwidth-code-point "^1.0.0"
strip-ansi "^3.0.0"
string_decoder@~0.10.x:
version "0.10.31"
resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-0.10.31.tgz#62e203bc41766c6c28c9fc84301dab1c5310fa94"
stringstream@~0.0.4:
version "0.0.5"
resolved "https://registry.yarnpkg.com/stringstream/-/stringstream-0.0.5.tgz#4e484cd4de5a0bbbee18e46307710a8a81621878"
strip-ansi@^3.0.0, strip-ansi@^3.0.1:
version "3.0.1"
resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf"
dependencies:
ansi-regex "^2.0.0"
strip-bom@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-2.0.0.tgz#6219a85616520491f35788bdbf1447a99c7e6b0e"
dependencies:
is-utf8 "^0.2.0"
supports-color@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7"
svg2png-many@*:
version "0.0.7"
resolved "https://registry.yarnpkg.com/svg2png-many/-/svg2png-many-0.0.7.tgz#e478f65fa38ca0f23a21f9519a85025e054b5552"
dependencies:
phantom "^2.0.x"
yargs "^4.6.0"
throttleit@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/throttleit/-/throttleit-1.0.0.tgz#9e785836daf46743145a5984b6268d828528ac6c"
tough-cookie@~2.3.0:
version "2.3.2"
resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.3.2.tgz#f081f76e4c85720e6c37a5faced737150d84072a"
dependencies:
punycode "^1.4.1"
tunnel-agent@~0.4.1:
version "0.4.3"
resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.4.3.tgz#6373db76909fe570e08d73583365ed828a74eeeb"
tweetnacl@^0.14.3, tweetnacl@~0.14.0:
version "0.14.5"
resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-0.14.5.tgz#5ae68177f192d4456269d108afa93ff8743f4f64"
typedarray@~0.0.5:
version "0.0.6"
resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777"
util-deprecate@~1.0.1:
version "1.0.2"
resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf"
uuid@^3.0.0:
version "3.1.0"
resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.1.0.tgz#3dd3d3e790abc24d7b0d3a034ffababe28ebbc04"
validate-npm-package-license@^3.0.1:
version "3.0.1"
resolved "https://registry.yarnpkg.com/validate-npm-package-license/-/validate-npm-package-license-3.0.1.tgz#2804babe712ad3379459acfbe24746ab2c303fbc"
dependencies:
spdx-correct "~1.0.0"
spdx-expression-parse "~1.0.0"
verror@1.3.6:
version "1.3.6"
resolved "https://registry.yarnpkg.com/verror/-/verror-1.3.6.tgz#cff5df12946d297d2baaefaa2689e25be01c005c"
dependencies:
extsprintf "1.0.2"
which-module@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/which-module/-/which-module-1.0.0.tgz#bba63ca861948994ff307736089e3b96026c2a4f"
which@~1.2.10:
version "1.2.14"
resolved "https://registry.yarnpkg.com/which/-/which-1.2.14.tgz#9a87c4378f03e827cecaf1acdf56c736c01c14e5"
dependencies:
isexe "^2.0.0"
window-size@^0.2.0:
version "0.2.0"
resolved "https://registry.yarnpkg.com/window-size/-/window-size-0.2.0.tgz#b4315bb4214a3d7058ebeee892e13fa24d98b075"
winston@^2.2.0:
version "2.3.1"
resolved "https://registry.yarnpkg.com/winston/-/winston-2.3.1.tgz#0b48420d978c01804cf0230b648861598225a119"
dependencies:
async "~1.0.0"
colors "1.0.x"
cycle "1.0.x"
eyes "0.1.x"
isstream "0.1.x"
stack-trace "0.0.x"
wrap-ansi@^2.0.0:
version "2.1.0"
resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-2.1.0.tgz#d8fc3d284dd05794fe84973caecdd1cf824fdd85"
dependencies:
string-width "^1.0.1"
strip-ansi "^3.0.1"
xtend@^4.0.0:
version "4.0.1"
resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.1.tgz#a5c6d532be656e23db820efb943a1f04998d63af"
y18n@^3.2.1:
version "3.2.1"
resolved "https://registry.yarnpkg.com/y18n/-/y18n-3.2.1.tgz#6d15fba884c08679c0d77e88e7759e811e07fa41"
yargs-parser@^2.4.1:
version "2.4.1"
resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-2.4.1.tgz#85568de3cf150ff49fa51825f03a8c880ddcc5c4"
dependencies:
camelcase "^3.0.0"
lodash.assign "^4.0.6"
yargs@^4.6.0:
version "4.8.1"
resolved "https://registry.yarnpkg.com/yargs/-/yargs-4.8.1.tgz#c0c42924ca4aaa6b0e6da1739dfb216439f9ddc0"
dependencies:
cliui "^3.2.0"
decamelize "^1.1.1"
get-caller-file "^1.0.1"
lodash.assign "^4.0.3"
os-locale "^1.4.0"
read-pkg-up "^1.0.1"
require-directory "^2.1.1"
require-main-filename "^1.0.1"
set-blocking "^2.0.0"
string-width "^1.0.1"
which-module "^1.0.0"
window-size "^0.2.0"
y18n "^3.2.1"
yargs-parser "^2.4.1"
yauzl@2.4.1:
version "2.4.1"
resolved "https://registry.yarnpkg.com/yauzl/-/yauzl-2.4.1.tgz#9528f442dab1b2284e58b4379bb194e22e0c4005"
dependencies:
fd-slicer "~1.0.1"