d3.js table from multiple datasources
- convert data into array of arrays
- CORS proxy
- detect data types
license: mit |
{ | |
"rows": [ | |
{ | |
"alpha3": "BRN", | |
"name": "Brunei", | |
"alpha2": "BN", | |
"numeric": 99 | |
}, | |
{ | |
"alpha3": "KHM", | |
"name": "Cambodia", | |
"alpha2": "KH", | |
"numeric": 116 | |
}, | |
{ | |
"alpha3": "IDN", | |
"name": "Indonesia", | |
"alpha2": "ID", | |
"numeric": 360 | |
}, | |
{ | |
"alpha3": "LAO", | |
"name": "Laos", | |
"alpha2": "LA", | |
"numeric": 418 | |
}, | |
{ | |
"alpha3": "MYS", | |
"name": "Malaysia", | |
"alpha2": "MY", | |
"numeric": 458 | |
}, | |
{ | |
"alpha3": "MMR", | |
"name": "Myanmar", | |
"alpha2": "MM", | |
"numeric": 458 | |
}, | |
{ | |
"alpha3": "PHL", | |
"name": "Phillippines", | |
"alpha2": "PH", | |
"numeric": 608 | |
}, | |
{ | |
"alpha3": "SGP", | |
"name": "Singapore", | |
"alpha2": "SG", | |
"numeric": 702 | |
}, | |
{ | |
"alpha3": "THA", | |
"name": "Thailand", | |
"alpha2": "TH", | |
"numeric": 764 | |
}, | |
{ | |
"alpha3": "TIL", | |
"name": "Timor Leste", | |
"alpha2": "TL", | |
"numeric": 603 | |
}, | |
{ | |
"alpha3": "VNM", | |
"name": "Vietnam", | |
"alpha2": "VN", | |
"numeric": 704 | |
} | |
] | |
} |
[ | |
{ | |
"type": "json", | |
"url": "data.json", | |
"path": "rows" | |
}, | |
{ | |
"type": "json", | |
"url": "test.json" | |
}, | |
{ | |
"type": "json", | |
"url": "https://sandbox.darylphuah.com/invq1/data.php", | |
"proxy": true | |
}, | |
{ | |
"type": "csv", | |
"url": "https://raw.githubusercontent.com/MoH-Malaysia/covid19-public/main/epidemic/cases_age.csv" | |
}, | |
{ | |
"type": "csv", | |
"url": "https://raw.githubusercontent.com/MoH-Malaysia/covid19-public/main/epidemic/deaths_state.csv" | |
} | |
] |
<!DOCTYPE html> | |
<meta charset="utf-8"> | |
<html> | |
<head> | |
<title>d3.js table</title> | |
<script type="text/javascript" src="//d3js.org/d3.v7.min.js"></script> | |
<style> | |
body { | |
font-family:sans-serif; | |
} | |
form, table, .error { | |
margin:12px; | |
} | |
</style> | |
</head> | |
<body> | |
<script> | |
d3.json('endpoints.json').then(endpoints=>{ | |
d3.select('body') | |
.call(sel=>{ | |
sel.selectAll('select').data([endpoints]) | |
.join('select') | |
.on('change',function(e,d){ | |
let url = d3.select(this).property('value'), | |
endpoint = endpoints.find(d=>d.url==url); | |
console.log('url', url); | |
d3.selectAll('.error').data([]) | |
.join('div'); | |
d3.select('.root').remove(); | |
window.setTimeout(()=>{ | |
datasource(endpoint); | |
},100); | |
}) | |
.selectAll('option').data(d=>d) | |
.join('option') | |
.html(d=>d.url); | |
sel.selectAll('button').data([1]) | |
.join('button') | |
.attr('type','button') | |
.on('click',function(e,d){ | |
d3.selectAll('.error').data([]) | |
.join('div'); | |
d3.select('.root').remove(); | |
window.setTimeout(()=>{ | |
datasource( | |
endpoints.find(d=>d.url==d3.select('select').property('value')) | |
); | |
},100); | |
}) | |
.html('Reload'); | |
}); | |
datasource( | |
endpoints.find(d=>d.url==d3.select('select').property('value')) | |
); | |
}); | |
function datasource(endpoint) { | |
console.log('endpoint', endpoint); | |
let links = [endpoint], | |
sources = links | |
.map(d=>{ | |
let url = d.url, | |
proxy = d.proxy | |
? 'https://api.allorigins.win/get?url='+escape(url+'?_t='+(+new Date())) | |
: url; | |
//console.log('url', url); | |
//console.log('proxy', proxy); | |
return d.type=='json' ? d3.json(proxy) | |
: d.type=='csv' ? d3.csv(proxy) | |
: d.type=='tsv' ? d3.tsv(proxy) | |
: d3.text(proxy) | |
}); | |
console.log('links', links); | |
console.time('loading'); | |
Promise.all(sources) | |
.then((raw)=>{ | |
console.timeEnd('loading'); | |
console.group('render'); | |
console.time('render'); | |
console.log('raw', raw); | |
let data = []; | |
if (endpoint.proxy) { | |
let json = JSON.parse(raw[0].contents); | |
data = endpoint.path ? json[endpoint.path] : json; | |
}else { | |
data = endpoint.path ? raw[0][endpoint.path] : raw[0]; | |
} | |
console.log('data', data); | |
// only on csv, tsv | |
console.log('data.columns', data.columns); | |
// convert to arrays of arrays, but destroys data.columns | |
data = data.map(d=>Object.entries(d)); | |
if (!data.columns) { | |
data.columns = d3.groups(d3.merge(d3.groups(data, d=>d.map(d=>d[0])).map(d=>d[0])),d=>d).map(d=>d[0]); | |
console.log('columns', data.columns ); | |
} | |
d3.select('body') | |
.selectAll('.root').data([data]) | |
.join('div').attr('class','root') | |
.call(sel=>{ | |
sel.selectAll('h1').data(d=>[d]) | |
.join('h1') | |
.html('select & sort columns') | |
sel.selectAll('.rowsize').data(d=>[d]) | |
.join('div').attr('class','rowsize') | |
.html(d=>'no of rows: '+ d3.format(',')(d.length) ) | |
sel.selectAll('.colsize').data(d=>[d]) | |
.join('div').attr('class','colsize') | |
.html(d=>'no of columns: '+ d3.format(',')(d.columns.length) ) | |
sel.selectAll('form').data(d=>[d]) | |
.join('form') | |
.style('display','flex') | |
.style('flex-wrap','wrap') | |
.style('justify-content','flex-start') | |
.selectAll('.inputs').data(d=>d.columns) | |
.join('div').attr('class','inputs') | |
.style('flex','1 1 auto') | |
.call(sel=>{ | |
sel.selectAll('input').data(d=>[d]) | |
.join('input') | |
.attr('type','checkbox') | |
.attr('checked', 'checked') | |
.on('input', function(e,d){ | |
window.setTimeout(()=>{ | |
d3.select('.root').call(renderTable); | |
},100); | |
}) | |
.html(d=>d) | |
sel.selectAll('span').data(d=>[d]) | |
.join('span') | |
.html(d=>d) | |
}); | |
sel.call(renderTable) | |
function renderTable(sel) { | |
let columns = d3.selectAll('input:checked').data(); | |
sel.selectAll('table') | |
.data(d=>[d.map(d=>d.filter(d=>columns.includes(d[0])))]) | |
.join('table') | |
.call(sel=>{ | |
sel.selectAll('thead').data(d=>[d]) | |
.join('thead') | |
.selectAll('tr').data(d=>d.slice(0,1)) | |
.join('tr') | |
.selectAll('th').data(d=>d) | |
.join('th') | |
.style('cursor','pointer') | |
.on('click', function(e,d){ | |
console.log('d',d); | |
let sel = d3.select(this), | |
order_descending = !sel.classed('order_descending'); | |
sel.classed('order_descending', order_descending); | |
window.setTimeout(()=>{ | |
d3.select(this.closest('table')) | |
.select('tbody') | |
.selectAll('tr') | |
.sort((a,b)=>order_descending | |
? d3.descending(a[1],b[1]) | |
: d3.ascending(a[1],b[1]) | |
) | |
},100); | |
}) | |
.html(d=>d[0]) | |
console.time('tbody'); | |
sel.selectAll('tbody').data(d=>[d]).join('tbody') | |
.selectAll('tr').data(d=>d).join('tr') | |
.selectAll('td').data(datatypes) | |
.join('td') | |
.style('text-align',d=>['number'].includes(d.type)?'right' | |
: ['dataUrl','imgUrl'].includes(d.type)?'center' | |
: null) | |
.call(sel=>{ | |
sel.selectAll('.imgUrl') | |
.data(d=>['dataUrl','imgUrl'].includes(d.type) ? [d] : []) | |
.join('img') | |
.attr('class','imgUrl') | |
.attr('src', d=>d[1]) | |
sel.selectAll('.object') | |
.data(d=>['object'].includes(d.type) ? [d] : []) | |
.join('div') | |
.attr('class','object') | |
.selectAll('.subobject').data(d=>{ | |
let k = Object.entries(d[1]); | |
console.log('k',k); | |
return datatypes(k); | |
}) | |
.join('div') | |
.style('display','flex') | |
.call(sel=>{ | |
sel.selectAll('.key').data(d=>[d]) | |
.join('tt').attr('class','key') | |
.style('flex','1 1 auto') | |
.html(d=>d[0]+':') | |
sel.selectAll('.geo').data(d=>d.type=='geo'?[d]:[]) | |
.join('div').attr('class','geo') | |
.style('flex','1 1 auto') | |
.call(sel=>{ | |
sel.selectAll('div').data(d=>[d]) | |
.join('div') | |
.html(d=>[d[1].lat, d[1].lng].join(',')) | |
sel.selectAll('img').data(d=>[d]) | |
.join('img') | |
.attr('width',200) | |
.attr('height',200) | |
.attr('src', d=>{ | |
var qstr=[ | |
'center='+ [d[1].lat,d[1].lng].join(','), | |
'zoom=2', | |
'size=200x200', | |
'maptype=hybrid', | |
'style=feature:poi|visibility:off', | |
'key='+atob("QUl6YVN5RHRQSjBVeC1meDBFR0ZfV2VGakdNaVpxam5vUF93RVpz"), | |
]; | |
return 'https://maps.googleapis.com/maps/api/staticmap?'+qstr.join('&') | |
}) | |
}); | |
sel.selectAll('.value').data(d=>d.type=='geo'?[]:[d]) | |
.join('div').attr('class','value') | |
.style('flex','1 1 auto') | |
.html(d=>d[1]) | |
}); | |
//.html(d=>JSON.stringify(d[1])) | |
sel.selectAll('.number') | |
.data(d=>['number'].includes(d.type) ? [d] : []) | |
.join('span') | |
.attr('class','number') | |
.html(d=>d[1]) | |
sel.selectAll('.string') | |
.data(d=>['string'].includes(d.type) ? [d] : []) | |
.join('span') | |
.attr('class','string') | |
.html(d=>d[1]) | |
sel.selectAll('.null') | |
.data(d=>['null'].includes(d.type) ? [d] : []) | |
.join('span') | |
.attr('class','null') | |
.html(d=>' ') | |
sel.selectAll('.url') | |
.data(d=>['url'].includes(d.type) ? [d] : []) | |
.join('a') | |
.attr('href',d=>d[1].match(/http/) ? d[1] : '//'+d[1] ) | |
.attr('target','_blank') | |
.html(d=>d[1]) | |
}) | |
console.timeEnd('tbody'); | |
}); | |
} | |
}); | |
console.timeEnd('render'); | |
console.groupEnd('render'); | |
}) | |
.catch(function(err) { | |
d3.selectAll('.error').data([err]) | |
.join('div').attr('class','error') | |
.style('color','red') | |
.html(d=>d.message) | |
}); | |
} | |
//==================================================================================== | |
// | |
//==================================================================================== | |
function datatypes(d) { | |
let k = d.map(d=>{ | |
d.type = !d[1] ? 'null' | |
: (d[1] && d[1].toString().match(/^data:image/)) ? 'dataUrl' | |
: (d[0].match(/icon|image|photo/i) && d[1] && d[1].toString().match(/^http/)) ? 'imgUrl' | |
: typeof d[1]=='object' && d[1].lat&&d[1].lng ? 'geo' | |
: typeof d[1]=='object' ? 'object' | |
: d[0].match(/website|url/i) ? 'url' | |
: ['string'].includes(typeof d[1]) ? 'string' | |
: ['number'].includes(typeof d[1]) ? 'number' | |
: 'string'; | |
return d; | |
}) | |
return k; | |
} | |
</script> | |
</body> | |
[{"id":1,"name":"Jaxspan","city":"Busalangga","country":"Indonesia","description":"1E2","timezone":null,"image":null}, | |
{"id":2,"name":"Flashset","city":"Velká nad Veličkou","country":"Czech Republic","description":"!@#$%^&*()","timezone":null,"image":null}, | |
{"id":3,"name":"Skalith","city":"Skidal’","country":"Belarus","description":"testtest","timezone":"Europe/Minsk","image":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAAK/INwWK6QAAABl0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAKZSURBVDjLpVPdS5NRGP+97tVpw9nm5tpShiSsFhMMImiCQlAOk+im7Ma6UKK86g+oCMKwgi66CLuQ7rqqBRVRQS2aFIFeCA7xQjC3qbkcus/345zTc5aNoqALX3h4znPO+X085z1HEUJgJ18Ndvip84+uJBljezlnYMykMGCaMvRqNgw51t+cvBk78ReBBLeEIxCCQTAOwU1IMkFkgsh4JZuYeT55/J8OpAonkLaZrmzkspZAmUldhtXuxUTjbTy48Z62kFOTvBrm5fjd/oeqtOgJDvy3VxZ7h2vnDoFxgeR63nL/yfQtmv5JcPXlIubTOTCdw9RJgcLUWLXe77OBFKGbAgf9DnS1O3Dv8WdnpQXD0HDRHUexZmnbskEW9ap9We9q9mMkeRj2BgVLq1kEWh0wdANVAk6nzPTSNtCoAmUW2+chAYbJkUjmUSJXVQJdL1eAdY2eyomXS2UklvJIFRvhavFiNb2II5YSFL2A2LNJeFua8WVmA62qhp6eHps6Gf8G8XGC/gQHFxyszoFj/WcwdOEsCoUCksl9eP3qBbpqp3FqYBgN9fVYWVlBvXUab7/bryvyKgeDwcVwONxeLBbhdrvF+eFh5c7YGLa2toTP51NCoVAFlMlkkE6nYbfbMTo6img0uvnrKg9NTU19mpub++p0Ok05MTs7+yGfz5cGBwfR3d2NSCSCvr4+5HI5JtfknqamJqsqB4lEIk7paGdn5yVSGKPx7kAgoGWz2drx8XHYbLaKimzJYrFwuSbrVCpVVn5/jdTKgY6Ojqe9vb172trauKqqzrW1NSwsLMBqtcLv98Pj8dC7MDeWl5drYrHY6h8ExGzxer0hUoxS724CWeSLpd5HpKDL5YpSrtU0jZHTdXJ0+gdZxaA90+h/PAAAAABJRU5ErkJggg=="}, | |
{"id":4,"name":"Plajo","city":"Cafarnaum","country":"Brazil","description":"社會科學院語學研究所","timezone":"America/Bahia","image":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAAK/INwWK6QAAABl0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAF/SURBVDjLpZN/S8JgEMd9i1JURPSDIoIkS1FQI4iQgihStExrhGmydGObyZyyYRaybBRFQb/8vxcgBIF92275ApoHx7jjns/37p49LgCuQdzlXmEXd8RON1L4QPjM9NwbQtkXBE+eEWCe4D9+hC99j+XDO3j3b+FJ3CCcvu5a5wgQLXV6ceUT/3Xv3mWPAJayE5/fboAA4dw7nNjspmoDQqevlDAMA+12G61WC1/fP1BVFfV6HbIsUyyKIgRBAMdxVD8drf0BzIU5scl12QZY27ZM13VSbzQapFir1VCtViFJEsUsy6JQKCCfz1P9xFrFBlhX5cTGVyUb4D96oESz2SR1RVFIsVKpoFwuo1gsUpzNZsEwDDKZDNWPhQUb4D0wHHUwHCjZgKVEmxKaptHc/ZmtL8/zNLMVp1IpJJNJxGIxqh/yn9sAT1x31IHbx6L/FtiF3Sv6s+a2NMxE65jaUMwtX9CixiIiRkM8RoKc2XbRVGZhnrGcJcDAr3FQwC803UMOARws7QAAAABJRU5ErkJggg=="}, | |
{"id":5,"name":"Jabbersphere","city":"Canhestros","country":"Portugal","description":"ثم نفس سقطت وبالتحديد،, جزيرتي باستخدام أن دنو. إذ هنا؟ الستار وتنصيب كان. أهّل ايطاليا، بريطانيا-فرنسا قد أخذ. سليمان، إتفاقية بين ما, يذكر الحدود أي بعد, معاملة بولندا، الإطلاق عل إيو.","timezone":"Europe/Lisbon","image":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAAK/INwWK6QAAABl0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAE3SURBVDjLY/j//z8DJZhh6BgQMuWBQumq5xdaNr/84Nt1t4FkA5LnPd4A1Kjg1XaroWH98/9keyFx1sMLKfMePcAwoLy8/EBxcfGB3NzcA2lpaQfi4+MVwsPDD/j5+R1wdXU9AFJjX3GtIWzSvQvmOZcMMAwAag4Aav6QkpLyH6h5AkgMqLkBqHmBjY2NgnXRlQCn6msLTDIuCBgmX3DQiz+rgOEFoM0OQM3/IyMj/wM1F8BsBmHv1psH0uc+/J8868H/sIl3P+AMA6CzJwQGBv53c3P7D7RZgORoBNosANLs4uLy38jIaALJBoCcDbS5wNra+r+BgcF/BQUFB6IMANkMDbACEF9TU3MC0AX/JSQkPggKChoQNABq8wGQs4GaDYA2HwBqPgDUfICLi+sACwuLweDMTAA2jKFj5WHetwAAAABJRU5ErkJggg=="}, | |
{"id":6,"name":"Reallinks","city":"Quatro Barras","country":"Brazil","description":null,"timezone":null,"image":null}, | |
{"id":7,"name":"Zooxo","city":"Kolkhozobod","country":"Tajikistan","description":"../../../../../../../../../../../etc/passwd%00","timezone":null,"image":null}, | |
{"id":8,"name":"Yadel","city":"Sangar Sarāy","country":"Afghanistan","description":"␢","timezone":null,"image":null}, | |
{"id":9,"name":"Dynabox","city":"Tuchkovo","country":"Russia","description":" test ","timezone":"Europe/Moscow","image":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAAK/INwWK6QAAABl0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAMOSURBVDjLVZNNaBxlAIafb+ab2Z3N7Oxv/nYTEyv2LzQJpKBgrQqNUKmY4kUIXqUHT70p9iB48CKIiN5E0It6KFiwiv9FpAVpKUggNc3mZ7vpJpv9n93ZnZ35PNRI+8B7e9/n9gqlFAeIVUfPeN3zh0R0eVpYM1OanhvTCEY0f3tU79+ctnpfHM73fuQhxIHAWHnmkOGXPjgZyS09l5hnNv4YOdMhoQmigzqGt4nhfeub1fpnVsl/e+hMv/q/QKy+Me0EO5dfso/OvzB8grgV4HGXJC7jwAQ2oxxDuC36xZ+Rhe+v6iutZf2iqklReNe0tPSHZ2Nz84ujR7ht3iJKjcexiOIQI8SiixxcR7QtRORFlK7O9t0rlyy4KBEj5+YisVeez85wy9zGIUeGDDYhDhYOITYuoh2BvTJ68y7B0GnCym8XGq+KL2U0MrE8Z2SRVhqdPmlCsvgk8RlCkgAivRbUNKj1YPMeeu4wcnjRql7/+jVpyvxsPjbK3whi5LEAB0WWgBRgqwAaFah04X4V7puwdwddz+FXjJMSbXI8aSTYCgU2oKMwEdgCEoDhug/G5SjsmFDUoV+DXJ7BnpiUVCNBaJqEXfDVfwG6CjoKnF4crZGCVvNBug0IPXzPZOCnAunfk8W6ro7H2gK3A02gGoDeA1MDGx2nkYG6C24bvDaMSzq7ZfxBsiC7O+aNDaWOn0oLfl0HMwDlQRCAHYUkEGvFkLsp2G9Bo0n41AiNG6sMBvY1yZr6/JsV//XZZ3WZaEp2t6DvgWFA1QRHQbwjSDeTUGvCiSPU1ovU/typQPIrTV0yrrl3vE+/+8XlaCIgq8H+BtSLUN2C2ibsl8ArR+HYGE0rwvbvRTr96HsL6od1CUDDf+enK92JwT+982cWEswvRmiug6qAr0E4AV4uoFXosnV1g8bN5kcp7E8eOZOYKtmUqm/ZiDdfPhV3Zp6IM5k0SIUBstwmXKvCX5UdM6y9n2b34wV1IXxEcEBU3J4dprU0zODpjFBTIyoIxgjXxlB/PIl1eUmdLjzc/xceOVXddrB6BQAAAABJRU5ErkJggg=="}, | |
{"id":10,"name":"Realblab","city":"Merke","country":"Kazakhstan","description":"`⁄€‹›fifl‡°·‚—±","timezone":"Asia/Almaty","image":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAAK/INwWK6QAAABl0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAKFSURBVDjLfZNNSFRRFMd/b96Mb0ZHEbFPTfqQNKpFkVZYFO1MSFpEkBAYhBht2rnKHIogCNq0qIX2QdHOKFHJooIKlDIrykxLM0VzbMYZx9F57360GC0lpgOHc7j3/H8czrnX0FqzYKefVOuDm8rpDr1CaoVUct4VQglKcvfQdP8W7WeeGQsaN4tMOAKlk8VSSYRS8/Gv27ZYLMG1BGALtAZHSmwp2BgJc/T7V2zpIOT8XcJJDXBsgUU6lsuLIwV7JyfZLvysjEawTB8+7cex/w8IfBrqZY1VyAphsn5mGrW6jLLxMOu8RXS/68GxRSAl4O6x5vrnn54GJkZCHJgxYMNhZG4JJeEwE/1B2jpbA28uva9frDG01nC7zIfLLEJjApyPumpqsq2TWVtqkY4b60cz9/peP6xaldNAsgTEXJATL4aTgJulI+QU52kM0Bq0Qi7fTcKdj4pNYooprHg/xlwo2bR0IDaGKxo+ngRcXHMIoe+o/bV+WXgEFQ0iopOo6SAqPoW2E6AVRlo6JgL3hxa8gwMPyPBUGX8e0tm8QhQtamdlUaKgEhkeR8bDqHgEPRNFGxpLhPC/fSyJiXqaxi8sHWJgdAC/Z4frc3uze+ojWtnouRl0Io4Ss7g9bvy9T0PYunxB/M8WqBuKkZ3V4ZoeQgsHhANKgjMf09wxro12pFwjAKa3QmYXJ1OPwGtGcPmykcpC5iwroKF4a2pA4y4f2jgg/Wvxfmsj81HjQPrLthuZwU4scxqRtQ6kUZEaINU+mZHv87SeI62r6zpCb+PqSLVnbLg8o6d1VM/OgqOXAJb8RiJTeeaX8UF+2ado/Nn+5/zyUDt1RZu9fe+vICldLPkNkalgK6EwqgIAAAAASUVORK5CYII="}, | |
{"id":11,"name":"Linkbuzz","city":"Jutrosin","country":"Poland","description":"⁰⁴⁵","timezone":null,"image":null}, | |
{"id":12,"name":"Lazzy","city":"Wŏnsan","country":"North Korea","description":"/dev/null; touch /tmp/blns.fail ; echo","timezone":"Asia/Pyongyang","image":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAAK/INwWK6QAAABl0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAALkSURBVDjLlZJrSJNRHMaFvtWXvvShT6ltb6Qz1EorZDZv5ZwNJ4UQQYJLnfZhmTJDtthUUpi2UcyELKI0l3My57zkEE2kmszyOi8jLyi75GVaXpr59L4vNBgV0oEH/ud/nud3zuGcAAAB/6OpVsI4pmN63z8O1lPz/QMG4ojNQISQwcM2A1Mxa4yEuy0B7Yog774AezvxhAzOT+gJD7nrz3nTWQxUB+0NKFnQlQS2/hNABpnTJmLLOXQb265u7Dg7sTYohquVg9GacBhkgbLf3r+F02d7zsM9XokfLhM81mtYeRcHpz4UjpZoODriYZIH2v4AkMGjpN4uWTKwMduI7YUX8Fi4WO3n4Kv5Atwdp+EynoKrOxmDVQyvDzBtJJhkcIm86557RArvmgXf7aVwD1yC08zGYls0ZurDsNDEgrOFPEXnZfSUBe/4ABM6Zrd7+Cp2HE+xOSfBpi0TWyMCuHo5mNZGYPxZKD5rCMw2nKCvsWRKQsu9wHkfYPg5Y3Hdnot1uxwfX7LwSRuCscYozJBydkTBomLA+vA4FuoZcHclYq4pBo13jzX5AB8eBddOGWOwMlmC0WY+9NJz0NxPR0WZFHV1dahQFKC7MgLDNQQqSwvpXnmZYkMkEhWy2exDNKWvKmhgqCESy5MSFN9kQ6VSweFwwG63o7e3F9UPCqFWCDFpG6N7/f39tIfH41X6XqGrPGiyVhoBSZEY1pERlEmzkMpLgVAohFqtRnFxMV3zUrjIyMgwUZCCgoI1vz+QeSV0qlQuowFvilhIjI+F2WyG1WpFX18fdDod4jnsPT6ff5ACyOXyLT9AWFhYbk72rQ0KcEeYjIQEDpKSkpCWlkaLquPiLu4JBIJOCpCdnb3qBzhJjtTU1AmlUrmqff1qs7m5GRqNBmKxGBKJhK6pnlarXaY8lNcPQBDEgdjY2HAul/slKyvrW15e3lZ+nmhXduOMR36d5ckX5eySvW1qjfJQ3l9oR6i5wBWqZAAAAABJRU5ErkJggg=="}, | |
{"id":13,"name":"Zoombox","city":"Čoka","country":"Serbia","description":"0/0","timezone":"Europe/Belgrade","image":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAAK/INwWK6QAAABl0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAG7SURBVDjLjZMxi1NREIXPC9HCKGGN2MgWdio2utZxA0KKVPkBwqaR/IS0dqYx/0LIVpsuBMFKA5LdQotF1kJWcMvYmBfemzPH4r4X3+pDMjDM3MvMx5m53Gg4HJ5L2pV0OhgMHmAL6/f779I03Sd5WgGw2+l0QPIetrQ4jvd7vR7iOL5fJXkymUweXb1+OzparCQATiCPDsAFkMDz5rUIANbr9dvRaPTMzN5HkgAAR4uVdmoVQKFJHhqlEC9+Og6eBkDRqnlCD8V5Q+4S4A6Yl4+zAeSFyiS7/wVhOWEzwuGHlW7eqEACPp0vgyoJJCA6zAE3hxlgJF4d3I0uKTABLIxwZ+dKUOECXXCGSApff6QlO2BBNpWdBXcHHSAdZAAkqZcABFwsHXQPxS44HSSyuz9K0lT/AopP9PJwKZpvJNMdbgp7oMOsBFA0M8EKkjc7yHIz/h+QJoRZddNoVLZMhxOXFXS73UWSJHskj6fT6RMASM1x9v0XUgdoDiNgRjjD03588wK3Xn+RmZ2h3W5rNpup2WxKErbxRqOh8XisWq2mqNVqHSdJ8pjkyXw+39vmN9br9c9m9pDkt98JJaJgEg+kbwAAAABJRU5ErkJggg=="}, | |
{"id":14,"name":"Skajo","city":"Chernukha","country":"Russia","description":"`⁄€‹›fifl‡°·‚—±","timezone":null,"image":null}, | |
{"id":15,"name":"Zava","city":"Manadhoo","country":"Maldives","description":"<>?:\"{}|_+","timezone":null,"image":null}, | |
{"id":16,"name":"Katz","city":"Sapporo","country":"Japan","description":"١٢٣","timezone":"Asia/Tokyo","image":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAAK/INwWK6QAAABl0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAJ6SURBVDjLjZM7aJNhFIaf77/k/9OkJpBWjSWtaUEREVEXL6uoiIOLULCigyi4VRy8gHQo4uIsuIhOOuigCJKCLWpx8kLRQqFWhV4SQ1PTNGn+5Ls4RGlrq/jyLd9wHs57znvEvafvbmktTlZq2g8kq2VWfl0HfJe7Z4/v7gVwtBE9xw6kWn3fF0LY/EtVDUrWefxi/AzQAFQC7XmeL+4PzVFllpIYI73hO2G3iDSawnyYT+Mxmsw2HBJcOpFGaSF+Q52aBMuysQTUrCzplu94oW8UgxJSSRzPozOV5MtEhHioBa1XduUAaMCyBIHJE3Ln+LFYJFBValIiTRnP8ygHYRJhC4NZMZglgBAYqQlUnaoMWKwH1LREaUDUMVrhWAJjVk7VAjCmAfBppVSOYHAJtCKQCiFClEtRoqFN2LYFRqy2YEzDQtRuYyqbI+bP0BSx8IRkodBELpskGevEscSqzThmOcBdz6bwLibfDxKPTiOUwq220t7VQ9RPorT+MxZLHYzNnkNpjdKaLUGefakONDAxk+P5whW2f5xj6/gko7fnSTcnmjN38pcPZeRNxxiDAI40ggWAveMHlfIs/swILfvP0TOcYV39DVtOX8VLb2dxJGONvhroHzjolh2xRl5VOI4KxwlauhoJzDxgz6le/M9D8LKfpliczR0ddmHM9Dq+K4roemznhr0gxC+U+f0AeJvP4W9Mw9GLS977kthabHZCjnj4aHBiX02ZHcasfQOd0URz5cMzK/LkAsFilgpQmrdRNtPC/K1qmV53t/WFmiPXUgnpONYkpbzka85W9aq5/l8AgOHu9svlwvR5W4kOZZspA7cPZ+SNn/95GW/b/Tx4AAAAAElFTkSuQmCC"}, | |
{"id":17,"name":"Skinder","city":"Kaltungo","country":"Nigeria","description":"̗̺͖̹̯͓Ṯ̤͍̥͇͈h̲́e͏͓̼̗̙̼̣͔ ͇̜̱̠͓͍ͅN͕͠e̗̱z̘̝̜̺͙p̤̺̹͍̯͚e̠̻̠͜r̨̤͍̺̖͔̖̖d̠̟̭̬̝͟i̦͖̩͓͔̤a̠̗̬͉̙n͚͜ ̻̞̰͚ͅh̵͉i̳̞v̢͇ḙ͎͟-҉̭̩̼͔m̤̭̫i͕͇̝̦n̗͙ḍ̟ ̯̲͕͞ǫ̟̯̰̲͙̻̝f ̪̰̰̗̖̭̘͘c̦͍̲̞͍̩̙ḥ͚a̮͎̟̙͜ơ̩̹͎s̤.̝̝ ҉Z̡̖̜͖̰̣͉̜a͖̰͙̬͡l̲̫̳͍̩g̡̟̼̱͚̞̬ͅo̗͜.̟","timezone":"Africa/Lagos","image":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAAK/INwWK6QAAABl0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAJjSURBVDjLpZNLbxJhFIb7A/wF/A5YunTDzuqmO+PdsDFx0dSVpJq4aIyQmUIU06a1gUqCJlXb1Ehb6QhiGgsdKFNAwAIOhWEcBobLUI5zPpgRLzsneRfz5bzPec93mQCAiXGdc4FJk0WTVdPUSNbRmunP+nHjGU3muy8lW+DjMR3ZTzMHiUMhziaF3b0U82InR0/76zaswdrfACPzWV+obI8fZjm+JoGs9EA9HRA1Wl0oVeoQ3mO5hc2sHWt1iA4wo5lNfZXbHRXwU7p9qMs9EDQ1O32yJitd2I3GZM/6EULMBIBzYWzsrJurUhcqP7rAi0OVxQ6U6h0DsrkV5m6v8DiOCQGWAPONxti6+eKDENxyJw3z5OwOXHclSBr8UrnvQPkjNHoRYA1/OWJwZoyKpgv3EZAgXYtCWwNsE0Ct0QOppcKJqMDi6msGvQiYih0kBNwsLEAAdryhAY5rbaJJ+zZcm2dJOvzvqqew4l0V0EsA+3GWALAAu+qRsbhQbcP5e0G4Sg8B+C+1erC49NwAWD98TjKi3IGGog47ksgs5E8UyFUUDfCeAHBj8WTSRREoj9cYweINZuhCqQaDAZAOGBeV5RUiNF+mWDJerz+ArU9JsLvfGptouuOr2oKhKCdIbeMkdKXLLeM40ZzRujufLHNX3OnhMeoXiXoVt6+9C8l8vUmSiE2VpMEx8PjQnC7WweHxyTPU+q+LNH6V57xR+7J/jYvEMlDgJbInOHMyL8BGKA5z1AI37Xzz91Uef0w3n+Vts0836EeuJYaadwuPnbTw0OFhZhwB+hKd+vdj+p/n/BMZPwxzcSL1lgAAAABJRU5ErkJggg=="}, | |
{"id":18,"name":"Dynazzy","city":"Dimitrovgrad","country":"Serbia","description":"田中さんにあげて下さい","timezone":"Europe/Belgrade","image":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAAK/INwWK6QAAABl0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAJUSURBVDjLpZNbaJJhHMZHUES51SoiqssWm5SMQekoFwvnYR4RP02dh/yMMhJpW3PaFOuzURfNi8GUDusw3QGDgl0k0Y3QcbjVqtsY3cVAu9uMwqf3ey+EwXBFFw/vgef58X94eesA1P2P1r284DDfDp/ajUhHPQZOCuBr3wXWrLv/VwAf64pFtM0YO3sUN1U7MOo+gr4OAdzSA2Cd1pENASGjGKO2JgyQ0A3TIRJuQJw5DF/HXhha91Q2BJw/3ojLaiHGr2gwwp6A/VgjrhqbYW0/CKZtJ0b6zmyvCRhU7ltdfH4XxfcT+P76AeYf9ePrs2tYmB1DVLP/56eHF7fUBCQcre9Kc5NYLmSx8nGKaJruS/NTuOMRFWpWaJP7tkql0ux4oBPlwj2sfnlKtfIhg8mBTojF4iei0+e2rQtQKpUNKpWKU6vVSKVS6OnpwcQQQ6XRaOidTqfj93HiFawBkOCmYDB4izfypmQyCavVimw2i0wmA5PJhOHhYXg8HnR3d1dkMtkggWyuAkjwEsuySKfTMBgMMBqNsNvtyOVyyOfzsFgs0Gq1sNlsiEajcLvdFblc3lcFLAw1/16eHUQ4HAbHcdTkcDhAJqPjMwwDr9cLl8sFv9+PYi6Kt/0t5SpgMdJSKb24Tg2JRIKCSCVq5iv19vYiEAggHo9T2I+XHOaCwkoV8PmxPzQfavrldDqh1+upkVcsFqP9+an4M+mPrq4uLERFZZLh1rzC0rSvnnRsIs/4ivRdIuOXFQoFePEhshYlEskbs9ks/Dbjq6/5G/9FfwAGy37p9rgYIQAAAABJRU5ErkJggg=="}, | |
{"id":19,"name":"Bubblemix","city":"Gjøvik","country":"Norway","description":"ÅÍÎÏ˝ÓÔÒÚÆ☃","timezone":"Europe/Oslo","image":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAAK/INwWK6QAAABl0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAKtSURBVDjLpZPrT5JRHMfdetn/4evet3QrhGayZathrbwNppMU8ckFONEhoiGFeMNL4o3yBoi37lQQ89rYypaLIitTQVSUWKC9+Haeg5P5svXi+5zf7/t8f59zzrM9SQCS/kf0MeAKKfudodWe19vofhlE54sg2p4F0Px4A43T69BN/ET92A+oLd9QPexD5YMvUAx4F44Afc6dYCT6B/+iW73LsSOA6dUWNWEWAQNCoDcXMN0AOrKAtstAIx9o4AHqs0DVGZqVdH3AEaDLETwEkGGHHHheDjyVAk+KgclCwJ4HjF4DBgms8jTNFhnfJQDt5L7HTtCfD/SRoZ4coPs60EmG2wVAKwG0XKJZYbMnAWghH4s1H74JsCaG3X66jszEe8tsvLfPxdfgXhQ5+sUEQD+1hvDvAzpgYTW7CetsALb5AOxEUvtNlIwVodhaiOm3fnzdCOOqdi4B0I2vYo8AbPOb8Z0O18nF+AmYcQla39+DZExM+89re7iimUkA6mzfsRs5wMTiJmwzq2CaS6GuV8NkMqFGcweMWQJmVIKKGgX1tFodsuVdSElJOUkBqpEVhH7tY2phnQYMBgP8fj98Ph+cTifqG/QwtnfC6/VSz+1200xGRoaWApRDPgpo7JnAbZkCnqUl5DO5JHABIpEITU1NkMvltObz+VDXaiiEYZhdClCYP2GHAMoq6qDRaCggFoshjcuDw+GAx+OBy+WC1WoFj3cega0wBahUqigFlPctYzscw/1eMySSUgqQVSjB4XDA5XKRmZlJxdYcThqUVdUUUFBQEKKAMtNHd0nHUiRb/QgXs/KgvWuAecgCm80Go9EIqVQKmUxGa9YzD1qg1ekPyHWWj/2aycnJJ1JTU0+lp6evCIXCiFgsjhLtCwSCbKJzpA6zHvuOzbDZv+ti+O9p0FSiAAAAAElFTkSuQmCC"}, | |
{"id":20,"name":"Jabbercube","city":"Semiluki","country":"Russia","description":"ثم نفس سقطت وبالتحديد،, جزيرتي باستخدام أن دنو. إذ هنا؟ الستار وتنصيب كان. أهّل ايطاليا، بريطانيا-فرنسا قد أخذ. سليمان، إتفاقية بين ما, يذكر الحدود أي بعد, معاملة بولندا، الإطلاق عل إيو.","timezone":"Europe/Moscow","image":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAAK/INwWK6QAAABl0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAKoSURBVDjLpVM9TFNRFP7ubWvb1x+QQAtRIFaRmEakaYiGiJaAurioiYsxXXVxMHESB40TJI5OOihxq0sZTDBq6kANikAJNLSBAokQ29q/1x/69673PoSoMS6c5Oa8c979zv2+k3MIYwz7MYp9mvb3IBKJ9HB3T7BSFAXcW8Q3P/KvWOTHXC5XaBdDRDIajZ7jflyn03VYrVYQQnZ+cr9bTJjwyWQSxWJxg+dv9vX1fST81SEevLXZbKRWlLE++wlyfBO5+BZq5ZIK1BkkWGxtsNoPoePUaTCdHqurqxzGLpDl5eVZDu41m8148+QBVoLv/qv5aP8QBm/fR6lUEsznNF6vd2xtbU3vcDhw7IwHBTmrXqxXymC1GpdB0XnSDvfFw7C0n0XXwGUYG5pUOYlEQtJyBrnh4WFLuVwG7wEGvHeg0WjUIoVCAay+jVx4FJbWfjQVMjB1diEej6t3uIQkTafTU3a7HQaDQaUVi8WQSqWQzWZR4wwK3yZhanbD2uZCfuMDVhYDKrharQoWE9Tn8z3f1ScKCGr5fF59XU6uIL8+CUtzI+o5P2zOG6CJ99BpqcqCMxihCwsLOQEWIJE0mUzQ6/WglKC6NYmW7ivA9ldMv3wFc2MJJL2E2o95wS7l8XjyVJZlRXRTkiQIKep4Uop6JowDrAzLwSKUcgxgCur5zzjiuYvU/DhQyYyqd7mWkNPpvOX3+8O8H8hkMqCEoRD1obGjF0oxxLEluK91Q6ls8l5F0OI4D33osX5vEsnO6EmBQOCFVqu92lRbIhKR0XrcyF+d5lormHkd5kVOgGgaAOMlfHk2EmeKMkj+3sZgMNhO5x5u9Fx/Cg1d47OQ5ln2x/5pjN34vjiHyMQjH/nXOk+NuZOsrkhM4YsklmjvsD2PneWa+QnIJn6IP3aTNQAAAABJRU5ErkJggg=="}, | |
{"id":21,"name":"Midel","city":"Pulap","country":"Micronesia","description":"𠜎𠜱𠝹𠱓𠱸𠲖𠳏","timezone":null,"image":null}, | |
{"id":22,"name":"Pixonyx","city":"Idvor","country":"Serbia","description":null,"timezone":null,"image":null}, | |
{"id":23,"name":"Tagchat","city":"Pingdingbu","country":"China","description":"","timezone":"Asia/Harbin","image":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAQAAAC1+jfqAAAABGdBTUEAAK/INwWK6QAAABl0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAEYSURBVBgZBcHPio5hGAfg6/2+R980k6wmJgsJ5U/ZOAqbSc2GnXOwUg7BESgLUeIQ1GSjLFnMwsKGGg1qxJRmPM97/1zXFAAAAEADdlfZzr26miup2svnelq7d2aYgt3rebl585wN6+K3I1/9fJe7O/uIePP2SypJkiRJ0vMhr55FLCA3zgIAOK9uQ4MS361ZOSX+OrTvkgINSjS/HIvhjxNNFGgQsbSmabohKDNoUGLohsls6BaiQIMSs2FYmnXdUsygQYmumy3Nhi6igwalDEOJEjPKP7CA2aFNK8Bkyy3fdNCg7r9/fW3jgpVJbDmy5+PB2IYp4MXFelQ7izPrhkPHB+P5/PjhD5gCgCenx+VR/dODEwD+A3T7nqbxwf1HAAAAAElFTkSuQmCC"}, | |
{"id":24,"name":"Thoughtbridge","city":"Tembau","country":"Indonesia","description":"1/0","timezone":null,"image":null}, | |
{"id":25,"name":"Zoombox","city":"Villejuif","country":"France","description":"🐵 🙈 🙉 🙊","timezone":null,"image":null}] |