From 1985fbc81aac7c3f8a0fb8e2d564fd1a8364be2c Mon Sep 17 00:00:00 2001 From: Elbert Alias Date: Sun, 14 May 2017 15:05:58 +1000 Subject: [PATCH] Replace Vagrant with Docker --- .gitignore | 14 +- .travis.yml | 16 +- CONTRIBUTING.md | 3 - Dockerfile | 32 + bin/{wappalyzer-build => build} | 71 +- bin/{wappalyzer-help => help} | 2 +- bin/links | 14 + bin/run | 11 + bin/validate | 17 + bin/validate-icons | 43 + ...ppalyzer-validate-regex => validate-regex} | 3 +- bin/wappalyzer | 12 - bin/wappalyzer-links | 45 - bin/wappalyzer-validate | 35 - bin/wappalyzer-validate-icons | 55 - docker/Dockerfile | 72 - docker/node/package.json | 27 - docker/ssh/insecure.key | 27 - docker/ssh/insecure.key.pub | 1 - package.json | 8 + run | 19 + src/drivers/{phantomjs => npm}/.gitignore | 0 src/drivers/{phantomjs => npm}/Dockerfile | 0 src/drivers/{phantomjs => npm}/README.md | 0 src/drivers/{phantomjs => npm}/driver.js | 0 src/drivers/{phantomjs => npm}/index.js | 0 src/drivers/{phantomjs => npm}/package.json | 0 src/drivers/webextension/.gitignore | 13 +- src/drivers/webextension/images/icons | 1 + .../webextension/images/icons/.gitkeep | 0 .../images/icons/converted/.gitkeep | 0 src/icons/3dCart.png | Bin 1831 -> 1776 bytes src/icons/ActOn.png | Bin 609 -> 608 bytes src/icons/Amazon-Cloudfront.svg | 24 +- src/icons/AngularJS.svg | 75 +- src/icons/Apache Traffic Server.png | Bin 8307 -> 5838 bytes src/icons/Apache.svg | 4 +- src/icons/Aurelia.svg | 65 +- src/icons/Bootstrap Table.svg | 5 +- src/icons/Clipboard.js.svg | 4 +- src/icons/Comandia.svg | 10 +- src/icons/Express.png | Bin 4552 -> 2362 bytes src/icons/Fastly.svg | 32 +- src/icons/Firebase.png | Bin 1698 -> 1690 bytes src/icons/FlexSlider.png | Bin 754 -> 740 bytes src/icons/ForkCMS.png | Bin 2032 -> 1836 bytes src/icons/Froala.svg | 2 +- src/icons/Google Search Appliance.png | Bin 1509 -> 1508 bytes src/icons/Homeland.png | Bin 19700 -> 11831 bytes src/icons/Kamva.svg | 213 +-- src/icons/Klarna.svg | 13 +- src/icons/Medium.svg | 10 +- src/icons/Netlify.svg | 10 +- src/icons/Neto.svg | 37 +- src/icons/PHP.svg | 2 +- src/icons/Play.svg | 2 +- src/icons/Plotly.png | Bin 713 -> 646 bytes src/icons/Raspbian.svg | 18 +- src/icons/Revel.png | Bin 1506 -> 1362 bytes src/icons/RockRMS.svg | 13 +- src/icons/Salesforce.svg | 160 +-- src/icons/Scholica.svg | 25 +- src/icons/Shapecss.svg | 28 +- src/icons/ShellInABox.png | Bin 368 -> 234 bytes src/icons/SpinCMS.png | Bin 6917 -> 3838 bytes src/icons/SumoMe.png | Bin 15418 -> 15334 bytes src/icons/SweetAlert2.png | Bin 3508 -> 3505 bytes src/icons/Vinala.png | Bin 1777 -> 1664 bytes src/icons/YouTrack.png | Bin 1674 -> 1522 bytes src/icons/adminer.png | Bin 1127 -> 742 bytes src/icons/apostrophecms.svg | 13 +- src/icons/aws-ec2.svg | 14 +- src/icons/aws-s3.svg | 18 +- src/icons/cloudcart.svg | 25 +- src/icons/default.svg | 20 +- src/icons/eCommercePy.png | Bin 721 -> 717 bytes src/icons/ebis.png | Bin 54841 -> 54631 bytes src/icons/ec-cube.png | Bin 53579 -> 53369 bytes src/icons/etherpad.png | Bin 1009 -> 468 bytes src/icons/gerrit.svg | 9 +- src/icons/gogs.png | Bin 4174 -> 4004 bytes src/icons/gravityforms.svg | 2 +- src/icons/iPresta.png | Bin 22212 -> 22125 bytes src/icons/infusionsoft.svg | 2 +- src/icons/kibana.svg | 20 +- src/icons/mailchimp.svg | 2 +- src/icons/mattermost.png | Bin 1345 -> 1195 bytes src/icons/meliscmsv2.png | Bin 4635 -> 4422 bytes src/icons/moon.png | Bin 2056 -> 1386 bytes src/icons/octopress.png | Bin 400 -> 267 bytes src/icons/pygments.png | Bin 1931 -> 1789 bytes src/icons/storyblok.png | Bin 1899 -> 1896 bytes src/icons/translucide.svg | 37 +- src/icons/typecho.svg | 11 +- src/icons/wp_super_cache.png | Bin 925 -> 785 bytes src/utils/iframe.js | 1166 ----------------- src/utils/network.js | 784 ----------- 97 files changed, 216 insertions(+), 3200 deletions(-) delete mode 100644 CONTRIBUTING.md create mode 100644 Dockerfile rename bin/{wappalyzer-build => build} (51%) rename bin/{wappalyzer-help => help} (84%) create mode 100755 bin/links create mode 100755 bin/run create mode 100755 bin/validate create mode 100755 bin/validate-icons rename bin/{wappalyzer-validate-regex => validate-regex} (94%) delete mode 100755 bin/wappalyzer delete mode 100755 bin/wappalyzer-links delete mode 100755 bin/wappalyzer-validate delete mode 100755 bin/wappalyzer-validate-icons delete mode 100644 docker/Dockerfile delete mode 100644 docker/node/package.json delete mode 100644 docker/ssh/insecure.key delete mode 100644 docker/ssh/insecure.key.pub create mode 100644 package.json create mode 100755 run rename src/drivers/{phantomjs => npm}/.gitignore (100%) rename src/drivers/{phantomjs => npm}/Dockerfile (100%) rename src/drivers/{phantomjs => npm}/README.md (100%) rename src/drivers/{phantomjs => npm}/driver.js (100%) rename src/drivers/{phantomjs => npm}/index.js (100%) rename src/drivers/{phantomjs => npm}/package.json (100%) create mode 120000 src/drivers/webextension/images/icons delete mode 100644 src/drivers/webextension/images/icons/.gitkeep delete mode 100644 src/drivers/webextension/images/icons/converted/.gitkeep mode change 100755 => 100644 src/icons/FlexSlider.png mode change 100755 => 100644 src/icons/ForkCMS.png delete mode 100644 src/utils/iframe.js delete mode 100644 src/utils/network.js diff --git a/.gitignore b/.gitignore index 7d65964c0..b604acc93 100644 --- a/.gitignore +++ b/.gitignore @@ -1,15 +1,11 @@ -.vagrant - -build/* -src/icons/converted/* - -node_modules -npm-debug.log - -tags +/build/* +/src/icons/converted/* +/node_modules +/npm-debug.log !.gitkeep +# Junk files Thumbs.db Desktop.ini *.DS_Store diff --git a/.travis.yml b/.travis.yml index d9239161a..ca6c98893 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,17 +1,9 @@ -language: node_js -node_js: - - "node" sudo: false -dist: trusty -before_install: - - export WAPPALYZER_ROOT=$TRAVIS_BUILD_DIR - - export WAPPALYZER_NODE_PATH=$TRAVIS_BUILD_DIR - - export PATH=$PATH:$TRAVIS_BUILD_DIR/bin - - ln -s docker/node/package.json package.json -before_script: npm i -g manifoldjs +services: docker after_success: - sha256sum build/* > build/SHA256SUMS - cat build/SHA256SUMS +script: ./run build deploy: provider: releases api_key: @@ -22,9 +14,5 @@ deploy: on: repo: AliasIO/Wappalyzer tags: true -after_script: ls -l --block-size=kB build -cache: - directories: - - node_modules env: - CXX=g++-4.8 diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md deleted file mode 100644 index bffe6a2e1..000000000 --- a/CONTRIBUTING.md +++ /dev/null @@ -1,3 +0,0 @@ -# Contributing - -You can find our contribution guide [in our wiki](https://github.com/AliasIO/Wappalyzer/wiki/Contributing). diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 000000000..e10b84532 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,32 @@ +FROM alpine + +MAINTAINER Elbert Alias + +ENV WAPPALYZER_DIR=/opt/wappalyzer + +RUN apk add --no-cache \ + bash \ + curl \ + fontconfig \ + nodejs \ + optipng \ + zip + +RUN mkdir -p /usr/share && \ + cd /usr/share \ + && curl -L https://bitbucket.org/ariya/phantomjs/downloads/phantomjs-2.1.1-linux-x86_64.tar.bz2 | tar xj \ + && ln -s /usr/share/phantomjs/phantomjs /usr/bin/phantomjs + +RUN apk del \ + curl + +RUN npm i -g \ + jsonlint-cli \ + manifoldjs \ + svg2png-many + +RUN mkdir -p $WAPPALYZER_DIR + +WORKDIR $WAPPALYZER_DIR + +CMD [ "./bin/run" ] diff --git a/bin/wappalyzer-build b/bin/build similarity index 51% rename from bin/wappalyzer-build rename to bin/build index a07a85b59..af6a94195 100755 --- a/bin/wappalyzer-build +++ b/bin/build @@ -1,82 +1,57 @@ #!/bin/bash -if [ -z $WAPPALYZER_ROOT ] -then - echo "\$WAPPALYZER_ROOT not set" +cd "$(dirname $0)/.." - exit 1 -fi - -if [ -z $WAPPALYZER_NODE_PATH ] -then - echo "\$WAPPALYZER_NODE_PATH not set" - - exit 1 -fi - -set -eu - -wappalyzer validate +./bin/validate echo "Prettifying apps.json..." -node $WAPPALYZER_NODE_PATH/node_modules/jsonlint/lib/cli.js -ist $'\t' $WAPPALYZER_ROOT/src/apps.json - -echo "Compressing PNG and SVG icons..." - -node $WAPPALYZER_NODE_PATH/node_modules/imagemin-cli/cli.js $WAPPALYZER_ROOT/src/icons/* --out-dir $WAPPALYZER_ROOT/src/icons 2>&1 > /dev/null +jsonlint-cli -ist $'\t' src/apps.json echo "Converting SVG icons to PNG..." -OIFS="$IFS" -IFS=$'\n' - -for svg in $(find $WAPPALYZER_ROOT/src/icons -type f -name "*.svg") -do - echo " Converting $(basename "$svg")..." - - dest="$WAPPALYZER_ROOT/src/icons/converted/$(basename "$svg").png" - - if [[ -f "$dest" ]]; then - rm "$dest" - fi +#svg2png-many -i src/icons/ -o src/icons/converted/ --width=32 --height=32 - node $WAPPALYZER_NODE_PATH/node_modules/svg2png/bin/svg2png-cli "$svg" --width=32 --height=32 --output "$dest" || true -done +echo "Compressing PNG icons..." -IFS="$OIFS" +optipng -quiet "src/icons/*.png" +optipng -quiet "src/icons/converted/*.png" -echo "Compressing converted PNG icons..." - -node $WAPPALYZER_NODE_PATH/node_modules/imagemin-cli/cli.js $WAPPALYZER_ROOT/src/icons/converted/* $WAPPALYZER_ROOT/src/icons/converted - -wappalyzer links # WebExtension -echo "Building WebExtension driver..." +echo "Building WebExtension..." -webextension_dir=$WAPPALYZER_ROOT/src/drivers/webextension +webextension_dir=src/drivers/webextension pushd $webextension_dir > /dev/null -zip -qr $WAPPALYZER_ROOT/build/wappalyzer_webextension.zip . +zip -qr ../../../build/wappalyzer_webextension.zip . popd > /dev/null # Edge +echo "Building Edge application..." -pushd $WAPPALYZER_ROOT/build > /dev/null +pushd build > /dev/null + +webextension_dir="../$webextension_dir" +manifest_dir="Wappalyzer/edgeextension/manifest" mv $webextension_dir/manifest.json $webextension_dir/manifest.webextension.json mv $webextension_dir/manifest.edge.json $webextension_dir/manifest.json manifoldjs -l debug -p edgeextension -f edgeextension -m $webextension_dir/manifest.json +# Replace symlinks with actual files +rm $manifest_dir/Extension/images/icons + +cp ../src/apps.json $manifest_dir/Extension +cp ../src/wappalyzer.js $manifest_dir/Extension/js +cp -r ../src/icons $manifest_dir/Extension/images + mv $webextension_dir/manifest.json $webextension_dir/manifest.edge.json mv $webextension_dir/manifest.webextension.json $webextension_dir/manifest.json -manifest_dir="Wappalyzer/edgeextension/manifest" - sed -i 's/INSERT-YOUR-PACKAGE-IDENTITY-NAME-HERE/Wappalyzer/' $manifest_dir/appxmanifest.xml sed -i 's/INSERT-YOUR-PACKAGE-IDENTITY-PUBLISHER-HERE/Wappalyzer/' $manifest_dir/appxmanifest.xml sed -i 's/INSERT-YOUR-PACKAGE-PROPERTIES-PUBLISHERDISPLAYNAME-HERE/Wappalyzer/' $manifest_dir/appxmanifest.xml @@ -94,4 +69,4 @@ rm -rf Wappalyzer popd > /dev/null -echo "Done. Builds have been created in $WAPPALYZER_ROOT/build." +echo "Done." diff --git a/bin/wappalyzer-help b/bin/help similarity index 84% rename from bin/wappalyzer-help rename to bin/help index d832f88c1..736fc925f 100755 --- a/bin/wappalyzer-help +++ b/bin/help @@ -1,7 +1,7 @@ #!/bin/bash cat << 'EOF' -usage: wappalyzer [] +usage: ./run [] The following commands are available: build Package drivers diff --git a/bin/links b/bin/links new file mode 100755 index 000000000..c7905c0c4 --- /dev/null +++ b/bin/links @@ -0,0 +1,14 @@ +#!/bin/bash + +cd "$(dirname $0)/../src" + +echo "Creating links..." + +ln -nsf ../../apps.json drivers/npm +ln -nsf ../../wappalyzer.js drivers/npm + +ln -nsf ../../apps.json drivers/webextension +ln -nsf ../../../wappalyzer.js drivers/webextension/js +ln -nsf ../../../icons/ drivers/webextension/images/icons + +echo "Done." diff --git a/bin/run b/bin/run new file mode 100755 index 000000000..f7a29c820 --- /dev/null +++ b/bin/run @@ -0,0 +1,11 @@ +#!/bin/bash + +cd "$(dirname $0)" + +if [[ -f "$1" ]]; then + ./$1 $@ +else + ./help + + exit 1 +fi diff --git a/bin/validate b/bin/validate new file mode 100755 index 000000000..1d6587600 --- /dev/null +++ b/bin/validate @@ -0,0 +1,17 @@ +#!/bin/bash + +cd "$(dirname $0)/.." + +set -eu + +echo "Validating apps.json..." + +jsonlint-cli -s schema.json src/apps.json + +echo "Validating regular expressions..." + +./bin/validate-regex + +echo "Validating icons..." + +./bin/validate-icons diff --git a/bin/validate-icons b/bin/validate-icons new file mode 100755 index 000000000..e1e629bbe --- /dev/null +++ b/bin/validate-icons @@ -0,0 +1,43 @@ +#!/usr/bin/env node + +var + app, + fs = require('fs'), + fileType = require('../node_modules/file-type'), + readChunk = require('../node_modules/read-chunk') + isSvg = require('../node_modules/is-svg') + json = require('../src/apps.json'); + +for (app in json.apps) { + (function(app) { + var + basePath = 'src/icons/'; + iconPath = json.apps[app].icon || 'default.svg'; + path = basePath + iconPath, + ext = iconPath.substr(iconPath.length - 4); + + if ( ext !== '.png' && ext !== '.svg' ) { + throw err = new Error('Icon file extension specified for app "' + app + '" is not ".png" or ".svg": src/icons/' + iconPath); + } + + fs.exists(path, function(exists) { + if ( exists ) { + if ( ext === '.png' ) { + var buffer = fileType(readChunk.sync(path, 0, 262)); + + if ( buffer === null ) { + throw new Error('Unknown mimetype or bad file for "' + app + '": src/icons/' + iconPath); + } else if ( buffer.mime !== 'image/png' ) { + throw new Error('Incorrect mimetype "' + buffer.mime + '" when expected PNG for app "' + app + '": src/icons/' + iconPath); + } + } else if ( type === 'svg' ) { + if ( !isSvg(fs.readFileSync(path)) ) { + throw new Error('Incorrect mimetype when expected SVG for app "' + app + '": src/icons/' + iconPath); + } + } + } else { + throw Error('Missing file for app "' + app + '": src/icons/' + iconPath); + } + }); + }(app)); +} diff --git a/bin/wappalyzer-validate-regex b/bin/validate-regex similarity index 94% rename from bin/wappalyzer-validate-regex rename to bin/validate-regex index f7976c116..423aa2c69 100755 --- a/bin/wappalyzer-validate-regex +++ b/bin/validate-regex @@ -2,8 +2,7 @@ var app, - modulesPath = process.env.WAPPALYZER_NODE_PATH !== undefined ? process.env.WAPPALYZER_NODE_PATH + '/node_modules/' : '', - json = require(process.env.WAPPALYZER_ROOT + '/src/apps.json'); + json = require('../src/apps.json'); for ( app in json.apps ) { ['headers', 'html', 'env', 'meta', 'script'].forEach(function(type) { diff --git a/bin/wappalyzer b/bin/wappalyzer deleted file mode 100755 index 5c1cb8261..000000000 --- a/bin/wappalyzer +++ /dev/null @@ -1,12 +0,0 @@ -#!/bin/bash - -if [ -f "$0-$1" ] -then - $0-$1 ${*:2} -else - $0-help - - exit 1 -fi - -exit diff --git a/bin/wappalyzer-links b/bin/wappalyzer-links deleted file mode 100755 index ae75f4432..000000000 --- a/bin/wappalyzer-links +++ /dev/null @@ -1,45 +0,0 @@ -#!/bin/bash - -path=$1 - -if [ -z $path ] -then - if [ -z $WAPPALYZER_ROOT ] - then - echo "-$(basename $0): No path specified" - - exit 1 - fi - - path=$WAPPALYZER_ROOT -fi - -set -eu - -if [ ! -d $path/src ] -then - echo "-$(basename $0): Incorrect path" - - exit 1 -fi - -path="$path/src" - -echo "Creating hard links..." - -ln -f $path/wappalyzer.js $path/drivers/phantomjs -ln -f $path/apps.json $path/drivers/phantomjs - -ln -f $path/wappalyzer.js $path/drivers/webextension/js -ln -f $path/apps.json $path/drivers/webextension -ln -f $path/icons/*.png $path/drivers/webextension/images/icons -ln -f $path/icons/*.svg $path/drivers/webextension/images/icons -ln -f $path/utils/*.js $path/drivers/webextension/js - -if [ "$(compgen -G "$path/icons/converted/*.png" | head -n1)" ]; then - ln -f $path/icons/converted/*.png $path/drivers/webextension/images/icons/converted -fi - -echo "OK" - -exit 0 diff --git a/bin/wappalyzer-validate b/bin/wappalyzer-validate deleted file mode 100755 index 0106c4d18..000000000 --- a/bin/wappalyzer-validate +++ /dev/null @@ -1,35 +0,0 @@ -#!/bin/bash - -path="$1" - -if [ -z "$path" ]; then - if [ -z "$WAPPALYZER_ROOT" ]; then - echo "-$(basename $0): No path specified" - - exit 1 - fi - - path="$WAPPALYZER_ROOT" -fi - -set -eu - -if [ ! -d "$path/src" ]; then - echo "-$(basename $0): Incorrect path" - - exit 1 -fi - -path="$path/src" - -echo "Validating apps.json..." - -node "$WAPPALYZER_NODE_PATH/node_modules/jsonlint/lib/cli.js" --quiet -V "$WAPPALYZER_ROOT/schema.json" "$path/apps.json" - -echo "Validating regular expressions..." - -wappalyzer validate-regex - -echo "Validating icons..." - -wappalyzer validate-icons diff --git a/bin/wappalyzer-validate-icons b/bin/wappalyzer-validate-icons deleted file mode 100755 index 185511826..000000000 --- a/bin/wappalyzer-validate-icons +++ /dev/null @@ -1,55 +0,0 @@ -#!/usr/bin/env node - -var - app, - modulesPath = process.env.WAPPALYZER_NODE_PATH !== undefined ? process.env.WAPPALYZER_NODE_PATH + '/node_modules/' : '', - fs = require('fs'), - fileType = require(modulesPath + 'file-type'), - readChunk = require(modulesPath + 'read-chunk') - isSvg = require(modulesPath + 'is-svg') - json = require(process.env.WAPPALYZER_ROOT + '/src/apps.json'); - -for (app in json.apps) { - (function(app) { - var basePath = process.env.WAPPALYZER_ROOT + '/src/icons/'; - var iconPath = json.apps[app].icon || 'default.svg'; - var path = basePath + iconPath; - - var type; - if (path.substr(path.length - 4) === '.png') { - type = "PNG"; - } - else if (path.substr(path.length - 4) === '.svg') { - type = "SVG"; - } - else { - var err = new Error('Icon file extension specified for app "' + app + '" is not ".png" or ".svg": src/icons/' + iconPath); - throw err; - } - - fs.exists(path, function(exists) { - if (exists) { - if (type === "PNG") { - var buffer = fileType(readChunk.sync(path, 0, 262)); - if (buffer === null) { - var err = new Error('Unknown mimetype or bad file for "' + app + '": src/icons/' + iconPath); - throw err; - } - else if (buffer.mime !== 'image/png') { - var err = new Error('Incorrect mimetype "' + buffer.mime + '" when expected PNG for app "' + app + '": src/icons/' + iconPath); - throw err; - } - } - else if (type === "SVG") { - if (!isSvg(fs.readFileSync(path))) { - var err = new Error('Incorrect mimetype when expected SVG for app "' + app + '": src/icons/' + iconPath); - throw err; - } - } - } else { - var err = new Error('Missing file for app "' + app + '": src/icons/' + iconPath); - throw err; - } - }); - }(app)); -}; diff --git a/docker/Dockerfile b/docker/Dockerfile deleted file mode 100644 index c35776024..000000000 --- a/docker/Dockerfile +++ /dev/null @@ -1,72 +0,0 @@ -FROM phusion/baseimage - -MAINTAINER Elbert Alias - -ENV DEBIAN_FRONTEND noninteractive - -ENV WAPPALYZER_ROOT /home/wappalyzer/synced -ENV WAPPALYZER_NODE_PATH /home/wappalyzer/node - -# Install packages -RUN sed -i 's/^deb-src\ /\#deb-src\ /g' /etc/apt/sources.list -RUN sed -i 's/archive\.ubuntu\.com/au.archive.ubuntu.com/g' /etc/apt/sources.list -RUN sed -i 's/security\.ubuntu\.com/au.archive.ubuntu.com/g' /etc/apt/sources.list -RUN curl -sL https://deb.nodesource.com/setup_6.x | bash - && \ - apt-get install -y \ - nodejs \ - bzip2 \ - zip \ - libfreetype6 \ - libfontconfig \ - rsync && \ - apt-get clean && \ - rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/* - - -# Add user -RUN useradd -ms /bin/bash wappalyzer && usermod -a -G docker_env wappalyzer && echo "wappalyzer:wappalyzer" | chpasswd -RUN echo 'wappalyzer ALL=(ALL) NOPASSWD: ALL' >> /etc/sudoers - -WORKDIR /home/wappalyzer - -RUN su wappalyzer -c "mkdir bin synced" -RUN su wappalyzer -c "echo \"export PATH=\$PATH:/home/wappalyzer/bin:\\$WAPPALYZER_ROOT/bin\" | cat - .profile > /tmp/profile && mv /tmp/profile .profile" - -RUN echo "cd \$WAPPALYZER_ROOT" >> .bashrc -RUN echo "wappalyzer" >> .bashrc - - -# PhantomJS -# RUN su wappalyzer -c "\ -# mkdir phantomjs && \ -# curl -L https://bitbucket.org/ariya/phantomjs/downloads/phantomjs-2.1.1-linux-x86_64.tar.bz2 | tar xvjC phantomjs && \ -# ln -s /home/wappalyzer/phantomjs/phantomjs-*-linux-x86_64/bin/phantomjs /usr/bin/phantomjs" - - -# Node JS -RUN su wappalyzer -c "mkdir $WAPPALYZER_NODE_PATH" - -ADD node/package.json $WAPPALYZER_NODE_PATH/package.json - -RUN su wappalyzer -c "cd $WAPPALYZER_NODE_PATH && npm i" - -RUN npm i -g manifoldjs - - -# SSH -RUN rm -f /etc/service/sshd/down -RUN su wappalyzer -c "mkdir .ssh && chmod 700 .ssh" - -ADD ssh/insecure.key.pub /tmp/insecure.key.pub - -RUN su wappalyzer -c "cat /tmp/insecure.key.pub >> .ssh/authorized_keys && chmod 600 .ssh/authorized_keys" && rm -f /tmp/insecure.key.pub - - -# Fix the `stdin: is not a tty` error in Vagrant -RUN sed -i 's/^mesg n$/tty -s \&\& mesg n/g' /root/.profile - -EXPOSE 22 - -RUN echo "/usr/sbin/sshd -D" > /etc/my_init.d/sshd.sh - -CMD ["/sbin/my_init"] diff --git a/docker/node/package.json b/docker/node/package.json deleted file mode 100644 index cbfe4c39e..000000000 --- a/docker/node/package.json +++ /dev/null @@ -1,27 +0,0 @@ -{ - "name": "wappalyzer-test", - "private": true, - "license": "GPLv3", - "bugs": { - "url": "https://github.com/AliasIO/Wappalyzer/issues" - }, - "homepage": "https://github.com/AliasIO/Wappalyzer", - "description": "Build test for Wappalyzer", - "repository": "AliasIO/Wappalyzer", - "scripts": { - "test": "./bin/wappalyzer build" - }, - "devDependencies": { - "file-type": "3.8.*", - "is-svg": "2.0.*", - "read-chunk": "2.0.*", - "jsonlint": "*", - "jpm": "*", - "imagemin-cli": "2.*.*", - "phantomjs-prebuilt": "*", - "svg2png": "3.*.*" - }, - "engines": { - "node": ">= 4" - } -} diff --git a/docker/ssh/insecure.key b/docker/ssh/insecure.key deleted file mode 100644 index bf599e805..000000000 --- a/docker/ssh/insecure.key +++ /dev/null @@ -1,27 +0,0 @@ ------BEGIN RSA PRIVATE KEY----- -MIIEowIBAAKCAQEAqVo54bv3J4K62IDCUIVY7gF2iBOR8fub5c9t6j4MbsRQDmU0 -yxhN1+7fMCERcoMSelAb/SYSzKE8azLugP7hsq4t+/xJijCB22uriFhKMpu4ySoA -6PVNbfbIptaVo6holVIMRKPXTg1hU6lr2DWMKB5AlGmz7ZHmQgX9iBoV8PmMYOF5 -UpiwfokcNnIwDiCCpd19G/lT6FlCVZHZdeZh41FWke8oQgWevM8fdGJkZ+a7Lgdm -6A3WlvI0AIz9KWfXlXAOvthi4QlB4SvSCwRQbKdHbW5UBRShucjlce3hZO9Q6ROC -Ta1zgvscleKd63yHSQ18Z2+j1t5T3HJzhOn1ywIDAQABAoIBAFdbcWwd15oL93Hi -yVlbz8nF+2yqG6ilT3+2Bk7EfwlMPreOQTNacB0o3PwosqVNM2Tgme91ilEAAviR -JzJnR+kxrArF0vFzoCidW7hTQsLkTOeHwTxp/OzyVgKpwjrPjlMoJafqlA9xG3la -dYTr6kZvhISKGgQ8NHhuOp/QRO0uFaQD8l0kVCEufgqbs6gBY7aAkNf2iogSms9w -139zwsXeSg2Vm7Img1PVrRsRM5qbTNBMIim+9q4fSrqP+rYF9lU1p68IzmG/wY2o -0ElwRoatVVV9Rvk00a1qBGNaT39oVEtryIiAlXPno+KW5dyVx53o9vjWHDz44yBN -G8/EgEECgYEA3UJtj5ikEdhquzy1WfbZwZVmTCJLMefiVui00RLV4Q/r/4Uojdsb -L/QCAplpbHUrj7O8Lp9CuXSnUNa4CkrTidj2wkDWDFl1EBLJNz1zhJjs6Aaw2u1t -SV6ULgx9Y25oiStygkJhon+wlNF9HRSCFeNkBNNjpkD2gEifxnHIDLsCgYEAw/Fi -OHFvVPx0/DS3FD/MEJAAZaGdg8Zb2TCmCIVjoj0tZOTDvwKIEYCQ41vADDLlCSGg -XOgNXvosSZtezmJxnkzO3NYXE4XZ7bPVMamuqbKXXzaee3tPmiFaeZfiB4tj7uxh -tWQdUicSMQ8WPqyTB5wmcF7k3L4TzrjSLOi5MjECgYEAnsLYfI3pREjGpN01v3zp -2QbLZVvCGugpN3U4sUBTqW9URn+Ujt0mD+2FN7o+tC0K+czc/ZMXPJ1gpRe87N2u -Fh5RSSder3PNFKB2MyXr6rwUWZTbd+ufXGL57mTV3+/MIIjFXIQnLIN1AAOlQ6WA -hhYooXHQ8e1xMrFpu+nOwpsCgYAanYEf9ZiPzLL/RxHPOFM5tLW5GFjS+3Cicc87 -vRKpiPHPkJteKLPe3L3RhDbz8T3XHbAwrnySeBzn6qjYE9snC3vV12bPChFuDk1Z -L5lAB7g0ALFKSJepcfpeJdlX+QEcBRPIlc69x/zamRgGb16RXA6EmP8xVMhP/h7e -ZsYxIQKBgBqOaZNHwaG6PqP2HCjc1keH4wQVx9eTV5y4/B5FJbMeK05vV2rBHoxA -P/dXE85olj8D/9E88xJ1V716kBeONcKFdbd3VfY5bo2VBz+piOaG3EBQOLIbd4/C -KVtgOWqI7WTLPIgpXlG5MA801RwhVyk1phmwhvW/Kb3lWsK1vkOe ------END RSA PRIVATE KEY----- diff --git a/docker/ssh/insecure.key.pub b/docker/ssh/insecure.key.pub deleted file mode 100644 index 48f46c871..000000000 --- a/docker/ssh/insecure.key.pub +++ /dev/null @@ -1 +0,0 @@ -ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCpWjnhu/cngrrYgMJQhVjuAXaIE5Hx+5vlz23qPgxuxFAOZTTLGE3X7t8wIRFygxJ6UBv9JhLMoTxrMu6A/uGyri37/EmKMIHba6uIWEoym7jJKgDo9U1t9sim1pWjqGiVUgxEo9dODWFTqWvYNYwoHkCUabPtkeZCBf2IGhXw+Yxg4XlSmLB+iRw2cjAOIIKl3X0b+VPoWUJVkdl15mHjUVaR7yhCBZ68zx90YmRn5rsuB2boDdaW8jQAjP0pZ9eVcA6+2GLhCUHhK9ILBFBsp0dtblQFFKG5yOVx7eFk71DpE4JNrXOC+xyV4p3rfIdJDXxnb6PW3lPccnOE6fXL elbert@home diff --git a/package.json b/package.json new file mode 100644 index 000000000..2148f0f67 --- /dev/null +++ b/package.json @@ -0,0 +1,8 @@ +{ + "dependencies": { + "file-type": "3.8.*", + "is-svg": "2.0.*", + "read-chunk": "2.0.*" + } +} + diff --git a/run b/run new file mode 100755 index 000000000..237565872 --- /dev/null +++ b/run @@ -0,0 +1,19 @@ +#!/bin/bash + +cd "$(dirname $0)" + +if [[ -z "$(which docker)" ]]; then + echo "Please install Docker from https://www.docker.com" + + exit 1 +fi + +docker="docker run --rm -v "$(pwd):/opt/wappalyzer" -it wappalyzer/dev" + +if [[ ! -d "node_modules" ]]; then + $docker ./bin/run links + + $docker npm i +fi + +$docker ./bin/run $@ diff --git a/src/drivers/phantomjs/.gitignore b/src/drivers/npm/.gitignore similarity index 100% rename from src/drivers/phantomjs/.gitignore rename to src/drivers/npm/.gitignore diff --git a/src/drivers/phantomjs/Dockerfile b/src/drivers/npm/Dockerfile similarity index 100% rename from src/drivers/phantomjs/Dockerfile rename to src/drivers/npm/Dockerfile diff --git a/src/drivers/phantomjs/README.md b/src/drivers/npm/README.md similarity index 100% rename from src/drivers/phantomjs/README.md rename to src/drivers/npm/README.md diff --git a/src/drivers/phantomjs/driver.js b/src/drivers/npm/driver.js similarity index 100% rename from src/drivers/phantomjs/driver.js rename to src/drivers/npm/driver.js diff --git a/src/drivers/phantomjs/index.js b/src/drivers/npm/index.js similarity index 100% rename from src/drivers/phantomjs/index.js rename to src/drivers/npm/index.js diff --git a/src/drivers/phantomjs/package.json b/src/drivers/npm/package.json similarity index 100% rename from src/drivers/phantomjs/package.json rename to src/drivers/npm/package.json diff --git a/src/drivers/webextension/.gitignore b/src/drivers/webextension/.gitignore index 602df1590..3e368c431 100644 --- a/src/drivers/webextension/.gitignore +++ b/src/drivers/webextension/.gitignore @@ -1,7 +1,6 @@ -apps.json -images/icons/converted/*.png -images/icons/*.png -images/icons/*.svg -js/wappalyzer.js -js/iframe.js -js/network.js +/apps.json +/images/icons/converted/* +/images/icons/* +/js/wappalyzer.js +/js/iframe.js +/js/network.js diff --git a/src/drivers/webextension/images/icons b/src/drivers/webextension/images/icons new file mode 120000 index 000000000..f7467b9a7 --- /dev/null +++ b/src/drivers/webextension/images/icons @@ -0,0 +1 @@ +../../../icons/ \ No newline at end of file diff --git a/src/drivers/webextension/images/icons/.gitkeep b/src/drivers/webextension/images/icons/.gitkeep deleted file mode 100644 index e69de29bb..000000000 diff --git a/src/drivers/webextension/images/icons/converted/.gitkeep b/src/drivers/webextension/images/icons/converted/.gitkeep deleted file mode 100644 index e69de29bb..000000000 diff --git a/src/icons/3dCart.png b/src/icons/3dCart.png index a8fc574678a7e4f3a84247f0c2638c978f916bf3..64ca4abc8b98d0a30c26066534ef0258b756a381 100644 GIT binary patch delta 1008 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 diff --git a/src/icons/Amazon-Cloudfront.svg b/src/icons/Amazon-Cloudfront.svg index a28de1faa..7454c8e58 100755 --- a/src/icons/Amazon-Cloudfront.svg +++ b/src/icons/Amazon-Cloudfront.svg @@ -1,23 +1 @@ - - NetworkingContentDelivery - - - - - - - - - - - - - - - - - - - - - +NetworkingContentDelivery \ No newline at end of file diff --git a/src/icons/AngularJS.svg b/src/icons/AngularJS.svg index 649c9f92f..003deea80 100644 --- a/src/icons/AngularJS.svg +++ b/src/icons/AngularJS.svg @@ -1,74 +1 @@ - - - -image/svg+xml \ No newline at end of file + \ No newline at end of file diff --git a/src/icons/Apache Traffic Server.png b/src/icons/Apache Traffic Server.png index f5cca2ecbe971998b00adabd002f679a60ce7f9c..0faf78e0f6eb3e7955c6112f1da9c2fb8ae7675c 100644 GIT binary patch literal 5838 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 F{tuGkPB#Dm diff --git a/src/icons/Apache.svg b/src/icons/Apache.svg index 2494ae756..775665d1c 100644 --- a/src/icons/Apache.svg +++ b/src/icons/Apache.svg @@ -1,3 +1 @@ - - -image/svg+xml + \ No newline at end of file diff --git a/src/icons/Aurelia.svg b/src/icons/Aurelia.svg index 3bf9ad8fd..3d157b859 100644 --- a/src/icons/Aurelia.svg +++ b/src/icons/Aurelia.svg @@ -1,64 +1 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + \ No newline at end of file diff --git a/src/icons/Bootstrap Table.svg b/src/icons/Bootstrap Table.svg index 2f05ef1f4..a5d95e778 100644 --- a/src/icons/Bootstrap Table.svg +++ b/src/icons/Bootstrap Table.svg @@ -1,4 +1 @@ - - - BT - +BT \ No newline at end of file diff --git a/src/icons/Clipboard.js.svg b/src/icons/Clipboard.js.svg index 007a950a7..aa2c564d3 100644 --- a/src/icons/Clipboard.js.svg +++ b/src/icons/Clipboard.js.svg @@ -1,3 +1 @@ - - - + \ No newline at end of file diff --git a/src/icons/Comandia.svg b/src/icons/Comandia.svg index 9c91aef7e..24a7be8df 100644 --- a/src/icons/Comandia.svg +++ b/src/icons/Comandia.svg @@ -1,9 +1 @@ - - - - - - - - - \ No newline at end of file + \ No newline at end of file diff --git a/src/icons/Express.png b/src/icons/Express.png index e89a824d9cbce16cfbff7c59fa0cd858bdc6ad38..8f3461e69e92bd52061a573462093ae878df7ec8 100644 GIT binary patch literal 2362 zcmZ|R`8yP98^CeNmJUfOg+q17G9sMQDWYU&?544eu^TeRzDzWXu^VI?+bAPr?E5++ zyD+v%WNZf+BqU^wcg_#*Pw(}9ug`No*YgkD*Ar`OsLjKDlbeNwg-2IM!<2a^Fi#@a zdFC`#cObE_u+|tGm}@HQn5*boJk|rLGU-28GXOsUf}a8{pBh@J8(BRwveq!R(KNBq zG_}<-g=m{Wbj2jcJ#D#f?GLzS-T)?m|VSW-FzT0A3K<@ox2~@!_VHs-{D1o zqi294JkSXq$(MhP7a|xup!V-L8 zN&dUix5V;-;)()N1%XsqSW@+_l&QL?tcF-#L#n7Nsj4rnYACC2D645KuWhQRZK|wq zsj6?OX(ZP+F;VK8+v;1|8d}>M$?Z*)j%G?{b6aQ2`>xjZZgP7!rK6{hUwik5 zj-LL`-hr+@rorwH)SiB7@4!&sz;NH-@CWKhKXr6qXmntBY;c4|9ia`4ejFMbAEtd8 z{Wvi;K1uuZd3XL#?tc27skpmV|96Djj_76vi5a#ZGH9Y`r7)puj?D@-!|4aHot9dZES9BZhhbS zzWsgs$M%n%A3IFDJG*n}aVfO3aPESwI&dwUaDbH9~ zIG*WhJT(uZZ)6`@n_CF>shvL`(_be2YkF|?Bb4Cy~5ZRn*_MH!2C5a9nU%a&SaAj^paX&Zka4!C* znu0(=go!-2R)?e@I|2H?k27wA;KMW4qM*I*-HL_LLNj{Pp-0&1CHs5t^E93bRkcwO zj6*6l7+#uboA;1WBT%#|g-Wj54lZrjk^*NdD)jSy))xIMTZJ72CT~J;vM0_1zUW&H z->|LtwxKR`xKtp8_ z52m96&NT!fD;wSr18a(P-q@1L@Q1vrSH_jmf^c$eEhTq^-$oKpp+)NvM;)fU;a@6l z2Ci7KZ(Wq3&?U$cq?;bM!LDhpW-(2)b~8b$TO%JsQ26?%svEy;o2c!T?;X5X!XEg* zcyf&j&DeG%WO;rezpLz3EJWsByZ)s=A=6@?^Pi%HcGeNTYT+&-jMohA*!mlTS6E&c zQAk^S>K{PW${<@D^2cEkjULSX`Fqn`T-ve4c=?21d0JPQSTTevwS!Ic&hZ&ZE)RV{ z`TCP95AuUx`naB@wy0~Js=$vwh7>9m4t|H+EdTmM_MFOYat`MDClA+Gjp+>FN^ z1mKCFvXorhkP{Mrp+}4A72ct-196mo8u*B|6eM_FMy0snskW|JX}TZ z(>I4|WTW%4i-7OXw0~2Kyr0;O5|vAik+G+s0GZAzj!- z`ms=a&wbRYP?8dvMK30h%Ug+`s`4WGvE%&B`_x;1PyY>2UXZ=yDb-bFbU(V8M|2Q= zv@%hyMbR^1>w0XBe;rUqku48*%({!7;^8>gP{O$(6p*C$dCwu{74C9jKNKQ9VGQSb zNb)VmU=~5*CvummV)*TV3PpF0-eBp93@EmX_kzByq&_A0u6j_%KV$yH!>gAQS_$H| zQ)YKRSMH}b5RvKIMVl6~?k79d^OxHV#7aPNT|9&}al5|I*IbO-0$^7up5?0)uh^}- zc^8E=9ZW=zz>^xF2ngYkn zz_wW&)?L#204)Vqr#hbjDqxV1Eeztkw?$=(Ux7unzu?9*w^y@rgH9h{t0e~GMD07r zQs2ge^kgc7K()u9^f1P8$B>sM|qAoCgv^R})% z@p^7eBdN0xW(Qace6e2#YLConZ=*7IZ|3<*0_Cg>?;!2dtXT*!&c$;MJ|NFyhB|55 zGGzG+{$v*+rgThB`B@E2-njnw0MzlLk*}W9rCVk6afGO}m`KJA;rUQ`eN)bdid7<4 zJKVAv($w{7i7)50jTaMSO<@yB{b~#nK-KqPbj?nB#)^=0#L)YH`})6|{O0T_$F<6@ V#>k9|e9S))i>{`jMuj>w;y=8-#!vtN literal 4552 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 diff --git a/src/icons/Fastly.svg b/src/icons/Fastly.svg index 05ae7d05d..bb7a0ded2 100644 --- a/src/icons/Fastly.svg +++ b/src/icons/Fastly.svg @@ -1,31 +1 @@ - - - - - - - - - - - - - - - + \ No newline at end of file diff --git a/src/icons/Firebase.png b/src/icons/Firebase.png index 41e5de9ea11e86599e5f43bcf8b86611de1c4aea..4cfb7b3af70968424624a9fd3b3cfb63e9e19ad7 100644 GIT binary patch delta 1325 zcmV+|1=9MW4Vn#*V3Bese*gwzOGiWi{{a60|De66lK=n&`AI}UR9M5km*0RF&KXzujJ8gG%*{-`~q0mTco2Y0^+n`8d(lkU6dVz@&H5Jf!W8xp6;SV4tmJ3aa z-k_n0sZ}JAOApSf%y~ZF=Xt(w z-gzA>gpS`0F5ZjmKH~gQpydv|&PGPG+ygtgA37HxseOZ__H&Y}_tQE{cusH|?toI~^iA~X&6Q7cRv_bZ@pB0d8M*{N)NNa~^pTqw260J4`vf~5n4y&lOG}* z14UT+1InM7a_#fjsUx_LUchxvA0YkkB>uw9l)%Ex=h1a9cptrEmrCwS^TStO>pVnT)VPIf^!q z9LBs`0tYmP!fnXjTZ0Eu`Y&npngNAx3iX5rhIEOMe>OzOjSx*u;Bw9_F4;xl41>)= z${GdO45+XGw-iEMXi0JfL8eT!t%}RJ#m+2&1B$@r2yN`tW49KdmmYw$PJa)O>nDZK z6xLe;H{r(0p7u^{~_eFHhtwKQaEH?Q-gmn8tLi55m_<#7`38LX!!22DX ziQ1=%e|`7fY6QN8tG`+7&#j-pH$aK5gXdNa2Vlx6tvIE(7T`h;7m_ig$)&Tu5gxA| z4rnv7305NjOF(`CQ~}}ZLVi7P07}SakY9xWr68LIm8{n{pTfG}AjQb$2wm)rhn5#$ zFWnEm+us93Caw3K?<(tpFMPVAb?<2imsjXOfAf8K#RHlPJrU}I%J)>)3kS5l`1-v? zth<5$-+`~s^)1T~QbYsjvcPCfRdbjQK z`JLHP5C|sOt3u%XKUBElcWXy(BzcD delta 1331 zcmV-3178B!yiCQEEk#-y+K10 zQ>#cKmn4c{f<_B8SW9iEEwpFO_ugy0KQGRi=}bGH&V+SyKGxpv^SmEB>m0`_OQ-J# z7av6Se-LruB+zun-efCRw9fjeRj(P+)5kz%`~8KLg!Va`#?bS z8o6zcBD)HL%)oX~fj_-!E=R{_O@%;rK3Hu1m6Y|M-kPU+(Ed4f> ze~(SL)@AJ63EYP-;X3D!kbZEM^x6qJ7l_||Y6C5>80s~U-Ms)8^ef>)qx=1&5spdp z_rd{u^Eg-D$6b99%AYxcHBX}C<0w5~rM)q&OB)dA&Z5x=vI_$9AcRbW8(}citQgY1 zl;p7FDMs&_qO$K0)_flMJ^hkRN9kF-}O|UlLjI`y52f;ZZ zv-?%bKO0%|6ASR(z2nGNf!ewSoOJ=W12noAt^mF^|3nCDfG2K50EKS|b%pu^=@KKYi;y2Ani#|7om+Th7sMF=n}&2Fe?ypp zYzkDIhg%9^PH0hZ1wp1lv}+WXcMFwS1P2s>%@A7HxhK~a&?}EXI!Esekn077&=A&L z1UKP^D-`yP5*1d2_g{2x7&;WuzO)X3#zk!WkqGJT`GDqyuX88-;26=s8t`5Pr=r%m zQg3?KYJqR!=Kfjg^{p4c*FlMvf57wWh66C+lvbV6wFO-0;zBZvG`_g^x5MN0!vSqa zHpY4cumt4CKvfWaPRMTt4nP^%6!Pm3Pzth1P}#b@;ZxWY9Hbc8455R)_1MY+_R7QH zJH0bNWYW3bqC9JcG zfN#SWr}C2R_BREC{mjeJX5oM)oTWp~l2rsk8`Rq78`@>rGWmm}#O2LqzVPKv6h?0! z#3cfuo#JbL#4?qgx&2#_`I2iYplOt1e?PjgyW}+V10!IroEgt|wkGpipUu>^VCC4g z>E388UxB1rr8O|}dK&Zz$o@a~k{l`BmeuDKNigU$~c> z7roo{$->@j(LEh!`Dzrg13;#^km|Q-ThHCNkp8te9Ea-T@2o5Cx&`LfhcE5Hca$xU p#GlXP+zFr%Qu}%96$3kyExGpK(YH4g?|)3NJqPEMSv8ZK1^#4~s^kCw diff --git a/src/icons/FlexSlider.png b/src/icons/FlexSlider.png old mode 100755 new mode 100644 index 9c264278f0ee44cbb846fc9f5e6bfa235c093470..b1cb7fcb7c915728c07c0af839727c423062e6bf GIT binary patch delta 331 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 WLgh~l_MrgJHs z>2!Lhg@Q#c!D4_SR4^nO(I!3^FVSdxGA2HNK!g`VM2MjY`k=-j(cmSRXi|ibfP_*4 zWRTmmrL>)PIzu~`b~@8DmvheEYkfYfJu_!It)Z@$efBzQuYdplyMLd^ga1$()}ohB zu#CugPsoB2bn#7Agkr%FPYGEF)UynCiFiv^Bany?6buj$8pRQ5JgbO6!Px}@7nNKU zRB28ei7{lVOlJY_14w=|psFZw3o+Q4Nwio-jYUKd1Rp{?U$27(q*#gsmVk#4fq~U6 zC3bD=VaLV}%74yK%>oBT&+)hSPH}Lof=Y$f7#AqWAG97sopprs9x z5^gEDVh_KE86Ct2*m>7>9>4oe9{AN?dHT7%80Roq#y_8YfH%gf-1qPkU=7(#Ux*|` zV0scp24TZi2#TU`b_8kf0-vG%`;lvJ1=S1tfcOlu41ZBLHZ;QDU+HE4v5%RYnnkQd zvy4}I`&iY{iVZ1V&0;;yOo8`Ni6T&$Kt@jz+Pff4k=iUFH?JeNn>7Y&3DcP#zD7(%T|m>fln!FF^#g{vc2+(1Z_-*C0g@urs!*>&Az2_L z0<%*PJh%d=VuC7x7^A96<^$C@n~D3EQx6Fu0A?AwEcoZQe6=-z~0 zd4K(Un7g?jI+sv_GS&Y+OjjrixXV^!x;Amo_8!!@Jf#I%XD7I`yPq)9k0MxWDPS?V zADZQD)UMlsRwm%kJK!9;tV3Hnpj3uJ5r4P59aY6Q`t|ufiz>!iva&J>>MkTge(M7ADBw(pipdW z=l0EA>>TPt#ZgmX(hFmC;idi4+}zy*K5EW4YG4`4UG3BC-ZV_7t3%thO#4948g(Cw zsu5vXl8_jK)bGL?CU za`&$p);0g=FAA*cIz=t(}yt!y1!U-KA-C-Va3LeT5RIH}B+;58vW=En&hJ zsMr#%6Vn_To1&-1F;s6ujGfOL?!N9(s$K{gob`rBjxFPsWQ=d#w)&!g|9@+(S+|i& z#~Jzt&VUF;mC5lbZupDRbN!9Xs-ZbCOxJyEUXIK<41o|b4vp7%dbovOJhg|BvGMjtUwAA%BF}8L5&ui}|Qp9+*AjLey@E%3PH_A3GptNJBqfGs zGM@P3^Xz{5Ic~o0N+^hR=XRQ#%8M?n`@r#u88ETT zH?q(R5hyr^s3HW$GRJoYx4`58#5NL)1q_r5D29`naPs{DUVP(8wr%L*w~zja8?V`d z$qUT>(Q~|ZWHb_psDFrtoWN3T86|H>G%}o>nqgvmlEfJVrQq^@PYhU#xB^ltL0db0 zC(m;4&wj^|fm8Dr?m0Njz`5#Dq>JPc6MPmM5+G!C(sy4Y@im-@lT7eF*P((2G?xZr zVOcZ#J{;sX&pb~SloyYT@%XDp2^R#D3$=teC5DGgoF*K47k?cd#2beVN>D+?M6fyF zAXqDuN(mt-Gu0v=^q*qyz&Q84Z~zrUv0%u2pzi%r#3cmw{66;XwQ5w8iM^Wl9>m6J zVs4_zCCRctwHC)Pk^*m@n&zv|^iof=c+AJJvm*El8NQJKm5JQGE~;rxQk7^Jm7Iiv z(YPmuEY0TqVrFJVCnn7hRa7B_@QH`qhJIkKA8I5JRi2l`xw$KzGx_<}6-du|v;p)| zCT!Q}U_h>F#pHvhEf_)&j5GM4gn3`cp*CzLBndL7>bx?3QWF0Kj6BaE?#BA~00000 LNkvXXu0mjfy^hni diff --git a/src/icons/Froala.svg b/src/icons/Froala.svg index 725e7ff3c..dfd7d0421 100644 --- a/src/icons/Froala.svg +++ b/src/icons/Froala.svg @@ -1 +1 @@ -Froala \ No newline at end of file +Froala \ No newline at end of file diff --git a/src/icons/Google Search Appliance.png b/src/icons/Google Search Appliance.png index 2e1f97ecef5475ec662564d82814157513ff3e5b..71bb47077e7397b70c02e2cc19218a7e3eb3f7c9 100644 GIT binary patch delta 349 zcmV-j0iyop3*-y1tpf`pNklLZfo<-=?x7H(<_?huyj_ngA_32>P@~n_14slo~#lw-1{q=c2)qv zZjgTgRRYw?lpB@30q zIXDyuADZ%$N!oC7As9cz7J$ v_3;x-A<<>xs@@eVR!yv3XUG)H($ZL7 zS~6uyecATC`{s9aq%bhZN35OHf4YBC?Z&lX3{vyv?0MKwT3R}7`mUC_3#vMW7=S7) zYirM4m^^i|t_(xg+}7ru(;FHZrdKr0Vd<=D2Pt64)th{E>aD38Jy|7Wxc65!?W_QT z-G3khst!Pcg4tDd^X3O;d|twg9zW()zM3^_R#WA?`Be)$wd5dSRV>CD!z#?o&d3nA z^uVG0b7s$OWocj7wP_iY(?^VC_wFU#M}K}+x8UXF7huLzz$n4w$H&9t w=*I6Oz{FgLEqyU6va^Ycr?IgET`(vB0BR%Nm%<#KiU0rr07*qoM6N<$g1jEE_y7O^ diff --git a/src/icons/Homeland.png b/src/icons/Homeland.png index a269934c4dba63a1cca807535b5f18438300a762..e8ca492f03fea5c542e2d79c342484fb1ce007e3 100644 GIT binary patch delta 11456 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 b5K;R=p5t03#)bL&po1cvw>Eu+CrAGW2jUrm diff --git a/src/icons/Kamva.svg b/src/icons/Kamva.svg index 8bbf89c96..0304de60a 100644 --- a/src/icons/Kamva.svg +++ b/src/icons/Kamva.svg @@ -1,212 +1 @@ - - - -image/svg+xml + \ No newline at end of file diff --git a/src/icons/Klarna.svg b/src/icons/Klarna.svg index e611627af..0bb061c85 100644 --- a/src/icons/Klarna.svg +++ b/src/icons/Klarna.svg @@ -1,12 +1 @@ - - - - klarna - Created with Sketch. - - - - - - - \ No newline at end of file +klarna \ No newline at end of file diff --git a/src/icons/Medium.svg b/src/icons/Medium.svg index f85a5519f..afaa40a70 100755 --- a/src/icons/Medium.svg +++ b/src/icons/Medium.svg @@ -1,9 +1 @@ - - - - - - - - - + \ No newline at end of file diff --git a/src/icons/Netlify.svg b/src/icons/Netlify.svg index 370591793..fa36dd539 100644 --- a/src/icons/Netlify.svg +++ b/src/icons/Netlify.svg @@ -1,9 +1 @@ - - - - - - - - - + \ No newline at end of file diff --git a/src/icons/Neto.svg b/src/icons/Neto.svg index a4fabcbe3..4ed0473bf 100644 --- a/src/icons/Neto.svg +++ b/src/icons/Neto.svg @@ -1,36 +1 @@ - - - - - - - - - - - + \ No newline at end of file diff --git a/src/icons/PHP.svg b/src/icons/PHP.svg index e5799b153..894c7f342 100644 --- a/src/icons/PHP.svg +++ b/src/icons/PHP.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/src/icons/Play.svg b/src/icons/Play.svg index 10925d767..098d6b665 100644 --- a/src/icons/Play.svg +++ b/src/icons/Play.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/src/icons/Plotly.png b/src/icons/Plotly.png index 20f7b24d82a7b723e9de858cd93c02b5a63fadf7..b970858cb2a1ed7bf8f8ae3f9cdabe774421df93 100644 GIT binary patch delta 594 zcmV-Y0F>Ti}ZrC$!*fek0HE`HAaoIO<**9|8IC9xIbJ;m_**bICJ$BkZciKXE+d_KV zLwegvf80%h-B^j=S&H9dkl|yI;bf8FWs>1&l;UWW;%}McaGKoCjIQa9uj!h%?4G*pqP^{;zwV{K?xn!)rois0!tboa@2iOgA z`tI}m@bvug_5AYo{POnw_4xhv_<#NR`~Ld-{`&m>`~3d={r>*`|Nj5~|NsBAv$$da z0004EOGiW)n`wm}0002{NklvbLbeD1w-`fA~5}Ew||!y=vpL^ zp8!1ofF2D6XD2}4YCsV1A$U8KjxK~z}7 z?Uy}h6hRn;js?zsD87JzzxQ@C-az;GecJ%HE>uRoMf3d%Ld)sus%m0(=}NK?$%wH$9LzLAZ zN!dD90!`wD<*EgsFEnlUb6Wttq2d0sIi9~=1YrDdKNpV=bk~G`O0CMgUb)jZq56IE z{=Ku{j|W(5$gj2Mbqc^UiplrOEG${96ZVaS?B1U39)RyDCSEP@ai&JKA>2BrJ@7VzlWaCZR^Xs#&W z+y;CH1kfsZ(o$c4ex<;j$FqDdS?W#4_0t8SK&763ql{wuOO1yw=gIn-e2?Mwg)Ird zyU!KoiZPYCUE==;G`u}hE&jb7b+Xmg{d!Pci00000NkvXXu0mjf4pBPb diff --git a/src/icons/Raspbian.svg b/src/icons/Raspbian.svg index 2131cf097..ceed5e799 100644 --- a/src/icons/Raspbian.svg +++ b/src/icons/Raspbian.svg @@ -1,17 +1 @@ - - - - - - - - - - - - - - - - - \ No newline at end of file + \ No newline at end of file diff --git a/src/icons/Revel.png b/src/icons/Revel.png index f8e9b6ef5790e99bd54368208f02eab3cca52dcc..89494132da8c6b7490b4c2c9f8563d68ea0e96f4 100644 GIT binary patch literal 1362 zcmb7^drVVj7>5g}2(AOSF>YZ|w_vB6qKIka5(b5eGEiGEKBxFPfv65o%cM??>lMc zg&-`_(!mmeKp+FoVnX12z;Ns}gKrEO&x4c2jkA$IAQ1cBHXJ4hBFPRen%@lg)X#j( z#NNsTHIhV`j^Z5dS0QBMMB9W-Qy}hHO14Lvp zS$B6gU>F&OhK7JaE|-stj2KB23dQ*NIKWIzO@SluXf&GH*;$~14i^^}mzS5pTCdk{ zZEbCDZv!6eNK#TVBqb#UkH_cc<`xwd0VIV&h3$Z1q43huGN6TqD=RCjs;Z34_4W0@ z+z5Rc@^@oKel8d4=Ya(j___!*X>@^o0T-zB)y^1npwHKJpjB{zVvRb`?Zm{y-62on!TvaschJ$J87R>R@&jSGBtDPG<-ho7 zRzy(puM<5|BlbPv6U->twyBR)bhM_Gk$UjQg7lxy@K0B`E>K*uLJLooOAf8NzQIq& zsLx?Z`>(`EPdgqtVRepi-0YsORLy@WJf98PvjZyEnO>QS`(PS46Qr3_`+qs=zI$QHF-n)=T4AI z>E7c#cfLKLdvf`>`MB-N!Vl37lZR0c?SE27bBIJgb4i~=zE5aJOvT3ix@!NTw_L1q zo|nb?W@%-i4iY=37YSPJ6-&jnK%955RfJcZ1YMB$`!RxrdOc&#KiI|18AU5haPY?u z)Y=G9;xjkYf!`pn<(>D~o0v`L-gJ$7tYzmpb05(ADy_28I!t%Ds}S$*c6(^8@roD7 zlaG)hX}9b?Yrv&$e5DXM^}Qn!cz!=E68H+g;3vki#7y^FHoDl)fAiwhI>J9>Cr^C+ T(CB14ya0#*zaUJRPjuQ}Q`>jP delta 1461 zcmV;m1xotT3gQcp85#xv0047(dh`GQ00v@9M??Ss00000`9r&Zks&I71#d}2K~z}7 z#aGWy6I&Gi&Yc-LP^_iWszW&LVq%O7U25Wr_ZPT(?0q{o{tGT$8eN)5 z2=derqe;;a2|t4TsL+-U4KQWe(wVvUZG@oK@-E}^NJL?biAW^E{&NO6=SZbeP!t86b1W|} z%c`nUAP|5MLJ$!hv;gM1Ej(tT6Viq^hb?u~?*2r%r*0_}bbU2_aaqSj3SdM|R@2wzjacvV!U9Y3RDn zL!l7!`~4sy|XYY-0~K4d}&ap%q*+NRjHZPzdimQJV9*w`q#y1I6#vTYlZBw=@Q0BCAz zqC%m-rlzLQ-rf$6$3w%z!%jFHmT7Wwl53hqmSyqRuU}JtGMR*`s*WT{%DZ>(+#5G; zNK;c&uBK^hTdMD2W@bjjpCu7x>V1Y>K543(<5BhWj#GT0Kfo1Rul!{a2S5S zUos2>!C+8-(liYKU|AMaRYgZf2bD^to$K1y*H<&anKNgQ$z-^uX*Er0eSKZ|x&a0N z-QC@E;=~Cg5($JtAvlf$0B~Iw08p(~1puL{D$3LW16P?`G(atw|a-haU5PMm7r-FmCI#(`0xRPgM;G1g9jp!NYM4`*QJ4hzr?3c zpD;9kG{j8Pbie41NSd9Uwd>`m%Rsfdg^`heM6tMuY&OHMT)6_D&&LXd0?wa5zkM); z*XyNdG%DV|e@~sAo$z|SNT<_0o6VxPx0ls&)qNH4^yyP{c6RPqX@7q|zjo~!6$%AG zMC|6xn{F@|l(vn>wrwmdEC^YaX?1ng?(OY=RrZ`OwHAdCc=6&T-oAZ{cs$N#XJ@%( zS-5xa9y}fob$55OL?VH$tu1M{>nVx?S(Y(3HwW9c_ciKk7C=O3Ytwiv_L~5J3l}ah z$8mTx8fCX`-Qq1RE%5n#ZgX?}0mG)=L%xF{^k+F3h&`ZO+IzAO$U!EPKob_}bltD;mYeUCw8 zG8tjpwwRop+-1wZV|{&tepG@T3=a=G2a#ZDX-RBsZ2YhUyALKa3}fGa2+OjBBuV&T z3ASQzikOzivNxv;Q6Ua$A(6#!s=Uma~v&q}4jE0xMm{THyt#zq04E(?W10psK2 z)Y=-PVzCHSRdMK9@HO7Nd4q5`ELvMzNl_Fq#^Aaxs?{o%mX_UYHp~9_;}R)~vhS|w zpr6xBCWEG?COm&WfL4vT|2oN1cw;NYP6S)gD2J^vS|O!zMlcA81& P00000NkvXXu0mjfz;41W diff --git a/src/icons/RockRMS.svg b/src/icons/RockRMS.svg index 1a782b9bb..6b352f6ca 100644 --- a/src/icons/RockRMS.svg +++ b/src/icons/RockRMS.svg @@ -1,12 +1 @@ - - - - rock-logo - Created with Sketch. - - - - - \ No newline at end of file +rock-logo \ No newline at end of file diff --git a/src/icons/Salesforce.svg b/src/icons/Salesforce.svg index c5635099f..8209a8af9 100644 --- a/src/icons/Salesforce.svg +++ b/src/icons/Salesforce.svg @@ -1,159 +1 @@ - - - - - - - - - - image/svg+xml - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + \ No newline at end of file diff --git a/src/icons/Scholica.svg b/src/icons/Scholica.svg index b35216915..d136a5b2c 100644 --- a/src/icons/Scholica.svg +++ b/src/icons/Scholica.svg @@ -1,24 +1 @@ - - - - logo-green-icon - Created with Sketch. - - - - - - - - - \ No newline at end of file +logo-green-icon \ No newline at end of file diff --git a/src/icons/Shapecss.svg b/src/icons/Shapecss.svg index 8d577bec6..71026cd91 100644 --- a/src/icons/Shapecss.svg +++ b/src/icons/Shapecss.svg @@ -1,27 +1 @@ - - - - - - - - - - - - - - - + \ No newline at end of file diff --git a/src/icons/ShellInABox.png b/src/icons/ShellInABox.png index 036151609ec0516ff81d869e2f3224ac8fc14b07..3bb29f8c61efbbec8fa8f79b492da91433859db8 100644 GIT binary patch delta 217 zcmV;~04D$N0_p*f8Gir(0034IB`5#@0I^9#K~y-)t&cbTyNKyYWlThWjtT!T=k@7=v4uSc4dl`A~xp3{nElt`>NYM@s1pzYESe zi2jxn>-NApi)TK+Pzx;OKio&5RblJ~j5WX{4W+LOnKhKD{8B1^!BuSoA}S-2LqVF> zptUZmf?`0O+HjiNFv~Vb(FVZ<69Xd`3}YJx28O;3eb>eZ9TyxK{|F9k=$POG=VC~F TVWjqE00000NkvXXu0mjfA;nnY delta 352 zcmV-m0iXWr0q_El8Gix*008_L?V|ty0XIoRK~zY`?Uq4mg)k6?Gf7k;63_^OH}V34 zTkoM~5 zz#caY!+j}DQvkS3BKxs%99t41j^j8C17pk>bIltdB4dmYQh(R=9n&<8)*7ESP)b>p z);bKsZQF{X=(^4>Dy5#3>s=x{R#mkui#@$<+e=;ok|ZI77-Md?o5hr6+4nuA)bqSU zI5Eb~QaK_5fZYZFLI_H!5CRdWX*zi4c|OncDF)p~y_7Nt0^j!uA?vz+^_Ehe4K2PG zfzl72=Xp^SZCTs4_ZC6`z^OF+1UT&EoZG}cIGh52l+tZ2y0-E>mgoiePO12bAI|Fr yzm^AoKGB@_MgJfVoJ-`qH+3DR^ujjup}hfEI{rpVoBO-~0000uC|-XZmj11LJr`NswPK0|OHaD;ozFHxDnrfS|C5sJMibw2XqHl8UODrj~ZSj-ipU ziK&&fvx}>nyN|D5KwxlaRCG*iLSkA*R(4KqUVcGgaY<=;MP*fWO=ELwTYFdE#7UE< zOr0@v)|`3s7c5+~c*(Nmt5&aByKeo4jhnaZ+_m?>!9$0S9y@XJ;^nKi@7%q2|G}fj zPo6$|`TFg<_a8of`TFhqkDtGO|MleGn#;gY&$!Oh#WBR<^w!BQ<9iZC+SaR26iPmE zEy-Ks_q4fA$tm~CH%(p}6uD^4RMjbxvGwctFaN2EkNHg80i9mdh@!tZm-K`|E3h!kUon2HK17OEqMsmX=@5zOYiC zljYkgUKP7nfn4kOR#){s%KIBP>Gu=PuY4sl685e#+x%-YU-*;d9xIjItLB_OBy-`f zN3D5%&6!>PtM0YAuI;;e_GF;^4Vx8J%A8NPhs+NVFz)hgu3wdQUghDGUloo#EB;QX zzi}o=A|SVOOGZ%roWHY_Z!OgQ?DKZ^boRd0-xrv(+q7<9AMx3>e%kW}+gEl%@2{?j zI{fC%`^!^ot}jetN^Fht|1_P?R6T2!m~-v9S9-OM3N{y`FL6AhQPaA%(J*! zR(<2%;2iIMZLb&5+n2oEE9HNc`k5GnZxOtJ2Axik&OXob-X>h%7?;pSCpZ9xRpM8JV+H37~@3rr}a|+*XtiwRNffmCs20dL( zGl<*>YDzdB@%5dCK;xlna|FXgc@bnj>8i&tjMij74!3=~i@TTm5f^t4Zao~1+vBji z^ZtYTFwCbX*&J_SKE|dzJ20(b5EgLBz}<|Mn%hj{TmVZHzYq@%vwj#)+H+RZsx?|# z6r7EzVdN1J0q0pwh3U`Ic2f=WT#X327IwC2{-xhF*JtIkuUi)HcBzc!P9+z%QB_jY z$LdO%$^_77X>3~aBB-IZ{^hW!S|BZ-2gXcY=)`kmftL)M^H);Zwz-n(K1SyAgpL}k zG)k%z-x#{Y^j0Hb7g@j=vP!S0KMkk@STHr;2#p(OrOgfwLyIGAIUZ^l_R`D0eNkAfa6^D1Wq{k_)h!bgE_>)wkItTRE?`o-i=~eB zSWS7Lz0pd$Q1blw$nbEteyxVBeUsJ6MSS(%N~?u~pZ%4-&d$8J|B5eAa(AE(#oUYP zN7IJs8{00@oN?%T9jWuRm~QDS*OSe)dJZMlLM%h3Yds@06VFdcrf&|{xVW`$OUIJa zt3ly;a+N_D?A8GlGQTL1%-xRUp9}<;t-UH=&0^SOnS0e!L2B{UlrX~JJ~ZDe6`gY%o?;# z0UHn7ZOuKcAsEtfi%ZB(?5P@;bfu|FNVEr|Xtm`%Mr9ACFZR?aRf6S#G!*KM)a&ed zdcw#Y&RX+EP_ril&+%00Qmj44$Neyj#dNbll#H%~*;xy2OI@x><-@DwLw9MHMkzL8 zlBd6hlHeoB8ASCT2W;f(fGy2nml5{Z#)sY#Cy-`SviUN&v?agGa9PoxU2 zLA>(KdMc^fgW{s~H5#}76sC!GY`(oYmp-R{!>t{;AZ=1Lq6?I&k({I z)DVUjT)$9H? z3*nSDHHI}Nxa+2=xAzW}*K^Z3auoUq^SCnPgd7c&spY@j^8Caxp|bb|uCjB=*;#4w zI4ON8t3tD>OU|lPL-C$-m%WT>Mg=qCru@$iuzcA1YAfdrX~PnUeY;$w2X+8Bcd5F0qE* zkEXcYHEOtY`xyJUmuI3%+Lf+#YX7Cpbbf#Rt|7i5w|ckwYy6b_Jp2YmZ;d7r&5TNJ zY`vjqsA$;G@~Gu%%d-TTBxQ*%$t zd7E@=%bmLmweynmwmd7#E6Z4uQDPizoRjhlUvukY(ZiywVvbuQ-ITrgMQ%kW?ePxm z_~N?!nu+L&=#!-<|5{L{VhDZCn8US`%m2uo!z>Cr6b2GoFHfkRtecJ<6T@4#F}HO~ z4Hd0x-dejq**xiq4xSxfawKRf>|D6P>1NS5711Ql`u@g>VSTR|&)qM5J7$uT3X`hG zGkb4N$WH8^2<^M_Nczgw6dS1{k82unFHA?;Rq3w8h`SEv`kUZP0`Yf8dBq&XqO9_| zZWX6{XV2PyU|0F1a`?)S%8-)WfaHM9-bZqk#f`X4%i8`x#|%?*Hc5V=DXC_UCH+=>>vAgRMeTBRs;aH?&K{$#}Q-;f@Sye$kB897w`Tn8@E0 z(U%cY$re4J)FW3aU8-6y>TL6<(>mE&@1Vg(c~PN!*+U2K4}Kk=3VoIQif+h{JzlJF zx5x3c*6Qit47M!MwZaOqYKCFPe_r~RI%6x_&>pYms>W{?YnN>g>&ER8 z+GISbD`ez*@qJXe%yGUtsdV9yk~0EX7s?G84EvK5QrHrYal1(>D^y4XU5vWmsgccN z6kUXWi+}BWtT}gIaKU2Tp>xGzn_{RQx)xr@U2P*mTcmO0jm1vEE+MJ{{5~t^2QA@E z^07H7+gipS6*l!=kh}ch%F_7S>a{N~7Nv(6Sc!01zpltVAYY*5dAyf)h;{Y0kR6n{ zO83qd3AuHe;pBTd>b(gfrB==|Mu@r8`+UwIxn%&K=HUuLnd@Y#C#-<6g%x9%6Xj zbBAGY$DQ$+Pg=cVaV>(qWkE%_l4}o??v?M$c-Y#asA_TDV%p-1h3rH}|6Tj8xkK#} zoPOn>q~CY;+Lq5Qs64#iYe{Bl)al&0Z(eV{a8@-xJbP>|cHV7wp0S(fcmsI{`2rO$ zV^LSh(@w4qWec;&XWQQCFgE;ge=+%kw+MqQgXLeB>tFGDXdWLPo240?-Nc~KbL_ld z?n|mCe;nh&bBP_$NSsX6PBKrNw{@^BHF>1c{_O35?^m7PKbS5{E7=^^pR#zkzh~_9 zlW6>8+xg^}OZ%Ix*BLu={WsA9Qd>#oUrUXumABkQd0 zStZ_7*z5Mz>#fpa^b?bYvdd+O`6attOD23P?)o{;j&Y{Qwf0X}9RJ9+^sF;QUb(+w z%GZ6iZgysnt>6E!z(Q+t*>i7!iM(=?^1ah)#kLHMuUZNn6pZe-3CDM!j_;l1YGr}<6Ef^LMgkhhTAdX?!QE?1=YlmS9 z@fgPLesOP|Hij{a>uIW6_>f`T%!41umX=`XKd4pz;M&Ve|KkZzpfvcEjep#T)zA?D zOaOlY|E-u|q7zUFz@Nn5tEZ*_TTbBn?&X#<9DND>RSrr{O?)?!UXb_Ca#n~8Oa1a68}4P9Sr6pOn3s{HPPqaS$*B(5@)}Nbs8$lL4ks1Bo;N)JD(W2N{AaA)-lv z0D7&E&>bQ5d<(xk>O(IownBioV=ur91K-X2F#$M_q1Q(T7(opXHQ*1R$w;B!0@evp z1h_?LlLmCh=yfA19gF}#ENWu^Pdh+7Q3_@wfQs=gv6B$3A)*>#2c80^06&lc{HVLo zffh#B`SRmQ)c(~Dkd9j-ZIF0$!65+E4N9aJ*a<`eq(bx2cVI=WlmPlByaLeHv8^zB zHT1gyXq*&b%wdS51djqLLX_N9fD-sgze?aJj6#n9RX)-Ta0&Q;8ov;_@L7_6^jOe# zSCjPZ2Hyqnkn}Cv9}@_HUeb%9Z#b%Ybf*)*O8QE2f)9K*pbDTuB+lCm9woO0_*|3!t&7%j@Jn7I*3#RUjxwuAlAZr@Wh1)Lzatn4jS2nj=c~ofm8r}ieCd9fE?fr zgcElF-PL^{0SEz*Tmar>hhfhkssO~r3Ee*h^va=skaS7TB!fp=kEHo6EFYJzO-ukS zfCJE?M4coWh&m+xKd~h+=n7#VTEm&((K_hE0H_P^B;nAih60Dk;-EMN0~KTcPwf#vP_|2RNlEG^|X7VC7T R@{gef^|XvN^EK>F{~x=K<+cC- diff --git a/src/icons/SumoMe.png b/src/icons/SumoMe.png index b70b8f9356a22cdf36f88b0cb05077ffbab94d29..10f30c3bd73dbf40c773b478a5b69d97f73ee84b 100644 GIT binary patch delta 872 zcmdm0@vMA;BnLAC1B1(wu45Y&%Pr~|s{(vNT-#P3Xf)5#m# zPv6{r=GLBbxAy|k`P&CB-8*#U!Qrb9k6e9t`qtw!x1OB6`RMHJC+BWHy8h_Z%_pyK zKY4Zg$?JRd&)@$1{pa_ezkmP!`~M$^{$IHL_`>ZcOZQ(~ap1zr0~e~796WvF(P5xj zS02pU1$4yOeU~0|tvk`R{=~e!m*yY1HvizYIs2}*Z8%%L^k~Jhqs?oMcW=McwB~r$ z{6j!wUBAYreofc5i|v~)6fQkpxa4^2rVHKMF9T7~q&@L->yHIY-XAyjm}%QC)An6f zt=pB#H`sUYwe8+x)VP(sa0_3_R;lvMN;TV*Yq!Z&Zb#GbzqsFx#uBS+Cz&Vo&xMO(OvwsIG5>!^DpU2Q(%;&lmz(&18EWfGc!9E7azZbq>7%txw%zjWI|d-Mp;>T zU43I?V@q3mdq?N&EnBzl+I8go`3sk?U3>T8!{@KRrH;0KV_;x(@^ov+VbvkauS|dB&R81XKYuuJ zq5UzbW=0G1k10+sc@CPs&^WSd=RAig=MJbXTk0fvzJ&3CVaC+%Uk?3x`|Z|G*vIcu zl>LG8fTz`~h?w_`TsyPZhMnzQAr}!}U*vN6IKwyluH5;ReGinLoV+A)Ig;NgC+XUo zZ1Ma23^_lz*E;>k$YrcFzTlX$C!_AG0nhn5Rff*ZJ%xH@X*C}IN(4?;KhD%?FTAPA zsIcLPw8Zt<>(4r}GfuZU*1N-%Az_m6iUY~ZPd&JAc$II?REBh}2DjH<4<~x>+#<#B zN;f3BN$%>)mfT=ohlRKJrn)r-Wwc=5Z3}91X_pkcCY^VFl#rzPRTE7o znNFITWT2$!fY71{;z82%*@N4e)J3UK*gfR%TxQ8&qu9uXtK`XEpL1X5usk+`7B^2o`+0%119Fh zGu@6r?)%5jI1S*9tzJ81nZx4_^5#*baQ&}D9+HLie*t!PKf*6NTl*O_(;S*<4qN*f z9O0LpyHDX$K(eq7PZN1~6e(Ok?jUatS?16iUA?9O5-XK&PW{BcHCkEhpa_3neGqz> zDOS72`Ah@g<2!Q`>8`=z$99^-&Vi5BPIG9m_|Z+IySwXl0pnZ-GR11w)d!)69TY*M zmBsEK`L~Ic%C{OITdKm9(FM+EC1|EOG+GH>@`R)jfBJkltH8v34iFKB8Od$v-5b6K z(d)-yMsgz}jL&BwlvQBlY5ITsB~M6doPA|q$0?zK@Ip16O*zn=_dPy1rB z4!9Rc!5B$H&#;g*+1Nb;I|evBN^#h+k8rJr{-@`Y>n0nEJ;OqBjHKayAf*FJ>K3fM zdJP^ywzpUU`wsfrYOw^+Bgpo(SFfR@Zs~xR)lE>;Er`gKv&Zagt(`vj@OGNRV|KO{ zkt=5vbrW7zH+8^LSp|PlQ9)8R43|CO+~Iz5;DE#Z1TTBSIZ06sqN2i5S=9kic@3iS z8i=JT*rro1W5d^QP-X06&^DEFi>0cTrvaGfMPQy6L0BroWLWO$qRCesy8Rr=E}GzE zSnd%rC1BD;VA4e$Fcp!snu$tn=iI@d$;PgB4sZujCL6nY&J`&P`l3=>V^;Hjpb2OK fnt=ZW;O_wdo}JLeK)F^700000NkvXXu0mjf*TB+l diff --git a/src/icons/SweetAlert2.png b/src/icons/SweetAlert2.png index 1d7edfcf1bd93266e9dbe3fb076c8a3ff93ffb9c..bba68625d99e81bc9f4bc1509b00a95f2ac92e12 100644 GIT binary patch delta 43 ycmdlYy-|9D4jV^-r;B4q#jUrSP1rKnMfvAkUh$G`;?|!GK;Y@>=d#Wzp$PzFQxFaS delta 46 zcmdley+wM14jV_Yr;B4q#jQ7+P1rKnCHxy08RlGG@lua{+ad-a@O1TaS?83{1OS8+ B5F7vi diff --git a/src/icons/Vinala.png b/src/icons/Vinala.png index 8aa46505e9e9fc5b63a7c91fc4cb40e976c112f9..b453eb1883670371998bc28336cdc9162c0c0dbd 100644 GIT binary patch delta 1597 zcmV-D2EzIA4S)@hR(};qL_t&-8O6bUjMsGm!14Fz;rsOa-6NdxkZ^(t1r8{qIYc+I zbg{*DGh0gk)K-veLN(i*Bw=VGThgpG_#@X8*Fad}k}NG)iZUpta-On@&OkWeg1g_t z_xJsNKM&m>_s8va!0%|Q*Ngu*!4*1w?UwF9sKvQ+3#Hd{OMfm72YutYIVaaW!zJ`x zy>)E?zh7`>T|dJF!%p9}YGrPGIP<{vr?`j@Zg^ly;!2-$UfzL|H+d%(w$YL(uQ5&# z`H<7aVCKSP%5}$A4Kj|t>AzeuS5ANJLv!YhmruWS>ngSvnqf-1>#u2P-Eel<_ZJmT z?9(nh&n~r!2>XHz*8ikUBR2NaPjZq{MBt_9PxvV3ra#UbRMI9^h7Z`^M{ExM^ zcva9Ih7_u?KttB|%q0hFgF)u2n|6H;)>$MWq$__ z7)Cks<-4yB0)Nk-uc5TSiVQE!&$$Rmlfp1t&=UJ;xyX^)P|(0f*5t1gU$ShQe2W3biPtB(%uS#YfWRy?7zG7Y}_ID4t8al98nd5?N zJ(nP9k`DbXC}5cIYEU419O#H-FpP)RL-A zi9$!+rN#%v12jR>1kpGrP);B%gbt+nCnHXN@5WLTv)Pe@GQ=f8CK_9>etO?AnjmRH zM@P9Xq^S}(kOrmP>x^hE@kqH%%xt)fQUcYYcCz2657Q(`6U4@Mb0^$KL=L=R(3lep z8~WjbrAb+=Es6$8TV!OhvVZu&XMcOJLX#xTl5QuF2kp>-sr27FuO%w`XLR6%#Spa$ z>RI|y$FE-B#RN#2bYZCSJ5$NtrtE2p{V&?P+^b)Z%e*TxvZ<_h}`XjS%-gYAa|Aqemdltja;S|9t00000NkvXXu0mjfY;YAY delta 1711 zcmV;g22lBc4eib}(<7 zM+hXrArJzz=4nX47y_{&KzN3b@d%|2t=6rn`VUpBPTC(^J8jjXshc)w*_I6@4Hyjg zfuG>_1AcSdGgd2^w3=+vKGOZe=X>v!eeXHfHs$};@}Y^)wSU8t{H4&FL$Z+R1$FT4 zj~`N}FOd9iExtV6_LrBZ1IWuSsd5@ChA|?==_`N3lbn0utw7j-A44z2c%&TxRN1;gQ)5>D|W|nCKA8Bagkbg&wK^}1(TM=_uK78Y6CE3VwXd1Dcd+NEpL9Z5Z|gu8`su%}MRv*Lw_>HOk&luQY?{gLUwq3fF%DY z3I(BBUcFt<6+)fW40mofHqtH)k?dnRwuiTsFz#I`s+j9oj~utGL=Oj%>>t&MDiKb5 zmT7)1w7f=`xR)U3G%`u{v6?9Tr6qY3Yk%?muq8}F7IW<_lKiJFsrZ$4NwPmfh7NFD~hX8a}I_wK8*ZwSW2s~QB;;h@}BjymVZcn zW}8dvd5UhbJE3Puc2`p_Gf4KIzN+v8)Rn?`{uG>*=b+>B7k{0R@hy_~sB-G=?0BA{ zs>~KRvb(X)YWoFA{!?Dy9xw`c3TIsrwyKMO+A?U$N`6T4p3U5f2tz@wTc6(uO>Psc zToKlew`7v+Kb;_*OLcB ze~dzQ6FPEXZpwyRm8-E+<%z{ps zc9tZs&B{EEyY>{eFL<_!Gq6{bLs?pyO7i~P@25R)zMQlI2@|f)W3Y-?PGw{2A(Fj} zg52Mt=_HIbg+Lu2n)2cgN!mYsck+vN$x#h@l7L<&Ok&3GN%GRwr*s|q4X-akWI=u7tAIDaj!CIEvBm^u^RB#E-oko+DK_U7QMB;lOy24!D*Ghm@|< zchE!0?*ARup(C%jM#Jyp4bPPrkA`a?3b-Bz*I=B@)E&G3=ly>|Aqo6}b1eL)7>@vM zM8Q20eQ#S5;q#y2e<;E*9Fk-m2|GTYO!4_X_-YKyoL`450 zIUC|eZW_ho?GQJRf0EsEEp)9l@jk>=JH(A-G6S{tiRa;#WHm@!#{`d0+3=6}Rxa*9 z+$K67!@x;qpv{ut{a06i;SUo9xG((_w?m6?WkNB|P5q))`1H~yxCdAM@+Sd{Xm46G za9?C;@-gvo9)TF?=3_w2333->gu5?Bc=$o==6Tn{#r39#vrC(&Um!evhg-#KRG2jr zx0wO$qXyVhGhq_w6_^Q@2@3`eG6R#W8SwS;#{9@Rh?L3T>@>)KG+=<(7jtLJF>`u2 zq#>_BK1*gsq--`u4iD_kK!kB6RG1qOV~C>@&Yn2~7BLH>`Cvl^I^ke-H9wc0mWDN} zSHoJwMk{O?s1ZHV1-~-Q0cjyOz-}HD6vPMn{mvaY4;qZQ@<{&um`;a5103<@q{+~v zs*#|K=jU&1F!+FU%zfjZBBMJ z+?`$ije(0c#f4qY%hkPIILM4?)44!%b2FSA`kT%4ZVYsP23Ov?M#4|o6c+|xMlmXA$Ev`4<($-rB*u#h(C)9;Ee0{w9J1rStOVFZ$zWw;` zXHK6sH$dIeZt>`hJ!2Hh4uK4G8H7zb$9@i$o=%@;S2zBL+QDxRp)rpBjKB38W<%0&mwGSG|fg7IeJDGB8YRZ;~K zleLIT-HEu&1OKG~##<(FjdI(I>bUJlN!)=XGLb-8NXV!%8DKSKE!PsRLx%R`Z7Amk zGGfYBk_n{7mm`@>BqmoNNwXhfGQiq!M@I)*T3XD1Xr-QSeA)Eibv#~_r6@h05nG0| zI5Lq?4ps_P+CFZ8&HS8Y*;tab$c&|n7h`N_SWgYqixx$fKFo~SiuBlRP{->_k)qxU zv8Vt4u_5`38F)Z|WkF-ef;wdnhWUl?EU>v?JaW7POnCbY<9LaU2)AN^_H4;6GXp;` z16c}xmIYP{$^w~4B@?U^3F%dc%c|zRL6Ln33*SAAsO3j7?~{7S3L6ly?kuJiHDb!= zO_;FxXN)arL13Z=djY(gffv|znKson)e`fe=D+J~qm zRalTy1NlcsF)L4ph*kBNR(KLqK5M|l;zWhS1Fy6D3S{flTeA=}#1h1tqcp@4Uj=pob$}1_ z1HX9u*e{g6)vBf)G)%C!pw{JPb$`dVx$QJ0d*-=?#p1G9K3%l37mQ^|buEAi%Nlg)OxJ4YJZjskawHDkjF zlt%c*z4vnR)F}@B;^)-fu$C=NO*C!Y%0J?9o_*#hb#--|{m)sF$w_|s_#xgIe;($M zhaVvliE!r3nPQ%wiZ@4_vR5~3#o5oVjBGxj6OB)3eNC;dxqh|QL|5sfZTnSKwf(Wj zbaZr7RaG~w-=J%*Up@VNY+046s=hHWpx1qT#TB+s)!wK#z4)Fs#1h&NOPtB;8)1Fq z+G|x;>oEx;6)Ee-b46o};lTd=e+&%`v2)ihDl04b$=@iI8>q|VfB)9t zAOPpjox}S6|Kzqh=T_fdRRaY1S{f)>}(H=1y_qPw%fBKP%<%Mji zRH{h3lj3$Q-X`ZnU|Z`;TP_Xt9iRRE=;$abmRDn~rL?qk&Ou9-EMdj+YK$?Im6cuT zWyP}U&-T3enZMUb_q-9h=jKFTL?|yWFG!wqvb?-}4tXw{!MTg48e)mf zMFs5K^@rWY>2u;7;uMq*e;1)cT@A6s=jI6be#^1#M)jak#VCk#e1zy|h$W`mzS*Ip)aB%;lf27mtxhXZmK!5-L zn~r@}lr^G?ae_)V{2CUai15sjBOhfwY_vdNoO=YLAz83JQ)UjF0ZJVPc@LaHo6U_H{- zlJ-3^zDLGdGM*RifAvf#sQ6IYZh_we8zg%LQAHJk%oOSjY6J}o&XZ|!=UXy9=u`k1 z53C2yB7uik53B`azzg>m!PD{P=spWP3_Jv2oT8$L6O1UTxwJTpGpIPk2+lJ|;4q#E z>&7XbQ`Cj)#5qI=_u`?D0=lyUa5wO$cysi8Lo5;Yrw6w^e}5bBQZBE7F*qXxCiiX# zjNq&x9VsEOmcSZZi6!tn0_%|}v1B|?GrrfIvbHC%rZ+IACu8V2`L&wl?Ej8eHpo!K z7l1zlS@Id;AnSG7w*=NBu%0^K_6EM~4Xo)6tnCd%dXMd{pB|HLJ^ThQfAfHR02C?y2>${2VRcit0rZm8 z``qttJ4NKlJ?D5@6}j~54M39IbM3BmSS8T3>#RIIql)3TGTZ=2({);@mJT<|JCeS8?#dUX6SR2pWs;{^DR^EMPJ~d;bs(th%)y5o-HFHEGau_>S zH=K}-_hy*)XcL3Yhd0x?#pGUObvU`XS@(T+=DBs#x@=XFH-qVEf%B~M^|)Dmr_S4# znNa_E5(BqZ`8m1z3F2~g@~LyP?@E_lnrg@A7x}=DK{e%)djiK5Q--?epW;pHIXs>{ zI{tyb;ntE>X>1qls(c^Un}623@y+Ghr@Y7;G5YBZ7c^76l{}7~YFy>FRcWic*t6S7 xY7IN|eua4Ne3zwu`1VuXbg|{L#nV3UK2|Ptza=qmA1DEOy85}WtaD0e0swQ@c+vm> diff --git a/src/icons/apostrophecms.svg b/src/icons/apostrophecms.svg index d71a5b5db..ca5fc0d41 100644 --- a/src/icons/apostrophecms.svg +++ b/src/icons/apostrophecms.svg @@ -1,12 +1 @@ - - - - 256 - Created with Sketch. - - - - - - - \ No newline at end of file +256 \ No newline at end of file diff --git a/src/icons/aws-ec2.svg b/src/icons/aws-ec2.svg index f6da9f51d..bb4f86907 100755 --- a/src/icons/aws-ec2.svg +++ b/src/icons/aws-ec2.svg @@ -1,13 +1 @@ - - - - - - - - - - - - - \ No newline at end of file + \ No newline at end of file diff --git a/src/icons/aws-s3.svg b/src/icons/aws-s3.svg index 70a784357..3c8c386a2 100755 --- a/src/icons/aws-s3.svg +++ b/src/icons/aws-s3.svg @@ -1,17 +1 @@ - - - - - - - - - - - - - - - - - \ No newline at end of file + \ No newline at end of file diff --git a/src/icons/cloudcart.svg b/src/icons/cloudcart.svg index 5d5c41cf9..e7029a935 100644 --- a/src/icons/cloudcart.svg +++ b/src/icons/cloudcart.svg @@ -1,24 +1 @@ - - - - - - - - - - - - - - + \ No newline at end of file diff --git a/src/icons/default.svg b/src/icons/default.svg index af0f6be0c..fbbd408a7 100644 --- a/src/icons/default.svg +++ b/src/icons/default.svg @@ -1,19 +1 @@ - - - - Favicon - Created with Sketch. - - - - - - - - - - - - - - \ No newline at end of file +Favicon \ No newline at end of file diff --git a/src/icons/eCommercePy.png b/src/icons/eCommercePy.png index 16fb0d0b9c711bded9e29975577a2f645dbcee59..ae9d304fb38b2bf0495e94d2d1ffe653bc251ea5 100644 GIT binary patch delta 365 zcmV-z0h0dF1qX_}W z@ja|5jdPBM?KF$ZA-3^S+{?Ad6KwIwR1qRg-9wmg(pJOT*MKZr(7I(dHNfZ`ln@xw zm%2iil{U?ci+2o24iGqI;0Ok(+XWbn9W+Qf2o$FD)rD8#t_Od#*m0@2SSe|z4iy&; zY1wU>XFZZT0wH@O4d&H1GKa7el6nzv?ZeX&##9OjyDF3HVzzn9HqyUT=a=Zs7I$N8WD-^K6^8yF__3n+%kvW7UF zc$pqq>B>QDh_DLQg?#wbXMJVU#O2@+{0>AsfH-WgxTrMW?jb_O^#5_nTYx!&7 z^-?gYOwMjb0)O@iWgSX5n{%ca00000 LNkvXXu0mjf6i%u@ delta 369 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 BAt(R< delta 849 zcmV-X1Frn}paaXI1CSXQ1^@s6b9#F800004b3#c}2nYxWdVXG9*7i33UKcq4OQB0! zQ;S#n<(2dojV<23v(M-H#7o&P0`|GRO}+_xb51Hp{;hS!tNj}IUTR@7)~ zfUH<1W0NKp7MFFG*v-o5WcIVSA6z4mbNWRn2@WKo8<;?iI;QhPf0TK7-B5UKzWi!t z$bGN0sxER)TZC$~wW!frkL&OdX#&~Hz_)j~m8j7+rqFqm_5hYb7xGWbX-t6A(E3K2 zK0xPSt~b>HbFxVv;OBH^DAfS-f8ziE413L~b1s`$--!P5YXEvjvQq}oH*SqNt^w%z zks5&YjWoula}Edaf6GR`4&)^rpvzqlGyPEj0L`CoGA|pG=6q~An|_`2YXB;4&*lTH zh7B~d+E@)o@7bejUN-TmzeqFou-sR>bDT#2NJ8!XyVI?^gPvIvk6x9YXjk-)U#I0u zX;kV>>6=!-wR5y%KoT54+rb6=vXQ56N~pXuL$%#UL9YIBe;cVkeluO}0wx0DVWw?J zLeKy-#k1-h%%gKKj~p>fd0~Kp++{50u*PO?@gmOed5lhF6AZ<#AB(7Yw#mTG$(Lc= z!Xk!s3(zkc`PgHPACrzUjGI)I%urqKBS#Bh6_g>m0ehsQVXv8CugLEi6Q0@V&u5~t zh+!UAcql9Mf0JR{ie=&ylp%@$CpsO^YS^#`H0&`a1XNZSpxQpct$aD2SrD+RJ)tBN z0UadRh`79>3gr>^c1oNy$C3|lU{l=tO{pYgqBfuP9I^lN%$l%>YkFypR1jzenz1QM zpw|^kLJi>9xsss{paYxo{@_F+ZFv!Dk!G=9tacr1D`&(#2sp7R?s&@|@6RZSI`f~? bGY9w&v+g4fe#Df_00000NkvXXu0mjfvsI9< diff --git a/src/icons/etherpad.png b/src/icons/etherpad.png index 8cf4ddebf024ffd073e1f39d2e8ea02ae651493d..58211c95f363c8ecf0169ba0ac8faeae48cb716e 100644 GIT binary patch delta 453 zcmV;$0XqKi2h;ugK~y-)ebY@SL{St6@FyV_^06QvAtgd7 zL!ubsHO62=ge)v4B?~rol7;e-k7P9|NtCjbtyxH+?-m~AO`@+!2#byH$wn5P=Dk;m45+z=WW}|njbq10cszT zugfJRfNvmpt9U4^0mM{vD`5oyoz0P%p+S1A@?-%30KUYSggIg8`ahVB$uI1n9FQbh zM-+D*N&Eo74469O*hoBv6ab*VswJnh#v>qaQpdQjKdkZ9P79#HWm|6Y78O&M?*o{z z$a;FslQ1sK`+snsv$U&aZN>uV(>s_9bAR4DELKi$JgZ)DZI@iwOaOoRvU8uP@~t*q zGlGxc@A0a_<)_NW!L$Wg34x`(K;@9#lYesKgscS00z&Ii>_MFchEe@xp!2jLA}S>< zymWi?PDsE@a#7qo9Nf&b<*iGAHj%XYET~evZ)KFoGCrI)cl$||pu1r=C>fOCfm-+A vWUp%%fNYXN<9>U5lUL|M{x<=Fm;4uB7^jYRp&B^+00000NkvXXu0mjfQIyXK delta 998 zcmVt_(MY05 zC?Y`&L&!|6gieKr4t2BcMg0p=&>?S$P#p}4Ac8UyiH$;%4uytN2nJ?~X{G7z%=``u zB3Zi0?;RF*WcSVIect=*Ktc%M0YV6b5MvA>`VOLdf&;Gk*ZU>2#J>_<-VRA&l|f-kv}pI6gkE6tEr_l?#Y5rYOqm^&*7)en0pV zs!PQEW?7aHB9qA)8yf)t>2$iXNq?58JO>m-1%ts{F2}O0SS;S%-TjvTZ=v~vL?xV` zpXc-W_V)I+wlgwZg+2Q@72{6_b*ppsnBl%)UJSYi_7J5 zI2VyaHO6>-eH}t*x7&-w;>*j6$z=L}hMmXb5sSsc!^5qutz%2#X=t`R~$K0XWvgMUmWV;H7(1;t{KVVK|OqtU2DB2g-p z2%*wqp-|}W?B7_jeczb*M=H@1o$qWq*t*or*^?Ik%+0)Y#3WZ{^n8jkL zX{2frVT?5zO(v5;2r&#ZJ39*i(ChVuLV+9LDwV2a2ux2;i$o%;)k@PeLWpHqKBuD^XVcOKx$D!@6Zs?l17v#6 UVo7^g$N&HU07*qoM6N<$f)Xp^MgRZ+ diff --git a/src/icons/gerrit.svg b/src/icons/gerrit.svg index 160dd52e3..1b8d4e217 100644 --- a/src/icons/gerrit.svg +++ b/src/icons/gerrit.svg @@ -1,8 +1 @@ - - - - - - - - + \ No newline at end of file diff --git a/src/icons/gogs.png b/src/icons/gogs.png index e64bfcc2e4abd2fc0360a1989a0b5f37f0f521f2..dcc329ca7e990bdc0e5a90923afdd8520424ec8a 100644 GIT binary patch delta 1300 zcmV+v1?&3GAfz9#e+rY43MYR624YJ`L;(K){{a7>y{D4^00h=aL_t(o!>yMIP*ims z$3e&g#z-KRZbFO@(2%#6BCwedFCkoW0Xi^ziNWd%FeR7u$CoKwbpg?n@QW%9 z9PSHnedc`klWx;QKuF<3L0-&EuTvTvwG*PGHz6!Yhp09WqO^EmUoa*weh9(OpFkWF zq@Dnu>!T%%@O_?k99(}iILsH~6S0{7_ZoyFb(q`44{w6soQtu>EC{Y7OREtXAcg1u zj?xPBhInHj#E0;fPp~KYzC4Tv^%qFs7hq;$Hk`R?RVBH!{VMqPFX3k9@xc=ttZGl% z+thwwXH$>pz>UiCx3yD13&-PWg51#(<&VMoLX7wQgZ{f$G0}gVGf$whvJ(7(Mv1^o zcM+OuF2vH9YY06;UzPc{RgpmJK`ur*Yi7f4l$2q#wGyJCTXQb}rXQ3^F3n@qz2%=4 zpfhg`^1!{Hj$wLyXg12t%?({mf1vQY_mG|xheth?6kd$!fs%PlP1WpCc(+CPDHrID zkAY~o3?1dElG1%8r|!qSsvL;;ohXgvs zidj%b%h7-P8;L|)>1niR&9x~jj%9vwsz#~mlV zHuv>jOGbBol3YeB&SB=yEC~O~M#ZOx(9NM^gXMoi}=iu@N7={i9BReQOtUpNmOwi`a1GalwET*g;1x#2tu6KA;(2_0>1oyi{Dy29& zIx^@GYX~D^y`!|b+1lEMt#OHjrkRFp z_9Y{>S%Hz6SrKtv(zDI-*O{_&4Opf>tTi$D!qD8}eJ3ZUXgZF=oCM)Om=gxXN_hec ztHD_6%B1vV2O1NmvVklKE5cgVGvCb!maKvXvg20D#?h9S_dkyGVQ1HPd<_5q000O{ KMNUMnLSTZHHhIJV delta 1469 zcmV;u1w#6yAI>1Ke+mx3MzjEfJsC_R9M5cmsxC7*BQru z=iIsDS!`pQ0fz*$$WUXOAjg0~B&JQAJd`Mf)@l+ZrBX{a3d}D25;j<0ng^#Z44LzpXL1)KtSvK0l3Xg486Ah4uf%;}6FOXuRqEkf(~Jxs#U1Fym=su=;I1#h@+={uvjQmEdyxJoemY>`nJ|NL z^LRaG?Q$X*tfHF9C8ZRH_kY0J>M)6kaoR@42KPlfJC&s|g1xiuC;M}`VD&`GkdidY zMWBB;z^p&MLg9T&iCyl*iH~7V5jk||5D!$BL*jb^!9wONUA%Q?$N7JI*`wZS?~3Kh zf>b5}wID*-+dGKV|AKINH7EOnB&~Zf!{1HHtY6!~gXR4riM_TSTU>Lihx4TQ_9Z)V@sb{ZaflxH^7Q!yvR#(Qe;?>lyDy%I4v zZerTK;IeLMU6{2OXd?`*uBLn1WGE1Up+_n|Mu|bEf2G_;c==TSjT^X z*I(h$q?^vV!D%jq1=aUe=resiCZh|KrTOIJ1NcG#LPdp$q`27j5nZi+9$nmOv9-Zy*A2~h9x|*aUGII#`amvnp;j`S=n_ETC@LyFR1$L7_NUx?;ZtJ zm7gE!m{H%XD=Vh+v#%JrI+}LfaZ?OlxPX&%aU7SF<6w-*b?n-yF`xpL#?~q=3-H?| z^ZEE6pIi#Wlh`BUX*qVb3pF?lgTn;k34BW9Qz|`c_25(&)ck4LqW9ifUinbg0MZ%~ zPUZnkqJZD&@r z^bUN>?Zc*}R3v2SZQne$_IHcIfs$P5lrN1qF3-2M*L~D`>C~jo+tOp)*1GlWj`Qw= zWhIrB#i7z43&e=y^5Tj1`VV_AoxJ7J(<0i40gmnJzBo{z)%?b}rSpG(D2Nf)<>gZy ztNzn{v29vW%Chgf)`6k+wxN;PPtGr2rq!MOH5heMymqo<%|Flgf0dyg#*6`@-gp)Vl7NXuqqp<|<@JVur@R;_ z0cQFA{=y}T7a!c*(KldFA+1$Vp$bsgUNJKWNh6XlB5@-oX50S0drM1t#F&V8uJYQH z@i=*VGm>aDng9~DwY5Xu!P>Km5Ae;4L~QTfnzBCi;FQNM;EExL3ph8{qS2__W^w)x XR{t^XoYt{r00000NkvXXu0mjfu3zSu diff --git a/src/icons/gravityforms.svg b/src/icons/gravityforms.svg index b2c4ee7c6..43130e50a 100644 --- a/src/icons/gravityforms.svg +++ b/src/icons/gravityforms.svg @@ -1 +1 @@ -gravityforms +gravityforms \ No newline at end of file diff --git a/src/icons/iPresta.png b/src/icons/iPresta.png index f493a4650f9814b00771571b0f81917865a1dcc2..7ab9809ed3d54eff6c0005c3724d11aa59256979 100644 GIT binary patch delta 1845 zcmV-52g>-wtpV+<0kBX{e+WrLK~z}7#g}Ajf)v;&KYD z6>;Qt4k*@YD@;*f>qbm$jJ6uvMw_OriejOzm0K(nWR)PSf(3NlSc-tOwnfFRY^!q4 zz;}P|%g*2kDC|Ez$tQ0z^FF`t=Q%UO0I=r?d+q}B=gY?7M!1OOf6T&8&X~D^`7VVG)DaaD3=~VyS0q7y@meC1h|thZY$FW+Zvig~H?@}AF7T9neeDk-f0w&-l$<5>T!#Lmpb+clWwqguj+)bge=sn_%fir#>s@4(t%ajG&-DS*4 zD0j7>j6Z#$Mjeerb+U671Q z6h*v0B>@k2*-QfqdH3#(QsB}G4CZ=c=-N?Crwz7_;O_ct{N%X`k1{1tH-}@el0*t3 z)<08Vj!>2_633%E=QW_z2dd7h2}3$NZ=<2%I+~ikM|b!A3E$~Ts>F9}9sV7kfWh+; zs4j-1zc9jye`aH10h<2hW;O~aV`%Ej7XlrnbUn?l)1Rdr1-@(1&@wLL){cs+h0PVg+$R9qvzgD_IG2ec;qB61==%o3jO~3 zBSb}QryFA_UV146PEL^!iDGyh9V1|5 zF?=N~Slt-Lc)nfD!wCq5^W?C1h(_ZlA=LGku{9l3(Wp}>+?yY*hlc|6z7C$A3SNq_ zMdKvCtNRw!`Vw@_NXHHRG~C}7f4(O}&hEYS2K)7$Q8AiI%VIF{U~Kvi9XbttfBipADO>}$FJ{eJjqBGtwRQekRfhv6 zfw*a@#7}}PTsVFZq}*>8q*yfCDtUpQ1%lNG4oVss9#)TNI&R&15GK@dIs$I4Qka}&=SKC^U;uwgcS#kK;CY2jKI*EtYso3kZaStcZ#mzuakP>ROTHEpMxA$S@ z%;0GWxbgx)IB}v8xgsl2te*Jzb!sf8__f z_+khwEmuw|!7UMY2XL2Afd6KwR4Q%%OaHn8efrt?nf)5%iloRCMwVrYq%3c4A}g7@ ziPg|&kYE>G4EV+%z9W@h^09qbDaD9`LKgNRx zy*hn9&HS9i7*YlPI4w@ZVPVY2M}#qqgG3l7@|h@NVu7ZnCiL|5j1#G;xq^cS^RRvU zU$JxN5oBeR^2_vOD=#bO!>tX>QRte8=jFOSl6PZs`| z0A0mF$s{n$7b`3%)E46K_VGbR#txi3`4yU*o6*tHfwmiMsH&>M{{0^zBqVg~eLV)p zKiDAGMfTn)7X>>cjDDuTf9)p)3jQ|(28Kq^dqH1EhOrqiGB%+NXsrAB3_X~bn}Zp$ z28CmgZ-qw^ZMLU}YXmTvfWCntOiaySVrEX5@j{G_l_r#vl_1F$^4D%*fYX40!K-pj06fvpn%WM%P*vWLVW|HA}Xw*m^l3yD`$u@B8!M897uq1 j0+85U}nOU;FGOYt4gveC0;bX{4wGc+|V zQxX1G2TFU$lw7Rr`G}M}FzlfTUJ%{UfY3~uf{hn;2M%=IA3S9M6VAgLP{K!2F>hZ2pYdp32FpnB0uUcq|!8+S}-ZobZi z3oW#@bz_>6e}sg%(ZwbU{7)=k;GdIe+u48_^y4fFW2AUbs6M$LxQVz+3WQ*JN1uG= zJEdXLCwD;pPcXAr-!^dn{tC*=D`{@NN-!8k2uV^>JoD$zV)N#wC@Cq5jm_Azh923@ zmETm5_Kz$k?YM@oF!)aNid~8aw}LRz(+km>-*pejf1K|wZD#)Z)sVX-HlVk6fK8ir z^6IPa(ACw0&u8N}HkM@&3Pm`1@*L&ml?VZ)rK2Dc*3F~&@CoetJ_e5kFf$`r@rwsP zkx5>&k?dh4DU4)=k)B?d8}Y>JHX*+Em?C5S&w(TWA`zD-pZp;oeDDdgXXlWTl7wj* z7{<_Rf7=#mX_K&Ri}&8E!m{ib2n)eLK`O0(s3Z_cyt_i-U@PLMFO4nS($dD>y?oRv?NDM3KNO?S?TD16Y$E zj!mwpsG+sBi=?CkCc>DWr^w7qFi0whRyUqR{(sgOVh ze_j~vOVc_b5c72Y{ADc5yf0?6Oq1T;0U8=E#cXbhkE=-@?Q#&u8|ozjQU(0E!|;$p zJEhUW&`OW8b9Z+Swr$=wy=tuqg~Fp{mYhJuXK>9JAR;w#m@cO%V^zKBzB2qRKx-*b zu?mfgbMAWR#&td%pJ9x4&7QtqLj8mEf7mYFMhIIOC?Kj8t0T^{V+xY#(*lG-(ff>E z;qzH!WK53PuC-q0#?2dG8?>4s;*=y#3C{bx1N}B-WA1Tj*#aEL!gbx-A{tX#NkM04 zKUrA;mMxnbvp1b@B;*ZZ8x}W>FukSC$yff76)I z4z#s(@Z59jh>LS#wxjP?kSY_gG3YTu`qRXL;(pWFm+VQT*5hl!*IwI<&u4S>YR8x$ zgb)~pq@kgiveHFt+qNfGG0oAezOa28=}5AZ(+O)A3-e_| zM`)GZw98&PWbeII@!GY^IDUK&D_1V2wY7`J#w%R9bd`%2zoe<@3c+B6ty`br!w>h| zcKCkv<{O;-=mgIOR^WOr3U+JsNr5C@`#?vzYIJkgLwM@cDROdhNJ&Wnf1s#n7KaY) zrn>qJb#+a&wRK}z2GgcZVfpfT6co(3ZT{gyhuOYmE9sV>Jp7a35SA1!5Sux;~<34TI;_lrG5*d+(i>oQ6vIy z0vD5gKmZ7h@QK!1jNTR)Q6s`MO?gY5j|iIUTI-L2YM=!`>4}q=c+l7L{|o>s4D=-h TnmRZD0000infusionsoft \ No newline at end of file +infusionsoft \ No newline at end of file diff --git a/src/icons/kibana.svg b/src/icons/kibana.svg index 419dcbd87..595a80598 100644 --- a/src/icons/kibana.svg +++ b/src/icons/kibana.svg @@ -1,19 +1 @@ - - - - - - - - - - - - + \ No newline at end of file diff --git a/src/icons/mailchimp.svg b/src/icons/mailchimp.svg index 2456a7208..5831b880a 100644 --- a/src/icons/mailchimp.svg +++ b/src/icons/mailchimp.svg @@ -1 +1 @@ -mailchimp +mailchimp \ No newline at end of file diff --git a/src/icons/mattermost.png b/src/icons/mattermost.png index 7375f3e6192a48e42fc41a320651f2b2ca43d279..cca83f7a0924118cb2146031538abbc5a20d4bd3 100644 GIT binary patch literal 1195 zcmah{eNfY793PAtkZ70*_&ykeF$Np2V-R~`V;gKRgjz`0vVk(tNVuRFgqU~nV&Zg) zZUrhv@?zew>&yeAK}{+nE`mrXEe;qKgj^gb&}aSb`nT`h^Laks&-dl|KF>YXsuZb* z`xbW+iR2-diFae)8WQN%ZYT}>_nf_--o(@x zt@9+3)2d35Awh^tCcC(}P$(2%U*FKsP!5L^78VvB9v%@95fv2`9UUDL6T{>2Vq;_Z ze7;a96p2I$2?=7cI59C%DwQTBB`FjNl}e>nt1~k*v$C?v%gb9@S}YdJ(9qE6=;+$o zT17=gV`F1iS65$OA6zskDJiM1uQwPBadC0&?d<}AfWcsdgoKz(rog~JaP)zw*Xy-f zEd~n;3PKc9ak*TSV}P`@w19vBl*?o?Hk++fDp@QRF)$FLMn*=0AfF(}gouH0J6z4r z&o4MQn8{?KGZ2TOKMXGbL_-iXBsenRLWB`H|G7|zC=iAy5QUhHAVBm75(k0fc0ht4 z&EMZ2hymzyIyejj3J_IjNGRy}Z_ojF5E_jJf?E&>0tH8a5ak3R5cx=h4wp)$!Ucgc zB9}Ph2Ygt(J0%_a|Cp1*oMHGd_%5!luI}sBZ+v#Mm(SMiR9}C300S?H%ZK2lqImI= z^o$qxWM%EuXmfIN^K?30etyBhL$4JU9xf^=tE@Wu?s0>`c-~}cx^VH*<+hG%*RNZ9 zZ})%m-N4NEBrfBZqlaJOwdeB(K4zs+^{1J9gUBa7Mg%VO!-)k(X# z?6lXw!-1~eSH`ZU7aduBEZuR%dT=l%Q4#1TtV%ijQ6A@JdTiH*M?0-?yxWXC_H%ox zJB6v5vWMD>`yyof>72?PwfvEyk%HkVrTF+XeMvBXVZk#uzLTu=kbh!JcDB|YN?z_^ zzfk^GINhvcu}%%Tw9>MhE7PuNzOM19d-9H{ z)$O!={>=Tl6FuHdljctc6Ge^wV~xCe0sl_YEnDlUqF1*(QOsp9lm`yjkC|JN>GzrD zG1_$Y^e)Ta4clhNr#srBhsJeAEv4G_n}ye~s%!T0ywRstc>c&e_V$Ej@v`XS#qT9` vKb(xp(evYL^`F&Pm$yq#{Lx;?9qZqjv9JIG*$lq`8 delta 1298 zcmV+t1?~E)3Bd}G85#xv0047(dh`GQ00v@9M??Vs0RI60puMM)ks&I71kOoBK~z}7 z?N(h#99Ibg zJkQhe^75Y)MLFBt+)Q*`2LMDOk#n*vC+xKy9UZ~{9DHPCgpnkFX@KW>DhL78vy_u z$DyvSt|Sx+{l)V78cIts-^Mq@$Uh^vMg5DbuBA_<>lpwLu6(;oi<&< z1Ix07o0ijmp%VbOdGjV1hM|NI0Kn4Hl9H7G%d)#1&)&kq!aP?H#+7E&nJplK}wue7;w+5^!Z3Twh;*#r=MAa`G#`-~TnkFosQv5c12^)YN%5wymv= z-;C^*1TvY-pUys~l)euDCr_RP0JOKa0|4&cz56bI$8n`)Wo1nzB_*QI=W7Ijo}Qi! z{t}7A1)IRy+SN=r+BfAr{o(MwB9OWNw{Y73?G^-L!7vXfMPe*T5& z>FLjNK8mZVsxUDz0a=!>t*oq^$=7p7@K)3me8%ga|R%i5L8`OmWKgZ%t$ z{7>WY_|>e~?IumrM0IsFVzJmYLdd>gF!%u>#Mp+g6$}P15kmIGt<807*qo IM6N<$f}r?#ZvX%Q diff --git a/src/icons/meliscmsv2.png b/src/icons/meliscmsv2.png index 39ec358a6a4db8bf2b9c0474bd2b7bdb12478baa..c545b2882c111dc67729a114e3d8e7e8377e7b13 100644 GIT binary patch delta 1731 zcmV;!20ZzjB*r3;83+OZ008_L?W3_FQVNrW3MZ3t3KD+?gh@m}R7l6IR$Yi)R~7!g zwe~*e-aB`aOp-QfP@kXL4bgy&1AF(^@i>6~Y=t9tx>({$k8`Xo;ZKzw0rLL zXLHk8Umq@?IKA@L`AIrE=|&QX%qjJPg@DLuFu;Tu`0m-Rx7kK-zHUtI&i;SQ{NeKY z+5aBgz3bq0b_EsnYm%g zOiiRTwVXGJnf`1icluV}K68JnYwf{Lf99OEiAnDm%nE7oV)w>?TY|3Z56t@ z)LQ_w4w{B-hpDmDVQ!;I=C<1QXBeBVl$*29Ji{68zwyYG-mY8cZ~Vu@KV2OJ*Vkry zJ$3tSx2H`@jCcchT_l zOAD#NXt>d~ZAGZbR*NL*JsW^|Zml=d>-M{y*UVZj{ z;*L~|V?;FsP$AYyFT<+Ci$W_9C4vsdh@)0yID`>oTyHDKzy{DDi{tl4AxSF0+#n<+ATYjGjFBc`d1rHV`(#WHCbn270!l#WTHdZj zFiG8a{MuCkny7#EuC~)!AP^rE$;>5i>y^01nr+^stM9LkY4a)^yV=~KTR6i17apdB zCdKRx^LFd;dsmvI&Bq$`uS}N(t-N)_vL-XHw{CDt99)bl{;bm&6emKh&sldj_ zqdJg(?)wiOzWsJa#PZ6@$(LU|_4MB^pM9;wc$=0VP8lab5|Ue<+cSULZSzNu-E`B< Z{{vneiaM#sP$d8W002ovPDHLkV1l#sM|J=J delta 1957 zcmV;W2U_^XBAXa zebI-$2=>VbmHJSNB9xjuXiIHtDR=>EnUFMfa%-E|PA)TNX3p7j*7`ml_MS^8iC7DM zunxmM>+Ju3{nvN-kC?lYYW{!xlOJ>PsV5non?)xz;=<-|ftu#I0~yBwcSz=#H_siI zc);7=)#e~hkb>^+kMOZC9p#IUeUD;#8nNX5%ZDFg=?}*Vr6LYNt_NR@WQK{81>6NU zAt7XQT!iF;c>|ps93i=3IN2T7ij}%19{4!lfB9wN*;kG;e)c$VIwF4ts&Z2T4g^(1 z91*ZAxHd#Y!D#=+$$&a!7X$%!1jAj?2=Vj@{`8BV5-+^)BD%GM21iv;KvxNPBQYWf z;O@9PB8{YiVlD&(vF6ml1!MzZmqsZZP^y#}_WOiny#D-)#I(GGS5>oJnwM*Pc_JDB?=MT0lo#5d;w@gg{h{xC*L@B8aTsUUPr7AA6$oU57$f3NP$i;5EMki(Es6CUz!MAQ7LKt( z3W@9$+mrE`ZXkb*#|VwoGu!q*>vg3#&Gq2R6KzhnNH zrwN6kCU~1mF(}tAUtu_Rm0Nf2AtC`SD%^4l4l3)d$6bGk9bw1qy9s?|;L3_^rN3`K z!#8Ir>9DMc!S4O+zGWAAGQohsRF}D~6NyX;p+c$an)$acva~oP21VUbi2*AE5=$f& zNKv9i(XJ9HOKOKLTes2ebQztSr5^*gJamMl0Tbg==yK%C4`Wy6$n#g}bOsEjr;(yV z=yr*Pa_xW09G7O#u)MU0IM`&hf>iJrAVxey2ocxyWg(J6VC(b_s;L39ue^$G>$ByP z_tWc5;Zqgw)R{XE9OUg&C%JU)3?UTs22&JehvnrF^C!=+@XjR^Uz;^Sn~IAf1u^z8 zNlniaS{CchK~QdUq_P?mUAkwZYVL{Y+I#CzvY)1#t) z@DT4#j0YZkke-ZLdhY^dQ2MdUjvd=sSQsJNl;9eouManYCI_fm@K_+R#9~}uMZtckN=Rxp&`pl zO!azrcRyaHhAFh=ec@nhULrGm`s}fk4B1KhtTgJ=B*dFam0UA zkCfC9xd;L?uCHV-zNt@zf7ll=YI@6iCE?Sf&$rb!gG-L@OG%y4nYZ~|7s?6bdR z_?>T2XylonKS3qRiW?mn;n|Q7i2Z-QKh_jm#sH4HjrDrD)+{!{Rf;n@}4ebkL^MP*=n_yZ79|YW6&nHQk1VyL!-Hp`z z-y)de5z1&x-M$yS=g3hO%7}fNueHqocKt7rM39Lymm&uaA3<;1x0kOz{Tm1!iV;Wx z%@ET1iuuE>B124|6DaD;&;y_S_G9e7?>@xLe12hpQzu^I^mBjY>iM%In_T~2>4yl% ro5mHCVtNOA@4c732M=-Qopp`j0=M=j4nbp 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 M07*qoM6N<$f)owYo&W#< diff --git a/src/icons/octopress.png b/src/icons/octopress.png index 0f25067305947ef363e54c54e41f8db853be0a1e..d65b4ba96c3f5140f4bdda35a2cf43e4358329f1 100644 GIT binary patch delta 214 zcmV;{04e{F1B(KX83+IX0026epuLeHD1WUpX0W)IQbqeJ%X>$7!7R>(H(S(;ZX*}7}3DIt^o((m^XN{}xAqZI()9~~f5yBh~c Qc>n+a07*qoM6N<$f|2W9#{d8T delta 348 zcmV-i0i*tl0+0ic83+Ra001a04^xpLD1VJmOjJcpO-e$H&9N!@9b<&d$!izrVP+xYpLzySuwEFfb@6C}?PCBqSt1KR-J=J2W&jhK7c~ zz`#R8L)qEcI5;>+NJvjlPcJVoHa0d)OiXlibc>6Nfq{X2eSJbgLM$vSyu7?2A%7vy z&(Bg)Qn$Ca#KgqG!NI=1z9r#KX#fBKnMp)JRCwBC&&L*mFaShR6k`f4i6->kLH+;F zb69eCt2uW!j&sR91-P98JkVY)OSvBl5Qbq=y-<~40tg{msjgE>V*)(StEYyLW~wm( zlzye`Dea}ClmZz0SvxQ`Sj!j#a7q3d^NsT@A35g$-}hT%;@FrL6A(p_DBh?Ln1CP% uW}(wmiy0H}L}JadRU8X&KXpC-7hnLdE(<&}JL)3<0000-{i9CWVWL3 z*$tmO&nkI#=F%i_%Hl+SaLFPW#M<9zi*dc>K7fEx0qN`bAsH@U``wjbfA$h^reO8% zxMClfA(KAwP9yEZ1#!v+^W)O9=fr|P7XA*dEK353E3c*``rnz-cYSn8G--F{Y}m0S z)A8k=EDI2kV-8N{nSz)CGYi7UtNr=Y$g5_bCvCM~+7|*=!pUNPqjMnt+Zd2JFAk(F zOX8=lxoJ-LFT17oi`$zUOxk@pj@J(5u)2=reh1Fx8-T>Z8QnPoCk?`PpTB5u@=gIp z+FDlZ=nCUA>x8A4Mm_3o)gs8%ze^5z(Zx-z16>+_&TvRC>pvn>8 z`P4{IuYJ6r-ZGI%`0KZ3eNr9WLB1hv0oNcD5`%&g1}G|_gJMMH-DAGCGbutezkd*J z5;+#v`!Nbt+6PePeu#qrRgI{WE;vgTUE{8-A$1a4xRBZ$XVQh@5*m1f&_D?ZMr&oI zwGrVf<*QPEi<_)|qf5=Ayin#2NW2qb7eH0^Hsdp+{0Tp1bYj?ZgqRN;j{H3Yl5={% zW6O%lD_M%l1d?xr&pxyp)7pBwH@I7W+BPEc$_lFYMSM*I0ejS20Te)i z-Ynux_MlQRN7jj1*s#d!1X@%L2u)c};B&8p z#1#;g2;+^IH|5Cth22$kG~75u1y%LwM44VtgeMf?)rD#LUL0xq>xIT&R_5}2VaaaNz6gkBG?;I*LRAO>?i5siJ=<}Upk3sc9cByGapifnkhlh-ngCZ` zgx9Q->+w?yUtPOT4Wn5>WAGW@hoa22P=Fi68h}o9tHEckw;j&zC0xbCX9%sk4iZ0w zs6`kpQn8!6r^#|kd& zoc!Rs1V)YPjw%tT!mZ1s$i*!k1eJKv!G-Lu@YcvcAdDM)0Phw zU1L0>oh@6~iqPM^fW(aiIC3?w(I~kg5jQNOI9k>p8--~(hY-6*nKlrX0M)Rr#tc?j z_Fey`+LhWpdtCHOg#Nk>61PA!vqyC`^Hs?suSIM>#NE%PCRpS0O_MM^*9)kBvNaU2 z0-$Ou05;7sbfB1599bR|0NNpWD|<9(E!A;&EnYbMA@U+1k}AsSt93DT+bmQW3edEA zjp^HY4=8{wo6*rDpp7H9qm4a&H2Hgd*vJnQ=>k7psp;BqshNjQljlzPzP`70)C*~+ z&{*}AK=W`1UwwUNwF^luiT?~Or&(KMT)*!vK|c-L2{rxyFm?6_`%hng1HIdk1?1rZ Q^8f$<07*qoM6N<$f_T(01ONa4 delta 1878 zcmV-c2dVh|4T}$uBo78+OGiWi{{a60|De66laV1Re+L*zL_t(o!|hjXP*m3$e$KgH zyTF2FSwIu{48$bFB8f>9(`Zm*Q^QzeCX+Vf*QDw+lFUd9U@e-| zwvmY@1~X!$wxTEmM3O3sXkcOa+68y--h0mJkA+rdkbwN@kDg!mp7Wmfea?N}_qp!@ z{y%#w>fiwM8YdFY{1Oe*^A)4~Mkc-CUagu8 zs>z@+(HtzWb^iX$G5}ay)Sp+a*VEfGe-17Rl8m!f$tNsShk`EJ-Tn8k03iLr6SoJ@ zHn$L3N)&_;MDqG4tGYj5F-&L%gOzg@s*wDd$Cm879hV!Y?!x8P(;$Sf1Y5$wVA*K0 zQZFn-hf2B=N-JWH4oZRkSp@)~IeB}uLo58y0-G57=878Hg`5-TEJ zJzC}_6lOxBI29ZhwvG^j>#vs}ZQuMstLC-Y-{VL{8lHOSpQr4W=o~B2p;A9oVo-?A z_1{$Avv6GUQPkB<=`TbrsarMpf6U+UPW^Qd8o(yYm!!Dx7aS*7l(lUrfqm2LAuH&) z+Q*T0|JOKsKH@{pTrU#R7mRwsLZ6(HlytcILiO0dT>G3n!a6#hXII+`0%ioDQYVeD zOP2)VM-cAWF>^gg~Rv3zT>O?u?sq~mVl%GdLu7E#0*+ zSm5N8`st|PJ&_mQdZiYTxF0Pe`k!2DcrLWF{nJLlJ)r^K38#{+^nq0OOv;+tDev^` zfZ+pR0>t3NB928~c6CZ z!xsq{0Q>;_Jw#!L0igBKe;h~-+lT-pC7-}Qjsg}f`Jzm%<-OSj2}B{njHSdT2@))w zf-nFWfY5Ec$Mb62yiGBV)7!wC+D8Py+3*r3JpmXu%U>p}d$QCEfB;@qiz%ay>K#Ig zv#&>pQU}2R2!NT%<~Q~EJzt!$($V2?O?nx8udPr zL_3_Arq2fe>YDKeq=d0hCy#5AVG5Bw-p0TT-((0KnxtEJ5L~KS71x+Q&VW zLN3|D7cc2u59omRf6ryGW~HNLLbeLsT**7ScLE|nheR5vJ!DN})$Zcq0%)oX-N%`G zF$ZYC8+8YbTJ)GBvFKtyDYj;%<2q&_@_eqJ+C%n`P|HVweBb~#V@0Ru?Uo74#{)pe zi(3W_+F6?d0C3gBy+N60F$HKK@d#8cZiyqY=wkD?(+A$%f10{7khv+#qn$}h&o@VB ziRRHi6U}3u7S6;)U$}E}!vVlGJ$u0Y?kYzB#D(PPt_pIqr2@iP0nt>~-f(Xi;l%v;OBvddI;M0T#;xB!Ww} zLs6-o1;gqIetl}fyeaLIw%cp z2#bF67sKiaU9$r*)JIZ|Kp|@a${`>Ozsh|#S2-Ve`pH}E{Z|$N0K5$=-XlU!BM^iD zphRX=4$rVe=k#=4UNCe35hcGz>%^B3w)-_xPP}VBe+jkj0qLy@&f?(pCf{nW#vcgq zNklpTjQ}7-fuzM}S%cym0U#{#)8Vz{jx%}aT(K4QFL$^g%xy%Gjs;|l>d;j8z=e;d zzN8{V{SDD?d}c}f8s6*cMt(DD%~+lculIQO(?_YlZ4gMVi+!1qR Qg#Z8m07*qoM6N<$f`2!Y0ssI2 diff --git a/src/icons/storyblok.png b/src/icons/storyblok.png index daf5882d125f704c90965af069124161951ae726..404358d949562924deca45ce65cb2ac5d9e0077d 100644 GIT binary patch delta 1599 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 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + \ No newline at end of file diff --git a/src/icons/typecho.svg b/src/icons/typecho.svg index b447bb51b..e43dcb1f9 100644 --- a/src/icons/typecho.svg +++ b/src/icons/typecho.svg @@ -1,10 +1 @@ - - - typecho-logo - Created with Sketch (http://www.bohemiancoding.com/sketch) - - - - - - \ No newline at end of file +typecho-logo \ No newline at end of file diff --git a/src/icons/wp_super_cache.png b/src/icons/wp_super_cache.png index 87e8d17eda109bc113f39a44690fd66c82628861..819cab29f4db4cbbbb4533f069c2a4b7e0b00c97 100644 GIT binary patch delta 734 zcmV<40wMjK2ayJl83+Ra002a!ipG&MDt`f1P)t-s7a}SeA0-|#+A0#OsCoUi*Dj+8D<8IV5g6Byl<;bvq+{0;9-~GbrAHmANPiuzNgT6E9J92xyi6Otzrevw8pKW-$4?o@$jQgZ z%F4^k%upH6(9zJ*($Uh>(oz`HQW(`z7}Zl4)z#P6QyAD&7}--7*;E(WR2SP+7u{4A z-c=Xp=;`R_>Hq)#OFrVw00001VoOIvajyql;s5{vK}keGR5;6HP$d8u=zpL<0|r!q z2)6=lxH3!yswzr~3QDSK+S=OKlrV@QfRrM{B%BI>Ktd604sHcNActxSrUFq>MPx&; zDG(J$G6ST5!^2(}iy;UFx`l}>=!VF^RDcxd7sg{K5S4_gKvp0uj70^q0viKVTQor` zkQ8vabD_Burof;u0i;0C3V$lW!Utu5JPT6573(F4q)|T27pg)G=nQZ`vGXCx%N7)d z@*ph12uYxPG%Jwi)iD8Eg04WmpfCpLAZ~O2Tnms-&=oM|gXH;*0`fxizyexm3YgNu zSwxh5a#Ebwpsql-f`yCIH8saiT?Ceb&=oM-MP-Cp3K+u$P!;f-21{oqIWV|6>SI+P zBJG`>?Fq66Db|n_usJ7Z1sMvV*$G#`X&sRsY0HL@E?^4G0<+^>*s!Ee0CypPM2>)L Q!vFvP07*qoM6N<$f@ delta 875 zcmV-x1C;!c2Av0x85#xv0047(dh`GQ00v@9M??Vs0RI60puMM)ks&I711d>GK~z}7 z?U&n&Rb?2)f8Y15LwmMcEp>0lLpPyDITsP8(4U}?BvOH92Mk08vHAzP3ksoI|AnA1 zx|vdfQgAdQ9Mg*|L1r*)kGSWwU5D>`y|5W)&Fs@!d(fL+Sg-&o{R#Ei7maKzg9$ng|0++)SG|+^B@Ye(it_D66;45 zFNvd`4=b(FTBEf=DYXFH4-qfVVQ~)Y9F`QN6xtY!@%qY%S5!I?!KNuTP0_~Sd43^9 zR%8sFwZzc_oU?7i`$YDDO;h3}nd(L&Lm*BPj(+$)yID!~T|xHhBKyY_w`hXXX0OQ|DI166Y*Q9CuVg=S_ZIYeZZ} z61fNr?R=SXxm+L?jx!gz^8Fb;J~7;pM3O|AJY-g}@B18h z>k!6hj4{2Bo6-DyZiHH`%HOwcbq=b4wJBPg))@!_KR5U<=YF78t8#Jl632#5;(3qz zN<~r9!Uo^Aw4$$7Y>Zh1ewl;s93~8dM^cMoYnbxc^Y=M_^U_@gw6x4a;kRM4`G6~< z=NEw=A`C;UKsB%o4^H#?nwURkefD3kGUwE?sqpZM6Hp57P2S`BjT;>K;3I-C#8blX zrWy7=*Ccj|FUKo zCRA|+0K|WPhCQnzPHz5}XFXv&GJJk}6*rR-wRLN$*C)HK_Cf@#z+hncbjuVw2NEJt zd^NF(Z|(-XdvHJ7=9-+paG^IV^H?B&0geq$vu|A!fN$$1PXANM*b)Rm&!6o*D-b!w zo9pK|x^ad;3%}0Xh^U3BZs)1uN(VUv7aA`Uu)RF-& z{A1FtYQE+8rfGInVy05f={semOy^$;cqU<4T+Qg;9V002ovPDHLkV1gF{ Boz(yU diff --git a/src/utils/iframe.js b/src/utils/iframe.js deleted file mode 100644 index d37f91ef1..000000000 --- a/src/utils/iframe.js +++ /dev/null @@ -1,1166 +0,0 @@ -'use strict'; - -(function(win) { - -var exports = {}; - -(function(exports) { - - var utils = { - normalizeUrl: function(url) { - - return this.hashUrl(url) || null; - - }, - - getReferrer: function() { - return this.normalizeUrl(document.referrer); - }, - - getPageUrl: function() { - return this.normalizeUrl(window.location.href); - }, - hashUrl: function(url) { - var a, - result; - - if ( !url || url.indexOf('http') !== 0 ) { - return null; - } - - a = document.createElement('a'); - a.href = url; - - result = a.protocol + '//' + a.hostname + '/'; - - if ( a.pathname && a.pathname !== '/' ) { - result += this.hashCode(a.pathname); - } - - if ( a.search ) { - result += '?' + this.hashCode(a.search); - } - - if ( a.hash ) { - result += '#' + this.hashCode(a.hash); - } - - return result; - }, - - hashCode: function(str) { - var hash = 0, - kar, - i; - - if ( str.length === 0 ) { - return hash; - } - - for ( i = 0; i < str.length; i++ ) { - kar = str.charCodeAt(i); - hash = ((hash << 5) - hash) + kar; - hash = hash & hash; - } - - return hash + Math.pow(2, 32); - }, - - realArray: function(a) { - return Array.prototype.slice.apply(a); - }, - - onDocLoaded: function(doc, callback) { - if ( doc.readyState === 'loading' ) { - doc.addEventListener('DOMContentLoaded', callback); - } else { - callback(); - } - }, - - SCRIPT_IN_WINDOW_TOP: window === window.top, - - isFriendlyWindow: function(win) { - - var href; - try { - href = win.location.href; - } catch(e) { - return false; - } - return true; - }, - - elementWindow: function(el) { - return el.ownerDocument.defaultView; - }, - - viewport: function(win) { - return {width: win.innerWidth, height: win.innerHeight}; - }, - - parseQS: function(qs) { - if ( qs.indexOf('http') === 0 ) { - qs = qs.split('?')[1]; - } - var i, kvs, key, val; - var dict = {}; - qs = qs.split('&'); - for ( i = 0; i < qs.length; i++ ) { - kvs = qs[i].split('='); - key = kvs[0]; - val = kvs.slice(1).join('='); - try { - dict[key] = window.decodeURIComponent(val); - } catch (e) { - - continue; - } - } - return dict; - }, - sendToBackground: function(message, event, responseMessage, onResponse) { - if ( typeof browser !== 'undefined' ) { - var response = browser.runtime.sendMessage(message); - response.then(onResponse); - } else if ( typeof chrome !== 'undefined' ) { - chrome.runtime.sendMessage(message, onResponse); - } else if ( window.self.port ) { - window.self.port.on(responseMessage, onResponse); - window.self.port.emit(event, message); - } - }, - - ifTrackingEnabled: function(callback, elseCallback) { - - this.sendToBackground( - 'is_tracking_enabled', - '', - 'tracking_enabled_response', - function(message) { - if ( message.tracking_enabled ) { - - callback(); - } else { - - elseCallback(); - } - } - ); - - } - }; - - utils.SCRIPT_IN_FRIENDLY_IFRAME = !utils.SCRIPT_IN_WINDOW_TOP && utils.isFriendlyWindow(window.parent); - utils.SCRIPT_IN_HOSTILE_IFRAME = !utils.SCRIPT_IN_WINDOW_TOP && !utils.SCRIPT_IN_FRIENDLY_IFRAME; - - function LogGenerator() { - this.msgNum = 0; - this.pageMeta = { - 'url': utils.getPageUrl(), - 'isHP': window.location.pathname === '/', - 'referrer': utils.getReferrer(), - 'rand': Math.floor(Math.random() * 10e12), - 'startTime': new Date().getTime() - }; - } - - LogGenerator.prototype = { - log: function(event, opt_assets, opt_pageTags) { - var opt_video_assets; - if ( event === 'video' || event === 'invalid-video' ) { - opt_video_assets = opt_assets || []; - opt_assets = []; - } else { - opt_video_assets = []; - opt_assets = opt_assets || []; - } - var result = { - doc: this.pageMeta, - event: event, - video_assets: opt_video_assets, - assets: opt_assets, - version: '3', - mrev: '9c4d5b3-c', - msgNum: this.msgNum, - timestamp: new Date().getTime(), - pageVis: document.visibilityState, - pageFoc: document.hasFocus(), - pageTags: opt_pageTags || [] - }; - this.msgNum++; - return result; - } - }; - - utils.LogGenerator = LogGenerator; - - exports.utils = utils; -})(exports); - -(function(exports) { - - var SizeMatcher = { - VALID_AD_SIZES: [ - [300, 50], - [320, 50], - [160, 600], - [300, 250], - [300, 600], - [300, 1050], - [336, 280], - [336, 850], - [468, 60], - [728, 90], - [728, 250], - [728, 270], - [970, 66], - [970, 90], - [970, 125], - [970, 250], - [970, 400], - [970, 415], - [1280, 100] - ], - - PX_SIZE_TOL: 10, - - getMatchedAdSize: function(width, height) { - - if ( !this.set ) { - this.set = this._makeSizeSet(); - } - - return this.set[Math.round(width) + 'x' + Math.round(height)]; - }, - - elementIsAdShaped: function(el) { - return !!this.getMatchedAdSizeForElement(el); - }, - - getMatchedAdSizeForElement: function(el) { - var rect = el.getBoundingClientRect(); - return this.getMatchedAdSize(rect.width, rect.height); - }, - - _makeSizeSet: function() { - var set = {}; - var i; - var xfuz; - var yfuz; - var size; - var width; - var height; - - for ( i = 0; i < this.VALID_AD_SIZES.length; i++ ) { - for ( xfuz = -this.PX_SIZE_TOL; xfuz <= this.PX_SIZE_TOL; xfuz++ ) { - for ( yfuz = -this.PX_SIZE_TOL; yfuz <= this.PX_SIZE_TOL; yfuz++ ) { - size = this.VALID_AD_SIZES[i]; - width = size[0] + xfuz; - height = size[1] + yfuz; - set[width + 'x' + height] = size; - } - } - } - return set; - } - }; - - var Throttler = { - MAX_SEARCHES_PER_WINDOW: 10, - MAX_SEARCHES_PER_ELEMENT: 2, - - countSearch: function(el) { - if ( typeof el.searches !== 'number' ) { - el.searches = 0; - } - - el.searches += 1; - }, - - throttle: function(el, max) { - if ( typeof el.searches === 'number' && el.searches >= max ) { - return true; - } - return false; - }, - - throttleElement: function(el) { - return this.throttle(el, this.MAX_SEARCHES_PER_ELEMENT); - }, - - throttleWin: function(win) { - return this.throttle(win, this.MAX_SEARCHES_PER_WINDOW); - }, - - getCount: function(el) { - return el.searches || 0; - } - }; - - function TopSearcher(win) { - this.win = win; - this.doc = win.document; - } - - TopSearcher.prototype.search = function() { - var candidates = exports.utils.realArray(this.doc.querySelectorAll('img, object, embed')), - html5Ad, - ads = []; - - ads = ads.concat(candidates.filter(function(el) { - if ( !el.mpAdFound && !Throttler.throttleElement(el) ) { - Throttler.countSearch(el); - if ( (el.tagName !== 'IMG' || isStandardImage(el)) && SizeMatcher.elementIsAdShaped(el) ) { - el.mpAdFound = true; - return true; - } - } - return false; - })); - - html5Ad = this._mainGetHTMLAd(); - if ( html5Ad ) { - html5Ad.html5 = true; - html5Ad.mpAdFound = true; - ads.push(html5Ad); - } - - return ads; - }; - - TopSearcher.prototype._mainGetHTMLAd = function() { - var styles = this.doc.querySelectorAll('div > style, div > link[rel="stylesheet"]'), - i, div; - for ( i = 0; i < styles.length; i++ ) { - div = styles[i].parentNode; - if ( !div.mpAdFound && SizeMatcher.elementIsAdShaped(div) && this._jumpedOut(div) ) { - return div; - } - } - }; - - TopSearcher.prototype._jumpedOut = function(el) { - var siblings, ifrs; - siblings = exports.utils.realArray(el.parentNode.children); - ifrs = siblings.filter(function(el) { - return el.tagName === 'IFRAME' && el.offsetWidth === 0 && el.offsetHeight === 0; - }); - return ifrs.length > 0; - }; - - function IframeSearcher(win) { - this.MIN_AD_AREA = 14000; - this.MIN_WINDOW_PX = 10; - - this.win = win; - this.doc = win.document; - this.body = win.document.body; - this.winClickTag = win.clickTag; - this.adSizeMeta = this._getAdSizeMeta(); - this.numElementsInBody = (this.body && this.body.querySelectorAll('*').length) || 0; - - this.shouldSearchWindow = false; - if ( !this.win.mpAdFound && this.body && !Throttler.throttleWin(this.win) ) { - this.winWidth = this.win.innerWidth; - this.winHeight = this.win.innerHeight; - if ( this._meetsMinAdSize(this.winWidth, this.winHeight) && !this._containsLargeIframes() ) { - this.shouldSearchWindow = true; - } - } - - } - - IframeSearcher.prototype.search = function() { - var ad; - - if ( this.shouldSearchWindow ) { - ad = this._search(); - if ( ad ) { - ad.mpAdFound = true; - win.mpAdFound = true; - return ad; - } - Throttler.countSearch(this.win); - } - - return null; - }; - - IframeSearcher.prototype._search = function() { - var _this = this, - stdCandidates, - html5Candidates, - stdEl, - html5El; - - stdCandidates = this.body.querySelectorAll('img, object, embed'); - - stdEl = getFirst(stdCandidates, function(el) { - if ( !el.mpAdFound && - !Throttler.throttleElement(el) && - (el.tagName !== 'IMG' || isStandardImage(el)) && - _this._elementIsAtLeastAsBigAsWindow(el)) - { - return true; - } - Throttler.countSearch(el); - return false; - }); - - if ( stdEl ) { - return stdEl; - } - - if ( this._isHTML5Iframe() ) { - html5Candidates = this.doc.querySelectorAll('body, canvas, button, video, svg, div'); - html5El = getFirst(html5Candidates, function(el) { - - if ( _this._elementIsAtLeastAsBigAsWindow(el) ) { - return true; - } - Throttler.countSearch(el); - return false; - }); - } - - if ( html5El ) { - html5El.html5 = true; - html5El.winClickTag = this.winClickTag; - html5El.adSizeMeta = this.adSizeMeta; - return html5El; - } - - return null; - }; - - IframeSearcher.prototype._isHTML5Iframe = function() { - if ( this.winClickTag || this.adSizeMeta ) { - return true; - } - - if ( this.doc.querySelectorAll('canvas', 'button', 'video', 'svg').length > 0 ) { - return true; - } - - if ( this.numElementsInBody >= 5 && Throttler.getCount(this.win) > 0 && this.doc.querySelectorAll('div').length > 0 ) { - return true; - } - - return false; - }; - - IframeSearcher.prototype._elementIsAtLeastAsBigAsWindow = function(el) { - var rect = el.getBoundingClientRect(), - tol = 0.95; - - return rect.width >= (tol * this.winWidth) && rect.height >= (tol * this.winHeight); - }; - - IframeSearcher.prototype._meetsMinAdSize = function(width, height) { - return (width * height) >= this.MIN_AD_AREA; - }; - - IframeSearcher.prototype._containsLargeIframes = function() { - var iframes = this.doc.querySelectorAll('iframe'); - var rect; - var i; - for ( i = 0; i < iframes.length; i++ ) { - rect = iframes[i].getBoundingClientRect(); - if ( rect.width > this.MIN_WINDOW_PX || rect.height > this.MIN_WINDOW_PX ) { - return true; - } - } - return false; - }; - - IframeSearcher.prototype._getAdSizeMeta = function() { - var adSizeMeta = this.doc.querySelectorAll('meta[name="ad.size"]'); - if ( adSizeMeta.length > 0 ) { - return adSizeMeta[0].content; - } else { - return null; - } - }; - - function getFirst(arr, testFn) { - var i, el; - for ( i = 0; i < arr.length; i++ ) { - el = arr[i]; - if ( testFn(el) ) { - return el; - } - } - return null; - } - - function isStandardImage(img) { - - return img.src && (img.parentNode.tagName === 'A' || img.getAttribute('onclick')); - } - - function getFriendlyIframes(win) { - var iframes = win.document.querySelectorAll('iframe'); - iframes = exports.utils.realArray(iframes); - var friendlyIframes = iframes.filter(function(ifr) { - return exports.utils.isFriendlyWindow(ifr.contentWindow); - }); - return friendlyIframes; - } - - function findAds(win) { - var i, - iframes, - searcher, - ad, - ads = []; - - if ( win === win.top ) { - searcher = new TopSearcher(win); - ads = ads.concat(searcher.search()); - } else { - searcher = new IframeSearcher(win); - ad = searcher.search(); - if ( ad ) { - ads.push(ad); - } - } - - iframes = getFriendlyIframes(win); - for ( i = 0; i < iframes.length; i++ ) { - ads = ads.concat(findAds(iframes[i].contentWindow)); - } - - return ads; - } - - exports.adfinder = { - getMatchedAdSize: SizeMatcher.getMatchedAdSize.bind(SizeMatcher), - findAds: findAds - }; -})(exports); - -(function(exports) { - - var parser = { - TAGS_WITH_SRC_ATTR: { - 'IMG': true, - 'SCRIPT': true, - 'IFRAME': true, - 'EMBED': true - }, - - MAX_ATTR_LEN: 100, - - getUrl: function(el, params) { - var url; - - if ( this.TAGS_WITH_SRC_ATTR.hasOwnProperty(el.tagName) ) { - url = el.src; - - } else if ( el.tagName === 'OBJECT' ) { - url = el.data || (params && params.movie) || null; - - } else if ( el.tagName === 'A' ) { - url = el.href; - } - - if ( url && url.indexOf('http') === 0 ) { - return url; - } else { - return null; - } - }, - - getParams: function(el) { - if ( el.tagName !== 'OBJECT' ) { - return null; - } - - var i, child; - var params = {}; - var children = el.children; - for ( i = 0; i < children.length; i++ ) { - child = children[i]; - if ( child.tagName === 'PARAM' && child.name ) { - - params[child.name.toLowerCase()] = child.value; - } - } - return params; - }, - - getPosition: function(el) { - var rect = el.getBoundingClientRect(); - var win = exports.utils.elementWindow(el); - - return { - width: Math.round(rect.width), - height: Math.round(rect.height), - left: Math.round(rect.left + win.pageXOffset), - top: Math.round(rect.top + win.pageYOffset) - }; - }, - - getFlashvars: function(el, params, url) { - var flashvars; - var urlQS = url && url.split('?')[1]; - - if ( el.tagName === 'EMBED' ) { - flashvars = el.getAttribute('flashvars') || urlQS; - - } else if ( el.tagName === 'OBJECT' ) { - flashvars = params.flashvars || el.getAttribute('flashvars') || urlQS; - } - - return (flashvars && exports.utils.parseQS(flashvars)) || null; - }, - - findClickThru: function(el, flashvars) { - var key; - if ( el.tagName === 'IMG' && el.parentElement.tagName === 'A' ) { - return el.parentElement.href; - } else if ( flashvars ) { - for ( key in flashvars ) { - if ( flashvars.hasOwnProperty(key) ) { - - if ( key.toLowerCase().indexOf('clicktag') === 0 ) { - return flashvars[key]; - } - } - } - } - return null; - }, - - getAttr: function(el, name) { - var val = el.getAttribute(name); - - if ( val && val.slice && val.toString ) { - - return val.slice(0, this.MAX_ATTR_LEN).toString(); - } else { - return null; - } - }, - - putPropIfExists: function(obj, name, val) { - if ( val ) { - obj[name] = val; - } - }, - - putAttrIfExists: function(obj, el, name) { - var val = this.getAttr(el, name); - this.putPropIfExists(obj, name, val); - }, - - elementToJSON: function(el, opt_findClickThru) { - var pos = this.getPosition(el); - var params = this.getParams(el); - var url = this.getUrl(el, params); - var flashvars = this.getFlashvars(el, params, url); - var clickThru = opt_findClickThru && this.findClickThru(el, flashvars); - var json = { - tagName: el.tagName, - width: pos.width, - height: pos.height, - left: pos.left, - top: pos.top, - children: [] - }; - - if ( params ) { - - delete params.flashvars; - } - - this.putAttrIfExists(json, el, 'id'); - this.putAttrIfExists(json, el, 'class'); - this.putAttrIfExists(json, el, 'name'); - - this.putPropIfExists(json, 'flashvars', flashvars); - this.putPropIfExists(json, 'url', url); - this.putPropIfExists(json, 'params', params); - this.putPropIfExists(json, 'clickThru', clickThru); - - return json; - } - }; - - exports.parser = { elementToJSON: parser.elementToJSON.bind(parser) }; -})(exports); - -(function(exports) { - - var ContextManager = function(adData) { - this.adData = adData; - }; - - ContextManager.prototype = { - CONTAINER_SIZE_TOL: 0.4, - ASPECT_RATIO_FOR_LEADERBOARDS: 2, - - isValidContainer: function(el, opt_curWin) { - - var cWidth = el.clientWidth; - var cHeight = el.clientHeight; - - var adWidth = this.adData.width; - var adHeight = this.adData.height; - - var winWidth = opt_curWin && opt_curWin.innerWidth; - var winHeight = opt_curWin && opt_curWin.innerHeight; - var similarWin = opt_curWin && this.withinTol(adWidth, winWidth) && this.withinTol(adHeight, winHeight); - - var similarSizeX = this.withinTol(adWidth, cWidth); - var similarSizeY = this.withinTol(adHeight, cHeight); - var adAspect = adWidth / adHeight; - - return similarWin || el.tagName === 'A' || (adAspect >= this.ASPECT_RATIO_FOR_LEADERBOARDS && similarSizeY) || (similarSizeX && similarSizeY); - }, - - withinTol: function(adlen, conlen) { - var pct = (conlen - adlen) / adlen; - - return pct <= this.CONTAINER_SIZE_TOL; - }, - - serializeElements: function(el) { - if ( !el ) { - return; - } - var i; - var ifrWin; - var adId = this.adData.adId; - var elIsAd = false; - - if ( adId && el[adId] && el[adId].isAd === true ) { - elIsAd = true; - } - - var json = exports.parser.elementToJSON(el, elIsAd); - var childJSON; - - if ( elIsAd ) { - json.adId = adId; - this.adData.element = {}; - - var keys = Object.keys(json); - for ( i = 0; i < keys.length; i++ ) { - var key = keys[i]; - if ( key !== 'children' && key !== 'contents' ) { - this.adData.element[key] = json[key]; - } - } - } - - var children = exports.utils.realArray(el.children).filter(function(el) { - var param = el.tagName === 'PARAM'; - var inlineScript = el.tagName === 'SCRIPT' && !(el.src && el.src.indexOf('http') >= 0); - var noScript = el.tagName === 'NOSCRIPT'; - return !(param || inlineScript || noScript); - }); - - for ( i = 0; i < children.length; i++ ) { - childJSON = this.serializeElements(children[i]); - if ( childJSON ) { - json.children.push(childJSON); - } - } - - if ( el.tagName === 'IFRAME' ) { - ifrWin = el.contentWindow; - - if ( adId && el[adId] && el[adId].needsWindow ) { - - json.contents = this.adData.serializedIframeContents; - el[adId].needsWindow = false; - delete this.adData.serializedIframeContents; - - } else if ( exports.utils.isFriendlyWindow(ifrWin) ) { - - childJSON = this.serializeElements(ifrWin.document.documentElement); - if ( childJSON ) { - json.contents = childJSON; - } - } - } - - if ( json.children.length > 0 || json.adId || json.tagName === 'IFRAME' || json.url ) { - return json; - } else { - return null; - } - }, - - captureHTML: function(containerEl) { - this.adData.context = this.serializeElements(containerEl); - }, - - nodeCount: function(el) { - return el.getElementsByTagName('*').length + 1; - }, - - highestContainer: function(curWin, referenceElement) { - var curContainer = referenceElement; - var docEl = curWin.document.documentElement; - var parentContainer; - - if ( curWin !== curWin.top && this.isValidContainer(docEl, curWin) ) { - return docEl; - } - - while ( true ) { - parentContainer = curContainer.parentElement; - if ( parentContainer && this.isValidContainer(parentContainer) ) { - curContainer = parentContainer; - } else { - return curContainer; - } - } - } - }; - - var tagfinder = { - - setPositions: function(adData, opt_el, opt_winPos) { - var el = opt_el || adData.context; - var winPos = opt_winPos || {left: 0, top: 0}; - var ifrPos; - - el.left += winPos.left; - el.top += winPos.top; - - if ( el.children ) { - el.children.forEach(function(child) { - this.setPositions(adData, child, winPos); - }, this); - } - - if ( el.contents ) { - ifrPos = {left: el.left, top: el.top}; - this.setPositions(adData, el.contents, ifrPos); - } - - if ( el.adId === adData.adId ) { - adData.element.left = el.left; - adData.element.top = el.top; - } - }, - - appendTags: function(adData, referenceElement) { - var mgr = new ContextManager(adData); - var curWin = exports.utils.elementWindow(referenceElement); - var highestContainer; - - while ( true ) { - highestContainer = mgr.highestContainer(curWin, referenceElement); - mgr.captureHTML(highestContainer); - if ( curWin === curWin.top ) { - break; - } else { - - curWin.mpAdFound = true; - - mgr.adData.serializedIframeContents = mgr.adData.context; - - if ( exports.utils.isFriendlyWindow(curWin.parent) ) { - referenceElement = curWin.frameElement; - referenceElement[mgr.adData.adId] = {needsWindow: true}; - curWin = curWin.parent; - } else { - break; - } - } - } - return { - referenceElement:referenceElement, - highestContainer: highestContainer - }; - } - }; - - exports.tagfinder = tagfinder; -})(exports); - -(function(exports) { - var _onAdFound; - var _logGen = new exports.utils.LogGenerator(); - var _pageTags; - var INIT_MS_BW_SEARCHES = 2000; - var PAGE_TAG_RE = new RegExp('gpt|oascentral'); - var POST_MSG_ID = '1490888598-28717-31700-14775-21098'; - var AD_SERVER_RE = new RegExp('^(google_ads_iframe|oas_frame|atwAdFrame)'); - - function getPageTags(doc) { - var scripts = doc.getElementsByTagName('script'); - var pageTags = []; - scripts = exports.utils.realArray(scripts); - scripts.forEach(function(script) { - if ( PAGE_TAG_RE.exec(script.src) ) { - pageTags.push({'tagName': 'SCRIPT', 'url': script.src}); - } - }); - return pageTags; - } - - function messageAllParentFrames(adData) { - - adData.postMessageId = POST_MSG_ID; - - adData = JSON.stringify(adData); - - var win = window; - while ( win !== win.top ) { - win = win.parent; - win.postMessage(adData, '*'); - } - } - - function appendTagsAndSendToParent(adData, referenceElement) { - var results = exports.tagfinder.appendTags(adData, referenceElement); - if ( exports.utils.SCRIPT_IN_HOSTILE_IFRAME ) { - messageAllParentFrames(adData); - - } else if ( exports.utils.SCRIPT_IN_WINDOW_TOP ) { - - exports.tagfinder.setPositions(adData); - - adData.matchedSize = exports.adfinder.getMatchedAdSize(adData.width, adData.height); - if ( !adData.matchedSize ) { - - if ( AD_SERVER_RE.exec(results.referenceElement.id) ) { - adData.matchedSize = [adData.width, adData.height]; - adData.oddSize = true; - } else { - - return; - } - } - delete adData.width; - delete adData.height; - adData.curPageUrl = exports.utils.getPageUrl(); - _pageTags = _pageTags || getPageTags(document); - var log = _logGen.log('ad', [adData], _pageTags); - - if ( _onAdFound ) { - - _onAdFound(log, results.referenceElement); - - } - } - } - - function extractAdsWrapper() { - if ( exports.utils.SCRIPT_IN_WINDOW_TOP || document.readyState === 'complete' ) { - extractAds(); - } - setTimeout( - function() { extractAdsWrapper(); }, INIT_MS_BW_SEARCHES - ); - } - - function extractAds() { - var ads = exports.adfinder.findAds(window); - ads.forEach(function(ad) { - - var startTime = new Date().getTime(); - var adId = startTime + '-' + Math.floor(Math.random() * 10e12); - - var adData = { - width: Math.round(ad.offsetWidth), - height: Math.round(ad.offsetHeight), - startTime: startTime, - adId: adId, - html5: ad.html5 || false - }; - - if ( ad.html5 ) { - adData.adSizeMeta = ad.adSizeMeta || null; - adData.winClickTag = ad.winClickTag || null; - } - - ad[adId] = { isAd: true }; - - appendTagsAndSendToParent(adData, ad); - }); - } - - function isChildWin(myWin, otherWin) { - var parentWin = otherWin.parent; - while ( parentWin !== otherWin ) { - if ( parentWin === myWin ) { - return true; - } - otherWin = parentWin; - parentWin = parentWin.parent; - } - return false; - } - - function iframeFromWindow(win, winToMatch) { - var i, ifr, ifrWin, - iframes = win.document.querySelectorAll('iframe'); - - for ( i = 0; i < iframes.length; i++ ) { - ifr = iframes[i]; - if ( ifr.contentWindow === winToMatch ) { - return ifr; - } - } - - for ( i = 0; i < iframes.length; i++ ) { - ifrWin = iframes[i].contentWindow; - if ( exports.utils.isFriendlyWindow(ifrWin) ) { - ifr = iframeFromWindow(ifrWin, winToMatch); - if ( ifr ) { - return ifr; - } - } - } - } - - function onPostMessage(event) { - var adData, - ifrWin = event.source, - - myWin = window.document.defaultView, - ifrTag; - - try { - - adData = JSON.parse(event.data); - } catch(e) { - - return; - } - - if ( adData.postMessageId === POST_MSG_ID ) { - - delete adData.postMessageId; - - event.stopImmediatePropagation(); - - if ( isChildWin(myWin, ifrWin) ) { - if ( exports.utils.isFriendlyWindow(ifrWin) ) { - ifrTag = ifrWin.frameElement; - } else { - ifrTag = iframeFromWindow(myWin, ifrWin); - } - - if ( ifrTag ) { - ifrTag[adData.adId] = {needsWindow: true}; - appendTagsAndSendToParent(adData, ifrTag); - } - } - } - } - - function onVideoMessage(msg, sender, callback) { - var log; - if ( msg.event === 'new-video-ad' ) { - msg.assets.forEach(function(asset) { - - }); - log = _logGen.log('video', msg.assets); - } else { - log = _logGen.log('invalid-video', msg.assets); - } - - msg.assets.forEach(function(a) {delete a.isVideo;}); - log.displayAdFound = msg.displayAdFound; - log.requests = msg.requests; - log.data = msg.event_data; - - log.doc.finalPageUrl = log.doc.url; - log.doc.url = exports.utils.normalizeUrl(msg.origUrl); - - _onAdFound(log); - } - - function addBackgroundListener(event, callback) { - if ( typeof browser !== 'undefined' ) { - browser.runtime.onMessage.addListener(function(msg) { - if ( msg.event === event ) { - callback(msg); - } - }); - } else if ( typeof chrome !== 'undefined' ) { - chrome.runtime.onMessage.addListener(function(msg) { - if ( msg.event === event ) { - callback(msg); - } - }); - } else if ( window.self.port ) { - window.self.port.on(event, callback); - } - } - - exports.coordinator = { - addPostMessageListener: function() { - if ( !exports.utils.SCRIPT_IN_FRIENDLY_IFRAME ) { - window.addEventListener('message', onPostMessage, false); - } - }, - - init: function(onAdFound) { - - if ( exports.utils.SCRIPT_IN_FRIENDLY_IFRAME ) { - return false; - } - - _onAdFound = onAdFound; - if ( exports.utils.SCRIPT_IN_WINDOW_TOP ) { - var log = _logGen.log('page'); - onAdFound(log); - - window.addEventListener('beforeunload', function(event) { - var log = _logGen.log('unload'); - log.timing = window.performance.timing; - onAdFound(log); - }); - - addBackgroundListener('new-video-ad', onVideoMessage); - addBackgroundListener('new-invalid-video-ad', onVideoMessage); - - } - - exports.utils.onDocLoaded(document, extractAdsWrapper); - } - }; - -})(exports); - -if ( exports.utils.SCRIPT_IN_WINDOW_TOP ) { - window.adparser = { - init: exports.coordinator.init, - addPostMessageListener: exports.coordinator.addPostMessageListener, - ifTrackingEnabled: exports.utils.ifTrackingEnabled, - sendToBackground: exports.utils.sendToBackground - }; -} else { - exports.coordinator.addPostMessageListener(); - exports.utils.ifTrackingEnabled( - function() { - exports.coordinator.init(function() {}); - }, - function() {} - ); -} -})(window); -(function(adparser) { - function onAdFound(log) { - adparser.sendToBackground({ id: 'ad_log', subject: log }, 'ad_log', '', function(){}); - } - - if ( window === window.top ) { - adparser.addPostMessageListener(); - adparser.ifTrackingEnabled( - function() { - adparser.init(onAdFound); - }, - function() {} - ) - } -})(window.adparser); diff --git a/src/utils/network.js b/src/utils/network.js deleted file mode 100644 index b2f2ea018..000000000 --- a/src/utils/network.js +++ /dev/null @@ -1,784 +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' - ]; - - 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 isTrackingEnabled() { - - return parseInt(localStorage.tracking, 10); - - } - - 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); - - if ( isTrackingEnabled() ) { - if ( !areListenersRegistered ) { - - registerListeners(); - } - this.collectors[tabId] = new PageNetworkTrafficCollector(tabId); - } else { - 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, isValidAd) { - var msg = {}; - msg.assets = []; - msg.event_data = {}; - if ( isValidAd ) { - msg.event = 'new-video-ad'; - msg.requests = reqs; - msg.requests.sort(function(reqA, reqB) {return reqA.requestTimestamp - reqB.requestTimestamp;}); - if ( assetReq ) { - msg.assets = [assetReq]; - } - } else { - msg.requests = reqs.map(function(request) { - return parseHostnameFromUrl(request.url); - }); - msg.assets = [{ - - url: parseHostnameFromUrl(assetReq.url), - - contentType: assetReq.contentType, - size: assetReq.size - }]; - msg.event = 'new-invalid-video-ad'; - } - 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 videoId = this.parseYoutubeVideoIdFromUrl(requestUrl); - if ( videoId ) { - request.isYoutubeAd = true; - request.isVideo = true; - 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, true); - } else { - - _this.sendToTab(msgAssetReq, tagReqs, origPageUrl, false); - } - - } 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' ) { - sendResponse({'tracking_enabled': isTrackingEnabled()}); - } - }); - -})();