@tomerh2001/israeli-bank-scrapers 6.3.11
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +425 -0
- package/lib/assertNever.d.ts +1 -0
- package/lib/assertNever.js +10 -0
- package/lib/constants.d.ts +10 -0
- package/lib/constants.js +17 -0
- package/lib/definitions.d.ts +105 -0
- package/lib/definitions.js +116 -0
- package/lib/helpers/browser.d.ts +10 -0
- package/lib/helpers/browser.js +21 -0
- package/lib/helpers/dates.d.ts +2 -0
- package/lib/helpers/dates.js +22 -0
- package/lib/helpers/debug.d.ts +2 -0
- package/lib/helpers/debug.js +12 -0
- package/lib/helpers/elements-interactions.d.ts +17 -0
- package/lib/helpers/elements-interactions.js +111 -0
- package/lib/helpers/fetch.d.ts +6 -0
- package/lib/helpers/fetch.js +111 -0
- package/lib/helpers/navigation.d.ts +6 -0
- package/lib/helpers/navigation.js +39 -0
- package/lib/helpers/storage.d.ts +2 -0
- package/lib/helpers/storage.js +14 -0
- package/lib/helpers/transactions.d.ts +5 -0
- package/lib/helpers/transactions.js +47 -0
- package/lib/helpers/waiting.d.ts +13 -0
- package/lib/helpers/waiting.js +58 -0
- package/lib/index.d.ts +7 -0
- package/lib/index.js +85 -0
- package/lib/scrapers/amex.d.ts +6 -0
- package/lib/scrapers/amex.js +17 -0
- package/lib/scrapers/amex.test.d.ts +1 -0
- package/lib/scrapers/amex.test.js +49 -0
- package/lib/scrapers/base-beinleumi-group.d.ts +66 -0
- package/lib/scrapers/base-beinleumi-group.js +428 -0
- package/lib/scrapers/base-isracard-amex.d.ts +23 -0
- package/lib/scrapers/base-isracard-amex.js +324 -0
- package/lib/scrapers/base-scraper-with-browser.d.ts +57 -0
- package/lib/scrapers/base-scraper-with-browser.js +291 -0
- package/lib/scrapers/base-scraper-with-browser.test.d.ts +1 -0
- package/lib/scrapers/base-scraper-with-browser.test.js +53 -0
- package/lib/scrapers/base-scraper.d.ts +19 -0
- package/lib/scrapers/base-scraper.js +91 -0
- package/lib/scrapers/behatsdaa.d.ts +11 -0
- package/lib/scrapers/behatsdaa.js +113 -0
- package/lib/scrapers/behatsdaa.test.d.ts +1 -0
- package/lib/scrapers/behatsdaa.test.js +46 -0
- package/lib/scrapers/beinleumi.d.ts +7 -0
- package/lib/scrapers/beinleumi.js +15 -0
- package/lib/scrapers/beinleumi.test.d.ts +1 -0
- package/lib/scrapers/beinleumi.test.js +47 -0
- package/lib/scrapers/beyahad-bishvilha.d.ts +30 -0
- package/lib/scrapers/beyahad-bishvilha.js +149 -0
- package/lib/scrapers/beyahad-bishvilha.test.d.ts +1 -0
- package/lib/scrapers/beyahad-bishvilha.test.js +47 -0
- package/lib/scrapers/discount.d.ts +22 -0
- package/lib/scrapers/discount.js +120 -0
- package/lib/scrapers/discount.test.d.ts +1 -0
- package/lib/scrapers/discount.test.js +49 -0
- package/lib/scrapers/errors.d.ts +16 -0
- package/lib/scrapers/errors.js +32 -0
- package/lib/scrapers/factory.d.ts +2 -0
- package/lib/scrapers/factory.js +70 -0
- package/lib/scrapers/factory.test.d.ts +1 -0
- package/lib/scrapers/factory.test.js +19 -0
- package/lib/scrapers/hapoalim.d.ts +24 -0
- package/lib/scrapers/hapoalim.js +198 -0
- package/lib/scrapers/hapoalim.test.d.ts +1 -0
- package/lib/scrapers/hapoalim.test.js +47 -0
- package/lib/scrapers/interface.d.ts +186 -0
- package/lib/scrapers/interface.js +6 -0
- package/lib/scrapers/isracard.d.ts +6 -0
- package/lib/scrapers/isracard.js +17 -0
- package/lib/scrapers/isracard.test.d.ts +1 -0
- package/lib/scrapers/isracard.test.js +49 -0
- package/lib/scrapers/leumi.d.ts +21 -0
- package/lib/scrapers/leumi.js +200 -0
- package/lib/scrapers/leumi.test.d.ts +1 -0
- package/lib/scrapers/leumi.test.js +47 -0
- package/lib/scrapers/massad.d.ts +7 -0
- package/lib/scrapers/massad.js +15 -0
- package/lib/scrapers/max.d.ts +37 -0
- package/lib/scrapers/max.js +299 -0
- package/lib/scrapers/max.test.d.ts +1 -0
- package/lib/scrapers/max.test.js +64 -0
- package/lib/scrapers/mercantile.d.ts +20 -0
- package/lib/scrapers/mercantile.js +18 -0
- package/lib/scrapers/mercantile.test.d.ts +1 -0
- package/lib/scrapers/mercantile.test.js +45 -0
- package/lib/scrapers/mizrahi.d.ts +35 -0
- package/lib/scrapers/mizrahi.js +265 -0
- package/lib/scrapers/mizrahi.test.d.ts +1 -0
- package/lib/scrapers/mizrahi.test.js +56 -0
- package/lib/scrapers/one-zero-queries.d.ts +2 -0
- package/lib/scrapers/one-zero-queries.js +560 -0
- package/lib/scrapers/one-zero.d.ts +36 -0
- package/lib/scrapers/one-zero.js +238 -0
- package/lib/scrapers/one-zero.test.d.ts +1 -0
- package/lib/scrapers/one-zero.test.js +51 -0
- package/lib/scrapers/otsar-hahayal.d.ts +7 -0
- package/lib/scrapers/otsar-hahayal.js +15 -0
- package/lib/scrapers/otsar-hahayal.test.d.ts +1 -0
- package/lib/scrapers/otsar-hahayal.test.js +47 -0
- package/lib/scrapers/pagi.d.ts +7 -0
- package/lib/scrapers/pagi.js +15 -0
- package/lib/scrapers/pagi.test.d.ts +1 -0
- package/lib/scrapers/pagi.test.js +47 -0
- package/lib/scrapers/union-bank.d.ts +23 -0
- package/lib/scrapers/union-bank.js +242 -0
- package/lib/scrapers/union-bank.test.d.ts +1 -0
- package/lib/scrapers/union-bank.test.js +47 -0
- package/lib/scrapers/visa-cal.d.ts +20 -0
- package/lib/scrapers/visa-cal.js +318 -0
- package/lib/scrapers/visa-cal.test.d.ts +1 -0
- package/lib/scrapers/visa-cal.test.js +49 -0
- package/lib/scrapers/yahav.d.ts +25 -0
- package/lib/scrapers/yahav.js +247 -0
- package/lib/scrapers/yahav.test.d.ts +1 -0
- package/lib/scrapers/yahav.test.js +49 -0
- package/lib/transactions.d.ts +47 -0
- package/lib/transactions.js +17 -0
- package/package.json +91 -0
|
@@ -0,0 +1,428 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.clickAccountSelectorGetAccountIds = clickAccountSelectorGetAccountIds;
|
|
7
|
+
exports.createLoginFields = createLoginFields;
|
|
8
|
+
exports.default = void 0;
|
|
9
|
+
exports.getPossibleLoginResults = getPossibleLoginResults;
|
|
10
|
+
exports.selectAccountFromDropdown = selectAccountFromDropdown;
|
|
11
|
+
exports.waitForPostLogin = waitForPostLogin;
|
|
12
|
+
var _moment = _interopRequireDefault(require("moment"));
|
|
13
|
+
var _constants = require("../constants");
|
|
14
|
+
var _elementsInteractions = require("../helpers/elements-interactions");
|
|
15
|
+
var _navigation = require("../helpers/navigation");
|
|
16
|
+
var _waiting = require("../helpers/waiting");
|
|
17
|
+
var _transactions = require("../transactions");
|
|
18
|
+
var _baseScraperWithBrowser = require("./base-scraper-with-browser");
|
|
19
|
+
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
|
|
20
|
+
const DATE_FORMAT = 'DD/MM/YYYY';
|
|
21
|
+
const NO_TRANSACTION_IN_DATE_RANGE_TEXT = 'לא נמצאו נתונים בנושא המבוקש';
|
|
22
|
+
const DATE_COLUMN_CLASS_COMPLETED = 'date first';
|
|
23
|
+
const DATE_COLUMN_CLASS_PENDING = 'first date';
|
|
24
|
+
const DESCRIPTION_COLUMN_CLASS_COMPLETED = 'reference wrap_normal';
|
|
25
|
+
const DESCRIPTION_COLUMN_CLASS_PENDING = 'details wrap_normal';
|
|
26
|
+
const REFERENCE_COLUMN_CLASS = 'details';
|
|
27
|
+
const DEBIT_COLUMN_CLASS = 'debit';
|
|
28
|
+
const CREDIT_COLUMN_CLASS = 'credit';
|
|
29
|
+
const ERROR_MESSAGE_CLASS = 'NO_DATA';
|
|
30
|
+
const ACCOUNTS_NUMBER = 'div.fibi_account span.acc_num';
|
|
31
|
+
const CLOSE_SEARCH_BY_DATES_BUTTON_CLASS = 'ui-datepicker-close';
|
|
32
|
+
const SHOW_SEARCH_BY_DATES_BUTTON_VALUE = 'הצג';
|
|
33
|
+
const COMPLETED_TRANSACTIONS_TABLE = 'table#dataTable077';
|
|
34
|
+
const PENDING_TRANSACTIONS_TABLE = 'table#dataTable023';
|
|
35
|
+
const NEXT_PAGE_LINK = 'a#Npage.paging';
|
|
36
|
+
const CURRENT_BALANCE = '.main_balance';
|
|
37
|
+
const IFRAME_NAME = 'iframe-old-pages';
|
|
38
|
+
const ELEMENT_RENDER_TIMEOUT_MS = 10000;
|
|
39
|
+
function getPossibleLoginResults() {
|
|
40
|
+
const urls = {};
|
|
41
|
+
urls[_baseScraperWithBrowser.LoginResults.Success] = [/fibi.*accountSummary/,
|
|
42
|
+
// New UI pattern
|
|
43
|
+
/Resources\/PortalNG\/shell/,
|
|
44
|
+
// New UI pattern
|
|
45
|
+
/FibiMenu\/Online/ // Old UI pattern
|
|
46
|
+
];
|
|
47
|
+
urls[_baseScraperWithBrowser.LoginResults.InvalidPassword] = [/FibiMenu\/Marketing\/Private\/Home/];
|
|
48
|
+
return urls;
|
|
49
|
+
}
|
|
50
|
+
function createLoginFields(credentials) {
|
|
51
|
+
return [{
|
|
52
|
+
selector: '#username',
|
|
53
|
+
value: credentials.username
|
|
54
|
+
}, {
|
|
55
|
+
selector: '#password',
|
|
56
|
+
value: credentials.password
|
|
57
|
+
}];
|
|
58
|
+
}
|
|
59
|
+
function getAmountData(amountStr) {
|
|
60
|
+
let amountStrCopy = amountStr.replace(_constants.SHEKEL_CURRENCY_SYMBOL, '');
|
|
61
|
+
amountStrCopy = amountStrCopy.replaceAll(',', '');
|
|
62
|
+
return parseFloat(amountStrCopy);
|
|
63
|
+
}
|
|
64
|
+
function getTxnAmount(txn) {
|
|
65
|
+
const credit = getAmountData(txn.credit);
|
|
66
|
+
const debit = getAmountData(txn.debit);
|
|
67
|
+
return (Number.isNaN(credit) ? 0 : credit) - (Number.isNaN(debit) ? 0 : debit);
|
|
68
|
+
}
|
|
69
|
+
function convertTransactions(txns) {
|
|
70
|
+
return txns.map(txn => {
|
|
71
|
+
const convertedDate = (0, _moment.default)(txn.date, DATE_FORMAT).toISOString();
|
|
72
|
+
const convertedAmount = getTxnAmount(txn);
|
|
73
|
+
return {
|
|
74
|
+
type: _transactions.TransactionTypes.Normal,
|
|
75
|
+
identifier: txn.reference ? parseInt(txn.reference, 10) : undefined,
|
|
76
|
+
date: convertedDate,
|
|
77
|
+
processedDate: convertedDate,
|
|
78
|
+
originalAmount: convertedAmount,
|
|
79
|
+
originalCurrency: _constants.SHEKEL_CURRENCY,
|
|
80
|
+
chargedAmount: convertedAmount,
|
|
81
|
+
status: txn.status,
|
|
82
|
+
description: txn.description,
|
|
83
|
+
memo: txn.memo
|
|
84
|
+
};
|
|
85
|
+
});
|
|
86
|
+
}
|
|
87
|
+
function getTransactionDate(tds, transactionType, transactionsColsTypes) {
|
|
88
|
+
if (transactionType === 'completed') {
|
|
89
|
+
return (tds[transactionsColsTypes[DATE_COLUMN_CLASS_COMPLETED]] || '').trim();
|
|
90
|
+
}
|
|
91
|
+
return (tds[transactionsColsTypes[DATE_COLUMN_CLASS_PENDING]] || '').trim();
|
|
92
|
+
}
|
|
93
|
+
function getTransactionDescription(tds, transactionType, transactionsColsTypes) {
|
|
94
|
+
if (transactionType === 'completed') {
|
|
95
|
+
return (tds[transactionsColsTypes[DESCRIPTION_COLUMN_CLASS_COMPLETED]] || '').trim();
|
|
96
|
+
}
|
|
97
|
+
return (tds[transactionsColsTypes[DESCRIPTION_COLUMN_CLASS_PENDING]] || '').trim();
|
|
98
|
+
}
|
|
99
|
+
function getTransactionReference(tds, transactionsColsTypes) {
|
|
100
|
+
return (tds[transactionsColsTypes[REFERENCE_COLUMN_CLASS]] || '').trim();
|
|
101
|
+
}
|
|
102
|
+
function getTransactionDebit(tds, transactionsColsTypes) {
|
|
103
|
+
return (tds[transactionsColsTypes[DEBIT_COLUMN_CLASS]] || '').trim();
|
|
104
|
+
}
|
|
105
|
+
function getTransactionCredit(tds, transactionsColsTypes) {
|
|
106
|
+
return (tds[transactionsColsTypes[CREDIT_COLUMN_CLASS]] || '').trim();
|
|
107
|
+
}
|
|
108
|
+
function extractTransactionDetails(txnRow, transactionStatus, transactionsColsTypes) {
|
|
109
|
+
const tds = txnRow.innerTds;
|
|
110
|
+
const item = {
|
|
111
|
+
status: transactionStatus,
|
|
112
|
+
date: getTransactionDate(tds, transactionStatus, transactionsColsTypes),
|
|
113
|
+
description: getTransactionDescription(tds, transactionStatus, transactionsColsTypes),
|
|
114
|
+
reference: getTransactionReference(tds, transactionsColsTypes),
|
|
115
|
+
debit: getTransactionDebit(tds, transactionsColsTypes),
|
|
116
|
+
credit: getTransactionCredit(tds, transactionsColsTypes)
|
|
117
|
+
};
|
|
118
|
+
return item;
|
|
119
|
+
}
|
|
120
|
+
async function getTransactionsColsTypeClasses(page, tableLocator) {
|
|
121
|
+
const result = {};
|
|
122
|
+
const typeClassesObjs = await (0, _elementsInteractions.pageEvalAll)(page, `${tableLocator} tbody tr:first-of-type td`, null, tds => {
|
|
123
|
+
return tds.map((td, index) => ({
|
|
124
|
+
colClass: td.getAttribute('class'),
|
|
125
|
+
index
|
|
126
|
+
}));
|
|
127
|
+
});
|
|
128
|
+
for (const typeClassObj of typeClassesObjs) {
|
|
129
|
+
if (typeClassObj.colClass) {
|
|
130
|
+
result[typeClassObj.colClass] = typeClassObj.index;
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
return result;
|
|
134
|
+
}
|
|
135
|
+
function extractTransaction(txns, transactionStatus, txnRow, transactionsColsTypes) {
|
|
136
|
+
const txn = extractTransactionDetails(txnRow, transactionStatus, transactionsColsTypes);
|
|
137
|
+
if (txn.date !== '') {
|
|
138
|
+
txns.push(txn);
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
async function extractTransactions(page, tableLocator, transactionStatus) {
|
|
142
|
+
const txns = [];
|
|
143
|
+
const transactionsColsTypes = await getTransactionsColsTypeClasses(page, tableLocator);
|
|
144
|
+
const transactionsRows = await (0, _elementsInteractions.pageEvalAll)(page, `${tableLocator} tbody tr`, [], trs => {
|
|
145
|
+
return trs.map(tr => ({
|
|
146
|
+
innerTds: Array.from(tr.getElementsByTagName('td')).map(td => td.innerText)
|
|
147
|
+
}));
|
|
148
|
+
});
|
|
149
|
+
for (const txnRow of transactionsRows) {
|
|
150
|
+
extractTransaction(txns, transactionStatus, txnRow, transactionsColsTypes);
|
|
151
|
+
}
|
|
152
|
+
return txns;
|
|
153
|
+
}
|
|
154
|
+
async function isNoTransactionInDateRangeError(page) {
|
|
155
|
+
const hasErrorInfoElement = await (0, _elementsInteractions.elementPresentOnPage)(page, `.${ERROR_MESSAGE_CLASS}`);
|
|
156
|
+
if (hasErrorInfoElement) {
|
|
157
|
+
const errorText = await page.$eval(`.${ERROR_MESSAGE_CLASS}`, errorElement => {
|
|
158
|
+
return errorElement.innerText;
|
|
159
|
+
});
|
|
160
|
+
return errorText.trim() === NO_TRANSACTION_IN_DATE_RANGE_TEXT;
|
|
161
|
+
}
|
|
162
|
+
return false;
|
|
163
|
+
}
|
|
164
|
+
async function searchByDates(page, startDate) {
|
|
165
|
+
await (0, _elementsInteractions.clickButton)(page, 'a#tabHeader4');
|
|
166
|
+
await (0, _elementsInteractions.waitUntilElementFound)(page, 'div#fibi_dates');
|
|
167
|
+
await (0, _elementsInteractions.fillInput)(page, 'input#fromDate', startDate.format(DATE_FORMAT));
|
|
168
|
+
await (0, _elementsInteractions.clickButton)(page, `button[class*=${CLOSE_SEARCH_BY_DATES_BUTTON_CLASS}]`);
|
|
169
|
+
await (0, _elementsInteractions.clickButton)(page, `input[value=${SHOW_SEARCH_BY_DATES_BUTTON_VALUE}]`);
|
|
170
|
+
await (0, _navigation.waitForNavigation)(page);
|
|
171
|
+
}
|
|
172
|
+
async function getAccountNumber(page) {
|
|
173
|
+
// Wait until the account number element is present in the DOM
|
|
174
|
+
await (0, _elementsInteractions.waitUntilElementFound)(page, ACCOUNTS_NUMBER, true, ELEMENT_RENDER_TIMEOUT_MS);
|
|
175
|
+
const selectedSnifAccount = await page.$eval(ACCOUNTS_NUMBER, option => {
|
|
176
|
+
return option.innerText;
|
|
177
|
+
});
|
|
178
|
+
return selectedSnifAccount.replace('/', '_').trim();
|
|
179
|
+
}
|
|
180
|
+
async function checkIfHasNextPage(page) {
|
|
181
|
+
return (0, _elementsInteractions.elementPresentOnPage)(page, NEXT_PAGE_LINK);
|
|
182
|
+
}
|
|
183
|
+
async function navigateToNextPage(page) {
|
|
184
|
+
await (0, _elementsInteractions.clickButton)(page, NEXT_PAGE_LINK);
|
|
185
|
+
await (0, _navigation.waitForNavigation)(page);
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
/* Couldn't reproduce scenario with multiple pages of pending transactions - Should support if exists such case.
|
|
189
|
+
needToPaginate is false if scraping pending transactions */
|
|
190
|
+
async function scrapeTransactions(page, tableLocator, transactionStatus, needToPaginate) {
|
|
191
|
+
const txns = [];
|
|
192
|
+
let hasNextPage = false;
|
|
193
|
+
do {
|
|
194
|
+
const currentPageTxns = await extractTransactions(page, tableLocator, transactionStatus);
|
|
195
|
+
txns.push(...currentPageTxns);
|
|
196
|
+
if (needToPaginate) {
|
|
197
|
+
hasNextPage = await checkIfHasNextPage(page);
|
|
198
|
+
if (hasNextPage) {
|
|
199
|
+
await navigateToNextPage(page);
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
} while (hasNextPage);
|
|
203
|
+
return convertTransactions(txns);
|
|
204
|
+
}
|
|
205
|
+
async function getAccountTransactions(page) {
|
|
206
|
+
await Promise.race([(0, _elementsInteractions.waitUntilElementFound)(page, "div[id*='divTable']", false), (0, _elementsInteractions.waitUntilElementFound)(page, `.${ERROR_MESSAGE_CLASS}`, false)]);
|
|
207
|
+
const noTransactionInRangeError = await isNoTransactionInDateRangeError(page);
|
|
208
|
+
if (noTransactionInRangeError) {
|
|
209
|
+
return [];
|
|
210
|
+
}
|
|
211
|
+
const pendingTxns = await scrapeTransactions(page, PENDING_TRANSACTIONS_TABLE, _transactions.TransactionStatuses.Pending, false);
|
|
212
|
+
const completedTxns = await scrapeTransactions(page, COMPLETED_TRANSACTIONS_TABLE, _transactions.TransactionStatuses.Completed, true);
|
|
213
|
+
const txns = [...pendingTxns, ...completedTxns];
|
|
214
|
+
return txns;
|
|
215
|
+
}
|
|
216
|
+
async function getCurrentBalance(page) {
|
|
217
|
+
// Wait for the balance element to appear and be visible
|
|
218
|
+
await (0, _elementsInteractions.waitUntilElementFound)(page, CURRENT_BALANCE, true, ELEMENT_RENDER_TIMEOUT_MS);
|
|
219
|
+
|
|
220
|
+
// Extract text content
|
|
221
|
+
const balanceStr = await page.$eval(CURRENT_BALANCE, el => {
|
|
222
|
+
return el.innerText;
|
|
223
|
+
});
|
|
224
|
+
return getAmountData(balanceStr);
|
|
225
|
+
}
|
|
226
|
+
async function waitForPostLogin(page) {
|
|
227
|
+
return Promise.race([(0, _elementsInteractions.waitUntilElementFound)(page, '#card-header', false),
|
|
228
|
+
// New UI
|
|
229
|
+
(0, _elementsInteractions.waitUntilElementFound)(page, '#account_num', true),
|
|
230
|
+
// New UI
|
|
231
|
+
(0, _elementsInteractions.waitUntilElementFound)(page, '#matafLogoutLink', true),
|
|
232
|
+
// Old UI
|
|
233
|
+
(0, _elementsInteractions.waitUntilElementFound)(page, '#validationMsg', true) // Old UI
|
|
234
|
+
]);
|
|
235
|
+
}
|
|
236
|
+
async function fetchAccountData(page, startDate) {
|
|
237
|
+
const accountNumber = await getAccountNumber(page);
|
|
238
|
+
const balance = await getCurrentBalance(page);
|
|
239
|
+
await searchByDates(page, startDate);
|
|
240
|
+
const txns = await getAccountTransactions(page);
|
|
241
|
+
return {
|
|
242
|
+
accountNumber,
|
|
243
|
+
txns,
|
|
244
|
+
balance
|
|
245
|
+
};
|
|
246
|
+
}
|
|
247
|
+
async function getAccountIdsOldUI(page) {
|
|
248
|
+
return page.evaluate(() => {
|
|
249
|
+
const selectElement = document.getElementById('account_num_select');
|
|
250
|
+
const options = selectElement ? selectElement.querySelectorAll('option') : [];
|
|
251
|
+
if (!options) return [];
|
|
252
|
+
return Array.from(options, option => option.value);
|
|
253
|
+
});
|
|
254
|
+
}
|
|
255
|
+
|
|
256
|
+
/**
|
|
257
|
+
* Ensures the account dropdown is open, then returns the available account labels.
|
|
258
|
+
*
|
|
259
|
+
* This method:
|
|
260
|
+
* - Checks if the dropdown is already open.
|
|
261
|
+
* - If not open, clicks the account selector to open it.
|
|
262
|
+
* - Waits for the dropdown to render.
|
|
263
|
+
* - Extracts and returns the list of available account labels.
|
|
264
|
+
*
|
|
265
|
+
* Graceful handling:
|
|
266
|
+
* - If any error occurs (e.g., selectors not found, timing issues, UI version changes),
|
|
267
|
+
* the function returns an empty list.
|
|
268
|
+
*
|
|
269
|
+
* @param page Puppeteer Page object.
|
|
270
|
+
* @returns An array of available account labels (e.g., ["127 | XXXX1", "127 | XXXX2"]),
|
|
271
|
+
* or an empty array if something goes wrong.
|
|
272
|
+
*/
|
|
273
|
+
async function clickAccountSelectorGetAccountIds(page) {
|
|
274
|
+
try {
|
|
275
|
+
const accountSelector = 'div.current-account'; // Direct selector to clickable element
|
|
276
|
+
const dropdownPanelSelector = 'div.mat-mdc-autocomplete-panel.account-select-dd'; // The dropdown list box
|
|
277
|
+
const optionSelector = 'mat-option .mdc-list-item__primary-text'; // Account option labels
|
|
278
|
+
|
|
279
|
+
// Check if dropdown is already open
|
|
280
|
+
const dropdownVisible = await page.$eval(dropdownPanelSelector, el => {
|
|
281
|
+
return el && window.getComputedStyle(el).display !== 'none' && el.offsetParent !== null;
|
|
282
|
+
}).catch(() => false); // catch if dropdown is not in the DOM yet
|
|
283
|
+
|
|
284
|
+
if (!dropdownVisible) {
|
|
285
|
+
await (0, _elementsInteractions.waitUntilElementFound)(page, accountSelector, true, ELEMENT_RENDER_TIMEOUT_MS);
|
|
286
|
+
|
|
287
|
+
// Click the account selector to open the dropdown
|
|
288
|
+
await (0, _elementsInteractions.clickButton)(page, accountSelector);
|
|
289
|
+
|
|
290
|
+
// Wait for the dropdown to open
|
|
291
|
+
await (0, _elementsInteractions.waitUntilElementFound)(page, dropdownPanelSelector, true, ELEMENT_RENDER_TIMEOUT_MS);
|
|
292
|
+
}
|
|
293
|
+
|
|
294
|
+
// Extract account labels from the dropdown options
|
|
295
|
+
const accountLabels = await page.$$eval(optionSelector, options => {
|
|
296
|
+
return options.map(option => option.textContent?.trim() || '').filter(label => label !== '');
|
|
297
|
+
});
|
|
298
|
+
return accountLabels;
|
|
299
|
+
} catch (error) {
|
|
300
|
+
return []; // Graceful fallback
|
|
301
|
+
}
|
|
302
|
+
}
|
|
303
|
+
async function getAccountIdsBothUIs(page) {
|
|
304
|
+
let accountsIds = await clickAccountSelectorGetAccountIds(page);
|
|
305
|
+
if (accountsIds.length === 0) {
|
|
306
|
+
accountsIds = await getAccountIdsOldUI(page);
|
|
307
|
+
}
|
|
308
|
+
return accountsIds;
|
|
309
|
+
}
|
|
310
|
+
|
|
311
|
+
/**
|
|
312
|
+
* Selects an account from the dropdown based on the provided account label.
|
|
313
|
+
*
|
|
314
|
+
* This method:
|
|
315
|
+
* - Clicks the account selector button to open the dropdown.
|
|
316
|
+
* - Retrieves the list of available account labels.
|
|
317
|
+
* - Checks if the provided account label exists in the list.
|
|
318
|
+
* - Finds and clicks the matching account option if found.
|
|
319
|
+
*
|
|
320
|
+
* @param page Puppeteer Page object.
|
|
321
|
+
* @param accountLabel The text of the account to select (e.g., "127 | XXXXX").
|
|
322
|
+
* @returns True if the account option was found and clicked; false otherwise.
|
|
323
|
+
*/
|
|
324
|
+
async function selectAccountFromDropdown(page, accountLabel) {
|
|
325
|
+
// Call clickAccountSelector to get the available accounts and open the dropdown
|
|
326
|
+
const availableAccounts = await clickAccountSelectorGetAccountIds(page);
|
|
327
|
+
|
|
328
|
+
// Check if the account label exists in the available accounts
|
|
329
|
+
if (!availableAccounts.includes(accountLabel)) {
|
|
330
|
+
return false;
|
|
331
|
+
}
|
|
332
|
+
|
|
333
|
+
// Wait for the dropdown options to be rendered
|
|
334
|
+
const optionSelector = 'mat-option .mdc-list-item__primary-text';
|
|
335
|
+
await (0, _elementsInteractions.waitUntilElementFound)(page, optionSelector, true, ELEMENT_RENDER_TIMEOUT_MS);
|
|
336
|
+
|
|
337
|
+
// Query all matching options
|
|
338
|
+
const accountOptions = await page.$$(optionSelector);
|
|
339
|
+
|
|
340
|
+
// Find and click the option matching the accountLabel
|
|
341
|
+
for (const option of accountOptions) {
|
|
342
|
+
const text = await page.evaluate(el => el.textContent?.trim(), option);
|
|
343
|
+
if (text === accountLabel) {
|
|
344
|
+
const optionHandle = await option.evaluateHandle(el => el);
|
|
345
|
+
await page.evaluate(el => el.click(), optionHandle);
|
|
346
|
+
return true;
|
|
347
|
+
}
|
|
348
|
+
}
|
|
349
|
+
return false;
|
|
350
|
+
}
|
|
351
|
+
async function getTransactionsFrame(page) {
|
|
352
|
+
// Try a few times to find the iframe, as it might not be immediately available
|
|
353
|
+
for (let attempt = 0; attempt < 3; attempt++) {
|
|
354
|
+
await (0, _waiting.sleep)(2000);
|
|
355
|
+
const frames = page.frames();
|
|
356
|
+
const targetFrame = frames.find(f => f.name() === IFRAME_NAME);
|
|
357
|
+
if (targetFrame) {
|
|
358
|
+
return targetFrame;
|
|
359
|
+
}
|
|
360
|
+
}
|
|
361
|
+
return null;
|
|
362
|
+
}
|
|
363
|
+
async function selectAccountBothUIs(page, accountId) {
|
|
364
|
+
const accountSelected = await selectAccountFromDropdown(page, accountId);
|
|
365
|
+
if (!accountSelected) {
|
|
366
|
+
// Old UI format
|
|
367
|
+
await page.select('#account_num_select', accountId);
|
|
368
|
+
await (0, _elementsInteractions.waitUntilElementFound)(page, '#account_num_select', true);
|
|
369
|
+
}
|
|
370
|
+
}
|
|
371
|
+
async function fetchAccountDataBothUIs(page, startDate) {
|
|
372
|
+
// Try to get the iframe for the new UI
|
|
373
|
+
const frame = await getTransactionsFrame(page);
|
|
374
|
+
|
|
375
|
+
// Use the frame if available (new UI), otherwise use the page directly (old UI)
|
|
376
|
+
const targetPage = frame || page;
|
|
377
|
+
return fetchAccountData(targetPage, startDate);
|
|
378
|
+
}
|
|
379
|
+
async function fetchAccounts(page, startDate) {
|
|
380
|
+
const accountsIds = await getAccountIdsBothUIs(page);
|
|
381
|
+
if (accountsIds.length === 0) {
|
|
382
|
+
// In case accountsIds could no be parsed just return the transactions of the currently selected account
|
|
383
|
+
const accountData = await fetchAccountDataBothUIs(page, startDate);
|
|
384
|
+
return [accountData];
|
|
385
|
+
}
|
|
386
|
+
const accounts = [];
|
|
387
|
+
for (const accountId of accountsIds) {
|
|
388
|
+
await selectAccountBothUIs(page, accountId);
|
|
389
|
+
const accountData = await fetchAccountDataBothUIs(page, startDate);
|
|
390
|
+
accounts.push(accountData);
|
|
391
|
+
}
|
|
392
|
+
return accounts;
|
|
393
|
+
}
|
|
394
|
+
class BeinleumiGroupBaseScraper extends _baseScraperWithBrowser.BaseScraperWithBrowser {
|
|
395
|
+
BASE_URL = '';
|
|
396
|
+
LOGIN_URL = '';
|
|
397
|
+
TRANSACTIONS_URL = '';
|
|
398
|
+
getLoginOptions(credentials) {
|
|
399
|
+
return {
|
|
400
|
+
loginUrl: `${this.LOGIN_URL}`,
|
|
401
|
+
fields: createLoginFields(credentials),
|
|
402
|
+
submitButtonSelector: '#continueBtn',
|
|
403
|
+
postAction: async () => waitForPostLogin(this.page),
|
|
404
|
+
possibleResults: getPossibleLoginResults(),
|
|
405
|
+
// HACK: For some reason, though the login button (#continueBtn) is present and visible, the click action does not perform.
|
|
406
|
+
// Adding this delay fixes the issue.
|
|
407
|
+
preAction: async () => {
|
|
408
|
+
await (0, _waiting.sleep)(1000);
|
|
409
|
+
}
|
|
410
|
+
};
|
|
411
|
+
}
|
|
412
|
+
async fetchData() {
|
|
413
|
+
const defaultStartMoment = (0, _moment.default)().subtract(1, 'years').add(1, 'day');
|
|
414
|
+
const startMomentLimit = (0, _moment.default)({
|
|
415
|
+
year: 1600
|
|
416
|
+
});
|
|
417
|
+
const startDate = this.options.startDate || defaultStartMoment.toDate();
|
|
418
|
+
const startMoment = _moment.default.max(startMomentLimit, (0, _moment.default)(startDate));
|
|
419
|
+
await this.navigateTo(this.TRANSACTIONS_URL);
|
|
420
|
+
const accounts = await fetchAccounts(this.page, startMoment);
|
|
421
|
+
return {
|
|
422
|
+
success: true,
|
|
423
|
+
accounts
|
|
424
|
+
};
|
|
425
|
+
}
|
|
426
|
+
}
|
|
427
|
+
var _default = exports.default = BeinleumiGroupBaseScraper;
|
|
428
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfbW9tZW50IiwiX2ludGVyb3BSZXF1aXJlRGVmYXVsdCIsInJlcXVpcmUiLCJfY29uc3RhbnRzIiwiX2VsZW1lbnRzSW50ZXJhY3Rpb25zIiwiX25hdmlnYXRpb24iLCJfd2FpdGluZyIsIl90cmFuc2FjdGlvbnMiLCJfYmFzZVNjcmFwZXJXaXRoQnJvd3NlciIsImUiLCJfX2VzTW9kdWxlIiwiZGVmYXVsdCIsIkRBVEVfRk9STUFUIiwiTk9fVFJBTlNBQ1RJT05fSU5fREFURV9SQU5HRV9URVhUIiwiREFURV9DT0xVTU5fQ0xBU1NfQ09NUExFVEVEIiwiREFURV9DT0xVTU5fQ0xBU1NfUEVORElORyIsIkRFU0NSSVBUSU9OX0NPTFVNTl9DTEFTU19DT01QTEVURUQiLCJERVNDUklQVElPTl9DT0xVTU5fQ0xBU1NfUEVORElORyIsIlJFRkVSRU5DRV9DT0xVTU5fQ0xBU1MiLCJERUJJVF9DT0xVTU5fQ0xBU1MiLCJDUkVESVRfQ09MVU1OX0NMQVNTIiwiRVJST1JfTUVTU0FHRV9DTEFTUyIsIkFDQ09VTlRTX05VTUJFUiIsIkNMT1NFX1NFQVJDSF9CWV9EQVRFU19CVVRUT05fQ0xBU1MiLCJTSE9XX1NFQVJDSF9CWV9EQVRFU19CVVRUT05fVkFMVUUiLCJDT01QTEVURURfVFJBTlNBQ1RJT05TX1RBQkxFIiwiUEVORElOR19UUkFOU0FDVElPTlNfVEFCTEUiLCJORVhUX1BBR0VfTElOSyIsIkNVUlJFTlRfQkFMQU5DRSIsIklGUkFNRV9OQU1FIiwiRUxFTUVOVF9SRU5ERVJfVElNRU9VVF9NUyIsImdldFBvc3NpYmxlTG9naW5SZXN1bHRzIiwidXJscyIsIkxvZ2luUmVzdWx0cyIsIlN1Y2Nlc3MiLCJJbnZhbGlkUGFzc3dvcmQiLCJjcmVhdGVMb2dpbkZpZWxkcyIsImNyZWRlbnRpYWxzIiwic2VsZWN0b3IiLCJ2YWx1ZSIsInVzZXJuYW1lIiwicGFzc3dvcmQiLCJnZXRBbW91bnREYXRhIiwiYW1vdW50U3RyIiwiYW1vdW50U3RyQ29weSIsInJlcGxhY2UiLCJTSEVLRUxfQ1VSUkVOQ1lfU1lNQk9MIiwicmVwbGFjZUFsbCIsInBhcnNlRmxvYXQiLCJnZXRUeG5BbW91bnQiLCJ0eG4iLCJjcmVkaXQiLCJkZWJpdCIsIk51bWJlciIsImlzTmFOIiwiY29udmVydFRyYW5zYWN0aW9ucyIsInR4bnMiLCJtYXAiLCJjb252ZXJ0ZWREYXRlIiwibW9tZW50IiwiZGF0ZSIsInRvSVNPU3RyaW5nIiwiY29udmVydGVkQW1vdW50IiwidHlwZSIsIlRyYW5zYWN0aW9uVHlwZXMiLCJOb3JtYWwiLCJpZGVudGlmaWVyIiwicmVmZXJlbmNlIiwicGFyc2VJbnQiLCJ1bmRlZmluZWQiLCJwcm9jZXNzZWREYXRlIiwib3JpZ2luYWxBbW91bnQiLCJvcmlnaW5hbEN1cnJlbmN5IiwiU0hFS0VMX0NVUlJFTkNZIiwiY2hhcmdlZEFtb3VudCIsInN0YXR1cyIsImRlc2NyaXB0aW9uIiwibWVtbyIsImdldFRyYW5zYWN0aW9uRGF0ZSIsInRkcyIsInRyYW5zYWN0aW9uVHlwZSIsInRyYW5zYWN0aW9uc0NvbHNUeXBlcyIsInRyaW0iLCJnZXRUcmFuc2FjdGlvbkRlc2NyaXB0aW9uIiwiZ2V0VHJhbnNhY3Rpb25SZWZlcmVuY2UiLCJnZXRUcmFuc2FjdGlvbkRlYml0IiwiZ2V0VHJhbnNhY3Rpb25DcmVkaXQiLCJleHRyYWN0VHJhbnNhY3Rpb25EZXRhaWxzIiwidHhuUm93IiwidHJhbnNhY3Rpb25TdGF0dXMiLCJpbm5lclRkcyIsIml0ZW0iLCJnZXRUcmFuc2FjdGlvbnNDb2xzVHlwZUNsYXNzZXMiLCJwYWdlIiwidGFibGVMb2NhdG9yIiwicmVzdWx0IiwidHlwZUNsYXNzZXNPYmpzIiwicGFnZUV2YWxBbGwiLCJ0ZCIsImluZGV4IiwiY29sQ2xhc3MiLCJnZXRBdHRyaWJ1dGUiLCJ0eXBlQ2xhc3NPYmoiLCJleHRyYWN0VHJhbnNhY3Rpb24iLCJwdXNoIiwiZXh0cmFjdFRyYW5zYWN0aW9ucyIsInRyYW5zYWN0aW9uc1Jvd3MiLCJ0cnMiLCJ0ciIsIkFycmF5IiwiZnJvbSIsImdldEVsZW1lbnRzQnlUYWdOYW1lIiwiaW5uZXJUZXh0IiwiaXNOb1RyYW5zYWN0aW9uSW5EYXRlUmFuZ2VFcnJvciIsImhhc0Vycm9ySW5mb0VsZW1lbnQiLCJlbGVtZW50UHJlc2VudE9uUGFnZSIsImVycm9yVGV4dCIsIiRldmFsIiwiZXJyb3JFbGVtZW50Iiwic2VhcmNoQnlEYXRlcyIsInN0YXJ0RGF0ZSIsImNsaWNrQnV0dG9uIiwid2FpdFVudGlsRWxlbWVudEZvdW5kIiwiZmlsbElucHV0IiwiZm9ybWF0Iiwid2FpdEZvck5hdmlnYXRpb24iLCJnZXRBY2NvdW50TnVtYmVyIiwic2VsZWN0ZWRTbmlmQWNjb3VudCIsIm9wdGlvbiIsImNoZWNrSWZIYXNOZXh0UGFnZSIsIm5hdmlnYXRlVG9OZXh0UGFnZSIsInNjcmFwZVRyYW5zYWN0aW9ucyIsIm5lZWRUb1BhZ2luYXRlIiwiaGFzTmV4dFBhZ2UiLCJjdXJyZW50UGFnZVR4bnMiLCJnZXRBY2NvdW50VHJhbnNhY3Rpb25zIiwiUHJvbWlzZSIsInJhY2UiLCJub1RyYW5zYWN0aW9uSW5SYW5nZUVycm9yIiwicGVuZGluZ1R4bnMiLCJUcmFuc2FjdGlvblN0YXR1c2VzIiwiUGVuZGluZyIsImNvbXBsZXRlZFR4bnMiLCJDb21wbGV0ZWQiLCJnZXRDdXJyZW50QmFsYW5jZSIsImJhbGFuY2VTdHIiLCJlbCIsIndhaXRGb3JQb3N0TG9naW4iLCJmZXRjaEFjY291bnREYXRhIiwiYWNjb3VudE51bWJlciIsImJhbGFuY2UiLCJnZXRBY2NvdW50SWRzT2xkVUkiLCJldmFsdWF0ZSIsInNlbGVjdEVsZW1lbnQiLCJkb2N1bWVudCIsImdldEVsZW1lbnRCeUlkIiwib3B0aW9ucyIsInF1ZXJ5U2VsZWN0b3JBbGwiLCJjbGlja0FjY291bnRTZWxlY3RvckdldEFjY291bnRJZHMiLCJhY2NvdW50U2VsZWN0b3IiLCJkcm9wZG93blBhbmVsU2VsZWN0b3IiLCJvcHRpb25TZWxlY3RvciIsImRyb3Bkb3duVmlzaWJsZSIsIndpbmRvdyIsImdldENvbXB1dGVkU3R5bGUiLCJkaXNwbGF5Iiwib2Zmc2V0UGFyZW50IiwiY2F0Y2giLCJhY2NvdW50TGFiZWxzIiwiJCRldmFsIiwidGV4dENvbnRlbnQiLCJmaWx0ZXIiLCJsYWJlbCIsImVycm9yIiwiZ2V0QWNjb3VudElkc0JvdGhVSXMiLCJhY2NvdW50c0lkcyIsImxlbmd0aCIsInNlbGVjdEFjY291bnRGcm9tRHJvcGRvd24iLCJhY2NvdW50TGFiZWwiLCJhdmFpbGFibGVBY2NvdW50cyIsImluY2x1ZGVzIiwiYWNjb3VudE9wdGlvbnMiLCIkJCIsInRleHQiLCJvcHRpb25IYW5kbGUiLCJldmFsdWF0ZUhhbmRsZSIsImNsaWNrIiwiZ2V0VHJhbnNhY3Rpb25zRnJhbWUiLCJhdHRlbXB0Iiwic2xlZXAiLCJmcmFtZXMiLCJ0YXJnZXRGcmFtZSIsImZpbmQiLCJmIiwibmFtZSIsInNlbGVjdEFjY291bnRCb3RoVUlzIiwiYWNjb3VudElkIiwiYWNjb3VudFNlbGVjdGVkIiwic2VsZWN0IiwiZmV0Y2hBY2NvdW50RGF0YUJvdGhVSXMiLCJmcmFtZSIsInRhcmdldFBhZ2UiLCJmZXRjaEFjY291bnRzIiwiYWNjb3VudERhdGEiLCJhY2NvdW50cyIsIkJlaW5sZXVtaUdyb3VwQmFzZVNjcmFwZXIiLCJCYXNlU2NyYXBlcldpdGhCcm93c2VyIiwiQkFTRV9VUkwiLCJMT0dJTl9VUkwiLCJUUkFOU0FDVElPTlNfVVJMIiwiZ2V0TG9naW5PcHRpb25zIiwibG9naW5VcmwiLCJmaWVsZHMiLCJzdWJtaXRCdXR0b25TZWxlY3RvciIsInBvc3RBY3Rpb24iLCJwb3NzaWJsZVJlc3VsdHMiLCJwcmVBY3Rpb24iLCJmZXRjaERhdGEiLCJkZWZhdWx0U3RhcnRNb21lbnQiLCJzdWJ0cmFjdCIsImFkZCIsInN0YXJ0TW9tZW50TGltaXQiLCJ5ZWFyIiwidG9EYXRlIiwic3RhcnRNb21lbnQiLCJtYXgiLCJuYXZpZ2F0ZVRvIiwic3VjY2VzcyIsIl9kZWZhdWx0IiwiZXhwb3J0cyJdLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9zY3JhcGVycy9iYXNlLWJlaW5sZXVtaS1ncm91cC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgbW9tZW50LCB7IHR5cGUgTW9tZW50IH0gZnJvbSAnbW9tZW50JztcbmltcG9ydCB7IHR5cGUgRnJhbWUsIHR5cGUgUGFnZSB9IGZyb20gJ3B1cHBldGVlcic7XG5pbXBvcnQgeyBTSEVLRUxfQ1VSUkVOQ1ksIFNIRUtFTF9DVVJSRU5DWV9TWU1CT0wgfSBmcm9tICcuLi9jb25zdGFudHMnO1xuaW1wb3J0IHtcbiAgY2xpY2tCdXR0b24sXG4gIGVsZW1lbnRQcmVzZW50T25QYWdlLFxuICBmaWxsSW5wdXQsXG4gIHBhZ2VFdmFsQWxsLFxuICB3YWl0VW50aWxFbGVtZW50Rm91bmQsXG59IGZyb20gJy4uL2hlbHBlcnMvZWxlbWVudHMtaW50ZXJhY3Rpb25zJztcbmltcG9ydCB7IHdhaXRGb3JOYXZpZ2F0aW9uIH0gZnJvbSAnLi4vaGVscGVycy9uYXZpZ2F0aW9uJztcbmltcG9ydCB7IHNsZWVwIH0gZnJvbSAnLi4vaGVscGVycy93YWl0aW5nJztcbmltcG9ydCB7IFRyYW5zYWN0aW9uU3RhdHVzZXMsIFRyYW5zYWN0aW9uVHlwZXMsIHR5cGUgVHJhbnNhY3Rpb24sIHR5cGUgVHJhbnNhY3Rpb25zQWNjb3VudCB9IGZyb20gJy4uL3RyYW5zYWN0aW9ucyc7XG5pbXBvcnQgeyBCYXNlU2NyYXBlcldpdGhCcm93c2VyLCBMb2dpblJlc3VsdHMsIHR5cGUgUG9zc2libGVMb2dpblJlc3VsdHMgfSBmcm9tICcuL2Jhc2Utc2NyYXBlci13aXRoLWJyb3dzZXInO1xuXG5jb25zdCBEQVRFX0ZPUk1BVCA9ICdERC9NTS9ZWVlZJztcbmNvbnN0IE5PX1RSQU5TQUNUSU9OX0lOX0RBVEVfUkFOR0VfVEVYVCA9ICfXnNeQINeg157XpteQ15Ug16DXqteV16DXmdedINeR16DXldep15Ag15TXnteR15XXp9epJztcbmNvbnN0IERBVEVfQ09MVU1OX0NMQVNTX0NPTVBMRVRFRCA9ICdkYXRlIGZpcnN0JztcbmNvbnN0IERBVEVfQ09MVU1OX0NMQVNTX1BFTkRJTkcgPSAnZmlyc3QgZGF0ZSc7XG5jb25zdCBERVNDUklQVElPTl9DT0xVTU5fQ0xBU1NfQ09NUExFVEVEID0gJ3JlZmVyZW5jZSB3cmFwX25vcm1hbCc7XG5jb25zdCBERVNDUklQVElPTl9DT0xVTU5fQ0xBU1NfUEVORElORyA9ICdkZXRhaWxzIHdyYXBfbm9ybWFsJztcbmNvbnN0IFJFRkVSRU5DRV9DT0xVTU5fQ0xBU1MgPSAnZGV0YWlscyc7XG5jb25zdCBERUJJVF9DT0xVTU5fQ0xBU1MgPSAnZGViaXQnO1xuY29uc3QgQ1JFRElUX0NPTFVNTl9DTEFTUyA9ICdjcmVkaXQnO1xuY29uc3QgRVJST1JfTUVTU0FHRV9DTEFTUyA9ICdOT19EQVRBJztcbmNvbnN0IEFDQ09VTlRTX05VTUJFUiA9ICdkaXYuZmliaV9hY2NvdW50IHNwYW4uYWNjX251bSc7XG5jb25zdCBDTE9TRV9TRUFSQ0hfQllfREFURVNfQlVUVE9OX0NMQVNTID0gJ3VpLWRhdGVwaWNrZXItY2xvc2UnO1xuY29uc3QgU0hPV19TRUFSQ0hfQllfREFURVNfQlVUVE9OX1ZBTFVFID0gJ9eU16bXkic7XG5jb25zdCBDT01QTEVURURfVFJBTlNBQ1RJT05TX1RBQkxFID0gJ3RhYmxlI2RhdGFUYWJsZTA3Nyc7XG5jb25zdCBQRU5ESU5HX1RSQU5TQUNUSU9OU19UQUJMRSA9ICd0YWJsZSNkYXRhVGFibGUwMjMnO1xuY29uc3QgTkVYVF9QQUdFX0xJTksgPSAnYSNOcGFnZS5wYWdpbmcnO1xuY29uc3QgQ1VSUkVOVF9CQUxBTkNFID0gJy5tYWluX2JhbGFuY2UnO1xuY29uc3QgSUZSQU1FX05BTUUgPSAnaWZyYW1lLW9sZC1wYWdlcyc7XG5jb25zdCBFTEVNRU5UX1JFTkRFUl9USU1FT1VUX01TID0gMTAwMDA7XG5cbnR5cGUgVHJhbnNhY3Rpb25zQ29sc1R5cGVzID0gUmVjb3JkPHN0cmluZywgbnVtYmVyPjtcbnR5cGUgVHJhbnNhY3Rpb25zVHJUZHMgPSBzdHJpbmdbXTtcbnR5cGUgVHJhbnNhY3Rpb25zVHIgPSB7IGlubmVyVGRzOiBUcmFuc2FjdGlvbnNUclRkcyB9O1xuXG5pbnRlcmZhY2UgU2NyYXBlZFRyYW5zYWN0aW9uIHtcbiAgcmVmZXJlbmNlOiBzdHJpbmc7XG4gIGRhdGU6IHN0cmluZztcbiAgY3JlZGl0OiBzdHJpbmc7XG4gIGRlYml0OiBzdHJpbmc7XG4gIG1lbW8/OiBzdHJpbmc7XG4gIGRlc2NyaXB0aW9uOiBzdHJpbmc7XG4gIHN0YXR1czogVHJhbnNhY3Rpb25TdGF0dXNlcztcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldFBvc3NpYmxlTG9naW5SZXN1bHRzKCk6IFBvc3NpYmxlTG9naW5SZXN1bHRzIHtcbiAgY29uc3QgdXJsczogUG9zc2libGVMb2dpblJlc3VsdHMgPSB7fTtcbiAgdXJsc1tMb2dpblJlc3VsdHMuU3VjY2Vzc10gPSBbXG4gICAgL2ZpYmkuKmFjY291bnRTdW1tYXJ5LywgLy8gTmV3IFVJIHBhdHRlcm5cbiAgICAvUmVzb3VyY2VzXFwvUG9ydGFsTkdcXC9zaGVsbC8sIC8vIE5ldyBVSSBwYXR0ZXJuXG4gICAgL0ZpYmlNZW51XFwvT25saW5lLywgLy8gT2xkIFVJIHBhdHRlcm5cbiAgXTtcbiAgdXJsc1tMb2dpblJlc3VsdHMuSW52YWxpZFBhc3N3b3JkXSA9IFsvRmliaU1lbnVcXC9NYXJrZXRpbmdcXC9Qcml2YXRlXFwvSG9tZS9dO1xuICByZXR1cm4gdXJscztcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUxvZ2luRmllbGRzKGNyZWRlbnRpYWxzOiBTY3JhcGVyU3BlY2lmaWNDcmVkZW50aWFscykge1xuICByZXR1cm4gW1xuICAgIHsgc2VsZWN0b3I6ICcjdXNlcm5hbWUnLCB2YWx1ZTogY3JlZGVudGlhbHMudXNlcm5hbWUgfSxcbiAgICB7IHNlbGVjdG9yOiAnI3Bhc3N3b3JkJywgdmFsdWU6IGNyZWRlbnRpYWxzLnBhc3N3b3JkIH0sXG4gIF07XG59XG5cbmZ1bmN0aW9uIGdldEFtb3VudERhdGEoYW1vdW50U3RyOiBzdHJpbmcpIHtcbiAgbGV0IGFtb3VudFN0ckNvcHkgPSBhbW91bnRTdHIucmVwbGFjZShTSEVLRUxfQ1VSUkVOQ1lfU1lNQk9MLCAnJyk7XG4gIGFtb3VudFN0ckNvcHkgPSBhbW91bnRTdHJDb3B5LnJlcGxhY2VBbGwoJywnLCAnJyk7XG4gIHJldHVybiBwYXJzZUZsb2F0KGFtb3VudFN0ckNvcHkpO1xufVxuXG5mdW5jdGlvbiBnZXRUeG5BbW91bnQodHhuOiBTY3JhcGVkVHJhbnNhY3Rpb24pIHtcbiAgY29uc3QgY3JlZGl0ID0gZ2V0QW1vdW50RGF0YSh0eG4uY3JlZGl0KTtcbiAgY29uc3QgZGViaXQgPSBnZXRBbW91bnREYXRhKHR4bi5kZWJpdCk7XG4gIHJldHVybiAoTnVtYmVyLmlzTmFOKGNyZWRpdCkgPyAwIDogY3JlZGl0KSAtIChOdW1iZXIuaXNOYU4oZGViaXQpID8gMCA6IGRlYml0KTtcbn1cblxuZnVuY3Rpb24gY29udmVydFRyYW5zYWN0aW9ucyh0eG5zOiBTY3JhcGVkVHJhbnNhY3Rpb25bXSk6IFRyYW5zYWN0aW9uW10ge1xuICByZXR1cm4gdHhucy5tYXAoKHR4bik6IFRyYW5zYWN0aW9uID0+IHtcbiAgICBjb25zdCBjb252ZXJ0ZWREYXRlID0gbW9tZW50KHR4bi5kYXRlLCBEQVRFX0ZPUk1BVCkudG9JU09TdHJpbmcoKTtcbiAgICBjb25zdCBjb252ZXJ0ZWRBbW91bnQgPSBnZXRUeG5BbW91bnQodHhuKTtcbiAgICByZXR1cm4ge1xuICAgICAgdHlwZTogVHJhbnNhY3Rpb25UeXBlcy5Ob3JtYWwsXG4gICAgICBpZGVudGlmaWVyOiB0eG4ucmVmZXJlbmNlID8gcGFyc2VJbnQodHhuLnJlZmVyZW5jZSwgMTApIDogdW5kZWZpbmVkLFxuICAgICAgZGF0ZTogY29udmVydGVkRGF0ZSxcbiAgICAgIHByb2Nlc3NlZERhdGU6IGNvbnZlcnRlZERhdGUsXG4gICAgICBvcmlnaW5hbEFtb3VudDogY29udmVydGVkQW1vdW50LFxuICAgICAgb3JpZ2luYWxDdXJyZW5jeTogU0hFS0VMX0NVUlJFTkNZLFxuICAgICAgY2hhcmdlZEFtb3VudDogY29udmVydGVkQW1vdW50LFxuICAgICAgc3RhdHVzOiB0eG4uc3RhdHVzLFxuICAgICAgZGVzY3JpcHRpb246IHR4bi5kZXNjcmlwdGlvbixcbiAgICAgIG1lbW86IHR4bi5tZW1vLFxuICAgIH07XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBnZXRUcmFuc2FjdGlvbkRhdGUoXG4gIHRkczogVHJhbnNhY3Rpb25zVHJUZHMsXG4gIHRyYW5zYWN0aW9uVHlwZTogc3RyaW5nLFxuICB0cmFuc2FjdGlvbnNDb2xzVHlwZXM6IFRyYW5zYWN0aW9uc0NvbHNUeXBlcyxcbikge1xuICBpZiAodHJhbnNhY3Rpb25UeXBlID09PSAnY29tcGxldGVkJykge1xuICAgIHJldHVybiAodGRzW3RyYW5zYWN0aW9uc0NvbHNUeXBlc1tEQVRFX0NPTFVNTl9DTEFTU19DT01QTEVURURdXSB8fCAnJykudHJpbSgpO1xuICB9XG4gIHJldHVybiAodGRzW3RyYW5zYWN0aW9uc0NvbHNUeXBlc1tEQVRFX0NPTFVNTl9DTEFTU19QRU5ESU5HXV0gfHwgJycpLnRyaW0oKTtcbn1cblxuZnVuY3Rpb24gZ2V0VHJhbnNhY3Rpb25EZXNjcmlwdGlvbihcbiAgdGRzOiBUcmFuc2FjdGlvbnNUclRkcyxcbiAgdHJhbnNhY3Rpb25UeXBlOiBzdHJpbmcsXG4gIHRyYW5zYWN0aW9uc0NvbHNUeXBlczogVHJhbnNhY3Rpb25zQ29sc1R5cGVzLFxuKSB7XG4gIGlmICh0cmFuc2FjdGlvblR5cGUgPT09ICdjb21wbGV0ZWQnKSB7XG4gICAgcmV0dXJuICh0ZHNbdHJhbnNhY3Rpb25zQ29sc1R5cGVzW0RFU0NSSVBUSU9OX0NPTFVNTl9DTEFTU19DT01QTEVURURdXSB8fCAnJykudHJpbSgpO1xuICB9XG4gIHJldHVybiAodGRzW3RyYW5zYWN0aW9uc0NvbHNUeXBlc1tERVNDUklQVElPTl9DT0xVTU5fQ0xBU1NfUEVORElOR11dIHx8ICcnKS50cmltKCk7XG59XG5cbmZ1bmN0aW9uIGdldFRyYW5zYWN0aW9uUmVmZXJlbmNlKHRkczogVHJhbnNhY3Rpb25zVHJUZHMsIHRyYW5zYWN0aW9uc0NvbHNUeXBlczogVHJhbnNhY3Rpb25zQ29sc1R5cGVzKSB7XG4gIHJldHVybiAodGRzW3RyYW5zYWN0aW9uc0NvbHNUeXBlc1tSRUZFUkVOQ0VfQ09MVU1OX0NMQVNTXV0gfHwgJycpLnRyaW0oKTtcbn1cblxuZnVuY3Rpb24gZ2V0VHJhbnNhY3Rpb25EZWJpdCh0ZHM6IFRyYW5zYWN0aW9uc1RyVGRzLCB0cmFuc2FjdGlvbnNDb2xzVHlwZXM6IFRyYW5zYWN0aW9uc0NvbHNUeXBlcykge1xuICByZXR1cm4gKHRkc1t0cmFuc2FjdGlvbnNDb2xzVHlwZXNbREVCSVRfQ09MVU1OX0NMQVNTXV0gfHwgJycpLnRyaW0oKTtcbn1cblxuZnVuY3Rpb24gZ2V0VHJhbnNhY3Rpb25DcmVkaXQodGRzOiBUcmFuc2FjdGlvbnNUclRkcywgdHJhbnNhY3Rpb25zQ29sc1R5cGVzOiBUcmFuc2FjdGlvbnNDb2xzVHlwZXMpIHtcbiAgcmV0dXJuICh0ZHNbdHJhbnNhY3Rpb25zQ29sc1R5cGVzW0NSRURJVF9DT0xVTU5fQ0xBU1NdXSB8fCAnJykudHJpbSgpO1xufVxuXG5mdW5jdGlvbiBleHRyYWN0VHJhbnNhY3Rpb25EZXRhaWxzKFxuICB0eG5Sb3c6IFRyYW5zYWN0aW9uc1RyLFxuICB0cmFuc2FjdGlvblN0YXR1czogVHJhbnNhY3Rpb25TdGF0dXNlcyxcbiAgdHJhbnNhY3Rpb25zQ29sc1R5cGVzOiBUcmFuc2FjdGlvbnNDb2xzVHlwZXMsXG4pOiBTY3JhcGVkVHJhbnNhY3Rpb24ge1xuICBjb25zdCB0ZHMgPSB0eG5Sb3cuaW5uZXJUZHM7XG4gIGNvbnN0IGl0ZW0gPSB7XG4gICAgc3RhdHVzOiB0cmFuc2FjdGlvblN0YXR1cyxcbiAgICBkYXRlOiBnZXRUcmFuc2FjdGlvbkRhdGUodGRzLCB0cmFuc2FjdGlvblN0YXR1cywgdHJhbnNhY3Rpb25zQ29sc1R5cGVzKSxcbiAgICBkZXNjcmlwdGlvbjogZ2V0VHJhbnNhY3Rpb25EZXNjcmlwdGlvbih0ZHMsIHRyYW5zYWN0aW9uU3RhdHVzLCB0cmFuc2FjdGlvbnNDb2xzVHlwZXMpLFxuICAgIHJlZmVyZW5jZTogZ2V0VHJhbnNhY3Rpb25SZWZlcmVuY2UodGRzLCB0cmFuc2FjdGlvbnNDb2xzVHlwZXMpLFxuICAgIGRlYml0OiBnZXRUcmFuc2FjdGlvbkRlYml0KHRkcywgdHJhbnNhY3Rpb25zQ29sc1R5cGVzKSxcbiAgICBjcmVkaXQ6IGdldFRyYW5zYWN0aW9uQ3JlZGl0KHRkcywgdHJhbnNhY3Rpb25zQ29sc1R5cGVzKSxcbiAgfTtcblxuICByZXR1cm4gaXRlbTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gZ2V0VHJhbnNhY3Rpb25zQ29sc1R5cGVDbGFzc2VzKFxuICBwYWdlOiBQYWdlIHwgRnJhbWUsXG4gIHRhYmxlTG9jYXRvcjogc3RyaW5nLFxuKTogUHJvbWlzZTxUcmFuc2FjdGlvbnNDb2xzVHlwZXM+IHtcbiAgY29uc3QgcmVzdWx0OiBUcmFuc2FjdGlvbnNDb2xzVHlwZXMgPSB7fTtcbiAgY29uc3QgdHlwZUNsYXNzZXNPYmpzID0gYXdhaXQgcGFnZUV2YWxBbGwocGFnZSwgYCR7dGFibGVMb2NhdG9yfSB0Ym9keSB0cjpmaXJzdC1vZi10eXBlIHRkYCwgbnVsbCwgdGRzID0+IHtcbiAgICByZXR1cm4gdGRzLm1hcCgodGQsIGluZGV4KSA9PiAoe1xuICAgICAgY29sQ2xhc3M6IHRkLmdldEF0dHJpYnV0ZSgnY2xhc3MnKSxcbiAgICAgIGluZGV4LFxuICAgIH0pKTtcbiAgfSk7XG5cbiAgZm9yIChjb25zdCB0eXBlQ2xhc3NPYmogb2YgdHlwZUNsYXNzZXNPYmpzKSB7XG4gICAgaWYgKHR5cGVDbGFzc09iai5jb2xDbGFzcykge1xuICAgICAgcmVzdWx0W3R5cGVDbGFzc09iai5jb2xDbGFzc10gPSB0eXBlQ2xhc3NPYmouaW5kZXg7XG4gICAgfVxuICB9XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbmZ1bmN0aW9uIGV4dHJhY3RUcmFuc2FjdGlvbihcbiAgdHhuczogU2NyYXBlZFRyYW5zYWN0aW9uW10sXG4gIHRyYW5zYWN0aW9uU3RhdHVzOiBUcmFuc2FjdGlvblN0YXR1c2VzLFxuICB0eG5Sb3c6IFRyYW5zYWN0aW9uc1RyLFxuICB0cmFuc2FjdGlvbnNDb2xzVHlwZXM6IFRyYW5zYWN0aW9uc0NvbHNUeXBlcyxcbikge1xuICBjb25zdCB0eG4gPSBleHRyYWN0VHJhbnNhY3Rpb25EZXRhaWxzKHR4blJvdywgdHJhbnNhY3Rpb25TdGF0dXMsIHRyYW5zYWN0aW9uc0NvbHNUeXBlcyk7XG4gIGlmICh0eG4uZGF0ZSAhPT0gJycpIHtcbiAgICB0eG5zLnB1c2godHhuKTtcbiAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiBleHRyYWN0VHJhbnNhY3Rpb25zKHBhZ2U6IFBhZ2UgfCBGcmFtZSwgdGFibGVMb2NhdG9yOiBzdHJpbmcsIHRyYW5zYWN0aW9uU3RhdHVzOiBUcmFuc2FjdGlvblN0YXR1c2VzKSB7XG4gIGNvbnN0IHR4bnM6IFNjcmFwZWRUcmFuc2FjdGlvbltdID0gW107XG4gIGNvbnN0IHRyYW5zYWN0aW9uc0NvbHNUeXBlcyA9IGF3YWl0IGdldFRyYW5zYWN0aW9uc0NvbHNUeXBlQ2xhc3NlcyhwYWdlLCB0YWJsZUxvY2F0b3IpO1xuXG4gIGNvbnN0IHRyYW5zYWN0aW9uc1Jvd3MgPSBhd2FpdCBwYWdlRXZhbEFsbDxUcmFuc2FjdGlvbnNUcltdPihwYWdlLCBgJHt0YWJsZUxvY2F0b3J9IHRib2R5IHRyYCwgW10sIHRycyA9PiB7XG4gICAgcmV0dXJuIHRycy5tYXAodHIgPT4gKHtcbiAgICAgIGlubmVyVGRzOiBBcnJheS5mcm9tKHRyLmdldEVsZW1lbnRzQnlUYWdOYW1lKCd0ZCcpKS5tYXAodGQgPT4gdGQuaW5uZXJUZXh0KSxcbiAgICB9KSk7XG4gIH0pO1xuXG4gIGZvciAoY29uc3QgdHhuUm93IG9mIHRyYW5zYWN0aW9uc1Jvd3MpIHtcbiAgICBleHRyYWN0VHJhbnNhY3Rpb24odHhucywgdHJhbnNhY3Rpb25TdGF0dXMsIHR4blJvdywgdHJhbnNhY3Rpb25zQ29sc1R5cGVzKTtcbiAgfVxuICByZXR1cm4gdHhucztcbn1cblxuYXN5bmMgZnVuY3Rpb24gaXNOb1RyYW5zYWN0aW9uSW5EYXRlUmFuZ2VFcnJvcihwYWdlOiBQYWdlIHwgRnJhbWUpIHtcbiAgY29uc3QgaGFzRXJyb3JJbmZvRWxlbWVudCA9IGF3YWl0IGVsZW1lbnRQcmVzZW50T25QYWdlKHBhZ2UsIGAuJHtFUlJPUl9NRVNTQUdFX0NMQVNTfWApO1xuICBpZiAoaGFzRXJyb3JJbmZvRWxlbWVudCkge1xuICAgIGNvbnN0IGVycm9yVGV4dCA9IGF3YWl0IHBhZ2UuJGV2YWwoYC4ke0VSUk9SX01FU1NBR0VfQ0xBU1N9YCwgZXJyb3JFbGVtZW50ID0+IHtcbiAgICAgIHJldHVybiAoZXJyb3JFbGVtZW50IGFzIEhUTUxFbGVtZW50KS5pbm5lclRleHQ7XG4gICAgfSk7XG4gICAgcmV0dXJuIGVycm9yVGV4dC50cmltKCkgPT09IE5PX1RSQU5TQUNUSU9OX0lOX0RBVEVfUkFOR0VfVEVYVDtcbiAgfVxuICByZXR1cm4gZmFsc2U7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHNlYXJjaEJ5RGF0ZXMocGFnZTogUGFnZSB8IEZyYW1lLCBzdGFydERhdGU6IE1vbWVudCkge1xuICBhd2FpdCBjbGlja0J1dHRvbihwYWdlLCAnYSN0YWJIZWFkZXI0Jyk7XG4gIGF3YWl0IHdhaXRVbnRpbEVsZW1lbnRGb3VuZChwYWdlLCAnZGl2I2ZpYmlfZGF0ZXMnKTtcbiAgYXdhaXQgZmlsbElucHV0KHBhZ2UsICdpbnB1dCNmcm9tRGF0ZScsIHN0YXJ0RGF0ZS5mb3JtYXQoREFURV9GT1JNQVQpKTtcbiAgYXdhaXQgY2xpY2tCdXR0b24ocGFnZSwgYGJ1dHRvbltjbGFzcyo9JHtDTE9TRV9TRUFSQ0hfQllfREFURVNfQlVUVE9OX0NMQVNTfV1gKTtcbiAgYXdhaXQgY2xpY2tCdXR0b24ocGFnZSwgYGlucHV0W3ZhbHVlPSR7U0hPV19TRUFSQ0hfQllfREFURVNfQlVUVE9OX1ZBTFVFfV1gKTtcbiAgYXdhaXQgd2FpdEZvck5hdmlnYXRpb24ocGFnZSk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGdldEFjY291bnROdW1iZXIocGFnZTogUGFnZSB8IEZyYW1lKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgLy8gV2FpdCB1bnRpbCB0aGUgYWNjb3VudCBudW1iZXIgZWxlbWVudCBpcyBwcmVzZW50IGluIHRoZSBET01cbiAgYXdhaXQgd2FpdFVudGlsRWxlbWVudEZvdW5kKHBhZ2UsIEFDQ09VTlRTX05VTUJFUiwgdHJ1ZSwgRUxFTUVOVF9SRU5ERVJfVElNRU9VVF9NUyk7XG5cbiAgY29uc3Qgc2VsZWN0ZWRTbmlmQWNjb3VudCA9IGF3YWl0IHBhZ2UuJGV2YWwoQUNDT1VOVFNfTlVNQkVSLCBvcHRpb24gPT4ge1xuICAgIHJldHVybiAob3B0aW9uIGFzIEhUTUxFbGVtZW50KS5pbm5lclRleHQ7XG4gIH0pO1xuXG4gIHJldHVybiBzZWxlY3RlZFNuaWZBY2NvdW50LnJlcGxhY2UoJy8nLCAnXycpLnRyaW0oKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gY2hlY2tJZkhhc05leHRQYWdlKHBhZ2U6IFBhZ2UgfCBGcmFtZSkge1xuICByZXR1cm4gZWxlbWVudFByZXNlbnRPblBhZ2UocGFnZSwgTkVYVF9QQUdFX0xJTkspO1xufVxuXG5hc3luYyBmdW5jdGlvbiBuYXZpZ2F0ZVRvTmV4dFBhZ2UocGFnZTogUGFnZSB8IEZyYW1lKSB7XG4gIGF3YWl0IGNsaWNrQnV0dG9uKHBhZ2UsIE5FWFRfUEFHRV9MSU5LKTtcbiAgYXdhaXQgd2FpdEZvck5hdmlnYXRpb24ocGFnZSk7XG59XG5cbi8qIENvdWxkbid0IHJlcHJvZHVjZSBzY2VuYXJpbyB3aXRoIG11bHRpcGxlIHBhZ2VzIG9mIHBlbmRpbmcgdHJhbnNhY3Rpb25zIC0gU2hvdWxkIHN1cHBvcnQgaWYgZXhpc3RzIHN1Y2ggY2FzZS5cbiAgIG5lZWRUb1BhZ2luYXRlIGlzIGZhbHNlIGlmIHNjcmFwaW5nIHBlbmRpbmcgdHJhbnNhY3Rpb25zICovXG5hc3luYyBmdW5jdGlvbiBzY3JhcGVUcmFuc2FjdGlvbnMoXG4gIHBhZ2U6IFBhZ2UgfCBGcmFtZSxcbiAgdGFibGVMb2NhdG9yOiBzdHJpbmcsXG4gIHRyYW5zYWN0aW9uU3RhdHVzOiBUcmFuc2FjdGlvblN0YXR1c2VzLFxuICBuZWVkVG9QYWdpbmF0ZTogYm9vbGVhbixcbikge1xuICBjb25zdCB0eG5zID0gW107XG4gIGxldCBoYXNOZXh0UGFnZSA9IGZhbHNlO1xuXG4gIGRvIHtcbiAgICBjb25zdCBjdXJyZW50UGFnZVR4bnMgPSBhd2FpdCBleHRyYWN0VHJhbnNhY3Rpb25zKHBhZ2UsIHRhYmxlTG9jYXRvciwgdHJhbnNhY3Rpb25TdGF0dXMpO1xuICAgIHR4bnMucHVzaCguLi5jdXJyZW50UGFnZVR4bnMpO1xuICAgIGlmIChuZWVkVG9QYWdpbmF0ZSkge1xuICAgICAgaGFzTmV4dFBhZ2UgPSBhd2FpdCBjaGVja0lmSGFzTmV4dFBhZ2UocGFnZSk7XG4gICAgICBpZiAoaGFzTmV4dFBhZ2UpIHtcbiAgICAgICAgYXdhaXQgbmF2aWdhdGVUb05leHRQYWdlKHBhZ2UpO1xuICAgICAgfVxuICAgIH1cbiAgfSB3aGlsZSAoaGFzTmV4dFBhZ2UpO1xuXG4gIHJldHVybiBjb252ZXJ0VHJhbnNhY3Rpb25zKHR4bnMpO1xufVxuXG5hc3luYyBmdW5jdGlvbiBnZXRBY2NvdW50VHJhbnNhY3Rpb25zKHBhZ2U6IFBhZ2UgfCBGcmFtZSkge1xuICBhd2FpdCBQcm9taXNlLnJhY2UoW1xuICAgIHdhaXRVbnRpbEVsZW1lbnRGb3VuZChwYWdlLCBcImRpdltpZCo9J2RpdlRhYmxlJ11cIiwgZmFsc2UpLFxuICAgIHdhaXRVbnRpbEVsZW1lbnRGb3VuZChwYWdlLCBgLiR7RVJST1JfTUVTU0FHRV9DTEFTU31gLCBmYWxzZSksXG4gIF0pO1xuXG4gIGNvbnN0IG5vVHJhbnNhY3Rpb25JblJhbmdlRXJyb3IgPSBhd2FpdCBpc05vVHJhbnNhY3Rpb25JbkRhdGVSYW5nZUVycm9yKHBhZ2UpO1xuICBpZiAobm9UcmFuc2FjdGlvbkluUmFuZ2VFcnJvcikge1xuICAgIHJldHVybiBbXTtcbiAgfVxuXG4gIGNvbnN0IHBlbmRpbmdUeG5zID0gYXdhaXQgc2NyYXBlVHJhbnNhY3Rpb25zKHBhZ2UsIFBFTkRJTkdfVFJBTlNBQ1RJT05TX1RBQkxFLCBUcmFuc2FjdGlvblN0YXR1c2VzLlBlbmRpbmcsIGZhbHNlKTtcbiAgY29uc3QgY29tcGxldGVkVHhucyA9IGF3YWl0IHNjcmFwZVRyYW5zYWN0aW9ucyhcbiAgICBwYWdlLFxuICAgIENPTVBMRVRFRF9UUkFOU0FDVElPTlNfVEFCTEUsXG4gICAgVHJhbnNhY3Rpb25TdGF0dXNlcy5Db21wbGV0ZWQsXG4gICAgdHJ1ZSxcbiAgKTtcbiAgY29uc3QgdHhucyA9IFsuLi5wZW5kaW5nVHhucywgLi4uY29tcGxldGVkVHhuc107XG4gIHJldHVybiB0eG5zO1xufVxuXG5hc3luYyBmdW5jdGlvbiBnZXRDdXJyZW50QmFsYW5jZShwYWdlOiBQYWdlIHwgRnJhbWUpOiBQcm9taXNlPG51bWJlcj4ge1xuICAvLyBXYWl0IGZvciB0aGUgYmFsYW5jZSBlbGVtZW50IHRvIGFwcGVhciBhbmQgYmUgdmlzaWJsZVxuICBhd2FpdCB3YWl0VW50aWxFbGVtZW50Rm91bmQocGFnZSwgQ1VSUkVOVF9CQUxBTkNFLCB0cnVlLCBFTEVNRU5UX1JFTkRFUl9USU1FT1VUX01TKTtcblxuICAvLyBFeHRyYWN0IHRleHQgY29udGVudFxuICBjb25zdCBiYWxhbmNlU3RyID0gYXdhaXQgcGFnZS4kZXZhbChDVVJSRU5UX0JBTEFOQ0UsIGVsID0+IHtcbiAgICByZXR1cm4gKGVsIGFzIEhUTUxFbGVtZW50KS5pbm5lclRleHQ7XG4gIH0pO1xuXG4gIHJldHVybiBnZXRBbW91bnREYXRhKGJhbGFuY2VTdHIpO1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gd2FpdEZvclBvc3RMb2dpbihwYWdlOiBQYWdlKSB7XG4gIHJldHVybiBQcm9taXNlLnJhY2UoW1xuICAgIHdhaXRVbnRpbEVsZW1lbnRGb3VuZChwYWdlLCAnI2NhcmQtaGVhZGVyJywgZmFsc2UpLCAvLyBOZXcgVUlcbiAgICB3YWl0VW50aWxFbGVtZW50Rm91bmQocGFnZSwgJyNhY2NvdW50X251bScsIHRydWUpLCAvLyBOZXcgVUlcbiAgICB3YWl0VW50aWxFbGVtZW50Rm91bmQocGFnZSwgJyNtYXRhZkxvZ291dExpbmsnLCB0cnVlKSwgLy8gT2xkIFVJXG4gICAgd2FpdFVudGlsRWxlbWVudEZvdW5kKHBhZ2UsICcjdmFsaWRhdGlvbk1zZycsIHRydWUpLCAvLyBPbGQgVUlcbiAgXSk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGZldGNoQWNjb3VudERhdGEocGFnZTogUGFnZSB8IEZyYW1lLCBzdGFydERhdGU6IE1vbWVudCkge1xuICBjb25zdCBhY2NvdW50TnVtYmVyID0gYXdhaXQgZ2V0QWNjb3VudE51bWJlcihwYWdlKTtcbiAgY29uc3QgYmFsYW5jZSA9IGF3YWl0IGdldEN1cnJlbnRCYWxhbmNlKHBhZ2UpO1xuICBhd2FpdCBzZWFyY2hCeURhdGVzKHBhZ2UsIHN0YXJ0RGF0ZSk7XG4gIGNvbnN0IHR4bnMgPSBhd2FpdCBnZXRBY2NvdW50VHJhbnNhY3Rpb25zKHBhZ2UpO1xuXG4gIHJldHVybiB7XG4gICAgYWNjb3VudE51bWJlcixcbiAgICB0eG5zLFxuICAgIGJhbGFuY2UsXG4gIH07XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGdldEFjY291bnRJZHNPbGRVSShwYWdlOiBQYWdlKTogUHJvbWlzZTxzdHJpbmdbXT4ge1xuICByZXR1cm4gcGFnZS5ldmFsdWF0ZSgoKSA9PiB7XG4gICAgY29uc3Qgc2VsZWN0RWxlbWVudCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdhY2NvdW50X251bV9zZWxlY3QnKTtcbiAgICBjb25zdCBvcHRpb25zID0gc2VsZWN0RWxlbWVudCA/IHNlbGVjdEVsZW1lbnQucXVlcnlTZWxlY3RvckFsbCgnb3B0aW9uJykgOiBbXTtcbiAgICBpZiAoIW9wdGlvbnMpIHJldHVybiBbXTtcbiAgICByZXR1cm4gQXJyYXkuZnJvbShvcHRpb25zLCBvcHRpb24gPT4gb3B0aW9uLnZhbHVlKTtcbiAgfSk7XG59XG5cbi8qKlxuICogRW5zdXJlcyB0aGUgYWNjb3VudCBkcm9wZG93biBpcyBvcGVuLCB0aGVuIHJldHVybnMgdGhlIGF2YWlsYWJsZSBhY2NvdW50IGxhYmVscy5cbiAqXG4gKiBUaGlzIG1ldGhvZDpcbiAqIC0gQ2hlY2tzIGlmIHRoZSBkcm9wZG93biBpcyBhbHJlYWR5IG9wZW4uXG4gKiAtIElmIG5vdCBvcGVuLCBjbGlja3MgdGhlIGFjY291bnQgc2VsZWN0b3IgdG8gb3BlbiBpdC5cbiAqIC0gV2FpdHMgZm9yIHRoZSBkcm9wZG93biB0byByZW5kZXIuXG4gKiAtIEV4dHJhY3RzIGFuZCByZXR1cm5zIHRoZSBsaXN0IG9mIGF2YWlsYWJsZSBhY2NvdW50IGxhYmVscy5cbiAqXG4gKiBHcmFjZWZ1bCBoYW5kbGluZzpcbiAqIC0gSWYgYW55IGVycm9yIG9jY3VycyAoZS5nLiwgc2VsZWN0b3JzIG5vdCBmb3VuZCwgdGltaW5nIGlzc3VlcywgVUkgdmVyc2lvbiBjaGFuZ2VzKSxcbiAqICAgdGhlIGZ1bmN0aW9uIHJldHVybnMgYW4gZW1wdHkgbGlzdC5cbiAqXG4gKiBAcGFyYW0gcGFnZSBQdXBwZXRlZXIgUGFnZSBvYmplY3QuXG4gKiBAcmV0dXJucyBBbiBhcnJheSBvZiBhdmFpbGFibGUgYWNjb3VudCBsYWJlbHMgKGUuZy4sIFtcIjEyNyB8IFhYWFgxXCIsIFwiMTI3IHwgWFhYWDJcIl0pLFxuICogICAgICAgICAgb3IgYW4gZW1wdHkgYXJyYXkgaWYgc29tZXRoaW5nIGdvZXMgd3JvbmcuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBjbGlja0FjY291bnRTZWxlY3RvckdldEFjY291bnRJZHMocGFnZTogUGFnZSk6IFByb21pc2U8c3RyaW5nW10+IHtcbiAgdHJ5IHtcbiAgICBjb25zdCBhY2NvdW50U2VsZWN0b3IgPSAnZGl2LmN1cnJlbnQtYWNjb3VudCc7IC8vIERpcmVjdCBzZWxlY3RvciB0byBjbGlja2FibGUgZWxlbWVudFxuICAgIGNvbnN0IGRyb3Bkb3duUGFuZWxTZWxlY3RvciA9ICdkaXYubWF0LW1kYy1hdXRvY29tcGxldGUtcGFuZWwuYWNjb3VudC1zZWxlY3QtZGQnOyAvLyBUaGUgZHJvcGRvd24gbGlzdCBib3hcbiAgICBjb25zdCBvcHRpb25TZWxlY3RvciA9ICdtYXQtb3B0aW9uIC5tZGMtbGlzdC1pdGVtX19wcmltYXJ5LXRleHQnOyAvLyBBY2NvdW50IG9wdGlvbiBsYWJlbHNcblxuICAgIC8vIENoZWNrIGlmIGRyb3Bkb3duIGlzIGFscmVhZHkgb3BlblxuICAgIGNvbnN0IGRyb3Bkb3duVmlzaWJsZSA9IGF3YWl0IHBhZ2VcbiAgICAgIC4kZXZhbChkcm9wZG93blBhbmVsU2VsZWN0b3IsIGVsID0+IHtcbiAgICAgICAgcmV0dXJuIGVsICYmIHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGVsKS5kaXNwbGF5ICE9PSAnbm9uZScgJiYgZWwub2Zmc2V0UGFyZW50ICE9PSBudWxsO1xuICAgICAgfSlcbiAgICAgIC5jYXRjaCgoKSA9PiBmYWxzZSk7IC8vIGNhdGNoIGlmIGRyb3Bkb3duIGlzIG5vdCBpbiB0aGUgRE9NIHlldFxuXG4gICAgaWYgKCFkcm9wZG93blZpc2libGUpIHtcbiAgICAgIGF3YWl0IHdhaXRVbnRpbEVsZW1lbnRGb3VuZChwYWdlLCBhY2NvdW50U2VsZWN0b3IsIHRydWUsIEVMRU1FTlRfUkVOREVSX1RJTUVPVVRfTVMpO1xuXG4gICAgICAvLyBDbGljayB0aGUgYWNjb3VudCBzZWxlY3RvciB0byBvcGVuIHRoZSBkcm9wZG93blxuICAgICAgYXdhaXQgY2xpY2tCdXR0b24ocGFnZSwgYWNjb3VudFNlbGVjdG9yKTtcblxuICAgICAgLy8gV2FpdCBmb3IgdGhlIGRyb3Bkb3duIHRvIG9wZW5cbiAgICAgIGF3YWl0IHdhaXRVbnRpbEVsZW1lbnRGb3VuZChwYWdlLCBkcm9wZG93blBhbmVsU2VsZWN0b3IsIHRydWUsIEVMRU1FTlRfUkVOREVSX1RJTUVPVVRfTVMpO1xuICAgIH1cblxuICAgIC8vIEV4dHJhY3QgYWNjb3VudCBsYWJlbHMgZnJvbSB0aGUgZHJvcGRvd24gb3B0aW9uc1xuICAgIGNvbnN0IGFjY291bnRMYWJlbHMgPSBhd2FpdCBwYWdlLiQkZXZhbChvcHRpb25TZWxlY3Rvciwgb3B0aW9ucyA9PiB7XG4gICAgICByZXR1cm4gb3B0aW9ucy5tYXAob3B0aW9uID0+IG9wdGlvbi50ZXh0Q29udGVudD8udHJpbSgpIHx8ICcnKS5maWx0ZXIobGFiZWwgPT4gbGFiZWwgIT09ICcnKTtcbiAgICB9KTtcblxuICAgIHJldHVybiBhY2NvdW50TGFiZWxzO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIHJldHVybiBbXTsgLy8gR3JhY2VmdWwgZmFsbGJhY2tcbiAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiBnZXRBY2NvdW50SWRzQm90aFVJcyhwYWdlOiBQYWdlKTogUHJvbWlzZTxzdHJpbmdbXT4ge1xuICBsZXQgYWNjb3VudHNJZHM6IHN0cmluZ1tdID0gYXdhaXQgY2xpY2tBY2NvdW50U2VsZWN0b3JHZXRBY2NvdW50SWRzKHBhZ2UpO1xuICBpZiAoYWNjb3VudHNJZHMubGVuZ3RoID09PSAwKSB7XG4gICAgYWNjb3VudHNJZHMgPSBhd2FpdCBnZXRBY2NvdW50SWRzT2xkVUkocGFnZSk7XG4gIH1cbiAgcmV0dXJuIGFjY291bnRzSWRzO1xufVxuXG4vKipcbiAqIFNlbGVjdHMgYW4gYWNjb3VudCBmcm9tIHRoZSBkcm9wZG93biBiYXNlZCBvbiB0aGUgcHJvdmlkZWQgYWNjb3VudCBsYWJlbC5cbiAqXG4gKiBUaGlzIG1ldGhvZDpcbiAqIC0gQ2xpY2tzIHRoZSBhY2NvdW50IHNlbGVjdG9yIGJ1dHRvbiB0byBvcGVuIHRoZSBkcm9wZG93bi5cbiAqIC0gUmV0cmlldmVzIHRoZSBsaXN0IG9mIGF2YWlsYWJsZSBhY2NvdW50IGxhYmVscy5cbiAqIC0gQ2hlY2tzIGlmIHRoZSBwcm92aWRlZCBhY2NvdW50IGxhYmVsIGV4aXN0cyBpbiB0aGUgbGlzdC5cbiAqIC0gRmluZHMgYW5kIGNsaWNrcyB0aGUgbWF0Y2hpbmcgYWNjb3VudCBvcHRpb24gaWYgZm91bmQuXG4gKlxuICogQHBhcmFtIHBhZ2UgUHVwcGV0ZWVyIFBhZ2Ugb2JqZWN0LlxuICogQHBhcmFtIGFjY291bnRMYWJlbCBUaGUgdGV4dCBvZiB0aGUgYWNjb3VudCB0byBzZWxlY3QgKGUuZy4sIFwiMTI3IHwgWFhYWFhcIikuXG4gKiBAcmV0dXJucyBUcnVlIGlmIHRoZSBhY2NvdW50IG9wdGlvbiB3YXMgZm91bmQgYW5kIGNsaWNrZWQ7IGZhbHNlIG90aGVyd2lzZS5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHNlbGVjdEFjY291bnRGcm9tRHJvcGRvd24ocGFnZTogUGFnZSwgYWNjb3VudExhYmVsOiBzdHJpbmcpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgLy8gQ2FsbCBjbGlja0FjY291bnRTZWxlY3RvciB0byBnZXQgdGhlIGF2YWlsYWJsZSBhY2NvdW50cyBhbmQgb3BlbiB0aGUgZHJvcGRvd25cbiAgY29uc3QgYXZhaWxhYmxlQWNjb3VudHMgPSBhd2FpdCBjbGlja0FjY291bnRTZWxlY3RvckdldEFjY291bnRJZHMocGFnZSk7XG5cbiAgLy8gQ2hlY2sgaWYgdGhlIGFjY291bnQgbGFiZWwgZXhpc3RzIGluIHRoZSBhdmFpbGFibGUgYWNjb3VudHNcbiAgaWYgKCFhdmFpbGFibGVBY2NvdW50cy5pbmNsdWRlcyhhY2NvdW50TGFiZWwpKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgLy8gV2FpdCBmb3IgdGhlIGRyb3Bkb3duIG9wdGlvbnMgdG8gYmUgcmVuZGVyZWRcbiAgY29uc3Qgb3B0aW9uU2VsZWN0b3IgPSAnbWF0LW9wdGlvbiAubWRjLWxpc3QtaXRlbV9fcHJpbWFyeS10ZXh0JztcbiAgYXdhaXQgd2FpdFVudGlsRWxlbWVudEZvdW5kKHBhZ2UsIG9wdGlvblNlbGVjdG9yLCB0cnVlLCBFTEVNRU5UX1JFTkRFUl9USU1FT1VUX01TKTtcblxuICAvLyBRdWVyeSBhbGwgbWF0Y2hpbmcgb3B0aW9uc1xuICBjb25zdCBhY2NvdW50T3B0aW9ucyA9IGF3YWl0IHBhZ2UuJCQob3B0aW9uU2VsZWN0b3IpO1xuXG4gIC8vIEZpbmQgYW5kIGNsaWNrIHRoZSBvcHRpb24gbWF0Y2hpbmcgdGhlIGFjY291bnRMYWJlbFxuICBmb3IgKGNvbnN0IG9wdGlvbiBvZiBhY2NvdW50T3B0aW9ucykge1xuICAgIGNvbnN0IHRleHQgPSBhd2FpdCBwYWdlLmV2YWx1YXRlKGVsID0+IGVsLnRleHRDb250ZW50Py50cmltKCksIG9wdGlvbik7XG5cbiAgICBpZiAodGV4dCA9PT0gYWNjb3VudExhYmVsKSB7XG4gICAgICBjb25zdCBvcHRpb25IYW5kbGUgPSBhd2FpdCBvcHRpb24uZXZhbHVhdGVIYW5kbGUoZWwgPT4gZWwgYXMgSFRNTEVsZW1lbnQpO1xuICAgICAgYXdhaXQgcGFnZS5ldmFsdWF0ZSgoZWw6IEhUTUxFbGVtZW50KSA9PiBlbC5jbGljaygpLCBvcHRpb25IYW5kbGUpO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGZhbHNlO1xufVxuXG5hc3luYyBmdW5jdGlvbiBnZXRUcmFuc2FjdGlvbnNGcmFtZShwYWdlOiBQYWdlKTogUHJvbWlzZTxGcmFtZSB8IG51bGw+IHtcbiAgLy8gVHJ5IGEgZmV3IHRpbWVzIHRvIGZpbmQgdGhlIGlmcmFtZSwgYXMgaXQgbWlnaHQgbm90IGJlIGltbWVkaWF0ZWx5IGF2YWlsYWJsZVxuICBmb3IgKGxldCBhdHRlbXB0ID0gMDsgYXR0ZW1wdCA8IDM7IGF0dGVtcHQrKykge1xuICAgIGF3YWl0IHNsZWVwKDIwMDApO1xuICAgIGNvbnN0IGZyYW1lcyA9IHBhZ2UuZnJhbWVzKCk7XG4gICAgY29uc3QgdGFyZ2V0RnJhbWUgPSBmcmFtZXMuZmluZChmID0+IGYubmFtZSgpID09PSBJRlJBTUVfTkFNRSk7XG5cbiAgICBpZiAodGFyZ2V0RnJhbWUpIHtcbiAgICAgIHJldHVybiB0YXJnZXRGcmFtZTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gbnVsbDtcbn1cblxuYXN5bmMgZnVuY3Rpb24gc2VsZWN0QWNjb3VudEJvdGhVSXMocGFnZTogUGFnZSwgYWNjb3VudElkOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgYWNjb3VudFNlbGVjdGVkID0gYXdhaXQgc2VsZWN0QWNjb3VudEZyb21Ecm9wZG93bihwYWdlLCBhY2NvdW50SWQpO1xuICBpZiAoIWFjY291bnRTZWxlY3RlZCkge1xuICAgIC8vIE9sZCBVSSBmb3JtYXRcbiAgICBhd2FpdCBwYWdlLnNlbGVjdCgnI2FjY291bnRfbnVtX3NlbGVjdCcsIGFjY291bnRJZCk7XG4gICAgYXdhaXQgd2FpdFVudGlsRWxlbWVudEZvdW5kKHBhZ2UsICcjYWNjb3VudF9udW1fc2VsZWN0JywgdHJ1ZSk7XG4gIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gZmV0Y2hBY2NvdW50RGF0YUJvdGhVSXMocGFnZTogUGFnZSwgc3RhcnREYXRlOiBNb21lbnQpIHtcbiAgLy8gVHJ5IHRvIGdldCB0aGUgaWZyYW1lIGZvciB0aGUgbmV3IFVJXG4gIGNvbnN0IGZyYW1lID0gYXdhaXQgZ2V0VHJhbnNhY3Rpb25zRnJhbWUocGFnZSk7XG5cbiAgLy8gVXNlIHRoZSBmcmFtZSBpZiBhdmFpbGFibGUgKG5ldyBVSSksIG90aGVyd2lzZSB1c2UgdGhlIHBhZ2UgZGlyZWN0bHkgKG9sZCBVSSlcbiAgY29uc3QgdGFyZ2V0UGFnZSA9IGZyYW1lIHx8IHBhZ2U7XG4gIHJldHVybiBmZXRjaEFjY291bnREYXRhKHRhcmdldFBhZ2UsIHN0YXJ0RGF0ZSk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGZldGNoQWNjb3VudHMocGFnZTogUGFnZSwgc3RhcnREYXRlOiBNb21lbnQpOiBQcm9taXNlPFRyYW5zYWN0aW9uc0FjY291bnRbXT4ge1xuICBjb25zdCBhY2NvdW50c0lkcyA9IGF3YWl0IGdldEFjY291bnRJZHNCb3RoVUlzKHBhZ2UpO1xuXG4gIGlmIChhY2NvdW50c0lkcy5sZW5ndGggPT09IDApIHtcbiAgICAvLyBJbiBjYXNlIGFjY291bnRzSWRzIGNvdWxkIG5vIGJlIHBhcnNlZCBqdXN0IHJldHVybiB0aGUgdHJhbnNhY3Rpb25zIG9mIHRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgYWNjb3VudFxuICAgIGNvbnN0IGFjY291bnREYXRhID0gYXdhaXQgZmV0Y2hBY2NvdW50RGF0YUJvdGhVSXMocGFnZSwgc3RhcnREYXRlKTtcbiAgICByZXR1cm4gW2FjY291bnREYXRhXTtcbiAgfVxuXG4gIGNvbnN0IGFjY291bnRzOiBUcmFuc2FjdGlvbnNBY2NvdW50W10gPSBbXTtcbiAgZm9yIChjb25zdCBhY2NvdW50SWQgb2YgYWNjb3VudHNJZHMpIHtcbiAgICBhd2FpdCBzZWxlY3RBY2NvdW50Qm90aFVJcyhwYWdlLCBhY2NvdW50SWQpO1xuICAgIGNvbnN0IGFjY291bnREYXRhID0gYXdhaXQgZmV0Y2hBY2NvdW50RGF0YUJvdGhVSXMocGFnZSwgc3RhcnREYXRlKTtcbiAgICBhY2NvdW50cy5wdXNoKGFjY291bnREYXRhKTtcbiAgfVxuXG4gIHJldHVybiBhY2NvdW50cztcbn1cblxudHlwZSBTY3JhcGVyU3BlY2lmaWNDcmVkZW50aWFscyA9IHsgdXNlcm5hbWU6IHN0cmluZzsgcGFzc3dvcmQ6IHN0cmluZyB9O1xuXG5jbGFzcyBCZWlubGV1bWlHcm91cEJhc2VTY3JhcGVyIGV4dGVuZHMgQmFzZVNjcmFwZXJXaXRoQnJvd3NlcjxTY3JhcGVyU3BlY2lmaWNDcmVkZW50aWFscz4ge1xuICBCQVNFX1VSTCA9ICcnO1xuXG4gIExPR0lOX1VSTCA9ICcnO1xuXG4gIFRSQU5TQUNUSU9OU19VUkwgPSAnJztcblxuICBnZXRMb2dpbk9wdGlvbnMoY3JlZGVudGlhbHM6IFNjcmFwZXJTcGVjaWZpY0NyZWRlbnRpYWxzKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGxvZ2luVXJsOiBgJHt0aGlzLkxPR0lOX1VSTH1gLFxuICAgICAgZmllbGRzOiBjcmVhdGVMb2dpbkZpZWxkcyhjcmVkZW50aWFscyksXG4gICAgICBzdWJtaXRCdXR0b25TZWxlY3RvcjogJyNjb250aW51ZUJ0bicsXG4gICAgICBwb3N0QWN0aW9uOiBhc3luYyAoKSA9PiB3YWl0Rm9yUG9zdExvZ2luKHRoaXMucGFnZSksXG4gICAgICBwb3NzaWJsZVJlc3VsdHM6IGdldFBvc3NpYmxlTG9naW5SZXN1bHRzKCksXG4gICAgICAvLyBIQUNLOiBGb3Igc29tZSByZWFzb24sIHRob3VnaCB0aGUgbG9naW4gYnV0dG9uICgjY29udGludWVCdG4pIGlzIHByZXNlbnQgYW5kIHZpc2libGUsIHRoZSBjbGljayBhY3Rpb24gZG9lcyBub3QgcGVyZm9ybS5cbiAgICAgIC8vIEFkZGluZyB0aGlzIGRlbGF5IGZpeGVzIHRoZSBpc3N1ZS5cbiAgICAgIHByZUFjdGlvbjogYXN5bmMgKCkgPT4ge1xuICAgICAgICBhd2FpdCBzbGVlcCgxMDAwKTtcbiAgICAgIH0sXG4gICAgfTtcbiAgfVxuXG4gIGFzeW5jIGZldGNoRGF0YSgpIHtcbiAgICBjb25zdCBkZWZhdWx0U3RhcnRNb21lbnQgPSBtb21lbnQoKS5zdWJ0cmFjdCgxLCAneWVhcnMnKS5hZGQoMSwgJ2RheScpO1xuICAgIGNvbnN0IHN0YXJ0TW9tZW50TGltaXQgPSBtb21lbnQoeyB5ZWFyOiAxNjAwIH0pO1xuICAgIGNvbnN0IHN0YXJ0RGF0ZSA9IHRoaXMub3B0aW9ucy5zdGFydERhdGUgfHwgZGVmYXVsdFN0YXJ0TW9tZW50LnRvRGF0ZSgpO1xuICAgIGNvbnN0IHN0YXJ0TW9tZW50ID0gbW9tZW50Lm1heChzdGFydE1vbWVudExpbWl0LCBtb21lbnQoc3RhcnREYXRlKSk7XG5cbiAgICBhd2FpdCB0aGlzLm5hdmlnYXRlVG8odGhpcy5UUkFOU0FDVElPTlNfVVJMKTtcblxuICAgIGNvbnN0IGFjY291bnRzID0gYXdhaXQgZmV0Y2hBY2NvdW50cyh0aGlzLnBhZ2UsIHN0YXJ0TW9tZW50KTtcblxuICAgIHJldHVybiB7XG4gICAgICBzdWNjZXNzOiB0cnVlLFxuICAgICAgYWNjb3VudHMsXG4gICAgfTtcbiAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBCZWlubGV1bWlHcm91cEJhc2VTY3JhcGVyO1xuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7OztBQUFBLElBQUFBLE9BQUEsR0FBQUMsc0JBQUEsQ0FBQUMsT0FBQTtBQUVBLElBQUFDLFVBQUEsR0FBQUQsT0FBQTtBQUNBLElBQUFFLHFCQUFBLEdBQUFGLE9BQUE7QUFPQSxJQUFBRyxXQUFBLEdBQUFILE9BQUE7QUFDQSxJQUFBSSxRQUFBLEdBQUFKLE9BQUE7QUFDQSxJQUFBSyxhQUFBLEdBQUFMLE9BQUE7QUFDQSxJQUFBTSx1QkFBQSxHQUFBTixPQUFBO0FBQThHLFNBQUFELHVCQUFBUSxDQUFBLFdBQUFBLENBQUEsSUFBQUEsQ0FBQSxDQUFBQyxVQUFBLEdBQUFELENBQUEsS0FBQUUsT0FBQSxFQUFBRixDQUFBO0FBRTlHLE1BQU1HLFdBQVcsR0FBRyxZQUFZO0FBQ2hDLE1BQU1DLGlDQUFpQyxHQUFHLDhCQUE4QjtBQUN4RSxNQUFNQywyQkFBMkIsR0FBRyxZQUFZO0FBQ2hELE1BQU1DLHlCQUF5QixHQUFHLFlBQVk7QUFDOUMsTUFBTUMsa0NBQWtDLEdBQUcsdUJBQXVCO0FBQ2xFLE1BQU1DLGdDQUFnQyxHQUFHLHFCQUFxQjtBQUM5RCxNQUFNQyxzQkFBc0IsR0FBRyxTQUFTO0FBQ3hDLE1BQU1DLGtCQUFrQixHQUFHLE9BQU87QUFDbEMsTUFBTUMsbUJBQW1CLEdBQUcsUUFBUTtBQUNwQyxNQUFNQyxtQkFBbUIsR0FBRyxTQUFTO0FBQ3JDLE1BQU1DLGVBQWUsR0FBRywrQkFBK0I7QUFDdkQsTUFBTUMsa0NBQWtDLEdBQUcscUJBQXFCO0FBQ2hFLE1BQU1DLGlDQUFpQyxHQUFHLEtBQUs7QUFDL0MsTUFBTUMsNEJBQTRCLEdBQUcsb0JBQW9CO0FBQ3pELE1BQU1DLDBCQUEwQixHQUFHLG9CQUFvQjtBQUN2RCxNQUFNQyxjQUFjLEdBQUcsZ0JBQWdCO0FBQ3ZDLE1BQU1DLGVBQWUsR0FB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QjtBQUlBLE1BQU1DLHlCQUF5QixTQUFTQyw4Q0FBc0IsQ0FBNkI7RUFDekZDLFFBQVEsR0FBRyxFQUFFO0VBRWJDLFNBQVMsR0FBRyxFQUFFO0VBRWRDLGdCQUFnQixHQUFHLEVBQUU7RUFFckJDLGVBQWVBLENBQUM3SyxXQUF1QyxFQUFFO0lBQ3ZELE9BQU87TUFDTDhLLFFBQVEsRUFBRSxHQUFHLElBQUksQ0FBQ0gsU0FBUyxFQUFFO01BQzdCSSxNQUFNLEVBQUVoTCxpQkFBaUIsQ0FBQ0MsV0FBVyxDQUFDO01BQ3RDZ0wsb0JBQW9CLEVBQUUsY0FBYztNQUNwQ0MsVUFBVSxFQUFFLE1BQUFBLENBQUEsS0FBWW5FLGdCQUFnQixDQUFDLElBQUksQ0FBQ3RELElBQUksQ0FBQztNQUNuRDBILGVBQWUsRUFBRXhMLHVCQUF1QixDQUFDLENBQUM7TUFDMUM7TUFDQTtNQUNBeUwsU0FBUyxFQUFFLE1BQUFBLENBQUEsS0FBWTtRQUNyQixNQUFNLElBQUEzQixjQUFLLEVBQUMsSUFBSSxDQUFDO01BQ25CO0lBQ0YsQ0FBQztFQUNIO0VBRUEsTUFBTTRCLFNBQVNBLENBQUEsRUFBRztJQUNoQixNQUFNQyxrQkFBa0IsR0FBRyxJQUFBL0osZUFBTSxFQUFDLENBQUMsQ0FBQ2dLLFFBQVEsQ0FBQyxDQUFDLEVBQUUsT0FBTyxDQUFDLENBQUNDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsS0FBSyxDQUFDO0lBQ3RFLE1BQU1DLGdCQUFnQixHQUFHLElBQUFsSyxlQUFNLEVBQUM7TUFBRW1LLElBQUksRUFBRTtJQUFLLENBQUMsQ0FBQztJQUMvQyxNQUFNdEcsU0FBUyxHQUFHLElBQUksQ0FBQ29DLE9BQU8sQ0FBQ3BDLFNBQVMsSUFBSWtHLGtCQUFrQixDQUFDSyxNQUFNLENBQUMsQ0FBQztJQUN2RSxNQUFNQyxXQUFXLEdBQUdySyxlQUFNLENBQUNzSyxHQUFHLENBQUNKLGdCQUFnQixFQUFFLElBQUFsSyxlQUFNLEVBQUM2RCxTQUFTLENBQUMsQ0FBQztJQUVuRSxNQUFNLElBQUksQ0FBQzBHLFVBQVUsQ0FBQyxJQUFJLENBQUNqQixnQkFBZ0IsQ0FBQztJQUU1QyxNQUFNTCxRQUFRLEdBQUcsTUFBTUYsYUFBYSxDQUFDLElBQUksQ0FBQzdHLElBQUksRUFBRW1JLFdBQVcsQ0FBQztJQUU1RCxPQUFPO01BQ0xHLE9BQU8sRUFBRSxJQUFJO01BQ2J2QjtJQUNGLENBQUM7RUFDSDtBQUNGO0FBQUMsSUFBQXdCLFFBQUEsR0FBQUMsT0FBQSxDQUFBMU4sT0FBQSxHQUVja00seUJBQXlCIiwiaWdub3JlTGlzdCI6W119
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { type Transaction } from '../transactions';
|
|
2
|
+
import { BaseScraperWithBrowser } from './base-scraper-with-browser';
|
|
3
|
+
import { type ScraperOptions, type ScraperScrapingResult } from './interface';
|
|
4
|
+
type ScraperSpecificCredentials = {
|
|
5
|
+
id: string;
|
|
6
|
+
password: string;
|
|
7
|
+
card6Digits: string;
|
|
8
|
+
};
|
|
9
|
+
declare class IsracardAmexBaseScraper extends BaseScraperWithBrowser<ScraperSpecificCredentials> {
|
|
10
|
+
private baseUrl;
|
|
11
|
+
private companyCode;
|
|
12
|
+
private servicesUrl;
|
|
13
|
+
constructor(options: ScraperOptions, baseUrl: string, companyCode: string);
|
|
14
|
+
login(credentials: ScraperSpecificCredentials): Promise<ScraperScrapingResult>;
|
|
15
|
+
fetchData(): Promise<{
|
|
16
|
+
success: boolean;
|
|
17
|
+
accounts: {
|
|
18
|
+
accountNumber: string;
|
|
19
|
+
txns: Transaction[];
|
|
20
|
+
}[];
|
|
21
|
+
}>;
|
|
22
|
+
}
|
|
23
|
+
export default IsracardAmexBaseScraper;
|