@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,242 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.default = void 0;
|
|
7
|
+
var _moment = _interopRequireDefault(require("moment"));
|
|
8
|
+
var _constants = require("../constants");
|
|
9
|
+
var _elementsInteractions = require("../helpers/elements-interactions");
|
|
10
|
+
var _navigation = require("../helpers/navigation");
|
|
11
|
+
var _transactions = require("../transactions");
|
|
12
|
+
var _baseScraperWithBrowser = require("./base-scraper-with-browser");
|
|
13
|
+
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
|
|
14
|
+
const BASE_URL = 'https://hb.unionbank.co.il';
|
|
15
|
+
const TRANSACTIONS_URL = `${BASE_URL}/eBanking/Accounts/ExtendedActivity.aspx#/`;
|
|
16
|
+
const DATE_FORMAT = 'DD/MM/YY';
|
|
17
|
+
const NO_TRANSACTION_IN_DATE_RANGE_TEXT = 'לא קיימות תנועות מתאימות על פי הסינון שהוגדר';
|
|
18
|
+
const DATE_HEADER = 'תאריך';
|
|
19
|
+
const DESCRIPTION_HEADER = 'תיאור';
|
|
20
|
+
const REFERENCE_HEADER = 'אסמכתא';
|
|
21
|
+
const DEBIT_HEADER = 'חובה';
|
|
22
|
+
const CREDIT_HEADER = 'זכות';
|
|
23
|
+
const PENDING_TRANSACTIONS_TABLE_ID = 'trTodayActivityNapaTableUpper';
|
|
24
|
+
const COMPLETED_TRANSACTIONS_TABLE_ID = 'ctlActivityTable';
|
|
25
|
+
const ERROR_MESSAGE_CLASS = 'errInfo';
|
|
26
|
+
const ACCOUNTS_DROPDOWN_SELECTOR = 'select#ddlAccounts_m_ddl';
|
|
27
|
+
function getPossibleLoginResults() {
|
|
28
|
+
const urls = {};
|
|
29
|
+
urls[_baseScraperWithBrowser.LoginResults.Success] = [/eBanking\/Accounts/];
|
|
30
|
+
urls[_baseScraperWithBrowser.LoginResults.InvalidPassword] = [/InternalSite\/CustomUpdate\/leumi\/LoginPage.ASP/];
|
|
31
|
+
return urls;
|
|
32
|
+
}
|
|
33
|
+
function createLoginFields(credentials) {
|
|
34
|
+
return [{
|
|
35
|
+
selector: '#uid',
|
|
36
|
+
value: credentials.username
|
|
37
|
+
}, {
|
|
38
|
+
selector: '#password',
|
|
39
|
+
value: credentials.password
|
|
40
|
+
}];
|
|
41
|
+
}
|
|
42
|
+
function getAmountData(amountStr) {
|
|
43
|
+
const amountStrCopy = amountStr.replace(',', '');
|
|
44
|
+
return parseFloat(amountStrCopy);
|
|
45
|
+
}
|
|
46
|
+
function getTxnAmount(txn) {
|
|
47
|
+
const credit = getAmountData(txn.credit);
|
|
48
|
+
const debit = getAmountData(txn.debit);
|
|
49
|
+
return (Number.isNaN(credit) ? 0 : credit) - (Number.isNaN(debit) ? 0 : debit);
|
|
50
|
+
}
|
|
51
|
+
function convertTransactions(txns) {
|
|
52
|
+
return txns.map(txn => {
|
|
53
|
+
const convertedDate = (0, _moment.default)(txn.date, DATE_FORMAT).toISOString();
|
|
54
|
+
const convertedAmount = getTxnAmount(txn);
|
|
55
|
+
return {
|
|
56
|
+
type: _transactions.TransactionTypes.Normal,
|
|
57
|
+
identifier: txn.reference ? parseInt(txn.reference, 10) : undefined,
|
|
58
|
+
date: convertedDate,
|
|
59
|
+
processedDate: convertedDate,
|
|
60
|
+
originalAmount: convertedAmount,
|
|
61
|
+
originalCurrency: _constants.SHEKEL_CURRENCY,
|
|
62
|
+
chargedAmount: convertedAmount,
|
|
63
|
+
status: txn.status,
|
|
64
|
+
description: txn.description,
|
|
65
|
+
memo: txn.memo
|
|
66
|
+
};
|
|
67
|
+
});
|
|
68
|
+
}
|
|
69
|
+
function getTransactionDate(tds, txnsTableHeaders) {
|
|
70
|
+
return (tds[txnsTableHeaders[DATE_HEADER]] || '').trim();
|
|
71
|
+
}
|
|
72
|
+
function getTransactionDescription(tds, txnsTableHeaders) {
|
|
73
|
+
return (tds[txnsTableHeaders[DESCRIPTION_HEADER]] || '').trim();
|
|
74
|
+
}
|
|
75
|
+
function getTransactionReference(tds, txnsTableHeaders) {
|
|
76
|
+
return (tds[txnsTableHeaders[REFERENCE_HEADER]] || '').trim();
|
|
77
|
+
}
|
|
78
|
+
function getTransactionDebit(tds, txnsTableHeaders) {
|
|
79
|
+
return (tds[txnsTableHeaders[DEBIT_HEADER]] || '').trim();
|
|
80
|
+
}
|
|
81
|
+
function getTransactionCredit(tds, txnsTableHeaders) {
|
|
82
|
+
return (tds[txnsTableHeaders[CREDIT_HEADER]] || '').trim();
|
|
83
|
+
}
|
|
84
|
+
function extractTransactionDetails(txnRow, txnsTableHeaders, txnStatus) {
|
|
85
|
+
const tds = txnRow.innerTds;
|
|
86
|
+
return {
|
|
87
|
+
status: txnStatus,
|
|
88
|
+
date: getTransactionDate(tds, txnsTableHeaders),
|
|
89
|
+
description: getTransactionDescription(tds, txnsTableHeaders),
|
|
90
|
+
reference: getTransactionReference(tds, txnsTableHeaders),
|
|
91
|
+
debit: getTransactionDebit(tds, txnsTableHeaders),
|
|
92
|
+
credit: getTransactionCredit(tds, txnsTableHeaders),
|
|
93
|
+
memo: ''
|
|
94
|
+
};
|
|
95
|
+
}
|
|
96
|
+
function isExpandedDescRow(txnRow) {
|
|
97
|
+
return txnRow.id === 'rowAdded';
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
/* eslint-disable no-param-reassign */
|
|
101
|
+
function editLastTransactionDesc(txnRow, lastTxn) {
|
|
102
|
+
lastTxn.description = `${lastTxn.description} ${txnRow.innerTds[0]}`;
|
|
103
|
+
return lastTxn;
|
|
104
|
+
}
|
|
105
|
+
function handleTransactionRow(txns, txnsTableHeaders, txnRow, txnType) {
|
|
106
|
+
if (isExpandedDescRow(txnRow)) {
|
|
107
|
+
const lastTransaction = txns.pop();
|
|
108
|
+
if (lastTransaction) {
|
|
109
|
+
txns.push(editLastTransactionDesc(txnRow, lastTransaction));
|
|
110
|
+
} else {
|
|
111
|
+
throw new Error('internal union-bank error');
|
|
112
|
+
}
|
|
113
|
+
} else {
|
|
114
|
+
txns.push(extractTransactionDetails(txnRow, txnsTableHeaders, txnType));
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
async function getTransactionsTableHeaders(page, tableTypeId) {
|
|
118
|
+
const headersMap = [];
|
|
119
|
+
const headersObjs = await (0, _elementsInteractions.pageEvalAll)(page, `#WorkSpaceBox #${tableTypeId} tr[class='header'] th`, null, ths => {
|
|
120
|
+
return ths.map((th, index) => ({
|
|
121
|
+
text: th.innerText.trim(),
|
|
122
|
+
index
|
|
123
|
+
}));
|
|
124
|
+
});
|
|
125
|
+
for (const headerObj of headersObjs) {
|
|
126
|
+
headersMap[headerObj.text] = headerObj.index;
|
|
127
|
+
}
|
|
128
|
+
return headersMap;
|
|
129
|
+
}
|
|
130
|
+
async function extractTransactionsFromTable(page, tableTypeId, txnType) {
|
|
131
|
+
const txns = [];
|
|
132
|
+
const transactionsTableHeaders = await getTransactionsTableHeaders(page, tableTypeId);
|
|
133
|
+
const transactionsRows = await (0, _elementsInteractions.pageEvalAll)(page, `#WorkSpaceBox #${tableTypeId} tr[class]:not([class='header'])`, [], trs => {
|
|
134
|
+
return trs.map(tr => ({
|
|
135
|
+
id: tr.getAttribute('id') || '',
|
|
136
|
+
innerTds: Array.from(tr.getElementsByTagName('td')).map(td => td.innerText)
|
|
137
|
+
}));
|
|
138
|
+
});
|
|
139
|
+
for (const txnRow of transactionsRows) {
|
|
140
|
+
handleTransactionRow(txns, transactionsTableHeaders, txnRow, txnType);
|
|
141
|
+
}
|
|
142
|
+
return txns;
|
|
143
|
+
}
|
|
144
|
+
async function isNoTransactionInDateRangeError(page) {
|
|
145
|
+
const hasErrorInfoElement = await (0, _elementsInteractions.elementPresentOnPage)(page, `.${ERROR_MESSAGE_CLASS}`);
|
|
146
|
+
if (hasErrorInfoElement) {
|
|
147
|
+
const errorText = await page.$eval(`.${ERROR_MESSAGE_CLASS}`, errorElement => {
|
|
148
|
+
return errorElement.innerText;
|
|
149
|
+
});
|
|
150
|
+
return errorText.trim() === NO_TRANSACTION_IN_DATE_RANGE_TEXT;
|
|
151
|
+
}
|
|
152
|
+
return false;
|
|
153
|
+
}
|
|
154
|
+
async function chooseAccount(page, accountId) {
|
|
155
|
+
const hasDropDownList = await (0, _elementsInteractions.elementPresentOnPage)(page, ACCOUNTS_DROPDOWN_SELECTOR);
|
|
156
|
+
if (hasDropDownList) {
|
|
157
|
+
await (0, _elementsInteractions.dropdownSelect)(page, ACCOUNTS_DROPDOWN_SELECTOR, accountId);
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
async function searchByDates(page, startDate) {
|
|
161
|
+
await (0, _elementsInteractions.dropdownSelect)(page, 'select#ddlTransactionPeriod', '004');
|
|
162
|
+
await (0, _elementsInteractions.waitUntilElementFound)(page, 'select#ddlTransactionPeriod');
|
|
163
|
+
await (0, _elementsInteractions.fillInput)(page, 'input#dtFromDate_textBox', startDate.format(DATE_FORMAT));
|
|
164
|
+
await (0, _elementsInteractions.clickButton)(page, 'input#btnDisplayDates');
|
|
165
|
+
await (0, _navigation.waitForNavigation)(page);
|
|
166
|
+
}
|
|
167
|
+
async function getAccountNumber(page) {
|
|
168
|
+
const selectedSnifAccount = await page.$eval('#ddlAccounts_m_ddl option[selected="selected"]', option => {
|
|
169
|
+
return option.innerText;
|
|
170
|
+
});
|
|
171
|
+
return selectedSnifAccount.replace('/', '_');
|
|
172
|
+
}
|
|
173
|
+
async function expandTransactionsTable(page) {
|
|
174
|
+
const hasExpandAllButton = await (0, _elementsInteractions.elementPresentOnPage)(page, "a[id*='lnkCtlExpandAll']");
|
|
175
|
+
if (hasExpandAllButton) {
|
|
176
|
+
await (0, _elementsInteractions.clickButton)(page, "a[id*='lnkCtlExpandAll']");
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
async function scrapeTransactionsFromTable(page) {
|
|
180
|
+
const pendingTxns = await extractTransactionsFromTable(page, PENDING_TRANSACTIONS_TABLE_ID, _transactions.TransactionStatuses.Pending);
|
|
181
|
+
const completedTxns = await extractTransactionsFromTable(page, COMPLETED_TRANSACTIONS_TABLE_ID, _transactions.TransactionStatuses.Completed);
|
|
182
|
+
const txns = [...pendingTxns, ...completedTxns];
|
|
183
|
+
return convertTransactions(txns);
|
|
184
|
+
}
|
|
185
|
+
async function getAccountTransactions(page) {
|
|
186
|
+
await Promise.race([(0, _elementsInteractions.waitUntilElementFound)(page, `#${COMPLETED_TRANSACTIONS_TABLE_ID}`, false), (0, _elementsInteractions.waitUntilElementFound)(page, `.${ERROR_MESSAGE_CLASS}`, false)]);
|
|
187
|
+
const noTransactionInRangeError = await isNoTransactionInDateRangeError(page);
|
|
188
|
+
if (noTransactionInRangeError) {
|
|
189
|
+
return [];
|
|
190
|
+
}
|
|
191
|
+
await expandTransactionsTable(page);
|
|
192
|
+
return scrapeTransactionsFromTable(page);
|
|
193
|
+
}
|
|
194
|
+
async function fetchAccountData(page, startDate, accountId) {
|
|
195
|
+
await chooseAccount(page, accountId);
|
|
196
|
+
await searchByDates(page, startDate);
|
|
197
|
+
const accountNumber = await getAccountNumber(page);
|
|
198
|
+
const txns = await getAccountTransactions(page);
|
|
199
|
+
return {
|
|
200
|
+
accountNumber,
|
|
201
|
+
txns
|
|
202
|
+
};
|
|
203
|
+
}
|
|
204
|
+
async function fetchAccounts(page, startDate) {
|
|
205
|
+
const accounts = [];
|
|
206
|
+
const accountsList = await (0, _elementsInteractions.dropdownElements)(page, ACCOUNTS_DROPDOWN_SELECTOR);
|
|
207
|
+
for (const account of accountsList) {
|
|
208
|
+
if (account.value !== '-1') {
|
|
209
|
+
// Skip "All accounts" option
|
|
210
|
+
const accountData = await fetchAccountData(page, startDate, account.value);
|
|
211
|
+
accounts.push(accountData);
|
|
212
|
+
}
|
|
213
|
+
}
|
|
214
|
+
return accounts;
|
|
215
|
+
}
|
|
216
|
+
async function waitForPostLogin(page) {
|
|
217
|
+
return Promise.race([(0, _elementsInteractions.waitUntilElementFound)(page, '#signoff', true), (0, _elementsInteractions.waitUntilElementFound)(page, '#restore', true)]);
|
|
218
|
+
}
|
|
219
|
+
class UnionBankScraper extends _baseScraperWithBrowser.BaseScraperWithBrowser {
|
|
220
|
+
getLoginOptions(credentials) {
|
|
221
|
+
return {
|
|
222
|
+
loginUrl: `${BASE_URL}`,
|
|
223
|
+
fields: createLoginFields(credentials),
|
|
224
|
+
submitButtonSelector: '#enter',
|
|
225
|
+
postAction: async () => waitForPostLogin(this.page),
|
|
226
|
+
possibleResults: getPossibleLoginResults()
|
|
227
|
+
};
|
|
228
|
+
}
|
|
229
|
+
async fetchData() {
|
|
230
|
+
const defaultStartMoment = (0, _moment.default)().subtract(1, 'years').add(1, 'day');
|
|
231
|
+
const startDate = this.options.startDate || defaultStartMoment.toDate();
|
|
232
|
+
const startMoment = _moment.default.max(defaultStartMoment, (0, _moment.default)(startDate));
|
|
233
|
+
await this.navigateTo(TRANSACTIONS_URL);
|
|
234
|
+
const accounts = await fetchAccounts(this.page, startMoment);
|
|
235
|
+
return {
|
|
236
|
+
success: true,
|
|
237
|
+
accounts
|
|
238
|
+
};
|
|
239
|
+
}
|
|
240
|
+
}
|
|
241
|
+
var _default = exports.default = UnionBankScraper;
|
|
242
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfbW9tZW50IiwiX2ludGVyb3BSZXF1aXJlRGVmYXVsdCIsInJlcXVpcmUiLCJfY29uc3RhbnRzIiwiX2VsZW1lbnRzSW50ZXJhY3Rpb25zIiwiX25hdmlnYXRpb24iLCJfdHJhbnNhY3Rpb25zIiwiX2Jhc2VTY3JhcGVyV2l0aEJyb3dzZXIiLCJlIiwiX19lc01vZHVsZSIsImRlZmF1bHQiLCJCQVNFX1VSTCIsIlRSQU5TQUNUSU9OU19VUkwiLCJEQVRFX0ZPUk1BVCIsIk5PX1RSQU5TQUNUSU9OX0lOX0RBVEVfUkFOR0VfVEVYVCIsIkRBVEVfSEVBREVSIiwiREVTQ1JJUFRJT05fSEVBREVSIiwiUkVGRVJFTkNFX0hFQURFUiIsIkRFQklUX0hFQURFUiIsIkNSRURJVF9IRUFERVIiLCJQRU5ESU5HX1RSQU5TQUNUSU9OU19UQUJMRV9JRCIsIkNPTVBMRVRFRF9UUkFOU0FDVElPTlNfVEFCTEVfSUQiLCJFUlJPUl9NRVNTQUdFX0NMQVNTIiwiQUNDT1VOVFNfRFJPUERPV05fU0VMRUNUT1IiLCJnZXRQb3NzaWJsZUxvZ2luUmVzdWx0cyIsInVybHMiLCJMb2dpblJlc3VsdHMiLCJTdWNjZXNzIiwiSW52YWxpZFBhc3N3b3JkIiwiY3JlYXRlTG9naW5GaWVsZHMiLCJjcmVkZW50aWFscyIsInNlbGVjdG9yIiwidmFsdWUiLCJ1c2VybmFtZSIsInBhc3N3b3JkIiwiZ2V0QW1vdW50RGF0YSIsImFtb3VudFN0ciIsImFtb3VudFN0ckNvcHkiLCJyZXBsYWNlIiwicGFyc2VGbG9hdCIsImdldFR4bkFtb3VudCIsInR4biIsImNyZWRpdCIsImRlYml0IiwiTnVtYmVyIiwiaXNOYU4iLCJjb252ZXJ0VHJhbnNhY3Rpb25zIiwidHhucyIsIm1hcCIsImNvbnZlcnRlZERhdGUiLCJtb21lbnQiLCJkYXRlIiwidG9JU09TdHJpbmciLCJjb252ZXJ0ZWRBbW91bnQiLCJ0eXBlIiwiVHJhbnNhY3Rpb25UeXBlcyIsIk5vcm1hbCIsImlkZW50aWZpZXIiLCJyZWZlcmVuY2UiLCJwYXJzZUludCIsInVuZGVmaW5lZCIsInByb2Nlc3NlZERhdGUiLCJvcmlnaW5hbEFtb3VudCIsIm9yaWdpbmFsQ3VycmVuY3kiLCJTSEVLRUxfQ1VSUkVOQ1kiLCJjaGFyZ2VkQW1vdW50Iiwic3RhdHVzIiwiZGVzY3JpcHRpb24iLCJtZW1vIiwiZ2V0VHJhbnNhY3Rpb25EYXRlIiwidGRzIiwidHhuc1RhYmxlSGVhZGVycyIsInRyaW0iLCJnZXRUcmFuc2FjdGlvbkRlc2NyaXB0aW9uIiwiZ2V0VHJhbnNhY3Rpb25SZWZlcmVuY2UiLCJnZXRUcmFuc2FjdGlvbkRlYml0IiwiZ2V0VHJhbnNhY3Rpb25DcmVkaXQiLCJleHRyYWN0VHJhbnNhY3Rpb25EZXRhaWxzIiwidHhuUm93IiwidHhuU3RhdHVzIiwiaW5uZXJUZHMiLCJpc0V4cGFuZGVkRGVzY1JvdyIsImlkIiwiZWRpdExhc3RUcmFuc2FjdGlvbkRlc2MiLCJsYXN0VHhuIiwiaGFuZGxlVHJhbnNhY3Rpb25Sb3ciLCJ0eG5UeXBlIiwibGFzdFRyYW5zYWN0aW9uIiwicG9wIiwicHVzaCIsIkVycm9yIiwiZ2V0VHJhbnNhY3Rpb25zVGFibGVIZWFkZXJzIiwicGFnZSIsInRhYmxlVHlwZUlkIiwiaGVhZGVyc01hcCIsImhlYWRlcnNPYmpzIiwicGFnZUV2YWxBbGwiLCJ0aHMiLCJ0aCIsImluZGV4IiwidGV4dCIsImlubmVyVGV4dCIsImhlYWRlck9iaiIsImV4dHJhY3RUcmFuc2FjdGlvbnNGcm9tVGFibGUiLCJ0cmFuc2FjdGlvbnNUYWJsZUhlYWRlcnMiLCJ0cmFuc2FjdGlvbnNSb3dzIiwidHJzIiwidHIiLCJnZXRBdHRyaWJ1dGUiLCJBcnJheSIsImZyb20iLCJnZXRFbGVtZW50c0J5VGFnTmFtZSIsInRkIiwiaXNOb1RyYW5zYWN0aW9uSW5EYXRlUmFuZ2VFcnJvciIsImhhc0Vycm9ySW5mb0VsZW1lbnQiLCJlbGVtZW50UHJlc2VudE9uUGFnZSIsImVycm9yVGV4dCIsIiRldmFsIiwiZXJyb3JFbGVtZW50IiwiY2hvb3NlQWNjb3VudCIsImFjY291bnRJZCIsImhhc0Ryb3BEb3duTGlzdCIsImRyb3Bkb3duU2VsZWN0Iiwic2VhcmNoQnlEYXRlcyIsInN0YXJ0RGF0ZSIsIndhaXRVbnRpbEVsZW1lbnRGb3VuZCIsImZpbGxJbnB1dCIsImZvcm1hdCIsImNsaWNrQnV0dG9uIiwid2FpdEZvck5hdmlnYXRpb24iLCJnZXRBY2NvdW50TnVtYmVyIiwic2VsZWN0ZWRTbmlmQWNjb3VudCIsIm9wdGlvbiIsImV4cGFuZFRyYW5zYWN0aW9uc1RhYmxlIiwiaGFzRXhwYW5kQWxsQnV0dG9uIiwic2NyYXBlVHJhbnNhY3Rpb25zRnJvbVRhYmxlIiwicGVuZGluZ1R4bnMiLCJUcmFuc2FjdGlvblN0YXR1c2VzIiwiUGVuZGluZyIsImNvbXBsZXRlZFR4bnMiLCJDb21wbGV0ZWQiLCJnZXRBY2NvdW50VHJhbnNhY3Rpb25zIiwiUHJvbWlzZSIsInJhY2UiLCJub1RyYW5zYWN0aW9uSW5SYW5nZUVycm9yIiwiZmV0Y2hBY2NvdW50RGF0YSIsImFjY291bnROdW1iZXIiLCJmZXRjaEFjY291bnRzIiwiYWNjb3VudHMiLCJhY2NvdW50c0xpc3QiLCJkcm9wZG93bkVsZW1lbnRzIiwiYWNjb3VudCIsImFjY291bnREYXRhIiwid2FpdEZvclBvc3RMb2dpbiIsIlVuaW9uQmFua1NjcmFwZXIiLCJCYXNlU2NyYXBlcldpdGhCcm93c2VyIiwiZ2V0TG9naW5PcHRpb25zIiwibG9naW5VcmwiLCJmaWVsZHMiLCJzdWJtaXRCdXR0b25TZWxlY3RvciIsInBvc3RBY3Rpb24iLCJwb3NzaWJsZVJlc3VsdHMiLCJmZXRjaERhdGEiLCJkZWZhdWx0U3RhcnRNb21lbnQiLCJzdWJ0cmFjdCIsImFkZCIsIm9wdGlvbnMiLCJ0b0RhdGUiLCJzdGFydE1vbWVudCIsIm1heCIsIm5hdmlnYXRlVG8iLCJzdWNjZXNzIiwiX2RlZmF1bHQiLCJleHBvcnRzIl0sInNvdXJjZXMiOlsiLi4vLi4vc3JjL3NjcmFwZXJzL3VuaW9uLWJhbmsudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IG1vbWVudCwgeyB0eXBlIE1vbWVudCB9IGZyb20gJ21vbWVudCc7XG5pbXBvcnQgeyB0eXBlIFBhZ2UgfSBmcm9tICdwdXBwZXRlZXInO1xuaW1wb3J0IHsgU0hFS0VMX0NVUlJFTkNZIH0gZnJvbSAnLi4vY29uc3RhbnRzJztcbmltcG9ydCB7XG4gIGNsaWNrQnV0dG9uLFxuICBkcm9wZG93bkVsZW1lbnRzLFxuICBkcm9wZG93blNlbGVjdCxcbiAgZWxlbWVudFByZXNlbnRPblBhZ2UsXG4gIGZpbGxJbnB1dCxcbiAgcGFnZUV2YWxBbGwsXG4gIHdhaXRVbnRpbEVsZW1lbnRGb3VuZCxcbn0gZnJvbSAnLi4vaGVscGVycy9lbGVtZW50cy1pbnRlcmFjdGlvbnMnO1xuaW1wb3J0IHsgd2FpdEZvck5hdmlnYXRpb24gfSBmcm9tICcuLi9oZWxwZXJzL25hdmlnYXRpb24nO1xuaW1wb3J0IHsgVHJhbnNhY3Rpb25TdGF0dXNlcywgVHJhbnNhY3Rpb25UeXBlcywgdHlwZSBUcmFuc2FjdGlvbiwgdHlwZSBUcmFuc2FjdGlvbnNBY2NvdW50IH0gZnJvbSAnLi4vdHJhbnNhY3Rpb25zJztcbmltcG9ydCB7IEJhc2VTY3JhcGVyV2l0aEJyb3dzZXIsIExvZ2luUmVzdWx0cywgdHlwZSBQb3NzaWJsZUxvZ2luUmVzdWx0cyB9IGZyb20gJy4vYmFzZS1zY3JhcGVyLXdpdGgtYnJvd3Nlcic7XG5cbmNvbnN0IEJBU0VfVVJMID0gJ2h0dHBzOi8vaGIudW5pb25iYW5rLmNvLmlsJztcbmNvbnN0IFRSQU5TQUNUSU9OU19VUkwgPSBgJHtCQVNFX1VSTH0vZUJhbmtpbmcvQWNjb3VudHMvRXh0ZW5kZWRBY3Rpdml0eS5hc3B4Iy9gO1xuY29uc3QgREFURV9GT1JNQVQgPSAnREQvTU0vWVknO1xuY29uc3QgTk9fVFJBTlNBQ1RJT05fSU5fREFURV9SQU5HRV9URVhUID0gJ9ec15Ag16fXmdeZ157XldeqINeq16DXldei15XXqiDXnteq15DXmdee15XXqiDXotecINek15kg15TXodeZ16DXldefINep15TXldeS15PXqCc7XG5jb25zdCBEQVRFX0hFQURFUiA9ICfXqteQ16jXmdeaJztcbmNvbnN0IERFU0NSSVBUSU9OX0hFQURFUiA9ICfXqteZ15DXldeoJztcbmNvbnN0IFJFRkVSRU5DRV9IRUFERVIgPSAn15DXodee15vXqteQJztcbmNvbnN0IERFQklUX0hFQURFUiA9ICfXl9eV15HXlCc7XG5jb25zdCBDUkVESVRfSEVBREVSID0gJ9eW15vXldeqJztcbmNvbnN0IFBFTkRJTkdfVFJBTlNBQ1RJT05TX1RBQkxFX0lEID0gJ3RyVG9kYXlBY3Rpdml0eU5hcGFUYWJsZVVwcGVyJztcbmNvbnN0IENPTVBMRVRFRF9UUkFOU0FDVElPTlNfVEFCTEVfSUQgPSAnY3RsQWN0aXZpdHlUYWJsZSc7XG5jb25zdCBFUlJPUl9NRVNTQUdFX0NMQVNTID0gJ2VyckluZm8nO1xuY29uc3QgQUNDT1VOVFNfRFJPUERPV05fU0VMRUNUT1IgPSAnc2VsZWN0I2RkbEFjY291bnRzX21fZGRsJztcblxuZnVuY3Rpb24gZ2V0UG9zc2libGVMb2dpblJlc3VsdHMoKSB7XG4gIGNvbnN0IHVybHM6IFBvc3NpYmxlTG9naW5SZXN1bHRzID0ge307XG4gIHVybHNbTG9naW5SZXN1bHRzLlN1Y2Nlc3NdID0gWy9lQmFua2luZ1xcL0FjY291bnRzL107XG4gIHVybHNbTG9naW5SZXN1bHRzLkludmFsaWRQYXNzd29yZF0gPSBbL0ludGVybmFsU2l0ZVxcL0N1c3RvbVVwZGF0ZVxcL2xldW1pXFwvTG9naW5QYWdlLkFTUC9dO1xuICByZXR1cm4gdXJscztcbn1cblxuZnVuY3Rpb24gY3JlYXRlTG9naW5GaWVsZHMoY3JlZGVudGlhbHM6IFNjcmFwZXJTcGVjaWZpY0NyZWRlbnRpYWxzKSB7XG4gIHJldHVybiBbXG4gICAgeyBzZWxlY3RvcjogJyN1aWQnLCB2YWx1ZTogY3JlZGVudGlhbHMudXNlcm5hbWUgfSxcbiAgICB7IHNlbGVjdG9yOiAnI3Bhc3N3b3JkJywgdmFsdWU6IGNyZWRlbnRpYWxzLnBhc3N3b3JkIH0sXG4gIF07XG59XG5cbmZ1bmN0aW9uIGdldEFtb3VudERhdGEoYW1vdW50U3RyOiBzdHJpbmcpIHtcbiAgY29uc3QgYW1vdW50U3RyQ29weSA9IGFtb3VudFN0ci5yZXBsYWNlKCcsJywgJycpO1xuICByZXR1cm4gcGFyc2VGbG9hdChhbW91bnRTdHJDb3B5KTtcbn1cblxuaW50ZXJmYWNlIFNjcmFwZWRUcmFuc2FjdGlvbiB7XG4gIGNyZWRpdDogc3RyaW5nO1xuICBkZWJpdDogc3RyaW5nO1xuICBkYXRlOiBzdHJpbmc7XG4gIHJlZmVyZW5jZT86IHN0cmluZztcbiAgZGVzY3JpcHRpb246IHN0cmluZztcbiAgbWVtbzogc3RyaW5nO1xuICBzdGF0dXM6IFRyYW5zYWN0aW9uU3RhdHVzZXM7XG59XG5cbmZ1bmN0aW9uIGdldFR4bkFtb3VudCh0eG46IFNjcmFwZWRUcmFuc2FjdGlvbikge1xuICBjb25zdCBjcmVkaXQgPSBnZXRBbW91bnREYXRhKHR4bi5jcmVkaXQpO1xuICBjb25zdCBkZWJpdCA9IGdldEFtb3VudERhdGEodHhuLmRlYml0KTtcbiAgcmV0dXJuIChOdW1iZXIuaXNOYU4oY3JlZGl0KSA/IDAgOiBjcmVkaXQpIC0gKE51bWJlci5pc05hTihkZWJpdCkgPyAwIDogZGViaXQpO1xufVxuXG5mdW5jdGlvbiBjb252ZXJ0VHJhbnNhY3Rpb25zKHR4bnM6IFNjcmFwZWRUcmFuc2FjdGlvbltdKTogVHJhbnNhY3Rpb25bXSB7XG4gIHJldHVybiB0eG5zLm1hcCh0eG4gPT4ge1xuICAgIGNvbnN0IGNvbnZlcnRlZERhdGUgPSBtb21lbnQodHhuLmRhdGUsIERBVEVfRk9STUFUKS50b0lTT1N0cmluZygpO1xuICAgIGNvbnN0IGNvbnZlcnRlZEFtb3VudCA9IGdldFR4bkFtb3VudCh0eG4pO1xuICAgIHJldHVybiB7XG4gICAgICB0eXBlOiBUcmFuc2FjdGlvblR5cGVzLk5vcm1hbCxcbiAgICAgIGlkZW50aWZpZXI6IHR4bi5yZWZlcmVuY2UgPyBwYXJzZUludCh0eG4ucmVmZXJlbmNlLCAxMCkgOiB1bmRlZmluZWQsXG4gICAgICBkYXRlOiBjb252ZXJ0ZWREYXRlLFxuICAgICAgcHJvY2Vzc2VkRGF0ZTogY29udmVydGVkRGF0ZSxcbiAgICAgIG9yaWdpbmFsQW1vdW50OiBjb252ZXJ0ZWRBbW91bnQsXG4gICAgICBvcmlnaW5hbEN1cnJlbmN5OiBTSEVLRUxfQ1VSUkVOQ1ksXG4gICAgICBjaGFyZ2VkQW1vdW50OiBjb252ZXJ0ZWRBbW91bnQsXG4gICAgICBzdGF0dXM6IHR4bi5zdGF0dXMsXG4gICAgICBkZXNjcmlwdGlvbjogdHhuLmRlc2NyaXB0aW9uLFxuICAgICAgbWVtbzogdHhuLm1lbW8sXG4gICAgfTtcbiAgfSk7XG59XG5cbnR5cGUgVHJhbnNhY3Rpb25zVHIgPSB7IGlkOiBzdHJpbmc7IGlubmVyVGRzOiBUcmFuc2FjdGlvbnNUclRkcyB9O1xudHlwZSBUcmFuc2FjdGlvblRhYmxlSGVhZGVycyA9IFJlY29yZDxzdHJpbmcsIG51bWJlcj47XG50eXBlIFRyYW5zYWN0aW9uc1RyVGRzID0gc3RyaW5nW107XG5cbmZ1bmN0aW9uIGdldFRyYW5zYWN0aW9uRGF0ZSh0ZHM6IFRyYW5zYWN0aW9uc1RyVGRzLCB0eG5zVGFibGVIZWFkZXJzOiBUcmFuc2FjdGlvblRhYmxlSGVhZGVycykge1xuICByZXR1cm4gKHRkc1t0eG5zVGFibGVIZWFkZXJzW0RBVEVfSEVBREVSXV0gfHwgJycpLnRyaW0oKTtcbn1cblxuZnVuY3Rpb24gZ2V0VHJhbnNhY3Rpb25EZXNjcmlwdGlvbih0ZHM6IFRyYW5zYWN0aW9uc1RyVGRzLCB0eG5zVGFibGVIZWFkZXJzOiBUcmFuc2FjdGlvblRhYmxlSGVhZGVycykge1xuICByZXR1cm4gKHRkc1t0eG5zVGFibGVIZWFkZXJzW0RFU0NSSVBUSU9OX0hFQURFUl1dIHx8ICcnKS50cmltKCk7XG59XG5cbmZ1bmN0aW9uIGdldFRyYW5zYWN0aW9uUmVmZXJlbmNlKHRkczogVHJhbnNhY3Rpb25zVHJUZHMsIHR4bnNUYWJsZUhlYWRlcnM6IFRyYW5zYWN0aW9uVGFibGVIZWFkZXJzKSB7XG4gIHJldHVybiAodGRzW3R4bnNUYWJsZUhlYWRlcnNbUkVGRVJFTkNFX0hFQURFUl1dIHx8ICcnKS50cmltKCk7XG59XG5cbmZ1bmN0aW9uIGdldFRyYW5zYWN0aW9uRGViaXQodGRzOiBUcmFuc2FjdGlvbnNUclRkcywgdHhuc1RhYmxlSGVhZGVyczogVHJhbnNhY3Rpb25UYWJsZUhlYWRlcnMpIHtcbiAgcmV0dXJuICh0ZHNbdHhuc1RhYmxlSGVhZGVyc1tERUJJVF9IRUFERVJdXSB8fCAnJykudHJpbSgpO1xufVxuXG5mdW5jdGlvbiBnZXRUcmFuc2FjdGlvbkNyZWRpdCh0ZHM6IFRyYW5zYWN0aW9uc1RyVGRzLCB0eG5zVGFibGVIZWFkZXJzOiBUcmFuc2FjdGlvblRhYmxlSGVhZGVycykge1xuICByZXR1cm4gKHRkc1t0eG5zVGFibGVIZWFkZXJzW0NSRURJVF9IRUFERVJdXSB8fCAnJykudHJpbSgpO1xufVxuXG5mdW5jdGlvbiBleHRyYWN0VHJhbnNhY3Rpb25EZXRhaWxzKFxuICB0eG5Sb3c6IFRyYW5zYWN0aW9uc1RyLFxuICB0eG5zVGFibGVIZWFkZXJzOiBUcmFuc2FjdGlvblRhYmxlSGVhZGVycyxcbiAgdHhuU3RhdHVzOiBUcmFuc2FjdGlvblN0YXR1c2VzLFxuKTogU2NyYXBlZFRyYW5zYWN0aW9uIHtcbiAgY29uc3QgdGRzID0gdHhuUm93LmlubmVyVGRzO1xuICByZXR1cm4ge1xuICAgIHN0YXR1czogdHhuU3RhdHVzLFxuICAgIGRhdGU6IGdldFRyYW5zYWN0aW9uRGF0ZSh0ZHMsIHR4bnNUYWJsZUhlYWRlcnMpLFxuICAgIGRlc2NyaXB0aW9uOiBnZXRUcmFuc2FjdGlvbkRlc2NyaXB0aW9uKHRkcywgdHhuc1RhYmxlSGVhZGVycyksXG4gICAgcmVmZXJlbmNlOiBnZXRUcmFuc2FjdGlvblJlZmVyZW5jZSh0ZHMsIHR4bnNUYWJsZUhlYWRlcnMpLFxuICAgIGRlYml0OiBnZXRUcmFuc2FjdGlvbkRlYml0KHRkcywgdHhuc1RhYmxlSGVhZGVycyksXG4gICAgY3JlZGl0OiBnZXRUcmFuc2FjdGlvbkNyZWRpdCh0ZHMsIHR4bnNUYWJsZUhlYWRlcnMpLFxuICAgIG1lbW86ICcnLFxuICB9O1xufVxuXG5mdW5jdGlvbiBpc0V4cGFuZGVkRGVzY1Jvdyh0eG5Sb3c6IFRyYW5zYWN0aW9uc1RyKSB7XG4gIHJldHVybiB0eG5Sb3cuaWQgPT09ICdyb3dBZGRlZCc7XG59XG5cbi8qIGVzbGludC1kaXNhYmxlIG5vLXBhcmFtLXJlYXNzaWduICovXG5mdW5jdGlvbiBlZGl0TGFzdFRyYW5zYWN0aW9uRGVzYyh0eG5Sb3c6IFRyYW5zYWN0aW9uc1RyLCBsYXN0VHhuOiBTY3JhcGVkVHJhbnNhY3Rpb24pOiBTY3JhcGVkVHJhbnNhY3Rpb24ge1xuICBsYXN0VHhuLmRlc2NyaXB0aW9uID0gYCR7bGFzdFR4bi5kZXNjcmlwdGlvbn0gJHt0eG5Sb3cuaW5uZXJUZHNbMF19YDtcbiAgcmV0dXJuIGxhc3RUeG47XG59XG5cbmZ1bmN0aW9uIGhhbmRsZVRyYW5zYWN0aW9uUm93KFxuICB0eG5zOiBTY3JhcGVkVHJhbnNhY3Rpb25bXSxcbiAgdHhuc1RhYmxlSGVhZGVyczogVHJhbnNhY3Rpb25UYWJsZUhlYWRlcnMsXG4gIHR4blJvdzogVHJhbnNhY3Rpb25zVHIsXG4gIHR4blR5cGU6IFRyYW5zYWN0aW9uU3RhdHVzZXMsXG4pIHtcbiAgaWYgKGlzRXhwYW5kZWREZXNjUm93KHR4blJvdykpIHtcbiAgICBjb25zdCBsYXN0VHJhbnNhY3Rpb24gPSB0eG5zLnBvcCgpO1xuICAgIGlmIChsYXN0VHJhbnNhY3Rpb24pIHtcbiAgICAgIHR4bnMucHVzaChlZGl0TGFzdFRyYW5zYWN0aW9uRGVzYyh0eG5Sb3csIGxhc3RUcmFuc2FjdGlvbikpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludGVybmFsIHVuaW9uLWJhbmsgZXJyb3InKTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgdHhucy5wdXNoKGV4dHJhY3RUcmFuc2FjdGlvbkRldGFpbHModHhuUm93LCB0eG5zVGFibGVIZWFkZXJzLCB0eG5UeXBlKSk7XG4gIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gZ2V0VHJhbnNhY3Rpb25zVGFibGVIZWFkZXJzKHBhZ2U6IFBhZ2UsIHRhYmxlVHlwZUlkOiBzdHJpbmcpIHtcbiAgY29uc3QgaGVhZGVyc01hcDogUmVjb3JkPHN0cmluZywgYW55PiA9IFtdO1xuICBjb25zdCBoZWFkZXJzT2JqcyA9IGF3YWl0IHBhZ2VFdmFsQWxsKHBhZ2UsIGAjV29ya1NwYWNlQm94ICMke3RhYmxlVHlwZUlkfSB0cltjbGFzcz0naGVhZGVyJ10gdGhgLCBudWxsLCB0aHMgPT4ge1xuICAgIHJldHVybiB0aHMubWFwKCh0aCwgaW5kZXgpID0+ICh7XG4gICAgICB0ZXh0OiAodGggYXMgSFRNTEVsZW1lbnQpLmlubmVyVGV4dC50cmltKCksXG4gICAgICBpbmRleCxcbiAgICB9KSk7XG4gIH0pO1xuXG4gIGZvciAoY29uc3QgaGVhZGVyT2JqIG9mIGhlYWRlcnNPYmpzKSB7XG4gICAgaGVhZGVyc01hcFtoZWFkZXJPYmoudGV4dF0gPSBoZWFkZXJPYmouaW5kZXg7XG4gIH1cbiAgcmV0dXJuIGhlYWRlcnNNYXA7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGV4dHJhY3RUcmFuc2FjdGlvbnNGcm9tVGFibGUoXG4gIHBhZ2U6IFBhZ2UsXG4gIHRhYmxlVHlwZUlkOiBzdHJpbmcsXG4gIHR4blR5cGU6IFRyYW5zYWN0aW9uU3RhdHVzZXMsXG4pOiBQcm9taXNlPFNjcmFwZWRUcmFuc2FjdGlvbltdPiB7XG4gIGNvbnN0IHR4bnM6IFNjcmFwZWRUcmFuc2FjdGlvbltdID0gW107XG4gIGNvbnN0IHRyYW5zYWN0aW9uc1RhYmxlSGVhZGVycyA9IGF3YWl0IGdldFRyYW5zYWN0aW9uc1RhYmxlSGVhZGVycyhwYWdlLCB0YWJsZVR5cGVJZCk7XG5cbiAgY29uc3QgdHJhbnNhY3Rpb25zUm93cyA9IGF3YWl0IHBhZ2VFdmFsQWxsPFRyYW5zYWN0aW9uc1RyW10+KFxuICAgIHBhZ2UsXG4gICAgYCNXb3JrU3BhY2VCb3ggIyR7dGFibGVUeXBlSWR9IHRyW2NsYXNzXTpub3QoW2NsYXNzPSdoZWFkZXInXSlgLFxuICAgIFtdLFxuICAgIHRycyA9PiB7XG4gICAgICByZXR1cm4gKHRycyBhcyBIVE1MRWxlbWVudFtdKS5tYXAodHIgPT4gKHtcbiAgICAgICAgaWQ6IHRyLmdldEF0dHJpYnV0ZSgnaWQnKSB8fCAnJyxcbiAgICAgICAgaW5uZXJUZHM6IEFycmF5LmZyb20odHIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ3RkJykpLm1hcCh0ZCA9PiAodGQgYXMgSFRNTEVsZW1lbnQpLmlubmVyVGV4dCksXG4gICAgICB9KSk7XG4gICAgfSxcbiAgKTtcblxuICBmb3IgKGNvbnN0IHR4blJvdyBvZiB0cmFuc2FjdGlvbnNSb3dzKSB7XG4gICAgaGFuZGxlVHJhbnNhY3Rpb25Sb3codHhucywgdHJhbnNhY3Rpb25zVGFibGVIZWFkZXJzLCB0eG5Sb3csIHR4blR5cGUpO1xuICB9XG4gIHJldHVybiB0eG5zO1xufVxuXG5hc3luYyBmdW5jdGlvbiBpc05vVHJhbnNhY3Rpb25JbkRhdGVSYW5nZUVycm9yKHBhZ2U6IFBhZ2UpIHtcbiAgY29uc3QgaGFzRXJyb3JJbmZvRWxlbWVudCA9IGF3YWl0IGVsZW1lbnRQcmVzZW50T25QYWdlKHBhZ2UsIGAuJHtFUlJPUl9NRVNTQUdFX0NMQVNTfWApO1xuICBpZiAoaGFzRXJyb3JJbmZvRWxlbWVudCkge1xuICAgIGNvbnN0IGVycm9yVGV4dCA9IGF3YWl0IHBhZ2UuJGV2YWwoYC4ke0VSUk9SX01FU1NBR0VfQ0xBU1N9YCwgZXJyb3JFbGVtZW50ID0+IHtcbiAgICAgIHJldHVybiAoZXJyb3JFbGVtZW50IGFzIEhUTUxFbGVtZW50KS5pbm5lclRleHQ7XG4gICAgfSk7XG4gICAgcmV0dXJuIGVycm9yVGV4dC50cmltKCkgPT09IE5PX1RSQU5TQUNUSU9OX0lOX0RBVEVfUkFOR0VfVEVYVDtcbiAgfVxuICByZXR1cm4gZmFsc2U7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGNob29zZUFjY291bnQocGFnZTogUGFnZSwgYWNjb3VudElkOiBzdHJpbmcpIHtcbiAgY29uc3QgaGFzRHJvcERvd25MaXN0ID0gYXdhaXQgZWxlbWVudFByZXNlbnRPblBhZ2UocGFnZSwgQUNDT1VOVFNfRFJPUERPV05fU0VMRUNUT1IpO1xuICBpZiAoaGFzRHJvcERvd25MaXN0KSB7XG4gICAgYXdhaXQgZHJvcGRvd25TZWxlY3QocGFnZSwgQUNDT1VOVFNfRFJPUERPV05fU0VMRUNUT1IsIGFjY291bnRJZCk7XG4gIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gc2VhcmNoQnlEYXRlcyhwYWdlOiBQYWdlLCBzdGFydERhdGU6IE1vbWVudCkge1xuICBhd2FpdCBkcm9wZG93blNlbGVjdChwYWdlLCAnc2VsZWN0I2RkbFRyYW5zYWN0aW9uUGVyaW9kJywgJzAwNCcpO1xuICBhd2FpdCB3YWl0VW50aWxFbGVtZW50Rm91bmQocGFnZSwgJ3NlbGVjdCNkZGxUcmFuc2FjdGlvblBlcmlvZCcpO1xuICBhd2FpdCBmaWxsSW5wdXQocGFnZSwgJ2lucHV0I2R0RnJvbURhdGVfdGV4dEJveCcsIHN0YXJ0RGF0ZS5mb3JtYXQoREFURV9GT1JNQVQpKTtcbiAgYXdhaXQgY2xpY2tCdXR0b24ocGFnZSwgJ2lucHV0I2J0bkRpc3BsYXlEYXRlcycpO1xuICBhd2FpdCB3YWl0Rm9yTmF2aWdhdGlvbihwYWdlKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gZ2V0QWNjb3VudE51bWJlcihwYWdlOiBQYWdlKSB7XG4gIGNvbnN0IHNlbGVjdGVkU25pZkFjY291bnQgPSBhd2FpdCBwYWdlLiRldmFsKCcjZGRsQWNjb3VudHNfbV9kZGwgb3B0aW9uW3NlbGVjdGVkPVwic2VsZWN0ZWRcIl0nLCBvcHRpb24gPT4ge1xuICAgIHJldHVybiAob3B0aW9uIGFzIEhUTUxFbGVtZW50KS5pbm5lclRleHQ7XG4gIH0pO1xuXG4gIHJldHVybiBzZWxlY3RlZFNuaWZBY2NvdW50LnJlcGxhY2UoJy8nLCAnXycpO1xufVxuXG5hc3luYyBmdW5jdGlvbiBleHBhbmRUcmFuc2FjdGlvbnNUYWJsZShwYWdlOiBQYWdlKSB7XG4gIGNvbnN0IGhhc0V4cGFuZEFsbEJ1dHRvbiA9IGF3YWl0IGVsZW1lbnRQcmVzZW50T25QYWdlKHBhZ2UsIFwiYVtpZCo9J2xua0N0bEV4cGFuZEFsbCddXCIpO1xuICBpZiAoaGFzRXhwYW5kQWxsQnV0dG9uKSB7XG4gICAgYXdhaXQgY2xpY2tCdXR0b24ocGFnZSwgXCJhW2lkKj0nbG5rQ3RsRXhwYW5kQWxsJ11cIik7XG4gIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gc2NyYXBlVHJhbnNhY3Rpb25zRnJvbVRhYmxlKHBhZ2U6IFBhZ2UpOiBQcm9taXNlPFRyYW5zYWN0aW9uW10+IHtcbiAgY29uc3QgcGVuZGluZ1R4bnMgPSBhd2FpdCBleHRyYWN0VHJhbnNhY3Rpb25zRnJvbVRhYmxlKFxuICAgIHBhZ2UsXG4gICAgUEVORElOR19UUkFOU0FDVElPTlNfVEFCTEVfSUQsXG4gICAgVHJhbnNhY3Rpb25TdGF0dXNlcy5QZW5kaW5nLFxuICApO1xuICBjb25zdCBjb21wbGV0ZWRUeG5zID0gYXdhaXQgZXh0cmFjdFRyYW5zYWN0aW9uc0Zyb21UYWJsZShcbiAgICBwYWdlLFxuICAgIENPTVBMRVRFRF9UUkFOU0FDVElPTlNfVEFCTEVfSUQsXG4gICAgVHJhbnNhY3Rpb25TdGF0dXNlcy5Db21wbGV0ZWQsXG4gICk7XG4gIGNvbnN0IHR4bnMgPSBbLi4ucGVuZGluZ1R4bnMsIC4uLmNvbXBsZXRlZFR4bnNdO1xuICByZXR1cm4gY29udmVydFRyYW5zYWN0aW9ucyh0eG5zKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gZ2V0QWNjb3VudFRyYW5zYWN0aW9ucyhwYWdlOiBQYWdlKTogUHJvbWlzZTxUcmFuc2FjdGlvbltdPiB7XG4gIGF3YWl0IFByb21pc2UucmFjZShbXG4gICAgd2FpdFVudGlsRWxlbWVudEZvdW5kKHBhZ2UsIGAjJHtDT01QTEVURURfVFJBTlNBQ1RJT05TX1RBQkxFX0lEfWAsIGZhbHNlKSxcbiAgICB3YWl0VW50aWxFbGVtZW50Rm91bmQocGFnZSwgYC4ke0VSUk9SX01FU1NBR0VfQ0xBU1N9YCwgZmFsc2UpLFxuICBdKTtcblxuICBjb25zdCBub1RyYW5zYWN0aW9uSW5SYW5nZUVycm9yID0gYXdhaXQgaXNOb1RyYW5zYWN0aW9uSW5EYXRlUmFuZ2VFcnJvcihwYWdlKTtcbiAgaWYgKG5vVHJhbnNhY3Rpb25JblJhbmdlRXJyb3IpIHtcbiAgICByZXR1cm4gW107XG4gIH1cblxuICBhd2FpdCBleHBhbmRUcmFuc2FjdGlvbnNUYWJsZShwYWdlKTtcbiAgcmV0dXJuIHNjcmFwZVRyYW5zYWN0aW9uc0Zyb21UYWJsZShwYWdlKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gZmV0Y2hBY2NvdW50RGF0YShwYWdlOiBQYWdlLCBzdGFydERhdGU6IE1vbWVudCwgYWNjb3VudElkOiBzdHJpbmcpOiBQcm9taXNlPFRyYW5zYWN0aW9uc0FjY291bnQ+IHtcbiAgYXdhaXQgY2hvb3NlQWNjb3VudChwYWdlLCBhY2NvdW50SWQpO1xuICBhd2FpdCBzZWFyY2hCeURhdGVzKHBhZ2UsIHN0YXJ0RGF0ZSk7XG4gIGNvbnN0IGFjY291bnROdW1iZXIgPSBhd2FpdCBnZXRBY2NvdW50TnVtYmVyKHBhZ2UpO1xuICBjb25zdCB0eG5zID0gYXdhaXQgZ2V0QWNjb3VudFRyYW5zYWN0aW9ucyhwYWdlKTtcbiAgcmV0dXJuIHtcbiAgICBhY2NvdW50TnVtYmVyLFxuICAgIHR4bnMsXG4gIH07XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGZldGNoQWNjb3VudHMocGFnZTogUGFnZSwgc3RhcnREYXRlOiBNb21lbnQpIHtcbiAgY29uc3QgYWNjb3VudHM6IFRyYW5zYWN0aW9uc0FjY291bnRbXSA9IFtdO1xuICBjb25zdCBhY2NvdW50c0xpc3QgPSBhd2FpdCBkcm9wZG93bkVsZW1lbnRzKHBhZ2UsIEFDQ09VTlRTX0RST1BET1dOX1NFTEVDVE9SKTtcbiAgZm9yIChjb25zdCBhY2NvdW50IG9mIGFjY291bnRzTGlzdCkge1xuICAgIGlmIChhY2NvdW50LnZhbHVlICE9PSAnLTEnKSB7XG4gICAgICAvLyBTa2lwIFwiQWxsIGFjY291bnRzXCIgb3B0aW9uXG4gICAgICBjb25zdCBhY2NvdW50RGF0YSA9IGF3YWl0IGZldGNoQWNjb3VudERhdGEocGFnZSwgc3RhcnREYXRlLCBhY2NvdW50LnZhbHVlKTtcbiAgICAgIGFjY291bnRzLnB1c2goYWNjb3VudERhdGEpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gYWNjb3VudHM7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHdhaXRGb3JQb3N0TG9naW4ocGFnZTogUGFnZSkge1xuICByZXR1cm4gUHJvbWlzZS5yYWNlKFt3YWl0VW50aWxFbGVtZW50Rm91bmQocGFnZSwgJyNzaWdub2ZmJywgdHJ1ZSksIHdhaXRVbnRpbEVsZW1lbnRGb3VuZChwYWdlLCAnI3Jlc3RvcmUnLCB0cnVlKV0pO1xufVxuXG50eXBlIFNjcmFwZXJTcGVjaWZpY0NyZWRlbnRpYWxzID0geyB1c2VybmFtZTogc3RyaW5nOyBwYXNzd29yZDogc3RyaW5nIH07XG5cbmNsYXNzIFVuaW9uQmFua1NjcmFwZXIgZXh0ZW5kcyBCYXNlU2NyYXBlcldpdGhCcm93c2VyPFNjcmFwZXJTcGVjaWZpY0NyZWRlbnRpYWxzPiB7XG4gIGdldExvZ2luT3B0aW9ucyhjcmVkZW50aWFsczogU2NyYXBlclNwZWNpZmljQ3JlZGVudGlhbHMpIHtcbiAgICByZXR1cm4ge1xuICAgICAgbG9naW5Vcmw6IGAke0JBU0VfVVJMfWAsXG4gICAgICBmaWVsZHM6IGNyZWF0ZUxvZ2luRmllbGRzKGNyZWRlbnRpYWxzKSxcbiAgICAgIHN1Ym1pdEJ1dHRvblNlbGVjdG9yOiAnI2VudGVyJyxcbiAgICAgIHBvc3RBY3Rpb246IGFzeW5jICgpID0+IHdhaXRGb3JQb3N0TG9naW4odGhpcy5wYWdlKSxcbiAgICAgIHBvc3NpYmxlUmVzdWx0czogZ2V0UG9zc2libGVMb2dpblJlc3VsdHMoKSxcbiAgICB9O1xuICB9XG5cbiAgYXN5bmMgZmV0Y2hEYXRhKCkge1xuICAgIGNvbnN0IGRlZmF1bHRTdGFydE1vbWVudCA9IG1vbWVudCgpLnN1YnRyYWN0KDEsICd5ZWFycycpLmFkZCgxLCAnZGF5Jyk7XG4gICAgY29uc3Qgc3RhcnREYXRlID0gdGhpcy5vcHRpb25zLnN0YXJ0RGF0ZSB8fCBkZWZhdWx0U3RhcnRNb21lbnQudG9EYXRlKCk7XG4gICAgY29uc3Qgc3RhcnRNb21lbnQgPSBtb21lbnQubWF4KGRlZmF1bHRTdGFydE1vbWVudCwgbW9tZW50KHN0YXJ0RGF0ZSkpO1xuXG4gICAgYXdhaXQgdGhpcy5uYXZpZ2F0ZVRvKFRSQU5TQUNUSU9OU19VUkwpO1xuXG4gICAgY29uc3QgYWNjb3VudHMgPSBhd2FpdCBmZXRjaEFjY291bnRzKHRoaXMucGFnZSwgc3RhcnRNb21lbnQpO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIHN1Y2Nlc3M6IHRydWUsXG4gICAgICBhY2NvdW50cyxcbiAgICB9O1xuICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IFVuaW9uQmFua1NjcmFwZXI7XG4iXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFBLElBQUFBLE9BQUEsR0FBQUMsc0JBQUEsQ0FBQUMsT0FBQTtBQUVBLElBQUFDLFVBQUEsR0FBQUQsT0FBQTtBQUNBLElBQUFFLHFCQUFBLEdBQUFGLE9BQUE7QUFTQSxJQUFBRyxXQUFBLEdBQUFILE9BQUE7QUFDQSxJQUFBSSxhQUFBLEdBQUFKLE9BQUE7QUFDQSxJQUFBSyx1QkFBQSxHQUFBTCxPQUFBO0FBQThHLFNBQUFELHVCQUFBTyxDQUFBLFdBQUFBLENBQUEsSUFBQUEsQ0FBQSxDQUFBQyxVQUFBLEdBQUFELENBQUEsS0FBQUUsT0FBQSxFQUFBRixDQUFBO0FBRTlHLE1BQU1HLFFBQVEsR0FBRyw0QkFBNEI7QUFDN0MsTUFBTUMsZ0JBQWdCLEdBQUcsR0FBR0QsUUFBUSw0Q0FBNEM7QUFDaEYsTUFBTUUsV0FBVyxHQUFHLFVBQVU7QUFDOUIsTUFBTUMsaUNBQWlDLEdBQUcsOENBQThDO0FBQ3hGLE1BQU1DLFdBQVcsR0FBRyxPQUFPO0FBQzNCLE1BQU1DLGtCQUFrQixHQUFHLE9BQU87QUFDbEMsTUFBTUMsZ0JBQWdCLEdBQUcsUUFBUTtBQUNqQyxNQUFNQyxZQUFZLEdBQUcsTUFBTTtBQUMzQixNQUFNQyxhQUFhLEdBQUcsTUFBTTtBQUM1QixNQUFNQyw2QkFBNkIsR0FBRywrQkFBK0I7QUFDckUsTUFBTUMsK0JBQStCLEdBQUcsa0JBQWtCO0FBQzFELE1BQU1DLG1CQUFtQixHQUFHLFNBQVM7QUFDckMsTUFBTUMsMEJBQTBCLEdBQUcsMEJBQTBCO0FBRTdELFNBQVNDLHVCQUF1QkEsQ0FBQSxFQUFHO0VBQ2pDLE1BQU1DLElBQTBCLEdBQUcsQ0FBQyxDQUFDO0VBQ3JDQSxJQUFJLENBQUNDLG9DQUFZLENBQUNDLE9BQU8sQ0FBQyxHQUFHLENBQUMsb0JBQW9CLENBQUM7RUFDbkRGLElBQUksQ0FBQ0Msb0NBQVksQ0FBQ0UsZUFBZSxDQUFDLEdBQUcsQ0FBQyxrREFBa0QsQ0FBQztFQUN6RixPQUFPSCxJQUFJO0FBQ2I7QUFFQSxTQUFTSSxpQkFBaUJBLENBQUNDLFdBQXVDLEVBQUU7RUFDbEUsT0FBTyxDQUNMO0lBQUVDLFFBQVEsRUFBRSxNQUFNO0lBQUVDLEtBQUssRUFBRUYsV0FBVyxDQUFDRztFQUFTLENBQUMsRUFDakQ7SUFBRUYsUUFBUSxFQUFFLFdBQVc7SUFBRUMsS0FBSyxFQUFFRixXQUFXLENBQUNJO0VBQVMsQ0FBQyxDQUN2RDtBQUNIO0FBRUEsU0FBU0MsYUFBYUEsQ0FBQ0MsU0FBaUIsRUFBRTtFQUN4QyxNQUFNQyxhQUFhLEdBQUdELFNBQVMsQ0FBQ0UsT0FBTyxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUM7RUFDaEQsT0FBT0MsVUFBVSxDQUFDRixhQUFhLENBQUM7QUFDbEM7QUFZQSxTQUFTRyxZQUFZQSxDQUFDQyxHQUF1QixFQUFFO0VBQzdDLE1BQU1DLE1BQU0sR0FBR1AsYUFBYSxDQUFDTSxHQUFHLENBQUNDLE1BQU0sQ0FBQztFQUN4QyxNQUFNQyxLQUFLLEdBQUdSLGFBQWEsQ0FBQ00sR0FBRyxDQUFDRSxLQUFLLENBQUM7RUFDdEMsT0FBTyxDQUFDQyxNQUFNLENBQUNDLEtBQUssQ0FBQ0gsTUFBTSxDQUFDLEdBQUcsQ0FBQyxHQUFHQSxNQUFNLEtBQUtFLE1BQU0sQ0FBQ0MsS0FBSyxDQUFDRixLQUFLLENBQUMsR0FBRyxDQUFDLEdBQUdBLEtBQUssQ0FBQztBQUNoRjtBQUVBLFNBQVNHLG1CQUFtQkEsQ0FBQ0MsSUFBMEIsRUFBaUI7RUFDdEUsT0FBT0EsSUFBSSxDQUFDQyxHQUFHLENBQUNQLEdBQUcsSUFBSTtJQUNyQixNQUFNUSxhQUFhLEdBQUcsSUFBQUMsZUFBTSxFQUFDVCxHQUFHLENBQUNVLElBQUksRUFBRXRDLFdBQVcsQ0FBQyxDQUFDdUMsV0FBVyxDQUFDLENBQUM7SUFDakUsTUFBTUMsZUFBZSxHQUFHYixZQUFZLENBQUNDLEdBQUcsQ0FBQztJQUN6QyxPQUFPO01BQ0xhLElBQUksRUFBRUMsOEJBQWdCLENBQUNDLE1BQU07TUFDN0JDLFVBQVUsRUFBRWhCLEdBQUcsQ0FBQ2lCLFNBQVMsR0FBR0MsUUFBUSxDQUFDbEIsR0FBRyxDQUFDaUIsU0FBUyxFQUFFLEVBQUUsQ0FBQyxHQUFHRSxTQUFTO01BQ25FVCxJQUFJLEVBQUVGLGFBQWE7TUFDbkJZLGFBQWEsRUFBRVosYUFBYTtNQUM1QmEsY0FBYyxFQUFFVCxlQUFlO01BQy9CVSxnQkFBZ0IsRUFBRUMsMEJBQWU7TUFDakNDLGFBQWEsRUFBRVosZUFBZTtNQUM5QmEsTUFBTSxFQUFFekIsR0FBRyxDQUFDeUIsTUFBTTtNQUNsQkMsV0FBVyxFQUFFMUIsR0FBRyxDQUFDMEIsV0FBVztNQUM1QkMsSUFBSSxFQUFFM0IsR0FBRyxDQUFDMkI7SUFDWixDQUFDO0VBQ0gsQ0FBQyxDQUFDO0FBQ0o7QUFNQSxTQUFTQyxrQkFBa0JBLENBQUNDLEdBQXNCLEVBQUVDLGdCQUF5QyxFQUFFO0VBQzdGLE9BQU8sQ0FBQ0QsR0FBRyxDQUFDQyxnQkFBZ0IsQ0FBQ3hELFdBQVcsQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFeUQsSUFBSSxDQUFDLENBQUM7QUFDMUQ7QUFFQSxTQUFTQyx5QkFBeUJBLENBQUNILEdBQXNCLEVBQUVDLGdCQUF5QyxFQUFFO0VBQ3BHLE9BQU8sQ0FBQ0QsR0FBRyxDQUFDQyxnQkFBZ0IsQ0FBQ3ZELGtCQUFrQixDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUV3RCxJQUFJLENBQUMsQ0FBQztBQUNqRTtBQUVBLFNBQVNFLHVCQUF1QkEsQ0FBQ0osR0FBc0IsRUFBRUMsZ0JBQXlDLEVBQUU7RUFDbEcsT0FBTyxDQUFDRCxHQUFHLENBQUNDLGdCQUFnQixDQUFDdEQsZ0JBQWdCLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRXVELElBQUksQ0FBQyxDQUFDO0FBQy9EO0FBRUEsU0FBU0csbUJBQW1CQSxDQUFDTCxHQUFzQixFQUFFQyxnQkFBeUMsRUFBRTtFQUM5RixPQUFPLENBQUNELEdBQUcsQ0FBQ0MsZ0JBQWdCLENBQUNyRCxZQUFZLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRXNELElBQUksQ0FBQyxDQUFDO0FBQzNEO0FBRUEsU0FBU0ksb0JBQW9CQSxDQUFDTixHQUFzQixFQUFFQyxnQkFBeUMsRUFBRTtFQUMvRixPQUFPLENBQUNELEdBQUcsQ0FBQ0MsZ0JBQWdCLENBQUNwRCxhQUFhLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRXFELElBQUksQ0FBQyxDQUFDO0FBQzVEO0FBRUEsU0FBU0sseUJBQXlCQSxDQUNoQ0MsTUFBc0IsRUFDdEJQLGdCQUF5QyxFQUN6Q1EsU0FBOEIsRUFDVjtFQUNwQixNQUFNVCxHQUFHLEdBQUdRLE1BQU0sQ0FBQ0UsUUFBUTtFQUMzQixPQUFPO0lBQ0xkLE1BQU0sRUFBRWEsU0FBUztJQUNqQjVCLElBQUksRUFBRWtCLGtCQUFrQixDQUFDQyxHQUFHLEVBQUVDLGdCQUFnQixDQUFDO0lBQy9DSixXQUFXLEVBQUVNLHlCQUF5QixDQUFDSCxHQUFHLEVBQUVDLGdCQUFnQixDQUFDO0lBQzdEYixTQUFTLEVBQUVnQix1QkFBdUIsQ0FBQ0osR0FBRyxFQUFFQyxnQkFBZ0IsQ0FBQztJQUN6RDVCLEtBQUssRUFBRWdDLG1CQUFtQixDQUFDTCxHQUFHLEVBQUVDLGdCQUFnQixDQUFDO0lBQ2pEN0IsTUFBTSxFQUFFa0Msb0JBQW9CLENBQUNOLEdBQUcsRUFBRUMsZ0JBQWdCLENBQUM7SUFDbkRILElBQUksRUFBRTtFQUNSLENBQUM7QUFDSDtBQUVBLFNBQVNhLGlCQUFpQkEsQ0FBQ0gsTUFBc0IsRUFBRTtFQUNqRCxPQUFPQSxNQUFNLENBQUNJLEVBQUUsS0FBSyxVQUFVO0FBQ2pDOztBQUVBO0FBQ0EsU0FBU0MsdUJBQXVCQSxDQUFDTCxNQUFzQixFQUFFTSxPQUEyQixFQUFzQjtFQUN4R0EsT0FBTyxDQUFDakIsV0FBVyxHQUFHLEdBQUdpQixPQUFPLENBQUNqQixXQUFXLElBQUlXLE1BQU0sQ0FBQ0UsUUFBUSxDQUFDLENBQUMsQ0FBQyxFQUFFO0VBQ3BFLE9BQU9JLE9BQU87QUFDaEI7QUFFQSxTQUFTQyxvQkFBb0JBLENBQzNCdEMsSUFBMEIsRUFDMUJ3QixnQkFBeUMsRUFDekNPLE1BQXNCLEVBQ3RCUSxPQUE0QixFQUM1QjtFQUNBLElBQUlMLGlCQUFpQixDQUFDSCxNQUFNLENBQUMsRUFBRTtJQUM3QixNQUFNUyxlQUFlLEdBQUd4QyxJQUFJLENBQUN5QyxHQUFHLENBQUMsQ0FBQztJQUNsQyxJQUFJRCxlQUFlLEVBQUU7TUFDbkJ4QyxJQUFJLENBQUMwQyxJQUFJLENBQUNOLHVCQUF1QixDQUFDTCxNQUFNLEVBQUVTLGVBQWUsQ0FBQyxDQUFDO0lBQzdELENBQUMsTUFBTTtNQUNMLE1BQU0sSUFBSUcsS0FBSyxDQUFDLDJCQUEyQixDQUFDO0lBQzlDO0VBQ0YsQ0FBQyxNQUFNO0lBQ0wzQyxJQUFJLENBQUMwQyxJQUFJLENBQUNaLHlCQUF5QixDQUFDQyxNQUFNLEVBQUVQLGdCQUFnQixFQUFFZSxPQUFPLENBQUMsQ0FBQztFQUN6RTtBQUNGO0FBRUEsZUFBZUssMkJBQTJCQSxDQUFDQyxJQUFVLEVBQUVDLFdBQW1CLEVBQUU7RUFDMUUsTUFBTUMsVUFBK0IsR0FBRyxFQUFFO0VBQzFDLE1BQU1DLFdBQVcsR0FBRyxNQUFNLElBQUFDLGlDQUFXLEVBQUNKLElBQUksRUFBRSxrQkFBa0JDLFdBQVcsd0JBQXdCLEVBQUUsSUFBSSxFQUFFSSxHQUFHLElBQUk7SUFDOUcsT0FBT0EsR0FBRyxDQUFDakQsR0FBRyxDQUFDLENBQUNrRCxFQUFFLEVBQUVDLEtBQUssTUFBTTtNQUM3QkMsSUFBSSxFQUFHRixFQUFFLENBQWlCRyxTQUFTLENBQUM3QixJQUFJLENBQUMsQ0FBQztNQUMxQzJCO0lBQ0YsQ0FBQyxDQUFDLENBQUM7RUFDTCxDQUFDLENBQUM7RUFFRixLQUFLLE1BQU1HLFNBQVMsSUFBSVAsV0FBVyxFQUFFO0lBQ25DRCxVQUFVLENBQUNRLFNBQVMsQ0FBQ0YsSUFBSSxDQUFDLEdBQUdFLFNBQVMsQ0FBQ0gsS0FBSztFQUM5QztFQUNBLE9BQU9MLFVBQVU7QUFDbkI7QUFFQSxlQUFlUyw0QkFBNEJBLENBQ3pDWCxJQUFVLEVBQ1ZDLFdBQW1CLEVBQ25CUCxPQUE0QixFQUNHO0VBQy9CLE1BQU12QyxJQUEwQixHQUFHLEVBQUU7RUFDckMsTUFBTXlELHdCQUF3QixHQUFHLE1BQU1iLDJCQUEyQixDQUFDQyxJQUFJLEVBQUVDLFdBQVcsQ0FBQztFQUVyRixNQUFNWSxnQkFBZ0IsR0FBRyxNQUFNLElBQUFULGlDQUFXLEVBQ3hDSixJQUFJLEVBQ0osa0JBQWtCQyxXQUFXLGtDQUFrQyxFQUMvRCxFQUFFLEVBQ0ZhLEdBQUcsSUFBSTtJQUNMLE9BQVFBLEdBQUcsQ0FBbUIxRCxHQUFHLENBQUMyRCxFQUFFLEtBQUs7TUFDdkN6QixFQUFFLEVBQUV5QixFQUFFLENBQUNDLFlBQVksQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFO01BQy9CNUIsUUFBUSxFQUFFNkIsS0FBSyxDQUFDQyxJQUFJLENBQUNILEVBQUUsQ0FBQ0ksb0JBQW9CLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQy9ELEdBQUcsQ0FBQ2dFLEVBQUUsSUFBS0EsRUFBRSxDQUFpQlgsU0FBUztJQUM3RixDQUFDLENBQUMsQ0FBQztFQUNMLENBQ0YsQ0FBQztFQUVELEtBQUssTUFBTXZCLE1BQU0sSUFBSTJCLGdCQUFnQixFQUFFO0lBQ3JDcEIsb0JBQW9CLENBQUN0QyxJQUFJLEVBQUV5RCx3QkFBd0IsRUFBRTFCLE1BQU0sRUFBRVEsT0FBTyxDQUFDO0VBQ3ZFO0VBQ0EsT0FBT3ZDLElBQUk7QUFDYjtBQUVBLGVBQWVrRSwrQkFBK0JBLENBQUNyQixJQUFVLEVBQUU7RUFDekQsTUFBTXNCLG1CQUFtQixHQUFHLE1BQU0sSUFBQUMsMENBQW9CLEVBQUN2QixJQUFJLEVBQUUsSUFBSXRFLG1CQUFtQixFQUFFLENBQUM7RUFDdkYsSUFBSTRGLG1CQUFtQixFQUFFO0lBQ3ZCLE1BQU1FLFNBQVMsR0FBRyxNQUFNeEIsSUFBSSxDQUFDeUIsS0FBSyxDQUFDLElBQUkvRixtQkFBbUIsRUFBRSxFQUFFZ0csWUFBWSxJQUFJO01BQzVFLE9BQVFBLFlBQVksQ0FBaUJqQixTQUFTO0lBQ2hELENBQUMsQ0FBQztJQUNGLE9BQU9lLFNBQVMsQ0FBQzVDLElBQUksQ0FBQyxDQUFDLEtBQUsxRCxpQ0FBaUM7RUFDL0Q7RUFDQSxPQUFPLEtBQUs7QUFDZDtBQUVBLGVBQWV5RyxhQUFhQSxDQUFDM0IsSUFBVSxFQUFFNEIsU0FBaUIsRUFBRTtFQUMxRCxNQUFNQyxlQUFlLEdBQUcsTUFBTSxJQUFBTiwwQ0FBb0IsRUFBQ3ZCLElBQUksRUFBRXJFLDBCQUEwQixDQUFDO0VBQ3BGLElBQUlrRyxlQUFlLEVBQUU7SUFDbkIsTUFBTSxJQUFBQyxvQ0FBYyxFQUFDOUIsSUFBSSxFQUFFckUsMEJBQTBCLEVBQUVpRyxTQUFTLENBQUM7RUFDbkU7QUFDRjtBQUVBLGVBQWVHLGFBQWFBLENBQUMvQixJQUFVLEVBQUVnQyxTQUFpQixFQUFFO0VBQzFELE1BQU0sSUFBQUYsb0NBQWMsRUFBQzlCLElBQUksRUFBRSw2QkFBNkIsRUFBRSxLQUFLLENBQUM7RUFDaEUsTUFBTSxJQUFBaUMsMkNBQXFCLEVBQUNqQyxJQUFJLEVBQUUsNkJBQTZCLENBQUM7RUFDaEUsTUFBTSxJQUFBa0MsK0JBQVMsRUFBQ2xDLElBQUksRUFBRSwwQkFBMEIsRUFBRWdDLFNBQVMsQ0FBQ0csTUFBTSxDQUFDbEgsV0FBVyxDQUFDLENBQUM7RUFDaEYsTUFBTSxJQUFBbUgsaUNBQVcsRUFBQ3BDLElBQUksRUFBRSx1QkFBdUIsQ0FBQztFQUNoRCxNQUFNLElBQUFxQyw2QkFBaUIsRUFBQ3JDLElBQUksQ0FBQztBQUMvQjtBQUVBLGVBQWVzQyxnQkFBZ0JBLENBQUN0QyxJQUFVLEVBQUU7RUFDMUMsTUFBTXVDLG1CQUFtQixHQUFHLE1BQU12QyxJQUFJLENBQUN5QixLQUFLLENBQUMsZ0RBQWdELEVBQUVlLE1BQU0sSUFBSTtJQUN2RyxPQUFRQSxNQUFNLENBQWlCL0IsU0FBUztFQUMxQyxDQUFDLENBQUM7RUFFRixPQUFPOEIsbUJBQW1CLENBQUM3RixPQUFPLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQztBQUM5QztBQUVBLGVBQWUrRix1QkFBdUJBLENBQUN6QyxJQUFVLEVBQUU7RUFDakQsTUFBTTBDLGtCQUFrQixHQUFHLE1BQU0sSUFBQW5CLDBDQUFvQixFQUFDdkIsSUFBSSxFQUFFLDBCQUEwQixDQUFDO0VBQ3ZGLElBQUkwQyxrQkFBa0IsRUFBRTtJQUN0QixNQUFNLElBQUFOLGlDQUFXLEVBQUNwQyxJQUFJLEVBQUUsMEJBQTBCLENBQUM7RUFDckQ7QUFDRjtBQUVBLGVBQWUyQywyQkFBMkJBLENBQUMzQyxJQUFVLEVBQTBCO0VBQzdFLE1BQU00QyxXQUFXLEdBQUcsTUFBTWpDLDRCQUE0QixDQUNwRFgsSUFBSSxFQUNKeEUsNkJBQTZCLEVBQzdCcUgsaUNBQW1CLENBQUNDLE9BQ3RCLENBQUM7RUFDRCxNQUFNQyxhQUFhLEdBQUcsTUFBTXBDLDRCQUE0QixDQUN0RFgsSUFBSSxFQUNKdkUsK0JBQStCLEVBQy9Cb0gsaUNBQW1CLENBQUNHLFNBQ3RCLENBQUM7RUFDRCxNQUFNN0YsSUFBSSxHQUFHLENBQUMsR0FBR3lGLFdBQVcsRUFBRSxHQUFHRyxhQUFhLENBQUM7RUFDL0MsT0FBTzdGLG1CQUFtQixDQUFDQyxJQUFJLENBQUM7QUFDbEM7QUFFQSxlQUFlOEYsc0JBQXNCQSxDQUFDakQsSUFBVSxFQUEwQjtFQUN4RSxNQUFNa0QsT0FBTyxDQUFDQyxJQUFJLENBQUMsQ0FDakIsSUFBQWxCLDJDQUFxQixFQUFDakMsSUFBSSxFQUFFLElBQUl2RSwrQkFBK0IsRUFBRSxFQUFFLEtBQUssQ0FBQyxFQUN6RSxJQUFBd0csMkNBQXFCLEVBQUNqQyxJQUFJLEVBQUUsSUFBSXRFLG1CQUFtQixFQUFFLEVBQUUsS0FBSyxDQUFDLENBQzlELENBQUM7RUFFRixNQUFNMEgseUJBQXlCLEdBQUcsTUFBTS9CLCtCQUErQixDQUFDckIsSUFBSSxDQUFDO0VBQzdFLElBQUlvRCx5QkFBeUIsRUFBRTtJQUM3QixPQUFPLEVBQUU7RUFDWDtFQUVBLE1BQU1YLHVCQUF1QixDQUFDekMsSUFBSSxDQUFDO0VBQ25DLE9BQU8yQywyQkFBMkIsQ0FBQzNDLElBQUksQ0FBQztBQUMxQztBQUVBLGVBQWVxRCxnQkFBZ0JBLENBQUNyRCxJQUFVLEVBQUVnQyxTQUFpQixFQUFFSixTQUFpQixFQUFnQztFQUM5RyxNQUFNRCxhQUFhLENBQUMzQixJQUFJLEVBQUU0QixTQUFTLENBQUM7RUFDcEMsTUFBTUcsYUFBYSxDQUFDL0IsSUFBSSxFQUFFZ0MsU0FBUyxDQUFDO0VBQ3BDLE1BQU1zQixhQUFhLEdBQUcsTUFBTWhCLGdCQUFnQixDQUFDdEMsSUFBSSxDQUFDO0VBQ2xELE1BQU03QyxJQUFJLEdBQUcsTUFBTThGLHNCQUFzQixDQUFDakQsSUFBSSxDQUFDO0VBQy9DLE9BQU87SUFDTHNELGFBQWE7SUFDYm5HO0VBQ0YsQ0FBQztBQUNIO0FBRUEsZUFBZW9HLGFBQWFBLENBQUN2RCxJQUFVLEVBQUVnQyxTQUFpQixFQUFFO0VBQzFELE1BQU13QixRQUErQixHQUFHLEVBQUU7RUFDMUMsTUFBTUMsWUFBWSxHQUFHLE1BQU0sSUFBQUMsc0NBQWdCLEVBQUMxRCxJQUFJLEVBQUVyRSwwQkFBMEIsQ0FBQztFQUM3RSxLQUFLLE1BQU1nSSxPQUFPLElBQUlGLFlBQVksRUFBRTtJQUNsQyxJQUFJRSxPQUFPLENBQUN2SCxLQUFLLEtBQUssSUFBSSxFQUFFO01BQzFCO01BQ0EsTUFBTXdILFdBQVcsR0FBRyxNQUFNUCxnQkFBZ0IsQ0FBQ3JELElBQUksRUFBRWdDLFNBQVMsRUFBRTJCLE9BQU8sQ0FBQ3ZILEtBQUssQ0FBQztNQUMxRW9ILFFBQVEsQ0FBQzNELElBQUksQ0FBQytELFdBQVcsQ0FBQztJQUM1QjtFQUNGO0VBQ0EsT0FBT0osUUFBUTtBQUNqQjtBQUVBLGVBQWVLLGdCQUFnQkEsQ0FBQzdELElBQVUsRUFBRTtFQUMxQyxPQUFPa0QsT0FBTyxDQUFDQyxJQUFJLENBQUMsQ0FBQyxJQUFBbEIsMkNBQXFCLEVBQUNqQyxJQUFJLEVBQUUsVUFBVSxFQUFFLElBQUksQ0FBQyxFQUFFLElBQUFpQywyQ0FBcUIsRUFBQ2pDLElBQUksRUFBRSxVQUFVLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQztBQUNySDtBQUlBLE1BQU04RCxnQkFBZ0IsU0FBU0MsOENBQXNCLENBQTZCO0VBQ2hGQyxlQUFlQSxDQUFDOUgsV0FBdUMsRUFBRTtJQUN2RCxPQUFPO01BQ0wrSCxRQUFRLEVBQUUsR0FBR2xKLFFBQVEsRUFBRTtNQUN2Qm1KLE1BQU0sRUFBRWpJLGlCQUFpQixDQUFDQyxXQUFXLENBQUM7TUFDdENpSSxvQkFBb0IsRUFBRSxRQUFRO01BQzlCQyxVQUFVLEVBQUUsTUFBQUEsQ0FBQSxLQUFZUCxnQkFBZ0IsQ0FBQyxJQUFJLENBQUM3RCxJQUFJLENBQUM7TUFDbkRxRSxlQUFlLEVBQUV6SSx1QkFBdUIsQ0FBQztJQUMzQyxDQUFDO0VBQ0g7RUFFQSxNQUFNMEksU0FBU0EsQ0FBQSxFQUFHO0lBQ2hCLE1BQU1DLGtCQUFrQixHQUFHLElBQUFqSCxlQUFNLEVBQUMsQ0FBQyxDQUFDa0gsUUFBUSxDQUFDLENBQUMsRUFBRSxPQUFPLENBQUMsQ0FBQ0MsR0FBRyxDQUFDLENBQUMsRUFBRSxLQUFLLENBQUM7SUFDdEUsTUFBTXpDLFNBQVMsR0FBRyxJQUFJLENBQUMwQyxPQUFPLENBQUMxQyxTQUFTLElBQUl1QyxrQkFBa0IsQ0FBQ0ksTUFBTSxDQUFDLENBQUM7SUFDdkUsTUFBTUMsV0FBVyxHQUFHdEgsZUFBTSxDQUFDdUgsR0FBRyxDQUFDTixrQkFBa0IsRUFBRSxJQUFBakgsZUFBTSxFQUFDMEUsU0FBUyxDQUFDLENBQUM7SUFFckUsTUFBTSxJQUFJLENBQUM4QyxVQUFVLENBQUM5SixnQkFBZ0IsQ0FBQztJQUV2QyxNQUFNd0ksUUFBUSxHQUFHLE1BQU1ELGFBQWEsQ0FBQyxJQUFJLENBQUN2RCxJQUFJLEVBQUU0RSxXQUFXLENBQUM7SUFFNUQsT0FBTztNQUNMRyxPQUFPLEVBQUUsSUFBSTtNQUNidkI7SUFDRixDQUFDO0VBQ0g7QUFDRjtBQUFDLElBQUF3QixRQUFBLEdBQUFDLE9BQUEsQ0FBQW5LLE9BQUEsR0FFY2dKLGdCQUFnQiIsImlnbm9yZUxpc3QiOltdfQ==
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
var _unionBank = _interopRequireDefault(require("./union-bank"));
|
|
4
|
+
var _testsUtils = require("../tests/tests-utils");
|
|
5
|
+
var _definitions = require("../definitions");
|
|
6
|
+
var _baseScraperWithBrowser = require("./base-scraper-with-browser");
|
|
7
|
+
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
|
|
8
|
+
const COMPANY_ID = 'union'; // TODO this property should be hard-coded in the provider
|
|
9
|
+
const testsConfig = (0, _testsUtils.getTestsConfig)();
|
|
10
|
+
describe('Union', () => {
|
|
11
|
+
beforeAll(() => {
|
|
12
|
+
(0, _testsUtils.extendAsyncTimeout)(); // The default timeout is 5 seconds per async test, this function extends the timeout value
|
|
13
|
+
});
|
|
14
|
+
test('should expose login fields in scrapers constant', () => {
|
|
15
|
+
expect(_definitions.SCRAPERS.union).toBeDefined();
|
|
16
|
+
expect(_definitions.SCRAPERS.union.loginFields).toContain('username');
|
|
17
|
+
expect(_definitions.SCRAPERS.union.loginFields).toContain('password');
|
|
18
|
+
});
|
|
19
|
+
(0, _testsUtils.maybeTestCompanyAPI)(COMPANY_ID, config => config.companyAPI.invalidPassword)('should fail on invalid user/password"', async () => {
|
|
20
|
+
const options = {
|
|
21
|
+
...testsConfig.options,
|
|
22
|
+
companyId: COMPANY_ID
|
|
23
|
+
};
|
|
24
|
+
const scraper = new _unionBank.default(options);
|
|
25
|
+
const result = await scraper.scrape({
|
|
26
|
+
username: 'e10s12',
|
|
27
|
+
password: '3f3ss3d'
|
|
28
|
+
});
|
|
29
|
+
expect(result).toBeDefined();
|
|
30
|
+
expect(result.success).toBeFalsy();
|
|
31
|
+
expect(result.errorType).toBe(_baseScraperWithBrowser.LoginResults.InvalidPassword);
|
|
32
|
+
});
|
|
33
|
+
(0, _testsUtils.maybeTestCompanyAPI)(COMPANY_ID)('should scrape transactions"', async () => {
|
|
34
|
+
const options = {
|
|
35
|
+
...testsConfig.options,
|
|
36
|
+
companyId: COMPANY_ID
|
|
37
|
+
};
|
|
38
|
+
const scraper = new _unionBank.default(options);
|
|
39
|
+
const result = await scraper.scrape(testsConfig.credentials.union);
|
|
40
|
+
expect(result).toBeDefined();
|
|
41
|
+
const error = `${result.errorType || ''} ${result.errorMessage || ''}`.trim();
|
|
42
|
+
expect(error).toBe('');
|
|
43
|
+
expect(result.success).toBeTruthy();
|
|
44
|
+
(0, _testsUtils.exportTransactions)(COMPANY_ID, result.accounts || []);
|
|
45
|
+
});
|
|
46
|
+
});
|
|
47
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfdW5pb25CYW5rIiwiX2ludGVyb3BSZXF1aXJlRGVmYXVsdCIsInJlcXVpcmUiLCJfdGVzdHNVdGlscyIsIl9kZWZpbml0aW9ucyIsIl9iYXNlU2NyYXBlcldpdGhCcm93c2VyIiwiZSIsIl9fZXNNb2R1bGUiLCJkZWZhdWx0IiwiQ09NUEFOWV9JRCIsInRlc3RzQ29uZmlnIiwiZ2V0VGVzdHNDb25maWciLCJkZXNjcmliZSIsImJlZm9yZUFsbCIsImV4dGVuZEFzeW5jVGltZW91dCIsInRlc3QiLCJleHBlY3QiLCJTQ1JBUEVSUyIsInVuaW9uIiwidG9CZURlZmluZWQiLCJsb2dpbkZpZWxkcyIsInRvQ29udGFpbiIsIm1heWJlVGVzdENvbXBhbnlBUEkiLCJjb25maWciLCJjb21wYW55QVBJIiwiaW52YWxpZFBhc3N3b3JkIiwib3B0aW9ucyIsImNvbXBhbnlJZCIsInNjcmFwZXIiLCJVbmlvbkJhbmtTY3JhcGVyIiwicmVzdWx0Iiwic2NyYXBlIiwidXNlcm5hbWUiLCJwYXNzd29yZCIsInN1Y2Nlc3MiLCJ0b0JlRmFsc3kiLCJlcnJvclR5cGUiLCJ0b0JlIiwiTG9naW5SZXN1bHRzIiwiSW52YWxpZFBhc3N3b3JkIiwiY3JlZGVudGlhbHMiLCJlcnJvciIsImVycm9yTWVzc2FnZSIsInRyaW0iLCJ0b0JlVHJ1dGh5IiwiZXhwb3J0VHJhbnNhY3Rpb25zIiwiYWNjb3VudHMiXSwic291cmNlcyI6WyIuLi8uLi9zcmMvc2NyYXBlcnMvdW5pb24tYmFuay50ZXN0LnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBVbmlvbkJhbmtTY3JhcGVyIGZyb20gJy4vdW5pb24tYmFuayc7XG5pbXBvcnQgeyBtYXliZVRlc3RDb21wYW55QVBJLCBleHRlbmRBc3luY1RpbWVvdXQsIGdldFRlc3RzQ29uZmlnLCBleHBvcnRUcmFuc2FjdGlvbnMgfSBmcm9tICcuLi90ZXN0cy90ZXN0cy11dGlscyc7XG5pbXBvcnQgeyBTQ1JBUEVSUyB9IGZyb20gJy4uL2RlZmluaXRpb25zJztcbmltcG9ydCB7IExvZ2luUmVzdWx0cyB9IGZyb20gJy4vYmFzZS1zY3JhcGVyLXdpdGgtYnJvd3Nlcic7XG5cbmNvbnN0IENPTVBBTllfSUQgPSAndW5pb24nOyAvLyBUT0RPIHRoaXMgcHJvcGVydHkgc2hvdWxkIGJlIGhhcmQtY29kZWQgaW4gdGhlIHByb3ZpZGVyXG5jb25zdCB0ZXN0c0NvbmZpZyA9IGdldFRlc3RzQ29uZmlnKCk7XG5cbmRlc2NyaWJlKCdVbmlvbicsICgpID0+IHtcbiAgYmVmb3JlQWxsKCgpID0+IHtcbiAgICBleHRlbmRBc3luY1RpbWVvdXQoKTsgLy8gVGhlIGRlZmF1bHQgdGltZW91dCBpcyA1IHNlY29uZHMgcGVyIGFzeW5jIHRlc3QsIHRoaXMgZnVuY3Rpb24gZXh0ZW5kcyB0aGUgdGltZW91dCB2YWx1ZVxuICB9KTtcblxuICB0ZXN0KCdzaG91bGQgZXhwb3NlIGxvZ2luIGZpZWxkcyBpbiBzY3JhcGVycyBjb25zdGFudCcsICgpID0+IHtcbiAgICBleHBlY3QoU0NSQVBFUlMudW5pb24pLnRvQmVEZWZpbmVkKCk7XG4gICAgZXhwZWN0KFNDUkFQRVJTLnVuaW9uLmxvZ2luRmllbGRzKS50b0NvbnRhaW4oJ3VzZXJuYW1lJyk7XG4gICAgZXhwZWN0KFNDUkFQRVJTLnVuaW9uLmxvZ2luRmllbGRzKS50b0NvbnRhaW4oJ3Bhc3N3b3JkJyk7XG4gIH0pO1xuXG4gIG1heWJlVGVzdENvbXBhbnlBUEkoQ09NUEFOWV9JRCwgY29uZmlnID0+IGNvbmZpZy5jb21wYW55QVBJLmludmFsaWRQYXNzd29yZCkoXG4gICAgJ3Nob3VsZCBmYWlsIG9uIGludmFsaWQgdXNlci9wYXNzd29yZFwiJyxcbiAgICBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBvcHRpb25zID0ge1xuICAgICAgICAuLi50ZXN0c0NvbmZpZy5vcHRpb25zLFxuICAgICAgICBjb21wYW55SWQ6IENPTVBBTllfSUQsXG4gICAgICB9O1xuXG4gICAgICBjb25zdCBzY3JhcGVyID0gbmV3IFVuaW9uQmFua1NjcmFwZXIob3B0aW9ucyk7XG5cbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHNjcmFwZXIuc2NyYXBlKHsgdXNlcm5hbWU6ICdlMTBzMTInLCBwYXNzd29yZDogJzNmM3NzM2QnIH0pO1xuXG4gICAgICBleHBlY3QocmVzdWx0KS50b0JlRGVmaW5lZCgpO1xuICAgICAgZXhwZWN0KHJlc3VsdC5zdWNjZXNzKS50b0JlRmFsc3koKTtcbiAgICAgIGV4cGVjdChyZXN1bHQuZXJyb3JUeXBlKS50b0JlKExvZ2luUmVzdWx0cy5JbnZhbGlkUGFzc3dvcmQpO1xuICAgIH0sXG4gICk7XG5cbiAgbWF5YmVUZXN0Q29tcGFueUFQSShDT01QQU5ZX0lEKSgnc2hvdWxkIHNjcmFwZSB0cmFuc2FjdGlvbnNcIicsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBvcHRpb25zID0ge1xuICAgICAgLi4udGVzdHNDb25maWcub3B0aW9ucyxcbiAgICAgIGNvbXBhbnlJZDogQ09NUEFOWV9JRCxcbiAgICB9O1xuXG4gICAgY29uc3Qgc2NyYXBlciA9IG5ldyBVbmlvbkJhbmtTY3JhcGVyKG9wdGlvbnMpO1xuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHNjcmFwZXIuc2NyYXBlKHRlc3RzQ29uZmlnLmNyZWRlbnRpYWxzLnVuaW9uKTtcbiAgICBleHBlY3QocmVzdWx0KS50b0JlRGVmaW5lZCgpO1xuICAgIGNvbnN0IGVycm9yID0gYCR7cmVzdWx0LmVycm9yVHlwZSB8fCAnJ30gJHtyZXN1bHQuZXJyb3JNZXNzYWdlIHx8ICcnfWAudHJpbSgpO1xuICAgIGV4cGVjdChlcnJvcikudG9CZSgnJyk7XG4gICAgZXhwZWN0KHJlc3VsdC5zdWNjZXNzKS50b0JlVHJ1dGh5KCk7XG5cbiAgICBleHBvcnRUcmFuc2FjdGlvbnMoQ09NUEFOWV9JRCwgcmVzdWx0LmFjY291bnRzIHx8IFtdKTtcbiAgfSk7XG59KTtcbiJdLCJtYXBwaW5ncyI6Ijs7QUFBQSxJQUFBQSxVQUFBLEdBQUFDLHNCQUFBLENBQUFDLE9B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
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { BaseScraperWithBrowser, type LoginOptions } from './base-scraper-with-browser';
|
|
2
|
+
import { type ScraperScrapingResult } from './interface';
|
|
3
|
+
type ScraperSpecificCredentials = {
|
|
4
|
+
username: string;
|
|
5
|
+
password: string;
|
|
6
|
+
};
|
|
7
|
+
declare class VisaCalScraper extends BaseScraperWithBrowser<ScraperSpecificCredentials> {
|
|
8
|
+
private authorization;
|
|
9
|
+
private authRequestPromise;
|
|
10
|
+
openLoginPopup: () => Promise<never>;
|
|
11
|
+
getCards(): Promise<{
|
|
12
|
+
cardUniqueId: string;
|
|
13
|
+
last4Digits: string;
|
|
14
|
+
}[]>;
|
|
15
|
+
getAuthorizationHeader(): Promise<string>;
|
|
16
|
+
getXSiteId(): Promise<string>;
|
|
17
|
+
getLoginOptions(credentials: ScraperSpecificCredentials): LoginOptions;
|
|
18
|
+
fetchData(): Promise<ScraperScrapingResult>;
|
|
19
|
+
}
|
|
20
|
+
export default VisaCalScraper;
|