israeli-bank-scrapers 5.2.3 → 5.4.0
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/README.md +50 -2
- package/lib/scrapers/base-beinleumi-group.js +5 -2
- package/lib/scrapers/base-isracard-amex.js +9 -9
- package/lib/scrapers/base-scraper-with-browser.d.ts +3 -2
- package/lib/scrapers/base-scraper-with-browser.js +60 -47
- package/lib/scrapers/interface.d.ts +41 -23
- package/lib/scrapers/interface.js +1 -1
- package/lib/scrapers/max.js +3 -2
- package/lib/scrapers/otsar-hahayal.d.ts +5 -30
- package/lib/scrapers/otsar-hahayal.js +11 -183
- package/package.json +1 -1
|
@@ -1,32 +1,7 @@
|
|
|
1
|
-
import
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
};
|
|
7
|
-
declare class OtsarHahayalScraper extends BaseScraperWithBrowser<ScraperSpecificCredentials> {
|
|
8
|
-
getLoginOptions(credentials: ScraperSpecificCredentials): {
|
|
9
|
-
loginUrl: string;
|
|
10
|
-
fields: {
|
|
11
|
-
selector: string;
|
|
12
|
-
value: string;
|
|
13
|
-
}[];
|
|
14
|
-
submitButtonSelector: () => Promise<void>;
|
|
15
|
-
postAction: () => Promise<void>;
|
|
16
|
-
possibleResults: PossibleLoginResults;
|
|
17
|
-
};
|
|
18
|
-
fetchData(): Promise<{
|
|
19
|
-
success: boolean;
|
|
20
|
-
accounts: {
|
|
21
|
-
accountNumber: string;
|
|
22
|
-
summary: {
|
|
23
|
-
balance: number;
|
|
24
|
-
creditLimit: number;
|
|
25
|
-
creditUtilization: number;
|
|
26
|
-
balanceCurrency: string;
|
|
27
|
-
};
|
|
28
|
-
txns: Transaction[];
|
|
29
|
-
}[];
|
|
30
|
-
}>;
|
|
1
|
+
import BeinleumiGroupBaseScraper from './base-beinleumi-group';
|
|
2
|
+
declare class OtsarHahayalScraper extends BeinleumiGroupBaseScraper {
|
|
3
|
+
BASE_URL: string;
|
|
4
|
+
LOGIN_URL: string;
|
|
5
|
+
TRANSACTIONS_URL: string;
|
|
31
6
|
}
|
|
32
7
|
export default OtsarHahayalScraper;
|
|
@@ -4,191 +4,19 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
4
4
|
value: true
|
|
5
5
|
});
|
|
6
6
|
exports.default = void 0;
|
|
7
|
-
require("core-js/modules/es.symbol.description.js");
|
|
8
7
|
require("core-js/modules/es.array.iterator.js");
|
|
9
|
-
require("
|
|
10
|
-
require("core-js/modules/es.regexp.constructor.js");
|
|
11
|
-
require("core-js/modules/es.regexp.exec.js");
|
|
12
|
-
require("core-js/modules/es.string.replace.js");
|
|
13
|
-
var _moment = _interopRequireDefault(require("moment"));
|
|
14
|
-
var _constants = require("../constants");
|
|
15
|
-
var _elementsInteractions = require("../helpers/elements-interactions");
|
|
16
|
-
var _navigation = require("../helpers/navigation");
|
|
17
|
-
var _waiting = require("../helpers/waiting");
|
|
18
|
-
var _transactions = require("../transactions");
|
|
19
|
-
var _baseScraperWithBrowser = require("./base-scraper-with-browser");
|
|
8
|
+
var _baseBeinleumiGroup = _interopRequireDefault(require("./base-beinleumi-group"));
|
|
20
9
|
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
return urls;
|
|
31
|
-
}
|
|
32
|
-
function getTransactionsUrl() {
|
|
33
|
-
return `${BASE_URL}/wps/myportal/FibiMenu/Online/OnAccountMngment/OnBalanceTrans/PrivateAccountFlow`;
|
|
34
|
-
}
|
|
35
|
-
function createLoginFields(credentials) {
|
|
36
|
-
return [{
|
|
37
|
-
selector: '#username',
|
|
38
|
-
value: credentials.username
|
|
39
|
-
}, {
|
|
40
|
-
selector: '#password',
|
|
41
|
-
value: credentials.password
|
|
42
|
-
}];
|
|
43
|
-
}
|
|
44
|
-
function getAmountData(amountStr, hasCurrency = false) {
|
|
45
|
-
const amountStrCln = amountStr.replace(',', '');
|
|
46
|
-
let currency = null;
|
|
47
|
-
let amount = null;
|
|
48
|
-
if (!hasCurrency) {
|
|
49
|
-
amount = parseFloat(amountStrCln);
|
|
50
|
-
currency = _constants.SHEKEL_CURRENCY;
|
|
51
|
-
} else if (amountStrCln.includes(_constants.SHEKEL_CURRENCY_SYMBOL)) {
|
|
52
|
-
amount = parseFloat(amountStrCln.replace(_constants.SHEKEL_CURRENCY_SYMBOL, ''));
|
|
53
|
-
currency = _constants.SHEKEL_CURRENCY;
|
|
54
|
-
} else {
|
|
55
|
-
const parts = amountStrCln.split(' ');
|
|
56
|
-
amount = parseFloat(parts[0]);
|
|
57
|
-
[, currency] = parts;
|
|
58
|
-
}
|
|
59
|
-
return {
|
|
60
|
-
amount,
|
|
61
|
-
currency
|
|
62
|
-
};
|
|
63
|
-
}
|
|
64
|
-
function convertTransactions(txns) {
|
|
65
|
-
return txns.map(txn => {
|
|
66
|
-
const dateFormat = txn.date.length === 8 ? DATE_FORMAT : txn.date.length === 10 ? LONG_DATE_FORMAT : null;
|
|
67
|
-
if (!dateFormat) {
|
|
68
|
-
throw new Error('invalid date format');
|
|
69
|
-
}
|
|
70
|
-
const txnDate = (0, _moment.default)(txn.date, dateFormat).toISOString();
|
|
71
|
-
const credit = getAmountData(txn.credit || '').amount;
|
|
72
|
-
const debit = getAmountData(txn.debit || '').amount;
|
|
73
|
-
const amount = (Number.isNaN(credit) ? 0 : credit) - (Number.isNaN(debit) ? 0 : debit);
|
|
74
|
-
const result = {
|
|
75
|
-
type: _transactions.TransactionTypes.Normal,
|
|
76
|
-
status: _transactions.TransactionStatuses.Completed,
|
|
77
|
-
identifier: txn.reference ? parseInt(txn.reference, 10) : undefined,
|
|
78
|
-
date: txnDate,
|
|
79
|
-
processedDate: txnDate,
|
|
80
|
-
originalAmount: amount,
|
|
81
|
-
originalCurrency: _constants.SHEKEL_CURRENCY,
|
|
82
|
-
chargedAmount: amount,
|
|
83
|
-
description: txn.description || '',
|
|
84
|
-
memo: ''
|
|
85
|
-
};
|
|
86
|
-
return result;
|
|
87
|
-
});
|
|
88
|
-
}
|
|
89
|
-
async function parseTransactionPage(page) {
|
|
90
|
-
const tdsValues = await (0, _elementsInteractions.pageEvalAll)(page, '#dataTable077 tbody tr', [], trs => {
|
|
91
|
-
return trs.map(el => ({
|
|
92
|
-
date: el.querySelector('.date').innerText,
|
|
93
|
-
// reference and description have vice-versa class name
|
|
94
|
-
description: el.querySelector('.reference').innerText,
|
|
95
|
-
reference: el.querySelector('.details').innerText,
|
|
96
|
-
credit: el.querySelector('.credit').innerText,
|
|
97
|
-
debit: el.querySelector('.debit').innerText,
|
|
98
|
-
balance: el.querySelector('.balance').innerText
|
|
99
|
-
}));
|
|
100
|
-
});
|
|
101
|
-
return tdsValues;
|
|
102
|
-
}
|
|
103
|
-
async function getAccountSummary(page) {
|
|
104
|
-
const balanceElm = await page.$('.current_balance');
|
|
105
|
-
const balanceInnerTextElm = await balanceElm.getProperty('innerText');
|
|
106
|
-
const balanceText = await balanceInnerTextElm.jsonValue();
|
|
107
|
-
const balanceValue = getAmountData(balanceText, true);
|
|
108
|
-
// TODO: Find the credit field in bank website (could see it in my account)
|
|
109
|
-
return {
|
|
110
|
-
balance: Number.isNaN(balanceValue.amount) ? 0 : balanceValue.amount,
|
|
111
|
-
creditLimit: 0.0,
|
|
112
|
-
creditUtilization: 0.0,
|
|
113
|
-
balanceCurrency: balanceValue.currency
|
|
114
|
-
};
|
|
115
|
-
}
|
|
116
|
-
async function fetchTransactionsForAccount(page, startDate) {
|
|
117
|
-
const summary = await getAccountSummary(page);
|
|
118
|
-
await (0, _elementsInteractions.waitUntilElementFound)(page, 'input#fromDate');
|
|
119
|
-
// Get account number
|
|
120
|
-
const branchNum = await page.$eval('.branch_num', span => {
|
|
121
|
-
return span.innerText;
|
|
122
|
-
});
|
|
123
|
-
const accountNmbr = await page.$eval('.acc_num', span => {
|
|
124
|
-
return span.innerText;
|
|
125
|
-
});
|
|
126
|
-
const accountNumber = `14-${branchNum}-${accountNmbr}`;
|
|
127
|
-
// Search for relavant transaction from startDate
|
|
128
|
-
await (0, _elementsInteractions.clickButton)(page, '#tabHeader4');
|
|
129
|
-
await (0, _elementsInteractions.fillInput)(page, 'input#fromDate', startDate.format('DD/MM/YYYY'));
|
|
130
|
-
await (0, _elementsInteractions.clickButton)(page, '#fibi_tab_dates .fibi_btn:nth-child(2)');
|
|
131
|
-
await (0, _navigation.waitForNavigation)(page);
|
|
132
|
-
await (0, _elementsInteractions.waitUntilElementFound)(page, 'table#dataTable077, #NO_DATA077');
|
|
133
|
-
let hasNextPage = true;
|
|
134
|
-
let txns = [];
|
|
135
|
-
const noTransactionElm = await page.$('#NO_DATA077');
|
|
136
|
-
if (noTransactionElm == null) {
|
|
137
|
-
// Scape transactions (this maybe spanned on multiple pages)
|
|
138
|
-
while (hasNextPage) {
|
|
139
|
-
const pageTxns = await parseTransactionPage(page);
|
|
140
|
-
txns = txns.concat(pageTxns);
|
|
141
|
-
const button = await page.$('#Npage');
|
|
142
|
-
hasNextPage = false;
|
|
143
|
-
if (button != null) {
|
|
144
|
-
hasNextPage = true;
|
|
145
|
-
}
|
|
146
|
-
if (hasNextPage) {
|
|
147
|
-
await (0, _elementsInteractions.clickButton)(page, '#Npage');
|
|
148
|
-
await (0, _navigation.waitForNavigation)(page);
|
|
149
|
-
await (0, _elementsInteractions.waitUntilElementFound)(page, 'table#dataTable077');
|
|
150
|
-
}
|
|
151
|
-
}
|
|
152
|
-
}
|
|
153
|
-
return {
|
|
154
|
-
accountNumber,
|
|
155
|
-
summary,
|
|
156
|
-
txns: convertTransactions(txns.slice(1)) // Remove first line which is "opening balance"
|
|
157
|
-
};
|
|
158
|
-
}
|
|
159
|
-
async function fetchTransactions(page, startDate) {
|
|
160
|
-
// TODO need to extend to support multiple accounts and foreign accounts
|
|
161
|
-
return [await fetchTransactionsForAccount(page, startDate)];
|
|
162
|
-
}
|
|
163
|
-
async function waitForPostLogin(page) {
|
|
164
|
-
// TODO check for condition to provide new password
|
|
165
|
-
return Promise.race([(0, _elementsInteractions.waitUntilElementFound)(page, 'div.lotusFrame', true), (0, _elementsInteractions.waitUntilElementFound)(page, '#validationMsg')]);
|
|
166
|
-
}
|
|
167
|
-
class OtsarHahayalScraper extends _baseScraperWithBrowser.BaseScraperWithBrowser {
|
|
168
|
-
getLoginOptions(credentials) {
|
|
169
|
-
return {
|
|
170
|
-
loginUrl: `${BASE_URL}/MatafLoginService/MatafLoginServlet?bankId=OTSARPRTAL&site=Private&KODSAFA=HE`,
|
|
171
|
-
fields: createLoginFields(credentials),
|
|
172
|
-
submitButtonSelector: async () => {
|
|
173
|
-
await (0, _waiting.sleep)(1000);
|
|
174
|
-
await (0, _elementsInteractions.clickButton)(this.page, '#continueBtn');
|
|
175
|
-
},
|
|
176
|
-
postAction: async () => waitForPostLogin(this.page),
|
|
177
|
-
possibleResults: getPossibleLoginResults(this.page)
|
|
178
|
-
};
|
|
179
|
-
}
|
|
180
|
-
async fetchData() {
|
|
181
|
-
const defaultStartMoment = (0, _moment.default)().subtract(1, 'years').add(1, 'day');
|
|
182
|
-
const startDate = this.options.startDate || defaultStartMoment.toDate();
|
|
183
|
-
const startMoment = _moment.default.max(defaultStartMoment, (0, _moment.default)(startDate));
|
|
184
|
-
const url = getTransactionsUrl();
|
|
185
|
-
await this.navigateTo(url);
|
|
186
|
-
const accounts = await fetchTransactions(this.page, startMoment);
|
|
187
|
-
return {
|
|
188
|
-
success: true,
|
|
189
|
-
accounts
|
|
190
|
-
};
|
|
10
|
+
function _defineProperty(e, r, t) { return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; }
|
|
11
|
+
function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == typeof i ? i : i + ""; }
|
|
12
|
+
function _toPrimitive(t, r) { if ("object" != typeof t || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != typeof i) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); }
|
|
13
|
+
class OtsarHahayalScraper extends _baseBeinleumiGroup.default {
|
|
14
|
+
constructor(...args) {
|
|
15
|
+
super(...args);
|
|
16
|
+
_defineProperty(this, "BASE_URL", 'https://online.bankotsar.co.il');
|
|
17
|
+
_defineProperty(this, "LOGIN_URL", `${this.BASE_URL}/MatafLoginService/MatafLoginServlet?bankId=OTSARPRTAL&site=Private&KODSAFA=HE`);
|
|
18
|
+
_defineProperty(this, "TRANSACTIONS_URL", `${this.BASE_URL}/wps/myportal/FibiMenu/Online/OnAccountMngment/OnBalanceTrans/PrivateAccountFlow`);
|
|
191
19
|
}
|
|
192
20
|
}
|
|
193
21
|
var _default = exports.default = OtsarHahayalScraper;
|
|
194
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfbW9tZW50IiwiX2ludGVyb3BSZXF1aXJlRGVmYXVsdCIsInJlcXVpcmUiLCJfY29uc3RhbnRzIiwiX2VsZW1lbnRzSW50ZXJhY3Rpb25zIiwiX25hdmlnYXRpb24iLCJfd2FpdGluZyIsIl90cmFuc2FjdGlvbnMiLCJfYmFzZVNjcmFwZXJXaXRoQnJvd3NlciIsImUiLCJfX2VzTW9kdWxlIiwiZGVmYXVsdCIsIkJBU0VfVVJMIiwiTE9OR19EQVRFX0ZPUk1BVCIsIkRBVEVfRk9STUFUIiwiZ2V0UG9zc2libGVMb2dpblJlc3VsdHMiLCJwYWdlIiwidXJscyIsIkxvZ2luUmVzdWx0cyIsIlN1Y2Nlc3MiLCJSZWdFeHAiLCJyZXBsYWNlIiwiSW52YWxpZFBhc3N3b3JkIiwiZWxlbWVudFByZXNlbnRPblBhZ2UiLCJnZXRUcmFuc2FjdGlvbnNVcmwiLCJjcmVhdGVMb2dpbkZpZWxkcyIsImNyZWRlbnRpYWxzIiwic2VsZWN0b3IiLCJ2YWx1ZSIsInVzZXJuYW1lIiwicGFzc3dvcmQiLCJnZXRBbW91bnREYXRhIiwiYW1vdW50U3RyIiwiaGFzQ3VycmVuY3kiLCJhbW91bnRTdHJDbG4iLCJjdXJyZW5jeSIsImFtb3VudCIsInBhcnNlRmxvYXQiLCJTSEVLRUxfQ1VSUkVOQ1kiLCJpbmNsdWRlcyIsIlNIRUtFTF9DVVJSRU5DWV9TWU1CT0wiLCJwYXJ0cyIsInNwbGl0IiwiY29udmVydFRyYW5zYWN0aW9ucyIsInR4bnMiLCJtYXAiLCJ0eG4iLCJkYXRlRm9ybWF0IiwiZGF0ZSIsImxlbmd0aCIsIkVycm9yIiwidHhuRGF0ZSIsIm1vbWVudCIsInRvSVNPU3RyaW5nIiwiY3JlZGl0IiwiZGViaXQiLCJOdW1iZXIiLCJpc05hTiIsInJlc3VsdCIsInR5cGUiLCJUcmFuc2FjdGlvblR5cGVzIiwiTm9ybWFsIiwic3RhdHVzIiwiVHJhbnNhY3Rpb25TdGF0dXNlcyIsIkNvbXBsZXRlZCIsImlkZW50aWZpZXIiLCJyZWZlcmVuY2UiLCJwYXJzZUludCIsInVuZGVmaW5lZCIsInByb2Nlc3NlZERhdGUiLCJvcmlnaW5hbEFtb3VudCIsIm9yaWdpbmFsQ3VycmVuY3kiLCJjaGFyZ2VkQW1vdW50IiwiZGVzY3JpcHRpb24iLCJtZW1vIiwicGFyc2VUcmFuc2FjdGlvblBhZ2UiLCJ0ZHNWYWx1ZXMiLCJwYWdlRXZhbEFsbCIsInRycyIsImVsIiwicXVlcnlTZWxlY3RvciIsImlubmVyVGV4dCIsImJhbGFuY2UiLCJnZXRBY2NvdW50U3VtbWFyeSIsImJhbGFuY2VFbG0iLCIkIiwiYmFsYW5jZUlubmVyVGV4dEVsbSIsImdldFByb3BlcnR5IiwiYmFsYW5jZVRleHQiLCJqc29uVmFsdWUiLCJiYWxhbmNlVmFsdWUiLCJjcmVkaXRMaW1pdCIsImNyZWRpdFV0aWxpemF0aW9uIiwiYmFsYW5jZUN1cnJlbmN5IiwiZmV0Y2hUcmFuc2FjdGlvbnNGb3JBY2NvdW50Iiwic3RhcnREYXRlIiwic3VtbWFyeSIsIndhaXRVbnRpbEVsZW1lbnRGb3VuZCIsImJyYW5jaE51bSIsIiRldmFsIiwic3BhbiIsImFjY291bnRObWJyIiwiYWNjb3VudE51bWJlciIsImNsaWNrQnV0dG9uIiwiZmlsbElucHV0IiwiZm9ybWF0Iiwid2FpdEZvck5hdmlnYXRpb24iLCJoYXNOZXh0UGFnZSIsIm5vVHJhbnNhY3Rpb25FbG0iLCJwYWdlVHhucyIsImNvbmNhdCIsImJ1dHRvbiIsInNsaWNlIiwiZmV0Y2hUcmFuc2FjdGlvbnMiLCJ3YWl0Rm9yUG9zdExvZ2luIiwiUHJvbWlzZSIsInJhY2UiLCJPdHNhckhhaGF5YWxTY3JhcGVyIiwiQmFzZVNjcmFwZXJXaXRoQnJvd3NlciIsImdldExvZ2luT3B0aW9ucyIsImxvZ2luVXJsIiwiZmllbGRzIiwic3VibWl0QnV0dG9uU2VsZWN0b3IiLCJzbGVlcCIsInBvc3RBY3Rpb24iLCJwb3NzaWJsZVJlc3VsdHMiLCJmZXRjaERhdGEiLCJkZWZhdWx0U3RhcnRNb21lbnQiLCJzdWJ0cmFjdCIsImFkZCIsIm9wdGlvbnMiLCJ0b0RhdGUiLCJzdGFydE1vbWVudCIsIm1heCIsInVybCIsIm5hdmlnYXRlVG8iLCJhY2NvdW50cyIsInN1Y2Nlc3MiLCJfZGVmYXVsdCIsImV4cG9ydHMiXSwic291cmNlcyI6WyIuLi8uLi9zcmMvc2NyYXBlcnMvb3RzYXItaGFoYXlhbC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgbW9tZW50LCB7IHR5cGUgTW9tZW50IH0gZnJvbSAnbW9tZW50JztcbmltcG9ydCB7IHR5cGUgUGFnZSB9IGZyb20gJ3B1cHBldGVlcic7XG5pbXBvcnQgeyBTSEVLRUxfQ1VSUkVOQ1ksIFNIRUtFTF9DVVJSRU5DWV9TWU1CT0wgfSBmcm9tICcuLi9jb25zdGFudHMnO1xuaW1wb3J0IHtcbiAgY2xpY2tCdXR0b24sXG4gIGVsZW1lbnRQcmVzZW50T25QYWdlLFxuICBmaWxsSW5wdXQsXG4gIHBhZ2VFdmFsQWxsLFxuICB3YWl0VW50aWxFbGVtZW50Rm91bmQsXG59IGZyb20gJy4uL2hlbHBlcnMvZWxlbWVudHMtaW50ZXJhY3Rpb25zJztcbmltcG9ydCB7IHdhaXRGb3JOYXZpZ2F0aW9uIH0gZnJvbSAnLi4vaGVscGVycy9uYXZpZ2F0aW9uJztcbmltcG9ydCB7IHNsZWVwIH0gZnJvbSAnLi4vaGVscGVycy93YWl0aW5nJztcbmltcG9ydCB7IFRyYW5zYWN0aW9uU3RhdHVzZXMsIFRyYW5zYWN0aW9uVHlwZXMsIHR5cGUgVHJhbnNhY3Rpb24gfSBmcm9tICcuLi90cmFuc2FjdGlvbnMnO1xuaW1wb3J0IHsgQmFzZVNjcmFwZXJXaXRoQnJvd3NlciwgTG9naW5SZXN1bHRzLCB0eXBlIFBvc3NpYmxlTG9naW5SZXN1bHRzIH0gZnJvbSAnLi9iYXNlLXNjcmFwZXItd2l0aC1icm93c2VyJztcblxuY29uc3QgQkFTRV9VUkwgPSAnaHR0cHM6Ly9vbmxpbmUuYmFua290c2FyLmNvLmlsJztcbmNvbnN0IExPTkdfREFURV9GT1JNQVQgPSAnREQvTU0vWVlZWSc7XG5jb25zdCBEQVRFX0ZPUk1BVCA9ICdERC9NTS9ZWSc7XG5cbmludGVyZmFjZSBTY3JhcGVkVHJhbnNhY3Rpb24ge1xuICBiYWxhbmNlPzogc3RyaW5nO1xuICBkZWJpdD86IHN0cmluZztcbiAgY3JlZGl0Pzogc3RyaW5nO1xuICBtZW1vPzogc3RyaW5nO1xuICBzdGF0dXM/OiBzdHJpbmc7XG4gIHJlZmVyZW5jZT86IHN0cmluZztcbiAgZGVzY3JpcHRpb24/OiBzdHJpbmc7XG4gIGRhdGU6IHN0cmluZztcbn1cblxuZnVuY3Rpb24gZ2V0UG9zc2libGVMb2dpblJlc3VsdHMocGFnZTogUGFnZSkge1xuICBjb25zdCB1cmxzOiBQb3NzaWJsZUxvZ2luUmVzdWx0cyA9IHt9O1xuICB1cmxzW0xvZ2luUmVzdWx0cy5TdWNjZXNzXSA9IFtuZXcgUmVnRXhwKGBeJHtCQVNFX1VSTC5yZXBsYWNlKCcuJywgJ1xcXFwuJyl9L3dwcy9teXBvcnRhbC9GaWJpTWVudS9PbmxpbmVgKV07XG4gIHVybHNbTG9naW5SZXN1bHRzLkludmFsaWRQYXNzd29yZF0gPSBbKCkgPT4gZWxlbWVudFByZXNlbnRPblBhZ2UocGFnZSwgJyN2YWxpZGF0aW9uTXNnJyldO1xuICAvLyBUT0RPOiBzdXBwb3J0IGNoYW5nZSBwYXNzd29yZFxuICAvKiB1cmxzW0xPR0lOX1JFU1VMVC5DSEFOR0VfUEFTU1dPUkRdID0gW2BgXTsgKi9cbiAgcmV0dXJuIHVybHM7XG59XG5cbmZ1bmN0aW9uIGdldFRyYW5zYWN0aW9uc1VybCgpIHtcbiAgcmV0dXJuIGAke0JBU0VfVVJMfS93cHMvbXlwb3J0YWwvRmliaU1lbnUvT25saW5lL09uQWNjb3VudE1uZ21lbnQvT25CYWxhbmNlVHJhbnMvUHJpdmF0ZUFjY291bnRGbG93YDtcbn1cblxuZnVuY3Rpb24gY3JlYXRlTG9naW5GaWVsZHMoY3JlZGVudGlhbHM6IFNjcmFwZXJTcGVjaWZpY0NyZWRlbnRpYWxzKSB7XG4gIHJldHVybiBbXG4gICAgeyBzZWxlY3RvcjogJyN1c2VybmFtZScsIHZhbHVlOiBjcmVkZW50aWFscy51c2VybmFtZSB9LFxuICAgIHsgc2VsZWN0b3I6ICcjcGFzc3dvcmQnLCB2YWx1ZTogY3JlZGVudGlhbHMucGFzc3dvcmQgfSxcbiAgXTtcbn1cblxuZnVuY3Rpb24gZ2V0QW1vdW50RGF0YShhbW91bnRTdHI6IHN0cmluZywgaGFzQ3VycmVuY3kgPSBmYWxzZSkge1xuICBjb25zdCBhbW91bnRTdHJDbG4gPSBhbW91bnRTdHIucmVwbGFjZSgnLCcsICcnKTtcbiAgbGV0IGN1cnJlbmN5OiBzdHJpbmcgfCBudWxsID0gbnVsbDtcbiAgbGV0IGFtb3VudDogbnVtYmVyIHwgbnVsbCA9IG51bGw7XG4gIGlmICghaGFzQ3VycmVuY3kpIHtcbiAgICBhbW91bnQgPSBwYXJzZUZsb2F0KGFtb3VudFN0ckNsbik7XG4gICAgY3VycmVuY3kgPSBTSEVLRUxfQ1VSUkVOQ1k7XG4gIH0gZWxzZSBpZiAoYW1vdW50U3RyQ2xuLmluY2x1ZGVzKFNIRUtFTF9DVVJSRU5DWV9TWU1CT0wpKSB7XG4gICAgYW1vdW50ID0gcGFyc2VGbG9hdChhbW91bnRTdHJDbG4ucmVwbGFjZShTSEVLRUxfQ1VSUkVOQ1lfU1lNQk9MLCAnJykpO1xuICAgIGN1cnJlbmN5ID0gU0hFS0VMX0NVUlJFTkNZO1xuICB9IGVsc2Uge1xuICAgIGNvbnN0IHBhcnRzID0gYW1vdW50U3RyQ2xuLnNwbGl0KCcgJyk7XG4gICAgYW1vdW50ID0gcGFyc2VGbG9hdChwYXJ0c1swXSk7XG4gICAgWywgY3VycmVuY3ldID0gcGFydHM7XG4gIH1cblxuICByZXR1cm4ge1xuICAgIGFtb3VudCxcbiAgICBjdXJyZW5jeSxcbiAgfTtcbn1cblxuZnVuY3Rpb24gY29udmVydFRyYW5zYWN0aW9ucyh0eG5zOiBTY3JhcGVkVHJhbnNhY3Rpb25bXSk6IFRyYW5zYWN0aW9uW10ge1xuICByZXR1cm4gdHhucy5tYXAoKHR4bikgPT4ge1xuICAgIGNvbnN0IGRhdGVGb3JtYXQgPVxuICAgICAgICB0eG4uZGF0ZS5sZW5ndGggPT09IDggP1xuICAgICAgICAgIERBVEVfRk9STUFUIDpcbiAgICAgICAgICB0eG4uZGF0ZS5sZW5ndGggPT09IDEwID9cbiAgICAgICAgICAgIExPTkdfREFURV9GT1JNQVQgOlxuICAgICAgICAgICAgbnVsbDtcbiAgICBpZiAoIWRhdGVGb3JtYXQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBkYXRlIGZvcm1hdCcpO1xuICAgIH1cbiAgICBjb25zdCB0eG5EYXRlID0gbW9tZW50KHR4bi5kYXRlLCBkYXRlRm9ybWF0KS50b0lTT1N0cmluZygpO1xuICAgIGNvbnN0IGNyZWRpdCA9IGdldEFtb3VudERhdGEodHhuLmNyZWRpdCB8fCAnJykuYW1vdW50O1xuICAgIGNvbnN0IGRlYml0ID0gZ2V0QW1vdW50RGF0YSh0eG4uZGViaXQgfHwgJycpLmFtb3VudDtcbiAgICBjb25zdCBhbW91bnQgPSAoTnVtYmVyLmlzTmFOKGNyZWRpdCkgPyAwIDogY3JlZGl0KSAtIChOdW1iZXIuaXNOYU4oZGViaXQpID8gMCA6IGRlYml0KTtcblxuICAgIGNvbnN0IHJlc3VsdDogVHJhbnNhY3Rpb24gPSB7XG4gICAgICB0eXBlOiBUcmFuc2FjdGlvblR5cGVzLk5vcm1hbCxcbiAgICAgIHN0YXR1czogVHJhbnNhY3Rpb25TdGF0dXNlcy5Db21wbGV0ZWQsXG4gICAgICBpZGVudGlmaWVyOiB0eG4ucmVmZXJlbmNlID8gcGFyc2VJbnQodHhuLnJlZmVyZW5jZSwgMTApIDogdW5kZWZpbmVkLFxuICAgICAgZGF0ZTogdHhuRGF0ZSxcbiAgICAgIHByb2Nlc3NlZERhdGU6IHR4bkRhdGUsXG4gICAgICBvcmlnaW5hbEFtb3VudDogYW1vdW50LFxuICAgICAgb3JpZ2luYWxDdXJyZW5jeTogU0hFS0VMX0NVUlJFTkNZLFxuICAgICAgY2hhcmdlZEFtb3VudDogYW1vdW50LFxuICAgICAgZGVzY3JpcHRpb246IHR4bi5kZXNjcmlwdGlvbiB8fCAnJyxcbiAgICAgIG1lbW86ICcnLFxuICAgIH07XG5cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9KTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gcGFyc2VUcmFuc2FjdGlvblBhZ2UocGFnZTogUGFnZSk6IFByb21pc2U8U2NyYXBlZFRyYW5zYWN0aW9uW10+IHtcbiAgY29uc3QgdGRzVmFsdWVzID0gYXdhaXQgcGFnZUV2YWxBbGwocGFnZSwgJyNkYXRhVGFibGUwNzcgdGJvZHkgdHInLCBbXSwgKHRycykgPT4ge1xuICAgIHJldHVybiAodHJzKS5tYXAoKGVsKSA9PiAoe1xuICAgICAgZGF0ZTogKGVsLnF1ZXJ5U2VsZWN0b3IoJy5kYXRlJykgYXMgSFRNTEVsZW1lbnQpLmlubmVyVGV4dCxcbiAgICAgIC8vIHJlZmVyZW5jZSBhbmQgZGVzY3JpcHRpb24gaGF2ZSB2aWNlLXZlcnNhIGNsYXNzIG5hbWVcbiAgICAgIGRlc2NyaXB0aW9uOiAoZWwucXVlcnlTZWxlY3RvcignLnJlZmVyZW5jZScpIGFzIEhUTUxFbGVtZW50KS5pbm5lclRleHQsXG4gICAgICByZWZlcmVuY2U6IChlbC5xdWVyeVNlbGVjdG9yKCcuZGV0YWlscycpIGFzIEhUTUxFbGVtZW50KS5pbm5lclRleHQsXG4gICAgICBjcmVkaXQ6IChlbC5xdWVyeVNlbGVjdG9yKCcuY3JlZGl0JykgYXMgSFRNTEVsZW1lbnQpLmlubmVyVGV4dCxcbiAgICAgIGRlYml0OiAoZWwucXVlcnlTZWxlY3RvcignLmRlYml0JykgYXMgSFRNTEVsZW1lbnQpLmlubmVyVGV4dCxcbiAgICAgIGJhbGFuY2U6IChlbC5xdWVyeVNlbGVjdG9yKCcuYmFsYW5jZScpIGFzIEhUTUxFbGVtZW50KS5pbm5lclRleHQsXG4gICAgfSkpO1xuICB9KTtcblxuICByZXR1cm4gdGRzVmFsdWVzO1xufVxuXG5hc3luYyBmdW5jdGlvbiBnZXRBY2NvdW50U3VtbWFyeShwYWdlOiBQYWdlKSB7XG4gIGNvbnN0IGJhbGFuY2VFbG0gPSBhd2FpdCBwYWdlLiQoJy5jdXJyZW50X2JhbGFuY2UnKTtcbiAgY29uc3QgYmFsYW5jZUlubmVyVGV4dEVsbSA9IGF3YWl0IGJhbGFuY2VFbG0hLmdldFByb3BlcnR5KCdpbm5lclRleHQnKTtcbiAgY29uc3QgYmFsYW5jZVRleHQgPSBhd2FpdCBiYWxhbmNlSW5uZXJUZXh0RWxtLmpzb25WYWx1ZSgpO1xuICBjb25zdCBiYWxhbmNlVmFsdWUgPSBnZXRBbW91bnREYXRhKGJhbGFuY2VUZXh0IGFzIHN0cmluZywgdHJ1ZSk7XG4gIC8vIFRPRE86IEZpbmQgdGhlIGNyZWRpdCBmaWVsZCBpbiBiYW5rIHdlYnNpdGUgKGNvdWxkIHNlZSBpdCBpbiBteSBhY2NvdW50KVxuICByZXR1cm4ge1xuICAgIGJhbGFuY2U6IE51bWJlci5pc05hTihiYWxhbmNlVmFsdWUuYW1vdW50KSA/IDAgOiBiYWxhbmNlVmFsdWUuYW1vdW50LFxuICAgIGNyZWRpdExpbWl0OiAwLjAsXG4gICAgY3JlZGl0VXRpbGl6YXRpb246IDAuMCxcbiAgICBiYWxhbmNlQ3VycmVuY3k6IGJhbGFuY2VWYWx1ZS5jdXJyZW5jeSxcbiAgfTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gZmV0Y2hUcmFuc2FjdGlvbnNGb3JBY2NvdW50KHBhZ2U6IFBhZ2UsIHN0YXJ0RGF0ZTogTW9tZW50KSB7XG4gIGNvbnN0IHN1bW1hcnkgPSBhd2FpdCBnZXRBY2NvdW50U3VtbWFyeShwYWdlKTtcbiAgYXdhaXQgd2FpdFVudGlsRWxlbWVudEZvdW5kKHBhZ2UsICdpbnB1dCNmcm9tRGF0ZScpO1xuICAvLyBHZXQgYWNjb3VudCBudW1iZXJcbiAgY29uc3QgYnJhbmNoTnVtID0gYXdhaXQgcGFnZS4kZXZhbCgnLmJyYW5jaF9udW0nLCAoc3BhbikgPT4ge1xuICAgIHJldHVybiAoc3BhbiBhcyBIVE1MRWxlbWVudCkuaW5uZXJUZXh0O1xuICB9KTtcblxuICBjb25zdCBhY2NvdW50Tm1iciA9IGF3YWl0IHBhZ2UuJGV2YWwoJy5hY2NfbnVtJywgKHNwYW4pID0+IHtcbiAgICByZXR1cm4gKHNwYW4gYXMgSFRNTEVsZW1lbnQpLmlubmVyVGV4dDtcbiAgfSk7XG4gIGNvbnN0IGFjY291bnROdW1iZXIgPSBgMTQtJHticmFuY2hOdW19LSR7YWNjb3VudE5tYnJ9YDtcbiAgLy8gU2VhcmNoIGZvciByZWxhdmFudCB0cmFuc2FjdGlvbiBmcm9tIHN0YXJ0RGF0ZVxuICBhd2FpdCBjbGlja0J1dHRvbihwYWdlLCAnI3RhYkhlYWRlcjQnKTtcbiAgYXdhaXQgZmlsbElucHV0KFxuICAgIHBhZ2UsXG4gICAgJ2lucHV0I2Zyb21EYXRlJyxcbiAgICBzdGFydERhdGUuZm9ybWF0KCdERC9NTS9ZWVlZJyksXG4gICk7XG5cbiAgYXdhaXQgY2xpY2tCdXR0b24ocGFnZSwgJyNmaWJpX3RhYl9kYXRlcyAuZmliaV9idG46bnRoLWNoaWxkKDIpJyk7XG4gIGF3YWl0IHdhaXRGb3JOYXZpZ2F0aW9uKHBhZ2UpO1xuICBhd2FpdCB3YWl0VW50aWxFbGVtZW50Rm91bmQocGFnZSwgJ3RhYmxlI2RhdGFUYWJsZTA3NywgI05PX0RBVEEwNzcnKTtcbiAgbGV0IGhhc05leHRQYWdlID0gdHJ1ZTtcbiAgbGV0IHR4bnM6IFNjcmFwZWRUcmFuc2FjdGlvbltdID0gW107XG5cbiAgY29uc3Qgbm9UcmFuc2FjdGlvbkVsbSA9IGF3YWl0IHBhZ2UuJCgnI05PX0RBVEEwNzcnKTtcbiAgaWYgKG5vVHJhbnNhY3Rpb25FbG0gPT0gbnVsbCkge1xuICAgIC8vIFNjYXBlIHRyYW5zYWN0aW9ucyAodGhpcyBtYXliZSBzcGFubmVkIG9uIG11bHRpcGxlIHBhZ2VzKVxuICAgIHdoaWxlIChoYXNOZXh0UGFnZSkge1xuICAgICAgY29uc3QgcGFnZVR4bnMgPSBhd2FpdCBwYXJzZVRyYW5zYWN0aW9uUGFnZShwYWdlKTtcbiAgICAgIHR4bnMgPSB0eG5zLmNvbmNhdChwYWdlVHhucyk7XG4gICAgICBjb25zdCBidXR0b24gPSBhd2FpdCBwYWdlLiQoJyNOcGFnZScpO1xuICAgICAgaGFzTmV4dFBhZ2UgPSBmYWxzZTtcbiAgICAgIGlmIChidXR0b24gIT0gbnVsbCkge1xuICAgICAgICBoYXNOZXh0UGFnZSA9IHRydWU7XG4gICAgICB9XG4gICAgICBpZiAoaGFzTmV4dFBhZ2UpIHtcbiAgICAgICAgYXdhaXQgY2xpY2tCdXR0b24ocGFnZSwgJyNOcGFnZScpO1xuICAgICAgICBhd2FpdCB3YWl0Rm9yTmF2aWdhdGlvbihwYWdlKTtcbiAgICAgICAgYXdhaXQgd2FpdFVudGlsRWxlbWVudEZvdW5kKHBhZ2UsICd0YWJsZSNkYXRhVGFibGUwNzcnKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4ge1xuICAgIGFjY291bnROdW1iZXIsXG4gICAgc3VtbWFyeSxcbiAgICB0eG5zOiBjb252ZXJ0VHJhbnNhY3Rpb25zKHR4bnMuc2xpY2UoMSkpLCAvLyBSZW1vdmUgZmlyc3QgbGluZSB3aGljaCBpcyBcIm9wZW5pbmcgYmFsYW5jZVwiXG4gIH07XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGZldGNoVHJhbnNhY3Rpb25zKHBhZ2U6IFBhZ2UsIHN0YXJ0RGF0ZTogTW9tZW50KSB7XG4gIC8vIFRPRE8gbmVlZCB0byBleHRlbmQgdG8gc3VwcG9ydCBtdWx0aXBsZSBhY2NvdW50cyBhbmQgZm9yZWlnbiBhY2NvdW50c1xuICByZXR1cm4gW2F3YWl0IGZldGNoVHJhbnNhY3Rpb25zRm9yQWNjb3VudChwYWdlLCBzdGFydERhdGUpXTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gd2FpdEZvclBvc3RMb2dpbihwYWdlOiBQYWdlKSB7XG4gIC8vIFRPRE8gY2hlY2sgZm9yIGNvbmRpdGlvbiB0byBwcm92aWRlIG5ldyBwYXNzd29yZFxuICByZXR1cm4gUHJvbWlzZS5yYWNlKFtcbiAgICB3YWl0VW50aWxFbGVtZW50Rm91bmQocGFnZSwgJ2Rpdi5sb3R1c0ZyYW1lJywgdHJ1ZSksXG4gICAgd2FpdFVudGlsRWxlbWVudEZvdW5kKHBhZ2UsICcjdmFsaWRhdGlvbk1zZycpLFxuICBdKTtcbn1cblxudHlwZSBTY3JhcGVyU3BlY2lmaWNDcmVkZW50aWFscyA9IHsgdXNlcm5hbWU6IHN0cmluZywgcGFzc3dvcmQ6IHN0cmluZyB9O1xuXG5jbGFzcyBPdHNhckhhaGF5YWxTY3JhcGVyIGV4dGVuZHMgQmFzZVNjcmFwZXJXaXRoQnJvd3NlcjxTY3JhcGVyU3BlY2lmaWNDcmVkZW50aWFscz4ge1xuICBnZXRMb2dpbk9wdGlvbnMoY3JlZGVudGlhbHM6IFNjcmFwZXJTcGVjaWZpY0NyZWRlbnRpYWxzKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGxvZ2luVXJsOiBgJHtCQVNFX1VSTH0vTWF0YWZMb2dpblNlcnZpY2UvTWF0YWZMb2dpblNlcnZsZXQ/YmFua0lkPU9UU0FSUFJUQUwmc2l0ZT1Qcml2YXRlJktPRFNBRkE9SEVgLFxuICAgICAgZmllbGRzOiBjcmVhdGVMb2dpbkZpZWxkcyhjcmVkZW50aWFscyksXG4gICAgICBzdWJtaXRCdXR0b25TZWxlY3RvcjogYXN5bmMgKCkgPT4ge1xuICAgICAgICBhd2FpdCBzbGVlcCgxMDAwKTtcbiAgICAgICAgYXdhaXQgY2xpY2tCdXR0b24odGhpcy5wYWdlLCAnI2NvbnRpbnVlQnRuJyk7XG4gICAgICB9LFxuICAgICAgcG9zdEFjdGlvbjogYXN5bmMgKCkgPT4gd2FpdEZvclBvc3RMb2dpbih0aGlzLnBhZ2UpLFxuICAgICAgcG9zc2libGVSZXN1bHRzOiBnZXRQb3NzaWJsZUxvZ2luUmVzdWx0cyh0aGlzLnBhZ2UpLFxuICAgIH07XG4gIH1cblxuICBhc3luYyBmZXRjaERhdGEoKSB7XG4gICAgY29uc3QgZGVmYXVsdFN0YXJ0TW9tZW50ID0gbW9tZW50KCkuc3VidHJhY3QoMSwgJ3llYXJzJykuYWRkKDEsICdkYXknKTtcbiAgICBjb25zdCBzdGFydERhdGUgPSB0aGlzLm9wdGlvbnMuc3RhcnREYXRlIHx8IGRlZmF1bHRTdGFydE1vbWVudC50b0RhdGUoKTtcbiAgICBjb25zdCBzdGFydE1vbWVudCA9IG1vbWVudC5tYXgoZGVmYXVsdFN0YXJ0TW9tZW50LCBtb21lbnQoc3RhcnREYXRlKSk7XG5cbiAgICBjb25zdCB1cmwgPSBnZXRUcmFuc2FjdGlvbnNVcmwoKTtcbiAgICBhd2FpdCB0aGlzLm5hdmlnYXRlVG8odXJsKTtcblxuICAgIGNvbnN0IGFjY291bnRzID0gYXdhaXQgZmV0Y2hUcmFuc2FjdGlvbnModGhpcy5wYWdlLCBzdGFydE1vbWVudCk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgc3VjY2VzczogdHJ1ZSxcbiAgICAgIGFjY291bnRzLFxuICAgIH07XG4gIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgT3RzYXJIYWhheWFsU2NyYXBlcjtcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7O0FBQUEsSUFBQUEsT0FBQSxHQUFBQyxzQkFBQSxDQUFBQyxPQUFBO0FBRUEsSUFBQUMsVUFBQSxHQUFBRCxPQUFBO0FBQ0EsSUFBQUUscUJBQUEsR0FBQUYsT0FBQTtBQU9BLElBQUFHLFdBQUEsR0FBQUgsT0FBQTtBQUNBLElBQUFJLFFBQUEsR0FBQUosT0FBQTtBQUNBLElBQUFLLGFBQUEsR0FBQUwsT0FBQTtBQUNBLElBQUFNLHVCQUFBLEdBQUFOLE9BQUE7QUFBOEcsU0FBQUQsdUJBQUFRLENBQUEsV0FBQUEsQ0FBQSxJQUFBQSxDQUFBLENBQUFDLFVBQUEsR0FBQUQsQ0FBQSxLQUFBRSxPQUFBLEVBQUFGLENBQUE7QUFFOUcsTUFBTUcsUUFBUSxHQUFHLGdDQUFnQztBQUNqRCxNQUFNQyxnQkFBZ0IsR0FBRyxZQUFZO0FBQ3JDLE1BQU1DLFdBQVcsR0FBRyxVQUFVO0FBYTlCLFNBQVNDLHVCQUF1QkEsQ0FBQ0MsSUFBVSxFQUFFO0VBQzNDLE1BQU1DLElBQTBCLEdBQUcsQ0FBQyxDQUFDO0VBQ3JDQSxJQUFJLENBQUNDLG9DQUFZLENBQUNDLE9BQU8sQ0FBQyxHQUFHLENBQUMsSUFBSUMsTUFBTSxDQUFDLElBQUlSLFFBQVEsQ0FBQ1MsT0FBTyxDQUFDLEdBQUcsRUFBRSxLQUFLLENBQUMsK0JBQStCLENBQUMsQ0FBQztFQUMxR0osSUFBSSxDQUFDQyxvQ0FBWSxDQUFDSSxlQUFlLENBQUMsR0FBRyxDQUFDLE1BQU0sSUFBQUMsMENBQW9CLEVBQUNQLElBQUksRUFBRSxnQkFBZ0IsQ0FBQyxDQUFDO0VBQ3pGO0VBQ0E7RUFDQSxPQUFPQyxJQUFJO0FBQ2I7QUFFQSxT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
|
|
22
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfYmFzZUJlaW5sZXVtaUdyb3VwIiwiX2ludGVyb3BSZXF1aXJlRGVmYXVsdCIsInJlcXVpcmUiLCJlIiwiX19lc01vZHVsZSIsImRlZmF1bHQiLCJfZGVmaW5lUHJvcGVydHkiLCJyIiwidCIsIl90b1Byb3BlcnR5S2V5IiwiT2JqZWN0IiwiZGVmaW5lUHJvcGVydHkiLCJ2YWx1ZSIsImVudW1lcmFibGUiLCJjb25maWd1cmFibGUiLCJ3cml0YWJsZSIsImkiLCJfdG9QcmltaXRpdmUiLCJTeW1ib2wiLCJ0b1ByaW1pdGl2ZSIsImNhbGwiLCJUeXBlRXJyb3IiLCJTdHJpbmciLCJOdW1iZXIiLCJPdHNhckhhaGF5YWxTY3JhcGVyIiwiQmVpbmxldW1pR3JvdXBCYXNlU2NyYXBlciIsImNvbnN0cnVjdG9yIiwiYXJncyIsIkJBU0VfVVJMIiwiX2RlZmF1bHQiLCJleHBvcnRzIl0sInNvdXJjZXMiOlsiLi4vLi4vc3JjL3NjcmFwZXJzL290c2FyLWhhaGF5YWwudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IEJlaW5sZXVtaUdyb3VwQmFzZVNjcmFwZXIgZnJvbSAnLi9iYXNlLWJlaW5sZXVtaS1ncm91cCc7XG5cbmNsYXNzIE90c2FySGFoYXlhbFNjcmFwZXIgZXh0ZW5kcyBCZWlubGV1bWlHcm91cEJhc2VTY3JhcGVyIHtcbiAgQkFTRV9VUkwgPSAnaHR0cHM6Ly9vbmxpbmUuYmFua290c2FyLmNvLmlsJztcblxuICBMT0dJTl9VUkwgPSBgJHt0aGlzLkJBU0VfVVJMfS9NYXRhZkxvZ2luU2VydmljZS9NYXRhZkxvZ2luU2VydmxldD9iYW5rSWQ9T1RTQVJQUlRBTCZzaXRlPVByaXZhdGUmS09EU0FGQT1IRWA7XG5cbiAgVFJBTlNBQ1RJT05TX1VSTCA9IGAke3RoaXMuQkFTRV9VUkx9L3dwcy9teXBvcnRhbC9GaWJpTWVudS9PbmxpbmUvT25BY2NvdW50TW5nbWVudC9PbkJhbGFuY2VUcmFucy9Qcml2YXRlQWNjb3VudEZsb3dgO1xufVxuXG5leHBvcnQgZGVmYXVsdCBPdHNhckhhaGF5YWxTY3JhcGVyOyJdLCJtYXBwaW5ncyI6Ijs7Ozs7OztBQUFBLElBQUFBLG1CQUFBLEdBQUFDLHNCQUFBLENBQUFDLE9BQUE7QUFBK0QsU0FBQUQsdUJBQUFFLENBQUEsV0FBQUEsQ0FBQSxJQUFBQSxDQUFBLENBQUFDLFVBQUEsR0FBQUQsQ0FBQSxLQUFBRSxPQUFBLEVBQUFGLENBQUE7QUFBQSxTQUFBRyxnQkFBQUgsQ0FBQSxFQUFBSSxDQUFBLEVBQUFDLENBQUEsWUFBQUQsQ0FBQSxHQUFBRSxjQUFBLENBQUFGLENBQUEsTUFBQUosQ0FBQSxHQUFBTyxNQUFBLENBQUFDLGNBQUEsQ0FBQVIsQ0FBQSxFQUFBSSxDQUFBLElBQUFLLEtBQUEsRUFBQUosQ0FBQSxFQUFBSyxVQUFBLE1BQUFDLFlBQUEsTUFBQUMsUUFBQSxVQUFBWixDQUFBLENBQUFJLENBQUEsSUFBQUMsQ0FBQSxFQUFBTCxDQUFBO0FBQUEsU0FBQU0sZUFBQUQsQ0FBQSxRQUFBUSxDQUFBLEdBQUFDLFlBQUEsQ0FBQVQsQ0FBQSx1Q0FBQVEsQ0FBQSxHQUFBQSxDQUFBLEdBQUFBLENBQUE7QUFBQSxTQUFBQyxhQUFBVCxDQUFBLEVBQUFELENBQUEsMkJBQUFDLENBQUEsS0FBQUEsQ0FBQSxTQUFBQSxDQUFBLE1BQUFMLENBQUEsR0FBQUssQ0FBQSxDQUFBVSxNQUFBLENBQUFDLFdBQUEsa0JBQUFoQixDQUFBLFFBQUFhLENBQUEsR0FBQWIsQ0FBQSxDQUFBaUIsSUFBQSxDQUFBWixDQUFBLEVBQUFELENBQUEsdUNBQUFTLENBQUEsU0FBQUEsQ0FBQSxZQUFBSyxTQUFBLHlFQUFBZCxDQUFBLEdBQUFlLE1BQUEsR0FBQUMsTUFBQSxFQUFBZixDQUFBO0FBRS9ELE1BQU1nQixtQkFBbUIsU0FBU0MsMkJBQXlCLENBQUM7RUFBQUMsWUFBQSxHQUFBQyxJQUFBO0lBQUEsU0FBQUEsSUFBQTtJQUFBckIsZUFBQSxtQkFDL0MsZ0NBQWdDO0lBQUFBLGVBQUEsb0JBRS9CLEdBQUcsSUFBSSxDQUFDc0IsUUFBUSxnRkFBZ0Y7SUFBQXRCLGVBQUEsMkJBRXpGLEdBQUcsSUFBSSxDQUFDc0IsUUFBUSxrRkFBa0Y7RUFBQTtBQUN2SDtBQUFDLElBQUFDLFFBQUEsR0FBQUMsT0FBQSxDQUFBekIsT0FBQSxHQUVjbUIsbUJBQW1CIiwiaWdub3JlTGlzdCI6W119
|