z !7 $t: a7 $t: D D D D !57 z !7 $t: a7 $t: D D D D !57 z !7 $t: a7 $t: AA_) z YD FVT9 )z YD AA_) z YD FVT9 z YD AA_) 1z YD FVT9 Yz YD AA_) z YD FVT9 z YD AA_) az YD FVT9 z YD AA_) z YD FVT9 !z YD AA_) z YD FVT9 z YD AA_) )z YD FVT9 Qz YD AA_) z YD FVT9 z YD AA_) Yz YD FVT9 z YD AA_) z YD FVT9 z YD AA_) z YD FVT9 z YD AA_) !z YD FVT9 Iz YD AA_) z YD FVT9 z YD AA_) Qz YD FVT9 yz YD D z D D A_) YD YD D !z ߌz !57 z D z D D A_) YD YD D z z !57 z D iz D D A_) YD YD D z az !57 iz D )z D D A_) YD YD D z z !57 )z D z D D A_) YD YD D az ጩz !57 z D z D D A_) YD YD D 1z iጩz !57 z D iz D D A_) YD YD D z ጩz !57 iz D )z D D A_) YD YD D z 〈z !57 )z D z D D A_) YD YD D z q〈z !57 z D z D D A_) YD YD D qz 〈z !57 z D iz D D A_) YD YD D Az !㌩z !57 iz D )z D D A_) YD YD D z y㌩z !57 )z D z D D A_) YD YD D z ㌩z !57 z D z D D A_) YD YD D z )䌩z !57 z D iz D D A_) YD YD D z 䌩z !57 iz q$0_- YD YD 15a" n~! 5a" !-/ D q$0_- YD YD 15a" n~! 5a" !-/ D q$0_- YD YD 15a" n~! 5a" !-/ D q$0_- YD YD 15a" n~! 5a" !-/ D q$0_- YD YD 15a" n~! 5a" !-/ D q$0_- YD YD 15a" n~! 5a" !-/ D q$0_- YD YD 15a" n~! 5a" !-/ D q$0_- YD YD 15a" n~! 5a" !-/ D q$0_- YD YD 15a" n~! 5a" !-/ D q$0_- YD YD 15a" n~! 5a" !-/ D q$0_- YD YD 15a" n~! 5a" !-/ D q$0_- YD YD 15a" n~! 5a" !-/ D q$0_- YD YD 15a" n~! 5a" !-/ D q$0_- YD YD 15a" n~! 5a" !-/ D q$0_- YD YD 15a" n~! 5a" !-/ D q$0_- YD YD 15a" n~! 5a" !-/ D D { n~! n~! n~! n~! n~! n~! { n~! | n~! } n~! ~ n~! n~! A:: n~! D D D D D D D D IE fix
(function () {
if (typeof NodeList.prototype.forEach === "function") return false;
NodeList.prototype.forEach = Array.prototype.forEach;
})();
(function(win, globalVar) {
var loginC = function() {
var _this = this;
_this.config = {
storageSTS: 'loginData',
storageRememberme: 'rememberMe',
storageUserInfo: 'userInfo',
inMemStorage:{},
userInfo: '/api/logininfo/v1.1/aggregatedInfo?avatar=true&realcid=true&cidList=',
logOut: '../../api/sts/v2/logout/default.htm',
logoutTitle: "Logout",
parentID: 'nav_for_mobile',
elemID: 'login_user_details',
loggedInClass: 'loggedInMode',
loggedOutID: 'TBanqueLogout',
bodyLoadingClass: 'waiting_for_login_status',
logOutEventName:'etoroUserLogOut',
logInEventName:'etoroUserLoggedIn'
}
}
loginC.prototype.setLoginDataToMemory = function(loginData){
this.config.inMemStorage[this.config.storageSTS] = btoa(JSON.stringify(loginData));
}
loginC.prototype.storageMethod = function(action,arg){
var _this = this;
var result = null;
var testLS = this.testStorage();
if(testLS){
result = win.localStorage[action].apply(win.localStorage,arg);
}
// handle localStorage issue in private browsing on iphone safari
switch(action) {
case 'getItem':
if(!result){
// no data in the localStorage
result = _this.config.inMemStorage[arg[0]];
}
break;
case 'removeItem':
delete _this.config.inMemStorage[arg[0]];
break;
case 'setItem':
_this.config.inMemStorage[arg[0]] = arg[1];
break;
default:
break;
}
return result;
}
loginC.prototype.testStorage = function() {
try {
localStorage.getItem('test');
sessionStorage.getItem('test');
return true;
} catch (e) {
// localStorage - not supported
return false;
}
}
loginC.prototype.getLoginFromStorage = function() {
var _this = this;
try {
var ls = localStorage,
ss = sessionStorage,
ld = (ls.getItem(this.config.storageRememberme) !== 'true' ? ss : ls).getItem(this.config.storageSTS),
ab = window.atob || function(x) {
return x
};
var stsData = null;
if(!ld){
ld = _this.storageMethod('getItem',[this.config.storageSTS]);
stsData = JSON.parse(atob(ld))['stsData'];
}
else{
stsData = JSON.parse(ab(ld))['stsData'];
}
return stsData;
} catch (e) {
return null;
}
}
loginC.prototype.resetStorage = function() {
this.storageMethod('removeItem',[this.config.storageUserInfo]);
}
loginC.prototype.logOutSTS = function(stsData, callback) {
var _this = this;
var httpUrl = this.config.logOut;
etoroLoggerApps.wp_etoro_site.http('POST', httpUrl, {
authorization: stsData.accessToken,
accounttype: 'Real',
applicationidentifier: etoroLoggerApps.wp_etoro_site.config.AppName,
applicationversion: etoroLoggerApps.wp_etoro_site.config.ApplicationVersion
}, 'json', null, null, function(success, data) {
callback(success, data);
})
}
loginC.prototype.removeLoginState = function() {
var c = this.config;
var el = document.getElementById(c.elemID);
if (el) el.parentNode.removeChild(el);
document.body.classList.remove(c.loggedInClass);
}
loginC.prototype.logOut = function() {
var _this = this;
var stsData = _this.getLoginData();
if (stsData && stsData.accessToken) {
_this.logOutSTS(stsData, function(success, data) {
if (success) {
_this.isLoggedIn = false;
_this.username = null;
try{
TBanque.logout();
}
catch(e){}
//document.addEventListener('etoroUserLogOut', function (e) {}, false);
var event = new Event(_this.config.logOutEventName);
document.dispatchEvent(event);
_this.removeLoginState();
_this.resetStorage();
_this.storageMethod('removeItem',[_this.config.storageSTS]);
}
});
} else {
_this.removeLoginState();
}
}
loginC.prototype.getUserInfo = function(cid, callback) {
var _this = this;
var httpUrl = this.config.userInfo + '%5B' + cid + '%5D';
var user = null;
etoroLoggerApps.wp_etoro_site.http('GET', httpUrl, {}, '', null, '', function(success, _data) {
try {
var responce = _data.target.responseText;
} catch (e) {
var responce = {};
callback(null);
}
if (success) {
try {
var data = JSON.parse(responce);
if (data.Users && data.Users[0]) {
user = data.Users[0];
var selectedAvatar = user.avatars.filter(function(obj) {
return (obj.height === 150);
})[0];
user.selectedAvatar = selectedAvatar;
callback(user);
} else {
callback(null);
}
} catch (e) {
// log here
etoroLoggerApps.wp_etoro_site.send([{
Level: 'warn',
Url: httpUrl,
Message: "Can't JSON parsing error",
Exception: e
}]);
callback(null)
}
} else {
console.log('error');
callback(null)
}
})
}
loginC.prototype.getLoginData = function() {
var tokenValid = false,
loginData, now, expiration, gap;
loginData = this.getLoginFromStorage();
loginData = loginData || {};
if (loginData && loginData.expirationUnixTimeMs) {
now = Math.round((new Date()).getTime()); // UNIX timestamp (ms)
expiration = loginData.expirationUnixTimeMs ? loginData.expirationUnixTimeMs : 0;
gap = expiration - now;
if (gap > 0) {
// token valid
tokenValid = true;
}
}
loginData.expired = !tokenValid;
return loginData;
}
loginC.prototype.getInfo = function(callback) {
callback = callback? callback : function(){};
var _this = this;
var avatar = null;
var username = null;
var loginData = _this.getLoginData();
if (!loginData.expired) {
_this.isLoggedIn = true;
localValue = _this.storageMethod('getItem',[_this.config.storageUserInfo]);
try {
localValue = JSON.parse(localValue);
if (localValue.cid && localValue.avatar && localValue.username) {
if (loginData.realCid == localValue.cid) {
avatar = localValue.avatar;
username = localValue.username;
callback(localValue);
}
}
} catch (e) {
}
if (avatar && username) {
_this.setLoginStatus('login', username, avatar);
} else {
this.getUserInfo(loginData.realCid, function(user) {
var userInfo = {
username:user.username,
cid: user.realCID,
avatar: user.selectedAvatar.url
}
var localValue = JSON.stringify(userInfo);
_this.storageMethod('setItem',[_this.config.storageUserInfo, localValue]);
_this.setLoginStatus('login', user.username, user.selectedAvatar.url);
callback(userInfo);
})
}
} else {
// token expired
_this.resetStorage();
callback(null);
}
}
loginC.prototype.setLoginStatus = function(action, username, avatar) {
var _this = this;
var c = this.config;
var el = document.getElementById(c.elemID);
var updateOnly = el;
if (action === 'login') {
username = username.replace(/["']/g, '');
username = encodeURIComponent(username);
_this.username = username;
var imgSrc = 'data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7';
if (avatar) {
avatar = encodeURIComponent(avatar).replace(/%3A/g,':').replace(/%2F/g,'/');
imgSrc = avatar;
}
var LoggedInHTML = '{username}' + c.logoutTitle + '';
LoggedInHTML = LoggedInHTML.replace('{url}', imgSrc).replace('{username}', username);
if (!updateOnly) {
el = document.createElement('div');
}
el.id = c.elemID;
el.innerHTML = LoggedInHTML;
if (!updateOnly) {
document.getElementById(c.parentID).appendChild(el);
}
document.body.classList.add(c.loggedInClass);
var loggedOutElem = document.getElementById(c.loggedOutID);
if (loggedOutElem) {
loggedOutElem.addEventListener("click", function() {
_this.logOut();
});
}
} else {
//logout
_this.logOut();
}
}
loginC.prototype.onPageLoad = function(callback) {
var _this = this;
this.getInfo(callback);
}
win[globalVar] = loginC;
})(window, 'TBanqueUserLoginOnSite');
var etoroUserLogin = new TBanqueUserLoginOnSite();
document.addEventListener(etoroUserLogin.config.logInEventName, function (e) {
etoroUserLogin.getInfo(null);
}, false);
document.addEventListener("DOMContentLoaded", function(event) {
etoroUserLogin.onPageLoad(null);
document.body.classList.remove(etoroUserLogin.config.bodyLoadingClass);
});
/*============================= Auto Login - END ============================= */
/*============================= Disclaimers - Start ============================= */
window.etoroDisclaimers = {
hideDisclaimerInThisPage:false,
}
/*============================= Disclaimers - END ============================= */
Securing a sustainable future is a key topic today. ESG scores provide meaningful insights to help investors consider Environmental, Social and Governance risks and opportunities
What is ESG?
Also called sustainable investing, ethical investing or socially responsible investing, the initials ESG stand for environmental, social, and governance — issues according to which companies can be evaluated for their performance and then given a numeric rating.
ESG scores, also known as ESG ratings, give you access to additional information about a company which is not usually accounted for in traditional financial analysis. Factors such as their exposure to climate change and human rights, for example, could have a significant impact on their stock’s performance. A company well-equipped to face ESG issues is more likely to be resilient over the long term, and, therefore, deemed more sustainable.
ESG at TBanque
TBanque provides investors with the ESG scores for over 2,700 assets featuring a user-friendly “traffic light” color scheme:
A green score shows that the company is a leader in its sector in terms of ESG.
An amber score shows that the company is average in its sector in terms of ESG.
A red score shows that the company has a poor rating in terms of ESG, relative to its sector.
TBanque has partnered with ESG Book, a global leader in ESG data analytics, to provide you with market-leading sustainability data on the world’s largest corporations. The ESG scores displayed on the TBanque platform are adjusted daily to reflect the most up-to-date market news and company-reported information.
*Some of the elements you see in the image will be integrated into the platform in the future.
How can you use ESG scores in your investment decisions?
As an investor, there are a number of ways you can choose to incorporate ESG scores into your investment decision- making process:
ESG scores can provide supplementary insights into a company beyond traditional financial analysis.
ESG scores can be used as a filter to decide which stocks to put in your portfolio. For example, an investor might choose to invest only in companies that have a high ESG score and/or exclude those with a lower score.
ESG scores can act as a flag or monitoring tool. For example, a decrease in a company’s ESG score could be a signal to investigate what has triggered the change.
Around one in three dollars globally is invested in ESG-related assets, making ESG one of the biggest investing trends today. Investors are looking to ESG as a way of avoiding risks and as a potential source of better long-term returns. Discover for yourself how to use ESG scores when making your investment decisions.