ng-zorro-antd
Version:
An enterprise-class UI components based on Ant Design and Angular
311 lines • 29.4 kB
JavaScript
/**
* @fileoverview added by tsickle
* Generated from: text-measure.ts
* @suppress {checkTypes,constantProperty,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
/**
* @record
*/
export function MeasureResult() { }
if (false) {
/** @type {?} */
MeasureResult.prototype.finished;
/** @type {?} */
MeasureResult.prototype.node;
}
// We only handle element & text node.
/** @type {?} */
var ELEMENT_NODE = 1;
/** @type {?} */
var TEXT_NODE = 3;
/** @type {?} */
var COMMENT_NODE = 8;
/** @type {?} */
var ellipsisContainer;
/** @type {?} */
var wrapperStyle = {
padding: '0',
margin: '0',
display: 'inline',
lineHeight: 'inherit'
};
/**
* @param {?} value
* @return {?}
*/
export function pxToNumber(value) {
if (!value) {
return 0;
}
/** @type {?} */
var match = value.match(/^\d*(\.\d*)?/);
return match ? Number(match[0]) : 0;
}
/**
* @param {?} style
* @return {?}
*/
function styleToString(style) {
// There are some different behavior between Firefox & Chrome.
// We have to handle this ourself.
/** @type {?} */
var styleNames = Array.prototype.slice.apply(style);
return styleNames.map((/**
* @param {?} name
* @return {?}
*/
function (name) { return name + ": " + style.getPropertyValue(name) + ";"; })).join('');
}
/**
* @param {?} children
* @return {?}
*/
function mergeChildren(children) {
/** @type {?} */
var childList = [];
children.forEach((/**
* @param {?} child
* @return {?}
*/
function (child) {
/** @type {?} */
var prevChild = childList[childList.length - 1];
if (prevChild && child.nodeType === TEXT_NODE && prevChild.nodeType === TEXT_NODE) {
((/** @type {?} */ (prevChild))).data += ((/** @type {?} */ (child))).data;
}
else {
childList.push(child);
}
}));
return childList;
}
/**
* @param {?} originEle
* @param {?} rows
* @param {?} contentNodes
* @param {?} fixedContent
* @param {?} ellipsisStr
* @param {?=} suffixStr
* @return {?}
*/
export function measure(originEle, rows, contentNodes, fixedContent, ellipsisStr, suffixStr) {
if (suffixStr === void 0) { suffixStr = ''; }
if (!ellipsisContainer) {
ellipsisContainer = document.createElement('div');
ellipsisContainer.setAttribute('aria-hidden', 'true');
document.body.appendChild(ellipsisContainer);
}
// Get origin style
/** @type {?} */
var originStyle = window.getComputedStyle(originEle);
/** @type {?} */
var originCSS = styleToString(originStyle);
/** @type {?} */
var lineHeight = pxToNumber(originStyle.lineHeight);
/** @type {?} */
var maxHeight = Math.round(lineHeight * (rows + 1) + pxToNumber(originStyle.paddingTop) + pxToNumber(originStyle.paddingBottom));
// Set shadow
ellipsisContainer.setAttribute('style', originCSS);
ellipsisContainer.style.position = 'fixed';
ellipsisContainer.style.left = '0';
ellipsisContainer.style.height = 'auto';
ellipsisContainer.style.minHeight = 'auto';
ellipsisContainer.style.maxHeight = 'auto';
ellipsisContainer.style.top = '-999999px';
ellipsisContainer.style.zIndex = '-1000';
// clean up css overflow
ellipsisContainer.style.textOverflow = 'clip';
ellipsisContainer.style.whiteSpace = 'normal';
((/** @type {?} */ (ellipsisContainer.style))).webkitLineClamp = 'none';
/** @type {?} */
var contentList = mergeChildren(contentNodes);
/** @type {?} */
var container = document.createElement('div');
/** @type {?} */
var contentContainer = document.createElement('span');
/** @type {?} */
var suffixContainer = document.createTextNode(suffixStr);
/** @type {?} */
var fixedContainer = document.createElement('span');
// Add styles in container
Object.assign(container.style, wrapperStyle);
Object.assign(contentContainer.style, wrapperStyle);
Object.assign(fixedContainer.style, wrapperStyle);
contentList.forEach((/**
* @param {?} n
* @return {?}
*/
function (n) {
contentContainer.appendChild(n);
}));
contentContainer.appendChild(suffixContainer);
fixedContent.forEach((/**
* @param {?} node
* @return {?}
*/
function (node) {
fixedContainer.appendChild(node.cloneNode(true));
}));
container.appendChild(contentContainer);
container.appendChild(fixedContainer);
// Render in the fake container
ellipsisContainer.appendChild(container);
// Check if ellipsis in measure div is height enough for content
/**
* @return {?}
*/
function inRange() {
return ellipsisContainer.offsetHeight < maxHeight;
}
if (inRange()) {
/** @type {?} */
var text = ellipsisContainer.innerHTML;
ellipsisContainer.removeChild(container);
return { contentNodes: contentNodes, text: text, ellipsis: false };
}
// We should clone the childNode since they're controlled by React and we can't reuse it without warning
/** @type {?} */
var childNodes = Array.prototype.slice
.apply(ellipsisContainer.childNodes[0].childNodes[0].cloneNode(true).childNodes)
.filter((/**
* @param {?} __0
* @return {?}
*/
function (_a) {
var nodeType = _a.nodeType;
return nodeType !== COMMENT_NODE;
}));
/** @type {?} */
var fixedNodes = Array.prototype.slice.apply(ellipsisContainer.childNodes[0].childNodes[1].cloneNode(true).childNodes);
ellipsisContainer.removeChild(container);
// ========================= Find match ellipsis content =========================
ellipsisContainer.innerHTML = '';
// Create origin content holder
/** @type {?} */
var ellipsisContentHolder = document.createElement('span');
ellipsisContainer.appendChild(ellipsisContentHolder);
/** @type {?} */
var ellipsisTextNode = document.createTextNode(ellipsisStr + suffixStr);
ellipsisContentHolder.appendChild(ellipsisTextNode);
fixedNodes.forEach((/**
* @param {?} childNode
* @return {?}
*/
function (childNode) {
ellipsisContainer.appendChild(childNode);
}));
// Append before fixed nodes
/**
* @param {?} node
* @return {?}
*/
function appendChildNode(node) {
ellipsisContentHolder.insertBefore(node, ellipsisTextNode);
}
// Get maximum text
/**
* @param {?} textNode
* @param {?} fullText
* @param {?=} startLoc
* @param {?=} endLoc
* @param {?=} lastSuccessLoc
* @return {?}
*/
function measureText(textNode, fullText, startLoc, endLoc, lastSuccessLoc) {
if (startLoc === void 0) { startLoc = 0; }
if (endLoc === void 0) { endLoc = fullText.length; }
if (lastSuccessLoc === void 0) { lastSuccessLoc = 0; }
/** @type {?} */
var midLoc = Math.floor((startLoc + endLoc) / 2);
textNode.textContent = fullText.slice(0, midLoc);
if (startLoc >= endLoc - 1) {
// Loop when step is small
for (var step = endLoc; step >= startLoc; step -= 1) {
/** @type {?} */
var currentStepText = fullText.slice(0, step);
textNode.textContent = currentStepText;
if (inRange() || !currentStepText) {
return step === fullText.length
? {
finished: false,
node: document.createTextNode(fullText)
}
: {
finished: true,
node: document.createTextNode(currentStepText)
};
}
}
}
if (inRange()) {
return measureText(textNode, fullText, midLoc, endLoc, midLoc);
}
else {
return measureText(textNode, fullText, startLoc, midLoc, lastSuccessLoc);
}
}
/**
* @param {?} childNode
* @param {?} index
* @return {?}
*/
function measureNode(childNode, index) {
/** @type {?} */
var type = childNode.nodeType;
if (type === ELEMENT_NODE) {
// We don't split element, it will keep if whole element can be displayed.
// appendChildNode(childNode);
if (inRange()) {
return {
finished: false,
node: contentList[index]
};
}
// Clean up if can not pull in
ellipsisContentHolder.removeChild(childNode);
return {
finished: true,
node: null
};
}
else if (type === TEXT_NODE) {
/** @type {?} */
var fullText = childNode.textContent || '';
/** @type {?} */
var textNode = document.createTextNode(fullText);
appendChildNode(textNode);
return measureText(textNode, fullText);
}
// Not handle other type of content
// PS: This code should not be attached after react 16
return {
finished: false,
node: null
};
}
/** @type {?} */
var ellipsisNodes = [];
childNodes.some((/**
* @param {?} childNode
* @param {?} index
* @return {?}
*/
function (childNode, index) {
var _a = measureNode(childNode, index), finished = _a.finished, node = _a.node;
if (node) {
ellipsisNodes.push(node);
}
return finished;
}));
/** @type {?} */
var result = {
contentNodes: ellipsisNodes,
text: ellipsisContainer.innerHTML,
ellipsis: true
};
while (ellipsisContainer.firstChild) {
ellipsisContainer.removeChild(ellipsisContainer.firstChild);
}
return result;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGV4dC1tZWFzdXJlLmpzIiwic291cmNlUm9vdCI6Im5nOi8vbmctem9ycm8tYW50ZC9jb3JlL3V0aWwvIiwic291cmNlcyI6WyJ0ZXh0LW1lYXN1cmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7QUFTQSxtQ0FHQzs7O0lBRkMsaUNBQWtCOztJQUNsQiw2QkFBa0I7Ozs7SUFJZCxZQUFZLEdBQUcsQ0FBQzs7SUFDaEIsU0FBUyxHQUFHLENBQUM7O0lBQ2IsWUFBWSxHQUFHLENBQUM7O0lBRWxCLGlCQUF1Qzs7SUFFckMsWUFBWSxHQUFHO0lBQ25CLE9BQU8sRUFBRSxHQUFHO0lBQ1osTUFBTSxFQUFFLEdBQUc7SUFDWCxPQUFPLEVBQUUsUUFBUTtJQUNqQixVQUFVLEVBQUUsU0FBUztDQUN0Qjs7Ozs7QUFFRCxNQUFNLFVBQVUsVUFBVSxDQUFDLEtBQW9CO0lBQzdDLElBQUksQ0FBQyxLQUFLLEVBQUU7UUFDVixPQUFPLENBQUMsQ0FBQztLQUNWOztRQUVLLEtBQUssR0FBRyxLQUFLLENBQUMsS0FBSyxDQUFDLGNBQWMsQ0FBQztJQUV6QyxPQUFPLEtBQUssQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDdEMsQ0FBQzs7Ozs7QUFFRCxTQUFTLGFBQWEsQ0FBQyxLQUEwQjs7OztRQUd6QyxVQUFVLEdBQWEsS0FBSyxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQztJQUMvRCxPQUFPLFVBQVUsQ0FBQyxHQUFHOzs7O0lBQUMsVUFBQSxJQUFJLElBQUksT0FBRyxJQUFJLFVBQUssS0FBSyxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxNQUFHLEVBQTNDLENBQTJDLEVBQUMsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7QUFDdEYsQ0FBQzs7Ozs7QUFFRCxTQUFTLGFBQWEsQ0FBQyxRQUFnQjs7UUFDL0IsU0FBUyxHQUFXLEVBQUU7SUFFNUIsUUFBUSxDQUFDLE9BQU87Ozs7SUFBQyxVQUFDLEtBQVc7O1lBQ3JCLFNBQVMsR0FBRyxTQUFTLENBQUMsU0FBUyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUM7UUFDakQsSUFBSSxTQUFTLElBQUksS0FBSyxDQUFDLFFBQVEsS0FBSyxTQUFTLElBQUksU0FBUyxDQUFDLFFBQVEsS0FBSyxTQUFTLEVBQUU7WUFDakYsQ0FBQyxtQkFBQSxTQUFTLEVBQVEsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLG1CQUFBLEtBQUssRUFBUSxDQUFDLENBQUMsSUFBSSxDQUFDO1NBQ2xEO2FBQU07WUFDTCxTQUFTLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1NBQ3ZCO0lBQ0gsQ0FBQyxFQUFDLENBQUM7SUFFSCxPQUFPLFNBQVMsQ0FBQztBQUNuQixDQUFDOzs7Ozs7Ozs7O0FBRUQsTUFBTSxVQUFVLE9BQU8sQ0FDckIsU0FBc0IsRUFDdEIsSUFBWSxFQUNaLFlBQW9CLEVBQ3BCLFlBQTJCLEVBQzNCLFdBQW1CLEVBQ25CLFNBQXNCO0lBQXRCLDBCQUFBLEVBQUEsY0FBc0I7SUFFdEIsSUFBSSxDQUFDLGlCQUFpQixFQUFFO1FBQ3RCLGlCQUFpQixHQUFHLFFBQVEsQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDbEQsaUJBQWlCLENBQUMsWUFBWSxDQUFDLGFBQWEsRUFBRSxNQUFNLENBQUMsQ0FBQztRQUN0RCxRQUFRLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO0tBQzlDOzs7UUFHSyxXQUFXLEdBQUcsTUFBTSxDQUFDLGdCQUFnQixDQUFDLFNBQVMsQ0FBQzs7UUFDaEQsU0FBUyxHQUFHLGFBQWEsQ0FBQyxXQUFXLENBQUM7O1FBQ3RDLFVBQVUsR0FBRyxVQUFVLENBQUMsV0FBVyxDQUFDLFVBQVUsQ0FBQzs7UUFDL0MsU0FBUyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsVUFBVSxHQUFHLENBQUMsSUFBSSxHQUFHLENBQUMsQ0FBQyxHQUFHLFVBQVUsQ0FBQyxXQUFXLENBQUMsVUFBVSxDQUFDLEdBQUcsVUFBVSxDQUFDLFdBQVcsQ0FBQyxhQUFhLENBQUMsQ0FBQztJQUNsSSxhQUFhO0lBQ2IsaUJBQWlCLENBQUMsWUFBWSxDQUFDLE9BQU8sRUFBRSxTQUFTLENBQUMsQ0FBQztJQUNuRCxpQkFBaUIsQ0FBQyxLQUFLLENBQUMsUUFBUSxHQUFHLE9BQU8sQ0FBQztJQUMzQyxpQkFBaUIsQ0FBQyxLQUFLLENBQUMsSUFBSSxHQUFHLEdBQUcsQ0FBQztJQUNuQyxpQkFBaUIsQ0FBQyxLQUFLLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQztJQUN4QyxpQkFBaUIsQ0FBQyxLQUFLLENBQUMsU0FBUyxHQUFHLE1BQU0sQ0FBQztJQUMzQyxpQkFBaUIsQ0FBQyxLQUFLLENBQUMsU0FBUyxHQUFHLE1BQU0sQ0FBQztJQUMzQyxpQkFBaUIsQ0FBQyxLQUFLLENBQUMsR0FBRyxHQUFHLFdBQVcsQ0FBQztJQUMxQyxpQkFBaUIsQ0FBQyxLQUFLLENBQUMsTUFBTSxHQUFHLE9BQU8sQ0FBQztJQUV6Qyx3QkFBd0I7SUFDeEIsaUJBQWlCLENBQUMsS0FBSyxDQUFDLFlBQVksR0FBRyxNQUFNLENBQUM7SUFDOUMsaUJBQWlCLENBQUMsS0FBSyxDQUFDLFVBQVUsR0FBRyxRQUFRLENBQUM7SUFDOUMsQ0FBQyxtQkFBQSxpQkFBaUIsQ0FBQyxLQUFLLEVBQWEsQ0FBQyxDQUFDLGVBQWUsR0FBRyxNQUFNLENBQUM7O1FBRTFELFdBQVcsR0FBRyxhQUFhLENBQUMsWUFBWSxDQUFDOztRQUN6QyxTQUFTLEdBQUcsUUFBUSxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUM7O1FBQ3pDLGdCQUFnQixHQUFHLFFBQVEsQ0FBQyxhQUFhLENBQUMsTUFBTSxDQUFDOztRQUNqRCxlQUFlLEdBQUcsUUFBUSxDQUFDLGNBQWMsQ0FBQyxTQUFTLENBQUM7O1FBQ3BELGNBQWMsR0FBRyxRQUFRLENBQUMsYUFBYSxDQUFDLE1BQU0sQ0FBQztJQUVyRCwwQkFBMEI7SUFDMUIsTUFBTSxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsS0FBSyxFQUFFLFlBQVksQ0FBQyxDQUFDO0lBQzdDLE1BQU0sQ0FBQyxNQUFNLENBQUMsZ0JBQWdCLENBQUMsS0FBSyxFQUFFLFlBQVksQ0FBQyxDQUFDO0lBQ3BELE1BQU0sQ0FBQyxNQUFNLENBQUMsY0FBYyxDQUFDLEtBQUssRUFBRSxZQUFZLENBQUMsQ0FBQztJQUVsRCxXQUFXLENBQUMsT0FBTzs7OztJQUFDLFVBQUEsQ0FBQztRQUNuQixnQkFBZ0IsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDbEMsQ0FBQyxFQUFDLENBQUM7SUFFSCxnQkFBZ0IsQ0FBQyxXQUFXLENBQUMsZUFBZSxDQUFDLENBQUM7SUFFOUMsWUFBWSxDQUFDLE9BQU87Ozs7SUFBQyxVQUFBLElBQUk7UUFDdkIsY0FBYyxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7SUFDbkQsQ0FBQyxFQUFDLENBQUM7SUFDSCxTQUFTLENBQUMsV0FBVyxDQUFDLGdCQUFnQixDQUFDLENBQUM7SUFDeEMsU0FBUyxDQUFDLFdBQVcsQ0FBQyxjQUFjLENBQUMsQ0FBQztJQUV0QywrQkFBK0I7SUFDL0IsaUJBQWlCLENBQUMsV0FBVyxDQUFDLFNBQVMsQ0FBQyxDQUFDOzs7OztJQUd6QyxTQUFTLE9BQU87UUFDZCxPQUFPLGlCQUFpQixDQUFDLFlBQVksR0FBRyxTQUFTLENBQUM7SUFDcEQsQ0FBQztJQUVELElBQUksT0FBTyxFQUFFLEVBQUU7O1lBQ1AsSUFBSSxHQUFHLGlCQUFpQixDQUFDLFNBQVM7UUFDeEMsaUJBQWlCLENBQUMsV0FBVyxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQ3pDLE9BQU8sRUFBRSxZQUFZLGNBQUEsRUFBRSxJQUFJLE1BQUEsRUFBRSxRQUFRLEVBQUUsS0FBSyxFQUFFLENBQUM7S0FDaEQ7OztRQUdLLFVBQVUsR0FBZ0IsS0FBSyxDQUFDLFNBQVMsQ0FBQyxLQUFLO1NBQ2xELEtBQUssQ0FBQyxpQkFBaUIsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxVQUFVLENBQUM7U0FDL0UsTUFBTTs7OztJQUFDLFVBQUMsRUFBdUI7WUFBckIsc0JBQVE7UUFBa0IsT0FBQSxRQUFRLEtBQUssWUFBWTtJQUF6QixDQUF5QixFQUFDOztRQUMzRCxVQUFVLEdBQWdCLEtBQUssQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxpQkFBaUIsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxVQUFVLENBQUM7SUFDckksaUJBQWlCLENBQUMsV0FBVyxDQUFDLFNBQVMsQ0FBQyxDQUFDO0lBRXpDLGtGQUFrRjtJQUNsRixpQkFBaUIsQ0FBQyxTQUFTLEdBQUcsRUFBRSxDQUFDOzs7UUFHM0IscUJBQXFCLEdBQUcsUUFBUSxDQUFDLGFBQWEsQ0FBQyxNQUFNLENBQUM7SUFDNUQsaUJBQWlCLENBQUMsV0FBVyxDQUFDLHFCQUFxQixDQUFDLENBQUM7O1FBQy9DLGdCQUFnQixHQUFHLFFBQVEsQ0FBQyxjQUFjLENBQUMsV0FBVyxHQUFHLFNBQVMsQ0FBQztJQUN6RSxxQkFBcUIsQ0FBQyxXQUFXLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztJQUVwRCxVQUFVLENBQUMsT0FBTzs7OztJQUFDLFVBQUEsU0FBUztRQUMxQixpQkFBaUIsQ0FBQyxXQUFXLENBQUMsU0FBUyxDQUFDLENBQUM7SUFDM0MsQ0FBQyxFQUFDLENBQUM7Ozs7OztJQUdILFNBQVMsZUFBZSxDQUFDLElBQWU7UUFDdEMscUJBQXFCLENBQUMsWUFBWSxDQUFDLElBQUksRUFBRSxnQkFBZ0IsQ0FBQyxDQUFDO0lBQzdELENBQUM7Ozs7Ozs7Ozs7SUFHRCxTQUFTLFdBQVcsQ0FDbEIsUUFBYyxFQUNkLFFBQWdCLEVBQ2hCLFFBQW9CLEVBQ3BCLE1BQWdDLEVBQ2hDLGNBQTBCO1FBRjFCLHlCQUFBLEVBQUEsWUFBb0I7UUFDcEIsdUJBQUEsRUFBQSxTQUFpQixRQUFRLENBQUMsTUFBTTtRQUNoQywrQkFBQSxFQUFBLGtCQUEwQjs7WUFFcEIsTUFBTSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxRQUFRLEdBQUcsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ2xELFFBQVEsQ0FBQyxXQUFXLEdBQUcsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsTUFBTSxDQUFDLENBQUM7UUFFakQsSUFBSSxRQUFRLElBQUksTUFBTSxHQUFHLENBQUMsRUFBRTtZQUMxQiwwQkFBMEI7WUFDMUIsS0FBSyxJQUFJLElBQUksR0FBRyxNQUFNLEVBQUUsSUFBSSxJQUFJLFFBQVEsRUFBRSxJQUFJLElBQUksQ0FBQyxFQUFFOztvQkFDN0MsZUFBZSxHQUFHLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQztnQkFDL0MsUUFBUSxDQUFDLFdBQVcsR0FBRyxlQUFlLENBQUM7Z0JBRXZDLElBQUksT0FBTyxFQUFFLElBQUksQ0FBQyxlQUFlLEVBQUU7b0JBQ2pDLE9BQU8sSUFBSSxLQUFLLFFBQVEsQ0FBQyxNQUFNO3dCQUM3QixDQUFDLENBQUM7NEJBQ0UsUUFBUSxFQUFFLEtBQUs7NEJBQ2YsSUFBSSxFQUFFLFFBQVEsQ0FBQyxjQUFjLENBQUMsUUFBUSxDQUFDO3lCQUN4Qzt3QkFDSCxDQUFDLENBQUM7NEJBQ0UsUUFBUSxFQUFFLElBQUk7NEJBQ2QsSUFBSSxFQUFFLFFBQVEsQ0FBQyxjQUFjLENBQUMsZUFBZSxDQUFDO3lCQUMvQyxDQUFDO2lCQUNQO2FBQ0Y7U0FDRjtRQUNELElBQUksT0FBTyxFQUFFLEVBQUU7WUFDYixPQUFPLFdBQVcsQ0FBQyxRQUFRLEVBQUUsUUFBUSxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsTUFBTSxDQUFDLENBQUM7U0FDaEU7YUFBTTtZQUNMLE9BQU8sV0FBVyxDQUFDLFFBQVEsRUFBRSxRQUFRLEVBQUUsUUFBUSxFQUFFLE1BQU0sRUFBRSxjQUFjLENBQUMsQ0FBQztTQUMxRTtJQUNILENBQUM7Ozs7OztJQUVELFNBQVMsV0FBVyxDQUFDLFNBQW9CLEVBQUUsS0FBYTs7WUFDaEQsSUFBSSxHQUFHLFNBQVMsQ0FBQyxRQUFRO1FBRS9CLElBQUksSUFBSSxLQUFLLFlBQVksRUFBRTtZQUN6QiwwRUFBMEU7WUFDMUUsOEJBQThCO1lBQzlCLElBQUksT0FBTyxFQUFFLEVBQUU7Z0JBQ2IsT0FBTztvQkFDTCxRQUFRLEVBQUUsS0FBSztvQkFDZixJQUFJLEVBQUUsV0FBVyxDQUFDLEtBQUssQ0FBQztpQkFDekIsQ0FBQzthQUNIO1lBRUQsOEJBQThCO1lBQzlCLHFCQUFxQixDQUFDLFdBQVcsQ0FBQyxTQUFTLENBQUMsQ0FBQztZQUM3QyxPQUFPO2dCQUNMLFFBQVEsRUFBRSxJQUFJO2dCQUNkLElBQUksRUFBRSxJQUFJO2FBQ1gsQ0FBQztTQUNIO2FBQU0sSUFBSSxJQUFJLEtBQUssU0FBUyxFQUFFOztnQkFDdkIsUUFBUSxHQUFHLFNBQVMsQ0FBQyxXQUFXLElBQUksRUFBRTs7Z0JBQ3RDLFFBQVEsR0FBRyxRQUFRLENBQUMsY0FBYyxDQUFDLFFBQVEsQ0FBQztZQUNsRCxlQUFlLENBQUMsUUFBUSxDQUFDLENBQUM7WUFDMUIsT0FBTyxXQUFXLENBQUMsUUFBUSxFQUFFLFFBQVEsQ0FBQyxDQUFDO1NBQ3hDO1FBRUQsbUNBQW1DO1FBQ25DLHNEQUFzRDtRQUN0RCxPQUFPO1lBQ0wsUUFBUSxFQUFFLEtBQUs7WUFDZixJQUFJLEVBQUUsSUFBSTtTQUNYLENBQUM7SUFDSixDQUFDOztRQUVLLGFBQWEsR0FBVyxFQUFFO0lBQ2hDLFVBQVUsQ0FBQyxJQUFJOzs7OztJQUFDLFVBQUMsU0FBUyxFQUFFLEtBQUs7UUFDekIsSUFBQSxrQ0FBa0QsRUFBaEQsc0JBQVEsRUFBRSxjQUFzQztRQUN4RCxJQUFJLElBQUksRUFBRTtZQUNSLGFBQWEsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7U0FDMUI7UUFDRCxPQUFPLFFBQVEsQ0FBQztJQUNsQixDQUFDLEVBQUMsQ0FBQzs7UUFDRyxNQUFNLEdBQUc7UUFDYixZQUFZLEVBQUUsYUFBYTtRQUMzQixJQUFJLEVBQUUsaUJBQWlCLENBQUMsU0FBUztRQUNqQyxRQUFRLEVBQUUsSUFBSTtLQUNmO0lBQ0QsT0FBTyxpQkFBaUIsQ0FBQyxVQUFVLEVBQUU7UUFDbkMsaUJBQWlCLENBQUMsV0FBVyxDQUFDLGlCQUFpQixDQUFDLFVBQVUsQ0FBQyxDQUFDO0tBQzdEO0lBQ0QsT0FBTyxNQUFNLENBQUM7QUFDaEIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCBBbGliYWJhLmNvbSBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICpcbiAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlXG4gKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vZ2l0aHViLmNvbS9ORy1aT1JSTy9uZy16b3Jyby1hbnRkL2Jsb2IvbWFzdGVyL0xJQ0VOU0VcbiAqL1xuaW1wb3J0IHsgTnpTYWZlQW55IH0gZnJvbSAnbmctem9ycm8tYW50ZC9jb3JlL3R5cGVzJztcblxuZXhwb3J0IGludGVyZmFjZSBNZWFzdXJlUmVzdWx0IHtcbiAgZmluaXNoZWQ6IGJvb2xlYW47XG4gIG5vZGU6IE5vZGUgfCBudWxsO1xufVxuXG4vLyBXZSBvbmx5IGhhbmRsZSBlbGVtZW50ICYgdGV4dCBub2RlLlxuY29uc3QgRUxFTUVOVF9OT0RFID0gMTtcbmNvbnN0IFRFWFRfTk9ERSA9IDM7XG5jb25zdCBDT01NRU5UX05PREUgPSA4O1xuXG5sZXQgZWxsaXBzaXNDb250YWluZXI6IEhUTUxQYXJhZ3JhcGhFbGVtZW50O1xuXG5jb25zdCB3cmFwcGVyU3R5bGUgPSB7XG4gIHBhZGRpbmc6ICcwJyxcbiAgbWFyZ2luOiAnMCcsXG4gIGRpc3BsYXk6ICdpbmxpbmUnLFxuICBsaW5lSGVpZ2h0OiAnaW5oZXJpdCdcbn07XG5cbmV4cG9ydCBmdW5jdGlvbiBweFRvTnVtYmVyKHZhbHVlOiBzdHJpbmcgfCBudWxsKTogbnVtYmVyIHtcbiAgaWYgKCF2YWx1ZSkge1xuICAgIHJldHVybiAwO1xuICB9XG5cbiAgY29uc3QgbWF0Y2ggPSB2YWx1ZS5tYXRjaCgvXlxcZCooXFwuXFxkKik/Lyk7XG5cbiAgcmV0dXJuIG1hdGNoID8gTnVtYmVyKG1hdGNoWzBdKSA6IDA7XG59XG5cbmZ1bmN0aW9uIHN0eWxlVG9TdHJpbmcoc3R5bGU6IENTU1N0eWxlRGVjbGFyYXRpb24pOiBzdHJpbmcge1xuICAvLyBUaGVyZSBhcmUgc29tZSBkaWZmZXJlbnQgYmVoYXZpb3IgYmV0d2VlbiBGaXJlZm94ICYgQ2hyb21lLlxuICAvLyBXZSBoYXZlIHRvIGhhbmRsZSB0aGlzIG91cnNlbGYuXG4gIGNvbnN0IHN0eWxlTmFtZXM6IHN0cmluZ1tdID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmFwcGx5KHN0eWxlKTtcbiAgcmV0dXJuIHN0eWxlTmFtZXMubWFwKG5hbWUgPT4gYCR7bmFtZX06ICR7c3R5bGUuZ2V0UHJvcGVydHlWYWx1ZShuYW1lKX07YCkuam9pbignJyk7XG59XG5cbmZ1bmN0aW9uIG1lcmdlQ2hpbGRyZW4oY2hpbGRyZW46IE5vZGVbXSk6IE5vZGVbXSB7XG4gIGNvbnN0IGNoaWxkTGlzdDogTm9kZVtdID0gW107XG5cbiAgY2hpbGRyZW4uZm9yRWFjaCgoY2hpbGQ6IE5vZGUpID0+IHtcbiAgICBjb25zdCBwcmV2Q2hpbGQgPSBjaGlsZExpc3RbY2hpbGRMaXN0Lmxlbmd0aCAtIDFdO1xuICAgIGlmIChwcmV2Q2hpbGQgJiYgY2hpbGQubm9kZVR5cGUgPT09IFRFWFRfTk9ERSAmJiBwcmV2Q2hpbGQubm9kZVR5cGUgPT09IFRFWFRfTk9ERSkge1xuICAgICAgKHByZXZDaGlsZCBhcyBUZXh0KS5kYXRhICs9IChjaGlsZCBhcyBUZXh0KS5kYXRhO1xuICAgIH0gZWxzZSB7XG4gICAgICBjaGlsZExpc3QucHVzaChjaGlsZCk7XG4gICAgfVxuICB9KTtcblxuICByZXR1cm4gY2hpbGRMaXN0O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gbWVhc3VyZShcbiAgb3JpZ2luRWxlOiBIVE1MRWxlbWVudCxcbiAgcm93czogbnVtYmVyLFxuICBjb250ZW50Tm9kZXM6IE5vZGVbXSxcbiAgZml4ZWRDb250ZW50OiBIVE1MRWxlbWVudFtdLFxuICBlbGxpcHNpc1N0cjogc3RyaW5nLFxuICBzdWZmaXhTdHI6IHN0cmluZyA9ICcnXG4pOiB7IGNvbnRlbnROb2RlczogTm9kZVtdOyB0ZXh0OiBzdHJpbmc7IGVsbGlwc2lzOiBib29sZWFuIH0ge1xuICBpZiAoIWVsbGlwc2lzQ29udGFpbmVyKSB7XG4gICAgZWxsaXBzaXNDb250YWluZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICBlbGxpcHNpc0NvbnRhaW5lci5zZXRBdHRyaWJ1dGUoJ2FyaWEtaGlkZGVuJywgJ3RydWUnKTtcbiAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGVsbGlwc2lzQ29udGFpbmVyKTtcbiAgfVxuXG4gIC8vIEdldCBvcmlnaW4gc3R5bGVcbiAgY29uc3Qgb3JpZ2luU3R5bGUgPSB3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShvcmlnaW5FbGUpO1xuICBjb25zdCBvcmlnaW5DU1MgPSBzdHlsZVRvU3RyaW5nKG9yaWdpblN0eWxlKTtcbiAgY29uc3QgbGluZUhlaWdodCA9IHB4VG9OdW1iZXIob3JpZ2luU3R5bGUubGluZUhlaWdodCk7XG4gIGNvbnN0IG1heEhlaWdodCA9IE1hdGgucm91bmQobGluZUhlaWdodCAqIChyb3dzICsgMSkgKyBweFRvTnVtYmVyKG9yaWdpblN0eWxlLnBhZGRpbmdUb3ApICsgcHhUb051bWJlcihvcmlnaW5TdHlsZS5wYWRkaW5nQm90dG9tKSk7XG4gIC8vIFNldCBzaGFkb3dcbiAgZWxsaXBzaXNDb250YWluZXIuc2V0QXR0cmlidXRlKCdzdHlsZScsIG9yaWdpbkNTUyk7XG4gIGVsbGlwc2lzQ29udGFpbmVyLnN0eWxlLnBvc2l0aW9uID0gJ2ZpeGVkJztcbiAgZWxsaXBzaXNDb250YWluZXIuc3R5bGUubGVmdCA9ICcwJztcbiAgZWxsaXBzaXNDb250YWluZXIuc3R5bGUuaGVpZ2h0ID0gJ2F1dG8nO1xuICBlbGxpcHNpc0NvbnRhaW5lci5zdHlsZS5taW5IZWlnaHQgPSAnYXV0byc7XG4gIGVsbGlwc2lzQ29udGFpbmVyLnN0eWxlLm1heEhlaWdodCA9ICdhdXRvJztcbiAgZWxsaXBzaXNDb250YWluZXIuc3R5bGUudG9wID0gJy05OTk5OTlweCc7XG4gIGVsbGlwc2lzQ29udGFpbmVyLnN0eWxlLnpJbmRleCA9ICctMTAwMCc7XG5cbiAgLy8gY2xlYW4gdXAgY3NzIG92ZXJmbG93XG4gIGVsbGlwc2lzQ29udGFpbmVyLnN0eWxlLnRleHRPdmVyZmxvdyA9ICdjbGlwJztcbiAgZWxsaXBzaXNDb250YWluZXIuc3R5bGUud2hpdGVTcGFjZSA9ICdub3JtYWwnO1xuICAoZWxsaXBzaXNDb250YWluZXIuc3R5bGUgYXMgTnpTYWZlQW55KS53ZWJraXRMaW5lQ2xhbXAgPSAnbm9uZSc7XG5cbiAgY29uc3QgY29udGVudExpc3QgPSBtZXJnZUNoaWxkcmVuKGNvbnRlbnROb2Rlcyk7XG4gIGNvbnN0IGNvbnRhaW5lciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICBjb25zdCBjb250ZW50Q29udGFpbmVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3BhbicpO1xuICBjb25zdCBzdWZmaXhDb250YWluZXIgPSBkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShzdWZmaXhTdHIpO1xuICBjb25zdCBmaXhlZENvbnRhaW5lciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NwYW4nKTtcblxuICAvLyBBZGQgc3R5bGVzIGluIGNvbnRhaW5lclxuICBPYmplY3QuYXNzaWduKGNvbnRhaW5lci5zdHlsZSwgd3JhcHBlclN0eWxlKTtcbiAgT2JqZWN0LmFzc2lnbihjb250ZW50Q29udGFpbmVyLnN0eWxlLCB3cmFwcGVyU3R5bGUpO1xuICBPYmplY3QuYXNzaWduKGZpeGVkQ29udGFpbmVyLnN0eWxlLCB3cmFwcGVyU3R5bGUpO1xuXG4gIGNvbnRlbnRMaXN0LmZvckVhY2gobiA9PiB7XG4gICAgY29udGVudENvbnRhaW5lci5hcHBlbmRDaGlsZChuKTtcbiAgfSk7XG5cbiAgY29udGVudENvbnRhaW5lci5hcHBlbmRDaGlsZChzdWZmaXhDb250YWluZXIpO1xuXG4gIGZpeGVkQ29udGVudC5mb3JFYWNoKG5vZGUgPT4ge1xuICAgIGZpeGVkQ29udGFpbmVyLmFwcGVuZENoaWxkKG5vZGUuY2xvbmVOb2RlKHRydWUpKTtcbiAgfSk7XG4gIGNvbnRhaW5lci5hcHBlbmRDaGlsZChjb250ZW50Q29udGFpbmVyKTtcbiAgY29udGFpbmVyLmFwcGVuZENoaWxkKGZpeGVkQ29udGFpbmVyKTtcblxuICAvLyBSZW5kZXIgaW4gdGhlIGZha2UgY29udGFpbmVyXG4gIGVsbGlwc2lzQ29udGFpbmVyLmFwcGVuZENoaWxkKGNvbnRhaW5lcik7XG5cbiAgLy8gQ2hlY2sgaWYgZWxsaXBzaXMgaW4gbWVhc3VyZSBkaXYgaXMgaGVpZ2h0IGVub3VnaCBmb3IgY29udGVudFxuICBmdW5jdGlvbiBpblJhbmdlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBlbGxpcHNpc0NvbnRhaW5lci5vZmZzZXRIZWlnaHQgPCBtYXhIZWlnaHQ7XG4gIH1cblxuICBpZiAoaW5SYW5nZSgpKSB7XG4gICAgY29uc3QgdGV4dCA9IGVsbGlwc2lzQ29udGFpbmVyLmlubmVySFRNTDtcbiAgICBlbGxpcHNpc0NvbnRhaW5lci5yZW1vdmVDaGlsZChjb250YWluZXIpO1xuICAgIHJldHVybiB7IGNvbnRlbnROb2RlcywgdGV4dCwgZWxsaXBzaXM6IGZhbHNlIH07XG4gIH1cblxuICAvLyBXZSBzaG91bGQgY2xvbmUgdGhlIGNoaWxkTm9kZSBzaW5jZSB0aGV5J3JlIGNvbnRyb2xsZWQgYnkgUmVhY3QgYW5kIHdlIGNhbid0IHJldXNlIGl0IHdpdGhvdXQgd2FybmluZ1xuICBjb25zdCBjaGlsZE5vZGVzOiBDaGlsZE5vZGVbXSA9IEFycmF5LnByb3RvdHlwZS5zbGljZVxuICAgIC5hcHBseShlbGxpcHNpc0NvbnRhaW5lci5jaGlsZE5vZGVzWzBdLmNoaWxkTm9kZXNbMF0uY2xvbmVOb2RlKHRydWUpLmNoaWxkTm9kZXMpXG4gICAgLmZpbHRlcigoeyBub2RlVHlwZSB9OiBDaGlsZE5vZGUpID0+IG5vZGVUeXBlICE9PSBDT01NRU5UX05PREUpO1xuICBjb25zdCBmaXhlZE5vZGVzOiBDaGlsZE5vZGVbXSA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5hcHBseShlbGxpcHNpc0NvbnRhaW5lci5jaGlsZE5vZGVzWzBdLmNoaWxkTm9kZXNbMV0uY2xvbmVOb2RlKHRydWUpLmNoaWxkTm9kZXMpO1xuICBlbGxpcHNpc0NvbnRhaW5lci5yZW1vdmVDaGlsZChjb250YWluZXIpO1xuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT0gRmluZCBtYXRjaCBlbGxpcHNpcyBjb250ZW50ID09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgZWxsaXBzaXNDb250YWluZXIuaW5uZXJIVE1MID0gJyc7XG5cbiAgLy8gQ3JlYXRlIG9yaWdpbiBjb250ZW50IGhvbGRlclxuICBjb25zdCBlbGxpcHNpc0NvbnRlbnRIb2xkZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzcGFuJyk7XG4gIGVsbGlwc2lzQ29udGFpbmVyLmFwcGVuZENoaWxkKGVsbGlwc2lzQ29udGVudEhvbGRlcik7XG4gIGNvbnN0IGVsbGlwc2lzVGV4dE5vZGUgPSBkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShlbGxpcHNpc1N0ciArIHN1ZmZpeFN0cik7XG4gIGVsbGlwc2lzQ29udGVudEhvbGRlci5hcHBlbmRDaGlsZChlbGxpcHNpc1RleHROb2RlKTtcblxuICBmaXhlZE5vZGVzLmZvckVhY2goY2hpbGROb2RlID0+IHtcbiAgICBlbGxpcHNpc0NvbnRhaW5lci5hcHBlbmRDaGlsZChjaGlsZE5vZGUpO1xuICB9KTtcblxuICAvLyBBcHBlbmQgYmVmb3JlIGZpeGVkIG5vZGVzXG4gIGZ1bmN0aW9uIGFwcGVuZENoaWxkTm9kZShub2RlOiBDaGlsZE5vZGUpOiB2b2lkIHtcbiAgICBlbGxpcHNpc0NvbnRlbnRIb2xkZXIuaW5zZXJ0QmVmb3JlKG5vZGUsIGVsbGlwc2lzVGV4dE5vZGUpO1xuICB9XG5cbiAgLy8gR2V0IG1heGltdW0gdGV4dFxuICBmdW5jdGlvbiBtZWFzdXJlVGV4dChcbiAgICB0ZXh0Tm9kZTogVGV4dCxcbiAgICBmdWxsVGV4dDogc3RyaW5nLFxuICAgIHN0YXJ0TG9jOiBudW1iZXIgPSAwLFxuICAgIGVuZExvYzogbnVtYmVyID0gZnVsbFRleHQubGVuZ3RoLFxuICAgIGxhc3RTdWNjZXNzTG9jOiBudW1iZXIgPSAwXG4gICk6IE1lYXN1cmVSZXN1bHQge1xuICAgIGNvbnN0IG1pZExvYyA9IE1hdGguZmxvb3IoKHN0YXJ0TG9jICsgZW5kTG9jKSAvIDIpO1xuICAgIHRleHROb2RlLnRleHRDb250ZW50ID0gZnVsbFRleHQuc2xpY2UoMCwgbWlkTG9jKTtcblxuICAgIGlmIChzdGFydExvYyA+PSBlbmRMb2MgLSAxKSB7XG4gICAgICAvLyBMb29wIHdoZW4gc3RlcCBpcyBzbWFsbFxuICAgICAgZm9yIChsZXQgc3RlcCA9IGVuZExvYzsgc3RlcCA+PSBzdGFydExvYzsgc3RlcCAtPSAxKSB7XG4gICAgICAgIGNvbnN0IGN1cnJlbnRTdGVwVGV4dCA9IGZ1bGxUZXh0LnNsaWNlKDAsIHN0ZXApO1xuICAgICAgICB0ZXh0Tm9kZS50ZXh0Q29udGVudCA9IGN1cnJlbnRTdGVwVGV4dDtcblxuICAgICAgICBpZiAoaW5SYW5nZSgpIHx8ICFjdXJyZW50U3RlcFRleHQpIHtcbiAgICAgICAgICByZXR1cm4gc3RlcCA9PT0gZnVsbFRleHQubGVuZ3RoXG4gICAgICAgICAgICA/IHtcbiAgICAgICAgICAgICAgICBmaW5pc2hlZDogZmFsc2UsXG4gICAgICAgICAgICAgICAgbm9kZTogZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoZnVsbFRleHQpXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIDoge1xuICAgICAgICAgICAgICAgIGZpbmlzaGVkOiB0cnVlLFxuICAgICAgICAgICAgICAgIG5vZGU6IGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKGN1cnJlbnRTdGVwVGV4dClcbiAgICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICBpZiAoaW5SYW5nZSgpKSB7XG4gICAgICByZXR1cm4gbWVhc3VyZVRleHQodGV4dE5vZGUsIGZ1bGxUZXh0LCBtaWRMb2MsIGVuZExvYywgbWlkTG9jKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIG1lYXN1cmVUZXh0KHRleHROb2RlLCBmdWxsVGV4dCwgc3RhcnRMb2MsIG1pZExvYywgbGFzdFN1Y2Nlc3NMb2MpO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIG1lYXN1cmVOb2RlKGNoaWxkTm9kZTogQ2hpbGROb2RlLCBpbmRleDogbnVtYmVyKTogTWVhc3VyZVJlc3VsdCB7XG4gICAgY29uc3QgdHlwZSA9IGNoaWxkTm9kZS5ub2RlVHlwZTtcblxuICAgIGlmICh0eXBlID09PSBFTEVNRU5UX05PREUpIHtcbiAgICAgIC8vIFdlIGRvbid0IHNwbGl0IGVsZW1lbnQsIGl0IHdpbGwga2VlcCBpZiB3aG9sZSBlbGVtZW50IGNhbiBiZSBkaXNwbGF5ZWQuXG4gICAgICAvLyBhcHBlbmRDaGlsZE5vZGUoY2hpbGROb2RlKTtcbiAgICAgIGlmIChpblJhbmdlKCkpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBmaW5pc2hlZDogZmFsc2UsXG4gICAgICAgICAgbm9kZTogY29udGVudExpc3RbaW5kZXhdXG4gICAgICAgIH07XG4gICAgICB9XG5cbiAgICAgIC8vIENsZWFuIHVwIGlmIGNhbiBub3QgcHVsbCBpblxuICAgICAgZWxsaXBzaXNDb250ZW50SG9sZGVyLnJlbW92ZUNoaWxkKGNoaWxkTm9kZSk7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBmaW5pc2hlZDogdHJ1ZSxcbiAgICAgICAgbm9kZTogbnVsbFxuICAgICAgfTtcbiAgICB9IGVsc2UgaWYgKHR5cGUgPT09IFRFWFRfTk9ERSkge1xuICAgICAgY29uc3QgZnVsbFRleHQgPSBjaGlsZE5vZGUudGV4dENvbnRlbnQgfHwgJyc7XG4gICAgICBjb25zdCB0ZXh0Tm9kZSA9IGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKGZ1bGxUZXh0KTtcbiAgICAgIGFwcGVuZENoaWxkTm9kZSh0ZXh0Tm9kZSk7XG4gICAgICByZXR1cm4gbWVhc3VyZVRleHQodGV4dE5vZGUsIGZ1bGxUZXh0KTtcbiAgICB9XG5cbiAgICAvLyBOb3QgaGFuZGxlIG90aGVyIHR5cGUgb2YgY29udGVudFxuICAgIC8vIFBTOiBUaGlzIGNvZGUgc2hvdWxkIG5vdCBiZSBhdHRhY2hlZCBhZnRlciByZWFjdCAxNlxuICAgIHJldHVybiB7XG4gICAgICBmaW5pc2hlZDogZmFsc2UsXG4gICAgICBub2RlOiBudWxsXG4gICAgfTtcbiAgfVxuXG4gIGNvbnN0IGVsbGlwc2lzTm9kZXM6IE5vZGVbXSA9IFtdO1xuICBjaGlsZE5vZGVzLnNvbWUoKGNoaWxkTm9kZSwgaW5kZXgpID0+IHtcbiAgICBjb25zdCB7IGZpbmlzaGVkLCBub2RlIH0gPSBtZWFzdXJlTm9kZShjaGlsZE5vZGUsIGluZGV4KTtcbiAgICBpZiAobm9kZSkge1xuICAgICAgZWxsaXBzaXNOb2Rlcy5wdXNoKG5vZGUpO1xuICAgIH1cbiAgICByZXR1cm4gZmluaXNoZWQ7XG4gIH0pO1xuICBjb25zdCByZXN1bHQgPSB7XG4gICAgY29udGVudE5vZGVzOiBlbGxpcHNpc05vZGVzLFxuICAgIHRleHQ6IGVsbGlwc2lzQ29udGFpbmVyLmlubmVySFRNTCxcbiAgICBlbGxpcHNpczogdHJ1ZVxuICB9O1xuICB3aGlsZSAoZWxsaXBzaXNDb250YWluZXIuZmlyc3RDaGlsZCkge1xuICAgIGVsbGlwc2lzQ29udGFpbmVyLnJlbW92ZUNoaWxkKGVsbGlwc2lzQ29udGFpbmVyLmZpcnN0Q2hpbGQpO1xuICB9XG4gIHJldHVybiByZXN1bHQ7XG59XG4iXX0=