israeli-bank-scrapers-core
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,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfbW9tZW50IiwiX2ludGVyb3BSZXF1aXJlRGVmYXVsdCIsInJlcXVpcmUiLCJfY29uc3RhbnRzIiwiX2RlYnVnIiwiX2VsZW1lbnRzSW50ZXJhY3Rpb25zIiwiX3RyYW5zYWN0aW9ucyIsIl90cmFuc2FjdGlvbnMyIiwiX2Jhc2VTY3JhcGVyV2l0aEJyb3dzZXIiLCJlIiwiX19lc01vZHVsZSIsImRlZmF1bHQiLCJkZWJ1ZyIsImdldERlYnVnIiwiREFURV9GT1JNQVQiLCJMT0dJTl9VUkwiLCJTVUNDRVNTX1VSTCIsIkNBUkRfVVJMIiwiZ2V0QW1vdW50RGF0YSIsImFtb3VudFN0ciIsImFtb3VudFN0ckNsbiIsInJlcGxhY2UiLCJjdXJyZW5jeSIsImFtb3VudCIsImluY2x1ZGVzIiwiU0hFS0VMX0NVUlJFTkNZX1NZTUJPTCIsInBhcnNlRmxvYXQiLCJTSEVLRUxfQ1VSUkVOQ1kiLCJET0xMQVJfQ1VSUkVOQ1lfU1lNQk9MIiwiRE9MTEFSX0NVUlJFTkNZIiwiRVVST19DVVJSRU5DWV9TWU1CT0wiLCJFVVJPX0NVUlJFTkNZIiwicGFydHMiLCJzcGxpdCIsImNvbnZlcnRUcmFuc2FjdGlvbnMiLCJ0eG5zIiwibGVuZ3RoIiwibWFwIiwidHhuIiwiY2hhcmdlZEFtb3VudFR1cGxlIiwiY2hhcmdlZEFtb3VudCIsInR4blByb2Nlc3NlZERhdGUiLCJtb21lbnQiLCJkYXRlIiwicmVzdWx0IiwidHlwZSIsIlRyYW5zYWN0aW9uVHlwZXMiLCJOb3JtYWwiLCJzdGF0dXMiLCJUcmFuc2FjdGlvblN0YXR1c2VzIiwiQ29tcGxldGVkIiwidG9JU09TdHJpbmciLCJwcm9jZXNzZWREYXRlIiwib3JpZ2luYWxBbW91bnQiLCJvcmlnaW5hbEN1cnJlbmN5IiwiY2hhcmdlZEN1cnJlbmN5IiwiZGVzY3JpcHRpb24iLCJtZW1vIiwiaWRlbnRpZmllciIsImZldGNoVHJhbnNhY3Rpb25zIiwicGFnZSIsIm9wdGlvbnMiLCJnb3RvIiwid2FpdFVudGlsRWxlbWVudEZvdW5kIiwiZGVmYXVsdFN0YXJ0TW9tZW50Iiwic3VidHJhY3QiLCJzdGFydERhdGUiLCJ0b0RhdGUiLCJzdGFydE1vbWVudCIsIm1heCIsImFjY291bnROdW1iZXIiLCJwYWdlRXZhbCIsImVsZW1lbnQiLCJpbm5lclRleHQiLCJiYWxhbmNlIiwicmF3VHJhbnNhY3Rpb25zIiwicGFnZUV2YWxBbGwiLCJpdGVtcyIsImVsIiwiY29sdW1ucyIsInF1ZXJ5U2VsZWN0b3JBbGwiLCJhY2NvdW50VHJhbnNhY3Rpb25zIiwiZmlsdGVyIiwiaXRlbSIsIm91dHB1dERhdGEiLCJlbmFibGVUcmFuc2FjdGlvbnNGaWx0ZXJCeURhdGUiLCJmaWx0ZXJPbGRUcmFuc2FjdGlvbnMiLCJzdWJzdHJpbmciLCJnZXRQb3NzaWJsZUxvZ2luUmVzdWx0cyIsInVybHMiLCJMb2dpblJlc3VsdHMiLCJTdWNjZXNzIiwiQ2hhbmdlUGFzc3dvcmQiLCJJbnZhbGlkUGFzc3dvcmQiLCJVbmtub3duRXJyb3IiLCJjcmVhdGVMb2dpbkZpZWxkcyIsImNyZWRlbnRpYWxzIiwic2VsZWN0b3IiLCJ2YWx1ZSIsImlkIiwicGFzc3dvcmQiLCJCZXlhaGFkQmlzaHZpbGhhU2NyYXBlciIsIkJhc2VTY3JhcGVyV2l0aEJyb3dzZXIiLCJnZXRWaWV3UG9ydCIsIndpZHRoIiwiaGVpZ2h0IiwiZ2V0TG9naW5PcHRpb25zIiwibG9naW5VcmwiLCJmaWVsZHMiLCJzdWJtaXRCdXR0b25TZWxlY3RvciIsImJ1dHRvbiIsIiQiLCJjbGljayIsInBvc3NpYmxlUmVzdWx0cyIsImZldGNoRGF0YSIsImFjY291bnQiLCJzdWNjZXNzIiwiYWNjb3VudHMiLCJfZGVmYXVsdCIsImV4cG9ydHMiXSwic291cmNlcyI6WyIuLi8uLi9zcmMvc2NyYXBlcnMvYmV5YWhhZC1iaXNodmlsaGEudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IG1vbWVudCBmcm9tICdtb21lbnQnO1xuaW1wb3J0IHsgdHlwZSBQYWdlIH0gZnJvbSAncHVwcGV0ZWVyLWNvcmUnO1xuaW1wb3J0IHtcbiAgRE9MTEFSX0NVUlJFTkNZLFxuICBET0xMQVJfQ1VSUkVOQ1lfU1lNQk9MLFxuICBFVVJPX0NVUlJFTkNZLFxuICBFVVJPX0NVUlJFTkNZX1NZTUJPTCxcbiAgU0hFS0VMX0NVUlJFTkNZLFxuICBTSEVLRUxfQ1VSUkVOQ1lfU1lNQk9MLFxufSBmcm9tICcuLi9jb25zdGFudHMnO1xuaW1wb3J0IHsgZ2V0RGVidWcgfSBmcm9tICcuLi9oZWxwZXJzL2RlYnVnJztcbmltcG9ydCB7IHBhZ2VFdmFsLCBwYWdlRXZhbEFsbCwgd2FpdFVudGlsRWxlbWVudEZvdW5kIH0gZnJvbSAnLi4vaGVscGVycy9lbGVtZW50cy1pbnRlcmFjdGlvbnMnO1xuaW1wb3J0IHsgZmlsdGVyT2xkVHJhbnNhY3Rpb25zIH0gZnJvbSAnLi4vaGVscGVycy90cmFuc2FjdGlvbnMnO1xuaW1wb3J0IHsgVHJhbnNhY3Rpb25TdGF0dXNlcywgVHJhbnNhY3Rpb25UeXBlcywgdHlwZSBUcmFuc2FjdGlvbiB9IGZyb20gJy4uL3RyYW5zYWN0aW9ucyc7XG5pbXBvcnQgeyBCYXNlU2NyYXBlcldpdGhCcm93c2VyLCBMb2dpblJlc3VsdHMsIHR5cGUgUG9zc2libGVMb2dpblJlc3VsdHMgfSBmcm9tICcuL2Jhc2Utc2NyYXBlci13aXRoLWJyb3dzZXInO1xuaW1wb3J0IHsgdHlwZSBTY3JhcGVyT3B0aW9ucyB9IGZyb20gJy4vaW50ZXJmYWNlJztcblxuY29uc3QgZGVidWcgPSBnZXREZWJ1ZygnYmV5YWhhZEJpc2h2aWxoYScpO1xuXG5jb25zdCBEQVRFX0ZPUk1BVCA9ICdERC9NTS9ZWSc7XG5jb25zdCBMT0dJTl9VUkwgPSAnaHR0cHM6Ly93d3cuaGlzdC5vcmcuaWwvbG9naW4nO1xuY29uc3QgU1VDQ0VTU19VUkwgPSAnaHR0cHM6Ly93d3cuaGlzdC5vcmcuaWwvJztcbmNvbnN0IENBUkRfVVJMID0gJ2h0dHBzOi8vd3d3Lmhpc3Qub3JnLmlsL2NhcmQvYmFsYW5jZUFuZFVzZXMnO1xuXG5pbnRlcmZhY2UgU2NyYXBlZFRyYW5zYWN0aW9uIHtcbiAgZGF0ZTogc3RyaW5nO1xuICBkZXNjcmlwdGlvbjogc3RyaW5nO1xuICB0eXBlOiBzdHJpbmc7XG4gIGNoYXJnZWRBbW91bnQ6IHN0cmluZztcbiAgaWRlbnRpZmllcjogc3RyaW5nO1xufVxuXG5mdW5jdGlvbiBnZXRBbW91bnREYXRhKGFtb3VudFN0cjogc3RyaW5nKSB7XG4gIGNvbnN0IGFtb3VudFN0ckNsbiA9IGFtb3VudFN0ci5yZXBsYWNlKCcsJywgJycpO1xuICBsZXQgY3VycmVuY3k6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuICBsZXQgYW1vdW50OiBudW1iZXIgfCBudWxsID0gbnVsbDtcbiAgaWYgKGFtb3VudFN0ckNsbi5pbmNsdWRlcyhTSEVLRUxfQ1VSUkVOQ1lfU1lNQk9MKSkge1xuICAgIGFtb3VudCA9IHBhcnNlRmxvYXQoYW1vdW50U3RyQ2xuLnJlcGxhY2UoU0hFS0VMX0NVUlJFTkNZX1NZTUJPTCwgJycpKTtcbiAgICBjdXJyZW5jeSA9IFNIRUtFTF9DVVJSRU5DWTtcbiAgfSBlbHNlIGlmIChhbW91bnRTdHJDbG4uaW5jbHVkZXMoRE9MTEFSX0NVUlJFTkNZX1NZTUJPTCkpIHtcbiAgICBhbW91bnQgPSBwYXJzZUZsb2F0KGFtb3VudFN0ckNsbi5yZXBsYWNlKERPTExBUl9DVVJSRU5DWV9TWU1CT0wsICcnKSk7XG4gICAgY3VycmVuY3kgPSBET0xMQVJfQ1VSUkVOQ1k7XG4gIH0gZWxzZSBpZiAoYW1vdW50U3RyQ2xuLmluY2x1ZGVzKEVVUk9fQ1VSUkVOQ1lfU1lNQk9MKSkge1xuICAgIGFtb3VudCA9IHBhcnNlRmxvYXQoYW1vdW50U3RyQ2xuLnJlcGxhY2UoRVVST19DVVJSRU5DWV9TWU1CT0wsICcnKSk7XG4gICAgY3VycmVuY3kgPSBFVVJPX0NVUlJFTkNZO1xuICB9IGVsc2Uge1xuICAgIGNvbnN0IHBhcnRzID0gYW1vdW50U3RyQ2xuLnNwbGl0KCcgJyk7XG4gICAgW2N1cnJlbmN5XSA9IHBhcnRzO1xuICAgIGFtb3VudCA9IHBhcnNlRmxvYXQocGFydHNbMV0pO1xuICB9XG5cbiAgcmV0dXJuIHtcbiAgICBhbW91bnQsXG4gICAgY3VycmVuY3ksXG4gIH07XG59XG5cbmZ1bmN0aW9uIGNvbnZlcnRUcmFuc2FjdGlvbnModHhuczogU2NyYXBlZFRyYW5zYWN0aW9uW10pOiBUcmFuc2FjdGlvbltdIHtcbiAgZGVidWcoYGNvbnZlcnQgJHt0eG5zLmxlbmd0aH0gcmF3IHRyYW5zYWN0aW9ucyB0byBvZmZpY2lhbCBUcmFuc2FjdGlvbiBzdHJ1Y3R1cmVgKTtcbiAgcmV0dXJuIHR4bnMubWFwKHR4biA9PiB7XG4gICAgY29uc3QgY2hhcmdlZEFtb3VudFR1cGxlID0gZ2V0QW1vdW50RGF0YSh0eG4uY2hhcmdlZEFtb3VudCB8fCAnJyk7XG4gICAgY29uc3QgdHhuUHJvY2Vzc2VkRGF0ZSA9IG1vbWVudCh0eG4uZGF0ZSwgREFURV9GT1JNQVQpO1xuXG4gICAgY29uc3QgcmVzdWx0OiBUcmFuc2FjdGlvbiA9IHtcbiAgICAgIHR5cGU6IFRyYW5zYWN0aW9uVHlwZXMuTm9ybWFsLFxuICAgICAgc3RhdHVzOiBUcmFuc2FjdGlvblN0YXR1c2VzLkNvbXBsZXRlZCxcbiAgICAgIGRhdGU6IHR4blByb2Nlc3NlZERhdGUudG9JU09TdHJpbmcoKSxcbiAgICAgIHByb2Nlc3NlZERhdGU6IHR4blByb2Nlc3NlZERhdGUudG9JU09TdHJpbmcoKSxcbiAgICAgIG9yaWdpbmFsQW1vdW50OiBjaGFyZ2VkQW1vdW50VHVwbGUuYW1vdW50LFxuICAgICAgb3JpZ2luYWxDdXJyZW5jeTogY2hhcmdlZEFtb3VudFR1cGxlLmN1cnJlbmN5LFxuICAgICAgY2hhcmdlZEFtb3VudDogY2hhcmdlZEFtb3VudFR1cGxlLmFtb3VudCxcbiAgICAgIGNoYXJnZWRDdXJyZW5jeTogY2hhcmdlZEFtb3VudFR1cGxlLmN1cnJlbmN5LFxuICAgICAgZGVzY3JpcHRpb246IHR4bi5kZXNjcmlwdGlvbiB8fCAnJyxcbiAgICAgIG1lbW86ICcnLFxuICAgICAgaWRlbnRpZmllcjogdHhuLmlkZW50aWZpZXIsXG4gICAgfTtcblxuICAgIHJldHVybiByZXN1bHQ7XG4gIH0pO1xufVxuXG5hc3luYyBmdW5jdGlvbiBmZXRjaFRyYW5zYWN0aW9ucyhwYWdlOiBQYWdlLCBvcHRpb25zOiBTY3JhcGVyT3B0aW9ucykge1xuICBhd2FpdCBwYWdlLmdvdG8oQ0FSRF9VUkwpO1xuICBhd2FpdCB3YWl0VW50aWxFbGVtZW50Rm91bmQocGFnZSwgJy5yZWFjdC1sb2FkaW5nLmhpZGUnLCBmYWxzZSk7XG4gIGNvbnN0IGRlZmF1bHRTdGFydE1vbWVudCA9IG1vbWVudCgpLnN1YnRyYWN0KDEsICd5ZWFycycpO1xuICBjb25zdCBzdGFydERhdGUgPSBvcHRpb25zLnN0YXJ0RGF0ZSB8fCBkZWZhdWx0U3RhcnRNb21lbnQudG9EYXRlKCk7XG4gIGNvbnN0IHN0YXJ0TW9tZW50ID0gbW9tZW50Lm1heChkZWZhdWx0U3RhcnRNb21lbnQsIG1vbWVudChzdGFydERhdGUpKTtcblxuICBjb25zdCBhY2NvdW50TnVtYmVyID0gYXdhaXQgcGFnZUV2YWwocGFnZSwgJy53YWxsZXQtZGV0YWlscyBkaXY6bnRoLW9mLXR5cGUoMiknLCBudWxsLCBlbGVtZW50ID0+IHtcbiAgICByZXR1cm4gKGVsZW1lbnQgYXMgYW55KS5pbm5lclRleHQucmVwbGFjZSgn157Xodek16gg15vXqNeY15nXoSAnLCAnJyk7XG4gIH0pO1xuXG4gIGNvbnN0IGJhbGFuY2UgPSBhd2FpdCBwYWdlRXZhbChwYWdlLCAnLndhbGxldC1kZXRhaWxzIGRpdjpudGgtb2YtdHlwZSg0KSA+IHNwYW46bnRoLW9mLXR5cGUoMiknLCBudWxsLCBlbGVtZW50ID0+IHtcbiAgICByZXR1cm4gKGVsZW1lbnQgYXMgYW55KS5pbm5lclRleHQ7XG4gIH0pO1xuXG4gIGRlYnVnKCdmZXRjaCByYXcgdHJhbnNhY3Rpb25zIGZyb20gcGFnZScpO1xuXG4gIGNvbnN0IHJhd1RyYW5zYWN0aW9uczogKFNjcmFwZWRUcmFuc2FjdGlvbiB8IG51bGwpW10gPSBhd2FpdCBwYWdlRXZhbEFsbDwoU2NyYXBlZFRyYW5zYWN0aW9uIHwgbnVsbClbXT4oXG4gICAgcGFnZSxcbiAgICAnLnRyYW5zYWN0aW9uLWNvbnRhaW5lciwgLnRyYW5zYWN0aW9uLWNvbXBvbmVudC1jb250YWluZXInLFxuICAgIFtdLFxuICAgIGl0ZW1zID0+IHtcbiAgICAgIHJldHVybiBpdGVtcy5tYXAoZWwgPT4ge1xuICAgICAgICBjb25zdCBjb2x1bW5zOiBOb2RlTGlzdE9mPEhUTUxTcGFuRWxlbWVudD4gPSBlbC5xdWVyeVNlbGVjdG9yQWxsKCcudHJhbnNhY3Rpb24taXRlbSA+IHNwYW4nKTtcbiAgICAgICAgaWYgKGNvbHVtbnMubGVuZ3RoID09PSA3KSB7XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGRhdGU6IGNvbHVtbnNbMF0uaW5uZXJUZXh0LFxuICAgICAgICAgICAgaWRlbnRpZmllcjogY29sdW1uc1sxXS5pbm5lclRleHQsXG4gICAgICAgICAgICBkZXNjcmlwdGlvbjogY29sdW1uc1szXS5pbm5lclRleHQsXG4gICAgICAgICAgICB0eXBlOiBjb2x1bW5zWzVdLmlubmVyVGV4dCxcbiAgICAgICAgICAgIGNoYXJnZWRBbW91bnQ6IGNvbHVtbnNbNl0uaW5uZXJUZXh0LFxuICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9KTtcbiAgICB9LFxuICApO1xuICBkZWJ1ZyhgZmV0Y2hlZCAke3Jhd1RyYW5zYWN0aW9ucy5sZW5ndGh9IHJhdyB0cmFuc2FjdGlvbnMgZnJvbSBwYWdlYCk7XG5cbiAgY29uc3QgYWNjb3VudFRyYW5zYWN0aW9ucyA9IGNvbnZlcnRUcmFuc2FjdGlvbnMocmF3VHJhbnNhY3Rpb25zLmZpbHRlcihpdGVtID0+ICEhaXRlbSkgYXMgU2NyYXBlZFRyYW5zYWN0aW9uW10pO1xuXG4gIGRlYnVnKCdmaWxlciBvdXQgb2xkIHRyYW5zYWN0aW9ucycpO1xuICBjb25zdCB0eG5zID1cbiAgICAob3B0aW9ucy5vdXRwdXREYXRhPy5lbmFibGVUcmFuc2FjdGlvbnNGaWx0ZXJCeURhdGUgPz8gdHJ1ZSlcbiAgICAgID8gZmlsdGVyT2xkVHJhbnNhY3Rpb25zKGFjY291bnRUcmFuc2FjdGlvbnMsIHN0YXJ0TW9tZW50LCBmYWxzZSlcbiAgICAgIDogYWNjb3VudFRyYW5zYWN0aW9ucztcbiAgZGVidWcoXG4gICAgYGZvdW5kICR7dHhucy5sZW5ndGh9IHZhbGlkIHRyYW5zYWN0aW9ucyBvdXQgb2YgJHthY2NvdW50VHJhbnNhY3Rpb25zLmxlbmd0aH0gdHJhbnNhY3Rpb25zIGZvciBhY2NvdW50IGVuZGluZyB3aXRoICR7YWNjb3VudE51bWJlci5zdWJzdHJpbmcoYWNjb3VudE51bWJlci5sZW5ndGggLSAyKX1gLFxuICApO1xuXG4gIHJldHVybiB7XG4gICAgYWNjb3VudE51bWJlcixcbiAgICBiYWxhbmNlOiBnZXRBbW91bnREYXRhKGJhbGFuY2UpLmFtb3VudCxcbiAgICB0eG5zLFxuICB9O1xufVxuXG5mdW5jdGlvbiBnZXRQb3NzaWJsZUxvZ2luUmVzdWx0cygpOiBQb3NzaWJsZUxvZ2luUmVzdWx0cyB7XG4gIGNvbnN0IHVybHM6IFBvc3NpYmxlTG9naW5SZXN1bHRzID0ge307XG4gIHVybHNbTG9naW5SZXN1bHRzLlN1Y2Nlc3NdID0gW1NVQ0NFU1NfVVJMXTtcbiAgdXJsc1tMb2dpblJlc3VsdHMuQ2hhbmdlUGFzc3dvcmRdID0gW107IC8vIFRPRE9cbiAgdXJsc1tMb2dpblJlc3VsdHMuSW52YWxpZFBhc3N3b3JkXSA9IFtdOyAvLyBUT0RPXG4gIHVybHNbTG9naW5SZXN1bHRzLlVua25vd25FcnJvcl0gPSBbXTsgLy8gVE9ET1xuICByZXR1cm4gdXJscztcbn1cblxuZnVuY3Rpb24gY3JlYXRlTG9naW5GaWVsZHMoY3JlZGVudGlhbHM6IFNjcmFwZXJTcGVjaWZpY0NyZWRlbnRpYWxzKSB7XG4gIHJldHVybiBbXG4gICAgeyBzZWxlY3RvcjogJyNsb2dpbklkJywgdmFsdWU6IGNyZWRlbnRpYWxzLmlkIH0sXG4gICAgeyBzZWxlY3RvcjogJyNsb2dpblBhc3N3b3JkJywgdmFsdWU6IGNyZWRlbnRpYWxzLnBhc3N3b3JkIH0sXG4gIF07XG59XG5cbnR5cGUgU2NyYXBlclNwZWNpZmljQ3JlZGVudGlhbHMgPSB7IGlkOiBzdHJpbmc7IHBhc3N3b3JkOiBzdHJpbmcgfTtcblxuY2xhc3MgQmV5YWhhZEJpc2h2aWxoYVNjcmFwZXIgZXh0ZW5kcyBCYXNlU2NyYXBlcldpdGhCcm93c2VyPFNjcmFwZXJTcGVjaWZpY0NyZWRlbnRpYWxzPiB7XG4gIHByb3RlY3RlZCBnZXRWaWV3UG9ydCgpOiB7IHdpZHRoOiBudW1iZXI7IGhlaWdodDogbnVtYmVyIH0ge1xuICAgIHJldHVybiB7XG4gICAgICB3aWR0aDogMTUwMCxcbiAgICAgIGhlaWdodDogODAwLFxuICAgIH07XG4gIH1cblxuICBnZXRMb2dpbk9wdGlvbnMoY3JlZGVudGlhbHM6IFNjcmFwZXJTcGVjaWZpY0NyZWRlbnRpYWxzKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGxvZ2luVXJsOiBMT0dJTl9VUkwsXG4gICAgICBmaWVsZHM6IGNyZWF0ZUxvZ2luRmllbGRzKGNyZWRlbnRpYWxzKSxcbiAgICAgIHN1Ym1pdEJ1dHRvblNlbGVjdG9yOiBhc3luYyAoKSA9PiB7XG4gICAgICAgIGNvbnN0IGJ1dHRvbiA9IGF3YWl0IHRoaXMucGFnZS4kKCd4cGF0aC8vYnV0dG9uW2NvbnRhaW5zKC4sIFwi15TXqteX15HXqFwiKV0nKTtcbiAgICAgICAgaWYgKGJ1dHRvbikge1xuICAgICAgICAgIGF3YWl0IGJ1dHRvbi5jbGljaygpO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgcG9zc2libGVSZXN1bHRzOiBnZXRQb3NzaWJsZUxvZ2luUmVzdWx0cygpLFxuICAgIH07XG4gIH1cblxuICBhc3luYyBmZXRjaERhdGEoKSB7XG4gICAgY29uc3QgYWNjb3VudCA9IGF3YWl0IGZldGNoVHJhbnNhY3Rpb25zKHRoaXMucGFnZSwgdGhpcy5vcHRpb25zKTtcbiAgICByZXR1cm4ge1xuICAgICAgc3VjY2VzczogdHJ1ZSxcbiAgICAgIGFjY291bnRzOiBbYWNjb3VudF0sXG4gICAgfTtcbiAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBCZXlhaGFkQmlzaHZpbGhhU2NyYXBlcjtcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBQUEsSUFBQUEsT0FBQSxHQUFBQyxzQkFBQSxDQUFBQyxPQUFBO0FBRUEsSUFBQUMsVUFBQSxHQUFBRCxPQUFBO0FBUUEsSUFBQUUsTUFBQSxHQUFBRixPQUFBO0FBQ0EsSUFBQUcscUJBQUEsR0FBQUgsT0FBQTtBQUNBLElBQUFJLGFBQUEsR0FBQUosT0FBQTtBQUNBLElBQUFLLGNBQUEsR0FBQUwsT0FBQTtBQUNBLElBQUFNLHVCQUFBLEdBQUFOLE9BQUE7QUFBOEcsU0FBQUQsdUJBQUFRLENBQUEsV0FBQUEsQ0FBQSxJQUFBQSxDQUFBLENBQUFDLFVBQUEsR0FBQUQsQ0FBQSxLQUFBRSxPQUFBLEVBQUFGLENBQUE7QUFHOUcsTUFBTUcsS0FBSyxHQUFHLElBQUFDLGVBQVEsRUFBQyxrQkFBa0IsQ0FBQztBQUUxQyxNQUFNQyxXQUFXLEdBQUcsVUFBVTtBQUM5QixNQUFNQyxTQUFTLEdBQUcsK0JBQStCO0FBQ2pELE1BQU1DLFdBQVcsR0FBRywwQkFBMEI7QUFDOUMsTUFBTUMsUUFBUSxHQUFHLDZDQUE2QztBQVU5RCxTQUFTQyxhQUFhQSxDQUFDQyxTQUFpQixFQUFFO0VBQ3hDLE1BQU1DLFlBQVksR0FBR0QsU0FBUyxDQUFDRSxPQUFPLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQztFQUMvQyxJQUFJQyxRQUF1QixHQUFHLElBQUk7RUFDbEMsSUFBSUMsTUFBcUIsR0FBRyxJQUFJO0VBQ2hDLElBQUlILFlBQVksQ0FBQ0ksUUFBUSxDQUFDQyxpQ0FBc0IsQ0FBQyxFQUFFO0lBQ2pERixNQUFNLEdBQUdHLFVBQVUsQ0FBQ04sWUFBWSxDQUFDQyxPQUFPLENBQUNJLGlDQUFzQixFQUFFLEVBQUUsQ0FBQyxDQUFDO0lB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