const safeText = value => String(value || '').replace(/[&<>"']/g, char => ({'&':'&','<':'<','>':'>','"':'"',"'":'''}[char]));
const cssEscape = value => window.CSS && CSS.escape ? CSS.escape(value) : String(value || '').replace(/[^a-zA-Z0-9_-]/g, '\\$&');
const attrEscape = value => String(value || '').replace(/\\/g, '\\\\').replace(/"/g, '\\"');
const toArray = value => Array.prototype.slice.call(value || []);
controlSelector(control){
if(control.id) return '#' + CSS.escape(control.id);
if(control.id) return '#' + cssEscape(control.id);
const value = control.getAttribute(attr);
if(value) return '[' + attr + '="' + CSS.escape(value) + '"]';
if(value) return '[' + attr + '="' + attrEscape(value) + '"]';