-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/drivers/webextension/images/github.png b/src/drivers/webextension/images/github.png
deleted file mode 100644
index 037d0c33617bc314c9a772e9434801b70f870891..0000000000000000000000000000000000000000
Binary files a/src/drivers/webextension/images/github.png and /dev/null differ
diff --git a/src/drivers/webextension/images/icon.svg b/src/drivers/webextension/images/icon.svg
deleted file mode 100644
index dfcc9511e33675a7f853dcd5dea55a581b6cf6fc..0000000000000000000000000000000000000000
--- a/src/drivers/webextension/images/icon.svg
+++ /dev/null
@@ -1,17 +0,0 @@
-
-
-
- Logo
- Created with Sketch.
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/src/drivers/webextension/images/icon_150.png b/src/drivers/webextension/images/icon_150.png
deleted file mode 100644
index 7028f9c5e8ec561052b6e3d93e40cdcc47ad4586..0000000000000000000000000000000000000000
Binary files a/src/drivers/webextension/images/icon_150.png and /dev/null differ
diff --git a/src/drivers/webextension/images/icon_44.png b/src/drivers/webextension/images/icon_44.png
deleted file mode 100644
index 9a6321eaacd8e2de1029d9a698ac1c5255b791b1..0000000000000000000000000000000000000000
Binary files a/src/drivers/webextension/images/icon_44.png and /dev/null differ
diff --git a/src/drivers/webextension/images/icon_50.png b/src/drivers/webextension/images/icon_50.png
deleted file mode 100644
index 935b35b72739e4d4c002d490517f10202ebe587f..0000000000000000000000000000000000000000
Binary files a/src/drivers/webextension/images/icon_50.png and /dev/null differ
diff --git a/src/drivers/webextension/images/icons b/src/drivers/webextension/images/icons
deleted file mode 120000
index f7467b9a75c645ec0350f8a955600f253602d66b..0000000000000000000000000000000000000000
--- a/src/drivers/webextension/images/icons
+++ /dev/null
@@ -1 +0,0 @@
-../../../icons/
\ No newline at end of file
diff --git a/src/drivers/webextension/images/icons/1C-Bitrix.png b/src/drivers/webextension/images/icons/1C-Bitrix.png
new file mode 100644
index 0000000000000000000000000000000000000000..0d5fc411465b6dc2ed01ed331e11af87384c5d74
Binary files /dev/null and b/src/drivers/webextension/images/icons/1C-Bitrix.png differ
diff --git a/src/drivers/webextension/images/icons/3dCart.png b/src/drivers/webextension/images/icons/3dCart.png
new file mode 100644
index 0000000000000000000000000000000000000000..f929bb4ee7868aadb5dc65276761dd29d43307fa
Binary files /dev/null and b/src/drivers/webextension/images/icons/3dCart.png differ
diff --git a/src/drivers/webextension/images/icons/91app.png b/src/drivers/webextension/images/icons/91app.png
new file mode 100644
index 0000000000000000000000000000000000000000..373397ef977b989d3feddc705e0cedf51566ae9a
Binary files /dev/null and b/src/drivers/webextension/images/icons/91app.png differ
diff --git a/src/icons/A-Frame.svg b/src/drivers/webextension/images/icons/A-Frame.svg
similarity index 100%
rename from src/icons/A-Frame.svg
rename to src/drivers/webextension/images/icons/A-Frame.svg
diff --git a/src/drivers/webextension/images/icons/ADPLAN.png b/src/drivers/webextension/images/icons/ADPLAN.png
new file mode 100644
index 0000000000000000000000000000000000000000..c067886295535baf054b680be432330eeaae6969
Binary files /dev/null and b/src/drivers/webextension/images/icons/ADPLAN.png differ
diff --git a/src/icons/AOLserver.png b/src/drivers/webextension/images/icons/AOLserver.png
similarity index 100%
rename from src/icons/AOLserver.png
rename to src/drivers/webextension/images/icons/AOLserver.png
diff --git a/src/icons/AT Internet.png b/src/drivers/webextension/images/icons/AT Internet.png
similarity index 100%
rename from src/icons/AT Internet.png
rename to src/drivers/webextension/images/icons/AT Internet.png
diff --git a/src/icons/AWStats.png b/src/drivers/webextension/images/icons/AWStats.png
similarity index 100%
rename from src/icons/AWStats.png
rename to src/drivers/webextension/images/icons/AWStats.png
diff --git a/src/drivers/webextension/images/icons/Accelerated-Mobile-Pages.svg b/src/drivers/webextension/images/icons/Accelerated-Mobile-Pages.svg
new file mode 100644
index 0000000000000000000000000000000000000000..b9dad9255c333155231e79f7a41e41edf0e1b21f
--- /dev/null
+++ b/src/drivers/webextension/images/icons/Accelerated-Mobile-Pages.svg
@@ -0,0 +1,2 @@
+
+
diff --git a/src/drivers/webextension/images/icons/Accessibe.png b/src/drivers/webextension/images/icons/Accessibe.png
new file mode 100644
index 0000000000000000000000000000000000000000..77614df7d0a52944c951ec08f6852768d9686de1
Binary files /dev/null and b/src/drivers/webextension/images/icons/Accessibe.png differ
diff --git a/src/icons/ActOn.png b/src/drivers/webextension/images/icons/ActOn.png
similarity index 100%
rename from src/icons/ActOn.png
rename to src/drivers/webextension/images/icons/ActOn.png
diff --git a/src/icons/AdInfinity.png b/src/drivers/webextension/images/icons/AdInfinity.png
similarity index 100%
rename from src/icons/AdInfinity.png
rename to src/drivers/webextension/images/icons/AdInfinity.png
diff --git a/src/drivers/webextension/images/icons/AdOcean.png b/src/drivers/webextension/images/icons/AdOcean.png
new file mode 100644
index 0000000000000000000000000000000000000000..4ae2d7d6c55d8c480351d96c238c7348b78ceb75
Binary files /dev/null and b/src/drivers/webextension/images/icons/AdOcean.png differ
diff --git a/src/icons/AdRiver.png b/src/drivers/webextension/images/icons/AdRiver.png
similarity index 100%
rename from src/icons/AdRiver.png
rename to src/drivers/webextension/images/icons/AdRiver.png
diff --git a/src/icons/AdRoll.svg b/src/drivers/webextension/images/icons/AdRoll.svg
similarity index 100%
rename from src/icons/AdRoll.svg
rename to src/drivers/webextension/images/icons/AdRoll.svg
diff --git a/src/drivers/webextension/images/icons/Adally.png b/src/drivers/webextension/images/icons/Adally.png
new file mode 100644
index 0000000000000000000000000000000000000000..f8372798f21a3f1f3afe3bb1e00480b3db640869
Binary files /dev/null and b/src/drivers/webextension/images/icons/Adally.png differ
diff --git a/src/icons/Adcash.svg b/src/drivers/webextension/images/icons/Adcash.svg
similarity index 100%
rename from src/icons/Adcash.svg
rename to src/drivers/webextension/images/icons/Adcash.svg
diff --git a/src/icons/AddShoppers.png b/src/drivers/webextension/images/icons/AddShoppers.png
similarity index 100%
rename from src/icons/AddShoppers.png
rename to src/drivers/webextension/images/icons/AddShoppers.png
diff --git a/src/icons/AddThis.svg b/src/drivers/webextension/images/icons/AddThis.svg
similarity index 100%
rename from src/icons/AddThis.svg
rename to src/drivers/webextension/images/icons/AddThis.svg
diff --git a/src/icons/AddToAny.png b/src/drivers/webextension/images/icons/AddToAny.png
similarity index 100%
rename from src/icons/AddToAny.png
rename to src/drivers/webextension/images/icons/AddToAny.png
diff --git a/src/drivers/webextension/images/icons/Adobe Analytics.svg b/src/drivers/webextension/images/icons/Adobe Analytics.svg
new file mode 100644
index 0000000000000000000000000000000000000000..cb2827f2fdc7209b58cdc6c50f053de9222f6ef2
--- /dev/null
+++ b/src/drivers/webextension/images/icons/Adobe Analytics.svg
@@ -0,0 +1,16 @@
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/icons/Adobe ColdFusion.svg b/src/drivers/webextension/images/icons/Adobe ColdFusion.svg
similarity index 100%
rename from src/icons/Adobe ColdFusion.svg
rename to src/drivers/webextension/images/icons/Adobe ColdFusion.svg
diff --git a/src/icons/Adobe GoLive.png b/src/drivers/webextension/images/icons/Adobe GoLive.png
similarity index 100%
rename from src/icons/Adobe GoLive.png
rename to src/drivers/webextension/images/icons/Adobe GoLive.png
diff --git a/src/icons/Adobe RoboHelp.svg b/src/drivers/webextension/images/icons/Adobe RoboHelp.svg
similarity index 100%
rename from src/icons/Adobe RoboHelp.svg
rename to src/drivers/webextension/images/icons/Adobe RoboHelp.svg
diff --git a/src/drivers/webextension/images/icons/Adobe.svg b/src/drivers/webextension/images/icons/Adobe.svg
new file mode 100644
index 0000000000000000000000000000000000000000..0843b200c0e35d8aefd54ace73de1450444298d0
--- /dev/null
+++ b/src/drivers/webextension/images/icons/Adobe.svg
@@ -0,0 +1,12 @@
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/drivers/webextension/images/icons/AdonisJS.png b/src/drivers/webextension/images/icons/AdonisJS.png
new file mode 100644
index 0000000000000000000000000000000000000000..71b65e89206416e61b8e373b29d0294ae36e8e72
Binary files /dev/null and b/src/drivers/webextension/images/icons/AdonisJS.png differ
diff --git a/src/icons/Advanced Web Stats.png b/src/drivers/webextension/images/icons/Advanced Web Stats.png
similarity index 100%
rename from src/icons/Advanced Web Stats.png
rename to src/drivers/webextension/images/icons/Advanced Web Stats.png
diff --git a/src/icons/Advert Stream.png b/src/drivers/webextension/images/icons/Advert Stream.png
similarity index 100%
rename from src/icons/Advert Stream.png
rename to src/drivers/webextension/images/icons/Advert Stream.png
diff --git a/src/icons/Adverticum.svg b/src/drivers/webextension/images/icons/Adverticum.svg
similarity index 100%
rename from src/icons/Adverticum.svg
rename to src/drivers/webextension/images/icons/Adverticum.svg
diff --git a/src/icons/Adyen.svg b/src/drivers/webextension/images/icons/Adyen.svg
similarity index 100%
rename from src/icons/Adyen.svg
rename to src/drivers/webextension/images/icons/Adyen.svg
diff --git a/src/icons/Adzerk.png b/src/drivers/webextension/images/icons/Adzerk.png
similarity index 100%
rename from src/icons/Adzerk.png
rename to src/drivers/webextension/images/icons/Adzerk.png
diff --git a/src/icons/Aegea.png b/src/drivers/webextension/images/icons/Aegea.png
similarity index 100%
rename from src/icons/Aegea.png
rename to src/drivers/webextension/images/icons/Aegea.png
diff --git a/src/icons/Afosto.svg b/src/drivers/webextension/images/icons/Afosto.svg
similarity index 100%
rename from src/icons/Afosto.svg
rename to src/drivers/webextension/images/icons/Afosto.svg
diff --git a/src/icons/Airee.png b/src/drivers/webextension/images/icons/Airee.png
similarity index 100%
rename from src/icons/Airee.png
rename to src/drivers/webextension/images/icons/Airee.png
diff --git a/src/drivers/webextension/images/icons/Airform.svg b/src/drivers/webextension/images/icons/Airform.svg
new file mode 100644
index 0000000000000000000000000000000000000000..188efcda5cd5194bace9a6173d0f141a55e4af73
--- /dev/null
+++ b/src/drivers/webextension/images/icons/Airform.svg
@@ -0,0 +1 @@
+
diff --git a/src/drivers/webextension/images/icons/Algolia.svg b/src/drivers/webextension/images/icons/Algolia.svg
new file mode 100644
index 0000000000000000000000000000000000000000..c7ab0592848dfbd9b22eb772ecc3f517a82906b0
--- /dev/null
+++ b/src/drivers/webextension/images/icons/Algolia.svg
@@ -0,0 +1 @@
+
diff --git a/src/icons/Allegro RomPager.png b/src/drivers/webextension/images/icons/Allegro RomPager.png
similarity index 100%
rename from src/icons/Allegro RomPager.png
rename to src/drivers/webextension/images/icons/Allegro RomPager.png
diff --git a/src/icons/AlloyUI.png b/src/drivers/webextension/images/icons/AlloyUI.png
similarity index 100%
rename from src/icons/AlloyUI.png
rename to src/drivers/webextension/images/icons/AlloyUI.png
diff --git a/src/drivers/webextension/images/icons/Alpine.js.png b/src/drivers/webextension/images/icons/Alpine.js.png
new file mode 100644
index 0000000000000000000000000000000000000000..9a8df804ff69fcbdb1b83ea3e030a64418192692
Binary files /dev/null and b/src/drivers/webextension/images/icons/Alpine.js.png differ
diff --git a/src/icons/Amaya.png b/src/drivers/webextension/images/icons/Amaya.png
similarity index 100%
rename from src/icons/Amaya.png
rename to src/drivers/webextension/images/icons/Amaya.png
diff --git a/src/drivers/webextension/images/icons/Amazon Pay.svg b/src/drivers/webextension/images/icons/Amazon Pay.svg
new file mode 100644
index 0000000000000000000000000000000000000000..19f29d4ff7418ceeedeae170a92537f7f23b2bcb
--- /dev/null
+++ b/src/drivers/webextension/images/icons/Amazon Pay.svg
@@ -0,0 +1,6 @@
+
+
+
+
+
+
diff --git a/src/icons/Amazon-Cloudfront.svg b/src/drivers/webextension/images/icons/Amazon-Cloudfront.svg
similarity index 100%
rename from src/icons/Amazon-Cloudfront.svg
rename to src/drivers/webextension/images/icons/Amazon-Cloudfront.svg
diff --git a/src/drivers/webextension/images/icons/Amazon.svg b/src/drivers/webextension/images/icons/Amazon.svg
new file mode 100644
index 0000000000000000000000000000000000000000..77a47d3947ffba9c3c8b5511f081d18a98a384e8
--- /dev/null
+++ b/src/drivers/webextension/images/icons/Amazon.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/icons/Ametys.png b/src/drivers/webextension/images/icons/Ametys.png
similarity index 100%
rename from src/icons/Ametys.png
rename to src/drivers/webextension/images/icons/Ametys.png
diff --git a/src/drivers/webextension/images/icons/Amex.svg b/src/drivers/webextension/images/icons/Amex.svg
new file mode 100644
index 0000000000000000000000000000000000000000..fb04310ac56475e6deb3c49dfa63095174b38c32
--- /dev/null
+++ b/src/drivers/webextension/images/icons/Amex.svg
@@ -0,0 +1,37 @@
+
+
+
+
+
+
+
+
+
+
+ image/svg+xml
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/icons/Amiro.CMS.png b/src/drivers/webextension/images/icons/Amiro.CMS.png
similarity index 100%
rename from src/icons/Amiro.CMS.png
rename to src/drivers/webextension/images/icons/Amiro.CMS.png
diff --git a/src/icons/Analysys Ark.svg b/src/drivers/webextension/images/icons/Analysys Ark.svg
similarity index 100%
rename from src/icons/Analysys Ark.svg
rename to src/drivers/webextension/images/icons/Analysys Ark.svg
diff --git a/src/drivers/webextension/images/icons/Anetwork.png b/src/drivers/webextension/images/icons/Anetwork.png
new file mode 100644
index 0000000000000000000000000000000000000000..d0b5409d6ec9e168ea42a09e36e9c29d71ee176b
Binary files /dev/null and b/src/drivers/webextension/images/icons/Anetwork.png differ
diff --git a/src/icons/Angular.svg b/src/drivers/webextension/images/icons/Angular.svg
similarity index 100%
rename from src/icons/Angular.svg
rename to src/drivers/webextension/images/icons/Angular.svg
diff --git a/src/icons/AngularDart.svg b/src/drivers/webextension/images/icons/AngularDart.svg
similarity index 100%
rename from src/icons/AngularDart.svg
rename to src/drivers/webextension/images/icons/AngularDart.svg
diff --git a/src/icons/AngularJS.svg b/src/drivers/webextension/images/icons/AngularJS.svg
similarity index 100%
rename from src/icons/AngularJS.svg
rename to src/drivers/webextension/images/icons/AngularJS.svg
diff --git a/src/icons/Ant Design.svg b/src/drivers/webextension/images/icons/Ant Design.svg
similarity index 100%
rename from src/icons/Ant Design.svg
rename to src/drivers/webextension/images/icons/Ant Design.svg
diff --git a/src/icons/Apache JSPWiki.png b/src/drivers/webextension/images/icons/Apache JSPWiki.png
similarity index 100%
rename from src/icons/Apache JSPWiki.png
rename to src/drivers/webextension/images/icons/Apache JSPWiki.png
diff --git a/src/icons/Apache Tomcat.svg b/src/drivers/webextension/images/icons/Apache Tomcat.svg
similarity index 100%
rename from src/icons/Apache Tomcat.svg
rename to src/drivers/webextension/images/icons/Apache Tomcat.svg
diff --git a/src/drivers/webextension/images/icons/Apache Traffic Server.png b/src/drivers/webextension/images/icons/Apache Traffic Server.png
new file mode 100644
index 0000000000000000000000000000000000000000..8813eeb619ee45c10b78b9da58fe47adcbc1cc58
Binary files /dev/null and b/src/drivers/webextension/images/icons/Apache Traffic Server.png differ
diff --git a/src/icons/Apache Wicket.svg b/src/drivers/webextension/images/icons/Apache Wicket.svg
similarity index 100%
rename from src/icons/Apache Wicket.svg
rename to src/drivers/webextension/images/icons/Apache Wicket.svg
diff --git a/src/icons/Apache.svg b/src/drivers/webextension/images/icons/Apache.svg
similarity index 100%
rename from src/icons/Apache.svg
rename to src/drivers/webextension/images/icons/Apache.svg
diff --git a/src/icons/ApexPages.png b/src/drivers/webextension/images/icons/ApexPages.png
similarity index 100%
rename from src/icons/ApexPages.png
rename to src/drivers/webextension/images/icons/ApexPages.png
diff --git a/src/drivers/webextension/images/icons/Apollo.svg b/src/drivers/webextension/images/icons/Apollo.svg
new file mode 100644
index 0000000000000000000000000000000000000000..7e542bbf4a94cd981747d09ea9f810053d6b2fae
--- /dev/null
+++ b/src/drivers/webextension/images/icons/Apollo.svg
@@ -0,0 +1,29 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/drivers/webextension/images/icons/AppDynamics.png b/src/drivers/webextension/images/icons/AppDynamics.png
new file mode 100644
index 0000000000000000000000000000000000000000..1470b96fd7996a152bcfeafebf6504078de09bb4
Binary files /dev/null and b/src/drivers/webextension/images/icons/AppDynamics.png differ
diff --git a/src/icons/AppNexus.svg b/src/drivers/webextension/images/icons/AppNexus.svg
similarity index 100%
rename from src/icons/AppNexus.svg
rename to src/drivers/webextension/images/icons/AppNexus.svg
diff --git a/src/drivers/webextension/images/icons/Apple.svg b/src/drivers/webextension/images/icons/Apple.svg
new file mode 100644
index 0000000000000000000000000000000000000000..d0e888fea484d0c6b434a76928bee341ae7dd88a
--- /dev/null
+++ b/src/drivers/webextension/images/icons/Apple.svg
@@ -0,0 +1,10 @@
+
+
+
+
+
+
+
+
+
+
diff --git a/src/icons/Arastta.svg b/src/drivers/webextension/images/icons/Arastta.svg
similarity index 100%
rename from src/icons/Arastta.svg
rename to src/drivers/webextension/images/icons/Arastta.svg
diff --git a/src/icons/Arc-Publishing.svg b/src/drivers/webextension/images/icons/Arc-Publishing.svg
similarity index 100%
rename from src/icons/Arc-Publishing.svg
rename to src/drivers/webextension/images/icons/Arc-Publishing.svg
diff --git a/src/icons/Artifactory.svg b/src/drivers/webextension/images/icons/Artifactory.svg
similarity index 100%
rename from src/icons/Artifactory.svg
rename to src/drivers/webextension/images/icons/Artifactory.svg
diff --git a/src/drivers/webextension/images/icons/ArvanCloud.png b/src/drivers/webextension/images/icons/ArvanCloud.png
new file mode 100644
index 0000000000000000000000000000000000000000..9c53ead920e8732cc80982caeb80278721a93acb
Binary files /dev/null and b/src/drivers/webextension/images/icons/ArvanCloud.png differ
diff --git a/src/icons/AsciiDoc.png b/src/drivers/webextension/images/icons/AsciiDoc.png
similarity index 100%
rename from src/icons/AsciiDoc.png
rename to src/drivers/webextension/images/icons/AsciiDoc.png
diff --git a/src/icons/Atlassian Bitbucket.svg b/src/drivers/webextension/images/icons/Atlassian Bitbucket.svg
similarity index 100%
rename from src/icons/Atlassian Bitbucket.svg
rename to src/drivers/webextension/images/icons/Atlassian Bitbucket.svg
diff --git a/src/icons/Atlassian Confluence.svg b/src/drivers/webextension/images/icons/Atlassian Confluence.svg
similarity index 100%
rename from src/icons/Atlassian Confluence.svg
rename to src/drivers/webextension/images/icons/Atlassian Confluence.svg
diff --git a/src/icons/Atlassian FishEye.svg b/src/drivers/webextension/images/icons/Atlassian FishEye.svg
similarity index 100%
rename from src/icons/Atlassian FishEye.svg
rename to src/drivers/webextension/images/icons/Atlassian FishEye.svg
diff --git a/src/icons/Atlassian Jira.svg b/src/drivers/webextension/images/icons/Atlassian Jira.svg
similarity index 100%
rename from src/icons/Atlassian Jira.svg
rename to src/drivers/webextension/images/icons/Atlassian Jira.svg
diff --git a/src/drivers/webextension/images/icons/Atlassian Statuspage.svg b/src/drivers/webextension/images/icons/Atlassian Statuspage.svg
new file mode 100644
index 0000000000000000000000000000000000000000..b651642d7339c17ae924252ffdb4c7e8d921e5fd
--- /dev/null
+++ b/src/drivers/webextension/images/icons/Atlassian Statuspage.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/drivers/webextension/images/icons/AudioEye.png b/src/drivers/webextension/images/icons/AudioEye.png
new file mode 100644
index 0000000000000000000000000000000000000000..0708ecf1d69cbd006e35bb41c200c5c25c02254e
Binary files /dev/null and b/src/drivers/webextension/images/icons/AudioEye.png differ
diff --git a/src/icons/Aurelia.svg b/src/drivers/webextension/images/icons/Aurelia.svg
similarity index 100%
rename from src/icons/Aurelia.svg
rename to src/drivers/webextension/images/icons/Aurelia.svg
diff --git a/src/icons/Avangate.svg b/src/drivers/webextension/images/icons/Avangate.svg
similarity index 100%
rename from src/icons/Avangate.svg
rename to src/drivers/webextension/images/icons/Avangate.svg
diff --git a/src/drivers/webextension/images/icons/Avasize.png b/src/drivers/webextension/images/icons/Avasize.png
new file mode 100755
index 0000000000000000000000000000000000000000..753c8fccd1dcb57ebe10f211845dbd98a7569ea4
Binary files /dev/null and b/src/drivers/webextension/images/icons/Avasize.png differ
diff --git a/src/icons/BEM.png b/src/drivers/webextension/images/icons/BEM.png
similarity index 100%
rename from src/icons/BEM.png
rename to src/drivers/webextension/images/icons/BEM.png
diff --git a/src/icons/BIGACE.png b/src/drivers/webextension/images/icons/BIGACE.png
similarity index 100%
rename from src/icons/BIGACE.png
rename to src/drivers/webextension/images/icons/BIGACE.png
diff --git a/src/drivers/webextension/images/icons/Babel.svg b/src/drivers/webextension/images/icons/Babel.svg
new file mode 100644
index 0000000000000000000000000000000000000000..c4c0069546d5f7588ae538b6b90073130d60fba0
--- /dev/null
+++ b/src/drivers/webextension/images/icons/Babel.svg
@@ -0,0 +1 @@
+
Minimal Babel Logo
diff --git a/src/icons/Backbone.js.png b/src/drivers/webextension/images/icons/Backbone.js.png
similarity index 100%
rename from src/icons/Backbone.js.png
rename to src/drivers/webextension/images/icons/Backbone.js.png
diff --git a/src/icons/Backdrop.png b/src/drivers/webextension/images/icons/Backdrop.png
similarity index 100%
rename from src/icons/Backdrop.png
rename to src/drivers/webextension/images/icons/Backdrop.png
diff --git a/src/drivers/webextension/images/icons/Baidu Tongji.png b/src/drivers/webextension/images/icons/Baidu Tongji.png
new file mode 100644
index 0000000000000000000000000000000000000000..be459bfdcf619e8bd3e44650e8f030bca58d9b86
Binary files /dev/null and b/src/drivers/webextension/images/icons/Baidu Tongji.png differ
diff --git a/src/icons/Banshee.png b/src/drivers/webextension/images/icons/Banshee.png
similarity index 100%
rename from src/icons/Banshee.png
rename to src/drivers/webextension/images/icons/Banshee.png
diff --git a/src/icons/BaseHTTP.png b/src/drivers/webextension/images/icons/BaseHTTP.png
similarity index 100%
rename from src/icons/BaseHTTP.png
rename to src/drivers/webextension/images/icons/BaseHTTP.png
diff --git a/src/drivers/webextension/images/icons/Bigcommerce.png b/src/drivers/webextension/images/icons/Bigcommerce.png
new file mode 100644
index 0000000000000000000000000000000000000000..521e9f6e8c8ec44639bd8674539091a25c4a15e3
Binary files /dev/null and b/src/drivers/webextension/images/icons/Bigcommerce.png differ
diff --git a/src/icons/Bigware.png b/src/drivers/webextension/images/icons/Bigware.png
similarity index 100%
rename from src/icons/Bigware.png
rename to src/drivers/webextension/images/icons/Bigware.png
diff --git a/src/icons/BittAds.png b/src/drivers/webextension/images/icons/BittAds.png
similarity index 100%
rename from src/icons/BittAds.png
rename to src/drivers/webextension/images/icons/BittAds.png
diff --git a/src/icons/Blade.png b/src/drivers/webextension/images/icons/Blade.png
similarity index 100%
rename from src/icons/Blade.png
rename to src/drivers/webextension/images/icons/Blade.png
diff --git a/src/drivers/webextension/images/icons/Blazor.png b/src/drivers/webextension/images/icons/Blazor.png
new file mode 100644
index 0000000000000000000000000000000000000000..08283f19a1472b7d61ef5c3f654cfdf659ab1996
Binary files /dev/null and b/src/drivers/webextension/images/icons/Blazor.png differ
diff --git a/src/drivers/webextension/images/icons/Blessing Skin.png b/src/drivers/webextension/images/icons/Blessing Skin.png
new file mode 100644
index 0000000000000000000000000000000000000000..c59be77924ca9d4473c026fba989759b129f35e9
Binary files /dev/null and b/src/drivers/webextension/images/icons/Blessing Skin.png differ
diff --git a/src/icons/Blesta.png b/src/drivers/webextension/images/icons/Blesta.png
similarity index 100%
rename from src/icons/Blesta.png
rename to src/drivers/webextension/images/icons/Blesta.png
diff --git a/src/icons/Blip.tv.png b/src/drivers/webextension/images/icons/Blip.tv.png
similarity index 100%
rename from src/icons/Blip.tv.png
rename to src/drivers/webextension/images/icons/Blip.tv.png
diff --git a/src/icons/Blogger.png b/src/drivers/webextension/images/icons/Blogger.png
similarity index 100%
rename from src/icons/Blogger.png
rename to src/drivers/webextension/images/icons/Blogger.png
diff --git a/src/drivers/webextension/images/icons/Bloomreach.png b/src/drivers/webextension/images/icons/Bloomreach.png
new file mode 100644
index 0000000000000000000000000000000000000000..e9d2b8d9bedb70bb288c5111a9e5753a7072b88d
Binary files /dev/null and b/src/drivers/webextension/images/icons/Bloomreach.png differ
diff --git a/src/icons/Bluefish.png b/src/drivers/webextension/images/icons/Bluefish.png
similarity index 100%
rename from src/icons/Bluefish.png
rename to src/drivers/webextension/images/icons/Bluefish.png
diff --git a/src/icons/BoldChat.png b/src/drivers/webextension/images/icons/BoldChat.png
similarity index 100%
rename from src/icons/BoldChat.png
rename to src/drivers/webextension/images/icons/BoldChat.png
diff --git a/src/icons/Bolt.png b/src/drivers/webextension/images/icons/Bolt.png
similarity index 100%
rename from src/icons/Bolt.png
rename to src/drivers/webextension/images/icons/Bolt.png
diff --git a/src/icons/Bonfire.png b/src/drivers/webextension/images/icons/Bonfire.png
similarity index 100%
rename from src/icons/Bonfire.png
rename to src/drivers/webextension/images/icons/Bonfire.png
diff --git a/src/icons/Bootstrap Table.svg b/src/drivers/webextension/images/icons/Bootstrap Table.svg
similarity index 100%
rename from src/icons/Bootstrap Table.svg
rename to src/drivers/webextension/images/icons/Bootstrap Table.svg
diff --git a/src/drivers/webextension/images/icons/Bootstrap.png b/src/drivers/webextension/images/icons/Bootstrap.png
new file mode 100644
index 0000000000000000000000000000000000000000..7a2650aab3fb41680c574308ce47ec78e6bcf1d7
Binary files /dev/null and b/src/drivers/webextension/images/icons/Bootstrap.png differ
diff --git a/src/drivers/webextension/images/icons/Botble-CMS.png b/src/drivers/webextension/images/icons/Botble-CMS.png
new file mode 100755
index 0000000000000000000000000000000000000000..c22f9c412e33bd894fb60be49141bff4d94fbbf1
Binary files /dev/null and b/src/drivers/webextension/images/icons/Botble-CMS.png differ
diff --git a/src/icons/Bounce Exchange.svg b/src/drivers/webextension/images/icons/Bounce Exchange.svg
similarity index 100%
rename from src/icons/Bounce Exchange.svg
rename to src/drivers/webextension/images/icons/Bounce Exchange.svg
diff --git a/src/icons/Braintree.svg b/src/drivers/webextension/images/icons/Braintree.svg
similarity index 100%
rename from src/icons/Braintree.svg
rename to src/drivers/webextension/images/icons/Braintree.svg
diff --git a/src/icons/Brightspot.svg b/src/drivers/webextension/images/icons/Brightspot.svg
similarity index 100%
rename from src/icons/Brightspot.svg
rename to src/drivers/webextension/images/icons/Brightspot.svg
diff --git a/src/icons/BrowserCMS.png b/src/drivers/webextension/images/icons/BrowserCMS.png
similarity index 100%
rename from src/icons/BrowserCMS.png
rename to src/drivers/webextension/images/icons/BrowserCMS.png
diff --git a/src/icons/BugSnag.png b/src/drivers/webextension/images/icons/BugSnag.png
similarity index 100%
rename from src/icons/BugSnag.png
rename to src/drivers/webextension/images/icons/BugSnag.png
diff --git a/src/icons/Bugzilla.png b/src/drivers/webextension/images/icons/Bugzilla.png
similarity index 100%
rename from src/icons/Bugzilla.png
rename to src/drivers/webextension/images/icons/Bugzilla.png
diff --git a/src/icons/Bulma.png b/src/drivers/webextension/images/icons/Bulma.png
similarity index 100%
rename from src/icons/Bulma.png
rename to src/drivers/webextension/images/icons/Bulma.png
diff --git a/src/icons/Burning Board.png b/src/drivers/webextension/images/icons/Burning Board.png
similarity index 100%
rename from src/icons/Burning Board.png
rename to src/drivers/webextension/images/icons/Burning Board.png
diff --git a/src/icons/Business Catalyst.png b/src/drivers/webextension/images/icons/Business Catalyst.png
similarity index 100%
rename from src/icons/Business Catalyst.png
rename to src/drivers/webextension/images/icons/Business Catalyst.png
diff --git a/src/icons/BuySellAds.png b/src/drivers/webextension/images/icons/BuySellAds.png
similarity index 100%
rename from src/icons/BuySellAds.png
rename to src/drivers/webextension/images/icons/BuySellAds.png
diff --git a/src/drivers/webextension/images/icons/CDN77.png b/src/drivers/webextension/images/icons/CDN77.png
new file mode 100644
index 0000000000000000000000000000000000000000..6facf1697bdaa76824e3f28962eec80cc731f036
Binary files /dev/null and b/src/drivers/webextension/images/icons/CDN77.png differ
diff --git a/src/icons/CFML.png b/src/drivers/webextension/images/icons/CFML.png
similarity index 100%
rename from src/icons/CFML.png
rename to src/drivers/webextension/images/icons/CFML.png
diff --git a/src/icons/CKEditor.png b/src/drivers/webextension/images/icons/CKEditor.png
similarity index 100%
rename from src/icons/CKEditor.png
rename to src/drivers/webextension/images/icons/CKEditor.png
diff --git a/src/icons/CMS Made Simple.png b/src/drivers/webextension/images/icons/CMS Made Simple.png
similarity index 100%
rename from src/icons/CMS Made Simple.png
rename to src/drivers/webextension/images/icons/CMS Made Simple.png
diff --git a/src/icons/CPG Dragonfly.png b/src/drivers/webextension/images/icons/CPG Dragonfly.png
similarity index 100%
rename from src/icons/CPG Dragonfly.png
rename to src/drivers/webextension/images/icons/CPG Dragonfly.png
diff --git a/src/icons/CS Cart.png b/src/drivers/webextension/images/icons/CS Cart.png
similarity index 100%
rename from src/icons/CS Cart.png
rename to src/drivers/webextension/images/icons/CS Cart.png
diff --git a/src/icons/CacheFly.png b/src/drivers/webextension/images/icons/CacheFly.png
similarity index 100%
rename from src/icons/CacheFly.png
rename to src/drivers/webextension/images/icons/CacheFly.png
diff --git a/src/drivers/webextension/images/icons/Cafe24.png b/src/drivers/webextension/images/icons/Cafe24.png
new file mode 100644
index 0000000000000000000000000000000000000000..e2181f584766a43870a48f964aff72af35eafe8f
Binary files /dev/null and b/src/drivers/webextension/images/icons/Cafe24.png differ
diff --git a/src/icons/CakePHP.png b/src/drivers/webextension/images/icons/CakePHP.png
similarity index 100%
rename from src/icons/CakePHP.png
rename to src/drivers/webextension/images/icons/CakePHP.png
diff --git a/src/icons/Captch Me.svg b/src/drivers/webextension/images/icons/Captch Me.svg
similarity index 100%
rename from src/icons/Captch Me.svg
rename to src/drivers/webextension/images/icons/Captch Me.svg
diff --git a/src/icons/Carbon Ads.png b/src/drivers/webextension/images/icons/Carbon Ads.png
similarity index 100%
rename from src/icons/Carbon Ads.png
rename to src/drivers/webextension/images/icons/Carbon Ads.png
diff --git a/src/icons/Cargo.png b/src/drivers/webextension/images/icons/Cargo.png
similarity index 100%
rename from src/icons/Cargo.png
rename to src/drivers/webextension/images/icons/Cargo.png
diff --git a/src/drivers/webextension/images/icons/Cart-generic.svg b/src/drivers/webextension/images/icons/Cart-generic.svg
new file mode 100644
index 0000000000000000000000000000000000000000..3c3b4ab7577a485e84a237363fb8b5e0ce67158d
--- /dev/null
+++ b/src/drivers/webextension/images/icons/Cart-generic.svg
@@ -0,0 +1,5 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/src/icons/Catberry.js.png b/src/drivers/webextension/images/icons/Catberry.js.png
similarity index 100%
rename from src/icons/Catberry.js.png
rename to src/drivers/webextension/images/icons/Catberry.js.png
diff --git a/src/drivers/webextension/images/icons/Cecil.png b/src/drivers/webextension/images/icons/Cecil.png
new file mode 100644
index 0000000000000000000000000000000000000000..1bd592ccc1ab30500fdc45153425ed9a139938ab
Binary files /dev/null and b/src/drivers/webextension/images/icons/Cecil.png differ
diff --git a/src/icons/CentOS.png b/src/drivers/webextension/images/icons/CentOS.png
similarity index 100%
rename from src/icons/CentOS.png
rename to src/drivers/webextension/images/icons/CentOS.png
diff --git a/src/drivers/webextension/images/icons/Ceres.svg b/src/drivers/webextension/images/icons/Ceres.svg
new file mode 100644
index 0000000000000000000000000000000000000000..62b4af872c77c7ee4653b67df2d079036e0a623b
--- /dev/null
+++ b/src/drivers/webextension/images/icons/Ceres.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/icons/Chamilo.png b/src/drivers/webextension/images/icons/Chamilo.png
similarity index 100%
rename from src/icons/Chamilo.png
rename to src/drivers/webextension/images/icons/Chamilo.png
diff --git a/src/icons/Chart.js.svg b/src/drivers/webextension/images/icons/Chart.js.svg
similarity index 100%
rename from src/icons/Chart.js.svg
rename to src/drivers/webextension/images/icons/Chart.js.svg
diff --git a/src/icons/Chartbeat.png b/src/drivers/webextension/images/icons/Chartbeat.png
similarity index 100%
rename from src/icons/Chartbeat.png
rename to src/drivers/webextension/images/icons/Chartbeat.png
diff --git a/src/icons/Cherokee.png b/src/drivers/webextension/images/icons/Cherokee.png
similarity index 100%
rename from src/icons/Cherokee.png
rename to src/drivers/webextension/images/icons/Cherokee.png
diff --git a/src/icons/CherryPy.png b/src/drivers/webextension/images/icons/CherryPy.png
similarity index 100%
rename from src/icons/CherryPy.png
rename to src/drivers/webextension/images/icons/CherryPy.png
diff --git a/src/icons/Chitika.png b/src/drivers/webextension/images/icons/Chitika.png
similarity index 100%
rename from src/icons/Chitika.png
rename to src/drivers/webextension/images/icons/Chitika.png
diff --git a/src/drivers/webextension/images/icons/Chorus.png b/src/drivers/webextension/images/icons/Chorus.png
new file mode 100644
index 0000000000000000000000000000000000000000..008f9118593e0e9ecefe74adfeb21ca0e6a20e60
Binary files /dev/null and b/src/drivers/webextension/images/icons/Chorus.png differ
diff --git a/src/icons/Ckan.png b/src/drivers/webextension/images/icons/Ckan.png
similarity index 100%
rename from src/icons/Ckan.png
rename to src/drivers/webextension/images/icons/Ckan.png
diff --git a/src/drivers/webextension/images/icons/ClickFunnels.png b/src/drivers/webextension/images/icons/ClickFunnels.png
new file mode 100644
index 0000000000000000000000000000000000000000..2645bb6339bf6cf6b9369f21ec280f10e8e7419f
Binary files /dev/null and b/src/drivers/webextension/images/icons/ClickFunnels.png differ
diff --git a/src/icons/ClickHeat.png b/src/drivers/webextension/images/icons/ClickHeat.png
similarity index 100%
rename from src/icons/ClickHeat.png
rename to src/drivers/webextension/images/icons/ClickHeat.png
diff --git a/src/icons/ClickTale.png b/src/drivers/webextension/images/icons/ClickTale.png
similarity index 100%
rename from src/icons/ClickTale.png
rename to src/drivers/webextension/images/icons/ClickTale.png
diff --git a/src/icons/Clicky.png b/src/drivers/webextension/images/icons/Clicky.png
similarity index 100%
rename from src/icons/Clicky.png
rename to src/drivers/webextension/images/icons/Clicky.png
diff --git a/src/icons/Clientexec.png b/src/drivers/webextension/images/icons/Clientexec.png
similarity index 100%
rename from src/icons/Clientexec.png
rename to src/drivers/webextension/images/icons/Clientexec.png
diff --git a/src/icons/Clipboard.js.svg b/src/drivers/webextension/images/icons/Clipboard.js.svg
similarity index 100%
rename from src/icons/Clipboard.js.svg
rename to src/drivers/webextension/images/icons/Clipboard.js.svg
diff --git a/src/icons/CloudFlare.svg b/src/drivers/webextension/images/icons/CloudFlare.svg
similarity index 100%
rename from src/icons/CloudFlare.svg
rename to src/drivers/webextension/images/icons/CloudFlare.svg
diff --git a/src/drivers/webextension/images/icons/CloudSuite.svg b/src/drivers/webextension/images/icons/CloudSuite.svg
new file mode 100644
index 0000000000000000000000000000000000000000..44b0b02d47ad0407302a4b85a02afae1705b7e2a
--- /dev/null
+++ b/src/drivers/webextension/images/icons/CloudSuite.svg
@@ -0,0 +1,13 @@
+
+
+
+ cloudsuite-logo-rgb
+ Created with Sketch.
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/icons/Cloudera.png b/src/drivers/webextension/images/icons/Cloudera.png
similarity index 100%
rename from src/icons/Cloudera.png
rename to src/drivers/webextension/images/icons/Cloudera.png
diff --git a/src/icons/CodeIgniter.png b/src/drivers/webextension/images/icons/CodeIgniter.png
similarity index 100%
rename from src/icons/CodeIgniter.png
rename to src/drivers/webextension/images/icons/CodeIgniter.png
diff --git a/src/icons/CodeMirror.png b/src/drivers/webextension/images/icons/CodeMirror.png
similarity index 100%
rename from src/icons/CodeMirror.png
rename to src/drivers/webextension/images/icons/CodeMirror.png
diff --git a/src/icons/CoinHive.svg b/src/drivers/webextension/images/icons/CoinHive.svg
similarity index 100%
rename from src/icons/CoinHive.svg
rename to src/drivers/webextension/images/icons/CoinHive.svg
diff --git a/src/icons/Comandia.svg b/src/drivers/webextension/images/icons/Comandia.svg
similarity index 100%
rename from src/icons/Comandia.svg
rename to src/drivers/webextension/images/icons/Comandia.svg
diff --git a/src/drivers/webextension/images/icons/Combeenation.png b/src/drivers/webextension/images/icons/Combeenation.png
new file mode 100644
index 0000000000000000000000000000000000000000..547bdfa0f5d17f12ae2e8c98963ff581d07ecc03
Binary files /dev/null and b/src/drivers/webextension/images/icons/Combeenation.png differ
diff --git a/src/icons/Commerce Server.png b/src/drivers/webextension/images/icons/Commerce Server.png
similarity index 100%
rename from src/icons/Commerce Server.png
rename to src/drivers/webextension/images/icons/Commerce Server.png
diff --git a/src/icons/Concrete5.png b/src/drivers/webextension/images/icons/Concrete5.png
similarity index 100%
rename from src/icons/Concrete5.png
rename to src/drivers/webextension/images/icons/Concrete5.png
diff --git a/src/icons/Contao.png b/src/drivers/webextension/images/icons/Contao.png
similarity index 100%
rename from src/icons/Contao.png
rename to src/drivers/webextension/images/icons/Contao.png
diff --git a/src/icons/Contenido.png b/src/drivers/webextension/images/icons/Contenido.png
similarity index 100%
rename from src/icons/Contenido.png
rename to src/drivers/webextension/images/icons/Contenido.png
diff --git a/src/icons/Contensis.png b/src/drivers/webextension/images/icons/Contensis.png
similarity index 100%
rename from src/icons/Contensis.png
rename to src/drivers/webextension/images/icons/Contensis.png
diff --git a/src/icons/ContentBox.png b/src/drivers/webextension/images/icons/ContentBox.png
similarity index 100%
rename from src/icons/ContentBox.png
rename to src/drivers/webextension/images/icons/ContentBox.png
diff --git a/src/icons/Contentful.svg b/src/drivers/webextension/images/icons/Contentful.svg
similarity index 100%
rename from src/icons/Contentful.svg
rename to src/drivers/webextension/images/icons/Contentful.svg
diff --git a/src/icons/ConversionLab.png b/src/drivers/webextension/images/icons/ConversionLab.png
similarity index 100%
rename from src/icons/ConversionLab.png
rename to src/drivers/webextension/images/icons/ConversionLab.png
diff --git a/src/drivers/webextension/images/icons/CookieHub.png b/src/drivers/webextension/images/icons/CookieHub.png
new file mode 100644
index 0000000000000000000000000000000000000000..99c96da7b6d2d7be121a7bc8648de0f06bc88bec
Binary files /dev/null and b/src/drivers/webextension/images/icons/CookieHub.png differ
diff --git a/src/drivers/webextension/images/icons/CookieScript.png b/src/drivers/webextension/images/icons/CookieScript.png
new file mode 100644
index 0000000000000000000000000000000000000000..0c5b0e925c3a98fd359febc74495e7a824cdd955
Binary files /dev/null and b/src/drivers/webextension/images/icons/CookieScript.png differ
diff --git a/src/drivers/webextension/images/icons/Cookiebot.svg b/src/drivers/webextension/images/icons/Cookiebot.svg
new file mode 100644
index 0000000000000000000000000000000000000000..c6acb47bdb80faa801bbc6676d4d956eb83ca92f
--- /dev/null
+++ b/src/drivers/webextension/images/icons/Cookiebot.svg
@@ -0,0 +1,19 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/icons/Coppermine.png b/src/drivers/webextension/images/icons/Coppermine.png
similarity index 100%
rename from src/icons/Coppermine.png
rename to src/drivers/webextension/images/icons/Coppermine.png
diff --git a/src/icons/Cosmoshop.png b/src/drivers/webextension/images/icons/Cosmoshop.png
similarity index 100%
rename from src/icons/Cosmoshop.png
rename to src/drivers/webextension/images/icons/Cosmoshop.png
diff --git a/src/icons/Cotonti.png b/src/drivers/webextension/images/icons/Cotonti.png
similarity index 100%
rename from src/icons/Cotonti.png
rename to src/drivers/webextension/images/icons/Cotonti.png
diff --git a/src/icons/CouchDB.png b/src/drivers/webextension/images/icons/CouchDB.png
similarity index 100%
rename from src/icons/CouchDB.png
rename to src/drivers/webextension/images/icons/CouchDB.png
diff --git a/src/drivers/webextension/images/icons/Countly.png b/src/drivers/webextension/images/icons/Countly.png
new file mode 100644
index 0000000000000000000000000000000000000000..1b3c193608097c77fa2baf641544281288c16742
Binary files /dev/null and b/src/drivers/webextension/images/icons/Countly.png differ
diff --git a/src/icons/Cowboy.png b/src/drivers/webextension/images/icons/Cowboy.png
similarity index 100%
rename from src/icons/Cowboy.png
rename to src/drivers/webextension/images/icons/Cowboy.png
diff --git a/src/icons/CppCMS.png b/src/drivers/webextension/images/icons/CppCMS.png
similarity index 100%
rename from src/icons/CppCMS.png
rename to src/drivers/webextension/images/icons/CppCMS.png
diff --git a/src/drivers/webextension/images/icons/Craft CMS.svg b/src/drivers/webextension/images/icons/Craft CMS.svg
new file mode 100644
index 0000000000000000000000000000000000000000..7e83d400a0b1333016d6d62daf6bd75f9b904912
--- /dev/null
+++ b/src/drivers/webextension/images/icons/Craft CMS.svg
@@ -0,0 +1,12 @@
+
+
+
+
+
+
diff --git a/src/icons/Crazy Egg.png b/src/drivers/webextension/images/icons/Crazy Egg.png
similarity index 100%
rename from src/icons/Crazy Egg.png
rename to src/drivers/webextension/images/icons/Crazy Egg.png
diff --git a/src/icons/Criteo.svg b/src/drivers/webextension/images/icons/Criteo.svg
similarity index 100%
rename from src/icons/Criteo.svg
rename to src/drivers/webextension/images/icons/Criteo.svg
diff --git a/src/icons/Cross Pixel.png b/src/drivers/webextension/images/icons/Cross Pixel.png
similarity index 100%
rename from src/icons/Cross Pixel.png
rename to src/drivers/webextension/images/icons/Cross Pixel.png
diff --git a/src/drivers/webextension/images/icons/CrossBox.png b/src/drivers/webextension/images/icons/CrossBox.png
new file mode 100644
index 0000000000000000000000000000000000000000..1cd838e64c5e8d61dfac8f4305d0e59ceba86a7c
Binary files /dev/null and b/src/drivers/webextension/images/icons/CrossBox.png differ
diff --git a/src/drivers/webextension/images/icons/Crownpeak.png b/src/drivers/webextension/images/icons/Crownpeak.png
new file mode 100644
index 0000000000000000000000000000000000000000..4b80de9df468ec606f501c4f57451c515e7935a4
Binary files /dev/null and b/src/drivers/webextension/images/icons/Crownpeak.png differ
diff --git a/src/icons/Crypto-Loot.png b/src/drivers/webextension/images/icons/Crypto-Loot.png
similarity index 100%
rename from src/icons/Crypto-Loot.png
rename to src/drivers/webextension/images/icons/Crypto-Loot.png
diff --git a/src/icons/CubeCart.png b/src/drivers/webextension/images/icons/CubeCart.png
similarity index 100%
rename from src/icons/CubeCart.png
rename to src/drivers/webextension/images/icons/CubeCart.png
diff --git a/src/icons/Cufon.png b/src/drivers/webextension/images/icons/Cufon.png
similarity index 100%
rename from src/icons/Cufon.png
rename to src/drivers/webextension/images/icons/Cufon.png
diff --git a/src/icons/D3.png b/src/drivers/webextension/images/icons/D3.png
similarity index 100%
rename from src/icons/D3.png
rename to src/drivers/webextension/images/icons/D3.png
diff --git a/src/icons/DHTMLX.png b/src/drivers/webextension/images/icons/DHTMLX.png
similarity index 100%
rename from src/icons/DHTMLX.png
rename to src/drivers/webextension/images/icons/DHTMLX.png
diff --git a/src/icons/DM Polopoly.png b/src/drivers/webextension/images/icons/DM Polopoly.png
similarity index 100%
rename from src/icons/DM Polopoly.png
rename to src/drivers/webextension/images/icons/DM Polopoly.png
diff --git a/src/icons/DNN.png b/src/drivers/webextension/images/icons/DNN.png
similarity index 100%
rename from src/icons/DNN.png
rename to src/drivers/webextension/images/icons/DNN.png
diff --git a/src/icons/DTG.png b/src/drivers/webextension/images/icons/DTG.png
similarity index 100%
rename from src/icons/DTG.png
rename to src/drivers/webextension/images/icons/DTG.png
diff --git a/src/icons/Dancer.png b/src/drivers/webextension/images/icons/Dancer.png
similarity index 100%
rename from src/icons/Dancer.png
rename to src/drivers/webextension/images/icons/Dancer.png
diff --git a/src/icons/Danneo CMS.png b/src/drivers/webextension/images/icons/Danneo CMS.png
similarity index 100%
rename from src/icons/Danneo CMS.png
rename to src/drivers/webextension/images/icons/Danneo CMS.png
diff --git a/src/icons/Dart.svg b/src/drivers/webextension/images/icons/Dart.svg
similarity index 100%
rename from src/icons/Dart.svg
rename to src/drivers/webextension/images/icons/Dart.svg
diff --git a/src/icons/DataLife Engine.png b/src/drivers/webextension/images/icons/DataLife Engine.png
similarity index 100%
rename from src/icons/DataLife Engine.png
rename to src/drivers/webextension/images/icons/DataLife Engine.png
diff --git a/src/drivers/webextension/images/icons/DataPower.png b/src/drivers/webextension/images/icons/DataPower.png
new file mode 100644
index 0000000000000000000000000000000000000000..f722c239e51f8e3ac5cf8769721589bc6c83f3e4
Binary files /dev/null and b/src/drivers/webextension/images/icons/DataPower.png differ
diff --git a/src/icons/DataTables.png b/src/drivers/webextension/images/icons/DataTables.png
similarity index 100%
rename from src/icons/DataTables.png
rename to src/drivers/webextension/images/icons/DataTables.png
diff --git a/src/icons/Day.js.svg b/src/drivers/webextension/images/icons/Day.js.svg
similarity index 100%
rename from src/icons/Day.js.svg
rename to src/drivers/webextension/images/icons/Day.js.svg
diff --git a/src/icons/Debian.png b/src/drivers/webextension/images/icons/Debian.png
similarity index 100%
rename from src/icons/Debian.png
rename to src/drivers/webextension/images/icons/Debian.png
diff --git a/src/icons/DedeCMS.png b/src/drivers/webextension/images/icons/DedeCMS.png
similarity index 100%
rename from src/icons/DedeCMS.png
rename to src/drivers/webextension/images/icons/DedeCMS.png
diff --git a/src/drivers/webextension/images/icons/DerakCloud.png b/src/drivers/webextension/images/icons/DerakCloud.png
new file mode 100644
index 0000000000000000000000000000000000000000..5a4fdf3498828a9c90043a201c24b1ba69bb7850
Binary files /dev/null and b/src/drivers/webextension/images/icons/DerakCloud.png differ
diff --git a/src/icons/DirectAdmin.png b/src/drivers/webextension/images/icons/DirectAdmin.png
similarity index 100%
rename from src/icons/DirectAdmin.png
rename to src/drivers/webextension/images/icons/DirectAdmin.png
diff --git a/src/icons/Discourse.png b/src/drivers/webextension/images/icons/Discourse.png
similarity index 100%
rename from src/icons/Discourse.png
rename to src/drivers/webextension/images/icons/Discourse.png
diff --git a/src/icons/Discuz X.png b/src/drivers/webextension/images/icons/Discuz X.png
similarity index 100%
rename from src/icons/Discuz X.png
rename to src/drivers/webextension/images/icons/Discuz X.png
diff --git a/src/icons/Disqus.svg b/src/drivers/webextension/images/icons/Disqus.svg
similarity index 100%
rename from src/icons/Disqus.svg
rename to src/drivers/webextension/images/icons/Disqus.svg
diff --git a/src/icons/Django.png b/src/drivers/webextension/images/icons/Django.png
similarity index 100%
rename from src/icons/Django.png
rename to src/drivers/webextension/images/icons/Django.png
diff --git a/src/icons/Docker.svg b/src/drivers/webextension/images/icons/Docker.svg
similarity index 100%
rename from src/icons/Docker.svg
rename to src/drivers/webextension/images/icons/Docker.svg
diff --git a/src/icons/Dojo.png b/src/drivers/webextension/images/icons/Dojo.png
similarity index 100%
rename from src/icons/Dojo.png
rename to src/drivers/webextension/images/icons/Dojo.png
diff --git a/src/icons/Dokeos.png b/src/drivers/webextension/images/icons/Dokeos.png
similarity index 100%
rename from src/icons/Dokeos.png
rename to src/drivers/webextension/images/icons/Dokeos.png
diff --git a/src/icons/DokuWiki.png b/src/drivers/webextension/images/icons/DokuWiki.png
similarity index 100%
rename from src/icons/DokuWiki.png
rename to src/drivers/webextension/images/icons/DokuWiki.png
diff --git a/src/icons/Dotclear.png b/src/drivers/webextension/images/icons/Dotclear.png
similarity index 100%
rename from src/icons/Dotclear.png
rename to src/drivers/webextension/images/icons/Dotclear.png
diff --git a/src/icons/DoubleClick.svg b/src/drivers/webextension/images/icons/DoubleClick.svg
similarity index 100%
rename from src/icons/DoubleClick.svg
rename to src/drivers/webextension/images/icons/DoubleClick.svg
diff --git a/src/icons/DovetailWRP.png b/src/drivers/webextension/images/icons/DovetailWRP.png
similarity index 100%
rename from src/icons/DovetailWRP.png
rename to src/drivers/webextension/images/icons/DovetailWRP.png
diff --git a/src/icons/Doxygen.png b/src/drivers/webextension/images/icons/Doxygen.png
similarity index 100%
rename from src/icons/Doxygen.png
rename to src/drivers/webextension/images/icons/Doxygen.png
diff --git a/src/icons/DreamWeaver.png b/src/drivers/webextension/images/icons/DreamWeaver.png
similarity index 100%
rename from src/icons/DreamWeaver.png
rename to src/drivers/webextension/images/icons/DreamWeaver.png
diff --git a/src/icons/Drupal Commerce.png b/src/drivers/webextension/images/icons/Drupal Commerce.png
similarity index 100%
rename from src/icons/Drupal Commerce.png
rename to src/drivers/webextension/images/icons/Drupal Commerce.png
diff --git a/src/drivers/webextension/images/icons/Drupal.svg b/src/drivers/webextension/images/icons/Drupal.svg
new file mode 100644
index 0000000000000000000000000000000000000000..1f2b53388140f81c10c8ed00b5b54f5c4e77bc5e
--- /dev/null
+++ b/src/drivers/webextension/images/icons/Drupal.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/src/icons/Dynamicweb.png b/src/drivers/webextension/images/icons/Dynamicweb.png
similarity index 100%
rename from src/icons/Dynamicweb.png
rename to src/drivers/webextension/images/icons/Dynamicweb.png
diff --git a/src/icons/Dynatrace.png b/src/drivers/webextension/images/icons/Dynatrace.png
similarity index 100%
rename from src/icons/Dynatrace.png
rename to src/drivers/webextension/images/icons/Dynatrace.png
diff --git a/src/drivers/webextension/images/icons/EKM.png b/src/drivers/webextension/images/icons/EKM.png
new file mode 100644
index 0000000000000000000000000000000000000000..c5673dbe2cf36ee618e0f8cb68d0fdb9f2564a52
Binary files /dev/null and b/src/drivers/webextension/images/icons/EKM.png differ
diff --git a/src/icons/ELOG.png b/src/drivers/webextension/images/icons/ELOG.png
similarity index 100%
rename from src/icons/ELOG.png
rename to src/drivers/webextension/images/icons/ELOG.png
diff --git a/src/icons/EPiServer.png b/src/drivers/webextension/images/icons/EPiServer.png
similarity index 100%
rename from src/icons/EPiServer.png
rename to src/drivers/webextension/images/icons/EPiServer.png
diff --git a/src/icons/EPrints.png b/src/drivers/webextension/images/icons/EPrints.png
similarity index 100%
rename from src/icons/EPrints.png
rename to src/drivers/webextension/images/icons/EPrints.png
diff --git a/src/drivers/webextension/images/icons/EasyEngine.png b/src/drivers/webextension/images/icons/EasyEngine.png
new file mode 100644
index 0000000000000000000000000000000000000000..9d861c3206e670c9f9e2a87c58f7972bccada6ba
Binary files /dev/null and b/src/drivers/webextension/images/icons/EasyEngine.png differ
diff --git a/src/icons/EdgeCast.png b/src/drivers/webextension/images/icons/EdgeCast.png
similarity index 100%
rename from src/icons/EdgeCast.png
rename to src/drivers/webextension/images/icons/EdgeCast.png
diff --git a/src/icons/Elcodi.png b/src/drivers/webextension/images/icons/Elcodi.png
similarity index 100%
rename from src/icons/Elcodi.png
rename to src/drivers/webextension/images/icons/Elcodi.png
diff --git a/src/icons/Eleanor CMS.png b/src/drivers/webextension/images/icons/Eleanor CMS.png
similarity index 100%
rename from src/icons/Eleanor CMS.png
rename to src/drivers/webextension/images/icons/Eleanor CMS.png
diff --git a/src/icons/ElementUI.svg b/src/drivers/webextension/images/icons/ElementUI.svg
similarity index 100%
rename from src/icons/ElementUI.svg
rename to src/drivers/webextension/images/icons/ElementUI.svg
diff --git a/src/drivers/webextension/images/icons/Elementor.png b/src/drivers/webextension/images/icons/Elementor.png
new file mode 100644
index 0000000000000000000000000000000000000000..817059c9f6a8db45f5e655ee3a4fd319e703d9d5
Binary files /dev/null and b/src/drivers/webextension/images/icons/Elementor.png differ
diff --git a/src/icons/Embedthis.png b/src/drivers/webextension/images/icons/Embedthis.png
similarity index 100%
rename from src/icons/Embedthis.png
rename to src/drivers/webextension/images/icons/Embedthis.png
diff --git a/src/icons/Ember.js.png b/src/drivers/webextension/images/icons/Ember.js.png
similarity index 100%
rename from src/icons/Ember.js.png
rename to src/drivers/webextension/images/icons/Ember.js.png
diff --git a/src/icons/Envoy.png b/src/drivers/webextension/images/icons/Envoy.png
similarity index 100%
rename from src/icons/Envoy.png
rename to src/drivers/webextension/images/icons/Envoy.png
diff --git a/src/icons/Enyo.png b/src/drivers/webextension/images/icons/Enyo.png
similarity index 100%
rename from src/icons/Enyo.png
rename to src/drivers/webextension/images/icons/Enyo.png
diff --git a/src/icons/Epom.png b/src/drivers/webextension/images/icons/Epom.png
similarity index 100%
rename from src/icons/Epom.png
rename to src/drivers/webextension/images/icons/Epom.png
diff --git a/src/drivers/webextension/images/icons/EqualWeb.png b/src/drivers/webextension/images/icons/EqualWeb.png
new file mode 100644
index 0000000000000000000000000000000000000000..6a942d08cbaff4ccf6fecee28c373aba7095e869
Binary files /dev/null and b/src/drivers/webextension/images/icons/EqualWeb.png differ
diff --git a/src/icons/Erlang.png b/src/drivers/webextension/images/icons/Erlang.png
similarity index 100%
rename from src/icons/Erlang.png
rename to src/drivers/webextension/images/icons/Erlang.png
diff --git a/src/icons/Exhibit.png b/src/drivers/webextension/images/icons/Exhibit.png
similarity index 100%
rename from src/icons/Exhibit.png
rename to src/drivers/webextension/images/icons/Exhibit.png
diff --git a/src/drivers/webextension/images/icons/ExpertRec.png b/src/drivers/webextension/images/icons/ExpertRec.png
new file mode 100644
index 0000000000000000000000000000000000000000..2d15f2845c5c0a0d0ab37251ac3fa6f6528fc68f
Binary files /dev/null and b/src/drivers/webextension/images/icons/ExpertRec.png differ
diff --git a/src/drivers/webextension/images/icons/Express.png b/src/drivers/webextension/images/icons/Express.png
new file mode 100644
index 0000000000000000000000000000000000000000..c1f9ad582d94dad9a902fd343c23f4f8e297cf72
Binary files /dev/null and b/src/drivers/webextension/images/icons/Express.png differ
diff --git a/src/icons/ExpressionEngine.png b/src/drivers/webextension/images/icons/ExpressionEngine.png
similarity index 100%
rename from src/icons/ExpressionEngine.png
rename to src/drivers/webextension/images/icons/ExpressionEngine.png
diff --git a/src/icons/ExtJS.png b/src/drivers/webextension/images/icons/ExtJS.png
similarity index 100%
rename from src/icons/ExtJS.png
rename to src/drivers/webextension/images/icons/ExtJS.png
diff --git a/src/drivers/webextension/images/icons/F5.png b/src/drivers/webextension/images/icons/F5.png
new file mode 100644
index 0000000000000000000000000000000000000000..ffb5a0d2ae6ee26e2c523f408a961c8cb09dd945
Binary files /dev/null and b/src/drivers/webextension/images/icons/F5.png differ
diff --git a/src/icons/FAST ESP.png b/src/drivers/webextension/images/icons/FAST ESP.png
similarity index 100%
rename from src/icons/FAST ESP.png
rename to src/drivers/webextension/images/icons/FAST ESP.png
diff --git a/src/icons/FAST Search for SharePoint.png b/src/drivers/webextension/images/icons/FAST Search for SharePoint.png
similarity index 100%
rename from src/icons/FAST Search for SharePoint.png
rename to src/drivers/webextension/images/icons/FAST Search for SharePoint.png
diff --git a/src/icons/Facebook.svg b/src/drivers/webextension/images/icons/Facebook.svg
similarity index 100%
rename from src/icons/Facebook.svg
rename to src/drivers/webextension/images/icons/Facebook.svg
diff --git a/src/drivers/webextension/images/icons/Facil-iti.png b/src/drivers/webextension/images/icons/Facil-iti.png
new file mode 100644
index 0000000000000000000000000000000000000000..8e1091214c4b05cd4169af172f502804112951b9
Binary files /dev/null and b/src/drivers/webextension/images/icons/Facil-iti.png differ
diff --git a/src/icons/Fact Finder.png b/src/drivers/webextension/images/icons/Fact Finder.png
similarity index 100%
rename from src/icons/Fact Finder.png
rename to src/drivers/webextension/images/icons/Fact Finder.png
diff --git a/src/icons/FancyBox.png b/src/drivers/webextension/images/icons/FancyBox.png
similarity index 100%
rename from src/icons/FancyBox.png
rename to src/drivers/webextension/images/icons/FancyBox.png
diff --git a/src/drivers/webextension/images/icons/FaraPy.png b/src/drivers/webextension/images/icons/FaraPy.png
new file mode 100644
index 0000000000000000000000000000000000000000..62d38b1f14505c64424e00482fb5ce0507a7a721
Binary files /dev/null and b/src/drivers/webextension/images/icons/FaraPy.png differ
diff --git a/src/drivers/webextension/images/icons/Fastcommerce.png b/src/drivers/webextension/images/icons/Fastcommerce.png
new file mode 100644
index 0000000000000000000000000000000000000000..03b85cca53855d4521224ceb0ec6f4cb6c4772aa
Binary files /dev/null and b/src/drivers/webextension/images/icons/Fastcommerce.png differ
diff --git a/src/icons/Fastly.svg b/src/drivers/webextension/images/icons/Fastly.svg
similarity index 100%
rename from src/icons/Fastly.svg
rename to src/drivers/webextension/images/icons/Fastly.svg
diff --git a/src/icons/Fat-Free Framework.png b/src/drivers/webextension/images/icons/Fat-Free Framework.png
similarity index 100%
rename from src/icons/Fat-Free Framework.png
rename to src/drivers/webextension/images/icons/Fat-Free Framework.png
diff --git a/src/drivers/webextension/images/icons/Fbits.png b/src/drivers/webextension/images/icons/Fbits.png
new file mode 100644
index 0000000000000000000000000000000000000000..d4e5e1215fd67481516d0d572686bf9a34946bf5
Binary files /dev/null and b/src/drivers/webextension/images/icons/Fbits.png differ
diff --git a/src/icons/Fedora.png b/src/drivers/webextension/images/icons/Fedora.png
similarity index 100%
rename from src/icons/Fedora.png
rename to src/drivers/webextension/images/icons/Fedora.png
diff --git a/src/icons/Firebase.png b/src/drivers/webextension/images/icons/Firebase.png
similarity index 100%
rename from src/icons/Firebase.png
rename to src/drivers/webextension/images/icons/Firebase.png
diff --git a/src/icons/Fireblade.png b/src/drivers/webextension/images/icons/Fireblade.png
similarity index 100%
rename from src/icons/Fireblade.png
rename to src/drivers/webextension/images/icons/Fireblade.png
diff --git a/src/icons/Flask.png b/src/drivers/webextension/images/icons/Flask.png
similarity index 100%
rename from src/icons/Flask.png
rename to src/drivers/webextension/images/icons/Flask.png
diff --git a/src/drivers/webextension/images/icons/Flat UI.png b/src/drivers/webextension/images/icons/Flat UI.png
new file mode 100644
index 0000000000000000000000000000000000000000..fa1f8661864894ce8d7bf06a44ebdb66d4e519c6
Binary files /dev/null and b/src/drivers/webextension/images/icons/Flat UI.png differ
diff --git a/src/icons/FlexCMP.png b/src/drivers/webextension/images/icons/FlexCMP.png
similarity index 100%
rename from src/icons/FlexCMP.png
rename to src/drivers/webextension/images/icons/FlexCMP.png
diff --git a/src/icons/FlexSlider.png b/src/drivers/webextension/images/icons/FlexSlider.png
similarity index 100%
rename from src/icons/FlexSlider.png
rename to src/drivers/webextension/images/icons/FlexSlider.png
diff --git a/src/icons/FluxBB.png b/src/drivers/webextension/images/icons/FluxBB.png
similarity index 100%
rename from src/icons/FluxBB.png
rename to src/drivers/webextension/images/icons/FluxBB.png
diff --git a/src/icons/Flyspray.png b/src/drivers/webextension/images/icons/Flyspray.png
similarity index 100%
rename from src/icons/Flyspray.png
rename to src/drivers/webextension/images/icons/Flyspray.png
diff --git a/src/icons/ForkCMS.png b/src/drivers/webextension/images/icons/ForkCMS.png
similarity index 100%
rename from src/icons/ForkCMS.png
rename to src/drivers/webextension/images/icons/ForkCMS.png
diff --git a/src/drivers/webextension/images/icons/ForoshGostar.svg b/src/drivers/webextension/images/icons/ForoshGostar.svg
new file mode 100644
index 0000000000000000000000000000000000000000..c97a6fa7be158f19ed388a8c56be193fc8905c23
--- /dev/null
+++ b/src/drivers/webextension/images/icons/ForoshGostar.svg
@@ -0,0 +1,91 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/icons/Fortune3.png b/src/drivers/webextension/images/icons/Fortune3.png
similarity index 100%
rename from src/icons/Fortune3.png
rename to src/drivers/webextension/images/icons/Fortune3.png
diff --git a/src/icons/FreeBSD.png b/src/drivers/webextension/images/icons/FreeBSD.png
similarity index 100%
rename from src/icons/FreeBSD.png
rename to src/drivers/webextension/images/icons/FreeBSD.png
diff --git a/src/icons/FreeTextBox.png b/src/drivers/webextension/images/icons/FreeTextBox.png
similarity index 100%
rename from src/icons/FreeTextBox.png
rename to src/drivers/webextension/images/icons/FreeTextBox.png
diff --git a/src/icons/Freespee.svg b/src/drivers/webextension/images/icons/Freespee.svg
similarity index 100%
rename from src/icons/Freespee.svg
rename to src/drivers/webextension/images/icons/Freespee.svg
diff --git a/src/icons/Froala.svg b/src/drivers/webextension/images/icons/Froala.svg
similarity index 100%
rename from src/icons/Froala.svg
rename to src/drivers/webextension/images/icons/Froala.svg
diff --git a/src/icons/FrontPage.png b/src/drivers/webextension/images/icons/FrontPage.png
similarity index 100%
rename from src/icons/FrontPage.png
rename to src/drivers/webextension/images/icons/FrontPage.png
diff --git a/src/icons/Fusion Ads.png b/src/drivers/webextension/images/icons/Fusion Ads.png
similarity index 100%
rename from src/icons/Fusion Ads.png
rename to src/drivers/webextension/images/icons/Fusion Ads.png
diff --git a/src/icons/G-WAN.png b/src/drivers/webextension/images/icons/G-WAN.png
similarity index 100%
rename from src/icons/G-WAN.png
rename to src/drivers/webextension/images/icons/G-WAN.png
diff --git a/src/icons/GX WebManager.png b/src/drivers/webextension/images/icons/GX WebManager.png
similarity index 100%
rename from src/icons/GX WebManager.png
rename to src/drivers/webextension/images/icons/GX WebManager.png
diff --git a/src/icons/Gallery.png b/src/drivers/webextension/images/icons/Gallery.png
similarity index 100%
rename from src/icons/Gallery.png
rename to src/drivers/webextension/images/icons/Gallery.png
diff --git a/src/icons/Gambio.png b/src/drivers/webextension/images/icons/Gambio.png
similarity index 100%
rename from src/icons/Gambio.png
rename to src/drivers/webextension/images/icons/Gambio.png
diff --git a/src/icons/Gatsby.svg b/src/drivers/webextension/images/icons/Gatsby.svg
similarity index 100%
rename from src/icons/Gatsby.svg
rename to src/drivers/webextension/images/icons/Gatsby.svg
diff --git a/src/icons/Gauges.png b/src/drivers/webextension/images/icons/Gauges.png
similarity index 100%
rename from src/icons/Gauges.png
rename to src/drivers/webextension/images/icons/Gauges.png
diff --git a/src/drivers/webextension/images/icons/Gemius.png b/src/drivers/webextension/images/icons/Gemius.png
new file mode 100644
index 0000000000000000000000000000000000000000..80fc23415a875b8e0ddd6f08be3e1208a8521037
Binary files /dev/null and b/src/drivers/webextension/images/icons/Gemius.png differ
diff --git a/src/drivers/webextension/images/icons/GeneXus.png b/src/drivers/webextension/images/icons/GeneXus.png
new file mode 100644
index 0000000000000000000000000000000000000000..574790d54bd7e6e04369820e1945c9658505d35a
Binary files /dev/null and b/src/drivers/webextension/images/icons/GeneXus.png differ
diff --git a/src/icons/Gentoo.png b/src/drivers/webextension/images/icons/Gentoo.png
similarity index 100%
rename from src/icons/Gentoo.png
rename to src/drivers/webextension/images/icons/Gentoo.png
diff --git a/src/icons/Get Satisfaction.png b/src/drivers/webextension/images/icons/Get Satisfaction.png
similarity index 100%
rename from src/icons/Get Satisfaction.png
rename to src/drivers/webextension/images/icons/Get Satisfaction.png
diff --git a/src/icons/GetSimple CMS.png b/src/drivers/webextension/images/icons/GetSimple CMS.png
similarity index 100%
rename from src/icons/GetSimple CMS.png
rename to src/drivers/webextension/images/icons/GetSimple CMS.png
diff --git a/src/icons/Ghost.png b/src/drivers/webextension/images/icons/Ghost.png
similarity index 100%
rename from src/icons/Ghost.png
rename to src/drivers/webextension/images/icons/Ghost.png
diff --git a/src/icons/GitBook.png b/src/drivers/webextension/images/icons/GitBook.png
similarity index 100%
rename from src/icons/GitBook.png
rename to src/drivers/webextension/images/icons/GitBook.png
diff --git a/src/icons/GitHub.svg b/src/drivers/webextension/images/icons/GitHub.svg
similarity index 100%
rename from src/icons/GitHub.svg
rename to src/drivers/webextension/images/icons/GitHub.svg
diff --git a/src/icons/GitLab CI.png b/src/drivers/webextension/images/icons/GitLab CI.png
similarity index 100%
rename from src/icons/GitLab CI.png
rename to src/drivers/webextension/images/icons/GitLab CI.png
diff --git a/src/icons/GitLab.svg b/src/drivers/webextension/images/icons/GitLab.svg
similarity index 100%
rename from src/icons/GitLab.svg
rename to src/drivers/webextension/images/icons/GitLab.svg
diff --git a/src/icons/GlassFish.png b/src/drivers/webextension/images/icons/GlassFish.png
similarity index 100%
rename from src/icons/GlassFish.png
rename to src/drivers/webextension/images/icons/GlassFish.png
diff --git a/src/drivers/webextension/images/icons/Globale.png b/src/drivers/webextension/images/icons/Globale.png
new file mode 100644
index 0000000000000000000000000000000000000000..3e6147a8ab02a158b98c1e22479b53488d68bf6e
Binary files /dev/null and b/src/drivers/webextension/images/icons/Globale.png differ
diff --git a/src/icons/Glyphicons.png b/src/drivers/webextension/images/icons/Glyphicons.png
similarity index 100%
rename from src/icons/Glyphicons.png
rename to src/drivers/webextension/images/icons/Glyphicons.png
diff --git a/src/icons/Go.svg b/src/drivers/webextension/images/icons/Go.svg
similarity index 100%
rename from src/icons/Go.svg
rename to src/drivers/webextension/images/icons/Go.svg
diff --git a/src/icons/GoAhead.png b/src/drivers/webextension/images/icons/GoAhead.png
similarity index 100%
rename from src/icons/GoAhead.png
rename to src/drivers/webextension/images/icons/GoAhead.png
diff --git a/src/drivers/webextension/images/icons/GoCache.png b/src/drivers/webextension/images/icons/GoCache.png
new file mode 100644
index 0000000000000000000000000000000000000000..7f8c1a5f010fd0fe18128aec7e202789e5baf0fe
Binary files /dev/null and b/src/drivers/webextension/images/icons/GoCache.png differ
diff --git a/src/icons/GoJS.png b/src/drivers/webextension/images/icons/GoJS.png
similarity index 61%
rename from src/icons/GoJS.png
rename to src/drivers/webextension/images/icons/GoJS.png
index 5a91ade5468c9605aa169b6dd095499979ae846c..3f585e48e4c384705d263c2e9d2f0991029a52cf 100644
Binary files a/src/icons/GoJS.png and b/src/drivers/webextension/images/icons/GoJS.png differ
diff --git a/src/icons/GoStats.png b/src/drivers/webextension/images/icons/GoStats.png
similarity index 100%
rename from src/icons/GoStats.png
rename to src/drivers/webextension/images/icons/GoStats.png
diff --git a/src/icons/Google AdSense.svg b/src/drivers/webextension/images/icons/Google AdSense.svg
similarity index 100%
rename from src/icons/Google AdSense.svg
rename to src/drivers/webextension/images/icons/Google AdSense.svg
diff --git a/src/icons/Google Analytics.svg b/src/drivers/webextension/images/icons/Google Analytics.svg
similarity index 100%
rename from src/icons/Google Analytics.svg
rename to src/drivers/webextension/images/icons/Google Analytics.svg
diff --git a/src/icons/Google App Engine.png b/src/drivers/webextension/images/icons/Google App Engine.png
similarity index 100%
rename from src/icons/Google App Engine.png
rename to src/drivers/webextension/images/icons/Google App Engine.png
diff --git a/src/icons/Google Charts.png b/src/drivers/webextension/images/icons/Google Charts.png
similarity index 100%
rename from src/icons/Google Charts.png
rename to src/drivers/webextension/images/icons/Google Charts.png
diff --git a/src/icons/Google Font API.png b/src/drivers/webextension/images/icons/Google Font API.png
similarity index 100%
rename from src/icons/Google Font API.png
rename to src/drivers/webextension/images/icons/Google Font API.png
diff --git a/src/drivers/webextension/images/icons/Google Maps.png b/src/drivers/webextension/images/icons/Google Maps.png
new file mode 100644
index 0000000000000000000000000000000000000000..bda281d741c8ccbb08292bc5c21bdce8e18eb690
Binary files /dev/null and b/src/drivers/webextension/images/icons/Google Maps.png differ
diff --git a/src/icons/Google PageSpeed.png b/src/drivers/webextension/images/icons/Google PageSpeed.png
similarity index 100%
rename from src/icons/Google PageSpeed.png
rename to src/drivers/webextension/images/icons/Google PageSpeed.png
diff --git a/src/icons/Google Plus.svg b/src/drivers/webextension/images/icons/Google Plus.svg
similarity index 100%
rename from src/icons/Google Plus.svg
rename to src/drivers/webextension/images/icons/Google Plus.svg
diff --git a/src/drivers/webextension/images/icons/Google Sites.png b/src/drivers/webextension/images/icons/Google Sites.png
new file mode 100644
index 0000000000000000000000000000000000000000..69259cb681068558ece73d03256698eafa89f6f8
Binary files /dev/null and b/src/drivers/webextension/images/icons/Google Sites.png differ
diff --git a/src/icons/Google Tag Manager.png b/src/drivers/webextension/images/icons/Google Tag Manager.png
similarity index 100%
rename from src/icons/Google Tag Manager.png
rename to src/drivers/webextension/images/icons/Google Tag Manager.png
diff --git a/src/icons/Google Wallet.png b/src/drivers/webextension/images/icons/Google Wallet.png
similarity index 100%
rename from src/icons/Google Wallet.png
rename to src/drivers/webextension/images/icons/Google Wallet.png
diff --git a/src/icons/Google Web Toolkit.png b/src/drivers/webextension/images/icons/Google Web Toolkit.png
similarity index 100%
rename from src/icons/Google Web Toolkit.png
rename to src/drivers/webextension/images/icons/Google Web Toolkit.png
diff --git a/src/icons/Google.svg b/src/drivers/webextension/images/icons/Google.svg
similarity index 100%
rename from src/icons/Google.svg
rename to src/drivers/webextension/images/icons/Google.svg
diff --git a/src/icons/Graffiti CMS.png b/src/drivers/webextension/images/icons/Graffiti CMS.png
similarity index 100%
rename from src/icons/Graffiti CMS.png
rename to src/drivers/webextension/images/icons/Graffiti CMS.png
diff --git a/src/drivers/webextension/images/icons/GrandNode.svg b/src/drivers/webextension/images/icons/GrandNode.svg
new file mode 100644
index 0000000000000000000000000000000000000000..7b9fd2d6f0d641654faf7ad930ebbe98b393fa5b
--- /dev/null
+++ b/src/drivers/webextension/images/icons/GrandNode.svg
@@ -0,0 +1,26 @@
+
+ image/svg+xml
+
+
+ background
+
+
+
+ Layer 1
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/icons/Grav.png b/src/drivers/webextension/images/icons/Grav.png
similarity index 100%
rename from src/icons/Grav.png
rename to src/drivers/webextension/images/icons/Grav.png
diff --git a/src/icons/Gravatar.png b/src/drivers/webextension/images/icons/Gravatar.png
similarity index 100%
rename from src/icons/Gravatar.png
rename to src/drivers/webextension/images/icons/Gravatar.png
diff --git a/src/icons/Green Valley CMS.png b/src/drivers/webextension/images/icons/Green Valley CMS.png
similarity index 100%
rename from src/icons/Green Valley CMS.png
rename to src/drivers/webextension/images/icons/Green Valley CMS.png
diff --git a/src/icons/Gridsome.svg b/src/drivers/webextension/images/icons/Gridsome.svg
similarity index 100%
rename from src/icons/Gridsome.svg
rename to src/drivers/webextension/images/icons/Gridsome.svg
diff --git a/src/icons/GrowingIO.png b/src/drivers/webextension/images/icons/GrowingIO.png
similarity index 100%
rename from src/icons/GrowingIO.png
rename to src/drivers/webextension/images/icons/GrowingIO.png
diff --git a/src/icons/HERE.png b/src/drivers/webextension/images/icons/HERE.png
similarity index 100%
rename from src/icons/HERE.png
rename to src/drivers/webextension/images/icons/HERE.png
diff --git a/src/icons/HHVM.png b/src/drivers/webextension/images/icons/HHVM.png
similarity index 100%
rename from src/icons/HHVM.png
rename to src/drivers/webextension/images/icons/HHVM.png
diff --git a/src/icons/HP.svg b/src/drivers/webextension/images/icons/HP.svg
similarity index 100%
rename from src/icons/HP.svg
rename to src/drivers/webextension/images/icons/HP.svg
diff --git a/src/icons/Halo.svg b/src/drivers/webextension/images/icons/Halo.svg
similarity index 100%
rename from src/icons/Halo.svg
rename to src/drivers/webextension/images/icons/Halo.svg
diff --git a/src/icons/Hammer.js.png b/src/drivers/webextension/images/icons/Hammer.js.png
similarity index 100%
rename from src/icons/Hammer.js.png
rename to src/drivers/webextension/images/icons/Hammer.js.png
diff --git a/src/icons/Handlebars.png b/src/drivers/webextension/images/icons/Handlebars.png
similarity index 100%
rename from src/icons/Handlebars.png
rename to src/drivers/webextension/images/icons/Handlebars.png
diff --git a/src/drivers/webextension/images/icons/Haravan.png b/src/drivers/webextension/images/icons/Haravan.png
new file mode 100644
index 0000000000000000000000000000000000000000..b44cdbb2fba7a71d270a4b88bf3d0bcb88d02364
Binary files /dev/null and b/src/drivers/webextension/images/icons/Haravan.png differ
diff --git a/src/icons/Haskell.png b/src/drivers/webextension/images/icons/Haskell.png
similarity index 100%
rename from src/icons/Haskell.png
rename to src/drivers/webextension/images/icons/Haskell.png
diff --git a/src/icons/HeadJS.png b/src/drivers/webextension/images/icons/HeadJS.png
similarity index 100%
rename from src/icons/HeadJS.png
rename to src/drivers/webextension/images/icons/HeadJS.png
diff --git a/src/icons/Heap.png b/src/drivers/webextension/images/icons/Heap.png
similarity index 100%
rename from src/icons/Heap.png
rename to src/drivers/webextension/images/icons/Heap.png
diff --git a/src/icons/Hello Bar.png b/src/drivers/webextension/images/icons/Hello Bar.png
similarity index 100%
rename from src/icons/Hello Bar.png
rename to src/drivers/webextension/images/icons/Hello Bar.png
diff --git a/src/icons/Hexo.png b/src/drivers/webextension/images/icons/Hexo.png
similarity index 100%
rename from src/icons/Hexo.png
rename to src/drivers/webextension/images/icons/Hexo.png
diff --git a/src/icons/Hiawatha.png b/src/drivers/webextension/images/icons/Hiawatha.png
similarity index 100%
rename from src/icons/Hiawatha.png
rename to src/drivers/webextension/images/icons/Hiawatha.png
diff --git a/src/icons/Highcharts.png b/src/drivers/webextension/images/icons/Highcharts.png
similarity index 100%
rename from src/icons/Highcharts.png
rename to src/drivers/webextension/images/icons/Highcharts.png
diff --git a/src/icons/Highlight.js.png b/src/drivers/webextension/images/icons/Highlight.js.png
similarity index 100%
rename from src/icons/Highlight.js.png
rename to src/drivers/webextension/images/icons/Highlight.js.png
diff --git a/src/drivers/webextension/images/icons/HikeOrders.png b/src/drivers/webextension/images/icons/HikeOrders.png
new file mode 100644
index 0000000000000000000000000000000000000000..06550bc0fc71f3aa9d70cfee35edf3d2f43e2e21
Binary files /dev/null and b/src/drivers/webextension/images/icons/HikeOrders.png differ
diff --git a/src/icons/Hogan.js.png b/src/drivers/webextension/images/icons/Hogan.js.png
similarity index 100%
rename from src/icons/Hogan.js.png
rename to src/drivers/webextension/images/icons/Hogan.js.png
diff --git a/src/icons/Hotaru CMS.png b/src/drivers/webextension/images/icons/Hotaru CMS.png
similarity index 100%
rename from src/icons/Hotaru CMS.png
rename to src/drivers/webextension/images/icons/Hotaru CMS.png
diff --git a/src/icons/Hotjar.png b/src/drivers/webextension/images/icons/Hotjar.png
similarity index 100%
rename from src/icons/Hotjar.png
rename to src/drivers/webextension/images/icons/Hotjar.png
diff --git a/src/icons/HubSpot.png b/src/drivers/webextension/images/icons/HubSpot.png
similarity index 100%
rename from src/icons/HubSpot.png
rename to src/drivers/webextension/images/icons/HubSpot.png
diff --git a/src/icons/Hugo.png b/src/drivers/webextension/images/icons/Hugo.png
similarity index 100%
rename from src/icons/Hugo.png
rename to src/drivers/webextension/images/icons/Hugo.png
diff --git a/src/icons/IBM.svg b/src/drivers/webextension/images/icons/IBM.svg
similarity index 100%
rename from src/icons/IBM.svg
rename to src/drivers/webextension/images/icons/IBM.svg
diff --git a/src/icons/IIS.png b/src/drivers/webextension/images/icons/IIS.png
similarity index 100%
rename from src/icons/IIS.png
rename to src/drivers/webextension/images/icons/IIS.png
diff --git a/src/icons/INFOnline.png b/src/drivers/webextension/images/icons/INFOnline.png
similarity index 100%
rename from src/icons/INFOnline.png
rename to src/drivers/webextension/images/icons/INFOnline.png
diff --git a/src/icons/IPB.png b/src/drivers/webextension/images/icons/IPB.png
similarity index 100%
rename from src/icons/IPB.png
rename to src/drivers/webextension/images/icons/IPB.png
diff --git a/src/icons/Ideasoft.png b/src/drivers/webextension/images/icons/Ideasoft.png
similarity index 100%
rename from src/icons/Ideasoft.png
rename to src/drivers/webextension/images/icons/Ideasoft.png
diff --git a/src/icons/Immutable.js.png b/src/drivers/webextension/images/icons/Immutable.js.png
similarity index 100%
rename from src/icons/Immutable.js.png
rename to src/drivers/webextension/images/icons/Immutable.js.png
diff --git a/src/drivers/webextension/images/icons/Imperva.svg b/src/drivers/webextension/images/icons/Imperva.svg
new file mode 100644
index 0000000000000000000000000000000000000000..d00aa052f785d3b5916def6df4a1292853da30c6
--- /dev/null
+++ b/src/drivers/webextension/images/icons/Imperva.svg
@@ -0,0 +1,16 @@
+
+
+ Group
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/icons/ImpressCMS.png b/src/drivers/webextension/images/icons/ImpressCMS.png
similarity index 100%
rename from src/icons/ImpressCMS.png
rename to src/drivers/webextension/images/icons/ImpressCMS.png
diff --git a/src/icons/ImpressPages.png b/src/drivers/webextension/images/icons/ImpressPages.png
similarity index 100%
rename from src/icons/ImpressPages.png
rename to src/drivers/webextension/images/icons/ImpressPages.png
diff --git a/src/icons/Incapsula.png b/src/drivers/webextension/images/icons/Incapsula.png
similarity index 100%
rename from src/icons/Incapsula.png
rename to src/drivers/webextension/images/icons/Incapsula.png
diff --git a/src/icons/Includable.svg b/src/drivers/webextension/images/icons/Includable.svg
similarity index 100%
rename from src/icons/Includable.svg
rename to src/drivers/webextension/images/icons/Includable.svg
diff --git a/src/icons/Indico.png b/src/drivers/webextension/images/icons/Indico.png
similarity index 100%
rename from src/icons/Indico.png
rename to src/drivers/webextension/images/icons/Indico.png
diff --git a/src/icons/InfernoJS.png b/src/drivers/webextension/images/icons/InfernoJS.png
similarity index 100%
rename from src/icons/InfernoJS.png
rename to src/drivers/webextension/images/icons/InfernoJS.png
diff --git a/src/drivers/webextension/images/icons/Instabot.png b/src/drivers/webextension/images/icons/Instabot.png
new file mode 100644
index 0000000000000000000000000000000000000000..34aab6f311a2d181b1469f83f8e52d3affc4591e
Binary files /dev/null and b/src/drivers/webextension/images/icons/Instabot.png differ
diff --git a/src/icons/InstantCMS.png b/src/drivers/webextension/images/icons/InstantCMS.png
similarity index 100%
rename from src/icons/InstantCMS.png
rename to src/drivers/webextension/images/icons/InstantCMS.png
diff --git a/src/icons/Intel Active Management Technology.png b/src/drivers/webextension/images/icons/Intel Active Management Technology.png
similarity index 100%
rename from src/icons/Intel Active Management Technology.png
rename to src/drivers/webextension/images/icons/Intel Active Management Technology.png
diff --git a/src/icons/IntenseDebate.png b/src/drivers/webextension/images/icons/IntenseDebate.png
similarity index 100%
rename from src/icons/IntenseDebate.png
rename to src/drivers/webextension/images/icons/IntenseDebate.png
diff --git a/src/drivers/webextension/images/icons/Intercom.svg b/src/drivers/webextension/images/icons/Intercom.svg
new file mode 100644
index 0000000000000000000000000000000000000000..ebdeacc0576ee1069371233d56ee56e49eb505fe
--- /dev/null
+++ b/src/drivers/webextension/images/icons/Intercom.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/drivers/webextension/images/icons/Intershop.png b/src/drivers/webextension/images/icons/Intershop.png
new file mode 100644
index 0000000000000000000000000000000000000000..c32a6169a73931d763c8580898d4fe60beaf5d42
Binary files /dev/null and b/src/drivers/webextension/images/icons/Intershop.png differ
diff --git a/src/icons/Invenio.png b/src/drivers/webextension/images/icons/Invenio.png
similarity index 100%
rename from src/icons/Invenio.png
rename to src/drivers/webextension/images/icons/Invenio.png
diff --git a/src/drivers/webextension/images/icons/Ionicons.png b/src/drivers/webextension/images/icons/Ionicons.png
new file mode 100644
index 0000000000000000000000000000000000000000..e1959bfe584c50e89315e9b559b698b1ff1c269f
Binary files /dev/null and b/src/drivers/webextension/images/icons/Ionicons.png differ
diff --git a/src/drivers/webextension/images/icons/Ionos-by-1and1-logo.svg b/src/drivers/webextension/images/icons/Ionos-by-1and1-logo.svg
new file mode 100644
index 0000000000000000000000000000000000000000..60d87ec914801aa0ac2d999525845740fbee75e6
--- /dev/null
+++ b/src/drivers/webextension/images/icons/Ionos-by-1and1-logo.svg
@@ -0,0 +1,94 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/icons/JAlbum.png b/src/drivers/webextension/images/icons/JAlbum.png
similarity index 100%
rename from src/icons/JAlbum.png
rename to src/drivers/webextension/images/icons/JAlbum.png
diff --git a/src/icons/JBoss Application Server.png b/src/drivers/webextension/images/icons/JBoss Application Server.png
similarity index 100%
rename from src/icons/JBoss Application Server.png
rename to src/drivers/webextension/images/icons/JBoss Application Server.png
diff --git a/src/icons/JBoss Web.png b/src/drivers/webextension/images/icons/JBoss Web.png
similarity index 100%
rename from src/icons/JBoss Web.png
rename to src/drivers/webextension/images/icons/JBoss Web.png
diff --git a/src/icons/JET Enterprise.svg b/src/drivers/webextension/images/icons/JET Enterprise.svg
similarity index 100%
rename from src/icons/JET Enterprise.svg
rename to src/drivers/webextension/images/icons/JET Enterprise.svg
diff --git a/src/icons/JS Charts.png b/src/drivers/webextension/images/icons/JS Charts.png
similarity index 100%
rename from src/icons/JS Charts.png
rename to src/drivers/webextension/images/icons/JS Charts.png
diff --git a/src/icons/JSEcoin.png b/src/drivers/webextension/images/icons/JSEcoin.png
similarity index 100%
rename from src/icons/JSEcoin.png
rename to src/drivers/webextension/images/icons/JSEcoin.png
diff --git a/src/icons/JTL Shop.png b/src/drivers/webextension/images/icons/JTL Shop.png
similarity index 100%
rename from src/icons/JTL Shop.png
rename to src/drivers/webextension/images/icons/JTL Shop.png
diff --git a/src/icons/JahiaDX.svg b/src/drivers/webextension/images/icons/JahiaDX.svg
similarity index 100%
rename from src/icons/JahiaDX.svg
rename to src/drivers/webextension/images/icons/JahiaDX.svg
diff --git a/src/icons/Jalios.png b/src/drivers/webextension/images/icons/Jalios.png
similarity index 100%
rename from src/icons/Jalios.png
rename to src/drivers/webextension/images/icons/Jalios.png
diff --git a/src/icons/Java.png b/src/drivers/webextension/images/icons/Java.png
similarity index 100%
rename from src/icons/Java.png
rename to src/drivers/webextension/images/icons/Java.png
diff --git a/src/icons/JavaScript Infovis Toolkit.png b/src/drivers/webextension/images/icons/JavaScript Infovis Toolkit.png
similarity index 100%
rename from src/icons/JavaScript Infovis Toolkit.png
rename to src/drivers/webextension/images/icons/JavaScript Infovis Toolkit.png
diff --git a/src/icons/JavaServer Faces.png b/src/drivers/webextension/images/icons/JavaServer Faces.png
similarity index 100%
rename from src/icons/JavaServer Faces.png
rename to src/drivers/webextension/images/icons/JavaServer Faces.png
diff --git a/src/icons/Jekyll.png b/src/drivers/webextension/images/icons/Jekyll.png
similarity index 100%
rename from src/icons/Jekyll.png
rename to src/drivers/webextension/images/icons/Jekyll.png
diff --git a/src/icons/Jenkins.png b/src/drivers/webextension/images/icons/Jenkins.png
similarity index 100%
rename from src/icons/Jenkins.png
rename to src/drivers/webextension/images/icons/Jenkins.png
diff --git a/src/icons/Jetshop.png b/src/drivers/webextension/images/icons/Jetshop.png
similarity index 100%
rename from src/icons/Jetshop.png
rename to src/drivers/webextension/images/icons/Jetshop.png
diff --git a/src/icons/Jetty.png b/src/drivers/webextension/images/icons/Jetty.png
similarity index 100%
rename from src/icons/Jetty.png
rename to src/drivers/webextension/images/icons/Jetty.png
diff --git a/src/drivers/webextension/images/icons/Jibres.svg b/src/drivers/webextension/images/icons/Jibres.svg
new file mode 100644
index 0000000000000000000000000000000000000000..7dfe4ca8b62b834609b142d39336095870bd4a47
--- /dev/null
+++ b/src/drivers/webextension/images/icons/Jibres.svg
@@ -0,0 +1 @@
+
Jibres-Logo-icon-zero
\ No newline at end of file
diff --git a/src/icons/Jirafe.png b/src/drivers/webextension/images/icons/Jirafe.png
similarity index 100%
rename from src/icons/Jirafe.png
rename to src/drivers/webextension/images/icons/Jirafe.png
diff --git a/src/drivers/webextension/images/icons/Jitsi.png b/src/drivers/webextension/images/icons/Jitsi.png
new file mode 100644
index 0000000000000000000000000000000000000000..3531cc2fb70b60beb564c3cf4154f4ed307e236a
Binary files /dev/null and b/src/drivers/webextension/images/icons/Jitsi.png differ
diff --git a/src/icons/Jive.png b/src/drivers/webextension/images/icons/Jive.png
similarity index 100%
rename from src/icons/Jive.png
rename to src/drivers/webextension/images/icons/Jive.png
diff --git a/src/icons/JobberBase.png b/src/drivers/webextension/images/icons/JobberBase.png
similarity index 100%
rename from src/icons/JobberBase.png
rename to src/drivers/webextension/images/icons/JobberBase.png
diff --git a/src/icons/Joomla.svg b/src/drivers/webextension/images/icons/Joomla.svg
similarity index 100%
rename from src/icons/Joomla.svg
rename to src/drivers/webextension/images/icons/Joomla.svg
diff --git a/src/icons/K2.png b/src/drivers/webextension/images/icons/K2.png
similarity index 100%
rename from src/icons/K2.png
rename to src/drivers/webextension/images/icons/K2.png
diff --git a/src/icons/KISSmetrics.png b/src/drivers/webextension/images/icons/KISSmetrics.png
similarity index 100%
rename from src/icons/KISSmetrics.png
rename to src/drivers/webextension/images/icons/KISSmetrics.png
diff --git a/src/icons/Kajabi.svg b/src/drivers/webextension/images/icons/Kajabi.svg
similarity index 100%
rename from src/icons/Kajabi.svg
rename to src/drivers/webextension/images/icons/Kajabi.svg
diff --git a/src/icons/Kampyle.png b/src/drivers/webextension/images/icons/Kampyle.png
similarity index 100%
rename from src/icons/Kampyle.png
rename to src/drivers/webextension/images/icons/Kampyle.png
diff --git a/src/icons/Kamva.svg b/src/drivers/webextension/images/icons/Kamva.svg
similarity index 100%
rename from src/icons/Kamva.svg
rename to src/drivers/webextension/images/icons/Kamva.svg
diff --git a/src/icons/Kendo UI.png b/src/drivers/webextension/images/icons/Kendo UI.png
similarity index 100%
rename from src/icons/Kendo UI.png
rename to src/drivers/webextension/images/icons/Kendo UI.png
diff --git a/src/icons/Kentico CMS.png b/src/drivers/webextension/images/icons/Kentico CMS.png
similarity index 100%
rename from src/icons/Kentico CMS.png
rename to src/drivers/webextension/images/icons/Kentico CMS.png
diff --git a/src/drivers/webextension/images/icons/KeyCDN.png b/src/drivers/webextension/images/icons/KeyCDN.png
new file mode 100644
index 0000000000000000000000000000000000000000..eb027cf0aaa3dede6b766e81613dc45a21e08e57
Binary files /dev/null and b/src/drivers/webextension/images/icons/KeyCDN.png differ
diff --git a/src/icons/KineticJS.png b/src/drivers/webextension/images/icons/KineticJS.png
similarity index 100%
rename from src/icons/KineticJS.png
rename to src/drivers/webextension/images/icons/KineticJS.png
diff --git a/src/icons/Klarna.svg b/src/drivers/webextension/images/icons/Klarna.svg
similarity index 100%
rename from src/icons/Klarna.svg
rename to src/drivers/webextension/images/icons/Klarna.svg
diff --git a/src/icons/Knockout.js.png b/src/drivers/webextension/images/icons/Knockout.js.png
similarity index 100%
rename from src/icons/Knockout.js.png
rename to src/drivers/webextension/images/icons/Knockout.js.png
diff --git a/src/icons/Koa.png b/src/drivers/webextension/images/icons/Koa.png
similarity index 100%
rename from src/icons/Koa.png
rename to src/drivers/webextension/images/icons/Koa.png
diff --git a/src/icons/Koala Framework.png b/src/drivers/webextension/images/icons/Koala Framework.png
similarity index 100%
rename from src/icons/Koala Framework.png
rename to src/drivers/webextension/images/icons/Koala Framework.png
diff --git a/src/icons/Kobimaster.png b/src/drivers/webextension/images/icons/Kobimaster.png
similarity index 100%
rename from src/icons/Kobimaster.png
rename to src/drivers/webextension/images/icons/Kobimaster.png
diff --git a/src/icons/Kohana.png b/src/drivers/webextension/images/icons/Kohana.png
similarity index 100%
rename from src/icons/Kohana.png
rename to src/drivers/webextension/images/icons/Kohana.png
diff --git a/src/icons/Koken.png b/src/drivers/webextension/images/icons/Koken.png
similarity index 100%
rename from src/icons/Koken.png
rename to src/drivers/webextension/images/icons/Koken.png
diff --git a/src/icons/Komodo CMS.png b/src/drivers/webextension/images/icons/Komodo CMS.png
similarity index 100%
rename from src/icons/Komodo CMS.png
rename to src/drivers/webextension/images/icons/Komodo CMS.png
diff --git a/src/icons/Koobi.png b/src/drivers/webextension/images/icons/Koobi.png
similarity index 100%
rename from src/icons/Koobi.png
rename to src/drivers/webextension/images/icons/Koobi.png
diff --git a/src/icons/Kooboo CMS.png b/src/drivers/webextension/images/icons/Kooboo CMS.png
similarity index 100%
rename from src/icons/Kooboo CMS.png
rename to src/drivers/webextension/images/icons/Kooboo CMS.png
diff --git a/src/icons/Kotisivukone.png b/src/drivers/webextension/images/icons/Kotisivukone.png
similarity index 100%
rename from src/icons/Kotisivukone.png
rename to src/drivers/webextension/images/icons/Kotisivukone.png
diff --git a/src/icons/Kubernetes.svg b/src/drivers/webextension/images/icons/Kubernetes.svg
similarity index 100%
rename from src/icons/Kubernetes.svg
rename to src/drivers/webextension/images/icons/Kubernetes.svg
diff --git a/src/icons/LEPTON.png b/src/drivers/webextension/images/icons/LEPTON.png
similarity index 100%
rename from src/icons/LEPTON.png
rename to src/drivers/webextension/images/icons/LEPTON.png
diff --git a/src/drivers/webextension/images/icons/LOU.png b/src/drivers/webextension/images/icons/LOU.png
new file mode 100644
index 0000000000000000000000000000000000000000..cacbee77a6450a6d6a77c56137b253a4b69d97fe
Binary files /dev/null and b/src/drivers/webextension/images/icons/LOU.png differ
diff --git a/src/drivers/webextension/images/icons/Lagoon.png b/src/drivers/webextension/images/icons/Lagoon.png
new file mode 100644
index 0000000000000000000000000000000000000000..79a6acc980a701d7937e76912239753b1aa23887
Binary files /dev/null and b/src/drivers/webextension/images/icons/Lagoon.png differ
diff --git a/src/drivers/webextension/images/icons/Laravel.svg b/src/drivers/webextension/images/icons/Laravel.svg
new file mode 100644
index 0000000000000000000000000000000000000000..917d020779edbb4075408674250889688f216510
--- /dev/null
+++ b/src/drivers/webextension/images/icons/Laravel.svg
@@ -0,0 +1,31 @@
+
+
Laravel logo image/svg+xml Laravel logo
+
+
+
\ No newline at end of file
diff --git a/src/icons/Leaflet.png b/src/drivers/webextension/images/icons/Leaflet.png
similarity index 100%
rename from src/icons/Leaflet.png
rename to src/drivers/webextension/images/icons/Leaflet.png
diff --git a/src/icons/Less.png b/src/drivers/webextension/images/icons/Less.png
similarity index 100%
rename from src/icons/Less.png
rename to src/drivers/webextension/images/icons/Less.png
diff --git a/src/icons/Liferay.svg b/src/drivers/webextension/images/icons/Liferay.svg
similarity index 100%
rename from src/icons/Liferay.svg
rename to src/drivers/webextension/images/icons/Liferay.svg
diff --git a/src/icons/Lift.png b/src/drivers/webextension/images/icons/Lift.png
similarity index 100%
rename from src/icons/Lift.png
rename to src/drivers/webextension/images/icons/Lift.png
diff --git a/src/icons/LightMon Engine.png b/src/drivers/webextension/images/icons/LightMon Engine.png
similarity index 100%
rename from src/icons/LightMon Engine.png
rename to src/drivers/webextension/images/icons/LightMon Engine.png
diff --git a/src/icons/Lightbox.png b/src/drivers/webextension/images/icons/Lightbox.png
similarity index 100%
rename from src/icons/Lightbox.png
rename to src/drivers/webextension/images/icons/Lightbox.png
diff --git a/src/icons/Lightspeed.svg b/src/drivers/webextension/images/icons/Lightspeed.svg
similarity index 100%
rename from src/icons/Lightspeed.svg
rename to src/drivers/webextension/images/icons/Lightspeed.svg
diff --git a/src/icons/LinkSmart.png b/src/drivers/webextension/images/icons/LinkSmart.png
similarity index 100%
rename from src/icons/LinkSmart.png
rename to src/drivers/webextension/images/icons/LinkSmart.png
diff --git a/src/icons/Linkedin.svg b/src/drivers/webextension/images/icons/Linkedin.svg
similarity index 100%
rename from src/icons/Linkedin.svg
rename to src/drivers/webextension/images/icons/Linkedin.svg
diff --git a/src/icons/List.js.png b/src/drivers/webextension/images/icons/List.js.png
similarity index 100%
rename from src/icons/List.js.png
rename to src/drivers/webextension/images/icons/List.js.png
diff --git a/src/icons/LiteSpeed.svg b/src/drivers/webextension/images/icons/LiteSpeed.svg
similarity index 100%
rename from src/icons/LiteSpeed.svg
rename to src/drivers/webextension/images/icons/LiteSpeed.svg
diff --git a/src/icons/Lithium.png b/src/drivers/webextension/images/icons/Lithium.png
similarity index 100%
rename from src/icons/Lithium.png
rename to src/drivers/webextension/images/icons/Lithium.png
diff --git a/src/icons/LiveAgent.png b/src/drivers/webextension/images/icons/LiveAgent.png
similarity index 100%
rename from src/icons/LiveAgent.png
rename to src/drivers/webextension/images/icons/LiveAgent.png
diff --git a/src/icons/LiveChat.png b/src/drivers/webextension/images/icons/LiveChat.png
similarity index 100%
rename from src/icons/LiveChat.png
rename to src/drivers/webextension/images/icons/LiveChat.png
diff --git a/src/icons/LiveHelp.png b/src/drivers/webextension/images/icons/LiveHelp.png
similarity index 100%
rename from src/icons/LiveHelp.png
rename to src/drivers/webextension/images/icons/LiveHelp.png
diff --git a/src/icons/LiveJournal.png b/src/drivers/webextension/images/icons/LiveJournal.png
similarity index 100%
rename from src/icons/LiveJournal.png
rename to src/drivers/webextension/images/icons/LiveJournal.png
diff --git a/src/icons/LivePerson.png b/src/drivers/webextension/images/icons/LivePerson.png
similarity index 100%
rename from src/icons/LivePerson.png
rename to src/drivers/webextension/images/icons/LivePerson.png
diff --git a/src/drivers/webextension/images/icons/LiveStory.png b/src/drivers/webextension/images/icons/LiveStory.png
new file mode 100644
index 0000000000000000000000000000000000000000..6bb152254fb3f5683083b770361879904e590c2f
Binary files /dev/null and b/src/drivers/webextension/images/icons/LiveStory.png differ
diff --git a/src/icons/LiveStreet CMS.png b/src/drivers/webextension/images/icons/LiveStreet CMS.png
similarity index 100%
rename from src/icons/LiveStreet CMS.png
rename to src/drivers/webextension/images/icons/LiveStreet CMS.png
diff --git a/src/icons/Livefyre.png b/src/drivers/webextension/images/icons/Livefyre.png
similarity index 100%
rename from src/icons/Livefyre.png
rename to src/drivers/webextension/images/icons/Livefyre.png
diff --git a/src/icons/Liveinternet.png b/src/drivers/webextension/images/icons/Liveinternet.png
similarity index 100%
rename from src/icons/Liveinternet.png
rename to src/drivers/webextension/images/icons/Liveinternet.png
diff --git a/src/drivers/webextension/images/icons/Livewire.png b/src/drivers/webextension/images/icons/Livewire.png
new file mode 100644
index 0000000000000000000000000000000000000000..b91486cc7bb48ee2ea22fb9f6c6554dded240495
Binary files /dev/null and b/src/drivers/webextension/images/icons/Livewire.png differ
diff --git a/src/icons/Lo-dash.png b/src/drivers/webextension/images/icons/Lo-dash.png
similarity index 100%
rename from src/icons/Lo-dash.png
rename to src/drivers/webextension/images/icons/Lo-dash.png
diff --git a/src/drivers/webextension/images/icons/LocalFocus.png b/src/drivers/webextension/images/icons/LocalFocus.png
new file mode 100644
index 0000000000000000000000000000000000000000..0043b86458797dc240f453cfae1df2577386a3e6
Binary files /dev/null and b/src/drivers/webextension/images/icons/LocalFocus.png differ
diff --git a/src/icons/ArvanCloud.png b/src/drivers/webextension/images/icons/LocomotiveCMS.png
similarity index 83%
rename from src/icons/ArvanCloud.png
rename to src/drivers/webextension/images/icons/LocomotiveCMS.png
index debf6aea98efd487c699b450f0ca13f96745f273..3bf4c3f46fcbfd1b131a74da756ad6298024a253 100644
Binary files a/src/icons/ArvanCloud.png and b/src/drivers/webextension/images/icons/LocomotiveCMS.png differ
diff --git a/src/icons/Logitech Media Server.png b/src/drivers/webextension/images/icons/Logitech Media Server.png
similarity index 100%
rename from src/icons/Logitech Media Server.png
rename to src/drivers/webextension/images/icons/Logitech Media Server.png
diff --git a/src/drivers/webextension/images/icons/Loja Integrada.png b/src/drivers/webextension/images/icons/Loja Integrada.png
new file mode 100644
index 0000000000000000000000000000000000000000..7bdb1b0639ffe6e166418c2829c2046f5b8c8315
Binary files /dev/null and b/src/drivers/webextension/images/icons/Loja Integrada.png differ
diff --git a/src/icons/Lotus Domino.png b/src/drivers/webextension/images/icons/Lotus Domino.png
similarity index 100%
rename from src/icons/Lotus Domino.png
rename to src/drivers/webextension/images/icons/Lotus Domino.png
diff --git a/src/icons/Lua.png b/src/drivers/webextension/images/icons/Lua.png
similarity index 100%
rename from src/icons/Lua.png
rename to src/drivers/webextension/images/icons/Lua.png
diff --git a/src/icons/Lucene.png b/src/drivers/webextension/images/icons/Lucene.png
similarity index 100%
rename from src/icons/Lucene.png
rename to src/drivers/webextension/images/icons/Lucene.png
diff --git a/src/icons/Luigisbox.svg b/src/drivers/webextension/images/icons/Luigisbox.svg
similarity index 100%
rename from src/icons/Luigisbox.svg
rename to src/drivers/webextension/images/icons/Luigisbox.svg
diff --git a/src/icons/MODX.png b/src/drivers/webextension/images/icons/MODX.png
similarity index 100%
rename from src/icons/MODX.png
rename to src/drivers/webextension/images/icons/MODX.png
diff --git a/src/icons/MadAdsMedia.png b/src/drivers/webextension/images/icons/MadAdsMedia.png
similarity index 100%
rename from src/icons/MadAdsMedia.png
rename to src/drivers/webextension/images/icons/MadAdsMedia.png
diff --git a/src/icons/Magento.png b/src/drivers/webextension/images/icons/Magento.png
similarity index 100%
rename from src/icons/Magento.png
rename to src/drivers/webextension/images/icons/Magento.png
diff --git a/src/drivers/webextension/images/icons/Make-Sense.png b/src/drivers/webextension/images/icons/Make-Sense.png
new file mode 100644
index 0000000000000000000000000000000000000000..d2b532e4b4eef7c6a830fb587bf32a0caaf304e8
Binary files /dev/null and b/src/drivers/webextension/images/icons/Make-Sense.png differ
diff --git a/src/drivers/webextension/images/icons/MakeShopKorea.png b/src/drivers/webextension/images/icons/MakeShopKorea.png
new file mode 100644
index 0000000000000000000000000000000000000000..89fbc952828ff7a04c0e27d3d9d2fcdc9a3bb8dc
Binary files /dev/null and b/src/drivers/webextension/images/icons/MakeShopKorea.png differ
diff --git a/src/icons/Mambo.png b/src/drivers/webextension/images/icons/Mambo.png
similarity index 100%
rename from src/icons/Mambo.png
rename to src/drivers/webextension/images/icons/Mambo.png
diff --git a/src/icons/MantisBT.png b/src/drivers/webextension/images/icons/MantisBT.png
similarity index 100%
rename from src/icons/MantisBT.png
rename to src/drivers/webextension/images/icons/MantisBT.png
diff --git a/src/icons/ManyContacts.png b/src/drivers/webextension/images/icons/ManyContacts.png
similarity index 100%
rename from src/icons/ManyContacts.png
rename to src/drivers/webextension/images/icons/ManyContacts.png
diff --git a/src/icons/Marionette.js.svg b/src/drivers/webextension/images/icons/Marionette.js.svg
similarity index 100%
rename from src/icons/Marionette.js.svg
rename to src/drivers/webextension/images/icons/Marionette.js.svg
diff --git a/src/icons/Marketo.png b/src/drivers/webextension/images/icons/Marketo.png
similarity index 100%
rename from src/icons/Marketo.png
rename to src/drivers/webextension/images/icons/Marketo.png
diff --git a/src/drivers/webextension/images/icons/Mastercard.svg b/src/drivers/webextension/images/icons/Mastercard.svg
new file mode 100644
index 0000000000000000000000000000000000000000..70ca0964be76d2654e5ce14fbb71175f0ada3f63
--- /dev/null
+++ b/src/drivers/webextension/images/icons/Mastercard.svg
@@ -0,0 +1,12 @@
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/icons/Material Design Lite.png b/src/drivers/webextension/images/icons/Material Design Lite.png
similarity index 100%
rename from src/icons/Material Design Lite.png
rename to src/drivers/webextension/images/icons/Material Design Lite.png
diff --git a/src/icons/Materialize CSS.png b/src/drivers/webextension/images/icons/Materialize CSS.png
similarity index 100%
rename from src/icons/Materialize CSS.png
rename to src/drivers/webextension/images/icons/Materialize CSS.png
diff --git a/src/icons/MathJax.png b/src/drivers/webextension/images/icons/MathJax.png
similarity index 100%
rename from src/icons/MathJax.png
rename to src/drivers/webextension/images/icons/MathJax.png
diff --git a/src/drivers/webextension/images/icons/Matomo.png b/src/drivers/webextension/images/icons/Matomo.png
new file mode 100644
index 0000000000000000000000000000000000000000..f7ff2fa1a2a2d54ff9b6235c1a7b87fbc3a2868b
Binary files /dev/null and b/src/drivers/webextension/images/icons/Matomo.png differ
diff --git a/src/icons/MaxCDN.png b/src/drivers/webextension/images/icons/MaxCDN.png
similarity index 100%
rename from src/icons/MaxCDN.png
rename to src/drivers/webextension/images/icons/MaxCDN.png
diff --git a/src/icons/MaxSite CMS.png b/src/drivers/webextension/images/icons/MaxSite CMS.png
similarity index 100%
rename from src/icons/MaxSite CMS.png
rename to src/drivers/webextension/images/icons/MaxSite CMS.png
diff --git a/src/drivers/webextension/images/icons/Maxemail.svg b/src/drivers/webextension/images/icons/Maxemail.svg
new file mode 100755
index 0000000000000000000000000000000000000000..01b298ab1e19159915d76a569663b1c37c925c2a
--- /dev/null
+++ b/src/drivers/webextension/images/icons/Maxemail.svg
@@ -0,0 +1,37 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/icons/MediaElement.js.png b/src/drivers/webextension/images/icons/MediaElement.js.png
similarity index 100%
rename from src/icons/MediaElement.js.png
rename to src/drivers/webextension/images/icons/MediaElement.js.png
diff --git a/src/icons/MediaWiki.png b/src/drivers/webextension/images/icons/MediaWiki.png
similarity index 100%
rename from src/icons/MediaWiki.png
rename to src/drivers/webextension/images/icons/MediaWiki.png
diff --git a/src/icons/Medium.svg b/src/drivers/webextension/images/icons/Medium.svg
similarity index 100%
rename from src/icons/Medium.svg
rename to src/drivers/webextension/images/icons/Medium.svg
diff --git a/src/icons/Meebo.png b/src/drivers/webextension/images/icons/Meebo.png
similarity index 100%
rename from src/icons/Meebo.png
rename to src/drivers/webextension/images/icons/Meebo.png
diff --git a/src/drivers/webextension/images/icons/MemberStack.png b/src/drivers/webextension/images/icons/MemberStack.png
new file mode 100644
index 0000000000000000000000000000000000000000..74f99f1500f7d3437f03e143e5680c0b11cc5448
Binary files /dev/null and b/src/drivers/webextension/images/icons/MemberStack.png differ
diff --git a/src/icons/Meteor.png b/src/drivers/webextension/images/icons/Meteor.png
similarity index 100%
rename from src/icons/Meteor.png
rename to src/drivers/webextension/images/icons/Meteor.png
diff --git a/src/icons/Methode.png b/src/drivers/webextension/images/icons/Methode.png
similarity index 100%
rename from src/icons/Methode.png
rename to src/drivers/webextension/images/icons/Methode.png
diff --git a/src/icons/Microsoft ASP.NET.png b/src/drivers/webextension/images/icons/Microsoft ASP.NET.png
similarity index 100%
rename from src/icons/Microsoft ASP.NET.png
rename to src/drivers/webextension/images/icons/Microsoft ASP.NET.png
diff --git a/src/icons/Microsoft Excel.svg b/src/drivers/webextension/images/icons/Microsoft Excel.svg
similarity index 100%
rename from src/icons/Microsoft Excel.svg
rename to src/drivers/webextension/images/icons/Microsoft Excel.svg
diff --git a/src/icons/Microsoft PowerPoint.svg b/src/drivers/webextension/images/icons/Microsoft PowerPoint.svg
similarity index 100%
rename from src/icons/Microsoft PowerPoint.svg
rename to src/drivers/webextension/images/icons/Microsoft PowerPoint.svg
diff --git a/src/icons/Microsoft Publisher.svg b/src/drivers/webextension/images/icons/Microsoft Publisher.svg
similarity index 100%
rename from src/icons/Microsoft Publisher.svg
rename to src/drivers/webextension/images/icons/Microsoft Publisher.svg
diff --git a/src/icons/Microsoft SharePoint.png b/src/drivers/webextension/images/icons/Microsoft SharePoint.png
similarity index 100%
rename from src/icons/Microsoft SharePoint.png
rename to src/drivers/webextension/images/icons/Microsoft SharePoint.png
diff --git a/src/icons/Microsoft Word.svg b/src/drivers/webextension/images/icons/Microsoft Word.svg
similarity index 100%
rename from src/icons/Microsoft Word.svg
rename to src/drivers/webextension/images/icons/Microsoft Word.svg
diff --git a/src/drivers/webextension/images/icons/Microsoft.png b/src/drivers/webextension/images/icons/Microsoft.png
new file mode 100644
index 0000000000000000000000000000000000000000..8643c5f80c47e6b12b9fbdce7bb888b1983a6a8f
Binary files /dev/null and b/src/drivers/webextension/images/icons/Microsoft.png differ
diff --git a/src/icons/Milligram.png b/src/drivers/webextension/images/icons/Milligram.png
similarity index 100%
rename from src/icons/Milligram.png
rename to src/drivers/webextension/images/icons/Milligram.png
diff --git a/src/icons/MiniBB.png b/src/drivers/webextension/images/icons/MiniBB.png
similarity index 100%
rename from src/icons/MiniBB.png
rename to src/drivers/webextension/images/icons/MiniBB.png
diff --git a/src/icons/Mint.png b/src/drivers/webextension/images/icons/Mint.png
similarity index 100%
rename from src/icons/Mint.png
rename to src/drivers/webextension/images/icons/Mint.png
diff --git a/src/icons/Mixpanel.png b/src/drivers/webextension/images/icons/Mixpanel.png
similarity index 100%
rename from src/icons/Mixpanel.png
rename to src/drivers/webextension/images/icons/Mixpanel.png
diff --git a/src/drivers/webextension/images/icons/MobX.svg b/src/drivers/webextension/images/icons/MobX.svg
new file mode 100644
index 0000000000000000000000000000000000000000..2dbedb8571ab3a037bd7c9ae6fbe4a6adf0acc8e
--- /dev/null
+++ b/src/drivers/webextension/images/icons/MobX.svg
@@ -0,0 +1,43 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/icons/Mobify.png b/src/drivers/webextension/images/icons/Mobify.png
similarity index 100%
rename from src/icons/Mobify.png
rename to src/drivers/webextension/images/icons/Mobify.png
diff --git a/src/icons/MochiKit.png b/src/drivers/webextension/images/icons/MochiKit.png
similarity index 100%
rename from src/icons/MochiKit.png
rename to src/drivers/webextension/images/icons/MochiKit.png
diff --git a/src/icons/Modernizr.svg b/src/drivers/webextension/images/icons/Modernizr.svg
similarity index 100%
rename from src/icons/Modernizr.svg
rename to src/drivers/webextension/images/icons/Modernizr.svg
diff --git a/src/icons/Moguta.CMS.png b/src/drivers/webextension/images/icons/Moguta.CMS.png
similarity index 100%
rename from src/icons/Moguta.CMS.png
rename to src/drivers/webextension/images/icons/Moguta.CMS.png
diff --git a/src/icons/MoinMoin.png b/src/drivers/webextension/images/icons/MoinMoin.png
similarity index 100%
rename from src/icons/MoinMoin.png
rename to src/drivers/webextension/images/icons/MoinMoin.png
diff --git a/src/icons/Mojolicious.png b/src/drivers/webextension/images/icons/Mojolicious.png
similarity index 100%
rename from src/icons/Mojolicious.png
rename to src/drivers/webextension/images/icons/Mojolicious.png
diff --git a/src/icons/Mollom.png b/src/drivers/webextension/images/icons/Mollom.png
similarity index 100%
rename from src/icons/Mollom.png
rename to src/drivers/webextension/images/icons/Mollom.png
diff --git a/src/icons/Moment.js.svg b/src/drivers/webextension/images/icons/Moment.js.svg
similarity index 100%
rename from src/icons/Moment.js.svg
rename to src/drivers/webextension/images/icons/Moment.js.svg
diff --git a/src/icons/Mondo Media.png b/src/drivers/webextension/images/icons/Mondo Media.png
similarity index 100%
rename from src/icons/Mondo Media.png
rename to src/drivers/webextension/images/icons/Mondo Media.png
diff --git a/src/icons/MongoDB.png b/src/drivers/webextension/images/icons/MongoDB.png
similarity index 100%
rename from src/icons/MongoDB.png
rename to src/drivers/webextension/images/icons/MongoDB.png
diff --git a/src/icons/Mongrel.png b/src/drivers/webextension/images/icons/Mongrel.png
similarity index 100%
rename from src/icons/Mongrel.png
rename to src/drivers/webextension/images/icons/Mongrel.png
diff --git a/src/icons/Monkey HTTP Server.png b/src/drivers/webextension/images/icons/Monkey HTTP Server.png
similarity index 100%
rename from src/icons/Monkey HTTP Server.png
rename to src/drivers/webextension/images/icons/Monkey HTTP Server.png
diff --git a/src/icons/Mono.net.png b/src/drivers/webextension/images/icons/Mono.net.png
similarity index 100%
rename from src/icons/Mono.net.png
rename to src/drivers/webextension/images/icons/Mono.net.png
diff --git a/src/icons/Mono.png b/src/drivers/webextension/images/icons/Mono.png
similarity index 100%
rename from src/icons/Mono.png
rename to src/drivers/webextension/images/icons/Mono.png
diff --git a/src/icons/MooTools.png b/src/drivers/webextension/images/icons/MooTools.png
similarity index 100%
rename from src/icons/MooTools.png
rename to src/drivers/webextension/images/icons/MooTools.png
diff --git a/src/icons/Moodle.png b/src/drivers/webextension/images/icons/Moodle.png
similarity index 100%
rename from src/icons/Moodle.png
rename to src/drivers/webextension/images/icons/Moodle.png
diff --git a/src/icons/MotoCMS.svg b/src/drivers/webextension/images/icons/MotoCMS.svg
similarity index 100%
rename from src/icons/MotoCMS.svg
rename to src/drivers/webextension/images/icons/MotoCMS.svg
diff --git a/src/icons/Movable Type.png b/src/drivers/webextension/images/icons/Movable Type.png
similarity index 100%
rename from src/icons/Movable Type.png
rename to src/drivers/webextension/images/icons/Movable Type.png
diff --git a/src/icons/Mozard Suite.png b/src/drivers/webextension/images/icons/Mozard Suite.png
similarity index 100%
rename from src/icons/Mozard Suite.png
rename to src/drivers/webextension/images/icons/Mozard Suite.png
diff --git a/src/icons/Mura CMS.png b/src/drivers/webextension/images/icons/Mura CMS.png
similarity index 100%
rename from src/icons/Mura CMS.png
rename to src/drivers/webextension/images/icons/Mura CMS.png
diff --git a/src/icons/Mustache.png b/src/drivers/webextension/images/icons/Mustache.png
similarity index 100%
rename from src/icons/Mustache.png
rename to src/drivers/webextension/images/icons/Mustache.png
diff --git a/src/icons/MyBB.png b/src/drivers/webextension/images/icons/MyBB.png
similarity index 100%
rename from src/icons/MyBB.png
rename to src/drivers/webextension/images/icons/MyBB.png
diff --git a/src/icons/MyBlogLog.png b/src/drivers/webextension/images/icons/MyBlogLog.png
similarity index 100%
rename from src/icons/MyBlogLog.png
rename to src/drivers/webextension/images/icons/MyBlogLog.png
diff --git a/src/icons/MySQL.svg b/src/drivers/webextension/images/icons/MySQL.svg
similarity index 100%
rename from src/icons/MySQL.svg
rename to src/drivers/webextension/images/icons/MySQL.svg
diff --git a/src/icons/Mynetcap.png b/src/drivers/webextension/images/icons/Mynetcap.png
similarity index 100%
rename from src/icons/Mynetcap.png
rename to src/drivers/webextension/images/icons/Mynetcap.png
diff --git a/src/icons/NVD3.png b/src/drivers/webextension/images/icons/NVD3.png
similarity index 100%
rename from src/icons/NVD3.png
rename to src/drivers/webextension/images/icons/NVD3.png
diff --git a/src/icons/Navegg.png b/src/drivers/webextension/images/icons/Navegg.png
similarity index 100%
rename from src/icons/Navegg.png
rename to src/drivers/webextension/images/icons/Navegg.png
diff --git a/src/icons/Neos.svg b/src/drivers/webextension/images/icons/Neos.svg
similarity index 100%
rename from src/icons/Neos.svg
rename to src/drivers/webextension/images/icons/Neos.svg
diff --git a/src/icons/Netsuite.png b/src/drivers/webextension/images/icons/NetSuite.png
similarity index 100%
rename from src/icons/Netsuite.png
rename to src/drivers/webextension/images/icons/NetSuite.png
diff --git a/src/icons/Netlify.svg b/src/drivers/webextension/images/icons/Netlify.svg
similarity index 100%
rename from src/icons/Netlify.svg
rename to src/drivers/webextension/images/icons/Netlify.svg
diff --git a/src/icons/Neto.svg b/src/drivers/webextension/images/icons/Neto.svg
similarity index 100%
rename from src/icons/Neto.svg
rename to src/drivers/webextension/images/icons/Neto.svg
diff --git a/src/icons/Nette Framework.png b/src/drivers/webextension/images/icons/Nette Framework.png
similarity index 100%
rename from src/icons/Nette Framework.png
rename to src/drivers/webextension/images/icons/Nette Framework.png
diff --git a/src/icons/New Relic.png b/src/drivers/webextension/images/icons/New Relic.png
similarity index 100%
rename from src/icons/New Relic.png
rename to src/drivers/webextension/images/icons/New Relic.png
diff --git a/src/drivers/webextension/images/icons/NextGEN Gallery.png b/src/drivers/webextension/images/icons/NextGEN Gallery.png
new file mode 100644
index 0000000000000000000000000000000000000000..fdc7074b88cf7d1566e4402aaeca862554c1f8be
Binary files /dev/null and b/src/drivers/webextension/images/icons/NextGEN Gallery.png differ
diff --git a/src/icons/Nginx.svg b/src/drivers/webextension/images/icons/Nginx.svg
similarity index 100%
rename from src/icons/Nginx.svg
rename to src/drivers/webextension/images/icons/Nginx.svg
diff --git a/src/icons/NodeBB.png b/src/drivers/webextension/images/icons/NodeBB.png
similarity index 100%
rename from src/icons/NodeBB.png
rename to src/drivers/webextension/images/icons/NodeBB.png
diff --git a/src/icons/Nuxt.js.svg b/src/drivers/webextension/images/icons/Nuxt.js.svg
similarity index 100%
rename from src/icons/Nuxt.js.svg
rename to src/drivers/webextension/images/icons/Nuxt.js.svg
diff --git a/src/icons/OWL Carousel.png b/src/drivers/webextension/images/icons/OWL Carousel.png
similarity index 100%
rename from src/icons/OWL Carousel.png
rename to src/drivers/webextension/images/icons/OWL Carousel.png
diff --git a/src/icons/OXID eShop.png b/src/drivers/webextension/images/icons/OXID eShop.png
similarity index 100%
rename from src/icons/OXID eShop.png
rename to src/drivers/webextension/images/icons/OXID eShop.png
diff --git a/src/icons/October CMS.png b/src/drivers/webextension/images/icons/October CMS.png
similarity index 100%
rename from src/icons/October CMS.png
rename to src/drivers/webextension/images/icons/October CMS.png
diff --git a/src/icons/Odoo.png b/src/drivers/webextension/images/icons/Odoo.png
similarity index 100%
rename from src/icons/Odoo.png
rename to src/drivers/webextension/images/icons/Odoo.png
diff --git a/src/icons/Olark.png b/src/drivers/webextension/images/icons/Olark.png
similarity index 100%
rename from src/icons/Olark.png
rename to src/drivers/webextension/images/icons/Olark.png
diff --git a/src/icons/OneAPM.png b/src/drivers/webextension/images/icons/OneAPM.png
similarity index 100%
rename from src/icons/OneAPM.png
rename to src/drivers/webextension/images/icons/OneAPM.png
diff --git a/src/icons/OneStat.png b/src/drivers/webextension/images/icons/OneStat.png
similarity index 100%
rename from src/icons/OneStat.png
rename to src/drivers/webextension/images/icons/OneStat.png
diff --git a/src/drivers/webextension/images/icons/OneTrust.png b/src/drivers/webextension/images/icons/OneTrust.png
new file mode 100644
index 0000000000000000000000000000000000000000..da57f65e576ca6964d969000afaac954e70dfb7a
Binary files /dev/null and b/src/drivers/webextension/images/icons/OneTrust.png differ
diff --git a/src/drivers/webextension/images/icons/Onshop.svg b/src/drivers/webextension/images/icons/Onshop.svg
new file mode 100644
index 0000000000000000000000000000000000000000..902b25caab9747f72a55a6125d35d4d1fafbaebb
--- /dev/null
+++ b/src/drivers/webextension/images/icons/Onshop.svg
@@ -0,0 +1,27 @@
+
+
+
+
diff --git a/src/icons/Open AdStream.png b/src/drivers/webextension/images/icons/Open AdStream.png
similarity index 100%
rename from src/icons/Open AdStream.png
rename to src/drivers/webextension/images/icons/Open AdStream.png
diff --git a/src/icons/Open Classifieds.png b/src/drivers/webextension/images/icons/Open Classifieds.png
similarity index 100%
rename from src/icons/Open Classifieds.png
rename to src/drivers/webextension/images/icons/Open Classifieds.png
diff --git a/src/icons/Open Journal Systems.png b/src/drivers/webextension/images/icons/Open Journal Systems.png
similarity index 100%
rename from src/icons/Open Journal Systems.png
rename to src/drivers/webextension/images/icons/Open Journal Systems.png
diff --git a/src/icons/Open Web Analytics.png b/src/drivers/webextension/images/icons/Open Web Analytics.png
similarity index 100%
rename from src/icons/Open Web Analytics.png
rename to src/drivers/webextension/images/icons/Open Web Analytics.png
diff --git a/src/icons/Open eShop.png b/src/drivers/webextension/images/icons/Open eShop.png
similarity index 100%
rename from src/icons/Open eShop.png
rename to src/drivers/webextension/images/icons/Open eShop.png
diff --git a/src/icons/OpenCart.png b/src/drivers/webextension/images/icons/OpenCart.png
similarity index 100%
rename from src/icons/OpenCart.png
rename to src/drivers/webextension/images/icons/OpenCart.png
diff --git a/src/icons/OpenCms.png b/src/drivers/webextension/images/icons/OpenCms.png
similarity index 100%
rename from src/icons/OpenCms.png
rename to src/drivers/webextension/images/icons/OpenCms.png
diff --git a/src/icons/OpenGrok.png b/src/drivers/webextension/images/icons/OpenGrok.png
similarity index 100%
rename from src/icons/OpenGrok.png
rename to src/drivers/webextension/images/icons/OpenGrok.png
diff --git a/src/icons/OpenLayers.png b/src/drivers/webextension/images/icons/OpenLayers.png
similarity index 100%
rename from src/icons/OpenLayers.png
rename to src/drivers/webextension/images/icons/OpenLayers.png
diff --git a/src/icons/OpenNemas.png b/src/drivers/webextension/images/icons/OpenNemas.png
similarity index 100%
rename from src/icons/OpenNemas.png
rename to src/drivers/webextension/images/icons/OpenNemas.png
diff --git a/src/icons/OpenResty.png b/src/drivers/webextension/images/icons/OpenResty.png
similarity index 100%
rename from src/icons/OpenResty.png
rename to src/drivers/webextension/images/icons/OpenResty.png
diff --git a/src/icons/OpenSSL.png b/src/drivers/webextension/images/icons/OpenSSL.png
similarity index 100%
rename from src/icons/OpenSSL.png
rename to src/drivers/webextension/images/icons/OpenSSL.png
diff --git a/src/icons/OpenText Web Solutions.png b/src/drivers/webextension/images/icons/OpenText Web Solutions.png
similarity index 100%
rename from src/icons/OpenText Web Solutions.png
rename to src/drivers/webextension/images/icons/OpenText Web Solutions.png
diff --git a/src/drivers/webextension/images/icons/OpenUI5.png b/src/drivers/webextension/images/icons/OpenUI5.png
new file mode 100644
index 0000000000000000000000000000000000000000..be273753a771b2bd66a4d380090ca7fa5e0a757a
Binary files /dev/null and b/src/drivers/webextension/images/icons/OpenUI5.png differ
diff --git a/src/icons/OpenX.png b/src/drivers/webextension/images/icons/OpenX.png
similarity index 100%
rename from src/icons/OpenX.png
rename to src/drivers/webextension/images/icons/OpenX.png
diff --git a/src/icons/Optimizely.png b/src/drivers/webextension/images/icons/Optimizely.png
similarity index 100%
rename from src/icons/Optimizely.png
rename to src/drivers/webextension/images/icons/Optimizely.png
diff --git a/src/icons/Oracle.png b/src/drivers/webextension/images/icons/Oracle.png
similarity index 100%
rename from src/icons/Oracle.png
rename to src/drivers/webextension/images/icons/Oracle.png
diff --git a/src/icons/Orchard CMS.png b/src/drivers/webextension/images/icons/Orchard CMS.png
similarity index 100%
rename from src/icons/Orchard CMS.png
rename to src/drivers/webextension/images/icons/Orchard CMS.png
diff --git a/src/icons/Outbrain.png b/src/drivers/webextension/images/icons/Outbrain.png
similarity index 100%
rename from src/icons/Outbrain.png
rename to src/drivers/webextension/images/icons/Outbrain.png
diff --git a/src/icons/Outlook.svg b/src/drivers/webextension/images/icons/Outlook.svg
similarity index 100%
rename from src/icons/Outlook.svg
rename to src/drivers/webextension/images/icons/Outlook.svg
diff --git a/src/icons/PDF.js.svg b/src/drivers/webextension/images/icons/PDF.js.svg
similarity index 100%
rename from src/icons/PDF.js.svg
rename to src/drivers/webextension/images/icons/PDF.js.svg
diff --git a/src/drivers/webextension/images/icons/PHP-Fusion.png b/src/drivers/webextension/images/icons/PHP-Fusion.png
new file mode 100644
index 0000000000000000000000000000000000000000..f8959a4c8514aec4fdc99f37775fd194a679d172
Binary files /dev/null and b/src/drivers/webextension/images/icons/PHP-Fusion.png differ
diff --git a/src/drivers/webextension/images/icons/PHP-Nuke.png b/src/drivers/webextension/images/icons/PHP-Nuke.png
new file mode 100644
index 0000000000000000000000000000000000000000..2bd21c23be45e6a5338dd1b7d30a8ae4f8d2b65c
Binary files /dev/null and b/src/drivers/webextension/images/icons/PHP-Nuke.png differ
diff --git a/src/icons/PHP.svg b/src/drivers/webextension/images/icons/PHP.svg
similarity index 100%
rename from src/icons/PHP.svg
rename to src/drivers/webextension/images/icons/PHP.svg
diff --git a/src/icons/Pagekit.png b/src/drivers/webextension/images/icons/Pagekit.png
similarity index 100%
rename from src/icons/Pagekit.png
rename to src/drivers/webextension/images/icons/Pagekit.png
diff --git a/src/drivers/webextension/images/icons/Pagevamp.png b/src/drivers/webextension/images/icons/Pagevamp.png
new file mode 100644
index 0000000000000000000000000000000000000000..809b88ac13af199d95aa2d9b5121c86feeffbf3f
Binary files /dev/null and b/src/drivers/webextension/images/icons/Pagevamp.png differ
diff --git a/src/drivers/webextension/images/icons/Parcel.png b/src/drivers/webextension/images/icons/Parcel.png
new file mode 100644
index 0000000000000000000000000000000000000000..616435d24f174c667a5129b292abdcf567e8cf8f
Binary files /dev/null and b/src/drivers/webextension/images/icons/Parcel.png differ
diff --git a/src/icons/Pardot.png b/src/drivers/webextension/images/icons/Pardot.png
similarity index 100%
rename from src/icons/Pardot.png
rename to src/drivers/webextension/images/icons/Pardot.png
diff --git a/src/icons/Parse.ly.png b/src/drivers/webextension/images/icons/Parse.ly.png
similarity index 100%
rename from src/icons/Parse.ly.png
rename to src/drivers/webextension/images/icons/Parse.ly.png
diff --git a/src/icons/PayPal.svg b/src/drivers/webextension/images/icons/PayPal.svg
similarity index 100%
rename from src/icons/PayPal.svg
rename to src/drivers/webextension/images/icons/PayPal.svg
diff --git a/src/icons/PencilBlue.png b/src/drivers/webextension/images/icons/PencilBlue.png
similarity index 100%
rename from src/icons/PencilBlue.png
rename to src/drivers/webextension/images/icons/PencilBlue.png
diff --git a/src/icons/Percussion.png b/src/drivers/webextension/images/icons/Percussion.png
similarity index 100%
rename from src/icons/Percussion.png
rename to src/drivers/webextension/images/icons/Percussion.png
diff --git a/src/icons/Perl.png b/src/drivers/webextension/images/icons/Perl.png
similarity index 100%
rename from src/icons/Perl.png
rename to src/drivers/webextension/images/icons/Perl.png
diff --git a/src/icons/Phabricator.png b/src/drivers/webextension/images/icons/Phabricator.png
similarity index 100%
rename from src/icons/Phabricator.png
rename to src/drivers/webextension/images/icons/Phabricator.png
diff --git a/src/icons/Phaser.png b/src/drivers/webextension/images/icons/Phaser.png
similarity index 100%
rename from src/icons/Phaser.png
rename to src/drivers/webextension/images/icons/Phaser.png
diff --git a/src/icons/Phenomic.svg b/src/drivers/webextension/images/icons/Phenomic.svg
similarity index 100%
rename from src/icons/Phenomic.svg
rename to src/drivers/webextension/images/icons/Phenomic.svg
diff --git a/src/drivers/webextension/images/icons/PhotoShelter.png b/src/drivers/webextension/images/icons/PhotoShelter.png
new file mode 100644
index 0000000000000000000000000000000000000000..2a8c5e5247f63131550f8d70131738cbb7587729
Binary files /dev/null and b/src/drivers/webextension/images/icons/PhotoShelter.png differ
diff --git a/src/icons/Phusion Passenger.png b/src/drivers/webextension/images/icons/Phusion Passenger.png
similarity index 100%
rename from src/icons/Phusion Passenger.png
rename to src/drivers/webextension/images/icons/Phusion Passenger.png
diff --git a/src/icons/Pingoteam.svg b/src/drivers/webextension/images/icons/Pingoteam.svg
similarity index 100%
rename from src/icons/Pingoteam.svg
rename to src/drivers/webextension/images/icons/Pingoteam.svg
diff --git a/src/icons/Pinterest.svg b/src/drivers/webextension/images/icons/Pinterest.svg
similarity index 100%
rename from src/icons/Pinterest.svg
rename to src/drivers/webextension/images/icons/Pinterest.svg
diff --git a/src/icons/Planet.png b/src/drivers/webextension/images/icons/Planet.png
similarity index 100%
rename from src/icons/Planet.png
rename to src/drivers/webextension/images/icons/Planet.png
diff --git a/src/icons/Plataforma NEO.svg b/src/drivers/webextension/images/icons/Plataforma NEO.svg
similarity index 100%
rename from src/icons/Plataforma NEO.svg
rename to src/drivers/webextension/images/icons/Plataforma NEO.svg
diff --git a/src/icons/PlatformOS.svg b/src/drivers/webextension/images/icons/PlatformOS.svg
similarity index 100%
rename from src/icons/PlatformOS.svg
rename to src/drivers/webextension/images/icons/PlatformOS.svg
diff --git a/src/icons/Play.svg b/src/drivers/webextension/images/icons/Play.svg
similarity index 100%
rename from src/icons/Play.svg
rename to src/drivers/webextension/images/icons/Play.svg
diff --git a/src/icons/Plesk.png b/src/drivers/webextension/images/icons/Plesk.png
similarity index 100%
rename from src/icons/Plesk.png
rename to src/drivers/webextension/images/icons/Plesk.png
diff --git a/src/icons/Pligg.png b/src/drivers/webextension/images/icons/Pligg.png
similarity index 100%
rename from src/icons/Pligg.png
rename to src/drivers/webextension/images/icons/Pligg.png
diff --git a/src/icons/Plone.png b/src/drivers/webextension/images/icons/Plone.png
similarity index 100%
rename from src/icons/Plone.png
rename to src/drivers/webextension/images/icons/Plone.png
diff --git a/src/icons/Plotly.png b/src/drivers/webextension/images/icons/Plotly.png
similarity index 100%
rename from src/icons/Plotly.png
rename to src/drivers/webextension/images/icons/Plotly.png
diff --git a/src/drivers/webextension/images/icons/Plyr.png b/src/drivers/webextension/images/icons/Plyr.png
new file mode 100644
index 0000000000000000000000000000000000000000..0bb620cdb610cb27f8ef7e603fb6b5a021035324
Binary files /dev/null and b/src/drivers/webextension/images/icons/Plyr.png differ
diff --git a/src/icons/Po.st.png b/src/drivers/webextension/images/icons/Po.st.png
similarity index 100%
rename from src/icons/Po.st.png
rename to src/drivers/webextension/images/icons/Po.st.png
diff --git a/src/icons/Polymer.png b/src/drivers/webextension/images/icons/Polymer.png
similarity index 100%
rename from src/icons/Polymer.png
rename to src/drivers/webextension/images/icons/Polymer.png
diff --git a/src/icons/Posterous.png b/src/drivers/webextension/images/icons/Posterous.png
similarity index 100%
rename from src/icons/Posterous.png
rename to src/drivers/webextension/images/icons/Posterous.png
diff --git a/src/icons/PostgreSQL.png b/src/drivers/webextension/images/icons/PostgreSQL.png
similarity index 100%
rename from src/icons/PostgreSQL.png
rename to src/drivers/webextension/images/icons/PostgreSQL.png
diff --git a/src/icons/Powergap.png b/src/drivers/webextension/images/icons/Powergap.png
similarity index 100%
rename from src/icons/Powergap.png
rename to src/drivers/webextension/images/icons/Powergap.png
diff --git a/src/drivers/webextension/images/icons/Prebid.png b/src/drivers/webextension/images/icons/Prebid.png
new file mode 100644
index 0000000000000000000000000000000000000000..24e55655a1c93115eeb3513ad72023195d6d8ce7
Binary files /dev/null and b/src/drivers/webextension/images/icons/Prebid.png differ
diff --git a/src/icons/Prefix-Free.png b/src/drivers/webextension/images/icons/Prefix-Free.png
similarity index 100%
rename from src/icons/Prefix-Free.png
rename to src/drivers/webextension/images/icons/Prefix-Free.png
diff --git a/src/icons/PrestaShop.svg b/src/drivers/webextension/images/icons/PrestaShop.svg
similarity index 100%
rename from src/icons/PrestaShop.svg
rename to src/drivers/webextension/images/icons/PrestaShop.svg
diff --git a/src/drivers/webextension/images/icons/Prism.svg b/src/drivers/webextension/images/icons/Prism.svg
new file mode 100644
index 0000000000000000000000000000000000000000..9cbbc08147626fc9dbf2561f628554ae907ac3fc
--- /dev/null
+++ b/src/drivers/webextension/images/icons/Prism.svg
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/src/icons/Project Wonderful.png b/src/drivers/webextension/images/icons/Project Wonderful.png
similarity index 100%
rename from src/icons/Project Wonderful.png
rename to src/drivers/webextension/images/icons/Project Wonderful.png
diff --git a/src/icons/Prototype.png b/src/drivers/webextension/images/icons/Prototype.png
similarity index 100%
rename from src/icons/Prototype.png
rename to src/drivers/webextension/images/icons/Prototype.png
diff --git a/src/icons/Proximis Omnichannel.png b/src/drivers/webextension/images/icons/Proximis Omnichannel.png
similarity index 100%
rename from src/icons/Proximis Omnichannel.png
rename to src/drivers/webextension/images/icons/Proximis Omnichannel.png
diff --git a/src/icons/PubMatic.png b/src/drivers/webextension/images/icons/PubMatic.png
similarity index 100%
rename from src/icons/PubMatic.png
rename to src/drivers/webextension/images/icons/PubMatic.png
diff --git a/src/icons/Public CMS.png b/src/drivers/webextension/images/icons/Public CMS.png
similarity index 100%
rename from src/icons/Public CMS.png
rename to src/drivers/webextension/images/icons/Public CMS.png
diff --git a/src/icons/Pure CSS.png b/src/drivers/webextension/images/icons/Pure CSS.png
similarity index 100%
rename from src/icons/Pure CSS.png
rename to src/drivers/webextension/images/icons/Pure CSS.png
diff --git a/src/drivers/webextension/images/icons/Pushnami.svg b/src/drivers/webextension/images/icons/Pushnami.svg
new file mode 100755
index 0000000000000000000000000000000000000000..88b2ec3842f49052bf53aae22e1e72e79a8e0c53
--- /dev/null
+++ b/src/drivers/webextension/images/icons/Pushnami.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/icons/PyroCMS.png b/src/drivers/webextension/images/icons/PyroCMS.png
similarity index 100%
rename from src/icons/PyroCMS.png
rename to src/drivers/webextension/images/icons/PyroCMS.png
diff --git a/src/icons/Python.png b/src/drivers/webextension/images/icons/Python.png
similarity index 100%
rename from src/icons/Python.png
rename to src/drivers/webextension/images/icons/Python.png
diff --git a/src/drivers/webextension/images/icons/Quantcast.png b/src/drivers/webextension/images/icons/Quantcast.png
new file mode 100644
index 0000000000000000000000000000000000000000..fdd3c70ad0528124830451843777d8f12dfa1bab
Binary files /dev/null and b/src/drivers/webextension/images/icons/Quantcast.png differ
diff --git a/src/icons/Quick.CMS.png b/src/drivers/webextension/images/icons/Quick.CMS.png
similarity index 100%
rename from src/icons/Quick.CMS.png
rename to src/drivers/webextension/images/icons/Quick.CMS.png
diff --git a/src/icons/Quick.Cart.png b/src/drivers/webextension/images/icons/Quick.Cart.png
similarity index 100%
rename from src/icons/Quick.Cart.png
rename to src/drivers/webextension/images/icons/Quick.Cart.png
diff --git a/src/icons/Quill.png b/src/drivers/webextension/images/icons/Quill.png
similarity index 100%
rename from src/icons/Quill.png
rename to src/drivers/webextension/images/icons/Quill.png
diff --git a/src/icons/RBS Change.png b/src/drivers/webextension/images/icons/RBS Change.png
similarity index 100%
rename from src/icons/RBS Change.png
rename to src/drivers/webextension/images/icons/RBS Change.png
diff --git a/src/icons/RCMS.png b/src/drivers/webextension/images/icons/RCMS.png
similarity index 100%
rename from src/icons/RCMS.png
rename to src/drivers/webextension/images/icons/RCMS.png
diff --git a/src/icons/RD Station.png b/src/drivers/webextension/images/icons/RD Station.png
similarity index 100%
rename from src/icons/RD Station.png
rename to src/drivers/webextension/images/icons/RD Station.png
diff --git a/src/icons/RDoc.png b/src/drivers/webextension/images/icons/RDoc.png
similarity index 100%
rename from src/icons/RDoc.png
rename to src/drivers/webextension/images/icons/RDoc.png
diff --git a/src/icons/RXWeb.svg b/src/drivers/webextension/images/icons/RXWeb.svg
similarity index 100%
rename from src/icons/RXWeb.svg
rename to src/drivers/webextension/images/icons/RXWeb.svg
diff --git a/src/icons/RackCache.png b/src/drivers/webextension/images/icons/RackCache.png
similarity index 100%
rename from src/icons/RackCache.png
rename to src/drivers/webextension/images/icons/RackCache.png
diff --git a/src/icons/RainLoop.png b/src/drivers/webextension/images/icons/RainLoop.png
similarity index 100%
rename from src/icons/RainLoop.png
rename to src/drivers/webextension/images/icons/RainLoop.png
diff --git a/src/drivers/webextension/images/icons/RakutenDigitalCommerce.png b/src/drivers/webextension/images/icons/RakutenDigitalCommerce.png
new file mode 100644
index 0000000000000000000000000000000000000000..6f10f0ceebfd28d5c6a3a059185ca9a4ae67ef44
Binary files /dev/null and b/src/drivers/webextension/images/icons/RakutenDigitalCommerce.png differ
diff --git a/src/icons/Ramda.png b/src/drivers/webextension/images/icons/Ramda.png
similarity index 100%
rename from src/icons/Ramda.png
rename to src/drivers/webextension/images/icons/Ramda.png
diff --git a/src/icons/Raphael.png b/src/drivers/webextension/images/icons/Raphael.png
similarity index 100%
rename from src/icons/Raphael.png
rename to src/drivers/webextension/images/icons/Raphael.png
diff --git a/src/icons/Raspbian.svg b/src/drivers/webextension/images/icons/Raspbian.svg
similarity index 100%
rename from src/icons/Raspbian.svg
rename to src/drivers/webextension/images/icons/Raspbian.svg
diff --git a/src/icons/Rayo.png b/src/drivers/webextension/images/icons/Rayo.png
similarity index 100%
rename from src/icons/Rayo.png
rename to src/drivers/webextension/images/icons/Rayo.png
diff --git a/src/icons/React.png b/src/drivers/webextension/images/icons/React.png
similarity index 100%
rename from src/icons/React.png
rename to src/drivers/webextension/images/icons/React.png
diff --git a/src/drivers/webextension/images/icons/RebelMouse.svg b/src/drivers/webextension/images/icons/RebelMouse.svg
new file mode 100644
index 0000000000000000000000000000000000000000..9805953699d7dcca46d5f988b037b5c2cdd79737
--- /dev/null
+++ b/src/drivers/webextension/images/icons/RebelMouse.svg
@@ -0,0 +1,12 @@
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/drivers/webextension/images/icons/Recite Me.png b/src/drivers/webextension/images/icons/Recite Me.png
new file mode 100644
index 0000000000000000000000000000000000000000..b6f6aa69db6bae89b52eb4f897783a1182b4065e
Binary files /dev/null and b/src/drivers/webextension/images/icons/Recite Me.png differ
diff --git a/src/drivers/webextension/images/icons/Recurly.png b/src/drivers/webextension/images/icons/Recurly.png
new file mode 100644
index 0000000000000000000000000000000000000000..dadff5ddf1b70fede825414b66a8c8e7d46eb16b
Binary files /dev/null and b/src/drivers/webextension/images/icons/Recurly.png differ
diff --git a/src/drivers/webextension/images/icons/Red Hat.svg b/src/drivers/webextension/images/icons/Red Hat.svg
new file mode 100644
index 0000000000000000000000000000000000000000..5082779f1d907eb11f831bd48e3b634e0fb72b7b
--- /dev/null
+++ b/src/drivers/webextension/images/icons/Red Hat.svg
@@ -0,0 +1,41 @@
+
+
+
+
+
+ image/svg+xml
+
+ RedHat Logo
+
+
+
+
+
+
+ RedHat Logo
+
+
+
diff --git a/src/drivers/webextension/images/icons/Redaxscript.svg b/src/drivers/webextension/images/icons/Redaxscript.svg
new file mode 100644
index 0000000000000000000000000000000000000000..847d91f4939eb99eee12fd5211bcac44ee88427f
--- /dev/null
+++ b/src/drivers/webextension/images/icons/Redaxscript.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/src/icons/Reddit.png b/src/drivers/webextension/images/icons/Reddit.png
similarity index 100%
rename from src/icons/Reddit.png
rename to src/drivers/webextension/images/icons/Reddit.png
diff --git a/src/drivers/webextension/images/icons/Redis.svg b/src/drivers/webextension/images/icons/Redis.svg
new file mode 100644
index 0000000000000000000000000000000000000000..b7019d61713259e1ae17422bdcaac6d93546066e
--- /dev/null
+++ b/src/drivers/webextension/images/icons/Redis.svg
@@ -0,0 +1,11 @@
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/drivers/webextension/images/icons/RedisObjectCache.svg b/src/drivers/webextension/images/icons/RedisObjectCache.svg
new file mode 100644
index 0000000000000000000000000000000000000000..b7019d61713259e1ae17422bdcaac6d93546066e
--- /dev/null
+++ b/src/drivers/webextension/images/icons/RedisObjectCache.svg
@@ -0,0 +1,11 @@
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/icons/Redmine.png b/src/drivers/webextension/images/icons/Redmine.png
similarity index 100%
rename from src/icons/Redmine.png
rename to src/drivers/webextension/images/icons/Redmine.png
diff --git a/src/icons/Reinvigorate.png b/src/drivers/webextension/images/icons/Reinvigorate.png
similarity index 100%
rename from src/icons/Reinvigorate.png
rename to src/drivers/webextension/images/icons/Reinvigorate.png
diff --git a/src/icons/RequireJS.png b/src/drivers/webextension/images/icons/RequireJS.png
similarity index 100%
rename from src/icons/RequireJS.png
rename to src/drivers/webextension/images/icons/RequireJS.png
diff --git a/src/icons/Resin.png b/src/drivers/webextension/images/icons/Resin.png
similarity index 100%
rename from src/icons/Resin.png
rename to src/drivers/webextension/images/icons/Resin.png
diff --git a/src/icons/Reveal.js.png b/src/drivers/webextension/images/icons/Reveal.js.png
similarity index 100%
rename from src/icons/Reveal.js.png
rename to src/drivers/webextension/images/icons/Reveal.js.png
diff --git a/src/icons/Revel.png b/src/drivers/webextension/images/icons/Revel.png
similarity index 100%
rename from src/icons/Revel.png
rename to src/drivers/webextension/images/icons/Revel.png
diff --git a/src/icons/RightJS.png b/src/drivers/webextension/images/icons/RightJS.png
similarity index 100%
rename from src/icons/RightJS.png
rename to src/drivers/webextension/images/icons/RightJS.png
diff --git a/src/icons/Riot.png b/src/drivers/webextension/images/icons/Riot.png
similarity index 100%
rename from src/icons/Riot.png
rename to src/drivers/webextension/images/icons/Riot.png
diff --git a/src/icons/RiteCMS.png b/src/drivers/webextension/images/icons/RiteCMS.png
similarity index 100%
rename from src/icons/RiteCMS.png
rename to src/drivers/webextension/images/icons/RiteCMS.png
diff --git a/src/icons/Roadiz CMS.png b/src/drivers/webextension/images/icons/Roadiz CMS.png
similarity index 100%
rename from src/icons/Roadiz CMS.png
rename to src/drivers/webextension/images/icons/Roadiz CMS.png
diff --git a/src/icons/Robin.png b/src/drivers/webextension/images/icons/Robin.png
similarity index 100%
rename from src/icons/Robin.png
rename to src/drivers/webextension/images/icons/Robin.png
diff --git a/src/icons/RockRMS.svg b/src/drivers/webextension/images/icons/RockRMS.svg
similarity index 100%
rename from src/icons/RockRMS.svg
rename to src/drivers/webextension/images/icons/RockRMS.svg
diff --git a/src/icons/RoundCube.png b/src/drivers/webextension/images/icons/RoundCube.png
similarity index 100%
rename from src/icons/RoundCube.png
rename to src/drivers/webextension/images/icons/RoundCube.png
diff --git a/src/icons/Rubicon Project.png b/src/drivers/webextension/images/icons/Rubicon Project.png
similarity index 100%
rename from src/icons/Rubicon Project.png
rename to src/drivers/webextension/images/icons/Rubicon Project.png
diff --git a/src/icons/Ruby on Rails.png b/src/drivers/webextension/images/icons/Ruby on Rails.png
similarity index 100%
rename from src/icons/Ruby on Rails.png
rename to src/drivers/webextension/images/icons/Ruby on Rails.png
diff --git a/src/icons/Ruby.png b/src/drivers/webextension/images/icons/Ruby.png
similarity index 100%
rename from src/icons/Ruby.png
rename to src/drivers/webextension/images/icons/Ruby.png
diff --git a/src/icons/Ruxit.png b/src/drivers/webextension/images/icons/Ruxit.png
similarity index 100%
rename from src/icons/Ruxit.png
rename to src/drivers/webextension/images/icons/Ruxit.png
diff --git a/src/icons/RxJS.png b/src/drivers/webextension/images/icons/RxJS.png
similarity index 100%
rename from src/icons/RxJS.png
rename to src/drivers/webextension/images/icons/RxJS.png
diff --git a/src/icons/S.Builder.png b/src/drivers/webextension/images/icons/S.Builder.png
similarity index 100%
rename from src/icons/S.Builder.png
rename to src/drivers/webextension/images/icons/S.Builder.png
diff --git a/src/icons/SAP.png b/src/drivers/webextension/images/icons/SAP.png
similarity index 100%
rename from src/icons/SAP.png
rename to src/drivers/webextension/images/icons/SAP.png
diff --git a/src/icons/SDL Tridion.png b/src/drivers/webextension/images/icons/SDL Tridion.png
similarity index 100%
rename from src/icons/SDL Tridion.png
rename to src/drivers/webextension/images/icons/SDL Tridion.png
diff --git a/src/icons/SIMsite.png b/src/drivers/webextension/images/icons/SIMsite.png
similarity index 100%
rename from src/icons/SIMsite.png
rename to src/drivers/webextension/images/icons/SIMsite.png
diff --git a/src/icons/SMF.png b/src/drivers/webextension/images/icons/SMF.png
similarity index 100%
rename from src/icons/SMF.png
rename to src/drivers/webextension/images/icons/SMF.png
diff --git a/src/icons/SOBI 2.png b/src/drivers/webextension/images/icons/SOBI 2.png
similarity index 100%
rename from src/icons/SOBI 2.png
rename to src/drivers/webextension/images/icons/SOBI 2.png
diff --git a/src/icons/SPDY.png b/src/drivers/webextension/images/icons/SPDY.png
similarity index 100%
rename from src/icons/SPDY.png
rename to src/drivers/webextension/images/icons/SPDY.png
diff --git a/src/icons/SQL Buddy.png b/src/drivers/webextension/images/icons/SQL Buddy.png
similarity index 100%
rename from src/icons/SQL Buddy.png
rename to src/drivers/webextension/images/icons/SQL Buddy.png
diff --git a/src/icons/SQLite.png b/src/drivers/webextension/images/icons/SQLite.png
similarity index 100%
rename from src/icons/SQLite.png
rename to src/drivers/webextension/images/icons/SQLite.png
diff --git a/src/icons/SUSE.png b/src/drivers/webextension/images/icons/SUSE.png
similarity index 100%
rename from src/icons/SUSE.png
rename to src/drivers/webextension/images/icons/SUSE.png
diff --git a/src/icons/SWFObject.png b/src/drivers/webextension/images/icons/SWFObject.png
similarity index 100%
rename from src/icons/SWFObject.png
rename to src/drivers/webextension/images/icons/SWFObject.png
diff --git a/src/drivers/webextension/images/icons/Saber.svg b/src/drivers/webextension/images/icons/Saber.svg
new file mode 100644
index 0000000000000000000000000000000000000000..a75b6b09061e9a0b8a0c6e0aabd044531abc4be9
--- /dev/null
+++ b/src/drivers/webextension/images/icons/Saber.svg
@@ -0,0 +1,16 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/icons/Sails.js.svg b/src/drivers/webextension/images/icons/Sails.js.svg
similarity index 100%
rename from src/icons/Sails.js.svg
rename to src/drivers/webextension/images/icons/Sails.js.svg
diff --git a/src/icons/Salesforce.svg b/src/drivers/webextension/images/icons/Salesforce.svg
similarity index 100%
rename from src/icons/Salesforce.svg
rename to src/drivers/webextension/images/icons/Salesforce.svg
diff --git a/src/icons/Sapper.svg b/src/drivers/webextension/images/icons/Sapper.svg
similarity index 100%
rename from src/icons/Sapper.svg
rename to src/drivers/webextension/images/icons/Sapper.svg
diff --git a/src/icons/Sarka-SPIP.png b/src/drivers/webextension/images/icons/Sarka-SPIP.png
similarity index 100%
rename from src/icons/Sarka-SPIP.png
rename to src/drivers/webextension/images/icons/Sarka-SPIP.png
diff --git a/src/icons/Sazito.svg b/src/drivers/webextension/images/icons/Sazito.svg
similarity index 100%
rename from src/icons/Sazito.svg
rename to src/drivers/webextension/images/icons/Sazito.svg
diff --git a/src/icons/Scala.png b/src/drivers/webextension/images/icons/Scala.png
similarity index 100%
rename from src/icons/Scala.png
rename to src/drivers/webextension/images/icons/Scala.png
diff --git a/src/drivers/webextension/images/icons/Scenari.png b/src/drivers/webextension/images/icons/Scenari.png
new file mode 100644
index 0000000000000000000000000000000000000000..d1572a21ef01143d359edbd12cf9aef845563c25
Binary files /dev/null and b/src/drivers/webextension/images/icons/Scenari.png differ
diff --git a/src/icons/Scholica.svg b/src/drivers/webextension/images/icons/Scholica.svg
similarity index 100%
rename from src/icons/Scholica.svg
rename to src/drivers/webextension/images/icons/Scholica.svg
diff --git a/src/icons/Scientific Linux.png b/src/drivers/webextension/images/icons/Scientific Linux.png
similarity index 100%
rename from src/icons/Scientific Linux.png
rename to src/drivers/webextension/images/icons/Scientific Linux.png
diff --git a/src/icons/SeamlessCMS.png b/src/drivers/webextension/images/icons/SeamlessCMS.png
similarity index 100%
rename from src/icons/SeamlessCMS.png
rename to src/drivers/webextension/images/icons/SeamlessCMS.png
diff --git a/src/icons/Segment.png b/src/drivers/webextension/images/icons/Segment.png
similarity index 100%
rename from src/icons/Segment.png
rename to src/drivers/webextension/images/icons/Segment.png
diff --git a/src/icons/Select2.png b/src/drivers/webextension/images/icons/Select2.png
similarity index 100%
rename from src/icons/Select2.png
rename to src/drivers/webextension/images/icons/Select2.png
diff --git a/src/icons/Semantic-ui.png b/src/drivers/webextension/images/icons/Semantic-ui.png
similarity index 100%
rename from src/icons/Semantic-ui.png
rename to src/drivers/webextension/images/icons/Semantic-ui.png
diff --git a/src/icons/Sencha Touch.png b/src/drivers/webextension/images/icons/Sencha Touch.png
similarity index 100%
rename from src/icons/Sencha Touch.png
rename to src/drivers/webextension/images/icons/Sencha Touch.png
diff --git a/src/icons/Sensors Data.svg b/src/drivers/webextension/images/icons/Sensors Data.svg
similarity index 100%
rename from src/icons/Sensors Data.svg
rename to src/drivers/webextension/images/icons/Sensors Data.svg
diff --git a/src/icons/Sentry.svg b/src/drivers/webextension/images/icons/Sentry.svg
similarity index 100%
rename from src/icons/Sentry.svg
rename to src/drivers/webextension/images/icons/Sentry.svg
diff --git a/src/icons/Serendipity.png b/src/drivers/webextension/images/icons/Serendipity.png
similarity index 100%
rename from src/icons/Serendipity.png
rename to src/drivers/webextension/images/icons/Serendipity.png
diff --git a/src/icons/Shapecss.svg b/src/drivers/webextension/images/icons/Shapecss.svg
similarity index 100%
rename from src/icons/Shapecss.svg
rename to src/drivers/webextension/images/icons/Shapecss.svg
diff --git a/src/icons/ShareThis.png b/src/drivers/webextension/images/icons/ShareThis.png
similarity index 100%
rename from src/icons/ShareThis.png
rename to src/drivers/webextension/images/icons/ShareThis.png
diff --git a/src/icons/ShellInABox.png b/src/drivers/webextension/images/icons/ShellInABox.png
similarity index 100%
rename from src/icons/ShellInABox.png
rename to src/drivers/webextension/images/icons/ShellInABox.png
diff --git a/src/drivers/webextension/images/icons/Shiny.png b/src/drivers/webextension/images/icons/Shiny.png
new file mode 100644
index 0000000000000000000000000000000000000000..3ea097729c42ef35fdef3eab68fb5c0720f0ba7d
Binary files /dev/null and b/src/drivers/webextension/images/icons/Shiny.png differ
diff --git a/src/icons/ShinyStat.png b/src/drivers/webextension/images/icons/ShinyStat.png
similarity index 100%
rename from src/icons/ShinyStat.png
rename to src/drivers/webextension/images/icons/ShinyStat.png
diff --git a/src/icons/Shopatron.png b/src/drivers/webextension/images/icons/Shopatron.png
similarity index 100%
rename from src/icons/Shopatron.png
rename to src/drivers/webextension/images/icons/Shopatron.png
diff --git a/src/drivers/webextension/images/icons/Shopcada.png b/src/drivers/webextension/images/icons/Shopcada.png
new file mode 100644
index 0000000000000000000000000000000000000000..0b793d9c924d12e076dbff6d915a9ecc2e323b69
Binary files /dev/null and b/src/drivers/webextension/images/icons/Shopcada.png differ
diff --git a/src/icons/Shoper.svg b/src/drivers/webextension/images/icons/Shoper.svg
similarity index 100%
rename from src/icons/Shoper.svg
rename to src/drivers/webextension/images/icons/Shoper.svg
diff --git a/src/icons/Shoperfa.png b/src/drivers/webextension/images/icons/Shoperfa.png
similarity index 100%
rename from src/icons/Shoperfa.png
rename to src/drivers/webextension/images/icons/Shoperfa.png
diff --git a/src/icons/Shopery.svg b/src/drivers/webextension/images/icons/Shopery.svg
similarity index 100%
rename from src/icons/Shopery.svg
rename to src/drivers/webextension/images/icons/Shopery.svg
diff --git a/src/drivers/webextension/images/icons/Shopfa.svg b/src/drivers/webextension/images/icons/Shopfa.svg
new file mode 100644
index 0000000000000000000000000000000000000000..5ba9389a1557c8e35824120b4ac400e6e4c2be4e
--- /dev/null
+++ b/src/drivers/webextension/images/icons/Shopfa.svg
@@ -0,0 +1,19 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/icons/Shopify.svg b/src/drivers/webextension/images/icons/Shopify.svg
similarity index 100%
rename from src/icons/Shopify.svg
rename to src/drivers/webextension/images/icons/Shopify.svg
diff --git a/src/icons/Shoptet.svg b/src/drivers/webextension/images/icons/Shoptet.svg
similarity index 100%
rename from src/icons/Shoptet.svg
rename to src/drivers/webextension/images/icons/Shoptet.svg
diff --git a/src/drivers/webextension/images/icons/Shopware.svg b/src/drivers/webextension/images/icons/Shopware.svg
new file mode 100644
index 0000000000000000000000000000000000000000..6b4a848bc5b43e8bea4d7e7e2d93a04d673a19d6
--- /dev/null
+++ b/src/drivers/webextension/images/icons/Shopware.svg
@@ -0,0 +1,10 @@
+
+
+
+ Artboard
+ Created with Sketch.
+
+
+
+
+
\ No newline at end of file
diff --git a/src/icons/Silva.png b/src/drivers/webextension/images/icons/Silva.png
similarity index 100%
rename from src/icons/Silva.png
rename to src/drivers/webextension/images/icons/Silva.png
diff --git a/src/icons/SilverStripe.svg b/src/drivers/webextension/images/icons/SilverStripe.svg
similarity index 100%
rename from src/icons/SilverStripe.svg
rename to src/drivers/webextension/images/icons/SilverStripe.svg
diff --git a/src/drivers/webextension/images/icons/SimpleAnalytics.svg b/src/drivers/webextension/images/icons/SimpleAnalytics.svg
new file mode 100644
index 0000000000000000000000000000000000000000..772ac7923ec6cedec3c530547ed0bf332e89d792
--- /dev/null
+++ b/src/drivers/webextension/images/icons/SimpleAnalytics.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/icons/Simplebo.png b/src/drivers/webextension/images/icons/Simplebo.png
similarity index 100%
rename from src/icons/Simplebo.png
rename to src/drivers/webextension/images/icons/Simplebo.png
diff --git a/src/icons/Site Meter.png b/src/drivers/webextension/images/icons/Site Meter.png
similarity index 100%
rename from src/icons/Site Meter.png
rename to src/drivers/webextension/images/icons/Site Meter.png
diff --git a/src/icons/SiteEdit.png b/src/drivers/webextension/images/icons/SiteEdit.png
similarity index 100%
rename from src/icons/SiteEdit.png
rename to src/drivers/webextension/images/icons/SiteEdit.png
diff --git a/src/icons/Sitecore.png b/src/drivers/webextension/images/icons/Sitecore.png
similarity index 100%
rename from src/icons/Sitecore.png
rename to src/drivers/webextension/images/icons/Sitecore.png
diff --git a/src/icons/Sitefinity.svg b/src/drivers/webextension/images/icons/Sitefinity.svg
similarity index 100%
rename from src/icons/Sitefinity.svg
rename to src/drivers/webextension/images/icons/Sitefinity.svg
diff --git a/src/drivers/webextension/images/icons/Siteglide.svg b/src/drivers/webextension/images/icons/Siteglide.svg
new file mode 100644
index 0000000000000000000000000000000000000000..113d8a863e1b22723bdb32ca82f8140ae549b477
--- /dev/null
+++ b/src/drivers/webextension/images/icons/Siteglide.svg
@@ -0,0 +1,12 @@
+
+
+
+ Artboard 3
+ Created with Sketch.
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/icons/Sivuviidakko.png b/src/drivers/webextension/images/icons/Sivuviidakko.png
similarity index 100%
rename from src/icons/Sivuviidakko.png
rename to src/drivers/webextension/images/icons/Sivuviidakko.png
diff --git a/src/icons/Sizmek.png b/src/drivers/webextension/images/icons/Sizmek.png
similarity index 100%
rename from src/icons/Sizmek.png
rename to src/drivers/webextension/images/icons/Sizmek.png
diff --git a/src/drivers/webextension/images/icons/SlickStack.png b/src/drivers/webextension/images/icons/SlickStack.png
new file mode 100644
index 0000000000000000000000000000000000000000..ed055754616625f7092b1426e9aa2d0db168fbef
Binary files /dev/null and b/src/drivers/webextension/images/icons/SlickStack.png differ
diff --git a/src/icons/Slimbox 2.png b/src/drivers/webextension/images/icons/Slimbox 2.png
similarity index 100%
rename from src/icons/Slimbox 2.png
rename to src/drivers/webextension/images/icons/Slimbox 2.png
diff --git a/src/icons/Slimbox.png b/src/drivers/webextension/images/icons/Slimbox.png
similarity index 100%
rename from src/icons/Slimbox.png
rename to src/drivers/webextension/images/icons/Slimbox.png
diff --git a/src/icons/Smart Ad Server.png b/src/drivers/webextension/images/icons/Smart Ad Server.png
similarity index 100%
rename from src/icons/Smart Ad Server.png
rename to src/drivers/webextension/images/icons/Smart Ad Server.png
diff --git a/src/icons/SmartSite.png b/src/drivers/webextension/images/icons/SmartSite.png
similarity index 100%
rename from src/icons/SmartSite.png
rename to src/drivers/webextension/images/icons/SmartSite.png
diff --git a/src/icons/Smartstore.png b/src/drivers/webextension/images/icons/Smartstore.biz.png
similarity index 100%
rename from src/icons/Smartstore.png
rename to src/drivers/webextension/images/icons/Smartstore.biz.png
diff --git a/src/drivers/webextension/images/icons/Smartstore.png b/src/drivers/webextension/images/icons/Smartstore.png
new file mode 100644
index 0000000000000000000000000000000000000000..91a23148505bc83788f74e75dbbdcb3ff84d2fdc
Binary files /dev/null and b/src/drivers/webextension/images/icons/Smartstore.png differ
diff --git a/src/icons/Snap.png b/src/drivers/webextension/images/icons/Snap.png
similarity index 100%
rename from src/icons/Snap.png
rename to src/drivers/webextension/images/icons/Snap.png
diff --git a/src/icons/Snap.svg.png b/src/drivers/webextension/images/icons/Snap.svg.png
similarity index 100%
rename from src/icons/Snap.svg.png
rename to src/drivers/webextension/images/icons/Snap.svg.png
diff --git a/src/icons/Snoobi.png b/src/drivers/webextension/images/icons/Snoobi.png
similarity index 100%
rename from src/icons/Snoobi.png
rename to src/drivers/webextension/images/icons/Snoobi.png
diff --git a/src/icons/SobiPro.png b/src/drivers/webextension/images/icons/SobiPro.png
similarity index 100%
rename from src/icons/SobiPro.png
rename to src/drivers/webextension/images/icons/SobiPro.png
diff --git a/src/drivers/webextension/images/icons/Socket.IO.svg b/src/drivers/webextension/images/icons/Socket.IO.svg
new file mode 100644
index 0000000000000000000000000000000000000000..21d042b6a58aa911abcd9c87fcd4f36df0449746
--- /dev/null
+++ b/src/drivers/webextension/images/icons/Socket.IO.svg
@@ -0,0 +1,16 @@
+
+
+
+ logo full
+ Created with Sketch.
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/drivers/webextension/images/icons/SolidPixels.png b/src/drivers/webextension/images/icons/SolidPixels.png
new file mode 100644
index 0000000000000000000000000000000000000000..b26327541fcdb75bd3737c689c1e05b751e25161
Binary files /dev/null and b/src/drivers/webextension/images/icons/SolidPixels.png differ
diff --git a/src/icons/Solodev.png b/src/drivers/webextension/images/icons/Solodev.png
similarity index 100%
rename from src/icons/Solodev.png
rename to src/drivers/webextension/images/icons/Solodev.png
diff --git a/src/icons/Solr.png b/src/drivers/webextension/images/icons/Solr.png
similarity index 100%
rename from src/icons/Solr.png
rename to src/drivers/webextension/images/icons/Solr.png
diff --git a/src/icons/Solusquare.png b/src/drivers/webextension/images/icons/Solusquare.png
similarity index 100%
rename from src/icons/Solusquare.png
rename to src/drivers/webextension/images/icons/Solusquare.png
diff --git a/src/icons/Solve Media.png b/src/drivers/webextension/images/icons/Solve Media.png
similarity index 100%
rename from src/icons/Solve Media.png
rename to src/drivers/webextension/images/icons/Solve Media.png
diff --git a/src/icons/SoundManager.png b/src/drivers/webextension/images/icons/SoundManager.png
similarity index 100%
rename from src/icons/SoundManager.png
rename to src/drivers/webextension/images/icons/SoundManager.png
diff --git a/src/icons/Sphinx.png b/src/drivers/webextension/images/icons/Sphinx.png
similarity index 100%
rename from src/icons/Sphinx.png
rename to src/drivers/webextension/images/icons/Sphinx.png
diff --git a/src/icons/SpinCMS.png b/src/drivers/webextension/images/icons/SpinCMS.png
similarity index 100%
rename from src/icons/SpinCMS.png
rename to src/drivers/webextension/images/icons/SpinCMS.png
diff --git a/src/icons/Splunk.png b/src/drivers/webextension/images/icons/Splunk.png
similarity index 100%
rename from src/icons/Splunk.png
rename to src/drivers/webextension/images/icons/Splunk.png
diff --git a/src/icons/Spree.png b/src/drivers/webextension/images/icons/Spree.png
similarity index 100%
rename from src/icons/Spree.png
rename to src/drivers/webextension/images/icons/Spree.png
diff --git a/src/drivers/webextension/images/icons/Spring.png b/src/drivers/webextension/images/icons/Spring.png
new file mode 100644
index 0000000000000000000000000000000000000000..2681e19e4823e51ee08779c83b28b7ec21129421
Binary files /dev/null and b/src/drivers/webextension/images/icons/Spring.png differ
diff --git a/src/drivers/webextension/images/icons/Sqreen.png b/src/drivers/webextension/images/icons/Sqreen.png
new file mode 100644
index 0000000000000000000000000000000000000000..d9e6acca5d0d41224e450167b8a2b20b48cb1cfb
Binary files /dev/null and b/src/drivers/webextension/images/icons/Sqreen.png differ
diff --git a/src/icons/Squarespace.png b/src/drivers/webextension/images/icons/Squarespace.png
similarity index 100%
rename from src/icons/Squarespace.png
rename to src/drivers/webextension/images/icons/Squarespace.png
diff --git a/src/icons/SquirrelMail.png b/src/drivers/webextension/images/icons/SquirrelMail.png
similarity index 100%
rename from src/icons/SquirrelMail.png
rename to src/drivers/webextension/images/icons/SquirrelMail.png
diff --git a/src/icons/Squiz Matrix.png b/src/drivers/webextension/images/icons/Squiz Matrix.png
similarity index 100%
rename from src/icons/Squiz Matrix.png
rename to src/drivers/webextension/images/icons/Squiz Matrix.png
diff --git a/src/icons/Stackla.png b/src/drivers/webextension/images/icons/Stackla.png
similarity index 100%
rename from src/icons/Stackla.png
rename to src/drivers/webextension/images/icons/Stackla.png
diff --git a/src/icons/Starlet.png b/src/drivers/webextension/images/icons/Starlet.png
similarity index 100%
rename from src/icons/Starlet.png
rename to src/drivers/webextension/images/icons/Starlet.png
diff --git a/src/icons/Statcounter.svg b/src/drivers/webextension/images/icons/Statcounter.svg
similarity index 100%
rename from src/icons/Statcounter.svg
rename to src/drivers/webextension/images/icons/Statcounter.svg
diff --git a/src/icons/Store Systems.png b/src/drivers/webextension/images/icons/Store Systems.png
similarity index 100%
rename from src/icons/Store Systems.png
rename to src/drivers/webextension/images/icons/Store Systems.png
diff --git a/src/drivers/webextension/images/icons/Strapi.png b/src/drivers/webextension/images/icons/Strapi.png
new file mode 100644
index 0000000000000000000000000000000000000000..8abd8b03ab34d4dde42909331d8854090e738ead
Binary files /dev/null and b/src/drivers/webextension/images/icons/Strapi.png differ
diff --git a/src/drivers/webextension/images/icons/Strikingly.png b/src/drivers/webextension/images/icons/Strikingly.png
new file mode 100644
index 0000000000000000000000000000000000000000..a50cecb31bfb5ffb1206d7d67382f0e1a0ef8104
Binary files /dev/null and b/src/drivers/webextension/images/icons/Strikingly.png differ
diff --git a/src/icons/Stripe.png b/src/drivers/webextension/images/icons/Stripe.png
similarity index 100%
rename from src/icons/Stripe.png
rename to src/drivers/webextension/images/icons/Stripe.png
diff --git a/src/icons/SublimeVideo.png b/src/drivers/webextension/images/icons/SublimeVideo.png
similarity index 100%
rename from src/icons/SublimeVideo.png
rename to src/drivers/webextension/images/icons/SublimeVideo.png
diff --git a/src/icons/Subrion.png b/src/drivers/webextension/images/icons/Subrion.png
similarity index 100%
rename from src/icons/Subrion.png
rename to src/drivers/webextension/images/icons/Subrion.png
diff --git a/src/icons/Sulu.svg b/src/drivers/webextension/images/icons/Sulu.svg
similarity index 100%
rename from src/icons/Sulu.svg
rename to src/drivers/webextension/images/icons/Sulu.svg
diff --git a/src/icons/SumoMe.png b/src/drivers/webextension/images/icons/SumoMe.png
similarity index 100%
rename from src/icons/SumoMe.png
rename to src/drivers/webextension/images/icons/SumoMe.png
diff --git a/src/icons/Supersized.png b/src/drivers/webextension/images/icons/Supersized.png
similarity index 100%
rename from src/icons/Supersized.png
rename to src/drivers/webextension/images/icons/Supersized.png
diff --git a/src/icons/Svelte.svg b/src/drivers/webextension/images/icons/Svelte.svg
similarity index 100%
rename from src/icons/Svelte.svg
rename to src/drivers/webextension/images/icons/Svelte.svg
diff --git a/src/icons/SweetAlert.png b/src/drivers/webextension/images/icons/SweetAlert.png
similarity index 100%
rename from src/icons/SweetAlert.png
rename to src/drivers/webextension/images/icons/SweetAlert.png
diff --git a/src/drivers/webextension/images/icons/SweetAlert2.png b/src/drivers/webextension/images/icons/SweetAlert2.png
new file mode 100644
index 0000000000000000000000000000000000000000..afdb2d3c2ad85a6117b9d61475d2157c4c98dc92
Binary files /dev/null and b/src/drivers/webextension/images/icons/SweetAlert2.png differ
diff --git a/src/drivers/webextension/images/icons/Swell.svg b/src/drivers/webextension/images/icons/Swell.svg
new file mode 100644
index 0000000000000000000000000000000000000000..a118ee64b00ed9eabe9b17e995adf9c3b5f54cc3
--- /dev/null
+++ b/src/drivers/webextension/images/icons/Swell.svg
@@ -0,0 +1,20 @@
+
+
+
+
+
+
+
+
+
+
diff --git a/src/icons/Swiftlet.png b/src/drivers/webextension/images/icons/Swiftlet.png
similarity index 100%
rename from src/icons/Swiftlet.png
rename to src/drivers/webextension/images/icons/Swiftlet.png
diff --git a/src/drivers/webextension/images/icons/Symfony.svg b/src/drivers/webextension/images/icons/Symfony.svg
new file mode 100644
index 0000000000000000000000000000000000000000..673baf202dda086f304ed59c858ea6616d505514
--- /dev/null
+++ b/src/drivers/webextension/images/icons/Symfony.svg
@@ -0,0 +1,39 @@
+
+
+ Symfony logo
+
+
+
+ image/svg+xml
+
+ Symfony logo
+
+
+
+
+
+
+
diff --git a/src/icons/Synology DiskStation.png b/src/drivers/webextension/images/icons/Synology DiskStation.png
similarity index 100%
rename from src/icons/Synology DiskStation.png
rename to src/drivers/webextension/images/icons/Synology DiskStation.png
diff --git a/src/icons/SyntaxHighlighter.png b/src/drivers/webextension/images/icons/SyntaxHighlighter.png
similarity index 100%
rename from src/icons/SyntaxHighlighter.png
rename to src/drivers/webextension/images/icons/SyntaxHighlighter.png
diff --git a/src/icons/TWiki.png b/src/drivers/webextension/images/icons/TWiki.png
similarity index 100%
rename from src/icons/TWiki.png
rename to src/drivers/webextension/images/icons/TWiki.png
diff --git a/src/icons/TYPO3.svg b/src/drivers/webextension/images/icons/TYPO3.svg
similarity index 100%
rename from src/icons/TYPO3.svg
rename to src/drivers/webextension/images/icons/TYPO3.svg
diff --git a/src/drivers/webextension/images/icons/Taggbox.svg b/src/drivers/webextension/images/icons/Taggbox.svg
new file mode 100644
index 0000000000000000000000000000000000000000..96c9ff0651d15d7dc933b574f419b352f7210cfc
--- /dev/null
+++ b/src/drivers/webextension/images/icons/Taggbox.svg
@@ -0,0 +1 @@
+
Taggbox-T
\ No newline at end of file
diff --git a/src/icons/Taiga.png b/src/drivers/webextension/images/icons/Taiga.png
similarity index 100%
rename from src/icons/Taiga.png
rename to src/drivers/webextension/images/icons/Taiga.png
diff --git a/src/drivers/webextension/images/icons/Tamago.png b/src/drivers/webextension/images/icons/Tamago.png
new file mode 100644
index 0000000000000000000000000000000000000000..c15b06a569a7ca5ad47a84319824a97c2cc1955d
Binary files /dev/null and b/src/drivers/webextension/images/icons/Tamago.png differ
diff --git a/src/icons/TawkTo.png b/src/drivers/webextension/images/icons/TawkTo.png
similarity index 100%
rename from src/icons/TawkTo.png
rename to src/drivers/webextension/images/icons/TawkTo.png
diff --git a/src/icons/Tealeaf.png b/src/drivers/webextension/images/icons/Tealeaf.png
similarity index 100%
rename from src/icons/Tealeaf.png
rename to src/drivers/webextension/images/icons/Tealeaf.png
diff --git a/src/icons/Tealium.png b/src/drivers/webextension/images/icons/Tealium.png
similarity index 100%
rename from src/icons/Tealium.png
rename to src/drivers/webextension/images/icons/Tealium.png
diff --git a/src/icons/TeamCity.svg b/src/drivers/webextension/images/icons/TeamCity.svg
similarity index 100%
rename from src/icons/TeamCity.svg
rename to src/drivers/webextension/images/icons/TeamCity.svg
diff --git a/src/drivers/webextension/images/icons/Tebex.png b/src/drivers/webextension/images/icons/Tebex.png
new file mode 100644
index 0000000000000000000000000000000000000000..bfe7b5ecb51a54068557351aac7c9d68680b499c
Binary files /dev/null and b/src/drivers/webextension/images/icons/Tebex.png differ
diff --git a/src/icons/Telescope.png b/src/drivers/webextension/images/icons/Telescope.png
similarity index 100%
rename from src/icons/Telescope.png
rename to src/drivers/webextension/images/icons/Telescope.png
diff --git a/src/drivers/webextension/images/icons/TencentWaterproofWall.png b/src/drivers/webextension/images/icons/TencentWaterproofWall.png
new file mode 100644
index 0000000000000000000000000000000000000000..1a43c29c5cd85269b39c123a0585d5b19881eda4
Binary files /dev/null and b/src/drivers/webextension/images/icons/TencentWaterproofWall.png differ
diff --git a/src/icons/Tengine.png b/src/drivers/webextension/images/icons/Tengine.png
similarity index 100%
rename from src/icons/Tengine.png
rename to src/drivers/webextension/images/icons/Tengine.png
diff --git a/src/drivers/webextension/images/icons/Texthelp.png b/src/drivers/webextension/images/icons/Texthelp.png
new file mode 100644
index 0000000000000000000000000000000000000000..3232e1d76cc8bcabe37c3673761d9bf6fdda8bde
Binary files /dev/null and b/src/drivers/webextension/images/icons/Texthelp.png differ
diff --git a/src/icons/Textpattern CMS.png b/src/drivers/webextension/images/icons/Textpattern CMS.png
similarity index 100%
rename from src/icons/Textpattern CMS.png
rename to src/drivers/webextension/images/icons/Textpattern CMS.png
diff --git a/src/drivers/webextension/images/icons/TheHutGroup.png b/src/drivers/webextension/images/icons/TheHutGroup.png
new file mode 100644
index 0000000000000000000000000000000000000000..9847bb7b78e996bcd188467cb07fd502deba5288
Binary files /dev/null and b/src/drivers/webextension/images/icons/TheHutGroup.png differ
diff --git a/src/icons/Thelia.png b/src/drivers/webextension/images/icons/Thelia.png
similarity index 100%
rename from src/icons/Thelia.png
rename to src/drivers/webextension/images/icons/Thelia.png
diff --git a/src/icons/ThinkPHP.png b/src/drivers/webextension/images/icons/ThinkPHP.png
similarity index 100%
rename from src/icons/ThinkPHP.png
rename to src/drivers/webextension/images/icons/ThinkPHP.png
diff --git a/src/drivers/webextension/images/icons/Ticimax.png b/src/drivers/webextension/images/icons/Ticimax.png
new file mode 100644
index 0000000000000000000000000000000000000000..be9d037535e2e4f35498d007f4daa7016239feab
Binary files /dev/null and b/src/drivers/webextension/images/icons/Ticimax.png differ
diff --git a/src/icons/TiddlyWiki.png b/src/drivers/webextension/images/icons/TiddlyWiki.png
similarity index 100%
rename from src/icons/TiddlyWiki.png
rename to src/drivers/webextension/images/icons/TiddlyWiki.png
diff --git a/src/icons/Tiki Wiki CMS Groupware.png b/src/drivers/webextension/images/icons/Tiki Wiki CMS Groupware.png
similarity index 100%
rename from src/icons/Tiki Wiki CMS Groupware.png
rename to src/drivers/webextension/images/icons/Tiki Wiki CMS Groupware.png
diff --git a/src/icons/Tilda.svg b/src/drivers/webextension/images/icons/Tilda.svg
similarity index 100%
rename from src/icons/Tilda.svg
rename to src/drivers/webextension/images/icons/Tilda.svg
diff --git a/src/icons/Timeplot.png b/src/drivers/webextension/images/icons/Timeplot.png
similarity index 100%
rename from src/icons/Timeplot.png
rename to src/drivers/webextension/images/icons/Timeplot.png
diff --git a/src/icons/TinyMCE.png b/src/drivers/webextension/images/icons/TinyMCE.png
similarity index 100%
rename from src/icons/TinyMCE.png
rename to src/drivers/webextension/images/icons/TinyMCE.png
diff --git a/src/icons/Titan.png b/src/drivers/webextension/images/icons/Titan.png
similarity index 100%
rename from src/icons/Titan.png
rename to src/drivers/webextension/images/icons/Titan.png
diff --git a/src/icons/TomatoCart.png b/src/drivers/webextension/images/icons/TomatoCart.png
similarity index 100%
rename from src/icons/TomatoCart.png
rename to src/drivers/webextension/images/icons/TomatoCart.png
diff --git a/src/icons/TornadoServer.png b/src/drivers/webextension/images/icons/TornadoServer.png
similarity index 100%
rename from src/icons/TornadoServer.png
rename to src/drivers/webextension/images/icons/TornadoServer.png
diff --git a/src/drivers/webextension/images/icons/TotalCode.png b/src/drivers/webextension/images/icons/TotalCode.png
new file mode 100644
index 0000000000000000000000000000000000000000..27867f94a1f127a790e029e380d336ab8a484732
Binary files /dev/null and b/src/drivers/webextension/images/icons/TotalCode.png differ
diff --git a/src/icons/Trac.png b/src/drivers/webextension/images/icons/Trac.png
similarity index 100%
rename from src/icons/Trac.png
rename to src/drivers/webextension/images/icons/Trac.png
diff --git a/src/icons/TrackJs.png b/src/drivers/webextension/images/icons/TrackJs.png
similarity index 100%
rename from src/icons/TrackJs.png
rename to src/drivers/webextension/images/icons/TrackJs.png
diff --git a/src/drivers/webextension/images/icons/TrustArc.svg b/src/drivers/webextension/images/icons/TrustArc.svg
new file mode 100644
index 0000000000000000000000000000000000000000..27f47cfcadd579458324439726b2b116c3d6ca55
--- /dev/null
+++ b/src/drivers/webextension/images/icons/TrustArc.svg
@@ -0,0 +1,34 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/drivers/webextension/images/icons/Tsoft.png b/src/drivers/webextension/images/icons/Tsoft.png
new file mode 100644
index 0000000000000000000000000000000000000000..df5c8c31fd0d4f09b05ac729faa958eafe94c54f
Binary files /dev/null and b/src/drivers/webextension/images/icons/Tsoft.png differ
diff --git a/src/icons/Tumblr.png b/src/drivers/webextension/images/icons/Tumblr.png
similarity index 100%
rename from src/icons/Tumblr.png
rename to src/drivers/webextension/images/icons/Tumblr.png
diff --git a/src/icons/TweenMax.png b/src/drivers/webextension/images/icons/TweenMax.png
similarity index 100%
rename from src/icons/TweenMax.png
rename to src/drivers/webextension/images/icons/TweenMax.png
diff --git a/src/icons/Twilight CMS.png b/src/drivers/webextension/images/icons/Twilight CMS.png
similarity index 100%
rename from src/icons/Twilight CMS.png
rename to src/drivers/webextension/images/icons/Twilight CMS.png
diff --git a/src/icons/TwistPHP.png b/src/drivers/webextension/images/icons/TwistPHP.png
similarity index 100%
rename from src/icons/TwistPHP.png
rename to src/drivers/webextension/images/icons/TwistPHP.png
diff --git a/src/icons/TwistedWeb.png b/src/drivers/webextension/images/icons/TwistedWeb.png
similarity index 100%
rename from src/icons/TwistedWeb.png
rename to src/drivers/webextension/images/icons/TwistedWeb.png
diff --git a/src/icons/Twitter Flight.png b/src/drivers/webextension/images/icons/Twitter Flight.png
similarity index 100%
rename from src/icons/Twitter Flight.png
rename to src/drivers/webextension/images/icons/Twitter Flight.png
diff --git a/src/icons/Twitter typeahead.js.png b/src/drivers/webextension/images/icons/Twitter typeahead.js.png
similarity index 100%
rename from src/icons/Twitter typeahead.js.png
rename to src/drivers/webextension/images/icons/Twitter typeahead.js.png
diff --git a/src/icons/Twitter.svg b/src/drivers/webextension/images/icons/Twitter.svg
similarity index 100%
rename from src/icons/Twitter.svg
rename to src/drivers/webextension/images/icons/Twitter.svg
diff --git a/src/icons/TypePad.png b/src/drivers/webextension/images/icons/TypePad.png
similarity index 100%
rename from src/icons/TypePad.png
rename to src/drivers/webextension/images/icons/TypePad.png
diff --git a/src/icons/Typekit.png b/src/drivers/webextension/images/icons/Typekit.png
similarity index 100%
rename from src/icons/Typekit.png
rename to src/drivers/webextension/images/icons/Typekit.png
diff --git a/src/icons/UIKit.png b/src/drivers/webextension/images/icons/UIKit.png
similarity index 100%
rename from src/icons/UIKit.png
rename to src/drivers/webextension/images/icons/UIKit.png
diff --git a/src/icons/UMI.CMS.png b/src/drivers/webextension/images/icons/UMI.CMS.png
similarity index 100%
rename from src/icons/UMI.CMS.png
rename to src/drivers/webextension/images/icons/UMI.CMS.png
diff --git a/src/icons/UNIX.png b/src/drivers/webextension/images/icons/UNIX.png
similarity index 100%
rename from src/icons/UNIX.png
rename to src/drivers/webextension/images/icons/UNIX.png
diff --git a/src/icons/Ubercart.png b/src/drivers/webextension/images/icons/Ubercart.png
similarity index 100%
rename from src/icons/Ubercart.png
rename to src/drivers/webextension/images/icons/Ubercart.png
diff --git a/src/icons/Ubuntu.png b/src/drivers/webextension/images/icons/Ubuntu.png
similarity index 100%
rename from src/icons/Ubuntu.png
rename to src/drivers/webextension/images/icons/Ubuntu.png
diff --git a/src/icons/UltraCart.png b/src/drivers/webextension/images/icons/UltraCart.png
similarity index 100%
rename from src/icons/UltraCart.png
rename to src/drivers/webextension/images/icons/UltraCart.png
diff --git a/src/icons/Umbraco.png b/src/drivers/webextension/images/icons/Umbraco.png
similarity index 100%
rename from src/icons/Umbraco.png
rename to src/drivers/webextension/images/icons/Umbraco.png
diff --git a/src/icons/Unbounce.png b/src/drivers/webextension/images/icons/Unbounce.png
similarity index 100%
rename from src/icons/Unbounce.png
rename to src/drivers/webextension/images/icons/Unbounce.png
diff --git a/src/icons/Underscore.js.png b/src/drivers/webextension/images/icons/Underscore.js.png
similarity index 100%
rename from src/icons/Underscore.js.png
rename to src/drivers/webextension/images/icons/Underscore.js.png
diff --git a/src/drivers/webextension/images/icons/Uniconsent.png b/src/drivers/webextension/images/icons/Uniconsent.png
new file mode 100644
index 0000000000000000000000000000000000000000..216bcda6398ec4fdddee4852618c54dfa04458b3
Binary files /dev/null and b/src/drivers/webextension/images/icons/Uniconsent.png differ
diff --git a/src/icons/Usabilla.svg b/src/drivers/webextension/images/icons/Usabilla.svg
similarity index 100%
rename from src/icons/Usabilla.svg
rename to src/drivers/webextension/images/icons/Usabilla.svg
diff --git a/src/drivers/webextension/images/icons/UsableNet.png b/src/drivers/webextension/images/icons/UsableNet.png
new file mode 100644
index 0000000000000000000000000000000000000000..178b352c87cee4b230684d5d8128ecba14f02272
Binary files /dev/null and b/src/drivers/webextension/images/icons/UsableNet.png differ
diff --git a/src/drivers/webextension/images/icons/User1st.png b/src/drivers/webextension/images/icons/User1st.png
new file mode 100644
index 0000000000000000000000000000000000000000..35c4c9d4f2a882529ccc1a8f63b234c76626ce10
Binary files /dev/null and b/src/drivers/webextension/images/icons/User1st.png differ
diff --git a/src/icons/UserLike.svg b/src/drivers/webextension/images/icons/UserLike.svg
similarity index 100%
rename from src/icons/UserLike.svg
rename to src/drivers/webextension/images/icons/UserLike.svg
diff --git a/src/icons/UserRules.png b/src/drivers/webextension/images/icons/UserRules.png
similarity index 100%
rename from src/icons/UserRules.png
rename to src/drivers/webextension/images/icons/UserRules.png
diff --git a/src/icons/UserVoice.png b/src/drivers/webextension/images/icons/UserVoice.png
similarity index 100%
rename from src/icons/UserVoice.png
rename to src/drivers/webextension/images/icons/UserVoice.png
diff --git a/src/drivers/webextension/images/icons/UserWay.png b/src/drivers/webextension/images/icons/UserWay.png
new file mode 100644
index 0000000000000000000000000000000000000000..1f36a488c470bd600ab96e50183d9431973416b5
Binary files /dev/null and b/src/drivers/webextension/images/icons/UserWay.png differ
diff --git a/src/icons/Ushahidi.png b/src/drivers/webextension/images/icons/Ushahidi.png
similarity index 100%
rename from src/icons/Ushahidi.png
rename to src/drivers/webextension/images/icons/Ushahidi.png
diff --git a/src/icons/VIVVO.png b/src/drivers/webextension/images/icons/VIVVO.png
similarity index 100%
rename from src/icons/VIVVO.png
rename to src/drivers/webextension/images/icons/VIVVO.png
diff --git a/src/icons/VP-ASP.png b/src/drivers/webextension/images/icons/VP-ASP.png
similarity index 100%
rename from src/icons/VP-ASP.png
rename to src/drivers/webextension/images/icons/VP-ASP.png
diff --git a/src/icons/VTEX.svg b/src/drivers/webextension/images/icons/VTEX.svg
similarity index 100%
rename from src/icons/VTEX.svg
rename to src/drivers/webextension/images/icons/VTEX.svg
diff --git a/src/icons/Vaadin.svg b/src/drivers/webextension/images/icons/Vaadin.svg
similarity index 100%
rename from src/icons/Vaadin.svg
rename to src/drivers/webextension/images/icons/Vaadin.svg
diff --git a/src/icons/Vanilla.png b/src/drivers/webextension/images/icons/Vanilla.png
similarity index 100%
rename from src/icons/Vanilla.png
rename to src/drivers/webextension/images/icons/Vanilla.png
diff --git a/src/icons/Varnish.svg b/src/drivers/webextension/images/icons/Varnish.svg
similarity index 100%
rename from src/icons/Varnish.svg
rename to src/drivers/webextension/images/icons/Varnish.svg
diff --git a/src/drivers/webextension/images/icons/Venmo.svg b/src/drivers/webextension/images/icons/Venmo.svg
new file mode 100644
index 0000000000000000000000000000000000000000..b976e651012bcc768c2cbf94edcfc7e7c3140ebf
--- /dev/null
+++ b/src/drivers/webextension/images/icons/Venmo.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/icons/Veoxa.png b/src/drivers/webextension/images/icons/Veoxa.png
similarity index 100%
rename from src/icons/Veoxa.png
rename to src/drivers/webextension/images/icons/Veoxa.png
diff --git a/src/drivers/webextension/images/icons/VideoJS.svg b/src/drivers/webextension/images/icons/VideoJS.svg
new file mode 100644
index 0000000000000000000000000000000000000000..135d2c6eda23074fd359043d99fbee98dddfd256
--- /dev/null
+++ b/src/drivers/webextension/images/icons/VideoJS.svg
@@ -0,0 +1,54 @@
+
+
+
+
+
+ image/svg+xml
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/icons/VigLink.png b/src/drivers/webextension/images/icons/VigLink.png
similarity index 100%
rename from src/icons/VigLink.png
rename to src/drivers/webextension/images/icons/VigLink.png
diff --git a/src/icons/Vignette.png b/src/drivers/webextension/images/icons/Vignette.png
similarity index 100%
rename from src/icons/Vignette.png
rename to src/drivers/webextension/images/icons/Vignette.png
diff --git a/src/icons/Vimeo.png b/src/drivers/webextension/images/icons/Vimeo.png
similarity index 100%
rename from src/icons/Vimeo.png
rename to src/drivers/webextension/images/icons/Vimeo.png
diff --git a/src/icons/Virgool.svg b/src/drivers/webextension/images/icons/Virgool.svg
similarity index 100%
rename from src/icons/Virgool.svg
rename to src/drivers/webextension/images/icons/Virgool.svg
diff --git a/src/icons/VirtueMart.png b/src/drivers/webextension/images/icons/VirtueMart.png
similarity index 100%
rename from src/icons/VirtueMart.png
rename to src/drivers/webextension/images/icons/VirtueMart.png
diff --git a/src/drivers/webextension/images/icons/Visa.svg b/src/drivers/webextension/images/icons/Visa.svg
new file mode 100644
index 0000000000000000000000000000000000000000..22f76beefce3b2c83aa6bb60858412b29604e8fa
--- /dev/null
+++ b/src/drivers/webextension/images/icons/Visa.svg
@@ -0,0 +1,14 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/icons/VisualPath.png b/src/drivers/webextension/images/icons/VisualPath.png
similarity index 100%
rename from src/icons/VisualPath.png
rename to src/drivers/webextension/images/icons/VisualPath.png
diff --git a/src/icons/Volusion.svg b/src/drivers/webextension/images/icons/Volusion.svg
similarity index 100%
rename from src/icons/Volusion.svg
rename to src/drivers/webextension/images/icons/Volusion.svg
diff --git a/src/drivers/webextension/images/icons/VuePress.svg b/src/drivers/webextension/images/icons/VuePress.svg
new file mode 100644
index 0000000000000000000000000000000000000000..1730e2a9d45d3af68438df8c1fafba3ac8fa1c9a
--- /dev/null
+++ b/src/drivers/webextension/images/icons/VuePress.svg
@@ -0,0 +1,46 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/icons/W3 Total Cache.png b/src/drivers/webextension/images/icons/W3 Total Cache.png
similarity index 100%
rename from src/icons/W3 Total Cache.png
rename to src/drivers/webextension/images/icons/W3 Total Cache.png
diff --git a/src/icons/W3Counter.png b/src/drivers/webextension/images/icons/W3Counter.png
similarity index 100%
rename from src/icons/W3Counter.png
rename to src/drivers/webextension/images/icons/W3Counter.png
diff --git a/src/icons/WEBXPAY.png b/src/drivers/webextension/images/icons/WEBXPAY.png
similarity index 100%
rename from src/icons/WEBXPAY.png
rename to src/drivers/webextension/images/icons/WEBXPAY.png
diff --git a/src/icons/WHMCS.png b/src/drivers/webextension/images/icons/WHMCS.png
similarity index 100%
rename from src/icons/WHMCS.png
rename to src/drivers/webextension/images/icons/WHMCS.png
diff --git a/src/icons/WP Rocket.png b/src/drivers/webextension/images/icons/WP Rocket.png
similarity index 100%
rename from src/icons/WP Rocket.png
rename to src/drivers/webextension/images/icons/WP Rocket.png
diff --git a/src/icons/WP-Statistics.png b/src/drivers/webextension/images/icons/WP-Statistics.png
similarity index 100%
rename from src/icons/WP-Statistics.png
rename to src/drivers/webextension/images/icons/WP-Statistics.png
diff --git a/src/drivers/webextension/images/icons/WPCacheOn.png b/src/drivers/webextension/images/icons/WPCacheOn.png
new file mode 100644
index 0000000000000000000000000000000000000000..a7ff20fb66aa76d057487d70513953db0df53809
Binary files /dev/null and b/src/drivers/webextension/images/icons/WPCacheOn.png differ
diff --git a/src/icons/Warp.png b/src/drivers/webextension/images/icons/Warp.png
similarity index 100%
rename from src/icons/Warp.png
rename to src/drivers/webextension/images/icons/Warp.png
diff --git a/src/icons/Web2py.png b/src/drivers/webextension/images/icons/Web2py.png
similarity index 100%
rename from src/icons/Web2py.png
rename to src/drivers/webextension/images/icons/Web2py.png
diff --git a/src/icons/WebGUI.png b/src/drivers/webextension/images/icons/WebGUI.png
similarity index 100%
rename from src/icons/WebGUI.png
rename to src/drivers/webextension/images/icons/WebGUI.png
diff --git a/src/icons/WebPublisher.png b/src/drivers/webextension/images/icons/WebPublisher.png
similarity index 100%
rename from src/icons/WebPublisher.png
rename to src/drivers/webextension/images/icons/WebPublisher.png
diff --git a/src/icons/WebSite X5.png b/src/drivers/webextension/images/icons/WebSite X5.png
similarity index 100%
rename from src/icons/WebSite X5.png
rename to src/drivers/webextension/images/icons/WebSite X5.png
diff --git a/src/icons/Webix.png b/src/drivers/webextension/images/icons/Webix.png
similarity index 100%
rename from src/icons/Webix.png
rename to src/drivers/webextension/images/icons/Webix.png
diff --git a/src/icons/WebsPlanet.png b/src/drivers/webextension/images/icons/WebsPlanet.png
similarity index 100%
rename from src/icons/WebsPlanet.png
rename to src/drivers/webextension/images/icons/WebsPlanet.png
diff --git a/src/icons/Websale.png b/src/drivers/webextension/images/icons/Websale.png
similarity index 100%
rename from src/icons/Websale.png
rename to src/drivers/webextension/images/icons/Websale.png
diff --git a/src/icons/WebsiteBaker.png b/src/drivers/webextension/images/icons/WebsiteBaker.png
similarity index 100%
rename from src/icons/WebsiteBaker.png
rename to src/drivers/webextension/images/icons/WebsiteBaker.png
diff --git a/src/drivers/webextension/images/icons/WebsiteCreator.png b/src/drivers/webextension/images/icons/WebsiteCreator.png
new file mode 100644
index 0000000000000000000000000000000000000000..54527eac170215473ee077ad8cc4c98012ca4a3d
Binary files /dev/null and b/src/drivers/webextension/images/icons/WebsiteCreator.png differ
diff --git a/src/icons/Webtrekk.png b/src/drivers/webextension/images/icons/Webtrekk.png
similarity index 100%
rename from src/icons/Webtrekk.png
rename to src/drivers/webextension/images/icons/Webtrekk.png
diff --git a/src/icons/Webtrends.png b/src/drivers/webextension/images/icons/Webtrends.png
similarity index 100%
rename from src/icons/Webtrends.png
rename to src/drivers/webextension/images/icons/Webtrends.png
diff --git a/src/icons/Webzi.svg b/src/drivers/webextension/images/icons/Webzi.svg
similarity index 100%
rename from src/icons/Webzi.svg
rename to src/drivers/webextension/images/icons/Webzi.svg
diff --git a/src/icons/Weebly.png b/src/drivers/webextension/images/icons/Weebly.png
similarity index 100%
rename from src/icons/Weebly.png
rename to src/drivers/webextension/images/icons/Weebly.png
diff --git a/src/drivers/webextension/images/icons/Weglot.png b/src/drivers/webextension/images/icons/Weglot.png
new file mode 100644
index 0000000000000000000000000000000000000000..20c6aa34ec317e95202d615d1488489f00901962
Binary files /dev/null and b/src/drivers/webextension/images/icons/Weglot.png differ
diff --git a/src/icons/Whooshkaa.svg b/src/drivers/webextension/images/icons/Whooshkaa.svg
similarity index 100%
rename from src/icons/Whooshkaa.svg
rename to src/drivers/webextension/images/icons/Whooshkaa.svg
diff --git a/src/icons/WikkaWiki.png b/src/drivers/webextension/images/icons/WikkaWiki.png
similarity index 100%
rename from src/icons/WikkaWiki.png
rename to src/drivers/webextension/images/icons/WikkaWiki.png
diff --git a/src/drivers/webextension/images/icons/WindowsServer.png b/src/drivers/webextension/images/icons/WindowsServer.png
new file mode 100644
index 0000000000000000000000000000000000000000..8a2190b57b31144d11fcfc65913cfdbd41a8090a
Binary files /dev/null and b/src/drivers/webextension/images/icons/WindowsServer.png differ
diff --git a/src/icons/Wink.png b/src/drivers/webextension/images/icons/Wink.png
similarity index 100%
rename from src/icons/Wink.png
rename to src/drivers/webextension/images/icons/Wink.png
diff --git a/src/icons/Wix.png b/src/drivers/webextension/images/icons/Wix.png
similarity index 100%
rename from src/icons/Wix.png
rename to src/drivers/webextension/images/icons/Wix.png
diff --git a/src/icons/Wolf CMS.png b/src/drivers/webextension/images/icons/Wolf CMS.png
similarity index 100%
rename from src/icons/Wolf CMS.png
rename to src/drivers/webextension/images/icons/Wolf CMS.png
diff --git a/src/drivers/webextension/images/icons/Woltlab Community Framework.png b/src/drivers/webextension/images/icons/Woltlab Community Framework.png
new file mode 100644
index 0000000000000000000000000000000000000000..90471a320062dde1b207b495bdd69277b87c5e49
Binary files /dev/null and b/src/drivers/webextension/images/icons/Woltlab Community Framework.png differ
diff --git a/src/drivers/webextension/images/icons/WooCommerce.png b/src/drivers/webextension/images/icons/WooCommerce.png
new file mode 100644
index 0000000000000000000000000000000000000000..5e2607c4fcde1e2400d05e55fc3b205333ef809a
Binary files /dev/null and b/src/drivers/webextension/images/icons/WooCommerce.png differ
diff --git a/src/icons/Woopra.png b/src/drivers/webextension/images/icons/Woopra.png
similarity index 100%
rename from src/icons/Woopra.png
rename to src/drivers/webextension/images/icons/Woopra.png
diff --git a/src/icons/WordPress.svg b/src/drivers/webextension/images/icons/WordPress.svg
similarity index 100%
rename from src/icons/WordPress.svg
rename to src/drivers/webextension/images/icons/WordPress.svg
diff --git a/src/icons/Wowza Media Server.png b/src/drivers/webextension/images/icons/Wowza Media Server.png
similarity index 100%
rename from src/icons/Wowza Media Server.png
rename to src/drivers/webextension/images/icons/Wowza Media Server.png
diff --git a/src/icons/X-Cart.png b/src/drivers/webextension/images/icons/X-Cart.png
similarity index 100%
rename from src/icons/X-Cart.png
rename to src/drivers/webextension/images/icons/X-Cart.png
diff --git a/src/icons/XAMPP.png b/src/drivers/webextension/images/icons/XAMPP.png
similarity index 100%
rename from src/icons/XAMPP.png
rename to src/drivers/webextension/images/icons/XAMPP.png
diff --git a/src/icons/XMB.png b/src/drivers/webextension/images/icons/XMB.png
similarity index 100%
rename from src/icons/XMB.png
rename to src/drivers/webextension/images/icons/XMB.png
diff --git a/src/icons/XOOPS.png b/src/drivers/webextension/images/icons/XOOPS.png
similarity index 100%
rename from src/icons/XOOPS.png
rename to src/drivers/webextension/images/icons/XOOPS.png
diff --git a/src/icons/XRegExp.png b/src/drivers/webextension/images/icons/XRegExp.png
similarity index 100%
rename from src/icons/XRegExp.png
rename to src/drivers/webextension/images/icons/XRegExp.png
diff --git a/src/icons/Xajax.png b/src/drivers/webextension/images/icons/Xajax.png
similarity index 100%
rename from src/icons/Xajax.png
rename to src/drivers/webextension/images/icons/Xajax.png
diff --git a/src/icons/Xanario.png b/src/drivers/webextension/images/icons/Xanario.png
similarity index 100%
rename from src/icons/Xanario.png
rename to src/drivers/webextension/images/icons/Xanario.png
diff --git a/src/icons/XenForo.png b/src/drivers/webextension/images/icons/XenForo.png
similarity index 100%
rename from src/icons/XenForo.png
rename to src/drivers/webextension/images/icons/XenForo.png
diff --git a/src/icons/Xitami.png b/src/drivers/webextension/images/icons/Xitami.png
similarity index 100%
rename from src/icons/Xitami.png
rename to src/drivers/webextension/images/icons/Xitami.png
diff --git a/src/drivers/webextension/images/icons/XpressEngine.png b/src/drivers/webextension/images/icons/XpressEngine.png
new file mode 100644
index 0000000000000000000000000000000000000000..72937886c7072c90f523eb1921b8d847b0cebfb2
Binary files /dev/null and b/src/drivers/webextension/images/icons/XpressEngine.png differ
diff --git a/src/drivers/webextension/images/icons/Xtremepush.svg b/src/drivers/webextension/images/icons/Xtremepush.svg
new file mode 100755
index 0000000000000000000000000000000000000000..858f28eae25e83660f6363974d81432018d7edcd
--- /dev/null
+++ b/src/drivers/webextension/images/icons/Xtremepush.svg
@@ -0,0 +1,12 @@
+
+
+
+
+
+
+
+
diff --git a/src/icons/YUI.png b/src/drivers/webextension/images/icons/YUI.png
similarity index 100%
rename from src/icons/YUI.png
rename to src/drivers/webextension/images/icons/YUI.png
diff --git a/src/icons/YaBB.png b/src/drivers/webextension/images/icons/YaBB.png
similarity index 100%
rename from src/icons/YaBB.png
rename to src/drivers/webextension/images/icons/YaBB.png
diff --git a/src/icons/Yandex.Direct.png b/src/drivers/webextension/images/icons/Yandex.Direct.png
similarity index 100%
rename from src/icons/Yandex.Direct.png
rename to src/drivers/webextension/images/icons/Yandex.Direct.png
diff --git a/src/icons/Yandex.Metrika.png b/src/drivers/webextension/images/icons/Yandex.Metrika.png
similarity index 100%
rename from src/icons/Yandex.Metrika.png
rename to src/drivers/webextension/images/icons/Yandex.Metrika.png
diff --git a/src/icons/Yaws.png b/src/drivers/webextension/images/icons/Yaws.png
similarity index 100%
rename from src/icons/Yaws.png
rename to src/drivers/webextension/images/icons/Yaws.png
diff --git a/src/icons/Yieldlab.png b/src/drivers/webextension/images/icons/Yieldlab.png
similarity index 100%
rename from src/icons/Yieldlab.png
rename to src/drivers/webextension/images/icons/Yieldlab.png
diff --git a/src/icons/Yii.png b/src/drivers/webextension/images/icons/Yii.png
similarity index 100%
rename from src/icons/Yii.png
rename to src/drivers/webextension/images/icons/Yii.png
diff --git a/src/icons/Yoast SEO.png b/src/drivers/webextension/images/icons/Yoast SEO.png
similarity index 100%
rename from src/icons/Yoast SEO.png
rename to src/drivers/webextension/images/icons/Yoast SEO.png
diff --git a/src/icons/YouTrack.png b/src/drivers/webextension/images/icons/YouTrack.png
similarity index 100%
rename from src/icons/YouTrack.png
rename to src/drivers/webextension/images/icons/YouTrack.png
diff --git a/src/icons/YouTube.png b/src/drivers/webextension/images/icons/YouTube.png
similarity index 100%
rename from src/icons/YouTube.png
rename to src/drivers/webextension/images/icons/YouTube.png
diff --git a/src/icons/ZK.png b/src/drivers/webextension/images/icons/ZK.png
similarity index 100%
rename from src/icons/ZK.png
rename to src/drivers/webextension/images/icons/ZK.png
diff --git a/src/drivers/webextension/images/icons/ZURB Foundation.png b/src/drivers/webextension/images/icons/ZURB Foundation.png
new file mode 100644
index 0000000000000000000000000000000000000000..700895b6b780246ea700f64b7037d1de005602c2
Binary files /dev/null and b/src/drivers/webextension/images/icons/ZURB Foundation.png differ
diff --git a/src/icons/Zabbix.png b/src/drivers/webextension/images/icons/Zabbix.png
similarity index 100%
rename from src/icons/Zabbix.png
rename to src/drivers/webextension/images/icons/Zabbix.png
diff --git a/src/icons/Zanox.png b/src/drivers/webextension/images/icons/Zanox.png
similarity index 100%
rename from src/icons/Zanox.png
rename to src/drivers/webextension/images/icons/Zanox.png
diff --git a/src/icons/Zen Cart.png b/src/drivers/webextension/images/icons/Zen Cart.png
similarity index 100%
rename from src/icons/Zen Cart.png
rename to src/drivers/webextension/images/icons/Zen Cart.png
diff --git a/src/icons/Zend.png b/src/drivers/webextension/images/icons/Zend.png
similarity index 100%
rename from src/icons/Zend.png
rename to src/drivers/webextension/images/icons/Zend.png
diff --git a/src/icons/Zendesk Chat.png b/src/drivers/webextension/images/icons/Zendesk Chat.png
similarity index 100%
rename from src/icons/Zendesk Chat.png
rename to src/drivers/webextension/images/icons/Zendesk Chat.png
diff --git a/src/drivers/webextension/images/icons/Zendesk.png b/src/drivers/webextension/images/icons/Zendesk.png
new file mode 100644
index 0000000000000000000000000000000000000000..5a08fd621ddd8b011e4eacc1fbd1f29fd0eef22f
Binary files /dev/null and b/src/drivers/webextension/images/icons/Zendesk.png differ
diff --git a/src/icons/Zenfolio.png b/src/drivers/webextension/images/icons/Zenfolio.png
similarity index 100%
rename from src/icons/Zenfolio.png
rename to src/drivers/webextension/images/icons/Zenfolio.png
diff --git a/src/icons/Zepto.png b/src/drivers/webextension/images/icons/Zepto.png
similarity index 100%
rename from src/icons/Zepto.png
rename to src/drivers/webextension/images/icons/Zepto.png
diff --git a/src/drivers/webextension/images/icons/Zimbra.png b/src/drivers/webextension/images/icons/Zimbra.png
new file mode 100644
index 0000000000000000000000000000000000000000..f81873b391daa697ad66b6786a9042c65ddbbb2d
Binary files /dev/null and b/src/drivers/webextension/images/icons/Zimbra.png differ
diff --git a/src/icons/Zinnia.png b/src/drivers/webextension/images/icons/Zinnia.png
similarity index 100%
rename from src/icons/Zinnia.png
rename to src/drivers/webextension/images/icons/Zinnia.png
diff --git a/src/drivers/webextension/images/icons/Zipkin.png b/src/drivers/webextension/images/icons/Zipkin.png
new file mode 100644
index 0000000000000000000000000000000000000000..91ed93fd2663bc2b76727389fb12795fdbd2cab3
Binary files /dev/null and b/src/drivers/webextension/images/icons/Zipkin.png differ
diff --git a/src/icons/Zope.png b/src/drivers/webextension/images/icons/Zope.png
similarity index 100%
rename from src/icons/Zope.png
rename to src/drivers/webextension/images/icons/Zope.png
diff --git a/src/icons/a-blog cms.svg b/src/drivers/webextension/images/icons/a-blog cms.svg
similarity index 100%
rename from src/icons/a-blog cms.svg
rename to src/drivers/webextension/images/icons/a-blog cms.svg
diff --git a/src/drivers/webextension/images/icons/acquia-cloud.png b/src/drivers/webextension/images/icons/acquia-cloud.png
new file mode 100644
index 0000000000000000000000000000000000000000..22218a41331e0219e805dd4c59e124c5dd161010
Binary files /dev/null and b/src/drivers/webextension/images/icons/acquia-cloud.png differ
diff --git a/src/icons/actionhero.js.png b/src/drivers/webextension/images/icons/actionhero.js.png
similarity index 100%
rename from src/icons/actionhero.js.png
rename to src/drivers/webextension/images/icons/actionhero.js.png
diff --git a/src/icons/adminer.png b/src/drivers/webextension/images/icons/adminer.png
similarity index 100%
rename from src/icons/adminer.png
rename to src/drivers/webextension/images/icons/adminer.png
diff --git a/src/icons/adnegah.png b/src/drivers/webextension/images/icons/adnegah.png
similarity index 100%
rename from src/icons/adnegah.png
rename to src/drivers/webextension/images/icons/adnegah.png
diff --git a/src/drivers/webextension/images/icons/adobedtm.png b/src/drivers/webextension/images/icons/adobedtm.png
new file mode 100644
index 0000000000000000000000000000000000000000..58a1b1411207834b175f0bec1611a9d0134cb673
Binary files /dev/null and b/src/drivers/webextension/images/icons/adobedtm.png differ
diff --git a/src/icons/after-buy.png b/src/drivers/webextension/images/icons/after-buy.png
similarity index 100%
rename from src/icons/after-buy.png
rename to src/drivers/webextension/images/icons/after-buy.png
diff --git a/src/drivers/webextension/images/icons/afterpay.png b/src/drivers/webextension/images/icons/afterpay.png
new file mode 100644
index 0000000000000000000000000000000000000000..4c8add7d4c373838da4faa93bd8535177adde426
Binary files /dev/null and b/src/drivers/webextension/images/icons/afterpay.png differ
diff --git a/src/icons/aircall.png b/src/drivers/webextension/images/icons/aircall.png
similarity index 100%
rename from src/icons/aircall.png
rename to src/drivers/webextension/images/icons/aircall.png
diff --git a/src/icons/akamai.svg b/src/drivers/webextension/images/icons/akamai.svg
similarity index 100%
rename from src/icons/akamai.svg
rename to src/drivers/webextension/images/icons/akamai.svg
diff --git a/src/icons/akaunting.svg b/src/drivers/webextension/images/icons/akaunting.svg
similarity index 100%
rename from src/icons/akaunting.svg
rename to src/drivers/webextension/images/icons/akaunting.svg
diff --git a/src/icons/akka-http.png b/src/drivers/webextension/images/icons/akka-http.png
similarity index 100%
rename from src/icons/akka-http.png
rename to src/drivers/webextension/images/icons/akka-http.png
diff --git a/src/drivers/webextension/images/icons/all-in-One-SEO-Pack.png b/src/drivers/webextension/images/icons/all-in-One-SEO-Pack.png
new file mode 100644
index 0000000000000000000000000000000000000000..93c84c98bcc1d56c263c1f1b59e37baaf73949d5
Binary files /dev/null and b/src/drivers/webextension/images/icons/all-in-One-SEO-Pack.png differ
diff --git a/src/icons/amCharts.png b/src/drivers/webextension/images/icons/amCharts.png
similarity index 100%
rename from src/icons/amCharts.png
rename to src/drivers/webextension/images/icons/amCharts.png
diff --git a/src/icons/amber.png b/src/drivers/webextension/images/icons/amber.png
similarity index 100%
rename from src/icons/amber.png
rename to src/drivers/webextension/images/icons/amber.png
diff --git a/src/drivers/webextension/images/icons/amex.png b/src/drivers/webextension/images/icons/amex.png
new file mode 100644
index 0000000000000000000000000000000000000000..4567329c6801f7add9013ffc3f9f6b91228ad65e
Binary files /dev/null and b/src/drivers/webextension/images/icons/amex.png differ
diff --git a/src/drivers/webextension/images/icons/amplitude.png b/src/drivers/webextension/images/icons/amplitude.png
new file mode 100644
index 0000000000000000000000000000000000000000..45c475e73d16862efdc908b8c787a3f5941cbcb4
Binary files /dev/null and b/src/drivers/webextension/images/icons/amplitude.png differ
diff --git a/src/icons/apigee.svg b/src/drivers/webextension/images/icons/apigee.svg
similarity index 100%
rename from src/icons/apigee.svg
rename to src/drivers/webextension/images/icons/apigee.svg
diff --git a/src/icons/apostrophecms.svg b/src/drivers/webextension/images/icons/apostrophecms.svg
similarity index 100%
rename from src/icons/apostrophecms.svg
rename to src/drivers/webextension/images/icons/apostrophecms.svg
diff --git a/src/drivers/webextension/images/icons/arcgis_icon.png b/src/drivers/webextension/images/icons/arcgis_icon.png
new file mode 100644
index 0000000000000000000000000000000000000000..12c6a3a072db30e121e6e3a26adc0a75656eb74b
Binary files /dev/null and b/src/drivers/webextension/images/icons/arcgis_icon.png differ
diff --git a/src/icons/asciinema.png b/src/drivers/webextension/images/icons/asciinema.png
similarity index 100%
rename from src/icons/asciinema.png
rename to src/drivers/webextension/images/icons/asciinema.png
diff --git a/src/drivers/webextension/images/icons/automattic.png b/src/drivers/webextension/images/icons/automattic.png
new file mode 100644
index 0000000000000000000000000000000000000000..95fe4da7b4b7f59e37fbf62ca2ad6e9db9636708
Binary files /dev/null and b/src/drivers/webextension/images/icons/automattic.png differ
diff --git a/src/icons/aws-ec2.svg b/src/drivers/webextension/images/icons/aws-ec2.svg
similarity index 100%
rename from src/icons/aws-ec2.svg
rename to src/drivers/webextension/images/icons/aws-ec2.svg
diff --git a/src/drivers/webextension/images/icons/aws-elb.png b/src/drivers/webextension/images/icons/aws-elb.png
new file mode 100644
index 0000000000000000000000000000000000000000..d527693378b93c6604079bf1bcdf4b79cb26db8c
Binary files /dev/null and b/src/drivers/webextension/images/icons/aws-elb.png differ
diff --git a/src/icons/aws-s3.svg b/src/drivers/webextension/images/icons/aws-s3.svg
similarity index 100%
rename from src/icons/aws-s3.svg
rename to src/drivers/webextension/images/icons/aws-s3.svg
diff --git a/src/icons/aws.svg b/src/drivers/webextension/images/icons/aws.svg
similarity index 100%
rename from src/icons/aws.svg
rename to src/drivers/webextension/images/icons/aws.svg
diff --git a/src/icons/azure.svg b/src/drivers/webextension/images/icons/azure.svg
similarity index 100%
rename from src/icons/azure.svg
rename to src/drivers/webextension/images/icons/azure.svg
diff --git a/src/icons/bablic.png b/src/drivers/webextension/images/icons/bablic.png
similarity index 100%
rename from src/icons/bablic.png
rename to src/drivers/webextension/images/icons/bablic.png
diff --git a/src/icons/basket.js.png b/src/drivers/webextension/images/icons/basket.js.png
similarity index 100%
rename from src/icons/basket.js.png
rename to src/drivers/webextension/images/icons/basket.js.png
diff --git a/src/drivers/webextension/images/icons/bigcartel.png b/src/drivers/webextension/images/icons/bigcartel.png
new file mode 100644
index 0000000000000000000000000000000000000000..1f49fb31b1f5f333a447a3dde80de93c71d074fc
Binary files /dev/null and b/src/drivers/webextension/images/icons/bigcartel.png differ
diff --git a/src/drivers/webextension/images/icons/bizweb.png b/src/drivers/webextension/images/icons/bizweb.png
new file mode 100644
index 0000000000000000000000000000000000000000..9ba6fb89be878a6003f5e56878cd1a1f6d68005b
Binary files /dev/null and b/src/drivers/webextension/images/icons/bizweb.png differ
diff --git a/src/drivers/webextension/images/icons/bokeh.png b/src/drivers/webextension/images/icons/bokeh.png
new file mode 100644
index 0000000000000000000000000000000000000000..86c712e105684df2b0df5fbb49ad8cf05bee7b44
Binary files /dev/null and b/src/drivers/webextension/images/icons/bokeh.png differ
diff --git a/src/drivers/webextension/images/icons/boom.svg b/src/drivers/webextension/images/icons/boom.svg
new file mode 100644
index 0000000000000000000000000000000000000000..18dac4f2b520e85492d205a2593e67512034ebe5
--- /dev/null
+++ b/src/drivers/webextension/images/icons/boom.svg
@@ -0,0 +1,35 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/drivers/webextension/images/icons/borderfree.png b/src/drivers/webextension/images/icons/borderfree.png
new file mode 100644
index 0000000000000000000000000000000000000000..532b684b3653ba85175232274ada3e039df2eda5
Binary files /dev/null and b/src/drivers/webextension/images/icons/borderfree.png differ
diff --git a/src/drivers/webextension/images/icons/bubble.png b/src/drivers/webextension/images/icons/bubble.png
new file mode 100644
index 0000000000000000000000000000000000000000..dc45cb620c4d8418f7802fd0ed22b413144ee886
Binary files /dev/null and b/src/drivers/webextension/images/icons/bubble.png differ
diff --git a/src/icons/byINTI.svg b/src/drivers/webextension/images/icons/byINTI.svg
similarity index 100%
rename from src/icons/byINTI.svg
rename to src/drivers/webextension/images/icons/byINTI.svg
diff --git a/src/icons/cPanel.png b/src/drivers/webextension/images/icons/cPanel.png
similarity index 100%
rename from src/icons/cPanel.png
rename to src/drivers/webextension/images/icons/cPanel.png
diff --git a/src/icons/caddy.svg b/src/drivers/webextension/images/icons/caddy.svg
similarity index 100%
rename from src/icons/caddy.svg
rename to src/drivers/webextension/images/icons/caddy.svg
diff --git a/src/drivers/webextension/images/icons/ccvshop.png b/src/drivers/webextension/images/icons/ccvshop.png
new file mode 100644
index 0000000000000000000000000000000000000000..30d3dd01b0874929a51f55e184a64f5164aa778e
Binary files /dev/null and b/src/drivers/webextension/images/icons/ccvshop.png differ
diff --git a/src/drivers/webextension/images/icons/centminmod.png b/src/drivers/webextension/images/icons/centminmod.png
new file mode 100644
index 0000000000000000000000000000000000000000..988f8230a0fa1aef15fb93cb37286b45e85e7f11
Binary files /dev/null and b/src/drivers/webextension/images/icons/centminmod.png differ
diff --git a/src/icons/cgit.png b/src/drivers/webextension/images/icons/cgit.png
similarity index 100%
rename from src/icons/cgit.png
rename to src/drivers/webextension/images/icons/cgit.png
diff --git a/src/drivers/webextension/images/icons/chevereto.png b/src/drivers/webextension/images/icons/chevereto.png
new file mode 100644
index 0000000000000000000000000000000000000000..5d00efe4194ee101e2594867c0749adba7480c44
Binary files /dev/null and b/src/drivers/webextension/images/icons/chevereto.png differ
diff --git a/src/drivers/webextension/images/icons/civic.png b/src/drivers/webextension/images/icons/civic.png
new file mode 100644
index 0000000000000000000000000000000000000000..ed3fc1def49b7ab1b5b8a88de2764ab44767f9c1
Binary files /dev/null and b/src/drivers/webextension/images/icons/civic.png differ
diff --git a/src/icons/clarity.svg b/src/drivers/webextension/images/icons/clarity.svg
similarity index 100%
rename from src/icons/clarity.svg
rename to src/drivers/webextension/images/icons/clarity.svg
diff --git a/src/icons/cloudcart.svg b/src/drivers/webextension/images/icons/cloudcart.svg
similarity index 100%
rename from src/icons/cloudcart.svg
rename to src/drivers/webextension/images/icons/cloudcart.svg
diff --git a/src/drivers/webextension/images/icons/cnzz.png b/src/drivers/webextension/images/icons/cnzz.png
new file mode 100644
index 0000000000000000000000000000000000000000..00e269b06404cf2f9155d916f6769ceec3b0d3c2
Binary files /dev/null and b/src/drivers/webextension/images/icons/cnzz.png differ
diff --git a/src/drivers/webextension/images/icons/coaster-cms.png b/src/drivers/webextension/images/icons/coaster-cms.png
new file mode 100644
index 0000000000000000000000000000000000000000..b9a3e2846893c87a5cbefdc98e68446dfbe5c737
Binary files /dev/null and b/src/drivers/webextension/images/icons/coaster-cms.png differ
diff --git a/src/icons/coinhave.png b/src/drivers/webextension/images/icons/coinhave.png
similarity index 100%
rename from src/icons/coinhave.png
rename to src/drivers/webextension/images/icons/coinhave.png
diff --git a/src/drivers/webextension/images/icons/coinimp.png b/src/drivers/webextension/images/icons/coinimp.png
new file mode 100644
index 0000000000000000000000000000000000000000..61961a3fe87d2efd92739289dc969d48e08560a2
Binary files /dev/null and b/src/drivers/webextension/images/icons/coinimp.png differ
diff --git a/src/drivers/webextension/images/icons/colormeshop.png b/src/drivers/webextension/images/icons/colormeshop.png
new file mode 100644
index 0000000000000000000000000000000000000000..7764c9202d7a3d998ce560775ebb30e8a3c6502d
Binary files /dev/null and b/src/drivers/webextension/images/icons/colormeshop.png differ
diff --git a/src/icons/comScore.png b/src/drivers/webextension/images/icons/comScore.png
similarity index 100%
rename from src/icons/comScore.png
rename to src/drivers/webextension/images/icons/comScore.png
diff --git a/src/drivers/webextension/images/icons/converted/.gitkeep b/src/drivers/webextension/images/icons/converted/.gitkeep
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/src/drivers/webextension/images/icons/cookieyes.png b/src/drivers/webextension/images/icons/cookieyes.png
new file mode 100644
index 0000000000000000000000000000000000000000..a4cfda3c8366fece71f5fbe097f8d0d51d73fd0c
Binary files /dev/null and b/src/drivers/webextension/images/icons/cookieyes.png differ
diff --git a/src/drivers/webextension/images/icons/cybersource.png b/src/drivers/webextension/images/icons/cybersource.png
new file mode 100644
index 0000000000000000000000000000000000000000..8852f77dfea8c5941ae5efea3d347fc5728ee878
Binary files /dev/null and b/src/drivers/webextension/images/icons/cybersource.png differ
diff --git a/src/drivers/webextension/images/icons/datadome.png b/src/drivers/webextension/images/icons/datadome.png
new file mode 100644
index 0000000000000000000000000000000000000000..76ec66a2985d10c923549e83c899370970bbbe98
Binary files /dev/null and b/src/drivers/webextension/images/icons/datadome.png differ
diff --git a/src/drivers/webextension/images/icons/datocms.svg b/src/drivers/webextension/images/icons/datocms.svg
new file mode 100644
index 0000000000000000000000000000000000000000..efc30b36cb2f77b4f517b1a9fc4fbdb8d47a74f6
--- /dev/null
+++ b/src/drivers/webextension/images/icons/datocms.svg
@@ -0,0 +1,24 @@
+
+
+
+ Artboard
+ Created with Sketch.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/icons/debut.png b/src/drivers/webextension/images/icons/debut.png
similarity index 100%
rename from src/icons/debut.png
rename to src/drivers/webextension/images/icons/debut.png
diff --git a/src/drivers/webextension/images/icons/decimal.js.png b/src/drivers/webextension/images/icons/decimal.js.png
new file mode 100644
index 0000000000000000000000000000000000000000..83d90d8eee94f10171ca892271e01c6efc7bdf1f
Binary files /dev/null and b/src/drivers/webextension/images/icons/decimal.js.png differ
diff --git a/src/drivers/webextension/images/icons/deepminer.png b/src/drivers/webextension/images/icons/deepminer.png
new file mode 100644
index 0000000000000000000000000000000000000000..83d671bfbf29405ed9972f461ca615befa84c5c0
Binary files /dev/null and b/src/drivers/webextension/images/icons/deepminer.png differ
diff --git a/src/icons/default.svg b/src/drivers/webextension/images/icons/default.svg
similarity index 100%
rename from src/icons/default.svg
rename to src/drivers/webextension/images/icons/default.svg
diff --git a/src/drivers/webextension/images/icons/didomi.png b/src/drivers/webextension/images/icons/didomi.png
new file mode 100644
index 0000000000000000000000000000000000000000..4e942c61b5dbb134d2cbe4aeb7461262c485a39e
Binary files /dev/null and b/src/drivers/webextension/images/icons/didomi.png differ
diff --git a/src/icons/docusaurus.svg b/src/drivers/webextension/images/icons/docusaurus.svg
similarity index 100%
rename from src/icons/docusaurus.svg
rename to src/drivers/webextension/images/icons/docusaurus.svg
diff --git a/src/drivers/webextension/images/icons/duda.png b/src/drivers/webextension/images/icons/duda.png
new file mode 100644
index 0000000000000000000000000000000000000000..fbb42be8deed9a829b64eb446f3bd7032f0f1b16
Binary files /dev/null and b/src/drivers/webextension/images/icons/duda.png differ
diff --git a/src/icons/e107.png b/src/drivers/webextension/images/icons/e107.png
similarity index 100%
rename from src/icons/e107.png
rename to src/drivers/webextension/images/icons/e107.png
diff --git a/src/icons/eSyndiCat.png b/src/drivers/webextension/images/icons/eSyndiCat.png
similarity index 100%
rename from src/icons/eSyndiCat.png
rename to src/drivers/webextension/images/icons/eSyndiCat.png
diff --git a/src/drivers/webextension/images/icons/eZ.svg b/src/drivers/webextension/images/icons/eZ.svg
new file mode 100644
index 0000000000000000000000000000000000000000..481d1f14620c16962a0793ab28c56375fc1cbd5b
--- /dev/null
+++ b/src/drivers/webextension/images/icons/eZ.svg
@@ -0,0 +1,59 @@
+
+
+ eZ logo
+
+
+
+ image/svg+xml
+
+ eZ logo
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/icons/ebis.png b/src/drivers/webextension/images/icons/ebis.png
similarity index 100%
rename from src/icons/ebis.png
rename to src/drivers/webextension/images/icons/ebis.png
diff --git a/src/icons/ec-cube.png b/src/drivers/webextension/images/icons/ec-cube.png
similarity index 100%
rename from src/icons/ec-cube.png
rename to src/drivers/webextension/images/icons/ec-cube.png
diff --git a/src/drivers/webextension/images/icons/ecwid.svg b/src/drivers/webextension/images/icons/ecwid.svg
new file mode 100644
index 0000000000000000000000000000000000000000..283cda0895e5092a346411739417e1f786a861ad
--- /dev/null
+++ b/src/drivers/webextension/images/icons/ecwid.svg
@@ -0,0 +1,139 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/icons/ef.js.svg b/src/drivers/webextension/images/icons/ef.js.svg
similarity index 100%
rename from src/icons/ef.js.svg
rename to src/drivers/webextension/images/icons/ef.js.svg
diff --git a/src/drivers/webextension/images/icons/elm.svg b/src/drivers/webextension/images/icons/elm.svg
new file mode 100644
index 0000000000000000000000000000000000000000..f812c50bd70480735e25e3fe84e93bb53259beab
--- /dev/null
+++ b/src/drivers/webextension/images/icons/elm.svg
@@ -0,0 +1,4 @@
+
+
+
+
\ No newline at end of file
diff --git a/src/icons/enduro.js.svg b/src/drivers/webextension/images/icons/enduro.js.svg
similarity index 100%
rename from src/icons/enduro.js.svg
rename to src/drivers/webextension/images/icons/enduro.js.svg
diff --git a/src/drivers/webextension/images/icons/ensighten.png b/src/drivers/webextension/images/icons/ensighten.png
new file mode 100644
index 0000000000000000000000000000000000000000..4ce08d3d24914be1646219d0083c8ede7a45831b
Binary files /dev/null and b/src/drivers/webextension/images/icons/ensighten.png differ
diff --git a/src/drivers/webextension/images/icons/epages.png b/src/drivers/webextension/images/icons/epages.png
new file mode 100644
index 0000000000000000000000000000000000000000..e703840a47db3fdbbbdd6db8e07a5910ba96c334
Binary files /dev/null and b/src/drivers/webextension/images/icons/epages.png differ
diff --git a/src/icons/etherpad.png b/src/drivers/webextension/images/icons/etherpad.png
similarity index 100%
rename from src/icons/etherpad.png
rename to src/drivers/webextension/images/icons/etherpad.png
diff --git a/src/drivers/webextension/images/icons/eucookie.png b/src/drivers/webextension/images/icons/eucookie.png
new file mode 100644
index 0000000000000000000000000000000000000000..d495dfbdeb7dac29bb1c96512852f03ffd85e228
Binary files /dev/null and b/src/drivers/webextension/images/icons/eucookie.png differ
diff --git a/src/drivers/webextension/images/icons/eway.png b/src/drivers/webextension/images/icons/eway.png
new file mode 100644
index 0000000000000000000000000000000000000000..15966b3a9863b213fa7226c354d9b9f42b4d8b5d
Binary files /dev/null and b/src/drivers/webextension/images/icons/eway.png differ
diff --git a/src/drivers/webextension/images/icons/experiencedCMS_Logo.png b/src/drivers/webextension/images/icons/experiencedCMS_Logo.png
new file mode 100644
index 0000000000000000000000000000000000000000..9775cdac9ec676f2e56423a0f3467e8a7dc2f77b
Binary files /dev/null and b/src/drivers/webextension/images/icons/experiencedCMS_Logo.png differ
diff --git a/src/drivers/webextension/images/icons/fastspring.png b/src/drivers/webextension/images/icons/fastspring.png
new file mode 100644
index 0000000000000000000000000000000000000000..bae765b28624461a3ebd22a2685d3c8da6b5f3ef
Binary files /dev/null and b/src/drivers/webextension/images/icons/fastspring.png differ
diff --git a/src/drivers/webextension/images/icons/fatzebra.png b/src/drivers/webextension/images/icons/fatzebra.png
new file mode 100644
index 0000000000000000000000000000000000000000..62a045e432f1530859db2d1b78734a086fcc9583
Binary files /dev/null and b/src/drivers/webextension/images/icons/fatzebra.png differ
diff --git a/src/drivers/webextension/images/icons/flarum.png b/src/drivers/webextension/images/icons/flarum.png
new file mode 100644
index 0000000000000000000000000000000000000000..b5bfe12e41821a6858845362b26c08dd1daaeda7
Binary files /dev/null and b/src/drivers/webextension/images/icons/flarum.png differ
diff --git a/src/drivers/webextension/images/icons/flow.png b/src/drivers/webextension/images/icons/flow.png
new file mode 100644
index 0000000000000000000000000000000000000000..bda3be6cc22c2464281dd09a67ba2f422697c05d
Binary files /dev/null and b/src/drivers/webextension/images/icons/flow.png differ
diff --git a/src/drivers/webextension/images/icons/flywheel.svg b/src/drivers/webextension/images/icons/flywheel.svg
new file mode 100644
index 0000000000000000000000000000000000000000..2676989a441ecad67ad76f4c503c864611bae560
--- /dev/null
+++ b/src/drivers/webextension/images/icons/flywheel.svg
@@ -0,0 +1,21 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/drivers/webextension/images/icons/font-awesome.svg b/src/drivers/webextension/images/icons/font-awesome.svg
new file mode 100644
index 0000000000000000000000000000000000000000..8c1d44528ba17062ae179a1a3e20fe86aa0e304e
--- /dev/null
+++ b/src/drivers/webextension/images/icons/font-awesome.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/icons/foswiki.png b/src/drivers/webextension/images/icons/foswiki.png
similarity index 100%
rename from src/icons/foswiki.png
rename to src/drivers/webextension/images/icons/foswiki.png
diff --git a/src/drivers/webextension/images/icons/freshchat.png b/src/drivers/webextension/images/icons/freshchat.png
new file mode 100644
index 0000000000000000000000000000000000000000..a6c84f6836373e118e79f1005fe65cbe40efcfea
Binary files /dev/null and b/src/drivers/webextension/images/icons/freshchat.png differ
diff --git a/src/drivers/webextension/images/icons/freshmarketer.png b/src/drivers/webextension/images/icons/freshmarketer.png
new file mode 100644
index 0000000000000000000000000000000000000000..877ecc62c33f73828face807419f6f15212daecf
Binary files /dev/null and b/src/drivers/webextension/images/icons/freshmarketer.png differ
diff --git a/src/drivers/webextension/images/icons/futureshop.png b/src/drivers/webextension/images/icons/futureshop.png
new file mode 100644
index 0000000000000000000000000000000000000000..06a366a6f428dfd03590d2f23229d584439db012
Binary files /dev/null and b/src/drivers/webextension/images/icons/futureshop.png differ
diff --git a/src/drivers/webextension/images/icons/gRPC.png b/src/drivers/webextension/images/icons/gRPC.png
new file mode 100644
index 0000000000000000000000000000000000000000..c35182c02bf146be335b8f968ee6865e538e82d3
Binary files /dev/null and b/src/drivers/webextension/images/icons/gRPC.png differ
diff --git a/src/icons/gerrit.svg b/src/drivers/webextension/images/icons/gerrit.svg
similarity index 100%
rename from src/icons/gerrit.svg
rename to src/drivers/webextension/images/icons/gerrit.svg
diff --git a/src/icons/git.svg b/src/drivers/webextension/images/icons/git.svg
similarity index 100%
rename from src/icons/git.svg
rename to src/drivers/webextension/images/icons/git.svg
diff --git a/src/icons/gitea.svg b/src/drivers/webextension/images/icons/gitea.svg
similarity index 100%
rename from src/icons/gitea.svg
rename to src/drivers/webextension/images/icons/gitea.svg
diff --git a/src/drivers/webextension/images/icons/godaddy.svg b/src/drivers/webextension/images/icons/godaddy.svg
new file mode 100644
index 0000000000000000000000000000000000000000..b6eef1c755dd188898ab6d09b0f17d8249376a86
--- /dev/null
+++ b/src/drivers/webextension/images/icons/godaddy.svg
@@ -0,0 +1,45 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/icons/gogs.png b/src/drivers/webextension/images/icons/gogs.png
similarity index 100%
rename from src/icons/gogs.png
rename to src/drivers/webextension/images/icons/gogs.png
diff --git a/src/icons/google_cloud.svg b/src/drivers/webextension/images/icons/google_cloud.svg
similarity index 100%
rename from src/icons/google_cloud.svg
rename to src/drivers/webextension/images/icons/google_cloud.svg
diff --git a/src/icons/govCMS.svg b/src/drivers/webextension/images/icons/govCMS.svg
similarity index 100%
rename from src/icons/govCMS.svg
rename to src/drivers/webextension/images/icons/govCMS.svg
diff --git a/src/drivers/webextension/images/icons/govuk.png b/src/drivers/webextension/images/icons/govuk.png
new file mode 100644
index 0000000000000000000000000000000000000000..f38d9a36f50bf22db4aada9c5d27296af780364d
Binary files /dev/null and b/src/drivers/webextension/images/icons/govuk.png differ
diff --git a/src/icons/gravityforms.svg b/src/drivers/webextension/images/icons/gravityforms.svg
similarity index 100%
rename from src/icons/gravityforms.svg
rename to src/drivers/webextension/images/icons/gravityforms.svg
diff --git a/src/icons/gunicorn.png b/src/drivers/webextension/images/icons/gunicorn.png
similarity index 100%
rename from src/icons/gunicorn.png
rename to src/drivers/webextension/images/icons/gunicorn.png
diff --git a/src/drivers/webextension/images/icons/hcaptcha-symbol-256.png b/src/drivers/webextension/images/icons/hcaptcha-symbol-256.png
new file mode 100644
index 0000000000000000000000000000000000000000..ee526dde49b8528f31421445d9c762ae4ef732eb
Binary files /dev/null and b/src/drivers/webextension/images/icons/hcaptcha-symbol-256.png differ
diff --git a/src/drivers/webextension/images/icons/heroku.svg b/src/drivers/webextension/images/icons/heroku.svg
new file mode 100644
index 0000000000000000000000000000000000000000..8d02649e6b7629db913913dd0d25dff92628f991
--- /dev/null
+++ b/src/drivers/webextension/images/icons/heroku.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/drivers/webextension/images/icons/hinza_advanced_cms.svg b/src/drivers/webextension/images/icons/hinza_advanced_cms.svg
new file mode 100644
index 0000000000000000000000000000000000000000..169ee81a9dd2c9677decdbbabef1a004b5526e91
--- /dev/null
+++ b/src/drivers/webextension/images/icons/hinza_advanced_cms.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/src/icons/http2.png b/src/drivers/webextension/images/icons/http2.png
similarity index 100%
rename from src/icons/http2.png
rename to src/drivers/webextension/images/icons/http2.png
diff --git a/src/drivers/webextension/images/icons/iEXExchanger.png b/src/drivers/webextension/images/icons/iEXExchanger.png
new file mode 100644
index 0000000000000000000000000000000000000000..7fdf0e14572cf95de4ef6832441abfdedc6ba8ed
Binary files /dev/null and b/src/drivers/webextension/images/icons/iEXExchanger.png differ
diff --git a/src/icons/iPresta.png b/src/drivers/webextension/images/icons/iPresta.png
similarity index 100%
rename from src/icons/iPresta.png
rename to src/drivers/webextension/images/icons/iPresta.png
diff --git a/src/drivers/webextension/images/icons/iWeb.png b/src/drivers/webextension/images/icons/iWeb.png
new file mode 100644
index 0000000000000000000000000000000000000000..cd43e8e050816400b9ae64f73885ed3fe20221c1
Binary files /dev/null and b/src/drivers/webextension/images/icons/iWeb.png differ
diff --git a/src/drivers/webextension/images/icons/idosellshop.png b/src/drivers/webextension/images/icons/idosellshop.png
new file mode 100644
index 0000000000000000000000000000000000000000..75579c8d65163b072f8cfc03a8214a0c1f28cba0
Binary files /dev/null and b/src/drivers/webextension/images/icons/idosellshop.png differ
diff --git a/src/icons/ikiwiki.png b/src/drivers/webextension/images/icons/ikiwiki.png
similarity index 100%
rename from src/icons/ikiwiki.png
rename to src/drivers/webextension/images/icons/ikiwiki.png
diff --git a/src/icons/imperiaCMS.svg b/src/drivers/webextension/images/icons/imperiaCMS.svg
similarity index 100%
rename from src/icons/imperiaCMS.svg
rename to src/drivers/webextension/images/icons/imperiaCMS.svg
diff --git a/src/icons/infusionsoft.svg b/src/drivers/webextension/images/icons/infusionsoft.svg
similarity index 100%
rename from src/icons/infusionsoft.svg
rename to src/drivers/webextension/images/icons/infusionsoft.svg
diff --git a/src/drivers/webextension/images/icons/inspectlet.png b/src/drivers/webextension/images/icons/inspectlet.png
new file mode 100644
index 0000000000000000000000000000000000000000..96cd21550caac2a3f94b523fc5b1ac2ec62ea295
Binary files /dev/null and b/src/drivers/webextension/images/icons/inspectlet.png differ
diff --git a/src/icons/io4 CMS.png b/src/drivers/webextension/images/icons/io4 CMS.png
similarity index 100%
rename from src/icons/io4 CMS.png
rename to src/drivers/webextension/images/icons/io4 CMS.png
diff --git a/src/drivers/webextension/images/icons/ionic.png b/src/drivers/webextension/images/icons/ionic.png
new file mode 100644
index 0000000000000000000000000000000000000000..43d8ed8d6992cfffdb13a2d1514439f8468ab2ab
Binary files /dev/null and b/src/drivers/webextension/images/icons/ionic.png differ
diff --git a/src/icons/iplabel.svg b/src/drivers/webextension/images/icons/iplabel.svg
similarity index 100%
rename from src/icons/iplabel.svg
rename to src/drivers/webextension/images/icons/iplabel.svg
diff --git a/src/drivers/webextension/images/icons/irroba.svg b/src/drivers/webextension/images/icons/irroba.svg
new file mode 100644
index 0000000000000000000000000000000000000000..34b6922311d8add3b58d3cec18d1df046a2c3ada
--- /dev/null
+++ b/src/drivers/webextension/images/icons/irroba.svg
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/src/drivers/webextension/images/icons/iubenda.png b/src/drivers/webextension/images/icons/iubenda.png
new file mode 100644
index 0000000000000000000000000000000000000000..f782516704cb4a98c2f3b170b8eb93eea9860eb1
Binary files /dev/null and b/src/drivers/webextension/images/icons/iubenda.png differ
diff --git a/src/drivers/webextension/images/icons/j2store.png b/src/drivers/webextension/images/icons/j2store.png
new file mode 100644
index 0000000000000000000000000000000000000000..f7d577e5636e5943b8f7104214e7c8b1bed32b9f
Binary files /dev/null and b/src/drivers/webextension/images/icons/j2store.png differ
diff --git a/src/drivers/webextension/images/icons/jComponent.png b/src/drivers/webextension/images/icons/jComponent.png
new file mode 100644
index 0000000000000000000000000000000000000000..55d31bbbb36095dde01c5342c3af63cfbc9e8bee
Binary files /dev/null and b/src/drivers/webextension/images/icons/jComponent.png differ
diff --git a/src/icons/jQTouch.png b/src/drivers/webextension/images/icons/jQTouch.png
similarity index 100%
rename from src/icons/jQTouch.png
rename to src/drivers/webextension/images/icons/jQTouch.png
diff --git a/src/icons/jQuery Mobile.svg b/src/drivers/webextension/images/icons/jQuery Mobile.svg
similarity index 100%
rename from src/icons/jQuery Mobile.svg
rename to src/drivers/webextension/images/icons/jQuery Mobile.svg
diff --git a/src/icons/jQuery UI.svg b/src/drivers/webextension/images/icons/jQuery UI.svg
similarity index 100%
rename from src/icons/jQuery UI.svg
rename to src/drivers/webextension/images/icons/jQuery UI.svg
diff --git a/src/icons/jQuery.svg b/src/drivers/webextension/images/icons/jQuery.svg
similarity index 100%
rename from src/icons/jQuery.svg
rename to src/drivers/webextension/images/icons/jQuery.svg
diff --git a/src/icons/jimdo.png b/src/drivers/webextension/images/icons/jimdo.png
similarity index 100%
rename from src/icons/jimdo.png
rename to src/drivers/webextension/images/icons/jimdo.png
diff --git a/src/icons/jqPlot.png b/src/drivers/webextension/images/icons/jqPlot.png
similarity index 100%
rename from src/icons/jqPlot.png
rename to src/drivers/webextension/images/icons/jqPlot.png
diff --git a/src/drivers/webextension/images/icons/jsdelivr-icon.svg b/src/drivers/webextension/images/icons/jsdelivr-icon.svg
new file mode 100644
index 0000000000000000000000000000000000000000..b44681bf3b23ddd359e8e5f20ff1a6d8cc80fc5e
--- /dev/null
+++ b/src/drivers/webextension/images/icons/jsdelivr-icon.svg
@@ -0,0 +1,33 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/icons/kemalcr.png b/src/drivers/webextension/images/icons/kemalcr.png
similarity index 100%
rename from src/icons/kemalcr.png
rename to src/drivers/webextension/images/icons/kemalcr.png
diff --git a/src/icons/kestrel.svg b/src/drivers/webextension/images/icons/kestrel.svg
similarity index 100%
rename from src/icons/kestrel.svg
rename to src/drivers/webextension/images/icons/kestrel.svg
diff --git a/src/icons/kibana.svg b/src/drivers/webextension/images/icons/kibana.svg
similarity index 100%
rename from src/icons/kibana.svg
rename to src/drivers/webextension/images/icons/kibana.svg
diff --git a/src/drivers/webextension/images/icons/kinsta.svg b/src/drivers/webextension/images/icons/kinsta.svg
new file mode 100644
index 0000000000000000000000000000000000000000..971e27db0e6a6600a9d23952705c80323aa93e5b
--- /dev/null
+++ b/src/drivers/webextension/images/icons/kinsta.svg
@@ -0,0 +1,22 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/drivers/webextension/images/icons/koha.png b/src/drivers/webextension/images/icons/koha.png
new file mode 100644
index 0000000000000000000000000000000000000000..f0c040cb675098878afec0e721a8e4e24889c2bb
Binary files /dev/null and b/src/drivers/webextension/images/icons/koha.png differ
diff --git a/src/drivers/webextension/images/icons/kolors4u.png b/src/drivers/webextension/images/icons/kolors4u.png
new file mode 100644
index 0000000000000000000000000000000000000000..618d5ec187b8bf05c78b5d56cd22e9e4350cb4d6
Binary files /dev/null and b/src/drivers/webextension/images/icons/kolors4u.png differ
diff --git a/src/drivers/webextension/images/icons/laterpay.png b/src/drivers/webextension/images/icons/laterpay.png
new file mode 100644
index 0000000000000000000000000000000000000000..c48373e21493c79c37298f7b9bde1f0f8e073b30
Binary files /dev/null and b/src/drivers/webextension/images/icons/laterpay.png differ
diff --git a/src/icons/libwww-perl-daemon.png b/src/drivers/webextension/images/icons/libwww-perl-daemon.png
similarity index 100%
rename from src/icons/libwww-perl-daemon.png
rename to src/drivers/webextension/images/icons/libwww-perl-daemon.png
diff --git a/src/icons/lighttpd.png b/src/drivers/webextension/images/icons/lighttpd.png
similarity index 100%
rename from src/icons/lighttpd.png
rename to src/drivers/webextension/images/icons/lighttpd.png
diff --git a/src/drivers/webextension/images/icons/liquidweb.svg b/src/drivers/webextension/images/icons/liquidweb.svg
new file mode 100644
index 0000000000000000000000000000000000000000..bfa137903fe875949bc85ee09eb76bef2d076561
--- /dev/null
+++ b/src/drivers/webextension/images/icons/liquidweb.svg
@@ -0,0 +1,93 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/drivers/webextension/images/icons/litespeed-cache.png b/src/drivers/webextension/images/icons/litespeed-cache.png
new file mode 100644
index 0000000000000000000000000000000000000000..5aa3af334e352668b555d15b35d73530011c56b1
Binary files /dev/null and b/src/drivers/webextension/images/icons/litespeed-cache.png differ
diff --git a/src/icons/mailchimp.svg b/src/drivers/webextension/images/icons/mailchimp.svg
similarity index 100%
rename from src/icons/mailchimp.svg
rename to src/drivers/webextension/images/icons/mailchimp.svg
diff --git a/src/icons/mariadb.svg b/src/drivers/webextension/images/icons/mariadb.svg
similarity index 100%
rename from src/icons/mariadb.svg
rename to src/drivers/webextension/images/icons/mariadb.svg
diff --git a/src/icons/marked.svg b/src/drivers/webextension/images/icons/marked.svg
similarity index 100%
rename from src/icons/marked.svg
rename to src/drivers/webextension/images/icons/marked.svg
diff --git a/src/icons/math.js.png b/src/drivers/webextension/images/icons/math.js.png
similarity index 100%
rename from src/icons/math.js.png
rename to src/drivers/webextension/images/icons/math.js.png
diff --git a/src/icons/mattermost.png b/src/drivers/webextension/images/icons/mattermost.png
similarity index 100%
rename from src/icons/mattermost.png
rename to src/drivers/webextension/images/icons/mattermost.png
diff --git a/src/icons/mautic.svg b/src/drivers/webextension/images/icons/mautic.svg
similarity index 100%
rename from src/icons/mautic.svg
rename to src/drivers/webextension/images/icons/mautic.svg
diff --git a/src/drivers/webextension/images/icons/melis-platform.svg b/src/drivers/webextension/images/icons/melis-platform.svg
new file mode 100644
index 0000000000000000000000000000000000000000..103ae55c643cde74dd66e211a26bcbfb711c5352
--- /dev/null
+++ b/src/drivers/webextension/images/icons/melis-platform.svg
@@ -0,0 +1,37 @@
+
+
+
+
diff --git a/src/drivers/webextension/images/icons/metomic.png b/src/drivers/webextension/images/icons/metomic.png
new file mode 100644
index 0000000000000000000000000000000000000000..59e1eff85c163c6b79b9c4c0a3a5e1a64510f43b
Binary files /dev/null and b/src/drivers/webextension/images/icons/metomic.png differ
diff --git a/src/icons/mini_httpd.png b/src/drivers/webextension/images/icons/mini_httpd.png
similarity index 100%
rename from src/icons/mini_httpd.png
rename to src/drivers/webextension/images/icons/mini_httpd.png
diff --git a/src/drivers/webextension/images/icons/miva.png b/src/drivers/webextension/images/icons/miva.png
new file mode 100644
index 0000000000000000000000000000000000000000..6d134206f9223b57bf0dbb34abc3fd370c72511c
Binary files /dev/null and b/src/drivers/webextension/images/icons/miva.png differ
diff --git a/src/icons/mkdocs.png b/src/drivers/webextension/images/icons/mkdocs.png
similarity index 100%
rename from src/icons/mkdocs.png
rename to src/drivers/webextension/images/icons/mkdocs.png
diff --git a/src/drivers/webextension/images/icons/mobirise.png b/src/drivers/webextension/images/icons/mobirise.png
new file mode 100644
index 0000000000000000000000000000000000000000..31c167e300f4f38e8549b3aedc58f009207219f8
Binary files /dev/null and b/src/drivers/webextension/images/icons/mobirise.png differ
diff --git a/src/icons/mod_perl.png b/src/drivers/webextension/images/icons/mod_perl.png
similarity index 100%
rename from src/icons/mod_perl.png
rename to src/drivers/webextension/images/icons/mod_perl.png
diff --git a/src/icons/mod_python.png b/src/drivers/webextension/images/icons/mod_python.png
similarity index 100%
rename from src/icons/mod_python.png
rename to src/drivers/webextension/images/icons/mod_python.png
diff --git a/src/icons/mod_ssl.png b/src/drivers/webextension/images/icons/mod_ssl.png
similarity index 100%
rename from src/icons/mod_ssl.png
rename to src/drivers/webextension/images/icons/mod_ssl.png
diff --git a/src/icons/mod_wsgi.png b/src/drivers/webextension/images/icons/mod_wsgi.png
similarity index 100%
rename from src/icons/mod_wsgi.png
rename to src/drivers/webextension/images/icons/mod_wsgi.png
diff --git a/src/icons/modified.png b/src/drivers/webextension/images/icons/modified.png
similarity index 100%
rename from src/icons/modified.png
rename to src/drivers/webextension/images/icons/modified.png
diff --git a/src/icons/moon.svg b/src/drivers/webextension/images/icons/moon.svg
similarity index 100%
rename from src/icons/moon.svg
rename to src/drivers/webextension/images/icons/moon.svg
diff --git a/src/drivers/webextension/images/icons/mouseflow.png b/src/drivers/webextension/images/icons/mouseflow.png
new file mode 100644
index 0000000000000000000000000000000000000000..80a1c067f77eaec00d206e8f5e5c9f682d391fb8
Binary files /dev/null and b/src/drivers/webextension/images/icons/mouseflow.png differ
diff --git a/src/drivers/webextension/images/icons/mycashflow.png b/src/drivers/webextension/images/icons/mycashflow.png
new file mode 100644
index 0000000000000000000000000000000000000000..50a8b455f5d0b3ae84d5d0dd2d8e9407021993c1
Binary files /dev/null and b/src/drivers/webextension/images/icons/mycashflow.png differ
diff --git a/src/drivers/webextension/images/icons/myfoodlink.png b/src/drivers/webextension/images/icons/myfoodlink.png
new file mode 100644
index 0000000000000000000000000000000000000000..76094b00e13ad56ba3bb51d62b35656a744e12cd
Binary files /dev/null and b/src/drivers/webextension/images/icons/myfoodlink.png differ
diff --git a/src/drivers/webextension/images/icons/nepso.svg b/src/drivers/webextension/images/icons/nepso.svg
new file mode 100644
index 0000000000000000000000000000000000000000..abb7c0cb1461b8385cc81fcc5792faa6216a76a5
--- /dev/null
+++ b/src/drivers/webextension/images/icons/nepso.svg
@@ -0,0 +1,39 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/drivers/webextension/images/icons/nivsoft.png b/src/drivers/webextension/images/icons/nivsoft.png
new file mode 100644
index 0000000000000000000000000000000000000000..8194dab0a83f8f5bbbd4a0a1b71c9d4723a9916d
Binary files /dev/null and b/src/drivers/webextension/images/icons/nivsoft.png differ
diff --git a/src/icons/node.js.png b/src/drivers/webextension/images/icons/node.js.png
similarity index 100%
rename from src/icons/node.js.png
rename to src/drivers/webextension/images/icons/node.js.png
diff --git a/src/icons/nopCommerce.png b/src/drivers/webextension/images/icons/nopCommerce.png
similarity index 100%
rename from src/icons/nopCommerce.png
rename to src/drivers/webextension/images/icons/nopCommerce.png
diff --git a/src/drivers/webextension/images/icons/nuvem.png b/src/drivers/webextension/images/icons/nuvem.png
new file mode 100644
index 0000000000000000000000000000000000000000..9def18ea749e4426e5c932ce69b0df22aa3d2f3d
Binary files /dev/null and b/src/drivers/webextension/images/icons/nuvem.png differ
diff --git a/src/icons/octopress.png b/src/drivers/webextension/images/icons/octopress.png
similarity index 100%
rename from src/icons/octopress.png
rename to src/drivers/webextension/images/icons/octopress.png
diff --git a/src/drivers/webextension/images/icons/openpay.png b/src/drivers/webextension/images/icons/openpay.png
new file mode 100644
index 0000000000000000000000000000000000000000..88417f89fb2fea95b9515a75a1c0899fc70da04f
Binary files /dev/null and b/src/drivers/webextension/images/icons/openpay.png differ
diff --git a/src/icons/orocommerce.svg b/src/drivers/webextension/images/icons/orocommerce.svg
similarity index 100%
rename from src/icons/orocommerce.svg
rename to src/drivers/webextension/images/icons/orocommerce.svg
diff --git a/src/icons/osCommerce.png b/src/drivers/webextension/images/icons/osCommerce.png
similarity index 100%
rename from src/icons/osCommerce.png
rename to src/drivers/webextension/images/icons/osCommerce.png
diff --git a/src/icons/osTicket.png b/src/drivers/webextension/images/icons/osTicket.png
similarity index 100%
rename from src/icons/osTicket.png
rename to src/drivers/webextension/images/icons/osTicket.png
diff --git a/src/drivers/webextension/images/icons/osano.png b/src/drivers/webextension/images/icons/osano.png
new file mode 100644
index 0000000000000000000000000000000000000000..4a230890c18592e6f09fef6325a93af335fc1d2e
Binary files /dev/null and b/src/drivers/webextension/images/icons/osano.png differ
diff --git a/src/drivers/webextension/images/icons/otrs.png b/src/drivers/webextension/images/icons/otrs.png
new file mode 100644
index 0000000000000000000000000000000000000000..57a8c4ae88920461d209e40896a6e370c38e7a33
Binary files /dev/null and b/src/drivers/webextension/images/icons/otrs.png differ
diff --git a/src/icons/ownCloud.png b/src/drivers/webextension/images/icons/ownCloud.png
similarity index 100%
rename from src/icons/ownCloud.png
rename to src/drivers/webextension/images/icons/ownCloud.png
diff --git a/src/drivers/webextension/images/icons/pagefly.png b/src/drivers/webextension/images/icons/pagefly.png
new file mode 100644
index 0000000000000000000000000000000000000000..20917217f27a688ea5d9b30bb8529e35aa252638
Binary files /dev/null and b/src/drivers/webextension/images/icons/pagefly.png differ
diff --git a/src/drivers/webextension/images/icons/pagely.svg b/src/drivers/webextension/images/icons/pagely.svg
new file mode 100644
index 0000000000000000000000000000000000000000..410712e657c2f3b9e26b77fd49ccded8ca302104
--- /dev/null
+++ b/src/drivers/webextension/images/icons/pagely.svg
@@ -0,0 +1,3 @@
+
+
+
\ No newline at end of file
diff --git a/src/icons/pantheon.svg b/src/drivers/webextension/images/icons/pantheon.svg
similarity index 100%
rename from src/icons/pantheon.svg
rename to src/drivers/webextension/images/icons/pantheon.svg
diff --git a/src/icons/papaya CMS.png b/src/drivers/webextension/images/icons/papaya CMS.png
similarity index 100%
rename from src/icons/papaya CMS.png
rename to src/drivers/webextension/images/icons/papaya CMS.png
diff --git a/src/icons/parselecom.png b/src/drivers/webextension/images/icons/parselecom.png
similarity index 100%
rename from src/icons/parselecom.png
rename to src/drivers/webextension/images/icons/parselecom.png
diff --git a/src/drivers/webextension/images/icons/pelican.png b/src/drivers/webextension/images/icons/pelican.png
new file mode 100644
index 0000000000000000000000000000000000000000..44b8da8d53de10830aa8ff91048eaa3df4972752
Binary files /dev/null and b/src/drivers/webextension/images/icons/pelican.png differ
diff --git a/src/icons/percona.svg b/src/drivers/webextension/images/icons/percona.svg
similarity index 100%
rename from src/icons/percona.svg
rename to src/drivers/webextension/images/icons/percona.svg
diff --git a/src/drivers/webextension/images/icons/perimeterx.svg b/src/drivers/webextension/images/icons/perimeterx.svg
new file mode 100644
index 0000000000000000000000000000000000000000..f8c76bb9ef211d6dae5667ba2cdc89fdf4a8905c
--- /dev/null
+++ b/src/drivers/webextension/images/icons/perimeterx.svg
@@ -0,0 +1,43 @@
+
+
+
+ PerimeterX
+ Perimeterx Logo
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/icons/phpAlbum.png b/src/drivers/webextension/images/icons/phpAlbum.png
similarity index 100%
rename from src/icons/phpAlbum.png
rename to src/drivers/webextension/images/icons/phpAlbum.png
diff --git a/src/icons/phpBB.png b/src/drivers/webextension/images/icons/phpBB.png
similarity index 100%
rename from src/icons/phpBB.png
rename to src/drivers/webextension/images/icons/phpBB.png
diff --git a/src/icons/phpDocumentor.png b/src/drivers/webextension/images/icons/phpDocumentor.png
similarity index 100%
rename from src/icons/phpDocumentor.png
rename to src/drivers/webextension/images/icons/phpDocumentor.png
diff --git a/src/icons/phpMyAdmin.png b/src/drivers/webextension/images/icons/phpMyAdmin.png
similarity index 100%
rename from src/icons/phpMyAdmin.png
rename to src/drivers/webextension/images/icons/phpMyAdmin.png
diff --git a/src/icons/phpPgAdmin.png b/src/drivers/webextension/images/icons/phpPgAdmin.png
similarity index 100%
rename from src/icons/phpPgAdmin.png
rename to src/drivers/webextension/images/icons/phpPgAdmin.png
diff --git a/src/icons/phpSQLiteCMS.png b/src/drivers/webextension/images/icons/phpSQLiteCMS.png
similarity index 100%
rename from src/icons/phpSQLiteCMS.png
rename to src/drivers/webextension/images/icons/phpSQLiteCMS.png
diff --git a/src/icons/phpdebugbar.png b/src/drivers/webextension/images/icons/phpdebugbar.png
similarity index 100%
rename from src/icons/phpdebugbar.png
rename to src/drivers/webextension/images/icons/phpdebugbar.png
diff --git a/src/icons/phpwind.png b/src/drivers/webextension/images/icons/phpwind.png
similarity index 100%
rename from src/icons/phpwind.png
rename to src/drivers/webextension/images/icons/phpwind.png
diff --git a/src/icons/pimcore.svg b/src/drivers/webextension/images/icons/pimcore.svg
similarity index 100%
rename from src/icons/pimcore.svg
rename to src/drivers/webextension/images/icons/pimcore.svg
diff --git a/src/drivers/webextension/images/icons/pinoox.png b/src/drivers/webextension/images/icons/pinoox.png
new file mode 100644
index 0000000000000000000000000000000000000000..9974e06c425e295352163d772694cf78b90251f2
Binary files /dev/null and b/src/drivers/webextension/images/icons/pinoox.png differ
diff --git a/src/drivers/webextension/images/icons/pinpayments.png b/src/drivers/webextension/images/icons/pinpayments.png
new file mode 100644
index 0000000000000000000000000000000000000000..f66ec715d606289dea303085e7a55562ca6511fb
Binary files /dev/null and b/src/drivers/webextension/images/icons/pinpayments.png differ
diff --git a/src/icons/pirobaseCMS.svg b/src/drivers/webextension/images/icons/pirobaseCMS.svg
similarity index 100%
rename from src/icons/pirobaseCMS.svg
rename to src/drivers/webextension/images/icons/pirobaseCMS.svg
diff --git a/src/icons/platformsh.svg b/src/drivers/webextension/images/icons/platformsh.svg
similarity index 100%
rename from src/icons/platformsh.svg
rename to src/drivers/webextension/images/icons/platformsh.svg
diff --git a/src/drivers/webextension/images/icons/plentymarkets.svg b/src/drivers/webextension/images/icons/plentymarkets.svg
new file mode 100644
index 0000000000000000000000000000000000000000..c16da38ffaf8a416ca76829ebb415a76a7ec505b
--- /dev/null
+++ b/src/drivers/webextension/images/icons/plentymarkets.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/icons/polyfill.svg b/src/drivers/webextension/images/icons/polyfill.svg
similarity index 100%
rename from src/icons/polyfill.svg
rename to src/drivers/webextension/images/icons/polyfill.svg
diff --git a/src/drivers/webextension/images/icons/powerboutique.png b/src/drivers/webextension/images/icons/powerboutique.png
new file mode 100644
index 0000000000000000000000000000000000000000..617750c62d4ad6bc78ad82ed5dfa50d522b760a2
Binary files /dev/null and b/src/drivers/webextension/images/icons/powerboutique.png differ
diff --git a/src/icons/prettyPhoto.png b/src/drivers/webextension/images/icons/prettyPhoto.png
similarity index 100%
rename from src/icons/prettyPhoto.png
rename to src/drivers/webextension/images/icons/prettyPhoto.png
diff --git a/src/drivers/webextension/images/icons/projesoft.png b/src/drivers/webextension/images/icons/projesoft.png
new file mode 100644
index 0000000000000000000000000000000000000000..2a89a2b2d4fdaa33b4dd09fe17a335cf9e342045
Binary files /dev/null and b/src/drivers/webextension/images/icons/projesoft.png differ
diff --git a/src/icons/punBB.png b/src/drivers/webextension/images/icons/punBB.png
similarity index 100%
rename from src/icons/punBB.png
rename to src/drivers/webextension/images/icons/punBB.png
diff --git a/src/icons/pygments.png b/src/drivers/webextension/images/icons/pygments.png
similarity index 100%
rename from src/icons/pygments.png
rename to src/drivers/webextension/images/icons/pygments.png
diff --git a/src/icons/question2answer.png b/src/drivers/webextension/images/icons/question2answer.png
similarity index 100%
rename from src/icons/question2answer.png
rename to src/drivers/webextension/images/icons/question2answer.png
diff --git a/src/icons/raychat.png b/src/drivers/webextension/images/icons/raychat.png
similarity index 100%
rename from src/icons/raychat.png
rename to src/drivers/webextension/images/icons/raychat.png
diff --git a/src/icons/reCAPTCHA.png b/src/drivers/webextension/images/icons/reCAPTCHA.png
similarity index 100%
rename from src/icons/reCAPTCHA.png
rename to src/drivers/webextension/images/icons/reCAPTCHA.png
diff --git a/src/drivers/webextension/images/icons/redoc.png b/src/drivers/webextension/images/icons/redoc.png
new file mode 100644
index 0000000000000000000000000000000000000000..15c0e5c1ca18e29fe2aaf8f3a960d9d69bd58f87
Binary files /dev/null and b/src/drivers/webextension/images/icons/redoc.png differ
diff --git a/src/drivers/webextension/images/icons/revslider.png b/src/drivers/webextension/images/icons/revslider.png
new file mode 100644
index 0000000000000000000000000000000000000000..25e7aebb96ff8b7a7f4f2ac0547de1caf161acd2
Binary files /dev/null and b/src/drivers/webextension/images/icons/revslider.png differ
diff --git a/src/drivers/webextension/images/icons/riskified.png b/src/drivers/webextension/images/icons/riskified.png
new file mode 100644
index 0000000000000000000000000000000000000000..d5c09ab6b95b41a367729502e27a21a211582b56
Binary files /dev/null and b/src/drivers/webextension/images/icons/riskified.png differ
diff --git a/src/icons/sIFR.png b/src/drivers/webextension/images/icons/sIFR.png
similarity index 100%
rename from src/icons/sIFR.png
rename to src/drivers/webextension/images/icons/sIFR.png
diff --git a/src/icons/sNews.png b/src/drivers/webextension/images/icons/sNews.png
similarity index 100%
rename from src/icons/sNews.png
rename to src/drivers/webextension/images/icons/sNews.png
diff --git a/src/drivers/webextension/images/icons/salecycle.svg b/src/drivers/webextension/images/icons/salecycle.svg
new file mode 100644
index 0000000000000000000000000000000000000000..c1670dc0edd03b40f8d18632678e3b14d8255f10
--- /dev/null
+++ b/src/drivers/webextension/images/icons/salecycle.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/drivers/webextension/images/icons/salesfloor.png b/src/drivers/webextension/images/icons/salesfloor.png
new file mode 100644
index 0000000000000000000000000000000000000000..b0d348562cf14121745900fe353aae8733756251
Binary files /dev/null and b/src/drivers/webextension/images/icons/salesfloor.png differ
diff --git a/src/drivers/webextension/images/icons/sazito-phoenix.png b/src/drivers/webextension/images/icons/sazito-phoenix.png
new file mode 100644
index 0000000000000000000000000000000000000000..4c60b3eb7865b3ebb86b7fb2b1926f4ef4cb2356
Binary files /dev/null and b/src/drivers/webextension/images/icons/sazito-phoenix.png differ
diff --git a/src/icons/script.aculo.us.png b/src/drivers/webextension/images/icons/script.aculo.us.png
similarity index 100%
rename from src/icons/script.aculo.us.png
rename to src/drivers/webextension/images/icons/script.aculo.us.png
diff --git a/src/icons/scrollreveal.svg b/src/drivers/webextension/images/icons/scrollreveal.svg
similarity index 100%
rename from src/icons/scrollreveal.svg
rename to src/drivers/webextension/images/icons/scrollreveal.svg
diff --git a/src/drivers/webextension/images/icons/sectionio.svg b/src/drivers/webextension/images/icons/sectionio.svg
new file mode 100644
index 0000000000000000000000000000000000000000..f840642dd3b01500cc6f14f0310265bc1fa5f067
--- /dev/null
+++ b/src/drivers/webextension/images/icons/sectionio.svg
@@ -0,0 +1,9 @@
+
+
+
+
+
+
+
+
+
diff --git a/src/drivers/webextension/images/icons/seersco.png b/src/drivers/webextension/images/icons/seersco.png
new file mode 100644
index 0000000000000000000000000000000000000000..d17176314be94195060ea596e477bc63578754b4
Binary files /dev/null and b/src/drivers/webextension/images/icons/seersco.png differ
diff --git a/src/drivers/webextension/images/icons/seravo.svg b/src/drivers/webextension/images/icons/seravo.svg
new file mode 100644
index 0000000000000000000000000000000000000000..0f946fed7b728063f69a9f3680570829ff9d5f96
--- /dev/null
+++ b/src/drivers/webextension/images/icons/seravo.svg
@@ -0,0 +1,21 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/drivers/webextension/images/icons/shopline.png b/src/drivers/webextension/images/icons/shopline.png
new file mode 100644
index 0000000000000000000000000000000000000000..0a33610873a81d6fba591cafcad39a8adf5815b8
Binary files /dev/null and b/src/drivers/webextension/images/icons/shopline.png differ
diff --git a/src/drivers/webextension/images/icons/signal.png b/src/drivers/webextension/images/icons/signal.png
new file mode 100644
index 0000000000000000000000000000000000000000..ef94ad6cd0b467fa1269ab64e420d897786bab99
Binary files /dev/null and b/src/drivers/webextension/images/icons/signal.png differ
diff --git a/src/drivers/webextension/images/icons/simbel.svg b/src/drivers/webextension/images/icons/simbel.svg
new file mode 100644
index 0000000000000000000000000000000000000000..3cba9e85b72366f1c165e861eb450534883c53b4
--- /dev/null
+++ b/src/drivers/webextension/images/icons/simbel.svg
@@ -0,0 +1,19 @@
+
+
+
+
+
+
+
+
+
+
diff --git a/src/drivers/webextension/images/icons/siteground.svg b/src/drivers/webextension/images/icons/siteground.svg
new file mode 100644
index 0000000000000000000000000000000000000000..cba0c15f3fe381297e1cfa2aa9d72a9511eeea49
--- /dev/null
+++ b/src/drivers/webextension/images/icons/siteground.svg
@@ -0,0 +1,9 @@
+
+
+
+
+
+
+
+
+
diff --git a/src/icons/softtr.png b/src/drivers/webextension/images/icons/softtr.png
similarity index 100%
rename from src/icons/softtr.png
rename to src/drivers/webextension/images/icons/softtr.png
diff --git a/src/icons/sonar.png b/src/drivers/webextension/images/icons/sonar.png
similarity index 100%
rename from src/icons/sonar.png
rename to src/drivers/webextension/images/icons/sonar.png
diff --git a/src/icons/spip.svg b/src/drivers/webextension/images/icons/spip.svg
similarity index 100%
rename from src/icons/spip.svg
rename to src/drivers/webextension/images/icons/spip.svg
diff --git a/src/drivers/webextension/images/icons/splitbee.svg b/src/drivers/webextension/images/icons/splitbee.svg
new file mode 100644
index 0000000000000000000000000000000000000000..88f781bbafa9be835f5ff138d047ad09e79078a8
--- /dev/null
+++ b/src/drivers/webextension/images/icons/splitbee.svg
@@ -0,0 +1,23 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/drivers/webextension/images/icons/splitit.png b/src/drivers/webextension/images/icons/splitit.png
new file mode 100644
index 0000000000000000000000000000000000000000..37a1b259a515a6c82a0fd17ae07ec9b368315de6
Binary files /dev/null and b/src/drivers/webextension/images/icons/splitit.png differ
diff --git a/src/icons/storeden.svg b/src/drivers/webextension/images/icons/storeden.svg
similarity index 100%
rename from src/icons/storeden.svg
rename to src/drivers/webextension/images/icons/storeden.svg
diff --git a/src/icons/storyblok.png b/src/drivers/webextension/images/icons/storyblok.png
similarity index 100%
rename from src/icons/storyblok.png
rename to src/drivers/webextension/images/icons/storyblok.png
diff --git a/src/icons/strapdown.js.png b/src/drivers/webextension/images/icons/strapdown.js.png
similarity index 100%
rename from src/icons/strapdown.js.png
rename to src/drivers/webextension/images/icons/strapdown.js.png
diff --git a/src/icons/strato.png b/src/drivers/webextension/images/icons/strato.png
similarity index 100%
rename from src/icons/strato.png
rename to src/drivers/webextension/images/icons/strato.png
diff --git a/src/drivers/webextension/images/icons/styled-components.png b/src/drivers/webextension/images/icons/styled-components.png
new file mode 100644
index 0000000000000000000000000000000000000000..bbc569d8927097da3bea57f33e3d3b6da48865a9
Binary files /dev/null and b/src/drivers/webextension/images/icons/styled-components.png differ
diff --git a/src/drivers/webextension/images/icons/sucuri.png b/src/drivers/webextension/images/icons/sucuri.png
new file mode 100644
index 0000000000000000000000000000000000000000..8378d8cd9a353637fbe37b7a479692e564155d9f
Binary files /dev/null and b/src/drivers/webextension/images/icons/sucuri.png differ
diff --git a/src/drivers/webextension/images/icons/svbtle.png b/src/drivers/webextension/images/icons/svbtle.png
new file mode 100644
index 0000000000000000000000000000000000000000..5ef6b8a16ffec195cfe0c6386920fc145001ccd0
Binary files /dev/null and b/src/drivers/webextension/images/icons/svbtle.png differ
diff --git a/src/icons/swift.engine.png b/src/drivers/webextension/images/icons/swift.engine.png
similarity index 100%
rename from src/icons/swift.engine.png
rename to src/drivers/webextension/images/icons/swift.engine.png
diff --git a/src/icons/swiftype.png b/src/drivers/webextension/images/icons/swiftype.png
similarity index 100%
rename from src/icons/swiftype.png
rename to src/drivers/webextension/images/icons/swiftype.png
diff --git a/src/drivers/webextension/images/icons/swiper.svg b/src/drivers/webextension/images/icons/swiper.svg
new file mode 100644
index 0000000000000000000000000000000000000000..63d5a4a32fb440d3c9462bdea2b161520bda9802
--- /dev/null
+++ b/src/drivers/webextension/images/icons/swiper.svg
@@ -0,0 +1,6 @@
+
+
+
+
+
+
diff --git a/src/drivers/webextension/images/icons/sympa.png b/src/drivers/webextension/images/icons/sympa.png
new file mode 100644
index 0000000000000000000000000000000000000000..f783db293c3eb2cd9706d0d22300137ff9fb8020
Binary files /dev/null and b/src/drivers/webextension/images/icons/sympa.png differ
diff --git a/src/icons/syncfusion.svg b/src/drivers/webextension/images/icons/syncfusion.svg
similarity index 100%
rename from src/icons/syncfusion.svg
rename to src/drivers/webextension/images/icons/syncfusion.svg
diff --git a/src/drivers/webextension/images/icons/tagcommander.png b/src/drivers/webextension/images/icons/tagcommander.png
new file mode 100644
index 0000000000000000000000000000000000000000..3ebfbe2b2738c0d625a9d32bb245baac7690db8a
Binary files /dev/null and b/src/drivers/webextension/images/icons/tagcommander.png differ
diff --git a/src/icons/tailwindcss.svg b/src/drivers/webextension/images/icons/tailwindcss.svg
similarity index 100%
rename from src/icons/tailwindcss.svg
rename to src/drivers/webextension/images/icons/tailwindcss.svg
diff --git a/src/drivers/webextension/images/icons/tajs.png b/src/drivers/webextension/images/icons/tajs.png
new file mode 100644
index 0000000000000000000000000000000000000000..7b71d803b371be2934efd23285d7870ae6ece9db
Binary files /dev/null and b/src/drivers/webextension/images/icons/tajs.png differ
diff --git a/src/drivers/webextension/images/icons/termly.svg b/src/drivers/webextension/images/icons/termly.svg
new file mode 100644
index 0000000000000000000000000000000000000000..8fabdfc7ede1ba9064e7863896ef47795aa11359
--- /dev/null
+++ b/src/drivers/webextension/images/icons/termly.svg
@@ -0,0 +1,7 @@
+
+
+
\ No newline at end of file
diff --git a/src/icons/tessitura.svg b/src/drivers/webextension/images/icons/tessitura.svg
similarity index 100%
rename from src/icons/tessitura.svg
rename to src/drivers/webextension/images/icons/tessitura.svg
diff --git a/src/icons/textalk.png b/src/drivers/webextension/images/icons/textalk.png
similarity index 100%
rename from src/icons/textalk.png
rename to src/drivers/webextension/images/icons/textalk.png
diff --git a/src/icons/three.js.png b/src/drivers/webextension/images/icons/three.js.png
similarity index 100%
rename from src/icons/three.js.png
rename to src/drivers/webextension/images/icons/three.js.png
diff --git a/src/icons/thttpd.png b/src/drivers/webextension/images/icons/thttpd.png
similarity index 100%
rename from src/icons/thttpd.png
rename to src/drivers/webextension/images/icons/thttpd.png
diff --git a/src/icons/tictail.png b/src/drivers/webextension/images/icons/tictail.png
similarity index 100%
rename from src/icons/tictail.png
rename to src/drivers/webextension/images/icons/tictail.png
diff --git a/src/drivers/webextension/images/icons/tnsi.png b/src/drivers/webextension/images/icons/tnsi.png
new file mode 100644
index 0000000000000000000000000000000000000000..d05a1878dea488eb50fd469cda2bd92e4abba329
Binary files /dev/null and b/src/drivers/webextension/images/icons/tnsi.png differ
diff --git a/src/drivers/webextension/images/icons/total.js.png b/src/drivers/webextension/images/icons/total.js.png
new file mode 100644
index 0000000000000000000000000000000000000000..a792fdf0fc6c98048831c31fd0e492259dc97818
Binary files /dev/null and b/src/drivers/webextension/images/icons/total.js.png differ
diff --git a/src/drivers/webextension/images/icons/transifex.png b/src/drivers/webextension/images/icons/transifex.png
new file mode 100644
index 0000000000000000000000000000000000000000..0d377d8dba61b9f695d177abf50fa78697103f31
Binary files /dev/null and b/src/drivers/webextension/images/icons/transifex.png differ
diff --git a/src/icons/translucide.svg b/src/drivers/webextension/images/icons/translucide.svg
similarity index 100%
rename from src/icons/translucide.svg
rename to src/drivers/webextension/images/icons/translucide.svg
diff --git a/src/drivers/webextension/images/icons/tray.png b/src/drivers/webextension/images/icons/tray.png
new file mode 100644
index 0000000000000000000000000000000000000000..8c2ee05fbda685e9fa489f004ef8ae09c65a934e
Binary files /dev/null and b/src/drivers/webextension/images/icons/tray.png differ
diff --git a/src/icons/typecho.svg b/src/drivers/webextension/images/icons/typecho.svg
similarity index 100%
rename from src/icons/typecho.svg
rename to src/drivers/webextension/images/icons/typecho.svg
diff --git a/src/icons/uCoz.svg b/src/drivers/webextension/images/icons/uCoz.svg
similarity index 100%
rename from src/icons/uCoz.svg
rename to src/drivers/webextension/images/icons/uCoz.svg
diff --git a/src/icons/uKnowva.png b/src/drivers/webextension/images/icons/uKnowva.png
similarity index 100%
rename from src/icons/uKnowva.png
rename to src/drivers/webextension/images/icons/uKnowva.png
diff --git a/src/icons/user.com.svg b/src/drivers/webextension/images/icons/user.com.svg
similarity index 100%
rename from src/icons/user.com.svg
rename to src/drivers/webextension/images/icons/user.com.svg
diff --git a/src/icons/vBulletin.png b/src/drivers/webextension/images/icons/vBulletin.png
similarity index 100%
rename from src/icons/vBulletin.png
rename to src/drivers/webextension/images/icons/vBulletin.png
diff --git a/src/drivers/webextension/images/icons/varbase.png b/src/drivers/webextension/images/icons/varbase.png
new file mode 100644
index 0000000000000000000000000000000000000000..5374d8e88964e9b3f9df408e27abf507c23b7c31
Binary files /dev/null and b/src/drivers/webextension/images/icons/varbase.png differ
diff --git a/src/drivers/webextension/images/icons/vercel.svg b/src/drivers/webextension/images/icons/vercel.svg
new file mode 100644
index 0000000000000000000000000000000000000000..552a450b42163012b7e6ab7cf56ef57100df307a
--- /dev/null
+++ b/src/drivers/webextension/images/icons/vercel.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/icons/vibecommerce.png b/src/drivers/webextension/images/icons/vibecommerce.png
similarity index 100%
rename from src/icons/vibecommerce.png
rename to src/drivers/webextension/images/icons/vibecommerce.png
diff --git a/src/drivers/webextension/images/icons/vigbo.png b/src/drivers/webextension/images/icons/vigbo.png
new file mode 100644
index 0000000000000000000000000000000000000000..97900eaaea55d2b462b0941582359ff26a878056
Binary files /dev/null and b/src/drivers/webextension/images/icons/vigbo.png differ
diff --git a/src/drivers/webextension/images/icons/visa.png b/src/drivers/webextension/images/icons/visa.png
new file mode 100644
index 0000000000000000000000000000000000000000..5d8698c790379501fa5d238ab7b4ff4bfeb82161
Binary files /dev/null and b/src/drivers/webextension/images/icons/visa.png differ
diff --git a/src/drivers/webextension/images/icons/vue.svg b/src/drivers/webextension/images/icons/vue.svg
new file mode 100644
index 0000000000000000000000000000000000000000..71c1cfb9afa00a7c8579ca505fb3f5ddcafee7be
--- /dev/null
+++ b/src/drivers/webextension/images/icons/vue.svg
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/src/icons/vwo.svg b/src/drivers/webextension/images/icons/vwo.svg
similarity index 100%
rename from src/icons/vwo.svg
rename to src/drivers/webextension/images/icons/vwo.svg
diff --git a/src/drivers/webextension/images/icons/webAR.svg b/src/drivers/webextension/images/icons/webAR.svg
new file mode 100644
index 0000000000000000000000000000000000000000..7fac0a5af12975d9ae4c2dc77ca93d781adb2cd4
--- /dev/null
+++ b/src/drivers/webextension/images/icons/webAR.svg
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/src/icons/webEdition.png b/src/drivers/webextension/images/icons/webEdition.png
similarity index 100%
rename from src/icons/webEdition.png
rename to src/drivers/webextension/images/icons/webEdition.png
diff --git a/src/drivers/webextension/images/icons/webdev.png b/src/drivers/webextension/images/icons/webdev.png
new file mode 100644
index 0000000000000000000000000000000000000000..fe13b235f91413b0325965dd130ba644de9d4dba
Binary files /dev/null and b/src/drivers/webextension/images/icons/webdev.png differ
diff --git a/src/icons/webflow.svg b/src/drivers/webextension/images/icons/webflow.svg
similarity index 100%
rename from src/icons/webflow.svg
rename to src/drivers/webextension/images/icons/webflow.svg
diff --git a/src/drivers/webextension/images/icons/webmine.png b/src/drivers/webextension/images/icons/webmine.png
new file mode 100644
index 0000000000000000000000000000000000000000..ee927c3a23133d0a8a67e1802bbef92143a216c3
Binary files /dev/null and b/src/drivers/webextension/images/icons/webmine.png differ
diff --git a/src/icons/webpack.svg b/src/drivers/webextension/images/icons/webpack.svg
similarity index 100%
rename from src/icons/webpack.svg
rename to src/drivers/webextension/images/icons/webpack.svg
diff --git a/src/drivers/webextension/images/icons/websocket.png b/src/drivers/webextension/images/icons/websocket.png
new file mode 100644
index 0000000000000000000000000000000000000000..b3edb9fca506692a84c0bc9ba3945456fcb9800f
Binary files /dev/null and b/src/drivers/webextension/images/icons/websocket.png differ
diff --git a/src/drivers/webextension/images/icons/welcart.png b/src/drivers/webextension/images/icons/welcart.png
new file mode 100644
index 0000000000000000000000000000000000000000..f2ce90eafb9c9b66028391e80088b7181816354d
Binary files /dev/null and b/src/drivers/webextension/images/icons/welcart.png differ
diff --git a/src/icons/wikinggruppen.png b/src/drivers/webextension/images/icons/wikinggruppen.png
similarity index 100%
rename from src/icons/wikinggruppen.png
rename to src/drivers/webextension/images/icons/wikinggruppen.png
diff --git a/src/icons/wisyCMS.svg b/src/drivers/webextension/images/icons/wisyCMS.svg
similarity index 100%
rename from src/icons/wisyCMS.svg
rename to src/drivers/webextension/images/icons/wisyCMS.svg
diff --git a/src/icons/wpCache.png b/src/drivers/webextension/images/icons/wpCache.png
similarity index 100%
rename from src/icons/wpCache.png
rename to src/drivers/webextension/images/icons/wpCache.png
diff --git a/src/icons/wp_super_cache.png b/src/drivers/webextension/images/icons/wp_super_cache.png
similarity index 100%
rename from src/icons/wp_super_cache.png
rename to src/drivers/webextension/images/icons/wp_super_cache.png
diff --git a/src/icons/wpengine.svg b/src/drivers/webextension/images/icons/wpengine.svg
similarity index 100%
rename from src/icons/wpengine.svg
rename to src/drivers/webextension/images/icons/wpengine.svg
diff --git a/src/drivers/webextension/images/icons/wpvip.svg b/src/drivers/webextension/images/icons/wpvip.svg
new file mode 100644
index 0000000000000000000000000000000000000000..788a4fcbe8b37ec3d0451d42ad5598604dc91aa7
--- /dev/null
+++ b/src/drivers/webextension/images/icons/wpvip.svg
@@ -0,0 +1,22 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/drivers/webextension/images/icons/xeora.png b/src/drivers/webextension/images/icons/xeora.png
new file mode 100644
index 0000000000000000000000000000000000000000..761a4ba411b0f9c1395c48016415d46f8050db9e
Binary files /dev/null and b/src/drivers/webextension/images/icons/xeora.png differ
diff --git a/src/drivers/webextension/images/icons/xonic.png b/src/drivers/webextension/images/icons/xonic.png
new file mode 100644
index 0000000000000000000000000000000000000000..59bf40fc5236f125498cb8bc5cdbf76419b0e1f4
Binary files /dev/null and b/src/drivers/webextension/images/icons/xonic.png differ
diff --git a/src/icons/xtCommerce.png b/src/drivers/webextension/images/icons/xtCommerce.png
similarity index 100%
rename from src/icons/xtCommerce.png
rename to src/drivers/webextension/images/icons/xtCommerce.png
diff --git a/src/drivers/webextension/images/icons/xwiki.png b/src/drivers/webextension/images/icons/xwiki.png
new file mode 100644
index 0000000000000000000000000000000000000000..2443a81a264e0c21783dda9e0d9d80b9a38d0cd8
Binary files /dev/null and b/src/drivers/webextension/images/icons/xwiki.png differ
diff --git a/src/icons/yahoo.png b/src/drivers/webextension/images/icons/yahoo.png
similarity index 100%
rename from src/icons/yahoo.png
rename to src/drivers/webextension/images/icons/yahoo.png
diff --git a/src/drivers/webextension/images/icons/yepcomm.png b/src/drivers/webextension/images/icons/yepcomm.png
new file mode 100644
index 0000000000000000000000000000000000000000..fc16c293b6bc5c4de6d27ae056165fd786dbffc1
Binary files /dev/null and b/src/drivers/webextension/images/icons/yepcomm.png differ
diff --git a/src/drivers/webextension/images/icons/zip_pay.svg b/src/drivers/webextension/images/icons/zip_pay.svg
new file mode 100644
index 0000000000000000000000000000000000000000..23c929c37180bf2a7ec74b4078bad09da6f9259b
--- /dev/null
+++ b/src/drivers/webextension/images/icons/zip_pay.svg
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/drivers/webextension/images/logo-purple.svg b/src/drivers/webextension/images/logo-purple.svg
new file mode 100644
index 0000000000000000000000000000000000000000..e5e67bb21574055cca8cb326d628cbb152820011
--- /dev/null
+++ b/src/drivers/webextension/images/logo-purple.svg
@@ -0,0 +1,29 @@
+
+
+
+ Logo
+ Created with Sketch.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/drivers/webextension/images/pin-active.svg b/src/drivers/webextension/images/pin-active.svg
deleted file mode 100644
index 12462f304feba10fa41fd864fcd8d9bd17493b41..0000000000000000000000000000000000000000
--- a/src/drivers/webextension/images/pin-active.svg
+++ /dev/null
@@ -1,14 +0,0 @@
-
-
-
-
-
-
-
diff --git a/src/drivers/webextension/images/pin.svg b/src/drivers/webextension/images/pin.svg
deleted file mode 100644
index 20e42e6d06adb1648f0b756166a6952a4ac3125b..0000000000000000000000000000000000000000
--- a/src/drivers/webextension/images/pin.svg
+++ /dev/null
@@ -1,14 +0,0 @@
-
-
-
-
-
-
-
diff --git a/src/drivers/webextension/images/twitter.png b/src/drivers/webextension/images/twitter.png
deleted file mode 100644
index e20284ddf2ce763c5a010720c901f29c7900a2db..0000000000000000000000000000000000000000
Binary files a/src/drivers/webextension/images/twitter.png and /dev/null differ
diff --git a/src/drivers/webextension/js/content.js b/src/drivers/webextension/js/content.js
index 82713d79bba9f041d3170746b8a072469422570a..853ae36ae65acfa743c782bd3d68e40736e4f003 100644
--- a/src/drivers/webextension/js/content.js
+++ b/src/drivers/webextension/js/content.js
@@ -1,87 +1,145 @@
-/** global: browser */
-/** global: XMLSerializer */
-
-/* global browser */
+'use strict'
/* eslint-env browser */
+/* globals chrome */
+
+const Content = {
+ /**
+ * Initialise content script
+ */
+ async init() {
+ if (await Content.driver('isDisabledDomain', location.href)) {
+ return
+ }
-const port = browser.runtime.connect({
- name: 'content.js',
-});
-
-if (typeof browser !== 'undefined' && typeof document.body !== 'undefined') {
- try {
- port.postMessage({ id: 'init' });
-
- // HTML
- let html = new XMLSerializer().serializeToString(document);
+ await new Promise((resolve) => setTimeout(resolve, 1000))
- const chunks = [];
- const maxCols = 2000;
- const maxRows = 3000;
- const rows = html.length / maxCols;
+ try {
+ // HTML
+ let html = new XMLSerializer().serializeToString(document)
- let i;
+ // Discard the middle portion of HTML to avoid performance degradation on large pages
+ const chunks = []
+ const maxCols = 2000
+ const maxRows = 3000
+ const rows = html.length / maxCols
- for (i = 0; i < rows; i += 1) {
- if (i < maxRows / 2 || i > rows - maxRows / 2) {
- chunks.push(html.slice(i * maxCols, (i + 1) * maxCols));
+ for (let i = 0; i < rows; i += 1) {
+ if (i < maxRows / 2 || i > rows - maxRows / 2) {
+ chunks.push(html.slice(i * maxCols, (i + 1) * maxCols))
+ }
}
- }
-
- html = chunks.join('\n');
-
- // Scripts
- const scripts = Array.prototype.slice
- .apply(document.scripts)
- .filter(script => script.src)
- .map(script => script.src)
- .filter(script => script.indexOf('data:text/javascript;') !== 0);
-
- port.postMessage({ id: 'analyze', subject: { html, scripts } });
- // JavaScript variables
- const script = document.createElement('script');
+ html = chunks.join('\n')
+
+ // Determine language based on the HTML lang attribute or content
+ const language =
+ document.documentElement.getAttribute('lang') ||
+ document.documentElement.getAttribute('xml:lang') ||
+ (await new Promise((resolve) =>
+ chrome.i18n.detectLanguage
+ ? chrome.i18n.detectLanguage(html, ({ languages }) =>
+ resolve(
+ languages
+ .filter(({ percentage }) => percentage >= 75)
+ .map(({ language: lang }) => lang)[0]
+ )
+ )
+ : resolve()
+ ))
+
+ // Script tags
+ const scripts = Array.from(document.scripts)
+ .filter(({ src }) => src)
+ .map(({ src }) => src)
+ .filter((script) => script.indexOf('data:text/javascript;') !== 0)
+
+ // Meta tags
+ const meta = Array.from(document.querySelectorAll('meta')).reduce(
+ (metas, meta) => {
+ const key = meta.getAttribute('name') || meta.getAttribute('property')
+
+ if (key) {
+ metas[key.toLowerCase()] = [meta.getAttribute('content')]
+ }
+
+ return metas
+ },
+ {}
+ )
+
+ Content.driver('onContentLoad', [
+ location.href,
+ { html, scripts, meta },
+ language
+ ])
+
+ Content.onGetTechnologies(await Content.driver('getTechnologies'))
+ } catch (error) {
+ Content.driver('error', error)
+ }
+ },
+
+ driver(func, args) {
+ return new Promise((resolve, reject) => {
+ chrome.runtime.sendMessage(
+ {
+ source: 'content.js',
+ func,
+ args: args ? (Array.isArray(args) ? args : [args]) : []
+ },
+ (response) => {
+ chrome.runtime.lastError
+ ? reject(new Error(chrome.runtime.lastError.message))
+ : resolve(response)
+ }
+ )
+ })
+ },
+
+ /**
+ * Callback for getTechnologies
+ * @param {Array} technologies
+ */
+ onGetTechnologies(technologies = []) {
+ // Inject a script tag into the page to access methods of the window object
+ const script = document.createElement('script')
script.onload = () => {
- const onMessage = (event) => {
- if (event.data.id !== 'js') {
- return;
+ const onMessage = ({ data }) => {
+ if (!data.wappalyzer || !data.wappalyzer.js) {
+ return
}
- window.removeEventListener('message', onMessage);
+ window.removeEventListener('message', onMessage)
- port.postMessage({ id: 'analyze', subject: { js: event.data.js } });
+ chrome.runtime.sendMessage({
+ source: 'content.js',
+ func: 'analyzeJs',
+ args: [location.href.split('#')[0], data.wappalyzer.js]
+ })
- script.remove();
- };
+ script.remove()
+ }
- window.addEventListener('message', onMessage);
+ window.addEventListener('message', onMessage)
- port.postMessage({ id: 'get_js_patterns' });
- };
+ window.postMessage({
+ wappalyzer: {
+ technologies: technologies
+ .filter(({ js }) => Object.keys(js).length)
+ .map(({ name, js }) => ({ name, chains: Object.keys(js) }))
+ }
+ })
+ }
- script.setAttribute('src', browser.extension.getURL('js/inject.js'));
+ script.setAttribute('src', chrome.extension.getURL('js/inject.js'))
- document.body.appendChild(script);
- } catch (error) {
- port.postMessage({ id: 'log', subject: error });
+ document.body.appendChild(script)
}
}
-port.onMessage.addListener((message) => {
- switch (message.id) {
- case 'get_js_patterns':
- postMessage({
- id: 'patterns',
- patterns: message.response.patterns,
- }, window.location.href);
-
- break;
- default:
- // Do nothing
- }
-});
-
-// https://stackoverflow.com/a/44774834
-// https://developer.mozilla.org/en-US/Add-ons/WebExtensions/API/tabs/executeScript#Return_value
-undefined; // eslint-disable-line no-unused-expressions
+if (/complete|interactive|loaded/.test(document.readyState)) {
+ Content.init()
+} else {
+ document.addEventListener('DOMContentLoaded', Content.init)
+}
diff --git a/src/drivers/webextension/js/driver.js b/src/drivers/webextension/js/driver.js
index 327d31717434c5d557e947f2b26ebbda086cecfe..7a338358b4b391f4b6082966307b586468ebc724 100644
--- a/src/drivers/webextension/js/driver.js
+++ b/src/drivers/webextension/js/driver.js
@@ -1,394 +1,619 @@
-/**
- * WebExtension driver
- */
-
+'use strict'
/* eslint-env browser */
-/* global browser, chrome, fetch, Wappalyzer */
-
-/** global: browser */
-/** global: chrome */
-/** global: fetch */
-/** global: Wappalyzer */
-
-const wappalyzer = new Wappalyzer();
-
-const tabCache = {};
-const robotsTxtQueue = {};
-
-let categoryOrder = [];
+/* globals chrome, Wappalyzer, Utils */
+
+const {
+ setTechnologies,
+ setCategories,
+ analyze,
+ analyzeManyToMany,
+ resolve
+} = Wappalyzer
+const { agent, promisify, getOption, setOption, open } = Utils
+
+const expiry = 1000 * 60 * 60 * 24
+
+const Driver = {
+ lastPing: Date.now(),
+
+ /**
+ * Initialise driver
+ */
+ async init() {
+ await Driver.loadTechnologies()
+
+ const hostnameCache = await getOption('hostnames', {})
+
+ Driver.cache = {
+ hostnames: Object.keys(hostnameCache).reduce(
+ (cache, hostname) => ({
+ ...cache,
+ [hostname]: {
+ ...hostnameCache[hostname],
+ detections: hostnameCache[hostname].detections.map(
+ ({
+ technology: name,
+ pattern: { regex, confidence },
+ version
+ }) => ({
+ technology: Wappalyzer.technologies.find(
+ ({ name: _name }) => name === _name
+ ),
+ pattern: {
+ regex: new RegExp(regex, 'i'),
+ confidence
+ },
+ version
+ })
+ )
+ }
+ }),
+ {}
+ ),
+ tabs: {},
+ robots: await getOption('robots', {}),
+ ads: await getOption('ads', [])
+ }
-browser.tabs.onRemoved.addListener((tabId) => {
- tabCache[tabId] = null;
-});
+ chrome.browserAction.setBadgeBackgroundColor({ color: '#6B39BD' }, () => {})
-function userAgent() {
- const url = chrome.extension.getURL('/');
+ chrome.webRequest.onCompleted.addListener(
+ Driver.onWebRequestComplete,
+ { urls: ['http://*/*', 'https://*/*'], types: ['main_frame'] },
+ ['responseHeaders']
+ )
- if (url.match(/^chrome-/)) {
- return 'chrome';
- }
+ chrome.tabs.onRemoved.addListener((id) => (Driver.cache.tabs[id] = null))
- if (url.match(/^moz-/)) {
- return 'firefox';
- }
+ // Enable messaging between scripts
+ chrome.runtime.onMessage.addListener(Driver.onMessage)
- if (url.match(/^ms-browser-/)) {
- return 'edge';
- }
-}
+ const { version } = chrome.runtime.getManifest()
+ const previous = await getOption('version')
+ const upgradeMessage = await getOption('upgradeMessage', true)
-/**
- * Get a value from localStorage
- */
-function getOption(name, defaultValue = null) {
- return new Promise(async (resolve, reject) => {
- let value = defaultValue;
+ if (previous === null) {
+ open('https://www.wappalyzer.com/installed')
+ } else if (version !== previous && upgradeMessage) {
+ // open(`https://www.wappalyzer.com/upgraded?v${version}`, false)
+ }
+ await setOption('version', version)
+ },
+
+ /**
+ * Log debug messages to the console
+ * @param {String} message
+ * @param {String} source
+ * @param {String} type
+ */
+ log(message, source = 'driver', type = 'log') {
+ // eslint-disable-next-line no-console
+ console[type](`wappalyzer | ${source} |`, message)
+ },
+
+ /**
+ * Log errors to the console
+ * @param {String} error
+ * @param {String} source
+ */
+ error(error, source = 'driver') {
+ Driver.log(error, source, 'error')
+ },
+
+ /**
+ * Load technologies and categories into memory
+ */
+ async loadTechnologies() {
try {
- const option = await browser.storage.local.get(name);
+ const { apps: technologies, categories } = await (
+ await fetch(chrome.extension.getURL('apps.json'))
+ ).json()
- if (option[name] !== undefined) {
- value = option[name];
- }
+ setTechnologies(technologies)
+ setCategories(categories)
} catch (error) {
- wappalyzer.log(error.message, 'driver', 'error');
-
- return reject(error.message);
+ Driver.error(error)
}
-
- return resolve(value);
- });
-}
-
-/**
- * Set a value in localStorage
- */
-function setOption(name, value) {
- return new Promise(async (resolve, reject) => {
+ },
+
+ /**
+ * Perform a HTTP POST request
+ * @param {String} url
+ * @param {String} body
+ */
+ post(url, body) {
try {
- await browser.storage.local.set({ [name]: value });
+ return fetch(url, {
+ method: 'POST',
+ body: JSON.stringify(body)
+ })
} catch (error) {
- wappalyzer.log(error.message, 'driver', 'error');
-
- return reject(error.message);
+ throw new Error(error.message || error.toString())
+ }
+ },
+
+ /**
+ * Analyse JavaScript variables
+ * @param {String} url
+ * @param {Array} js
+ */
+ async analyzeJs(url, js) {
+ await Driver.onDetect(
+ url,
+ Array.prototype.concat.apply(
+ [],
+ js.map(({ name, chain, value }) =>
+ analyzeManyToMany(
+ Wappalyzer.technologies.find(({ name: _name }) => name === _name),
+ 'js',
+ { [chain]: [value] }
+ )
+ )
+ )
+ )
+ },
+
+ /**
+ * Enable scripts to call Driver functions through messaging
+ * @param {Object} message
+ * @param {Object} sender
+ * @param {Function} callback
+ */
+ onMessage({ source, func, args }, sender, callback) {
+ if (!func) {
+ return
}
- return resolve();
- });
-}
-
-/**
- * Open a tab
- */
-function openTab(args) {
- browser.tabs.create({
- url: args.url,
- active: args.background === undefined || !args.background,
- });
-}
+ Driver.log({ source, func, args })
-/**
- * Make a POST request
- */
-async function post(url, body) {
- try {
- const response = await fetch(url, {
- method: 'POST',
- body: JSON.stringify(body),
- });
-
- wappalyzer.log(`POST ${url}: ${response.status}`, 'driver');
- } catch (error) {
- wappalyzer.log(`POST ${url}: ${error}`, 'driver', 'error');
- }
-}
+ if (!Driver[func]) {
+ Driver.error(new Error(`Method does not exist: Driver.${func}`))
-// Capture response headers
-browser.webRequest.onCompleted.addListener(async (request) => {
- const headers = {};
+ return
+ }
- if (request.responseHeaders) {
- const url = wappalyzer.parseUrl(request.url);
+ Promise.resolve(Driver[func].call(Driver[func], ...(args || [])))
+ .then(callback)
+ .catch(Driver.error)
- let tab;
+ return !!callback
+ },
- try {
- [tab] = await browser.tabs.query({ url: [url.href] });
- } catch (error) {
- wappalyzer.log(error, 'driver', 'error');
+ /**
+ * Analyse response headers
+ * @param {Object} request
+ */
+ async onWebRequestComplete(request) {
+ if (await Driver.isDisabledDomain(request.url)) {
+ return
}
- if (tab) {
- request.responseHeaders.forEach((header) => {
- const name = header.name.toLowerCase();
+ if (request.responseHeaders) {
+ const headers = {}
- headers[name] = headers[name] || [];
-
- headers[name].push((header.value || header.binaryValue || '').toString());
- });
-
- if (headers['content-type'] && /\/x?html/.test(headers['content-type'][0])) {
- wappalyzer.analyze(url, { headers }, { tab });
+ try {
+ const [tab] = await promisify(chrome.tabs, 'query', {
+ url: [request.url]
+ })
+
+ if (tab) {
+ request.responseHeaders.forEach((header) => {
+ const name = header.name.toLowerCase()
+
+ headers[name] = headers[name] || []
+
+ headers[name].push(
+ (header.value || header.binaryValue || '').toString()
+ )
+ })
+
+ if (
+ headers['content-type'] &&
+ /\/x?html/.test(headers['content-type'][0])
+ ) {
+ await Driver.onDetect(request.url, analyze({ headers }))
+ }
+ }
+ } catch (error) {
+ Driver.error(error)
}
}
- }
-}, { urls: ['http://*/*', 'https://*/*'], types: ['main_frame'] }, ['responseHeaders']);
-
-browser.runtime.onConnect.addListener((port) => {
- port.onMessage.addListener(async (message) => {
- if (message.id === undefined) {
- return;
- }
-
- if (message.id !== 'log') {
- wappalyzer.log(`Message from ${port.name}: ${message.id}`, 'driver');
+ },
+
+ /**
+ * Process return values from content.js
+ * @param {String} url
+ * @param {Object} items
+ * @param {String} language
+ */
+ async onContentLoad(url, items, language) {
+ try {
+ const { hostname } = new URL(url)
+
+ items.cookies = (
+ await promisify(chrome.cookies, 'getAll', {
+ domain: `.${hostname}`
+ })
+ ).reduce(
+ (cookies, { name, value }) => ({
+ ...cookies,
+ [name]: [value]
+ }),
+ {}
+ )
+
+ await Driver.onDetect(url, analyze({ url, ...items }), language, true)
+ } catch (error) {
+ Driver.error(error)
}
+ },
+
+ /**
+ * Get all technologies
+ */
+ getTechnologies() {
+ return Wappalyzer.technologies
+ },
+
+ /**
+ * Check if Wappalyzer has been disabled for the domain
+ */
+ async isDisabledDomain(url) {
+ try {
+ const { hostname } = new URL(url)
- const pinnedCategory = await getOption('pinnedCategory');
-
- const url = wappalyzer.parseUrl(port.sender.tab ? port.sender.tab.url : '');
-
- const cookies = await browser.cookies.getAll({ domain: `.${url.hostname}` });
-
- let response;
-
- switch (message.id) {
- case 'log':
- wappalyzer.log(message.subject, message.source);
-
- break;
- case 'init':
- wappalyzer.analyze(url, { cookies }, { tab: port.sender.tab });
-
- break;
- case 'analyze':
- wappalyzer.analyze(url, message.subject, { tab: port.sender.tab });
-
- await setOption('hostnameCache', wappalyzer.hostnameCache);
-
- break;
- case 'ad_log':
- wappalyzer.cacheDetectedAds(message.subject);
-
- break;
- case 'get_apps':
- response = {
- tabCache: tabCache[message.tab.id],
- apps: wappalyzer.apps,
- categories: wappalyzer.categories,
- pinnedCategory,
- termsAccepted: userAgent() === 'chrome' || await getOption('termsAccepted', false),
- };
-
- break;
- case 'set_option':
- await setOption(message.key, message.value);
-
- break;
- case 'get_js_patterns':
- response = {
- patterns: wappalyzer.jsPatterns,
- };
-
- break;
- default:
- // Do nothing
+ return (await getOption('disabledDomains', [])).includes(hostname)
+ } catch (error) {
+ return false
}
-
- if (response) {
- port.postMessage({
- id: message.id,
- response,
- });
+ },
+
+ /**
+ * Callback for detections
+ * @param {String} url
+ * @param {Array} detections
+ * @param {String} language
+ * @param {Boolean} incrementHits
+ */
+ async onDetect(url, detections = [], language, incrementHits = false) {
+ if (!detections.length) {
+ return
}
- });
-});
-
-wappalyzer.driver.document = document;
-/**
- * Log messages to console
- */
-wappalyzer.driver.log = (message, source, type) => {
- const log = ['warn', 'error'].indexOf(type) !== -1 ? type : 'log';
+ const { protocol, hostname } = new URL(url)
+
+ // Cache detections
+ const cache = (Driver.cache.hostnames[hostname] = {
+ ...(Driver.cache.hostnames[hostname] || {
+ url: `${protocol}//${hostname}`,
+ detections: [],
+ hits: incrementHits ? 0 : 1
+ }),
+ dateTime: Date.now()
+ })
+
+ // Remove duplicates
+ cache.detections = cache.detections
+ .concat(detections)
+ .filter(({ technology }) => technology)
+
+ cache.detections.filter(
+ ({ technology: { name }, pattern: { regex } }, index) =>
+ cache.detections.findIndex(
+ ({ technology: { name: _name }, pattern: { regex: _regex } }) =>
+ name === _name && (!regex || regex.toString() === _regex.toString())
+ ) === index
+ )
+
+ cache.hits += incrementHits ? 1 : 0
+ cache.language = cache.language || language
+
+ // Expire cache
+ Driver.cache.hostnames = Object.keys(Driver.cache.hostnames).reduce(
+ (hostnames, hostname) => {
+ const cache = Driver.cache.hostnames[hostname]
+
+ if (cache.dateTime > Date.now() - expiry) {
+ hostnames[hostname] = cache
+ }
- console[log](`[wappalyzer ${type}]`, `[${source}]`, message); // eslint-disable-line no-console
-};
+ return hostnames
+ },
+ {}
+ )
+
+ await setOption(
+ 'hostnames',
+ Object.keys(Driver.cache.hostnames).reduce(
+ (cache, hostname) => ({
+ ...cache,
+ [hostname]: {
+ ...Driver.cache.hostnames[hostname],
+ detections: Driver.cache.hostnames[hostname].detections
+ .filter(({ technology }) => technology)
+ .map(
+ ({
+ technology: { name: technology },
+ pattern: { regex, confidence },
+ version
+ }) => ({
+ technology,
+ pattern: {
+ regex: regex.source,
+ confidence
+ },
+ version
+ })
+ )
+ }
+ }),
+ {}
+ )
+ )
-/**
- * Display apps
- */
-wappalyzer.driver.displayApps = async (detected, meta, context) => {
- const { tab } = context;
+ const resolved = resolve(Driver.cache.hostnames[hostname].detections)
- if (tab === undefined) {
- return;
- }
+ await Driver.setIcon(url, resolved)
- tabCache[tab.id] = tabCache[tab.id] || {
- detected: [],
- };
+ const tabs = await promisify(chrome.tabs, 'query', { url })
- tabCache[tab.id].detected = detected;
+ tabs.forEach(({ id }) => (Driver.cache.tabs[id] = resolved))
- const pinnedCategory = await getOption('pinnedCategory');
- const dynamicIcon = await getOption('dynamicIcon', true);
+ Driver.log({ hostname, technologies: resolved })
- let found = false;
+ await Driver.ping()
+ },
- // Find the main application to display
- [pinnedCategory].concat(categoryOrder).forEach((match) => {
- Object.keys(detected).forEach((appName) => {
- const app = detected[appName];
+ /**
+ * Callback for onAd listener
+ * @param {Object} ad
+ */
+ async onAd(ad) {
+ Driver.cache.ads.push(ad)
- app.props.cats.forEach((category) => {
- if (category === match && !found) {
- let icon = app.props.icon && dynamicIcon ? app.props.icon : 'default.svg';
+ await setOption('ads', Driver.cache.ads)
+ },
- if (/\.svg$/i.test(icon)) {
- icon = `converted/${icon.replace(/\.svg$/, '.png')}`;
- }
+ /**
+ * Update the extension icon
+ * @param {String} url
+ * @param {Object} technologies
+ */
+ async setIcon(url, technologies = []) {
+ const dynamicIcon = await getOption('dynamicIcon', false)
+ const badge = await getOption('badge', true)
- try {
- browser.pageAction.setIcon({
- tabId: tab.id,
- path: `../images/icons/${icon}`,
- });
- } catch (e) {
- // Firefox for Android does not support setIcon see https://bugzilla.mozilla.org/show_bug.cgi?id=1331746
- }
+ let icon = 'default.svg'
- found = true;
- }
- });
- });
- });
-
- browser.pageAction.show(tab.id);
-};
-
-/**
- * Fetch and cache robots.txt for host
- */
-wappalyzer.driver.getRobotsTxt = async (host, secure = false) => {
- if (robotsTxtQueue[host]) {
- return robotsTxtQueue[host];
- }
+ if (dynamicIcon) {
+ const pinnedCategory = parseInt(await getOption('pinnedCategory'), 10)
- const tracking = await getOption('tracking', true);
- const robotsTxtCache = await getOption('robotsTxtCache', {});
+ const pinned = technologies.find(({ categories }) =>
+ categories.some(({ id }) => id === pinnedCategory)
+ )
- robotsTxtQueue[host] = new Promise(async (resolve) => {
- if (!tracking) {
- return resolve([]);
+ ;({ icon } = pinned || technologies[0] || { icon })
}
- if (host in robotsTxtCache) {
- return resolve(robotsTxtCache[host]);
+ ;(await promisify(chrome.tabs, 'query', { url })).forEach(
+ ({ id: tabId }) => {
+ chrome.browserAction.setBadgeText(
+ {
+ tabId,
+ text:
+ badge && technologies.length ? technologies.length.toString() : ''
+ },
+ () => {}
+ )
+
+ chrome.browserAction.setIcon(
+ {
+ tabId,
+ path: chrome.extension.getURL(
+ `../images/icons/${
+ /\.svg$/i.test(icon)
+ ? `converted/${icon.replace(/\.svg$/, '.png')}`
+ : icon
+ }`
+ )
+ },
+ () => {}
+ )
+ }
+ )
+ },
+
+ /**
+ * Get the detected technologies for the current tab
+ */
+ async getDetections() {
+ const [{ id, url }] = await promisify(chrome.tabs, 'query', {
+ active: true,
+ currentWindow: true
+ })
+
+ if (await Driver.isDisabledDomain(url)) {
+ await Driver.setIcon(url, [])
+
+ return
}
- const timeout = setTimeout(() => resolve([]), 3000);
+ const resolved = Driver.cache.tabs[id]
- let response;
+ await Driver.setIcon(url, resolved)
- try {
- response = await fetch(`http${secure ? 's' : ''}://${host}/robots.txt`, { redirect: 'follow' });
- } catch (error) {
- wappalyzer.log(error, 'driver', 'error');
+ return resolved
+ },
- return resolve([]);
+ /**
+ * Fetch the website's robots.txt rules
+ * @param {String} hostname
+ * @param {Boolean} secure
+ */
+ async getRobots(hostname, secure = false) {
+ if (!(await getOption('tracking', true))) {
+ return
}
- clearTimeout(timeout);
-
- const robotsTxt = response.ok ? await response.text() : '';
-
- robotsTxtCache[host] = Wappalyzer.parseRobotsTxt(robotsTxt);
+ if (typeof Driver.cache.robots[hostname] !== 'undefined') {
+ return Driver.cache.robots[hostname]
+ }
- await setOption('robotsTxtCache', robotsTxtCache);
+ try {
+ Driver.cache.robots[hostname] = await Promise.race([
+ new Promise(async (resolve) => {
+ const response = await fetch(
+ `http${secure ? 's' : ''}://${hostname}/robots.txt`,
+ {
+ redirect: 'follow',
+ mode: 'no-cors'
+ }
+ )
+
+ if (!response.ok) {
+ Driver.error(new Error(response.statusText))
+
+ resolve('')
+ }
- delete robotsTxtQueue[host];
+ let agent
+
+ resolve(
+ (await response.text()).split('\n').reduce((disallows, line) => {
+ let matches = /^User-agent:\s*(.+)$/i.exec(line.trim())
+
+ if (matches) {
+ agent = matches[1].toLowerCase()
+ } else if (agent === '*' || agent === 'wappalyzer') {
+ matches = /^Disallow:\s*(.+)$/i.exec(line.trim())
+
+ if (matches) {
+ disallows.push(matches[1])
+ }
+ }
+
+ return disallows
+ }, [])
+ )
+ }),
+ new Promise((resolve) => setTimeout(() => resolve(''), 5000))
+ ])
+
+ Driver.cache.robots = Object.keys(Driver.cache.robots)
+ .slice(-50)
+ .reduce(
+ (cache, hostname) => ({
+ ...cache,
+ [hostname]: Driver.cache.robots[hostname]
+ }),
+ {}
+ )
+
+ await setOption('robots', Driver.cache.robots)
+
+ return Driver.cache.robots[hostname]
+ } catch (error) {
+ Driver.error(error)
+ }
+ },
- return resolve(robotsTxtCache[host]);
- });
+ /**
+ * Check if the website allows indexing of a URL
+ * @param {String} href
+ */
+ async checkRobots(href) {
+ const url = new URL(href)
- return robotsTxtQueue[host];
-};
+ if (url.protocol !== 'http:' && url.protocol !== 'https:') {
+ throw new Error('Invalid protocol')
+ }
-/**
- * Anonymously track detected applications for research purposes
- */
-wappalyzer.driver.ping = async (hostnameCache = {}, adCache = []) => {
- const tracking = await getOption('tracking', true);
- const termsAccepted = userAgent() === 'chrome' || await getOption('termsAccepted', false);
+ const robots = await Driver.getRobots(
+ url.hostname,
+ url.protocol === 'https:'
+ )
- if (tracking && termsAccepted) {
- if (Object.keys(hostnameCache).length) {
- post('https://api.wappalyzer.com/ping/v1/', hostnameCache);
+ if (robots.some((disallowed) => url.pathname.indexOf(disallowed) === 0)) {
+ throw new Error('Disallowed')
}
+ },
+
+ /**
+ * Clear caches
+ */
+ async clearCache() {
+ Driver.cache.hostnames = {}
+ Driver.cache.tabs = {}
+
+ await setOption('hostnames', {})
+ },
+
+ /**
+ * Anonymously send identified technologies to wappalyzer.com
+ * This function can be disabled in the extension settings
+ */
+ async ping() {
+ const tracking = await getOption('tracking', true)
+ const termsAccepted =
+ agent === 'chrome' || (await getOption('termsAccepted', false))
+
+ if (tracking && termsAccepted) {
+ const hostnames = Object.keys(Driver.cache.hostnames).reduce(
+ (hostnames, hostname) => {
+ // eslint-disable-next-line standard/computed-property-even-spacing
+ const { url, language, detections, hits } = Driver.cache.hostnames[
+ hostname
+ ]
+
+ if (
+ !/((local|dev(elop(ment)?)?|stag(e|ing)?|preprod|test(ing)?|demo(shop)?|admin|cache)[.-]|localhost|google|\/admin|\.local|\.test|\.dev|127\.|0\.)/.test(
+ hostname
+ ) &&
+ hits >= 3
+ ) {
+ hostnames[url] = hostnames[url] || {
+ applications: resolve(detections).reduce(
+ (technologies, { name, confidence, version }) => {
+ if (confidence === 100) {
+ technologies[name] = {
+ version,
+ hits
+ }
+ }
+
+ return technologies
+ },
+ {}
+ ),
+ meta: {
+ language
+ }
+ }
+ }
- if (adCache.length) {
- post('https://ad.wappalyzer.com/log/wp/', adCache);
- }
+ return hostnames
+ },
+ {}
+ )
- await setOption('robotsTxtCache', {});
- }
-};
-
-// Init
-(async () => {
- // Technologies
- try {
- const response = await fetch('../apps.json');
- const json = await response.json();
-
- wappalyzer.apps = json.apps;
- wappalyzer.categories = json.categories;
- } catch (error) {
- wappalyzer.log(`GET apps.json: ${error.message}`, 'driver', 'error');
- }
+ const count = Object.keys(hostnames).length
- wappalyzer.parseJsPatterns();
-
- categoryOrder = Object.keys(wappalyzer.categories)
- .map(categoryId => parseInt(categoryId, 10))
- .sort((a, b) => wappalyzer.categories[a].priority - wappalyzer.categories[b].priority);
-
- // Version check
- const { version } = browser.runtime.getManifest();
- const previousVersion = await getOption('version');
- const upgradeMessage = await getOption('upgradeMessage', true);
-
- if (previousVersion === null) {
- openTab({
- url: `${wappalyzer.config.websiteURL}installed`,
- });
- } else if (version !== previousVersion && upgradeMessage) {
- openTab({
- url: `${wappalyzer.config.websiteURL}upgraded?v${version}`,
- background: true,
- });
- }
+ if (count && (count >= 50 || Driver.lastPing < Date.now() - expiry)) {
+ await Driver.post('https://api.wappalyzer.com/ping/v2/', hostnames)
- await setOption('version', version);
+ await setOption('hostnames', (Driver.cache.hostnames = {}))
- // Hostname cache
- wappalyzer.hostnameCache = await getOption('hostnameCache', {});
+ Driver.lastPing = Date.now()
+ }
- // Run content script on all tabs
- try {
- const tabs = await browser.tabs.query({ url: ['http://*/*', 'https://*/*'] });
+ if (Driver.cache.ads.length > 50) {
+ await Driver.post('https://ad.wappalyzer.com/log/wp/', Driver.cache.ads)
- tabs.forEach(async (tab) => {
- try {
- await browser.tabs.executeScript(tab.id, {
- file: '../js/content.js',
- });
- } catch (error) {
- //
+ await setOption('ads', (Driver.cache.ads = []))
}
- });
- } catch (error) {
- wappalyzer.log(error, 'driver', 'error');
+ }
}
-})();
+}
+
+Driver.init()
diff --git a/src/drivers/webextension/js/inject.js b/src/drivers/webextension/js/inject.js
index 3e9a6658fbf1c8e9919b766cefb1a424926a3ac6..8ae4bd77efd609973df111b0f51c402ca06f15c3 100644
--- a/src/drivers/webextension/js/inject.js
+++ b/src/drivers/webextension/js/inject.js
@@ -1,63 +1,50 @@
/* eslint-env browser */
-(() => {
+;(function() {
try {
- const detectJs = (chain) => {
- const properties = chain.split('.');
-
- let value = properties.length ? window : null;
-
- for (let i = 0; i < properties.length; i++) {
- const property = properties[i];
-
- if (value && value.hasOwnProperty(property)) {
- value = value[property];
- } else {
- value = null;
-
- break;
- }
+ const onMessage = ({ data }) => {
+ if (!data.wappalyzer) {
+ return
}
- return typeof value === 'string' || typeof value === 'number' ? value : !!value;
- };
-
- const onMessage = (event) => {
- if (event.data.id !== 'patterns') {
- return;
- }
-
- removeEventListener('message', onMessage);
-
- const patterns = event.data.patterns || {};
-
- const js = {};
-
- for (const appName in patterns) {
- if (patterns.hasOwnProperty(appName)) {
- js[appName] = {};
-
- for (const chain in patterns[appName]) {
- if (patterns[appName].hasOwnProperty(chain)) {
- js[appName][chain] = {};
-
- for (const index in patterns[appName][chain]) {
- const value = detectJs(chain);
-
- if (value && patterns[appName][chain].hasOwnProperty(index)) {
- js[appName][chain][index] = value;
- }
+ const { technologies } = data.wappalyzer || {}
+
+ removeEventListener('message', onMessage)
+
+ postMessage({
+ wappalyzer: {
+ js: technologies.reduce((technologies, { name, chains }) => {
+ chains.forEach((chain) => {
+ const value = chain
+ .split('.')
+ .reduce(
+ (value, method) =>
+ value && value.hasOwnProperty(method)
+ ? value[method]
+ : undefined,
+ window
+ )
+
+ if (value !== undefined) {
+ technologies.push({
+ name,
+ chain,
+ value:
+ typeof value === 'string' || typeof value === 'number'
+ ? value
+ : !!value
+ })
}
- }
- }
- }
- }
+ })
- postMessage({ id: 'js', js }, window.location.href);
- };
+ return technologies
+ }, [])
+ }
+ })
+ }
- addEventListener('message', onMessage);
+ addEventListener('message', onMessage)
} catch (e) {
// Fail quietly
}
-})();
+})()
diff --git a/src/drivers/webextension/js/lib/iframe.js b/src/drivers/webextension/js/lib/iframe.js
index b50e63629fea817af17671d58bd2249be1fe53e8..d36e22baabf4e1a23eacceecfea0543babe1c2a0 100644
--- a/src/drivers/webextension/js/lib/iframe.js
+++ b/src/drivers/webextension/js/lib/iframe.js
@@ -1,1187 +1,1544 @@
-'use strict';
-
-(function(win) {
-
-var exports = {};
+'use strict'
+;(function(win) {
+ var exports = {}
+
+ ;(function(exports) {
+ var utils = {
+ /**
+ * Normalize URL
+ * @param {String} url
+ */
+ normalizeUrl: function(url) {
+ return this.hashUrl(url) || null
+ },
-(function(exports) {
+ /**
+ * Get referrer.
+ */
+ getReferrer: function() {
+ return this.normalizeUrl(document.referrer)
+ },
- var port = browser.runtime.connect({name:"adparser"});
- var utils = {
- normalizeUrl: function(url) {
+ /**
+ * Get current page URL.
+ */
+ getPageUrl: function() {
+ return this.normalizeUrl(window.location.href)
+ },
- return this.hashUrl(url) || null;
+ /**
+ * Generated hashed URL.
+ * @param {String} url
+ */
+ hashUrl: function(url) {
+ var a, result
- },
+ if (!url || url.indexOf('http') !== 0) {
+ return null
+ }
- getReferrer: function() {
- return this.normalizeUrl(document.referrer);
- },
+ a = document.createElement('a')
+ a.href = url
- getPageUrl: function() {
- return this.normalizeUrl(window.location.href);
- },
- hashUrl: function(url) {
- var a,
- result;
+ result = a.protocol + '//' + a.hostname + '/'
- if ( !url || url.indexOf('http') !== 0 ) {
- return null;
- }
+ if (a.pathname && a.pathname !== '/') {
+ result += this.hashCode(a.pathname)
+ }
- a = document.createElement('a');
- a.href = url;
+ if (a.search) {
+ result += '?' + this.hashCode(a.search)
+ }
- result = a.protocol + '//' + a.hostname + '/';
+ if (a.hash) {
+ result += '#' + this.hashCode(a.hash)
+ }
- if ( a.pathname && a.pathname !== '/' ) {
- result += this.hashCode(a.pathname);
- }
+ return result
+ },
- if ( a.search ) {
- result += '?' + this.hashCode(a.search);
- }
+ /**
+ * Generate random hash.
+ * @param {String} str
+ */
+ hashCode: function(str) {
+ var hash = 0,
+ kar,
+ i
+
+ if (str.length === 0) {
+ return hash
+ }
- if ( a.hash ) {
- result += '#' + this.hashCode(a.hash);
- }
+ for (i = 0; i < str.length; i++) {
+ kar = str.charCodeAt(i)
+ hash = (hash << 5) - hash + kar
+ hash = hash & hash
+ }
- return result;
- },
+ return hash + Math.pow(2, 32)
+ },
- hashCode: function(str) {
- var hash = 0,
- kar,
- i;
+ /**
+ * Apply array function to non-array.
+ * @param {Object} a
+ */
+ realArray: function(a) {
+ return Array.prototype.slice.apply(a)
+ },
- if ( str.length === 0 ) {
- return hash;
- }
+ /**
+ * Listener callback for onDocLoaded.
+ * @param {Object} doc
+ * @param {Function} callback
+ */
+ onDocLoaded: function(doc, callback) {
+ if (doc.readyState === 'loading') {
+ doc.addEventListener('DOMContentLoaded', callback)
+ } else {
+ callback()
+ }
+ },
- for ( i = 0; i < str.length; i++ ) {
- kar = str.charCodeAt(i);
- hash = ((hash << 5) - hash) + kar;
- hash = hash & hash;
- }
+ SCRIPT_IN_WINDOW_TOP: window === window.top,
- return hash + Math.pow(2, 32);
- },
+ /**
+ * Check for href Window object.
+ * @param {Object} win
+ */
+ isFriendlyWindow: function(win) {
+ var href
+ try {
+ href = win.location.href
+ } catch (e) {
+ return false
+ }
+ return true
+ },
- realArray: function(a) {
- return Array.prototype.slice.apply(a);
- },
+ /**
+ * Get default view from element.
+ * @param {Object} el
+ */
+ elementWindow: function(el) {
+ return el.ownerDocument.defaultView
+ },
- onDocLoaded: function(doc, callback) {
- if ( doc.readyState === 'loading' ) {
- doc.addEventListener('DOMContentLoaded', callback);
- } else {
- callback();
- }
- },
+ /**
+ * Get viewport size.
+ * @param {Object} win
+ */
+ viewport: function(win) {
+ return { width: win.innerWidth, height: win.innerHeight }
+ },
- SCRIPT_IN_WINDOW_TOP: window === window.top,
+ /**
+ * Parse query string parameters.
+ * @param {String} qs
+ */
+ 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
+ },
- isFriendlyWindow: function(win) {
+ /**
+ * Send PostMessage response.
+ * @param {Object} message
+ * @param {String} event
+ * @param {String} responseMessage
+ */
+ sendToBackground: function(message, event, responseMessage) {
+ chrome.runtime.sendMessage(message, (message) => {
+ if (message && typeof message.tracking_enabled !== 'undefined') {
+ if (message.tracking_enabled) {
+ utilCallback()
+ } else {
+ utilElseCallback()
+ }
+ }
+ })
+ },
- var href;
- try {
- href = win.location.href;
- } catch(e) {
- return false;
+ /**
+ * Check if anonymous tracking is enabled.
+ * @param {Function} callback
+ * @param {Function} elseCallback
+ * @todo validate if utilCallback or utilElseCallback are being used.
+ */
+ askIfTrackingEnabled: function(callback, elseCallback) {
+ utilCallback = callback
+ utilElseCallback = elseCallback
+
+ this.sendToBackground(
+ 'is_tracking_enabled',
+ '',
+ 'tracking_enabled_response'
+ )
}
- 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];
+ 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
+
+ /**
+ * Generate new Logging object.
+ */
+ 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()
}
- 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;
+ LogGenerator.prototype = {
+ /**
+ * Log data.
+ * @param {String} event
+ * @param {Array} opt_assets
+ * @param {Array} opt_pageTags
+ */
+ 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: '15a9f21-d',
+ msgNum: this.msgNum,
+ timestamp: new Date().getTime(),
+ pageVis: document.visibilityState,
+ pageFoc: document.hasFocus(),
+ pageTags: opt_pageTags || []
+ }
+ this.msgNum++
+ return result
}
- return dict;
- },
- sendToBackground: function(message, event, responseMessage) {
- if ( typeof browser !== 'undefined' || typeof chrome !== 'undefined' ) {
- port.postMessage(message);
- } else if ( window.self.port ) {
- window.self.port.on(responseMessage, onResponse);
- window.self.port.emit(event, message);
- }
- },
-
- askIfTrackingEnabled: function(callback, elseCallback) {
- utilCallback = callback;
- utilElseCallback = elseCallback;
-
- this.sendToBackground(
- 'is_tracking_enabled',
- '',
- 'tracking_enabled_response'
- );
-
}
- };
- port.onMessage.addListener((message) => {
- if ( message && message.tracking_enabled ) {
+ utils.LogGenerator = LogGenerator
+
+ let utilCallback, utilElseCallback
+
+ 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,
+
+ /**
+ * Get ad size.
+ * @param {Int} width
+ * @param {Int} height
+ */
+ getMatchedAdSize: function(width, height) {
+ if (!this.set) {
+ this.set = this._makeSizeSet()
+ }
- utilCallback();
- } else {
+ return this.set[Math.round(width) + 'x' + Math.round(height)]
+ },
- utilElseCallback();
- }
- });
-
- 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()
- };
- }
+ /**
+ * Check element size.
+ * @param {HTMLElement} el
+ */
+ elementIsAdShaped: function(el) {
+ return !!this.getMatchedAdSizeForElement(el)
+ },
- 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: '15a9f21-d',
- msgNum: this.msgNum,
- timestamp: new Date().getTime(),
- pageVis: document.visibilityState,
- pageFoc: document.hasFocus(),
- pageTags: opt_pageTags || []
- };
- this.msgNum++;
- return result;
- }
- };
-
- utils.LogGenerator = LogGenerator;
-
- let utilCallback, utilElseCallback;
-
- 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();
- }
+ /**
+ * Get ad size.
+ * @param {HTMLElement} el
+ * @todo better description
+ */
+ getMatchedAdSizeForElement: function(el) {
+ var rect = el.getBoundingClientRect()
+ return this.getMatchedAdSize(rect.width, rect.height)
+ },
- 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;
+ /**
+ * Generate ad sizes.
+ */
+ _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
}
- return set;
}
- };
- var Throttler = {
- MAX_SEARCHES_PER_WINDOW: 10,
- MAX_SEARCHES_PER_ELEMENT: 2,
+ var Throttler = {
+ MAX_SEARCHES_PER_WINDOW: 10,
+ MAX_SEARCHES_PER_ELEMENT: 2,
+
+ /**
+ * Count number of elements.
+ * @param {HTMLElement} el
+ */
+ countSearch: (el) => {
+ if (typeof el.searches !== 'number') {
+ el.searches = 0
+ }
- countSearch: function(el) {
- if ( typeof el.searches !== 'number' ) {
- el.searches = 0;
- }
+ el.searches += 1
+ },
- el.searches += 1;
- },
+ /**
+ *
+ * @param {*} el
+ * @param {*} max
+ *
+ * @todo add description
+ */
+ throttle: function(el, max) {
+ if (typeof el.searches === 'number' && el.searches >= max) {
+ return true
+ }
+ return false
+ },
- throttle: function(el, max) {
- if ( typeof el.searches === 'number' && el.searches >= max ) {
- return true;
- }
- return false;
- },
+ /**
+ *
+ * @param {*} el
+ *
+ * @todo add description
+ */
+ throttleElement: function(el) {
+ return this.throttle(el, this.MAX_SEARCHES_PER_ELEMENT)
+ },
- throttleElement: function(el) {
- return this.throttle(el, this.MAX_SEARCHES_PER_ELEMENT);
- },
+ /**
+ *
+ * @param {*} win
+ *
+ * @todo add description
+ */
+ throttleWin: function(win) {
+ return this.throttle(win, this.MAX_SEARCHES_PER_WINDOW)
+ },
- throttleWin: function(win) {
- return this.throttle(win, this.MAX_SEARCHES_PER_WINDOW);
- },
+ /**
+ *
+ * @param {*} el
+ *
+ * @todo add description
+ */
+ getCount: function(el) {
+ return el.searches || 0
+ }
+ }
- getCount: function(el) {
- return el.searches || 0;
+ /**
+ * Initialize window and document elements.
+ * @param {*} win
+ */
+ function TopSearcher(win) {
+ this.win = win
+ this.doc = win.document
}
- };
- function TopSearcher(win) {
- this.win = win;
- this.doc = win.document;
- }
+ /**
+ * Add search function.
+ */
+ 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.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;
+ /**
+ * @todo add description
+ */
+ 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
}
}
- return false;
- }));
-
- html5Ad = this._mainGetHTMLAd();
- if ( html5Ad ) {
- html5Ad.html5 = true;
- html5Ad.mpAdFound = true;
- ads.push(html5Ad);
}
- return ads;
- };
+ /**
+ * @todo add description
+ */
+ 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
+ }
- 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;
+ /**
+ *
+ * @param {*} win
+ *
+ * @todo add description
+ */
+ 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
+ }
}
}
- };
-
- 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;
+
+ /**
+ * @todo add description
+ */
+ 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
}
- }
+ /**
+ * @todo add description
+ */
+ 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
+ })
- IframeSearcher.prototype.search = function() {
- var ad;
+ if (stdEl) {
+ return stdEl
+ }
- if ( this.shouldSearchWindow ) {
- ad = this._search();
- if ( ad ) {
- ad.mpAdFound = true;
- win.mpAdFound = true;
- return ad;
+ 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
+ })
}
- 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;
+ if (html5El) {
+ html5El.html5 = true
+ html5El.winClickTag = this.winClickTag
+ html5El.adSizeMeta = this.adSizeMeta
+ return html5El
}
- Throttler.countSearch(el);
- return false;
- });
- if ( stdEl ) {
- return stdEl;
+ return null
}
- 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;
- });
- }
+ /**
+ * @todo add description
+ */
+ IframeSearcher.prototype._isHTML5Iframe = function() {
+ if (this.winClickTag || this.adSizeMeta) {
+ return true
+ }
- if ( html5El ) {
- html5El.html5 = true;
- html5El.winClickTag = this.winClickTag;
- html5El.adSizeMeta = this.adSizeMeta;
- return html5El;
- }
+ if (
+ this.doc.querySelectorAll('canvas', 'button', 'video', 'svg').length > 0
+ ) {
+ return true
+ }
- return null;
- };
+ if (
+ this.numElementsInBody >= 5 &&
+ Throttler.getCount(this.win) > 0 &&
+ this.doc.querySelectorAll('div').length > 0
+ ) {
+ return true
+ }
- IframeSearcher.prototype._isHTML5Iframe = function() {
- if ( this.winClickTag || this.adSizeMeta ) {
- return true;
+ return false
}
- if ( this.doc.querySelectorAll('canvas', 'button', 'video', 'svg').length > 0 ) {
- return true;
- }
+ /**
+ * @todo add description
+ */
+ IframeSearcher.prototype._elementIsAtLeastAsBigAsWindow = function(el) {
+ var rect = el.getBoundingClientRect(),
+ tol = 0.95
- if ( this.numElementsInBody >= 5 && Throttler.getCount(this.win) > 0 && this.doc.querySelectorAll('div').length > 0 ) {
- return true;
+ return (
+ rect.width >= tol * this.winWidth && rect.height >= tol * this.winHeight
+ )
}
- 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;
- };
+ /**
+ * @todo add description
+ */
+ 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;
+ /**
+ * @todo add description
+ */
+ 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
}
- 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;
+
+ /**
+ * @todo add description
+ */
+ IframeSearcher.prototype._getAdSizeMeta = function() {
+ var adSizeMeta = this.doc.querySelectorAll('meta[name="ad.size"]')
+ if (adSizeMeta.length > 0) {
+ return adSizeMeta[0].content
+ } else {
+ return null
}
}
- 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);
+ /**
+ *
+ * @param {*} arr
+ * @param {*} testFn
+ *
+ * @todo add description
+ */
+ function getFirst(arr, testFn) {
+ var i, el
+ for (i = 0; i < arr.length; i++) {
+ el = arr[i]
+ if (testFn(el)) {
+ return el
+ }
}
+ return null
}
- iframes = getFriendlyIframes(win);
- for ( i = 0; i < iframes.length; i++ ) {
- ads = ads.concat(findAds(iframes[i].contentWindow));
+ /**
+ * Check for image attributes.
+ * @param {HTMLElement} img
+ */
+ function isStandardImage(img) {
+ return (
+ img.src &&
+ (img.parentNode.tagName === 'A' || img.getAttribute('onclick'))
+ )
}
- 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;
- }
+ /**
+ * Extract iFrames from page.
+ * @param {Object} win
+ */
+ 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
+ }
- if ( url && url.indexOf('http') === 0 ) {
- return url;
+ /**
+ *
+ * @param {*} win
+ */
+ function findAds(win) {
+ var i,
+ iframes,
+ searcher,
+ ad,
+ ads = []
+
+ if (win === win.top) {
+ searcher = new TopSearcher(win)
+ ads = ads.concat(searcher.search())
} else {
- return null;
+ searcher = new IframeSearcher(win)
+ ad = searcher.search()
+ if (ad) {
+ ads.push(ad)
+ }
}
- },
- getParams: function(el) {
- if ( el.tagName !== 'OBJECT' ) {
- return null;
+ iframes = getFriendlyIframes(win)
+ for (i = 0; i < iframes.length; i++) {
+ ads = ads.concat(findAds(iframes[i].contentWindow))
}
- 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 ) {
+ return ads
+ }
- params[child.name.toLowerCase()] = child.value;
+ 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,
+
+ /**
+ *
+ * @param {*} el
+ * @param {*} params
+ *
+ * @todo add description
+ */
+ 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
}
- }
- 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;
- },
+ if (url && url.indexOf('http') === 0) {
+ return url
+ } else {
+ return 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) ) {
+ /**
+ *
+ * @param {*} el
+ *
+ * @todo add description
+ */
+ getParams: function(el) {
+ if (el.tagName !== 'OBJECT') {
+ return null
+ }
- if ( key.toLowerCase().indexOf('clicktag') === 0 ) {
- return flashvars[key];
- }
+ 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 null;
- },
-
- getAttr: function(el, name) {
- var val = el.getAttribute(name);
-
- if ( val && val.slice && val.toString ) {
+ return params
+ },
- return val.slice(0, this.MAX_ATTR_LEN).toString();
- } else {
- return null;
- }
- },
+ /**
+ * Get element position.
+ * @param {HTMLElement} el
+ */
+ 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)
+ }
+ },
- 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;
- }
+ /**
+ *
+ * @param {*} el
+ * @param {*} params
+ * @param {*} url
+ *
+ * @todo add description
+ */
+ 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
+ }
- this.putAttrIfExists(json, el, 'id');
- this.putAttrIfExists(json, el, 'class');
- this.putAttrIfExists(json, el, 'name');
+ return (flashvars && exports.utils.parseQS(flashvars)) || null
+ },
- this.putPropIfExists(json, 'flashvars', flashvars);
- this.putPropIfExists(json, 'url', url);
- this.putPropIfExists(json, 'params', params);
- this.putPropIfExists(json, 'clickThru', clickThru);
+ /**
+ *
+ * @param {*} el
+ * @param {*} flashvars
+ *
+ * @todo add description
+ */
+ 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
+ },
- return json;
- }
- };
+ /**
+ * Get element attribute.
+ * @param {HTMLElement} el
+ * @param {String} name
+ */
+ getAttr: function(el, name) {
+ var val = el.getAttribute(name)
- exports.parser = { elementToJSON: parser.elementToJSON.bind(parser) };
-})(exports);
+ if (val && val.slice && val.toString) {
+ return val.slice(0, this.MAX_ATTR_LEN).toString()
+ } else {
+ return null
+ }
+ },
-(function(exports) {
+ /**
+ *
+ * @param {*} obj
+ * @param {*} name
+ * @param {*} val
+ *
+ * @todo add description
+ */
+ putPropIfExists: function(obj, name, val) {
+ if (val) {
+ obj[name] = val
+ }
+ },
- var ContextManager = function(adData) {
- this.adData = adData;
- };
+ /**
+ *
+ * @param {*} obj
+ * @param {*} el
+ * @param {*} name
+ *
+ * @todo add description
+ */
+ putAttrIfExists: function(obj, el, name) {
+ var val = this.getAttr(el, name)
+ this.putPropIfExists(obj, name, val)
+ },
- ContextManager.prototype = {
- CONTAINER_SIZE_TOL: 0.4,
- ASPECT_RATIO_FOR_LEADERBOARDS: 2,
+ /**
+ * Convert Element to JSON
+ * @param {HTMLElement} el
+ * @param {Boolean} opt_findClickThru
+ */
+ 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: []
+ }
- isValidContainer: function(el, opt_curWin) {
+ if (params) {
+ delete params.flashvars
+ }
- var cWidth = el.clientWidth;
- var cHeight = el.clientHeight;
+ this.putAttrIfExists(json, el, 'id')
+ this.putAttrIfExists(json, el, 'class')
+ this.putAttrIfExists(json, el, 'name')
- var adWidth = this.adData.width;
- var adHeight = this.adData.height;
+ this.putPropIfExists(json, 'flashvars', flashvars)
+ this.putPropIfExists(json, 'url', url)
+ this.putPropIfExists(json, 'params', params)
+ this.putPropIfExists(json, 'clickThru', clickThru)
- 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);
+ return json
+ }
+ }
- var similarSizeX = this.withinTol(adWidth, cWidth);
- var similarSizeY = this.withinTol(adHeight, cHeight);
- var adAspect = adWidth / adHeight;
+ exports.parser = { elementToJSON: parser.elementToJSON.bind(parser) }
+ })(exports)
+
+ // Anonymous invocation.
+ ;(function(exports) {
+ /**
+ * Setter for ad data.
+ * @param {*} adData
+ */
+ var ContextManager = function(adData) {
+ this.adData = adData
+ }
- return similarWin || el.tagName === 'A' || (adAspect >= this.ASPECT_RATIO_FOR_LEADERBOARDS && similarSizeY) || (similarSizeX && similarSizeY);
- },
+ ContextManager.prototype = {
+ CONTAINER_SIZE_TOL: 0.4,
+ ASPECT_RATIO_FOR_LEADERBOARDS: 2,
+
+ /**
+ * Check if iframe is valid.
+ * @param {HTMLElement} el
+ * @param {HTMLElement} opt_curWin
+ */
+ 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;
+ /**
+ * Check tolerance.
+ * @param {Int} adlen
+ * @param {Int} conlen
+ */
+ withinTol: function(adlen, conlen) {
+ var pct = (conlen - adlen) / adlen
- return pct <= this.CONTAINER_SIZE_TOL;
- },
+ return pct <= this.CONTAINER_SIZE_TOL
+ },
- serializeElements: function(el) {
- if ( !el ) {
- return;
- }
- var i;
- var ifrWin;
- var adId = this.adData.adId;
- var elIsAd = false;
+ /**
+ * Serialize elements.
+ * @param {*} el
+ * @todo define parameter type.
+ */
+ 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;
- }
+ if (adId && el[adId] && el[adId].isAd === true) {
+ elIsAd = true
+ }
- var json = exports.parser.elementToJSON(el, elIsAd);
- var childJSON;
+ var json = exports.parser.elementToJSON(el, elIsAd)
+ var childJSON
- if ( elIsAd ) {
- json.adId = adId;
- this.adData.element = {};
+ 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 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);
+ 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 (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;
+ if (
+ json.children.length > 0 ||
+ json.adId ||
+ json.tagName === 'IFRAME' ||
+ json.url
+ ) {
+ return json
} else {
- return curContainer;
+ return null
}
- }
- }
- };
-
- 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 {
+ /**
+ * Get element containers.
+ * @param {*} containerEl
+ */
+ captureHTML: function(containerEl) {
+ this.adData.context = this.serializeElements(containerEl)
+ },
- curWin.mpAdFound = true;
+ /**
+ * Get number of Nodes.
+ * @param {HTMLElement} el
+ */
+ nodeCount: function(el) {
+ return el.getElementsByTagName('*').length + 1
+ },
- mgr.adData.serializedIframeContents = mgr.adData.context;
+ /**
+ *
+ * @param {*} curWin
+ * @param {*} referenceElement
+ *
+ * @todo add description
+ */
+ highestContainer: function(curWin, referenceElement) {
+ var curContainer = referenceElement
+ var docEl = curWin.document.documentElement
+ var parentContainer
+
+ if (curWin !== curWin.top && this.isValidContainer(docEl, curWin)) {
+ return docEl
+ }
- if ( exports.utils.isFriendlyWindow(curWin.parent) ) {
- referenceElement = curWin.frameElement;
- referenceElement[mgr.adData.adId] = {needsWindow: true};
- curWin = curWin.parent;
+ while (true) {
+ parentContainer = curContainer.parentElement
+ if (parentContainer && this.isValidContainer(parentContainer)) {
+ curContainer = parentContainer
} else {
- break;
+ return curContainer
}
}
}
- 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 = '1554456894-8541-12665-19466-15909';
- 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 ) {
+ var tagfinder = {
+ /**
+ *
+ * @param {*} adData
+ * @param {*} opt_el
+ * @param {*} opt_winPos
+ *
+ * @todo add description
+ */
+ 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 ( AD_SERVER_RE.exec(results.referenceElement.id) ) {
- adData.matchedSize = [adData.width, adData.height];
- adData.oddSize = true;
- } else {
+ if (el.contents) {
+ ifrPos = { left: el.left, top: el.top }
+ this.setPositions(adData, el.contents, ifrPos)
+ }
- return;
+ if (el.adId === adData.adId) {
+ adData.element.left = el.left
+ adData.element.top = el.top
}
- }
- delete adData.width;
- delete adData.height;
- adData.curPageUrl = exports.utils.getPageUrl();
- _pageTags = _pageTags || getPageTags(document);
- var log = _logGen.log('ad', [adData], _pageTags);
+ },
- if ( _onAdFound ) {
+ /**
+ *
+ * @param {*} adData
+ * @param {*} referenceElement
+ *
+ * @todo add description
+ */
+ appendTags: (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
- _onAdFound(log, results.referenceElement);
+ 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
+ }
}
}
- }
- function extractAdsWrapper() {
- if ( exports.utils.SCRIPT_IN_WINDOW_TOP || document.readyState === 'complete' ) {
- extractAds();
+ 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 = '1554456894-8541-12665-19466-15909'
+ var AD_SERVER_RE = new RegExp('^(google_ads_iframe|oas_frame|atwAdFrame)')
+
+ /**
+ * Get script tags from document.
+ * @param {Object} doc
+ */
+ 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
}
- 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);
+ /**
+ * Send message to parent iFrames.
+ * @param {String} adData
+ */
+ function messageAllParentFrames(adData) {
+ adData.postMessageId = POST_MSG_ID
- var adData = {
- width: Math.round(ad.offsetWidth),
- height: Math.round(ad.offsetHeight),
- startTime: startTime,
- adId: adId,
- html5: ad.html5 || false
- };
+ adData = JSON.stringify(adData)
- if ( ad.html5 ) {
- adData.adSizeMeta = ad.adSizeMeta || null;
- adData.winClickTag = ad.winClickTag || null;
+ var win = window
+ while (win !== win.top) {
+ win = win.parent
+ win.postMessage(adData, '*')
}
-
- 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;
+ /**
+ *
+ * @param {String} adData
+ * @param {HTMLElement} referenceElement
+ *
+ * @todo update description
+ */
+ 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)
+ }
}
}
- for ( i = 0; i < iframes.length; i++ ) {
- ifrWin = iframes[i].contentWindow;
- if ( exports.utils.isFriendlyWindow(ifrWin) ) {
- ifr = iframeFromWindow(ifrWin, winToMatch);
- if ( ifr ) {
- return ifr;
- }
+ /**
+ * SetTimeout wrapper for extracting ads.
+ */
+ function extractAdsWrapper() {
+ if (
+ exports.utils.SCRIPT_IN_WINDOW_TOP ||
+ document.readyState === 'complete'
+ ) {
+ extractAds()
}
+ setTimeout(function() {
+ extractAdsWrapper()
+ }, INIT_MS_BW_SEARCHES)
}
- }
- function onPostMessage(event) {
- var adData,
- ifrWin = event.source,
+ /**
+ * Main function for extracting ads after loaded.
+ */
+ 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
+ }
- myWin = window.document.defaultView,
- ifrTag;
+ if (ad.html5) {
+ adData.adSizeMeta = ad.adSizeMeta || null
+ adData.winClickTag = ad.winClickTag || null
+ }
- if ( typeof event.data === "string" && event.data.indexOf(POST_MSG_ID) != -1 ) {
- try {
+ ad[adId] = { isAd: true }
- adData = JSON.parse(event.data);
- } catch (e) {
+ appendTagsAndSendToParent(adData, ad)
+ })
+ }
- return;
+ /**
+ * Check if window is child of parent.
+ * @param {Object} myWin
+ * @param {Object} otherWin
+ */
+ function isChildWin(myWin, otherWin) {
+ var parentWin = otherWin.parent
+ while (parentWin !== otherWin) {
+ if (parentWin === myWin) {
+ return true
+ }
+ otherWin = parentWin
+ parentWin = parentWin.parent
}
+ return false
}
- else
- 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);
+ /**
+ *
+ * @param {*} win
+ * @param {*} winToMatch
+ *
+ * @todo update description
+ */
+ 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
}
+ }
- if ( ifrTag ) {
- ifrTag[adData.adId] = {needsWindow: true};
- appendTagsAndSendToParent(adData, ifrTag);
+ 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 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);
- }
+ /**
+ *
+ * @param {*} event
+ *
+ * @todo update description
+ */
+ function onPostMessage(event) {
+ var adData,
+ ifrWin = event.source,
+ myWin = window.document.defaultView,
+ ifrTag
+
+ if (
+ typeof event.data === 'string' &&
+ event.data.indexOf(POST_MSG_ID) != -1
+ ) {
+ try {
+ adData = JSON.parse(event.data)
+ } catch (e) {
+ return
+ }
+ } else return
- msg.assets.forEach(function(a) {delete a.isVideo;});
- log.displayAdFound = msg.displayAdFound;
- log.requests = msg.requests;
- log.data = msg.event_data;
+ if (adData.postMessageId === POST_MSG_ID) {
+ delete adData.postMessageId
- log.doc.finalPageUrl = log.doc.url;
- log.doc.url = exports.utils.normalizeUrl(msg.origUrl);
+ event.stopImmediatePropagation()
- _onAdFound(log);
- }
+ if (isChildWin(myWin, ifrWin)) {
+ if (exports.utils.isFriendlyWindow(ifrWin)) {
+ ifrTag = ifrWin.frameElement
+ } else {
+ ifrTag = iframeFromWindow(myWin, ifrWin)
+ }
- function addBackgroundListener(event, callback) {
- if ( typeof browser !== 'undefined' || typeof chrome !== 'undefined' ) {
- browser.runtime.onMessage.addListener(function(msg) {
- if ( msg.event === event ) {
- callback(msg);
+ if (ifrTag) {
+ ifrTag[adData.adId] = { needsWindow: true }
+ appendTagsAndSendToParent(adData, ifrTag)
+ }
}
- });
- }
- 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);
+ /**
+ *
+ * @param {*} msg
+ * @param {*} sender
+ * @param {*} callback
+ *
+ * @todo update description
+ */
+ 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)
}
- },
- blockedRobotsMsgGen: function(sendFcn, origUrl) {
+ msg.assets.forEach(function(a) {
+ delete a.isVideo
+ })
+ log.displayAdFound = msg.displayAdFound
+ log.requests = msg.requests
+ log.data = msg.event_data
- if ( origUrl.indexOf('google.com/_/chrome/newtab') === -1 ) {
- var onBlockedRobotsMessage = function() {
- var log;
- log = _logGen.log('invalid-robotstxt', []);
- log.doc.finalPageUrl = log.doc.url;
- log.doc.url = exports.utils.normalizeUrl(origUrl);
+ log.doc.finalPageUrl = log.doc.url
+ log.doc.url = exports.utils.normalizeUrl(msg.origUrl)
- sendFcn(log);
- };
- return onBlockedRobotsMessage;
- } else {
- return function() {};
- }
- },
+ _onAdFound(log)
+ }
- init: function(onAdFound) {
+ /**
+ * Add background listener.
+ * @param {String} event
+ * @param {Function} callback
+ */
+ function addBackgroundListener(event, callback) {
+ chrome.runtime.onMessage.addListener(function(msg) {
+ if (msg.event === event) {
+ callback(msg)
+ }
+ })
+ }
- if ( exports.utils.SCRIPT_IN_FRIENDLY_IFRAME ) {
- return false;
- }
+ exports.coordinator = {
+ /**
+ * @todo update description
+ */
+ addPostMessageListener: function() {
+ if (!exports.utils.SCRIPT_IN_FRIENDLY_IFRAME) {
+ window.addEventListener('message', onPostMessage, false)
+ }
+ },
- _onAdFound = onAdFound;
- if ( exports.utils.SCRIPT_IN_WINDOW_TOP ) {
- var log = _logGen.log('page');
- onAdFound(log);
+ /**
+ *
+ * @param {*} sendFcn
+ * @param {*} origUrl
+ *
+ * @todo update description
+ */
+ blockedRobotsMsgGen: function(sendFcn, origUrl) {
+ if (origUrl.indexOf('google.com/_/chrome/newtab') === -1) {
+ var onBlockedRobotsMessage = function() {
+ var log
+ log = _logGen.log('invalid-robotstxt', [])
+ log.doc.finalPageUrl = log.doc.url
+ log.doc.url = exports.utils.normalizeUrl(origUrl)
+
+ sendFcn(log)
+ }
+ return onBlockedRobotsMessage
+ } else {
+ return function() {}
+ }
+ },
- window.addEventListener('beforeunload', function(event) {
- var log = _logGen.log('unload');
- log.timing = window.performance.timing;
- onAdFound(log);
- });
+ /**
+ *
+ * @param {*} onAdFound
+ */
+ init: function(onAdFound) {
+ if (exports.utils.SCRIPT_IN_FRIENDLY_IFRAME) {
+ return false
+ }
- addBackgroundListener('new-video-ad', onVideoMessage);
- addBackgroundListener('new-invalid-video-ad', onVideoMessage);
+ _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)
+ })
- exports.utils.onDocLoaded(document, extractAdsWrapper);
- }
- };
-
-})(exports);
-
-if ( exports.utils.SCRIPT_IN_WINDOW_TOP ) {
- window.adparser = {
- init: exports.coordinator.init,
- addPostMessageListener: exports.coordinator.addPostMessageListener,
- askIfTrackingEnabled: exports.utils.askIfTrackingEnabled,
- blockedRobotsMsgGen: exports.coordinator.blockedRobotsMsgGen,
- inWindowTop: exports.utils.SCRIPT_IN_WINDOW_TOP,
- sendToBackground: exports.utils.sendToBackground
- };
-} else {
- exports.coordinator.addPostMessageListener();
- exports.utils.askIfTrackingEnabled(
- function() {
- exports.coordinator.init(function() {});
- },
- function() {}
- );
-}
-})(window);
-(function(adparser, pageUrl) {
- function onAdFound(log) {
- adparser.sendToBackground({ id: 'ad_log', subject: log }, 'ad_log', '', function(){});
- }
+ addBackgroundListener('new-video-ad', onVideoMessage)
+ addBackgroundListener('new-invalid-video-ad', onVideoMessage)
+ }
- if ( adparser && adparser.inWindowTop ) {
- adparser.addPostMessageListener();
- adparser.askIfTrackingEnabled(
+ exports.utils.onDocLoaded(document, extractAdsWrapper)
+ }
+ }
+ })(exports)
+
+ if (exports.utils.SCRIPT_IN_WINDOW_TOP) {
+ window.adparser = {
+ init: exports.coordinator.init,
+ addPostMessageListener: exports.coordinator.addPostMessageListener,
+ askIfTrackingEnabled: exports.utils.askIfTrackingEnabled,
+ blockedRobotsMsgGen: exports.coordinator.blockedRobotsMsgGen,
+ inWindowTop: exports.utils.SCRIPT_IN_WINDOW_TOP,
+ sendToBackground: exports.utils.sendToBackground
+ }
+ } else {
+ exports.coordinator.addPostMessageListener()
+ exports.utils.askIfTrackingEnabled(
function() {
- adparser.init(onAdFound);
+ exports.coordinator.init(function() {})
},
- adparser.blockedRobotsMsgGen(onAdFound, pageUrl)
+ function() {}
+ )
+ }
+})(window)
+;(function(adparser, pageUrl) {
+ function onAdFound(log) {
+ adparser.sendToBackground(
+ { source: 'iframe.js', func: 'onAd', args: [log] },
+ 'onAd',
+ '',
+ function() {}
)
}
-})(window.adparser, window.location.href);
+
+ if (adparser && adparser.inWindowTop) {
+ adparser.addPostMessageListener()
+ adparser.askIfTrackingEnabled(function() {
+ adparser.init(onAdFound)
+ }, adparser.blockedRobotsMsgGen(onAdFound, pageUrl))
+ }
+})(window.adparser, window.location.href)
diff --git a/src/drivers/webextension/js/lib/jsontodom.js b/src/drivers/webextension/js/lib/jsontodom.js
deleted file mode 100644
index 24d9e4c29e6c9545e146517cc6bd3c28a0e36e56..0000000000000000000000000000000000000000
--- a/src/drivers/webextension/js/lib/jsontodom.js
+++ /dev/null
@@ -1,63 +0,0 @@
-jsonToDOM.namespaces = {
- html: 'http://www.w3.org/1999/xhtml',
- xul: 'http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul',
-};
-
-jsonToDOM.defaultNamespace = jsonToDOM.namespaces.html;
-
-function jsonToDOM(jsonTemplate, doc, nodes) {
- function namespace(name) {
- const reElemNameParts = /^(?:(.*):)?(.*)$/.exec(name);
- return { namespace: jsonToDOM.namespaces[reElemNameParts[1]], shortName: reElemNameParts[2] };
- }
-
- // Note that 'elemNameOrArray' is: either the full element name (eg. [html:]div) or an array of elements in JSON notation
- function tag(elemNameOrArray, elemAttr) {
- // Array of elements? Parse each one...
- if (Array.isArray(elemNameOrArray)) {
- const frag = doc.createDocumentFragment();
- Array.prototype.forEach.call(arguments, (thisElem) => {
- frag.appendChild(tag(...thisElem));
- });
- return frag;
- }
-
- // Single element? Parse element namespace prefix (if none exists, default to defaultNamespace), and create element
- const elemNs = namespace(elemNameOrArray);
- const elem = doc.createElementNS(elemNs.namespace || jsonToDOM.defaultNamespace, elemNs.shortName);
-
- // Set element's attributes and/or callback functions (eg. onclick)
- for (const key in elemAttr) {
- const val = elemAttr[key];
- if (nodes && key == 'key') {
- nodes[val] = elem;
- continue;
- }
-
- const attrNs = namespace(key);
- if (typeof val === 'function') {
- // Special case for function attributes; don't just add them as 'on...' attributes, but as events, using addEventListener
- elem.addEventListener(key.replace(/^on/, ''), val, false);
- } else {
- // Note that the default namespace for XML attributes is, and should be, blank (ie. they're not in any namespace)
- elem.setAttributeNS(attrNs.namespace || '', attrNs.shortName, val);
- }
- }
-
- // Create and append this element's children
- const childElems = Array.prototype.slice.call(arguments, 2);
- childElems.forEach((childElem) => {
- if (childElem != null) {
- elem.appendChild(
- childElem instanceof doc.defaultView.Node ? childElem
- : Array.isArray(childElem) ? tag(...childElem)
- : doc.createTextNode(childElem),
- );
- }
- });
-
- return elem;
- }
-
- return tag(...jsonTemplate);
-}
diff --git a/src/drivers/webextension/js/lib/network.js b/src/drivers/webextension/js/lib/network.js
index 7c46fcf9f451f003c3388c88621a5296bec09ae6..3e0c8d46ad6cfd633782606cea25c13943e780ee 100644
--- a/src/drivers/webextension/js/lib/network.js
+++ b/src/drivers/webextension/js/lib/network.js
@@ -1,19 +1,6 @@
-(function(){function r(e,n,t){function o(i,f){if(!n[i]){if(!e[i]){var c="function"==typeof require&&require;if(!f&&c)return c(i,!0);if(u)return u(i,!0);var a=new Error("Cannot find module '"+i+"'");throw a.code="MODULE_NOT_FOUND",a}var p=n[i]={exports:{}};e[i][0].call(p.exports,function(r){var n=e[i][1][r];return o(n||r)},p,p.exports,r,e,n,t)}return n[i].exports}for(var u="function"==typeof require&&require,i=0;i
= MIN_FF_MAJOR_VERSION) {
- callback();
- } else {
- elseCallback();
- }
- });
- } catch (err) {
-
- elseCallback();
- }
- } else {
- elseCallback();
- }
+ chrome.webNavigation.getFrame(getFrameDetails, callback);
}
function ifTrackingEnabled(details, ifCallback, elseCallback) {
@@ -112,24 +72,19 @@
allowedByRobotsTxt(details, ifCallback, elseCallback);
};
- browser.storage.local.get('tracking').then(function(item) {
-
- if ( item.hasOwnProperty('tracking') ) {
- if ( item.tracking ) {
- fullIfCallback();
- } else {
- elseCallback();
- }
- } else {
- fullIfCallback();
- }
+ Utils.getOption('tracking', true).then(function(tracking) {
+ if ( tracking ) {
+ fullIfCallback();
+ } else {
+ elseCallback();
+ }
});
}
function allowedByRobotsTxt(details, ifCallback, elseCallback) {
if ( details.url && !details.url.startsWith('chrome://') ) {
- robotsTxtAllows(details.url).then(ifCallback, elseCallback);
+ Driver.checkRobots(details.url, details.url.startsWith('https:')).then(ifCallback).catch(elseCallback);
} else {
elseCallback();
}
@@ -268,7 +223,7 @@
PageNetworkTrafficCollector.prototype.sendLogMessageToTabConsole = function() {
var logMessage = Array.from(arguments).join(' ');
var message = {message: logMessage, event: 'console-log-message'};
- browser.tabs.sendMessage(this.tabId, message);
+ chrome.tabs.sendMessage(this.tabId, message);
};
PageNetworkTrafficCollector.prototype.sendToTab = function(assetReq, reqs, curPageUrl, adTrackingEvent) {
@@ -298,7 +253,7 @@
msg.origUrl = curPageUrl;
msg.displayAdFound = this.displayAdFound;
- browser.tabs.sendMessage(this.tabId, msg);
+ chrome.tabs.sendMessage(this.tabId, msg);
};
PageNetworkTrafficCollector.prototype.getRedirKey = function(url, frameId) {
@@ -615,7 +570,7 @@
var _this = this,
origPageUrl, msgAssetReq;
msgAssetReq = this.msgsBeingSent[msgKey];
- browser.tabs.get(this.tabId).then(function(tab) {
+ chrome.tabs.get(this.tabId, function(tab) {
origPageUrl = tab.url;
});
@@ -697,126 +652,96 @@
function registerListeners() {
- browser.webRequest.onBeforeRequest.addListener(
+ chrome.webRequest.onBeforeRequest.addListener(
onBeforeRequestListener,
{urls: ['http://*/*', 'https://*/*']},
[]
);
- browser.webRequest.onSendHeaders.addListener(
+ chrome.webRequest.onSendHeaders.addListener(
onSendHeadersListener,
{urls: ['http://*/*', 'https://*/*']},
['requestHeaders']
);
- browser.webRequest.onHeadersReceived.addListener(
+ chrome.webRequest.onHeadersReceived.addListener(
onHeadersReceivedListener,
{urls: ['http://*/*', 'https://*/*']},
['responseHeaders']
);
- browser.webRequest.onBeforeRedirect.addListener(
+ chrome.webRequest.onBeforeRedirect.addListener(
onBeforeRedirectListener,
{urls: ['http://*/*', 'https://*/*']},
[]
);
- browser.webRequest.onResponseStarted.addListener(
+ chrome.webRequest.onResponseStarted.addListener(
onResponseStartedListener,
{urls: ['http://*/*', 'https://*/*']},
['responseHeaders']
);
- browser.webNavigation.onCommitted.addListener(onCommittedListener);
- browser.webNavigation.onCompleted.addListener(onCompletedListener);
- browser.tabs.onRemoved.addListener(onRemovedListener);
- browser.runtime.onMessage.addListener(onMessageListener);
+ chrome.webNavigation.onCommitted.addListener(onCommittedListener);
+ chrome.webNavigation.onCompleted.addListener(onCompletedListener);
+ chrome.tabs.onRemoved.addListener(onRemovedListener);
+ chrome.runtime.onMessage.addListener(onMessageListener);
areListenersRegistered = true;
}
function unregisterListeners() {
- browser.webRequest.onBeforeRequest.removeListener(
+ chrome.webRequest.onBeforeRequest.removeListener(
onBeforeRequestListener
);
- browser.webRequest.onSendHeaders.removeListener(
+ chrome.webRequest.onSendHeaders.removeListener(
onSendHeadersListener
);
- browser.webRequest.onHeadersReceived.removeListener(
+ chrome.webRequest.onHeadersReceived.removeListener(
onHeadersReceivedListener
);
- browser.webRequest.onBeforeRedirect.removeListener(
+ chrome.webRequest.onBeforeRedirect.removeListener(
onBeforeRedirectListener
);
- browser.webRequest.onResponseStarted.removeListener(
+ chrome.webRequest.onResponseStarted.removeListener(
onResponseStartedListener
);
- browser.webNavigation.onCommitted.removeListener(onCommittedListener);
- browser.webNavigation.onCompleted.removeListener(onCompletedListener);
- browser.tabs.onRemoved.removeListener(onRemovedListener);
- browser.runtime.onMessage.removeListener(onMessageListener);
+ chrome.webNavigation.onCommitted.removeListener(onCommittedListener);
+ chrome.webNavigation.onCompleted.removeListener(onCompletedListener);
+ chrome.tabs.onRemoved.removeListener(onRemovedListener);
+ chrome.runtime.onMessage.removeListener(onMessageListener);
areListenersRegistered = false;
}
- function areRequiredBrowserApisAvailable() {
- return requiredBrowserApis.every(function(api) {
- return typeof api !== 'undefined';
- });
- }
-
- if ( areRequiredBrowserApisAvailable() ) {
- ifBrowserValid(
- function() {
- browser.webNavigation.onBeforeNavigate.addListener(
- function(details) {
- if ( details.frameId === 0 ) {
- globalPageContainer.onNewNavigation(details);
- }
- },
- {
- url: [{urlMatches: 'http://*/*'}, {urlMatches: 'https://*/*'}]
- }
- );
- }, function() {
-
- }
- );
- }
-
- browser.runtime.onConnect.addListener((port) => {
- port.onMessage.addListener((message) => {
- if ( message === 'is_browser_valid' ) {
- ifBrowserValid(
- port.postMessage({'browser_valid': true}),
- port.postMessage({'browser_valid': false})
- );
- }
- });
- });
-
- browser.runtime.onConnect.addListener((port) => {
- port.onMessage.addListener((message) => {
- if ( message === 'is_tracking_enabled' ) {
- ifTrackingEnabled(
- port.sender.tab,
- function() {
- try {port.postMessage({'tracking_enabled': true});}
- catch(err) {} },
- function() {
- try {port.postMessage({'tracking_enabled': false});}
- catch(err) {} }
- );
- }
- return true;
- });
- });
-
+ chrome.webNavigation.onBeforeNavigate.addListener(
+ function(details) {
+ if ( details.frameId === 0 ) {
+ globalPageContainer.onNewNavigation(details);
+ }
+ },
+ {
+ url: [{urlMatches: 'http://*/*'}, {urlMatches: 'https://*/*'}]
+ }
+ );
+
+ chrome.runtime.onMessage.addListener((message, sender, callback) => {
+ if ( message === 'is_tracking_enabled' ) {
+ ifTrackingEnabled(
+ sender.tab,
+ function() {
+ try {callback({'tracking_enabled': true});}
+ catch(err) {} },
+ function() {
+ try {callback({'tracking_enabled': false});}
+ catch(err) {} }
+ );
+ }
+ return true;
+ });
})();
-
-},{}]},{},[1]);
diff --git a/src/drivers/webextension/js/options.js b/src/drivers/webextension/js/options.js
index 4666b00459918ee97d67bf295438be47dbfdf97d..dc2db78b2ab646113e1549555456577107aa5f4b 100644
--- a/src/drivers/webextension/js/options.js
+++ b/src/drivers/webextension/js/options.js
@@ -1,96 +1,69 @@
-/** global: browser */
-/** global: Wappalyzer */
-/* globals browser Wappalyzer */
+'use strict'
/* eslint-env browser */
+/* globals Utils, chrome */
-const wappalyzer = new Wappalyzer();
+const { i18n, getOption, setOption } = Utils
-/**
- * Get a value from localStorage
- */
-function getOption(name, defaultValue = null) {
- return new Promise(async (resolve, reject) => {
- let value = defaultValue;
+const Options = {
+ /**
+ * Initialise options
+ */
+ async init() {
+ // Theme mode
+ const themeMode = await getOption('themeMode', false)
- try {
- const option = await browser.storage.local.get(name);
-
- if (option[name] !== undefined) {
- value = option[name];
- }
- } catch (error) {
- wappalyzer.log(error.message, 'driver', 'error');
-
- return reject(error.message);
+ if (themeMode) {
+ document.querySelector('body').classList.add('theme-mode')
}
- return resolve(value);
- });
+ ;[
+ ['upgradeMessage', true],
+ ['dynamicIcon', false],
+ ['badge', true],
+ ['tracking', true],
+ ['themeMode', false]
+ ].map(async ([option, defaultValue]) => {
+ const el = document
+ .querySelector(
+ `[data-i18n="option${option.charAt(0).toUpperCase() +
+ option.slice(1)}"]`
+ )
+ .parentNode.querySelector('input')
+
+ el.checked = !!(await getOption(option, defaultValue))
+
+ el.addEventListener('click', async () => {
+ await setOption(option, !!el.checked)
+ })
+ })
+
+ document
+ .querySelector('.options__cache')
+ .addEventListener('click', () => Options.driver('clearCache'))
+
+ i18n()
+ },
+
+ driver(func, args, callback) {
+ return new Promise((resolve, reject) => {
+ chrome.runtime.sendMessage(
+ {
+ source: 'content.js',
+ func,
+ args: args ? (Array.isArray(args) ? args : [args]) : []
+ },
+ (response) => {
+ chrome.runtime.lastError
+ ? reject(new Error(chrome.runtime.lastError.message))
+ : resolve(response)
+ }
+ )
+ })
+ }
}
-/**
- * Set a value in localStorage
- */
-function setOption(name, value) {
- return new Promise(async (resolve, reject) => {
- try {
- await browser.storage.local.set({ [name]: value });
- } catch (error) {
- wappalyzer.log(error.message, 'driver', 'error');
-
- return reject(error.message);
- }
-
- return resolve();
- });
+if (/complete|interactive|loaded/.test(document.readyState)) {
+ Options.init()
+} else {
+ document.addEventListener('DOMContentLoaded', Options.init)
}
-
-document.addEventListener('DOMContentLoaded', async () => {
- const nodes = document.querySelectorAll('[data-i18n]');
-
- Array.prototype.forEach.call(nodes, (node) => {
- node.childNodes[0].nodeValue = browser.i18n.getMessage(node.dataset.i18n);
- });
-
- document.querySelector('#github').addEventListener('click', () => {
- window.open(wappalyzer.config.githubURL);
- });
-
- document.querySelector('#twitter').addEventListener('click', () => {
- window.open(wappalyzer.config.twitterURL);
- });
-
- document.querySelector('#wappalyzer').addEventListener('click', () => {
- window.open(wappalyzer.config.websiteURL);
- });
-
- let el;
- let value;
-
- // Upgrade message
- value = await getOption('upgradeMessage', true);
-
- el = document.querySelector('#option-upgrade-message');
-
- el.checked = value;
-
- el.addEventListener('change', e => setOption('upgradeMessage', e.target.checked));
-
- // Dynamic icon
- value = await getOption('dynamicIcon', true);
-
- el = document.querySelector('#option-dynamic-icon');
-
- el.checked = value;
-
- el.addEventListener('change', e => setOption('dynamicIcon', e.target.checked));
-
- // Tracking
- value = await getOption('tracking', true);
-
- el = document.querySelector('#option-tracking');
-
- el.checked = value;
-
- el.addEventListener('change', e => setOption('tracking', e.target.checked));
-});
diff --git a/src/drivers/webextension/js/popup.js b/src/drivers/webextension/js/popup.js
index 42ed7008911fb4cbb6d774d3adf141699a94de4d..4eac92913a2895412480927d7b309ffa4b61f17b 100644
--- a/src/drivers/webextension/js/popup.js
+++ b/src/drivers/webextension/js/popup.js
@@ -1,246 +1,306 @@
+'use strict'
/* eslint-env browser */
-/* global browser, jsonToDOM */
+/* globals chrome, Utils */
+
+const {
+ agent,
+ open,
+ i18n,
+ getOption,
+ setOption,
+ promisify,
+ sendMessage
+} = Utils
+
+function setDisabledDomain(enabled) {
+ if (enabled) {
+ document
+ .querySelector('.footer__switch--enabled')
+ .classList.add('footer__switch--hidden')
+ document
+ .querySelector('.footer__switch--disabled')
+ .classList.remove('footer__switch--hidden')
+ } else {
+ document
+ .querySelector('.footer__switch--enabled')
+ .classList.remove('footer__switch--hidden')
+ document
+ .querySelector('.footer__switch--disabled')
+ .classList.add('footer__switch--hidden')
+ }
+}
-/** global: browser */
-/** global: jsonToDOM */
+const Popup = {
+ /**
+ * Initialise popup
+ */
+ async init() {
+ // Templates
+ Popup.templates = Array.from(
+ document.querySelectorAll('[data-template]')
+ ).reduce((templates, template) => {
+ templates[template.dataset.template] = template.cloneNode(true)
-let pinnedCategory = null;
-let termsAccepted = false;
+ template.remove()
-const port = browser.runtime.connect({
- name: 'popup.js',
-});
+ return templates
+ }, {})
-function slugify(string) {
- return string.toLowerCase().replace(/[^a-z0-9-]/g, '-').replace(/--+/g, '-').replace(/(?:^-|-$)/, '');
-}
+ // Disabled domains
+ let disabledDomains = await getOption('disabledDomains', [])
-function i18n() {
- const nodes = document.querySelectorAll('[data-i18n]');
+ // Theme mode
+ const themeMode = await getOption('themeMode', false)
- Array.prototype.forEach.call(nodes, (node) => {
- node.innerHTML = browser.i18n.getMessage(node.dataset.i18n);
- });
-}
+ if (themeMode) {
+ document.querySelector('body').classList.add('theme-mode')
+ }
-function replaceDom(domTemplate) {
- const container = document.getElementsByClassName('container')[0];
+ // Terms
+ const termsAccepted =
+ agent === 'chrome' || (await getOption('termsAccepted', false))
- while (container.firstChild) {
- container.removeChild(container.firstChild);
- }
+ if (termsAccepted) {
+ document.querySelector('.terms').classList.add('terms--hidden')
+ document.querySelector('.empty').classList.remove('empty--hidden')
- container.appendChild(jsonToDOM(domTemplate, document, {}));
+ Popup.onGetDetections(await Popup.driver('getDetections'))
+ } else {
+ document.querySelector('.terms').classList.remove('terms--hidden')
+ document.querySelector('.detections').classList.add('detections--hidden')
+ document.querySelector('.empty').classList.add('empty--hidden')
- i18n();
+ document.querySelector('.terms').addEventListener('click', async () => {
+ await setOption('termsAccepted', true)
- Array.from(document.querySelectorAll('.detected__category-pin-wrapper')).forEach((pin) => {
- pin.addEventListener('click', () => {
- const categoryId = parseInt(pin.dataset.categoryId, 10);
+ document.querySelector('.terms').classList.add('terms--hidden')
+ document.querySelector('.empty').classList.remove('empty--hidden')
- if (categoryId === pinnedCategory) {
- pin.className = 'detected__category-pin-wrapper';
+ Popup.onGetDetections(await Popup.driver('getDetections'))
+ })
+ }
- pinnedCategory = null;
- } else {
- const active = document.querySelector('.detected__category-pin-wrapper--active');
+ // Alert
+ const tabs = await promisify(chrome.tabs, 'query', {
+ active: true,
+ currentWindow: true
+ })
- if (active) {
- active.className = 'detected__category-pin-wrapper';
- }
+ if (tabs && tabs.length) {
+ const [{ url }] = tabs
- pin.className = 'detected__category-pin-wrapper detected__category-pin-wrapper--active';
+ if (url.startsWith('http')) {
+ document.querySelector('.alerts').classList.remove('alerts--hidden')
- pinnedCategory = categoryId;
- }
+ document.querySelector(
+ '.alerts__link'
+ ).href = `https://www.wappalyzer.com/alerts?url=${encodeURIComponent(
+ `${url}`
+ )}`
- port.postMessage({
- id: 'set_option',
- key: 'pinnedCategory',
- value: pinnedCategory,
- });
- });
- });
-}
+ const { hostname } = new URL(url)
-function replaceDomWhenReady(dom) {
- if (/complete|interactive|loaded/.test(document.readyState)) {
- replaceDom(dom);
- } else {
- document.addEventListener('DOMContentLoaded', () => {
- replaceDom(dom);
- });
- }
-}
+ setDisabledDomain(disabledDomains.includes(hostname))
-function appsToDomTemplate(response) {
- let template = [];
+ document
+ .querySelector('.footer__switch--disabled')
+ .addEventListener('click', async () => {
+ disabledDomains = disabledDomains.filter(
+ (_hostname) => _hostname !== hostname
+ )
- if (response.tabCache && Object.keys(response.tabCache.detected).length > 0) {
- const categories = {};
+ await setOption('disabledDomains', disabledDomains)
- // Group apps by category
- for (const appName in response.tabCache.detected) {
- response.apps[appName].cats.forEach((cat) => {
- categories[cat] = categories[cat] || { apps: [] };
+ setDisabledDomain(false)
- categories[cat].apps[appName] = appName;
- });
- }
+ Popup.onGetDetections(await Popup.driver('getDetections'))
+ })
+
+ document
+ .querySelector('.footer__switch--enabled')
+ .addEventListener('click', async () => {
+ disabledDomains.push(hostname)
+
+ await setOption('disabledDomains', disabledDomains)
+
+ setDisabledDomain(true)
+
+ Popup.onGetDetections(await Popup.driver('getDetections'))
+ })
+ } else {
+ for (const el of document.querySelectorAll('.footer__switch')) {
+ el.classList.add('footer__switch--hidden')
+ }
- for (const cat in categories) {
- const apps = [];
-
- for (const appName in categories[cat].apps) {
- const { confidence, version } = response.tabCache.detected[appName];
-
- apps.push(
- [
- 'a', {
- class: 'detected__app',
- target: '_blank',
- href: `https://www.wappalyzer.com/technologies/${slugify(appName)}`,
- }, [
- 'img', {
- class: 'detected__app-icon',
- src: `../images/icons/${response.apps[appName].icon || 'default.svg'}`,
- },
- ], [
- 'span', {
- class: 'detected__app-name',
- },
- appName,
- ], version ? [
- 'span', {
- class: 'detected__app-version',
- },
- version,
- ] : null, confidence < 100 ? [
- 'span', {
- class: 'detected__app-confidence',
- },
- `${confidence}% sure`,
- ] : null,
- ],
- );
+ document.querySelector('.alerts').classList.add('alerts--hidden')
}
+ }
- template.push(
- [
- 'div', {
- class: 'detected__category',
- }, [
- 'div', {
- class: 'detected__category-name',
- }, [
- 'a', {
- class: 'detected__category-link',
- target: '_blank',
- href: `https://www.wappalyzer.com/categories/${slugify(response.categories[cat].name)}`,
- },
- browser.i18n.getMessage(`categoryName${cat}`),
- ], [
- 'span', {
- class: `detected__category-pin-wrapper${pinnedCategory == cat ? ' detected__category-pin-wrapper--active' : ''}`,
- 'data-category-id': cat,
- title: browser.i18n.getMessage('categoryPin'),
- }, [
- 'img', {
- class: 'detected__category-pin detected__category-pin--active',
- src: '../images/pin-active.svg',
- },
- ], [
- 'img', {
- class: 'detected__category-pin detected__category-pin--inactive',
- src: '../images/pin.svg',
- },
- ],
- ],
- ], [
- 'div', {
- class: 'detected__apps',
- },
- apps,
- ],
- ],
- );
+ document
+ .querySelector('.footer__settings')
+ .addEventListener('click', () => chrome.runtime.openOptionsPage())
+
+ // Apply internationalization
+ i18n()
+ },
+
+ driver(func, args) {
+ return sendMessage('popup.js', func, args)
+ },
+
+ /**
+ * Log debug messages to the console
+ * @param {String} message
+ */
+ log(message) {
+ Popup.driver('log', message)
+ },
+
+ /**
+ * Group technologies into categories
+ * @param {Object} technologies
+ */
+ categorise(technologies) {
+ return Object.values(
+ technologies
+ .filter(({ confidence }) => confidence >= 50)
+ .reduce((categories, technology) => {
+ technology.categories.forEach((category) => {
+ categories[category.id] = categories[category.id] || {
+ ...category,
+ technologies: []
+ }
+
+ categories[category.id].technologies.push(technology)
+ })
+
+ return categories
+ }, {})
+ )
+ },
+
+ /**
+ * Callback for getDetection listener
+ * @param {Array} detections
+ */
+ async onGetDetections(detections = []) {
+ if (!detections || !detections.length) {
+ document.querySelector('.empty').classList.remove('empty--hidden')
+ document.querySelector('.detections').classList.add('detections--hidden')
+
+ return
}
- template = [
- 'div', {
- class: 'detected',
- },
- template,
- ];
- } else {
- template = [
- 'div', {
- class: 'empty',
- },
- [
- 'span', {
- class: 'empty__text',
- },
- browser.i18n.getMessage('noAppsDetected'),
- ],
- ];
- }
+ document.querySelector('.empty').classList.add('empty--hidden')
- return template;
-}
+ const el = document.querySelector('.detections')
-async function getApps() {
- try {
- const tabs = await browser.tabs.query({
- active: true,
- currentWindow: true,
- });
-
- port.postMessage({
- id: 'get_apps',
- tab: tabs[0],
- });
- } catch (error) {
- console.error(error); // eslint-disable-line no-console
- }
-}
+ el.classList.remove('detections--hidden')
-function displayApps(response) {
- pinnedCategory = response.pinnedCategory; // eslint-disable-line prefer-destructuring
- termsAccepted = response.termsAccepted; // eslint-disable-line prefer-destructuring
+ while (el.firstChild) {
+ el.removeChild(detections.lastChild)
+ }
- if (termsAccepted) {
- replaceDomWhenReady(appsToDomTemplate(response));
- } else {
- i18n();
+ const pinnedCategory = await getOption('pinnedCategory')
- const wrapper = document.querySelector('.terms__wrapper');
+ const categorised = Popup.categorise(detections)
- document.querySelector('.terms__accept').addEventListener('click', () => {
- port.postMessage({
- id: 'set_option',
- key: 'termsAccepted',
- value: true,
- });
+ categorised.forEach(({ id, name, slug: categorySlug, technologies }) => {
+ const categoryNode = Popup.templates.category.cloneNode(true)
- wrapper.classList.remove('terms__wrapper--active');
+ const link = categoryNode.querySelector('.category__link')
- getApps();
- });
+ link.href = `https://www.wappalyzer.com/technologies/${categorySlug}`
+ link.dataset.i18n = `categoryName${id}`
- wrapper.classList.add('terms__wrapper--active');
- }
-}
+ const pins = categoryNode.querySelectorAll('.category__pin')
+
+ if (pinnedCategory === id) {
+ pins.forEach((pin) => pin.classList.add('category__pin--active'))
+ }
+
+ pins.forEach((pin) =>
+ pin.addEventListener('click', async () => {
+ const pinnedCategory = await getOption('pinnedCategory')
+
+ Array.from(
+ document.querySelectorAll('.category__pin--active')
+ ).forEach((pin) => pin.classList.remove('category__pin--active'))
+
+ if (pinnedCategory === id) {
+ await setOption('pinnedCategory', null)
+ } else {
+ await setOption('pinnedCategory', id)
+
+ pins.forEach((pin) => pin.classList.add('category__pin--active'))
+ }
+ })
+ )
+
+ technologies
+ .filter(({ confidence }) => confidence >= 50)
+ .forEach(({ name, slug, confidence, version, icon, website }) => {
+ const technologyNode = Popup.templates.technology.cloneNode(true)
+
+ const image = technologyNode.querySelector('.technology__icon')
+
+ image.src = `../images/icons/${icon}`
-port.onMessage.addListener((message) => {
- switch (message.id) {
- case 'get_apps':
- displayApps(message.response);
+ const link = technologyNode.querySelector('.technology__link')
- break;
- default:
- // Do nothing
+ link.href = `https://www.wappalyzer.com/technologies/${categorySlug}/${slug}`
+ link.textContent = name
+
+ const confidenceNode = technologyNode.querySelector(
+ '.technology__confidence'
+ )
+
+ if (confidence < 100) {
+ confidenceNode.textContent = `${confidence}% sure`
+ } else {
+ confidenceNode.remove()
+ }
+
+ const versionNode = technologyNode.querySelector(
+ '.technology__version'
+ )
+
+ if (version) {
+ versionNode.textContent = version
+ } else {
+ versionNode.remove()
+ }
+
+ categoryNode
+ .querySelector('.technologies')
+ .appendChild(technologyNode)
+ })
+
+ document.querySelector('.detections').appendChild(categoryNode)
+ })
+
+ if (categorised.length === 1) {
+ document
+ .querySelector('.detections')
+ .appendChild(Popup.templates.category.cloneNode(true))
+ }
+
+ Array.from(document.querySelectorAll('a')).forEach((a) =>
+ a.addEventListener('click', (event) => {
+ event.preventDefault()
+
+ open(a.href)
+
+ return false
+ })
+ )
+
+ i18n()
}
-});
+}
-getApps();
+if (/complete|interactive|loaded/.test(document.readyState)) {
+ Popup.init()
+} else {
+ document.addEventListener('DOMContentLoaded', Popup.init)
+}
diff --git a/src/drivers/webextension/js/utils.js b/src/drivers/webextension/js/utils.js
new file mode 100644
index 0000000000000000000000000000000000000000..f48e74403c94137936505ea108ade512e9fb4db5
--- /dev/null
+++ b/src/drivers/webextension/js/utils.js
@@ -0,0 +1,96 @@
+'use strict'
+/* eslint-env browser */
+/* globals chrome */
+
+const Utils = {
+ agent: chrome.extension.getURL('/').startsWith('moz-') ? 'firefox' : 'chrome',
+
+ /**
+ * Use promises instead of callbacks
+ * @param {Object} context
+ * @param {String} method
+ * @param {...any} args
+ */
+ promisify(context, method, ...args) {
+ return new Promise((resolve, reject) => {
+ context[method](...args, (...args) => {
+ if (chrome.runtime.lastError) {
+ return reject(chrome.runtime.lastError)
+ }
+
+ resolve(...args)
+ })
+ })
+ },
+
+ /**
+ * Open a browser tab
+ * @param {String} url
+ * @param {Boolean} active
+ */
+ open(url, active = true) {
+ chrome.tabs.create({ url, active })
+ },
+
+ /**
+ * Get value from local storage
+ * @param {String} name
+ * @param {string|mixed|null} defaultValue
+ */
+ async getOption(name, defaultValue = null) {
+ try {
+ const option = await Utils.promisify(chrome.storage.local, 'get', name)
+
+ if (option[name] !== undefined) {
+ return option[name]
+ }
+ } catch (error) {
+ // eslint-disable-next-line no-console
+ console.error('wappalyzer | utils |', error)
+ }
+
+ return defaultValue
+ },
+
+ /**
+ * Set value in local storage
+ * @param {String} name
+ * @param {String} value
+ */
+ async setOption(name, value) {
+ try {
+ await Utils.promisify(chrome.storage.local, 'set', {
+ [name]: value
+ })
+ } catch (error) {
+ // eslint-disable-next-line no-console
+ console.error('wappalyzer | utils |', error)
+ }
+ },
+
+ /**
+ * Apply internationalization
+ */
+ i18n() {
+ Array.from(document.querySelectorAll('[data-i18n]')).forEach(
+ (node) => (node.innerHTML = chrome.i18n.getMessage(node.dataset.i18n))
+ )
+ },
+
+ sendMessage(source, func, args) {
+ return new Promise((resolve, reject) => {
+ chrome.runtime.sendMessage(
+ {
+ source,
+ func,
+ args: args ? (Array.isArray(args) ? args : [args]) : []
+ },
+ (response) => {
+ chrome.runtime.lastError
+ ? reject(new Error(chrome.runtime.lastError.message))
+ : resolve(response)
+ }
+ )
+ })
+ }
+}
diff --git a/src/drivers/webextension/manifest.json b/src/drivers/webextension/manifest.json
index 34630e09bac05a4600f6ccdf0df20405f52dd0d5..b0f17eea3d8243b4395b250d36e7156181d0b4a5 100644
--- a/src/drivers/webextension/manifest.json
+++ b/src/drivers/webextension/manifest.json
@@ -1,10 +1,10 @@
{
"name": "Wappalyzer",
"short_name": "Wappalyzer",
- "author": "Elbert Alias",
+ "author": "Wappalyzer",
"homepage_url": "https://www.wappalyzer.com",
"description": "Identify web technologies",
- "version": "5.8.4",
+ "version": "6.2.4",
"default_locale": "en",
"manifest_version": 2,
"icons": {
@@ -14,7 +14,7 @@
"38": "images/icon_38.png",
"128": "images/icon_128.png"
},
- "page_action": {
+ "browser_action": {
"default_icon": {
"16": "images/icon_16.png",
"19": "images/icon_19.png",
@@ -27,7 +27,6 @@
},
"background": {
"page": "html/background.html"
-
},
"content_scripts": [
{
@@ -36,7 +35,6 @@
"https://*/*"
],
"js": [
- "node_modules/webextension-polyfill/dist/browser-polyfill.js",
"js/content.js"
],
"run_at": "document_idle"
@@ -46,12 +44,7 @@
"http://*/*",
"https://*/*"
],
- "exclude_matches": [
- "https://*.modirum.com/*",
- "https://www.alphaecommerce.gr/*"
- ],
"js": [
- "node_modules/webextension-polyfill/dist/browser-polyfill.js",
"js/lib/iframe.js"
],
"run_at": "document_start",
@@ -74,11 +67,5 @@
"http://*/*",
"https://*/*"
],
- "content_security_policy": "script-src 'self'; object-src 'self'",
- "applications": {
- "gecko": {
- "id": "wappalyzer@crunchlabz.com",
- "strict_min_version": "60.0"
- }
- }
-}
+ "content_security_policy": "script-src 'self'; object-src 'self'"
+}
\ No newline at end of file
diff --git a/src/drivers/webextension/npm-shrinkwrap.json b/src/drivers/webextension/npm-shrinkwrap.json
deleted file mode 100644
index 9934b3a1caf00c0663169e4492aecc76e0d74f9a..0000000000000000000000000000000000000000
--- a/src/drivers/webextension/npm-shrinkwrap.json
+++ /dev/null
@@ -1,11 +0,0 @@
-{
- "requires": true,
- "lockfileVersion": 1,
- "dependencies": {
- "webextension-polyfill": {
- "version": "0.4.0",
- "resolved": "https://registry.npmjs.org/webextension-polyfill/-/webextension-polyfill-0.4.0.tgz",
- "integrity": "sha512-oreMp+EoAo1pzRMigx4jB5jInIpx6NTCySPSjGyLLee/dCIPiRqowCEfbFP8o20wz9SOtNwSsfkaJ9D/tRgpag=="
- }
- }
-}
diff --git a/src/drivers/webextension/package.json b/src/drivers/webextension/package.json
deleted file mode 100644
index 837c5acf820ef0d945daaa34e662c0825efef8bd..0000000000000000000000000000000000000000
--- a/src/drivers/webextension/package.json
+++ /dev/null
@@ -1,5 +0,0 @@
-{
- "dependencies": {
- "webextension-polyfill": "^0.4.0"
- }
-}
diff --git a/src/drivers/webextension/yarn.lock b/src/drivers/webextension/yarn.lock
deleted file mode 100644
index e2e1d507d51a4a79b9ab0b291d26fab8cb324f98..0000000000000000000000000000000000000000
--- a/src/drivers/webextension/yarn.lock
+++ /dev/null
@@ -1,7 +0,0 @@
-# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.
-# yarn lockfile v1
-
-
-webextension-polyfill@^0.2.1:
- version "0.2.1"
- resolved "https://registry.yarnpkg.com/webextension-polyfill/-/webextension-polyfill-0.2.1.tgz#cdfc9126033039f1713553157d35beff1d4d6f4a"
diff --git a/src/icons/1C-Bitrix.png b/src/icons/1C-Bitrix.png
deleted file mode 100644
index d0236f87f35919eb02c9743dde34b5a2e2f47534..0000000000000000000000000000000000000000
Binary files a/src/icons/1C-Bitrix.png and /dev/null differ
diff --git a/src/icons/3dCart.png b/src/icons/3dCart.png
deleted file mode 100644
index 64ca4abc8b98d0a30c26066534ef0258b756a381..0000000000000000000000000000000000000000
Binary files a/src/icons/3dCart.png and /dev/null differ
diff --git a/src/icons/91app.png b/src/icons/91app.png
deleted file mode 100644
index 3963238b1b19bafcd4d578dc72f6551f117d6d8f..0000000000000000000000000000000000000000
Binary files a/src/icons/91app.png and /dev/null differ
diff --git a/src/icons/ADPLAN.png b/src/icons/ADPLAN.png
deleted file mode 100644
index 2252edbb8e7c8a22f00186d4e7f0923fc53b40fa..0000000000000000000000000000000000000000
Binary files a/src/icons/ADPLAN.png and /dev/null differ
diff --git a/src/icons/Accelerated-Mobile-Pages.svg b/src/icons/Accelerated-Mobile-Pages.svg
deleted file mode 100644
index 23bcd265474d6773ba43021f4a465725726f1754..0000000000000000000000000000000000000000
--- a/src/icons/Accelerated-Mobile-Pages.svg
+++ /dev/null
@@ -1,12 +0,0 @@
-
-
-
- AMP-Brand-Blue-Icon
- Created with Sketch.
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/src/icons/AdOcean.png b/src/icons/AdOcean.png
deleted file mode 100644
index 80b5a9c4e6498ee8bbc4802c5a3f468a9256bd34..0000000000000000000000000000000000000000
Binary files a/src/icons/AdOcean.png and /dev/null differ
diff --git a/src/icons/Adobe Experience Manager.svg b/src/icons/Adobe Experience Manager.svg
deleted file mode 100644
index af1c873a12f79705650ea3c0487eff58f2e35787..0000000000000000000000000000000000000000
--- a/src/icons/Adobe Experience Manager.svg
+++ /dev/null
@@ -1 +0,0 @@
-
\ No newline at end of file
diff --git a/src/icons/Adobe Muse.svg b/src/icons/Adobe Muse.svg
deleted file mode 100644
index 003253891c511be5ec18d7bfc82e082e88a519e5..0000000000000000000000000000000000000000
--- a/src/icons/Adobe Muse.svg
+++ /dev/null
@@ -1 +0,0 @@
-
\ No newline at end of file
diff --git a/src/icons/Algolia Realtime Search.svg b/src/icons/Algolia Realtime Search.svg
deleted file mode 100644
index 4cc800f5eae3985f74e4fdc856e8334aab0df409..0000000000000000000000000000000000000000
--- a/src/icons/Algolia Realtime Search.svg
+++ /dev/null
@@ -1 +0,0 @@
-
\ No newline at end of file
diff --git a/src/icons/Anetwork.png b/src/icons/Anetwork.png
deleted file mode 100644
index f28e95dc5a0ba043217d8c53a55d320168c36980..0000000000000000000000000000000000000000
Binary files a/src/icons/Anetwork.png and /dev/null differ
diff --git a/src/icons/Apache HBase.png b/src/icons/Apache HBase.png
deleted file mode 100644
index 113d901a69a83fa4de679329257b4c04f3053119..0000000000000000000000000000000000000000
Binary files a/src/icons/Apache HBase.png and /dev/null differ
diff --git a/src/icons/Apache Hadoop.svg b/src/icons/Apache Hadoop.svg
deleted file mode 100644
index 01c64ea22657495c4111b42b399b14aab5ec71c4..0000000000000000000000000000000000000000
--- a/src/icons/Apache Hadoop.svg
+++ /dev/null
@@ -1 +0,0 @@
-
\ No newline at end of file
diff --git a/src/icons/Apache Traffic Server.png b/src/icons/Apache Traffic Server.png
deleted file mode 100644
index 0faf78e0f6eb3e7955c6112f1da9c2fb8ae7675c..0000000000000000000000000000000000000000
Binary files a/src/icons/Apache Traffic Server.png and /dev/null differ
diff --git a/src/icons/Appcues.svg b/src/icons/Appcues.svg
deleted file mode 100644
index 20a1a545ec9ea8eed68460827c448b8330596b0e..0000000000000000000000000000000000000000
--- a/src/icons/Appcues.svg
+++ /dev/null
@@ -1,13 +0,0 @@
-
-
-
- Group
- Created with Sketch.
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/src/icons/Apple.svg b/src/icons/Apple.svg
deleted file mode 100644
index 2954f0f5249e051f8015f62dd935739296de9012..0000000000000000000000000000000000000000
--- a/src/icons/Apple.svg
+++ /dev/null
@@ -1,23 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/src/icons/Avasize.png b/src/icons/Avasize.png
deleted file mode 100755
index 98651980b1c0f4d43f8a72958ac32e154089e656..0000000000000000000000000000000000000000
Binary files a/src/icons/Avasize.png and /dev/null differ
diff --git a/src/icons/Backpack.png b/src/icons/Backpack.png
deleted file mode 100644
index 5095bf4f2366571858e6a3198ca755269ef632d9..0000000000000000000000000000000000000000
Binary files a/src/icons/Backpack.png and /dev/null differ
diff --git a/src/icons/Backtory.svg b/src/icons/Backtory.svg
deleted file mode 100644
index 9fb2e0c5771641159512a29e157dc743e6a086b4..0000000000000000000000000000000000000000
--- a/src/icons/Backtory.svg
+++ /dev/null
@@ -1,86 +0,0 @@
-
-image/svg+xml
\ No newline at end of file
diff --git a/src/icons/Bigcommerce.png b/src/icons/Bigcommerce.png
deleted file mode 100644
index edd047e96613c4ac14352e60396b50dafd9d9c1c..0000000000000000000000000000000000000000
Binary files a/src/icons/Bigcommerce.png and /dev/null differ
diff --git a/src/icons/Bloomreach.png b/src/icons/Bloomreach.png
deleted file mode 100644
index 25b13e808ea35a0fa153a9d74ff7d4a77ecb9818..0000000000000000000000000000000000000000
Binary files a/src/icons/Bloomreach.png and /dev/null differ
diff --git a/src/icons/Bootstrap.png b/src/icons/Bootstrap.png
deleted file mode 100644
index 44230c442eb2294408a4244e29d5c5ebb8457c47..0000000000000000000000000000000000000000
Binary files a/src/icons/Bootstrap.png and /dev/null differ
diff --git a/src/icons/Botble-CMS.png b/src/icons/Botble-CMS.png
deleted file mode 100755
index 9704f5d7aca66961ccea4bfc7d20344236c8064d..0000000000000000000000000000000000000000
Binary files a/src/icons/Botble-CMS.png and /dev/null differ
diff --git a/src/icons/CDN77.png b/src/icons/CDN77.png
deleted file mode 100644
index 7300be9d545db77771b503b0c91e18ad4bb12e21..0000000000000000000000000000000000000000
Binary files a/src/icons/CDN77.png and /dev/null differ
diff --git a/src/icons/Cecil.png b/src/icons/Cecil.png
deleted file mode 100644
index ce4a53cf612792f455181ebfb3186fa40c0d16b9..0000000000000000000000000000000000000000
Binary files a/src/icons/Cecil.png and /dev/null differ
diff --git a/src/icons/Chameleon.png b/src/icons/Chameleon.png
deleted file mode 100644
index 6bf587d9157a63e54969a8b3547ae2f01037c4cf..0000000000000000000000000000000000000000
Binary files a/src/icons/Chameleon.png and /dev/null differ
diff --git a/src/icons/Chorus.png b/src/icons/Chorus.png
deleted file mode 100644
index 13416e0218f6de0d0f8c4e1a2f27dce21705ed9d..0000000000000000000000000000000000000000
Binary files a/src/icons/Chorus.png and /dev/null differ
diff --git a/src/icons/ClickFunnels.png b/src/icons/ClickFunnels.png
deleted file mode 100644
index 86504340ecd9da4a8771f11ea40dddedd0a1c83f..0000000000000000000000000000000000000000
Binary files a/src/icons/ClickFunnels.png and /dev/null differ
diff --git a/src/icons/Combeenation.png b/src/icons/Combeenation.png
deleted file mode 100644
index 86792253e375667078ee4b4352a2d43a24c73b44..0000000000000000000000000000000000000000
Binary files a/src/icons/Combeenation.png and /dev/null differ
diff --git a/src/icons/Connect.png b/src/icons/Connect.png
deleted file mode 100644
index 994d06c7b3f90e5c953c13b7b52e04a4b0afb1dc..0000000000000000000000000000000000000000
Binary files a/src/icons/Connect.png and /dev/null differ
diff --git a/src/icons/Countly.png b/src/icons/Countly.png
deleted file mode 100644
index ae9d8db9648cc1da2b24a4a9fb09e8d12e082f0d..0000000000000000000000000000000000000000
Binary files a/src/icons/Countly.png and /dev/null differ
diff --git a/src/icons/Craft CMS.svg b/src/icons/Craft CMS.svg
deleted file mode 100644
index 3bab17c7c813486ac933785cf1ccfd0fd8528b68..0000000000000000000000000000000000000000
--- a/src/icons/Craft CMS.svg
+++ /dev/null
@@ -1,12 +0,0 @@
-
-
-
-
-
-
diff --git a/src/icons/CrossBox.png b/src/icons/CrossBox.png
deleted file mode 100644
index c907d010be612037bf227d57b54d5167f15afef4..0000000000000000000000000000000000000000
Binary files a/src/icons/CrossBox.png and /dev/null differ
diff --git a/src/icons/DataPower.png b/src/icons/DataPower.png
deleted file mode 100644
index 0cee484aa1bbeb07f68c1fb961df7fda7a3e6032..0000000000000000000000000000000000000000
Binary files a/src/icons/DataPower.png and /dev/null differ
diff --git a/src/icons/DerakCloud.png b/src/icons/DerakCloud.png
deleted file mode 100644
index 377b223f2fb28789f3f7b206379bc1fff7b2478f..0000000000000000000000000000000000000000
Binary files a/src/icons/DerakCloud.png and /dev/null differ
diff --git a/src/icons/Django CMS.png b/src/icons/Django CMS.png
deleted file mode 100644
index 20909ea3ec92d67d308a568f2055fd3082d3abdb..0000000000000000000000000000000000000000
Binary files a/src/icons/Django CMS.png and /dev/null differ
diff --git a/src/icons/Drupal.svg b/src/icons/Drupal.svg
deleted file mode 100644
index b32678febb294668635e667fe5e8dbda7f1898e2..0000000000000000000000000000000000000000
--- a/src/icons/Drupal.svg
+++ /dev/null
@@ -1,34 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/src/icons/EasyEngine.png b/src/icons/EasyEngine.png
deleted file mode 100644
index 737ecd1b7931f593a6d3e1f310cba060595d77e0..0000000000000000000000000000000000000000
Binary files a/src/icons/EasyEngine.png and /dev/null differ
diff --git a/src/icons/Elementor.png b/src/icons/Elementor.png
deleted file mode 100644
index 87fc23e014e907cd2999e32faf2c3c26d7c9b6c8..0000000000000000000000000000000000000000
Binary files a/src/icons/Elementor.png and /dev/null differ
diff --git a/src/icons/Express.png b/src/icons/Express.png
deleted file mode 100644
index 8f3461e69e92bd52061a573462093ae878df7ec8..0000000000000000000000000000000000000000
Binary files a/src/icons/Express.png and /dev/null differ
diff --git a/src/icons/F5.png b/src/icons/F5.png
deleted file mode 100644
index fba894586e496018d86d99f30e472f96eaa73ee8..0000000000000000000000000000000000000000
Binary files a/src/icons/F5.png and /dev/null differ
diff --git a/src/icons/FWP.png b/src/icons/FWP.png
deleted file mode 100644
index 2f556e7b3e04b89775ae662a75d95aa02ab0a6e1..0000000000000000000000000000000000000000
Binary files a/src/icons/FWP.png and /dev/null differ
diff --git a/src/icons/Fastcommerce.png b/src/icons/Fastcommerce.png
deleted file mode 100644
index 6ba20a3f3f4dbd5c2e0182d19149ada42ff505b4..0000000000000000000000000000000000000000
Binary files a/src/icons/Fastcommerce.png and /dev/null differ
diff --git a/src/icons/Fbits.png b/src/icons/Fbits.png
deleted file mode 100644
index f5253019e42216efa279b0b09f1537b0c8b57b5b..0000000000000000000000000000000000000000
Binary files a/src/icons/Fbits.png and /dev/null differ
diff --git a/src/icons/Flat UI.png b/src/icons/Flat UI.png
deleted file mode 100644
index 7a0cc0a2cf19792e620200f97290f09c3c652fbc..0000000000000000000000000000000000000000
Binary files a/src/icons/Flat UI.png and /dev/null differ
diff --git a/src/icons/Font Awesome.png b/src/icons/Font Awesome.png
deleted file mode 100644
index 4a9568af1984aa51a04e8ff7cf2c46acc42701db..0000000000000000000000000000000000000000
Binary files a/src/icons/Font Awesome.png and /dev/null differ
diff --git a/src/icons/Gemius.png b/src/icons/Gemius.png
deleted file mode 100644
index c9344b1252d5cc6675734e0fbce02caeff9d9d36..0000000000000000000000000000000000000000
Binary files a/src/icons/Gemius.png and /dev/null differ
diff --git a/src/icons/Google Maps.png b/src/icons/Google Maps.png
deleted file mode 100644
index ecf471ef08e1656bb712125cfe0408e93478805b..0000000000000000000000000000000000000000
Binary files a/src/icons/Google Maps.png and /dev/null differ
diff --git a/src/icons/Google Sites.png b/src/icons/Google Sites.png
deleted file mode 100644
index 3bcb4f4cc647db4ab339e94ee47af227b50e4cd7..0000000000000000000000000000000000000000
Binary files a/src/icons/Google Sites.png and /dev/null differ
diff --git a/src/icons/Haravan.png b/src/icons/Haravan.png
deleted file mode 100644
index 7390fbc65b7fefa67ff37a97e5f2248450625642..0000000000000000000000000000000000000000
Binary files a/src/icons/Haravan.png and /dev/null differ
diff --git a/src/icons/Homeland.png b/src/icons/Homeland.png
deleted file mode 100644
index e8ca492f03fea5c542e2d79c342484fb1ce007e3..0000000000000000000000000000000000000000
Binary files a/src/icons/Homeland.png and /dev/null differ
diff --git a/src/icons/Hybris.png b/src/icons/Hybris.png
deleted file mode 100644
index 842dd83430fc2ab897059902d706cc99721c56cd..0000000000000000000000000000000000000000
Binary files a/src/icons/Hybris.png and /dev/null differ
diff --git a/src/icons/InProces.png b/src/icons/InProces.png
deleted file mode 100644
index 5b76fa14ede42307d2abfc593195fb0ec006f9ea..0000000000000000000000000000000000000000
Binary files a/src/icons/InProces.png and /dev/null differ
diff --git a/src/icons/Instabot.png b/src/icons/Instabot.png
deleted file mode 100644
index 3b49095d355d20c1abc8c8a1f785f847d0184c93..0000000000000000000000000000000000000000
Binary files a/src/icons/Instabot.png and /dev/null differ
diff --git a/src/icons/Intercom.png b/src/icons/Intercom.png
deleted file mode 100644
index c6fe220c680cbca3d9dbdc6103eb6640d1054b83..0000000000000000000000000000000000000000
Binary files a/src/icons/Intercom.png and /dev/null differ
diff --git a/src/icons/Intershop.png b/src/icons/Intershop.png
deleted file mode 100644
index 2cb07ca60c02c9e08bb3d4d3944b4589e2afe5a6..0000000000000000000000000000000000000000
Binary files a/src/icons/Intershop.png and /dev/null differ
diff --git a/src/icons/Ionicons.png b/src/icons/Ionicons.png
deleted file mode 100644
index 67497c434a99d28e3f5a842182ba184833ef9ddf..0000000000000000000000000000000000000000
Binary files a/src/icons/Ionicons.png and /dev/null differ
diff --git a/src/icons/KeyCDN.png b/src/icons/KeyCDN.png
deleted file mode 100644
index 5b635dc2c4bf50776c3dd0ab4690d9f9d02484b9..0000000000000000000000000000000000000000
Binary files a/src/icons/KeyCDN.png and /dev/null differ
diff --git a/src/icons/Kontaktify.png b/src/icons/Kontaktify.png
deleted file mode 100644
index 39478c896e0af22f3ceb3be4a337d8389f168adc..0000000000000000000000000000000000000000
Binary files a/src/icons/Kontaktify.png and /dev/null differ
diff --git a/src/icons/LOU.png b/src/icons/LOU.png
deleted file mode 100644
index c2836cab445c17b77ce4e0902d8b70aaf20427e3..0000000000000000000000000000000000000000
Binary files a/src/icons/LOU.png and /dev/null differ
diff --git a/src/icons/LabVIEW.png b/src/icons/LabVIEW.png
deleted file mode 100644
index 173016d28700444325559e2a7e0ca6504b280707..0000000000000000000000000000000000000000
Binary files a/src/icons/LabVIEW.png and /dev/null differ
diff --git a/src/icons/Laravel.png b/src/icons/Laravel.png
deleted file mode 100644
index fea26307d50889095a11b6bb131d1752f21837b2..0000000000000000000000000000000000000000
Binary files a/src/icons/Laravel.png and /dev/null differ
diff --git a/src/icons/Lighty.png b/src/icons/Lighty.png
deleted file mode 100644
index fa64c37afb8d7703805553b9050fad178d50f2a5..0000000000000000000000000000000000000000
Binary files a/src/icons/Lighty.png and /dev/null differ
diff --git a/src/icons/LimeSurvey.png b/src/icons/LimeSurvey.png
deleted file mode 100644
index b87768960549b5d54a0caa61b8668ffaef989c87..0000000000000000000000000000000000000000
Binary files a/src/icons/LimeSurvey.png and /dev/null differ
diff --git a/src/icons/LocalFocus.png b/src/icons/LocalFocus.png
deleted file mode 100644
index 0571a349b925e4b1ef6a154ae0bc223e0bce7b6b..0000000000000000000000000000000000000000
Binary files a/src/icons/LocalFocus.png and /dev/null differ
diff --git a/src/icons/Locomotive.png b/src/icons/Locomotive.png
deleted file mode 100644
index 21482d022a6bfbed940175b1e07697f8e8c29fb6..0000000000000000000000000000000000000000
Binary files a/src/icons/Locomotive.png and /dev/null differ
diff --git a/src/icons/M.R. Inc.png b/src/icons/M.R. Inc.png
deleted file mode 100644
index 1e3e20e1bc39002aaa9bb64355798ed103ca96fd..0000000000000000000000000000000000000000
Binary files a/src/icons/M.R. Inc.png and /dev/null differ
diff --git a/src/icons/MakeShopKorea.png b/src/icons/MakeShopKorea.png
deleted file mode 100644
index 5cf20bd0ab7bbea9dd763f3999742ed63c452156..0000000000000000000000000000000000000000
Binary files a/src/icons/MakeShopKorea.png and /dev/null differ
diff --git a/src/icons/Matomo.png b/src/icons/Matomo.png
deleted file mode 100644
index c6caa3515747e5effaded5b3427f98b06bf56d7a..0000000000000000000000000000000000000000
Binary files a/src/icons/Matomo.png and /dev/null differ
diff --git a/src/icons/Mean.io.png b/src/icons/Mean.io.png
deleted file mode 100644
index 3ae8f1a41055280b4f2b20dc9fb5e35de8587dee..0000000000000000000000000000000000000000
Binary files a/src/icons/Mean.io.png and /dev/null differ
diff --git a/src/icons/MediaTomb.png b/src/icons/MediaTomb.png
deleted file mode 100644
index 537b6f99c0cce2b7a01bc8a0500bf8738a43d5b3..0000000000000000000000000000000000000000
Binary files a/src/icons/MediaTomb.png and /dev/null differ
diff --git a/src/icons/MemberStack.png b/src/icons/MemberStack.png
deleted file mode 100644
index 8f170cb9a7f144337448c9f16e75c0470b20ba37..0000000000000000000000000000000000000000
Binary files a/src/icons/MemberStack.png and /dev/null differ
diff --git a/src/icons/Microsoft.png b/src/icons/Microsoft.png
deleted file mode 100644
index d6c37c10f4424e6c12f249ad2210351a1fe64339..0000000000000000000000000000000000000000
Binary files a/src/icons/Microsoft.png and /dev/null differ
diff --git a/src/icons/Mithril.svg b/src/icons/Mithril.svg
deleted file mode 100644
index 04cb102f1c95cf806d6bd3b76f588d95bab51a4d..0000000000000000000000000000000000000000
--- a/src/icons/Mithril.svg
+++ /dev/null
@@ -1,39 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/src/icons/Nepso.png b/src/icons/Nepso.png
deleted file mode 100644
index e14ba066786a3f20b8c502648e4c080022992481..0000000000000000000000000000000000000000
Binary files a/src/icons/Nepso.png and /dev/null differ
diff --git a/src/icons/NextGEN Gallery.png b/src/icons/NextGEN Gallery.png
deleted file mode 100644
index 4440d9824eb0f1389f640002c7899a2225abc8bf..0000000000000000000000000000000000000000
Binary files a/src/icons/NextGEN Gallery.png and /dev/null differ
diff --git a/src/icons/OpenUI5.png b/src/icons/OpenUI5.png
deleted file mode 100644
index 17a2b943e4e08fada6e6cd56c3071f9bfe74e75e..0000000000000000000000000000000000000000
Binary files a/src/icons/OpenUI5.png and /dev/null differ
diff --git a/src/icons/Ophal.png b/src/icons/Ophal.png
deleted file mode 100644
index 22dc9c13760b51d51cbfc45ecafc5d7ebc05489a..0000000000000000000000000000000000000000
Binary files a/src/icons/Ophal.png and /dev/null differ
diff --git a/src/icons/PANSITE.png b/src/icons/PANSITE.png
deleted file mode 100644
index a2d74d9985ea368193b6aafa205b275851b758ec..0000000000000000000000000000000000000000
Binary files a/src/icons/PANSITE.png and /dev/null differ
diff --git a/src/icons/PHP-Fusion.png b/src/icons/PHP-Fusion.png
deleted file mode 100644
index 59aa99d6d870feeae75ad62a267758eb7ca68d0a..0000000000000000000000000000000000000000
Binary files a/src/icons/PHP-Fusion.png and /dev/null differ
diff --git a/src/icons/PHP-Nuke.png b/src/icons/PHP-Nuke.png
deleted file mode 100644
index 5e8f3182f4cfdcaa16555e451fadb1d845bd5c55..0000000000000000000000000000000000000000
Binary files a/src/icons/PHP-Nuke.png and /dev/null differ
diff --git a/src/icons/PageCDN.png b/src/icons/PageCDN.png
deleted file mode 100644
index 46788f4c2eefd0f982bf0d861e351343d326ea03..0000000000000000000000000000000000000000
Binary files a/src/icons/PageCDN.png and /dev/null differ
diff --git a/src/icons/Pagevamp.png b/src/icons/Pagevamp.png
deleted file mode 100644
index 246558737fa1457ffa7a6027155afccd268bd6bc..0000000000000000000000000000000000000000
Binary files a/src/icons/Pagevamp.png and /dev/null differ
diff --git a/src/icons/Parcel.png b/src/icons/Parcel.png
deleted file mode 100644
index f3028060fb70c0c95e6b8db76b77b2229d6dcc20..0000000000000000000000000000000000000000
Binary files a/src/icons/Parcel.png and /dev/null differ
diff --git a/src/icons/Pendo.svg b/src/icons/Pendo.svg
deleted file mode 100644
index fe7d070c0c55b8f11a9f452e14673120983d448c..0000000000000000000000000000000000000000
--- a/src/icons/Pendo.svg
+++ /dev/null
@@ -1,16 +0,0 @@
-
-
-
-
-Created by potrace 1.15, written by Peter Selinger 2001-2017
-
-
-
-
-
diff --git a/src/icons/PhotoShelter.png b/src/icons/PhotoShelter.png
deleted file mode 100644
index b8d282d2ed3e8aebeffba8e5feadb1368763c86f..0000000000000000000000000000000000000000
Binary files a/src/icons/PhotoShelter.png and /dev/null differ
diff --git a/src/icons/Plentymarkets.png b/src/icons/Plentymarkets.png
deleted file mode 100644
index 2c047fdef02e101e1b59e4e1bf1c3931738f120b..0000000000000000000000000000000000000000
Binary files a/src/icons/Plentymarkets.png and /dev/null differ
diff --git a/src/icons/Prebid.png b/src/icons/Prebid.png
deleted file mode 100644
index 3a9ab86c6c6307eca0cc8878a4a7ebb10b19731d..0000000000000000000000000000000000000000
Binary files a/src/icons/Prebid.png and /dev/null differ
diff --git a/src/icons/Prism.svg b/src/icons/Prism.svg
deleted file mode 100644
index b3257ac00868ac19cb61ec9c918aa91335245085..0000000000000000000000000000000000000000
--- a/src/icons/Prism.svg
+++ /dev/null
@@ -1,22 +0,0 @@
-
-
-
diff --git a/src/icons/ProjectPoi.png b/src/icons/ProjectPoi.png
deleted file mode 100644
index 65bfdff62b1b6291d26002498630999fb2a677f6..0000000000000000000000000000000000000000
Binary files a/src/icons/ProjectPoi.png and /dev/null differ
diff --git a/src/icons/Quantcast.png b/src/icons/Quantcast.png
deleted file mode 100644
index 9f062ab5df2ae7716baa44295f868724c44cc779..0000000000000000000000000000000000000000
Binary files a/src/icons/Quantcast.png and /dev/null differ
diff --git a/src/icons/Rakuten DBCore.png b/src/icons/Rakuten DBCore.png
deleted file mode 100644
index e048710d9feb07f0dd1ca8ff71bebc965a401091..0000000000000000000000000000000000000000
Binary files a/src/icons/Rakuten DBCore.png and /dev/null differ
diff --git a/src/icons/RakutenDigitalCommerce.png b/src/icons/RakutenDigitalCommerce.png
deleted file mode 100644
index 8784b5b3c36a2c937425028c5c14873ed24361a7..0000000000000000000000000000000000000000
Binary files a/src/icons/RakutenDigitalCommerce.png and /dev/null differ
diff --git a/src/icons/Red Hat.png b/src/icons/Red Hat.png
deleted file mode 100644
index 914a8f8441c03587beb4ab9ec397efbee33a05da..0000000000000000000000000000000000000000
Binary files a/src/icons/Red Hat.png and /dev/null differ
diff --git a/src/icons/Rocket.svg b/src/icons/Rocket.svg
deleted file mode 100644
index feadcf82b3715e067961575421c0e494676ff030..0000000000000000000000000000000000000000
--- a/src/icons/Rocket.svg
+++ /dev/null
@@ -1,27 +0,0 @@
-
-
-
-
-
-
-
-
-
-
diff --git a/src/icons/Saia PCD.png b/src/icons/Saia PCD.png
deleted file mode 100644
index 4baadcb4f396e3bd48b2e1d83fce36e3d276f76e..0000000000000000000000000000000000000000
Binary files a/src/icons/Saia PCD.png and /dev/null differ
diff --git a/src/icons/Scenari.png b/src/icons/Scenari.png
deleted file mode 100644
index bbfc2d9180589596f1db9a2479db7c8a59a4d8c5..0000000000000000000000000000000000000000
Binary files a/src/icons/Scenari.png and /dev/null differ
diff --git a/src/icons/Shadow.png b/src/icons/Shadow.png
deleted file mode 100644
index 6410565aabfa66c86b9164c4846427750f2db49f..0000000000000000000000000000000000000000
Binary files a/src/icons/Shadow.png and /dev/null differ
diff --git a/src/icons/Shiny.png b/src/icons/Shiny.png
deleted file mode 100644
index 612d350d3bb102a97f5100f951d148bd4734571f..0000000000000000000000000000000000000000
Binary files a/src/icons/Shiny.png and /dev/null differ
diff --git a/src/icons/Shopcada.png b/src/icons/Shopcada.png
deleted file mode 100644
index c27bef7d1dd8f8b7e65d14bd683248f94792e234..0000000000000000000000000000000000000000
Binary files a/src/icons/Shopcada.png and /dev/null differ
diff --git a/src/icons/Shopfa.svg b/src/icons/Shopfa.svg
deleted file mode 100644
index dafcfd5c3664b28e18343bc847700427bad0339f..0000000000000000000000000000000000000000
--- a/src/icons/Shopfa.svg
+++ /dev/null
@@ -1,19 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/src/icons/Shopware.png b/src/icons/Shopware.png
deleted file mode 100644
index 8387cd6831fc581706dcd56fae82e8c8f9bf14c3..0000000000000000000000000000000000000000
Binary files a/src/icons/Shopware.png and /dev/null differ
diff --git a/src/icons/SiteCatalyst.png b/src/icons/SiteCatalyst.png
deleted file mode 100644
index 002de3d70a519a28bf2daed49d83075d47f347ac..0000000000000000000000000000000000000000
Binary files a/src/icons/SiteCatalyst.png and /dev/null differ
diff --git a/src/icons/Socket.io.png b/src/icons/Socket.io.png
deleted file mode 100644
index f381eecf759b153938ae2d972329cb4a3d24b9d5..0000000000000000000000000000000000000000
Binary files a/src/icons/Socket.io.png and /dev/null differ
diff --git a/src/icons/SpiderControl iniNet.png b/src/icons/SpiderControl iniNet.png
deleted file mode 100644
index 545cd103335c3c11b240cc83b99b4e075922173d..0000000000000000000000000000000000000000
Binary files a/src/icons/SpiderControl iniNet.png and /dev/null differ
diff --git a/src/icons/Sqreen.png b/src/icons/Sqreen.png
deleted file mode 100644
index c4e1000e61ef21cd111753433c82be6f764606ac..0000000000000000000000000000000000000000
Binary files a/src/icons/Sqreen.png and /dev/null differ
diff --git a/src/icons/Strapi.png b/src/icons/Strapi.png
deleted file mode 100644
index 065887ab78a9a29f1f3fdc90adab8d20c59c6d2c..0000000000000000000000000000000000000000
Binary files a/src/icons/Strapi.png and /dev/null differ
diff --git a/src/icons/SweetAlert2.png b/src/icons/SweetAlert2.png
deleted file mode 100644
index bba68625d99e81bc9f4bc1509b00a95f2ac92e12..0000000000000000000000000000000000000000
Binary files a/src/icons/SweetAlert2.png and /dev/null differ
diff --git a/src/icons/Symfony.png b/src/icons/Symfony.png
deleted file mode 100644
index 0d3b4de8eb6318521b74fbd8d78f47d87ce2fd22..0000000000000000000000000000000000000000
Binary files a/src/icons/Symfony.png and /dev/null differ
diff --git a/src/icons/TencentWaterproofWall.png b/src/icons/TencentWaterproofWall.png
deleted file mode 100644
index 650138c868bde9ebd9faf62c4a03c76e24013f8a..0000000000000000000000000000000000000000
Binary files a/src/icons/TencentWaterproofWall.png and /dev/null differ
diff --git a/src/icons/Ticimax.png b/src/icons/Ticimax.png
deleted file mode 100644
index 4d566d818db85177c0795cece2c31f4efaa9d7d5..0000000000000000000000000000000000000000
Binary files a/src/icons/Ticimax.png and /dev/null differ
diff --git a/src/icons/TotalCode.png b/src/icons/TotalCode.png
deleted file mode 100644
index bc77f6d07a70ea0ccb820fd8680eea28c49d8734..0000000000000000000000000000000000000000
Binary files a/src/icons/TotalCode.png and /dev/null differ
diff --git a/src/icons/UserGuiding.svg b/src/icons/UserGuiding.svg
deleted file mode 100644
index f01fa5fbc004b8d452ae6fdb39b4acf7e514f495..0000000000000000000000000000000000000000
--- a/src/icons/UserGuiding.svg
+++ /dev/null
@@ -1,42 +0,0 @@
-
-
-
-
- UserGuiding .svg logo icon
-
-
-
-
-
diff --git a/src/icons/VTEX Integrated Store.png b/src/icons/VTEX Integrated Store.png
deleted file mode 100644
index 3459003b1853530e7bcf4614ccd52757f02689a2..0000000000000000000000000000000000000000
Binary files a/src/icons/VTEX Integrated Store.png and /dev/null differ
diff --git a/src/icons/Venda.png b/src/icons/Venda.png
deleted file mode 100644
index f24d572a39daf5de5517840a6bd6e79781d6b30a..0000000000000000000000000000000000000000
Binary files a/src/icons/Venda.png and /dev/null differ
diff --git a/src/icons/VideoJS.png b/src/icons/VideoJS.png
deleted file mode 100644
index 1b8a2938e2c22a3e921ed013ee4c82321b4a4469..0000000000000000000000000000000000000000
Binary files a/src/icons/VideoJS.png and /dev/null differ
diff --git a/src/icons/Visual WebGUI.png b/src/icons/Visual WebGUI.png
deleted file mode 100644
index eee252976c6447ce284ef86943fc687e7e5f52bb..0000000000000000000000000000000000000000
Binary files a/src/icons/Visual WebGUI.png and /dev/null differ
diff --git a/src/icons/Vue.js.png b/src/icons/Vue.js.png
deleted file mode 100644
index 2c33e395fb595bebbe0dfbf59e2c891e860ac6a0..0000000000000000000000000000000000000000
Binary files a/src/icons/Vue.js.png and /dev/null differ
diff --git a/src/icons/Webs.png b/src/icons/Webs.png
deleted file mode 100644
index c022e716f22f23111b5dcd2d2ac2b5e6785163a1..0000000000000000000000000000000000000000
Binary files a/src/icons/Webs.png and /dev/null differ
diff --git a/src/icons/WebsiteCreator.png b/src/icons/WebsiteCreator.png
deleted file mode 100644
index 3c25e14aae94a4507e642156a0b1619bbf216bc6..0000000000000000000000000000000000000000
Binary files a/src/icons/WebsiteCreator.png and /dev/null differ
diff --git a/src/icons/Weglot.png b/src/icons/Weglot.png
deleted file mode 100644
index 33da33a8aa270d26b71632089fc58bd7caf2717e..0000000000000000000000000000000000000000
Binary files a/src/icons/Weglot.png and /dev/null differ
diff --git a/src/icons/WindowsServer.png b/src/icons/WindowsServer.png
deleted file mode 100644
index 31f92d9e8fe419027fad5167843e0b0d6b837f14..0000000000000000000000000000000000000000
Binary files a/src/icons/WindowsServer.png and /dev/null differ
diff --git a/src/icons/Woltlab Community Framework.png b/src/icons/Woltlab Community Framework.png
deleted file mode 100644
index 680ffe468cf2caabb3dc8672316606d685d077ab..0000000000000000000000000000000000000000
Binary files a/src/icons/Woltlab Community Framework.png and /dev/null differ
diff --git a/src/icons/WooCommerce.png b/src/icons/WooCommerce.png
deleted file mode 100644
index 9772015ace2ab7827602cba5a689bd8f3eb9928f..0000000000000000000000000000000000000000
Binary files a/src/icons/WooCommerce.png and /dev/null differ
diff --git a/src/icons/Woosa.png b/src/icons/Woosa.png
deleted file mode 100644
index fbb0baaaa6dcbf50ff11978206947c704762d7d9..0000000000000000000000000000000000000000
Binary files a/src/icons/Woosa.png and /dev/null differ
diff --git a/src/icons/XpressEngine.png b/src/icons/XpressEngine.png
deleted file mode 100644
index b780e77b33d118dc44b6c686ec0f2fe36380df69..0000000000000000000000000000000000000000
Binary files a/src/icons/XpressEngine.png and /dev/null differ
diff --git a/src/icons/ZURB Foundation.png b/src/icons/ZURB Foundation.png
deleted file mode 100644
index 2e8240fbca9f7b25b0283007d3ba3079d8ce16ca..0000000000000000000000000000000000000000
Binary files a/src/icons/ZURB Foundation.png and /dev/null differ
diff --git a/src/icons/Zeuscart.png b/src/icons/Zeuscart.png
deleted file mode 100644
index abbca7bd2e28711a4da842fefad3f425f5fe51af..0000000000000000000000000000000000000000
Binary files a/src/icons/Zeuscart.png and /dev/null differ
diff --git a/src/icons/Zipkin.png b/src/icons/Zipkin.png
deleted file mode 100644
index e783a2ca10f7f43d93171606129154f2ff33b265..0000000000000000000000000000000000000000
Binary files a/src/icons/Zipkin.png and /dev/null differ
diff --git a/src/icons/acquia-cloud.png b/src/icons/acquia-cloud.png
deleted file mode 100644
index d85843e9af6419f0b03c600f0ed8abda7ad3f230..0000000000000000000000000000000000000000
Binary files a/src/icons/acquia-cloud.png and /dev/null differ
diff --git a/src/icons/adobedmt.png b/src/icons/adobedmt.png
deleted file mode 100644
index 0a74d4d36fc0d7b39fc3fa47f98c80d9ee4b0197..0000000000000000000000000000000000000000
Binary files a/src/icons/adobedmt.png and /dev/null differ
diff --git a/src/icons/all-in-One-SEO-Pack.png b/src/icons/all-in-One-SEO-Pack.png
deleted file mode 100644
index 16afdfa1b09577c749e446afad902c366791a8e1..0000000000000000000000000000000000000000
Binary files a/src/icons/all-in-One-SEO-Pack.png and /dev/null differ
diff --git a/src/icons/amplitude.png b/src/icons/amplitude.png
deleted file mode 100644
index be4f7245428edb2f06e80b37293e9fa37d4f6d96..0000000000000000000000000000000000000000
Binary files a/src/icons/amplitude.png and /dev/null differ
diff --git a/src/icons/arcgis_icon.png b/src/icons/arcgis_icon.png
deleted file mode 100644
index f743da00ec79f7d6698dd7d5cc235a5d92a13b7b..0000000000000000000000000000000000000000
Binary files a/src/icons/arcgis_icon.png and /dev/null differ
diff --git a/src/icons/aws-elb.png b/src/icons/aws-elb.png
deleted file mode 100644
index 8db61179600fd3682e7f5531f8c0b340701d3396..0000000000000000000000000000000000000000
Binary files a/src/icons/aws-elb.png and /dev/null differ
diff --git a/src/icons/bigbangshop.svg b/src/icons/bigbangshop.svg
deleted file mode 100644
index cfbeefd7b29691789bc85468cb94ccc418f3a9b5..0000000000000000000000000000000000000000
--- a/src/icons/bigbangshop.svg
+++ /dev/null
@@ -1 +0,0 @@
-logo_bbs
diff --git a/src/icons/bizweb.png b/src/icons/bizweb.png
deleted file mode 100644
index fbe062bb2e0e6a7d54227038f74e5aca5e70996f..0000000000000000000000000000000000000000
Binary files a/src/icons/bizweb.png and /dev/null differ
diff --git a/src/icons/bubble.png b/src/icons/bubble.png
deleted file mode 100644
index a5d9479ebd18abfa1ee9188665152e1c00d826cb..0000000000000000000000000000000000000000
Binary files a/src/icons/bubble.png and /dev/null differ
diff --git a/src/icons/chevereto.png b/src/icons/chevereto.png
deleted file mode 100644
index 81e189814c0aa7ef496817b71795029b4ea28230..0000000000000000000000000000000000000000
Binary files a/src/icons/chevereto.png and /dev/null differ
diff --git a/src/icons/coaster-cms.png b/src/icons/coaster-cms.png
deleted file mode 100644
index 9ec4dcf1ad8d64a6112fdca72fc02584a61ab3e1..0000000000000000000000000000000000000000
Binary files a/src/icons/coaster-cms.png and /dev/null differ
diff --git a/src/icons/coinimp.png b/src/icons/coinimp.png
deleted file mode 100644
index 80b82ded73a56f5310e93b5f629ac2f372cca2ba..0000000000000000000000000000000000000000
Binary files a/src/icons/coinimp.png and /dev/null differ
diff --git a/src/icons/coinlab.png b/src/icons/coinlab.png
deleted file mode 100644
index 0f059c5ef47d51c7e121a659dde9a3ad30578404..0000000000000000000000000000000000000000
Binary files a/src/icons/coinlab.png and /dev/null differ
diff --git a/src/icons/colormeshop.png b/src/icons/colormeshop.png
deleted file mode 100644
index af70496d85679b1d30e36d35bbf63ea441f72f39..0000000000000000000000000000000000000000
Binary files a/src/icons/colormeshop.png and /dev/null differ
diff --git a/src/icons/datadome.png b/src/icons/datadome.png
deleted file mode 100644
index 9c19fb1d7f19b35f95a376e95c4d0031bab95164..0000000000000000000000000000000000000000
Binary files a/src/icons/datadome.png and /dev/null differ
diff --git a/src/icons/deepminer.png b/src/icons/deepminer.png
deleted file mode 100644
index e85712f8eced9b00cc778aac1b3617bb30d9459e..0000000000000000000000000000000000000000
Binary files a/src/icons/deepminer.png and /dev/null differ
diff --git a/src/icons/eZ Publish.png b/src/icons/eZ Publish.png
deleted file mode 100644
index ec649027f146ebe8b02f2a6d9c04e6a4c105c06a..0000000000000000000000000000000000000000
Binary files a/src/icons/eZ Publish.png and /dev/null differ
diff --git a/src/icons/ensighten.png b/src/icons/ensighten.png
deleted file mode 100644
index 935be0caabeebde78af98fe2fec5dc49314cded6..0000000000000000000000000000000000000000
Binary files a/src/icons/ensighten.png and /dev/null differ
diff --git a/src/icons/epages.png b/src/icons/epages.png
deleted file mode 100644
index f80112cd161d0c2ddaf2d9277d6aec4376c1bafa..0000000000000000000000000000000000000000
Binary files a/src/icons/epages.png and /dev/null differ
diff --git a/src/icons/flarum.png b/src/icons/flarum.png
deleted file mode 100644
index fc3840330afa0b2916a2936bfd0593d7b0fac4c1..0000000000000000000000000000000000000000
Binary files a/src/icons/flarum.png and /dev/null differ
diff --git a/src/icons/freshchat.png b/src/icons/freshchat.png
deleted file mode 100644
index b79a05767d4f75dbba841393784abb05316d55ac..0000000000000000000000000000000000000000
Binary files a/src/icons/freshchat.png and /dev/null differ
diff --git a/src/icons/freshmarketer.png b/src/icons/freshmarketer.png
deleted file mode 100644
index 245f94dfefaafe189a20bbd29d3276722dbe6419..0000000000000000000000000000000000000000
Binary files a/src/icons/freshmarketer.png and /dev/null differ
diff --git a/src/icons/futureshop.png b/src/icons/futureshop.png
deleted file mode 100644
index da3bdf84bb3527b592385dba788030c9f2967de8..0000000000000000000000000000000000000000
Binary files a/src/icons/futureshop.png and /dev/null differ
diff --git a/src/icons/gosquared.png b/src/icons/gosquared.png
deleted file mode 100644
index d08059fc21199c9738472627edfa4fa0b65e38cc..0000000000000000000000000000000000000000
Binary files a/src/icons/gosquared.png and /dev/null differ
diff --git a/src/icons/hapi.js.png b/src/icons/hapi.js.png
deleted file mode 100644
index 0308945de66ecdfb6b49b2d26620e3bfb0d738ec..0000000000000000000000000000000000000000
Binary files a/src/icons/hapi.js.png and /dev/null differ
diff --git a/src/icons/hinza_advanced_cms.svg b/src/icons/hinza_advanced_cms.svg
deleted file mode 100644
index b3bbf8ba4fb103e05ea67eb04e89aca178efed94..0000000000000000000000000000000000000000
--- a/src/icons/hinza_advanced_cms.svg
+++ /dev/null
@@ -1,18 +0,0 @@
-
-
-
-
-ac
-
-
-
-
diff --git a/src/icons/iEXExchanger.png b/src/icons/iEXExchanger.png
deleted file mode 100644
index c237a251329117c757c5e88707ab33af59a20f77..0000000000000000000000000000000000000000
Binary files a/src/icons/iEXExchanger.png and /dev/null differ
diff --git a/src/icons/iWeb.png b/src/icons/iWeb.png
deleted file mode 100644
index cc7ad01620f74e5f2cda746b48cea4c8339e086a..0000000000000000000000000000000000000000
Binary files a/src/icons/iWeb.png and /dev/null differ
diff --git a/src/icons/idosellshop.png b/src/icons/idosellshop.png
deleted file mode 100644
index f7e921195a082d091cbac13368facd561afcd8fe..0000000000000000000000000000000000000000
Binary files a/src/icons/idosellshop.png and /dev/null differ
diff --git a/src/icons/inspectlet.png b/src/icons/inspectlet.png
deleted file mode 100644
index 7370bad21a17603d45e1e95bab6d10e4e39f63ec..0000000000000000000000000000000000000000
Binary files a/src/icons/inspectlet.png and /dev/null differ
diff --git a/src/icons/inwemo.png b/src/icons/inwemo.png
deleted file mode 100644
index 1dd0d690eb43ff3f60fac97eb864f67fc37e2787..0000000000000000000000000000000000000000
Binary files a/src/icons/inwemo.png and /dev/null differ
diff --git a/src/icons/ionic.png b/src/icons/ionic.png
deleted file mode 100644
index f1b7f2ec572203fc85ac04c770dd1601bb0bce6c..0000000000000000000000000000000000000000
Binary files a/src/icons/ionic.png and /dev/null differ
diff --git a/src/icons/koha.png b/src/icons/koha.png
deleted file mode 100644
index 3bdb0d68810b9815796fd135b5bcaee3b0340db2..0000000000000000000000000000000000000000
Binary files a/src/icons/koha.png and /dev/null differ
diff --git a/src/icons/laterpay.png b/src/icons/laterpay.png
deleted file mode 100644
index b425ec8e95fe7f691bff48fce7df16d2cdb0d993..0000000000000000000000000000000000000000
Binary files a/src/icons/laterpay.png and /dev/null differ
diff --git a/src/icons/meliscmsv2.png b/src/icons/meliscmsv2.png
deleted file mode 100644
index c545b2882c111dc67729a114e3d8e7e8377e7b13..0000000000000000000000000000000000000000
Binary files a/src/icons/meliscmsv2.png and /dev/null differ
diff --git a/src/icons/mhonarc.png b/src/icons/mhonarc.png
deleted file mode 100644
index c808de4236f781182d83d8cf939045fb9789dad8..0000000000000000000000000000000000000000
Binary files a/src/icons/mhonarc.png and /dev/null differ
diff --git a/src/icons/mietshop.png b/src/icons/mietshop.png
deleted file mode 100644
index b090dd9016b8798777f66bc045df7f779920efd8..0000000000000000000000000000000000000000
Binary files a/src/icons/mietshop.png and /dev/null differ
diff --git a/src/icons/mobirise.png b/src/icons/mobirise.png
deleted file mode 100644
index 8244640ea6c67ef58bd9aace6708d2ccb1b68129..0000000000000000000000000000000000000000
Binary files a/src/icons/mobirise.png and /dev/null differ
diff --git a/src/icons/monerominer.png b/src/icons/monerominer.png
deleted file mode 100644
index 5fb978053cba1ba5f4fb551b22d5a07470ad969f..0000000000000000000000000000000000000000
Binary files a/src/icons/monerominer.png and /dev/null differ
diff --git a/src/icons/mouseflow.png b/src/icons/mouseflow.png
deleted file mode 100644
index 471ca736080ee866933f138fc7483459f968863b..0000000000000000000000000000000000000000
Binary files a/src/icons/mouseflow.png and /dev/null differ
diff --git a/src/icons/mypage-platform.png b/src/icons/mypage-platform.png
deleted file mode 100644
index 99687ec479fed6a7e13ccc917f089ffc849a2b56..0000000000000000000000000000000000000000
Binary files a/src/icons/mypage-platform.png and /dev/null differ
diff --git a/src/icons/openEngine.png b/src/icons/openEngine.png
deleted file mode 100644
index a1257cd2e7bd8621fc67fabb0e525fa40f2b9796..0000000000000000000000000000000000000000
Binary files a/src/icons/openEngine.png and /dev/null differ
diff --git a/src/icons/osCSS.png b/src/icons/osCSS.png
deleted file mode 100644
index 9d797793b2753a43bae3acec6381b9ee0dd2b6d9..0000000000000000000000000000000000000000
Binary files a/src/icons/osCSS.png and /dev/null differ
diff --git a/src/icons/otrs.png b/src/icons/otrs.png
deleted file mode 100644
index 476d7420f379b8bf08619047d83b68f32311e51e..0000000000000000000000000000000000000000
Binary files a/src/icons/otrs.png and /dev/null differ
diff --git a/src/icons/paperjs.png b/src/icons/paperjs.png
deleted file mode 100644
index 37cb8a114a6f5690fec75309fa87c02cd050e3ca..0000000000000000000000000000000000000000
Binary files a/src/icons/paperjs.png and /dev/null differ
diff --git a/src/icons/pelican.png b/src/icons/pelican.png
deleted file mode 100644
index 3fffd485867bd8e31061891a2e50e9bf43ce3416..0000000000000000000000000000000000000000
Binary files a/src/icons/pelican.png and /dev/null differ
diff --git a/src/icons/phpCMS.png b/src/icons/phpCMS.png
deleted file mode 100644
index 9cfd4bcaaea6b6d77f6256e1f83ec46a09039e7c..0000000000000000000000000000000000000000
Binary files a/src/icons/phpCMS.png and /dev/null differ
diff --git a/src/icons/phpliteadmin.png b/src/icons/phpliteadmin.png
deleted file mode 100644
index 03487a2d357a62df1546e7b2692a7c2cbe1238e2..0000000000000000000000000000000000000000
Binary files a/src/icons/phpliteadmin.png and /dev/null differ
diff --git a/src/icons/projesoft.png b/src/icons/projesoft.png
deleted file mode 100644
index 77b9293dac634141fdc83ea9778ffa6961072dfa..0000000000000000000000000000000000000000
Binary files a/src/icons/projesoft.png and /dev/null differ
diff --git a/src/icons/redoc.png b/src/icons/redoc.png
deleted file mode 100644
index f99f5d48f8f09035512a14148f5a142cacb2a7f0..0000000000000000000000000000000000000000
Binary files a/src/icons/redoc.png and /dev/null differ
diff --git a/src/icons/revslider.png b/src/icons/revslider.png
deleted file mode 100644
index 3b2cd2ac5c3a6b021c96568dac8918bdf6976610..0000000000000000000000000000000000000000
Binary files a/src/icons/revslider.png and /dev/null differ
diff --git a/src/icons/shopline.png b/src/icons/shopline.png
deleted file mode 100644
index ebdb09d1486d8a31109349f0dd89a12aafed08d3..0000000000000000000000000000000000000000
Binary files a/src/icons/shopline.png and /dev/null differ
diff --git a/src/icons/signal.png b/src/icons/signal.png
deleted file mode 100644
index 56ac41aa5c821f51cac4ddba0ee6bebedea52610..0000000000000000000000000000000000000000
Binary files a/src/icons/signal.png and /dev/null differ
diff --git a/src/icons/styled-components.png b/src/icons/styled-components.png
deleted file mode 100644
index 8d24ba2cac0f432a2f2cb28b8ced9f417a2a8043..0000000000000000000000000000000000000000
Binary files a/src/icons/styled-components.png and /dev/null differ
diff --git a/src/icons/sucuri.png b/src/icons/sucuri.png
deleted file mode 100644
index ec4be30a3d541335addf6636356de0c04746c9e2..0000000000000000000000000000000000000000
Binary files a/src/icons/sucuri.png and /dev/null differ
diff --git a/src/icons/svbtle.png b/src/icons/svbtle.png
deleted file mode 100644
index 235e1eb028e59702fe4cdbc8f9ae0efae89a4e86..0000000000000000000000000000000000000000
Binary files a/src/icons/svbtle.png and /dev/null differ
diff --git a/src/icons/sympa.png b/src/icons/sympa.png
deleted file mode 100644
index 288e92224ec4bed330dd93715400d8b09c9cbaf8..0000000000000000000000000000000000000000
Binary files a/src/icons/sympa.png and /dev/null differ
diff --git a/src/icons/total.js.png b/src/icons/total.js.png
deleted file mode 100644
index e7d137915696ded837558459f0f68a24a274ca18..0000000000000000000000000000000000000000
Binary files a/src/icons/total.js.png and /dev/null differ
diff --git a/src/icons/transifex.png b/src/icons/transifex.png
deleted file mode 100644
index 4c90c29a67ec9625c5b029c5896dca2c2c0bb3f3..0000000000000000000000000000000000000000
Binary files a/src/icons/transifex.png and /dev/null differ
diff --git a/src/icons/tray.png b/src/icons/tray.png
deleted file mode 100644
index 66d51076539e57f9dbc26ab65e5dcc368bf49a9a..0000000000000000000000000000000000000000
Binary files a/src/icons/tray.png and /dev/null differ
diff --git a/src/icons/uCore.png b/src/icons/uCore.png
deleted file mode 100644
index 5f5da3de3826af8170ad9f468dc43edf5c7b597a..0000000000000000000000000000000000000000
Binary files a/src/icons/uCore.png and /dev/null differ
diff --git a/src/icons/vigbo.png b/src/icons/vigbo.png
deleted file mode 100644
index e14e507f1845f42f412cb7e7824fb30f8bacfa48..0000000000000000000000000000000000000000
Binary files a/src/icons/vigbo.png and /dev/null differ
diff --git a/src/icons/webdev.png b/src/icons/webdev.png
deleted file mode 100644
index a37ce3ec83faa0f6269df3d99521f9fe678d9a40..0000000000000000000000000000000000000000
Binary files a/src/icons/webdev.png and /dev/null differ
diff --git a/src/icons/webmine.png b/src/icons/webmine.png
deleted file mode 100644
index ba3534e5a73dd7d514aa59fdec102db154e9b465..0000000000000000000000000000000000000000
Binary files a/src/icons/webmine.png and /dev/null differ
diff --git a/src/icons/websocket.png b/src/icons/websocket.png
deleted file mode 100644
index 7d94f1073717ab8511cb229d460a86cc42d20f8c..0000000000000000000000000000000000000000
Binary files a/src/icons/websocket.png and /dev/null differ
diff --git a/src/icons/xeora.png b/src/icons/xeora.png
deleted file mode 100644
index 36151f12ff591b31b41e0e28dcfb561e4970e5cd..0000000000000000000000000000000000000000
Binary files a/src/icons/xeora.png and /dev/null differ
diff --git a/src/icons/xonic.png b/src/icons/xonic.png
deleted file mode 100644
index 77f6d9e1755bf7a7e0171ffac620ddb2c976b033..0000000000000000000000000000000000000000
Binary files a/src/icons/xonic.png and /dev/null differ
diff --git a/src/icons/xwiki.png b/src/icons/xwiki.png
deleted file mode 100644
index cba1e5440bdaffd1c5abed05c164918dcf11b07b..0000000000000000000000000000000000000000
Binary files a/src/icons/xwiki.png and /dev/null differ
diff --git a/src/icons/yepcomm.png b/src/icons/yepcomm.png
deleted file mode 100644
index 4b987b382f335559068775ec230582d0c1a7864b..0000000000000000000000000000000000000000
Binary files a/src/icons/yepcomm.png and /dev/null differ
diff --git a/src/icons/zeit.svg b/src/icons/zeit.svg
deleted file mode 100644
index 8ce0bfb63fe2d8b469f0fd5948b786664fbc725d..0000000000000000000000000000000000000000
--- a/src/icons/zeit.svg
+++ /dev/null
@@ -1 +0,0 @@
-Zeit Created with Sketch.
\ No newline at end of file
diff --git a/src/package.json b/src/package.json
new file mode 100644
index 0000000000000000000000000000000000000000..e9aba8300b3253cf2d1d751bfb5a28d6a58341bb
--- /dev/null
+++ b/src/package.json
@@ -0,0 +1,30 @@
+{
+ "name": "wappalyzer-core",
+ "description": "Identify technology on websites",
+ "keywords": [
+ "analyze",
+ "identify",
+ "detect",
+ "detector",
+ "technology",
+ "cms",
+ "framework",
+ "library",
+ "software"
+ ],
+ "homepage": "https://www.wappalyzer.com",
+ "version": "6.2.6",
+ "author": "Wappalyzer",
+ "license": "MIT",
+ "repository": {
+ "type": "git",
+ "url": "https://github.com/aliasio/wappalyzer"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/aliasio"
+ },
+ "main": "wappalyzer.js",
+ "files": [
+ "wappalyzer.js"
+ ]
+}
diff --git a/src/wappalyzer.js b/src/wappalyzer.js
index 7a2c3e3683bc5dab97fae487db3b60fb4efbd640..07f87ee9e2069253756f122f6a65b256d5bec3ae 100644
--- a/src/wappalyzer.js
+++ b/src/wappalyzer.js
@@ -1,672 +1,411 @@
-/**
- * Wappalyzer v5
- *
- * Created by Elbert Alias
- *
- * License: GPLv3 http://www.gnu.org/licenses/gpl-3.0.txt
- */
-
-const validation = {
- hostname: /(www.)?((.+?)\.(([a-z]{2,3}\.)?[a-z]{2,6}))$/,
- hostnameBlacklist: /((local|dev(elopment)?|stag(e|ing)?|test(ing)?|demo(shop)?|admin|google|cache)\.|\/admin|\.local)/,
-};
-
-/**
- * Enclose string in array
- */
-function asArray(value) {
- return value instanceof Array ? value : [value];
-}
-
-/**
- *
- */
-function asyncForEach(iterable, iterator) {
- return Promise.all((iterable || [])
- .map(item => new Promise(resolve => setTimeout(() => resolve(iterator(item)), 1))));
-}
-
-/**
- * Mark application as detected, set confidence and version
- */
-function addDetected(app, pattern, type, value, key) {
- app.detected = true;
+'use strict'
- // Set confidence level
- app.confidence[`${type} ${key ? `${key} ` : ''}${pattern.regex}`] = pattern.confidence === undefined ? 100 : parseInt(pattern.confidence, 10);
+const Wappalyzer = {
+ technologies: [],
+ categories: [],
- // Detect version number
- if (pattern.version) {
- const versions = [];
- const matches = pattern.regex.exec(value);
+ slugify(string) {
+ return string
+ .toLowerCase()
+ .replace(/[^a-z0-9-]/g, '-')
+ .replace(/--+/g, '-')
+ .replace(/(?:^-|-$)/, '')
+ },
- let { version } = pattern;
-
- if (matches) {
- matches.forEach((match, i) => {
- // Parse ternary operator
- const ternary = new RegExp(`\\\\${i}\\?([^:]+):(.*)$`).exec(version);
-
- if (ternary && ternary.length === 3) {
- version = version.replace(ternary[0], match ? ternary[1] : ternary[2]);
- }
+ getTechnology(name) {
+ return Wappalyzer.technologies.find(({ name: _name }) => name === _name)
+ },
- // Replace back references
- version = version.trim().replace(new RegExp(`\\\\${i}`, 'g'), match || '');
- });
-
- if (version && versions.indexOf(version) === -1) {
- versions.push(version);
- }
-
- if (versions.length) {
- // Use the longest detected version number
- app.version = versions.reduce((a, b) => (a.length > b.length ? a : b));
- }
- }
- }
-}
-
-function resolveExcludes(apps, detected) {
- const excludes = [];
- const detectedApps = Object.assign({}, apps, detected);
-
- // Exclude app in detected apps only
- Object.keys(detectedApps).forEach((appName) => {
- const app = detectedApps[appName];
-
- if (app.props.excludes) {
- asArray(app.props.excludes).forEach((excluded) => {
- excludes.push(excluded);
- });
- }
- });
-
- // Remove excluded applications
- Object.keys(apps).forEach((appName) => {
- if (excludes.indexOf(appName) > -1) {
- delete apps[appName];
- }
- });
-}
-
-class Application {
- constructor(name, props, detected) {
- this.confidence = {};
- this.confidenceTotal = 0;
- this.detected = Boolean(detected);
- this.excludes = [];
- this.name = name;
- this.props = props;
- this.version = '';
- }
+ getCategory(id) {
+ return Wappalyzer.categories.find(({ id: _id }) => id === _id)
+ },
/**
- * Calculate confidence total
+ * Resolve promises for implied technology.
+ * @param {Array} detections
*/
- getConfidence() {
- let total = 0;
-
- Object.keys(this.confidence).forEach((id) => {
- total += this.confidence[id];
- });
-
- this.confidenceTotal = Math.min(total, 100);
-
- return this.confidenceTotal;
- }
-}
-
-class Wappalyzer {
- constructor() {
- this.apps = {};
- this.categories = {};
- this.driver = {};
- this.jsPatterns = {};
- this.detected = {};
- this.hostnameCache = {};
- this.adCache = [];
-
- this.config = {
- websiteURL: 'https://www.wappalyzer.com/',
- twitterURL: 'https://twitter.com/Wappalyzer',
- githubURL: 'https://github.com/AliasIO/Wappalyzer',
- };
- }
-
- /**
- * Log messages to console
- */
- log(message, source, type) {
- if (this.driver.log) {
- this.driver.log(message, source || '', type || 'debug');
- }
- }
-
- analyze(url, data, context) {
- const apps = {};
- const promises = [];
- const startTime = new Date();
- const {
- scripts,
- cookies,
- headers,
- js,
- } = data;
-
- let { html } = data;
-
- if (this.detected[url.canonical] === undefined) {
- this.detected[url.canonical] = {};
- }
-
- const metaTags = [];
-
- // Additional information
- let language = null;
-
- if (html) {
- if (typeof html !== 'string') {
- html = '';
- }
-
- let matches = data.html.match(new RegExp(']*[: ]lang="([a-z]{2}((-|_)[A-Z]{2})?)"', 'i'));
-
- language = matches && matches.length ? matches[1] : null;
-
- // Meta tags
- const regex = / ]+>/ig;
-
- do {
- matches = regex.exec(html);
-
- if (!matches) {
- break;
- }
-
- metaTags.push(matches[0]);
- } while (matches);
- }
-
- Object.keys(this.apps).forEach((appName) => {
- apps[appName] = this.detected[url.canonical] && this.detected[url.canonical][appName]
- ? this.detected[url.canonical][appName]
- : new Application(appName, this.apps[appName]);
-
- const app = apps[appName];
-
- promises.push(this.analyzeUrl(app, url));
-
- if (html) {
- promises.push(this.analyzeHtml(app, html));
- promises.push(this.analyzeMeta(app, metaTags));
- }
-
- if (scripts) {
- promises.push(this.analyzeScripts(app, scripts));
- }
-
- if (cookies) {
- promises.push(this.analyzeCookies(app, cookies));
- }
-
- if (headers) {
- promises.push(this.analyzeHeaders(app, headers));
- }
- });
-
- if (js) {
- Object.keys(js).forEach((appName) => {
- if (typeof js[appName] !== 'function') {
- promises.push(this.analyzeJs(apps[appName], js[appName]));
- }
- });
- }
-
- return new Promise(async (resolve) => {
- await Promise.all(promises);
-
- Object.keys(apps).forEach((appName) => {
- const app = apps[appName];
-
- if (!app.detected || !app.getConfidence()) {
- delete apps[app.name];
- }
- });
-
- resolveExcludes(apps, this.detected[url]);
- this.resolveImplies(apps, url.canonical);
-
- this.cacheDetectedApps(apps, url.canonical);
- this.trackDetectedApps(apps, url, language);
-
- this.log(`Processing ${Object.keys(data).join(', ')} took ${((new Date() - startTime) / 1000).toFixed(2)}s (${url.hostname})`, 'core');
-
- if (Object.keys(apps).length) {
- this.log(`Identified ${Object.keys(apps).join(', ')} (${url.hostname})`, 'core');
- }
-
- this.driver.displayApps(this.detected[url.canonical], { language }, context);
-
- return resolve();
- });
- }
-
- /**
- * Cache detected ads
- */
- cacheDetectedAds(ad) {
- this.adCache.push(ad);
- }
-
- /**
- *
- */
- robotsTxtAllows(url) {
- return new Promise(async (resolve, reject) => {
- const parsed = this.parseUrl(url);
-
- if (parsed.protocol !== 'http:' && parsed.protocol !== 'https:') {
- return reject();
- }
-
- const robotsTxt = await this.driver.getRobotsTxt(parsed.host, parsed.protocol === 'https:');
+ resolve(detections = []) {
+ const resolved = detections.reduce((resolved, { technology }) => {
+ if (
+ resolved.findIndex(
+ ({ technology: { name } }) => name === technology.name
+ ) === -1
+ ) {
+ let version = ''
+ let confidence = 0
+
+ detections
+ .filter(({ technology }) => technology)
+ .forEach(
+ ({ technology: { name }, pattern, version: _version = '' }) => {
+ if (name === technology.name) {
+ confidence = Math.min(100, confidence + pattern.confidence)
+ version =
+ _version.length > version.length && _version.length <= 10
+ ? _version
+ : version
+ }
+ }
+ )
- if (robotsTxt.some(disallowedPath => parsed.pathname.indexOf(disallowedPath) === 0)) {
- return reject();
+ resolved.push({ technology, confidence, version })
}
- return resolve();
- });
- }
-
- /**
- * Parse a URL
- */
- parseUrl(url) {
- const a = this.driver.document.createElement('a');
-
- a.href = url;
-
- a.canonical = `${a.protocol}//${a.host}${a.pathname}`;
-
- return a;
- }
+ return resolved
+ }, [])
+
+ Wappalyzer.resolveExcludes(resolved)
+ Wappalyzer.resolveImplies(resolved)
+
+ const priority = ({ technology: { categories } }) =>
+ categories.reduce(
+ (max, id) => Math.max(max, Wappalyzer.getCategory(id).priority),
+ 0
+ )
+
+ return resolved
+ .sort((a, b) => (priority(a) > priority(b) ? 1 : -1))
+ .map(
+ ({
+ technology: { name, slug, categories, icon, website, cpe },
+ confidence,
+ version
+ }) => ({
+ name,
+ slug,
+ categories: categories.map((id) => Wappalyzer.getCategory(id)),
+ confidence,
+ version,
+ icon,
+ website,
+ cpe
+ })
+ )
+ },
/**
- *
+ * Resolve promises for version of technology.
+ * @param {Promise} resolved
*/
- static parseRobotsTxt(robotsTxt) {
- const disallow = [];
+ resolveVersion({ version, regex }, match) {
+ let resolved = version
- let userAgent;
-
- robotsTxt.split('\n').forEach((line) => {
- let matches = /^User-agent:\s*(.+)$/i.exec(line.trim());
+ if (version) {
+ const matches = regex.exec(match)
if (matches) {
- userAgent = matches[1].toLowerCase();
- } else if (userAgent === '*' || userAgent === 'wappalyzer') {
- matches = /^Disallow:\s*(.+)$/i.exec(line.trim());
+ matches.forEach((match, index) => {
+ // Parse ternary operator
+ const ternary = new RegExp(`\\\\${index}\\?([^:]+):(.*)$`).exec(
+ version
+ )
+
+ if (ternary && ternary.length === 3) {
+ resolved = version.replace(
+ ternary[0],
+ match ? ternary[1] : ternary[2]
+ )
+ }
- if (matches) {
- disallow.push(matches[1]);
- }
+ // Replace back references
+ resolved = resolved
+ .trim()
+ .replace(new RegExp(`\\\\${index}`, 'g'), match || '')
+ })
}
- });
-
- return disallow;
- }
-
- /**
- *
- */
- ping() {
- if (Object.keys(this.hostnameCache).length > 100) {
- this.driver.ping(this.hostnameCache);
-
- this.hostnameCache = {};
}
- if (this.adCache.length > 50) {
- this.driver.ping({}, this.adCache);
-
- this.adCache = [];
- }
- }
+ return resolved
+ },
/**
- * Parse apps.json patterns
+ * Resolve promises for excluded technology.
+ * @param {Promise} resolved
*/
- parsePatterns(patterns) {
- if (!patterns) {
- return [];
- }
-
- let parsed = {};
-
- // Convert string to object containing array containing string
- if (typeof patterns === 'string' || patterns instanceof Array) {
- patterns = {
- main: asArray(patterns),
- };
- }
-
- Object.keys(patterns).forEach((key) => {
- parsed[key] = [];
+ resolveExcludes(resolved) {
+ resolved.forEach(({ technology }) => {
+ technology.excludes.forEach(({ name }) => {
+ const excluded = Wappalyzer.getTechnology(name)
- asArray(patterns[key]).forEach((pattern) => {
- const attrs = {};
-
- pattern.split('\\;').forEach((attr, i) => {
- if (i) {
- // Key value pairs
- attr = attr.split(':');
-
- if (attr.length > 1) {
- attrs[attr.shift()] = attr.join(':');
- }
- } else {
- attrs.string = attr;
-
- try {
- attrs.regex = new RegExp(attr.replace('/', '\/'), 'i'); // Escape slashes in regular expression
- } catch (error) {
- attrs.regex = new RegExp();
-
- this.log(`${error.message}: ${attr}`, 'error', 'core');
- }
- }
- });
-
- parsed[key].push(attrs);
- });
- });
+ if (!excluded) {
+ throw new Error(`Excluded technology does not exist: ${name}`)
+ }
- // Convert back to array if the original pattern list was an array (or string)
- if ('main' in parsed) {
- parsed = parsed.main;
- }
+ const index = resolved.findIndex(({ name }) => name === excluded.name)
- return parsed;
- }
+ if (index !== -1) {
+ resolved.splice(index, 1)
+ }
+ })
+ })
+ },
/**
- * Parse JavaScript patterns
+ * Resolve promises for implied technology.
+ * @param {Promise} resolved
*/
- parseJsPatterns() {
- Object.keys(this.apps).forEach((appName) => {
- if (this.apps[appName].js) {
- this.jsPatterns[appName] = this.parsePatterns(this.apps[appName].js);
- }
- });
- }
-
- resolveImplies(apps, url) {
- let checkImplies = true;
+ resolveImplies(resolved) {
+ let done = false
- const resolve = (appName) => {
- const app = apps[appName];
+ while (resolved.length && !done) {
+ resolved.forEach(({ technology, confidence }) => {
+ done = true
- if (app && app.props.implies) {
- asArray(app.props.implies).forEach((implied) => {
- [implied] = this.parsePatterns(implied);
+ technology.implies.forEach(({ name, confidence: _confidence }) => {
+ const implied = Wappalyzer.getTechnology(name)
- if (!this.apps[implied.string]) {
- this.log(`Implied application ${implied.string} does not exist`, 'core', 'warn');
-
- return;
+ if (!implied) {
+ throw new Error(`Implied technology does not exist: ${name}`)
}
- if (!(implied.string in apps)) {
- apps[implied.string] = this.detected[url] && this.detected[url][implied.string]
- ? this.detected[url][implied.string]
- : new Application(implied.string, this.apps[implied.string], true);
-
- checkImplies = true;
+ if (
+ resolved.findIndex(
+ ({ technology: { name } }) => name === implied.name
+ ) === -1
+ ) {
+ resolved.push({
+ technology: implied,
+ confidence: Math.min(confidence, _confidence),
+ version: ''
+ })
+
+ done = false
}
-
- // Apply app confidence to implied app
- Object.keys(app.confidence).forEach((id) => {
- apps[implied.string].confidence[`${id} implied by ${appName}`] = app.confidence[id] * (implied.confidence === undefined ? 1 : implied.confidence / 100);
- });
- });
- }
- };
-
- // Implied applications
- // Run several passes as implied apps may imply other apps
- while (checkImplies) {
- checkImplies = false;
-
- Object.keys(apps).forEach(resolve);
+ })
+ })
}
- }
+ },
/**
- * Cache detected applications
+ * Initialize analyzation.
+ * @param {*} param0
*/
- cacheDetectedApps(apps, url) {
- Object.keys(apps).forEach((appName) => {
- const app = apps[appName];
-
- // Per URL
- this.detected[url][appName] = app;
-
- Object.keys(app.confidence)
- .forEach((id) => {
- this.detected[url][appName].confidence[id] = app.confidence[id];
- });
- });
-
- if (this.driver.ping instanceof Function) {
- this.ping();
+ analyze({ url, html, robots, meta, headers, cookies, scripts }) {
+ const oo = Wappalyzer.analyzeOneToOne
+ const om = Wappalyzer.analyzeOneToMany
+ const mm = Wappalyzer.analyzeManyToMany
+
+ const flatten = (array) => Array.prototype.concat.apply([], array)
+
+ try {
+ const detections = flatten(
+ Wappalyzer.technologies.map((technology) =>
+ flatten([
+ oo(technology, 'url', url),
+ oo(technology, 'html', html),
+ oo(technology, 'robots', robots),
+ om(technology, 'scripts', scripts),
+ mm(technology, 'cookies', cookies),
+ mm(technology, 'meta', meta),
+ mm(technology, 'headers', headers)
+ ])
+ )
+ ).filter((technology) => technology)
+
+ return detections
+ } catch (error) {
+ throw new Error(error.message || error.toString())
}
- }
+ },
/**
- * Track detected applications
+ * Extract technologies from data collected.
+ * @param {*object} data
*/
- trackDetectedApps(apps, url, language) {
- if (!(this.driver.ping instanceof Function)) {
- return;
- }
-
- const hostname = `${url.protocol}//${url.hostname}`;
-
- Object.keys(apps).forEach((appName) => {
- const app = apps[appName];
-
- if (this.detected[url.canonical][appName].getConfidence() >= 100) {
- if (
- validation.hostname.test(url.hostname)
- && !validation.hostnameBlacklist.test(url.hostname)
- ) {
- if (!(hostname in this.hostnameCache)) {
- this.hostnameCache[hostname] = {
- applications: {},
- meta: {},
- };
- }
-
- if (!(appName in this.hostnameCache[hostname].applications)) {
- this.hostnameCache[hostname].applications[appName] = {
- hits: 0,
- };
- }
-
- this.hostnameCache[hostname].applications[appName].hits += 1;
-
- if (apps[appName].version) {
- this.hostnameCache[hostname].applications[appName].version = app.version;
- }
- }
- }
- });
-
- if (hostname in this.hostnameCache) {
- this.hostnameCache[hostname].meta.language = language;
- }
-
- this.ping();
- }
+ setTechnologies(data) {
+ const transform = Wappalyzer.transformPatterns
+
+ Wappalyzer.technologies = Object.keys(data).reduce((technologies, name) => {
+ const {
+ cats,
+ url,
+ html,
+ robots,
+ meta,
+ headers,
+ cookies,
+ script,
+ js,
+ implies,
+ excludes,
+ icon,
+ website,
+ cpe
+ } = data[name]
+
+ technologies.push({
+ name,
+ categories: cats || [],
+ slug: Wappalyzer.slugify(name),
+ url: transform(url),
+ headers: transform(headers),
+ cookies: transform(cookies),
+ html: transform(html),
+ robots: transform(robots),
+ meta: transform(meta),
+ scripts: transform(script),
+ js: transform(js, true),
+ implies: transform(implies).map(({ value, confidence }) => ({
+ name: value,
+ confidence
+ })),
+ excludes: transform(excludes).map(({ value }) => ({
+ name: value
+ })),
+ icon: icon || 'default.svg',
+ website: website || null,
+ cpe: cpe || null
+ })
+
+ return technologies
+ }, [])
+ },
/**
- * Analyze URL
+ * Assign categories for data.
+ * @param {Object} data
*/
- analyzeUrl(app, url) {
- const patterns = this.parsePatterns(app.props.url);
-
- if (!patterns.length) {
- return Promise.resolve();
- }
-
- return asyncForEach(patterns, (pattern) => {
- if (pattern.regex.test(url.canonical)) {
- addDetected(app, pattern, 'url', url.canonical);
- }
- });
- }
+ setCategories(data) {
+ Wappalyzer.categories = Object.keys(data)
+ .reduce((categories, id) => {
+ const category = data[id]
+
+ categories.push({
+ id: parseInt(id, 10),
+ slug: Wappalyzer.slugify(category.name),
+ ...category
+ })
+
+ return categories
+ }, [])
+ .sort(({ priority: a }, { priority: b }) => (a > b ? -1 : 0))
+ },
/**
- * Analyze HTML
+ * Extract information from regex pattern.
+ * @param {string|array} patterns
*/
- analyzeHtml(app, html) {
- const patterns = this.parsePatterns(app.props.html);
-
- if (!patterns.length) {
- return Promise.resolve();
+ transformPatterns(patterns, caseSensitive = false) {
+ if (!patterns) {
+ return []
}
- return asyncForEach(patterns, (pattern) => {
- if (pattern.regex.test(html)) {
- addDetected(app, pattern, 'html', html);
- }
- });
- }
-
- /**
- * Analyze script tag
- */
- analyzeScripts(app, scripts) {
- const patterns = this.parsePatterns(app.props.script);
+ const toArray = (value) => (Array.isArray(value) ? value : [value])
- if (!patterns.length) {
- return Promise.resolve();
+ if (typeof patterns === 'string' || Array.isArray(patterns)) {
+ patterns = { main: patterns }
}
- return asyncForEach(patterns, (pattern) => {
- scripts.forEach((uri) => {
- if (pattern.regex.test(uri)) {
- addDetected(app, pattern, 'script', uri);
- }
- });
- });
- }
-
- /**
- * Analyze meta tag
- */
- analyzeMeta(app, metaTags) {
- const patterns = this.parsePatterns(app.props.meta);
- const promises = [];
-
- if (!app.props.meta) {
- return Promise.resolve();
- }
+ const parsed = Object.keys(patterns).reduce((parsed, key) => {
+ parsed[caseSensitive ? key : key.toLowerCase()] = toArray(
+ patterns[key]
+ ).map((pattern) => {
+ const { value, regex, confidence, version } = pattern
+ .split('\\;')
+ .reduce((attrs, attr, i) => {
+ if (i) {
+ // Key value pairs
+ attr = attr.split(':')
+
+ if (attr.length > 1) {
+ attrs[attr.shift()] = attr.join(':')
+ }
+ } else {
+ attrs.value = attr
- metaTags.forEach((match) => {
- Object.keys(patterns).forEach((meta) => {
- const r = new RegExp(`(?:name|property)=["']${meta}["']`, 'i');
+ // Escape slashes in regular expression
+ attrs.regex = new RegExp(attr.replace(/\//g, '\\/'), 'i')
+ }
- if (r.test(match)) {
- const content = match.match(/content=("|')([^"']+)("|')/i);
+ return attrs
+ }, {})
- promises.push(asyncForEach(patterns[meta], (pattern) => {
- if (content && content.length === 4 && pattern.regex.test(content[2])) {
- addDetected(app, pattern, 'meta', content[2], meta);
- }
- }));
+ return {
+ value,
+ regex,
+ confidence: parseInt(confidence || 100, 10),
+ version: version || ''
}
- });
- });
+ })
- return Promise.all(promises);
- }
+ return parsed
+ }, {})
+
+ return 'main' in parsed ? parsed.main : parsed
+ },
/**
- * Analyze response headers
+ * @todo describe
+ * @param {Object} technology
+ * @param {String} type
+ * @param {String} value
*/
- analyzeHeaders(app, headers) {
- const patterns = this.parsePatterns(app.props.headers);
- const promises = [];
-
- Object.keys(patterns).forEach((headerName) => {
- if (typeof patterns[headerName] !== 'function') {
- promises.push(asyncForEach(patterns[headerName], (pattern) => {
- headerName = headerName.toLowerCase();
-
- if (headerName in headers) {
- headers[headerName].forEach((headerValue) => {
- if (pattern.regex.test(headerValue)) {
- addDetected(app, pattern, 'headers', headerValue, headerName);
- }
- });
- }
- }));
+ analyzeOneToOne(technology, type, value) {
+ return technology[type].reduce((technologies, pattern) => {
+ if (pattern.regex.test(value)) {
+ technologies.push({
+ technology,
+ pattern,
+ version: Wappalyzer.resolveVersion(pattern, value)
+ })
}
- });
- return promises ? Promise.all(promises) : Promise.resolve();
- }
+ return technologies
+ }, [])
+ },
/**
- * Analyze cookies
+ * @todo update
+ * @param {Object} technology
+ * @param {String} type
+ * @param {Array} items
*/
- analyzeCookies(app, cookies) {
- const patterns = this.parsePatterns(app.props.cookies);
- const promises = [];
-
- Object.keys(patterns).forEach((cookieName) => {
- if (typeof patterns[cookieName] !== 'function') {
- const cookieNameLower = cookieName.toLowerCase();
-
- promises.push(asyncForEach(patterns[cookieName], (pattern) => {
- const cookie = cookies.find(_cookie => _cookie.name.toLowerCase() === cookieNameLower);
-
- if (cookie && pattern.regex.test(cookie.value)) {
- addDetected(app, pattern, 'cookies', cookie.value, cookieName);
- }
- }));
- }
- });
+ analyzeOneToMany(technology, type, items = []) {
+ return items.reduce((technologies, value) => {
+ const patterns = technology[type] || []
+
+ patterns.forEach((pattern) => {
+ if (pattern.regex.test(value)) {
+ technologies.push({
+ technology,
+ pattern,
+ version: Wappalyzer.resolveVersion(pattern, value)
+ })
+ }
+ })
- return promises ? Promise.all(promises) : Promise.resolve();
- }
+ return technologies
+ }, [])
+ },
/**
- * Analyze JavaScript variables
+ *
+ * @param {Object} technology
+ * @param {String} type
+ * @param {Array} items
*/
- analyzeJs(app, results) {
- const promises = [];
-
- Object.keys(results).forEach((string) => {
- if (typeof results[string] !== 'function') {
- promises.push(asyncForEach(Object.keys(results[string]), (index) => {
- const pattern = this.jsPatterns[app.name][string][index];
- const value = results[string][index];
-
- if (pattern && pattern.regex.test(value)) {
- addDetected(app, pattern, 'js', value, string);
+ analyzeManyToMany(technology, type, items = {}) {
+ return Object.keys(technology[type]).reduce((technologies, key) => {
+ const patterns = technology[type][key] || []
+ const values = items[key] || []
+
+ patterns.forEach((pattern) => {
+ values.forEach((value) => {
+ if (pattern.regex.test(value)) {
+ technologies.push({
+ technology,
+ pattern,
+ version: Wappalyzer.resolveVersion(pattern, value)
+ })
}
- }));
- }
- });
+ })
+ })
- return promises ? Promise.all(promises) : Promise.resolve();
+ return technologies
+ }, [])
}
}
-if (typeof module === 'object') {
- module.exports = Wappalyzer;
+if (typeof module !== 'undefined') {
+ module.exports = Wappalyzer
}
diff --git a/src/wappalyzer.spec.js b/src/wappalyzer.spec.js
deleted file mode 100644
index f51d7fb10f539c686b1b2622c3f76ecdf374b4c4..0000000000000000000000000000000000000000
--- a/src/wappalyzer.spec.js
+++ /dev/null
@@ -1,278 +0,0 @@
-/* eslint-env mocha */
-
-const { assert, expect } = require('chai');
-const Wappalyzer = require('../src/wappalyzer');
-
-const appsJson = {
- appUrl: {
- url: 'test',
- },
- appCookies: {
- cookies: {
- test: 'test',
- },
- },
- appUppercaseCookies: {
- cookies: {
- Test: 'Test',
- },
- },
- appHeaders: {
- headers: {
- 'X-Powered-By': 'test',
- },
- },
- appHtml: {
- html: 'test v(\\d)\\;confidence:50\\;version:\\1',
- implies: 'appImplies',
- excludes: 'appExcludes',
- },
- appMeta: {
- meta: {
- generator: 'test',
- },
- },
- appScript: {
- script: 'test',
- },
- appJs: {
- js: {
- key: 'value',
- },
- },
- appImplies: {
- },
- appExcludes: {
- html: 'test',
- },
-};
-
-const driverData = {
- cookies: [
- {
- name: 'test',
- value: 'test',
- domain: '',
- path: '',
- },
- ],
- headers: {
- 'x-powered-by': [
- 'test',
- ],
- },
- html: ' html test v1',
- scripts: [
- 'test',
- ],
- js: {
- appJs: {
- key: [
- 'value',
- ],
- },
- },
-};
-
-describe('Wappalyzer', () => {
- describe('#analyze()', () => {
- let apps;
-
- before(async () => {
- const wappalyzer = new Wappalyzer();
-
- wappalyzer.apps = appsJson;
-
- wappalyzer.parseJsPatterns();
-
- wappalyzer.driver.displayApps = (detected) => {
- apps = detected;
- };
-
- await wappalyzer.analyze({ canonical: 'test' }, driverData);
- });
-
- it('should identify technologies using URLs', () => {
- expect(apps).to.have.any.keys('appUrl');
- });
-
- it('should identify technologies using HTML', () => {
- expect(apps).to.have.any.keys('appHtml');
- });
-
- it('should identify technologies using meta tags', () => {
- expect(apps).to.have.any.keys('appMeta');
- });
-
- it('should identify technologies using script URLs', () => {
- expect(apps).to.have.any.keys('appScript');
- });
-
- it('should identify technologies using headers', () => {
- expect(apps).to.have.any.keys('appHeaders');
- });
-
- it('should identify technologies using cookies', () => {
- expect(apps).to.have.any.keys('appCookies');
- });
-
- it('should identify technologies using uppercase named cookies', () => {
- expect(apps).to.have.any.keys('appUppercaseCookies');
- });
-
- it('should identify technologies using JavaScript', () => {
- expect(apps).to.have.any.keys('appJs');
- });
-
- it('should return the implied technology', () => {
- expect(apps).to.have.any.keys('appImplies');
- });
-
- it('should not return the excluded technology', () => {
- expect(apps).to.not.have.any.keys('appExcludes');
- });
-
- it('should return the confidence value', () => {
- assert.equal(apps.appHtml.confidenceTotal, 50);
- });
-
- it('should return the version number', () => {
- assert.equal(apps.appHtml.version, '1');
- });
-
- it('should analyze html', async () => {
- const html = `
-
-
-
- Page title | Html detection
-
-
-
- Technologies Test Page | Html detection
-
-
-
-
-
- `;
- const wappalyzer = new Wappalyzer();
- wappalyzer.apps = {
- "Google Tag Manager": {
- "html": [
- "googletagmanager\\.com/ns\\.html[^>]+>",
- ""
- ]
- }
- };
- var applications = null;
- wappalyzer.driver = {
- log () {},
- displayApps (detectedMap) {
- applications = detectedMap;
- }
- };
-
- await wappalyzer.analyze({ canonical: 'example.com' }, { html });
- assert.equal(applications['Google Tag Manager'].name, 'Google Tag Manager');
- });
-
- it('should analyze scripts', async () => {
- const scripts = [
- 'http://www.google-analytics.com/analytics.js',
- 'http://example.com/assets/js/jquery.min.js'
- ];
- const wappalyzer = new Wappalyzer();
- wappalyzer.apps = {
- "Google Analytics": {
- "cats": [
- 10
- ],
- "script": "google-analytics\\.com\\/(?:ga|urchin|(analytics))\\.js\\;version:\\1?UA:"
- },
- "jQuery": {
- "script": [
- "jquery(?:\\-|\\.)([\\d.]*\\d)[^/]*\\.js\\;version:\\1",
- "/([\\d.]+)/jquery(?:\\.min)?\\.js\\;version:\\1",
- "jquery.*\\.js(?:\\?ver(?:sion)?=([\\d.]+))?\\;version:\\1"
- ]
- }
- };
- var applications = null;
- wappalyzer.driver = {
- log () {},
- displayApps (detectedMap) {
- applications = detectedMap;
- }
- };
-
- await wappalyzer.analyze({ canonical: 'example.com' }, { scripts });
- assert.equal(applications['Google Analytics'].name, 'Google Analytics');
- assert.equal(applications['jQuery'].name, 'jQuery');
- });
-
- it('should analyze headers', async () => {
- const headers = {
- 'date': [ 'Thu, 01 Feb 2018 11:34:18 GMT' ],
- 'connection': [ 'keep-alive' ],
- 'x-powered-by': [ 'Express'],
- 'etag': [ 'W/125-1jQLmiya7mfec43xR3Eb3pjdu64s' ],
- 'content-length': [ '293' ],
- 'content-type': [ 'text/html; charset=utf-8' ]
- };
- const wappalyzer = new Wappalyzer();
- wappalyzer.apps = {
- "Express": {
- "headers": {
- "X-Powered-By": "^Express$"
- }
- }
- };
- var applications = null;
- wappalyzer.driver = {
- log () {},
- displayApps (detectedMap) {
- applications = detectedMap;
- }
- };
-
- await wappalyzer.analyze({ canonical: 'example.com' }, { headers });
- assert.equal(applications['Express'].name, 'Express');
- });
-
- it('should analyze js globals', async () => {
- const js = {
- 'Moment.js': { 'moment': { '0': true } },
- 'Google Font API': { 'WebFonts': { '0': true } }
- };
- const wappalyzer = new Wappalyzer();
- wappalyzer.apps = {
- "Moment.js": {
- "js": {
- "moment": "",
- "moment.version": "(.*)\\;version:\\1"
- }
- },
- "Google Font API": {
- "js": {
- "WebFonts": ""
- }
- }
- };
- var applications = null;
- wappalyzer.driver = {
- log () {},
- displayApps (detectedMap) {
- applications = detectedMap;
- }
- };
-
- wappalyzer.parseJsPatterns();
- await wappalyzer.analyze({ canonical: 'example.com' }, { js });
-
- assert.equal(applications['Google Font API'].name, 'Google Font API');
- assert.equal(applications['Moment.js'].name, 'Moment.js');
- });
- });
-});
diff --git a/yarn.lock b/yarn.lock
new file mode 100644
index 0000000000000000000000000000000000000000..a83b36b5a51c1ee1bb0b885f339fc1cc07121bb8
--- /dev/null
+++ b/yarn.lock
@@ -0,0 +1,2109 @@
+# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.
+# yarn lockfile v1
+
+
+"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.10.1":
+ version "7.10.1"
+ resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.10.1.tgz#d5481c5095daa1c57e16e54c6f9198443afb49ff"
+ integrity sha512-IGhtTmpjGbYzcEDOw7DcQtbQSXcG9ftmAXtWTu9V936vDye4xjjekktFAtgZsWpzTj/X01jocB46mTywm/4SZw==
+ dependencies:
+ "@babel/highlight" "^7.10.1"
+
+"@babel/generator@^7.10.1":
+ version "7.10.2"
+ resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.10.2.tgz#0fa5b5b2389db8bfdfcc3492b551ee20f5dd69a9"
+ integrity sha512-AxfBNHNu99DTMvlUPlt1h2+Hn7knPpH5ayJ8OqDWSeLld+Fi2AYBTC/IejWDM9Edcii4UzZRCsbUt0WlSDsDsA==
+ dependencies:
+ "@babel/types" "^7.10.2"
+ jsesc "^2.5.1"
+ lodash "^4.17.13"
+ source-map "^0.5.0"
+
+"@babel/helper-function-name@^7.10.1":
+ version "7.10.1"
+ resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.10.1.tgz#92bd63829bfc9215aca9d9defa85f56b539454f4"
+ integrity sha512-fcpumwhs3YyZ/ttd5Rz0xn0TpIwVkN7X0V38B9TWNfVF42KEkhkAAuPCQ3oXmtTRtiPJrmZ0TrfS0GKF0eMaRQ==
+ dependencies:
+ "@babel/helper-get-function-arity" "^7.10.1"
+ "@babel/template" "^7.10.1"
+ "@babel/types" "^7.10.1"
+
+"@babel/helper-get-function-arity@^7.10.1":
+ version "7.10.1"
+ resolved "https://registry.yarnpkg.com/@babel/helper-get-function-arity/-/helper-get-function-arity-7.10.1.tgz#7303390a81ba7cb59613895a192b93850e373f7d"
+ integrity sha512-F5qdXkYGOQUb0hpRaPoetF9AnsXknKjWMZ+wmsIRsp5ge5sFh4c3h1eH2pRTTuy9KKAA2+TTYomGXAtEL2fQEw==
+ dependencies:
+ "@babel/types" "^7.10.1"
+
+"@babel/helper-split-export-declaration@^7.10.1":
+ version "7.10.1"
+ resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.10.1.tgz#c6f4be1cbc15e3a868e4c64a17d5d31d754da35f"
+ integrity sha512-UQ1LVBPrYdbchNhLwj6fetj46BcFwfS4NllJo/1aJsT+1dLTEnXJL0qHqtY7gPzF8S2fXBJamf1biAXV3X077g==
+ dependencies:
+ "@babel/types" "^7.10.1"
+
+"@babel/helper-validator-identifier@^7.10.1":
+ version "7.10.1"
+ resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.1.tgz#5770b0c1a826c4f53f5ede5e153163e0318e94b5"
+ integrity sha512-5vW/JXLALhczRCWP0PnFDMCJAchlBvM7f4uk/jXritBnIa6E1KmqmtrS3yn1LAnxFBypQ3eneLuXjsnfQsgILw==
+
+"@babel/highlight@^7.10.1":
+ version "7.10.1"
+ resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.10.1.tgz#841d098ba613ba1a427a2b383d79e35552c38ae0"
+ integrity sha512-8rMof+gVP8mxYZApLF/JgNDAkdKa+aJt3ZYxF8z6+j/hpeXL7iMsKCPHa2jNMHu/qqBwzQF4OHNoYi8dMA/rYg==
+ dependencies:
+ "@babel/helper-validator-identifier" "^7.10.1"
+ chalk "^2.0.0"
+ js-tokens "^4.0.0"
+
+"@babel/parser@^7.10.1", "@babel/parser@^7.7.0":
+ version "7.10.2"
+ resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.10.2.tgz#871807f10442b92ff97e4783b9b54f6a0ca812d0"
+ integrity sha512-PApSXlNMJyB4JiGVhCOlzKIif+TKFTvu0aQAhnTvfP/z3vVSN6ZypH5bfUNwFXXjRQtUEBNFd2PtmCmG2Py3qQ==
+
+"@babel/template@^7.10.1":
+ version "7.10.1"
+ resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.10.1.tgz#e167154a94cb5f14b28dc58f5356d2162f539811"
+ integrity sha512-OQDg6SqvFSsc9A0ej6SKINWrpJiNonRIniYondK2ViKhB06i3c0s+76XUft71iqBEe9S1OKsHwPAjfHnuvnCig==
+ dependencies:
+ "@babel/code-frame" "^7.10.1"
+ "@babel/parser" "^7.10.1"
+ "@babel/types" "^7.10.1"
+
+"@babel/traverse@^7.7.0":
+ version "7.10.1"
+ resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.10.1.tgz#bbcef3031e4152a6c0b50147f4958df54ca0dd27"
+ integrity sha512-C/cTuXeKt85K+p08jN6vMDz8vSV0vZcI0wmQ36o6mjbuo++kPMdpOYw23W2XH04dbRt9/nMEfA4W3eR21CD+TQ==
+ dependencies:
+ "@babel/code-frame" "^7.10.1"
+ "@babel/generator" "^7.10.1"
+ "@babel/helper-function-name" "^7.10.1"
+ "@babel/helper-split-export-declaration" "^7.10.1"
+ "@babel/parser" "^7.10.1"
+ "@babel/types" "^7.10.1"
+ debug "^4.1.0"
+ globals "^11.1.0"
+ lodash "^4.17.13"
+
+"@babel/types@^7.10.1", "@babel/types@^7.10.2", "@babel/types@^7.7.0":
+ version "7.10.2"
+ resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.10.2.tgz#30283be31cad0dbf6fb00bd40641ca0ea675172d"
+ integrity sha512-AD3AwWBSz0AWF0AkCN9VPiWrvldXq+/e3cHa4J89vo4ymjz1XwrBFFVZmkJTsQIPNk+ZVomPSXUJqq8yyjZsng==
+ dependencies:
+ "@babel/helper-validator-identifier" "^7.10.1"
+ lodash "^4.17.13"
+ to-fast-properties "^2.0.0"
+
+"@nuxtjs/eslint-config@^1.0.1":
+ version "1.1.2"
+ resolved "https://registry.yarnpkg.com/@nuxtjs/eslint-config/-/eslint-config-1.1.2.tgz#cde4c950014a781bcc34abbfef9c62546d8fc34c"
+ integrity sha512-uKBdza1/Poz32gEodQ9MSW8M9CU4RPdvEiSLX5LWyavrbjhXW9iIbzJzSDlgMhD1QfQ5WrWv1iqL3Bh/ArbIgw==
+ dependencies:
+ eslint-config-standard "^12.0.0"
+ eslint-plugin-import "^2.18.0"
+ eslint-plugin-jest "^22.10.0"
+ eslint-plugin-node "^9.1.0"
+ eslint-plugin-promise "^4.2.1"
+ eslint-plugin-standard "^4.0.0"
+ eslint-plugin-unicorn "^9.1.1"
+ eslint-plugin-vue "^5.2.3"
+
+"@nuxtjs/eslint-module@^1.2.0":
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/@nuxtjs/eslint-module/-/eslint-module-1.2.0.tgz#a1d014690d505309c16ced2ded3b729cbc479306"
+ integrity sha512-ZVweM95atKQIqKPmrYS532SyO0/Uqi5wXc1uUiPZVy2MTVjqlC/7uHJ/XSxpvnt78kBW9z64Fxgf5pZggSNXgA==
+ dependencies:
+ consola "^2.11.3"
+ eslint-loader "^4.0.2"
+
+"@prantlf/jsonlint@^10.2.0":
+ version "10.2.0"
+ resolved "https://registry.yarnpkg.com/@prantlf/jsonlint/-/jsonlint-10.2.0.tgz#0716001895cc5f0407820ffe9887de5e13e6fa47"
+ integrity sha512-KMFfds0peWLLfCu3bhClTiEN0tdj/Z86QJvn1awKHws6r+Sx6T3a44Eadz6OvqN6ZpsRkqaRpZxqddvvDAdDZQ==
+ dependencies:
+ ajv "6.10.2"
+ commander "4.0.1"
+
+"@types/color-name@^1.1.1":
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/@types/color-name/-/color-name-1.1.1.tgz#1c1261bbeaa10a8055bbc5d8ab84b7b2afc846a0"
+ integrity sha512-rr+OQyAjxze7GgWrSaJwydHStIhHq2lvY3BOC2Mj7KnzI7XK0Uw1TOOdI9lDoajEbSWLiYgoo4f1R51erQfhPQ==
+
+"@types/json-schema@^7.0.3", "@types/json-schema@^7.0.4":
+ version "7.0.5"
+ resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.5.tgz#dcce4430e64b443ba8945f0290fb564ad5bac6dd"
+ integrity sha512-7+2BITlgjgDhH0vvwZU/HZJVyk+2XUlvxXe8dFMedNX/aMkaOq++rMAFXc0tM7ij15QaWlbdQASBR9dihi+bDQ==
+
+"@types/json5@^0.0.29":
+ version "0.0.29"
+ resolved "https://registry.yarnpkg.com/@types/json5/-/json5-0.0.29.tgz#ee28707ae94e11d2b827bcbe5270bcea7f3e71ee"
+ integrity sha1-7ihweulOEdK4J7y+UnC86n8+ce4=
+
+"@typescript-eslint/experimental-utils@^1.13.0":
+ version "1.13.0"
+ resolved "https://registry.yarnpkg.com/@typescript-eslint/experimental-utils/-/experimental-utils-1.13.0.tgz#b08c60d780c0067de2fb44b04b432f540138301e"
+ integrity sha512-zmpS6SyqG4ZF64ffaJ6uah6tWWWgZ8m+c54XXgwFtUv0jNz8aJAVx8chMCvnk7yl6xwn8d+d96+tWp7fXzTuDg==
+ dependencies:
+ "@types/json-schema" "^7.0.3"
+ "@typescript-eslint/typescript-estree" "1.13.0"
+ eslint-scope "^4.0.0"
+
+"@typescript-eslint/typescript-estree@1.13.0":
+ version "1.13.0"
+ resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-1.13.0.tgz#8140f17d0f60c03619798f1d628b8434913dc32e"
+ integrity sha512-b5rCmd2e6DCC6tCTN9GSUAuxdYwCM/k/2wdjHGrIRGPSJotWMCe/dGpi66u42bhuh8q3QBzqM4TMA1GUUCJvdw==
+ dependencies:
+ lodash.unescape "4.0.1"
+ semver "5.5.0"
+
+acorn-jsx@^5.0.0, acorn-jsx@^5.2.0:
+ version "5.2.0"
+ resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.2.0.tgz#4c66069173d6fdd68ed85239fc256226182b2ebe"
+ integrity sha512-HiUX/+K2YpkpJ+SzBffkM/AQ2YE03S0U1kjTLVpoJdhZMOWy8qvXVN9JdLqv2QsaQ6MPYQIuNmwD8zOiYUofLQ==
+
+acorn@^6.0.2:
+ version "6.4.1"
+ resolved "https://registry.yarnpkg.com/acorn/-/acorn-6.4.1.tgz#531e58ba3f51b9dacb9a6646ca4debf5b14ca474"
+ integrity sha512-ZVA9k326Nwrj3Cj9jlh3wGFutC2ZornPNARZwsNYqQYgN0EsV2d53w5RN/co65Ohn4sUAUtb1rSUAOD6XN9idA==
+
+acorn@^7.1.1:
+ version "7.3.1"
+ resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.3.1.tgz#85010754db53c3fbaf3b9ea3e083aa5c5d147ffd"
+ integrity sha512-tLc0wSnatxAQHVHUapaHdz72pi9KUyHjq5KyHjGg9Y8Ifdc79pTh2XvI6I1/chZbnM7QtNKzh66ooDogPZSleA==
+
+adm-zip@^0.4.14:
+ version "0.4.14"
+ resolved "https://registry.yarnpkg.com/adm-zip/-/adm-zip-0.4.14.tgz#2cf312bcc9f8875df835b0f6040bd89be0a727a9"
+ integrity sha512-/9aQCnQHF+0IiCl0qhXoK7qs//SwYE7zX8lsr/DNk1BRAHYxeLZPL4pguwK29gUEqasYQjqPtEpDRSWEkdHn9g==
+
+agent-base@^4.3.0:
+ version "4.3.0"
+ resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-4.3.0.tgz#8165f01c436009bccad0b1d122f05ed770efc6ee"
+ integrity sha512-salcGninV0nPrwpGNn4VTXBb1SOuXQBiqbrNXoeizJsHrsL6ERFM2Ne3JUSBWRE6aeNJI2ROP/WEEIDUiDe3cg==
+ dependencies:
+ es6-promisify "^5.0.0"
+
+ajv-keywords@^3.4.1:
+ version "3.4.1"
+ resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-3.4.1.tgz#ef916e271c64ac12171fd8384eaae6b2345854da"
+ integrity sha512-RO1ibKvd27e6FEShVFfPALuHI3WjSVNeK5FIsmme/LYRNxjKuNj+Dt7bucLa6NdSv3JcVTyMlm9kGR84z1XpaQ==
+
+ajv@6.10.2:
+ version "6.10.2"
+ resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.10.2.tgz#d3cea04d6b017b2894ad69040fec8b623eb4bd52"
+ integrity sha512-TXtUUEYHuaTEbLZWIKUr5pmBuhDLy+8KYtPYdcV8qC+pOZL+NKqYwvWSRrVXHn+ZmRRAu8vJTAznH7Oag6RVRw==
+ dependencies:
+ fast-deep-equal "^2.0.1"
+ fast-json-stable-stringify "^2.0.0"
+ json-schema-traverse "^0.4.1"
+ uri-js "^4.2.2"
+
+ajv@^6.10.0, ajv@^6.10.2, ajv@^6.12.2:
+ version "6.12.2"
+ resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.2.tgz#c629c5eced17baf314437918d2da88c99d5958cd"
+ integrity sha512-k+V+hzjm5q/Mr8ef/1Y9goCmlsK4I6Sm74teeyGvFk1XrOsbsKLjEdrvny42CZ+a8sXbk8KWpY/bDwS+FLL2UQ==
+ dependencies:
+ fast-deep-equal "^3.1.1"
+ fast-json-stable-stringify "^2.0.0"
+ json-schema-traverse "^0.4.1"
+ uri-js "^4.2.2"
+
+ansi-escapes@^4.2.1:
+ version "4.3.1"
+ resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-4.3.1.tgz#a5c47cc43181f1f38ffd7076837700d395522a61"
+ integrity sha512-JWF7ocqNrp8u9oqpgV+wH5ftbt+cfvv+PTjOvKLT3AdYly/LmORARfEVT1iyjwN+4MqE5UmVKoAdIBqeoCHgLA==
+ dependencies:
+ type-fest "^0.11.0"
+
+ansi-regex@^4.1.0:
+ version "4.1.0"
+ resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-4.1.0.tgz#8b9f8f08cf1acb843756a839ca8c7e3168c51997"
+ integrity sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==
+
+ansi-regex@^5.0.0:
+ version "5.0.0"
+ resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.0.tgz#388539f55179bf39339c81af30a654d69f87cb75"
+ integrity sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==
+
+ansi-styles@^3.2.0, ansi-styles@^3.2.1:
+ version "3.2.1"
+ resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d"
+ integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==
+ dependencies:
+ color-convert "^1.9.0"
+
+ansi-styles@^4.1.0:
+ version "4.2.1"
+ resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.2.1.tgz#90ae75c424d008d2624c5bf29ead3177ebfcf359"
+ integrity sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==
+ dependencies:
+ "@types/color-name" "^1.1.1"
+ color-convert "^2.0.1"
+
+argparse@^1.0.7:
+ version "1.0.10"
+ resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911"
+ integrity sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==
+ dependencies:
+ sprintf-js "~1.0.2"
+
+array-includes@^3.1.1:
+ version "3.1.1"
+ resolved "https://registry.yarnpkg.com/array-includes/-/array-includes-3.1.1.tgz#cdd67e6852bdf9c1215460786732255ed2459348"
+ integrity sha512-c2VXaCHl7zPsvpkFsw4nxvFie4fh1ur9bpcgsVkIjqn0H/Xwdg+7fv3n2r/isyS8EBj5b06M9kHyZuIr4El6WQ==
+ dependencies:
+ define-properties "^1.1.3"
+ es-abstract "^1.17.0"
+ is-string "^1.0.5"
+
+array.prototype.flat@^1.2.3:
+ version "1.2.3"
+ resolved "https://registry.yarnpkg.com/array.prototype.flat/-/array.prototype.flat-1.2.3.tgz#0de82b426b0318dbfdb940089e38b043d37f6c7b"
+ integrity sha512-gBlRZV0VSmfPIeWfuuy56XZMvbVfbEUnOXUvt3F/eUUUSyzlgLxhEX4YAEpxNAogRGehPSnfXyPtYyKAhkzQhQ==
+ dependencies:
+ define-properties "^1.1.3"
+ es-abstract "^1.17.0-next.1"
+
+astral-regex@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/astral-regex/-/astral-regex-1.0.0.tgz#6c8c3fb827dd43ee3918f27b82782ab7658a6fd9"
+ integrity sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg==
+
+async-limiter@~1.0.0:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/async-limiter/-/async-limiter-1.0.1.tgz#dd379e94f0db8310b08291f9d64c3209766617fd"
+ integrity sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==
+
+babel-eslint@^10.1.0:
+ version "10.1.0"
+ resolved "https://registry.yarnpkg.com/babel-eslint/-/babel-eslint-10.1.0.tgz#6968e568a910b78fb3779cdd8b6ac2f479943232"
+ integrity sha512-ifWaTHQ0ce+448CYop8AdrQiBsGrnC+bMgfyKFdi6EsPLTAWG+QfyDeM6OH+FmWnKvEq5NnBMLvlBUPKQZoDSg==
+ dependencies:
+ "@babel/code-frame" "^7.0.0"
+ "@babel/parser" "^7.7.0"
+ "@babel/traverse" "^7.7.0"
+ "@babel/types" "^7.7.0"
+ eslint-visitor-keys "^1.0.0"
+ resolve "^1.12.0"
+
+balanced-match@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767"
+ integrity sha1-ibTRmasr7kneFk6gK4nORi1xt2c=
+
+big.js@^5.2.2:
+ version "5.2.2"
+ resolved "https://registry.yarnpkg.com/big.js/-/big.js-5.2.2.tgz#65f0af382f578bcdc742bd9c281e9cb2d7768328"
+ integrity sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==
+
+brace-expansion@^1.1.7:
+ version "1.1.11"
+ resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd"
+ integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==
+ dependencies:
+ balanced-match "^1.0.0"
+ concat-map "0.0.1"
+
+buffer-crc32@~0.2.3:
+ version "0.2.13"
+ resolved "https://registry.yarnpkg.com/buffer-crc32/-/buffer-crc32-0.2.13.tgz#0d333e3f00eac50aa1454abd30ef8c2a5d9a7242"
+ integrity sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI=
+
+buffer-from@^1.0.0:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.1.tgz#32713bc028f75c02fdb710d7c7bcec1f2c6070ef"
+ integrity sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==
+
+callsites@^3.0.0:
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73"
+ integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==
+
+chalk@^2.0.0, chalk@^2.1.0, chalk@^2.4.1:
+ version "2.4.2"
+ resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424"
+ integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==
+ dependencies:
+ ansi-styles "^3.2.1"
+ escape-string-regexp "^1.0.5"
+ supports-color "^5.3.0"
+
+chalk@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/chalk/-/chalk-3.0.0.tgz#3f73c2bf526591f574cc492c51e2456349f844e4"
+ integrity sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==
+ dependencies:
+ ansi-styles "^4.1.0"
+ supports-color "^7.1.0"
+
+chardet@^0.7.0:
+ version "0.7.0"
+ resolved "https://registry.yarnpkg.com/chardet/-/chardet-0.7.0.tgz#90094849f0937f2eedc2425d0d28a9e5f0cbad9e"
+ integrity sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==
+
+clean-regexp@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/clean-regexp/-/clean-regexp-1.0.0.tgz#8df7c7aae51fd36874e8f8d05b9180bc11a3fed7"
+ integrity sha1-jffHquUf02h06PjQW5GAvBGj/tc=
+ dependencies:
+ escape-string-regexp "^1.0.5"
+
+cli-cursor@^3.1.0:
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-3.1.0.tgz#264305a7ae490d1d03bf0c9ba7c925d1753af307"
+ integrity sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==
+ dependencies:
+ restore-cursor "^3.1.0"
+
+cli-width@^2.0.0:
+ version "2.2.1"
+ resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-2.2.1.tgz#b0433d0b4e9c847ef18868a4ef16fd5fc8271c48"
+ integrity sha512-GRMWDxpOB6Dgk2E5Uo+3eEBvtOOlimMmpbFiKuLFnQzYDavtLFY3K5ona41jgN/WdRZtG7utuVSVTL4HbZHGkw==
+
+color-convert@^1.9.0:
+ version "1.9.3"
+ resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8"
+ integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==
+ dependencies:
+ color-name "1.1.3"
+
+color-convert@^2.0.1:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3"
+ integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==
+ dependencies:
+ color-name "~1.1.4"
+
+color-name@1.1.3:
+ version "1.1.3"
+ resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25"
+ integrity sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=
+
+color-name@~1.1.4:
+ version "1.1.4"
+ resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2"
+ integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==
+
+commander@4.0.1:
+ version "4.0.1"
+ resolved "https://registry.yarnpkg.com/commander/-/commander-4.0.1.tgz#b67622721785993182e807f4883633e6401ba53c"
+ integrity sha512-IPF4ouhCP+qdlcmCedhxX4xiGBPyigb8v5NeUp+0LyhwLgxMqyp3S0vl7TAPfS/hiP7FC3caI/PB9lTmP8r1NA==
+
+commander@^2.19.0:
+ version "2.20.3"
+ resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33"
+ integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==
+
+commondir@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/commondir/-/commondir-1.0.1.tgz#ddd800da0c66127393cca5950ea968a3aaf1253b"
+ integrity sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=
+
+concat-map@0.0.1:
+ version "0.0.1"
+ resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b"
+ integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=
+
+concat-stream@^1.6.2:
+ version "1.6.2"
+ resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.6.2.tgz#904bdf194cd3122fc675c77fc4ac3d4ff0fd1a34"
+ integrity sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==
+ dependencies:
+ buffer-from "^1.0.0"
+ inherits "^2.0.3"
+ readable-stream "^2.2.2"
+ typedarray "^0.0.6"
+
+consola@^2.11.3:
+ version "2.13.0"
+ resolved "https://registry.yarnpkg.com/consola/-/consola-2.13.0.tgz#5a4dc75e1b1fddbd8b10728e7790a2e54efeeeb7"
+ integrity sha512-Jw+8qpL0yrpfqH9m90fWoDRQyn8TYU6Aegpl4UofoP81VYvQLoOWMpFw2vQ3U/cyLRRzTc/CyNC6YYVzZFU8Eg==
+
+contains-path@^0.1.0:
+ version "0.1.0"
+ resolved "https://registry.yarnpkg.com/contains-path/-/contains-path-0.1.0.tgz#fe8cf184ff6670b6baef01a9d4861a5cbec4120a"
+ integrity sha1-/ozxhP9mcLa67wGp1IYaXL7EEgo=
+
+convert-svg-core@^0.5.0:
+ version "0.5.0"
+ resolved "https://registry.yarnpkg.com/convert-svg-core/-/convert-svg-core-0.5.0.tgz#e0f05a1774a588d664f5a070fc74ef4a1c448ee6"
+ integrity sha512-V30vm5h4sHjmjyAr7o/gYAEmdEIsi0sLKKbDigSxplovCzMHTERXSikIOgA8xSllHh0c4gHYP55Pxwgtu9O+3w==
+ dependencies:
+ chalk "^2.4.1"
+ commander "^2.19.0"
+ file-url "^2.0.2"
+ get-stdin "^6.0.0"
+ glob "^7.1.3"
+ lodash.omit "^4.5.0"
+ lodash.pick "^4.4.0"
+ pollock "^0.2.0"
+ puppeteer "^1.10.0"
+ tmp "0.0.33"
+
+convert-svg-to-png@^0.5.0:
+ version "0.5.0"
+ resolved "https://registry.yarnpkg.com/convert-svg-to-png/-/convert-svg-to-png-0.5.0.tgz#51a6061ef3da206bc01a96a7617a4d42f9fe1159"
+ integrity sha512-Pzg2IEirPdN/VXovG9NY8H5Ww3PUEohMcyu9a11E0G0/oVcbPLWQYE3/S6mxpjidqzYr1i5iKLTKCiU9hctKFQ==
+ dependencies:
+ convert-svg-core "^0.5.0"
+
+core-util-is@~1.0.0:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7"
+ integrity sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=
+
+cross-spawn@^6.0.5:
+ version "6.0.5"
+ resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-6.0.5.tgz#4a5ec7c64dfae22c3a14124dbacdee846d80cbc4"
+ integrity sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==
+ dependencies:
+ nice-try "^1.0.4"
+ path-key "^2.0.1"
+ semver "^5.5.0"
+ shebang-command "^1.2.0"
+ which "^1.2.9"
+
+debug@^2.6.9:
+ version "2.6.9"
+ resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f"
+ integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==
+ dependencies:
+ ms "2.0.0"
+
+debug@^3.1.0:
+ version "3.2.6"
+ resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.6.tgz#e83d17de16d8a7efb7717edbe5fb10135eee629b"
+ integrity sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==
+ dependencies:
+ ms "^2.1.1"
+
+debug@^4.0.1, debug@^4.1.0, debug@^4.1.1:
+ version "4.1.1"
+ resolved "https://registry.yarnpkg.com/debug/-/debug-4.1.1.tgz#3b72260255109c6b589cee050f1d516139664791"
+ integrity sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==
+ dependencies:
+ ms "^2.1.1"
+
+deep-is@~0.1.3:
+ version "0.1.3"
+ resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.3.tgz#b369d6fb5dbc13eecf524f91b070feedc357cf34"
+ integrity sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=
+
+define-properties@^1.1.2, define-properties@^1.1.3:
+ version "1.1.3"
+ resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.3.tgz#cf88da6cbee26fe6db7094f61d870cbd84cee9f1"
+ integrity sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==
+ dependencies:
+ object-keys "^1.0.12"
+
+doctrine@1.5.0:
+ version "1.5.0"
+ resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-1.5.0.tgz#379dce730f6166f76cefa4e6707a159b02c5a6fa"
+ integrity sha1-N53Ocw9hZvds76TmcHoVmwLFpvo=
+ dependencies:
+ esutils "^2.0.2"
+ isarray "^1.0.0"
+
+doctrine@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-3.0.0.tgz#addebead72a6574db783639dc87a121773973961"
+ integrity sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==
+ dependencies:
+ esutils "^2.0.2"
+
+emoji-regex@^7.0.1:
+ version "7.0.3"
+ resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-7.0.3.tgz#933a04052860c85e83c122479c4748a8e4c72156"
+ integrity sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==
+
+emoji-regex@^8.0.0:
+ version "8.0.0"
+ resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37"
+ integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==
+
+emojis-list@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/emojis-list/-/emojis-list-3.0.0.tgz#5570662046ad29e2e916e71aae260abdff4f6a78"
+ integrity sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==
+
+error-ex@^1.2.0:
+ version "1.3.2"
+ resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf"
+ integrity sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==
+ dependencies:
+ is-arrayish "^0.2.1"
+
+es-abstract@^1.17.0, es-abstract@^1.17.0-next.1, es-abstract@^1.17.5:
+ version "1.17.5"
+ resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.17.5.tgz#d8c9d1d66c8981fb9200e2251d799eee92774ae9"
+ integrity sha512-BR9auzDbySxOcfog0tLECW8l28eRGpDpU3Dm3Hp4q/N+VtLTmyj4EUN088XZWQDW/hzj6sYRDXeOFsaAODKvpg==
+ dependencies:
+ es-to-primitive "^1.2.1"
+ function-bind "^1.1.1"
+ has "^1.0.3"
+ has-symbols "^1.0.1"
+ is-callable "^1.1.5"
+ is-regex "^1.0.5"
+ object-inspect "^1.7.0"
+ object-keys "^1.1.1"
+ object.assign "^4.1.0"
+ string.prototype.trimleft "^2.1.1"
+ string.prototype.trimright "^2.1.1"
+
+es-to-primitive@^1.2.1:
+ version "1.2.1"
+ resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.2.1.tgz#e55cd4c9cdc188bcefb03b366c736323fc5c898a"
+ integrity sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==
+ dependencies:
+ is-callable "^1.1.4"
+ is-date-object "^1.0.1"
+ is-symbol "^1.0.2"
+
+es6-promise@^4.0.3:
+ version "4.2.8"
+ resolved "https://registry.yarnpkg.com/es6-promise/-/es6-promise-4.2.8.tgz#4eb21594c972bc40553d276e510539143db53e0a"
+ integrity sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w==
+
+es6-promisify@^5.0.0:
+ version "5.0.0"
+ resolved "https://registry.yarnpkg.com/es6-promisify/-/es6-promisify-5.0.0.tgz#5109d62f3e56ea967c4b63505aef08291c8a5203"
+ integrity sha1-UQnWLz5W6pZ8S2NQWu8IKRyKUgM=
+ dependencies:
+ es6-promise "^4.0.3"
+
+escape-string-regexp@^1.0.5:
+ version "1.0.5"
+ resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4"
+ integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=
+
+eslint-ast-utils@^1.0.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/eslint-ast-utils/-/eslint-ast-utils-1.1.0.tgz#3d58ba557801cfb1c941d68131ee9f8c34bd1586"
+ integrity sha512-otzzTim2/1+lVrlH19EfQQJEhVJSu0zOb9ygb3iapN6UlyaDtyRq4b5U1FuW0v1lRa9Fp/GJyHkSwm6NqABgCA==
+ dependencies:
+ lodash.get "^4.4.2"
+ lodash.zip "^4.2.0"
+
+eslint-config-prettier@^4.1.0:
+ version "4.3.0"
+ resolved "https://registry.yarnpkg.com/eslint-config-prettier/-/eslint-config-prettier-4.3.0.tgz#c55c1fcac8ce4518aeb77906984e134d9eb5a4f0"
+ integrity sha512-sZwhSTHVVz78+kYD3t5pCWSYEdVSBR0PXnwjDRsUs8ytIrK8PLXw+6FKp8r3Z7rx4ZszdetWlXYKOHoUrrwPlA==
+ dependencies:
+ get-stdin "^6.0.0"
+
+eslint-config-standard@^12.0.0:
+ version "12.0.0"
+ resolved "https://registry.yarnpkg.com/eslint-config-standard/-/eslint-config-standard-12.0.0.tgz#638b4c65db0bd5a41319f96bba1f15ddad2107d9"
+ integrity sha512-COUz8FnXhqFitYj4DTqHzidjIL/t4mumGZto5c7DrBpvWoie+Sn3P4sLEzUGeYhRElWuFEf8K1S1EfvD1vixCQ==
+
+eslint-import-resolver-node@^0.3.3:
+ version "0.3.3"
+ resolved "https://registry.yarnpkg.com/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.3.tgz#dbaa52b6b2816b50bc6711af75422de808e98404"
+ integrity sha512-b8crLDo0M5RSe5YG8Pu2DYBj71tSB6OvXkfzwbJU2w7y8P4/yo0MyF8jU26IEuEuHF2K5/gcAJE3LhQGqBBbVg==
+ dependencies:
+ debug "^2.6.9"
+ resolve "^1.13.1"
+
+eslint-loader@^4.0.2:
+ version "4.0.2"
+ resolved "https://registry.yarnpkg.com/eslint-loader/-/eslint-loader-4.0.2.tgz#386a1e21bcb613b3cf2d252a3b708023ccfb41ec"
+ integrity sha512-EDpXor6lsjtTzZpLUn7KmXs02+nIjGcgees9BYjNkWra3jVq5vVa8IoCKgzT2M7dNNeoMBtaSG83Bd40N3poLw==
+ dependencies:
+ find-cache-dir "^3.3.1"
+ fs-extra "^8.1.0"
+ loader-utils "^2.0.0"
+ object-hash "^2.0.3"
+ schema-utils "^2.6.5"
+
+eslint-module-utils@^2.6.0:
+ version "2.6.0"
+ resolved "https://registry.yarnpkg.com/eslint-module-utils/-/eslint-module-utils-2.6.0.tgz#579ebd094f56af7797d19c9866c9c9486629bfa6"
+ integrity sha512-6j9xxegbqe8/kZY8cYpcp0xhbK0EgJlg3g9mib3/miLaExuuwc3n5UEfSnU6hWMbT0FAYVvDbL9RrRgpUeQIvA==
+ dependencies:
+ debug "^2.6.9"
+ pkg-dir "^2.0.0"
+
+eslint-plugin-es@^1.4.1:
+ version "1.4.1"
+ resolved "https://registry.yarnpkg.com/eslint-plugin-es/-/eslint-plugin-es-1.4.1.tgz#12acae0f4953e76ba444bfd1b2271081ac620998"
+ integrity sha512-5fa/gR2yR3NxQf+UXkeLeP8FBBl6tSgdrAz1+cF84v1FMM4twGwQoqTnn+QxFLcPOrF4pdKEJKDB/q9GoyJrCA==
+ dependencies:
+ eslint-utils "^1.4.2"
+ regexpp "^2.0.1"
+
+eslint-plugin-import@^2.18.0:
+ version "2.21.2"
+ resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.21.2.tgz#8fef77475cc5510801bedc95f84b932f7f334a7c"
+ integrity sha512-FEmxeGI6yaz+SnEB6YgNHlQK1Bs2DKLM+YF+vuTk5H8J9CLbJLtlPvRFgZZ2+sXiKAlN5dpdlrWOjK8ZoZJpQA==
+ dependencies:
+ array-includes "^3.1.1"
+ array.prototype.flat "^1.2.3"
+ contains-path "^0.1.0"
+ debug "^2.6.9"
+ doctrine "1.5.0"
+ eslint-import-resolver-node "^0.3.3"
+ eslint-module-utils "^2.6.0"
+ has "^1.0.3"
+ minimatch "^3.0.4"
+ object.values "^1.1.1"
+ read-pkg-up "^2.0.0"
+ resolve "^1.17.0"
+ tsconfig-paths "^3.9.0"
+
+eslint-plugin-jest@^22.10.0:
+ version "22.21.0"
+ resolved "https://registry.yarnpkg.com/eslint-plugin-jest/-/eslint-plugin-jest-22.21.0.tgz#8137294645866636160487d9764224b9a43e2eb1"
+ integrity sha512-OaqnSS7uBgcGiqXUiEnjoqxPNKvR4JWG5mSRkzVoR6+vDwlqqp11beeql1hYs0HTbdhiwrxWLxbX0Vx7roG3Ew==
+ dependencies:
+ "@typescript-eslint/experimental-utils" "^1.13.0"
+
+eslint-plugin-node@^9.1.0:
+ version "9.2.0"
+ resolved "https://registry.yarnpkg.com/eslint-plugin-node/-/eslint-plugin-node-9.2.0.tgz#b1911f111002d366c5954a6d96d3cd5bf2a3036a"
+ integrity sha512-2abNmzAH/JpxI4gEOwd6K8wZIodK3BmHbTxz4s79OIYwwIt2gkpEXlAouJXu4H1c9ySTnRso0tsuthSOZbUMlA==
+ dependencies:
+ eslint-plugin-es "^1.4.1"
+ eslint-utils "^1.4.2"
+ ignore "^5.1.1"
+ minimatch "^3.0.4"
+ resolve "^1.10.1"
+ semver "^6.1.0"
+
+eslint-plugin-nuxt@^0.5.2:
+ version "0.5.2"
+ resolved "https://registry.yarnpkg.com/eslint-plugin-nuxt/-/eslint-plugin-nuxt-0.5.2.tgz#638cdfd0fc0473d285ca848e7e30b8b8e6f59f91"
+ integrity sha512-kOWUSrix6h+gGTCe6He51ett065yAzXsMiteKkBo5pdjc94A3gBMBrWtRZGyZGv91P1wRcJpF8l4CWMhNm3oWg==
+ dependencies:
+ eslint-plugin-vue "^6.2.2"
+ semver "^7.1.3"
+ vue-eslint-parser "^7.0.0"
+
+eslint-plugin-prettier@^3.1.3:
+ version "3.1.3"
+ resolved "https://registry.yarnpkg.com/eslint-plugin-prettier/-/eslint-plugin-prettier-3.1.3.tgz#ae116a0fc0e598fdae48743a4430903de5b4e6ca"
+ integrity sha512-+HG5jmu/dN3ZV3T6eCD7a4BlAySdN7mLIbJYo0z1cFQuI+r2DiTJEFeF68ots93PsnrMxbzIZ2S/ieX+mkrBeQ==
+ dependencies:
+ prettier-linter-helpers "^1.0.0"
+
+eslint-plugin-promise@^4.2.1:
+ version "4.2.1"
+ resolved "https://registry.yarnpkg.com/eslint-plugin-promise/-/eslint-plugin-promise-4.2.1.tgz#845fd8b2260ad8f82564c1222fce44ad71d9418a"
+ integrity sha512-VoM09vT7bfA7D+upt+FjeBO5eHIJQBUWki1aPvB+vbNiHS3+oGIJGIeyBtKQTME6UPXXy3vV07OL1tHd3ANuDw==
+
+eslint-plugin-standard@^4.0.0:
+ version "4.0.1"
+ resolved "https://registry.yarnpkg.com/eslint-plugin-standard/-/eslint-plugin-standard-4.0.1.tgz#ff0519f7ffaff114f76d1bd7c3996eef0f6e20b4"
+ integrity sha512-v/KBnfyaOMPmZc/dmc6ozOdWqekGp7bBGq4jLAecEfPGmfKiWS4sA8sC0LqiV9w5qmXAtXVn4M3p1jSyhY85SQ==
+
+eslint-plugin-unicorn@^9.1.1:
+ version "9.1.1"
+ resolved "https://registry.yarnpkg.com/eslint-plugin-unicorn/-/eslint-plugin-unicorn-9.1.1.tgz#1588a0473f9a0e37cfbbcf7552065a0b0a96ce26"
+ integrity sha512-SHh/N54pRu5KXlS4Boa1qbWM7yTNl6VpuYJ8Qc1O3TJDr+CDUwEEdUtVlVSV/dBUE97BC8Xk0+Y5zphn21qlCA==
+ dependencies:
+ clean-regexp "^1.0.0"
+ eslint-ast-utils "^1.0.0"
+ import-modules "^1.1.0"
+ lodash.camelcase "^4.1.1"
+ lodash.defaultsdeep "^4.6.0"
+ lodash.kebabcase "^4.0.1"
+ lodash.snakecase "^4.0.1"
+ lodash.topairs "^4.3.0"
+ lodash.upperfirst "^4.2.0"
+ regexpp "^2.0.1"
+ reserved-words "^0.1.2"
+ safe-regex "^2.0.1"
+
+eslint-plugin-vue@^5.2.3:
+ version "5.2.3"
+ resolved "https://registry.yarnpkg.com/eslint-plugin-vue/-/eslint-plugin-vue-5.2.3.tgz#3ee7597d823b5478804b2feba9863b1b74273961"
+ integrity sha512-mGwMqbbJf0+VvpGR5Lllq0PMxvTdrZ/ZPjmhkacrCHbubJeJOt+T6E3HUzAifa2Mxi7RSdJfC9HFpOeSYVMMIw==
+ dependencies:
+ vue-eslint-parser "^5.0.0"
+
+eslint-plugin-vue@^6.2.2:
+ version "6.2.2"
+ resolved "https://registry.yarnpkg.com/eslint-plugin-vue/-/eslint-plugin-vue-6.2.2.tgz#27fecd9a3a24789b0f111ecdd540a9e56198e0fe"
+ integrity sha512-Nhc+oVAHm0uz/PkJAWscwIT4ijTrK5fqNqz9QB1D35SbbuMG1uB6Yr5AJpvPSWg+WOw7nYNswerYh0kOk64gqQ==
+ dependencies:
+ natural-compare "^1.4.0"
+ semver "^5.6.0"
+ vue-eslint-parser "^7.0.0"
+
+eslint-scope@^4.0.0:
+ version "4.0.3"
+ resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-4.0.3.tgz#ca03833310f6889a3264781aa82e63eb9cfe7848"
+ integrity sha512-p7VutNr1O/QrxysMo3E45FjYDTeXBy0iTltPFNSqKAIfjDSXC+4dj+qfyuD8bfAXrW/y6lW3O76VaYNPKfpKrg==
+ dependencies:
+ esrecurse "^4.1.0"
+ estraverse "^4.1.1"
+
+eslint-scope@^5.0.0:
+ version "5.1.0"
+ resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-5.1.0.tgz#d0f971dfe59c69e0cada684b23d49dbf82600ce5"
+ integrity sha512-iiGRvtxWqgtx5m8EyQUJihBloE4EnYeGE/bz1wSPwJE6tZuJUtHlhqDM4Xj2ukE8Dyy1+HCZ4hE0fzIVMzb58w==
+ dependencies:
+ esrecurse "^4.1.0"
+ estraverse "^4.1.1"
+
+eslint-utils@^1.4.2, eslint-utils@^1.4.3:
+ version "1.4.3"
+ resolved "https://registry.yarnpkg.com/eslint-utils/-/eslint-utils-1.4.3.tgz#74fec7c54d0776b6f67e0251040b5806564e981f"
+ integrity sha512-fbBN5W2xdY45KulGXmLHZ3c3FHfVYmKg0IrAKGOkT/464PQsx2UeIzfz1RmEci+KLm1bBaAzZAh8+/E+XAeZ8Q==
+ dependencies:
+ eslint-visitor-keys "^1.1.0"
+
+eslint-visitor-keys@^1.0.0, eslint-visitor-keys@^1.1.0:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-1.2.0.tgz#74415ac884874495f78ec2a97349525344c981fa"
+ integrity sha512-WFb4ihckKil6hu3Dp798xdzSfddwKKU3+nGniKF6HfeW6OLd2OUDEPP7TcHtB5+QXOKg2s6B2DaMPE1Nn/kxKQ==
+
+eslint@^6.1.0:
+ version "6.8.0"
+ resolved "https://registry.yarnpkg.com/eslint/-/eslint-6.8.0.tgz#62262d6729739f9275723824302fb227c8c93ffb"
+ integrity sha512-K+Iayyo2LtyYhDSYwz5D5QdWw0hCacNzyq1Y821Xna2xSJj7cijoLLYmLxTQgcgZ9mC61nryMy9S7GRbYpI5Ig==
+ dependencies:
+ "@babel/code-frame" "^7.0.0"
+ ajv "^6.10.0"
+ chalk "^2.1.0"
+ cross-spawn "^6.0.5"
+ debug "^4.0.1"
+ doctrine "^3.0.0"
+ eslint-scope "^5.0.0"
+ eslint-utils "^1.4.3"
+ eslint-visitor-keys "^1.1.0"
+ espree "^6.1.2"
+ esquery "^1.0.1"
+ esutils "^2.0.2"
+ file-entry-cache "^5.0.1"
+ functional-red-black-tree "^1.0.1"
+ glob-parent "^5.0.0"
+ globals "^12.1.0"
+ ignore "^4.0.6"
+ import-fresh "^3.0.0"
+ imurmurhash "^0.1.4"
+ inquirer "^7.0.0"
+ is-glob "^4.0.0"
+ js-yaml "^3.13.1"
+ json-stable-stringify-without-jsonify "^1.0.1"
+ levn "^0.3.0"
+ lodash "^4.17.14"
+ minimatch "^3.0.4"
+ mkdirp "^0.5.1"
+ natural-compare "^1.4.0"
+ optionator "^0.8.3"
+ progress "^2.0.0"
+ regexpp "^2.0.1"
+ semver "^6.1.2"
+ strip-ansi "^5.2.0"
+ strip-json-comments "^3.0.1"
+ table "^5.2.3"
+ text-table "^0.2.0"
+ v8-compile-cache "^2.0.3"
+
+espree@^4.1.0:
+ version "4.1.0"
+ resolved "https://registry.yarnpkg.com/espree/-/espree-4.1.0.tgz#728d5451e0fd156c04384a7ad89ed51ff54eb25f"
+ integrity sha512-I5BycZW6FCVIub93TeVY1s7vjhP9CY6cXCznIRfiig7nRviKZYdRnj/sHEWC6A7WE9RDWOFq9+7OsWSYz8qv2w==
+ dependencies:
+ acorn "^6.0.2"
+ acorn-jsx "^5.0.0"
+ eslint-visitor-keys "^1.0.0"
+
+espree@^6.1.2, espree@^6.2.1:
+ version "6.2.1"
+ resolved "https://registry.yarnpkg.com/espree/-/espree-6.2.1.tgz#77fc72e1fd744a2052c20f38a5b575832e82734a"
+ integrity sha512-ysCxRQY3WaXJz9tdbWOwuWr5Y/XrPTGX9Kiz3yoUXwW0VZ4w30HTkQLaGx/+ttFjF8i+ACbArnB4ce68a9m5hw==
+ dependencies:
+ acorn "^7.1.1"
+ acorn-jsx "^5.2.0"
+ eslint-visitor-keys "^1.1.0"
+
+esprima@^4.0.0:
+ version "4.0.1"
+ resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71"
+ integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==
+
+esquery@^1.0.1:
+ version "1.3.1"
+ resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.3.1.tgz#b78b5828aa8e214e29fb74c4d5b752e1c033da57"
+ integrity sha512-olpvt9QG0vniUBZspVRN6lwB7hOZoTRtT+jzR+tS4ffYx2mzbw+z0XCOk44aaLYKApNX5nMm+E+P6o25ip/DHQ==
+ dependencies:
+ estraverse "^5.1.0"
+
+esrecurse@^4.1.0:
+ version "4.2.1"
+ resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.2.1.tgz#007a3b9fdbc2b3bb87e4879ea19c92fdbd3942cf"
+ integrity sha512-64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ==
+ dependencies:
+ estraverse "^4.1.0"
+
+estraverse@^4.1.0, estraverse@^4.1.1:
+ version "4.3.0"
+ resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.3.0.tgz#398ad3f3c5a24948be7725e83d11a7de28cdbd1d"
+ integrity sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==
+
+estraverse@^5.1.0:
+ version "5.1.0"
+ resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.1.0.tgz#374309d39fd935ae500e7b92e8a6b4c720e59642"
+ integrity sha512-FyohXK+R0vE+y1nHLoBM7ZTyqRpqAlhdZHCWIWEviFLiGB8b04H6bQs8G+XTthacvT8VuwvteiP7RJSxMs8UEw==
+
+esutils@^2.0.2:
+ version "2.0.3"
+ resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64"
+ integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==
+
+external-editor@^3.0.3:
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/external-editor/-/external-editor-3.1.0.tgz#cb03f740befae03ea4d283caed2741a83f335495"
+ integrity sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==
+ dependencies:
+ chardet "^0.7.0"
+ iconv-lite "^0.4.24"
+ tmp "^0.0.33"
+
+extract-zip@^1.6.6:
+ version "1.7.0"
+ resolved "https://registry.yarnpkg.com/extract-zip/-/extract-zip-1.7.0.tgz#556cc3ae9df7f452c493a0cfb51cc30277940927"
+ integrity sha512-xoh5G1W/PB0/27lXgMQyIhP5DSY/LhoCsOyZgb+6iMmRtCwVBo55uKaMoEYrDCKQhWvqEip5ZPKAc6eFNyf/MA==
+ dependencies:
+ concat-stream "^1.6.2"
+ debug "^2.6.9"
+ mkdirp "^0.5.4"
+ yauzl "^2.10.0"
+
+fast-deep-equal@^2.0.1:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz#7b05218ddf9667bf7f370bf7fdb2cb15fdd0aa49"
+ integrity sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk=
+
+fast-deep-equal@^3.1.1:
+ version "3.1.3"
+ resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525"
+ integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==
+
+fast-diff@^1.1.2:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/fast-diff/-/fast-diff-1.2.0.tgz#73ee11982d86caaf7959828d519cfe927fac5f03"
+ integrity sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w==
+
+fast-json-stable-stringify@^2.0.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633"
+ integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==
+
+fast-levenshtein@~2.0.6:
+ version "2.0.6"
+ resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917"
+ integrity sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=
+
+fd-slicer@~1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/fd-slicer/-/fd-slicer-1.1.0.tgz#25c7c89cb1f9077f8891bbe61d8f390eae256f1e"
+ integrity sha1-JcfInLH5B3+IkbvmHY85Dq4lbx4=
+ dependencies:
+ pend "~1.2.0"
+
+figures@^3.0.0:
+ version "3.2.0"
+ resolved "https://registry.yarnpkg.com/figures/-/figures-3.2.0.tgz#625c18bd293c604dc4a8ddb2febf0c88341746af"
+ integrity sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==
+ dependencies:
+ escape-string-regexp "^1.0.5"
+
+file-entry-cache@^5.0.1:
+ version "5.0.1"
+ resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-5.0.1.tgz#ca0f6efa6dd3d561333fb14515065c2fafdf439c"
+ integrity sha512-bCg29ictuBaKUwwArK4ouCaqDgLZcysCFLmM/Yn/FDoqndh/9vNuQfXRDvTuXKLxfD/JtZQGKFT8MGcJBK644g==
+ dependencies:
+ flat-cache "^2.0.1"
+
+file-url@^2.0.2:
+ version "2.0.2"
+ resolved "https://registry.yarnpkg.com/file-url/-/file-url-2.0.2.tgz#e951784d79095127d3713029ab063f40818ca2ae"
+ integrity sha1-6VF4TXkJUSfTcTApqwY/QIGMoq4=
+
+find-cache-dir@^3.3.1:
+ version "3.3.1"
+ resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-3.3.1.tgz#89b33fad4a4670daa94f855f7fbe31d6d84fe880"
+ integrity sha512-t2GDMt3oGC/v+BMwzmllWDuJF/xcDtE5j/fCGbqDD7OLuJkj0cfh1YSA5VKPvwMeLFLNDBkwOKZ2X85jGLVftQ==
+ dependencies:
+ commondir "^1.0.1"
+ make-dir "^3.0.2"
+ pkg-dir "^4.1.0"
+
+find-up@^2.0.0, find-up@^2.1.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/find-up/-/find-up-2.1.0.tgz#45d1b7e506c717ddd482775a2b77920a3c0c57a7"
+ integrity sha1-RdG35QbHF93UgndaK3eSCjwMV6c=
+ dependencies:
+ locate-path "^2.0.0"
+
+find-up@^4.0.0:
+ version "4.1.0"
+ resolved "https://registry.yarnpkg.com/find-up/-/find-up-4.1.0.tgz#97afe7d6cdc0bc5928584b7c8d7b16e8a9aa5d19"
+ integrity sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==
+ dependencies:
+ locate-path "^5.0.0"
+ path-exists "^4.0.0"
+
+flat-cache@^2.0.1:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-2.0.1.tgz#5d296d6f04bda44a4630a301413bdbc2ec085ec0"
+ integrity sha512-LoQe6yDuUMDzQAEH8sgmh4Md6oZnc/7PjtwjNFSzveXqSHt6ka9fPBuso7IGf9Rz4uqnSnWiFH2B/zj24a5ReA==
+ dependencies:
+ flatted "^2.0.0"
+ rimraf "2.6.3"
+ write "1.0.3"
+
+flatted@^2.0.0:
+ version "2.0.2"
+ resolved "https://registry.yarnpkg.com/flatted/-/flatted-2.0.2.tgz#4575b21e2bcee7434aa9be662f4b7b5f9c2b5138"
+ integrity sha512-r5wGx7YeOwNWNlCA0wQ86zKyDLMQr+/RB8xy74M4hTphfmjlijTSSXGuH8rnvKZnfT9i+75zmd8jcKdMR4O6jA==
+
+fs-extra@^8.1.0:
+ version "8.1.0"
+ resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-8.1.0.tgz#49d43c45a88cd9677668cb7be1b46efdb8d2e1c0"
+ integrity sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==
+ dependencies:
+ graceful-fs "^4.2.0"
+ jsonfile "^4.0.0"
+ universalify "^0.1.0"
+
+fs.realpath@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f"
+ integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8=
+
+function-bind@^1.1.1:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d"
+ integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==
+
+functional-red-black-tree@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz#1b0ab3bd553b2a0d6399d29c0e3ea0b252078327"
+ integrity sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=
+
+get-stdin@^6.0.0:
+ version "6.0.0"
+ resolved "https://registry.yarnpkg.com/get-stdin/-/get-stdin-6.0.0.tgz#9e09bf712b360ab9225e812048f71fde9c89657b"
+ integrity sha512-jp4tHawyV7+fkkSKyvjuLZswblUtz+SQKzSWnBbii16BuZksJlU1wuBYXY75r+duh/llF1ur6oNwi+2ZzjKZ7g==
+
+glob-parent@^5.0.0:
+ version "5.1.1"
+ resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.1.tgz#b6c1ef417c4e5663ea498f1c45afac6916bbc229"
+ integrity sha512-FnI+VGOpnlGHWZxthPGR+QhR78fuiK0sNLkHQv+bL9fQi57lNNdquIbna/WrfROrolq8GK5Ek6BiMwqL/voRYQ==
+ dependencies:
+ is-glob "^4.0.1"
+
+glob@^7.1.3:
+ version "7.1.6"
+ resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.6.tgz#141f33b81a7c2492e125594307480c46679278a6"
+ integrity sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==
+ dependencies:
+ fs.realpath "^1.0.0"
+ inflight "^1.0.4"
+ inherits "2"
+ minimatch "^3.0.4"
+ once "^1.3.0"
+ path-is-absolute "^1.0.0"
+
+globals@^11.1.0:
+ version "11.12.0"
+ resolved "https://registry.yarnpkg.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e"
+ integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==
+
+globals@^12.1.0:
+ version "12.4.0"
+ resolved "https://registry.yarnpkg.com/globals/-/globals-12.4.0.tgz#a18813576a41b00a24a97e7f815918c2e19925f8"
+ integrity sha512-BWICuzzDvDoH54NHKCseDanAhE3CeDorgDL5MT6LMXXj2WCnd9UC2szdk4AWLfjdgNBCXLUanXYcpBBKOSWGwg==
+ dependencies:
+ type-fest "^0.8.1"
+
+graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.2.0:
+ version "4.2.4"
+ resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.4.tgz#2256bde14d3632958c465ebc96dc467ca07a29fb"
+ integrity sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==
+
+has-flag@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd"
+ integrity sha1-tdRU3CGZriJWmfNGfloH87lVuv0=
+
+has-flag@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b"
+ integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==
+
+has-symbols@^1.0.0, has-symbols@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.1.tgz#9f5214758a44196c406d9bd76cebf81ec2dd31e8"
+ integrity sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg==
+
+has@^1.0.3:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796"
+ integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==
+ dependencies:
+ function-bind "^1.1.1"
+
+hosted-git-info@^2.1.4:
+ version "2.8.8"
+ resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.8.8.tgz#7539bd4bc1e0e0a895815a2e0262420b12858488"
+ integrity sha512-f/wzC2QaWBs7t9IYqB4T3sR1xviIViXJRJTWBlx2Gf3g0Xi5vI7Yy4koXQ1c9OYDGHN9sBy1DQ2AB8fqZBWhUg==
+
+https-proxy-agent@^2.2.1:
+ version "2.2.4"
+ resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-2.2.4.tgz#4ee7a737abd92678a293d9b34a1af4d0d08c787b"
+ integrity sha512-OmvfoQ53WLjtA9HeYP9RNrWMJzzAz1JGaSFr1nijg0PVR1JaD/xbJq1mdEIIlxGpXp9eSe/O2LgU9DJmTPd0Eg==
+ dependencies:
+ agent-base "^4.3.0"
+ debug "^3.1.0"
+
+iconv-lite@^0.4.24:
+ version "0.4.24"
+ resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b"
+ integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==
+ dependencies:
+ safer-buffer ">= 2.1.2 < 3"
+
+ignore@^4.0.6:
+ version "4.0.6"
+ resolved "https://registry.yarnpkg.com/ignore/-/ignore-4.0.6.tgz#750e3db5862087b4737ebac8207ffd1ef27b25fc"
+ integrity sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==
+
+ignore@^5.1.1:
+ version "5.1.8"
+ resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.1.8.tgz#f150a8b50a34289b33e22f5889abd4d8016f0e57"
+ integrity sha512-BMpfD7PpiETpBl/A6S498BaIJ6Y/ABT93ETbby2fP00v4EbvPBXWEoaR1UBPKs3iR53pJY7EtZk5KACI57i1Uw==
+
+import-fresh@^3.0.0:
+ version "3.2.1"
+ resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.2.1.tgz#633ff618506e793af5ac91bf48b72677e15cbe66"
+ integrity sha512-6e1q1cnWP2RXD9/keSkxHScg508CdXqXWgWBaETNhyuBFz+kUZlKboh+ISK+bU++DmbHimVBrOz/zzPe0sZ3sQ==
+ dependencies:
+ parent-module "^1.0.0"
+ resolve-from "^4.0.0"
+
+import-modules@^1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/import-modules/-/import-modules-1.1.0.tgz#748db79c5cc42bb9701efab424f894e72600e9dc"
+ integrity sha1-dI23nFzEK7lwHvq0JPiU5yYA6dw=
+
+imurmurhash@^0.1.4:
+ version "0.1.4"
+ resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea"
+ integrity sha1-khi5srkoojixPcT7a21XbyMUU+o=
+
+inflight@^1.0.4:
+ version "1.0.6"
+ resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9"
+ integrity sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=
+ dependencies:
+ once "^1.3.0"
+ wrappy "1"
+
+inherits@2, inherits@^2.0.3, inherits@~2.0.3:
+ version "2.0.4"
+ resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c"
+ integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==
+
+inquirer@^7.0.0:
+ version "7.1.0"
+ resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-7.1.0.tgz#1298a01859883e17c7264b82870ae1034f92dd29"
+ integrity sha512-5fJMWEmikSYu0nv/flMc475MhGbB7TSPd/2IpFV4I4rMklboCH2rQjYY5kKiYGHqUF9gvaambupcJFFG9dvReg==
+ dependencies:
+ ansi-escapes "^4.2.1"
+ chalk "^3.0.0"
+ cli-cursor "^3.1.0"
+ cli-width "^2.0.0"
+ external-editor "^3.0.3"
+ figures "^3.0.0"
+ lodash "^4.17.15"
+ mute-stream "0.0.8"
+ run-async "^2.4.0"
+ rxjs "^6.5.3"
+ string-width "^4.1.0"
+ strip-ansi "^6.0.0"
+ through "^2.3.6"
+
+is-arrayish@^0.2.1:
+ version "0.2.1"
+ resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d"
+ integrity sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=
+
+is-callable@^1.1.4, is-callable@^1.1.5:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.0.tgz#83336560b54a38e35e3a2df7afd0454d691468bb"
+ integrity sha512-pyVD9AaGLxtg6srb2Ng6ynWJqkHU9bEM087AKck0w8QwDarTfNcpIYoU8x8Hv2Icm8u6kFJM18Dag8lyqGkviw==
+
+is-date-object@^1.0.1:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.2.tgz#bda736f2cd8fd06d32844e7743bfa7494c3bfd7e"
+ integrity sha512-USlDT524woQ08aoZFzh3/Z6ch9Y/EWXEHQ/AaRN0SkKq4t2Jw2R2339tSXmwuVoY7LLlBCbOIlx2myP/L5zk0g==
+
+is-extglob@^2.1.1:
+ version "2.1.1"
+ resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2"
+ integrity sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=
+
+is-fullwidth-code-point@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f"
+ integrity sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=
+
+is-fullwidth-code-point@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d"
+ integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==
+
+is-glob@^4.0.0, is-glob@^4.0.1:
+ version "4.0.1"
+ resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.1.tgz#7567dbe9f2f5e2467bc77ab83c4a29482407a5dc"
+ integrity sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==
+ dependencies:
+ is-extglob "^2.1.1"
+
+is-regex@^1.0.5:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.1.0.tgz#ece38e389e490df0dc21caea2bd596f987f767ff"
+ integrity sha512-iI97M8KTWID2la5uYXlkbSDQIg4F6o1sYboZKKTDpnDQMLtUL86zxhgDet3Q2SriaYsyGqZ6Mn2SjbRKeLHdqw==
+ dependencies:
+ has-symbols "^1.0.1"
+
+is-string@^1.0.5:
+ version "1.0.5"
+ resolved "https://registry.yarnpkg.com/is-string/-/is-string-1.0.5.tgz#40493ed198ef3ff477b8c7f92f644ec82a5cd3a6"
+ integrity sha512-buY6VNRjhQMiF1qWDouloZlQbRhDPCebwxSjxMjxgemYT46YMd2NR0/H+fBhEfWX4A/w9TBJ+ol+okqJKFE6vQ==
+
+is-symbol@^1.0.2:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.3.tgz#38e1014b9e6329be0de9d24a414fd7441ec61937"
+ integrity sha512-OwijhaRSgqvhm/0ZdAcXNZt9lYdKFpcRDT5ULUuYXPoT794UNOdU+gpT6Rzo7b4V2HUl/op6GqY894AZwv9faQ==
+ dependencies:
+ has-symbols "^1.0.1"
+
+isarray@^1.0.0, isarray@~1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11"
+ integrity sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=
+
+isexe@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10"
+ integrity sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=
+
+js-tokens@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499"
+ integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==
+
+js-yaml@^3.13.1:
+ version "3.14.0"
+ resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.14.0.tgz#a7a34170f26a21bb162424d8adacb4113a69e482"
+ integrity sha512-/4IbIeHcD9VMHFqDR/gQ7EdZdLimOvW2DdcxFjdyyZ9NsbS+ccrXqVWDtab/lRl5AlUqmpBx8EhPaWR+OtY17A==
+ dependencies:
+ argparse "^1.0.7"
+ esprima "^4.0.0"
+
+jsesc@^2.5.1:
+ version "2.5.2"
+ resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-2.5.2.tgz#80564d2e483dacf6e8ef209650a67df3f0c283a4"
+ integrity sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==
+
+json-schema-traverse@^0.4.1:
+ version "0.4.1"
+ resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660"
+ integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==
+
+json-stable-stringify-without-jsonify@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651"
+ integrity sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=
+
+json5@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/json5/-/json5-1.0.1.tgz#779fb0018604fa854eacbf6252180d83543e3dbe"
+ integrity sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==
+ dependencies:
+ minimist "^1.2.0"
+
+json5@^2.1.2:
+ version "2.1.3"
+ resolved "https://registry.yarnpkg.com/json5/-/json5-2.1.3.tgz#c9b0f7fa9233bfe5807fe66fcf3a5617ed597d43"
+ integrity sha512-KXPvOm8K9IJKFM0bmdn8QXh7udDh1g/giieX0NLCaMnb4hEiVFqnop2ImTXCc5e0/oHz3LTqmHGtExn5hfMkOA==
+ dependencies:
+ minimist "^1.2.5"
+
+jsonfile@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-4.0.0.tgz#8771aae0799b64076b76640fca058f9c10e33ecb"
+ integrity sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=
+ optionalDependencies:
+ graceful-fs "^4.1.6"
+
+languagedetect@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/languagedetect/-/languagedetect-2.0.0.tgz#4b8fa2b7593b2a3a02fb1100891041c53238936c"
+ integrity sha512-AZb/liiQ+6ZoTj4f1J0aE6OkzhCo8fyH+tuSaPfSo8YHCWLFJrdSixhtO2TYdIkjcDQNaR4RmGaV2A5FJklDMQ==
+
+levn@^0.3.0, levn@~0.3.0:
+ version "0.3.0"
+ resolved "https://registry.yarnpkg.com/levn/-/levn-0.3.0.tgz#3b09924edf9f083c0490fdd4c0bc4421e04764ee"
+ integrity sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=
+ dependencies:
+ prelude-ls "~1.1.2"
+ type-check "~0.3.2"
+
+load-json-file@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-2.0.0.tgz#7947e42149af80d696cbf797bcaabcfe1fe29ca8"
+ integrity sha1-eUfkIUmvgNaWy/eXvKq8/h/inKg=
+ dependencies:
+ graceful-fs "^4.1.2"
+ parse-json "^2.2.0"
+ pify "^2.0.0"
+ strip-bom "^3.0.0"
+
+loader-utils@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-2.0.0.tgz#e4cace5b816d425a166b5f097e10cd12b36064b0"
+ integrity sha512-rP4F0h2RaWSvPEkD7BLDFQnvSf+nK+wr3ESUjNTyAGobqrijmW92zc+SO6d4p4B1wh7+B/Jg1mkQe5NYUEHtHQ==
+ dependencies:
+ big.js "^5.2.2"
+ emojis-list "^3.0.0"
+ json5 "^2.1.2"
+
+locate-path@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-2.0.0.tgz#2b568b265eec944c6d9c0de9c3dbbbca0354cd8e"
+ integrity sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=
+ dependencies:
+ p-locate "^2.0.0"
+ path-exists "^3.0.0"
+
+locate-path@^5.0.0:
+ version "5.0.0"
+ resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-5.0.0.tgz#1afba396afd676a6d42504d0a67a3a7eb9f62aa0"
+ integrity sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==
+ dependencies:
+ p-locate "^4.1.0"
+
+lodash.camelcase@^4.1.1:
+ version "4.3.0"
+ resolved "https://registry.yarnpkg.com/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz#b28aa6288a2b9fc651035c7711f65ab6190331a6"
+ integrity sha1-soqmKIorn8ZRA1x3EfZathkDMaY=
+
+lodash.defaultsdeep@^4.6.0:
+ version "4.6.1"
+ resolved "https://registry.yarnpkg.com/lodash.defaultsdeep/-/lodash.defaultsdeep-4.6.1.tgz#512e9bd721d272d94e3d3a63653fa17516741ca6"
+ integrity sha512-3j8wdDzYuWO3lM3Reg03MuQR957t287Rpcxp1njpEa8oDrikb+FwGdW3n+FELh/A6qib6yPit0j/pv9G/yeAqA==
+
+lodash.get@^4.4.2:
+ version "4.4.2"
+ resolved "https://registry.yarnpkg.com/lodash.get/-/lodash.get-4.4.2.tgz#2d177f652fa31e939b4438d5341499dfa3825e99"
+ integrity sha1-LRd/ZS+jHpObRDjVNBSZ36OCXpk=
+
+lodash.kebabcase@^4.0.1:
+ version "4.1.1"
+ resolved "https://registry.yarnpkg.com/lodash.kebabcase/-/lodash.kebabcase-4.1.1.tgz#8489b1cb0d29ff88195cceca448ff6d6cc295c36"
+ integrity sha1-hImxyw0p/4gZXM7KRI/21swpXDY=
+
+lodash.omit@^4.5.0:
+ version "4.5.0"
+ resolved "https://registry.yarnpkg.com/lodash.omit/-/lodash.omit-4.5.0.tgz#6eb19ae5a1ee1dd9df0b969e66ce0b7fa30b5e60"
+ integrity sha1-brGa5aHuHdnfC5aeZs4Lf6MLXmA=
+
+lodash.pick@^4.4.0:
+ version "4.4.0"
+ resolved "https://registry.yarnpkg.com/lodash.pick/-/lodash.pick-4.4.0.tgz#52f05610fff9ded422611441ed1fc123a03001b3"
+ integrity sha1-UvBWEP/53tQiYRRB7R/BI6AwAbM=
+
+lodash.snakecase@^4.0.1:
+ version "4.1.1"
+ resolved "https://registry.yarnpkg.com/lodash.snakecase/-/lodash.snakecase-4.1.1.tgz#39d714a35357147837aefd64b5dcbb16becd8f8d"
+ integrity sha1-OdcUo1NXFHg3rv1ktdy7Fr7Nj40=
+
+lodash.topairs@^4.3.0:
+ version "4.3.0"
+ resolved "https://registry.yarnpkg.com/lodash.topairs/-/lodash.topairs-4.3.0.tgz#3b6deaa37d60fb116713c46c5f17ea190ec48d64"
+ integrity sha1-O23qo31g+xFnE8RsXxfqGQ7EjWQ=
+
+lodash.unescape@4.0.1:
+ version "4.0.1"
+ resolved "https://registry.yarnpkg.com/lodash.unescape/-/lodash.unescape-4.0.1.tgz#bf2249886ce514cda112fae9218cdc065211fc9c"
+ integrity sha1-vyJJiGzlFM2hEvrpIYzcBlIR/Jw=
+
+lodash.upperfirst@^4.2.0:
+ version "4.3.1"
+ resolved "https://registry.yarnpkg.com/lodash.upperfirst/-/lodash.upperfirst-4.3.1.tgz#1365edf431480481ef0d1c68957a5ed99d49f7ce"
+ integrity sha1-E2Xt9DFIBIHvDRxolXpe2Z1J984=
+
+lodash.zip@^4.2.0:
+ version "4.2.0"
+ resolved "https://registry.yarnpkg.com/lodash.zip/-/lodash.zip-4.2.0.tgz#ec6662e4896408ed4ab6c542a3990b72cc080020"
+ integrity sha1-7GZi5IlkCO1KtsVCo5kLcswIACA=
+
+lodash@^4.17.11, lodash@^4.17.13, lodash@^4.17.14, lodash@^4.17.15:
+ version "4.17.15"
+ resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.15.tgz#b447f6670a0455bbfeedd11392eff330ea097548"
+ integrity sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==
+
+make-dir@^3.0.2:
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-3.1.0.tgz#415e967046b3a7f1d185277d84aa58203726a13f"
+ integrity sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==
+ dependencies:
+ semver "^6.0.0"
+
+mime@^2.0.3:
+ version "2.4.6"
+ resolved "https://registry.yarnpkg.com/mime/-/mime-2.4.6.tgz#e5b407c90db442f2beb5b162373d07b69affa4d1"
+ integrity sha512-RZKhC3EmpBchfTGBVb8fb+RL2cWyw/32lshnsETttkBAyAUXSGHxbEJWWRXc751DrIxG1q04b8QwMbAwkRPpUA==
+
+mimic-fn@^2.1.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b"
+ integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==
+
+minimatch@^3.0.4:
+ version "3.0.4"
+ resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083"
+ integrity sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==
+ dependencies:
+ brace-expansion "^1.1.7"
+
+minimist@^1.2.0, minimist@^1.2.5:
+ version "1.2.5"
+ resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.5.tgz#67d66014b66a6a8aaa0c083c5fd58df4e4e97602"
+ integrity sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==
+
+mkdirp@^0.5.1, mkdirp@^0.5.4:
+ version "0.5.5"
+ resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.5.tgz#d91cefd62d1436ca0f41620e251288d420099def"
+ integrity sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==
+ dependencies:
+ minimist "^1.2.5"
+
+ms@2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8"
+ integrity sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=
+
+ms@^2.1.1:
+ version "2.1.2"
+ resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009"
+ integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==
+
+mute-stream@0.0.8:
+ version "0.0.8"
+ resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.8.tgz#1630c42b2251ff81e2a283de96a5497ea92e5e0d"
+ integrity sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==
+
+natural-compare@^1.4.0:
+ version "1.4.0"
+ resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7"
+ integrity sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=
+
+nice-try@^1.0.4:
+ version "1.0.5"
+ resolved "https://registry.yarnpkg.com/nice-try/-/nice-try-1.0.5.tgz#a3378a7696ce7d223e88fc9b764bd7ef1089e366"
+ integrity sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==
+
+normalize-package-data@^2.3.2:
+ version "2.5.0"
+ resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.5.0.tgz#e66db1838b200c1dfc233225d12cb36520e234a8"
+ integrity sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==
+ dependencies:
+ hosted-git-info "^2.1.4"
+ resolve "^1.10.0"
+ semver "2 || 3 || 4 || 5"
+ validate-npm-package-license "^3.0.1"
+
+object-hash@^2.0.3:
+ version "2.0.3"
+ resolved "https://registry.yarnpkg.com/object-hash/-/object-hash-2.0.3.tgz#d12db044e03cd2ca3d77c0570d87225b02e1e6ea"
+ integrity sha512-JPKn0GMu+Fa3zt3Bmr66JhokJU5BaNBIh4ZeTlaCBzrBsOeXzwcKKAK1tbLiPKgvwmPXsDvvLHoWh5Bm7ofIYg==
+
+object-inspect@^1.7.0:
+ version "1.7.0"
+ resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.7.0.tgz#f4f6bd181ad77f006b5ece60bd0b6f398ff74a67"
+ integrity sha512-a7pEHdh1xKIAgTySUGgLMx/xwDZskN1Ud6egYYN3EdRW4ZMPNEDUTF+hwy2LUC+Bl+SyLXANnwz/jyh/qutKUw==
+
+object-keys@^1.0.11, object-keys@^1.0.12, object-keys@^1.1.1:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e"
+ integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==
+
+object.assign@^4.1.0:
+ version "4.1.0"
+ resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.0.tgz#968bf1100d7956bb3ca086f006f846b3bc4008da"
+ integrity sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w==
+ dependencies:
+ define-properties "^1.1.2"
+ function-bind "^1.1.1"
+ has-symbols "^1.0.0"
+ object-keys "^1.0.11"
+
+object.values@^1.1.1:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/object.values/-/object.values-1.1.1.tgz#68a99ecde356b7e9295a3c5e0ce31dc8c953de5e"
+ integrity sha512-WTa54g2K8iu0kmS/us18jEmdv1a4Wi//BZ/DTVYEcH0XhLM5NYdpDHja3gt57VrZLcNAO2WGA+KpWsDBaHt6eA==
+ dependencies:
+ define-properties "^1.1.3"
+ es-abstract "^1.17.0-next.1"
+ function-bind "^1.1.1"
+ has "^1.0.3"
+
+once@^1.3.0:
+ version "1.4.0"
+ resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1"
+ integrity sha1-WDsap3WWHUsROsF9nFC6753Xa9E=
+ dependencies:
+ wrappy "1"
+
+onetime@^5.1.0:
+ version "5.1.0"
+ resolved "https://registry.yarnpkg.com/onetime/-/onetime-5.1.0.tgz#fff0f3c91617fe62bb50189636e99ac8a6df7be5"
+ integrity sha512-5NcSkPHhwTVFIQN+TUqXoS5+dlElHXdpAWu9I0HP20YOtIi+aZ0Ct82jdlILDxjLEAWwvm+qj1m6aEtsDVmm6Q==
+ dependencies:
+ mimic-fn "^2.1.0"
+
+optionator@^0.8.3:
+ version "0.8.3"
+ resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.8.3.tgz#84fa1d036fe9d3c7e21d99884b601167ec8fb495"
+ integrity sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==
+ dependencies:
+ deep-is "~0.1.3"
+ fast-levenshtein "~2.0.6"
+ levn "~0.3.0"
+ prelude-ls "~1.1.2"
+ type-check "~0.3.2"
+ word-wrap "~1.2.3"
+
+os-tmpdir@~1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274"
+ integrity sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=
+
+p-limit@^1.1.0:
+ version "1.3.0"
+ resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-1.3.0.tgz#b86bd5f0c25690911c7590fcbfc2010d54b3ccb8"
+ integrity sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==
+ dependencies:
+ p-try "^1.0.0"
+
+p-limit@^2.2.0:
+ version "2.3.0"
+ resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.3.0.tgz#3dd33c647a214fdfffd835933eb086da0dc21db1"
+ integrity sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==
+ dependencies:
+ p-try "^2.0.0"
+
+p-locate@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-2.0.0.tgz#20a0103b222a70c8fd39cc2e580680f3dde5ec43"
+ integrity sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=
+ dependencies:
+ p-limit "^1.1.0"
+
+p-locate@^4.1.0:
+ version "4.1.0"
+ resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-4.1.0.tgz#a3428bb7088b3a60292f66919278b7c297ad4f07"
+ integrity sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==
+ dependencies:
+ p-limit "^2.2.0"
+
+p-try@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/p-try/-/p-try-1.0.0.tgz#cbc79cdbaf8fd4228e13f621f2b1a237c1b207b3"
+ integrity sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=
+
+p-try@^2.0.0:
+ version "2.2.0"
+ resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6"
+ integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==
+
+parent-module@^1.0.0:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/parent-module/-/parent-module-1.0.1.tgz#691d2709e78c79fae3a156622452d00762caaaa2"
+ integrity sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==
+ dependencies:
+ callsites "^3.0.0"
+
+parse-json@^2.2.0:
+ version "2.2.0"
+ resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-2.2.0.tgz#f480f40434ef80741f8469099f8dea18f55a4dc9"
+ integrity sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=
+ dependencies:
+ error-ex "^1.2.0"
+
+path-exists@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515"
+ integrity sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=
+
+path-exists@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3"
+ integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==
+
+path-is-absolute@^1.0.0:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f"
+ integrity sha1-F0uSaHNVNP+8es5r9TpanhtcX18=
+
+path-key@^2.0.1:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/path-key/-/path-key-2.0.1.tgz#411cadb574c5a140d3a4b1910d40d80cc9f40b40"
+ integrity sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=
+
+path-parse@^1.0.6:
+ version "1.0.6"
+ resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.6.tgz#d62dbb5679405d72c4737ec58600e9ddcf06d24c"
+ integrity sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==
+
+path-type@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/path-type/-/path-type-2.0.0.tgz#f012ccb8415b7096fc2daa1054c3d72389594c73"
+ integrity sha1-8BLMuEFbcJb8LaoQVMPXI4lZTHM=
+ dependencies:
+ pify "^2.0.0"
+
+pend@~1.2.0:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/pend/-/pend-1.2.0.tgz#7a57eb550a6783f9115331fcf4663d5c8e007a50"
+ integrity sha1-elfrVQpng/kRUzH89GY9XI4AelA=
+
+pify@^2.0.0:
+ version "2.3.0"
+ resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c"
+ integrity sha1-7RQaasBDqEnqWISY59yosVMw6Qw=
+
+pkg-dir@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-2.0.0.tgz#f6d5d1109e19d63edf428e0bd57e12777615334b"
+ integrity sha1-9tXREJ4Z1j7fQo4L1X4Sd3YVM0s=
+ dependencies:
+ find-up "^2.1.0"
+
+pkg-dir@^4.1.0:
+ version "4.2.0"
+ resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-4.2.0.tgz#f099133df7ede422e81d1d8448270eeb3e4261f3"
+ integrity sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==
+ dependencies:
+ find-up "^4.0.0"
+
+pollock@^0.2.0:
+ version "0.2.1"
+ resolved "https://registry.yarnpkg.com/pollock/-/pollock-0.2.1.tgz#01273ae3542511492d07f1c10fa53f149b37c6ad"
+ integrity sha512-2Xy6LImSXm0ANKv9BKSVuCa6Z4ACbK7oUrl9gtUgqLkekL7n9C0mlWsOGYYuGbCG8xT0x3Q4F31C3ZMyVQjwsg==
+
+prelude-ls@~1.1.2:
+ version "1.1.2"
+ resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54"
+ integrity sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=
+
+prettier-linter-helpers@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz#d23d41fe1375646de2d0104d3454a3008802cf7b"
+ integrity sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==
+ dependencies:
+ fast-diff "^1.1.2"
+
+prettier@^1.16.4:
+ version "1.19.1"
+ resolved "https://registry.yarnpkg.com/prettier/-/prettier-1.19.1.tgz#f7d7f5ff8a9cd872a7be4ca142095956a60797cb"
+ integrity sha512-s7PoyDv/II1ObgQunCbB9PdLmUcBZcnWOcxDh7O0N/UwDEsHyqkW+Qh28jW+mVuCdx7gLB0BotYI1Y6uI9iyew==
+
+process-nextick-args@~2.0.0:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2"
+ integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==
+
+progress@^2.0.0, progress@^2.0.1:
+ version "2.0.3"
+ resolved "https://registry.yarnpkg.com/progress/-/progress-2.0.3.tgz#7e8cf8d8f5b8f239c1bc68beb4eb78567d572ef8"
+ integrity sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==
+
+proxy-from-env@^1.0.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/proxy-from-env/-/proxy-from-env-1.1.0.tgz#e102f16ca355424865755d2c9e8ea4f24d58c3e2"
+ integrity sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==
+
+punycode@^2.1.0:
+ version "2.1.1"
+ resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec"
+ integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==
+
+puppeteer@^1.10.0:
+ version "1.20.0"
+ resolved "https://registry.yarnpkg.com/puppeteer/-/puppeteer-1.20.0.tgz#e3d267786f74e1d87cf2d15acc59177f471bbe38"
+ integrity sha512-bt48RDBy2eIwZPrkgbcwHtb51mj2nKvHOPMaSH2IsWiv7lOG9k9zhaRzpDZafrk05ajMc3cu+lSQYYOfH2DkVQ==
+ dependencies:
+ debug "^4.1.0"
+ extract-zip "^1.6.6"
+ https-proxy-agent "^2.2.1"
+ mime "^2.0.3"
+ progress "^2.0.1"
+ proxy-from-env "^1.0.0"
+ rimraf "^2.6.1"
+ ws "^6.1.0"
+
+read-pkg-up@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-2.0.0.tgz#6b72a8048984e0c41e79510fd5e9fa99b3b549be"
+ integrity sha1-a3KoBImE4MQeeVEP1en6mbO1Sb4=
+ dependencies:
+ find-up "^2.0.0"
+ read-pkg "^2.0.0"
+
+read-pkg@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-2.0.0.tgz#8ef1c0623c6a6db0dc6713c4bfac46332b2368f8"
+ integrity sha1-jvHAYjxqbbDcZxPEv6xGMysjaPg=
+ dependencies:
+ load-json-file "^2.0.0"
+ normalize-package-data "^2.3.2"
+ path-type "^2.0.0"
+
+readable-stream@^2.2.2:
+ version "2.3.7"
+ resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.7.tgz#1eca1cf711aef814c04f62252a36a62f6cb23b57"
+ integrity sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==
+ dependencies:
+ core-util-is "~1.0.0"
+ inherits "~2.0.3"
+ isarray "~1.0.0"
+ process-nextick-args "~2.0.0"
+ safe-buffer "~5.1.1"
+ string_decoder "~1.1.1"
+ util-deprecate "~1.0.1"
+
+regexp-tree@~0.1.1:
+ version "0.1.21"
+ resolved "https://registry.yarnpkg.com/regexp-tree/-/regexp-tree-0.1.21.tgz#55e2246b7f7d36f1b461490942fa780299c400d7"
+ integrity sha512-kUUXjX4AnqnR8KRTCrayAo9PzYMRKmVoGgaz2tBuz0MF3g1ZbGebmtW0yFHfFK9CmBjQKeYIgoL22pFLBJY7sw==
+
+regexpp@^2.0.1:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-2.0.1.tgz#8d19d31cf632482b589049f8281f93dbcba4d07f"
+ integrity sha512-lv0M6+TkDVniA3aD1Eg0DVpfU/booSu7Eev3TDO/mZKHBfVjgCGTV4t4buppESEYDtkArYFOxTJWv6S5C+iaNw==
+
+reserved-words@^0.1.2:
+ version "0.1.2"
+ resolved "https://registry.yarnpkg.com/reserved-words/-/reserved-words-0.1.2.tgz#00a0940f98cd501aeaaac316411d9adc52b31ab1"
+ integrity sha1-AKCUD5jNUBrqqsMWQR2a3FKzGrE=
+
+resolve-from@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6"
+ integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==
+
+resolve@^1.10.0, resolve@^1.10.1, resolve@^1.12.0, resolve@^1.13.1, resolve@^1.17.0:
+ version "1.17.0"
+ resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.17.0.tgz#b25941b54968231cc2d1bb76a79cb7f2c0bf8444"
+ integrity sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w==
+ dependencies:
+ path-parse "^1.0.6"
+
+restore-cursor@^3.1.0:
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-3.1.0.tgz#39f67c54b3a7a58cea5236d95cf0034239631f7e"
+ integrity sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==
+ dependencies:
+ onetime "^5.1.0"
+ signal-exit "^3.0.2"
+
+rimraf@2.6.3:
+ version "2.6.3"
+ resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.3.tgz#b2d104fe0d8fb27cf9e0a1cda8262dd3833c6cab"
+ integrity sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==
+ dependencies:
+ glob "^7.1.3"
+
+rimraf@^2.6.1:
+ version "2.7.1"
+ resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.7.1.tgz#35797f13a7fdadc566142c29d4f07ccad483e3ec"
+ integrity sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==
+ dependencies:
+ glob "^7.1.3"
+
+run-async@^2.4.0:
+ version "2.4.1"
+ resolved "https://registry.yarnpkg.com/run-async/-/run-async-2.4.1.tgz#8440eccf99ea3e70bd409d49aab88e10c189a455"
+ integrity sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==
+
+rxjs@^6.5.3:
+ version "6.5.5"
+ resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-6.5.5.tgz#c5c884e3094c8cfee31bf27eb87e54ccfc87f9ec"
+ integrity sha512-WfQI+1gohdf0Dai/Bbmk5L5ItH5tYqm3ki2c5GdWhKjalzjg93N3avFjVStyZZz+A2Em+ZxKH5bNghw9UeylGQ==
+ dependencies:
+ tslib "^1.9.0"
+
+safe-buffer@~5.1.0, safe-buffer@~5.1.1:
+ version "5.1.2"
+ resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d"
+ integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==
+
+safe-regex@^2.0.1:
+ version "2.1.1"
+ resolved "https://registry.yarnpkg.com/safe-regex/-/safe-regex-2.1.1.tgz#f7128f00d056e2fe5c11e81a1324dd974aadced2"
+ integrity sha512-rx+x8AMzKb5Q5lQ95Zoi6ZbJqwCLkqi3XuJXp5P3rT8OEc6sZCJG5AE5dU3lsgRr/F4Bs31jSlVN+j5KrsGu9A==
+ dependencies:
+ regexp-tree "~0.1.1"
+
+"safer-buffer@>= 2.1.2 < 3":
+ version "2.1.2"
+ resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a"
+ integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==
+
+schema-utils@^2.6.5:
+ version "2.7.0"
+ resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-2.7.0.tgz#17151f76d8eae67fbbf77960c33c676ad9f4efc7"
+ integrity sha512-0ilKFI6QQF5nxDZLFn2dMjvc4hjg/Wkg7rHd3jK6/A4a1Hl9VFdQWvgB1UMGoU94pad1P/8N7fMcEnLnSiju8A==
+ dependencies:
+ "@types/json-schema" "^7.0.4"
+ ajv "^6.12.2"
+ ajv-keywords "^3.4.1"
+
+"semver@2 || 3 || 4 || 5", semver@^5.5.0, semver@^5.6.0:
+ version "5.7.1"
+ resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7"
+ integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==
+
+semver@5.5.0:
+ version "5.5.0"
+ resolved "https://registry.yarnpkg.com/semver/-/semver-5.5.0.tgz#dc4bbc7a6ca9d916dee5d43516f0092b58f7b8ab"
+ integrity sha512-4SJ3dm0WAwWy/NVeioZh5AntkdJoWKxHxcmyP622fOkgHa4z3R0TdBJICINyaSDE6uNwVc8gZr+ZinwZAH4xIA==
+
+semver@^6.0.0, semver@^6.1.0, semver@^6.1.2:
+ version "6.3.0"
+ resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d"
+ integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==
+
+semver@^7.1.3:
+ version "7.3.2"
+ resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.2.tgz#604962b052b81ed0786aae84389ffba70ffd3938"
+ integrity sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ==
+
+shebang-command@^1.2.0:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-1.2.0.tgz#44aac65b695b03398968c39f363fee5deafdf1ea"
+ integrity sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=
+ dependencies:
+ shebang-regex "^1.0.0"
+
+shebang-regex@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-1.0.0.tgz#da42f49740c0b42db2ca9728571cb190c98efea3"
+ integrity sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=
+
+signal-exit@^3.0.2:
+ version "3.0.3"
+ resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.3.tgz#a1410c2edd8f077b08b4e253c8eacfcaf057461c"
+ integrity sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==
+
+slice-ansi@^2.1.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-2.1.0.tgz#cacd7693461a637a5788d92a7dd4fba068e81636"
+ integrity sha512-Qu+VC3EwYLldKa1fCxuuvULvSJOKEgk9pi8dZeCVK7TqBfUNTH4sFkk4joj8afVSfAYgJoSOetjx9QWOJ5mYoQ==
+ dependencies:
+ ansi-styles "^3.2.0"
+ astral-regex "^1.0.0"
+ is-fullwidth-code-point "^2.0.0"
+
+source-map@^0.5.0:
+ version "0.5.7"
+ resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc"
+ integrity sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=
+
+spdx-correct@^3.0.0:
+ version "3.1.1"
+ resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-3.1.1.tgz#dece81ac9c1e6713e5f7d1b6f17d468fa53d89a9"
+ integrity sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w==
+ dependencies:
+ spdx-expression-parse "^3.0.0"
+ spdx-license-ids "^3.0.0"
+
+spdx-exceptions@^2.1.0:
+ version "2.3.0"
+ resolved "https://registry.yarnpkg.com/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz#3f28ce1a77a00372683eade4a433183527a2163d"
+ integrity sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==
+
+spdx-expression-parse@^3.0.0:
+ version "3.0.1"
+ resolved "https://registry.yarnpkg.com/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz#cf70f50482eefdc98e3ce0a6833e4a53ceeba679"
+ integrity sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==
+ dependencies:
+ spdx-exceptions "^2.1.0"
+ spdx-license-ids "^3.0.0"
+
+spdx-license-ids@^3.0.0:
+ version "3.0.5"
+ resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.5.tgz#3694b5804567a458d3c8045842a6358632f62654"
+ integrity sha512-J+FWzZoynJEXGphVIS+XEh3kFSjZX/1i9gFBaWQcB+/tmpe2qUsSBABpcxqxnAxFdiUFEgAX1bjYGQvIZmoz9Q==
+
+sprintf-js@~1.0.2:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c"
+ integrity sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=
+
+string-width@^3.0.0:
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/string-width/-/string-width-3.1.0.tgz#22767be21b62af1081574306f69ac51b62203961"
+ integrity sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==
+ dependencies:
+ emoji-regex "^7.0.1"
+ is-fullwidth-code-point "^2.0.0"
+ strip-ansi "^5.1.0"
+
+string-width@^4.1.0:
+ version "4.2.0"
+ resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.0.tgz#952182c46cc7b2c313d1596e623992bd163b72b5"
+ integrity sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==
+ dependencies:
+ emoji-regex "^8.0.0"
+ is-fullwidth-code-point "^3.0.0"
+ strip-ansi "^6.0.0"
+
+string.prototype.trimend@^1.0.0:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.1.tgz#85812a6b847ac002270f5808146064c995fb6913"
+ integrity sha512-LRPxFUaTtpqYsTeNKaFOw3R4bxIzWOnbQ837QfBylo8jIxtcbK/A/sMV7Q+OAV/vWo+7s25pOE10KYSjaSO06g==
+ dependencies:
+ define-properties "^1.1.3"
+ es-abstract "^1.17.5"
+
+string.prototype.trimleft@^2.1.1:
+ version "2.1.2"
+ resolved "https://registry.yarnpkg.com/string.prototype.trimleft/-/string.prototype.trimleft-2.1.2.tgz#4408aa2e5d6ddd0c9a80739b087fbc067c03b3cc"
+ integrity sha512-gCA0tza1JBvqr3bfAIFJGqfdRTyPae82+KTnm3coDXkZN9wnuW3HjGgN386D7hfv5CHQYCI022/rJPVlqXyHSw==
+ dependencies:
+ define-properties "^1.1.3"
+ es-abstract "^1.17.5"
+ string.prototype.trimstart "^1.0.0"
+
+string.prototype.trimright@^2.1.1:
+ version "2.1.2"
+ resolved "https://registry.yarnpkg.com/string.prototype.trimright/-/string.prototype.trimright-2.1.2.tgz#c76f1cef30f21bbad8afeb8db1511496cfb0f2a3"
+ integrity sha512-ZNRQ7sY3KroTaYjRS6EbNiiHrOkjihL9aQE/8gfQ4DtAC/aEBRHFJa44OmoWxGGqXuJlfKkZW4WcXErGr+9ZFg==
+ dependencies:
+ define-properties "^1.1.3"
+ es-abstract "^1.17.5"
+ string.prototype.trimend "^1.0.0"
+
+string.prototype.trimstart@^1.0.0:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.1.tgz#14af6d9f34b053f7cfc89b72f8f2ee14b9039a54"
+ integrity sha512-XxZn+QpvrBI1FOcg6dIpxUPgWCPuNXvMD72aaRaUQv1eD4e/Qy8i/hFTe0BUmD60p/QA6bh1avmuPTfNjqVWRw==
+ dependencies:
+ define-properties "^1.1.3"
+ es-abstract "^1.17.5"
+
+string_decoder@~1.1.1:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8"
+ integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==
+ dependencies:
+ safe-buffer "~5.1.0"
+
+strip-ansi@^5.1.0, strip-ansi@^5.2.0:
+ version "5.2.0"
+ resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-5.2.0.tgz#8c9a536feb6afc962bdfa5b104a5091c1ad9c0ae"
+ integrity sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==
+ dependencies:
+ ansi-regex "^4.1.0"
+
+strip-ansi@^6.0.0:
+ version "6.0.0"
+ resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.0.tgz#0b1571dd7669ccd4f3e06e14ef1eed26225ae532"
+ integrity sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==
+ dependencies:
+ ansi-regex "^5.0.0"
+
+strip-bom@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3"
+ integrity sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=
+
+strip-json-comments@^3.0.1:
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.0.tgz#7638d31422129ecf4457440009fba03f9f9ac180"
+ integrity sha512-e6/d0eBu7gHtdCqFt0xJr642LdToM5/cN4Qb9DbHjVx1CP5RyeM+zH7pbecEmDv/lBqb0QH+6Uqq75rxFPkM0w==
+
+supports-color@^5.3.0:
+ version "5.5.0"
+ resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f"
+ integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==
+ dependencies:
+ has-flag "^3.0.0"
+
+supports-color@^7.1.0:
+ version "7.1.0"
+ resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.1.0.tgz#68e32591df73e25ad1c4b49108a2ec507962bfd1"
+ integrity sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==
+ dependencies:
+ has-flag "^4.0.0"
+
+table@^5.2.3:
+ version "5.4.6"
+ resolved "https://registry.yarnpkg.com/table/-/table-5.4.6.tgz#1292d19500ce3f86053b05f0e8e7e4a3bb21079e"
+ integrity sha512-wmEc8m4fjnob4gt5riFRtTu/6+4rSe12TpAELNSqHMfF3IqnA+CH37USM6/YR3qRZv7e56kAEAtd6nKZaxe0Ug==
+ dependencies:
+ ajv "^6.10.2"
+ lodash "^4.17.14"
+ slice-ansi "^2.1.0"
+ string-width "^3.0.0"
+
+text-table@^0.2.0:
+ version "0.2.0"
+ resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4"
+ integrity sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=
+
+through@^2.3.6:
+ version "2.3.8"
+ resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5"
+ integrity sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=
+
+tmp@0.0.33, tmp@^0.0.33:
+ version "0.0.33"
+ resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.33.tgz#6d34335889768d21b2bcda0aa277ced3b1bfadf9"
+ integrity sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==
+ dependencies:
+ os-tmpdir "~1.0.2"
+
+to-fast-properties@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz#dc5e698cbd079265bc73e0377681a4e4e83f616e"
+ integrity sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=
+
+tsconfig-paths@^3.9.0:
+ version "3.9.0"
+ resolved "https://registry.yarnpkg.com/tsconfig-paths/-/tsconfig-paths-3.9.0.tgz#098547a6c4448807e8fcb8eae081064ee9a3c90b"
+ integrity sha512-dRcuzokWhajtZWkQsDVKbWyY+jgcLC5sqJhg2PSgf4ZkH2aHPvaOY8YWGhmjb68b5qqTfasSsDO9k7RUiEmZAw==
+ dependencies:
+ "@types/json5" "^0.0.29"
+ json5 "^1.0.1"
+ minimist "^1.2.0"
+ strip-bom "^3.0.0"
+
+tslib@^1.9.0:
+ version "1.13.0"
+ resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.13.0.tgz#c881e13cc7015894ed914862d276436fa9a47043"
+ integrity sha512-i/6DQjL8Xf3be4K/E6Wgpekn5Qasl1usyw++dAA35Ue5orEn65VIxOA+YvNNl9HV3qv70T7CNwjODHZrLwvd1Q==
+
+type-check@~0.3.2:
+ version "0.3.2"
+ resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.3.2.tgz#5884cab512cf1d355e3fb784f30804b2b520db72"
+ integrity sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=
+ dependencies:
+ prelude-ls "~1.1.2"
+
+type-fest@^0.11.0:
+ version "0.11.0"
+ resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.11.0.tgz#97abf0872310fed88a5c466b25681576145e33f1"
+ integrity sha512-OdjXJxnCN1AvyLSzeKIgXTXxV+99ZuXl3Hpo9XpJAv9MBcHrrJOQ5kV7ypXOuQie+AmWG25hLbiKdwYTifzcfQ==
+
+type-fest@^0.8.1:
+ version "0.8.1"
+ resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.8.1.tgz#09e249ebde851d3b1e48d27c105444667f17b83d"
+ integrity sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==
+
+typedarray@^0.0.6:
+ version "0.0.6"
+ resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777"
+ integrity sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=
+
+universalify@^0.1.0:
+ version "0.1.2"
+ resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.1.2.tgz#b646f69be3942dabcecc9d6639c80dc105efaa66"
+ integrity sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==
+
+uri-js@^4.2.2:
+ version "4.2.2"
+ resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.2.2.tgz#94c540e1ff772956e2299507c010aea6c8838eb0"
+ integrity sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==
+ dependencies:
+ punycode "^2.1.0"
+
+util-deprecate@~1.0.1:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf"
+ integrity sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=
+
+v8-compile-cache@^2.0.3:
+ version "2.1.1"
+ resolved "https://registry.yarnpkg.com/v8-compile-cache/-/v8-compile-cache-2.1.1.tgz#54bc3cdd43317bca91e35dcaf305b1a7237de745"
+ integrity sha512-8OQ9CL+VWyt3JStj7HX7/ciTL2V3Rl1Wf5OL+SNTm0yK1KvtReVulksyeRnCANHHuUxHlQig+JJDlUhBt1NQDQ==
+
+validate-npm-package-license@^3.0.1:
+ version "3.0.4"
+ resolved "https://registry.yarnpkg.com/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz#fc91f6b9c7ba15c857f4cb2c5defeec39d4f410a"
+ integrity sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==
+ dependencies:
+ spdx-correct "^3.0.0"
+ spdx-expression-parse "^3.0.0"
+
+vue-eslint-parser@^5.0.0:
+ version "5.0.0"
+ resolved "https://registry.yarnpkg.com/vue-eslint-parser/-/vue-eslint-parser-5.0.0.tgz#00f4e4da94ec974b821a26ff0ed0f7a78402b8a1"
+ integrity sha512-JlHVZwBBTNVvzmifwjpZYn0oPWH2SgWv5dojlZBsrhablDu95VFD+hriB1rQGwbD+bms6g+rAFhQHk6+NyiS6g==
+ dependencies:
+ debug "^4.1.0"
+ eslint-scope "^4.0.0"
+ eslint-visitor-keys "^1.0.0"
+ espree "^4.1.0"
+ esquery "^1.0.1"
+ lodash "^4.17.11"
+
+vue-eslint-parser@^7.0.0:
+ version "7.1.0"
+ resolved "https://registry.yarnpkg.com/vue-eslint-parser/-/vue-eslint-parser-7.1.0.tgz#9cdbcc823e656b087507a1911732b867ac101e83"
+ integrity sha512-Kr21uPfthDc63nDl27AGQEhtt9VrZ9nkYk/NTftJ2ws9XiJwzJJCnCr3AITQ2jpRMA0XPGDECxYH8E027qMK9Q==
+ dependencies:
+ debug "^4.1.1"
+ eslint-scope "^5.0.0"
+ eslint-visitor-keys "^1.1.0"
+ espree "^6.2.1"
+ esquery "^1.0.1"
+ lodash "^4.17.15"
+
+which@^1.2.9:
+ version "1.3.1"
+ resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a"
+ integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==
+ dependencies:
+ isexe "^2.0.0"
+
+word-wrap@~1.2.3:
+ version "1.2.3"
+ resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.3.tgz#610636f6b1f703891bd34771ccb17fb93b47079c"
+ integrity sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==
+
+wrappy@1:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f"
+ integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=
+
+write@1.0.3:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/write/-/write-1.0.3.tgz#0800e14523b923a387e415123c865616aae0f5c3"
+ integrity sha512-/lg70HAjtkUgWPVZhZcm+T4hkL8Zbtp1nFNOn3lRrxnlv50SRBv7cR7RqR+GMsd3hUXy9hWBo4CHTbFTcOYwig==
+ dependencies:
+ mkdirp "^0.5.1"
+
+ws@^6.1.0:
+ version "6.2.1"
+ resolved "https://registry.yarnpkg.com/ws/-/ws-6.2.1.tgz#442fdf0a47ed64f59b6a5d8ff130f4748ed524fb"
+ integrity sha512-GIyAXC2cB7LjvpgMt9EKS2ldqr0MTrORaleiOno6TweZ6r3TKtoFQWay/2PceJ3RuBasOHzXNn5Lrw1X0bEjqA==
+ dependencies:
+ async-limiter "~1.0.0"
+
+yauzl@^2.10.0:
+ version "2.10.0"
+ resolved "https://registry.yarnpkg.com/yauzl/-/yauzl-2.10.0.tgz#c7eb17c93e112cb1086fa6d8e51fb0667b79a5f9"
+ integrity sha1-x+sXyT4RLLEIb6bY5R+wZnt5pfk=
+ dependencies:
+ buffer-crc32 "~0.2.3"
+ fd-slicer "~1.1.0"