';
/* Mode */
html+='
Mode'+(h.mode?esc(h.mode):'\u2014')+'
';
/* Difficulty */
html+='
Difficulty'+(h.difficulty?esc(h.difficulty):'\u2014')+'
';
/* Context */
var ctx=h.context||'local';
html+='
Context'+(ctxIcon[ctx]||'')+' '+esc(ctx)+'
';
/* Ranked */
html+='
Ranked'+(h.ranked?'\u2705 Yes':'\u274C No')+'
';
/* Moves */
html+='
Moves'+(h.moves!=null?h.moves:'\u2014')+'
';
/* Score detail */
if(h.score&&(h.score.player!=null||h.score.opponent!=null)){
html+='
Score'+(h.score.player||0)+' \u2013 '+(h.score.opponent||0)+'
';
}
/* Duration */
html+='
Duration'+(dur||'\u2014')+'
';
/* Opponent full */
if(h.opponent){
html+='
Opponent'+esc(h.opponent.name||'Unknown')+' ('+(h.opponent.type||'?')+')
';
}
/* Match ID */
html+='
Match ID'+(h.id?(h.id.substring(0,8)):'\u2014')+'
';
/* Full timestamp */
html+='
Played'+(h.ts?new Date(h.ts).toLocaleString():'\u2014')+'
';
html+='
'; /* /ps-hd-grid */
/* Extras */
var ex=h.extras;
if(ex&&typeof ex==="object"){
var keys=Object.keys(ex).filter(function(k){return !EXTRAS_SKIP[k];});
if(keys.length){
html+='
';
keys.forEach(function(k){
var lbl=EXTRAS_LABELS[k]||k.replace(/([A-Z])/g,' $1').replace(/^./,function(c){return c.toUpperCase();});
var val=ex[k];
if(typeof val==="boolean") val=val?'Yes':'No';
else if(typeof val==="number") val=val%1===0?val:val.toFixed(2);
else val=String(val);
html+='
'+esc(lbl)+''+esc(val)+'
';
});
html+='