Microsoft has acquired GitHub. Decentraleyes has left GitHub. Welcome to its new home!

To participate, please register, or sign in with an existing GitLab.com, Bitbucket, or GitHub account.

Past contributions on GitHub? Be sure to reclaim your Comments, Issues, and Pull Requests.

...
 
Commits (30)
module.exports = {
'artifactsDir': 'artifacts',
'ignoreFiles': ['crowdin.yaml'],
'build': {
'overwriteDest': true
}
};
artifacts
audit/node_modules
audit/report.txt
Decentraleyes
=============
A [web browser extension](https://decentraleyes.org) that emulates Content Delivery Networks to improve your online privacy. It intercepts traffic, finds supported resources locally, and injects them into the environment. All of this happens automatically, so no prior configuration is required. Feel free to use the following [testing utility](https://decentraleyes.org/test) to find out if you are properly protected.
A [web browser extension](https://decentraleyes.org) that emulates Content Delivery Networks to improve your online privacy. It intercepts traffic, finds supported resources locally, and injects them into the environment. All of this happens automatically, so no prior configuration is required. Feel free to use the following [testing utility](https://decentraleyes.org/test/) to find out if you are properly protected. For more information, please read this [basic introduction](https://git.synz.io/Synzvato/decentraleyes/wikis/Simple-Introduction).
> **Note:** Decentraleyes is no silver bullet, but it does prevent a lot of websites from making you send these kinds of requests. Ultimately, you can make Decentraleyes block requests for any missing CDN resources, too.
## Contributing Code
Suggestions in the form of **Issues**, and contributions in the form of **Pull Requests**, are highly welcome. You can also use the public contact details and PGP key on the extension's [contact page](https://decentraleyes.org/contact) to get in touch.
Suggestions in the form of **Issues**, and contributions in the form of **Merge Requests**, are highly welcome. Code **Forks** can be requested from within issues, or via email. You can use the contact details and public PGP key on the extension's [contact page](https://decentraleyes.org/contact/) to get in touch.
#### Prerequisites
......@@ -17,9 +17,9 @@ Suggestions in the form of **Issues**, and contributions in the form of **Pull R
#### Running the Code
Please read this [short guide](https://developer.mozilla.org/en-US/Add-ons/WebExtensions/Your_first_WebExtension#Trying_it_out) for information on how to run this extension from source.
Please read this [developer guide](https://developer.mozilla.org/en-US/Add-ons/WebExtensions/Your_first_WebExtension#Trying_it_out) for information on how to run the extension from source.
> **Important:** All commits since 26 October 2016 are signed with GPG. It's likely best to ignore unsigned commits, unless you really know what you're doing. Please send an email if you have any questions or security concerns.
> **Important:** All tagged commits since 26 October 2016 are signed with GPG. It's likely best to ignore unsigned commits, unless you really know what you're doing. Please send an email if you have any questions or security concerns.
## Submitting Translations
......
......@@ -21,10 +21,14 @@ const Address = {
'ANY': '*://*/*',
'ANY_PATH': '/*',
'ANY_PROTOCOL': '*://',
'CHROME': 'chrome:',
'CHROME_EXTENSION': 'chrome-extension:',
'DECENTRALEYES': 'decentraleyes.org',
'EXAMPLE': 'example.org',
'HTTP': 'http:',
'HTTPS': 'https:',
'RESOURCE_PATH': '/resources',
'ROOT_PATH': '/',
'WWW_PREFIX': 'www.'
};
......@@ -63,6 +67,7 @@ const WebRequest = {
};
const WebRequestType = {
'MAIN_FRAME': 'main_frame',
'XHR': 'xmlhttprequest'
};
......
......@@ -2,7 +2,7 @@
* File Guard
* Belongs to Decentraleyes.
*
* @see https://github.com/Synzvato/decentraleyes/pull/258
* @see https://git.synz.io/Synzvato/decentraleyes/merge_requests/258
*
* @author Thomas Rientjes
* @since 2018-05-17
......@@ -32,14 +32,14 @@ fileGuard._startListening = function () {
chrome.webRequest.onBeforeRequest.addListener(
fileGuard._verifyRequest,
{'urls': [`${fileGuard.path}/*`]},
{'urls': [fileGuard.path + Address.ANY_PATH]},
[WebRequest.BLOCKING]
);
};
fileGuard._verifyRequest = function (requestDetails) {
let redirectUrl = chrome.runtime.getURL('/');
let redirectUrl = chrome.runtime.getURL(Address.ROOT_PATH);
if (!requestDetails.url.endsWith(fileGuard.secret)) {
return {redirectUrl};
......@@ -50,7 +50,7 @@ fileGuard._verifyRequest = function (requestDetails) {
* Initializations
*/
fileGuard.path = chrome.runtime.getURL('/resources');
fileGuard.path = chrome.runtime.getURL(Address.RESOURCE_PATH);
fileGuard.secret = '';
if (fileGuard.path.startsWith(Address.CHROME_EXTENSION)) {
......
......@@ -55,11 +55,14 @@ interceptor.handleRequest = function (requestDetails, tabIdentifier, tab) {
'blog.datawrapper.de': true,
'bundleofholding.com': true,
'cdnjs.com': true,
'code.world': true,
'creativecommons.org': true,
'dropbox.com': true,
'evoice.com': true,
'freebusy.io': true,
'gazetadopovo.com.br': true,
'glowing-bear.org': true,
'ico.org.uk': true,
'manualslib.com': true,
'meslieux.paris.fr': true,
'mgm.gov.tr': true,
......@@ -75,6 +78,7 @@ interceptor.handleRequest = function (requestDetails, tabIdentifier, tab) {
'scotthelme.co.uk': true,
'securityheaders.com': true,
'securityheaders.io': true,
'somiibo.com': true,
'stefansundin.github.io': true,
'transcend-info.com': true,
'udacity.com': true,
......@@ -83,10 +87,7 @@ interceptor.handleRequest = function (requestDetails, tabIdentifier, tab) {
};
if (undetectableTaintedDomains[tabDomain] || (/yandex\./).test(tabDomain)) {
if (tabDomain !== 'yandex.ru') {
return interceptor._handleMissingCandidate(requestDetails.url);
}
return interceptor._handleMissingCandidate(requestDetails.url);
}
targetDetails = requestAnalyzer.getLocalTarget(requestDetails);
......@@ -157,7 +158,7 @@ interceptor._handleStorageChanged = function (changes) {
*/
interceptor.amountInjected = 0;
interceptor.xhrTestDomain = 'decentraleyes.org';
interceptor.xhrTestDomain = Address.DECENTRALEYES;
interceptor.blockMissing = false;
interceptor.relatedSettings = [];
......@@ -169,7 +170,7 @@ interceptor.relatedSettings.push(Setting.BLOCK_MISSING);
chrome.storage.local.get(interceptor.relatedSettings, function (items) {
interceptor.amountInjected = items.amountInjected || 0;
interceptor.xhrTestDomain = items.xhrTestDomain || 'decentraleyes.org';
interceptor.xhrTestDomain = items.xhrTestDomain || Address.DECENTRALEYES;
interceptor.blockMissing = items.blockMissing || false;
});
......
......@@ -26,7 +26,7 @@ var main = {};
main._initializeOptions = function () {
let optionDefaults = {
[Setting.XHR_TEST_DOMAIN]: 'decentraleyes.org',
[Setting.XHR_TEST_DOMAIN]: Address.DECENTRALEYES,
[Setting.SHOW_ICON_BADGE]: true,
[Setting.BLOCK_MISSING]: false,
[Setting.DISABLE_PREFETCH]: true,
......
......@@ -184,6 +184,29 @@ var mappings = {
}
},
// Baidu CDN
'apps.bdimg.com': {
'/libs/': {
'angular.js/{version}/angular.': resources.angular,
'backbone.js/{version}/backbone.': resources.backbone,
'backbone.js/{version}/backbone-min.': resources.backbone,
'dojo/{version}/dojo.': resources.dojo,
'ember.js/{version}/ember.': resources.ember,
'ext-core/{version}/ext-core.': resources.extCore,
'jquery/{version}/jquery.': resources.jQuery,
'jqueryui/{version}/jquery-ui.js': resources.jQueryUI,
'jqueryui/{version}/jquery-ui.min.js': resources.jQueryUI,
'mootools/{version}/mootools-yui-compressed.': resources.mootools,
'prototype/{version}/prototype.': resources.prototypeJS,
'scriptaculous/{version}/scriptaculous.': resources.scriptaculous,
'swfobject/{version}/swfobject.': resources.swfobject,
'swfobject/{version}/swfobject_src.': resources.swfobject,
'underscore.js/{version}/underscore.': resources.underscore,
'underscore.js/{version}/underscore-min.': resources.underscore,
'webfont/{version}/webfont.': resources.webfont,
'webfont/{version}/webfont_debug.': resources.webfont
}
},
// Baidu CDN [Deprecated]
'libs.baidu.com': {
'/': {
'backbone/{version}/backbone.': resources.backbone,
......@@ -235,6 +258,28 @@ var mappings = {
'modernizr/modernizr-{version}.': resources.modernizr,
'mootoolscore/mootools.core-{version}.': resources.mootools
}
},
// BootCDN
'cdn.bootcss.com': {
'/': {
'angular.js/{version}/angular.': resources.angular,
'backbone.js/{version}/backbone.': resources.backbone,
'backbone.js/{version}/backbone-min.': resources.backbone,
'dojo/{version}/dojo.': resources.dojo,
'ember.js/{version}/ember.': resources.ember,
'ext-core/{version}/ext-core.': resources.extCore,
'jquery/{version}/jquery.': resources.jQuery,
'jqueryui/{version}/jquery-ui.js': resources.jQueryUI,
'jqueryui/{version}/jquery-ui.min.js': resources.jQueryUI,
'modernizr/{version}/modernizr.': resources.modernizr,
'mootools/{version}/mootools-yui-compressed.': resources.mootools,
'prototype/{version}/prototype.': resources.prototypeJS,
'scriptaculous/{version}/scriptaculous.': resources.scriptaculous,
'swfobject/{version}/swfobject.': resources.swfobject,
'underscore.js/{version}/underscore.': resources.underscore,
'underscore.js/{version}/underscore-min.': resources.underscore,
'webfont/{version}/webfontloader.': resources.webfont
}
}
};
......
......@@ -33,9 +33,14 @@ stateManager.registerInjection = function (tabIdentifier, injection) {
registeredTab.injections[injectionIdentifier] = injection;
injectionCount = Object.keys(registeredTab.injections).length || 0;
if (stateManager.showIconBadge === true) {
if (injectionCount > 0) {
chrome.browserAction.setTitle({
'tabId': tabIdentifier,
'title': `Decentraleyes (${injectionCount})`
});
if (injectionCount > 0) {
if (stateManager.showIconBadge === true) {
wrappers.setBadgeText({
'tabId': tabIdentifier,
......@@ -44,14 +49,6 @@ stateManager.registerInjection = function (tabIdentifier, injection) {
}
}
if (injectionCount > 0) {
let title = 'Decentraleyes (' + injectionCount.toString() + ')';
wrappers.setTitle({
'title': title,
'tabId': tabIdentifier
});
}
if (isNaN(interceptor.amountInjected)) {
chrome.storage.local.get(Setting.AMOUNT_INJECTED, function (items) {
......@@ -108,7 +105,6 @@ stateManager._createTab = function (tab) {
};
requestFilters = {
'tabId': tabIdentifier,
'urls': stateManager.validHosts
};
......@@ -127,23 +123,37 @@ stateManager._removeTab = function (tabIdentifier) {
stateManager._updateTab = function (details) {
let tabIdentifier, frameIdentifier;
let tabDomain, domainIsWhitelisted, frameIdentifier, tabIdentifier;
tabDomain = helpers.extractDomainFromUrl(details.url, true);
domainIsWhitelisted = stateManager._domainIsWhitelisted(tabDomain);
tabIdentifier = details.tabId;
frameIdentifier = details.frameId;
tabIdentifier = details.tabId;
if (tabIdentifier === -1 || frameIdentifier !== 0) {
if (frameIdentifier !== 0 || tabIdentifier === -1) {
return;
}
if (stateManager.showIconBadge === true) {
chrome.browserAction.setTitle({
'tabId': tabIdentifier,
'title': 'Decentraleyes (0)'
});
wrappers.setBadgeText({
if (domainIsWhitelisted) {
stateManager._setIconDisabled(tabIdentifier);
chrome.browserAction.setTitle({
'tabId': tabIdentifier,
'text': ''
'title': 'Decentraleyes (–)'
});
}
if (stateManager.showIconBadge === true) {
stateManager._clearBadgeText(tabIdentifier);
}
if (stateManager.tabs[tabIdentifier]) {
stateManager.tabs[tabIdentifier].injections = {};
}
......@@ -173,20 +183,58 @@ stateManager._handleStorageChanged = function (changes) {
}
};
stateManager._removeIconBadgeFromTab = function (tab) {
stateManager._clearBadgeText = function (tabIdentifier) {
wrappers.setBadgeText({
'tabId': tab.id,
'tabId': tabIdentifier,
'text': ''
});
};
stateManager._removeIconBadgeFromTab = function (tab) {
stateManager._clearBadgeText(tab.id);
};
stateManager._domainIsWhitelisted = function (domain) {
if (domain !== null) {
let whitelistRecord, isWhitelisted;
whitelistRecord = requestAnalyzer.whitelistedDomains[domain];
isWhitelisted = Boolean(whitelistRecord);
return isWhitelisted;
}
return false;
};
stateManager._setIconDisabled = function (tabIdentifier) {
wrappers.setIcon({
'path': stateManager.disabledIconPath,
'tabId': tabIdentifier
});
};
/**
* Initializations
*/
stateManager.requests = {};
stateManager.tabs = {};
stateManager.disabledIconPath = {
'16': chrome.runtime.getURL('icons/action/icon16-disabled.png'),
'18': chrome.runtime.getURL('icons/action/icon18-disabled.png'),
'19': chrome.runtime.getURL('icons/action/icon19-disabled.png'),
'32': chrome.runtime.getURL('icons/action/icon32-disabled.png'),
'36': chrome.runtime.getURL('icons/action/icon36-disabled.png'),
'38': chrome.runtime.getURL('icons/action/icon38-disabled.png'),
'64': chrome.runtime.getURL('icons/action/icon64-disabled.png')
};
stateManager.validHosts = [];
for (let mapping in mappings) {
......@@ -224,7 +272,7 @@ chrome.webRequest.onBeforeRequest.addListener(function (requestDetails) {
};
}
}, {'types': ['main_frame'], 'urls': [Address.ANY]});
}, {'types': [WebRequestType.MAIN_FRAME], 'urls': [Address.ANY]});
chrome.webNavigation.onCommitted.addListener(stateManager._updateTab, {
'url': [{'urlContains': ':'}]
......
{
"manifest_version": 2,
"name": "Decentraleyes",
"version": "2.0.4",
"version": "2.0.6",
"author": "Thomas Rientjes",
......@@ -32,12 +32,13 @@
"browser_action": {
"default_icon": {
"18": "icons/action/icon18.png",
"19": "icons/action/icon19.png",
"32": "icons/action/icon32.png",
"36": "icons/action/icon36.png",
"38": "icons/action/icon38.png",
"64": "icons/action/icon64.png"
"16": "icons/action/icon16-default.png",
"18": "icons/action/icon18-default.png",
"19": "icons/action/icon19-default.png",
"32": "icons/action/icon32-default.png",
"36": "icons/action/icon36-default.png",
"38": "icons/action/icon38-default.png",
"64": "icons/action/icon64-default.png"
},
"default_popup": "pages/popup/popup.html",
"browser_style": false
......
This diff is collapsed.
......@@ -98,6 +98,10 @@ helpers.extractDomainFromUrl = function (url, normalize) {
extractedDomain = null;
}
if (url.startsWith(Address.CHROME)) {
extractedDomain = null;
}
if (extractedDomain === '') {
extractedDomain = null;
}
......@@ -156,12 +160,16 @@ helpers.determineCdnName = function (domainName) {
return 'Yandex CDN';
case 'yandex.st':
return 'Yandex CDN [Deprecated]';
case 'libs.baidu.com':
case 'apps.bdimg.com':
return 'Baidu CDN';
case 'libs.baidu.com':
return 'Baidu CDN [Deprecated]';
case 'lib.sinaapp.com':
return 'Sina Public Resources';
case 'upcdn.b0.upaiyun.com':
return 'UpYun Library';
case 'cdn.bootcss.com':
return 'BootCDN';
case 'sdn.geekzu.org':
return 'Geekzu Public Service [Mirror]';
case 'ajax.proxy.ustclug.org':
......
......@@ -37,12 +37,9 @@ wrappers.setBadgeText = function (details) {
}
};
// In firefox android, browser action shows as a menu entry instead of icon.
// Use the below 'setTitle' to show injected count in menu entry.
wrappers.setIcon = function (details) {
wrappers.setTitle = function (details){
if (chrome.browserAction.setTitle !== undefined) {
chrome.browserAction.setTitle(details);
if (chrome.browserAction.setIcon !== undefined) {
chrome.browserAction.setIcon(details);
}
};
};
<!DOCTYPE html>
<html>
<html lang="en">
<head>
<title>Decentraleyes Background</title>
......@@ -27,4 +28,5 @@
<script src="../../core/main.js"></script>
</body>
</html>
......@@ -12,6 +12,8 @@ body {
}
.option {
display: flex;
flex-direction: column;
margin-top: 25px;
}
......@@ -81,6 +83,7 @@ body {
.input-text {
margin-left: 29px;
max-width: 320px;
}
/**
......
......@@ -6,7 +6,7 @@
<title>Decentraleyes Options</title>
<meta name="viewport" content="width=device-width, minimum-scale=1.0, maximum-scale=1.0">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta charset="utf-8" />
<link rel="stylesheet" type="text/css" href="options.css">
......
......@@ -6,7 +6,7 @@
<title>Decentraleyes Popup</title>
<meta name="viewport" content="width=device-width, minimum-scale=1.0, maximum-scale=1.0">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta charset="utf-8" />
<link rel="stylesheet" type="text/css" href="popup.css">
......
......@@ -171,11 +171,7 @@ popup._determineTargetTab = function () {
chrome.tabs.query({'active': true, 'currentWindow': true}, function (tabs) {
popup._targetTab = tabs[0];
popup._domain = helpers.extractDomainFromUrl(tabs[0].url);
if (popup._domain !== null) {
popup._domain = helpers.normalizeDomain(popup._domain);
}
popup._domain = helpers.extractDomainFromUrl(tabs[0].url, true);
resolve();
});
......@@ -330,7 +326,7 @@ popup._onTestingUtilityLinkClicked = function (event) {
if (event.button === 0 || event.button === 1) {
chrome.tabs.create({
'url': 'https://decentraleyes.org/test',
'url': 'https://decentraleyes.org/test/',
'active': (event.button === 0)
});
}
......
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns="http://www.w3.org/2000/svg" height="139.98mm" width="213.68mm" version="1.1" xmlns:cc="http://creativecommons.org/ns#" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 757.14843 495.97448" xmlns:dc="http://purl.org/dc/elements/1.1/">
<svg width="213.68mm" height="139.98mm" version="1.1" viewBox="0 0 757.15 495.97" xmlns="http://www.w3.org/2000/svg">
<defs>
<linearGradient id="a" y2="-1041.7" gradientUnits="userSpaceOnUse" x2="-2153.9" gradientTransform="matrix(.73610 0 0 1.1184 971.67 1120)" y1="-1983.7" x1="-2153.9">
<linearGradient id="a" x1="-2153.9" x2="-2153.9" y1="-1983.7" y2="-1041.7" gradientTransform="matrix(.7361 0 0 1.1184 971.67 1120)" gradientUnits="userSpaceOnUse">
<stop stop-color="#7c9437" offset="0"/>
<stop stop-color="#eff4e2" offset="1"/>
</linearGradient>
</defs>
<g transform="translate(1012.9 489.91)">
<path d="m-633.52-289.08c-4.2555-0.0136-8.5155 0-12.777 0.0312-127.91 0.89658-252.53 19.355-365.63 52.92a378.57 378.57 0 0 0 -0.9259 18.506 378.57 378.57 0 0 0 0.9472 26.779 378.57 378.57 0 0 0 4.5606 37.566 378.57 378.57 0 0 0 8.2871 36.924 378.57 378.57 0 0 0 11.934 35.91 378.57 378.57 0 0 0 15.457 34.541 378.57 378.57 0 0 0 18.83 32.824 378.57 378.57 0 0 0 13.689 19.143h609.77a378.57 378.57 0 0 0 7.5468 -9.9279 378.57 378.57 0 0 0 19.779 -32.262 378.57 378.57 0 0 0 16.459 -34.074 378.57 378.57 0 0 0 12.977 -35.547 378.57 378.57 0 0 0 9.3634 -36.666 378.57 378.57 0 0 0 5.6543 -37.416 378.57 378.57 0 0 0 1.8905 -37.795 378.57 378.57 0 0 0 -0.60143 -17.018c-116.53-35.116-245.29-54.153-377.21-54.44z" fill-rule="evenodd" fill="url(#a)"/>
<path d="m-633.52-289.08c-4.2555-0.0136-8.5155 0-12.777 0.0312-127.91 0.89658-252.53 19.355-365.63 52.92a378.57 378.57 0 0 0-0.9259 18.506 378.57 378.57 0 0 0 0.9472 26.779 378.57 378.57 0 0 0 4.5606 37.566 378.57 378.57 0 0 0 8.2871 36.924 378.57 378.57 0 0 0 11.934 35.91 378.57 378.57 0 0 0 15.457 34.541 378.57 378.57 0 0 0 18.83 32.824 378.57 378.57 0 0 0 13.689 19.143h609.77a378.57 378.57 0 0 0 7.5468-9.9279 378.57 378.57 0 0 0 19.779-32.262 378.57 378.57 0 0 0 16.459-34.074 378.57 378.57 0 0 0 12.977-35.547 378.57 378.57 0 0 0 9.3634-36.666 378.57 378.57 0 0 0 5.6543-37.416 378.57 378.57 0 0 0 1.8905-37.795 378.57 378.57 0 0 0-0.60143-17.018c-116.53-35.116-245.29-54.153-377.21-54.44z" fill="url(#a)" fill-rule="evenodd"/>
<g transform="translate(-3065.9 1490.7)">
<path d="m-8140.9-2348.7a274.29 274.29 0 0 0 -266.58 211.04c7.1369-1.3966 14.205-2.9209 21.4-4.2051 15.036-2.6835 30.198-5.1201 45.469-7.3067 15.271-2.1865 30.653-4.1238 46.129-5.8046 15.476-1.6809 31.048-3.1051 46.699-4.2715 15.651-1.1665 31.383-2.0735 47.18-2.7168 15.797-0.6434 31.658-1.0233 47.57-1.1348 16.954-0.1188 33.863 0.067 50.707 0.5527 16.844 0.4858 33.623 1.2711 50.32 2.3516s33.313 2.4557 49.826 4.1211 32.926 3.6208 49.219 5.8613c16.293 2.2406 32.467 4.7664 48.504 7.5723 10.201 1.7849 20.245 3.8763 30.33 5.8867a274.29 274.29 0 0 0 -266.77 -211.94z" transform="translate(10572 368.09)" fill="#69ab90"/>
<path d="m-8140.5-2258.2a184.16 184.16 0 0 0 -165.9 104.74c3.9985-0.4699 7.9455-1.0683 11.957-1.5039 15.476-1.6809 31.048-3.1051 46.699-4.2715 15.651-1.1665 31.383-2.0735 47.18-2.7168 15.797-0.6434 31.658-1.0233 47.57-1.1348 16.954-0.1188 33.863 0.067 50.707 0.5527 16.844 0.4858 33.623 1.2711 50.32 2.3516s33.313 2.4557 49.826 4.1211c9.3701 0.945 18.626 2.1953 27.928 3.3262a184.16 184.16 0 0 0 -166.29 -105.46z" transform="translate(10572 368.09)" fill="#4a856d"/>
<path d="m-8140.9-2237c-57.78 0.068-111.19 30.788-140.3 80.699 42.151-4.1659 84.969-6.4492 128.16-6.752 51.484-0.3609 102.54 2.0951 152.66 7.2168-29.034-50.162-82.569-81.082-140.53-81.164z" transform="translate(10572 368.09)" fill="#d9ccb5"/>
<path d="m-8139.6-2326.4c-68.213-0.4078-132.43 25.777-181.27 74.619-31.322 31.322-53.165 68.409-64.869 109.85 21.087-3.7573 42.424-7.0203 63.961-9.7968 0.1062-0.2386 0.2051-0.474 0.3125-0.7129 10.523-23.415 22.717-41.107 40.772-59.162 29.234-29.234 64.842-47.747 106.23-55.229 14.678-2.6535 47.206-2.9306 64.086-0.5429 14.755 2.0871 19.279 1.4609 27.205-3.7891 11.038-7.311 15.491-22.356 10.088-34.086-5.7671-12.52-13.568-16.585-37.066-19.334-9.8746-1.1551-19.702-1.7562-29.447-1.8145zm209.14 141.75c-15.595-0.072-28.373 12.42-28.373 27.73 0 2.0809 0.2081 4.0855 0.5879 6.0059 17.56 2.3451 34.986 5.0152 52.252 8.0156 0.3927-0.7733 0.7686-1.5899 1.1309-2.457 7.6967-18.421-5.8421-39.204-25.598-39.295z" fill-rule="evenodd" transform="translate(10572 368.09)" fill="#e1eee9"/>
<path transform="translate(10572 368.09)" d="m-8140.9-2348.7a274.29 274.29 0 0 0-266.58 211.04c7.1369-1.3966 14.205-2.9209 21.4-4.2051 15.036-2.6835 30.198-5.1201 45.469-7.3067 15.271-2.1865 30.653-4.1238 46.129-5.8046 15.476-1.6809 31.048-3.1051 46.699-4.2715 15.651-1.1665 31.383-2.0735 47.18-2.7168 15.797-0.6434 31.658-1.0233 47.57-1.1348 16.954-0.1188 33.863 0.067 50.707 0.5527 16.844 0.4858 33.623 1.2711 50.32 2.3516s33.313 2.4557 49.826 4.1211 32.926 3.6208 49.219 5.8613c16.293 2.2406 32.467 4.7664 48.504 7.5723 10.201 1.7849 20.245 3.8763 30.33 5.8867a274.29 274.29 0 0 0-266.77-211.94z" fill="#69ab90"/>
<path transform="translate(10572 368.09)" d="m-8140.5-2258.2a184.16 184.16 0 0 0-165.9 104.74c3.9985-0.4699 7.9455-1.0683 11.957-1.5039 15.476-1.6809 31.048-3.1051 46.699-4.2715 15.651-1.1665 31.383-2.0735 47.18-2.7168 15.797-0.6434 31.658-1.0233 47.57-1.1348 16.954-0.1188 33.863 0.067 50.707 0.5527 16.844 0.4858 33.623 1.2711 50.32 2.3516s33.313 2.4557 49.826 4.1211c9.3701 0.945 18.626 2.1953 27.928 3.3262a184.16 184.16 0 0 0-166.29-105.46z" fill="#4a856d"/>
<path transform="translate(10572 368.09)" d="m-8140.9-2237c-57.78 0.068-111.19 30.788-140.3 80.699 42.151-4.1659 84.969-6.4492 128.16-6.752 51.484-0.3609 102.54 2.0951 152.66 7.2168-29.034-50.162-82.569-81.082-140.53-81.164z" fill="#d9ccb5"/>
<path transform="translate(10572 368.09)" d="m-8139.6-2326.4c-68.213-0.4078-132.43 25.777-181.27 74.619-31.322 31.322-53.165 68.409-64.869 109.85 21.087-3.7573 42.424-7.0203 63.961-9.7968 0.1062-0.2386 0.2051-0.474 0.3125-0.7129 10.523-23.415 22.717-41.107 40.772-59.162 29.234-29.234 64.842-47.747 106.23-55.229 14.678-2.6535 47.206-2.9306 64.086-0.5429 14.755 2.0871 19.279 1.4609 27.205-3.7891 11.038-7.311 15.491-22.356 10.088-34.086-5.7671-12.52-13.568-16.585-37.066-19.334-9.8746-1.1551-19.702-1.7562-29.447-1.8145zm209.14 141.75c-15.595-0.072-28.373 12.42-28.373 27.73 0 2.0809 0.2081 4.0855 0.5879 6.0059 17.56 2.3451 34.986 5.0152 52.252 8.0156 0.3927-0.7733 0.7686-1.5899 1.1309-2.457 7.6967-18.421-5.8421-39.204-25.598-39.295z" fill="#e1eee9" fill-rule="evenodd"/>
<path d="m2566.6-1883.9c-3.0097 3.1329-6.9452 2.2975-14.708-2.4482-4.0467-2.2446-5.5995-3.6343-9.6847-5.7832l-6.0229-3.1961-2.0305 3.9932-2.0327 3.9906-3.4678-4.969c-8.9934-12.89-18.056-26.474-17.742-26.592 4.2273-0.3503 19.763-1.3532 37.471-2.7026 0 0-1.0853 2.1672-2.2943 4.5888l-2.0055 4.2775 6.5539 3.5215c3.6047 1.9372 9.4209 5.7407 12.927 8.4524 1.0018 0.7747 1.7262 1.4006 2.4531 2.0301 4.5629 4.4076 4.9708 7.6508 2.557 12.032-0.6314 1.1465-1.2782 2.081-1.9728 2.8041z" fill="#fff"/>
<path d="m-432.68-16.955c-0.92625 0.11186-1.7636 0.61843-2.5957 1.4668-2.5338 2.583-1.7893 5.0501 3.1855 10.545 2.4906 2.751 6.0466 6.7358 7.9004 8.8555 3.7538 4.2926 5.5909 4.8261 8.1582 2.3672 2.8579-2.737 2.1581-5.0574-3.6914-12.246-6.6046-8.1165-10.178-11.324-12.957-10.988z" transform="matrix(1.9024 0 0 1.9024 3412 -1843.7)" fill="#fff"/>
<path transform="matrix(1.9024 0 0 1.9024 3412 -1843.7)" d="m-432.68-16.955c-0.92625 0.11186-1.7636 0.61843-2.5957 1.4668-2.5338 2.583-1.7893 5.0501 3.1855 10.545 2.4906 2.751 6.0466 6.7358 7.9004 8.8555 3.7538 4.2926 5.5909 4.8261 8.1582 2.3672 2.8579-2.737 2.1581-5.0574-3.6914-12.246-6.6046-8.1165-10.178-11.324-12.957-10.988z" fill="#fff"/>
</g>
<path style="color-rendering:auto;text-decoration-color:#000000;color:#000000;isolation:auto;mix-blend-mode:normal;shape-rendering:auto;solid-color:#000000;block-progression:tb;text-decoration-line:none;text-decoration-style:solid;image-rendering:auto;white-space:normal;text-indent:0;text-transform:none" d="m-1011-254.39a378.57 378.57 0 0 0 -0.9141 18.264c113.1-33.564 237.73-52.023 365.63-52.92 136.38-0.95605 269.7 18.16 389.99 54.408a378.57 378.57 0 0 0 -0.34565 -9.7598 378.57 378.57 0 0 0 -1.0644 -8.7656c-120.38-35.545-253.06-54.097-388.7-53.147-127.3 0.89224-251.38 18.941-364.6 51.92z" fill="#4a856d"/>
<path d="m-1011-254.39a378.57 378.57 0 0 0-0.9141 18.264c113.1-33.564 237.73-52.023 365.63-52.92 136.38-0.95605 269.7 18.16 389.99 54.408a378.57 378.57 0 0 0-0.34565-9.7598 378.57 378.57 0 0 0-1.0644-8.7656c-120.38-35.545-253.06-54.097-388.7-53.147-127.3 0.89224-251.38 18.941-364.6 51.92z" color="#000000" color-rendering="auto" fill="#4a856d" image-rendering="auto" shape-rendering="auto" solid-color="#000000" style="block-progression:tb;isolation:auto;mix-blend-mode:normal;text-decoration-color:#000000;text-decoration-line:none;text-decoration-style:solid;text-indent:0;text-transform:none;white-space:normal"/>
<g fill="#69ab90">
<path d="m-596.16-130.58h-14.32v72.537h14.32v-30.165h14.789v30.165h14.32v-72.537h-14.32v29.93h-14.789v-29.93z"/>
<path d="m-556.38-130.58v72.537h39.203v-12.442h-24.883v-17.723h19.719v-12.442h-19.719v-17.489h24.883v-12.442h-39.203z"/>
......
......@@ -92,11 +92,11 @@ a {
margin-left: 10px;
}
.btn-github {
.btn-gitlab {
background-color: #24292e;
}
.btn-github:hover {
.btn-gitlab:hover {
background-color: #42474c;
}
......
<!DOCTYPE html>
<html>
<html lang="en">
<head>
<title>2.0 Says Hello - Decentraleyes</title>
<meta name="viewport" content="width=device-width, minimum-scale=1.0, maximum-scale=1.0">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta charset="utf-8">
<link rel="stylesheet" type="text/css" href="welcome.css">
......@@ -65,7 +65,7 @@
<a class="btn btn-website" href="https://decentraleyes.org" target="_blank"><i class="btn-icon fai fa-globe" data-fa-transform="grow-2"></i><span class="btn-text">Website</span></a>
<a class="btn btn-github" href="https://github.com/Synzvato/decentraleyes" target="_blank"><i class="btn-icon fai fa-github-alt" data-fa-transform="grow-2"></i><span class="btn-text">GitHub</span></a>
<a class="btn btn-gitlab" href="https://git.synz.io/Synzvato/decentraleyes" target="_blank"><i class="btn-icon fai fa-gitlab" data-fa-transform="grow-2"></i><span class="btn-text">GitLab</span></a>
<a class="btn btn-bitcoin" href="https://decentraleyes.org/donate/bitcoin/" target="_blank"><i class="btn-icon fai fa-btc" data-fa-transform="grow-2"></i><span class="btn-text">Bitcoin</span></a>
......