UNPKG

israeli-bank-scrapers

Version:

Provide scrapers for all major Israeli banks and credit card companies

152 lines (151 loc) 24.5 kB
"use strict"; 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, options) { 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 }; if (options?.includeRawTransaction) { result.rawTransaction = (0, _transactions.getRawTransaction)(txn); } 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), options); 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,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfbW9tZW50IiwiX2ludGVyb3BSZXF1aXJlRGVmYXVsdCIsInJlcXVpcmUiLCJfY29uc3RhbnRzIiwiX2RlYnVnIiwiX2VsZW1lbnRzSW50ZXJhY3Rpb25zIiwiX3RyYW5zYWN0aW9ucyIsIl90cmFuc2FjdGlvbnMyIiwiX2Jhc2VTY3JhcGVyV2l0aEJyb3dzZXIiLCJlIiwiX19lc01vZHVsZSIsImRlZmF1bHQiLCJkZWJ1ZyIsImdldERlYnVnIiwiREFURV9GT1JNQVQiLCJMT0dJTl9VUkwiLCJTVUNDRVNTX1VSTCIsIkNBUkRfVVJMIiwiZ2V0QW1vdW50RGF0YSIsImFtb3VudFN0ciIsImFtb3VudFN0ckNsbiIsInJlcGxhY2UiLCJjdXJyZW5jeSIsImFtb3VudCIsImluY2x1ZGVzIiwiU0hFS0VMX0NVUlJFTkNZX1NZTUJPTCIsInBhcnNlRmxvYXQiLCJTSEVLRUxfQ1VSUkVOQ1kiLCJET0xMQVJfQ1VSUkVOQ1lfU1lNQk9MIiwiRE9MTEFSX0NVUlJFTkNZIiwiRVVST19DVVJSRU5DWV9TWU1CT0wiLCJFVVJPX0NVUlJFTkNZIiwicGFydHMiLCJzcGxpdCIsImNvbnZlcnRUcmFuc2FjdGlvbnMiLCJ0eG5zIiwib3B0aW9ucyIsImxlbmd0aCIsIm1hcCIsInR4biIsImNoYXJnZWRBbW91bnRUdXBsZSIsImNoYXJnZWRBbW91bnQiLCJ0eG5Qcm9jZXNzZWREYXRlIiwibW9tZW50IiwiZGF0ZSIsInJlc3VsdCIsInR5cGUiLCJUcmFuc2FjdGlvblR5cGVzIiwiTm9ybWFsIiwic3RhdHVzIiwiVHJhbnNhY3Rpb25TdGF0dXNlcyIsIkNvbXBsZXRlZCIsInRvSVNPU3RyaW5nIiwicHJvY2Vzc2VkRGF0ZSIsIm9yaWdpbmFsQW1vdW50Iiwib3JpZ2luYWxDdXJyZW5jeSIsImNoYXJnZWRDdXJyZW5jeSIsImRlc2NyaXB0aW9uIiwibWVtbyIsImlkZW50aWZpZXIiLCJpbmNsdWRlUmF3VHJhbnNhY3Rpb24iLCJyYXdUcmFuc2FjdGlvbiIsImdldFJhd1RyYW5zYWN0aW9uIiwiZmV0Y2hUcmFuc2FjdGlvbnMiLCJwYWdlIiwiZ290byIsIndhaXRVbnRpbEVsZW1lbnRGb3VuZCIsImRlZmF1bHRTdGFydE1vbWVudCIsInN1YnRyYWN0Iiwic3RhcnREYXRlIiwidG9EYXRlIiwic3RhcnRNb21lbnQiLCJtYXgiLCJhY2NvdW50TnVtYmVyIiwicGFnZUV2YWwiLCJlbGVtZW50IiwiaW5uZXJUZXh0IiwiYmFsYW5jZSIsInJhd1RyYW5zYWN0aW9ucyIsInBhZ2VFdmFsQWxsIiwiaXRlbXMiLCJlbCIsImNvbHVtbnMiLCJxdWVyeVNlbGVjdG9yQWxsIiwiYWNjb3VudFRyYW5zYWN0aW9ucyIsImZpbHRlciIsIml0ZW0iLCJvdXRwdXREYXRhIiwiZW5hYmxlVHJhbnNhY3Rpb25zRmlsdGVyQnlEYXRlIiwiZmlsdGVyT2xkVHJhbnNhY3Rpb25zIiwic3Vic3RyaW5nIiwiZ2V0UG9zc2libGVMb2dpblJlc3VsdHMiLCJ1cmxzIiwiTG9naW5SZXN1bHRzIiwiU3VjY2VzcyIsIkNoYW5nZVBhc3N3b3JkIiwiSW52YWxpZFBhc3N3b3JkIiwiVW5rbm93bkVycm9yIiwiY3JlYXRlTG9naW5GaWVsZHMiLCJjcmVkZW50aWFscyIsInNlbGVjdG9yIiwidmFsdWUiLCJpZCIsInBhc3N3b3JkIiwiQmV5YWhhZEJpc2h2aWxoYVNjcmFwZXIiLCJCYXNlU2NyYXBlcldpdGhCcm93c2VyIiwiZ2V0Vmlld1BvcnQiLCJ3aWR0aCIsImhlaWdodCIsImdldExvZ2luT3B0aW9ucyIsImxvZ2luVXJsIiwiZmllbGRzIiwic3VibWl0QnV0dG9uU2VsZWN0b3IiLCJidXR0b24iLCIkIiwiY2xpY2siLCJwb3NzaWJsZVJlc3VsdHMiLCJmZXRjaERhdGEiLCJhY2NvdW50Iiwic3VjY2VzcyIsImFjY291bnRzIiwiX2RlZmF1bHQiLCJleHBvcnRzIl0sInNvdXJjZXMiOlsiLi4vLi4vc3JjL3NjcmFwZXJzL2JleWFoYWQtYmlzaHZpbGhhLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBtb21lbnQgZnJvbSAnbW9tZW50JztcbmltcG9ydCB7IHR5cGUgUGFnZSB9IGZyb20gJ3B1cHBldGVlcic7XG5pbXBvcnQge1xuICBET0xMQVJfQ1VSUkVOQ1ksXG4gIERPTExBUl9DVVJSRU5DWV9TWU1CT0wsXG4gIEVVUk9fQ1VSUkVOQ1ksXG4gIEVVUk9fQ1VSUkVOQ1lfU1lNQk9MLFxuICBTSEVLRUxfQ1VSUkVOQ1ksXG4gIFNIRUtFTF9DVVJSRU5DWV9TWU1CT0wsXG59IGZyb20gJy4uL2NvbnN0YW50cyc7XG5pbXBvcnQgeyBnZXREZWJ1ZyB9IGZyb20gJy4uL2hlbHBlcnMvZGVidWcnO1xuaW1wb3J0IHsgcGFnZUV2YWwsIHBhZ2VFdmFsQWxsLCB3YWl0VW50aWxFbGVtZW50Rm91bmQgfSBmcm9tICcuLi9oZWxwZXJzL2VsZW1lbnRzLWludGVyYWN0aW9ucyc7XG5pbXBvcnQgeyBnZXRSYXdUcmFuc2FjdGlvbiwgZmlsdGVyT2xkVHJhbnNhY3Rpb25zIH0gZnJvbSAnLi4vaGVscGVycy90cmFuc2FjdGlvbnMnO1xuaW1wb3J0IHsgVHJhbnNhY3Rpb25TdGF0dXNlcywgVHJhbnNhY3Rpb25UeXBlcywgdHlwZSBUcmFuc2FjdGlvbiB9IGZyb20gJy4uL3RyYW5zYWN0aW9ucyc7XG5pbXBvcnQgeyBCYXNlU2NyYXBlcldpdGhCcm93c2VyLCBMb2dpblJlc3VsdHMsIHR5cGUgUG9zc2libGVMb2dpblJlc3VsdHMgfSBmcm9tICcuL2Jhc2Utc2NyYXBlci13aXRoLWJyb3dzZXInO1xuaW1wb3J0IHsgdHlwZSBTY3JhcGVyT3B0aW9ucyB9IGZyb20gJy4vaW50ZXJmYWNlJztcblxuY29uc3QgZGVidWcgPSBnZXREZWJ1ZygnYmV5YWhhZEJpc2h2aWxoYScpO1xuXG5jb25zdCBEQVRFX0ZPUk1BVCA9ICdERC9NTS9ZWSc7XG5jb25zdCBMT0dJTl9VUkwgPSAnaHR0cHM6Ly93d3cuaGlzdC5vcmcuaWwvbG9naW4nO1xuY29uc3QgU1VDQ0VTU19VUkwgPSAnaHR0cHM6Ly93d3cuaGlzdC5vcmcuaWwvJztcbmNvbnN0IENBUkRfVVJMID0gJ2h0dHBzOi8vd3d3Lmhpc3Qub3JnLmlsL2NhcmQvYmFsYW5jZUFuZFVzZXMnO1xuXG5pbnRlcmZhY2UgU2NyYXBlZFRyYW5zYWN0aW9uIHtcbiAgZGF0ZTogc3RyaW5nO1xuICBkZXNjcmlwdGlvbjogc3RyaW5nO1xuICB0eXBlOiBzdHJpbmc7XG4gIGNoYXJnZWRBbW91bnQ6IHN0cmluZztcbiAgaWRlbnRpZmllcjogc3RyaW5nO1xufVxuXG5mdW5jdGlvbiBnZXRBbW91bnREYXRhKGFtb3VudFN0cjogc3RyaW5nKSB7XG4gIGNvbnN0IGFtb3VudFN0ckNsbiA9IGFtb3VudFN0ci5yZXBsYWNlKCcsJywgJycpO1xuICBsZXQgY3VycmVuY3k6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuICBsZXQgYW1vdW50OiBudW1iZXIgfCBudWxsID0gbnVsbDtcbiAgaWYgKGFtb3VudFN0ckNsbi5pbmNsdWRlcyhTSEVLRUxfQ1VSUkVOQ1lfU1lNQk9MKSkge1xuICAgIGFtb3VudCA9IHBhcnNlRmxvYXQoYW1vdW50U3RyQ2xuLnJlcGxhY2UoU0hFS0VMX0NVUlJFTkNZX1NZTUJPTCwgJycpKTtcbiAgICBjdXJyZW5jeSA9IFNIRUtFTF9DVVJSRU5DWTtcbiAgfSBlbHNlIGlmIChhbW91bnRTdHJDbG4uaW5jbHVkZXMoRE9MTEFSX0NVUlJFTkNZX1NZTUJPTCkpIHtcbiAgICBhbW91bnQgPSBwYXJzZUZsb2F0KGFtb3VudFN0ckNsbi5yZXBsYWNlKERPTExBUl9DVVJSRU5DWV9TWU1CT0wsICcnKSk7XG4gICAgY3VycmVuY3kgPSBET0xMQVJfQ1VSUkVOQ1k7XG4gIH0gZWxzZSBpZiAoYW1vdW50U3RyQ2xuLmluY2x1ZGVzKEVVUk9fQ1VSUkVOQ1lfU1lNQk9MKSkge1xuICAgIGFtb3VudCA9IHBhcnNlRmxvYXQoYW1vdW50U3RyQ2xuLnJlcGxhY2UoRVVST19DVVJSRU5DWV9TWU1CT0wsICcnKSk7XG4gICAgY3VycmVuY3kgPSBFVVJPX0NVUlJFTkNZO1xuICB9IGVsc2Uge1xuICAgIGNvbnN0IHBhcnRzID0gYW1vdW50U3RyQ2xuLnNwbGl0KCcgJyk7XG4gICAgW2N1cnJlbmN5XSA9IHBhcnRzO1xuICAgIGFtb3VudCA9IHBhcnNlRmxvYXQocGFydHNbMV0pO1xuICB9XG5cbiAgcmV0dXJuIHtcbiAgICBhbW91bnQsXG4gICAgY3VycmVuY3ksXG4gIH07XG59XG5cbmZ1bmN0aW9uIGNvbnZlcnRUcmFuc2FjdGlvbnModHhuczogU2NyYXBlZFRyYW5zYWN0aW9uW10sIG9wdGlvbnM/OiBTY3JhcGVyT3B0aW9ucyk6IFRyYW5zYWN0aW9uW10ge1xuICBkZWJ1ZyhgY29udmVydCAke3R4bnMubGVuZ3RofSByYXcgdHJhbnNhY3Rpb25zIHRvIG9mZmljaWFsIFRyYW5zYWN0aW9uIHN0cnVjdHVyZWApO1xuICByZXR1cm4gdHhucy5tYXAodHhuID0+IHtcbiAgICBjb25zdCBjaGFyZ2VkQW1vdW50VHVwbGUgPSBnZXRBbW91bnREYXRhKHR4bi5jaGFyZ2VkQW1vdW50IHx8ICcnKTtcbiAgICBjb25zdCB0eG5Qcm9jZXNzZWREYXRlID0gbW9tZW50KHR4bi5kYXRlLCBEQVRFX0ZPUk1BVCk7XG5cbiAgICBjb25zdCByZXN1bHQ6IFRyYW5zYWN0aW9uID0ge1xuICAgICAgdHlwZTogVHJhbnNhY3Rpb25UeXBlcy5Ob3JtYWwsXG4gICAgICBzdGF0dXM6IFRyYW5zYWN0aW9uU3RhdHVzZXMuQ29tcGxldGVkLFxuICAgICAgZGF0ZTogdHhuUHJvY2Vzc2VkRGF0ZS50b0lTT1N0cmluZygpLFxuICAgICAgcHJvY2Vzc2VkRGF0ZTogdHhuUHJvY2Vzc2VkRGF0ZS50b0lTT1N0cmluZygpLFxuICAgICAgb3JpZ2luYWxBbW91bnQ6IGNoYXJnZWRBbW91bnRUdXBsZS5hbW91bnQsXG4gICAgICBvcmlnaW5hbEN1cnJlbmN5OiBjaGFyZ2VkQW1vdW50VHVwbGUuY3VycmVuY3ksXG4gICAgICBjaGFyZ2VkQW1vdW50OiBjaGFyZ2VkQW1vdW50VHVwbGUuYW1vdW50LFxuICAgICAgY2hhcmdlZEN1cnJlbmN5OiBjaGFyZ2VkQW1vdW50VHVwbGUuY3VycmVuY3ksXG4gICAgICBkZXNjcmlwdGlvbjogdHhuLmRlc2NyaXB0aW9uIHx8ICcnLFxuICAgICAgbWVtbzogJycsXG4gICAgICBpZGVudGlmaWVyOiB0eG4uaWRlbnRpZmllcixcbiAgICB9O1xuXG4gICAgaWYgKG9wdGlvbnM/LmluY2x1ZGVSYXdUcmFuc2FjdGlvbikge1xuICAgICAgcmVzdWx0LnJhd1RyYW5zYWN0aW9uID0gZ2V0UmF3VHJhbnNhY3Rpb24odHhuKTtcbiAgICB9XG5cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9KTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gZmV0Y2hUcmFuc2FjdGlvbnMocGFnZTogUGFnZSwgb3B0aW9uczogU2NyYXBlck9wdGlvbnMpIHtcbiAgYXdhaXQgcGFnZS5nb3RvKENBUkRfVVJMKTtcbiAgYXdhaXQgd2FpdFVudGlsRWxlbWVudEZvdW5kKHBhZ2UsICcucmVhY3QtbG9hZGluZy5oaWRlJywgZmFsc2UpO1xuICBjb25zdCBkZWZhdWx0U3RhcnRNb21lbnQgPSBtb21lbnQoKS5zdWJ0cmFjdCgxLCAneWVhcnMnKTtcbiAgY29uc3Qgc3RhcnREYXRlID0gb3B0aW9ucy5zdGFydERhdGUgfHwgZGVmYXVsdFN0YXJ0TW9tZW50LnRvRGF0ZSgpO1xuICBjb25zdCBzdGFydE1vbWVudCA9IG1vbWVudC5tYXgoZGVmYXVsdFN0YXJ0TW9tZW50LCBtb21lbnQoc3RhcnREYXRlKSk7XG5cbiAgY29uc3QgYWNjb3VudE51bWJlciA9IGF3YWl0IHBhZ2VFdmFsKHBhZ2UsICcud2FsbGV0LWRldGFpbHMgZGl2Om50aC1vZi10eXBlKDIpJywgbnVsbCwgZWxlbWVudCA9PiB7XG4gICAgcmV0dXJuIChlbGVtZW50IGFzIGFueSkuaW5uZXJUZXh0LnJlcGxhY2UoJ9ee16HXpNeoINeb16jXmNeZ16EgJywgJycpO1xuICB9KTtcblxuICBjb25zdCBiYWxhbmNlID0gYXdhaXQgcGFnZUV2YWwocGFnZSwgJy53YWxsZXQtZGV0YWlscyBkaXY6bnRoLW9mLXR5cGUoNCkgPiBzcGFuOm50aC1vZi10eXBlKDIpJywgbnVsbCwgZWxlbWVudCA9PiB7XG4gICAgcmV0dXJuIChlbGVtZW50IGFzIGFueSkuaW5uZXJUZXh0O1xuICB9KTtcblxuICBkZWJ1ZygnZmV0Y2ggcmF3IHRyYW5zYWN0aW9ucyBmcm9tIHBhZ2UnKTtcblxuICBjb25zdCByYXdUcmFuc2FjdGlvbnM6IChTY3JhcGVkVHJhbnNhY3Rpb24gfCBudWxsKVtdID0gYXdhaXQgcGFnZUV2YWxBbGw8KFNjcmFwZWRUcmFuc2FjdGlvbiB8IG51bGwpW10+KFxuICAgIHBhZ2UsXG4gICAgJy50cmFuc2FjdGlvbi1jb250YWluZXIsIC50cmFuc2FjdGlvbi1jb21wb25lbnQtY29udGFpbmVyJyxcbiAgICBbXSxcbiAgICBpdGVtcyA9PiB7XG4gICAgICByZXR1cm4gaXRlbXMubWFwKGVsID0+IHtcbiAgICAgICAgY29uc3QgY29sdW1uczogTm9kZUxpc3RPZjxIVE1MU3BhbkVsZW1lbnQ+ID0gZWwucXVlcnlTZWxlY3RvckFsbCgnLnRyYW5zYWN0aW9uLWl0ZW0gPiBzcGFuJyk7XG4gICAgICAgIGlmIChjb2x1bW5zLmxlbmd0aCA9PT0gNykge1xuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBkYXRlOiBjb2x1bW5zWzBdLmlubmVyVGV4dCxcbiAgICAgICAgICAgIGlkZW50aWZpZXI6IGNvbHVtbnNbMV0uaW5uZXJUZXh0LFxuICAgICAgICAgICAgZGVzY3JpcHRpb246IGNvbHVtbnNbM10uaW5uZXJUZXh0LFxuICAgICAgICAgICAgdHlwZTogY29sdW1uc1s1XS5pbm5lclRleHQsXG4gICAgICAgICAgICBjaGFyZ2VkQW1vdW50OiBjb2x1bW5zWzZdLmlubmVyVGV4dCxcbiAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfSk7XG4gICAgfSxcbiAgKTtcbiAgZGVidWcoYGZldGNoZWQgJHtyYXdUcmFuc2FjdGlvbnMubGVuZ3RofSByYXcgdHJhbnNhY3Rpb25zIGZyb20gcGFnZWApO1xuXG4gIGNvbnN0IGFjY291bnRUcmFuc2FjdGlvbnMgPSBjb252ZXJ0VHJhbnNhY3Rpb25zKFxuICAgIHJhd1RyYW5zYWN0aW9ucy5maWx0ZXIoaXRlbSA9PiAhIWl0ZW0pIGFzIFNjcmFwZWRUcmFuc2FjdGlvbltdLFxuICAgIG9wdGlvbnMsXG4gICk7XG5cbiAgZGVidWcoJ2ZpbGVyIG91dCBvbGQgdHJhbnNhY3Rpb25zJyk7XG4gIGNvbnN0IHR4bnMgPVxuICAgIChvcHRpb25zLm91dHB1dERhdGE/LmVuYWJsZVRyYW5zYWN0aW9uc0ZpbHRlckJ5RGF0ZSA/PyB0cnVlKVxuICAgICAgPyBmaWx0ZXJPbGRUcmFuc2FjdGlvbnMoYWNjb3VudFRyYW5zYWN0aW9ucywgc3RhcnRNb21lbnQsIGZhbHNlKVxuICAgICAgOiBhY2NvdW50VHJhbnNhY3Rpb25zO1xuICBkZWJ1ZyhcbiAgICBgZm91bmQgJHt0eG5zLmxlbmd0aH0gdmFsaWQgdHJhbnNhY3Rpb25zIG91dCBvZiAke2FjY291bnRUcmFuc2FjdGlvbnMubGVuZ3RofSB0cmFuc2FjdGlvbnMgZm9yIGFjY291bnQgZW5kaW5nIHdpdGggJHthY2NvdW50TnVtYmVyLnN1YnN0cmluZyhhY2NvdW50TnVtYmVyLmxlbmd0aCAtIDIpfWAsXG4gICk7XG5cbiAgcmV0dXJuIHtcbiAgICBhY2NvdW50TnVtYmVyLFxuICAgIGJhbGFuY2U6IGdldEFtb3VudERhdGEoYmFsYW5jZSkuYW1vdW50LFxuICAgIHR4bnMsXG4gIH07XG59XG5cbmZ1bmN0aW9uIGdldFBvc3NpYmxlTG9naW5SZXN1bHRzKCk6IFBvc3NpYmxlTG9naW5SZXN1bHRzIHtcbiAgY29uc3QgdXJsczogUG9zc2libGVMb2dpblJlc3VsdHMgPSB7fTtcbiAgdXJsc1tMb2dpblJlc3VsdHMuU3VjY2Vzc10gPSBbU1VDQ0VTU19VUkxdO1xuICB1cmxzW0xvZ2luUmVzdWx0cy5DaGFuZ2VQYXNzd29yZF0gPSBbXTsgLy8gVE9ET1xuICB1cmxzW0xvZ2luUmVzdWx0cy5JbnZhbGlkUGFzc3dvcmRdID0gW107IC8vIFRPRE9cbiAgdXJsc1tMb2dpblJlc3VsdHMuVW5rbm93bkVycm9yXSA9IFtdOyAvLyBUT0RPXG4gIHJldHVybiB1cmxzO1xufVxuXG5mdW5jdGlvbiBjcmVhdGVMb2dpbkZpZWxkcyhjcmVkZW50aWFsczogU2NyYXBlclNwZWNpZmljQ3JlZGVudGlhbHMpIHtcbiAgcmV0dXJuIFtcbiAgICB7IHNlbGVjdG9yOiAnI2xvZ2luSWQnLCB2YWx1ZTogY3JlZGVudGlhbHMuaWQgfSxcbiAgICB7IHNlbGVjdG9yOiAnI2xvZ2luUGFzc3dvcmQnLCB2YWx1ZTogY3JlZGVudGlhbHMucGFzc3dvcmQgfSxcbiAgXTtcbn1cblxudHlwZSBTY3JhcGVyU3BlY2lmaWNDcmVkZW50aWFscyA9IHsgaWQ6IHN0cmluZzsgcGFzc3dvcmQ6IHN0cmluZyB9O1xuXG5jbGFzcyBCZXlhaGFkQmlzaHZpbGhhU2NyYXBlciBleHRlbmRzIEJhc2VTY3JhcGVyV2l0aEJyb3dzZXI8U2NyYXBlclNwZWNpZmljQ3JlZGVudGlhbHM+IHtcbiAgcHJvdGVjdGVkIGdldFZpZXdQb3J0KCk6IHsgd2lkdGg6IG51bWJlcjsgaGVpZ2h0OiBudW1iZXIgfSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHdpZHRoOiAxNTAwLFxuICAgICAgaGVpZ2h0OiA4MDAsXG4gICAgfTtcbiAgfVxuXG4gIGdldExvZ2luT3B0aW9ucyhjcmVkZW50aWFsczogU2NyYXBlclNwZWNpZmljQ3JlZGVudGlhbHMpIHtcbiAgICByZXR1cm4ge1xuICAgICAgbG9naW5Vcmw6IExPR0lOX1VSTCxcbiAgICAgIGZpZWxkczogY3JlYXRlTG9naW5GaWVsZHMoY3JlZGVudGlhbHMpLFxuICAgICAgc3VibWl0QnV0dG9uU2VsZWN0b3I6IGFzeW5jICgpID0+IHtcbiAgICAgICAgY29uc3QgYnV0dG9uID0gYXdhaXQgdGhpcy5wYWdlLiQoJ3hwYXRoLy9idXR0b25bY29udGFpbnMoLiwgXCLXlNeq15fXkdeoXCIpXScpO1xuICAgICAgICBpZiAoYnV0dG9uKSB7XG4gICAgICAgICAgYXdhaXQgYnV0dG9uLmNsaWNrKCk7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBwb3NzaWJsZVJlc3VsdHM6IGdldFBvc3NpYmxlTG9naW5SZXN1bHRzKCksXG4gICAgfTtcbiAgfVxuXG4gIGFzeW5jIGZldGNoRGF0YSgpIHtcbiAgICBjb25zdCBhY2NvdW50ID0gYXdhaXQgZmV0Y2hUcmFuc2FjdGlvbnModGhpcy5wYWdlLCB0aGlzLm9wdGlvbnMpO1xuICAgIHJldHVybiB7XG4gICAgICBzdWNjZXNzOiB0cnVlLFxuICAgICAgYWNjb3VudHM6IFthY2NvdW50XSxcbiAgICB9O1xuICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IEJleWFoYWRCaXNodmlsaGFTY3JhcGVyO1xuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7QUFBQSxJQUFBQSxPQUFBLEdBQUFDLHNCQUFBLENBQUFDLE9BQUE7QUFFQSxJQUFBQyxVQUFBLEdBQUFELE9BQUE7QUFRQSxJQUFBRSxNQUFBLEdBQUFGLE9BQUE7QUFDQSxJQUFBRyxxQkFBQSxHQUFBSCxPQUFBO0FBQ0EsSUFBQUksYUFBQSxHQUFBSixPQUFBO0FBQ0EsSUFBQUssY0FBQSxHQUFBTCxPQUFBO0FBQ0EsSUFBQU0sdUJBQUEsR0FBQU4sT0FBQTtBQUE4RyxTQUFBRCx1QkFBQVEsQ0FBQSxXQUFBQSxDQUFBLElBQUFBLENBQUEsQ0FBQUMsVUFBQSxHQUFBRCxDQUFBLEtBQUFFLE9BQUEsRUFBQUYsQ0FBQTtBQUc5RyxNQUFNRyxLQUFLLEdBQUcsSUFBQUMsZUFBUSxFQUFDLGtCQUFrQixDQUFDO0FBRTFDLE1BQU1DLFdBQVcsR0FBRyxVQUFVO0FBQzlCLE1BQU1DLFNBQVMsR0FBRywrQkFBK0I7QUFDakQsTUFBTUMsV0FBVyxHQUFHLDBCQUEwQjtBQUM5QyxNQUFNQyxRQUFRLEdBQUcsNkNBQTZDO0FBVTlELFNBQVNDLGFBQWFBLENBQUNDLFNBQWlCLEVBQUU7RUFDeEMsTUFBTUMsWUFBWSxH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