israeli-bank-scrapers
Version:
Provide scrapers for all major Israeli banks and credit card companies
149 lines (148 loc) • 23.9 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.default = void 0;
var _moment = _interopRequireDefault(require("moment"));
var _constants = require("../constants");
var _debug = require("../helpers/debug");
var _elementsInteractions = require("../helpers/elements-interactions");
var _transactions = require("../helpers/transactions");
var _transactions2 = require("../transactions");
var _baseScraperWithBrowser = require("./base-scraper-with-browser");
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
const debug = (0, _debug.getDebug)('beyahadBishvilha');
const DATE_FORMAT = 'DD/MM/YY';
const LOGIN_URL = 'https://www.hist.org.il/login';
const SUCCESS_URL = 'https://www.hist.org.il/';
const CARD_URL = 'https://www.hist.org.il/card/balanceAndUses';
function getAmountData(amountStr) {
const amountStrCln = amountStr.replace(',', '');
let currency = null;
let amount = null;
if (amountStrCln.includes(_constants.SHEKEL_CURRENCY_SYMBOL)) {
amount = parseFloat(amountStrCln.replace(_constants.SHEKEL_CURRENCY_SYMBOL, ''));
currency = _constants.SHEKEL_CURRENCY;
} else if (amountStrCln.includes(_constants.DOLLAR_CURRENCY_SYMBOL)) {
amount = parseFloat(amountStrCln.replace(_constants.DOLLAR_CURRENCY_SYMBOL, ''));
currency = _constants.DOLLAR_CURRENCY;
} else if (amountStrCln.includes(_constants.EURO_CURRENCY_SYMBOL)) {
amount = parseFloat(amountStrCln.replace(_constants.EURO_CURRENCY_SYMBOL, ''));
currency = _constants.EURO_CURRENCY;
} else {
const parts = amountStrCln.split(' ');
[currency] = parts;
amount = parseFloat(parts[1]);
}
return {
amount,
currency
};
}
function convertTransactions(txns) {
debug(`convert ${txns.length} raw transactions to official Transaction structure`);
return txns.map(txn => {
const chargedAmountTuple = getAmountData(txn.chargedAmount || '');
const txnProcessedDate = (0, _moment.default)(txn.date, DATE_FORMAT);
const result = {
type: _transactions2.TransactionTypes.Normal,
status: _transactions2.TransactionStatuses.Completed,
date: txnProcessedDate.toISOString(),
processedDate: txnProcessedDate.toISOString(),
originalAmount: chargedAmountTuple.amount,
originalCurrency: chargedAmountTuple.currency,
chargedAmount: chargedAmountTuple.amount,
chargedCurrency: chargedAmountTuple.currency,
description: txn.description || '',
memo: '',
identifier: txn.identifier
};
return result;
});
}
async function fetchTransactions(page, options) {
await page.goto(CARD_URL);
await (0, _elementsInteractions.waitUntilElementFound)(page, '.react-loading.hide', false);
const defaultStartMoment = (0, _moment.default)().subtract(1, 'years');
const startDate = options.startDate || defaultStartMoment.toDate();
const startMoment = _moment.default.max(defaultStartMoment, (0, _moment.default)(startDate));
const accountNumber = await (0, _elementsInteractions.pageEval)(page, '.wallet-details div:nth-of-type(2)', null, element => {
return element.innerText.replace('מספר כרטיס ', '');
});
const balance = await (0, _elementsInteractions.pageEval)(page, '.wallet-details div:nth-of-type(4) > span:nth-of-type(2)', null, element => {
return element.innerText;
});
debug('fetch raw transactions from page');
const rawTransactions = await (0, _elementsInteractions.pageEvalAll)(page, '.transaction-container, .transaction-component-container', [], items => {
return items.map(el => {
const columns = el.querySelectorAll('.transaction-item > span');
if (columns.length === 7) {
return {
date: columns[0].innerText,
identifier: columns[1].innerText,
description: columns[3].innerText,
type: columns[5].innerText,
chargedAmount: columns[6].innerText
};
}
return null;
});
});
debug(`fetched ${rawTransactions.length} raw transactions from page`);
const accountTransactions = convertTransactions(rawTransactions.filter(item => !!item));
debug('filer out old transactions');
const txns = options.outputData?.enableTransactionsFilterByDate ?? true ? (0, _transactions.filterOldTransactions)(accountTransactions, startMoment, false) : accountTransactions;
debug(`found ${txns.length} valid transactions out of ${accountTransactions.length} transactions for account ending with ${accountNumber.substring(accountNumber.length - 2)}`);
return {
accountNumber,
balance: getAmountData(balance).amount,
txns
};
}
function getPossibleLoginResults() {
const urls = {};
urls[_baseScraperWithBrowser.LoginResults.Success] = [SUCCESS_URL];
urls[_baseScraperWithBrowser.LoginResults.ChangePassword] = []; // TODO
urls[_baseScraperWithBrowser.LoginResults.InvalidPassword] = []; // TODO
urls[_baseScraperWithBrowser.LoginResults.UnknownError] = []; // TODO
return urls;
}
function createLoginFields(credentials) {
return [{
selector: '#loginId',
value: credentials.id
}, {
selector: '#loginPassword',
value: credentials.password
}];
}
class BeyahadBishvilhaScraper extends _baseScraperWithBrowser.BaseScraperWithBrowser {
getViewPort() {
return {
width: 1500,
height: 800
};
}
getLoginOptions(credentials) {
return {
loginUrl: LOGIN_URL,
fields: createLoginFields(credentials),
submitButtonSelector: async () => {
const button = await this.page.$('xpath//button[contains(., "התחבר")]');
if (button) {
await button.click();
}
},
possibleResults: getPossibleLoginResults()
};
}
async fetchData() {
const account = await fetchTransactions(this.page, this.options);
return {
success: true,
accounts: [account]
};
}
}
var _default = exports.default = BeyahadBishvilhaScraper;
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfbW9tZW50IiwiX2ludGVyb3BSZXF1aXJlRGVmYXVsdCIsInJlcXVpcmUiLCJfY29uc3RhbnRzIiwiX2RlYnVnIiwiX2VsZW1lbnRzSW50ZXJhY3Rpb25zIiwiX3RyYW5zYWN0aW9ucyIsIl90cmFuc2FjdGlvbnMyIiwiX2Jhc2VTY3JhcGVyV2l0aEJyb3dzZXIiLCJlIiwiX19lc01vZHVsZSIsImRlZmF1bHQiLCJkZWJ1ZyIsImdldERlYnVnIiwiREFURV9GT1JNQVQiLCJMT0dJTl9VUkwiLCJTVUNDRVNTX1VSTCIsIkNBUkRfVVJMIiwiZ2V0QW1vdW50RGF0YSIsImFtb3VudFN0ciIsImFtb3VudFN0ckNsbiIsInJlcGxhY2UiLCJjdXJyZW5jeSIsImFtb3VudCIsImluY2x1ZGVzIiwiU0hFS0VMX0NVUlJFTkNZX1NZTUJPTCIsInBhcnNlRmxvYXQiLCJTSEVLRUxfQ1VSUkVOQ1kiLCJET0xMQVJfQ1VSUkVOQ1lfU1lNQk9MIiwiRE9MTEFSX0NVUlJFTkNZIiwiRVVST19DVVJSRU5DWV9TWU1CT0wiLCJFVVJPX0NVUlJFTkNZIiwicGFydHMiLCJzcGxpdCIsImNvbnZlcnRUcmFuc2FjdGlvbnMiLCJ0eG5zIiwibGVuZ3RoIiwibWFwIiwidHhuIiwiY2hhcmdlZEFtb3VudFR1cGxlIiwiY2hhcmdlZEFtb3VudCIsInR4blByb2Nlc3NlZERhdGUiLCJtb21lbnQiLCJkYXRlIiwicmVzdWx0IiwidHlwZSIsIlRyYW5zYWN0aW9uVHlwZXMiLCJOb3JtYWwiLCJzdGF0dXMiLCJUcmFuc2FjdGlvblN0YXR1c2VzIiwiQ29tcGxldGVkIiwidG9JU09TdHJpbmciLCJwcm9jZXNzZWREYXRlIiwib3JpZ2luYWxBbW91bnQiLCJvcmlnaW5hbEN1cnJlbmN5IiwiY2hhcmdlZEN1cnJlbmN5IiwiZGVzY3JpcHRpb24iLCJtZW1vIiwiaWRlbnRpZmllciIsImZldGNoVHJhbnNhY3Rpb25zIiwicGFnZSIsIm9wdGlvbnMiLCJnb3RvIiwid2FpdFVudGlsRWxlbWVudEZvdW5kIiwiZGVmYXVsdFN0YXJ0TW9tZW50Iiwic3VidHJhY3QiLCJzdGFydERhdGUiLCJ0b0RhdGUiLCJzdGFydE1vbWVudCIsIm1heCIsImFjY291bnROdW1iZXIiLCJwYWdlRXZhbCIsImVsZW1lbnQiLCJpbm5lclRleHQiLCJiYWxhbmNlIiwicmF3VHJhbnNhY3Rpb25zIiwicGFnZUV2YWxBbGwiLCJpdGVtcyIsImVsIiwiY29sdW1ucyIsInF1ZXJ5U2VsZWN0b3JBbGwiLCJhY2NvdW50VHJhbnNhY3Rpb25zIiwiZmlsdGVyIiwiaXRlbSIsIm91dHB1dERhdGEiLCJlbmFibGVUcmFuc2FjdGlvbnNGaWx0ZXJCeURhdGUiLCJmaWx0ZXJPbGRUcmFuc2FjdGlvbnMiLCJzdWJzdHJpbmciLCJnZXRQb3NzaWJsZUxvZ2luUmVzdWx0cyIsInVybHMiLCJMb2dpblJlc3VsdHMiLCJTdWNjZXNzIiwiQ2hhbmdlUGFzc3dvcmQiLCJJbnZhbGlkUGFzc3dvcmQiLCJVbmtub3duRXJyb3IiLCJjcmVhdGVMb2dpbkZpZWxkcyIsImNyZWRlbnRpYWxzIiwic2VsZWN0b3IiLCJ2YWx1ZSIsImlkIiwicGFzc3dvcmQiLCJCZXlhaGFkQmlzaHZpbGhhU2NyYXBlciIsIkJhc2VTY3JhcGVyV2l0aEJyb3dzZXIiLCJnZXRWaWV3UG9ydCIsIndpZHRoIiwiaGVpZ2h0IiwiZ2V0TG9naW5PcHRpb25zIiwibG9naW5VcmwiLCJmaWVsZHMiLCJzdWJtaXRCdXR0b25TZWxlY3RvciIsImJ1dHRvbiIsIiQiLCJjbGljayIsInBvc3NpYmxlUmVzdWx0cyIsImZldGNoRGF0YSIsImFjY291bnQiLCJzdWNjZXNzIiwiYWNjb3VudHMiLCJfZGVmYXVsdCIsImV4cG9ydHMiXSwic291cmNlcyI6WyIuLi8uLi9zcmMvc2NyYXBlcnMvYmV5YWhhZC1iaXNodmlsaGEudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IG1vbWVudCBmcm9tICdtb21lbnQnO1xuaW1wb3J0IHsgdHlwZSBQYWdlIH0gZnJvbSAncHVwcGV0ZWVyJztcbmltcG9ydCB7XG4gIERPTExBUl9DVVJSRU5DWSxcbiAgRE9MTEFSX0NVUlJFTkNZX1NZTUJPTCxcbiAgRVVST19DVVJSRU5DWSxcbiAgRVVST19DVVJSRU5DWV9TWU1CT0wsXG4gIFNIRUtFTF9DVVJSRU5DWSxcbiAgU0hFS0VMX0NVUlJFTkNZX1NZTUJPTCxcbn0gZnJvbSAnLi4vY29uc3RhbnRzJztcbmltcG9ydCB7IGdldERlYnVnIH0gZnJvbSAnLi4vaGVscGVycy9kZWJ1Zyc7XG5pbXBvcnQgeyBwYWdlRXZhbCwgcGFnZUV2YWxBbGwsIHdhaXRVbnRpbEVsZW1lbnRGb3VuZCB9IGZyb20gJy4uL2hlbHBlcnMvZWxlbWVudHMtaW50ZXJhY3Rpb25zJztcbmltcG9ydCB7IGZpbHRlck9sZFRyYW5zYWN0aW9ucyB9IGZyb20gJy4uL2hlbHBlcnMvdHJhbnNhY3Rpb25zJztcbmltcG9ydCB7IFRyYW5zYWN0aW9uU3RhdHVzZXMsIFRyYW5zYWN0aW9uVHlwZXMsIHR5cGUgVHJhbnNhY3Rpb24gfSBmcm9tICcuLi90cmFuc2FjdGlvbnMnO1xuaW1wb3J0IHsgQmFzZVNjcmFwZXJXaXRoQnJvd3NlciwgTG9naW5SZXN1bHRzLCB0eXBlIFBvc3NpYmxlTG9naW5SZXN1bHRzIH0gZnJvbSAnLi9iYXNlLXNjcmFwZXItd2l0aC1icm93c2VyJztcbmltcG9ydCB7IHR5cGUgU2NyYXBlck9wdGlvbnMgfSBmcm9tICcuL2ludGVyZmFjZSc7XG5cbmNvbnN0IGRlYnVnID0gZ2V0RGVidWcoJ2JleWFoYWRCaXNodmlsaGEnKTtcblxuY29uc3QgREFURV9GT1JNQVQgPSAnREQvTU0vWVknO1xuY29uc3QgTE9HSU5fVVJMID0gJ2h0dHBzOi8vd3d3Lmhpc3Qub3JnLmlsL2xvZ2luJztcbmNvbnN0IFNVQ0NFU1NfVVJMID0gJ2h0dHBzOi8vd3d3Lmhpc3Qub3JnLmlsLyc7XG5jb25zdCBDQVJEX1VSTCA9ICdodHRwczovL3d3dy5oaXN0Lm9yZy5pbC9jYXJkL2JhbGFuY2VBbmRVc2VzJztcblxuaW50ZXJmYWNlIFNjcmFwZWRUcmFuc2FjdGlvbiB7XG4gIGRhdGU6IHN0cmluZztcbiAgZGVzY3JpcHRpb246IHN0cmluZztcbiAgdHlwZTogc3RyaW5nO1xuICBjaGFyZ2VkQW1vdW50OiBzdHJpbmc7XG4gIGlkZW50aWZpZXI6IHN0cmluZztcbn1cblxuZnVuY3Rpb24gZ2V0QW1vdW50RGF0YShhbW91bnRTdHI6IHN0cmluZykge1xuICBjb25zdCBhbW91bnRTdHJDbG4gPSBhbW91bnRTdHIucmVwbGFjZSgnLCcsICcnKTtcbiAgbGV0IGN1cnJlbmN5OiBzdHJpbmcgfCBudWxsID0gbnVsbDtcbiAgbGV0IGFtb3VudDogbnVtYmVyIHwgbnVsbCA9IG51bGw7XG4gIGlmIChhbW91bnRTdHJDbG4uaW5jbHVkZXMoU0hFS0VMX0NVUlJFTkNZX1NZTUJPTCkpIHtcbiAgICBhbW91bnQgPSBwYXJzZUZsb2F0KGFtb3VudFN0ckNsbi5yZXBsYWNlKFNIRUtFTF9DVVJSRU5DWV9TWU1CT0wsICcnKSk7XG4gICAgY3VycmVuY3kgPSBTSEVLRUxfQ1VSUkVOQ1k7XG4gIH0gZWxzZSBpZiAoYW1vdW50U3RyQ2xuLmluY2x1ZGVzKERPTExBUl9DVVJSRU5DWV9TWU1CT0wpKSB7XG4gICAgYW1vdW50ID0gcGFyc2VGbG9hdChhbW91bnRTdHJDbG4ucmVwbGFjZShET0xMQVJfQ1VSUkVOQ1lfU1lNQk9MLCAnJykpO1xuICAgIGN1cnJlbmN5ID0gRE9MTEFSX0NVUlJFTkNZO1xuICB9IGVsc2UgaWYgKGFtb3VudFN0ckNsbi5pbmNsdWRlcyhFVVJPX0NVUlJFTkNZX1NZTUJPTCkpIHtcbiAgICBhbW91bnQgPSBwYXJzZUZsb2F0KGFtb3VudFN0ckNsbi5yZXBsYWNlKEVVUk9fQ1VSUkVOQ1lfU1lNQk9MLCAnJykpO1xuICAgIGN1cnJlbmN5ID0gRVVST19DVVJSRU5DWTtcbiAgfSBlbHNlIHtcbiAgICBjb25zdCBwYXJ0cyA9IGFtb3VudFN0ckNsbi5zcGxpdCgnICcpO1xuICAgIFtjdXJyZW5jeV0gPSBwYXJ0cztcbiAgICBhbW91bnQgPSBwYXJzZUZsb2F0KHBhcnRzWzFdKTtcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgYW1vdW50LFxuICAgIGN1cnJlbmN5LFxuICB9O1xufVxuXG5mdW5jdGlvbiBjb252ZXJ0VHJhbnNhY3Rpb25zKHR4bnM6IFNjcmFwZWRUcmFuc2FjdGlvbltdKTogVHJhbnNhY3Rpb25bXSB7XG4gIGRlYnVnKGBjb252ZXJ0ICR7dHhucy5sZW5ndGh9IHJhdyB0cmFuc2FjdGlvbnMgdG8gb2ZmaWNpYWwgVHJhbnNhY3Rpb24gc3RydWN0dXJlYCk7XG4gIHJldHVybiB0eG5zLm1hcCh0eG4gPT4ge1xuICAgIGNvbnN0IGNoYXJnZWRBbW91bnRUdXBsZSA9IGdldEFtb3VudERhdGEodHhuLmNoYXJnZWRBbW91bnQgfHwgJycpO1xuICAgIGNvbnN0IHR4blByb2Nlc3NlZERhdGUgPSBtb21lbnQodHhuLmRhdGUsIERBVEVfRk9STUFUKTtcblxuICAgIGNvbnN0IHJlc3VsdDogVHJhbnNhY3Rpb24gPSB7XG4gICAgICB0eXBlOiBUcmFuc2FjdGlvblR5cGVzLk5vcm1hbCxcbiAgICAgIHN0YXR1czogVHJhbnNhY3Rpb25TdGF0dXNlcy5Db21wbGV0ZWQsXG4gICAgICBkYXRlOiB0eG5Qcm9jZXNzZWREYXRlLnRvSVNPU3RyaW5nKCksXG4gICAgICBwcm9jZXNzZWREYXRlOiB0eG5Qcm9jZXNzZWREYXRlLnRvSVNPU3RyaW5nKCksXG4gICAgICBvcmlnaW5hbEFtb3VudDogY2hhcmdlZEFtb3VudFR1cGxlLmFtb3VudCxcbiAgICAgIG9yaWdpbmFsQ3VycmVuY3k6IGNoYXJnZWRBbW91bnRUdXBsZS5jdXJyZW5jeSxcbiAgICAgIGNoYXJnZWRBbW91bnQ6IGNoYXJnZWRBbW91bnRUdXBsZS5hbW91bnQsXG4gICAgICBjaGFyZ2VkQ3VycmVuY3k6IGNoYXJnZWRBbW91bnRUdXBsZS5jdXJyZW5jeSxcbiAgICAgIGRlc2NyaXB0aW9uOiB0eG4uZGVzY3JpcHRpb24gfHwgJycsXG4gICAgICBtZW1vOiAnJyxcbiAgICAgIGlkZW50aWZpZXI6IHR4bi5pZGVudGlmaWVyLFxuICAgIH07XG5cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9KTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gZmV0Y2hUcmFuc2FjdGlvbnMocGFnZTogUGFnZSwgb3B0aW9uczogU2NyYXBlck9wdGlvbnMpIHtcbiAgYXdhaXQgcGFnZS5nb3RvKENBUkRfVVJMKTtcbiAgYXdhaXQgd2FpdFVudGlsRWxlbWVudEZvdW5kKHBhZ2UsICcucmVhY3QtbG9hZGluZy5oaWRlJywgZmFsc2UpO1xuICBjb25zdCBkZWZhdWx0U3RhcnRNb21lbnQgPSBtb21lbnQoKS5zdWJ0cmFjdCgxLCAneWVhcnMnKTtcbiAgY29uc3Qgc3RhcnREYXRlID0gb3B0aW9ucy5zdGFydERhdGUgfHwgZGVmYXVsdFN0YXJ0TW9tZW50LnRvRGF0ZSgpO1xuICBjb25zdCBzdGFydE1vbWVudCA9IG1vbWVudC5tYXgoZGVmYXVsdFN0YXJ0TW9tZW50LCBtb21lbnQoc3RhcnREYXRlKSk7XG5cbiAgY29uc3QgYWNjb3VudE51bWJlciA9IGF3YWl0IHBhZ2VFdmFsKHBhZ2UsICcud2FsbGV0LWRldGFpbHMgZGl2Om50aC1vZi10eXBlKDIpJywgbnVsbCwgZWxlbWVudCA9PiB7XG4gICAgcmV0dXJuIChlbGVtZW50IGFzIGFueSkuaW5uZXJUZXh0LnJlcGxhY2UoJ9ee16HXpNeoINeb16jXmNeZ16EgJywgJycpO1xuICB9KTtcblxuICBjb25zdCBiYWxhbmNlID0gYXdhaXQgcGFnZUV2YWwocGFnZSwgJy53YWxsZXQtZGV0YWlscyBkaXY6bnRoLW9mLXR5cGUoNCkgPiBzcGFuOm50aC1vZi10eXBlKDIpJywgbnVsbCwgZWxlbWVudCA9PiB7XG4gICAgcmV0dXJuIChlbGVtZW50IGFzIGFueSkuaW5uZXJUZXh0O1xuICB9KTtcblxuICBkZWJ1ZygnZmV0Y2ggcmF3IHRyYW5zYWN0aW9ucyBmcm9tIHBhZ2UnKTtcblxuICBjb25zdCByYXdUcmFuc2FjdGlvbnM6IChTY3JhcGVkVHJhbnNhY3Rpb24gfCBudWxsKVtdID0gYXdhaXQgcGFnZUV2YWxBbGw8KFNjcmFwZWRUcmFuc2FjdGlvbiB8IG51bGwpW10+KFxuICAgIHBhZ2UsXG4gICAgJy50cmFuc2FjdGlvbi1jb250YWluZXIsIC50cmFuc2FjdGlvbi1jb21wb25lbnQtY29udGFpbmVyJyxcbiAgICBbXSxcbiAgICBpdGVtcyA9PiB7XG4gICAgICByZXR1cm4gaXRlbXMubWFwKGVsID0+IHtcbiAgICAgICAgY29uc3QgY29sdW1uczogTm9kZUxpc3RPZjxIVE1MU3BhbkVsZW1lbnQ+ID0gZWwucXVlcnlTZWxlY3RvckFsbCgnLnRyYW5zYWN0aW9uLWl0ZW0gPiBzcGFuJyk7XG4gICAgICAgIGlmIChjb2x1bW5zLmxlbmd0aCA9PT0gNykge1xuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBkYXRlOiBjb2x1bW5zWzBdLmlubmVyVGV4dCxcbiAgICAgICAgICAgIGlkZW50aWZpZXI6IGNvbHVtbnNbMV0uaW5uZXJUZXh0LFxuICAgICAgICAgICAgZGVzY3JpcHRpb246IGNvbHVtbnNbM10uaW5uZXJUZXh0LFxuICAgICAgICAgICAgdHlwZTogY29sdW1uc1s1XS5pbm5lclRleHQsXG4gICAgICAgICAgICBjaGFyZ2VkQW1vdW50OiBjb2x1bW5zWzZdLmlubmVyVGV4dCxcbiAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfSk7XG4gICAgfSxcbiAgKTtcbiAgZGVidWcoYGZldGNoZWQgJHtyYXdUcmFuc2FjdGlvbnMubGVuZ3RofSByYXcgdHJhbnNhY3Rpb25zIGZyb20gcGFnZWApO1xuXG4gIGNvbnN0IGFjY291bnRUcmFuc2FjdGlvbnMgPSBjb252ZXJ0VHJhbnNhY3Rpb25zKHJhd1RyYW5zYWN0aW9ucy5maWx0ZXIoaXRlbSA9PiAhIWl0ZW0pIGFzIFNjcmFwZWRUcmFuc2FjdGlvbltdKTtcblxuICBkZWJ1ZygnZmlsZXIgb3V0IG9sZCB0cmFuc2FjdGlvbnMnKTtcbiAgY29uc3QgdHhucyA9XG4gICAgKG9wdGlvbnMub3V0cHV0RGF0YT8uZW5hYmxlVHJhbnNhY3Rpb25zRmlsdGVyQnlEYXRlID8/IHRydWUpXG4gICAgICA/IGZpbHRlck9sZFRyYW5zYWN0aW9ucyhhY2NvdW50VHJhbnNhY3Rpb25zLCBzdGFydE1vbWVudCwgZmFsc2UpXG4gICAgICA6IGFjY291bnRUcmFuc2FjdGlvbnM7XG4gIGRlYnVnKFxuICAgIGBmb3VuZCAke3R4bnMubGVuZ3RofSB2YWxpZCB0cmFuc2FjdGlvbnMgb3V0IG9mICR7YWNjb3VudFRyYW5zYWN0aW9ucy5sZW5ndGh9IHRyYW5zYWN0aW9ucyBmb3IgYWNjb3VudCBlbmRpbmcgd2l0aCAke2FjY291bnROdW1iZXIuc3Vic3RyaW5nKGFjY291bnROdW1iZXIubGVuZ3RoIC0gMil9YCxcbiAgKTtcblxuICByZXR1cm4ge1xuICAgIGFjY291bnROdW1iZXIsXG4gICAgYmFsYW5jZTogZ2V0QW1vdW50RGF0YShiYWxhbmNlKS5hbW91bnQsXG4gICAgdHhucyxcbiAgfTtcbn1cblxuZnVuY3Rpb24gZ2V0UG9zc2libGVMb2dpblJlc3VsdHMoKTogUG9zc2libGVMb2dpblJlc3VsdHMge1xuICBjb25zdCB1cmxzOiBQb3NzaWJsZUxvZ2luUmVzdWx0cyA9IHt9O1xuICB1cmxzW0xvZ2luUmVzdWx0cy5TdWNjZXNzXSA9IFtTVUNDRVNTX1VSTF07XG4gIHVybHNbTG9naW5SZXN1bHRzLkNoYW5nZVBhc3N3b3JkXSA9IFtdOyAvLyBUT0RPXG4gIHVybHNbTG9naW5SZXN1bHRzLkludmFsaWRQYXNzd29yZF0gPSBbXTsgLy8gVE9ET1xuICB1cmxzW0xvZ2luUmVzdWx0cy5Vbmtub3duRXJyb3JdID0gW107IC8vIFRPRE9cbiAgcmV0dXJuIHVybHM7XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZUxvZ2luRmllbGRzKGNyZWRlbnRpYWxzOiBTY3JhcGVyU3BlY2lmaWNDcmVkZW50aWFscykge1xuICByZXR1cm4gW1xuICAgIHsgc2VsZWN0b3I6ICcjbG9naW5JZCcsIHZhbHVlOiBjcmVkZW50aWFscy5pZCB9LFxuICAgIHsgc2VsZWN0b3I6ICcjbG9naW5QYXNzd29yZCcsIHZhbHVlOiBjcmVkZW50aWFscy5wYXNzd29yZCB9LFxuICBdO1xufVxuXG50eXBlIFNjcmFwZXJTcGVjaWZpY0NyZWRlbnRpYWxzID0geyBpZDogc3RyaW5nOyBwYXNzd29yZDogc3RyaW5nIH07XG5cbmNsYXNzIEJleWFoYWRCaXNodmlsaGFTY3JhcGVyIGV4dGVuZHMgQmFzZVNjcmFwZXJXaXRoQnJvd3NlcjxTY3JhcGVyU3BlY2lmaWNDcmVkZW50aWFscz4ge1xuICBwcm90ZWN0ZWQgZ2V0Vmlld1BvcnQoKTogeyB3aWR0aDogbnVtYmVyOyBoZWlnaHQ6IG51bWJlciB9IHtcbiAgICByZXR1cm4ge1xuICAgICAgd2lkdGg6IDE1MDAsXG4gICAgICBoZWlnaHQ6IDgwMCxcbiAgICB9O1xuICB9XG5cbiAgZ2V0TG9naW5PcHRpb25zKGNyZWRlbnRpYWxzOiBTY3JhcGVyU3BlY2lmaWNDcmVkZW50aWFscykge1xuICAgIHJldHVybiB7XG4gICAgICBsb2dpblVybDogTE9HSU5fVVJMLFxuICAgICAgZmllbGRzOiBjcmVhdGVMb2dpbkZpZWxkcyhjcmVkZW50aWFscyksXG4gICAgICBzdWJtaXRCdXR0b25TZWxlY3RvcjogYXN5bmMgKCkgPT4ge1xuICAgICAgICBjb25zdCBidXR0b24gPSBhd2FpdCB0aGlzLnBhZ2UuJCgneHBhdGgvL2J1dHRvbltjb250YWlucyguLCBcIteU16rXl9eR16hcIildJyk7XG4gICAgICAgIGlmIChidXR0b24pIHtcbiAgICAgICAgICBhd2FpdCBidXR0b24uY2xpY2soKTtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIHBvc3NpYmxlUmVzdWx0czogZ2V0UG9zc2libGVMb2dpblJlc3VsdHMoKSxcbiAgICB9O1xuICB9XG5cbiAgYXN5bmMgZmV0Y2hEYXRhKCkge1xuICAgIGNvbnN0IGFjY291bnQgPSBhd2FpdCBmZXRjaFRyYW5zYWN0aW9ucyh0aGlzLnBhZ2UsIHRoaXMub3B0aW9ucyk7XG4gICAgcmV0dXJuIHtcbiAgICAgIHN1Y2Nlc3M6IHRydWUsXG4gICAgICBhY2NvdW50czogW2FjY291bnRdLFxuICAgIH07XG4gIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgQmV5YWhhZEJpc2h2aWxoYVNjcmFwZXI7XG4iXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFBLElBQUFBLE9BQUEsR0FBQUMsc0JBQUEsQ0FBQUMsT0FBQTtBQUVBLElBQUFDLFVBQUEsR0FBQUQsT0FBQTtBQVFBLElBQUFFLE1BQUEsR0FBQUYsT0FBQTtBQUNBLElBQUFHLHFCQUFBLEdBQUFILE9BQUE7QUFDQSxJQUFBSSxhQUFBLEdBQUFKLE9BQUE7QUFDQSxJQUFBSyxjQUFBLEdBQUFMLE9BQUE7QUFDQSxJQUFBTSx1QkFBQSxHQUFBTixPQUFBO0FBQThHLFNBQUFELHVCQUFBUSxDQUFBLFdBQUFBLENBQUEsSUFBQUEsQ0FBQSxDQUFBQyxVQUFBLEdBQUFELENBQUEsS0FBQUUsT0FBQSxFQUFBRixDQUFBO0FBRzlHLE1BQU1HLEtBQUssR0FBRyxJQUFBQyxlQUFRLEVBQUMsa0JBQWtCLENBQUM7QUFFMUMsTUFBTUMsV0FBVyxHQUFHLFVBQVU7QUFDOUIsTUFBTUMsU0FBUyxHQUFHLCtCQUErQjtBQUNqRCxNQUFNQyxXQUFXLEdBQUcsMEJBQTBCO0FBQzlDLE1BQU1DLFFBQVEsR0FBRyw2Q0FBNkM7QUFVOUQsU0FBU0MsYUFBYUEsQ0FBQ0MsU0FBaUIsRUFBRTtFQUN4QyxNQUFNQyxZQUFZLEdBQUdELFNBQVMsQ0FBQ0UsT0FBTyxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUM7RUFDL0MsSUFBSUMsUUFBdUIsR0FBRyxJQUFJO0VBQ2xDLElBQUlDLE1BQXFCLEdBQUcsSUFBSTtFQUNoQyxJQUFJSCxZQUFZLENBQUNJLFFBQVEsQ0FBQ0MsaUNBQXNCLENBQUMsRUFBRTtJQUNqREYsTUFBTSxHQUFHRyxVQUFVLENBQUNOLFlBQVksQ0FBQ0MsT0FBTyxDQUFDSSxpQ0FBc0IsRUFBRSxFQUFFLENBQUMsQ0FBQztJQUNyRUgs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