israeli-bank-scrapers 6.0.0 → 6.1.1

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.
Files changed (83) hide show
  1. package/README.md +1 -0
  2. package/lib/assertNever.js +5 -7
  3. package/lib/constants.js +13 -16
  4. package/lib/definitions.js +109 -113
  5. package/lib/helpers/browser.d.ts +8 -0
  6. package/lib/helpers/browser.js +14 -11
  7. package/lib/helpers/dates.js +18 -19
  8. package/lib/helpers/debug.js +9 -9
  9. package/lib/helpers/elements-interactions.js +78 -84
  10. package/lib/helpers/fetch.js +82 -89
  11. package/lib/helpers/navigation.js +24 -31
  12. package/lib/helpers/storage.js +10 -12
  13. package/lib/helpers/transactions.js +33 -35
  14. package/lib/helpers/waiting.js +45 -44
  15. package/lib/index.js +15 -82
  16. package/lib/scrapers/amex.js +11 -13
  17. package/lib/scrapers/base-beinleumi-group.js +233 -252
  18. package/lib/scrapers/base-isracard-amex.js +273 -286
  19. package/lib/scrapers/base-scraper-with-browser.d.ts +2 -1
  20. package/lib/scrapers/base-scraper-with-browser.js +240 -269
  21. package/lib/scrapers/base-scraper.js +82 -86
  22. package/lib/scrapers/behatsdaa.js +98 -107
  23. package/lib/scrapers/beinleumi.js +11 -20
  24. package/lib/scrapers/beyahad-bishvilha.js +132 -138
  25. package/lib/scrapers/discount.js +97 -103
  26. package/lib/scrapers/errors.js +22 -25
  27. package/lib/scrapers/factory.js +66 -67
  28. package/lib/scrapers/hapoalim.js +162 -182
  29. package/lib/scrapers/interface.d.ts +12 -0
  30. package/lib/scrapers/interface.js +2 -5
  31. package/lib/scrapers/isracard.js +11 -13
  32. package/lib/scrapers/leumi.js +167 -176
  33. package/lib/scrapers/massad.js +11 -20
  34. package/lib/scrapers/max.js +256 -268
  35. package/lib/scrapers/mercantile.js +14 -20
  36. package/lib/scrapers/mizrahi.js +158 -159
  37. package/lib/scrapers/one-zero-queries.js +4 -7
  38. package/lib/scrapers/one-zero.js +176 -240
  39. package/lib/scrapers/otsar-hahayal.js +11 -20
  40. package/lib/scrapers/pagi.js +11 -20
  41. package/lib/scrapers/union-bank.js +172 -179
  42. package/lib/scrapers/visa-cal.js +254 -263
  43. package/lib/scrapers/yahav.js +190 -211
  44. package/lib/transactions.js +13 -16
  45. package/package.json +12 -14
  46. package/lib/scrapers/amex.test.d.ts +0 -1
  47. package/lib/scrapers/amex.test.js +0 -54
  48. package/lib/scrapers/base-scraper-with-browser.test.d.ts +0 -1
  49. package/lib/scrapers/base-scraper-with-browser.test.js +0 -58
  50. package/lib/scrapers/behatsdaa.test.d.ts +0 -1
  51. package/lib/scrapers/behatsdaa.test.js +0 -50
  52. package/lib/scrapers/beinleumi.test.d.ts +0 -1
  53. package/lib/scrapers/beinleumi.test.js +0 -52
  54. package/lib/scrapers/beyahad-bishvilha.test.d.ts +0 -1
  55. package/lib/scrapers/beyahad-bishvilha.test.js +0 -52
  56. package/lib/scrapers/discount.test.d.ts +0 -1
  57. package/lib/scrapers/discount.test.js +0 -54
  58. package/lib/scrapers/factory.test.d.ts +0 -1
  59. package/lib/scrapers/factory.test.js +0 -19
  60. package/lib/scrapers/hapoalim.test.d.ts +0 -1
  61. package/lib/scrapers/hapoalim.test.js +0 -52
  62. package/lib/scrapers/isracard.test.d.ts +0 -1
  63. package/lib/scrapers/isracard.test.js +0 -54
  64. package/lib/scrapers/leumi.test.d.ts +0 -1
  65. package/lib/scrapers/leumi.test.js +0 -52
  66. package/lib/scrapers/max.test.d.ts +0 -1
  67. package/lib/scrapers/max.test.js +0 -71
  68. package/lib/scrapers/mercantile.test.d.ts +0 -1
  69. package/lib/scrapers/mercantile.test.js +0 -50
  70. package/lib/scrapers/mizrahi.test.d.ts +0 -1
  71. package/lib/scrapers/mizrahi.test.js +0 -58
  72. package/lib/scrapers/one-zero.test.d.ts +0 -1
  73. package/lib/scrapers/one-zero.test.js +0 -56
  74. package/lib/scrapers/otsar-hahayal.test.d.ts +0 -1
  75. package/lib/scrapers/otsar-hahayal.test.js +0 -52
  76. package/lib/scrapers/pagi.test.d.ts +0 -1
  77. package/lib/scrapers/pagi.test.js +0 -52
  78. package/lib/scrapers/union-bank.test.d.ts +0 -1
  79. package/lib/scrapers/union-bank.test.js +0 -52
  80. package/lib/scrapers/visa-cal.test.d.ts +0 -1
  81. package/lib/scrapers/visa-cal.test.js +0 -54
  82. package/lib/scrapers/yahav.test.d.ts +0 -1
  83. package/lib/scrapers/yahav.test.js +0 -54
@@ -1,22 +1,13 @@
1
1
  "use strict";
