@ -0,0 +1,2 @@
|
||||
**/lib/*
|
||||
node_modules
|
@ -0,0 +1,6 @@
|
||||
module.exports = {
|
||||
"extends": "airbnb-base",
|
||||
"rules": {
|
||||
"no-param-reassign": 0
|
||||
}
|
||||
};
|
@ -0,0 +1,16 @@
|
||||
<!--
|
||||
If you need technical help please read https://www.wappalyzer.com/docs before opening an issue.
|
||||
It also explains well how to add a new application detection.
|
||||
-->
|
||||
|
||||
**Do you want to request a *feature*, a *new application detection* or report a *bug*?**
|
||||
|
||||
**Is your issue about WebExtension driver (Chrome & Firefox), the website, the NPM driver or the bookmarklet ?**
|
||||
|
||||
**What is the current behavior ?**
|
||||
|
||||
**If the current behavior is a bug, please provide the steps to reproduce and if possible a demo of the problem.**
|
||||
|
||||
**What is the expected behavior ?**
|
||||
|
||||
**Which versions of Wappalyzer, and which browser / OS are affected by this issue ? Did this work in previous versions ?**
|
@ -0,0 +1,11 @@
|
||||
--- src/drivers/npm/node_modules/zombie/lib/document.js 2018-04-20 14:36:04.097829977 +1000
|
||||
+++ src/drivers/npm/node_modules/zombie/lib/document.js 2018-04-20 14:34:25.699317000 +1000
|
||||
@@ -281,7 +281,7 @@
|
||||
// The current window, postMessage and window.close need this
|
||||
browser._windowInScope = window;
|
||||
var result = undefined;
|
||||
- if (typeof code === 'string' || code instanceof String) result = VM.runInContext(code, window, { filename: filename });else if (code) result = code.call(window);
|
||||
+ if (typeof code === 'string' || code instanceof String) result = VM.runInContext(code, window, { filename: filename, timeout: 1000 });else if (code) result = code.call(window);
|
||||
browser.emit('evaluated', code, result, filename);
|
||||
return result;
|
||||
} catch (error) {
|
@ -0,0 +1,20 @@
|
||||
class Browser {
|
||||
constructor(options) {
|
||||
this.options = options;
|
||||
|
||||
this.window = null;
|
||||
this.document = null;
|
||||
this.statusCode = null;
|
||||
this.contentType = null;
|
||||
this.headers = null;
|
||||
this.statusCode = null;
|
||||
this.contentType = null;
|
||||
this.html = null;
|
||||
this.js = null;
|
||||
this.links = null;
|
||||
this.scripts = null;
|
||||
this.cookies = null;
|
||||
}
|
||||
}
|
||||
|
||||
module.exports = Browser;
|
@ -0,0 +1,121 @@
|
||||
const Zombie = require('zombie');
|
||||
const Browser = require('../browser');
|
||||
|
||||
class ZombieBrowser extends Browser {
|
||||
constructor(options) {
|
||||
super(options);
|
||||
|
||||
this.browser = new Zombie({
|
||||
proxy: options.proxy,
|
||||
silent: true,
|
||||
strictSSL: false,
|
||||
userAgent: options.userAgent,
|
||||
waitDuration: options.maxWait,
|
||||
});
|
||||
|
||||
this.browser.on('authenticate', (auth) => {
|
||||
auth.username = this.options.username;
|
||||
auth.password = this.options.password;
|
||||
});
|
||||
}
|
||||
|
||||
visit(url) {
|
||||
return new Promise((resolve) => {
|
||||
this.browser.visit(url, () => {
|
||||
const resource = this.browser.resources.length
|
||||
? this.browser.resources.filter(_resource => _resource.response).shift() : null;
|
||||
|
||||
this.window = this.browser.window;
|
||||
this.document = this.browser.document;
|
||||
this.headers = this.getHeaders();
|
||||
this.statusCode = resource ? resource.response.status : 0;
|
||||
this.contentType = this.headers['content-type'] ? this.headers['content-type'].shift() : null;
|
||||
this.html = this.getHtml();
|
||||
this.js = this.getJs();
|
||||
this.links = this.getLinks();
|
||||
this.scripts = this.getScripts();
|
||||
this.cookies = this.getCookies();
|
||||
|
||||
resolve();
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
getHeaders() {
|
||||
const headers = {};
|
||||
|
||||
const resource = this.browser.resources.length
|
||||
? this.browser.resources.filter(_resource => _resource.response).shift() : null;
|
||||
|
||||
if (resource) {
|
||||
// eslint-disable-next-line no-underscore-dangle
|
||||
resource.response.headers._headers.forEach((header) => {
|
||||
if (!headers[header[0]]) {
|
||||
headers[header[0]] = [];
|
||||
}
|
||||
|
||||
headers[header[0]].push(header[1]);
|
||||
});
|
||||
}
|
||||
|
||||
return headers;
|
||||
}
|
||||
|
||||
getHtml() {
|
||||
let html = '';
|
||||
|
||||
if (this.browser.document && this.browser.document.documentElement) {
|
||||
try {
|
||||
html = this.browser.html();
|
||||
} catch (error) {
|
||||
this.log(error.message, 'error');
|
||||
}
|
||||
}
|
||||
|
||||
return html;
|
||||
}
|
||||
|
||||
getScripts() {
|
||||
let scripts = [];
|
||||
|
||||
if (this.browser.document && this.browser.document.scripts) {
|
||||
scripts = Array.prototype.slice
|
||||
.apply(this.browser.document.scripts)
|
||||
.filter(script => script.src)
|
||||
.map(script => script.src);
|
||||
}
|
||||
|
||||
return scripts;
|
||||
}
|
||||
|
||||
getJs() {
|
||||
return this.browser.window;
|
||||
}
|
||||
|
||||
getLinks() {
|
||||
let links = [];
|
||||
|
||||
if (this.browser.document) {
|
||||
links = Array.from(this.browser.document.getElementsByTagName('a'));
|
||||
}
|
||||
|
||||
return links;
|
||||
}
|
||||
|
||||
getCookies() {
|
||||
const cookies = [];
|
||||
|
||||
if (this.browser.cookies) {
|
||||
this.browser.cookies.forEach(cookie => cookies.push({
|
||||
name: cookie.key,
|
||||
value: cookie.value,
|
||||
domain: cookie.domain,
|
||||
path: cookie.path,
|
||||
}));
|
||||
}
|
||||
|
||||
return cookies;
|
||||
}
|
||||
}
|
||||
|
||||
module.exports = ZombieBrowser;
|
@ -1,41 +1,45 @@
|
||||
'use strict';
|
||||
#!/usr/bin/env node
|
||||
|
||||
const Wappalyzer = require('./driver');
|
||||
const Browser = require('./browsers/zombie');
|
||||
|
||||
const args = process.argv.slice(2);
|
||||
|
||||
const url = args.shift() || '';
|
||||
|
||||
if ( !url ) {
|
||||
if (!url) {
|
||||
process.stderr.write('No URL specified\n');
|
||||
|
||||
process.exit(1);
|
||||
}
|
||||
|
||||
var options = {};
|
||||
var arg;
|
||||
const options = {};
|
||||
|
||||
while ( arg = args.shift() ) {
|
||||
var matches = /--([^=]+)=(.+)/.exec(arg);
|
||||
let arg;
|
||||
|
||||
if ( matches ) {
|
||||
var key = matches[1].replace(/-\w/g, matches => matches[1].toUpperCase());
|
||||
var value = matches[2];
|
||||
do {
|
||||
arg = args.shift();
|
||||
|
||||
const matches = /--([^=]+)=(.+)/.exec(arg);
|
||||
|
||||
if (matches) {
|
||||
const key = matches[1].replace(/-\w/g, _matches => _matches[1].toUpperCase());
|
||||
const value = matches[2];
|
||||
|
||||
options[key] = value;
|
||||
}
|
||||
}
|
||||
} while (arg);
|
||||
|
||||
const wappalyzer = new Wappalyzer(url, options);
|
||||
const wappalyzer = new Wappalyzer(Browser, url, options);
|
||||
|
||||
wappalyzer.analyze()
|
||||
.then(json => {
|
||||
process.stdout.write(JSON.stringify(json) + '\n')
|
||||
.then((json) => {
|
||||
process.stdout.write(`${JSON.stringify(json)}\n`);
|
||||
|
||||
process.exit(0);
|
||||
})
|
||||
.catch(error => {
|
||||
process.stderr.write(error + '\n')
|
||||
.catch((error) => {
|
||||
process.stderr.write(`${error}\n`);
|
||||
|
||||
process.exit(1);
|
||||
});
|
||||
|
@ -0,0 +1,767 @@
|
||||
{
|
||||
"name": "wappalyzer",
|
||||
"version": "5.7.1",
|
||||
"lockfileVersion": 1,
|
||||
"requires": true,
|
||||
"dependencies": {
|
||||
"@types/node": {
|
||||
"version": "10.5.7",
|
||||
"resolved": "https://registry.npmjs.org/@types/node/-/node-10.5.7.tgz",
|
||||
"integrity": "sha512-VkKcfuitP+Nc/TaTFH0B8qNmn+6NbI6crLkQonbedViVz7O2w8QV/GERPlkJ4bg42VGHiEWa31CoTOPs1q6z1w=="
|
||||
},
|
||||
"abab": {
|
||||
"version": "1.0.4",
|
||||
"resolved": "https://registry.npmjs.org/abab/-/abab-1.0.4.tgz",
|
||||
"integrity": "sha1-X6rZwsB/YN12dw9xzwJbYqY8/U4="
|
||||
},
|
||||
"acorn": {
|
||||
"version": "5.7.1",
|
||||
"resolved": "https://registry.npmjs.org/acorn/-/acorn-5.7.1.tgz",
|
||||
"integrity": "sha512-d+nbxBUGKg7Arpsvbnlq61mc12ek3EY8EQldM3GPAhWJ1UVxC6TDGbIvUMNU6obBX3i1+ptCIzV4vq0gFPEGVQ=="
|
||||
},
|
||||
"acorn-globals": {
|
||||
"version": "4.1.0",
|
||||
"resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-4.1.0.tgz",
|
||||
"integrity": "sha512-KjZwU26uG3u6eZcfGbTULzFcsoz6pegNKtHPksZPOUsiKo5bUmiBPa38FuHZ/Eun+XYh/JCCkS9AS3Lu4McQOQ==",
|
||||
"requires": {
|
||||
"acorn": "^5.0.0"
|
||||
}
|
||||
},
|
||||
"ajv": {
|
||||
"version": "5.5.2",
|
||||
"resolved": "https://registry.npmjs.org/ajv/-/ajv-5.5.2.tgz",
|
||||
"integrity": "sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU=",
|
||||
"requires": {
|
||||
"co": "^4.6.0",
|
||||
"fast-deep-equal": "^1.0.0",
|
||||
"fast-json-stable-stringify": "^2.0.0",
|
||||
"json-schema-traverse": "^0.3.0"
|
||||
}
|
||||
},
|
||||
"array-equal": {
|
||||
"version": "1.0.0",
|
||||
"resolved": "https://registry.npmjs.org/array-equal/-/array-equal-1.0.0.tgz",
|
||||
"integrity": "sha1-jCpe8kcv2ep0KwTHenUJO6J1fJM="
|
||||
},
|
||||
"asn1": {
|
||||
"version": "0.2.3",
|
||||
"resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.3.tgz",
|
||||
"integrity": "sha1-2sh4dxPJlmhJ/IGAd36+nB3fO4Y="
|
||||
},
|
||||
"assert-plus": {
|
||||
"version": "1.0.0",
|
||||
"resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz",
|
||||
"integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU="
|
||||
},
|
||||
"async-limiter": {
|
||||
"version": "1.0.0",
|
||||
"resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.0.tgz",
|
||||
"integrity": "sha512-jp/uFnooOiO+L211eZOoSyzpOITMXx1rBITauYykG3BRYPu8h0UcxsPNB04RR5vo4Tyz3+ay17tR6JVf9qzYWg=="
|
||||
},
|
||||
"asynckit": {
|
||||
"version": "0.4.0",
|
||||
"resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz",
|
||||
"integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k="
|
||||
},
|
||||
"aws-sign2": {
|
||||
"version": "0.7.0",
|
||||
"resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz",
|
||||
"integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg="
|
||||
},
|
||||
"aws4": {
|
||||
"version": "1.7.0",
|
||||
"resolved": "https://registry.npmjs.org/aws4/-/aws4-1.7.0.tgz",
|
||||
"integrity": "sha512-32NDda82rhwD9/JBCCkB+MRYDp0oSvlo2IL6rQWA10PQi7tDUM3eqMSltXmY+Oyl/7N3P3qNtAlv7X0d9bI28w=="
|
||||
},
|
||||
"babel-runtime": {
|
||||
"version": "6.26.0",
|
||||
"resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz",
|
||||
"integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=",
|
||||
"requires": {
|
||||
"core-js": "^2.4.0",
|
||||
"regenerator-runtime": "^0.11.0"
|
||||
}
|
||||
},
|
||||
"bcrypt-pbkdf": {
|
||||
"version": "1.0.2",
|
||||
"resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz",
|
||||
"integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=",
|
||||
"optional": true,
|
||||
"requires": {
|
||||
"tweetnacl": "^0.14.3"
|
||||
}
|
||||
},
|
||||
"bluebird": {
|
||||
"version": "3.5.1",
|
||||
"resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.1.tgz",
|
||||
"integrity": "sha512-MKiLiV+I1AA596t9w1sQJ8jkiSr5+ZKi0WKrYGUn6d1Fx+Ij4tIj+m2WMQSGczs5jZVxV339chE8iwk6F64wjA=="
|
||||
},
|
||||
"browser-process-hrtime": {
|
||||
"version": "0.1.2",
|
||||
"resolved": "https://registry.npmjs.org/browser-process-hrtime/-/browser-process-hrtime-0.1.2.tgz",
|
||||
"integrity": "sha1-Ql1opY00R/AqBKqJQYf86K+Le44="
|
||||
},
|
||||
"caseless": {
|
||||
"version": "0.12.0",
|
||||
"resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz",
|
||||
"integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw="
|
||||
},
|
||||
"co": {
|
||||
"version": "4.6.0",
|
||||
"resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz",
|
||||
"integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ="
|
||||
},
|
||||
"combined-stream": {
|
||||
"version": "1.0.6",
|
||||
"resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.6.tgz",
|
||||
"integrity": "sha1-cj599ugBrFYTETp+RFqbactjKBg=",
|
||||
"requires": {
|
||||
"delayed-stream": "~1.0.0"
|
||||
}
|
||||
},
|
||||
"content-type-parser": {
|
||||
"version": "1.0.2",
|
||||
"resolved": "https://registry.npmjs.org/content-type-parser/-/content-type-parser-1.0.2.tgz",
|
||||
"integrity": "sha512-lM4l4CnMEwOLHAHr/P6MEZwZFPJFtAAKgL6pogbXmVZggIqXhdB6RbBtPOTsw2FcXwYhehRGERJmRrjOiIB8pQ=="
|
||||
},
|
||||
"core-js": {
|
||||
"version": "2.5.7",
|
||||
"resolved": "https://registry.npmjs.org/core-js/-/core-js-2.5.7.tgz",
|
||||
"integrity": "sha512-RszJCAxg/PP6uzXVXL6BsxSXx/B05oJAQ2vkJRjyjrEcNVycaqOmNb5OTxZPE3xa5gwZduqza6L9JOCenh/Ecw=="
|
||||
},
|
||||
"core-util-is": {
|
||||
"version": "1.0.2",
|
||||
"resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz",
|
||||
"integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac="
|
||||
},
|
||||
"cssom": {
|
||||
"version": "0.3.3",
|
||||
"resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.3.tgz",
|
||||
"integrity": "sha512-pjE/I/NSp3iyeoxXN5QaoJpgzYUMj2dJHx9OSufoTliJLDx+kuOQaMCJW8OwvrKJswhXUHnHN6eUmUSETN0msg=="
|
||||
},
|
||||
"cssstyle": {
|
||||
"version": "0.2.37",
|
||||
"resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-0.2.37.tgz",
|
||||
"integrity": "sha1-VBCXI0yyUTyDzu06zdwn/yeYfVQ=",
|
||||
"requires": {
|
||||
"cssom": "0.3.x"
|
||||
}
|
||||
},
|
||||
"dashdash": {
|
||||
"version": "1.14.1",
|
||||
"resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz",
|
||||
"integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=",
|
||||
"requires": {
|
||||
"assert-plus": "^1.0.0"
|
||||
}
|
||||
},
|
||||
"debug": {
|
||||
"version": "3.1.0",
|
||||
"resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz",
|
||||
"integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==",
|
||||
"requires": {
|
||||
"ms": "2.0.0"
|
||||
},
|
||||
"dependencies": {
|
||||
"ms": {
|
||||
"version": "2.0.0",
|
||||
"resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
|
||||
"integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g="
|
||||
}
|
||||
}
|
||||
},
|
||||
"deep-is": {
|
||||
"version": "0.1.3",
|
||||
"resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz",
|
||||
"integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ="
|
||||
},
|
||||
"delayed-stream": {
|
||||
"version": "1.0.0",
|
||||
"resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
|
||||
"integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk="
|
||||
},
|
||||
"domexception": {
|
||||
"version": "1.0.1",
|
||||
"resolved": "https://registry.npmjs.org/domexception/-/domexception-1.0.1.tgz",
|
||||
"integrity": "sha512-raigMkn7CJNNo6Ihro1fzG7wr3fHuYVytzquZKX5n0yizGsTcYgzdIUwj1X9pK0VvjeihV+XiclP+DjwbsSKug==",
|
||||
"requires": {
|
||||
"webidl-conversions": "^4.0.2"
|
||||
}
|
||||
},
|
||||
"ecc-jsbn": {
|
||||
"version": "0.1.1",
|
||||
"resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.1.tgz",
|
||||
"integrity": "sha1-D8c6ntXw1Tw4GTOYUj735UN3dQU=",
|
||||
"optional": true,
|
||||
"requires": {
|
||||
"jsbn": "~0.1.0"
|
||||
}
|
||||
},
|
||||
"escodegen": {
|
||||
"version": "1.10.0",
|
||||
"resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.10.0.tgz",
|
||||
"integrity": "sha512-fjUOf8johsv23WuIKdNQU4P9t9jhQ4Qzx6pC2uW890OloK3Zs1ZAoCNpg/2larNF501jLl3UNy0kIRcF6VI22g==",
|
||||
"requires": {
|
||||
"esprima": "^3.1.3",
|
||||
"estraverse": "^4.2.0",
|
||||
"esutils": "^2.0.2",
|
||||
"optionator": "^0.8.1",
|
||||
"source-map": "~0.6.1"
|
||||
}
|
||||
},
|
||||
"esprima": {
|
||||
"version": "3.1.3",
|
||||
"resolved": "https://registry.npmjs.org/esprima/-/esprima-3.1.3.tgz",
|
||||
"integrity": "sha1-/cpRzuYTOJXjyI1TXOSdv/YqRjM="
|
||||
},
|
||||
"estraverse": {
|
||||
"version": "4.2.0",
|
||||
"resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.2.0.tgz",
|
||||
"integrity": "sha1-De4/7TH81GlhjOc0IJn8GvoL2xM="
|
||||
},
|
||||
"esutils": {
|
||||
"version": "2.0.2",
|
||||
"resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz",
|
||||
"integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs="
|
||||
},
|
||||
"eventsource": {
|
||||
"version": "1.0.5",
|
||||
"resolved": "https://registry.npmjs.org/eventsource/-/eventsource-1.0.5.tgz",
|
||||
"integrity": "sha512-IzjLaND9GBK3+fBPhmvG/Yq3FhSDGHnucJCDWhNsneLlN+HX5jeaSpl3Folr2PipGmyUsd/T2Vrua+s6I2aTgQ==",
|
||||
"requires": {
|
||||
"original": "^1.0.0"
|
||||
}
|
||||
},
|
||||
"extend": {
|
||||
"version": "3.0.1",
|
||||
"resolved": "https://registry.npmjs.org/extend/-/extend-3.0.1.tgz",
|
||||
"integrity": "sha1-p1Xqe8Gt/MWjHOfnYtuq3F5jZEQ="
|
||||
},
|
||||
"extsprintf": {
|
||||
"version": "1.3.0",
|
||||
"resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz",
|
||||
"integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU="
|
||||
},
|
||||
"fast-deep-equal": {
|
||||
"version": "1.1.0",
|
||||
"resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-1.1.0.tgz",
|
||||
"integrity": "sha1-wFNHeBfIa1HaqFPIHgWbcz0CNhQ="
|
||||
},
|
||||
"fast-json-stable-stringify": {
|
||||
"version": "2.0.0",
|
||||
"resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz",
|
||||
"integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I="
|
||||
},
|
||||
"fast-levenshtein": {
|
||||
"version": "2.0.6",
|
||||
"resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz",
|
||||
"integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc="
|
||||
},
|
||||
"forever-agent": {
|
||||
"version": "0.6.1",
|
||||
"resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz",
|
||||
"integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE="
|
||||
},
|
||||
"form-data": {
|
||||
"version": "2.3.2",
|
||||
"resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.2.tgz",
|
||||
"integrity": "sha1-SXBJi+YEwgwAXU9cI67NIda0kJk=",
|
||||
"requires": {
|
||||
"asynckit": "^0.4.0",
|
||||
"combined-stream": "1.0.6",
|
||||
"mime-types": "^2.1.12"
|
||||
}
|
||||
},
|
||||
"getpass": {
|
||||
"version": "0.1.7",
|
||||
"resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz",
|
||||
"integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=",
|
||||
"requires": {
|
||||
"assert-plus": "^1.0.0"
|
||||
}
|
||||
},
|
||||
"har-schema": {
|
||||
"version": "2.0.0",
|
||||
"resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz",
|
||||
"integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI="
|
||||
},
|
||||
"har-validator": {
|
||||
"version": "5.0.3",
|
||||
"resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.0.3.tgz",
|
||||
"integrity": "sha1-ukAsJmGU8VlW7xXg/PJCmT9qff0=",
|
||||
"requires": {
|
||||
"ajv": "^5.1.0",
|
||||
"har-schema": "^2.0.0"
|
||||
}
|
||||
},
|
||||
"html-encoding-sniffer": {
|
||||
"version": "1.0.2",
|
||||
"resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-1.0.2.tgz",
|
||||
"integrity": "sha512-71lZziiDnsuabfdYiUeWdCVyKuqwWi23L8YeIgV9jSSZHCtb6wB1BKWooH7L3tn4/FuZJMVWyNaIDr4RGmaSYw==",
|
||||
"requires": {
|
||||
"whatwg-encoding": "^1.0.1"
|
||||
}
|
||||
},
|
||||
"http-signature": {
|
||||
"version": "1.2.0",
|
||||
"resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz",
|
||||
"integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=",
|
||||
"requires": {
|
||||
"assert-plus": "^1.0.0",
|
||||
"jsprim": "^1.2.2",
|
||||
"sshpk": "^1.7.0"
|
||||
}
|
||||
},
|
||||
"iconv-lite": {
|
||||
"version": "0.4.23",
|
||||
"resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.23.tgz",
|
||||
"integrity": "sha512-neyTUVFtahjf0mB3dZT77u+8O0QB89jFdnBkd5P1JgYPbPaia3gXXOVL2fq8VyU2gMMD7SaN7QukTB/pmXYvDA==",
|
||||
"requires": {
|
||||
"safer-buffer": ">= 2.1.2 < 3"
|
||||
}
|
||||
},
|
||||
"is-typedarray": {
|
||||
"version": "1.0.0",
|
||||
"resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz",
|
||||
"integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo="
|
||||
},
|
||||
"isstream": {
|
||||
"version": "0.1.2",
|
||||
"resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz",
|
||||
"integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo="
|
||||
},
|
||||
"jsbn": {
|
||||
"version": "0.1.1",
|
||||
"resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz",
|
||||
"integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=",
|
||||
"optional": true
|
||||
},
|
||||
"jsdom": {
|
||||
"version": "11.5.1",
|
||||
"resolved": "https://registry.npmjs.org/jsdom/-/jsdom-11.5.1.tgz",
|
||||
"integrity": "sha512-89ztIZ03aYK9f1uUrLXLsZndRge/JnZjzjpaN+lrse3coqz+8PR/dX4WLHpbF5fIKTXhDjFODOJw2328lPJ90g==",
|
||||
"requires": {
|
||||
"abab": "^1.0.3",
|
||||
"acorn": "^5.1.2",
|
||||
"acorn-globals": "^4.0.0",
|
||||
"array-equal": "^1.0.0",
|
||||
"browser-process-hrtime": "^0.1.2",
|
||||
"content-type-parser": "^1.0.1",
|
||||
"cssom": ">= 0.3.2 < 0.4.0",
|
||||
"cssstyle": ">= 0.2.37 < 0.3.0",
|
||||
"domexception": "^1.0.0",
|
||||
"escodegen": "^1.9.0",
|
||||
"html-encoding-sniffer": "^1.0.1",
|
||||
"left-pad": "^1.2.0",
|
||||
"nwmatcher": "^1.4.3",
|
||||
"parse5": "^3.0.2",
|
||||
"pn": "^1.0.0",
|
||||
"request": "^2.83.0",
|
||||
"request-promise-native": "^1.0.3",
|
||||
"sax": "^1.2.1",
|
||||
"symbol-tree": "^3.2.1",
|
||||
"tough-cookie": "^2.3.3",
|
||||
"webidl-conversions": "^4.0.2",
|
||||
"whatwg-encoding": "^1.0.1",
|
||||
"whatwg-url": "^6.3.0",
|
||||
"xml-name-validator": "^2.0.1"
|
||||
}
|
||||
},
|
||||
"json-schema": {
|
||||
"version": "0.2.3",
|
||||
"resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz",
|
||||
"integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM="
|
||||
},
|
||||
"json-schema-traverse": {
|
||||
"version": "0.3.1",
|
||||
"resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz",
|
||||
"integrity": "sha1-NJptRMU6Ud6JtAgFxdXlm0F9M0A="
|
||||
},
|
||||
"json-stringify-safe": {
|
||||
"version": "5.0.1",
|
||||
"resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz",
|
||||
"integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus="
|
||||
},
|
||||
"jsprim": {
|
||||
"version": "1.4.1",
|
||||
"resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz",
|
||||
"integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=",
|
||||
"requires": {
|
||||
"assert-plus": "1.0.0",
|
||||
"extsprintf": "1.3.0",
|
||||
"json-schema": "0.2.3",
|
||||
"verror": "1.10.0"
|
||||
}
|
||||
},
|
||||
"left-pad": {
|
||||
"version": "1.3.0",
|
||||
"resolved": "https://registry.npmjs.org/left-pad/-/left-pad-1.3.0.tgz",
|
||||
"integrity": "sha512-XI5MPzVNApjAyhQzphX8BkmKsKUxD4LdyK24iZeQGinBN9yTQT3bFlCBy/aVx2HrNcqQGsdot8ghrjyrvMCoEA=="
|
||||
},
|
||||
"levn": {
|
||||
"version": "0.3.0",
|
||||
"resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz",
|
||||
"integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=",
|
||||
"requires": {
|
||||
"prelude-ls": "~1.1.2",
|
||||
"type-check": "~0.3.2"
|
||||
}
|
||||
},
|
||||
"lodash": {
|
||||
"version": "4.17.10",
|
||||
"resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.10.tgz",
|
||||
"integrity": "sha512-UejweD1pDoXu+AD825lWwp4ZGtSwgnpZxb3JDViD7StjQz+Nb/6l093lx4OQ0foGWNRoc19mWy7BzL+UAK2iVg=="
|
||||
},
|
||||
"lodash.sortby": {
|
||||
"version": "4.7.0",
|
||||
"resolved": "https://registry.npmjs.org/lodash.sortby/-/lodash.sortby-4.7.0.tgz",
|
||||
"integrity": "sha1-7dFMgk4sycHgsKG0K7UhBRakJDg="
|
||||
},
|
||||
"mime": {
|
||||
"version": "2.3.1",
|
||||
"resolved": "https://registry.npmjs.org/mime/-/mime-2.3.1.tgz",
|
||||
"integrity": "sha512-OEUllcVoydBHGN1z84yfQDimn58pZNNNXgZlHXSboxMlFvgI6MXSWpWKpFRra7H1HxpVhHTkrghfRW49k6yjeg=="
|
||||
},
|
||||
"mime-db": {
|
||||
"version": "1.33.0",
|
||||
"resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.33.0.tgz",
|
||||
"integrity": "sha512-BHJ/EKruNIqJf/QahvxwQZXKygOQ256myeN/Ew+THcAa5q+PjyTTMMeNQC4DZw5AwfvelsUrA6B67NKMqXDbzQ=="
|
||||
},
|
||||
"mime-types": {
|
||||
"version": "2.1.18",
|
||||
"resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.18.tgz",
|
||||
"integrity": "sha512-lc/aahn+t4/SWV/qcmumYjymLsWfN3ELhpmVuUFjgsORruuZPVSwAQryq+HHGvO/SI2KVX26bx+En+zhM8g8hQ==",
|
||||
"requires": {
|
||||
"mime-db": "~1.33.0"
|
||||
}
|
||||
},
|
||||
"ms": {
|
||||
"version": "2.1.1",
|
||||
"resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz",
|
||||
"integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg=="
|
||||
},
|
||||
"nwmatcher": {
|
||||
"version": "1.4.4",
|
||||
"resolved": "https://registry.npmjs.org/nwmatcher/-/nwmatcher-1.4.4.tgz",
|
||||
"integrity": "sha512-3iuY4N5dhgMpCUrOVnuAdGrgxVqV2cJpM+XNccjR2DKOB1RUP0aA+wGXEiNziG/UKboFyGBIoKOaNlJxx8bciQ=="
|
||||
},
|
||||
"oauth-sign": {
|
||||
"version": "0.8.2",
|
||||
"resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.8.2.tgz",
|
||||
"integrity": "sha1-Rqarfwrq2N6unsBWV4C31O/rnUM="
|
||||
},
|
||||
"optionator": {
|
||||
"version": "0.8.2",
|
||||
"resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.2.tgz",
|
||||
"integrity": "sha1-NkxeQJ0/TWMB1sC0wFu6UBgK62Q=",
|
||||
"requires": {
|
||||
"deep-is": "~0.1.3",
|
||||
"fast-levenshtein": "~2.0.4",
|
||||
"levn": "~0.3.0",
|
||||
"prelude-ls": "~1.1.2",
|
||||
"type-check": "~0.3.2",
|
||||
"wordwrap": "~1.0.0"
|
||||
}
|
||||
},
|
||||
"original": {
|
||||
"version": "1.0.1",
|
||||
"resolved": "https://registry.npmjs.org/original/-/original-1.0.1.tgz",
|
||||
"integrity": "sha512-IEvtB5vM5ULvwnqMxWBLxkS13JIEXbakizMSo3yoPNPCIWzg8TG3Usn/UhXoZFM/m+FuEA20KdzPSFq/0rS+UA==",
|
||||
"requires": {
|
||||
"url-parse": "~1.4.0"
|
||||
}
|
||||
},
|
||||
"parse5": {
|
||||
"version": "3.0.3",
|
||||
"resolved": "https://registry.npmjs.org/parse5/-/parse5-3.0.3.tgz",
|
||||
"integrity": "sha512-rgO9Zg5LLLkfJF9E6CCmXlSE4UVceloys8JrFqCcHloC3usd/kJCyPDwH2SOlzix2j3xaP9sUX3e8+kvkuleAA==",
|
||||
"requires": {
|
||||
"@types/node": "*"
|
||||
}
|
||||
},
|
||||
"performance-now": {
|
||||
"version": "2.1.0",
|
||||
"resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz",
|
||||
"integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns="
|
||||
},
|
||||
"pn": {
|
||||
"version": "1.1.0",
|
||||
"resolved": "https://registry.npmjs.org/pn/-/pn-1.1.0.tgz",
|
||||
"integrity": "sha512-2qHaIQr2VLRFoxe2nASzsV6ef4yOOH+Fi9FBOVH6cqeSgUnoyySPZkxzLuzd+RYOQTRpROA0ztTMqxROKSb/nA=="
|
||||
},
|
||||
"prelude-ls": {
|
||||
"version": "1.1.2",
|
||||
"resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz",
|
||||
"integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ="
|
||||
},
|
||||
"psl": {
|
||||
"version": "1.1.28",
|
||||
"resolved": "https://registry.npmjs.org/psl/-/psl-1.1.28.tgz",
|
||||
"integrity": "sha512-+AqO1Ae+N/4r7Rvchrdm432afjT9hqJRyBN3DQv9At0tPz4hIFSGKbq64fN9dVoCow4oggIIax5/iONx0r9hZw=="
|
||||
},
|
||||
"punycode": {
|
||||
"version": "1.4.1",
|
||||
"resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz",
|
||||
"integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4="
|
||||
},
|
||||
"qs": {
|
||||
"version": "6.5.2",
|
||||
"resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz",
|
||||
"integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA=="
|
||||
},
|
||||
"querystringify": {
|
||||
"version": "2.0.0",
|
||||
"resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.0.0.tgz",
|
||||
"integrity": "sha512-eTPo5t/4bgaMNZxyjWx6N2a6AuE0mq51KWvpc7nU/MAqixcI6v6KrGUKES0HaomdnolQBBXU/++X6/QQ9KL4tw=="
|
||||
},
|
||||
"regenerator-runtime": {
|
||||
"version": "0.11.1",
|
||||
"resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz",
|
||||
"integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg=="
|
||||
},
|
||||
"request": {
|
||||
"version": "2.87.0",
|
||||
"resolved": "https://registry.npmjs.org/request/-/request-2.87.0.tgz",
|
||||
"integrity": "sha512-fcogkm7Az5bsS6Sl0sibkbhcKsnyon/jV1kF3ajGmF0c8HrttdKTPRT9hieOaQHA5HEq6r8OyWOo/o781C1tNw==",
|
||||
"requires": {
|
||||
"aws-sign2": "~0.7.0",
|
||||
"aws4": "^1.6.0",
|
||||
"caseless": "~0.12.0",
|
||||
"combined-stream": "~1.0.5",
|
||||
"extend": "~3.0.1",
|
||||
"forever-agent": "~0.6.1",
|
||||
"form-data": "~2.3.1",
|
||||
"har-validator": "~5.0.3",
|
||||
"http-signature": "~1.2.0",
|
||||
"is-typedarray": "~1.0.0",
|
||||
"isstream": "~0.1.2",
|
||||
"json-stringify-safe": "~5.0.1",
|
||||
"mime-types": "~2.1.17",
|
||||
"oauth-sign": "~0.8.2",
|
||||
"performance-now": "^2.1.0",
|
||||
"qs": "~6.5.1",
|
||||
"safe-buffer": "^5.1.1",
|
||||
"tough-cookie": "~2.3.3",
|
||||
"tunnel-agent": "^0.6.0",
|
||||
"uuid": "^3.1.0"
|
||||
},
|
||||
"dependencies": {
|
||||
"tough-cookie": {
|
||||
"version": "2.3.4",
|
||||
"resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.3.4.tgz",
|
||||
"integrity": "sha512-TZ6TTfI5NtZnuyy/Kecv+CnoROnyXn2DN97LontgQpCwsX2XyLYCC0ENhYkehSOwAp8rTQKc/NUIF7BkQ5rKLA==",
|
||||
"requires": {
|
||||
"punycode": "^1.4.1"
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"request-promise-core": {
|
||||
"version": "1.1.1",
|
||||
"resolved": "https://registry.npmjs.org/request-promise-core/-/request-promise-core-1.1.1.tgz",
|
||||
"integrity": "sha1-Pu4AssWqgyOc+wTFcA2jb4HNCLY=",
|
||||
"requires": {
|
||||
"lodash": "^4.13.1"
|
||||
}
|
||||
},
|
||||
"request-promise-native": {
|
||||
"version": "1.0.5",
|
||||
"resolved": "https://registry.npmjs.org/request-promise-native/-/request-promise-native-1.0.5.tgz",
|
||||
"integrity": "sha1-UoF3D2jgyXGeUWP9P6tIIhX0/aU=",
|
||||
"requires": {
|
||||
"request-promise-core": "1.1.1",
|
||||
"stealthy-require": "^1.1.0",
|
||||
"tough-cookie": ">=2.3.3"
|
||||
}
|
||||
},
|
||||
"requires-port": {
|
||||
"version": "1.0.0",
|
||||
"resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz",
|
||||
"integrity": "sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8="
|
||||
},
|
||||
"safe-buffer": {
|
||||
"version": "5.1.2",
|
||||
"resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
|
||||
"integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g=="
|
||||
},
|
||||
"safer-buffer": {
|
||||
"version": "2.1.2",
|
||||
"resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
|
||||
"integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg=="
|
||||
},
|
||||
"sax": {
|
||||
"version": "1.2.4",
|
||||
"resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz",
|
||||
"integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw=="
|
||||
},
|
||||
"source-map": {
|
||||
"version": "0.6.1",
|
||||
"resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
|
||||
"integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
|
||||
"optional": true
|
||||
},
|
||||
"sshpk": {
|
||||
"version": "1.14.2",
|
||||
"resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.14.2.tgz",
|
||||
"integrity": "sha1-xvxhZIo9nE52T9P8306hBeSSupg=",
|
||||
"requires": {
|
||||
"asn1": "~0.2.3",
|
||||
"assert-plus": "^1.0.0",
|
||||
"bcrypt-pbkdf": "^1.0.0",
|
||||
"dashdash": "^1.12.0",
|
||||
"ecc-jsbn": "~0.1.1",
|
||||
"getpass": "^0.1.1",
|
||||
"jsbn": "~0.1.0",
|
||||
"safer-buffer": "^2.0.2",
|
||||
"tweetnacl": "~0.14.0"
|
||||
}
|
||||
},
|
||||
"stealthy-require": {
|
||||
"version": "1.1.1",
|
||||
"resolved": "https://registry.npmjs.org/stealthy-require/-/stealthy-require-1.1.1.tgz",
|
||||
"integrity": "sha1-NbCYdbT/SfJqd35QmzCQoyJr8ks="
|
||||
},
|
||||
"symbol-tree": {
|
||||
"version": "3.2.2",
|
||||
"resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.2.tgz",
|
||||
"integrity": "sha1-rifbOPZgp64uHDt9G8KQgZuFGeY="
|
||||
},
|
||||
"tough-cookie": {
|
||||
"version": "2.4.3",
|
||||
"resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.4.3.tgz",
|
||||
"integrity": "sha512-Q5srk/4vDM54WJsJio3XNn6K2sCG+CQ8G5Wz6bZhRZoAe/+TxjWB/GlFAnYEbkYVlON9FMk/fE3h2RLpPXo4lQ==",
|
||||
"requires": {
|
||||
"psl": "^1.1.24",
|
||||
"punycode": "^1.4.1"
|
||||
}
|
||||
},
|
||||
"tr46": {
|
||||
"version": "1.0.1",
|
||||
"resolved": "https://registry.npmjs.org/tr46/-/tr46-1.0.1.tgz",
|
||||
"integrity": "sha1-qLE/1r/SSJUZZ0zN5VujaTtwbQk=",
|
||||
"requires": {
|
||||
"punycode": "^2.1.0"
|
||||
},
|
||||
"dependencies": {
|
||||
"punycode": {
|
||||
"version": "2.1.1",
|
||||
"resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz",
|
||||
"integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A=="
|
||||
}
|
||||
}
|
||||
},
|
||||
"tunnel-agent": {
|
||||
"version": "0.6.0",
|
||||
"resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz",
|
||||
"integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=",
|
||||
"requires": {
|
||||
"safe-buffer": "^5.0.1"
|
||||
}
|
||||
},
|
||||
"tweetnacl": {
|
||||
"version": "0.14.5",
|
||||
"resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz",
|
||||
"integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=",
|
||||
"optional": true
|
||||
},
|
||||
"type-check": {
|
||||
"version": "0.3.2",
|
||||
"resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz",
|
||||
"integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=",
|
||||
"requires": {
|
||||
"prelude-ls": "~1.1.2"
|
||||
}
|
||||
},
|
||||
"url-parse": {
|
||||
"version": "1.4.3",
|
||||
"resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.4.3.tgz",
|
||||
"integrity": "sha512-rh+KuAW36YKo0vClhQzLLveoj8FwPJNu65xLb7Mrt+eZht0IPT0IXgSv8gcMegZ6NvjJUALf6Mf25POlMwD1Fw==",
|
||||
"requires": {
|
||||
"querystringify": "^2.0.0",
|
||||
"requires-port": "^1.0.0"
|
||||
}
|
||||
},
|
||||
"uuid": {
|
||||
"version": "3.3.2",
|
||||
"resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz",
|
||||
"integrity": "sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA=="
|
||||
},
|
||||
"verror": {
|
||||
"version": "1.10.0",
|
||||
"resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz",
|
||||
"integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=",
|
||||
"requires": {
|
||||
"assert-plus": "^1.0.0",
|
||||
"core-util-is": "1.0.2",
|
||||
"extsprintf": "^1.2.0"
|
||||
}
|
||||
},
|
||||
"webidl-conversions": {
|
||||
"version": "4.0.2",
|
||||
"resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-4.0.2.tgz",
|
||||
"integrity": "sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg=="
|
||||
},
|
||||
"whatwg-encoding": {
|
||||
"version": "1.0.3",
|
||||
"resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-1.0.3.tgz",
|
||||
"integrity": "sha512-jLBwwKUhi8WtBfsMQlL4bUUcT8sMkAtQinscJAe/M4KHCkHuUJAF6vuB0tueNIw4c8ziO6AkRmgY+jL3a0iiPw==",
|
||||
"requires": {
|
||||
"iconv-lite": "0.4.19"
|
||||
},
|
||||
"dependencies": {
|
||||
"iconv-lite": {
|
||||
"version": "0.4.19",
|
||||
"resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.19.tgz",
|
||||
"integrity": "sha512-oTZqweIP51xaGPI4uPa56/Pri/480R+mo7SeU+YETByQNhDG55ycFyNLIgta9vXhILrxXDmF7ZGhqZIcuN0gJQ=="
|
||||
}
|
||||
}
|
||||
},
|
||||
"whatwg-url": {
|
||||
"version": "6.5.0",
|
||||
"resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-6.5.0.tgz",
|
||||
"integrity": "sha512-rhRZRqx/TLJQWUpQ6bmrt2UV4f0HCQ463yQuONJqC6fO2VoEb1pTYddbe59SkYq87aoM5A3bdhMZiUiVws+fzQ==",
|
||||
"requires": {
|
||||
"lodash.sortby": "^4.7.0",
|
||||
"tr46": "^1.0.1",
|
||||
"webidl-conversions": "^4.0.2"
|
||||
}
|
||||
},
|
||||
"wordwrap": {
|
||||
"version": "1.0.0",
|
||||
"resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz",
|
||||
"integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus="
|
||||
},
|
||||
"ws": {
|
||||
"version": "5.2.2",
|
||||
"resolved": "https://registry.npmjs.org/ws/-/ws-5.2.2.tgz",
|
||||
"integrity": "sha512-jaHFD6PFv6UgoIVda6qZllptQsMlDEJkTQcybzzXDYM1XO9Y8em691FGMPmM46WGyLU4z9KMgQN+qrux/nhlHA==",
|
||||
"requires": {
|
||||
"async-limiter": "~1.0.0"
|
||||
}
|
||||
},
|
||||
"xml-name-validator": {
|
||||
"version": "2.0.1",
|
||||
"resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-2.0.1.tgz",
|
||||
"integrity": "sha1-TYuPHszTQZqjYgYb7O9RXh5VljU="
|
||||
},
|
||||
"zombie": {
|
||||
"version": "6.1.2",
|
||||
"resolved": "https://registry.npmjs.org/zombie/-/zombie-6.1.2.tgz",
|
||||
"integrity": "sha512-p2KZ1ThrORbOUpEjf9zV4gpcyzwAu1zDrrKF7O2PmeYIsAdh7PjUoKaqJnxLj9FDOyUGPAPxZCrYf54pQM9y7w==",
|
||||
"requires": {
|
||||
"babel-runtime": "6.26.0",
|
||||
"bluebird": "^3.5.1",
|
||||
"debug": "^3.1.0",
|
||||
"eventsource": "^1.0.5",
|
||||
"iconv-lite": "^0.4.21",
|
||||
"jsdom": "11.5.1",
|
||||
"lodash": "^4.17.10",
|
||||
"mime": "^2.3.1",
|
||||
"ms": "^2.1.1",
|
||||
"request": "^2.85.0",
|
||||
"tough-cookie": "^2.3.4",
|
||||
"ws": "^5.1.1"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
@ -1,686 +0,0 @@
|
||||
{
|
||||
"name": "wappalyzer",
|
||||
"version": "5.3.1",
|
||||
"lockfileVersion": 1,
|
||||
"requires": true,
|
||||
"dependencies": {
|
||||
"abab": {
|
||||
"version": "1.0.4",
|
||||
"resolved": "https://registry.npmjs.org/abab/-/abab-1.0.4.tgz",
|
||||
"integrity": "sha1-X6rZwsB/YN12dw9xzwJbYqY8/U4="
|
||||
},
|
||||
"acorn": {
|
||||
"version": "2.7.0",
|
||||
"resolved": "https://registry.npmjs.org/acorn/-/acorn-2.7.0.tgz",
|
||||
"integrity": "sha1-q259nYhqrKiwhbwzEreaGYQz8Oc="
|
||||
},
|
||||
"acorn-globals": {
|
||||
"version": "1.0.9",
|
||||
"resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-1.0.9.tgz",
|
||||
"integrity": "sha1-VbtemGkVB7dFedBRNBMhfDgMVM8=",
|
||||
"requires": {
|
||||
"acorn": "2.7.0"
|
||||
}
|
||||
},
|
||||
"ajv": {
|
||||
"version": "5.5.2",
|
||||
"resolved": "https://registry.npmjs.org/ajv/-/ajv-5.5.2.tgz",
|
||||
"integrity": "sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU=",
|
||||
"requires": {
|
||||
"co": "4.6.0",
|
||||
"fast-deep-equal": "1.0.0",
|
||||
"fast-json-stable-stringify": "2.0.0",
|
||||
"json-schema-traverse": "0.3.1"
|
||||
}
|
||||
},
|
||||
"asn1": {
|
||||
"version": "0.2.3",
|
||||
"resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.3.tgz",
|
||||
"integrity": "sha1-2sh4dxPJlmhJ/IGAd36+nB3fO4Y="
|
||||
},
|
||||
"assert-plus": {
|
||||
"version": "1.0.0",
|
||||
"resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz",
|
||||
"integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU="
|
||||
},
|
||||
"asynckit": {
|
||||
"version": "0.4.0",
|
||||
"resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz",
|
||||
"integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k="
|
||||
},
|
||||
"aws-sign2": {
|
||||
"version": "0.7.0",
|
||||
"resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz",
|
||||
"integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg="
|
||||
},
|
||||
"aws4": {
|
||||
"version": "1.6.0",
|
||||
"resolved": "https://registry.npmjs.org/aws4/-/aws4-1.6.0.tgz",
|
||||
"integrity": "sha1-g+9cqGCysy5KDe7e6MdxudtXRx4="
|
||||
},
|
||||
"babel-runtime": {
|
||||
"version": "5.8.29",
|
||||
"resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-5.8.29.tgz",
|
||||
"integrity": "sha1-SiBSy8/1MXiNOp1rA81/RIKF+CU=",
|
||||
"requires": {
|
||||
"core-js": "1.2.7"
|
||||
}
|
||||
},
|
||||
"bcrypt-pbkdf": {
|
||||
"version": "1.0.1",
|
||||
"resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.1.tgz",
|
||||
"integrity": "sha1-Y7xdy2EzG5K8Bf1SiVPDNGKgb40=",
|
||||
"optional": true,
|
||||
"requires": {
|
||||
"tweetnacl": "0.14.5"
|
||||
}
|
||||
},
|
||||
"bluebird": {
|
||||
"version": "3.5.1",
|
||||
"resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.1.tgz",
|
||||
"integrity": "sha512-MKiLiV+I1AA596t9w1sQJ8jkiSr5+ZKi0WKrYGUn6d1Fx+Ij4tIj+m2WMQSGczs5jZVxV339chE8iwk6F64wjA=="
|
||||
},
|
||||
"boom": {
|
||||
"version": "4.3.1",
|
||||
"resolved": "https://registry.npmjs.org/boom/-/boom-4.3.1.tgz",
|
||||
"integrity": "sha1-T4owBctKfjiJ90kDD9JbluAdLjE=",
|
||||
"requires": {
|
||||
"hoek": "4.2.0"
|
||||
}
|
||||
},
|
||||
"caseless": {
|
||||
"version": "0.12.0",
|
||||
"resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz",
|
||||
"integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw="
|
||||
},
|
||||
"co": {
|
||||
"version": "4.6.0",
|
||||
"resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz",
|
||||
"integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ="
|
||||
},
|
||||
"combined-stream": {
|
||||
"version": "1.0.5",
|
||||
"resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.5.tgz",
|
||||
"integrity": "sha1-k4NwpXtKUd6ix3wV1cX9+JUWQAk=",
|
||||
"requires": {
|
||||
"delayed-stream": "1.0.0"
|
||||
}
|
||||
},
|
||||
"core-js": {
|
||||
"version": "1.2.7",
|
||||
"resolved": "https://registry.npmjs.org/core-js/-/core-js-1.2.7.tgz",
|
||||
"integrity": "sha1-ZSKUwUZR2yj6k70tX/KYOk8IxjY="
|
||||
},
|
||||
"core-util-is": {
|
||||
"version": "1.0.2",
|
||||
"resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz",
|
||||
"integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac="
|
||||
},
|
||||
"cryptiles": {
|
||||
"version": "3.1.2",
|
||||
"resolved": "https://registry.npmjs.org/cryptiles/-/cryptiles-3.1.2.tgz",
|
||||
"integrity": "sha1-qJ+7Ig9c4l7FboxKqKT9e1sNKf4=",
|
||||
"requires": {
|
||||
"boom": "5.2.0"
|
||||
},
|
||||
"dependencies": {
|
||||
"boom": {
|
||||
"version": "5.2.0",
|
||||
"resolved": "https://registry.npmjs.org/boom/-/boom-5.2.0.tgz",
|
||||
"integrity": "sha512-Z5BTk6ZRe4tXXQlkqftmsAUANpXmuwlsF5Oov8ThoMbQRzdGTA1ngYRW160GexgOgjsFOKJz0LYhoNi+2AMBUw==",
|
||||
"requires": {
|
||||
"hoek": "4.2.0"
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"cssom": {
|
||||
"version": "0.3.2",
|
||||
"resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.2.tgz",
|
||||
"integrity": "sha1-uANhcMefB6kP8vFuIihAJ6JDhIs="
|
||||
},
|
||||
"cssstyle": {
|
||||
"version": "0.2.37",
|
||||
"resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-0.2.37.tgz",
|
||||
"integrity": "sha1-VBCXI0yyUTyDzu06zdwn/yeYfVQ=",
|
||||
"requires": {
|
||||
"cssom": "0.3.2"
|
||||
}
|
||||
},
|
||||
"dashdash": {
|
||||
"version": "1.14.1",
|
||||
"resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz",
|
||||
"integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=",
|
||||
"requires": {
|
||||
"assert-plus": "1.0.0"
|
||||
}
|
||||
},
|
||||
"debug": {
|
||||
"version": "2.6.9",
|
||||
"resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
|
||||
"integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
|
||||
"requires": {
|
||||
"ms": "2.0.0"
|
||||
}
|
||||
},
|
||||
"deep-is": {
|
||||
"version": "0.1.3",
|
||||
"resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz",
|
||||
"integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ="
|
||||
},
|
||||
"delayed-stream": {
|
||||
"version": "1.0.0",
|
||||
"resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
|
||||
"integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk="
|
||||
},
|
||||
"ecc-jsbn": {
|
||||
"version": "0.1.1",
|
||||
"resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.1.tgz",
|
||||
"integrity": "sha1-D8c6ntXw1Tw4GTOYUj735UN3dQU=",
|
||||
"optional": true,
|
||||
"requires": {
|
||||
"jsbn": "0.1.1"
|
||||
}
|
||||
},
|
||||
"escodegen": {
|
||||
"version": "1.9.0",
|
||||
"resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.9.0.tgz",
|
||||
"integrity": "sha512-v0MYvNQ32bzwoG2OSFzWAkuahDQHK92JBN0pTAALJ4RIxEZe766QJPDR8Hqy7XNUy5K3fnVL76OqYAdc4TZEIw==",
|
||||
"requires": {
|
||||
"esprima": "3.1.3",
|
||||
"estraverse": "4.2.0",
|
||||
"esutils": "2.0.2",
|
||||
"optionator": "0.8.2",
|
||||
"source-map": "0.5.7"
|
||||
}
|
||||
},
|
||||
"esprima": {
|
||||
"version": "3.1.3",
|
||||
"resolved": "https://registry.npmjs.org/esprima/-/esprima-3.1.3.tgz",
|
||||
"integrity": "sha1-/cpRzuYTOJXjyI1TXOSdv/YqRjM="
|
||||
},
|
||||
"estraverse": {
|
||||
"version": "4.2.0",
|
||||
"resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.2.0.tgz",
|
||||
"integrity": "sha1-De4/7TH81GlhjOc0IJn8GvoL2xM="
|
||||
},
|
||||
"esutils": {
|
||||
"version": "2.0.2",
|
||||
"resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz",
|
||||
"integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs="
|
||||
},
|
||||
"eventsource": {
|
||||
"version": "0.1.6",
|
||||
"resolved": "https://registry.npmjs.org/eventsource/-/eventsource-0.1.6.tgz",
|
||||
"integrity": "sha1-Cs7ehJ7X3RzMMsgRuxG5RNTykjI=",
|
||||
"requires": {
|
||||
"original": "1.0.0"
|
||||
}
|
||||
},
|
||||
"extend": {
|
||||
"version": "3.0.1",
|
||||
"resolved": "https://registry.npmjs.org/extend/-/extend-3.0.1.tgz",
|
||||
"integrity": "sha1-p1Xqe8Gt/MWjHOfnYtuq3F5jZEQ="
|
||||
},
|
||||
"extsprintf": {
|
||||
"version": "1.3.0",
|
||||
"resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz",
|
||||
"integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU="
|
||||
},
|
||||
"fast-deep-equal": {
|
||||
"version": "1.0.0",
|
||||
"resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-1.0.0.tgz",
|
||||
"integrity": "sha1-liVqO8l1WV6zbYLpkp0GDYk0Of8="
|
||||
},
|
||||
"fast-json-stable-stringify": {
|
||||
"version": "2.0.0",
|
||||
"resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz",
|
||||
"integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I="
|
||||
},
|
||||
"fast-levenshtein": {
|
||||
"version": "2.0.6",
|
||||
"resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz",
|
||||
"integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc="
|
||||
},
|
||||
"forever-agent": {
|
||||
"version": "0.6.1",
|
||||
"resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz",
|
||||
"integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE="
|
||||
},
|
||||
"form-data": {
|
||||
"version": "2.3.1",
|
||||
"resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.1.tgz",
|
||||
"integrity": "sha1-b7lPvXGIUwbXPRXMSX/kzE7NRL8=",
|
||||
"requires": {
|
||||
"asynckit": "0.4.0",
|
||||
"combined-stream": "1.0.5",
|
||||
"mime-types": "2.1.17"
|
||||
}
|
||||
},
|
||||
"getpass": {
|
||||
"version": "0.1.7",
|
||||
"resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz",
|
||||
"integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=",
|
||||
"requires": {
|
||||
"assert-plus": "1.0.0"
|
||||
}
|
||||
},
|
||||
"har-schema": {
|
||||
"version": "2.0.0",
|
||||
"resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz",
|
||||
"integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI="
|
||||
},
|
||||
"har-validator": {
|
||||
"version": "5.0.3",
|
||||
"resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.0.3.tgz",
|
||||
"integrity": "sha1-ukAsJmGU8VlW7xXg/PJCmT9qff0=",
|
||||
"requires": {
|
||||
"ajv": "5.5.2",
|
||||
"har-schema": "2.0.0"
|
||||
}
|
||||
},
|
||||
"hawk": {
|
||||
"version": "6.0.2",
|
||||
"resolved": "https://registry.npmjs.org/hawk/-/hawk-6.0.2.tgz",
|
||||
"integrity": "sha512-miowhl2+U7Qle4vdLqDdPt9m09K6yZhkLDTWGoUiUzrQCn+mHHSmfJgAyGaLRZbPmTqfFFjRV1QWCW0VWUJBbQ==",
|
||||
"requires": {
|
||||
"boom": "4.3.1",
|
||||
"cryptiles": "3.1.2",
|
||||
"hoek": "4.2.0",
|
||||
"sntp": "2.1.0"
|
||||
}
|
||||
},
|
||||
"hoek": {
|
||||
"version": "4.2.0",
|
||||
"resolved": "https://registry.npmjs.org/hoek/-/hoek-4.2.0.tgz",
|
||||
"integrity": "sha512-v0XCLxICi9nPfYrS9RL8HbYnXi9obYAeLbSP00BmnZwCK9+Ih9WOjoZ8YoHCoav2csqn4FOz4Orldsy2dmDwmQ=="
|
||||
},
|
||||
"http-signature": {
|
||||
"version": "1.2.0",
|
||||
"resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz",
|
||||
"integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=",
|
||||
"requires": {
|
||||
"assert-plus": "1.0.0",
|
||||
"jsprim": "1.4.1",
|
||||
"sshpk": "1.13.1"
|
||||
}
|
||||
},
|
||||
"iconv-lite": {
|
||||
"version": "0.4.19",
|
||||
"resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.19.tgz",
|
||||
"integrity": "sha512-oTZqweIP51xaGPI4uPa56/Pri/480R+mo7SeU+YETByQNhDG55ycFyNLIgta9vXhILrxXDmF7ZGhqZIcuN0gJQ=="
|
||||
},
|
||||
"is-typedarray": {
|
||||
"version": "1.0.0",
|
||||
"resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz",
|
||||
"integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo="
|
||||
},
|
||||
"isstream": {
|
||||
"version": "0.1.2",
|
||||
"resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz",
|
||||
"integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo="
|
||||
},
|
||||
"jsbn": {
|
||||
"version": "0.1.1",
|
||||
"resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz",
|
||||
"integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=",
|
||||
"optional": true
|
||||
},
|
||||
"jsdom": {
|
||||
"version": "7.2.2",
|
||||
"resolved": "https://registry.npmjs.org/jsdom/-/jsdom-7.2.2.tgz",
|
||||
"integrity": "sha1-QLQCdwwr2iNGkJa+6Rq2deOx/G4=",
|
||||
"requires": {
|
||||
"abab": "1.0.4",
|
||||
"acorn": "2.7.0",
|
||||
"acorn-globals": "1.0.9",
|
||||
"cssom": "0.3.2",
|
||||
"cssstyle": "0.2.37",
|
||||
"escodegen": "1.9.0",
|
||||
"nwmatcher": "1.4.3",
|
||||
"parse5": "1.5.1",
|
||||
"request": "2.83.0",
|
||||
"sax": "1.2.4",
|
||||
"symbol-tree": "3.2.2",
|
||||
"tough-cookie": "2.3.3",
|
||||
"webidl-conversions": "2.0.1",
|
||||
"whatwg-url-compat": "0.6.5",
|
||||
"xml-name-validator": "2.0.1"
|
||||
}
|
||||
},
|
||||
"json-schema": {
|
||||
"version": "0.2.3",
|
||||
"resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz",
|
||||
"integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM="
|
||||
},
|
||||
"json-schema-traverse": {
|
||||
"version": "0.3.1",
|
||||
"resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz",
|
||||
"integrity": "sha1-NJptRMU6Ud6JtAgFxdXlm0F9M0A="
|
||||
},
|
||||
"json-stringify-safe": {
|
||||
"version": "5.0.1",
|
||||
"resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz",
|
||||
"integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus="
|
||||
},
|
||||
"jsprim": {
|
||||
"version": "1.4.1",
|
||||
"resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz",
|
||||
"integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=",
|
||||
"requires": {
|
||||
"assert-plus": "1.0.0",
|
||||
"extsprintf": "1.3.0",
|
||||
"json-schema": "0.2.3",
|
||||
"verror": "1.10.0"
|
||||
}
|
||||
},
|
||||
"levn": {
|
||||
"version": "0.3.0",
|
||||
"resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz",
|
||||
"integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=",
|
||||
"requires": {
|
||||
"prelude-ls": "1.1.2",
|
||||
"type-check": "0.3.2"
|
||||
}
|
||||
},
|
||||
"lodash": {
|
||||
"version": "3.10.1",
|
||||
"resolved": "https://registry.npmjs.org/lodash/-/lodash-3.10.1.tgz",
|
||||
"integrity": "sha1-W/Rejkm6QYnhfUgnid/RW9FAt7Y="
|
||||
},
|
||||
"mime": {
|
||||
"version": "1.6.0",
|
||||
"resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz",
|
||||
"integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg=="
|
||||
},
|
||||
"mime-db": {
|
||||
"version": "1.30.0",
|
||||
"resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.30.0.tgz",
|
||||
"integrity": "sha1-dMZD2i3Z1qRTmZY0ZbJtXKfXHwE="
|
||||
},
|
||||
"mime-types": {
|
||||
"version": "2.1.17",
|
||||
"resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.17.tgz",
|
||||
"integrity": "sha1-Cdejk/A+mVp5+K+Fe3Cp4KsWVXo=",
|
||||
"requires": {
|
||||
"mime-db": "1.30.0"
|
||||
}
|
||||
},
|
||||
"ms": {
|
||||
"version": "2.0.0",
|
||||
"resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
|
||||
"integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g="
|
||||
},
|
||||
"nwmatcher": {
|
||||
"version": "1.4.3",
|
||||
"resolved": "https://registry.npmjs.org/nwmatcher/-/nwmatcher-1.4.3.tgz",
|
||||
"integrity": "sha512-IKdSTiDWCarf2JTS5e9e2+5tPZGdkRJ79XjYV0pzK8Q9BpsFyBq1RGKxzs7Q8UBushGw7m6TzVKz6fcY99iSWw=="
|
||||
},
|
||||
"oauth-sign": {
|
||||
"version": "0.8.2",
|
||||
"resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.8.2.tgz",
|
||||
"integrity": "sha1-Rqarfwrq2N6unsBWV4C31O/rnUM="
|
||||
},
|
||||
"optionator": {
|
||||
"version": "0.8.2",
|
||||
"resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.2.tgz",
|
||||
"integrity": "sha1-NkxeQJ0/TWMB1sC0wFu6UBgK62Q=",
|
||||
"requires": {
|
||||
"deep-is": "0.1.3",
|
||||
"fast-levenshtein": "2.0.6",
|
||||
"levn": "0.3.0",
|
||||
"prelude-ls": "1.1.2",
|
||||
"type-check": "0.3.2",
|
||||
"wordwrap": "1.0.0"
|
||||
}
|
||||
},
|
||||
"options": {
|
||||
"version": "0.0.6",
|
||||
"resolved": "https://registry.npmjs.org/options/-/options-0.0.6.tgz",
|
||||
"integrity": "sha1-7CLTEoBrtT5zF3Pnza788cZDEo8="
|
||||
},
|
||||
"original": {
|
||||
"version": "1.0.0",
|
||||
"resolved": "https://registry.npmjs.org/original/-/original-1.0.0.tgz",
|
||||
"integrity": "sha1-kUf5P6FpbQS+YeAb1QuurKZWvTs=",
|
||||
"requires": {
|
||||
"url-parse": "1.0.5"
|
||||
}
|
||||
},
|
||||
"parse5": {
|
||||
"version": "1.5.1",
|
||||
"resolved": "https://registry.npmjs.org/parse5/-/parse5-1.5.1.tgz",
|
||||
"integrity": "sha1-m387DeMr543CQBsXVzzK8Pb1nZQ="
|
||||
},
|
||||
"performance-now": {
|
||||
"version": "2.1.0",
|
||||
"resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz",
|
||||
"integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns="
|
||||
},
|
||||
"prelude-ls": {
|
||||
"version": "1.1.2",
|
||||
"resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz",
|
||||
"integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ="
|
||||
},
|
||||
"punycode": {
|
||||
"version": "1.4.1",
|
||||
"resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz",
|
||||
"integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4="
|
||||
},
|
||||
"qs": {
|
||||
"version": "6.5.1",
|
||||
"resolved": "https://registry.npmjs.org/qs/-/qs-6.5.1.tgz",
|
||||
"integrity": "sha512-eRzhrN1WSINYCDCbrz796z37LOe3m5tmW7RQf6oBntukAG1nmovJvhnwHHRMAfeoItc1m2Hk02WER2aQ/iqs+A=="
|
||||
},
|
||||
"querystringify": {
|
||||
"version": "0.0.4",
|
||||
"resolved": "https://registry.npmjs.org/querystringify/-/querystringify-0.0.4.tgz",
|
||||
"integrity": "sha1-DPf4T5Rj/wrlHExLFC2VvjdyTZw="
|
||||
},
|
||||
"request": {
|
||||
"version": "2.83.0",
|
||||
"resolved": "https://registry.npmjs.org/request/-/request-2.83.0.tgz",
|
||||
"integrity": "sha512-lR3gD69osqm6EYLk9wB/G1W/laGWjzH90t1vEa2xuxHD5KUrSzp9pUSfTm+YC5Nxt2T8nMPEvKlhbQayU7bgFw==",
|
||||
"requires": {
|
||||
"aws-sign2": "0.7.0",
|
||||
"aws4": "1.6.0",
|
||||
"caseless": "0.12.0",
|
||||
"combined-stream": "1.0.5",
|
||||
"extend": "3.0.1",
|
||||
"forever-agent": "0.6.1",
|
||||
"form-data": "2.3.1",
|
||||
"har-validator": "5.0.3",
|
||||
"hawk": "6.0.2",
|
||||
"http-signature": "1.2.0",
|
||||
"is-typedarray": "1.0.0",
|
||||
"isstream": "0.1.2",
|
||||
"json-stringify-safe": "5.0.1",
|
||||
"mime-types": "2.1.17",
|
||||
"oauth-sign": "0.8.2",
|
||||
"performance-now": "2.1.0",
|
||||
"qs": "6.5.1",
|
||||
"safe-buffer": "5.1.1",
|
||||
"stringstream": "0.0.5",
|
||||
"tough-cookie": "2.3.3",
|
||||
"tunnel-agent": "0.6.0",
|
||||
"uuid": "3.1.0"
|
||||
}
|
||||
},
|
||||
"requires-port": {
|
||||
"version": "1.0.0",
|
||||
"resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz",
|
||||
"integrity": "sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8="
|
||||
},
|
||||
"safe-buffer": {
|
||||
"version": "5.1.1",
|
||||
"resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz",
|
||||
"integrity": "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg=="
|
||||
},
|
||||
"sax": {
|
||||
"version": "1.2.4",
|
||||
"resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz",
|
||||
"integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw=="
|
||||
},
|
||||
"sntp": {
|
||||
"version": "2.1.0",
|
||||
"resolved": "https://registry.npmjs.org/sntp/-/sntp-2.1.0.tgz",
|
||||
"integrity": "sha512-FL1b58BDrqS3A11lJ0zEdnJ3UOKqVxawAkF3k7F0CVN7VQ34aZrV+G8BZ1WC9ZL7NyrwsW0oviwsWDgRuVYtJg==",
|
||||
"requires": {
|
||||
"hoek": "4.2.0"
|
||||
}
|
||||
},
|
||||
"source-map": {
|
||||
"version": "0.5.7",
|
||||
"resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
|
||||
"integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=",
|
||||
"optional": true
|
||||
},
|
||||
"sshpk": {
|
||||
"version": "1.13.1",
|
||||
"resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.13.1.tgz",
|
||||
"integrity": "sha1-US322mKHFEMW3EwY/hzx2UBzm+M=",
|
||||
"requires": {
|
||||
"asn1": "0.2.3",
|
||||
"assert-plus": "1.0.0",
|
||||
"bcrypt-pbkdf": "1.0.1",
|
||||
"dashdash": "1.14.1",
|
||||
"ecc-jsbn": "0.1.1",
|
||||
"getpass": "0.1.7",
|
||||
"jsbn": "0.1.1",
|
||||
"tweetnacl": "0.14.5"
|
||||
}
|
||||
},
|
||||
"stringstream": {
|
||||
"version": "0.0.5",
|
||||
"resolved": "https://registry.npmjs.org/stringstream/-/stringstream-0.0.5.tgz",
|
||||
"integrity": "sha1-TkhM1N5aC7vuGORjB3EKioFiGHg="
|
||||
},
|
||||
"symbol-tree": {
|
||||
"version": "3.2.2",
|
||||
"resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.2.tgz",
|
||||
"integrity": "sha1-rifbOPZgp64uHDt9G8KQgZuFGeY="
|
||||
},
|
||||
"tough-cookie": {
|
||||
"version": "2.3.3",
|
||||
"resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.3.3.tgz",
|
||||
"integrity": "sha1-C2GKVWW23qkL80JdBNVe3EdadWE=",
|
||||
"requires": {
|
||||
"punycode": "1.4.1"
|
||||
}
|
||||
},
|
||||
"tr46": {
|
||||
"version": "0.0.3",
|
||||
"resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz",
|
||||
"integrity": "sha1-gYT9NH2snNwYWZLzpmIuFLnZq2o="
|
||||
},
|
||||
"tunnel-agent": {
|
||||
"version": "0.6.0",
|
||||
"resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz",
|
||||
"integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=",
|
||||
"requires": {
|
||||
"safe-buffer": "5.1.1"
|
||||
}
|
||||
},
|
||||
"tweetnacl": {
|
||||
"version": "0.14.5",
|
||||
"resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz",
|
||||
"integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=",
|
||||
"optional": true
|
||||
},
|
||||
"type-check": {
|
||||
"version": "0.3.2",
|
||||
"resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz",
|
||||
"integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=",
|
||||
"requires": {
|
||||
"prelude-ls": "1.1.2"
|
||||
}
|
||||
},
|
||||
"url-parse": {
|
||||
"version": "1.0.5",
|
||||
"resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.0.5.tgz",
|
||||
"integrity": "sha1-CFSGBCKv3P7+tsllxmLUgAFpkns=",
|
||||
"requires": {
|
||||
"querystringify": "0.0.4",
|
||||
"requires-port": "1.0.0"
|
||||
}
|
||||
},
|
||||
"uuid": {
|
||||
"version": "3.1.0",
|
||||
"resolved": "https://registry.npmjs.org/uuid/-/uuid-3.1.0.tgz",
|
||||
"integrity": "sha512-DIWtzUkw04M4k3bf1IcpS2tngXEL26YUD2M0tMDUpnUrz2hgzUBlD55a4FjdLGPvfHxS6uluGWvaVEqgBcVa+g=="
|
||||
},
|
||||
"verror": {
|
||||
"version": "1.10.0",
|
||||
"resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz",
|
||||
"integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=",
|
||||
"requires": {
|
||||
"assert-plus": "1.0.0",
|
||||
"core-util-is": "1.0.2",
|
||||
"extsprintf": "1.3.0"
|
||||
}
|
||||
},
|
||||
"webidl-conversions": {
|
||||
"version": "2.0.1",
|
||||
"resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-2.0.1.tgz",
|
||||
"integrity": "sha1-O/glj30xjHRDw28uFpQCoaZwNQY="
|
||||
},
|
||||
"whatwg-url-compat": {
|
||||
"version": "0.6.5",
|
||||
"resolved": "https://registry.npmjs.org/whatwg-url-compat/-/whatwg-url-compat-0.6.5.tgz",
|
||||
"integrity": "sha1-AImBEa9om7CXVBzVpFymyHmERb8=",
|
||||
"requires": {
|
||||
"tr46": "0.0.3"
|
||||
}
|
||||
},
|
||||
"wordwrap": {
|
||||
"version": "1.0.0",
|
||||
"resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz",
|
||||
"integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus="
|
||||
},
|
||||
"xml-name-validator": {
|
||||
"version": "2.0.1",
|
||||
"resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-2.0.1.tgz",
|
||||
"integrity": "sha1-TYuPHszTQZqjYgYb7O9RXh5VljU="
|
||||
},
|
||||
"zombie": {
|
||||
"version": "5.0.7",
|
||||
"resolved": "https://registry.npmjs.org/zombie/-/zombie-5.0.7.tgz",
|
||||
"integrity": "sha512-zrYFTD5iWxI3EJohmZ8F2sNafo44F/132wLj5WHLSHmytds60s+JiXLomflQ8sbNuWCZJAuszvf6+eUiVsUqPQ==",
|
||||
"requires": {
|
||||
"babel-runtime": "5.8.29",
|
||||
"bluebird": "3.5.1",
|
||||
"debug": "2.6.9",
|
||||
"eventsource": "0.1.6",
|
||||
"iconv-lite": "0.4.19",
|
||||
"jsdom": "7.2.2",
|
||||
"lodash": "3.10.1",
|
||||
"mime": "1.6.0",
|
||||
"ms": "0.7.3",
|
||||
"request": "2.83.0",
|
||||
"tough-cookie": "2.3.3",
|
||||
"ws": "1.1.5"
|
||||
},
|
||||
"dependencies": {
|
||||
"ms": {
|
||||
"version": "0.7.3",
|
||||
"resolved": "https://registry.npmjs.org/ms/-/ms-0.7.3.tgz",
|
||||
"integrity": "sha1-cIFVpeROM/X9D8U+gdDUCpG+H/8="
|
||||
},
|
||||
"ultron": {
|
||||
"version": "1.0.2",
|
||||
"resolved": "https://registry.npmjs.org/ultron/-/ultron-1.0.2.tgz",
|
||||
"integrity": "sha1-rOEWq1V80Zc4ak6I9GhTeMiy5Po="
|
||||
},
|
||||
"ws": {
|
||||
"version": "1.1.5",
|
||||
"resolved": "https://registry.npmjs.org/ws/-/ws-1.1.5.tgz",
|
||||
"integrity": "sha512-o3KqipXNUdS7wpQzBHSe180lBGO60SoK0yVo3CYJgb2MkobuWuBX6dhkYP5ORCLd55y+SaflMOV5fqAB53ux4w==",
|
||||
"requires": {
|
||||
"options": "0.0.6",
|
||||
"ultron": "1.0.2"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
@ -1,542 +0,0 @@
|
||||
# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.
|
||||
# yarn lockfile v1
|
||||
|
||||
|
||||
abab@^1.0.0:
|
||||
version "1.0.4"
|
||||
resolved "https://registry.yarnpkg.com/abab/-/abab-1.0.4.tgz#5faad9c2c07f60dd76770f71cf025b62a63cfd4e"
|
||||
|
||||
acorn-globals@^1.0.4:
|
||||
version "1.0.9"
|
||||
resolved "https://registry.yarnpkg.com/acorn-globals/-/acorn-globals-1.0.9.tgz#55bb5e98691507b74579d0513413217c380c54cf"
|
||||
dependencies:
|
||||
acorn "^2.1.0"
|
||||
|
||||
acorn@^2.1.0, acorn@^2.4.0:
|
||||
version "2.7.0"
|
||||
resolved "https://registry.yarnpkg.com/acorn/-/acorn-2.7.0.tgz#ab6e7d9d886aaca8b085bc3312b79a198433f0e7"
|
||||
|
||||
ajv@^5.1.0:
|
||||
version "5.3.0"
|
||||
resolved "https://registry.yarnpkg.com/ajv/-/ajv-5.3.0.tgz#4414ff74a50879c208ee5fdc826e32c303549eda"
|
||||
dependencies:
|
||||
co "^4.6.0"
|
||||
fast-deep-equal "^1.0.0"
|
||||
fast-json-stable-stringify "^2.0.0"
|
||||
json-schema-traverse "^0.3.0"
|
||||
|
||||
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"
|
||||
|
||||
asynckit@^0.4.0:
|
||||
version "0.4.0"
|
||||
resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79"
|
||||
|
||||
aws-sign2@~0.7.0:
|
||||
version "0.7.0"
|
||||
resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.7.0.tgz#b46e890934a9591f2d2f6f86d7e6a9f1b3fe76a8"
|
||||
|
||||
aws4@^1.6.0:
|
||||
version "1.6.0"
|
||||
resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.6.0.tgz#83ef5ca860b2b32e4a0deedee8c771b9db57471e"
|
||||
|
||||
babel-runtime@5.8.29:
|
||||
version "5.8.29"
|
||||
resolved "https://registry.yarnpkg.com/babel-runtime/-/babel-runtime-5.8.29.tgz#4a2052cbcff531788d3a9d6b03cd7f448285f825"
|
||||
dependencies:
|
||||
core-js "^1.0.0"
|
||||
|
||||
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"
|
||||
|
||||
bluebird@^3.0:
|
||||
version "3.5.1"
|
||||
resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.5.1.tgz#d9551f9de98f1fcda1e683d17ee91a0602ee2eb9"
|
||||
|
||||
boom@4.x.x:
|
||||
version "4.3.1"
|
||||
resolved "https://registry.yarnpkg.com/boom/-/boom-4.3.1.tgz#4f8a3005cb4a7e3889f749030fd25b96e01d2e31"
|
||||
dependencies:
|
||||
hoek "4.x.x"
|
||||
|
||||
boom@5.x.x:
|
||||
version "5.2.0"
|
||||
resolved "https://registry.yarnpkg.com/boom/-/boom-5.2.0.tgz#5dd9da6ee3a5f302077436290cb717d3f4a54e02"
|
||||
dependencies:
|
||||
hoek "4.x.x"
|
||||
|
||||
caseless@~0.12.0:
|
||||
version "0.12.0"
|
||||
resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc"
|
||||
|
||||
co@^4.6.0:
|
||||
version "4.6.0"
|
||||
resolved "https://registry.yarnpkg.com/co/-/co-4.6.0.tgz#6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184"
|
||||
|
||||
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"
|
||||
|
||||
core-js@^1.0.0:
|
||||
version "1.2.7"
|
||||
resolved "https://registry.yarnpkg.com/core-js/-/core-js-1.2.7.tgz#652294c14651db28fa93bd2d5ff2983a4f08c636"
|
||||
|
||||
core-util-is@1.0.2:
|
||||
version "1.0.2"
|
||||
resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7"
|
||||
|
||||
cryptiles@3.x.x:
|
||||
version "3.1.2"
|
||||
resolved "https://registry.yarnpkg.com/cryptiles/-/cryptiles-3.1.2.tgz#a89fbb220f5ce25ec56e8c4aa8a4fd7b5b0d29fe"
|
||||
dependencies:
|
||||
boom "5.x.x"
|
||||
|
||||
cssom@0.3.x, "cssom@>= 0.3.0 < 0.4.0":
|
||||
version "0.3.2"
|
||||
resolved "https://registry.yarnpkg.com/cssom/-/cssom-0.3.2.tgz#b8036170c79f07a90ff2f16e22284027a243848b"
|
||||
|
||||
"cssstyle@>= 0.2.29 < 0.3.0":
|
||||
version "0.2.37"
|
||||
resolved "https://registry.yarnpkg.com/cssstyle/-/cssstyle-0.2.37.tgz#541097234cb2513c83ceed3acddc27ff27987d54"
|
||||
dependencies:
|
||||
cssom "0.3.x"
|
||||
|
||||
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@^2.2:
|
||||
version "2.6.9"
|
||||
resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f"
|
||||
dependencies:
|
||||
ms "2.0.0"
|
||||
|
||||
deep-is@~0.1.3:
|
||||
version "0.1.3"
|
||||
resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.3.tgz#b369d6fb5dbc13eecf524f91b070feedc357cf34"
|
||||
|
||||
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"
|
||||
|
||||
escodegen@^1.6.1:
|
||||
version "1.9.0"
|
||||
resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-1.9.0.tgz#9811a2f265dc1cd3894420ee3717064b632b8852"
|
||||
dependencies:
|
||||
esprima "^3.1.3"
|
||||
estraverse "^4.2.0"
|
||||
esutils "^2.0.2"
|
||||
optionator "^0.8.1"
|
||||
optionalDependencies:
|
||||
source-map "~0.5.6"
|
||||
|
||||
esprima@^3.1.3:
|
||||
version "3.1.3"
|
||||
resolved "https://registry.yarnpkg.com/esprima/-/esprima-3.1.3.tgz#fdca51cee6133895e3c88d535ce49dbff62a4633"
|
||||
|
||||
estraverse@^4.2.0:
|
||||
version "4.2.0"
|
||||
resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.2.0.tgz#0dee3fed31fcd469618ce7342099fc1afa0bdb13"
|
||||
|
||||
esutils@^2.0.2:
|
||||
version "2.0.2"
|
||||
resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.2.tgz#0abf4f1caa5bcb1f7a9d8acc6dea4faaa04bac9b"
|
||||
|
||||
eventsource@^0.1.6:
|
||||
version "0.1.6"
|
||||
resolved "https://registry.yarnpkg.com/eventsource/-/eventsource-0.1.6.tgz#0acede849ed7dd1ccc32c811bb11b944d4f29232"
|
||||
dependencies:
|
||||
original ">=0.0.5"
|
||||
|
||||
extend@~3.0.1:
|
||||
version "3.0.1"
|
||||
resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.1.tgz#a755ea7bc1adfcc5a31ce7e762dbaadc5e636444"
|
||||
|
||||
extsprintf@1.3.0, extsprintf@^1.2.0:
|
||||
version "1.3.0"
|
||||
resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.3.0.tgz#96918440e3041a7a414f8c52e3c574eb3c3e1e05"
|
||||
|
||||
fast-deep-equal@^1.0.0:
|
||||
version "1.0.0"
|
||||
resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-1.0.0.tgz#96256a3bc975595eb36d82e9929d060d893439ff"
|
||||
|
||||
fast-json-stable-stringify@^2.0.0:
|
||||
version "2.0.0"
|
||||
resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz#d5142c0caee6b1189f87d3a76111064f86c8bbf2"
|
||||
|
||||
fast-levenshtein@~2.0.4:
|
||||
version "2.0.6"
|
||||
resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917"
|
||||
|
||||
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.3.1:
|
||||
version "2.3.1"
|
||||
resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.3.1.tgz#6fb94fbd71885306d73d15cc497fe4cc4ecd44bf"
|
||||
dependencies:
|
||||
asynckit "^0.4.0"
|
||||
combined-stream "^1.0.5"
|
||||
mime-types "^2.1.12"
|
||||
|
||||
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"
|
||||
|
||||
har-schema@^2.0.0:
|
||||
version "2.0.0"
|
||||
resolved "https://registry.yarnpkg.com/har-schema/-/har-schema-2.0.0.tgz#a94c2224ebcac04782a0d9035521f24735b7ec92"
|
||||
|
||||
har-validator@~5.0.3:
|
||||
version "5.0.3"
|
||||
resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-5.0.3.tgz#ba402c266194f15956ef15e0fcf242993f6a7dfd"
|
||||
dependencies:
|
||||
ajv "^5.1.0"
|
||||
har-schema "^2.0.0"
|
||||
|
||||
hawk@~6.0.2:
|
||||
version "6.0.2"
|
||||
resolved "https://registry.yarnpkg.com/hawk/-/hawk-6.0.2.tgz#af4d914eb065f9b5ce4d9d11c1cb2126eecc3038"
|
||||
dependencies:
|
||||
boom "4.x.x"
|
||||
cryptiles "3.x.x"
|
||||
hoek "4.x.x"
|
||||
sntp "2.x.x"
|
||||
|
||||
hoek@4.x.x:
|
||||
version "4.2.0"
|
||||
resolved "https://registry.yarnpkg.com/hoek/-/hoek-4.2.0.tgz#72d9d0754f7fe25ca2d01ad8f8f9a9449a89526d"
|
||||
|
||||
http-signature@~1.2.0:
|
||||
version "1.2.0"
|
||||
resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-1.2.0.tgz#9aecd925114772f3d95b65a60abb8f7c18fbace1"
|
||||
dependencies:
|
||||
assert-plus "^1.0.0"
|
||||
jsprim "^1.2.2"
|
||||
sshpk "^1.7.0"
|
||||
|
||||
iconv-lite@^0.4.13:
|
||||
version "0.4.19"
|
||||
resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.19.tgz#f7468f60135f5e5dad3399c0a81be9a1603a082b"
|
||||
|
||||
is-typedarray@~1.0.0:
|
||||
version "1.0.0"
|
||||
resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a"
|
||||
|
||||
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"
|
||||
|
||||
jsdom@^7.2.2:
|
||||
version "7.2.2"
|
||||
resolved "https://registry.yarnpkg.com/jsdom/-/jsdom-7.2.2.tgz#40b402770c2bda23469096bee91ab675e3b1fc6e"
|
||||
dependencies:
|
||||
abab "^1.0.0"
|
||||
acorn "^2.4.0"
|
||||
acorn-globals "^1.0.4"
|
||||
cssom ">= 0.3.0 < 0.4.0"
|
||||
cssstyle ">= 0.2.29 < 0.3.0"
|
||||
escodegen "^1.6.1"
|
||||
nwmatcher ">= 1.3.7 < 2.0.0"
|
||||
parse5 "^1.5.1"
|
||||
request "^2.55.0"
|
||||
sax "^1.1.4"
|
||||
symbol-tree ">= 3.1.0 < 4.0.0"
|
||||
tough-cookie "^2.2.0"
|
||||
webidl-conversions "^2.0.0"
|
||||
whatwg-url-compat "~0.6.5"
|
||||
xml-name-validator ">= 2.0.1 < 3.0.0"
|
||||
|
||||
json-schema-traverse@^0.3.0:
|
||||
version "0.3.1"
|
||||
resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz#349a6d44c53a51de89b40805c5d5e59b417d3340"
|
||||
|
||||
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"
|
||||
|
||||
jsprim@^1.2.2:
|
||||
version "1.4.1"
|
||||
resolved "https://registry.yarnpkg.com/jsprim/-/jsprim-1.4.1.tgz#313e66bc1e5cc06e438bc1b7499c2e5c56acb6a2"
|
||||
dependencies:
|
||||
assert-plus "1.0.0"
|
||||
extsprintf "1.3.0"
|
||||
json-schema "0.2.3"
|
||||
verror "1.10.0"
|
||||
|
||||
levn@~0.3.0:
|
||||
version "0.3.0"
|
||||
resolved "https://registry.yarnpkg.com/levn/-/levn-0.3.0.tgz#3b09924edf9f083c0490fdd4c0bc4421e04764ee"
|
||||
dependencies:
|
||||
prelude-ls "~1.1.2"
|
||||
type-check "~0.3.2"
|
||||
|
||||
lodash@^3.10.1:
|
||||
version "3.10.1"
|
||||
resolved "https://registry.yarnpkg.com/lodash/-/lodash-3.10.1.tgz#5bf45e8e49ba4189e17d482789dfd15bd140b7b6"
|
||||
|
||||
mime-db@~1.30.0:
|
||||
version "1.30.0"
|
||||
resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.30.0.tgz#74c643da2dd9d6a45399963465b26d5ca7d71f01"
|
||||
|
||||
mime-types@^2.1.12, mime-types@~2.1.17:
|
||||
version "2.1.17"
|
||||
resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.17.tgz#09d7a393f03e995a79f8af857b70a9e0ab16557a"
|
||||
dependencies:
|
||||
mime-db "~1.30.0"
|
||||
|
||||
mime@^1.3.4:
|
||||
version "1.4.1"
|
||||
resolved "https://registry.yarnpkg.com/mime/-/mime-1.4.1.tgz#121f9ebc49e3766f311a76e1fa1c8003c4b03aa6"
|
||||
|
||||
ms@2.0.0:
|
||||
version "2.0.0"
|
||||
resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8"
|
||||
|
||||
ms@^0.7.1:
|
||||
version "0.7.3"
|
||||
resolved "https://registry.yarnpkg.com/ms/-/ms-0.7.3.tgz#708155a5e44e33f5fd0fc53e81d0d40a91be1fff"
|
||||
|
||||
"nwmatcher@>= 1.3.7 < 2.0.0":
|
||||
version "1.4.3"
|
||||
resolved "https://registry.yarnpkg.com/nwmatcher/-/nwmatcher-1.4.3.tgz#64348e3b3d80f035b40ac11563d278f8b72db89c"
|
||||
|
||||
oauth-sign@~0.8.2:
|
||||
version "0.8.2"
|
||||
resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.8.2.tgz#46a6ab7f0aead8deae9ec0565780b7d4efeb9d43"
|
||||
|
||||
optionator@^0.8.1:
|
||||
version "0.8.2"
|
||||
resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.8.2.tgz#364c5e409d3f4d6301d6c0b4c05bba50180aeb64"
|
||||
dependencies:
|
||||
deep-is "~0.1.3"
|
||||
fast-levenshtein "~2.0.4"
|
||||
levn "~0.3.0"
|
||||
prelude-ls "~1.1.2"
|
||||
type-check "~0.3.2"
|
||||
wordwrap "~1.0.0"
|
||||
|
||||
options@>=0.0.5:
|
||||
version "0.0.6"
|
||||
resolved "https://registry.yarnpkg.com/options/-/options-0.0.6.tgz#ec22d312806bb53e731773e7cdaefcf1c643128f"
|
||||
|
||||
original@>=0.0.5:
|
||||
version "1.0.0"
|
||||
resolved "https://registry.yarnpkg.com/original/-/original-1.0.0.tgz#9147f93fa1696d04be61e01bd50baeaca656bd3b"
|
||||
dependencies:
|
||||
url-parse "1.0.x"
|
||||
|
||||
parse5@^1.5.1:
|
||||
version "1.5.1"
|
||||
resolved "https://registry.yarnpkg.com/parse5/-/parse5-1.5.1.tgz#9b7f3b0de32be78dc2401b17573ccaf0f6f59d94"
|
||||
|
||||
performance-now@^2.1.0:
|
||||
version "2.1.0"
|
||||
resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b"
|
||||
|
||||
prelude-ls@~1.1.2:
|
||||
version "1.1.2"
|
||||
resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54"
|
||||
|
||||
punycode@^1.4.1:
|
||||
version "1.4.1"
|
||||
resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e"
|
||||
|
||||
qs@~6.5.1:
|
||||
version "6.5.1"
|
||||
resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.1.tgz#349cdf6eef89ec45c12d7d5eb3fc0c870343a6d8"
|
||||
|
||||
querystringify@0.0.x:
|
||||
version "0.0.4"
|
||||
resolved "https://registry.yarnpkg.com/querystringify/-/querystringify-0.0.4.tgz#0cf7f84f9463ff0ae51c4c4b142d95be37724d9c"
|
||||
|
||||
request@^2.55.0, request@^2.65.0, request@^2.81.0:
|
||||
version "2.83.0"
|
||||
resolved "https://registry.yarnpkg.com/request/-/request-2.83.0.tgz#ca0b65da02ed62935887808e6f510381034e3356"
|
||||
dependencies:
|
||||
aws-sign2 "~0.7.0"
|
||||
aws4 "^1.6.0"
|
||||
caseless "~0.12.0"
|
||||
combined-stream "~1.0.5"
|
||||
extend "~3.0.1"
|
||||
forever-agent "~0.6.1"
|
||||
form-data "~2.3.1"
|
||||
har-validator "~5.0.3"
|
||||
hawk "~6.0.2"
|
||||
http-signature "~1.2.0"
|
||||
is-typedarray "~1.0.0"
|
||||
isstream "~0.1.2"
|
||||
json-stringify-safe "~5.0.1"
|
||||
mime-types "~2.1.17"
|
||||
oauth-sign "~0.8.2"
|
||||
performance-now "^2.1.0"
|
||||
qs "~6.5.1"
|
||||
safe-buffer "^5.1.1"
|
||||
stringstream "~0.0.5"
|
||||
tough-cookie "~2.3.3"
|
||||
tunnel-agent "^0.6.0"
|
||||
uuid "^3.1.0"
|
||||
|
||||
requires-port@1.0.x:
|
||||
version "1.0.0"
|
||||
resolved "https://registry.yarnpkg.com/requires-port/-/requires-port-1.0.0.tgz#925d2601d39ac485e091cf0da5c6e694dc3dcaff"
|
||||
|
||||
safe-buffer@^5.0.1, safe-buffer@^5.1.1:
|
||||
version "5.1.1"
|
||||
resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.1.tgz#893312af69b2123def71f57889001671eeb2c853"
|
||||
|
||||
sax@^1.1.4:
|
||||
version "1.2.4"
|
||||
resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9"
|
||||
|
||||
sntp@2.x.x:
|
||||
version "2.1.0"
|
||||
resolved "https://registry.yarnpkg.com/sntp/-/sntp-2.1.0.tgz#2c6cec14fedc2222739caf9b5c3d85d1cc5a2cc8"
|
||||
dependencies:
|
||||
hoek "4.x.x"
|
||||
|
||||
source-map@~0.5.6:
|
||||
version "0.5.7"
|
||||
resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc"
|
||||
|
||||
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"
|
||||
|
||||
stringstream@~0.0.5:
|
||||
version "0.0.5"
|
||||
resolved "https://registry.yarnpkg.com/stringstream/-/stringstream-0.0.5.tgz#4e484cd4de5a0bbbee18e46307710a8a81621878"
|
||||
|
||||
"symbol-tree@>= 3.1.0 < 4.0.0":
|
||||
version "3.2.2"
|
||||
resolved "https://registry.yarnpkg.com/symbol-tree/-/symbol-tree-3.2.2.tgz#ae27db38f660a7ae2e1c3b7d1bc290819b8519e6"
|
||||
|
||||
tough-cookie@^2.2.0, tough-cookie@~2.3.3:
|
||||
version "2.3.3"
|
||||
resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.3.3.tgz#0b618a5565b6dea90bf3425d04d55edc475a7561"
|
||||
dependencies:
|
||||
punycode "^1.4.1"
|
||||
|
||||
tr46@~0.0.1:
|
||||
version "0.0.3"
|
||||
resolved "https://registry.yarnpkg.com/tr46/-/tr46-0.0.3.tgz#8184fd347dac9cdc185992f3a6622e14b9d9ab6a"
|
||||
|
||||
tunnel-agent@^0.6.0:
|
||||
version "0.6.0"
|
||||
resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.6.0.tgz#27a5dea06b36b04a0a9966774b290868f0fc40fd"
|
||||
dependencies:
|
||||
safe-buffer "^5.0.1"
|
||||
|
||||
tweetnacl@^0.14.3, tweetnacl@~0.14.0:
|
||||
version "0.14.5"
|
||||
resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-0.14.5.tgz#5ae68177f192d4456269d108afa93ff8743f4f64"
|
||||
|
||||
type-check@~0.3.2:
|
||||
version "0.3.2"
|
||||
resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.3.2.tgz#5884cab512cf1d355e3fb784f30804b2b520db72"
|
||||
dependencies:
|
||||
prelude-ls "~1.1.2"
|
||||
|
||||
ultron@1.0.x:
|
||||
version "1.0.2"
|
||||
resolved "https://registry.yarnpkg.com/ultron/-/ultron-1.0.2.tgz#ace116ab557cd197386a4e88f4685378c8b2e4fa"
|
||||
|
||||
url-parse@1.0.x:
|
||||
version "1.0.5"
|
||||
resolved "https://registry.yarnpkg.com/url-parse/-/url-parse-1.0.5.tgz#0854860422afdcfefeb6c965c662d4800169927b"
|
||||
dependencies:
|
||||
querystringify "0.0.x"
|
||||
requires-port "1.0.x"
|
||||
|
||||
uuid@^3.1.0:
|
||||
version "3.1.0"
|
||||
resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.1.0.tgz#3dd3d3e790abc24d7b0d3a034ffababe28ebbc04"
|
||||
|
||||
verror@1.10.0:
|
||||
version "1.10.0"
|
||||
resolved "https://registry.yarnpkg.com/verror/-/verror-1.10.0.tgz#3a105ca17053af55d6e270c1f8288682e18da400"
|
||||
dependencies:
|
||||
assert-plus "^1.0.0"
|
||||
core-util-is "1.0.2"
|
||||
extsprintf "^1.2.0"
|
||||
|
||||
webidl-conversions@^2.0.0:
|
||||
version "2.0.1"
|
||||
resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-2.0.1.tgz#3bf8258f7d318c7443c36f2e169402a1a6703506"
|
||||
|
||||
whatwg-url-compat@~0.6.5:
|
||||
version "0.6.5"
|
||||
resolved "https://registry.yarnpkg.com/whatwg-url-compat/-/whatwg-url-compat-0.6.5.tgz#00898111af689bb097541cd5a45ca6c8798445bf"
|
||||
dependencies:
|
||||
tr46 "~0.0.1"
|
||||
|
||||
wordwrap@~1.0.0:
|
||||
version "1.0.0"
|
||||
resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-1.0.0.tgz#27584810891456a4171c8d0226441ade90cbcaeb"
|
||||
|
||||
ws@^1.0.1:
|
||||
version "1.1.4"
|
||||
resolved "https://registry.yarnpkg.com/ws/-/ws-1.1.4.tgz#57f40d036832e5f5055662a397c4de76ed66bf61"
|
||||
dependencies:
|
||||
options ">=0.0.5"
|
||||
ultron "1.0.x"
|
||||
|
||||
"xml-name-validator@>= 2.0.1 < 3.0.0":
|
||||
version "2.0.1"
|
||||
resolved "https://registry.yarnpkg.com/xml-name-validator/-/xml-name-validator-2.0.1.tgz#4d8b8f1eccd3419aa362061becef515e1e559635"
|
||||
|
||||
zombie@^5.0.7:
|
||||
version "5.0.7"
|
||||
resolved "https://registry.yarnpkg.com/zombie/-/zombie-5.0.7.tgz#215ba90b4b97f75b796c935affcc63d68cbac772"
|
||||
dependencies:
|
||||
babel-runtime "5.8.29"
|
||||
bluebird "^3.0"
|
||||
debug "^2.2"
|
||||
eventsource "^0.1.6"
|
||||
iconv-lite "^0.4.13"
|
||||
jsdom "^7.2.2"
|
||||
lodash "^3.10.1"
|
||||
mime "^1.3.4"
|
||||
ms "^0.7.1"
|
||||
request "^2.65.0"
|
||||
tough-cookie "^2.2.0"
|
||||
ws "^1.0.1"
|
@ -1,67 +1,79 @@
|
||||
{
|
||||
"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": "Utiliser l'icône de l'application au lieu du logo Wappalyzer" },
|
||||
"options": { "message": "Options" },
|
||||
"optionsSave": { "message": "Sauvegarder les options" },
|
||||
"optionsSaved": { "message": "Sauvegardé" },
|
||||
"twitter": { "message": "Suivre Wappalyzer sur Twitter" },
|
||||
"website": { "message": "Aller sur wappalyzer.com" },
|
||||
"categoryName1": { "message": "CMS" },
|
||||
"categoryName2": { "message": "Forum" },
|
||||
"categoryName3": { "message": "Gestionnaire de base de données" },
|
||||
"categoryName4": { "message": "Outil de documentation" },
|
||||
"categoryName5": { "message": "Widget" },
|
||||
"categoryName6": { "message": "Boutique en ligne" },
|
||||
"categoryName7": { "message": "Galerie photo" },
|
||||
"categoryName8": { "message": "Wiki" },
|
||||
"categoryName9": { "message": "Gestionnaires de serveur" },
|
||||
"categoryName10": { "message": "Outil de statistiques" },
|
||||
"categoryName11": { "message": "Blog" },
|
||||
"categoryName12": { "message": "Framework JavaScript" },
|
||||
"categoryName13": { "message": "Outil de suivi de problèmes" },
|
||||
"categoryName14": { "message": "Lecteur de vidéos" },
|
||||
"categoryName15": { "message": "Système de commentaires" },
|
||||
"categoryName16": { "message": "Captcha" },
|
||||
"categoryName17": { "message": "Script de police" },
|
||||
"categoryName18": { "message": "Framework web" },
|
||||
"categoryName19": { "message": "Divers" },
|
||||
"categoryName20": { "message": "Editeur" },
|
||||
"categoryName21": { "message": "LMS" },
|
||||
"categoryName22": { "message": "Serveur web" },
|
||||
"categoryName23": { "message": "Outil de cache" },
|
||||
"categoryName24": { "message": "Editeur WYSIWYG" },
|
||||
"categoryName25": { "message": "Graphismes JavaScript" },
|
||||
"categoryName26": { "message": "Framework pour mobiles" },
|
||||
"categoryName27": { "message": "Langage de programmation" },
|
||||
"categoryName28": { "message": "Système d'exploitation" },
|
||||
"categoryName29": { "message": "Moteur de recherche" },
|
||||
"categoryName30": { "message": "Web Mail" },
|
||||
"categoryName31": { "message": "CDN" },
|
||||
"categoryName32": { "message": "Logiciel de marketing" },
|
||||
"categoryName33": { "message": "Extension de serveur web" },
|
||||
"categoryName34": { "message": "Base de données" },
|
||||
"categoryName35": { "message": "Carte" },
|
||||
"categoryName36": { "message": "Régie publicitaire" },
|
||||
"categoryName37": { "message": "Périphérique réseau" },
|
||||
"categoryName38": { "message": "Serveur multimédia" },
|
||||
"categoryName39": { "message": "Webcam" },
|
||||
"categoryName40": { "message": "Imprimante" },
|
||||
"categoryName41": { "message": "Service de paiement" },
|
||||
"categoryName42": { "message": "Tag Manager" },
|
||||
"categoryName43": { "message": "Paywall" },
|
||||
"categoryName44": { "message": "Système CI" },
|
||||
"categoryName45": { "message": "Système SCADA" },
|
||||
"categoryName46": { "message": "Accès à distance" },
|
||||
"categoryName47": { "message": "Outil de développement" },
|
||||
"categoryName48": { "message": "Stockage réseau" },
|
||||
"categoryName49": { "message": "Lecteur RSS" },
|
||||
"categoryName50": { "message": "Système de gestion de documents" },
|
||||
"categoryName51": { "message": "Landing Page Builder" },
|
||||
"categoryName52": { "message": "Chat en direct" },
|
||||
"categoryName53": { "message": "CRM" },
|
||||
"categoryName54": { "message": "SEO" }
|
||||
"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": "Utiliser l'icône de l'application au lieu du logo Wappalyzer" },
|
||||
"options": { "message": "Options" },
|
||||
"optionsSave": { "message": "Sauvegarder les options" },
|
||||
"optionsSaved": { "message": "Sauvegardé" },
|
||||
"twitter": { "message": "Suivre Wappalyzer sur Twitter" },
|
||||
"website": { "message": "Aller sur wappalyzer.com" },
|
||||
"categoryPin": { "message": " Toujours afficher l'icône" },
|
||||
"termsAccept": { "message": "Accept" },
|
||||
"termsContent": { "message": "This extension sends anonymous information about websites you visit, including domain name and identified technologies, to <a href='https://www.wappalyzer.com'>wappalyzer.com</a>. This can be disabled in the settings." },
|
||||
"categoryName1": { "message": "CMS" },
|
||||
"categoryName2": { "message": "Forum" },
|
||||
"categoryName3": { "message": "Gestionnaire de base de données" },
|
||||
"categoryName4": { "message": "Outil de documentation" },
|
||||
"categoryName5": { "message": "Widget" },
|
||||
"categoryName6": { "message": "Boutique en ligne" },
|
||||
"categoryName7": { "message": "Galerie photo" },
|
||||
"categoryName8": { "message": "Wiki" },
|
||||
"categoryName9": { "message": "Gestionnaires de serveur" },
|
||||
"categoryName10": { "message": "Outil de statistiques" },
|
||||
"categoryName11": { "message": "Blog" },
|
||||
"categoryName12": { "message": "Framework JavaScript" },
|
||||
"categoryName13": { "message": "Outil de suivi de problèmes" },
|
||||
"categoryName14": { "message": "Lecteur de vidéos" },
|
||||
"categoryName15": { "message": "Système de commentaires" },
|
||||
"categoryName16": { "message": "Captcha" },
|
||||
"categoryName17": { "message": "Script de police" },
|
||||
"categoryName18": { "message": "Framework web" },
|
||||
"categoryName19": { "message": "Divers" },
|
||||
"categoryName20": { "message": "Éditeur" },
|
||||
"categoryName21": { "message": "LMS" },
|
||||
"categoryName22": { "message": "Serveur web" },
|
||||
"categoryName23": { "message": "Outil de cache" },
|
||||
"categoryName24": { "message": "Éditeur WYSIWYG" },
|
||||
"categoryName25": { "message": "Graphismes JavaScript" },
|
||||
"categoryName26": { "message": "Framework pour mobiles" },
|
||||
"categoryName27": { "message": "Langage de programmation" },
|
||||
"categoryName28": { "message": "Système d'exploitation" },
|
||||
"categoryName29": { "message": "Moteur de recherche" },
|
||||
"categoryName30": { "message": "Webmail" },
|
||||
"categoryName31": { "message": "CDN" },
|
||||
"categoryName32": { "message": "Logiciel de marketing" },
|
||||
"categoryName33": { "message": "Extension de serveur web" },
|
||||
"categoryName34": { "message": "Base de données" },
|
||||
"categoryName35": { "message": "Carte" },
|
||||
"categoryName36": { "message": "Régie publicitaire" },
|
||||
"categoryName37": { "message": "Périphérique réseau" },
|
||||
"categoryName38": { "message": "Serveur multimédia" },
|
||||
"categoryName39": { "message": "Webcam" },
|
||||
"categoryName40": { "message": "Imprimante" },
|
||||
"categoryName41": { "message": "Service de paiement" },
|
||||
"categoryName42": { "message": "Gestionnaire de balises" },
|
||||
"categoryName43": { "message": "Paywall" },
|
||||
"categoryName44": { "message": "Système CI" },
|
||||
"categoryName45": { "message": "Système SCADA" },
|
||||
"categoryName46": { "message": "Accès à distance" },
|
||||
"categoryName47": { "message": "Outil de développement" },
|
||||
"categoryName48": { "message": "Stockage réseau" },
|
||||
"categoryName49": { "message": "Lecteur de flux RSS" },
|
||||
"categoryName51": { "message": "Créateur de Landing Page" },
|
||||
"categoryName50": { "message": "Système de gestion de documents" },
|
||||
"categoryName52": { "message": "Chat en direct" },
|
||||
"categoryName53": { "message": "CRM" },
|
||||
"categoryName54": { "message": "SEO" },
|
||||
"categoryName55": { "message": "Comptabilité" },
|
||||
"categoryName56": { "message": "Crypto-mineur" },
|
||||
"categoryName57": { "message": "Générateur de site statique" },
|
||||
"categoryName58": { "message": "User Onboarding" },
|
||||
"categoryName59": { "message": "JavaScript Libraries" },
|
||||
"categoryName60": { "message": "Containers" },
|
||||
"categoryName61": { "message": "SaaS" },
|
||||
"categoryName62": { "message": "PaaS" },
|
||||
"categoryName63": { "message": "IaaS" }
|
||||
}
|
||||
|
@ -1,67 +1,79 @@
|
||||
{
|
||||
"github": { "message": "Fork Wappalyzer no GitHub!" },
|
||||
"noAppsDetected": { "message": "Não foi detetada nenhuma apliação." },
|
||||
"nothingToDo": { "message": "Nada a fazer aqui." },
|
||||
"optionTracking": { "message": "Enviar anonimamente relatorios sobre as apliações detetadas ao wappalyzer.com para investigação" },
|
||||
"optionUpgradeMessage": { "message": "Atualizações automaticas" },
|
||||
"optionDynamicIcon": { "message": "Utilizar o icone da aplicação em vez do logotido do Wappalyzer" },
|
||||
"options": { "message": "Definições" },
|
||||
"optionsSave": { "message": "Guardar as opções" },
|
||||
"optionsSaved": { "message": "Guardado" },
|
||||
"twitter": { "message": "Seguir o Wappalyzer no Twitter" },
|
||||
"website": { "message": "Ir para wappalyzer.com" },
|
||||
"categoryName1": { "message": "Sistema de gerenciamento de conteudo(CMS)" },
|
||||
"categoryName2": { "message": "Forum" },
|
||||
"categoryName3": { "message": "Gestor de base de dados" },
|
||||
"categoryName4": { "message": "Ferramenta de documentação" },
|
||||
"categoryName5": { "message": "Widget" },
|
||||
"categoryName6": { "message": "Loja online" },
|
||||
"categoryName7": { "message": "Galeria de fotografias" },
|
||||
"categoryName8": { "message": "Wiki" },
|
||||
"categoryName9": { "message": "Gestor de servidores" },
|
||||
"categoryName10": { "message": "Ferramenta de estatisticas" },
|
||||
"categoryName11": { "message": "Blog" },
|
||||
"categoryName12": { "message": "Framework JavaScript" },
|
||||
"categoryName13": { "message": "Ferramenta de seguimento de problemas" },
|
||||
"categoryName14": { "message": "Leitor de videos" },
|
||||
"categoryName15": { "message": "Sistemas de comentários" },
|
||||
"categoryName16": { "message": "Captcha" },
|
||||
"categoryName17": { "message": "Script de policia" },
|
||||
"categoryName18": { "message": "Framework WEB" },
|
||||
"categoryName19": { "message": "Diversos" },
|
||||
"categoryName20": { "message": "Editor" },
|
||||
"categoryName21": { "message": "Sistema de gestão de Aprendizagem(LMS)" },
|
||||
"categoryName22": { "message": "Servidor WEB" },
|
||||
"categoryName23": { "message": "Ferramenta de cache" },
|
||||
"categoryName24": { "message": "Editor WYSIWYG" },
|
||||
"categoryName25": { "message": "Grafismo JavaScript" },
|
||||
"categoryName26": { "message": "Framework para dispositivos mobile" },
|
||||
"categoryName27": { "message": "Linguagem de programação" },
|
||||
"categoryName28": { "message": "Sistema Operativo" },
|
||||
"categoryName29": { "message": "Motor de pesquisa" },
|
||||
"categoryName30": { "message": "WebMail" },
|
||||
"categoryName31": { "message": "Rede de distribuição de conteudo(CDN)" },
|
||||
"categoryName32": { "message": "Sistema de vendas" },
|
||||
"categoryName33": { "message": "Extensão do servidor WEB" },
|
||||
"categoryName34": { "message": "Base de dados" },
|
||||
"categoryName35": { "message": "Mapa" },
|
||||
"categoryName36": { "message": "Rede de publicidade" },
|
||||
"categoryName37": { "message": "Dispositivo de rede" },
|
||||
"categoryName38": { "message": "Servidor multimédia" },
|
||||
"categoryName39": { "message": "Webcam" },
|
||||
"categoryName40": { "message": "Impressora" },
|
||||
"categoryName41": { "message": "Serviço de pagamento" },
|
||||
"categoryName42": { "message": "Gestor de Tags" },
|
||||
"categoryName43": { "message": "Sistema de assinaturas paga(Paywall)" },
|
||||
"categoryName44": { "message": "Sistema CI" },
|
||||
"categoryName45": { "message": "Sistema SCADA" },
|
||||
"categoryName46": { "message": "Acesso à distancia" },
|
||||
"categoryName47": { "message": "Ferramenta de desenvolvimento" },
|
||||
"categoryName48": { "message": "Rede de armazenamento" },
|
||||
"categoryName49": { "message": "Leitor RSS" },
|
||||
"categoryName50": { "message": "Sistema de gestão de documentos" },
|
||||
"categoryName51": { "message": "Landing Page Builder" },
|
||||
"categoryName52": { "message": "Chat em direto" },
|
||||
"categoryName53": { "message": "Sistemas de relação com o cliente(CRM)" },
|
||||
"categoryName54": { "message": "Otimização para motores de pesquisa(SEO)" }
|
||||
"github": { "message": "Fork Wappalyzer no GitHub!" },
|
||||
"noAppsDetected": { "message": "Não foi detectada nenhuma tecnologia." },
|
||||
"nothingToDo": { "message": "Nada a fazer aqui." },
|
||||
"optionDynamicIcon": { "message": "Utilizar o ícone da tecnologia em vez do logótipo do Wappalyzer" },
|
||||
"optionTracking": { "message": "Envie anonimamente tecnologias identificadas para wappalyzer.com" },
|
||||
"optionUpgradeMessage": { "message": "Fale-me sobre actualizações" },
|
||||
"options": { "message": "Opções" },
|
||||
"optionsSave": { "message": "Opções de Guardar" },
|
||||
"optionsSaved": { "message": "Guardado" },
|
||||
"twitter": { "message": "Seguir Wappalyzer no Twitter" },
|
||||
"website": { "message": "Ir para wappalyzer.com" },
|
||||
"categoryPin": { "message": "Mostrar sempre ícone" },
|
||||
"termsAccept": { "message": "Accept" },
|
||||
"termsContent": { "message": "This extension sends anonymous information about websites you visit, including domain name and identified technologies, to <a href='https://www.wappalyzer.com'>wappalyzer.com</a>. This can be disabled in the settings." },
|
||||
"categoryName1": { "message": "CMS" },
|
||||
"categoryName2": { "message": "Fórum" },
|
||||
"categoryName3": { "message": "Gestor de Base de Dados" },
|
||||
"categoryName4": { "message": "Ferramenta de Documentação" },
|
||||
"categoryName5": { "message": "Widget" },
|
||||
"categoryName6": { "message": "Comércio Eletrónico" },
|
||||
"categoryName7": { "message": "Galeria de Fotos" },
|
||||
"categoryName8": { "message": "Wikis" },
|
||||
"categoryName9": { "message": "Painéis de Hospedagem" },
|
||||
"categoryName10": { "message": "Analítica" },
|
||||
"categoryName11": { "message": "Blog" },
|
||||
"categoryName12": { "message": "Framework JavaScript" },
|
||||
"categoryName13": { "message": "Rastreador de Problemas" },
|
||||
"categoryName14": { "message": "Leitor Vídeo" },
|
||||
"categoryName15": { "message": "Sistema de Comentários" },
|
||||
"categoryName16": { "message": "Captcha" },
|
||||
"categoryName17": { "message": "Script de Tipos de Letra" },
|
||||
"categoryName18": { "message": "Framework Web" },
|
||||
"categoryName19": { "message": "Diversos" },
|
||||
"categoryName20": { "message": "Editor" },
|
||||
"categoryName21": { "message": "LMS" },
|
||||
"categoryName22": { "message": "Servidor Web" },
|
||||
"categoryName23": { "message": "Ferramenta de Cache" },
|
||||
"categoryName24": { "message": "Editor WYSIWYG" },
|
||||
"categoryName25": { "message": "Gráficos JavaScript" },
|
||||
"categoryName26": { "message": "Framework Mobile" },
|
||||
"categoryName27": { "message": "Linguagem de Programação" },
|
||||
"categoryName28": { "message": "Sistema Operativo" },
|
||||
"categoryName29": { "message": "Motor de Busca" },
|
||||
"categoryName30": { "message": "Web Mail" },
|
||||
"categoryName31": { "message": "CDN" },
|
||||
"categoryName32": { "message": "Automação de Marketing" },
|
||||
"categoryName33": { "message": "Extensão de Servidor Web" },
|
||||
"categoryName34": { "message": "Base de Dados" },
|
||||
"categoryName35": { "message": "Mapa" },
|
||||
"categoryName36": { "message": "Rede de Publicidade" },
|
||||
"categoryName37": { "message": "Serviço de Rede" },
|
||||
"categoryName38": { "message": "Servidor de Média" },
|
||||
"categoryName39": { "message": "Webcam" },
|
||||
"categoryName40": { "message": "Impressão" },
|
||||
"categoryName41": { "message": "Processador de Pagamento" },
|
||||
"categoryName42": { "message": "Gestor de Etiquetas" },
|
||||
"categoryName43": { "message": "Sistema de Subscrição Paga" },
|
||||
"categoryName44": { "message": "Sistema Build/CI" },
|
||||
"categoryName45": { "message": "Sistema SCADA" },
|
||||
"categoryName46": { "message": "Acesso Remoto" },
|
||||
"categoryName47": { "message": "Ferramenta de Desenvolvimento" },
|
||||
"categoryName48": { "message": "Rede de Armazenamento" },
|
||||
"categoryName49": { "message": "Leitores de Feed" },
|
||||
"categoryName50": { "message": "Sistema de Gestão de Documentos" },
|
||||
"categoryName51": { "message": "Criador de Páginas de Destino" },
|
||||
"categoryName52": { "message": "Chat ao Vivo" },
|
||||
"categoryName53": { "message": "CRM" },
|
||||
"categoryName54": { "message": "SEO" },
|
||||
"categoryName55": { "message": "Contabilidade" },
|
||||
"categoryName56": { "message": "Cryptominer" },
|
||||
"categoryName57": { "message": "Gerador de Site Estático" },
|
||||
"categoryName58": { "message": "User Onboarding" },
|
||||
"categoryName59": { "message": "JavaScript Libraries" },
|
||||
"categoryName60": { "message": "Containers" },
|
||||
"categoryName61": { "message": "SaaS" },
|
||||
"categoryName62": { "message": "PaaS" },
|
||||
"categoryName63": { "message": "IaaS" }
|
||||
}
|
||||
|
@ -0,0 +1,79 @@
|
||||
{
|
||||
"github": { "message": "Fork Wappalyzer no GitHub!" },
|
||||
"twitter": { "message": "Seguir o Wappalyzer no Twitter" },
|
||||
"website": { "message": "Ir para wappalyzer.com" },
|
||||
"options": { "message": "Configurações" },
|
||||
"optionsSave": { "message": "Salvar configurações" },
|
||||
"optionsSaved": { "message": "Salvo" },
|
||||
"optionUpgradeMessage": { "message": "Atualizações automáticas" },
|
||||
"optionDynamicIcon": { "message": "Utilizar o ícone da tecnologia ao invés da logo do Wappalyzer" },
|
||||
"optionTracking": { "message": "Enviar relatórios anônimos para wappalyzer.com sobre tecnologias identificadas" },
|
||||
"nothingToDo": { "message": "Nada a fazer aqui." },
|
||||
"noAppsDetected": { "message": "Nenhuma tecnologia identificada." },
|
||||
"categoryPin": { "message": "Sempre mostrar ícone" },
|
||||
"termsAccept": { "message": "Accept" },
|
||||
"termsContent": { "message": "This extension sends anonymous information about websites you visit, including domain name and identified technologies, to <a href='https://www.wappalyzer.com'>wappalyzer.com</a>. This can be disabled in the settings." },
|
||||
"categoryName1": { "message": "CMS" },
|
||||
"categoryName2": { "message": "Fórum" },
|
||||
"categoryName3": { "message": "Gestão de banco de dados" },
|
||||
"categoryName4": { "message": "Ferramenta de documentação" },
|
||||
"categoryName5": { "message": "Widget" },
|
||||
"categoryName6": { "message": "Ecommerce" },
|
||||
"categoryName7": { "message": "Galeria de fotografias" },
|
||||
"categoryName8": { "message": "Wiki" },
|
||||
"categoryName9": { "message": "Gestão de servidores" },
|
||||
"categoryName10": { "message": "Ferramenta estatística" },
|
||||
"categoryName11": { "message": "Blog" },
|
||||
"categoryName12": { "message": "Framework JavaScript" },
|
||||
"categoryName13": { "message": "Rastreamento de problemas" },
|
||||
"categoryName14": { "message": "Reprodutor de vídeo" },
|
||||
"categoryName15": { "message": "Sistema de comentários" },
|
||||
"categoryName16": { "message": "Captcha" },
|
||||
"categoryName17": { "message": "Script de fonte" },
|
||||
"categoryName18": { "message": "Framework web" },
|
||||
"categoryName19": { "message": "Diversos" },
|
||||
"categoryName20": { "message": "Editor" },
|
||||
"categoryName21": { "message": "LMS" },
|
||||
"categoryName22": { "message": "Servidor web" },
|
||||
"categoryName23": { "message": "Ferramenta de cache" },
|
||||
"categoryName24": { "message": "Editor WYSIWYG" },
|
||||
"categoryName25": { "message": "Gráfico JavaScript" },
|
||||
"categoryName26": { "message": "Framework mobile" },
|
||||
"categoryName27": { "message": "Linguagem de programação" },
|
||||
"categoryName28": { "message": "Sistema Operacional" },
|
||||
"categoryName29": { "message": "Motor de pesquisa" },
|
||||
"categoryName30": { "message": "Web Mail" },
|
||||
"categoryName31": { "message": "CDN" },
|
||||
"categoryName32": { "message": "Automação de marketing" },
|
||||
"categoryName33": { "message": "Extensão de servidor web" },
|
||||
"categoryName34": { "message": "Banco de dados" },
|
||||
"categoryName35": { "message": "Mapa" },
|
||||
"categoryName36": { "message": "Rede de publicidade" },
|
||||
"categoryName37": { "message": "Serviço de rede" },
|
||||
"categoryName38": { "message": "Servidor de mídia" },
|
||||
"categoryName39": { "message": "Webcam" },
|
||||
"categoryName40": { "message": "Impressora" },
|
||||
"categoryName41": { "message": "Serviço de pagamento" },
|
||||
"categoryName42": { "message": "Gestor de Tags" },
|
||||
"categoryName43": { "message": "Paywall" },
|
||||
"categoryName44": { "message": "Sistema de Build/CI" },
|
||||
"categoryName45": { "message": "Sistema SCADA" },
|
||||
"categoryName46": { "message": "Acesso remoto" },
|
||||
"categoryName47": { "message": "Ferramenta de desenvolvimento" },
|
||||
"categoryName48": { "message": "Armazenamento na rede" },
|
||||
"categoryName49": { "message": "Leitor de feed" },
|
||||
"categoryName50": { "message": "Sistema de gestão de documentos" },
|
||||
"categoryName51": { "message": "Landing Page Builder" },
|
||||
"categoryName52": { "message": "Chat direto" },
|
||||
"categoryName53": { "message": "CRM" },
|
||||
"categoryName54": { "message": "SEO" },
|
||||
"categoryName55": { "message": "Contabilidade" },
|
||||
"categoryName56": { "message": "Minerador de cryptomoedas" },
|
||||
"categoryName57": { "message": "Gerador de sites estáticos" },
|
||||
"categoryName58": { "message": "Integração com usuário" },
|
||||
"categoryName59": { "message": "Biblioteca JavaScript" },
|
||||
"categoryName60": { "message": "Containers" },
|
||||
"categoryName61": { "message": "SaaS" },
|
||||
"categoryName62": { "message": "PaaS" },
|
||||
"categoryName63": { "message": "IaaS" }
|
||||
}
|
@ -1,67 +1,79 @@
|
||||
{
|
||||
"github": { "message": "Forknite Wappalyzer na GitHube!" },
|
||||
"twitter": { "message": "Sledujte Wappalyzer na Twitteri" },
|
||||
"website": { "message": "Prejdite na adresu wappalyzer.com" },
|
||||
"options": { "message": "Možnosti" },
|
||||
"optionsSave": { "message": "Uložiť možnosti" },
|
||||
"optionsSaved": { "message": "Uložené" },
|
||||
"optionUpgradeMessage": { "message": "Povedzte mi o upgradoch" },
|
||||
"optionDynamicIcon": { "message": "Použiť ikonu aplikácie namiesto loga Wappalyzer" },
|
||||
"optionTracking": { "message": "Anonymne posielať správy o zistených aplikáciách na wappalyzer.com pre výskum" },
|
||||
"nothingToDo": { "message": "Nie je tu čo robiť." },
|
||||
"noAppsDetected": { "message": "Žiadne aplikácie neboli zistené." },
|
||||
"categoryName1": { "message": "CMS" },
|
||||
"categoryName2": { "message": "Message Board" },
|
||||
"categoryName3": { "message": "Správca databáz" },
|
||||
"categoryName4": { "message": "Dokumentačný nástroj" },
|
||||
"categoryName5": { "message": "Widget" },
|
||||
"categoryName6": { "message": "E-commerce" },
|
||||
"categoryName7": { "message": "Fotogalérie" },
|
||||
"categoryName8": { "message": "Wiki" },
|
||||
"categoryName9": { "message": "Hosting panely" },
|
||||
"categoryName10": { "message": "Analytika" },
|
||||
"categoryName11": { "message": "Blog" },
|
||||
"categoryName12": { "message": "JavaScript Framework" },
|
||||
"categoryName13": { "message": "Issue Tracker" },
|
||||
"categoryName14": { "message": "Video prehrávač" },
|
||||
"categoryName15": { "message": "Systém komentárov" },
|
||||
"categoryName16": { "message": "Captcha" },
|
||||
"categoryName17": { "message": "Font Script" },
|
||||
"categoryName18": { "message": "Web Framework" },
|
||||
"categoryName19": { "message": "Rôzne" },
|
||||
"categoryName20": { "message": "Editor" },
|
||||
"categoryName21": { "message": "LMS" },
|
||||
"categoryName22": { "message": "Webový server" },
|
||||
"categoryName23": { "message": "Cache nástroj" },
|
||||
"categoryName24": { "message": "Rich Text editor" },
|
||||
"categoryName25": { "message": "JavaScript Grafika" },
|
||||
"categoryName26": { "message": "Mobile Framework" },
|
||||
"categoryName27": { "message": "Programovací jazyk" },
|
||||
"categoryName28": { "message": "Operačný systém" },
|
||||
"categoryName29": { "message": "Vyhľadávač" },
|
||||
"categoryName30": { "message": "Webmail" },
|
||||
"categoryName31": { "message": "CDN" },
|
||||
"categoryName32": { "message": "Marketingová automatizácia" },
|
||||
"categoryName33": { "message": "Rozšírenie webového servera" },
|
||||
"categoryName34": { "message": "Databáza" },
|
||||
"categoryName35": { "message": "Mapa" },
|
||||
"categoryName36": { "message": "Reklamná sieť" },
|
||||
"categoryName37": { "message": "Sieťová služba" },
|
||||
"categoryName38": { "message": "Media Server" },
|
||||
"categoryName39": { "message": "Webkamera" },
|
||||
"categoryName40": { "message": "Tlačiareň" },
|
||||
"categoryName41": { "message": "Platobný procesor" },
|
||||
"categoryName42": { "message": "Správca tagov" },
|
||||
"categoryName43": { "message": "Platobná brána" },
|
||||
"categoryName44": { "message": "Build/CI systém" },
|
||||
"categoryName45": { "message": "SCADA systém" },
|
||||
"categoryName46": { "message": "Vzdialený prístup" },
|
||||
"categoryName47": { "message": "Vývojový nástroj" },
|
||||
"categoryName48": { "message": "Sieťové úložisko" },
|
||||
"categoryName49": { "message": "Čítačky feedu" },
|
||||
"categoryName50": { "message": "Systémy správy dokumentov" },
|
||||
"categoryName51": { "message": "Nástroj na tvorbu vstupnej stránky" },
|
||||
"categoryName52": { "message": "Živý chat" },
|
||||
"categoryName53": { "message": "CRM" },
|
||||
"categoryName54": { "message": "SEO" }
|
||||
"github": { "message": "Forknite Wappalyzer na GitHube!" },
|
||||
"twitter": { "message": "Sledujte Wappalyzer na Twitteri" },
|
||||
"website": { "message": "Prejdite na adresu wappalyzer.com" },
|
||||
"options": { "message": "Možnosti" },
|
||||
"optionsSave": { "message": "Uložiť možnosti" },
|
||||
"optionsSaved": { "message": "Uložené" },
|
||||
"optionUpgradeMessage": { "message": "Povedzte mi o upgradoch" },
|
||||
"optionDynamicIcon": { "message": "Použiť ikonu aplikácie namiesto loga Wappalyzer" },
|
||||
"optionTracking": { "message": "Anonymne posielať správy o zistených aplikáciách na wappalyzer.com pre výskum" },
|
||||
"nothingToDo": { "message": "Nie je tu čo robiť." },
|
||||
"noAppsDetected": { "message": "Žiadne aplikácie neboli zistené." },
|
||||
"categoryPin": { "message": "Always show icon" },
|
||||
"termsAccept": { "message": "Accept" },
|
||||
"termsContent": { "message": "This extension sends anonymous information about websites you visit, including domain name and identified technologies, to <a href='https://www.wappalyzer.com'>wappalyzer.com</a>. This can be disabled in the settings." },
|
||||
"categoryName1": { "message": "CMS" },
|
||||
"categoryName2": { "message": "Message Board" },
|
||||
"categoryName3": { "message": "Správca databáz" },
|
||||
"categoryName4": { "message": "Dokumentačný nástroj" },
|
||||
"categoryName5": { "message": "Widget" },
|
||||
"categoryName6": { "message": "E-commerce" },
|
||||
"categoryName7": { "message": "Fotogalérie" },
|
||||
"categoryName8": { "message": "Wiki" },
|
||||
"categoryName9": { "message": "Hosting panely" },
|
||||
"categoryName10": { "message": "Analytika" },
|
||||
"categoryName11": { "message": "Blog" },
|
||||
"categoryName12": { "message": "JavaScript Framework" },
|
||||
"categoryName13": { "message": "Issue Tracker" },
|
||||
"categoryName14": { "message": "Video prehrávač" },
|
||||
"categoryName15": { "message": "Systém komentárov" },
|
||||
"categoryName16": { "message": "Captcha" },
|
||||
"categoryName17": { "message": "Font Script" },
|
||||
"categoryName18": { "message": "Web Framework" },
|
||||
"categoryName19": { "message": "Rôzne" },
|
||||
"categoryName20": { "message": "Editor" },
|
||||
"categoryName21": { "message": "LMS" },
|
||||
"categoryName22": { "message": "Webový server" },
|
||||
"categoryName23": { "message": "Cache nástroj" },
|
||||
"categoryName24": { "message": "Rich Text editor" },
|
||||
"categoryName25": { "message": "JavaScript Grafika" },
|
||||
"categoryName26": { "message": "Mobile Framework" },
|
||||
"categoryName27": { "message": "Programovací jazyk" },
|
||||
"categoryName28": { "message": "Operačný systém" },
|
||||
"categoryName29": { "message": "Vyhľadávač" },
|
||||
"categoryName30": { "message": "Webmail" },
|
||||
"categoryName31": { "message": "CDN" },
|
||||
"categoryName32": { "message": "Marketingová automatizácia" },
|
||||
"categoryName33": { "message": "Rozšírenie webového servera" },
|
||||
"categoryName34": { "message": "Databáza" },
|
||||
"categoryName35": { "message": "Mapa" },
|
||||
"categoryName36": { "message": "Reklamná sieť" },
|
||||
"categoryName37": { "message": "Sieťová služba" },
|
||||
"categoryName38": { "message": "Media Server" },
|
||||
"categoryName39": { "message": "Webkamera" },
|
||||
"categoryName40": { "message": "Tlačiareň" },
|
||||
"categoryName41": { "message": "Platobný procesor" },
|
||||
"categoryName42": { "message": "Správca tagov" },
|
||||
"categoryName43": { "message": "Platobná brána" },
|
||||
"categoryName44": { "message": "Build/CI systém" },
|
||||
"categoryName45": { "message": "SCADA systém" },
|
||||
"categoryName46": { "message": "Vzdialený prístup" },
|
||||
"categoryName47": { "message": "Vývojový nástroj" },
|
||||
"categoryName48": { "message": "Sieťové úložisko" },
|
||||
"categoryName49": { "message": "Čítačky feedu" },
|
||||
"categoryName50": { "message": "Systémy správy dokumentov" },
|
||||
"categoryName51": { "message": "Nástroj na tvorbu vstupnej stránky" },
|
||||
"categoryName52": { "message": "Živý chat" },
|
||||
"categoryName53": { "message": "CRM" },
|
||||
"categoryName54": { "message": "SEO" },
|
||||
"categoryName55": { "message": "Accounting" },
|
||||
"categoryName56": { "message": "Cryptominer" },
|
||||
"categoryName57": { "message": "Static Site Generator" },
|
||||
"categoryName58": { "message": "User Onboarding" },
|
||||
"categoryName59": { "message": "JavaScript Libraries" },
|
||||
"categoryName60": { "message": "Containers" },
|
||||
"categoryName61": { "message": "SaaS" },
|
||||
"categoryName62": { "message": "PaaS" },
|
||||
"categoryName63": { "message": "IaaS" }
|
||||
}
|
||||
|
After Width: | Height: | Size: 1.3 KiB |
After Width: | Height: | Size: 1.3 KiB |
@ -1,69 +1,84 @@
|
||||
/** global: browser */
|
||||
/** global: XMLSerializer */
|
||||
|
||||
if ( typeof browser !== 'undefined' && typeof document.body !== 'undefined' ) {
|
||||
/* global browser, chrome */
|
||||
/* eslint-env browser */
|
||||
|
||||
function sendMessage(id, subject, callback) {
|
||||
(chrome || browser).runtime.sendMessage({
|
||||
id,
|
||||
subject,
|
||||
source: 'content.js',
|
||||
}, callback || (() => {}));
|
||||
}
|
||||
|
||||
if (typeof browser !== 'undefined' && typeof document.body !== 'undefined') {
|
||||
try {
|
||||
var html = new XMLSerializer().serializeToString(document);
|
||||
sendMessage('init', {});
|
||||
|
||||
// HTML
|
||||
let html = new XMLSerializer().serializeToString(document);
|
||||
|
||||
const chunks = [];
|
||||
const maxCols = 2000;
|
||||
const maxRows = 3000;
|
||||
const rows = html.length / maxCols;
|
||||
|
||||
let i;
|
||||
|
||||
if ( html.length > 50000 ) {
|
||||
html = html.substring(0, 25000) + html.substring(html.length - 25000, html.length);
|
||||
for (i = 0; i < rows; i += 1) {
|
||||
if (i < maxRows / 2 || i > rows - maxRows / 2) {
|
||||
chunks.push(html.slice(i * maxCols, (i + 1) * maxCols));
|
||||
}
|
||||
}
|
||||
|
||||
html = chunks.join('\n');
|
||||
|
||||
// Scripts
|
||||
const scripts = Array.prototype.slice
|
||||
.apply(document.scripts)
|
||||
.filter(script => script.src)
|
||||
.map(script => script.src);
|
||||
.map(script => script.src)
|
||||
.filter(script => script.indexOf('data:text/javascript;') !== 0);
|
||||
|
||||
browser.runtime.sendMessage({
|
||||
id: 'analyze',
|
||||
subject: { html, scripts },
|
||||
source: 'content.js'
|
||||
});
|
||||
sendMessage('analyze', { html, scripts });
|
||||
|
||||
// JavaScript variables
|
||||
const script = document.createElement('script');
|
||||
|
||||
script.onload = () => {
|
||||
addEventListener('message', event => {
|
||||
if ( event.data.id !== 'js' ) {
|
||||
const onMessage = (event) => {
|
||||
if (event.data.id !== 'js') {
|
||||
return;
|
||||
}
|
||||
|
||||
browser.runtime.sendMessage({
|
||||
id: 'analyze',
|
||||
subject: {
|
||||
js: event.data.js
|
||||
},
|
||||
source: 'content.js'
|
||||
});
|
||||
}, true);
|
||||
|
||||
( chrome || browser ).runtime.sendMessage({
|
||||
id: 'init_js',
|
||||
subject: {},
|
||||
source: 'content.js'
|
||||
}, response => {
|
||||
if ( response ) {
|
||||
window.removeEventListener('message', onMessage);
|
||||
|
||||
sendMessage('analyze', { js: event.data.js });
|
||||
|
||||
script.remove();
|
||||
};
|
||||
|
||||
window.addEventListener('message', onMessage);
|
||||
|
||||
sendMessage('get_js_patterns', {}, (response) => {
|
||||
if (response) {
|
||||
postMessage({
|
||||
id: 'patterns',
|
||||
patterns: response.patterns
|
||||
}, '*');
|
||||
patterns: response.patterns,
|
||||
}, window.location.href);
|
||||
}
|
||||
});
|
||||
};
|
||||
|
||||
script.setAttribute('id', 'wappalyzer');
|
||||
script.setAttribute('src', browser.extension.getURL('js/inject.js'));
|
||||
|
||||
document.body.appendChild(script);
|
||||
} catch (e) {
|
||||
log(e);
|
||||
sendMessage('log', e);
|
||||
}
|
||||
}
|
||||
|
||||
function log(message) {
|
||||
browser.runtime.sendMessage({
|
||||
id: 'log',
|
||||
message,
|
||||
source: 'content.js'
|
||||
});
|
||||
}
|
||||
// https://stackoverflow.com/a/44774834
|
||||
// https://developer.mozilla.org/en-US/Add-ons/WebExtensions/API/tabs/executeScript#Return_value
|
||||
undefined; // eslint-disable-line no-unused-expressions
|
||||
|
@ -1,63 +0,0 @@
|
||||
jsonToDOM.namespaces = {
|
||||
html: "http://www.w3.org/1999/xhtml",
|
||||
xul: "http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"
|
||||
};
|
||||
|
||||
jsonToDOM.defaultNamespace = jsonToDOM.namespaces.html;
|
||||
|
||||
function jsonToDOM(jsonTemplate, doc, nodes) {
|
||||
function namespace(name) {
|
||||
var reElemNameParts = /^(?:(.*):)?(.*)$/.exec(name);
|
||||
return { namespace: jsonToDOM.namespaces[reElemNameParts[1]], shortName: reElemNameParts[2] };
|
||||
}
|
||||
|
||||
// Note that 'elemNameOrArray' is: either the full element name (eg. [html:]div) or an array of elements in JSON notation
|
||||
function tag(elemNameOrArray, elemAttr) {
|
||||
// Array of elements? Parse each one...
|
||||
if (Array.isArray(elemNameOrArray)) {
|
||||
var frag = doc.createDocumentFragment();
|
||||
Array.prototype.forEach.call(arguments, function(thisElem) {
|
||||
frag.appendChild(tag.apply(null, thisElem));
|
||||
});
|
||||
return frag;
|
||||
}
|
||||
|
||||
// Single element? Parse element namespace prefix (if none exists, default to defaultNamespace), and create element
|
||||
var elemNs = namespace(elemNameOrArray);
|
||||
var elem = doc.createElementNS(elemNs.namespace || jsonToDOM.defaultNamespace, elemNs.shortName);
|
||||
|
||||
// Set element's attributes and/or callback functions (eg. onclick)
|
||||
for (var key in elemAttr) {
|
||||
var val = elemAttr[key];
|
||||
if (nodes && key == "key") {
|
||||
nodes[val] = elem;
|
||||
continue;
|
||||
}
|
||||
|
||||
var attrNs = namespace(key);
|
||||
if (typeof val == "function") {
|
||||
// Special case for function attributes; don't just add them as 'on...' attributes, but as events, using addEventListener
|
||||
elem.addEventListener(key.replace(/^on/, ""), val, false);
|
||||
}
|
||||
else {
|
||||
// Note that the default namespace for XML attributes is, and should be, blank (ie. they're not in any namespace)
|
||||
elem.setAttributeNS(attrNs.namespace || "", attrNs.shortName, val);
|
||||
}
|
||||
}
|
||||
|
||||
// Create and append this element's children
|
||||
var childElems = Array.prototype.slice.call(arguments, 2);
|
||||
childElems.forEach(function(childElem) {
|
||||
if (childElem != null) {
|
||||
elem.appendChild(
|
||||
childElem instanceof doc.defaultView.Node ? childElem :
|
||||
Array.isArray(childElem) ? tag.apply(null, childElem) :
|
||||
doc.createTextNode(childElem));
|
||||
}
|
||||
});
|
||||
|
||||
return elem;
|
||||
}
|
||||
|
||||
return tag.apply(null, jsonTemplate);
|
||||
}
|
@ -0,0 +1,63 @@
|
||||
jsonToDOM.namespaces = {
|
||||
html: 'http://www.w3.org/1999/xhtml',
|
||||
xul: 'http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul',
|
||||
};
|
||||
|
||||
jsonToDOM.defaultNamespace = jsonToDOM.namespaces.html;
|
||||
|
||||
function jsonToDOM(jsonTemplate, doc, nodes) {
|
||||
function namespace(name) {
|
||||
const reElemNameParts = /^(?:(.*):)?(.*)$/.exec(name);
|
||||
return { namespace: jsonToDOM.namespaces[reElemNameParts[1]], shortName: reElemNameParts[2] };
|
||||
}
|
||||
|
||||
// Note that 'elemNameOrArray' is: either the full element name (eg. [html:]div) or an array of elements in JSON notation
|
||||
function tag(elemNameOrArray, elemAttr) {
|
||||
// Array of elements? Parse each one...
|
||||
if (Array.isArray(elemNameOrArray)) {
|
||||
const frag = doc.createDocumentFragment();
|
||||
Array.prototype.forEach.call(arguments, (thisElem) => {
|
||||
frag.appendChild(tag(...thisElem));
|
||||
});
|
||||
return frag;
|
||||
}
|
||||
|
||||
// Single element? Parse element namespace prefix (if none exists, default to defaultNamespace), and create element
|
||||
const elemNs = namespace(elemNameOrArray);
|
||||
const elem = doc.createElementNS(elemNs.namespace || jsonToDOM.defaultNamespace, elemNs.shortName);
|
||||
|
||||
// Set element's attributes and/or callback functions (eg. onclick)
|
||||
for (const key in elemAttr) {
|
||||
const val = elemAttr[key];
|
||||
if (nodes && key == 'key') {
|
||||
nodes[val] = elem;
|
||||
continue;
|
||||
}
|
||||
|
||||
const attrNs = namespace(key);
|
||||
if (typeof val === 'function') {
|
||||
// Special case for function attributes; don't just add them as 'on...' attributes, but as events, using addEventListener
|
||||
elem.addEventListener(key.replace(/^on/, ''), val, false);
|
||||
} else {
|
||||
// Note that the default namespace for XML attributes is, and should be, blank (ie. they're not in any namespace)
|
||||
elem.setAttributeNS(attrNs.namespace || '', attrNs.shortName, val);
|
||||
}
|
||||
}
|
||||
|
||||
// Create and append this element's children
|
||||
const childElems = Array.prototype.slice.call(arguments, 2);
|
||||
childElems.forEach((childElem) => {
|
||||
if (childElem != null) {
|
||||
elem.appendChild(
|
||||
childElem instanceof doc.defaultView.Node ? childElem
|
||||
: Array.isArray(childElem) ? tag(...childElem)
|
||||
: doc.createTextNode(childElem),
|
||||
);
|
||||
}
|
||||
});
|
||||
|
||||
return elem;
|
||||
}
|
||||
|
||||
return tag(...jsonTemplate);
|
||||
}
|
@ -0,0 +1,792 @@
|
||||
(function () {
|
||||
function isChrome() {
|
||||
return (typeof chrome !== 'undefined'
|
||||
&& window.navigator.userAgent.match(/Chrom(?:e|ium)\/([0-9\.]+)/));
|
||||
}
|
||||
|
||||
let browserProxy;
|
||||
if (isChrome()) {
|
||||
browserProxy = chrome;
|
||||
} else {
|
||||
browserProxy = browser;
|
||||
}
|
||||
|
||||
const MIN_FF_MAJOR_VERSION = 51;
|
||||
|
||||
const requiredBrowserApis = [
|
||||
browserProxy.webNavigation,
|
||||
browserProxy.tabs,
|
||||
browserProxy.webRequest,
|
||||
browserProxy.runtime,
|
||||
];
|
||||
let areListenersRegistered = false;
|
||||
const secBefore = 2000;
|
||||
const secAfter = 5000;
|
||||
const secBetweenDupAssets = 10e3;
|
||||
const minVidSize = 500e3;
|
||||
const maxVidSize = 25e6;
|
||||
const maxContentRange = 25e6;
|
||||
const videoExtensions = [
|
||||
'af', '3gp', 'asf', 'avchd', 'avi', 'cam', 'dsh', 'flv', 'm1v', 'm2v',
|
||||
'fla', 'flr', 'sol', 'm4v', 'mkv', 'wrap', 'mng', 'mov', 'mpeg', 'mpg',
|
||||
'mpe', 'mp4', 'mxf', 'nsv', 'ogg', 'rm', 'svi', 'smi', 'wmv', 'webm',
|
||||
];
|
||||
const extensionsReg = new RegExp(`\\.${videoExtensions.join('$|\\.')}$`);
|
||||
const videoContentTypesPrefixes = ['binary/octet-stream', 'video/', 'flv-application/', 'media'];
|
||||
|
||||
const bannedContentTypes = ['video/mp2t', 'video/f4m', 'video/f4f'];
|
||||
const bannedFiletypes = ['ts'];
|
||||
const bannedFiletypesReg = new RegExp(`\\.${bannedFiletypes.join('$|\\.')}$`);
|
||||
const whitelistReqTypes = ['object', 'xmlhttprequest', 'other'];
|
||||
|
||||
const topVideoAssetDomains = [
|
||||
'2mdn.net',
|
||||
'adap.tv',
|
||||
'adnxs.com',
|
||||
'adsrvr.org',
|
||||
'btrll.com',
|
||||
'celtra.com',
|
||||
'flashtalking.com',
|
||||
'flite.com',
|
||||
'innovid.com',
|
||||
'jivox.com',
|
||||
'mixpo.com',
|
||||
'nytimes.com',
|
||||
'playwire.com',
|
||||
'selectmedia.asia',
|
||||
'serving-sys.com',
|
||||
'solvemedia.com',
|
||||
'spotible.com',
|
||||
'teads.tv',
|
||||
'tribalfusion.com',
|
||||
'tubemogul.com',
|
||||
'videologygroup.com',
|
||||
'washingtonpost.com',
|
||||
];
|
||||
|
||||
const robotsTxtAllows = wappalyzer.robotsTxtAllows.bind(wappalyzer);
|
||||
if (!String.prototype.endsWith) {
|
||||
String.prototype.endsWith = function (searchString, position) {
|
||||
const subjectString = this.toString();
|
||||
if (typeof position !== 'number' || !isFinite(position)
|
||||
|| Math.floor(position) !== position || position > subjectString.length) {
|
||||
position = subjectString.length;
|
||||
}
|
||||
position -= searchString.length;
|
||||
const lastIndex = subjectString.indexOf(searchString, position);
|
||||
return lastIndex !== -1 && lastIndex === position;
|
||||
};
|
||||
}
|
||||
|
||||
function getFrame(getFrameDetails, callback) {
|
||||
if (isChrome()) {
|
||||
chrome.webNavigation.getFrame(getFrameDetails, callback);
|
||||
} else if (typeof browser !== 'undefined') {
|
||||
const gettingFrame = browser.webNavigation.getFrame(getFrameDetails);
|
||||
gettingFrame.then(callback);
|
||||
}
|
||||
}
|
||||
|
||||
function ifBrowserValid(callback, elseCallback) {
|
||||
if (isChrome()) {
|
||||
callback();
|
||||
} else if (typeof browser !== 'undefined') {
|
||||
try {
|
||||
const gettingInfo = browser.runtime.getBrowserInfo();
|
||||
gettingInfo.then((browserInfo) => {
|
||||
const browserVersion = parseInt(browserInfo.version.split('.')[0]);
|
||||
|
||||
if (browserInfo.name === 'Firefox'
|
||||
&& browserVersion >= MIN_FF_MAJOR_VERSION) {
|
||||
callback();
|
||||
} else {
|
||||
elseCallback();
|
||||
}
|
||||
});
|
||||
} catch (err) {
|
||||
elseCallback();
|
||||
}
|
||||
} else {
|
||||
elseCallback();
|
||||
}
|
||||
}
|
||||
|
||||
function ifTrackingEnabled(details, ifCallback, elseCallback) {
|
||||
const fullIfCallback = function () {
|
||||
allowedByRobotsTxt(details, ifCallback, elseCallback);
|
||||
};
|
||||
|
||||
browser.storage.local.get('tracking').then((item) => {
|
||||
if (item.hasOwnProperty('tracking')) {
|
||||
if (item.tracking) {
|
||||
fullIfCallback();
|
||||
} else {
|
||||
elseCallback();
|
||||
}
|
||||
} else {
|
||||
fullIfCallback();
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
function allowedByRobotsTxt(details, ifCallback, elseCallback) {
|
||||
if (details.url && !details.url.startsWith('chrome://')) {
|
||||
robotsTxtAllows(details.url).then(ifCallback, elseCallback);
|
||||
} else {
|
||||
elseCallback();
|
||||
}
|
||||
}
|
||||
|
||||
function isPixelRequest(request) {
|
||||
return (request.type === 'image' || request.responseStatus === 204)
|
||||
&& request.size <= 1000;
|
||||
}
|
||||
|
||||
function isVpaidOrVastRequest(request) {
|
||||
const lowerCaseUrl = request.url.toLowerCase();
|
||||
return lowerCaseUrl.indexOf('vpaid') !== -1 || lowerCaseUrl.indexOf('vast') !== -1;
|
||||
}
|
||||
|
||||
function hasValidRequestType(request) {
|
||||
return whitelistReqTypes.indexOf(request.type) >= 0;
|
||||
}
|
||||
|
||||
function stripQueryParams(url) {
|
||||
return url.split('?', 1)[0];
|
||||
}
|
||||
|
||||
function parseHostnameFromUrl(url) {
|
||||
const parser = document.createElement('a');
|
||||
parser.href = url;
|
||||
return parser.hostname;
|
||||
}
|
||||
|
||||
function hasDomain(url, domain) {
|
||||
return parseHostnameFromUrl(url).endsWith(domain);
|
||||
}
|
||||
|
||||
function findHeader(headers, key) {
|
||||
let header;
|
||||
for (let i = 0; i < headers.length; i += 1) {
|
||||
header = headers[i];
|
||||
if (header.name.toLowerCase() === key) {
|
||||
return header;
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
function validVideoType(vtype) {
|
||||
const goodType = videoContentTypesPrefixes.some(prefix => vtype.indexOf(prefix) === 0);
|
||||
return goodType;
|
||||
}
|
||||
|
||||
function assetMsgKey(assetReq) {
|
||||
const url = stripQueryParams(assetReq.url);
|
||||
const key = `${assetReq.frameId}-${url}`;
|
||||
return key;
|
||||
}
|
||||
|
||||
const PageNetworkTrafficCollector = function (tabId) {
|
||||
this.tabId = tabId;
|
||||
this.displayAdFound = false;
|
||||
this.requests = {};
|
||||
this.msgsBeingSent = {};
|
||||
this.assetsSeen = {};
|
||||
this.allRedirects = {};
|
||||
};
|
||||
|
||||
var globalPageContainer = {
|
||||
collectors: {},
|
||||
dyingCollectors: {},
|
||||
|
||||
cleanupCollector(tabId) {
|
||||
if (tabId in this.collectors) {
|
||||
delete globalPageContainer.collectors[tabId];
|
||||
}
|
||||
},
|
||||
|
||||
onNewNavigation(details) {
|
||||
const tabId = details.tabId;
|
||||
this.cleanupCollector(tabId);
|
||||
|
||||
ifTrackingEnabled(
|
||||
details,
|
||||
() => {
|
||||
if (!areListenersRegistered) {
|
||||
registerListeners();
|
||||
}
|
||||
this.collectors[tabId] = new PageNetworkTrafficCollector(tabId);
|
||||
},
|
||||
() => {
|
||||
if (areListenersRegistered) {
|
||||
unregisterListeners();
|
||||
}
|
||||
},
|
||||
);
|
||||
},
|
||||
|
||||
onNavigationCommitted(details) {
|
||||
|
||||
},
|
||||
|
||||
onNavigationCompleted(details) {
|
||||
|
||||
},
|
||||
|
||||
onTabClose(tabId, closeInfo) {
|
||||
this.cleanupCollector(tabId);
|
||||
delete this.collectors[tabId];
|
||||
},
|
||||
|
||||
onDisplayAdFound(tabId) {
|
||||
this.collectors[tabId].displayAdFound = true;
|
||||
},
|
||||
|
||||
getRandId() {
|
||||
return String(Math.floor(Math.random() * 1e9));
|
||||
},
|
||||
|
||||
getCollector(tabId) {
|
||||
if (this.collectors.hasOwnProperty(tabId)) {
|
||||
return this.collectors[tabId];
|
||||
}
|
||||
return null;
|
||||
},
|
||||
|
||||
forwardCall(details, collectorMemberFunction) {
|
||||
const collector = this.getCollector(details.tabId);
|
||||
if (collector !== null) {
|
||||
collectorMemberFunction.apply(collector, [details]);
|
||||
}
|
||||
},
|
||||
};
|
||||
|
||||
PageNetworkTrafficCollector.prototype.sendLogMessageToTabConsole = function () {
|
||||
const logMessage = Array.from(arguments).join(' ');
|
||||
const message = { message: logMessage, event: 'console-log-message' };
|
||||
browserProxy.tabs.sendMessage(this.tabId, message);
|
||||
};
|
||||
|
||||
PageNetworkTrafficCollector.prototype.sendToTab = function (assetReq, reqs, curPageUrl, adTrackingEvent) {
|
||||
const msg = {};
|
||||
msg.assets = [];
|
||||
msg.requests = [];
|
||||
msg.event_data = {};
|
||||
msg.event = adTrackingEvent;
|
||||
if (adTrackingEvent === 'new-video-ad') {
|
||||
msg.requests = reqs;
|
||||
msg.requests.sort((reqA, reqB) => reqA.requestTimestamp - reqB.requestTimestamp);
|
||||
if (assetReq) {
|
||||
msg.assets = [assetReq];
|
||||
}
|
||||
} else if (adTrackingEvent === 'new-invalid-video-ad') {
|
||||
msg.requests = reqs.map(request => parseHostnameFromUrl(request.url));
|
||||
msg.assets = [{
|
||||
|
||||
url: parseHostnameFromUrl(assetReq.url),
|
||||
|
||||
contentType: assetReq.contentType,
|
||||
size: assetReq.size,
|
||||
}];
|
||||
}
|
||||
msg.origUrl = curPageUrl;
|
||||
msg.displayAdFound = this.displayAdFound;
|
||||
|
||||
browserProxy.tabs.sendMessage(this.tabId, msg);
|
||||
};
|
||||
|
||||
PageNetworkTrafficCollector.prototype.getRedirKey = function (url, frameId) {
|
||||
return `${url}:${frameId}`;
|
||||
};
|
||||
|
||||
PageNetworkTrafficCollector.prototype.seenBefore = function (request) {
|
||||
const oldTime = this.assetsSeen[assetMsgKey(request)];
|
||||
if (oldTime && (request.requestTimestamp - oldTime < secBetweenDupAssets)) {
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
};
|
||||
|
||||
PageNetworkTrafficCollector.prototype.recordSeenAsset = function (request) {
|
||||
this.assetsSeen[assetMsgKey(request)] = request.requestTimestamp;
|
||||
};
|
||||
|
||||
PageNetworkTrafficCollector.prototype.onBeforeRequest = function (details) {
|
||||
const req = {
|
||||
url: details.url,
|
||||
type: details.type,
|
||||
httpMethod: details.method,
|
||||
frameId: details.frameId,
|
||||
parentFrameId: details.parentFrameId,
|
||||
requestTimestamp: details.timeStamp,
|
||||
};
|
||||
this.requests[details.requestId] = req;
|
||||
};
|
||||
|
||||
PageNetworkTrafficCollector.prototype.onSendHeaders = function (details) {
|
||||
let request,
|
||||
header;
|
||||
request = this.requests[details.requestId];
|
||||
header = request && findHeader(details.requestHeaders, 'x-requested-with');
|
||||
if (header && header.value.toLowerCase().indexOf('flash') > -1) {
|
||||
request.from_flash = true;
|
||||
}
|
||||
};
|
||||
|
||||
PageNetworkTrafficCollector.prototype.onHeadersReceived = function (details) {
|
||||
const getFrameDetails = {
|
||||
tabId: details.tabId,
|
||||
processId: null,
|
||||
frameId: details.frameId,
|
||||
};
|
||||
const pageNetworkTrafficController = this;
|
||||
getFrame(getFrameDetails, (frameDetails) => {
|
||||
if (frameDetails && frameDetails.url) {
|
||||
pageNetworkTrafficController._onHeadersReceived(details, frameDetails);
|
||||
}
|
||||
});
|
||||
};
|
||||
|
||||
PageNetworkTrafficCollector.prototype._onHeadersReceived = function (details, frameDetails) {
|
||||
let contentSize,
|
||||
contentRange;
|
||||
|
||||
const request = this.requests[details.requestId];
|
||||
if (request) {
|
||||
const redirParent = this.allRedirects[this.getRedirKey(details.url, details.frameId)];
|
||||
let header = request && findHeader(details.responseHeaders, 'content-type');
|
||||
const contentType = header && header.value.toLowerCase();
|
||||
|
||||
if (contentType) {
|
||||
request.contentType = contentType;
|
||||
}
|
||||
header = request && findHeader(details.responseHeaders, 'content-length');
|
||||
contentSize = header && header.value;
|
||||
if (contentSize) {
|
||||
request.size = request.size || 0;
|
||||
request.size += parseInt(contentSize);
|
||||
}
|
||||
header = request && findHeader(details.responseHeaders, 'content-range');
|
||||
contentRange = header && header.value;
|
||||
if (contentRange) {
|
||||
request.contentRange = parseInt(contentRange.split('/')[1]);
|
||||
}
|
||||
|
||||
let frameUrl = null;
|
||||
if (frameDetails && frameDetails.url) {
|
||||
frameUrl = frameDetails.url;
|
||||
}
|
||||
if (!this.bannedRequest(request)
|
||||
&& (this.isVideoReq(frameUrl, request) || (redirParent && redirParent.isVideo))) {
|
||||
request.isVideo = true;
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
PageNetworkTrafficCollector.prototype.onBeforeRedirect = function (details) {
|
||||
const request = this.requests[details.requestId];
|
||||
if (request) {
|
||||
if (request.redirects) {
|
||||
request.redirects.push(details.redirectUrl);
|
||||
} else {
|
||||
request.redirects = [details.redirectUrl];
|
||||
}
|
||||
this.allRedirects[this.getRedirKey(details.redirectUrl, details.frameId)] = request;
|
||||
}
|
||||
};
|
||||
|
||||
PageNetworkTrafficCollector.prototype.isYoutubeMastheadRequest = function (url) {
|
||||
const re = /video_masthead/;
|
||||
return this.hasYoutubeDomain(url) && re.test(url);
|
||||
};
|
||||
PageNetworkTrafficCollector.prototype.isYoutubeVideoRequest = function (srcUrl, destUrl) {
|
||||
if (!this.hasYoutubeDomain(srcUrl)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
const re = /https?:\/\/r.*?\.googlevideo\.com\/videoplayback\?/;
|
||||
return re.test(destUrl);
|
||||
};
|
||||
PageNetworkTrafficCollector.prototype.processResponse = function (requestDetails, frameDetails) {
|
||||
let request;
|
||||
if (requestDetails) {
|
||||
request = this.requests[requestDetails.requestId];
|
||||
if (request) {
|
||||
request.responseStatus = requestDetails.statusCode;
|
||||
request.responseTimestamp = requestDetails.timeStamp;
|
||||
|
||||
let frameUrl = null;
|
||||
if (frameDetails && frameDetails.url) {
|
||||
frameUrl = frameDetails.url;
|
||||
}
|
||||
|
||||
let requestUrl = null;
|
||||
if (request.url) {
|
||||
requestUrl = request.url;
|
||||
}
|
||||
|
||||
if (this.isYoutubeAdReq(frameUrl, requestUrl)) {
|
||||
const destVideoId = this.parseYoutubeVideoIdFromUrl(requestUrl);
|
||||
const srcVideoId = this.parseYoutubeVideoIdFromUrl(frameUrl);
|
||||
if (srcVideoId && destVideoId) {
|
||||
request.isYoutubeAd = true;
|
||||
request.isVideo = true;
|
||||
request.rawSrcUrl = frameUrl;
|
||||
request.rawDestUrl = requestUrl;
|
||||
request.url = `https://www.youtube.com/watch?v=${this.parseYoutubeVideoIdFromUrl(requestUrl)}`;
|
||||
}
|
||||
} else if (!this.bannedRequest(request)
|
||||
&& (this.isVideo || this.isVideoReq(frameUrl, request))) {
|
||||
request.isVideo = true;
|
||||
}
|
||||
|
||||
if (request.isVideo) {
|
||||
const msgKey = assetMsgKey(request);
|
||||
this.msgsBeingSent[msgKey] = request;
|
||||
if (!this.seenBefore(request)) {
|
||||
this.sendMsgWhenQuiet(msgKey);
|
||||
}
|
||||
this.recordSeenAsset(request);
|
||||
}
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
PageNetworkTrafficCollector.prototype.onResponseStarted = function (responseDetails) {
|
||||
if (responseDetails.frameId < 0) {
|
||||
responseDetails.frameId = 99999;
|
||||
}
|
||||
const getFrameDetails = {
|
||||
tabId: responseDetails.tabId,
|
||||
processId: null,
|
||||
frameId: responseDetails.frameId,
|
||||
};
|
||||
const pageNetworkTrafficController = this;
|
||||
getFrame(getFrameDetails, (frameDetails) => {
|
||||
if (frameDetails && frameDetails.url) {
|
||||
pageNetworkTrafficController.processResponse(responseDetails, frameDetails);
|
||||
}
|
||||
});
|
||||
};
|
||||
|
||||
PageNetworkTrafficCollector.prototype.hasBannedFiletype = function (request) {
|
||||
const url = stripQueryParams(request.url);
|
||||
if (bannedFiletypesReg.exec(url)) {
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
};
|
||||
|
||||
PageNetworkTrafficCollector.prototype.checkContentHeaders = function (request) {
|
||||
if (request.contentType && validVideoType(request.contentType)) {
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
};
|
||||
|
||||
PageNetworkTrafficCollector.prototype.checkUrlExtension = function (request) {
|
||||
const url = stripQueryParams(request.url);
|
||||
if (extensionsReg.exec(url)) {
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
};
|
||||
|
||||
PageNetworkTrafficCollector.prototype.isVideoReq = function (srcUrl, request) {
|
||||
if (this.isYoutubeVideoRequest(srcUrl, request.url)) {
|
||||
return false;
|
||||
}
|
||||
return this.checkUrlExtension(request) || this.checkContentHeaders(request);
|
||||
};
|
||||
PageNetworkTrafficCollector.prototype.hasYoutubeDomain = function (url) {
|
||||
const hostname = parseHostnameFromUrl(url);
|
||||
if (hostname === 'www.youtube.com') {
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
};
|
||||
PageNetworkTrafficCollector.prototype.parseYoutubeVideoIdFromUrl = function (url) {
|
||||
let re = /^https?:\/\/www\.youtube\.com\/get_video_info.*(?:\?|&)video_id=(.*?)(?:$|&)/;
|
||||
let match = re.exec(url);
|
||||
if (match && match.length > 1) {
|
||||
return match[1];
|
||||
}
|
||||
|
||||
re = /^https?:\/\/www\.youtube\.com\/embed\/(.*?)(?:$|\?)/;
|
||||
match = re.exec(url);
|
||||
if (match && match.length > 1) {
|
||||
return match[1];
|
||||
}
|
||||
|
||||
re = /^https?:\/\/www\.youtube\.com\/watch.*(\?|&)v=([^&]*)/;
|
||||
match = re.exec(url);
|
||||
if (match && match.length > 1) {
|
||||
return match[1];
|
||||
}
|
||||
return null;
|
||||
};
|
||||
|
||||
PageNetworkTrafficCollector.prototype.isYoutubeGetVideoInfoReq = function (url) {
|
||||
const re = /^https?:\/\/www\.youtube\.com\/get_video_info\?/;
|
||||
return re.test(url);
|
||||
};
|
||||
PageNetworkTrafficCollector.prototype.isYoutubeAdReq = function (srcUrl, destUrl) {
|
||||
if (!this.hasYoutubeDomain(srcUrl)
|
||||
|| !this.isYoutubeGetVideoInfoReq(destUrl)) {
|
||||
return false;
|
||||
}
|
||||
if (this.parseYoutubeVideoIdFromUrl(srcUrl)
|
||||
=== this.parseYoutubeVideoIdFromUrl(destUrl)
|
||||
&& !this.isYoutubeMastheadRequest(destUrl)) {
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
};
|
||||
|
||||
PageNetworkTrafficCollector.prototype.bannedRequest = function (request) {
|
||||
return this.bannedVideoType(request) || this.hasBannedFiletype(request) || this.bannedVideoSize(request);
|
||||
};
|
||||
|
||||
PageNetworkTrafficCollector.prototype.bannedVideoType = function (request) {
|
||||
let badType = false;
|
||||
if (request.contentType) {
|
||||
badType = bannedContentTypes.some(prefix => request.contentType.indexOf(prefix) >= 0);
|
||||
}
|
||||
return badType;
|
||||
};
|
||||
|
||||
PageNetworkTrafficCollector.prototype.bannedVideoSize = function (request) {
|
||||
if (request.size !== null) {
|
||||
if (request.size < minVidSize || request.size > maxVidSize || request.contentRange > maxContentRange) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
};
|
||||
|
||||
PageNetworkTrafficCollector.prototype.grabTagReqs = function (tabRequests, assetRequest) {
|
||||
let minTimestamp,
|
||||
maxTimestamp;
|
||||
minTimestamp = assetRequest.requestTimestamp - secBefore;
|
||||
maxTimestamp = assetRequest.requestTimestamp + secAfter;
|
||||
|
||||
const filteredRequests = tabRequests.filter(request => (request.requestTimestamp > minTimestamp
|
||||
&& request.requestTimestamp < maxTimestamp
|
||||
&& request.frameId === assetRequest.frameId
|
||||
&& request.url !== assetRequest.url
|
||||
&& (hasValidRequestType(request)
|
||||
|| isPixelRequest(request))));
|
||||
|
||||
return filteredRequests;
|
||||
};
|
||||
|
||||
PageNetworkTrafficCollector.prototype.isValidVideoAd = function (assetRequest, tagRequests) {
|
||||
const hasVpaidOrVastRequest = tagRequests.some(tagRequest => isVpaidOrVastRequest(tagRequest));
|
||||
|
||||
if (assetRequest.isYoutubeAd) {
|
||||
return true;
|
||||
}
|
||||
if (hasVpaidOrVastRequest) {
|
||||
return true;
|
||||
}
|
||||
const hasTopVideoAssetDomain = topVideoAssetDomains.some(assetDomain => hasDomain(assetRequest.url, assetDomain));
|
||||
|
||||
return hasTopVideoAssetDomain;
|
||||
};
|
||||
|
||||
PageNetworkTrafficCollector.prototype.sendMsgWhenQuiet = function (msgKey) {
|
||||
let _this = this,
|
||||
origPageUrl,
|
||||
msgAssetReq;
|
||||
msgAssetReq = this.msgsBeingSent[msgKey];
|
||||
browserProxy.tabs.get(this.tabId, (tab) => { origPageUrl = tab.url; });
|
||||
|
||||
setTimeout(() => {
|
||||
const rawRequests = [];
|
||||
if (globalPageContainer.collectors[_this.tabId] === _this) {
|
||||
for (const reqId in _this.requests) {
|
||||
rawRequests.push(_this.requests[reqId]);
|
||||
}
|
||||
const tagReqs = _this.grabTagReqs(rawRequests, msgAssetReq);
|
||||
|
||||
if (_this.isValidVideoAd(msgAssetReq, tagReqs)) {
|
||||
_this.sendToTab(msgAssetReq, tagReqs, origPageUrl, 'new-video-ad');
|
||||
} else {
|
||||
_this.sendToTab(msgAssetReq, tagReqs, origPageUrl, 'new-invalid-video-ad');
|
||||
}
|
||||
} else {
|
||||
|
||||
}
|
||||
delete _this.msgsBeingSent[msgKey];
|
||||
}, secAfter + secBefore);
|
||||
};
|
||||
|
||||
PageNetworkTrafficCollector.prototype.existingMessage = function (candidateRequest) {
|
||||
const frameMsg = this.msgsBeingSent[candidateRequest.frameId];
|
||||
if (frameMsg) {
|
||||
return frameMsg;
|
||||
}
|
||||
return null;
|
||||
};
|
||||
|
||||
function onBeforeRequestListener(details) {
|
||||
globalPageContainer.forwardCall(details, PageNetworkTrafficCollector.prototype.onBeforeRequest);
|
||||
}
|
||||
|
||||
function onSendHeadersListener(details) {
|
||||
globalPageContainer.forwardCall(details, PageNetworkTrafficCollector.prototype.onSendHeaders);
|
||||
}
|
||||
|
||||
function onHeadersReceivedListener(details) {
|
||||
globalPageContainer.forwardCall(details, PageNetworkTrafficCollector.prototype.onHeadersReceived);
|
||||
}
|
||||
|
||||
function onBeforeRedirectListener(details) {
|
||||
globalPageContainer.forwardCall(details, PageNetworkTrafficCollector.prototype.onBeforeRedirect);
|
||||
}
|
||||
|
||||
function onResponseStartedListener(details) {
|
||||
globalPageContainer.forwardCall(details, PageNetworkTrafficCollector.prototype.onResponseStarted);
|
||||
}
|
||||
|
||||
function onCommittedListener(details) {
|
||||
if (details.frameId === 0) {
|
||||
globalPageContainer.onNavigationCommitted(details);
|
||||
}
|
||||
}
|
||||
|
||||
function onCompletedListener(details) {
|
||||
if (details.frameId === 0) {
|
||||
globalPageContainer.onNavigationCompleted(details);
|
||||
}
|
||||
}
|
||||
|
||||
function onRemovedListener(tabId, closeInfo) {
|
||||
globalPageContainer.onTabClose(tabId, closeInfo);
|
||||
}
|
||||
|
||||
function onMessageListener(message, sender, sendResponse) {
|
||||
if (message.event === 'new-ad' && message.data.event === 'ad') {
|
||||
const tabId = sender.tab.id;
|
||||
if (tabId) {
|
||||
globalPageContainer.onDisplayAdFound(tabId);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
function registerListeners() {
|
||||
browserProxy.webRequest.onBeforeRequest.addListener(
|
||||
onBeforeRequestListener,
|
||||
{ urls: ['http://*/*', 'https://*/*'] },
|
||||
[],
|
||||
);
|
||||
|
||||
browserProxy.webRequest.onSendHeaders.addListener(
|
||||
onSendHeadersListener,
|
||||
{ urls: ['http://*/*', 'https://*/*'] },
|
||||
['requestHeaders'],
|
||||
);
|
||||
|
||||
browserProxy.webRequest.onHeadersReceived.addListener(
|
||||
onHeadersReceivedListener,
|
||||
{ urls: ['http://*/*', 'https://*/*'] },
|
||||
['responseHeaders'],
|
||||
);
|
||||
|
||||
browserProxy.webRequest.onBeforeRedirect.addListener(
|
||||
onBeforeRedirectListener,
|
||||
{ urls: ['http://*/*', 'https://*/*'] },
|
||||
[],
|
||||
);
|
||||
|
||||
browserProxy.webRequest.onResponseStarted.addListener(
|
||||
onResponseStartedListener,
|
||||
{ urls: ['http://*/*', 'https://*/*'] },
|
||||
['responseHeaders'],
|
||||
);
|
||||
|
||||
browserProxy.webNavigation.onCommitted.addListener(onCommittedListener);
|
||||
browserProxy.webNavigation.onCompleted.addListener(onCompletedListener);
|
||||
browserProxy.tabs.onRemoved.addListener(onRemovedListener);
|
||||
browserProxy.runtime.onMessage.addListener(onMessageListener);
|
||||
|
||||
areListenersRegistered = true;
|
||||
}
|
||||
|
||||
function unregisterListeners() {
|
||||
browserProxy.webRequest.onBeforeRequest.removeListener(
|
||||
onBeforeRequestListener,
|
||||
);
|
||||
|
||||
browserProxy.webRequest.onSendHeaders.removeListener(
|
||||
onSendHeadersListener,
|
||||
);
|
||||
|
||||
browserProxy.webRequest.onHeadersReceived.removeListener(
|
||||
onHeadersReceivedListener,
|
||||
);
|
||||
|
||||
browserProxy.webRequest.onBeforeRedirect.removeListener(
|
||||
onBeforeRedirectListener,
|
||||
);
|
||||
|
||||
browserProxy.webRequest.onResponseStarted.removeListener(
|
||||
onResponseStartedListener,
|
||||
);
|
||||
|
||||
browserProxy.webNavigation.onCommitted.removeListener(onCommittedListener);
|
||||
browserProxy.webNavigation.onCompleted.removeListener(onCompletedListener);
|
||||
browserProxy.tabs.onRemoved.removeListener(onRemovedListener);
|
||||
browserProxy.runtime.onMessage.removeListener(onMessageListener);
|
||||
|
||||
areListenersRegistered = false;
|
||||
}
|
||||
|
||||
function areRequiredBrowserApisAvailable() {
|
||||
return requiredBrowserApis.every(api => typeof api !== 'undefined');
|
||||
}
|
||||
|
||||
if (areRequiredBrowserApisAvailable()) {
|
||||
ifBrowserValid(
|
||||
() => {
|
||||
browserProxy.webNavigation.onBeforeNavigate.addListener(
|
||||
(details) => {
|
||||
if (details.frameId === 0) {
|
||||
globalPageContainer.onNewNavigation(details);
|
||||
}
|
||||
},
|
||||
{
|
||||
url: [{ urlMatches: 'http://*/*' }, { urlMatches: 'https://*/*' }],
|
||||
},
|
||||
);
|
||||
}, () => {
|
||||
|
||||
},
|
||||
);
|
||||
}
|
||||
|
||||
browserProxy.runtime.onMessage.addListener((request, sender, sendResponse) => {
|
||||
if (request === 'is_browser_valid') {
|
||||
ifBrowserValid(
|
||||
sendResponse({ browser_valid: true }),
|
||||
sendResponse({ browser_valid: false }),
|
||||
);
|
||||
}
|
||||
});
|
||||
|
||||
browserProxy.runtime.onMessage.addListener((request, sender, sendResponse) => {
|
||||
if (request === 'is_tracking_enabled') {
|
||||
ifTrackingEnabled(
|
||||
sender.tab,
|
||||
() => {
|
||||
try { sendResponse({ tracking_enabled: true }); } catch (err) {}
|
||||
},
|
||||
() => {
|
||||
try { sendResponse({ tracking_enabled: false }); } catch (err) {}
|
||||
},
|
||||
);
|
||||
}
|
||||
return true;
|
||||
});
|
||||
}());
|
@ -1,824 +0,0 @@
|
||||
'use strict';
|
||||
(function() {
|
||||
|
||||
function isChrome() {
|
||||
return (typeof chrome !== 'undefined' &&
|
||||
window.navigator.userAgent.match(/Chrom(?:e|ium)\/([0-9\.]+)/));
|
||||
}
|
||||
|
||||
var browserProxy;
|
||||
if ( isChrome() ) {
|
||||
browserProxy = chrome;
|
||||
} else {
|
||||
browserProxy = browser;
|
||||
}
|
||||
|
||||
var MIN_FF_MAJOR_VERSION = 51;
|
||||
|
||||
var requiredBrowserApis = [
|
||||
browserProxy.webNavigation,
|
||||
browserProxy.tabs,
|
||||
browserProxy.webRequest,
|
||||
browserProxy.runtime
|
||||
];
|
||||
var areListenersRegistered = false;
|
||||
var secBefore = 2000;
|
||||
var secAfter = 5000;
|
||||
var secBetweenDupAssets = 10e3;
|
||||
var minVidSize = 500e3;
|
||||
var maxVidSize = 25e6;
|
||||
var maxContentRange = 25e6;
|
||||
var videoExtensions = [
|
||||
'af', '3gp', 'asf', 'avchd', 'avi', 'cam', 'dsh', 'flv', 'm1v', 'm2v',
|
||||
'fla', 'flr', 'sol', 'm4v', 'mkv', 'wrap', 'mng', 'mov', 'mpeg', 'mpg',
|
||||
'mpe', 'mp4', 'mxf', 'nsv', 'ogg', 'rm', 'svi', 'smi', 'wmv', 'webm'
|
||||
];
|
||||
var extensionsReg = new RegExp('\\.' + videoExtensions.join('$|\\.') + '$');
|
||||
var videoContentTypesPrefixes = ['binary/octet-stream', 'video/', 'flv-application/', 'media'];
|
||||
|
||||
var bannedContentTypes = ['video/mp2t','video/f4m','video/f4f'];
|
||||
var bannedFiletypes = ['ts'];
|
||||
var bannedFiletypesReg = new RegExp('\\.' + bannedFiletypes.join('$|\\.') + '$');
|
||||
var whitelistReqTypes = ['object', 'xmlhttprequest', 'other'];
|
||||
|
||||
var topVideoAssetDomains = [
|
||||
'2mdn.net',
|
||||
'adap.tv',
|
||||
'adnxs.com',
|
||||
'adsrvr.org',
|
||||
'btrll.com',
|
||||
'celtra.com',
|
||||
'flashtalking.com',
|
||||
'flite.com',
|
||||
'innovid.com',
|
||||
'jivox.com',
|
||||
'mixpo.com',
|
||||
'nytimes.com',
|
||||
'playwire.com',
|
||||
'selectmedia.asia',
|
||||
'serving-sys.com',
|
||||
'solvemedia.com',
|
||||
'spotible.com',
|
||||
'teads.tv',
|
||||
'tribalfusion.com',
|
||||
'tubemogul.com',
|
||||
'videologygroup.com',
|
||||
'washingtonpost.com'
|
||||
];
|
||||
|
||||
var robotsTxtAllows = wappalyzer.robotsTxtAllows.bind(wappalyzer);
|
||||
if ( !String.prototype.endsWith ) {
|
||||
String.prototype.endsWith = function(searchString, position) {
|
||||
var subjectString = this.toString();
|
||||
if ( typeof position !== 'number' || !isFinite(position) ||
|
||||
Math.floor(position) !== position || position > subjectString.length) {
|
||||
position = subjectString.length;
|
||||
}
|
||||
position -= searchString.length;
|
||||
var lastIndex = subjectString.indexOf(searchString, position);
|
||||
return lastIndex !== -1 && lastIndex === position;
|
||||
};
|
||||
}
|
||||
|
||||
function getFrame(getFrameDetails, callback) {
|
||||
if ( typeof chrome !== 'undefined' ) {
|
||||
chrome.webNavigation.getFrame(getFrameDetails, callback);
|
||||
} else if ( typeof browser !== 'undefined' ) {
|
||||
var gettingFrame = browser.webNavigation.getFrame(getFrameDetails);
|
||||
gettingFrame.then(callback);
|
||||
}
|
||||
}
|
||||
|
||||
function ifBrowserValid(callback, elseCallback) {
|
||||
if ( isChrome() ) {
|
||||
|
||||
callback();
|
||||
} else if ( typeof browser !== 'undefined' ) {
|
||||
try {
|
||||
var gettingInfo = browser.runtime.getBrowserInfo();
|
||||
gettingInfo.then(function(browserInfo) {
|
||||
var browserVersion = parseInt(browserInfo.version.split('.')[0]);
|
||||
|
||||
if ( browserInfo.name === 'Firefox' &&
|
||||
browserVersion >= MIN_FF_MAJOR_VERSION) {
|
||||
callback();
|
||||
} else {
|
||||
elseCallback();
|
||||
}
|
||||
});
|
||||
} catch (err) {
|
||||
|
||||
elseCallback();
|
||||
}
|
||||
} else {
|
||||
elseCallback();
|
||||
}
|
||||
}
|
||||
|
||||
function ifTrackingEnabled(details, ifCallback, elseCallback) {
|
||||
|
||||
var fullIfCallback = function() {
|
||||
allowedByRobotsTxt(details, ifCallback, elseCallback);
|
||||
};
|
||||
|
||||
browser.storage.local.get('tracking').then(function(item) {
|
||||
|
||||
if ( item.hasOwnProperty('tracking') ) {
|
||||
if ( item.tracking ) {
|
||||
fullIfCallback();
|
||||
} else {
|
||||
elseCallback();
|
||||
}
|
||||
} else {
|
||||
fullIfCallback();
|
||||
}
|
||||
});
|
||||
|
||||
}
|
||||
|
||||
function allowedByRobotsTxt(details, ifCallback, elseCallback) {
|
||||
if ( details.url && !details.url.startsWith('chrome://') ) {
|
||||
robotsTxtAllows(details.url).then(ifCallback, elseCallback);
|
||||
} else {
|
||||
elseCallback();
|
||||
}
|
||||
}
|
||||
|
||||
function isPixelRequest(request) {
|
||||
return (request.type === 'image' || request.responseStatus === 204) &&
|
||||
request.size <= 1000;
|
||||
}
|
||||
|
||||
function isVpaidOrVastRequest(request) {
|
||||
var lowerCaseUrl = request.url.toLowerCase();
|
||||
return lowerCaseUrl.indexOf('vpaid') !== -1 || lowerCaseUrl.indexOf('vast') !== -1;
|
||||
}
|
||||
|
||||
function hasValidRequestType(request) {
|
||||
return whitelistReqTypes.indexOf(request.type) >= 0;
|
||||
}
|
||||
|
||||
function stripQueryParams(url) {
|
||||
return url.split('?', 1)[0];
|
||||
}
|
||||
|
||||
function parseHostnameFromUrl(url) {
|
||||
var parser = document.createElement('a');
|
||||
parser.href = url;
|
||||
return parser.hostname;
|
||||
}
|
||||
|
||||
function hasDomain(url, domain) {
|
||||
return parseHostnameFromUrl(url).endsWith(domain);
|
||||
}
|
||||
|
||||
function findHeader(headers, key) {
|
||||
var header;
|
||||
for ( var i = 0; i < headers.length; i += 1 ) {
|
||||
header = headers[i];
|
||||
if ( header.name.toLowerCase() === key ) {
|
||||
return header;
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
function validVideoType(vtype) {
|
||||
var goodType = videoContentTypesPrefixes.some(function(prefix) {
|
||||
return vtype.indexOf(prefix) === 0;
|
||||
});
|
||||
return goodType;
|
||||
}
|
||||
|
||||
function assetMsgKey(assetReq) {
|
||||
var url = stripQueryParams(assetReq.url);
|
||||
var key = assetReq.frameId + '-' + url;
|
||||
return key;
|
||||
}
|
||||
|
||||
var PageNetworkTrafficCollector = function(tabId) {
|
||||
this.tabId = tabId;
|
||||
this.displayAdFound = false;
|
||||
this.requests = {};
|
||||
this.msgsBeingSent = {};
|
||||
this.assetsSeen = {};
|
||||
this.allRedirects = {};
|
||||
};
|
||||
|
||||
var globalPageContainer = {
|
||||
collectors: {},
|
||||
dyingCollectors: {},
|
||||
|
||||
cleanupCollector: function(tabId) {
|
||||
if ( tabId in this.collectors ) {
|
||||
delete globalPageContainer.collectors[tabId];
|
||||
}
|
||||
},
|
||||
|
||||
onNewNavigation: function(details) {
|
||||
var tabId = details.tabId;
|
||||
this.cleanupCollector(tabId);
|
||||
|
||||
ifTrackingEnabled(
|
||||
details,
|
||||
function() {
|
||||
if ( !areListenersRegistered ) {
|
||||
|
||||
registerListeners();
|
||||
}
|
||||
this.collectors[tabId] = new PageNetworkTrafficCollector(tabId);
|
||||
}.bind(this),
|
||||
function() {
|
||||
if ( areListenersRegistered ) {
|
||||
|
||||
unregisterListeners();
|
||||
}
|
||||
}
|
||||
);
|
||||
},
|
||||
|
||||
onNavigationCommitted: function(details) {
|
||||
|
||||
},
|
||||
|
||||
onNavigationCompleted: function(details) {
|
||||
|
||||
},
|
||||
|
||||
onTabClose: function(tabId, closeInfo) {
|
||||
|
||||
this.cleanupCollector(tabId);
|
||||
delete this.collectors[tabId];
|
||||
},
|
||||
|
||||
onDisplayAdFound: function(tabId) {
|
||||
this.collectors[tabId].displayAdFound = true;
|
||||
},
|
||||
|
||||
getRandId: function() {
|
||||
return String(Math.floor(Math.random() * 1e9));
|
||||
},
|
||||
|
||||
getCollector: function(tabId) {
|
||||
if ( this.collectors.hasOwnProperty(tabId) ) {
|
||||
return this.collectors[tabId];
|
||||
}
|
||||
return null;
|
||||
},
|
||||
|
||||
forwardCall: function(details, collectorMemberFunction) {
|
||||
var collector = this.getCollector(details.tabId);
|
||||
if ( collector !== null ) {
|
||||
collectorMemberFunction.apply(collector, [details]);
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
PageNetworkTrafficCollector.prototype.sendLogMessageToTabConsole = function() {
|
||||
var logMessage = Array.from(arguments).join(' ');
|
||||
var message = {message: logMessage, event: 'console-log-message'};
|
||||
browserProxy.tabs.sendMessage(this.tabId, message);
|
||||
};
|
||||
|
||||
PageNetworkTrafficCollector.prototype.sendToTab = function(assetReq, reqs, curPageUrl, adTrackingEvent) {
|
||||
var msg = {};
|
||||
msg.assets = [];
|
||||
msg.requests = [];
|
||||
msg.event_data = {};
|
||||
msg.event = adTrackingEvent;
|
||||
if ( adTrackingEvent === 'new-video-ad' ) {
|
||||
msg.requests = reqs;
|
||||
msg.requests.sort(function(reqA, reqB) {return reqA.requestTimestamp - reqB.requestTimestamp;});
|
||||
if ( assetReq ) {
|
||||
msg.assets = [assetReq];
|
||||
}
|
||||
} else if ( adTrackingEvent === 'new-invalid-video-ad' ) {
|
||||
msg.requests = reqs.map(function(request) {
|
||||
return parseHostnameFromUrl(request.url);
|
||||
});
|
||||
msg.assets = [{
|
||||
|
||||
url: parseHostnameFromUrl(assetReq.url),
|
||||
|
||||
contentType: assetReq.contentType,
|
||||
size: assetReq.size
|
||||
}];
|
||||
}
|
||||
msg.origUrl = curPageUrl;
|
||||
msg.displayAdFound = this.displayAdFound;
|
||||
|
||||
browserProxy.tabs.sendMessage(this.tabId, msg);
|
||||
};
|
||||
|
||||
PageNetworkTrafficCollector.prototype.getRedirKey = function(url, frameId) {
|
||||
return url + ':' + frameId;
|
||||
};
|
||||
|
||||
PageNetworkTrafficCollector.prototype.seenBefore = function(request) {
|
||||
var oldTime = this.assetsSeen[assetMsgKey(request)];
|
||||
if ( oldTime && (request.requestTimestamp-oldTime < secBetweenDupAssets)){
|
||||
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
};
|
||||
|
||||
PageNetworkTrafficCollector.prototype.recordSeenAsset = function(request) {
|
||||
this.assetsSeen[assetMsgKey(request)] = request.requestTimestamp;
|
||||
};
|
||||
|
||||
PageNetworkTrafficCollector.prototype.onBeforeRequest = function(details) {
|
||||
var req = {
|
||||
url: details.url,
|
||||
type: details.type,
|
||||
httpMethod: details.method,
|
||||
frameId: details.frameId,
|
||||
parentFrameId: details.parentFrameId,
|
||||
requestTimestamp: details.timeStamp,
|
||||
};
|
||||
this.requests[details.requestId] = req;
|
||||
};
|
||||
|
||||
PageNetworkTrafficCollector.prototype.onSendHeaders = function(details) {
|
||||
var request, header;
|
||||
request = this.requests[details.requestId];
|
||||
header = request && findHeader(details.requestHeaders, 'x-requested-with');
|
||||
if ( header && header.value.toLowerCase().indexOf('flash') > -1 ) {
|
||||
request.from_flash = true;
|
||||
}
|
||||
};
|
||||
|
||||
PageNetworkTrafficCollector.prototype.onHeadersReceived = function(details) {
|
||||
var getFrameDetails = {
|
||||
tabId: details.tabId,
|
||||
processId: null,
|
||||
frameId: details.frameId
|
||||
};
|
||||
var pageNetworkTrafficController = this;
|
||||
getFrame(getFrameDetails, function(frameDetails) {
|
||||
if ( frameDetails && frameDetails.url ) {
|
||||
pageNetworkTrafficController._onHeadersReceived(details, frameDetails);
|
||||
}
|
||||
});
|
||||
};
|
||||
|
||||
PageNetworkTrafficCollector.prototype._onHeadersReceived = function(details, frameDetails) {
|
||||
var contentSize, contentRange;
|
||||
|
||||
var request = this.requests[details.requestId];
|
||||
if ( request ) {
|
||||
var redirParent = this.allRedirects[this.getRedirKey(details.url, details.frameId)];
|
||||
var header = request && findHeader(details.responseHeaders, 'content-type');
|
||||
var contentType = header && header.value.toLowerCase();
|
||||
|
||||
if ( contentType){
|
||||
request.contentType = contentType;
|
||||
}
|
||||
header = request && findHeader(details.responseHeaders, 'content-length');
|
||||
contentSize = header && header.value;
|
||||
if ( contentSize ) {
|
||||
request.size = request.size || 0;
|
||||
request.size += parseInt(contentSize);
|
||||
}
|
||||
header = request && findHeader(details.responseHeaders, 'content-range');
|
||||
contentRange = header && header.value;
|
||||
if ( contentRange ) {
|
||||
request.contentRange = parseInt(contentRange.split('/')[1]);
|
||||
}
|
||||
|
||||
var frameUrl = null;
|
||||
if ( frameDetails && frameDetails.url ) {
|
||||
frameUrl = frameDetails.url;
|
||||
}
|
||||
if ( !this.bannedRequest(request) &&
|
||||
(this.isVideoReq(frameUrl, request) || (redirParent && redirParent.isVideo))) {
|
||||
request.isVideo = true;
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
PageNetworkTrafficCollector.prototype.onBeforeRedirect = function(details) {
|
||||
var request = this.requests[details.requestId];
|
||||
if ( request ) {
|
||||
if ( request.redirects ) {
|
||||
request.redirects.push(details.redirectUrl);
|
||||
} else {
|
||||
request.redirects = [details.redirectUrl];
|
||||
}
|
||||
this.allRedirects[this.getRedirKey(details.redirectUrl, details.frameId)] = request;
|
||||
}
|
||||
};
|
||||
|
||||
PageNetworkTrafficCollector.prototype.isYoutubeMastheadRequest = function(url) {
|
||||
var re = /video_masthead/;
|
||||
return this.hasYoutubeDomain(url) && re.test(url);
|
||||
};
|
||||
PageNetworkTrafficCollector.prototype.isYoutubeVideoRequest = function(srcUrl, destUrl) {
|
||||
if ( !this.hasYoutubeDomain(srcUrl) ) {
|
||||
return false;
|
||||
}
|
||||
|
||||
var re = /https?:\/\/r.*?\.googlevideo\.com\/videoplayback\?/;
|
||||
return re.test(destUrl);
|
||||
};
|
||||
PageNetworkTrafficCollector.prototype.processResponse = function(requestDetails, frameDetails) {
|
||||
var request;
|
||||
if ( requestDetails ) {
|
||||
request = this.requests[requestDetails.requestId];
|
||||
if ( request ) {
|
||||
request.responseStatus = requestDetails.statusCode;
|
||||
request.responseTimestamp = requestDetails.timeStamp;
|
||||
|
||||
var frameUrl = null;
|
||||
if ( frameDetails && frameDetails.url ) {
|
||||
frameUrl = frameDetails.url;
|
||||
}
|
||||
|
||||
var requestUrl = null;
|
||||
if ( request.url ) {
|
||||
requestUrl = request.url;
|
||||
}
|
||||
|
||||
if ( this.isYoutubeAdReq(frameUrl, requestUrl) ) {
|
||||
var destVideoId = this.parseYoutubeVideoIdFromUrl(requestUrl);
|
||||
var srcVideoId = this.parseYoutubeVideoIdFromUrl(frameUrl);
|
||||
if ( srcVideoId && destVideoId ) {
|
||||
request.isYoutubeAd = true;
|
||||
request.isVideo = true;
|
||||
request.rawSrcUrl = frameUrl;
|
||||
request.rawDestUrl = requestUrl;
|
||||
request.url = 'https://www.youtube.com/watch?v=' + this.parseYoutubeVideoIdFromUrl(requestUrl);
|
||||
}
|
||||
} else if ( !this.bannedRequest(request) &&
|
||||
(this.isVideo || this.isVideoReq(frameUrl, request))) {
|
||||
request.isVideo = true;
|
||||
}
|
||||
|
||||
if ( request.isVideo ) {
|
||||
|
||||
var msgKey = assetMsgKey(request);
|
||||
this.msgsBeingSent[msgKey] = request;
|
||||
if ( !this.seenBefore(request) ) {
|
||||
this.sendMsgWhenQuiet(msgKey);
|
||||
}
|
||||
this.recordSeenAsset(request);
|
||||
}
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
PageNetworkTrafficCollector.prototype.onResponseStarted = function(responseDetails) {
|
||||
if ( responseDetails.frameId < 0 ) {
|
||||
responseDetails.frameId = 99999;
|
||||
|
||||
}
|
||||
var getFrameDetails = {
|
||||
tabId: responseDetails.tabId,
|
||||
processId: null,
|
||||
frameId: responseDetails.frameId
|
||||
};
|
||||
var pageNetworkTrafficController = this;
|
||||
getFrame(getFrameDetails, function(frameDetails) {
|
||||
if ( frameDetails && frameDetails.url ) {
|
||||
pageNetworkTrafficController.processResponse(responseDetails, frameDetails);
|
||||
}
|
||||
});
|
||||
};
|
||||
|
||||
PageNetworkTrafficCollector.prototype.hasBannedFiletype = function(request) {
|
||||
var url = stripQueryParams(request.url);
|
||||
if ( bannedFiletypesReg.exec(url) ) {
|
||||
return true;
|
||||
} else {
|
||||
return false;
|
||||
}
|
||||
};
|
||||
|
||||
PageNetworkTrafficCollector.prototype.checkContentHeaders = function(request) {
|
||||
if ( request.contentType && validVideoType(request.contentType) ) {
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
};
|
||||
|
||||
PageNetworkTrafficCollector.prototype.checkUrlExtension = function(request) {
|
||||
var url = stripQueryParams(request.url);
|
||||
if ( extensionsReg.exec(url) ) {
|
||||
return true;
|
||||
} else {
|
||||
return false;
|
||||
}
|
||||
};
|
||||
|
||||
PageNetworkTrafficCollector.prototype.isVideoReq = function(srcUrl, request) {
|
||||
if ( this.isYoutubeVideoRequest(srcUrl, request.url) ) {
|
||||
return false;
|
||||
}
|
||||
return this.checkUrlExtension(request) || this.checkContentHeaders(request);
|
||||
};
|
||||
PageNetworkTrafficCollector.prototype.hasYoutubeDomain = function(url) {
|
||||
var hostname = parseHostnameFromUrl(url) ;
|
||||
if ( hostname === 'www.youtube.com' ) {
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
};
|
||||
PageNetworkTrafficCollector.prototype.parseYoutubeVideoIdFromUrl = function(url) {
|
||||
var re = /^https?:\/\/www\.youtube\.com\/get_video_info.*(?:\?|&)video_id=(.*?)(?:$|&)/;
|
||||
var match = re.exec(url);
|
||||
if ( match && match.length > 1 ) {
|
||||
return match[1];
|
||||
}
|
||||
|
||||
re = /^https?:\/\/www\.youtube\.com\/embed\/(.*?)(?:$|\?)/;
|
||||
match = re.exec(url);
|
||||
if ( match && match.length > 1 ) {
|
||||
return match[1];
|
||||
}
|
||||
|
||||
re = /^https?:\/\/www\.youtube\.com\/watch.*(\?|&)v=([^&]*)/;
|
||||
match = re.exec(url);
|
||||
if ( match && match.length > 1 ) {
|
||||
return match[1];
|
||||
}
|
||||
return null;
|
||||
};
|
||||
|
||||
PageNetworkTrafficCollector.prototype.isYoutubeGetVideoInfoReq = function(url) {
|
||||
var re = /^https?:\/\/www\.youtube\.com\/get_video_info\?/;
|
||||
return re.test(url);
|
||||
};
|
||||
PageNetworkTrafficCollector.prototype.isYoutubeAdReq = function(srcUrl, destUrl) {
|
||||
|
||||
if ( !this.hasYoutubeDomain(srcUrl) ||
|
||||
!this.isYoutubeGetVideoInfoReq(destUrl)) {
|
||||
return false;
|
||||
}
|
||||
if ( this.parseYoutubeVideoIdFromUrl(srcUrl) ===
|
||||
this.parseYoutubeVideoIdFromUrl(destUrl) &&
|
||||
!this.isYoutubeMastheadRequest(destUrl)) {
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
};
|
||||
|
||||
PageNetworkTrafficCollector.prototype.bannedRequest = function(request) {
|
||||
return this.bannedVideoType(request) || this.hasBannedFiletype(request) || this.bannedVideoSize(request);
|
||||
};
|
||||
|
||||
PageNetworkTrafficCollector.prototype.bannedVideoType = function(request) {
|
||||
var badType = false;
|
||||
if ( request.contentType ) {
|
||||
badType = bannedContentTypes.some(function(prefix) {
|
||||
return request.contentType.indexOf(prefix) >= 0;
|
||||
});
|
||||
}
|
||||
return badType;
|
||||
};
|
||||
|
||||
PageNetworkTrafficCollector.prototype.bannedVideoSize = function(request) {
|
||||
if ( request.size !== null ) {
|
||||
if ( request.size < minVidSize || request.size > maxVidSize || request.contentRange > maxContentRange ) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
};
|
||||
|
||||
PageNetworkTrafficCollector.prototype.grabTagReqs = function(tabRequests, assetRequest) {
|
||||
var minTimestamp, maxTimestamp;
|
||||
minTimestamp = assetRequest.requestTimestamp - secBefore;
|
||||
maxTimestamp = assetRequest.requestTimestamp + secAfter;
|
||||
|
||||
var filteredRequests = tabRequests.filter(function(request) {
|
||||
return (request.requestTimestamp > minTimestamp &&
|
||||
request.requestTimestamp < maxTimestamp &&
|
||||
request.frameId === assetRequest.frameId &&
|
||||
request.url !== assetRequest.url &&
|
||||
(hasValidRequestType(request) ||
|
||||
isPixelRequest(request)));
|
||||
});
|
||||
|
||||
return filteredRequests;
|
||||
};
|
||||
|
||||
PageNetworkTrafficCollector.prototype.isValidVideoAd = function(assetRequest, tagRequests) {
|
||||
var hasVpaidOrVastRequest = tagRequests.some(function(tagRequest) {
|
||||
return isVpaidOrVastRequest(tagRequest);
|
||||
});
|
||||
|
||||
if ( assetRequest.isYoutubeAd ) {
|
||||
return true;
|
||||
}
|
||||
if ( hasVpaidOrVastRequest ) {
|
||||
return true;
|
||||
}
|
||||
var hasTopVideoAssetDomain = topVideoAssetDomains.some(function(assetDomain) {
|
||||
return hasDomain(assetRequest.url, assetDomain);
|
||||
});
|
||||
|
||||
return hasTopVideoAssetDomain;
|
||||
};
|
||||
|
||||
PageNetworkTrafficCollector.prototype.sendMsgWhenQuiet = function(msgKey) {
|
||||
var _this = this,
|
||||
origPageUrl, msgAssetReq;
|
||||
msgAssetReq = this.msgsBeingSent[msgKey];
|
||||
browserProxy.tabs.get(this.tabId, function(tab) {origPageUrl = tab.url;});
|
||||
|
||||
setTimeout(function() {
|
||||
var rawRequests = [];
|
||||
if ( globalPageContainer.collectors[_this.tabId] === _this ) {
|
||||
for ( var reqId in _this.requests ) {
|
||||
rawRequests.push(_this.requests[reqId]);
|
||||
}
|
||||
var tagReqs = _this.grabTagReqs(rawRequests, msgAssetReq);
|
||||
|
||||
if ( _this.isValidVideoAd(msgAssetReq, tagReqs) ) {
|
||||
_this.sendToTab(msgAssetReq, tagReqs, origPageUrl, 'new-video-ad');
|
||||
} else {
|
||||
|
||||
_this.sendToTab(msgAssetReq, tagReqs, origPageUrl, 'new-invalid-video-ad');
|
||||
}
|
||||
|
||||
} else {
|
||||
|
||||
}
|
||||
delete _this.msgsBeingSent[msgKey];
|
||||
}, secAfter+secBefore);
|
||||
};
|
||||
|
||||
PageNetworkTrafficCollector.prototype.existingMessage = function(candidateRequest) {
|
||||
var frameMsg = this.msgsBeingSent[candidateRequest.frameId];
|
||||
if ( frameMsg ) {
|
||||
return frameMsg;
|
||||
} else {
|
||||
return null;
|
||||
}
|
||||
};
|
||||
|
||||
function onBeforeRequestListener(details) {
|
||||
globalPageContainer.forwardCall(details, PageNetworkTrafficCollector.prototype.onBeforeRequest);
|
||||
}
|
||||
|
||||
function onSendHeadersListener(details) {
|
||||
globalPageContainer.forwardCall(details, PageNetworkTrafficCollector.prototype.onSendHeaders);
|
||||
}
|
||||
|
||||
function onHeadersReceivedListener(details) {
|
||||
globalPageContainer.forwardCall(details, PageNetworkTrafficCollector.prototype.onHeadersReceived);
|
||||
}
|
||||
|
||||
function onBeforeRedirectListener(details) {
|
||||
globalPageContainer.forwardCall(details, PageNetworkTrafficCollector.prototype.onBeforeRedirect);
|
||||
}
|
||||
|
||||
function onResponseStartedListener(details) {
|
||||
globalPageContainer.forwardCall(details, PageNetworkTrafficCollector.prototype.onResponseStarted);
|
||||
}
|
||||
|
||||
function onCommittedListener(details) {
|
||||
if ( details.frameId === 0 ) {
|
||||
globalPageContainer.onNavigationCommitted(details);
|
||||
}
|
||||
}
|
||||
|
||||
function onCompletedListener(details) {
|
||||
if ( details.frameId === 0 ) {
|
||||
globalPageContainer.onNavigationCompleted(details);
|
||||
}
|
||||
}
|
||||
|
||||
function onRemovedListener(tabId, closeInfo) {
|
||||
globalPageContainer.onTabClose(tabId, closeInfo);
|
||||
}
|
||||
|
||||
function onMessageListener(message, sender, sendResponse) {
|
||||
if ( message.event === 'new-ad' && message.data.event === 'ad' ) {
|
||||
var tabId = sender.tab.id;
|
||||
if ( tabId ) {
|
||||
globalPageContainer.onDisplayAdFound(tabId);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
function registerListeners() {
|
||||
|
||||
browserProxy.webRequest.onBeforeRequest.addListener(
|
||||
onBeforeRequestListener,
|
||||
{urls: ['http://*/*', 'https://*/*']},
|
||||
[]
|
||||
);
|
||||
|
||||
browserProxy.webRequest.onSendHeaders.addListener(
|
||||
onSendHeadersListener,
|
||||
{urls: ['http://*/*', 'https://*/*']},
|
||||
['requestHeaders']
|
||||
);
|
||||
|
||||
browserProxy.webRequest.onHeadersReceived.addListener(
|
||||
onHeadersReceivedListener,
|
||||
{urls: ['http://*/*', 'https://*/*']},
|
||||
['responseHeaders']
|
||||
);
|
||||
|
||||
browserProxy.webRequest.onBeforeRedirect.addListener(
|
||||
onBeforeRedirectListener,
|
||||
{urls: ['http://*/*', 'https://*/*']},
|
||||
[]
|
||||
);
|
||||
|
||||
browserProxy.webRequest.onResponseStarted.addListener(
|
||||
onResponseStartedListener,
|
||||
{urls: ['http://*/*', 'https://*/*']},
|
||||
['responseHeaders']
|
||||
);
|
||||
|
||||
browserProxy.webNavigation.onCommitted.addListener(onCommittedListener);
|
||||
browserProxy.webNavigation.onCompleted.addListener(onCompletedListener);
|
||||
browserProxy.tabs.onRemoved.addListener(onRemovedListener);
|
||||
browserProxy.runtime.onMessage.addListener(onMessageListener);
|
||||
|
||||
areListenersRegistered = true;
|
||||
}
|
||||
|
||||
function unregisterListeners() {
|
||||
|
||||
browserProxy.webRequest.onBeforeRequest.removeListener(
|
||||
onBeforeRequestListener
|
||||
);
|
||||
|
||||
browserProxy.webRequest.onSendHeaders.removeListener(
|
||||
onSendHeadersListener
|
||||
);
|
||||
|
||||
browserProxy.webRequest.onHeadersReceived.removeListener(
|
||||
onHeadersReceivedListener
|
||||
);
|
||||
|
||||
browserProxy.webRequest.onBeforeRedirect.removeListener(
|
||||
onBeforeRedirectListener
|
||||
);
|
||||
|
||||
browserProxy.webRequest.onResponseStarted.removeListener(
|
||||
onResponseStartedListener
|
||||
);
|
||||
|
||||
browserProxy.webNavigation.onCommitted.removeListener(onCommittedListener);
|
||||
browserProxy.webNavigation.onCompleted.removeListener(onCompletedListener);
|
||||
browserProxy.tabs.onRemoved.removeListener(onRemovedListener);
|
||||
browserProxy.runtime.onMessage.removeListener(onMessageListener);
|
||||
|
||||
areListenersRegistered = false;
|
||||
}
|
||||
|
||||
function areRequiredBrowserApisAvailable() {
|
||||
return requiredBrowserApis.every(function(api) {
|
||||
return typeof api !== 'undefined';
|
||||
});
|
||||
}
|
||||
|
||||
if ( areRequiredBrowserApisAvailable() ) {
|
||||
ifBrowserValid(
|
||||
function() {
|
||||
browserProxy.webNavigation.onBeforeNavigate.addListener(
|
||||
function(details) {
|
||||
if ( details.frameId === 0 ) {
|
||||
globalPageContainer.onNewNavigation(details);
|
||||
}
|
||||
},
|
||||
{
|
||||
url: [{urlMatches: 'http://*/*'}, {urlMatches: 'https://*/*'}]
|
||||
}
|
||||
);
|
||||
}, function() {
|
||||
|
||||
}
|
||||
);
|
||||
}
|
||||
|
||||
browserProxy.runtime.onMessage.addListener(function(request, sender, sendResponse) {
|
||||
if ( request === 'is_browser_valid' ) {
|
||||
ifBrowserValid(
|
||||
sendResponse({'browser_valid': true}),
|
||||
sendResponse({'browser_valid': false})
|
||||
);
|
||||
}
|
||||
});
|
||||
|
||||
browserProxy.runtime.onMessage.addListener(function(request, sender, sendResponse) {
|
||||
if ( request === 'is_tracking_enabled' ) {
|
||||
ifTrackingEnabled(
|
||||
sender.tab,
|
||||
function() {
|
||||
try {sendResponse({'tracking_enabled': true});}
|
||||
catch(err) {} },
|
||||
function() {
|
||||
try {sendResponse({'tracking_enabled': false});}
|
||||
catch(err) {}}
|
||||
);
|
||||
}
|
||||
return true;
|
||||
});
|
||||
|
||||
})();
|
@ -1,69 +1,96 @@
|
||||
/** global: browser */
|
||||
/** global: Wappalyzer */
|
||||
/* globals browser Wappalyzer */
|
||||
/* eslint-env browser */
|
||||
|
||||
const wappalyzer = new Wappalyzer();
|
||||
|
||||
function getOption(name, defaultValue, callback) {
|
||||
browser.storage.local.get(name)
|
||||
.then(item => {
|
||||
callback(item.hasOwnProperty(name) ? item[name] : defaultValue);
|
||||
});
|
||||
/**
|
||||
* Get a value from localStorage
|
||||
*/
|
||||
function getOption(name, defaultValue = null) {
|
||||
return new Promise(async (resolve, reject) => {
|
||||
let value = defaultValue;
|
||||
|
||||
try {
|
||||
const option = await browser.storage.local.get(name);
|
||||
|
||||
if (option[name] !== undefined) {
|
||||
value = option[name];
|
||||
}
|
||||
} catch (error) {
|
||||
wappalyzer.log(error.message, 'driver', 'error');
|
||||
|
||||
return reject(error.message);
|
||||
}
|
||||
|
||||
return resolve(value);
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* Set a value in localStorage
|
||||
*/
|
||||
function setOption(name, value) {
|
||||
var option = {};
|
||||
return new Promise(async (resolve, reject) => {
|
||||
try {
|
||||
await browser.storage.local.set({ [name]: value });
|
||||
} catch (error) {
|
||||
wappalyzer.log(error.message, 'driver', 'error');
|
||||
|
||||
option[name] = value;
|
||||
return reject(error.message);
|
||||
}
|
||||
|
||||
browser.storage.local.set(option);
|
||||
return resolve();
|
||||
});
|
||||
}
|
||||
|
||||
document.addEventListener('DOMContentLoaded', () => {
|
||||
var nodes = document.querySelectorAll('[data-i18n]');
|
||||
document.addEventListener('DOMContentLoaded', async () => {
|
||||
const nodes = document.querySelectorAll('[data-i18n]');
|
||||
|
||||
Array.prototype.forEach.call(nodes, node => {
|
||||
Array.prototype.forEach.call(nodes, (node) => {
|
||||
node.childNodes[0].nodeValue = browser.i18n.getMessage(node.dataset.i18n);
|
||||
});
|
||||
|
||||
document.querySelector('#github').addEventListener('click', () => {
|
||||
open(wappalyzer.config.githubURL);
|
||||
window.open(wappalyzer.config.githubURL);
|
||||
});
|
||||
|
||||
document.querySelector('#twitter').addEventListener('click', () => {
|
||||
open(wappalyzer.config.twitterURL);
|
||||
window.open(wappalyzer.config.twitterURL);
|
||||
});
|
||||
|
||||
document.querySelector('#wappalyzer').addEventListener('click', () => {
|
||||
open(wappalyzer.config.websiteURL);
|
||||
window.open(wappalyzer.config.websiteURL);
|
||||
});
|
||||
|
||||
getOption('upgradeMessage', true, value => {
|
||||
const el = document.querySelector('#option-upgrade-message');
|
||||
let el;
|
||||
let value;
|
||||
|
||||
el.checked = value;
|
||||
// Upgrade message
|
||||
value = await getOption('upgradeMessage', true);
|
||||
|
||||
el.addEventListener('change', () => {
|
||||
setOption('upgradeMessage', el.checked);
|
||||
});
|
||||
});
|
||||
el = document.querySelector('#option-upgrade-message');
|
||||
|
||||
getOption('dynamicIcon', true, value => {
|
||||
const el = document.querySelector('#option-dynamic-icon');
|
||||
el.checked = value;
|
||||
|
||||
el.checked = value;
|
||||
el.addEventListener('change', e => setOption('upgradeMessage', e.target.checked));
|
||||
|
||||
el.addEventListener('change', () => {
|
||||
setOption('dynamicIcon', el.checked);
|
||||
});
|
||||
});
|
||||
// Dynamic icon
|
||||
value = await getOption('dynamicIcon', true);
|
||||
|
||||
getOption('tracking', true, value => {
|
||||
const el = document.querySelector('#option-tracking');
|
||||
el = document.querySelector('#option-dynamic-icon');
|
||||
|
||||
el.checked = value;
|
||||
el.checked = value;
|
||||
|
||||
el.addEventListener('change', () => {
|
||||
setOption('tracking', el.checked);
|
||||
});
|
||||
});
|
||||
el.addEventListener('change', e => setOption('dynamicIcon', e.target.checked));
|
||||
|
||||
// Tracking
|
||||
value = await getOption('tracking', true);
|
||||
|
||||
el = document.querySelector('#option-tracking');
|
||||
|
||||
el.checked = value;
|
||||
|
||||
el.addEventListener('change', e => setOption('tracking', e.target.checked));
|
||||
});
|
||||
|
@ -0,0 +1,11 @@
|
||||
{
|
||||
"requires": true,
|
||||
"lockfileVersion": 1,
|
||||
"dependencies": {
|
||||
"webextension-polyfill": {
|
||||
"version": "0.3.1",
|
||||
"resolved": "https://registry.npmjs.org/webextension-polyfill/-/webextension-polyfill-0.3.1.tgz",
|
||||
"integrity": "sha512-ISB42vlgMyM7xE1u6pREeCqmmXjLsYu/nqAR8Dl/gIAnylb+KpRpvKbVkUYNFePhhXn0Obkkc3jasOII9ztUtg=="
|
||||
}
|
||||
}
|
||||
}
|
@ -1,5 +1,5 @@
|
||||
{
|
||||
"dependencies": {
|
||||
"webextension-polyfill": "^0.1.1"
|
||||
"webextension-polyfill": "^0.3.1"
|
||||
}
|
||||
}
|
||||
|
Before Width: | Height: | Size: 369 B After Width: | Height: | Size: 3.2 KiB |
Before Width: | Height: | Size: 1.1 KiB |
Before Width: | Height: | Size: 529 B |
Before Width: | Height: | Size: 631 B |
Before Width: | Height: | Size: 631 B |
After Width: | Height: | Size: 16 KiB |
After Width: | Height: | Size: 504 B |
After Width: | Height: | Size: 6.2 KiB |
Before Width: | Height: | Size: 779 B |
Before Width: | Height: | Size: 644 B |
After Width: | Height: | Size: 1.3 KiB |
Before Width: | Height: | Size: 682 B |
After Width: | Height: | Size: 831 B |
After Width: | Height: | Size: 326 B |
After Width: | Height: | Size: 733 B |
After Width: | Height: | Size: 4.6 KiB |
After Width: | Height: | Size: 1.3 KiB |
Before Width: | Height: | Size: 384 B |
After Width: | Height: | Size: 7.5 KiB |
After Width: | Height: | Size: 7.0 KiB |
Before Width: | Height: | Size: 1.1 KiB |
After Width: | Height: | Size: 732 B |
Before Width: | Height: | Size: 210 B |
Before Width: | Height: | Size: 274 B |
Before Width: | Height: | Size: 743 B |
After Width: | Height: | Size: 8.3 KiB |
Before Width: | Height: | Size: 1.8 KiB |
Before Width: | Height: | Size: 642 B |
Before Width: | Height: | Size: 706 B After Width: | Height: | Size: 763 B |
Before Width: | Height: | Size: 678 B |
Before Width: | Height: | Size: 678 B |
Before Width: | Height: | Size: 2.1 KiB After Width: | Height: | Size: 2.1 KiB |
Before Width: | Height: | Size: 714 B |
Before Width: | Height: | Size: 100 B After Width: | Height: | Size: 100 B |