testcafe
Version:
Automated browser testing for the modern web development stack.
142 lines • 23.4 kB
JavaScript
;
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.getNextFocusableElement = exports.focusNextElement = exports.getDeepActiveElement = exports.getChar = exports.getActualKeysAndEventKeyProperties = exports.changeLetterCase = void 0;
const hammerhead_1 = __importDefault(require("../../deps/hammerhead"));
const testcafe_core_1 = require("../../deps/testcafe-core");
const is_letter_1 = __importDefault(require("../../utils/is-letter"));
const nativeMethods = hammerhead_1.default.nativeMethods;
const browserUtils = hammerhead_1.default.utils.browser;
const focusBlurSandbox = hammerhead_1.default.eventSandbox.focusBlur;
const Promise = hammerhead_1.default.Promise;
const { isRadioButtonElement, getActiveElement, getTabIndexAttributeIntValue } = testcafe_core_1.domUtils;
function changeLetterCase(letter) {
const isLowCase = letter === letter.toLowerCase();
return isLowCase ? letter.toUpperCase() : letter.toLowerCase();
}
exports.changeLetterCase = changeLetterCase;
function getActualKeysAndEventKeyProperties(keyArray) {
const eventKeyProperties = keyArray.slice();
//NOTE: check 'shift' modifier in keys
for (let i = 0; i < keyArray.length; i++) {
const key = keyArray[i];
if (key.toLowerCase() === 'shift') {
const nextKey = keyArray[i + 1];
if (!nextKey)
continue;
if (testcafe_core_1.KEY_MAPS.shiftMap[nextKey])
keyArray[i + 1] = testcafe_core_1.KEY_MAPS.shiftMap[nextKey];
else if (testcafe_core_1.KEY_MAPS.reversedShiftMap[nextKey])
eventKeyProperties[i + 1] = testcafe_core_1.KEY_MAPS.reversedShiftMap[nextKey];
}
if (testcafe_core_1.KEY_MAPS.shiftMap[key] && (!keyArray[i - 1] || keyArray[i - 1].toLowerCase() !== 'shift')) {
keyArray[i] = testcafe_core_1.KEY_MAPS.shiftMap[key];
keyArray.splice(i, 0, 'shift');
eventKeyProperties.splice(i, 0, 'shift');
i++;
}
}
return { actualKeys: keyArray, eventKeyProperties };
}
exports.getActualKeysAndEventKeyProperties = getActualKeysAndEventKeyProperties;
function getChar(key, shiftModified) {
if (key === 'space')
return ' ';
if (shiftModified) {
if ((0, is_letter_1.default)(key))
return changeLetterCase(key);
if (testcafe_core_1.KEY_MAPS.reversedShiftMap[key])
return testcafe_core_1.KEY_MAPS.reversedShiftMap[key];
}
return key;
}
exports.getChar = getChar;
function getDeepActiveElement(currentDocument) {
const doc = currentDocument || document;
const activeElement = getActiveElement(doc);
let activeElementInIframe = null;
if (activeElement && testcafe_core_1.domUtils.isIframeElement(activeElement) &&
nativeMethods.contentDocumentGetter.call(activeElement)) {
try {
activeElementInIframe = getDeepActiveElement(nativeMethods.contentDocumentGetter.call(activeElement));
}
catch (e) { // eslint-disable-line no-empty
}
}
return activeElementInIframe || activeElement;
}
exports.getDeepActiveElement = getDeepActiveElement;
function focusNextElement(element, reverse, skipRadioGroups) {
return new Promise(resolve => {
const nextElement = getNextFocusableElement(element, reverse, skipRadioGroups);
if (nextElement)
focusBlurSandbox.focus(nextElement, () => resolve(nextElement));
else
resolve();
});
}
exports.focusNextElement = focusNextElement;
function getFocusableElementsFilter(sourceElement, skipRadioGroups) {
let filter = null;
if (skipRadioGroups) {
// NOTE: in all browsers except Mozilla and Opera focus sets on one radio set from group only.
// in Mozilla and Opera focus sets on any radio set.
if (sourceElement.name !== '' && !browserUtils.isFirefox)
filter = item => !item.name || item === sourceElement || item.name !== sourceElement.name;
}
// NOTE arrow navigations works with radio buttons in all browsers only between radio buttons with same names
// Navigation between radio buttons without name just moves focus between radio buttons in Chrome
// In other browsers navigation between radio buttons without name does not work
else if (sourceElement.name !== '')
filter = item => isRadioButtonElement(item) && item.name === sourceElement.name;
else if (browserUtils.isChrome)
filter = item => isRadioButtonElement(item) && !item.name;
return filter;
}
function filterFocusableElements(elements, sourceElement, skipRadioGroups) {
if (!isRadioButtonElement(sourceElement))
return elements;
if (!skipRadioGroups && !sourceElement.name && !browserUtils.isChrome)
return [sourceElement];
const filterFn = getFocusableElementsFilter(sourceElement, skipRadioGroups);
if (filterFn)
elements = testcafe_core_1.arrayUtils.filter(elements, filterFn);
return elements;
}
function correctFocusableElement(elements, element, skipRadioGroups) {
const isNotCheckedRadioButtonElement = isRadioButtonElement(element) && element.name && !element.checked;
let checkedRadioButtonElementWithSameName = null;
if (skipRadioGroups && isNotCheckedRadioButtonElement) {
checkedRadioButtonElementWithSameName = testcafe_core_1.arrayUtils.find(elements, el => {
return isRadioButtonElement(el) && el.name === element.name && el.checked;
});
}
return checkedRadioButtonElementWithSameName || element;
}
function activeElementHasNegativeTabIndex(doc) {
const activeElement = nativeMethods.documentActiveElementGetter.call(doc);
const activeElementTabIndex = activeElement && getTabIndexAttributeIntValue(activeElement);
return activeElement && activeElementTabIndex < 0;
}
function getNextFocusableElement(element, reverse, skipRadioGroups) {
const offset = reverse ? -1 : 1;
const doc = testcafe_core_1.domUtils.getTopSameDomainWindow(window).document;
const sort = !activeElementHasNegativeTabIndex(doc);
let allFocusable = testcafe_core_1.domUtils.getFocusableElements(doc, sort);
allFocusable = filterFocusableElements(allFocusable, element, skipRadioGroups);
const isRadioInput = isRadioButtonElement(element);
const currentIndex = testcafe_core_1.arrayUtils.indexOf(allFocusable, element);
const isLastElementFocused = reverse ? currentIndex === 0 : currentIndex === allFocusable.length - 1;
if (isLastElementFocused) {
if (!reverse && element.tabIndex < 0)
return testcafe_core_1.arrayUtils.find(allFocusable, el => el.tabIndex === 0);
return skipRadioGroups || !isRadioInput ? document.body : allFocusable[allFocusable.length - 1 - currentIndex];
}
if (reverse && currentIndex === -1)
return allFocusable[allFocusable.length - 1];
return correctFocusableElement(allFocusable, allFocusable[currentIndex + offset], skipRadioGroups);
}
exports.getNextFocusableElement = getNextFocusableElement;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvY2xpZW50L2F1dG9tYXRpb24vcGxheWJhY2svcHJlc3MvdXRpbHMuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBQUEsdUVBQStDO0FBQy9DLDREQUlrQztBQUVsQyxzRUFBNkM7QUFHN0MsTUFBTSxhQUFhLEdBQU0sb0JBQVUsQ0FBQyxhQUFhLENBQUM7QUFDbEQsTUFBTSxZQUFZLEdBQU8sb0JBQVUsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDO0FBQ2xELE1BQU0sZ0JBQWdCLEdBQUcsb0JBQVUsQ0FBQyxZQUFZLENBQUMsU0FBUyxDQUFDO0FBQzNELE1BQU0sT0FBTyxHQUFZLG9CQUFVLENBQUMsT0FBTyxDQUFDO0FBRTVDLE1BQU0sRUFBRSxvQkFBb0IsRUFBRSxnQkFBZ0IsRUFBRSw0QkFBNEIsRUFBRSxHQUFHLHdCQUFRLENBQUM7QUFFMUYsU0FBZ0IsZ0JBQWdCLENBQUUsTUFBTTtJQUNwQyxNQUFNLFNBQVMsR0FBRyxNQUFNLEtBQUssTUFBTSxDQUFDLFdBQVcsRUFBRSxDQUFDO0lBRWxELE9BQU8sU0FBUyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsV0FBVyxFQUFFLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxXQUFXLEVBQUUsQ0FBQztBQUNuRSxDQUFDO0FBSkQsNENBSUM7QUFFRCxTQUFnQixrQ0FBa0MsQ0FBRSxRQUFRO0lBQ3hELE1BQU0sa0JBQWtCLEdBQUcsUUFBUSxDQUFDLEtBQUssRUFBRSxDQUFDO0lBRTVDLHNDQUFzQztJQUN0QyxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsUUFBUSxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtRQUN0QyxNQUFNLEdBQUcsR0FBRyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFFeEIsSUFBSSxHQUFHLENBQUMsV0FBVyxFQUFFLEtBQUssT0FB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TyxZQUFZLENBQUMsWUFBWSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQztJQUVqRCxPQUFPLHVCQUF1QixDQUFDLFlBQVksRUFBRSxZQUFZLENBQUMsWUFBWSxHQUFHLE1BQU0sQ0FBQyxFQUFFLGVBQWUsQ0FBQyxDQUFDO0FBQ3ZHLENBQUM7QUF2QkQsMERBdUJDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IGhhbW1lcmhlYWQgZnJvbSAnLi4vLi4vZGVwcy9oYW1tZXJoZWFkJztcbmltcG9ydCB7XG4gICAgS0VZX01BUFMsXG4gICAgZG9tVXRpbHMsXG4gICAgYXJyYXlVdGlscyxcbn0gZnJvbSAnLi4vLi4vZGVwcy90ZXN0Y2FmZS1jb3JlJztcblxuaW1wb3J0IGlzTGV0dGVyIGZyb20gJy4uLy4uL3V0aWxzL2lzLWxldHRlcic7XG5cblxuY29uc3QgbmF0aXZlTWV0aG9kcyAgICA9IGhhbW1lcmhlYWQubmF0aXZlTWV0aG9kcztcbmNvbnN0IGJyb3dzZXJVdGlscyAgICAgPSBoYW1tZXJoZWFkLnV0aWxzLmJyb3dzZXI7XG5jb25zdCBmb2N1c0JsdXJTYW5kYm94ID0gaGFtbWVyaGVhZC5ldmVudFNhbmRib3guZm9jdXNCbHVyO1xuY29uc3QgUHJvbWlzZSAgICAgICAgICA9IGhhbW1lcmhlYWQuUHJvbWlzZTtcblxuY29uc3QgeyBpc1JhZGlvQnV0dG9uRWxlbWVudCwgZ2V0QWN0aXZlRWxlbWVudCwgZ2V0VGFiSW5kZXhBdHRyaWJ1dGVJbnRWYWx1ZSB9ID0gZG9tVXRpbHM7XG5cbmV4cG9ydCBmdW5jdGlvbiBjaGFuZ2VMZXR0ZXJDYXNlIChsZXR0ZXIpIHtcbiAgICBjb25zdCBpc0xvd0Nhc2UgPSBsZXR0ZXIgPT09IGxldHRlci50b0xvd2VyQ2FzZSgpO1xuXG4gICAgcmV0dXJuIGlzTG93Q2FzZSA/IGxldHRlci50b1VwcGVyQ2FzZSgpIDogbGV0dGVyLnRvTG93ZXJDYXNlKCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRBY3R1YWxLZXlzQW5kRXZlbnRLZXlQcm9wZXJ0aWVzIChrZXlBcnJheSkge1xuICAgIGNvbnN0IGV2ZW50S2V5UHJvcGVydGllcyA9IGtleUFycmF5LnNsaWNlKCk7XG5cbiAgICAvL05PVEU6IGNoZWNrICdzaGlmdCcgbW9kaWZpZXIgaW4ga2V5c1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwga2V5QXJyYXkubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgY29uc3Qga2V5ID0ga2V5QXJyYXlbaV07XG5cbiAgICAgICAgaWYgKGtleS50b0xvd2VyQ2FzZSgpID09PSAnc2hpZnQnKSB7XG4gICAgICAgICAgICBjb25zdCBuZXh0S2V5ID0ga2V5QXJyYXlbaSArIDFdO1xuXG4gICAgICAgICAgICBpZiAoIW5leHRLZXkpXG4gICAgICAgICAgICAgICAgY29udGludWU7XG5cbiAgICAgICAgICAgIGlmIChLRVlfTUFQUy5zaGlmdE1hcFtuZXh0S2V5XSlcbiAgICAgICAgICAgICAgICBrZXlBcnJheVtpICsgMV0gPSBLRVlfTUFQUy5zaGlmdE1hcFtuZXh0S2V5XTtcbiAgICAgICAgICAgIGVsc2UgaWYgKEtFWV9NQVBTLnJldmVyc2VkU2hpZnRNYXBbbmV4dEtleV0pXG4gICAgICAgICAgICAgICAgZXZlbnRLZXlQcm9wZXJ0aWVzW2kgKyAxXSA9IEtFWV9NQVBTLnJldmVyc2VkU2hpZnRNYXBbbmV4dEtleV07XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoS0VZX01BUFMuc2hpZnRNYXBba2V5XSAmJiAoIWtleUFycmF5W2kgLSAxXSB8fCBrZXlBcnJheVtpIC0gMV0udG9Mb3dlckNhc2UoKSAhPT0gJ3NoaWZ0JykpIHtcbiAgICAgICAgICAgIGtleUFycmF5W2ldID0gS0VZX01BUFMuc2hpZnRNYXBba2V5XTtcbiAgICAgICAgICAgIGtleUFycmF5LnNwbGljZShpLCAwLCAnc2hpZnQnKTtcbiAgICAgICAgICAgIGV2ZW50S2V5UHJvcGVydGllcy5zcGxpY2UoaSwgMCwgJ3NoaWZ0Jyk7XG4gICAgICAgICAgICBpKys7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4geyBhY3R1YWxLZXlzOiBrZXlBcnJheSwgZXZlbnRLZXlQcm9wZXJ0aWVzIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRDaGFyIChrZXksIHNoaWZ0TW9kaWZpZWQpIHtcbiAgICBpZiAoa2V5ID09PSAnc3BhY2UnKVxuICAgICAgICByZXR1cm4gJyAnO1xuXG4gICAgaWYgKHNoaWZ0TW9kaWZpZWQpIHtcbiAgICAgICAgaWYgKGlzTGV0dGVyKGtleSkpXG4gICAgICAgICAgICByZXR1cm4gY2hhbmdlTGV0dGVyQ2FzZShrZXkpO1xuXG4gICAgICAgIGlmIChLRVlfTUFQUy5yZXZlcnNlZFNoaWZ0TWFwW2tleV0pXG4gICAgICAgICAgICByZXR1cm4gS0VZX01BUFMucmV2ZXJzZWRTaGlmdE1hcFtrZXldO1xuICAgIH1cblxuICAgIHJldHVybiBrZXk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXREZWVwQWN0aXZlRWxlbWVudCAoY3VycmVudERvY3VtZW50KSB7XG4gICAgY29uc3QgZG9jICAgICAgICAgICAgICAgICA9IGN1cnJlbnREb2N1bWVudCB8fCBkb2N1bWVudDtcbiAgICBjb25zdCBhY3RpdmVFbGVtZW50ICAgICAgID0gZ2V0QWN0aXZlRWxlbWVudChkb2MpO1xuICAgIGxldCBhY3RpdmVFbGVtZW50SW5JZnJhbWUgPSBudWxsO1xuXG5cbiAgICBpZiAoYWN0aXZlRWxlbWVudCAmJiBkb21VdGlscy5pc0lmcmFtZUVsZW1lbnQoYWN0aXZlRWxlbWVudCkgJiZcbiAgICAgICAgbmF0aXZlTWV0aG9kcy5jb250ZW50RG9jdW1lbnRHZXR0ZXIuY2FsbChhY3RpdmVFbGVtZW50KSkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgYWN0aXZlRWxlbWVudEluSWZyYW1lID0gZ2V0RGVlcEFjdGl2ZUVsZW1lbnQobmF0aXZlTWV0aG9kcy5jb250ZW50RG9jdW1lbnRHZXR0ZXIuY2FsbChhY3RpdmVFbGVtZW50KSk7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGUpIHsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1lbXB0eVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGFjdGl2ZUVsZW1lbnRJbklmcmFtZSB8fCBhY3RpdmVFbGVtZW50O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZm9jdXNOZXh0RWxlbWVudCAoZWxlbWVudCwgcmV2ZXJzZSwgc2tpcFJhZGlvR3JvdXBzKSB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKHJlc29sdmUgPT4ge1xuICAgICAgICBjb25zdCBuZXh0RWxlbWVudCA9IGdldE5leHRGb2N1c2FibGVFbGVtZW50KGVsZW1lbnQsIHJldmVyc2UsIHNraXBSYWRpb0dyb3Vwcyk7XG5cbiAgICAgICAgaWYgKG5leHRFbGVtZW50KVxuICAgICAgICAgICAgZm9jdXNCbHVyU2FuZGJveC5mb2N1cyhuZXh0RWxlbWVudCwgKCkgPT4gcmVzb2x2ZShuZXh0RWxlbWVudCkpO1xuICAgICAgICBlbHNlXG4gICAgICAgICAgICByZXNvbHZlKCk7XG4gICAgfSk7XG59XG5cbmZ1bmN0aW9uIGdldEZvY3VzYWJsZUVsZW1lbnRzRmlsdGVyIChzb3VyY2VFbGVtZW50LCBza2lwUmFkaW9Hcm91cHMpIHtcbiAgICBsZXQgZmlsdGVyID0gbnVsbDtcblxuICAgIGlmIChza2lwUmFkaW9Hcm91cHMpIHtcbiAgICAgICAgLy8gTk9URTogaW4gYWxsIGJyb3dzZXJzIGV4Y2VwdCBNb3ppbGxhIGFuZCBPcGVyYSBmb2N1cyBzZXRzIG9uIG9uZSByYWRpbyBzZXQgZnJvbSBncm91cCBvbmx5LlxuICAgICAgICAvLyBpbiBNb3ppbGxhIGFuZCBPcGVyYSBmb2N1cyBzZXRzIG9uIGFueSByYWRpbyBzZXQuXG4gICAgICAgIGlmIChzb3VyY2VFbGVtZW50Lm5hbWUgIT09ICcnICYmICFicm93c2VyVXRpbHMuaXNGaXJlZm94KVxuICAgICAgICAgICAgZmlsdGVyID0gaXRlbSA9PiAhaXRlbS5uYW1lIHx8IGl0ZW0gPT09IHNvdXJjZUVsZW1lbnQgfHwgaXRlbS5uYW1lICE9PSBzb3VyY2VFbGVtZW50Lm5hbWU7XG4gICAgfVxuICAgIC8vIE5PVEUgYXJyb3cgbmF2aWdhdGlvbnMgd29ya3Mgd2l0aCByYWRpbyBidXR0b25zIGluIGFsbCBicm93c2VycyBvbmx5IGJldHdlZW4gcmFkaW8gYnV0dG9ucyB3aXRoIHNhbWUgbmFtZXNcbiAgICAvLyBOYXZpZ2F0aW9uIGJldHdlZW4gcmFkaW8gYnV0dG9ucyB3aXRob3V0IG5hbWUganVzdCBtb3ZlcyBmb2N1cyBiZXR3ZWVuIHJhZGlvIGJ1dHRvbnMgaW4gQ2hyb21lXG4gICAgLy8gSW4gb3RoZXIgYnJvd3NlcnMgbmF2aWdhdGlvbiBiZXR3ZWVuIHJhZGlvIGJ1dHRvbnMgd2l0aG91dCBuYW1lIGRvZXMgbm90IHdvcmtcbiAgICBlbHNlIGlmIChzb3VyY2VFbGVtZW50Lm5hbWUgIT09ICcnKVxuICAgICAgICBmaWx0ZXIgPSBpdGVtID0+IGlzUmFkaW9CdXR0b25FbGVtZW50KGl0ZW0pICYmIGl0ZW0ubmFtZSA9PT0gc291cmNlRWxlbWVudC5uYW1lO1xuICAgIGVsc2UgaWYgKGJyb3dzZXJVdGlscy5pc0Nocm9tZSlcbiAgICAgICAgZmlsdGVyID0gaXRlbSA9PiBpc1JhZGlvQnV0dG9uRWxlbWVudChpdGVtKSAmJiAhaXRlbS5uYW1lO1xuXG4gICAgcmV0dXJuIGZpbHRlcjtcbn1cblxuZnVuY3Rpb24gZmlsdGVyRm9jdXNhYmxlRWxlbWVudHMgKGVsZW1lbnRzLCBzb3VyY2VFbGVtZW50LCBza2lwUmFkaW9Hcm91cHMpIHtcbiAgICBpZiAoIWlzUmFkaW9CdXR0b25FbGVtZW50KHNvdXJjZUVsZW1lbnQpKVxuICAgICAgICByZXR1cm4gZWxlbWVudHM7XG5cbiAgICBpZiAoIXNraXBSYWRpb0dyb3VwcyAmJiAhc291cmNlRWxlbWVudC5uYW1lICYmICFicm93c2VyVXRpbHMuaXNDaHJvbWUpXG4gICAgICAgIHJldHVybiBbc291cmNlRWxlbWVudF07XG5cbiAgICBjb25zdCBmaWx0ZXJGbiA9IGdldEZvY3VzYWJsZUVsZW1lbnRzRmlsdGVyKHNvdXJjZUVsZW1lbnQsIHNraXBSYWRpb0dyb3Vwcyk7XG5cbiAgICBpZiAoZmlsdGVyRm4pXG4gICAgICAgIGVsZW1lbnRzID0gYXJyYXlVdGlscy5maWx0ZXIoZWxlbWVudHMsIGZpbHRlckZuKTtcblxuICAgIHJldHVybiBlbGVtZW50cztcbn1cblxuZnVuY3Rpb24gY29ycmVjdEZvY3VzYWJsZUVsZW1lbnQgKGVsZW1lbnRzLCBlbGVtZW50LCBza2lwUmFkaW9Hcm91cHMpIHtcbiAgICBjb25zdCBpc05vdENoZWNrZWRSYWRpb0J1dHRvbkVsZW1lbnQgICAgICA9IGlzUmFkaW9CdXR0b25FbGVtZW50KGVsZW1lbnQpICYmIGVsZW1lbnQubmFtZSAmJiAhZWxlbWVudC5jaGVja2VkO1xuICAgIGxldCBjaGVja2VkUmFkaW9CdXR0b25FbGVtZW50V2l0aFNhbWVOYW1lID0gbnVsbDtcblxuICAgIGlmIChza2lwUmFkaW9Hcm91cHMgJiYgaXNOb3RDaGVja2VkUmFkaW9CdXR0b25FbGVtZW50KSB7XG4gICAgICAgIGNoZWNrZWRSYWRpb0J1dHRvbkVsZW1lbnRXaXRoU2FtZU5hbWUgPSBhcnJheVV0aWxzLmZpbmQoZWxlbWVudHMsIGVsID0+IHtcbiAgICAgICAgICAgIHJldHVybiBpc1JhZGlvQnV0dG9uRWxlbWVudChlbCkgJiYgZWwubmFtZSA9PT0gZWxlbWVudC5uYW1lICYmIGVsLmNoZWNrZWQ7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHJldHVybiBjaGVja2VkUmFkaW9CdXR0b25FbGVtZW50V2l0aFNhbWVOYW1lIHx8IGVsZW1lbnQ7XG59XG5cbmZ1bmN0aW9uIGFjdGl2ZUVsZW1lbnRIYXNOZWdhdGl2ZVRhYkluZGV4IChkb2MpIHtcbiAgICBjb25zdCBhY3RpdmVFbGVtZW50ICAgICAgICAgPSBuYXRpdmVNZXRob2RzLmRvY3VtZW50QWN0aXZlRWxlbWVudEdldHRlci5jYWxsKGRvYyk7XG4gICAgY29uc3QgYWN0aXZlRWxlbWVudFRhYkluZGV4ID0gYWN0aXZlRWxlbWVudCAmJiBnZXRUYWJJbmRleEF0dHJpYnV0ZUludFZhbHVlKGFjdGl2ZUVsZW1lbnQpO1xuXG4gICAgcmV0dXJuIGFjdGl2ZUVsZW1lbnQgJiYgYWN0aXZlRWxlbWVudFRhYkluZGV4IDwgMDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldE5leHRGb2N1c2FibGVFbGVtZW50IChlbGVtZW50LCByZXZlcnNlLCBza2lwUmFkaW9Hcm91cHMpIHtcbiAgICBjb25zdCBvZmZzZXQgICAgID0gcmV2ZXJzZSA/IC0xIDogMTtcbiAgICBjb25zdCBkb2MgICAgICAgID0gZG9tVXRpbHMuZ2V0VG9wU2FtZURvbWFpbldpbmRvdyh3aW5kb3cpLmRvY3VtZW50O1xuICAgIGNvbnN0IHNvcnQgICAgICAgPSAhYWN0aXZlRWxlbWVudEhhc05lZ2F0aXZlVGFiSW5kZXgoZG9jKTtcbiAgICBsZXQgYWxsRm9jdXNhYmxlID0gZG9tVXRpbHMuZ2V0Rm9jdXNhYmxlRWxlbWVudHMoZG9jLCBzb3J0KTtcblxuICAgIGFsbEZvY3VzYWJsZSA9IGZpbHRlckZvY3VzYWJsZUVsZW1lbnRzKGFsbEZvY3VzYWJsZSwgZWxlbWVudCwgc2tpcFJhZGlvR3JvdXBzKTtcblxuICAgIGNvbnN0IGlzUmFkaW9JbnB1dCAgICAgICAgID0gaXNSYWRpb0J1dHRvbkVsZW1lbnQoZWxlbWVudCk7XG4gICAgY29uc3QgY3VycmVudEluZGV4ICAgICAgICAgPSBhcnJheVV0aWxzLmluZGV4T2YoYWxsRm9jdXNhYmxlLCBlbGVtZW50KTtcbiAgICBjb25zdCBpc0xhc3RFbGVtZW50Rm9jdXNlZCA9IHJldmVyc2UgPyBjdXJyZW50SW5kZXggPT09IDAgOiBjdXJyZW50SW5kZXggPT09IGFsbEZvY3VzYWJsZS5sZW5ndGggLSAxO1xuXG4gICAgaWYgKGlzTGFzdEVsZW1lbnRGb2N1c2VkKSB7XG4gICAgICAgIGlmICghcmV2ZXJzZSAmJiBlbGVtZW50LnRhYkluZGV4IDwgMClcbiAgICAgICAgICAgIHJldHVybiBhcnJheVV0aWxzLmZpbmQoYWxsRm9jdXNhYmxlLCBlbCA9PiBlbC50YWJJbmRleCA9PT0gMCk7XG5cbiAgICAgICAgcmV0dXJuIHNraXBSYWRpb0dyb3VwcyB8fCAhaXNSYWRpb0lucHV0ID8gZG9jdW1lbnQuYm9keSA6IGFsbEZvY3VzYWJsZVthbGxGb2N1c2FibGUubGVuZ3RoIC0gMSAtIGN1cnJlbnRJbmRleF07XG4gICAgfVxuXG4gICAgaWYgKHJldmVyc2UgJiYgY3VycmVudEluZGV4ID09PSAtMSlcbiAgICAgICAgcmV0dXJuIGFsbEZvY3VzYWJsZVthbGxGb2N1c2FibGUubGVuZ3RoIC0gMV07XG5cbiAgICByZXR1cm4gY29ycmVjdEZvY3VzYWJsZUVsZW1lbnQoYWxsRm9jdXNhYmxlLCBhbGxGb2N1c2FibGVbY3VycmVudEluZGV4ICsgb2Zmc2V0XSwgc2tpcFJhZGlvR3JvdXBzKTtcbn1cbiJdfQ==