2
-
3
- Object.defineProperty(exports, "__esModule", {
4
- value: true
5
- });
6
- exports.default = void 0;
7
- require("core-js/modules/es.array.iterator.js");
8
- var _baseBeinleumiGroup = _interopRequireDefault(require("./base-beinleumi-group"));
9
- function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
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 PagiScraper extends _baseBeinleumiGroup.default {
14
- constructor(...args) {
15
- super(...args);
16
- _defineProperty(this, "BASE_URL", 'https://online.pagi.co.il/');
17
- _defineProperty(this, "LOGIN_URL", `${this.BASE_URL}/MatafLoginService/MatafLoginServlet?bankId=PAGIPORTAL&site=Private&KODSAFA=HE`);
18
- _defineProperty(this, "TRANSACTIONS_URL", `${this.BASE_URL}/wps/myportal/FibiMenu/Online/OnAccountMngment/OnBalanceTrans/PrivateAccountFlow`);
19
- }
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ const base_beinleumi_group_1 = __importDefault(require("./base-beinleumi-group"));
7
+ class PagiScraper extends base_beinleumi_group_1.default {
8
+ BASE_URL = 'https://online.pagi.co.il/';
9
+ LOGIN_URL = `${this.BASE_URL}/MatafLoginService/MatafLoginServlet?bankId=PAGIPORTAL&site=Private&KODSAFA=HE`;
10
+ TRANSACTIONS_URL = `${this.BASE_URL}/wps/myportal/FibiMenu/Online/OnAccountMngment/OnBalanceTrans/PrivateAccountFlow`;
20
11
  }
21
- var _default = exports.default = PagiScraper;
22
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfYmFzZUJlaW5sZXVtaUdyb3VwIiwiX2ludGVyb3BSZXF1aXJlRGVmYXVsdCIsInJlcXVpcmUiLCJlIiwiX19lc01vZHVsZSIsImRlZmF1bHQiLCJfZGVmaW5lUHJvcGVydHkiLCJyIiwidCIsIl90b1Byb3BlcnR5S2V5IiwiT2JqZWN0IiwiZGVmaW5lUHJvcGVydHkiLCJ2YWx1ZSIsImVudW1lcmFibGUiLCJjb25maWd1cmFibGUiLCJ3cml0YWJsZSIsImkiLCJfdG9QcmltaXRpdmUiLCJTeW1ib2wiLCJ0b1ByaW1pdGl2ZSIsImNhbGwiLCJUeXBlRXJyb3IiLCJTdHJpbmciLCJOdW1iZXIiLCJQYWdpU2NyYXBlciIsIkJlaW5sZXVtaUdyb3VwQmFzZVNjcmFwZXIiLCJjb25zdHJ1Y3RvciIsImFyZ3MiLCJCQVNFX1VSTCIsIl9kZWZhdWx0IiwiZXhwb3J0cyJdLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9zY3JhcGVycy9wYWdpLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBCZWlubGV1bWlHcm91cEJhc2VTY3JhcGVyIGZyb20gJy4vYmFzZS1iZWlubGV1bWktZ3JvdXAnO1xuXG5jbGFzcyBQYWdpU2NyYXBlciBleHRlbmRzIEJlaW5sZXVtaUdyb3VwQmFzZVNjcmFwZXIge1xuICBCQVNFX1VSTCA9ICdodHRwczovL29ubGluZS5wYWdpLmNvLmlsLyc7XG5cbiAgTE9HSU5fVVJMID0gYCR7dGhpcy5CQVNFX1VSTH0vTWF0YWZMb2dpblNlcnZpY2UvTWF0YWZMb2dpblNlcnZsZXQ/YmFua0lkPVBBR0lQT1JUQUwmc2l0ZT1Qcml2YXRlJktPRFNBRkE9SEVgO1xuXG4gIFRSQU5TQUNUSU9OU19VUkwgPSBgJHt0aGlzLkJBU0VfVVJMfS93cHMvbXlwb3J0YWwvRmliaU1lbnUvT25saW5lL09uQWNjb3VudE1uZ21lbnQvT25CYWxhbmNlVHJhbnMvUHJpdmF0ZUFjY291bnRGbG93YDtcblxufVxuXG5leHBvcnQgZGVmYXVsdCBQYWdpU2NyYXBlcjsiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7QUFBQSxJQUFBQSxtQkFBQSxHQUFBQyxzQkFBQSxDQUFBQyxPQUFBO0FBQStELFNBQUFELHVCQUFBRSxDQUFBLFdBQUFBLENBQUEsSUFBQUEsQ0FBQSxDQUFBQyxVQUFBLEdBQUFELENBQUEsS0FBQUUsT0FBQSxFQUFBRixDQUFBO0FBQUEsU0FBQUcsZ0JBQUFILENBQUEsRUFBQUksQ0FBQSxFQUFBQyxDQUFBLFlBQUFELENBQUEsR0FBQUUsY0FBQSxDQUFBRixDQUFBLE1BQUFKLENBQUEsR0FBQU8sTUFBQSxDQUFBQyxjQUFBLENBQUFSLENBQUEsRUFBQUksQ0FBQSxJQUFBSyxLQUFBLEVBQUFKLENBQUEsRUFBQUssVUFBQSxNQUFBQyxZQUFBLE1BQUFDLFFBQUEsVUFBQVosQ0FBQSxDQUFBSSxDQUFBLElBQUFDLENBQUEsRUFBQUwsQ0FBQTtBQUFBLFNBQUFNLGVBQUFELENBQUEsUUFBQVEsQ0FBQSxHQUFBQyxZQUFBLENBQUFULENBQUEsdUNBQUFRLENBQUEsR0FBQUEsQ0FBQSxHQUFBQSxDQUFBO0FBQUEsU0FBQUMsYUFBQVQsQ0FBQSxFQUFBRCxDQUFBLDJCQUFBQyxDQUFBLEtBQUFBLENBQUEsU0FBQUEsQ0FBQSxNQUFBTCxDQUFBLEdBQUFLLENBQUEsQ0FBQVUsTUFBQSxDQUFBQyxXQUFBLGtCQUFBaEIsQ0FBQSxRQUFBYSxDQUFBLEdBQUFiLENBQUEsQ0FBQWlCLElBQUEsQ0FBQVosQ0FBQSxFQUFBRCxDQUFBLHVDQUFBUyxDQUFBLFNBQUFBLENBQUEsWUFBQUssU0FBQSx5RUFBQWQsQ0FBQSxHQUFBZSxNQUFBLEdBQUFDLE1BQUEsRUFBQWYsQ0FBQTtBQUUvRCxNQUFNZ0IsV0FBVyxTQUFTQywyQkFBeUIsQ0FBQztFQUFBQyxZQUFBLEdBQUFDLElBQUE7SUFBQSxTQUFBQSxJQUFBO0lBQUFyQixlQUFBLG1CQUN2Qyw0QkFBNEI7SUFBQUEsZUFBQSxvQkFFM0IsR0FBRyxJQUFJLENBQUNzQixRQUFRLGdGQUFnRjtJQUFBdEIsZUFBQSwyQkFFekYsR0FBRyxJQUFJLENBQUNzQixRQUFRLGtGQUFrRjtFQUFBO0FBRXZIO0FBQUMsSUFBQUMsUUFBQSxHQUFBQyxPQUFBLENBQUF6QixPQUFBLEdBRWNtQixXQUFXIiwiaWdub3JlTGlzdCI6W119
12
+ exports.default = PagiScraper;
13
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGFnaS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9zY3JhcGVycy9wYWdpLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEsa0ZBQStEO0FBRS9ELE1BQU0sV0FBWSxTQUFRLDhCQUF5QjtJQUNqRCxRQUFRLEdBQUcsNEJBQTRCLENBQUM7SUFFeEMsU0FBUyxHQUFHLEdBQUcsSUFBSSxDQUFDLFFBQVEsZ0ZBQWdGLENBQUM7SUFFN0csZ0JBQWdCLEdBQUcsR0FBRyxJQUFJLENBQUMsUUFBUSxrRkFBa0YsQ0FBQztDQUN2SDtBQUVELGtCQUFlLFdBQVcsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBCZWlubGV1bWlHcm91cEJhc2VTY3JhcGVyIGZyb20gJy4vYmFzZS1iZWlubGV1bWktZ3JvdXAnO1xuXG5jbGFzcyBQYWdpU2NyYXBlciBleHRlbmRzIEJlaW5sZXVtaUdyb3VwQmFzZVNjcmFwZXIge1xuICBCQVNFX1VSTCA9ICdodHRwczovL29ubGluZS5wYWdpLmNvLmlsLyc7XG5cbiAgTE9HSU5fVVJMID0gYCR7dGhpcy5CQVNFX1VSTH0vTWF0YWZMb2dpblNlcnZpY2UvTWF0YWZMb2dpblNlcnZsZXQ/YmFua0lkPVBBR0lQT1JUQUwmc2l0ZT1Qcml2YXRlJktPRFNBRkE9SEVgO1xuXG4gIFRSQU5TQUNUSU9OU19VUkwgPSBgJHt0aGlzLkJBU0VfVVJMfS93cHMvbXlwb3J0YWwvRmliaU1lbnUvT25saW5lL09uQWNjb3VudE1uZ21lbnQvT25CYWxhbmNlVHJhbnMvUHJpdmF0ZUFjY291bnRGbG93YDtcbn1cblxuZXhwb3J0IGRlZmF1bHQgUGFnaVNjcmFwZXI7XG4iXX0=
@@ -1,22 +1,14 @@
1
1
  "use strict";
2
-
3
- Object.defineProperty(exports, "__esModule", {
4
- value: true
5
- });
6
- exports.default = void 0;
7
- require("core-js/modules/es.symbol.description.js");
8
- require("core-js/modules/es.array.iterator.js");
9
- require("core-js/modules/es.promise.js");
10
- require("core-js/modules/es.regexp.exec.js");
11
- require("core-js/modules/es.string.replace.js");
12
- require("core-js/modules/es.string.trim.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 _transactions = require("../transactions");
18
- var _baseScraperWithBrowser = require("./base-scraper-with-browser");
19
- function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ const moment_1 = __importDefault(require("moment"));
7
+ const constants_1 = require("../constants");
8
+ const elements_interactions_1 = require("../helpers/elements-interactions");
9
+ const navigation_1 = require("../helpers/navigation");
10
+ const transactions_1 = require("../transactions");
11
+ const base_scraper_with_browser_1 = require("./base-scraper-with-browser");
20
12
  const BASE_URL = 'https://hb.unionbank.co.il';
21
13
  const TRANSACTIONS_URL = `${BASE_URL}/eBanking/Accounts/ExtendedActivity.aspx#/`;
22
14
  const DATE_FORMAT = 'DD/MM/YY';
@@ -31,218 +23,219 @@ const COMPLETED_TRANSACTIONS_TABLE_ID = 'ctlActivityTable';
31
23
  const ERROR_MESSAGE_CLASS = 'errInfo';
32
24
  const ACCOUNTS_DROPDOWN_SELECTOR = 'select#ddlAccounts_m_ddl';
33
25
  function getPossibleLoginResults() {
34
- const urls = {};
35
- urls[_baseScraperWithBrowser.LoginResults.Success] = [/eBanking\/Accounts/];
36
- urls[_baseScraperWithBrowser.LoginResults.InvalidPassword] = [/InternalSite\/CustomUpdate\/leumi\/LoginPage.ASP/];
37
- return urls;
26
+ const urls = {};
27
+ urls[base_scraper_with_browser_1.LoginResults.Success] = [/eBanking\/Accounts/];
28
+ urls[base_scraper_with_browser_1.LoginResults.InvalidPassword] = [/InternalSite\/CustomUpdate\/leumi\/LoginPage.ASP/];
29
+ return urls;
38
30
  }
39
31
  function createLoginFields(credentials) {
40
- return [{
41
- selector: '#uid',
42
- value: credentials.username
43
- }, {
44
- selector: '#password',
45
- value: credentials.password
46
- }];
32
+ return [
33
+ { selector: '#uid', value: credentials.username },
34
+ { selector: '#password', value: credentials.password },
35
+ ];
47
36
  }
48
37
  function getAmountData(amountStr) {
49
- const amountStrCopy = amountStr.replace(',', '');
50
- return parseFloat(amountStrCopy);
38
+ const amountStrCopy = amountStr.replace(',', '');
39
+ return parseFloat(amountStrCopy);
51
40
  }
52
41
  function getTxnAmount(txn) {
53
- const credit = getAmountData(txn.credit);
54
- const debit = getAmountData(txn.debit);
55
- return (Number.isNaN(credit) ? 0 : credit) - (Number.isNaN(debit) ? 0 : debit);
42
+ const credit = getAmountData(txn.credit);
43
+ const debit = getAmountData(txn.debit);
44
+ return (Number.isNaN(credit) ? 0 : credit) - (Number.isNaN(debit) ? 0 : debit);
56
45
  }
57
46
  function convertTransactions(txns) {
58
- return txns.map(txn => {
59
- const convertedDate = (0, _moment.default)(txn.date, DATE_FORMAT).toISOString();
60
- const convertedAmount = getTxnAmount(txn);
61
- return {
62
- type: _transactions.TransactionTypes.Normal,
63
- identifier: txn.reference ? parseInt(txn.reference, 10) : undefined,
64
- date: convertedDate,
65
- processedDate: convertedDate,
66
- originalAmount: convertedAmount,
67
- originalCurrency: _constants.SHEKEL_CURRENCY,
68
- chargedAmount: convertedAmount,
69
- status: txn.status,
70
- description: txn.description,
71
- memo: txn.memo
72
- };
73
- });
47
+ return txns.map(txn => {
48
+ const convertedDate = (0, moment_1.default)(txn.date, DATE_FORMAT).toISOString();
49
+ const convertedAmount = getTxnAmount(txn);
50
+ return {
51
+ type: transactions_1.TransactionTypes.Normal,
52
+ identifier: txn.reference ? parseInt(txn.reference, 10) : undefined,
53
+ date: convertedDate,
54
+ processedDate: convertedDate,
55
+ originalAmount: convertedAmount,
56
+ originalCurrency: constants_1.SHEKEL_CURRENCY,
57
+ chargedAmount: convertedAmount,
58
+ status: txn.status,
59
+ description: txn.description,
60
+ memo: txn.memo,
61
+ };
62
+ });
74
63
  }
75
64
  function getTransactionDate(tds, txnsTableHeaders) {
76
- return (tds[txnsTableHeaders[DATE_HEADER]] || '').trim();
65
+ return (tds[txnsTableHeaders[DATE_HEADER]] || '').trim();
77
66
  }
78
67
  function getTransactionDescription(tds, txnsTableHeaders) {
79
- return (tds[txnsTableHeaders[DESCRIPTION_HEADER]] || '').trim();
68
+ return (tds[txnsTableHeaders[DESCRIPTION_HEADER]] || '').trim();
80
69
  }
81
70
  function getTransactionReference(tds, txnsTableHeaders) {
82
- return (tds[txnsTableHeaders[REFERENCE_HEADER]] || '').trim();
71
+ return (tds[txnsTableHeaders[REFERENCE_HEADER]] || '').trim();
83
72
  }
84
73
  function getTransactionDebit(tds, txnsTableHeaders) {
85
- return (tds[txnsTableHeaders[DEBIT_HEADER]] || '').trim();
74
+ return (tds[txnsTableHeaders[DEBIT_HEADER]] || '').trim();
86
75
  }
87
76
  function getTransactionCredit(tds, txnsTableHeaders) {
88
- return (tds[txnsTableHeaders[CREDIT_HEADER]] || '').trim();
77
+ return (tds[txnsTableHeaders[CREDIT_HEADER]] || '').trim();
89
78
  }
90
79
  function extractTransactionDetails(txnRow, txnsTableHeaders, txnStatus) {
91
- const tds = txnRow.innerTds;
92
- return {
93
- status: txnStatus,
94
- date: getTransactionDate(tds, txnsTableHeaders),
95
- description: getTransactionDescription(tds, txnsTableHeaders),
96
- reference: getTransactionReference(tds, txnsTableHeaders),
97
- debit: getTransactionDebit(tds, txnsTableHeaders),
98
- credit: getTransactionCredit(tds, txnsTableHeaders),
99
- memo: ''
100
- };
80
+ const tds = txnRow.innerTds;
81
+ return {
82
+ status: txnStatus,
83
+ date: getTransactionDate(tds, txnsTableHeaders),
84
+ description: getTransactionDescription(tds, txnsTableHeaders),
85
+ reference: getTransactionReference(tds, txnsTableHeaders),
86
+ debit: getTransactionDebit(tds, txnsTableHeaders),
87
+ credit: getTransactionCredit(tds, txnsTableHeaders),
88
+ memo: '',
89
+ };
101
90
  }
102
91
  function isExpandedDescRow(txnRow) {
103
- return txnRow.id === 'rowAdded';
92
+ return txnRow.id === 'rowAdded';
104
93
  }
105
-
106
94
  /* eslint-disable no-param-reassign */
107
95
  function editLastTransactionDesc(txnRow, lastTxn) {
108
- lastTxn.description = `${lastTxn.description} ${txnRow.innerTds[0]}`;
109
- return lastTxn;
96
+ lastTxn.description = `${lastTxn.description} ${txnRow.innerTds[0]}`;
97
+ return lastTxn;
110
98
  }
111
99
  function handleTransactionRow(txns, txnsTableHeaders, txnRow, txnType) {
112
- if (isExpandedDescRow(txnRow)) {
113
- const lastTransaction = txns.pop();
114
- if (lastTransaction) {
115
- txns.push(editLastTransactionDesc(txnRow, lastTransaction));
116
- } else {
117
- throw new Error('internal union-bank error');
100
+ if (isExpandedDescRow(txnRow)) {
101
+ const lastTransaction = txns.pop();
102
+ if (lastTransaction) {
103
+ txns.push(editLastTransactionDesc(txnRow, lastTransaction));
104
+ }
105
+ else {
106
+ throw new Error('internal union-bank error');
107
+ }
108
+ }
109
+ else {
110
+ txns.push(extractTransactionDetails(txnRow, txnsTableHeaders, txnType));
118
111
  }
119
- } else {
120
- txns.push(extractTransactionDetails(txnRow, txnsTableHeaders, txnType));
121
- }
122
112
  }
123
113
  async function getTransactionsTableHeaders(page, tableTypeId) {
124
- const headersMap = [];
125
- const headersObjs = await (0, _elementsInteractions.pageEvalAll)(page, `#WorkSpaceBox #${tableTypeId} tr[class='header'] th`, null, ths => {
126
- return ths.map((th, index) => ({
127
- text: th.innerText.trim(),
128
- index
129
- }));
130
- });
131
- for (const headerObj of headersObjs) {
132
- headersMap[headerObj.text] = headerObj.index;
133
- }
134
- return headersMap;
114
+ const headersMap = [];
115
+ const headersObjs = await (0, elements_interactions_1.pageEvalAll)(page, `#WorkSpaceBox #${tableTypeId} tr[class='header'] th`, null, ths => {
116
+ return ths.map((th, index) => ({
117
+ text: th.innerText.trim(),
118
+ index,
119
+ }));
120
+ });
121
+ for (const headerObj of headersObjs) {
122
+ headersMap[headerObj.text] = headerObj.index;
123
+ }
124
+ return headersMap;
135
125
  }
136
126
  async function extractTransactionsFromTable(page, tableTypeId, txnType) {
137
- const txns = [];
138
- const transactionsTableHeaders = await getTransactionsTableHeaders(page, tableTypeId);
139
- const transactionsRows = await (0, _elementsInteractions.pageEvalAll)(page, `#WorkSpaceBox #${tableTypeId} tr[class]:not([class='header'])`, [], trs => {
140
- return trs.map(tr => ({
141
- id: tr.getAttribute('id') || '',
142
- innerTds: Array.from(tr.getElementsByTagName('td')).map(td => td.innerText)
143
- }));
144
- });
145
- for (const txnRow of transactionsRows) {
146
- handleTransactionRow(txns, transactionsTableHeaders, txnRow, txnType);
147
- }
148
- return txns;
127
+ const txns = [];
128
+ const transactionsTableHeaders = await getTransactionsTableHeaders(page, tableTypeId);
129
+ const transactionsRows = await (0, elements_interactions_1.pageEvalAll)(page, `#WorkSpaceBox #${tableTypeId} tr[class]:not([class='header'])`, [], trs => {
130
+ return trs.map(tr => ({
131
+ id: tr.getAttribute('id') || '',
132
+ innerTds: Array.from(tr.getElementsByTagName('td')).map(td => td.innerText),
133
+ }));
134
+ });
135
+ for (const txnRow of transactionsRows) {
136
+ handleTransactionRow(txns, transactionsTableHeaders, txnRow, txnType);
137
+ }
138
+ return txns;
149
139
  }
150
140
  async function isNoTransactionInDateRangeError(page) {
151
- const hasErrorInfoElement = await (0, _elementsInteractions.elementPresentOnPage)(page, `.${ERROR_MESSAGE_CLASS}`);
152
- if (hasErrorInfoElement) {
153
- const errorText = await page.$eval(`.${ERROR_MESSAGE_CLASS}`, errorElement => {
154
- return errorElement.innerText;
155
- });
156
- return errorText.trim() === NO_TRANSACTION_IN_DATE_RANGE_TEXT;
157
- }
158
- return false;
141
+ const hasErrorInfoElement = await (0, elements_interactions_1.elementPresentOnPage)(page, `.${ERROR_MESSAGE_CLASS}`);
142
+ if (hasErrorInfoElement) {
143
+ const errorText = await page.$eval(`.${ERROR_MESSAGE_CLASS}`, errorElement => {
144
+ return errorElement.innerText;
145
+ });
146
+ return errorText.trim() === NO_TRANSACTION_IN_DATE_RANGE_TEXT;
147
+ }
148
+ return false;
159
149
  }
160
150
  async function chooseAccount(page, accountId) {
161
- const hasDropDownList = await (0, _elementsInteractions.elementPresentOnPage)(page, ACCOUNTS_DROPDOWN_SELECTOR);
162
- if (hasDropDownList) {
163
- await (0, _elementsInteractions.dropdownSelect)(page, ACCOUNTS_DROPDOWN_SELECTOR, accountId);
164
- }
151
+ const hasDropDownList = await (0, elements_interactions_1.elementPresentOnPage)(page, ACCOUNTS_DROPDOWN_SELECTOR);
152
+ if (hasDropDownList) {
153
+ await (0, elements_interactions_1.dropdownSelect)(page, ACCOUNTS_DROPDOWN_SELECTOR, accountId);
154
+ }
165
155
  }
166
156
  async function searchByDates(page, startDate) {
167
- await (0, _elementsInteractions.dropdownSelect)(page, 'select#ddlTransactionPeriod', '004');
168
- await (0, _elementsInteractions.waitUntilElementFound)(page, 'select#ddlTransactionPeriod');
169
- await (0, _elementsInteractions.fillInput)(page, 'input#dtFromDate_textBox', startDate.format(DATE_FORMAT));
170
- await (0, _elementsInteractions.clickButton)(page, 'input#btnDisplayDates');
171
- await (0, _navigation.waitForNavigation)(page);
157
+ await (0, elements_interactions_1.dropdownSelect)(page, 'select#ddlTransactionPeriod', '004');
158
+ await (0, elements_interactions_1.waitUntilElementFound)(page, 'select#ddlTransactionPeriod');
159
+ await (0, elements_interactions_1.fillInput)(page, 'input#dtFromDate_textBox', startDate.format(DATE_FORMAT));
160
+ await (0, elements_interactions_1.clickButton)(page, 'input#btnDisplayDates');
161
+ await (0, navigation_1.waitForNavigation)(page);
172
162
  }
173
163
  async function getAccountNumber(page) {
174
- const selectedSnifAccount = await page.$eval('#ddlAccounts_m_ddl option[selected="selected"]', option => {
175
- return option.innerText;
176
- });
177
- return selectedSnifAccount.replace('/', '_');
164
+ const selectedSnifAccount = await page.$eval('#ddlAccounts_m_ddl option[selected="selected"]', option => {
165
+ return option.innerText;
166
+ });
167
+ return selectedSnifAccount.replace('/', '_');
178
168
  }
179
169
  async function expandTransactionsTable(page) {
180
- const hasExpandAllButton = await (0, _elementsInteractions.elementPresentOnPage)(page, "a[id*='lnkCtlExpandAll']");
181
- if (hasExpandAllButton) {
182
- await (0, _elementsInteractions.clickButton)(page, "a[id*='lnkCtlExpandAll']");
183
- }
170
+ const hasExpandAllButton = await (0, elements_interactions_1.elementPresentOnPage)(page, "a[id*='lnkCtlExpandAll']");
171
+ if (hasExpandAllButton) {
172
+ await (0, elements_interactions_1.clickButton)(page, "a[id*='lnkCtlExpandAll']");
173
+ }
184
174
  }
185
175
  async function scrapeTransactionsFromTable(page) {
186
- const pendingTxns = await extractTransactionsFromTable(page, PENDING_TRANSACTIONS_TABLE_ID, _transactions.TransactionStatuses.Pending);
187
- const completedTxns = await extractTransactionsFromTable(page, COMPLETED_TRANSACTIONS_TABLE_ID, _transactions.TransactionStatuses.Completed);
188
- const txns = [...pendingTxns, ...completedTxns];
189
- return convertTransactions(txns);
176
+ const pendingTxns = await extractTransactionsFromTable(page, PENDING_TRANSACTIONS_TABLE_ID, transactions_1.TransactionStatuses.Pending);
177
+ const completedTxns = await extractTransactionsFromTable(page, COMPLETED_TRANSACTIONS_TABLE_ID, transactions_1.TransactionStatuses.Completed);
178
+ const txns = [...pendingTxns, ...completedTxns];
179
+ return convertTransactions(txns);
190
180
  }
191
181
  async function getAccountTransactions(page) {
192
- await Promise.race([(0, _elementsInteractions.waitUntilElementFound)(page, `#${COMPLETED_TRANSACTIONS_TABLE_ID}`, false), (0, _elementsInteractions.waitUntilElementFound)(page, `.${ERROR_MESSAGE_CLASS}`, false)]);
193
- const noTransactionInRangeError = await isNoTransactionInDateRangeError(page);
194
- if (noTransactionInRangeError) {
195
- return [];
196
- }
197
- await expandTransactionsTable(page);
198
- return scrapeTransactionsFromTable(page);
182
+ await Promise.race([
183
+ (0, elements_interactions_1.waitUntilElementFound)(page, `#${COMPLETED_TRANSACTIONS_TABLE_ID}`, false),
184
+ (0, elements_interactions_1.waitUntilElementFound)(page, `.${ERROR_MESSAGE_CLASS}`, false),
185
+ ]);
186
+ const noTransactionInRangeError = await isNoTransactionInDateRangeError(page);
187
+ if (noTransactionInRangeError) {
188
+ return [];
189
+ }
190
+ await expandTransactionsTable(page);
191
+ return scrapeTransactionsFromTable(page);
199
192
  }
200
193
  async function fetchAccountData(page, startDate, accountId) {
201
- await chooseAccount(page, accountId);
202
- await searchByDates(page, startDate);
203
- const accountNumber = await getAccountNumber(page);
204
- const txns = await getAccountTransactions(page);
205
- return {
206
- accountNumber,
207
- txns
208
- };
194
+ await chooseAccount(page, accountId);
195
+ await searchByDates(page, startDate);
196
+ const accountNumber = await getAccountNumber(page);
197
+ const txns = await getAccountTransactions(page);
198
+ return {
199
+ accountNumber,
200
+ txns,
201
+ };
209
202
  }
210
203
  async function fetchAccounts(page, startDate) {
211
- const accounts = [];
212
- const accountsList = await (0, _elementsInteractions.dropdownElements)(page, ACCOUNTS_DROPDOWN_SELECTOR);
213
- for (const account of accountsList) {
214
- if (account.value !== '-1') {
215
- // Skip "All accounts" option
216
- const accountData = await fetchAccountData(page, startDate, account.value);
217
- accounts.push(accountData);
204
+ const accounts = [];
205
+ const accountsList = await (0, elements_interactions_1.dropdownElements)(page, ACCOUNTS_DROPDOWN_SELECTOR);
206
+ for (const account of accountsList) {
207
+ if (account.value !== '-1') {
208
+ // Skip "All accounts" option
209
+ const accountData = await fetchAccountData(page, startDate, account.value);
210
+ accounts.push(accountData);
211
+ }
218
212
  }
219
- }
220
- return accounts;
213
+ return accounts;
221
214
  }
222
215
  async function waitForPostLogin(page) {
223
- return Promise.race([(0, _elementsInteractions.waitUntilElementFound)(page, '#signoff', true), (0, _elementsInteractions.waitUntilElementFound)(page, '#restore', true)]);
224
- }
225
- class UnionBankScraper extends _baseScraperWithBrowser.BaseScraperWithBrowser {
226
- getLoginOptions(credentials) {
227
- return {
228
- loginUrl: `${BASE_URL}`,
229
- fields: createLoginFields(credentials),
230
- submitButtonSelector: '#enter',
231
- postAction: async () => waitForPostLogin(this.page),
232
- possibleResults: getPossibleLoginResults()
233
- };
234
- }
235
- async fetchData() {
236
- const defaultStartMoment = (0, _moment.default)().subtract(1, 'years').add(1, 'day');
237
- const startDate = this.options.startDate || defaultStartMoment.toDate();
238
- const startMoment = _moment.default.max(defaultStartMoment, (0, _moment.default)(startDate));
239
- await this.navigateTo(TRANSACTIONS_URL);
240
- const accounts = await fetchAccounts(this.page, startMoment);
241
- return {
242
- success: true,
243
- accounts
244
- };
245
- }
216
+ return Promise.race([(0, elements_interactions_1.waitUntilElementFound)(page, '#signoff', true), (0, elements_interactions_1.waitUntilElementFound)(page, '#restore', true)]);
217
+ }
218
+ class UnionBankScraper extends base_scraper_with_browser_1.BaseScraperWithBrowser {
219
+ getLoginOptions(credentials) {
220
+ return {
221
+ loginUrl: `${BASE_URL}`,
222
+ fields: createLoginFields(credentials),
223
+ submitButtonSelector: '#enter',
224
+ postAction: async () => waitForPostLogin(this.page),
225
+ possibleResults: getPossibleLoginResults(),
226
+ };
227
+ }
228
+ async fetchData() {
229
+ const defaultStartMoment = (0, moment_1.default)().subtract(1, 'years').add(1, 'day');
230
+ const startDate = this.options.startDate || defaultStartMoment.toDate();
231
+ const startMoment = moment_1.default.max(defaultStartMoment, (0, moment_1.default)(startDate));
232
+ await this.navigateTo(TRANSACTIONS_URL);
233
+ const accounts = await fetchAccounts(this.page, startMoment);
234
+ return {
235
+ success: true,
236
+ accounts,
237
+ };
238
+ }
246
239
  }
247
- var _default = exports.default = UnionBankScraper;
248
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfbW9tZW50IiwiX2ludGVyb3BSZXF1aXJlRGVmYXVsdCIsInJlcXVpcmUiLCJfY29uc3RhbnRzIiwiX2VsZW1lbnRzSW50ZXJhY3Rpb25zIiwiX25hdmlnYXRpb24iLCJfdHJhbnNhY3Rpb25zIiwiX2Jhc2VTY3JhcGVyV2l0aEJyb3dzZXIiLCJlIiwiX19lc01vZHVsZSIsImRlZmF1bHQiLCJCQVNFX1VSTCIsIlRSQU5TQUNUSU9OU19VUkwiLCJEQVRFX0ZPUk1BVCIsIk5PX1RSQU5TQUNUSU9OX0lOX0RBVEVfUkFOR0VfVEVYVCIsIkRBVEVfSEVBREVSIiwiREVTQ1JJUFRJT05fSEVBREVSIiwiUkVGRVJFTkNFX0hFQURFUiIsIkRFQklUX0hFQURFUiIsIkNSRURJVF9IRUFERVIiLCJQRU5ESU5HX1RSQU5TQUNUSU9OU19UQUJMRV9JRCIsIkNPTVBMRVRFRF9UUkFOU0FDVElPTlNfVEFCTEVfSUQiLCJFUlJPUl9NRVNTQUdFX0NMQVNTIiwiQUNDT1VOVFNfRFJPUERPV05fU0VMRUNUT1IiLCJnZXRQb3NzaWJsZUxvZ2luUmVzdWx0cyIsInVybHMiLCJMb2dpblJlc3VsdHMiLCJTdWNjZXNzIiwiSW52YWxpZFBhc3N3b3JkIiwiY3JlYXRlTG9naW5GaWVsZHMiLCJjcmVkZW50aWFscyIsInNlbGVjdG9yIiwidmFsdWUiLCJ1c2VybmFtZSIsInBhc3N3b3JkIiwiZ2V0QW1vdW50RGF0YSIsImFtb3VudFN0ciIsImFtb3VudFN0ckNvcHkiLCJyZXBsYWNlIiwicGFyc2VGbG9hdCIsImdldFR4bkFtb3VudCIsInR4biIsImNyZWRpdCIsImRlYml0IiwiTnVtYmVyIiwiaXNOYU4iLCJjb252ZXJ0VHJhbnNhY3Rpb25zIiwidHhucyIsIm1hcCIsImNvbnZlcnRlZERhdGUiLCJtb21lbnQiLCJkYXRlIiwidG9JU09TdHJpbmciLCJjb252ZXJ0ZWRBbW91bnQiLCJ0eXBlIiwiVHJhbnNhY3Rpb25UeXBlcyIsIk5vcm1hbCIsImlkZW50aWZpZXIiLCJyZWZlcmVuY2UiLCJwYXJzZUludCIsInVuZGVmaW5lZCIsInByb2Nlc3NlZERhdGUiLCJvcmlnaW5hbEFtb3VudCIsIm9yaWdpbmFsQ3VycmVuY3kiLCJTSEVLRUxfQ1VSUkVOQ1kiLCJjaGFyZ2VkQW1vdW50Iiwic3RhdHVzIiwiZGVzY3JpcHRpb24iLCJtZW1vIiwiZ2V0VHJhbnNhY3Rpb25EYXRlIiwidGRzIiwidHhuc1RhYmxlSGVhZGVycyIsInRyaW0iLCJnZXRUcmFuc2FjdGlvbkRlc2NyaXB0aW9uIiwiZ2V0VHJhbnNhY3Rpb25SZWZlcmVuY2UiLCJnZXRUcmFuc2FjdGlvbkRlYml0IiwiZ2V0VHJhbnNhY3Rpb25DcmVkaXQiLCJleHRyYWN0VHJhbnNhY3Rpb25EZXRhaWxzIiwidHhuUm93IiwidHhuU3RhdHVzIiwiaW5uZXJUZHMiLCJpc0V4cGFuZGVkRGVzY1JvdyIsImlkIiwiZWRpdExhc3RUcmFuc2FjdGlvbkRlc2MiLCJsYXN0VHhuIiwiaGFuZGxlVHJhbnNhY3Rpb25Sb3ciLCJ0eG5UeXBlIiwibGFzdFRyYW5zYWN0aW9uIiwicG9wIiwicHVzaCIsIkVycm9yIiwiZ2V0VHJhbnNhY3Rpb25zVGFibGVIZWFkZXJzIiwicGFnZSIsInRhYmxlVHlwZUlkIiwiaGVhZGVyc01hcCIsImhlYWRlcnNPYmpzIiwicGFnZUV2YWxBbGwiLCJ0aHMiLCJ0aCIsImluZGV4IiwidGV4dCIsImlubmVyVGV4dCIsImhlYWRlck9iaiIsImV4dHJhY3RUcmFuc2FjdGlvbnNGcm9tVGFibGUiLCJ0cmFuc2FjdGlvbnNUYWJsZUhlYWRlcnMiLCJ0cmFuc2FjdGlvbnNSb3dzIiwidHJzIiwidHIiLCJnZXRBdHRyaWJ1dGUiLCJBcnJheSIsImZyb20iLCJnZXRFbGVtZW50c0J5VGFnTmFtZSIsInRkIiwiaXNOb1RyYW5zYWN0aW9uSW5EYXRlUmFuZ2VFcnJvciIsImhhc0Vycm9ySW5mb0VsZW1lbnQiLCJlbGVtZW50UHJlc2VudE9uUGFnZSIsImVycm9yVGV4dCIsIiRldmFsIiwiZXJyb3JFbGVtZW50IiwiY2hvb3NlQWNjb3VudCIsImFjY291bnRJZCIsImhhc0Ryb3BEb3duTGlzdCIsImRyb3Bkb3duU2VsZWN0Iiwic2VhcmNoQnlEYXRlcyIsInN0YXJ0RGF0ZSIsIndhaXRVbnRpbEVsZW1lbnRGb3VuZCIsImZpbGxJbnB1dCIsImZvcm1hdCIsImNsaWNrQnV0dG9uIiwid2FpdEZvck5hdmlnYXRpb24iLCJnZXRBY2NvdW50TnVtYmVyIiwic2VsZWN0ZWRTbmlmQWNjb3VudCIsIm9wdGlvbiIsImV4cGFuZFRyYW5zYWN0aW9uc1RhYmxlIiwiaGFzRXhwYW5kQWxsQnV0dG9uIiwic2NyYXBlVHJhbnNhY3Rpb25zRnJvbVRhYmxlIiwicGVuZGluZ1R4bnMiLCJUcmFuc2FjdGlvblN0YXR1c2VzIiwiUGVuZGluZyIsImNvbXBsZXRlZFR4bnMiLCJDb21wbGV0ZWQiLCJnZXRBY2NvdW50VHJhbnNhY3Rpb25zIiwiUHJvbWlzZSIsInJhY2UiLCJub1RyYW5zYWN0aW9uSW5SYW5nZUVycm9yIiwiZmV0Y2hBY2NvdW50RGF0YSIsImFjY291bnROdW1iZXIiLCJmZXRjaEFjY291bnRzIiwiYWNjb3VudHMiLCJhY2NvdW50c0xpc3QiLCJkcm9wZG93bkVsZW1lbnRzIiwiYWNjb3VudCIsImFjY291bnREYXRhIiwid2FpdEZvclBvc3RMb2dpbiIsIlVuaW9uQmFua1NjcmFwZXIiLCJCYXNlU2NyYXBlcldpdGhCcm93c2VyIiwiZ2V0TG9naW5PcHRpb25zIiwibG9naW5VcmwiLCJmaWVsZHMiLCJzdWJtaXRCdXR0b25TZWxlY3RvciIsInBvc3RBY3Rpb24iLCJwb3NzaWJsZVJlc3VsdHMiLCJmZXRjaERhdGEiLCJkZWZhdWx0U3RhcnRNb21lbnQiLCJzdWJ0cmFjdCIsImFkZCIsIm9wdGlvbnMiLCJ0b0RhdGUiLCJzdGFydE1vbWVudCIsIm1heCIsIm5hdmlnYXRlVG8iLCJzdWNjZXNzIiwiX2RlZmF1bHQiLCJleHBvcnRzIl0sInNvdXJjZXMiOlsiLi4vLi4vc3JjL3NjcmFwZXJzL3VuaW9uLWJhbmsudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IG1vbWVudCwgeyB0eXBlIE1vbWVudCB9IGZyb20gJ21vbWVudCc7XG5pbXBvcnQgeyB0eXBlIFBhZ2UgfSBmcm9tICdwdXBwZXRlZXInO1xuaW1wb3J0IHsgU0hFS0VMX0NVUlJFTkNZIH0gZnJvbSAnLi4vY29uc3RhbnRzJztcbmltcG9ydCB7XG4gIGNsaWNrQnV0dG9uLFxuICBkcm9wZG93bkVsZW1lbnRzLFxuICBkcm9wZG93blNlbGVjdCxcbiAgZWxlbWVudFByZXNlbnRPblBhZ2UsXG4gIGZpbGxJbnB1dCxcbiAgcGFnZUV2YWxBbGwsXG4gIHdhaXRVbnRpbEVsZW1lbnRGb3VuZCxcbn0gZnJvbSAnLi4vaGVscGVycy9lbGVtZW50cy1pbnRlcmFjdGlvbnMnO1xuaW1wb3J0IHsgd2FpdEZvck5hdmlnYXRpb24gfSBmcm9tICcuLi9oZWxwZXJzL25hdmlnYXRpb24nO1xuaW1wb3J0IHtcbiAgVHJhbnNhY3Rpb25TdGF0dXNlcyxcbiAgVHJhbnNhY3Rpb25UeXBlcyxcbiAgdHlwZSBUcmFuc2FjdGlvbixcbiAgdHlwZSBUcmFuc2FjdGlvbnNBY2NvdW50LFxufSBmcm9tICcuLi90cmFuc2FjdGlvbnMnO1xuaW1wb3J0IHsgQmFzZVNjcmFwZXJXaXRoQnJvd3NlciwgTG9naW5SZXN1bHRzLCB0eXBlIFBvc3NpYmxlTG9naW5SZXN1bHRzIH0gZnJvbSAnLi9iYXNlLXNjcmFwZXItd2l0aC1icm93c2VyJztcblxuY29uc3QgQkFTRV9VUkwgPSAnaHR0cHM6Ly9oYi51bmlvbmJhbmsuY28uaWwnO1xuY29uc3QgVFJBTlNBQ1RJT05TX1VSTCA9IGAke0JBU0VfVVJMfS9lQmFua2luZy9BY2NvdW50cy9FeHRlbmRlZEFjdGl2aXR5LmFzcHgjL2A7XG5jb25zdCBEQVRFX0ZPUk1BVCA9ICdERC9NTS9ZWSc7XG5jb25zdCBOT19UUkFOU0FDVElPTl9JTl9EQVRFX1JBTkdFX1RFWFQgPSAn15zXkCDXp9eZ15nXnteV16og16rXoNeV16LXldeqINee16rXkNeZ157XldeqINei15wg16TXmSDXlNeh15nXoNeV158g16nXlNeV15LXk9eoJztcbmNvbnN0IERBVEVfSEVBREVSID0gJ9eq15DXqNeZ15onO1xuY29uc3QgREVTQ1JJUFRJT05fSEVBREVSID0gJ9eq15nXkNeV16gnO1xuY29uc3QgUkVGRVJFTkNFX0hFQURFUiA9ICfXkNeh157Xm9eq15AnO1xuY29uc3QgREVCSVRfSEVBREVSID0gJ9eX15XXkdeUJztcbmNvbnN0IENSRURJVF9IRUFERVIgPSAn15bXm9eV16onO1xuY29uc3QgUEVORElOR19UUkFOU0FDVElPTlNfVEFCTEVfSUQgPSAndHJUb2RheUFjdGl2aXR5TmFwYVRhYmxlVXBwZXInO1xuY29uc3QgQ09NUExFVEVEX1RSQU5TQUNUSU9OU19UQUJMRV9JRCA9ICdjdGxBY3Rpdml0eVRhYmxlJztcbmNvbnN0IEVSUk9SX01FU1NBR0VfQ0xBU1MgPSAnZXJySW5mbyc7XG5jb25zdCBBQ0NPVU5UU19EUk9QRE9XTl9TRUxFQ1RPUiA9ICdzZWxlY3QjZGRsQWNjb3VudHNfbV9kZGwnO1xuXG5mdW5jdGlvbiBnZXRQb3NzaWJsZUxvZ2luUmVzdWx0cygpIHtcbiAgY29uc3QgdXJsczogUG9zc2libGVMb2dpblJlc3VsdHMgPSB7fTtcbiAgdXJsc1tMb2dpblJlc3VsdHMuU3VjY2Vzc10gPSBbL2VCYW5raW5nXFwvQWNjb3VudHMvXTtcbiAgdXJsc1tMb2dpblJlc3VsdHMuSW52YWxpZFBhc3N3b3JkXSA9IFsvSW50ZXJuYWxTaXRlXFwvQ3VzdG9tVXBkYXRlXFwvbGV1bWlcXC9Mb2dpblBhZ2UuQVNQL107XG4gIHJldHVybiB1cmxzO1xufVxuXG5mdW5jdGlvbiBjcmVhdGVMb2dpbkZpZWxkcyhjcmVkZW50aWFsczogU2NyYXBlclNwZWNpZmljQ3JlZGVudGlhbHMpIHtcbiAgcmV0dXJuIFtcbiAgICB7IHNlbGVjdG9yOiAnI3VpZCcsIHZhbHVlOiBjcmVkZW50aWFscy51c2VybmFtZSB9LFxuICAgIHsgc2VsZWN0b3I6ICcjcGFzc3dvcmQnLCB2YWx1ZTogY3JlZGVudGlhbHMucGFzc3dvcmQgfSxcbiAgXTtcbn1cblxuZnVuY3Rpb24gZ2V0QW1vdW50RGF0YShhbW91bnRTdHI6IHN0cmluZykge1xuICBjb25zdCBhbW91bnRTdHJDb3B5ID0gYW1vdW50U3RyLnJlcGxhY2UoJywnLCAnJyk7XG4gIHJldHVybiBwYXJzZUZsb2F0KGFtb3VudFN0ckNvcHkpO1xufVxuXG5pbnRlcmZhY2UgU2NyYXBlZFRyYW5zYWN0aW9uIHtcbiAgY3JlZGl0OiBzdHJpbmc7XG4gIGRlYml0OiBzdHJpbmc7XG4gIGRhdGU6IHN0cmluZztcbiAgcmVmZXJlbmNlPzogc3RyaW5nO1xuICBkZXNjcmlwdGlvbjogc3RyaW5nO1xuICBtZW1vOiBzdHJpbmc7XG4gIHN0YXR1czogVHJhbnNhY3Rpb25TdGF0dXNlcztcbn1cblxuZnVuY3Rpb24gZ2V0VHhuQW1vdW50KHR4bjogU2NyYXBlZFRyYW5zYWN0aW9uKSB7XG4gIGNvbnN0IGNyZWRpdCA9IGdldEFtb3VudERhdGEodHhuLmNyZWRpdCk7XG4gIGNvbnN0IGRlYml0ID0gZ2V0QW1vdW50RGF0YSh0eG4uZGViaXQpO1xuICByZXR1cm4gKE51bWJlci5pc05hTihjcmVkaXQpID8gMCA6IGNyZWRpdCkgLSAoTnVtYmVyLmlzTmFOKGRlYml0KSA/IDAgOiBkZWJpdCk7XG59XG5cbmZ1bmN0aW9uIGNvbnZlcnRUcmFuc2FjdGlvbnModHhuczogU2NyYXBlZFRyYW5zYWN0aW9uW10pOiBUcmFuc2FjdGlvbltdIHtcbiAgcmV0dXJuIHR4bnMubWFwKCh0eG4pID0+IHtcbiAgICBjb25zdCBjb252ZXJ0ZWREYXRlID0gbW9tZW50KHR4bi5kYXRlLCBEQVRFX0ZPUk1BVCkudG9JU09TdHJpbmcoKTtcbiAgICBjb25zdCBjb252ZXJ0ZWRBbW91bnQgPSBnZXRUeG5BbW91bnQodHhuKTtcbiAgICByZXR1cm4ge1xuICAgICAgdHlwZTogVHJhbnNhY3Rpb25UeXBlcy5Ob3JtYWwsXG4gICAgICBpZGVudGlmaWVyOiB0eG4ucmVmZXJlbmNlID8gcGFyc2VJbnQodHhuLnJlZmVyZW5jZSwgMTApIDogdW5kZWZpbmVkLFxuICAgICAgZGF0ZTogY29udmVydGVkRGF0ZSxcbiAgICAgIHByb2Nlc3NlZERhdGU6IGNvbnZlcnRlZERhdGUsXG4gICAgICBvcmlnaW5hbEFtb3VudDogY29udmVydGVkQW1vdW50LFxuICAgICAgb3JpZ2luYWxDdXJyZW5jeTogU0hFS0VMX0NVUlJFTkNZLFxuICAgICAgY2hhcmdlZEFtb3VudDogY29udmVydGVkQW1vdW50LFxuICAgICAgc3RhdHVzOiB0eG4uc3RhdHVzLFxuICAgICAgZGVzY3JpcHRpb246IHR4bi5kZXNjcmlwdGlvbixcbiAgICAgIG1lbW86IHR4bi5tZW1vLFxuICAgIH07XG4gIH0pO1xufVxuXG50eXBlIFRyYW5zYWN0aW9uc1RyID0geyBpZDogc3RyaW5nLCBpbm5lclRkczogVHJhbnNhY3Rpb25zVHJUZHMgfTtcbnR5cGUgVHJhbnNhY3Rpb25UYWJsZUhlYWRlcnMgPSBSZWNvcmQ8c3RyaW5nLCBudW1iZXI+O1xudHlwZSBUcmFuc2FjdGlvbnNUclRkcyA9IHN0cmluZ1tdO1xuXG5mdW5jdGlvbiBnZXRUcmFuc2FjdGlvbkRhdGUodGRzOiBUcmFuc2FjdGlvbnNUclRkcywgdHhuc1RhYmxlSGVhZGVyczogVHJhbnNhY3Rpb25UYWJsZUhlYWRlcnMpIHtcbiAgcmV0dXJuICh0ZHNbdHhuc1RhYmxlSGVhZGVyc1tEQVRFX0hFQURFUl1dIHx8ICcnKS50cmltKCk7XG59XG5cbmZ1bmN0aW9uIGdldFRyYW5zYWN0aW9uRGVzY3JpcHRpb24odGRzOiBUcmFuc2FjdGlvbnNUclRkcywgdHhuc1RhYmxlSGVhZGVyczogVHJhbnNhY3Rpb25UYWJsZUhlYWRlcnMpIHtcbiAgcmV0dXJuICh0ZHNbdHhuc1RhYmxlSGVhZGVyc1tERVNDUklQVElPTl9IRUFERVJdXSB8fCAnJykudHJpbSgpO1xufVxuXG5mdW5jdGlvbiBnZXRUcmFuc2FjdGlvblJlZmVyZW5jZSh0ZHM6IFRyYW5zYWN0aW9uc1RyVGRzLCB0eG5zVGFibGVIZWFkZXJzOiBUcmFuc2FjdGlvblRhYmxlSGVhZGVycykge1xuICByZXR1cm4gKHRkc1t0eG5zVGFibGVIZWFkZXJzW1JFRkVSRU5DRV9IRUFERVJdXSB8fCAnJykudHJpbSgpO1xufVxuXG5mdW5jdGlvbiBnZXRUcmFuc2FjdGlvbkRlYml0KHRkczogVHJhbnNhY3Rpb25zVHJUZHMsIHR4bnNUYWJsZUhlYWRlcnM6IFRyYW5zYWN0aW9uVGFibGVIZWFkZXJzKSB7XG4gIHJldHVybiAodGRzW3R4bnNUYWJsZUhlYWRlcnNbREVCSVRfSEVBREVSXV0gfHwgJycpLnRyaW0oKTtcbn1cblxuZnVuY3Rpb24gZ2V0VHJhbnNhY3Rpb25DcmVkaXQodGRzOiBUcmFuc2FjdGlvbnNUclRkcywgdHhuc1RhYmxlSGVhZGVyczogVHJhbnNhY3Rpb25UYWJsZUhlYWRlcnMpIHtcbiAgcmV0dXJuICh0ZHNbdHhuc1RhYmxlSGVhZGVyc1tDUkVESVRfSEVBREVSXV0gfHwgJycpLnRyaW0oKTtcbn1cblxuZnVuY3Rpb24gZXh0cmFjdFRyYW5zYWN0aW9uRGV0YWlscyh0eG5Sb3c6IFRyYW5zYWN0aW9uc1RyLCB0eG5zVGFibGVIZWFkZXJzOiBUcmFuc2FjdGlvblRhYmxlSGVhZGVycywgdHhuU3RhdHVzOiBUcmFuc2FjdGlvblN0YXR1c2VzKTogU2NyYXBlZFRyYW5zYWN0aW9uIHtcbiAgY29uc3QgdGRzID0gdHhuUm93LmlubmVyVGRzO1xuICByZXR1cm4ge1xuICAgIHN0YXR1czogdHhuU3RhdHVzLFxuICAgIGRhdGU6IGdldFRyYW5zYWN0aW9uRGF0ZSh0ZHMsIHR4bnNUYWJsZUhlYWRlcnMpLFxuICAgIGRlc2NyaXB0aW9uOiBnZXRUcmFuc2FjdGlvbkRlc2NyaXB0aW9uKHRkcywgdHhuc1RhYmxlSGVhZGVycyksXG4gICAgcmVmZXJlbmNlOiBnZXRUcmFuc2FjdGlvblJlZmVyZW5jZSh0ZHMsIHR4bnNUYWJsZUhlYWRlcnMpLFxuICAgIGRlYml0OiBnZXRUcmFuc2FjdGlvbkRlYml0KHRkcywgdHhuc1RhYmxlSGVhZGVycyksXG4gICAgY3JlZGl0OiBnZXRUcmFuc2FjdGlvbkNyZWRpdCh0ZHMsIHR4bnNUYWJsZUhlYWRlcnMpLFxuICAgIG1lbW86ICcnLFxuICB9O1xufVxuXG5mdW5jdGlvbiBpc0V4cGFuZGVkRGVzY1Jvdyh0eG5Sb3c6IFRyYW5zYWN0aW9uc1RyKSB7XG4gIHJldHVybiB0eG5Sb3cuaWQgPT09ICdyb3dBZGRlZCc7XG59XG5cbi8qIGVzbGludC1kaXNhYmxlIG5vLXBhcmFtLXJlYXNzaWduICovXG5mdW5jdGlvbiBlZGl0TGFzdFRyYW5zYWN0aW9uRGVzYyh0eG5Sb3c6IFRyYW5zYWN0aW9uc1RyLCBsYXN0VHhuOiBTY3JhcGVkVHJhbnNhY3Rpb24pOiBTY3JhcGVkVHJhbnNhY3Rpb24ge1xuICBsYXN0VHhuLmRlc2NyaXB0aW9uID0gYCR7bGFzdFR4bi5kZXNjcmlwdGlvbn0gJHt0eG5Sb3cuaW5uZXJUZHNbMF19YDtcbiAgcmV0dXJuIGxhc3RUeG47XG59XG5cbmZ1bmN0aW9uIGhhbmRsZVRyYW5zYWN0aW9uUm93KHR4bnM6IFNjcmFwZWRUcmFuc2FjdGlvbltdLCB0eG5zVGFibGVIZWFkZXJzOiBUcmFuc2FjdGlvblRhYmxlSGVhZGVycywgdHhuUm93OiBUcmFuc2FjdGlvbnNUciwgdHhuVHlwZTogVHJhbnNhY3Rpb25TdGF0dXNlcykge1xuICBpZiAoaXNFeHBhbmRlZERlc2NSb3codHhuUm93KSkge1xuICAgIGNvbnN0IGxhc3RUcmFuc2FjdGlvbiA9IHR4bnMucG9wKCk7XG4gICAgaWYgKGxhc3RUcmFuc2FjdGlvbikge1xuICAgICAgdHhucy5wdXNoKGVkaXRMYXN0VHJhbnNhY3Rpb25EZXNjKHR4blJvdywgbGFzdFRyYW5zYWN0aW9uKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignaW50ZXJuYWwgdW5pb24tYmFuayBlcnJvcicpO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICB0eG5zLnB1c2goZXh0cmFjdFRyYW5zYWN0aW9uRGV0YWlscyh0eG5Sb3csIHR4bnNUYWJsZUhlYWRlcnMsIHR4blR5cGUpKTtcbiAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiBnZXRUcmFuc2FjdGlvbnNUYWJsZUhlYWRlcnMocGFnZTogUGFnZSwgdGFibGVUeXBlSWQ6IHN0cmluZykge1xuICBjb25zdCBoZWFkZXJzTWFwOiBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0gW107XG4gIGNvbnN0IGhlYWRlcnNPYmpzID0gYXdhaXQgcGFnZUV2YWxBbGwocGFnZSwgYCNXb3JrU3BhY2VCb3ggIyR7dGFibGVUeXBlSWR9IHRyW2NsYXNzPSdoZWFkZXInXSB0aGAsIG51bGwsICh0aHMpID0+IHtcbiAgICByZXR1cm4gdGhzLm1hcCgodGgsIGluZGV4KSA9PiAoe1xuICAgICAgdGV4dDogKHRoIGFzIEhUTUxFbGVtZW50KS5pbm5lclRleHQudHJpbSgpLFxuICAgICAgaW5kZXgsXG4gICAgfSkpO1xuICB9KTtcblxuICBmb3IgKGNvbnN0IGhlYWRlck9iaiBvZiBoZWFkZXJzT2Jqcykge1xuICAgIGhlYWRlcnNNYXBbaGVhZGVyT2JqLnRleHRdID0gaGVhZGVyT2JqLmluZGV4O1xuICB9XG4gIHJldHVybiBoZWFkZXJzTWFwO1xufVxuXG5hc3luYyBmdW5jdGlvbiBleHRyYWN0VHJhbnNhY3Rpb25zRnJvbVRhYmxlKHBhZ2U6IFBhZ2UsIHRhYmxlVHlwZUlkOiBzdHJpbmcsIHR4blR5cGU6IFRyYW5zYWN0aW9uU3RhdHVzZXMpOiBQcm9taXNlPFNjcmFwZWRUcmFuc2FjdGlvbltdPiB7XG4gIGNvbnN0IHR4bnM6IFNjcmFwZWRUcmFuc2FjdGlvbltdID0gW107XG4gIGNvbnN0IHRyYW5zYWN0aW9uc1RhYmxlSGVhZGVycyA9IGF3YWl0IGdldFRyYW5zYWN0aW9uc1RhYmxlSGVhZGVycyhwYWdlLCB0YWJsZVR5cGVJZCk7XG5cbiAgY29uc3QgdHJhbnNhY3Rpb25zUm93cyA9IGF3YWl0IHBhZ2VFdmFsQWxsPFRyYW5zYWN0aW9uc1RyW10+KHBhZ2UsIGAjV29ya1NwYWNlQm94ICMke3RhYmxlVHlwZUlkfSB0cltjbGFzc106bm90KFtjbGFzcz0naGVhZGVyJ10pYCwgW10sICh0cnMpID0+IHtcbiAgICByZXR1cm4gKHRycyBhcyBIVE1MRWxlbWVudFtdKS5tYXAoKHRyKSA9PiAoe1xuICAgICAgaWQ6ICh0cikuZ2V0QXR0cmlidXRlKCdpZCcpIHx8ICcnLFxuICAgICAgaW5uZXJUZHM6IEFycmF5LmZyb20odHIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ3RkJykpLm1hcCgodGQpID0+ICh0ZCBhcyBIVE1MRWxlbWVudCkuaW5uZXJUZXh0KSxcbiAgICB9KSk7XG4gIH0pO1xuXG4gIGZvciAoY29uc3QgdHhuUm93IG9mIHRyYW5zYWN0aW9uc1Jvd3MpIHtcbiAgICBoYW5kbGVUcmFuc2FjdGlvblJvdyh0eG5zLCB0cmFuc2FjdGlvbnNUYWJsZUhlYWRlcnMsIHR4blJvdywgdHhuVHlwZSk7XG4gIH1cbiAgcmV0dXJuIHR4bnM7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGlzTm9UcmFuc2FjdGlvbkluRGF0ZVJhbmdlRXJyb3IocGFnZTogUGFnZSkge1xuICBjb25zdCBoYXNFcnJvckluZm9FbGVtZW50ID0gYXdhaXQgZWxlbWVudFByZXNlbnRPblBhZ2UocGFnZSwgYC4ke0VSUk9SX01FU1NBR0VfQ0xBU1N9YCk7XG4gIGlmIChoYXNFcnJvckluZm9FbGVtZW50KSB7XG4gICAgY29uc3QgZXJyb3JUZXh0ID0gYXdhaXQgcGFnZS4kZXZhbChgLiR7RVJST1JfTUVTU0FHRV9DTEFTU31gLCAoZXJyb3JFbGVtZW50KSA9PiB7XG4gICAgICByZXR1cm4gKGVycm9yRWxlbWVudCBhcyBIVE1MRWxlbWVudCkuaW5uZXJUZXh0O1xuICAgIH0pO1xuICAgIHJldHVybiBlcnJvclRleHQudHJpbSgpID09PSBOT19UUkFOU0FDVElPTl9JTl9EQVRFX1JBTkdFX1RFWFQ7XG4gIH1cbiAgcmV0dXJuIGZhbHNlO1xufVxuXG5hc3luYyBmdW5jdGlvbiBjaG9vc2VBY2NvdW50KHBhZ2U6IFBhZ2UsIGFjY291bnRJZDogc3RyaW5nKSB7XG4gIGNvbnN0IGhhc0Ryb3BEb3duTGlzdCA9IGF3YWl0IGVsZW1lbnRQcmVzZW50T25QYWdlKHBhZ2UsIEFDQ09VTlRTX0RST1BET1dOX1NFTEVDVE9SKTtcbiAgaWYgKGhhc0Ryb3BEb3duTGlzdCkge1xuICAgIGF3YWl0IGRyb3Bkb3duU2VsZWN0KHBhZ2UsIEFDQ09VTlRTX0RST1BET1dOX1NFTEVDVE9SLCBhY2NvdW50SWQpO1xuICB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHNlYXJjaEJ5RGF0ZXMocGFnZTogUGFnZSwgc3RhcnREYXRlOiBNb21lbnQpIHtcbiAgYXdhaXQgZHJvcGRvd25TZWxlY3QocGFnZSwgJ3NlbGVjdCNkZGxUcmFuc2FjdGlvblBlcmlvZCcsICcwMDQnKTtcbiAgYXdhaXQgd2FpdFVudGlsRWxlbWVudEZvdW5kKHBhZ2UsICdzZWxlY3QjZGRsVHJhbnNhY3Rpb25QZXJpb2QnKTtcbiAgYXdhaXQgZmlsbElucHV0KFxuICAgIHBhZ2UsXG4gICAgJ2lucHV0I2R0RnJvbURhdGVfdGV4dEJveCcsXG4gICAgc3RhcnREYXRlLmZvcm1hdChEQVRFX0ZPUk1BVCksXG4gICk7XG4gIGF3YWl0IGNsaWNrQnV0dG9uKHBhZ2UsICdpbnB1dCNidG5EaXNwbGF5RGF0ZXMnKTtcbiAgYXdhaXQgd2FpdEZvck5hdmlnYXRpb24ocGFnZSk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGdldEFjY291bnROdW1iZXIocGFnZTogUGFnZSkge1xuICBjb25zdCBzZWxlY3RlZFNuaWZBY2NvdW50ID0gYXdhaXQgcGFnZS4kZXZhbCgnI2RkbEFjY291bnRzX21fZGRsIG9wdGlvbltzZWxlY3RlZD1cInNlbGVjdGVkXCJdJywgKG9wdGlvbikgPT4ge1xuICAgIHJldHVybiAob3B0aW9uIGFzIEhUTUxFbGVtZW50KS5pbm5lclRleHQ7XG4gIH0pO1xuXG4gIHJldHVybiBzZWxlY3RlZFNuaWZBY2NvdW50LnJlcGxhY2UoJy8nLCAnXycpO1xufVxuXG5hc3luYyBmdW5jdGlvbiBleHBhbmRUcmFuc2FjdGlvbnNUYWJsZShwYWdlOiBQYWdlKSB7XG4gIGNvbnN0IGhhc0V4cGFuZEFsbEJ1dHRvbiA9IGF3YWl0IGVsZW1lbnRQcmVzZW50T25QYWdlKHBhZ2UsIFwiYVtpZCo9J2xua0N0bEV4cGFuZEFsbCddXCIpO1xuICBpZiAoaGFzRXhwYW5kQWxsQnV0dG9uKSB7XG4gICAgYXdhaXQgY2xpY2tCdXR0b24ocGFnZSwgXCJhW2lkKj0nbG5rQ3RsRXhwYW5kQWxsJ11cIik7XG4gIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gc2NyYXBlVHJhbnNhY3Rpb25zRnJvbVRhYmxlKHBhZ2U6IFBhZ2UpOiBQcm9taXNlPFRyYW5zYWN0aW9uW10+IHtcbiAgY29uc3QgcGVuZGluZ1R4bnMgPSBhd2FpdCBleHRyYWN0VHJhbnNhY3Rpb25zRnJvbVRhYmxlKHBhZ2UsIFBFTkRJTkdfVFJBTlNBQ1RJT05TX1RBQkxFX0lELFxuICAgIFRyYW5zYWN0aW9uU3RhdHVzZXMuUGVuZGluZyk7XG4gIGNvbnN0IGNvbXBsZXRlZFR4bnMgPSBhd2FpdCBleHRyYWN0VHJhbnNhY3Rpb25zRnJvbVRhYmxlKHBhZ2UsIENPTVBMRVRFRF9UUkFOU0FDVElPTlNfVEFCTEVfSUQsXG4gICAgVHJhbnNhY3Rpb25TdGF0dXNlcy5Db21wbGV0ZWQpO1xuICBjb25zdCB0eG5zID0gW1xuICAgIC4uLnBlbmRpbmdUeG5zLFxuICAgIC4uLmNvbXBsZXRlZFR4bnMsXG4gIF07XG4gIHJldHVybiBjb252ZXJ0VHJhbnNhY3Rpb25zKHR4bnMpO1xufVxuXG5hc3luYyBmdW5jdGlvbiBnZXRBY2NvdW50VHJhbnNhY3Rpb25zKHBhZ2U6IFBhZ2UpOiBQcm9taXNlPFRyYW5zYWN0aW9uW10+IHtcbiAgYXdhaXQgUHJvbWlzZS5yYWNlKFtcbiAgICB3YWl0VW50aWxFbGVtZW50Rm91bmQocGFnZSwgYCMke0NPTVBMRVRFRF9UUkFOU0FDVElPTlNfVEFCTEVfSUR9YCwgZmFsc2UpLFxuICAgIHdhaXRVbnRpbEVsZW1lbnRGb3VuZChwYWdlLCBgLiR7RVJST1JfTUVTU0FHRV9DTEFTU31gLCBmYWxzZSksXG4gIF0pO1xuXG4gIGNvbnN0IG5vVHJhbnNhY3Rpb25JblJhbmdlRXJyb3IgPSBhd2FpdCBpc05vVHJhbnNhY3Rpb25JbkRhdGVSYW5nZUVycm9yKHBhZ2UpO1xuICBpZiAobm9UcmFuc2FjdGlvbkluUmFuZ2VFcnJvcikge1xuICAgIHJldHVybiBbXTtcbiAgfVxuXG4gIGF3YWl0IGV4cGFuZFRyYW5zYWN0aW9uc1RhYmxlKHBhZ2UpO1xuICByZXR1cm4gc2NyYXBlVHJhbnNhY3Rpb25zRnJvbVRhYmxlKHBhZ2UpO1xufVxuXG5hc3luYyBmdW5jdGlvbiBmZXRjaEFjY291bnREYXRhKHBhZ2U6IFBhZ2UsIHN0YXJ0RGF0ZTogTW9tZW50LCBhY2NvdW50SWQ6IHN0cmluZyk6IFByb21pc2U8VHJhbnNhY3Rpb25zQWNjb3VudD4ge1xuICBhd2FpdCBjaG9vc2VBY2NvdW50KHBhZ2UsIGFjY291bnRJZCk7XG4gIGF3YWl0IHNlYXJjaEJ5RGF0ZXMocGFnZSwgc3RhcnREYXRlKTtcbiAgY29uc3QgYWNjb3VudE51bWJlciA9IGF3YWl0IGdldEFjY291bnROdW1iZXIocGFnZSk7XG4gIGNvbnN0IHR4bnMgPSBhd2FpdCBnZXRBY2NvdW50VHJhbnNhY3Rpb25zKHBhZ2UpO1xuICByZXR1cm4ge1xuICAgIGFjY291bnROdW1iZXIsXG4gICAgdHhucyxcbiAgfTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gZmV0Y2hBY2NvdW50cyhwYWdlOiBQYWdlLCBzdGFydERhdGU6IE1vbWVudCkge1xuICBjb25zdCBhY2NvdW50czogVHJhbnNhY3Rpb25zQWNjb3VudFtdID0gW107XG4gIGNvbnN0IGFjY291bnRzTGlzdCA9IGF3YWl0IGRyb3Bkb3duRWxlbWVudHMocGFnZSwgQUNDT1VOVFNfRFJPUERPV05fU0VMRUNUT1IpO1xuICBmb3IgKGNvbnN0IGFjY291bnQgb2YgYWNjb3VudHNMaXN0KSB7XG4gICAgaWYgKGFjY291bnQudmFsdWUgIT09ICctMScpIHsgLy8gU2tpcCBcIkFsbCBhY2NvdW50c1wiIG9wdGlvblxuICAgICAgY29uc3QgYWNjb3VudERhdGEgPSBhd2FpdCBmZXRjaEFjY291bnREYXRhKHBhZ2UsIHN0YXJ0RGF0ZSwgYWNjb3VudC52YWx1ZSk7XG4gICAgICBhY2NvdW50cy5wdXNoKGFjY291bnREYXRhKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGFjY291bnRzO1xufVxuXG5hc3luYyBmdW5jdGlvbiB3YWl0Rm9yUG9zdExvZ2luKHBhZ2U6IFBhZ2UpIHtcbiAgcmV0dXJuIFByb21pc2UucmFjZShbXG4gICAgd2FpdFVudGlsRWxlbWVudEZvdW5kKHBhZ2UsICcjc2lnbm9mZicsIHRydWUpLFxuICAgIHdhaXRVbnRpbEVsZW1lbnRGb3VuZChwYWdlLCAnI3Jlc3RvcmUnLCB0cnVlKSxcbiAgXSk7XG59XG5cbnR5cGUgU2NyYXBlclNwZWNpZmljQ3JlZGVudGlhbHMgPSB7IHVzZXJuYW1lOiBzdHJpbmcsIHBhc3N3b3JkOiBzdHJpbmcgfTtcblxuY2xhc3MgVW5pb25CYW5rU2NyYXBlciBleHRlbmRzIEJhc2VTY3JhcGVyV2l0aEJyb3dzZXI8U2NyYXBlclNwZWNpZmljQ3JlZGVudGlhbHM+IHtcbiAgZ2V0TG9naW5PcHRpb25zKGNyZWRlbnRpYWxzOiBTY3JhcGVyU3BlY2lmaWNDcmVkZW50aWFscykge1xuICAgIHJldHVybiB7XG4gICAgICBsb2dpblVybDogYCR7QkFTRV9VUkx9YCxcbiAgICAgIGZpZWxkczogY3JlYXRlTG9naW5GaWVsZHMoY3JlZGVudGlhbHMpLFxuICAgICAgc3VibWl0QnV0dG9uU2VsZWN0b3I6ICcjZW50ZXInLFxuICAgICAgcG9zdEFjdGlvbjogYXN5bmMgKCkgPT4gd2FpdEZvclBvc3RMb2dpbih0aGlzLnBhZ2UpLFxuICAgICAgcG9zc2libGVSZXN1bHRzOiBnZXRQb3NzaWJsZUxvZ2luUmVzdWx0cygpLFxuICAgIH07XG4gIH1cblxuICBhc3luYyBmZXRjaERhdGEoKSB7XG4gICAgY29uc3QgZGVmYXVsdFN0YXJ0TW9tZW50ID0gbW9tZW50KCkuc3VidHJhY3QoMSwgJ3llYXJzJykuYWRkKDEsICdkYXknKTtcbiAgICBjb25zdCBzdGFydERhdGUgPSB0aGlzLm9wdGlvbnMuc3RhcnREYXRlIHx8IGRlZmF1bHRTdGFydE1vbWVudC50b0RhdGUoKTtcbiAgICBjb25zdCBzdGFydE1vbWVudCA9IG1vbWVudC5tYXgoZGVmYXVsdFN0YXJ0TW9tZW50LCBtb21lbnQoc3RhcnREYXRlKSk7XG5cbiAgICBhd2FpdCB0aGlzLm5hdmlnYXRlVG8oVFJBTlNBQ1RJT05TX1VSTCk7XG5cbiAgICBjb25zdCBhY2NvdW50cyA9IGF3YWl0IGZldGNoQWNjb3VudHModGhpcy5wYWdlLCBzdGFydE1vbWVudCk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgc3VjY2VzczogdHJ1ZSxcbiAgICAgIGFjY291bnRzLFxuICAgIH07XG4gIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgVW5pb25CYW5rU2NyYXBlcjtcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7O0FBQUEsSUFBQUEsT0FBQSxHQUFBQyxzQkFBQSxDQUFBQyxPQUFBO0FBRUEsSUFBQUMsVUFBQSxHQUFBRCxPQUFBO0FBQ0EsSUFBQUUscUJBQUEsR0FBQUYsT0FBQTtBQVNBLElBQUFHLFdBQUEsR0FBQUgsT0FBQTtBQUNBLElBQUFJLGFBQUEsR0FBQUosT0FBQTtBQU1BLElBQUFLLHVCQUFBLEdBQUFMLE9BQUE7QUFBOEcsU0FBQUQsdUJBQUFPLENBQUEsV0FBQUEsQ0FBQSxJQUFBQSxDQUFBLENBQUFDLFVBQUEsR0FBQUQsQ0FBQSxLQUFBRSxPQUFBLEVBQUFGLENBQUE7QUFFOUcsTUFBTUcsUUFBUSxHQUFHLDRCQUE0QjtBQUM3QyxNQUFNQyxnQkFBZ0IsR0FBRyxHQUFHRCxRQUFRLDRDQUE0QztBQUNoRixNQUFNRSxXQUFXLEdBQUcsVUFBVTtBQUM5QixNQUFNQyxpQ0FBaUMsR0FBRyw4Q0FBOEM7QUFDeEYsTUFBTUMsV0FBVyxHQUFHLE9BQU87QUFDM0IsTUFBTUMsa0JBQWtCLEdBQUcsT0FBTztB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
240
+ exports.default = UnionBankScraper;
241
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidW5pb24tYmFuay5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9zY3JhcGVycy91bmlvbi1iYW5rLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEsb0RBQTZDO0FBRTdDLDRDQUErQztBQUMvQyw0RUFRMEM7QUFDMUMsc0RBQTBEO0FBQzFELGtEQUFvSDtBQUNwSCwyRUFBOEc7QUFFOUcsTUFBTSxRQUFRLEdBQUcsNEJBQTRCLENBQUM7QUFDOUMsTUFBTSxnQkFBZ0IsR0FBRyxHQUFHLFFBQVEsNENBQTRDLENBQUM7QUFDakYsTUFBTSxXQUFXLEdBQUcsVUFBVSxDQUFDO0FBQy9CLE1BQU0saUNBQWlDLEdBQUcsOENBQThDLENBQUM7QUFDekYsTUFBTSxXQUFXLEdBQUcsT0FBTyxDQUFDO0FBQzVCLE1BQU0sa0JBQWtCLEdBQUcsT0FBTyxDQUFDO0FBQ25DLE1BQU0sZ0JBQWdCLEdBQUcsUUFBUSxDQUFDO0FBQ2xDLE1BQU0sWUFBWSxHQUFHLE1BQU0sQ0FBQztBQUM1QixNQUFNLGFBQWEsR0FBRyxNQUFNLENBQUM7QUFDN0IsTUFBTSw2QkFBNkIsR0FBRywrQkFBK0IsQ0FBQztBQUN0RSxNQUFNLCtCQUErQixHQUFHLGtCQUFrQixDQUFDO0FBQzNELE1BQU0sbUJBQW1CLEdBQUcsU0FBUyxDQUFDO0FBQ3RDLE1BQU0sMEJBQTBCLEdBQUcsMEJBQTBCLENBQUM7QUFFOUQsU0FBUyx1QkFBdUI7SUFDOUIsTUFBTSxJQUFJLEdBQXlCLEVBQUUsQ0FBQztJQUN0QyxJQUFJLENBQUMsd0NBQVksQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLG9CQUFvQixDQUFDLENBQUM7SUFDcEQsSUFBSSxDQUFDLHdDQUFZLENBQUMsZUFBZSxDQUFDLEdBQUcsQ0FBQyxrREFBa0QsQ0FBQyxDQUFDO0lBQzFGLE9BQU8sSUFBSSxDQUFDO0FBQ2QsQ0FBQztBQUVELFNBQVMsaUJBQWlCLENBQUMsV0FBdUM7SUFDaEUsT0FBTztRQUNMLEVBQUUsUUFBUSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsV0FBVyxDQUFDLFFBQVEsRUFBRTtRQUNqRCxFQUFFLFFBQVEsRUFBRSxXQUFXLEVBQUUsS0FBSyxFQUFFLFdBQVcsQ0FBQyxRQUFRLEVBQUU7S0FDdkQsQ0FBQztBQUNKLENBQUM7QUFFRCxTQUFTLGFBQWEsQ0FBQyxTQUFpQjtJQUN0QyxNQUFNLGFBQWEsR0FBRyxTQUFTLENBQUMsT0FBTyxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsQ0FBQztJQUNqRCxPQUFPLFVBQVUsQ0FBQyxhQUFhLENBQUMsQ0FBQztBQUNuQyxDQUFDO0FBWUQsU0FBUyxZQUFZLENBQUMsR0FBdUI7SUFDM0MsTUFBTSxNQUFNLEdBQUcsYUFBYSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUN6QyxNQUFNLEtBQUssR0FBRyxhQUFhLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ3ZDLE9BQU8sQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQztBQUNqRixDQUFDO0FBRUQsU0FBUyxtQkFBbUIsQ0FBQyxJQUEwQjtJQUNyRCxPQUFPLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUU7UUFDcEIsTUFBTSxhQUFhLEdBQUcsSUFBQSxnQkFBTSxFQUFDLEdBQUcsQ0FBQyxJQUFJLEVBQUUsV0FBVyxDQUFDLENBQUMsV0FBVyxFQUFFLENBQUM7UUFDbEUsTUFBTSxlQUFlLEdBQUcsWUFBWSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQzFDLE9BQU87WUFDTCxJQUFJLEVBQUUsK0JBQWdCLENBQUMsTUFBTTtZQUM3QixVQUFVLEVBQUUsR0FBRyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxTQUFTLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVM7WUFDbkUsSUFBSSxFQUFFLGFBQWE7WUFDbkIsYUFBYSxFQUFFLGFBQWE7WUFDNUIsY0FBYyxFQUFFLGVBQWU7WUFDL0IsZ0JBQWdCLEVBQUUsMkJBQWU7WUFDakMsYUFBYSxFQUFFLGVBQWU7WUFDOUIsTUFBTSxFQUFFLEdBQUcsQ0FBQyxNQUFNO1lBQ2xCLFdBQVcsRUFBRSxHQUFHLENBQUMsV0FBVztZQUM1QixJQUFJLEVBQUUsR0FBRyxDQUFDLElBQUk7U0FDZixDQUFDO0lBQ0osQ0FBQyxDQUFDLENBQUM7QUFDTCxDQUFDO0FBTUQsU0FBUyxrQkFBa0IsQ0FBQyxHQUFzQixFQUFFLGdCQUF5QztJQUMzRixPQUFPLENBQUMsR0FBRyxDQUFDLGdCQUFnQixDQUFDLFdBQVcsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUM7QUFDM0QsQ0FBQztBQUVELFNBQVMseUJBQXlCLENBQUMsR0FBc0IsRUFBRSxnQkFBeUM7SUFDbEcsT0FBTyxDQUFDLEdBQUcsQ0FBQyxnQkFBZ0IsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUM7QUFDbEUsQ0FBQztBQUVELFNBQVMsdUJBQXVCLENBQUMsR0FBc0IsRUFBRSxnQkFBeUM7SUFDaEcsT0FBTyxDQUFDLEdBQUcsQ0FBQyxnQkFBZ0IsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUM7QUFDaEUsQ0FBQztBQUVELFNBQVMsbUJBQW1CLENBQUMsR0FBc0IsRUFBRSxnQkFBeUM7SUFDNUYsT0FBTyxDQUFDLEdBQUcsQ0FBQyxnQkFBZ0IsQ0FBQyxZQUFZLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDO0FBQzVELENBQUM7QUFFRCxTQUFTLG9CQUFvQixDQUFDLEdBQXNCLEVBQUUsZ0JBQXlDO0lBQzdGLE9BQU8sQ0FBQyxHQUFHLENBQUMsZ0JBQWdCLENBQUMsYUFBYSxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQztBQUM3RCxDQUFDO0FBRUQsU0FBUyx5QkFBeUIsQ0FDaEMsTUFBc0IsRUFDdEIsZ0JBQXlDLEVBQ3pDLFNBQThCO0lBRTlCLE1BQU0sR0FBRyxHQUFHLE1BQU0sQ0FBQyxRQUFRLENBQUM7SUFDNUIsT0FBTztRQUNMLE1BQU0sRUFBRSxTQUFTO1FBQ2pCLElBQUksRUFBRSxrQkFBa0IsQ0FBQyxHQUFHLEVBQUUsZ0JBQWdCLENBQUM7UUFDL0MsV0FBVyxFQUFFLHlCQUF5QixDQUFDLEdBQUcsRUFBRSxnQkFBZ0IsQ0FBQztRQUM3RCxTQUFTLEVBQUUsdUJBQXVCLENBQUMsR0FBRyxFQUFFLGdCQUFnQixDQUFDO1FBQ3pELEtBQUssRUFBRSxtQkFBbUIsQ0FBQyxHQUFHLEVBQUUsZ0JBQWdCLENBQUM7UUFDakQsTUFBTSxFQUFFLG9CQUFvQixDQUFDLEdBQUcsRUFBRSxnQkFBZ0IsQ0FBQztRQUNuRCxJQUFJLEVBQUUsRUFBRTtLQUNULENBQUM7QUFDSixDQUFDO0FBRUQsU0FBUyxpQkFBaUIsQ0FBQyxNQUFzQjtJQUMvQyxPQUFPLE1BQU0sQ0FBQyxFQUFFLEtBQUssVUFBVSxDQUFDO0FBQ2xDLENBQUM7QUFFRCxzQ0FBc0M7QUFDdEMsU0FBUyx1QkFBdUIsQ0FBQyxNQUFzQixFQUFFLE9BQTJCO0lBQ2xGLE9BQU8sQ0FBQyxXQUFXLEdBQUcsR0FBRyxPQUFPLENBQUMsV0FBVyxJQUFJLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztJQUNyRSxPQUFPLE9BQU8sQ0FBQztBQUNqQixDQUFDO0FBRUQsU0FBUyxvQkFBb0IsQ0FDM0IsSUFBMEIsRUFDMUIsZ0JBQXlDLEVBQ3pDLE1BQXNCLEVBQ3RCLE9BQTRCO0lBRTVCLElBQUksaUJBQWlCLENBQUMsTUFBTSxDQUFDLEVBQUU7UUFDN0IsTUFBTSxlQUFlLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDO1FBQ25DLElBQUksZUFBZSxFQUFFO1lBQ25CLElBQUksQ0FBQyxJQUFJLENBQUMsdUJBQXVCLENBQUMsTUFBTSxFQUFFLGVBQWUsQ0FBQyxDQUFDLENBQUM7U0FDN0Q7YUFBTTtZQUNMLE1BQU0sSUFBSSxLQUFLLENBQUMsMkJBQTJCLENBQUMsQ0FBQztTQUM5QztLQUNGO1NBQU07UUFDTCxJQUFJLENBQUMsSUFBSSxDQUFDLHlCQUF5QixDQUFDLE1BQU0sRUFBRSxnQkFBZ0IsRUFBRSxPQUFPLENBQUMsQ0FBQyxDQUFDO0tBQ3pFO0FBQ0gsQ0FBQztBQUVELEtBQUssVUFBVSwyQkFBMkIsQ0FBQyxJQUFVLEVBQUUsV0FBbUI7SUFDeEUsTUFBTSxVQUFVLEdBQXdCLEVBQUUsQ0FBQztJQUMzQyxNQUFNLFdBQVcsR0FBRyxNQUFNLElBQUEsbUNBQVcsRUFBQyxJQUFJLEVBQUUsa0JBQWtCLFdBQVcsd0JBQXdCLEVBQUUsSUFBSSxFQUFFLEdBQUcsQ0FBQyxFQUFFO1FBQzdHLE9BQU8sR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsRUFBRSxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUM7WUFDN0IsSUFBSSxFQUFHLEVBQWtCLENBQUMsU0FBUyxDQUFDLElBQUksRUFBRTtZQUMxQyxLQUFLO1NBQ04sQ0FBQyxDQUFDLENBQUM7SUFDTixDQUFDLENBQUMsQ0FBQztJQUVILEtBQUssTUFBTSxTQUFTLElBQUksV0FBVyxFQUFFO1FBQ25DLFVBQVUsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLEdBQUcsU0FBUyxDQUFDLEtBQUssQ0FBQztLQUM5QztJQUNELE9BQU8sVUFBVSxDQUFDO0FBQ3BCLENBQUM7QUFFRCxLQUFLLFVBQVUsNEJBQTRCLENBQ3pDLElBQVUsRUFDVixXQUFtQixFQUNuQixPQUE0QjtJQUU1QixNQUFNLElBQUksR0FBeUIsRUFBRSxDQUFDO0lBQ3RDLE1BQU0sd0JBQXdCLEdBQUcsTUFBTSwyQkFBMkIsQ0FBQyxJQUFJLEVBQUUsV0FBVyxDQUFDLENBQUM7SUFFdEYsTUFBTSxnQkFBZ0IsR0FBRyxNQUFNLElBQUEsbUNBQVcsRUFDeEMsSUFBSSxFQUNKLGtCQUFrQixXQUFXLGtDQUFrQyxFQUMvRCxFQUFFLEVBQ0YsR0FBRyxDQUFDLEVBQUU7UUFDSixPQUFRLEdBQXFCLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQztZQUN2QyxFQUFFLEVBQUUsRUFBRSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFO1lBQy9CLFFBQVEsRUFBRSxLQUFLLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxvQkFBb0IsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFFLEVBQWtCLENBQUMsU0FBUyxDQUFDO1NBQzdGLENBQUMsQ0FBQyxDQUFDO0lBQ04sQ0FBQyxDQUNGLENBQUM7SUFFRixLQUFLLE1BQU0sTUFBTSxJQUFJLGdCQUFnQixFQUFFO1FBQ3JDLG9CQUFvQixDQUFDLElBQUksRUFBRSx3QkFBd0IsRUFBRSxNQUFNLEVBQUUsT0FBTyxDQUFDLENBQUM7S0FDdkU7SUFDRCxPQUFPLElBQUksQ0FBQztBQUNkLENBQUM7QUFFRCxLQUFLLFVBQVUsK0JBQStCLENBQUMsSUFBVTtJQUN2RCxNQUFNLG1CQUFtQixHQUFHLE1BQU0sSUFBQSw0Q0FBb0IsRUFBQyxJQUFJLEVBQUUsSUFBSSxtQkFBbUIsRUFBRSxDQUFDLENBQUM7SUFDeEYsSUFBSSxtQkFBbUIsRUFBRTtRQUN2QixNQUFNLFNBQVMsR0FBRyxNQUFNLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxtQkFBbUIsRUFBRSxFQUFFLFlBQVksQ0FBQyxFQUFFO1lBQzNFLE9BQVEsWUFBNEIsQ0FBQyxTQUFTLENBQUM7UUFDakQsQ0FBQyxDQUFDLENBQUM7UUFDSCxPQUFPLFNBQVMsQ0FBQyxJQUFJLEVBQUUsS0FBSyxpQ0FBaUMsQ0FBQztLQUMvRDtJQUNELE9BQU8sS0FBSyxDQUFDO0FBQ2YsQ0FBQztBQUVELEtBQUssVUFBVSxhQUFhLENBQUMsSUFBVSxFQUFFLFNBQWlCO0lBQ3hELE1BQU0sZUFBZSxHQUFHLE1BQU0sSUFBQSw0Q0FBb0IsRUFBQyxJQUFJLEVBQUUsMEJBQTBCLENBQUMsQ0FBQztJQUNyRixJQUFJLGVBQWUsRUFBRTtRQUNuQixNQUFNLElBQUEsc0NBQWMsRUFBQyxJQUFJLEVBQUUsMEJBQTBCLEVBQUUsU0FBUyxDQUFDLENBQUM7S0FDbkU7QUFDSCxDQUFDO0FBRUQsS0FBSyxVQUFVLGFBQWEsQ0FBQyxJQUFVLEVBQUUsU0FBaUI7SUFDeEQsTUFBTSxJQUFBLHNDQUFjLEVBQUMsSUFBSSxFQUFFLDZCQUE2QixFQUFFLEtBQUssQ0FBQyxDQUFDO0lBQ2pFLE1BQU0sSUFBQSw2Q0FBcUIsRUFBQyxJQUFJLEVBQUUsNkJBQTZCLENBQUMsQ0FBQztJQUNqRSxNQUFNLElBQUEsaUNBQVMsRUFBQyxJQUFJLEVBQUUsMEJBQTBCLEVBQUUsU0FBUyxDQUFDLE1BQU0sQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDO0lBQ2pGLE1BQU0sSUFBQSxtQ0FBVyxFQUFDLElBQUksRUFBRSx1QkFBdUIsQ0FBQyxDQUFDO0lBQ2pELE1BQU0sSUFBQSw4QkFBaUIsRUFBQyxJQUFJLENBQUMsQ0FBQztBQUNoQyxDQUFDO0FBRUQsS0FBSyxVQUFVLGdCQUFnQixDQUFDLElBQVU7SUFDeEMsTUFBTSxtQkFBbUIsR0FBRyxNQUFNLElBQUksQ0FBQyxLQUFLLENBQUMsZ0RBQWdELEVBQUUsTUFBTSxDQUFDLEVBQUU7UUFDdEcsT0FBUSxNQUFzQixDQUFDLFNBQVMsQ0FBQztJQUMzQyxDQUFDLENBQUMsQ0FBQztJQUVILE9BQU8sbUJBQW1CLENBQUMsT0FBTyxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQztBQUMvQyxDQUFDO0FBRUQsS0FBSyxVQUFVLHVCQUF1QixDQUFDLElBQVU7SUFDL0MsTUFBTSxrQkFBa0IsR0FBRyxNQUFNLElBQUEsNENBQW9CLEVBQUMsSUFBSSxFQUFFLDBCQUEwQixDQUFDLENBQUM7SUFDeEYsSUFBSSxrQkFBa0IsRUFBRTtRQUN0QixNQUFNLElBQUEsbUNBQVcsRUFBQyxJQUFJLEVBQUUsMEJBQTBCLENBQUMsQ0FBQztLQUNyRDtBQUNILENBQUM7QUFFRCxLQUFLLFVBQVUsMkJBQTJCLENBQUMsSUFBVTtJQUNuRCxNQUFNLFdBQVcsR0FBRyxNQUFNLDRCQUE0QixDQUNwRCxJQUFJLEVBQ0osNkJBQTZCLEVBQzdCLGtDQUFtQixDQUFDLE9BQU8sQ0FDNUIsQ0FBQztJQUNGLE1BQU0sYUFBYSxHQUFHLE1BQU0sNEJBQTRCLENBQ3RELElBQUksRUFDSiwrQkFBK0IsRUFDL0Isa0NBQW1CLENBQUMsU0FBUyxDQUM5QixDQUFDO0lBQ0YsTUFBTSxJQUFJLEdBQUcsQ0FBQyxHQUFHLFdBQVcsRUFBRSxHQUFHLGFBQWEsQ0FBQyxDQUFDO0lBQ2hELE9BQU8sbUJBQW1CLENBQUMsSUFBSSxDQUFDLENBQUM7QUFDbkMsQ0FBQztBQUVELEtBQUssVUFBVSxzQkFBc0IsQ0FBQyxJQUFVO0lBQzlDLE1BQU0sT0FBTyxDQUFDLElBQUksQ0FBQztRQUNqQixJQUFBLDZDQUFxQixFQUFDLElBQUksRUFBRSxJQUFJLCtCQUErQixFQUFFLEVBQUUsS0FBSyxDQUFDO1FBQ3pFLElBQUEsNkNBQXFCLEVBQUMsSUFBSSxFQUFFLElBQUksbUJBQW1CLEVBQUUsRUFBRSxLQUFLLENBQUM7S0FDOUQsQ0FBQyxDQUFDO0lBRUgsTUFBTSx5QkFBeUIsR0FBRyxNQUFNLCtCQUErQixDQUFDLElBQUksQ0FBQyxDQUFDO0lBQzlFLElBQUkseUJBQXlCLEVBQUU7UUFDN0IsT0FBTyxFQUFFLENBQUM7S0FDWDtJQUVELE1BQU0sdUJBQXVCLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDcEMsT0FBTywyQkFBMkIsQ0FBQyxJQUFJLENBQUMsQ0FBQztBQUMzQyxDQUFDO0FBRUQsS0FBSyxVQUFVLGdCQUFnQixDQUFDLElBQVUsRUFBRSxTQUFpQixFQUFFLFNBQWlCO0lBQzlFLE1BQU0sYUFBYSxDQUFDLElBQUksRUFBRSxTQUFTLENBQUMsQ0FBQztJQUNyQyxNQUFNLGFBQWEsQ0FBQyxJQUFJLEVBQUUsU0FBUyxDQUFDLENBQUM7SUFDckMsTUFBTSxhQUFhLEdBQUcsTUFBTSxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUNuRCxNQUFNLElBQUksR0FBRyxNQUFNLHNCQUFzQixDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ2hELE9BQU87UUFDTCxhQUFhO1FBQ2IsSUFBSTtLQUNMLENBQUM7QUFDSixDQUFDO0FBRUQsS0FBSyxVQUFVLGFBQWEsQ0FBQyxJQUFVLEVBQUUsU0FBaUI7SUFDeEQsTUFBTSxRQUFRLEdBQTBCLEVBQUUsQ0FBQztJQUMzQyxNQUFNLFlBQVksR0FBRyxNQUFNLElBQUEsd0NBQWdCLEVBQUMsSUFBSSxFQUFFLDBCQUEwQixDQUFDLENBQUM7SUFDOUUsS0FBSyxNQUFNLE9BQU8sSUFBSSxZQUFZLEVBQUU7UUFDbEMsSUFBSSxPQUFPLENBQUMsS0FBSyxLQUFLLElBQUksRUFBRTtZQUMxQiw2QkFBNkI7WUFDN0IsTUFBTSxXQUFXLEdBQUcsTUFBTSxnQkFBZ0IsQ0FBQyxJQUFJLEVBQUUsU0FBUyxFQUFFLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUMzRSxRQUFRLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDO1NBQzVCO0tBQ0Y7SUFDRCxPQUFPLFFBQVEsQ0FBQztBQUNsQixDQUFDO0FBRUQsS0FBSyxVQUFVLGdCQUFnQixDQUFDLElBQVU7SUFDeEMsT0FBTyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBQSw2Q0FBcUIsRUFBQyxJQUFJLEVBQUUsVUFBVSxFQUFFLElBQUksQ0FBQyxFQUFFLElBQUEsNkNBQXFCLEVBQUMsSUFBSSxFQUFFLFVBQVUsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDdEgsQ0FBQztBQUlELE1BQU0sZ0JBQWlCLFNBQVEsa0RBQWtEO0lBQy9FLGVBQWUsQ0FBQyxXQUF1QztRQUNyRCxPQUFPO1lBQ0wsUUFBUSxFQUFFLEdBQUcsUUFBUSxFQUFFO1lBQ3ZCLE1BQU0sRUFBRSxpQkFBaUIsQ0FBQyxXQUFXLENBQUM7WUFDdEMsb0JBQW9CLEVBQUUsUUFBUTtZQUM5QixVQUFVLEVBQUUsS0FBSyxJQUFJLEVBQUUsQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDO1lBQ25ELGVBQWUsRUFBRSx1QkFBdUIsRUFBRTtTQUMzQyxDQUFDO0lBQ0osQ0FBQztJQUVELEtBQUssQ0FBQyxTQUFTO1FBQ2IsTUFBTSxrQkFBa0IsR0FBRyxJQUFBLGdCQUFNLEdBQUUsQ0FBQyxRQUFRLENBQUMsQ0FBQyxFQUFFLE9BQU8sQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFDdkUsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxTQUFTLElBQUksa0JBQWtCLENBQUMsTUFBTSxFQUFFLENBQUM7UUFDeEUsTUFBTSxXQUFXLEdBQUcsZ0JBQU0sQ0FBQyxHQUFHLENBQUMsa0JBQWtCLEVBQUUsSUFBQSxnQkFBTSxFQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUM7UUFFdEUsTUFBTSxJQUFJLENBQUMsVUFBVSxDQUFDLGdCQUFnQixDQUFDLENBQUM7UUFFeEMsTUFBTSxRQUFRLEdBQUcsTUFBTSxhQUFhLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxXQUFXLENBQUMsQ0FBQztRQUU3RCxPQUFPO1lBQ0wsT0FBTyxFQUFFLElBQUk7WUFDYixRQUFRO1NBQ1QsQ0FBQztJQUNKLENBQUM7Q0FDRjtBQUVELGtCQUFlLGdCQUFnQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IG1vbWVudCwgeyB0eXBlIE1vbWVudCB9IGZyb20gJ21vbWVudCc7XG5pbXBvcnQgeyB0eXBlIFBhZ2UgfSBmcm9tICdwdXBwZXRlZXInO1xuaW1wb3J0IHsgU0hFS0VMX0NVUlJFTkNZIH0gZnJvbSAnLi4vY29uc3RhbnRzJztcbmltcG9ydCB7XG4gIGNsaWNrQnV0dG9uLFxuICBkcm9wZG93bkVsZW1lbnRzLFxuICBkcm9wZG93blNlbGVjdCxcbiAgZWxlbWVudFByZXNlbnRPblBhZ2UsXG4gIGZpbGxJbnB1dCxcbiAgcGFnZUV2YWxBbGwsXG4gIHdhaXRVbnRpbEVsZW1lbnRGb3VuZCxcbn0gZnJvbSAnLi4vaGVscGVycy9lbGVtZW50cy1pbnRlcmFjdGlvbnMnO1xuaW1wb3J0IHsgd2FpdEZvck5hdmlnYXRpb24gfSBmcm9tICcuLi9oZWxwZXJzL25hdmlnYXRpb24nO1xuaW1wb3J0IHsgVHJhbnNhY3Rpb25TdGF0dXNlcywgVHJhbnNhY3Rpb25UeXBlcywgdHlwZSBUcmFuc2FjdGlvbiwgdHlwZSBUcmFuc2FjdGlvbnNBY2NvdW50IH0gZnJvbSAnLi4vdHJhbnNhY3Rpb25zJztcbmltcG9ydCB7IEJhc2VTY3JhcGVyV2l0aEJyb3dzZXIsIExvZ2luUmVzdWx0cywgdHlwZSBQb3NzaWJsZUxvZ2luUmVzdWx0cyB9IGZyb20gJy4vYmFzZS1zY3JhcGVyLXdpdGgtYnJvd3Nlcic7XG5cbmNvbnN0IEJBU0VfVVJMID0gJ2h0dHBzOi8vaGIudW5pb25iYW5rLmNvLmlsJztcbmNvbnN0IFRSQU5TQUNUSU9OU19VUkwgPSBgJHtCQVNFX1VSTH0vZUJhbmtpbmcvQWNjb3VudHMvRXh0ZW5kZWRBY3Rpdml0eS5hc3B4Iy9gO1xuY29uc3QgREFURV9GT1JNQVQgPSAnREQvTU0vWVknO1xuY29uc3QgTk9fVFJBTlNBQ1RJT05fSU5fREFURV9SQU5HRV9URVhUID0gJ9ec15Ag16fXmdeZ157XldeqINeq16DXldei15XXqiDXnteq15DXmdee15XXqiDXotecINek15kg15TXodeZ16DXldefINep15TXldeS15PXqCc7XG5jb25zdCBEQVRFX0hFQURFUiA9ICfXqteQ16jXmdeaJztcbmNvbnN0IERFU0NSSVBUSU9OX0hFQURFUiA9ICfXqteZ15DXldeoJztcbmNvbnN0IFJFRkVSRU5DRV9IRUFERVIgPSAn15DXodee15vXqteQJztcbmNvbnN0IERFQklUX0hFQURFUiA9ICfXl9eV15HXlCc7XG5jb25zdCBDUkVESVRfSEVBREVSID0gJ9eW15vXldeqJztcbmNvbnN0IFBFTkRJTkdfVFJBTlNBQ1RJT05TX1RBQkxFX0lEID0gJ3RyVG9kYXlBY3Rpdml0eU5hcGFUYWJsZVVwcGVyJztcbmNvbnN0IENPTVBMRVRFRF9UUkFOU0FDVElPTlNfVEFCTEVfSUQgPSAnY3RsQWN0aXZpdHlUYWJsZSc7XG5jb25zdCBFUlJPUl9NRVNTQUdFX0NMQVNTID0gJ2VyckluZm8nO1xuY29uc3QgQUNDT1VOVFNfRFJPUERPV05fU0VMRUNUT1IgPSAnc2VsZWN0I2RkbEFjY291bnRzX21fZGRsJztcblxuZnVuY3Rpb24gZ2V0UG9zc2libGVMb2dpblJlc3VsdHMoKSB7XG4gIGNvbnN0IHVybHM6IFBvc3NpYmxlTG9naW5SZXN1bHRzID0ge307XG4gIHVybHNbTG9naW5SZXN1bHRzLlN1Y2Nlc3NdID0gWy9lQmFua2luZ1xcL0FjY291bnRzL107XG4gIHVybHNbTG9naW5SZXN1bHRzLkludmFsaWRQYXNzd29yZF0gPSBbL0ludGVybmFsU2l0ZVxcL0N1c3RvbVVwZGF0ZVxcL2xldW1pXFwvTG9naW5QYWdlLkFTUC9dO1xuICByZXR1cm4gdXJscztcbn1cblxuZnVuY3Rpb24gY3JlYXRlTG9naW5GaWVsZHMoY3JlZGVudGlhbHM6IFNjcmFwZXJTcGVjaWZpY0NyZWRlbnRpYWxzKSB7XG4gIHJldHVybiBbXG4gICAgeyBzZWxlY3RvcjogJyN1aWQnLCB2YWx1ZTogY3JlZGVudGlhbHMudXNlcm5hbWUgfSxcbiAgICB7IHNlbGVjdG9yOiAnI3Bhc3N3b3JkJywgdmFsdWU6IGNyZWRlbnRpYWxzLnBhc3N3b3JkIH0sXG4gIF07XG59XG5cbmZ1bmN0aW9uIGdldEFtb3VudERhdGEoYW1vdW50U3RyOiBzdHJpbmcpIHtcbiAgY29uc3QgYW1vdW50U3RyQ29weSA9IGFtb3VudFN0ci5yZXBsYWNlKCcsJywgJycpO1xuICByZXR1cm4gcGFyc2VGbG9hdChhbW91bnRTdHJDb3B5KTtcbn1cblxuaW50ZXJmYWNlIFNjcmFwZWRUcmFuc2FjdGlvbiB7XG4gIGNyZWRpdDogc3RyaW5nO1xuICBkZWJpdDogc3RyaW5nO1xuICBkYXRlOiBzdHJpbmc7XG4gIHJlZmVyZW5jZT86IHN0cmluZztcbiAgZGVzY3JpcHRpb246IHN0cmluZztcbiAgbWVtbzogc3RyaW5nO1xuICBzdGF0dXM6IFRyYW5zYWN0aW9uU3RhdHVzZXM7XG59XG5cbmZ1bmN0aW9uIGdldFR4bkFtb3VudCh0eG46IFNjcmFwZWRUcmFuc2FjdGlvbikge1xuICBjb25zdCBjcmVkaXQgPSBnZXRBbW91bnREYXRhKHR4bi5jcmVkaXQpO1xuICBjb25zdCBkZWJpdCA9IGdldEFtb3VudERhdGEodHhuLmRlYml0KTtcbiAgcmV0dXJuIChOdW1iZXIuaXNOYU4oY3JlZGl0KSA/IDAgOiBjcmVkaXQpIC0gKE51bWJlci5pc05hTihkZWJpdCkgPyAwIDogZGViaXQpO1xufVxuXG5mdW5jdGlvbiBjb252ZXJ0VHJhbnNhY3Rpb25zKHR4bnM6IFNjcmFwZWRUcmFuc2FjdGlvbltdKTogVHJhbnNhY3Rpb25bXSB7XG4gIHJldHVybiB0eG5zLm1hcCh0eG4gPT4ge1xuICAgIGNvbnN0IGNvbnZlcnRlZERhdGUgPSBtb21lbnQodHhuLmRhdGUsIERBVEVfRk9STUFUKS50b0lTT1N0cmluZygpO1xuICAgIGNvbnN0IGNvbnZlcnRlZEFtb3VudCA9IGdldFR4bkFtb3VudCh0eG4pO1xuICAgIHJldHVybiB7XG4gICAgICB0eXBlOiBUcmFuc2FjdGlvblR5cGVzLk5vcm1hbCxcbiAgICAgIGlkZW50aWZpZXI6IHR4bi5yZWZlcmVuY2UgPyBwYXJzZUludCh0eG4ucmVmZXJlbmNlLCAxMCkgOiB1bmRlZmluZWQsXG4gICAgICBkYXRlOiBjb252ZXJ0ZWREYXRlLFxuICAgICAgcHJvY2Vzc2VkRGF0ZTogY29udmVydGVkRGF0ZSxcbiAgICAgIG9yaWdpbmFsQW1vdW50OiBjb252ZXJ0ZWRBbW91bnQsXG4gICAgICBvcmlnaW5hbEN1cnJlbmN5OiBTSEVLRUxfQ1VSUkVOQ1ksXG4gICAgICBjaGFyZ2VkQW1vdW50OiBjb252ZXJ0ZWRBbW91bnQsXG4gICAgICBzdGF0dXM6IHR4bi5zdGF0dXMsXG4gICAgICBkZXNjcmlwdGlvbjogdHhuLmRlc2NyaXB0aW9uLFxuICAgICAgbWVtbzogdHhuLm1lbW8sXG4gICAgfTtcbiAgfSk7XG59XG5cbnR5cGUgVHJhbnNhY3Rpb25zVHIgPSB7IGlkOiBzdHJpbmc7IGlubmVyVGRzOiBUcmFuc2FjdGlvbnNUclRkcyB9O1xudHlwZSBUcmFuc2FjdGlvblRhYmxlSGVhZGVycyA9IFJlY29yZDxzdHJpbmcsIG51bWJlcj47XG50eXBlIFRyYW5zYWN0aW9uc1RyVGRzID0gc3RyaW5nW107XG5cbmZ1bmN0aW9uIGdldFRyYW5zYWN0aW9uRGF0ZSh0ZHM6IFRyYW5zYWN0aW9uc1RyVGRzLCB0eG5zVGFibGVIZWFkZXJzOiBUcmFuc2FjdGlvblRhYmxlSGVhZGVycykge1xuICByZXR1cm4gKHRkc1t0eG5zVGFibGVIZWFkZXJzW0RBVEVfSEVBREVSXV0gfHwgJycpLnRyaW0oKTtcbn1cblxuZnVuY3Rpb24gZ2V0VHJhbnNhY3Rpb25EZXNjcmlwdGlvbih0ZHM6IFRyYW5zYWN0aW9uc1RyVGRzLCB0eG5zVGFibGVIZWFkZXJzOiBUcmFuc2FjdGlvblRhYmxlSGVhZGVycykge1xuICByZXR1cm4gKHRkc1t0eG5zVGFibGVIZWFkZXJzW0RFU0NSSVBUSU9OX0hFQURFUl1dIHx8ICcnKS50cmltKCk7XG59XG5cbmZ1bmN0aW9uIGdldFRyYW5zYWN0aW9uUmVmZXJlbmNlKHRkczogVHJhbnNhY3Rpb25zVHJUZHMsIHR4bnNUYWJsZUhlYWRlcnM6IFRyYW5zYWN0aW9uVGFibGVIZWFkZXJzKSB7XG4gIHJldHVybiAodGRzW3R4bnNUYWJsZUhlYWRlcnNbUkVGRVJFTkNFX0hFQURFUl1dIHx8ICcnKS50cmltKCk7XG59XG5cbmZ1bmN0aW9uIGdldFRyYW5zYWN0aW9uRGViaXQodGRzOiBUcmFuc2FjdGlvbnNUclRkcywgdHhuc1RhYmxlSGVhZGVyczogVHJhbnNhY3Rpb25UYWJsZUhlYWRlcnMpIHtcbiAgcmV0dXJuICh0ZHNbdHhuc1RhYmxlSGVhZGVyc1tERUJJVF9IRUFERVJdXSB8fCAnJykudHJpbSgpO1xufVxuXG5mdW5jdGlvbiBnZXRUcmFuc2FjdGlvbkNyZWRpdCh0ZHM6IFRyYW5zYWN0aW9uc1RyVGRzLCB0eG5zVGFibGVIZWFkZXJzOiBUcmFuc2FjdGlvblRhYmxlSGVhZGVycykge1xuICByZXR1cm4gKHRkc1t0eG5zVGFibGVIZWFkZXJzW0NSRURJVF9IRUFERVJdXSB8fCAnJykudHJpbSgpO1xufVxuXG5mdW5jdGlvbiBleHRyYWN0VHJhbnNhY3Rpb25EZXRhaWxzKFxuICB0eG5Sb3c6IFRyYW5zYWN0aW9uc1RyLFxuICB0eG5zVGFibGVIZWFkZXJzOiBUcmFuc2FjdGlvblRhYmxlSGVhZGVycyxcbiAgdHhuU3RhdHVzOiBUcmFuc2FjdGlvblN0YXR1c2VzLFxuKTogU2NyYXBlZFRyYW5zYWN0aW9uIHtcbiAgY29uc3QgdGRzID0gdHhuUm93LmlubmVyVGRzO1xuICByZXR1cm4ge1xuICAgIHN0YXR1czogdHhuU3RhdHVzLFxuICAgIGRhdGU6IGdldFRyYW5zYWN0aW9uRGF0ZSh0ZHMsIHR4bnNUYWJsZUhlYWRlcnMpLFxuICAgIGRlc2NyaXB0aW9uOiBnZXRUcmFuc2FjdGlvbkRlc2NyaXB0aW9uKHRkcywgdHhuc1RhYmxlSGVhZGVycyksXG4gICAgcmVmZXJlbmNlOiBnZXRUcmFuc2FjdGlvblJlZmVyZW5jZSh0ZHMsIHR4bnNUYWJsZUhlYWRlcnMpLFxuICAgIGRlYml0OiBnZXRUcmFuc2FjdGlvbkRlYml0KHRkcywgdHhuc1RhYmxlSGVhZGVycyksXG4gICAgY3JlZGl0OiBnZXRUcmFuc2FjdGlvbkNyZWRpdCh0ZHMsIHR4bnNUYWJsZUhlYWRlcnMpLFxuICAgIG1lbW86ICcnLFxuICB9O1xufVxuXG5mdW5jdGlvbiBpc0V4cGFuZGVkRGVzY1Jvdyh0eG5Sb3c6IFRyYW5zYWN0aW9uc1RyKSB7XG4gIHJldHVybiB0eG5Sb3cuaWQgPT09ICdyb3dBZGRlZCc7XG59XG5cbi8qIGVzbGludC1kaXNhYmxlIG5vLXBhcmFtLXJlYXNzaWduICovXG5mdW5jdGlvbiBlZGl0TGFzdFRyYW5zYWN0aW9uRGVzYyh0eG5Sb3c6IFRyYW5zYWN0aW9uc1RyLCBsYXN0VHhuOiBTY3JhcGVkVHJhbnNhY3Rpb24pOiBTY3JhcGVkVHJhbnNhY3Rpb24ge1xuICBsYXN0VHhuLmRlc2NyaXB0aW9uID0gYCR7bGFzdFR4bi5kZXNjcmlwdGlvbn0gJHt0eG5Sb3cuaW5uZXJUZHNbMF19YDtcbiAgcmV0dXJuIGxhc3RUeG47XG59XG5cbmZ1bmN0aW9uIGhhbmRsZVRyYW5zYWN0aW9uUm93KFxuICB0eG5zOiBTY3JhcGVkVHJhbnNhY3Rpb25bXSxcbiAgdHhuc1RhYmxlSGVhZGVyczogVHJhbnNhY3Rpb25UYWJsZUhlYWRlcnMsXG4gIHR4blJvdzogVHJhbnNhY3Rpb25zVHIsXG4gIHR4blR5cGU6IFRyYW5zYWN0aW9uU3RhdHVzZXMsXG4pIHtcbiAgaWYgKGlzRXhwYW5kZWREZXNjUm93KHR4blJvdykpIHtcbiAgICBjb25zdCBsYXN0VHJhbnNhY3Rpb24gPSB0eG5zLnBvcCgpO1xuICAgIGlmIChsYXN0VHJhbnNhY3Rpb24pIHtcbiAgICAgIHR4bnMucHVzaChlZGl0TGFzdFRyYW5zYWN0aW9uRGVzYyh0eG5Sb3csIGxhc3RUcmFuc2FjdGlvbikpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludGVybmFsIHVuaW9uLWJhbmsgZXJyb3InKTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgdHhucy5wdXNoKGV4dHJhY3RUcmFuc2FjdGlvbkRldGFpbHModHhuUm93LCB0eG5zVGFibGVIZWFkZXJzLCB0eG5UeXBlKSk7XG4gIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gZ2V0VHJhbnNhY3Rpb25zVGFibGVIZWFkZXJzKHBhZ2U6IFBhZ2UsIHRhYmxlVHlwZUlkOiBzdHJpbmcpIHtcbiAgY29uc3QgaGVhZGVyc01hcDogUmVjb3JkPHN0cmluZywgYW55PiA9IFtdO1xuICBjb25zdCBoZWFkZXJzT2JqcyA9IGF3YWl0IHBhZ2VFdmFsQWxsKHBhZ2UsIGAjV29ya1NwYWNlQm94ICMke3RhYmxlVHlwZUlkfSB0cltjbGFzcz0naGVhZGVyJ10gdGhgLCBudWxsLCB0aHMgPT4ge1xuICAgIHJldHVybiB0aHMubWFwKCh0aCwgaW5kZXgpID0+ICh7XG4gICAgICB0ZXh0OiAodGggYXMgSFRNTEVsZW1lbnQpLmlubmVyVGV4dC50cmltKCksXG4gICAgICBpbmRleCxcbiAgICB9KSk7XG4gIH0pO1xuXG4gIGZvciAoY29uc3QgaGVhZGVyT2JqIG9mIGhlYWRlcnNPYmpzKSB7XG4gICAgaGVhZGVyc01hcFtoZWFkZXJPYmoudGV4dF0gPSBoZWFkZXJPYmouaW5kZXg7XG4gIH1cbiAgcmV0dXJuIGhlYWRlcnNNYXA7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGV4dHJhY3RUcmFuc2FjdGlvbnNGcm9tVGFibGUoXG4gIHBhZ2U6IFBhZ2UsXG4gIHRhYmxlVHlwZUlkOiBzdHJpbmcsXG4gIHR4blR5cGU6IFRyYW5zYWN0aW9uU3RhdHVzZXMsXG4pOiBQcm9taXNlPFNjcmFwZWRUcmFuc2FjdGlvbltdPiB7XG4gIGNvbnN0IHR4bnM6IFNjcmFwZWRUcmFuc2FjdGlvbltdID0gW107XG4gIGNvbnN0IHRyYW5zYWN0aW9uc1RhYmxlSGVhZGVycyA9IGF3YWl0IGdldFRyYW5zYWN0aW9uc1RhYmxlSGVhZGVycyhwYWdlLCB0YWJsZVR5cGVJZCk7XG5cbiAgY29uc3QgdHJhbnNhY3Rpb25zUm93cyA9IGF3YWl0IHBhZ2VFdmFsQWxsPFRyYW5zYWN0aW9uc1RyW10+KFxuICAgIHBhZ2UsXG4gICAgYCNXb3JrU3BhY2VCb3ggIyR7dGFibGVUeXBlSWR9IHRyW2NsYXNzXTpub3QoW2NsYXNzPSdoZWFkZXInXSlgLFxuICAgIFtdLFxuICAgIHRycyA9PiB7XG4gICAgICByZXR1cm4gKHRycyBhcyBIVE1MRWxlbWVudFtdKS5tYXAodHIgPT4gKHtcbiAgICAgICAgaWQ6IHRyLmdldEF0dHJpYnV0ZSgnaWQnKSB8fCAnJyxcbiAgICAgICAgaW5uZXJUZHM6IEFycmF5LmZyb20odHIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ3RkJykpLm1hcCh0ZCA9PiAodGQgYXMgSFRNTEVsZW1lbnQpLmlubmVyVGV4dCksXG4gICAgICB9KSk7XG4gICAgfSxcbiAgKTtcblxuICBmb3IgKGNvbnN0IHR4blJvdyBvZiB0cmFuc2FjdGlvbnNSb3dzKSB7XG4gICAgaGFuZGxlVHJhbnNhY3Rpb25Sb3codHhucywgdHJhbnNhY3Rpb25zVGFibGVIZWFkZXJzLCB0eG5Sb3csIHR4blR5cGUpO1xuICB9XG4gIHJldHVybiB0eG5zO1xufVxuXG5hc3luYyBmdW5jdGlvbiBpc05vVHJhbnNhY3Rpb25JbkRhdGVSYW5nZUVycm9yKHBhZ2U6IFBhZ2UpIHtcbiAgY29uc3QgaGFzRXJyb3JJbmZvRWxlbWVudCA9IGF3YWl0IGVsZW1lbnRQcmVzZW50T25QYWdlKHBhZ2UsIGAuJHtFUlJPUl9NRVNTQUdFX0NMQVNTfWApO1xuICBpZiAoaGFzRXJyb3JJbmZvRWxlbWVudCkge1xuICAgIGNvbnN0IGVycm9yVGV4dCA9IGF3YWl0IHBhZ2UuJGV2YWwoYC4ke0VSUk9SX01FU1NBR0VfQ0xBU1N9YCwgZXJyb3JFbGVtZW50ID0+IHtcbiAgICAgIHJldHVybiAoZXJyb3JFbGVtZW50IGFzIEhUTUxFbGVtZW50KS5pbm5lclRleHQ7XG4gICAgfSk7XG4gICAgcmV0dXJuIGVycm9yVGV4dC50cmltKCkgPT09IE5PX1RSQU5TQUNUSU9OX0lOX0RBVEVfUkFOR0VfVEVYVDtcbiAgfVxuICByZXR1cm4gZmFsc2U7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGNob29zZUFjY291bnQocGFnZTogUGFnZSwgYWNjb3VudElkOiBzdHJpbmcpIHtcbiAgY29uc3QgaGFzRHJvcERvd25MaXN0ID0gYXdhaXQgZWxlbWVudFByZXNlbnRPblBhZ2UocGFnZSwgQUNDT1VOVFNfRFJPUERPV05fU0VMRUNUT1IpO1xuICBpZiAoaGFzRHJvcERvd25MaXN0KSB7XG4gICAgYXdhaXQgZHJvcGRvd25TZWxlY3QocGFnZSwgQUNDT1VOVFNfRFJPUERPV05fU0VMRUNUT1IsIGFjY291bnRJZCk7XG4gIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gc2VhcmNoQnlEYXRlcyhwYWdlOiBQYWdlLCBzdGFydERhdGU6IE1vbWVudCkge1xuICBhd2FpdCBkcm9wZG93blNlbGVjdChwYWdlLCAnc2VsZWN0I2RkbFRyYW5zYWN0aW9uUGVyaW9kJywgJzAwNCcpO1xuICBhd2FpdCB3YWl0VW50aWxFbGVtZW50Rm91bmQocGFnZSwgJ3NlbGVjdCNkZGxUcmFuc2FjdGlvblBlcmlvZCcpO1xuICBhd2FpdCBmaWxsSW5wdXQocGFnZSwgJ2lucHV0I2R0RnJvbURhdGVfdGV4dEJveCcsIHN0YXJ0RGF0ZS5mb3JtYXQoREFURV9GT1JNQVQpKTtcbiAgYXdhaXQgY2xpY2tCdXR0b24ocGFnZSwgJ2lucHV0I2J0bkRpc3BsYXlEYXRlcycpO1xuICBhd2FpdCB3YWl0Rm9yTmF2aWdhdGlvbihwYWdlKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gZ2V0QWNjb3VudE51bWJlcihwYWdlOiBQYWdlKSB7XG4gIGNvbnN0IHNlbGVjdGVkU25pZkFjY291bnQgPSBhd2FpdCBwYWdlLiRldmFsKCcjZGRsQWNjb3VudHNfbV9kZGwgb3B0aW9uW3NlbGVjdGVkPVwic2VsZWN0ZWRcIl0nLCBvcHRpb24gPT4ge1xuICAgIHJldHVybiAob3B0aW9uIGFzIEhUTUxFbGVtZW50KS5pbm5lclRleHQ7XG4gIH0pO1xuXG4gIHJldHVybiBzZWxlY3RlZFNuaWZBY2NvdW50LnJlcGxhY2UoJy8nLCAnXycpO1xufVxuXG5hc3luYyBmdW5jdGlvbiBleHBhbmRUcmFuc2FjdGlvbnNUYWJsZShwYWdlOiBQYWdlKSB7XG4gIGNvbnN0IGhhc0V4cGFuZEFsbEJ1dHRvbiA9IGF3YWl0IGVsZW1lbnRQcmVzZW50T25QYWdlKHBhZ2UsIFwiYVtpZCo9J2xua0N0bEV4cGFuZEFsbCddXCIpO1xuICBpZiAoaGFzRXhwYW5kQWxsQnV0dG9uKSB7XG4gICAgYXdhaXQgY2xpY2tCdXR0b24ocGFnZSwgXCJhW2lkKj0nbG5rQ3RsRXhwYW5kQWxsJ11cIik7XG4gIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gc2NyYXBlVHJhbnNhY3Rpb25zRnJvbVRhYmxlKHBhZ2U6IFBhZ2UpOiBQcm9taXNlPFRyYW5zYWN0aW9uW10+IHtcbiAgY29uc3QgcGVuZGluZ1R4bnMgPSBhd2FpdCBleHRyYWN0VHJhbnNhY3Rpb25zRnJvbVRhYmxlKFxuICAgIHBhZ2UsXG4gICAgUEVORElOR19UUkFOU0FDVElPTlNfVEFCTEVfSUQsXG4gICAgVHJhbnNhY3Rpb25TdGF0dXNlcy5QZW5kaW5nLFxuICApO1xuICBjb25zdCBjb21wbGV0ZWRUeG5zID0gYXdhaXQgZXh0cmFjdFRyYW5zYWN0aW9uc0Zyb21UYWJsZShcbiAgICBwYWdlLFxuICAgIENPTVBMRVRFRF9UUkFOU0FDVElPTlNfVEFCTEVfSUQsXG4gICAgVHJhbnNhY3Rpb25TdGF0dXNlcy5Db21wbGV0ZWQsXG4gICk7XG4gIGNvbnN0IHR4bnMgPSBbLi4ucGVuZGluZ1R4bnMsIC4uLmNvbXBsZXRlZFR4bnNdO1xuICByZXR1cm4gY29udmVydFRyYW5zYWN0aW9ucyh0eG5zKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gZ2V0QWNjb3VudFRyYW5zYWN0aW9ucyhwYWdlOiBQYWdlKTogUHJvbWlzZTxUcmFuc2FjdGlvbltdPiB7XG4gIGF3YWl0IFByb21pc2UucmFjZShbXG4gICAgd2FpdFVudGlsRWxlbWVudEZvdW5kKHBhZ2UsIGAjJHtDT01QTEVURURfVFJBTlNBQ1RJT05TX1RBQkxFX0lEfWAsIGZhbHNlKSxcbiAgICB3YWl0VW50aWxFbGVtZW50Rm91bmQocGFnZSwgYC4ke0VSUk9SX01FU1NBR0VfQ0xBU1N9YCwgZmFsc2UpLFxuICBdKTtcblxuICBjb25zdCBub1RyYW5zYWN0aW9uSW5SYW5nZUVycm9yID0gYXdhaXQgaXNOb1RyYW5zYWN0aW9uSW5EYXRlUmFuZ2VFcnJvcihwYWdlKTtcbiAgaWYgKG5vVHJhbnNhY3Rpb25JblJhbmdlRXJyb3IpIHtcbiAgICByZXR1cm4gW107XG4gIH1cblxuICBhd2FpdCBleHBhbmRUcmFuc2FjdGlvbnNUYWJsZShwYWdlKTtcbiAgcmV0dXJuIHNjcmFwZVRyYW5zYWN0aW9uc0Zyb21UYWJsZShwYWdlKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gZmV0Y2hBY2NvdW50RGF0YShwYWdlOiBQYWdlLCBzdGFydERhdGU6IE1vbWVudCwgYWNjb3VudElkOiBzdHJpbmcpOiBQcm9taXNlPFRyYW5zYWN0aW9uc0FjY291bnQ+IHtcbiAgYXdhaXQgY2hvb3NlQWNjb3VudChwYWdlLCBhY2NvdW50SWQpO1xuICBhd2FpdCBzZWFyY2hCeURhdGVzKHBhZ2UsIHN0YXJ0RGF0ZSk7XG4gIGNvbnN0IGFjY291bnROdW1iZXIgPSBhd2FpdCBnZXRBY2NvdW50TnVtYmVyKHBhZ2UpO1xuICBjb25zdCB0eG5zID0gYXdhaXQgZ2V0QWNjb3VudFRyYW5zYWN0aW9ucyhwYWdlKTtcbiAgcmV0dXJuIHtcbiAgICBhY2NvdW50TnVtYmVyLFxuICAgIHR4bnMsXG4gIH07XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGZldGNoQWNjb3VudHMocGFnZTogUGFnZSwgc3RhcnREYXRlOiBNb21lbnQpIHtcbiAgY29uc3QgYWNjb3VudHM6IFRyYW5zYWN0aW9uc0FjY291bnRbXSA9IFtdO1xuICBjb25zdCBhY2NvdW50c0xpc3QgPSBhd2FpdCBkcm9wZG93bkVsZW1lbnRzKHBhZ2UsIEFDQ09VTlRTX0RST1BET1dOX1NFTEVDVE9SKTtcbiAgZm9yIChjb25zdCBhY2NvdW50IG9mIGFjY291bnRzTGlzdCkge1xuICAgIGlmIChhY2NvdW50LnZhbHVlICE9PSAnLTEnKSB7XG4gICAgICAvLyBTa2lwIFwiQWxsIGFjY291bnRzXCIgb3B0aW9uXG4gICAgICBjb25zdCBhY2NvdW50RGF0YSA9IGF3YWl0IGZldGNoQWNjb3VudERhdGEocGFnZSwgc3RhcnREYXRlLCBhY2NvdW50LnZhbHVlKTtcbiAgICAgIGFjY291bnRzLnB1c2goYWNjb3VudERhdGEpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gYWNjb3VudHM7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHdhaXRGb3JQb3N0TG9naW4ocGFnZTogUGFnZSkge1xuICByZXR1cm4gUHJvbWlzZS5yYWNlKFt3YWl0VW50aWxFbGVtZW50Rm91bmQocGFnZSwgJyNzaWdub2ZmJywgdHJ1ZSksIHdhaXRVbnRpbEVsZW1lbnRGb3VuZChwYWdlLCAnI3Jlc3RvcmUnLCB0cnVlKV0pO1xufVxuXG50eXBlIFNjcmFwZXJTcGVjaWZpY0NyZWRlbnRpYWxzID0geyB1c2VybmFtZTogc3RyaW5nOyBwYXNzd29yZDogc3RyaW5nIH07XG5cbmNsYXNzIFVuaW9uQmFua1NjcmFwZXIgZXh0ZW5kcyBCYXNlU2NyYXBlcldpdGhCcm93c2VyPFNjcmFwZXJTcGVjaWZpY0NyZWRlbnRpYWxzPiB7XG4gIGdldExvZ2luT3B0aW9ucyhjcmVkZW50aWFsczogU2NyYXBlclNwZWNpZmljQ3JlZGVudGlhbHMpIHtcbiAgICByZXR1cm4ge1xuICAgICAgbG9naW5Vcmw6IGAke0JBU0VfVVJMfWAsXG4gICAgICBmaWVsZHM6IGNyZWF0ZUxvZ2luRmllbGRzKGNyZWRlbnRpYWxzKSxcbiAgICAgIHN1Ym1pdEJ1dHRvblNlbGVjdG9yOiAnI2VudGVyJyxcbiAgICAgIHBvc3RBY3Rpb246IGFzeW5jICgpID0+IHdhaXRGb3JQb3N0TG9naW4odGhpcy5wYWdlKSxcbiAgICAgIHBvc3NpYmxlUmVzdWx0czogZ2V0UG9zc2libGVMb2dpblJlc3VsdHMoKSxcbiAgICB9O1xuICB9XG5cbiAgYXN5bmMgZmV0Y2hEYXRhKCkge1xuICAgIGNvbnN0IGRlZmF1bHRTdGFydE1vbWVudCA9IG1vbWVudCgpLnN1YnRyYWN0KDEsICd5ZWFycycpLmFkZCgxLCAnZGF5Jyk7XG4gICAgY29uc3Qgc3RhcnREYXRlID0gdGhpcy5vcHRpb25zLnN0YXJ0RGF0ZSB8fCBkZWZhdWx0U3RhcnRNb21lbnQudG9EYXRlKCk7XG4gICAgY29uc3Qgc3RhcnRNb21lbnQgPSBtb21lbnQubWF4KGRlZmF1bHRTdGFydE1vbWVudCwgbW9tZW50KHN0YXJ0RGF0ZSkpO1xuXG4gICAgYXdhaXQgdGhpcy5uYXZpZ2F0ZVRvKFRSQU5TQUNUSU9OU19VUkwpO1xuXG4gICAgY29uc3QgYWNjb3VudHMgPSBhd2FpdCBmZXRjaEFjY291bnRzKHRoaXMucGFnZSwgc3RhcnRNb21lbnQpO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIHN1Y2Nlc3M6IHRydWUsXG4gICAgICBhY2NvdW50cyxcbiAgICB9O1xuICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IFVuaW9uQmFua1NjcmFwZXI7XG4iXX0=