angular-mentions
Version:
Angular mentions for text fields.
155 lines • 20.1 kB
JavaScript
// DOM element manipulation functions...
//
function setValue(el, value) {
//console.log("setValue", el.nodeName, "["+value+"]");
if (isInputOrTextAreaElement(el)) {
el.value = value;
}
else {
el.textContent = value;
}
}
export function getValue(el) {
return isInputOrTextAreaElement(el) ? el.value : el.textContent;
}
export function insertValue(el, start, end, text, iframe, noRecursion = false) {
//console.log("insertValue", el.nodeName, start, end, "["+text+"]", el);
if (isTextElement(el)) {
let val = getValue(el);
setValue(el, val.substring(0, start) + text + val.substring(end, val.length));
setCaretPosition(el, start + text.length, iframe);
}
else if (!noRecursion) {
let selObj = getWindowSelection(iframe);
if (selObj && selObj.rangeCount > 0) {
var selRange = selObj.getRangeAt(0);
var position = selRange.startOffset;
var anchorNode = selObj.anchorNode;
// if (text.endsWith(' ')) {
// text = text.substring(0, text.length-1) + '\xA0';
// }
insertValue(anchorNode, position - (end - start), position, text, iframe, true);
}
}
}
export function isInputOrTextAreaElement(el) {
return el != null && (el.nodeName == 'INPUT' || el.nodeName == 'TEXTAREA');
}
;
export function isTextElement(el) {
return el != null && (el.nodeName == 'INPUT' || el.nodeName == 'TEXTAREA' || el.nodeName == '#text');
}
;
export function setCaretPosition(el, pos, iframe = null) {
//console.log("setCaretPosition", pos, el, iframe==null);
if (isInputOrTextAreaElement(el) && el.selectionStart) {
el.focus();
el.setSelectionRange(pos, pos);
}
else {
let range = getDocument(iframe).createRange();
range.setStart(el, pos);
range.collapse(true);
let sel = getWindowSelection(iframe);
sel.removeAllRanges();
sel.addRange(range);
}
}
export function getCaretPosition(el, iframe = null) {
//console.log("getCaretPosition", el);
if (isInputOrTextAreaElement(el)) {
var val = el.value;
return val.slice(0, el.selectionStart).length;
}
else {
var selObj = getWindowSelection(iframe); //window.getSelection();
if (selObj.rangeCount > 0) {
var selRange = selObj.getRangeAt(0);
var preCaretRange = selRange.cloneRange();
preCaretRange.selectNodeContents(el);
preCaretRange.setEnd(selRange.endContainer, selRange.endOffset);
var position = preCaretRange.toString().length;
return position;
}
}
}
// Based on ment.io functions...
//
function getDocument(iframe) {
if (!iframe) {
return document;
}
else {
return iframe.contentWindow.document;
}
}
function getWindowSelection(iframe) {
if (!iframe) {
return window.getSelection();
}
else {
return iframe.contentWindow.getSelection();
}
}
export function getContentEditableCaretCoords(ctx) {
let markerTextChar = '\ufeff';
let markerId = 'sel_' + new Date().getTime() + '_' + Math.random().toString().substr(2);
let doc = getDocument(ctx ? ctx.iframe : null);
let sel = getWindowSelection(ctx ? ctx.iframe : null);
let prevRange = sel.getRangeAt(0);
// create new range and set postion using prevRange
let range = doc.createRange();
range.setStart(sel.anchorNode, prevRange.startOffset);
range.setEnd(sel.anchorNode, prevRange.startOffset);
range.collapse(false);
// Create the marker element containing a single invisible character
// using DOM methods and insert it at the position in the range
let markerEl = doc.createElement('span');
markerEl.id = markerId;
markerEl.appendChild(doc.createTextNode(markerTextChar));
range.insertNode(markerEl);
sel.removeAllRanges();
sel.addRange(prevRange);
let coordinates = {
left: 0,
top: markerEl.offsetHeight
};
localToRelativeCoordinates(ctx, markerEl, coordinates);
markerEl.parentNode.removeChild(markerEl);
return coordinates;
}
function localToRelativeCoordinates(ctx, element, coordinates) {
let obj = element;
let iframe = ctx ? ctx.iframe : null;
while (obj) {
if (ctx.parent != null && ctx.parent == obj) {
break;
}
coordinates.left += obj.offsetLeft + obj.clientLeft;
coordinates.top += obj.offsetTop + obj.clientTop;
obj = obj.offsetParent;
if (!obj && iframe) {
obj = iframe;
iframe = null;
}
}
obj = element;
iframe = ctx ? ctx.iframe : null;
while (obj !== getDocument(null).body && obj != null) {
if (ctx.parent != null && ctx.parent == obj) {
break;
}
if (obj.scrollTop && obj.scrollTop > 0) {
coordinates.top -= obj.scrollTop;
}
if (obj.scrollLeft && obj.scrollLeft > 0) {
coordinates.left -= obj.scrollLeft;
}
obj = obj.parentNode;
if (!obj && iframe) {
obj = iframe;
iframe = null;
}
}
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWVudGlvbi11dGlscy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL2FuZ3VsYXItbWVudGlvbnMvc3JjL2xpYi9tZW50aW9uLXV0aWxzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLHdDQUF3QztBQUN4QyxFQUFFO0FBRUYsU0FBUyxRQUFRLENBQUMsRUFBb0IsRUFBRSxLQUFVO0lBQ2hELHNEQUFzRDtJQUN0RCxJQUFJLHdCQUF3QixDQUFDLEVBQUUsQ0FBQyxFQUFFO1FBQ2hDLEVBQUUsQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDO0tBQ2xCO1NBQ0k7UUFDSCxFQUFFLENBQUMsV0FBVyxHQUFHLEtBQUssQ0FBQztLQUN4QjtBQUNILENBQUM7QUFFRCxNQUFNLFVBQVUsUUFBUSxDQUFDLEVBQW9CO0lBQzNDLE9BQU8sd0JBQXdCLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxXQUFXLENBQUM7QUFDbEUsQ0FBQztBQUVELE1BQU0sVUFBVSxXQUFXLENBQ3pCLEVBQW9CLEVBQ3BCLEtBQWEsRUFDYixHQUFXLEVBQ1gsSUFBWSxFQUNaLE1BQXlCLEVBQ3pCLGNBQXVCLEtBQUs7SUFFNUIsd0VBQXdFO0lBQ3hFLElBQUksYUFBYSxDQUFDLEVBQUUsQ0FBQyxFQUFFO1FBQ3JCLElBQUksR0FBRyxHQUFHLFFBQVEsQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUN2QixRQUFRLENBQUMsRUFBRSxFQUFFLEdBQUcsQ0FBQyxTQUFTLENBQUMsQ0FBQyxFQUFFLEtBQUssQ0FBQyxHQUFHLElBQUksR0FBRyxHQUFHLENBQUMsU0FBUyxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQztRQUM5RSxnQkFBZ0IsQ0FBQyxFQUFFLEVBQUUsS0FBSyxHQUFHLElBQUksQ0FBQyxNQUFNLEVBQUUsTUFBTSxDQUFDLENB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RyxHQUFnQixHQUFHLENBQUMsVUFBVSxDQUFDO1FBQ2xDLElBQUksQ0FBQyxHQUFHLElBQUksTUFBTSxFQUFFO1lBQ2xCLEdBQUcsR0FBRyxNQUFNLENBQUM7WUFDYixNQUFNLEdBQUcsSUFBSSxDQUFDO1NBQ2Y7S0FDRjtBQUNILENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBET00gZWxlbWVudCBtYW5pcHVsYXRpb24gZnVuY3Rpb25zLi4uXG4vL1xuXG5mdW5jdGlvbiBzZXRWYWx1ZShlbDogSFRNTElucHV0RWxlbWVudCwgdmFsdWU6IGFueSkge1xuICAvL2NvbnNvbGUubG9nKFwic2V0VmFsdWVcIiwgZWwubm9kZU5hbWUsIFwiW1wiK3ZhbHVlK1wiXVwiKTtcbiAgaWYgKGlzSW5wdXRPclRleHRBcmVhRWxlbWVudChlbCkpIHtcbiAgICBlbC52YWx1ZSA9IHZhbHVlO1xuICB9XG4gIGVsc2Uge1xuICAgIGVsLnRleHRDb250ZW50ID0gdmFsdWU7XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldFZhbHVlKGVsOiBIVE1MSW5wdXRFbGVtZW50KSB7XG4gIHJldHVybiBpc0lucHV0T3JUZXh0QXJlYUVsZW1lbnQoZWwpID8gZWwudmFsdWUgOiBlbC50ZXh0Q29udGVudDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGluc2VydFZhbHVlKFxuICBlbDogSFRNTElucHV0RWxlbWVudCxcbiAgc3RhcnQ6IG51bWJlcixcbiAgZW5kOiBudW1iZXIsXG4gIHRleHQ6IHN0cmluZyxcbiAgaWZyYW1lOiBIVE1MSUZyYW1lRWxlbWVudCxcbiAgbm9SZWN1cnNpb246IGJvb2xlYW4gPSBmYWxzZVxuKSB7XG4gIC8vY29uc29sZS5sb2coXCJpbnNlcnRWYWx1ZVwiLCBlbC5ub2RlTmFtZSwgc3RhcnQsIGVuZCwgXCJbXCIrdGV4dCtcIl1cIiwgZWwpO1xuICBpZiAoaXNUZXh0RWxlbWVudChlbCkpIHtcbiAgICBsZXQgdmFsID0gZ2V0VmFsdWUoZWwpO1xuICAgIHNldFZhbHVlKGVsLCB2YWwuc3Vic3RyaW5nKDAsIHN0YXJ0KSArIHRleHQgKyB2YWwuc3Vic3RyaW5nKGVuZCwgdmFsLmxlbmd0aCkpO1xuICAgIHNldENhcmV0UG9zaXRpb24oZWwsIHN0YXJ0ICsgdGV4dC5sZW5ndGgsIGlmcmFtZSk7XG4gIH1cbiAgZWxzZSBpZiAoIW5vUmVjdXJzaW9uKSB7XG4gICAgbGV0IHNlbE9iajogU2VsZWN0aW9uID0gZ2V0V2luZG93U2VsZWN0aW9uKGlmcmFtZSk7XG4gICAgaWYgKHNlbE9iaiAmJiBzZWxPYmoucmFuZ2VDb3VudCA+IDApIHtcbiAgICAgIHZhciBzZWxSYW5nZSA9IHNlbE9iai5nZXRSYW5nZUF0KDApO1xuICAgICAgdmFyIHBvc2l0aW9uID0gc2VsUmFuZ2Uuc3RhcnRPZmZzZXQ7XG4gICAgICB2YXIgYW5jaG9yTm9kZSA9IHNlbE9iai5hbmNob3JOb2RlO1xuICAgICAgLy8gaWYgKHRleHQuZW5kc1dpdGgoJyAnKSkge1xuICAgICAgLy8gICB0ZXh0ID0gdGV4dC5zdWJzdHJpbmcoMCwgdGV4dC5sZW5ndGgtMSkgKyAnXFx4QTAnO1xuICAgICAgLy8gfVxuICAgICAgaW5zZXJ0VmFsdWUoPEhUTUxJbnB1dEVsZW1lbnQ+YW5jaG9yTm9kZSwgcG9zaXRpb24gLSAoZW5kIC0gc3RhcnQpLCBwb3NpdGlvbiwgdGV4dCwgaWZyYW1lLCB0cnVlKTtcbiAgICB9XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzSW5wdXRPclRleHRBcmVhRWxlbWVudChlbDogSFRNTEVsZW1lbnQpOiBib29sZWFuIHtcbiAgcmV0dXJuIGVsICE9IG51bGwgJiYgKGVsLm5vZGVOYW1lID09ICdJTlBVVCcgfHwgZWwubm9kZU5hbWUgPT0gJ1RFWFRBUkVBJyk7XG59O1xuXG5leHBvcnQgZnVuY3Rpb24gaXNUZXh0RWxlbWVudChlbDogSFRNTEVsZW1lbnQpOiBib29sZWFuIHtcbiAgcmV0dXJuIGVsICE9IG51bGwgJiYgKGVsLm5vZGVOYW1lID09ICdJTlBVVCcgfHwgZWwubm9kZU5hbWUgPT0gJ1RFWFRBUkVBJyB8fCBlbC5ub2RlTmFtZSA9PSAnI3RleHQnKTtcbn07XG5cbmV4cG9ydCBmdW5jdGlvbiBzZXRDYXJldFBvc2l0aW9uKGVsOiBIVE1MSW5wdXRFbGVtZW50LCBwb3M6IG51bWJlciwgaWZyYW1lOiBIVE1MSUZyYW1lRWxlbWVudCA9IG51bGwpIHtcbiAgLy9jb25zb2xlLmxvZyhcInNldENhcmV0UG9zaXRpb25cIiwgcG9zLCBlbCwgaWZyYW1lPT1udWxsKTtcbiAgaWYgKGlzSW5wdXRPclRleHRBcmVhRWxlbWVudChlbCkgJiYgZWwuc2VsZWN0aW9uU3RhcnQpIHtcbiAgICBlbC5mb2N1cygpO1xuICAgIGVsLnNldFNlbGVjdGlvblJhbmdlKHBvcywgcG9zKTtcbiAgfVxuICBlbHNlIHtcbiAgICBsZXQgcmFuZ2UgPSBnZXREb2N1bWVudChpZnJhbWUpLmNyZWF0ZVJhbmdlKCk7XG4gICAgcmFuZ2Uuc2V0U3RhcnQoZWwsIHBvcyk7XG4gICAgcmFuZ2UuY29sbGFwc2UodHJ1ZSk7XG4gICAgbGV0IHNlbCA9IGdldFdpbmRvd1NlbGVjdGlvbihpZnJhbWUpO1xuICAgIHNlbC5yZW1vdmVBbGxSYW5nZXMoKTtcbiAgICBzZWwuYWRkUmFuZ2UocmFuZ2UpO1xuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRDYXJldFBvc2l0aW9uKGVsOiBIVE1MSW5wdXRFbGVtZW50LCBpZnJhbWU6IEhUTUxJRnJhbWVFbGVtZW50ID0gbnVsbCkge1xuICAvL2NvbnNvbGUubG9nKFwiZ2V0Q2FyZXRQb3NpdGlvblwiLCBlbCk7XG4gIGlmIChpc0lucHV0T3JUZXh0QXJlYUVsZW1lbnQoZWwpKSB7XG4gICAgdmFyIHZhbCA9IGVsLnZhbHVlO1xuICAgIHJldHVybiB2YWwuc2xpY2UoMCwgZWwuc2VsZWN0aW9uU3RhcnQpLmxlbmd0aDtcbiAgfVxuICBlbHNlIHtcbiAgICB2YXIgc2VsT2JqID0gZ2V0V2luZG93U2VsZWN0aW9uKGlmcmFtZSk7IC8vd2luZG93LmdldFNlbGVjdGlvbigpO1xuICAgIGlmIChzZWxPYmoucmFuZ2VDb3VudCA+IDApIHtcbiAgICAgIHZhciBzZWxSYW5nZSA9IHNlbE9iai5nZXRSYW5nZUF0KDApO1xuICAgICAgdmFyIHByZUNhcmV0UmFuZ2UgPSBzZWxSYW5nZS5jbG9uZVJhbmdlKCk7XG4gICAgICBwcmVDYXJldFJhbmdlLnNlbGVjdE5vZGVDb250ZW50cyhlbCk7XG4gICAgICBwcmVDYXJldFJhbmdlLnNldEVuZChzZWxSYW5nZS5lbmRDb250YWluZXIsIHNlbFJhbmdlLmVuZE9mZnNldCk7XG4gICAgICB2YXIgcG9zaXRpb24gPSBwcmVDYXJldFJhbmdlLnRvU3RyaW5nKCkubGVuZ3RoO1xuICAgICAgcmV0dXJuIHBvc2l0aW9uO1xuICAgIH1cbiAgfVxufVxuXG4vLyBCYXNlZCBvbiBtZW50LmlvIGZ1bmN0aW9ucy4uLlxuLy9cblxuZnVuY3Rpb24gZ2V0RG9jdW1lbnQoaWZyYW1lOiBIVE1MSUZyYW1lRWxlbWVudCkge1xuICBpZiAoIWlmcmFtZSkge1xuICAgIHJldHVybiBkb2N1bWVudDtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gaWZyYW1lLmNvbnRlbnRXaW5kb3cuZG9jdW1lbnQ7XG4gIH1cbn1cblxuZnVuY3Rpb24gZ2V0V2luZG93U2VsZWN0aW9uKGlmcmFtZTogSFRNTElGcmFtZUVsZW1lbnQpOiBTZWxlY3Rpb24ge1xuICBpZiAoIWlmcmFtZSkge1xuICAgIHJldHVybiB3aW5kb3cuZ2V0U2VsZWN0aW9uKCk7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIGlmcmFtZS5jb250ZW50V2luZG93LmdldFNlbGVjdGlvbigpO1xuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRDb250ZW50RWRpdGFibGVDYXJldENvb3JkcyhjdHg6IHsgaWZyYW1lOiBIVE1MSUZyYW1lRWxlbWVudCwgcGFyZW50PzogRWxlbWVudCB9KSB7XG4gIGxldCBtYXJrZXJUZXh0Q2hhciA9ICdcXHVmZWZmJztcbiAgbGV0IG1hcmtlcklkID0gJ3NlbF8nICsgbmV3IERhdGUoKS5nZXRUaW1lKCkgKyAnXycgKyBNYXRoLnJhbmRvbSgpLnRvU3RyaW5nKCkuc3Vic3RyKDIpO1xuICBsZXQgZG9jID0gZ2V0RG9jdW1lbnQoY3R4ID8gY3R4LmlmcmFtZSA6IG51bGwpO1xuICBsZXQgc2VsID0gZ2V0V2luZG93U2VsZWN0aW9uKGN0eCA/IGN0eC5pZnJhbWUgOiBudWxsKTtcbiAgbGV0IHByZXZSYW5nZSA9IHNlbC5nZXRSYW5nZUF0KDApO1xuXG4gIC8vIGNyZWF0ZSBuZXcgcmFuZ2UgYW5kIHNldCBwb3N0aW9uIHVzaW5nIHByZXZSYW5nZVxuICBsZXQgcmFuZ2UgPSBkb2MuY3JlYXRlUmFuZ2UoKTtcbiAgcmFuZ2Uuc2V0U3RhcnQoc2VsLmFuY2hvck5vZGUsIHByZXZSYW5nZS5zdGFydE9mZnNldCk7XG4gIHJhbmdlLnNldEVuZChzZWwuYW5jaG9yTm9kZSwgcHJldlJhbmdlLnN0YXJ0T2Zmc2V0KTtcbiAgcmFuZ2UuY29sbGFwc2UoZmFsc2UpO1xuXG4gIC8vIENyZWF0ZSB0aGUgbWFya2VyIGVsZW1lbnQgY29udGFpbmluZyBhIHNpbmdsZSBpbnZpc2libGUgY2hhcmFjdGVyXG4gIC8vIHVzaW5nIERPTSBtZXRob2RzIGFuZCBpbnNlcnQgaXQgYXQgdGhlIHBvc2l0aW9uIGluIHRoZSByYW5nZVxuICBsZXQgbWFya2VyRWwgPSBkb2MuY3JlYXRlRWxlbWVudCgnc3BhbicpO1xuICBtYXJrZXJFbC5pZCA9IG1hcmtlcklkO1xuICBtYXJrZXJFbC5hcHBlbmRDaGlsZChkb2MuY3JlYXRlVGV4dE5vZGUobWFya2VyVGV4dENoYXIpKTtcbiAgcmFuZ2UuaW5zZXJ0Tm9kZShtYXJrZXJFbCk7XG4gIHNlbC5yZW1vdmVBbGxSYW5nZXMoKTtcbiAgc2VsLmFkZFJhbmdlKHByZXZSYW5nZSk7XG5cbiAgbGV0IGNvb3JkaW5hdGVzID0ge1xuICAgIGxlZnQ6IDAsXG4gICAgdG9wOiBtYXJrZXJFbC5vZmZzZXRIZWlnaHRcbiAgfTtcblxuICBsb2NhbFRvUmVsYXRpdmVDb29yZGluYXRlcyhjdHgsIG1hcmtlckVsLCBjb29yZGluYXRlcyk7XG5cbiAgbWFya2VyRWwucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChtYXJrZXJFbCk7XG4gIHJldHVybiBjb29yZGluYXRlcztcbn1cblxuZnVuY3Rpb24gbG9jYWxUb1JlbGF0aXZlQ29vcmRpbmF0ZXMoXG4gIGN0eDogeyBpZnJhbWU6IEhUTUxJRnJhbWVFbGVtZW50LCBwYXJlbnQ/OiBFbGVtZW50IH0sXG4gIGVsZW1lbnQ6IEVsZW1lbnQsXG4gIGNvb3JkaW5hdGVzOiB7IHRvcDogbnVtYmVyOyBsZWZ0OiBudW1iZXIgfVxuKSB7XG4gIGxldCBvYmogPSA8SFRNTEVsZW1lbnQ+ZWxlbWVudDtcbiAgbGV0IGlmcmFtZSA9IGN0eCA/IGN0eC5pZnJhbWUgOiBudWxsO1xuICB3aGlsZSAob2JqKSB7XG4gICAgaWYgKGN0eC5wYXJlbnQgIT0gbnVsbCAmJiBjdHgucGFyZW50ID09IG9iaikge1xuICAgICAgYnJlYWs7XG4gICAgfVxuICAgIGNvb3JkaW5hdGVzLmxlZnQgKz0gb2JqLm9mZnNldExlZnQgKyBvYmouY2xpZW50TGVmdDtcbiAgICBjb29yZGluYXRlcy50b3AgKz0gb2JqLm9mZnNldFRvcCArIG9iai5jbGllbnRUb3A7XG4gICAgb2JqID0gPEhUTUxFbGVtZW50Pm9iai5vZmZzZXRQYXJlbnQ7XG4gICAgaWYgKCFvYmogJiYgaWZyYW1lKSB7XG4gICAgICBvYmogPSBpZnJhbWU7XG4gICAgICBpZnJhbWUgPSBudWxsO1xuICAgIH1cbiAgfVxuICBvYmogPSA8SFRNTEVsZW1lbnQ+ZWxlbWVudDtcbiAgaWZyYW1lID0gY3R4ID8gY3R4LmlmcmFtZSA6IG51bGw7XG4gIHdoaWxlIChvYmogIT09IGdldERvY3VtZW50KG51bGwpLmJvZHkgJiYgb2JqICE9IG51bGwpIHtcbiAgICBpZiAoY3R4LnBhcmVudCAhPSBudWxsICYmIGN0eC5wYXJlbnQgPT0gb2JqKSB7XG4gICAgICBicmVhaztcbiAgICB9XG4gICAgaWYgKG9iai5zY3JvbGxUb3AgJiYgb2JqLnNjcm9sbFRvcCA+IDApIHtcbiAgICAgIGNvb3JkaW5hdGVzLnRvcCAtPSBvYmouc2Nyb2xsVG9wO1xuICAgIH1cbiAgICBpZiAob2JqLnNjcm9sbExlZnQgJiYgb2JqLnNjcm9sbExlZnQgPiAwKSB7XG4gICAgICBjb29yZGluYXRlcy5sZWZ0IC09IG9iai5zY3JvbGxMZWZ0O1xuICAgIH1cbiAgICBvYmogPSA8SFRNTEVsZW1lbnQ+b2JqLnBhcmVudE5vZGU7XG4gICAgaWYgKCFvYmogJiYgaWZyYW1lKSB7XG4gICAgICBvYmogPSBpZnJhbWU7XG4gICAgICBpZnJhbWUgPSBudWxsO1xuICAgIH1cbiAgfVxufVxuIl19