israeli-bank-scrapers 6.1.1 → 6.1.2

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 (79) hide show
  1. package/lib/assertNever.js +7 -5
  2. package/lib/constants.js +16 -13
  3. package/lib/definitions.js +113 -109
  4. package/lib/helpers/browser.js +13 -9
  5. package/lib/helpers/dates.js +19 -18
  6. package/lib/helpers/debug.js +9 -9
  7. package/lib/helpers/elements-interactions.js +82 -78
  8. package/lib/helpers/fetch.js +85 -82
  9. package/lib/helpers/navigation.js +28 -24
  10. package/lib/helpers/storage.js +11 -10
  11. package/lib/helpers/transactions.js +32 -33
  12. package/lib/helpers/waiting.js +42 -45
  13. package/lib/index.js +82 -15
  14. package/lib/scrapers/amex.js +13 -11
  15. package/lib/scrapers/amex.test.d.ts +1 -0
  16. package/lib/scrapers/amex.test.js +49 -0
  17. package/lib/scrapers/base-beinleumi-group.js +239 -233
  18. package/lib/scrapers/base-isracard-amex.js +273 -273
  19. package/lib/scrapers/base-scraper-with-browser.js +263 -241
  20. package/lib/scrapers/base-scraper-with-browser.test.d.ts +1 -0
  21. package/lib/scrapers/base-scraper-with-browser.test.js +53 -0
  22. package/lib/scrapers/base-scraper.js +82 -82
  23. package/lib/scrapers/behatsdaa.js +103 -98
  24. package/lib/scrapers/behatsdaa.test.d.ts +1 -0
  25. package/lib/scrapers/behatsdaa.test.js +46 -0
  26. package/lib/scrapers/beinleumi.js +13 -11
  27. package/lib/scrapers/beinleumi.test.d.ts +1 -0
  28. package/lib/scrapers/beinleumi.test.js +47 -0
  29. package/lib/scrapers/beyahad-bishvilha.js +132 -132
  30. package/lib/scrapers/beyahad-bishvilha.test.d.ts +1 -0
  31. package/lib/scrapers/beyahad-bishvilha.test.js +47 -0
  32. package/lib/scrapers/discount.js +101 -97
  33. package/lib/scrapers/discount.test.d.ts +1 -0
  34. package/lib/scrapers/discount.test.js +49 -0
  35. package/lib/scrapers/errors.js +25 -22
  36. package/lib/scrapers/factory.js +67 -66
  37. package/lib/scrapers/factory.test.d.ts +1 -0
  38. package/lib/scrapers/factory.test.js +19 -0
  39. package/lib/scrapers/hapoalim.js +175 -162
  40. package/lib/scrapers/hapoalim.test.d.ts +1 -0
  41. package/lib/scrapers/hapoalim.test.js +47 -0
  42. package/lib/scrapers/interface.js +5 -2
  43. package/lib/scrapers/isracard.js +13 -11
  44. package/lib/scrapers/isracard.test.d.ts +1 -0
  45. package/lib/scrapers/isracard.test.js +49 -0
  46. package/lib/scrapers/leumi.js +170 -167
  47. package/lib/scrapers/leumi.test.d.ts +1 -0
  48. package/lib/scrapers/leumi.test.js +47 -0
  49. package/lib/scrapers/massad.js +13 -11
  50. package/lib/scrapers/max.js +261 -261
  51. package/lib/scrapers/max.test.d.ts +1 -0
  52. package/lib/scrapers/max.test.js +65 -0
  53. package/lib/scrapers/mercantile.js +16 -14
  54. package/lib/scrapers/mercantile.test.d.ts +1 -0
  55. package/lib/scrapers/mercantile.test.js +45 -0
  56. package/lib/scrapers/mizrahi.js +154 -158
  57. package/lib/scrapers/mizrahi.test.d.ts +1 -0
  58. package/lib/scrapers/mizrahi.test.js +53 -0
  59. package/lib/scrapers/one-zero-queries.js +7 -4
  60. package/lib/scrapers/one-zero.js +221 -176
  61. package/lib/scrapers/one-zero.test.d.ts +1 -0
  62. package/lib/scrapers/one-zero.test.js +51 -0
  63. package/lib/scrapers/otsar-hahayal.js +13 -11
  64. package/lib/scrapers/otsar-hahayal.test.d.ts +1 -0
  65. package/lib/scrapers/otsar-hahayal.test.js +47 -0
  66. package/lib/scrapers/pagi.js +13 -11
  67. package/lib/scrapers/pagi.test.d.ts +1 -0
  68. package/lib/scrapers/pagi.test.js +47 -0
  69. package/lib/scrapers/union-bank.js +173 -172
  70. package/lib/scrapers/union-bank.test.d.ts +1 -0
  71. package/lib/scrapers/union-bank.test.js +47 -0
  72. package/lib/scrapers/visa-cal.js +250 -254
  73. package/lib/scrapers/visa-cal.test.d.ts +1 -0
  74. package/lib/scrapers/visa-cal.test.js +49 -0
  75. package/lib/scrapers/yahav.js +206 -190
  76. package/lib/scrapers/yahav.test.d.ts +1 -0
  77. package/lib/scrapers/yahav.test.js +49 -0
  78. package/lib/transactions.js +16 -13
  79. package/package.json +8 -3
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,49 @@
1
+ "use strict";
2
+
3
+ var _definitions = require("../definitions");
4
+ var _testsUtils = require("../tests/tests-utils");
5
+ var _baseScraperWithBrowser = require("./base-scraper-with-browser");
6
+ var _visaCal = _interopRequireDefault(require("./visa-cal"));
7
+ function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
8
+ const COMPANY_ID = 'visaCal'; // TODO this property should be hard-coded in the provider
9
+ const testsConfig = (0, _testsUtils.getTestsConfig)();
10
+ describe('VisaCal legacy scraper', () => {
11
+ beforeAll(() => {
12
+ (0, _testsUtils.extendAsyncTimeout)(); // The default timeout is 5 seconds per async test, this function extends the timeout value
13
+ });
14
+ test('should expose login fields in scrapers constant', () => {
15
+ expect(_definitions.SCRAPERS.visaCal).toBeDefined();
16
+ expect(_definitions.SCRAPERS.visaCal.loginFields).toContain('username');
17
+ expect(_definitions.SCRAPERS.visaCal.loginFields).toContain('password');
18
+ });
19
+ (0, _testsUtils.maybeTestCompanyAPI)(COMPANY_ID, config => config.companyAPI.invalidPassword)('should fail on invalid user/password"', async () => {
20
+ const options = {
21
+ ...testsConfig.options,
22
+ companyId: COMPANY_ID
23
+ };
24
+ const scraper = new _visaCal.default(options);
25
+ const result = await scraper.scrape({
26
+ username: '971sddksmsl',
27
+ password: '3f3ssdkSD3d'
28
+ });
29
+ expect(result).toBeDefined();
30
+ expect(result.success).toBeFalsy();
31
+ expect(result.errorType).toBe(_baseScraperWithBrowser.LoginResults.InvalidPassword);
32
+ });
33
+ (0, _testsUtils.maybeTestCompanyAPI)(COMPANY_ID)('should scrape transactions"', async () => {
34
+ const options = {
35
+ ...testsConfig.options,
36
+ companyId: COMPANY_ID
37
+ };
38
+ const scraper = new _visaCal.default(options);
39
+ const result = await scraper.scrape(testsConfig.credentials.visaCal);
40
+ expect(result).toBeDefined();
41
+ const error = `${result.errorType || ''} ${result.errorMessage || ''}`.trim();
42
+ expect(error).toBe('');
43
+ expect(result.success).toBeTruthy();
44
+ // uncomment to test multiple accounts
45
+ // expect(result?.accounts?.length).toEqual(2)
46
+ (0, _testsUtils.exportTransactions)(COMPANY_ID, result.accounts || []);
47
+ });
48
+ });
49
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfZGVmaW5pdGlvbnMiLCJyZXF1aXJlIiwiX3Rlc3RzVXRpbHMiLCJfYmFzZVNjcmFwZXJXaXRoQnJvd3NlciIsIl92aXNhQ2FsIiwiX2ludGVyb3BSZXF1aXJlRGVmYXVsdCIsImUiLCJfX2VzTW9kdWxlIiwiZGVmYXVsdCIsIkNPTVBBTllfSUQiLCJ0ZXN0c0NvbmZpZyIsImdldFRlc3RzQ29uZmlnIiwiZGVzY3JpYmUiLCJiZWZvcmVBbGwiLCJleHRlbmRBc3luY1RpbWVvdXQiLCJ0ZXN0IiwiZXhwZWN0IiwiU0NSQVBFUlMiLCJ2aXNhQ2FsIiwidG9CZURlZmluZWQiLCJsb2dpbkZpZWxkcyIsInRvQ29udGFpbiIsIm1heWJlVGVzdENvbXBhbnlBUEkiLCJjb25maWciLCJjb21wYW55QVBJIiwiaW52YWxpZFBhc3N3b3JkIiwib3B0aW9ucyIsImNvbXBhbnlJZCIsInNjcmFwZXIiLCJWaXNhQ2FsU2NyYXBlciIsInJlc3VsdCIsInNjcmFwZSIsInVzZXJuYW1lIiwicGFzc3dvcmQiLCJzdWNjZXNzIiwidG9CZUZhbHN5IiwiZXJyb3JUeXBlIiwidG9CZSIsIkxvZ2luUmVzdWx0cyIsIkludmFsaWRQYXNzd29yZCIsImNyZWRlbnRpYWxzIiwiZXJyb3IiLCJlcnJvck1lc3NhZ2UiLCJ0cmltIiwidG9CZVRydXRoeSIsImV4cG9ydFRyYW5zYWN0aW9ucyIsImFjY291bnRzIl0sInNvdXJjZXMiOlsiLi4vLi4vc3JjL3NjcmFwZXJzL3Zpc2EtY2FsLnRlc3QudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgU0NSQVBFUlMgfSBmcm9tICcuLi9kZWZpbml0aW9ucyc7XG5pbXBvcnQgeyBleHBvcnRUcmFuc2FjdGlvbnMsIGV4dGVuZEFzeW5jVGltZW91dCwgZ2V0VGVzdHNDb25maWcsIG1heWJlVGVzdENvbXBhbnlBUEkgfSBmcm9tICcuLi90ZXN0cy90ZXN0cy11dGlscyc7XG5pbXBvcnQgeyBMb2dpblJlc3VsdHMgfSBmcm9tICcuL2Jhc2Utc2NyYXBlci13aXRoLWJyb3dzZXInO1xuaW1wb3J0IFZpc2FDYWxTY3JhcGVyIGZyb20gJy4vdmlzYS1jYWwnO1xuXG5jb25zdCBDT01QQU5ZX0lEID0gJ3Zpc2FDYWwnOyAvLyBUT0RPIHRoaXMgcHJvcGVydHkgc2hvdWxkIGJlIGhhcmQtY29kZWQgaW4gdGhlIHByb3ZpZGVyXG5jb25zdCB0ZXN0c0NvbmZpZyA9IGdldFRlc3RzQ29uZmlnKCk7XG5cbmRlc2NyaWJlKCdWaXNhQ2FsIGxlZ2FjeSBzY3JhcGVyJywgKCkgPT4ge1xuICBiZWZvcmVBbGwoKCkgPT4ge1xuICAgIGV4dGVuZEFzeW5jVGltZW91dCgpOyAvLyBUaGUgZGVmYXVsdCB0aW1lb3V0IGlzIDUgc2Vjb25kcyBwZXIgYXN5bmMgdGVzdCwgdGhpcyBmdW5jdGlvbiBleHRlbmRzIHRoZSB0aW1lb3V0IHZhbHVlXG4gIH0pO1xuXG4gIHRlc3QoJ3Nob3VsZCBleHBvc2UgbG9naW4gZmllbGRzIGluIHNjcmFwZXJzIGNvbnN0YW50JywgKCkgPT4ge1xuICAgIGV4cGVjdChTQ1JBUEVSUy52aXNhQ2FsKS50b0JlRGVmaW5lZCgpO1xuICAgIGV4cGVjdChTQ1JBUEVSUy52aXNhQ2FsLmxvZ2luRmllbGRzKS50b0NvbnRhaW4oJ3VzZXJuYW1lJyk7XG4gICAgZXhwZWN0KFNDUkFQRVJTLnZpc2FDYWwubG9naW5GaWVsZHMpLnRvQ29udGFpbigncGFzc3dvcmQnKTtcbiAgfSk7XG5cbiAgbWF5YmVUZXN0Q29tcGFueUFQSShDT01QQU5ZX0lELCBjb25maWcgPT4gY29uZmlnLmNvbXBhbnlBUEkuaW52YWxpZFBhc3N3b3JkKShcbiAgICAnc2hvdWxkIGZhaWwgb24gaW52YWxpZCB1c2VyL3Bhc3N3b3JkXCInLFxuICAgIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IG9wdGlvbnMgPSB7XG4gICAgICAgIC4uLnRlc3RzQ29uZmlnLm9wdGlvbnMsXG4gICAgICAgIGNvbXBhbnlJZDogQ09NUEFOWV9JRCxcbiAgICAgIH07XG5cbiAgICAgIGNvbnN0IHNjcmFwZXIgPSBuZXcgVmlzYUNhbFNjcmFwZXIob3B0aW9ucyk7XG5cbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHNjcmFwZXIuc2NyYXBlKHsgdXNlcm5hbWU6ICc5NzFzZGRrc21zbCcsIHBhc3N3b3JkOiAnM2Yzc3Nka1NEM2QnIH0pO1xuXG4gICAgICBleHBlY3QocmVzdWx0KS50b0JlRGVmaW5lZCgpO1xuICAgICAgZXhwZWN0KHJlc3VsdC5zdWNjZXNzKS50b0JlRmFsc3koKTtcbiAgICAgIGV4cGVjdChyZXN1bHQuZXJyb3JUeXBlKS50b0JlKExvZ2luUmVzdWx0cy5JbnZhbGlkUGFzc3dvcmQpO1xuICAgIH0sXG4gICk7XG5cbiAgbWF5YmVUZXN0Q29tcGFueUFQSShDT01QQU5ZX0lEKSgnc2hvdWxkIHNjcmFwZSB0cmFuc2FjdGlvbnNcIicsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBvcHRpb25zID0ge1xuICAgICAgLi4udGVzdHNDb25maWcub3B0aW9ucyxcbiAgICAgIGNvbXBhbnlJZDogQ09NUEFOWV9JRCxcbiAgICB9O1xuXG4gICAgY29uc3Qgc2NyYXBlciA9IG5ldyBWaXNhQ2FsU2NyYXBlcihvcHRpb25zKTtcbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBzY3JhcGVyLnNjcmFwZSh0ZXN0c0NvbmZpZy5jcmVkZW50aWFscy52aXNhQ2FsKTtcbiAgICBleHBlY3QocmVzdWx0KS50b0JlRGVmaW5lZCgpO1xuICAgIGNvbnN0IGVycm9yID0gYCR7cmVzdWx0LmVycm9yVHlwZSB8fCAnJ30gJHtyZXN1bHQuZXJyb3JNZXNzYWdlIHx8ICcnfWAudHJpbSgpO1xuICAgIGV4cGVjdChlcnJvcikudG9CZSgnJyk7XG4gICAgZXhwZWN0KHJlc3VsdC5zdWNjZXNzKS50b0JlVHJ1dGh5KCk7XG4gICAgLy8gdW5jb21tZW50IHRvIHRlc3QgbXVsdGlwbGUgYWNjb3VudHNcbiAgICAvLyBleHBlY3QocmVzdWx0Py5hY2NvdW50cz8ubGVuZ3RoKS50b0VxdWFsKDIpXG4gICAgZXhwb3J0VHJhbnNhY3Rpb25zKENPTVBBTllfSUQsIHJlc3VsdC5hY2NvdW50cyB8fCBbXSk7XG4gIH0pO1xufSk7XG4iXSwibWFwcGluZ3MiOiI7O0FBQUEsSUFBQUEsWUFBQSxHQUFBQyxPQUFBO0FBQ0EsSUFBQUMsV0FBQSxHQUFBRCxPQUFBO0FBQ0EsSUFBQUUsdUJBQUEsR0FBQUYsT0FBQTtBQUNBLElBQUFHLFFBQUEsR0FBQUMsc0JBQUEsQ0FBQUosT0FBQTtBQUF3QyxTQUFBSSx1QkFBQUMsQ0FBQSxXQUFBQSxDQUFBLElBQUFBLENBQUEsQ0FBQUMsVUFBQSxHQUFBRCxDQUFBLEtBQUFFLE9BQUEsRUFBQUYsQ0FBQTtBQUV4QyxNQUFNRyxVQUFVLEdBQUcsU0FBUyxDQUFDLENBQUM7QUFDOUIsTUFBTUMsV0FBVyxHQUFHLElBQUFDLDBCQUFjLEVBQUMsQ0FBQztBQUVwQ0MsUUFBUSxDQUFDLHdCQUF3QixFQUFFLE1BQU07RUFDdkNDLFNBQVMsQ0FBQyxNQUFNO0lBQ2QsSUFBQUMsOEJBQWtCLEVBQUMsQ0FBQyxDQUFDLENBQUM7RUFDeEIsQ0FBQyxDQUFDO0VBRUZDLElBQUksQ0FBQyxpREFBaUQsRUFBRSxNQUFNO0lBQzVEQyxNQUFNLENBQUNDLHFCQUFRLENBQUNDLE9BQU8sQ0FBQyxDQUFDQyxXQUFXLENBQUMsQ0FBQztJQUN0Q0gsTUFBTSxDQUFDQyxxQkFBUSxDQUFDQyxPQUFPLENBQUNFLFdBQVcsQ0FBQyxDQUFDQyxTQUFTLENBQUMsVUFBVSxDQUFDO0lBQzFETCxNQUFNLENBQUNDLHFCQUFRLENBQUNDLE9BQU8sQ0FBQ0UsV0FBVyxDQUFDLENBQUNDLFNBQVMsQ0FBQyxVQUFVLENBQUM7RUFDNUQsQ0FBQyxDQUFDO0VBRUYsSUFBQUMsK0JBQW1CLEVBQUNiLFVBQVUsRUFBRWMsTUFBTSxJQUFJQSxNQUFNLENBQUNDLFVBQVUsQ0FBQ0MsZUFBZSxDQUFDLENBQzFFLHVDQUF1QyxFQUN2QyxZQUFZO0lBQ1YsTUFBTUMsT0FBTyxHQUFHO01BQ2QsR0FBR2hCLFdBQVcsQ0FBQ2dCLE9BQU87TUFDdEJDLFNBQVMsRUFBRWxCO0lBQ2IsQ0FBQztJQUVELE1BQU1tQixPQUFPLEdBQUcsSUFBSUMsZ0JBQWMsQ0FBQ0gsT0FBTyxDQUFDO0lBRTNDLE1BQU1JLE1BQU0sR0FBRyxNQUFNRixPQUFPLENBQUNHLE1BQU0sQ0FBQztNQUFFQyxRQUFRLEVBQUUsYUFBYTtNQUFFQyxRQUFRLEVBQUU7SUFBYyxDQUFDLENBQUM7SUFFekZqQixNQUFNLENBQUNjLE1BQU0sQ0FBQyxDQUFDWCxXQUFXLENBQUMsQ0FBQztJQUM1QkgsTUFBTSxDQUFDYyxNQUFNLENBQUNJLE9BQU8sQ0FBQyxDQUFDQyxTQUFTLENBQUMsQ0FBQztJQUNsQ25CLE1BQU0sQ0FBQ2MsTUFBTSxDQUFDTSxTQUFTLENBQUMsQ0FBQ0MsSUFBSSxDQUFDQyxvQ0FBWSxDQUFDQyxlQUFlLENBQUM7RUFDN0QsQ0FDRixDQUFDO0VBRUQsSUFBQWpCLCtCQUFtQixFQUFDYixVQUFVLENBQUMsQ0FBQyw2QkFBNkIsRUFBRSxZQUFZO0lBQ3pFLE1BQU1pQixPQUFPLEdBQUc7TUFDZCxHQUFHaEIsV0FBVyxDQUFDZ0IsT0FBTztNQUN0QkMsU0FBUyxFQUFFbEI7SUFDYixDQUFDO0lBRUQsTUFBTW1CLE9BQU8sR0FBRyxJQUFJQyxnQkFBYyxDQUFDSCxPQUFPLENBQUM7SUFDM0MsTUFBTUksTUFBTSxHQUFHLE1BQU1GLE9BQU8sQ0FBQ0csTUFBTSxDQUFDckIsV0FBVyxDQUFDOEIsV0FBVyxDQUFDdEIsT0FBTyxDQUFDO0lBQ3BFRixNQUFNLENBQUNjLE1BQU0sQ0FBQyxDQUFDWCxXQUFXLENBQUMsQ0FBQztJQUM1QixNQUFNc0IsS0FBSyxHQUFHLEdBQUdYLE1BQU0sQ0FBQ00sU0FBUyxJQUFJLEVBQUUsSUFBSU4sTUFBTSxDQUFDWSxZQUFZLElBQUksRUFBRSxFQUFFLENBQUNDLElBQUksQ0FBQyxDQUFDO0lBQzdFM0IsTUFBTSxDQUFDeUIsS0FBSyxDQUFDLENBQUNKLElBQUksQ0FBQyxFQUFFLENBQUM7SUFDdEJyQixNQUFNLENBQUNjLE1BQU0sQ0FBQ0ksT0FBTyxDQUFDLENBQUNVLFVBQVUsQ0FBQyxDQUFDO0lBQ25DO0lBQ0E7SUFDQSxJQUFBQyw4QkFBa0IsRUFBQ3BDLFVBQVUsRUFBRXFCLE1BQU0sQ0FBQ2dCLFFBQVEsSUFBSSxFQUFFLENBQUM7RUFDdkQsQ0FBQyxDQUFDO0FBQ0osQ0FBQyxDQUFDIiwiaWdub3JlTGlzdCI6W119
@@ -1,14 +1,16 @@
1
1
  "use strict";
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");
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.default = void 0;
7
+ var _moment = _interopRequireDefault(require("moment"));
8
+ var _constants = require("../constants");
9
+ var _elementsInteractions = require("../helpers/elements-interactions");
10
+ var _navigation = require("../helpers/navigation");
11
+ var _transactions = require("../transactions");
12
+ var _baseScraperWithBrowser = require("./base-scraper-with-browser");
13
+ function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
12
14
  const LOGIN_URL = 'https://login.yahav.co.il/login/';
13
15
  const BASE_URL = 'https://digital.yahav.co.il/BaNCSDigitalUI/app/index.html#/';
14
16
  const INVALID_DETAILS_SELECTOR = '.ui-dialog-buttons';
@@ -22,210 +24,224 @@ const PASSWD_ELEM = '#password';
22
24
  const NATIONALID_ELEM = '#pinno';
23
25
  const SUBMIT_LOGIN_SELECTOR = '.btn';
24
26
  function getPossibleLoginResults(page) {
25
- // checkout file `base-scraper-with-browser.ts` for available result types
26
- const urls = {};
27
- urls[base_scraper_with_browser_1.LoginResults.Success] = [`${BASE_WELCOME_URL}`];
28
- urls[base_scraper_with_browser_1.LoginResults.InvalidPassword] = [
29
- async () => {
30
- return (0, elements_interactions_1.elementPresentOnPage)(page, `${INVALID_DETAILS_SELECTOR}`);
31
- },
32
- ];
33
- urls[base_scraper_with_browser_1.LoginResults.ChangePassword] = [
34
- async () => {
35
- return (0, elements_interactions_1.elementPresentOnPage)(page, `${CHANGE_PASSWORD_OLD_PASS}`);
36
- },
37
- ];
38
- return urls;
27
+ // checkout file `base-scraper-with-browser.ts` for available result types
28
+ const urls = {};
29
+ urls[_baseScraperWithBrowser.LoginResults.Success] = [`${BASE_WELCOME_URL}`];
30
+ urls[_baseScraperWithBrowser.LoginResults.InvalidPassword] = [async () => {
31
+ return (0, _elementsInteractions.elementPresentOnPage)(page, `${INVALID_DETAILS_SELECTOR}`);
32
+ }];
33
+ urls[_baseScraperWithBrowser.LoginResults.ChangePassword] = [async () => {
34
+ return (0, _elementsInteractions.elementPresentOnPage)(page, `${CHANGE_PASSWORD_OLD_PASS}`);
35
+ }];
36
+ return urls;
39
37
  }
40
38
  async function getAccountID(page) {
41
- try {
42
- const selectedSnifAccount = await page.$eval(ACCOUNT_ID_SELECTOR, (element) => {
43
- return element.textContent;
44
- });
45
- return selectedSnifAccount;
46
- }
47
- catch (error) {
48
- const errorMessage = error instanceof Error ? error.message : String(error);
49
- throw new Error(`Failed to retrieve account ID. Possible outdated selector '${ACCOUNT_ID_SELECTOR}: ${errorMessage}`);
50
- }
39
+ try {
40
+ const selectedSnifAccount = await page.$eval(ACCOUNT_ID_SELECTOR, element => {
41
+ return element.textContent;
42
+ });
43
+ return selectedSnifAccount;
44
+ } catch (error) {
45
+ const errorMessage = error instanceof Error ? error.message : String(error);
46
+ throw new Error(`Failed to retrieve account ID. Possible outdated selector '${ACCOUNT_ID_SELECTOR}: ${errorMessage}`);
47
+ }
51
48
  }
52
49
  function getAmountData(amountStr) {
53
- const amountStrCopy = amountStr.replace(',', '');
54
- return parseFloat(amountStrCopy);
50
+ const amountStrCopy = amountStr.replace(',', '');
51
+ return parseFloat(amountStrCopy);
55
52
  }
56
53
  function getTxnAmount(txn) {
57
- const credit = getAmountData(txn.credit);
58
- const debit = getAmountData(txn.debit);
59
- return (Number.isNaN(credit) ? 0 : credit) - (Number.isNaN(debit) ? 0 : debit);
54
+ const credit = getAmountData(txn.credit);
55
+ const debit = getAmountData(txn.debit);
56
+ return (Number.isNaN(credit) ? 0 : credit) - (Number.isNaN(debit) ? 0 : debit);
60
57
  }
61
58
  function convertTransactions(txns) {
62
- return txns.map(txn => {
63
- const convertedDate = (0, moment_1.default)(txn.date, DATE_FORMAT).toISOString();
64
- const convertedAmount = getTxnAmount(txn);
65
- return {
66
- type: transactions_1.TransactionTypes.Normal,
67
- identifier: txn.reference ? parseInt(txn.reference, 10) : undefined,
68
- date: convertedDate,
69
- processedDate: convertedDate,
70
- originalAmount: convertedAmount,
71
- originalCurrency: constants_1.SHEKEL_CURRENCY,
72
- chargedAmount: convertedAmount,
73
- status: txn.status,
74
- description: txn.description,
75
- memo: txn.memo,
76
- };
77
- });
59
+ return txns.map(txn => {
60
+ const convertedDate = (0, _moment.default)(txn.date, DATE_FORMAT).toISOString();
61
+ const convertedAmount = getTxnAmount(txn);
62
+ return {
63
+ type: _transactions.TransactionTypes.Normal,
64
+ identifier: txn.reference ? parseInt(txn.reference, 10) : undefined,
65
+ date: convertedDate,
66
+ processedDate: convertedDate,
67
+ originalAmount: convertedAmount,
68
+ originalCurrency: _constants.SHEKEL_CURRENCY,
69
+ chargedAmount: convertedAmount,
70
+ status: txn.status,
71
+ description: txn.description,
72
+ memo: txn.memo
73
+ };
74
+ });
78
75
  }
79
76
  function handleTransactionRow(txns, txnRow) {
80
- const div = txnRow.innerDivs;
81
- // Remove anything except digits.
82
- const regex = /\D+/gm;
83
- const tx = {
84
- date: div[1],
85
- reference: div[2].replace(regex, ''),
86
- memo: '',
87
- description: div[3],
88
- debit: div[4],
89
- credit: div[5],
90
- status: transactions_1.TransactionStatuses.Completed,
91
- };
92
- txns.push(tx);
77
+ const div = txnRow.innerDivs;
78
+
79
+ // Remove anything except digits.
80
+ const regex = /\D+/gm;
81
+ const tx = {
82
+ date: div[1],
83
+ reference: div[2].replace(regex, ''),
84
+ memo: '',
85
+ description: div[3],
86
+ debit: div[4],
87
+ credit: div[5],
88
+ status: _transactions.TransactionStatuses.Completed
89
+ };
90
+ txns.push(tx);
93
91
  }
94
92
  async function getAccountTransactions(page) {
95
- // Wait for transactions.
96
- await (0, elements_interactions_1.waitUntilElementFound)(page, '.under-line-txn-table-header', true);
97
- const txns = [];
98
- const transactionsDivs = await (0, elements_interactions_1.pageEvalAll)(page, '.list-item-holder .entire-content-ctr', [], divs => {
99
- return divs.map(div => ({
100
- id: div.getAttribute('id') || '',
101
- innerDivs: Array.from(div.getElementsByTagName('div')).map(el => el.innerText),
102
- }));
103
- });
104
- for (const txnRow of transactionsDivs) {
105
- handleTransactionRow(txns, txnRow);
106
- }
107
- return convertTransactions(txns);
93
+ // Wait for transactions.
94
+ await (0, _elementsInteractions.waitUntilElementFound)(page, '.under-line-txn-table-header', true);
95
+ const txns = [];
96
+ const transactionsDivs = await (0, _elementsInteractions.pageEvalAll)(page, '.list-item-holder .entire-content-ctr', [], divs => {
97
+ return divs.map(div => ({
98
+ id: div.getAttribute('id') || '',
99
+ innerDivs: Array.from(div.getElementsByTagName('div')).map(el => el.innerText)
100
+ }));
101
+ });
102
+ for (const txnRow of transactionsDivs) {
103
+ handleTransactionRow(txns, txnRow);
104
+ }
105
+ return convertTransactions(txns);
108
106
  }
107
+
109
108
  // Manipulate the calendar drop down to choose the txs start date.
110
109
  async function searchByDates(page, startDate) {
111
- // Get the day number from startDate. 1-31 (usually 1)
112
- const startDateDay = startDate.format('D');
113
- const startDateMonth = startDate.format('M');
114
- const startDateYear = startDate.format('Y');
115
- // Open the calendar date picker
116
- const dateFromPick = 'div.date-options-cell:nth-child(7) > date-picker:nth-child(1) > div:nth-child(1) > span:nth-child(2)';
117
- await (0, elements_interactions_1.waitUntilElementFound)(page, dateFromPick, true);
118
- await (0, elements_interactions_1.clickButton)(page, dateFromPick);
119
- // Wait until first day appear.
120
- await (0, elements_interactions_1.waitUntilElementFound)(page, '.pmu-days > div:nth-child(1)', true);
121
- // Open Months options.
122
- const monthFromPick = '.pmu-month';
123
- await (0, elements_interactions_1.waitUntilElementFound)(page, monthFromPick, true);
124
- await (0, elements_interactions_1.clickButton)(page, monthFromPick);
125
- await (0, elements_interactions_1.waitUntilElementFound)(page, '.pmu-months > div:nth-child(1)', true);
126
- // Open Year options.
127
- // Use same selector... Yahav knows why...
128
- await (0, elements_interactions_1.waitUntilElementFound)(page, monthFromPick, true);
129
- await (0, elements_interactions_1.clickButton)(page, monthFromPick);
130
- await (0, elements_interactions_1.waitUntilElementFound)(page, '.pmu-years > div:nth-child(1)', true);
131
- // Select year from a 12 year grid.
132
- for (let i = 1; i < 13; i += 1) {
133
- const selector = `.pmu-years > div:nth-child(${i})`;
134
- const year = await page.$eval(selector, y => {
135
- return y.innerText;
136
- });
137
- if (startDateYear === year) {
138
- await (0, elements_interactions_1.clickButton)(page, selector);
139
- break;
140
- }
110
+ // Get the day number from startDate. 1-31 (usually 1)
111
+ const startDateDay = startDate.format('D');
112
+ const startDateMonth = startDate.format('M');
113
+ const startDateYear = startDate.format('Y');
114
+
115
+ // Open the calendar date picker
116
+ const dateFromPick = 'div.date-options-cell:nth-child(7) > date-picker:nth-child(1) > div:nth-child(1) > span:nth-child(2)';
117
+ await (0, _elementsInteractions.waitUntilElementFound)(page, dateFromPick, true);
118
+ await (0, _elementsInteractions.clickButton)(page, dateFromPick);
119
+
120
+ // Wait until first day appear.
121
+ await (0, _elementsInteractions.waitUntilElementFound)(page, '.pmu-days > div:nth-child(1)', true);
122
+
123
+ // Open Months options.
124
+ const monthFromPick = '.pmu-month';
125
+ await (0, _elementsInteractions.waitUntilElementFound)(page, monthFromPick, true);
126
+ await (0, _elementsInteractions.clickButton)(page, monthFromPick);
127
+ await (0, _elementsInteractions.waitUntilElementFound)(page, '.pmu-months > div:nth-child(1)', true);
128
+
129
+ // Open Year options.
130
+ // Use same selector... Yahav knows why...
131
+ await (0, _elementsInteractions.waitUntilElementFound)(page, monthFromPick, true);
132
+ await (0, _elementsInteractions.clickButton)(page, monthFromPick);
133
+ await (0, _elementsInteractions.waitUntilElementFound)(page, '.pmu-years > div:nth-child(1)', true);
134
+
135
+ // Select year from a 12 year grid.
136
+ for (let i = 1; i < 13; i += 1) {
137
+ const selector = `.pmu-years > div:nth-child(${i})`;
138
+ const year = await page.$eval(selector, y => {
139
+ return y.innerText;
140
+ });
141
+ if (startDateYear === year) {
142
+ await (0, _elementsInteractions.clickButton)(page, selector);
143
+ break;
141
144
  }
142
- // Select Month.
143
- await (0, elements_interactions_1.waitUntilElementFound)(page, '.pmu-months > div:nth-child(1)', true);
144
- // The first element (1) is January.
145
- const monthSelector = `.pmu-months > div:nth-child(${startDateMonth})`;
146
- await (0, elements_interactions_1.clickButton)(page, monthSelector);
147
- // Select Day.
148
- // The calendar grid shows 7 days and 6 weeks = 42 days.
149
- // In theory, the first day of the month will be in the first row.
150
- // Let's check everything just in case...
151
- for (let i = 1; i < 42; i += 1) {
152
- const selector = `.pmu-days > div:nth-child(${i})`;
153
- const day = await page.$eval(selector, d => {
154
- return d.innerText;
155
- });
156
- if (startDateDay === day) {
157
- await (0, elements_interactions_1.clickButton)(page, selector);
158
- break;
159
- }
145
+ }
146
+
147
+ // Select Month.
148
+ await (0, _elementsInteractions.waitUntilElementFound)(page, '.pmu-months > div:nth-child(1)', true);
149
+ // The first element (1) is January.
150
+ const monthSelector = `.pmu-months > div:nth-child(${startDateMonth})`;
151
+ await (0, _elementsInteractions.clickButton)(page, monthSelector);
152
+
153
+ // Select Day.
154
+ // The calendar grid shows 7 days and 6 weeks = 42 days.
155
+ // In theory, the first day of the month will be in the first row.
156
+ // Let's check everything just in case...
157
+ for (let i = 1; i < 42; i += 1) {
158
+ const selector = `.pmu-days > div:nth-child(${i})`;
159
+ const day = await page.$eval(selector, d => {
160
+ return d.innerText;
161
+ });
162
+ if (startDateDay === day) {
163
+ await (0, _elementsInteractions.clickButton)(page, selector);
164
+ break;
160
165
  }
166
+ }
161
167
  }
162
168
  async function fetchAccountData(page, startDate, accountID) {
163
- await (0, elements_interactions_1.waitUntilElementDisappear)(page, '.loading-bar-spinner');
164
- await searchByDates(page, startDate);
165
- await (0, elements_interactions_1.waitUntilElementDisappear)(page, '.loading-bar-spinner');
166
- const txns = await getAccountTransactions(page);
167
- return {
168
- accountNumber: accountID,
169
- txns,
170
- };
169
+ await (0, _elementsInteractions.waitUntilElementDisappear)(page, '.loading-bar-spinner');
170
+ await searchByDates(page, startDate);
171
+ await (0, _elementsInteractions.waitUntilElementDisappear)(page, '.loading-bar-spinner');
172
+ const txns = await getAccountTransactions(page);
173
+ return {
174
+ accountNumber: accountID,
175
+ txns
176
+ };
171
177
  }
172
178
  async function fetchAccounts(page, startDate) {
173
- const accounts = [];
174
- // TODO: get more accounts. Not sure is supported.
175
- const accountID = await getAccountID(page);
176
- const accountData = await fetchAccountData(page, startDate, accountID);
177
- accounts.push(accountData);
178
- return accounts;
179
+ const accounts = [];
180
+
181
+ // TODO: get more accounts. Not sure is supported.
182
+ const accountID = await getAccountID(page);
183
+ const accountData = await fetchAccountData(page, startDate, accountID);
184
+ accounts.push(accountData);
185
+ return accounts;
179
186
  }
180
187
  async function waitReadinessForAll(page) {
181
- await (0, elements_interactions_1.waitUntilElementFound)(page, `${USER_ELEM}`, true);
182
- await (0, elements_interactions_1.waitUntilElementFound)(page, `${PASSWD_ELEM}`, true);
183
- await (0, elements_interactions_1.waitUntilElementFound)(page, `${NATIONALID_ELEM}`, true);
184
- await (0, elements_interactions_1.waitUntilElementFound)(page, `${SUBMIT_LOGIN_SELECTOR}`, true);
188
+ await (0, _elementsInteractions.waitUntilElementFound)(page, `${USER_ELEM}`, true);
189
+ await (0, _elementsInteractions.waitUntilElementFound)(page, `${PASSWD_ELEM}`, true);
190
+ await (0, _elementsInteractions.waitUntilElementFound)(page, `${NATIONALID_ELEM}`, true);
191
+ await (0, _elementsInteractions.waitUntilElementFound)(page, `${SUBMIT_LOGIN_SELECTOR}`, true);
185
192
  }
186
193
  async function redirectOrDialog(page) {
187
- // Click on bank messages if any.
188
- await (0, navigation_1.waitForNavigation)(page);
189
- await (0, elements_interactions_1.waitUntilElementDisappear)(page, '.loading-bar-spinner');
190
- const hasMessage = await (0, elements_interactions_1.elementPresentOnPage)(page, '.messaging-links-container');
191
- if (hasMessage) {
192
- await (0, elements_interactions_1.clickButton)(page, '.link-1');
193
- }
194
- const promise1 = page.waitForSelector(ACCOUNT_DETAILS_SELECTOR, { timeout: 30000 });
195
- const promise2 = page.waitForSelector(CHANGE_PASSWORD_OLD_PASS, { timeout: 30000 });
196
- const promises = [promise1, promise2];
197
- await Promise.race(promises);
198
- await (0, elements_interactions_1.waitUntilElementDisappear)(page, '.loading-bar-spinner');
194
+ // Click on bank messages if any.
195
+ await (0, _navigation.waitForNavigation)(page);
196
+ await (0, _elementsInteractions.waitUntilElementDisappear)(page, '.loading-bar-spinner');
197
+ const hasMessage = await (0, _elementsInteractions.elementPresentOnPage)(page, '.messaging-links-container');
198
+ if (hasMessage) {
199
+ await (0, _elementsInteractions.clickButton)(page, '.link-1');
200
+ }
201
+ const promise1 = page.waitForSelector(ACCOUNT_DETAILS_SELECTOR, {
202
+ timeout: 30000
203
+ });
204
+ const promise2 = page.waitForSelector(CHANGE_PASSWORD_OLD_PASS, {
205
+ timeout: 30000
206
+ });
207
+ const promises = [promise1, promise2];
208
+ await Promise.race(promises);
209
+ await (0, _elementsInteractions.waitUntilElementDisappear)(page, '.loading-bar-spinner');
199
210
  }
200
- class YahavScraper extends base_scraper_with_browser_1.BaseScraperWithBrowser {
201
- getLoginOptions(credentials) {
202
- return {
203
- loginUrl: `${LOGIN_URL}`,
204
- fields: [
205
- { selector: `${USER_ELEM}`, value: credentials.username },
206
- { selector: `${PASSWD_ELEM}`, value: credentials.password },
207
- { selector: `${NATIONALID_ELEM}`, value: credentials.nationalID },
208
- ],
209
- submitButtonSelector: `${SUBMIT_LOGIN_SELECTOR}`,
210
- checkReadiness: async () => waitReadinessForAll(this.page),
211
- postAction: async () => redirectOrDialog(this.page),
212
- possibleResults: getPossibleLoginResults(this.page),
213
- };
214
- }
215
- async fetchData() {
216
- // Goto statements page
217
- await (0, elements_interactions_1.waitUntilElementFound)(this.page, ACCOUNT_DETAILS_SELECTOR, true);
218
- await (0, elements_interactions_1.clickButton)(this.page, ACCOUNT_DETAILS_SELECTOR);
219
- await (0, elements_interactions_1.waitUntilElementFound)(this.page, '.statement-options .selected-item-top', true);
220
- const defaultStartMoment = (0, moment_1.default)().subtract(3, 'months').add(1, 'day');
221
- const startDate = this.options.startDate || defaultStartMoment.toDate();
222
- const startMoment = moment_1.default.max(defaultStartMoment, (0, moment_1.default)(startDate));
223
- const accounts = await fetchAccounts(this.page, startMoment);
224
- return {
225
- success: true,
226
- accounts,
227
- };
228
- }
211
+ class YahavScraper extends _baseScraperWithBrowser.BaseScraperWithBrowser {
212
+ getLoginOptions(credentials) {
213
+ return {
214
+ loginUrl: `${LOGIN_URL}`,
215
+ fields: [{
216
+ selector: `${USER_ELEM}`,
217
+ value: credentials.username
218
+ }, {
219
+ selector: `${PASSWD_ELEM}`,
220
+ value: credentials.password
221
+ }, {
222
+ selector: `${NATIONALID_ELEM}`,
223
+ value: credentials.nationalID
224
+ }],
225
+ submitButtonSelector: `${SUBMIT_LOGIN_SELECTOR}`,
226
+ checkReadiness: async () => waitReadinessForAll(this.page),
227
+ postAction: async () => redirectOrDialog(this.page),
228
+ possibleResults: getPossibleLoginResults(this.page)
229
+ };
230
+ }
231
+ async fetchData() {
232
+ // Goto statements page
233
+ await (0, _elementsInteractions.waitUntilElementFound)(this.page, ACCOUNT_DETAILS_SELECTOR, true);
234
+ await (0, _elementsInteractions.clickButton)(this.page, ACCOUNT_DETAILS_SELECTOR);
235
+ await (0, _elementsInteractions.waitUntilElementFound)(this.page, '.statement-options .selected-item-top', true);
236
+ const defaultStartMoment = (0, _moment.default)().subtract(3, 'months').add(1, 'day');
237
+ const startDate = this.options.startDate || defaultStartMoment.toDate();
238
+ const startMoment = _moment.default.max(defaultStartMoment, (0, _moment.default)(startDate));
239
+ const accounts = await fetchAccounts(this.page, startMoment);
240
+ return {
241
+ success: true,
242
+ accounts
243
+ };
244
+ }
229
245
  }
230
- exports.default = YahavScraper;
231
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoieWFoYXYuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvc2NyYXBlcnMveWFoYXYudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSxvREFBNkM7QUFFN0MsNENBQStDO0FBQy9DLDRFQU0wQztBQUMxQyxzREFBMEQ7QUFDMUQsa0RBQW9IO0FBQ3BILDJFQUE4RztBQUU5RyxNQUFNLFNBQVMsR0FBRyxrQ0FBa0MsQ0FBQztBQUNyRCxNQUFNLFFBQVEsR0FBRyw2REFBNkQsQ0FBQztBQUMvRSxNQUFNLHdCQUF3QixHQUFHLG9CQUFvQixDQUFDO0FBQ3RELE1BQU0sd0JBQXdCLEdBQUcsdUNBQXVDLENBQUM7QUFDekUsTUFBTSxnQkFBZ0IsR0FBRyxHQUFHLFFBQVEsV0FBVyxDQUFDO0FBRWhELE1BQU0sbUJBQW1CLEdBQUcsOEVBQThFLENBQUM7QUFDM0csTUFBTSx3QkFBd0IsR0FBRyxrQkFBa0IsQ0FBQztBQUNwRCxNQUFNLFdBQVcsR0FBRyxZQUFZLENBQUM7QUFFakMsTUFBTSxTQUFTLEdBQUcsV0FBVyxDQUFDO0FBQzlCLE1BQU0sV0FBVyxHQUFHLFdBQVcsQ0FBQztBQUNoQyxNQUFNLGVBQWUsR0FBRyxRQUFRLENBQUM7QUFDakMsTUFBTSxxQkFBcUIsR0FBRyxNQUFNLENBQUM7QUFZckMsU0FBUyx1QkFBdUIsQ0FBQyxJQUFVO0lBQ3pDLDBFQUEwRTtJQUMxRSxNQUFNLElBQUksR0FBeUIsRUFBRSxDQUFDO0lBQ3RDLElBQUksQ0FBQyx3Q0FBWSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsR0FBRyxnQkFBZ0IsRUFBRSxDQUFDLENBQUM7SUFDckQsSUFBSSxDQUFDLHdDQUFZLENBQUMsZUFBZSxDQUFDLEdBQUc7UUFDbkMsS0FBSyxJQUFJLEVBQUU7WUFDVCxPQUFPLElBQUEsNENBQW9CLEVBQUMsSUFBSSxFQUFFLEdBQUcsd0JBQXdCLEVBQUUsQ0FBQyxDQUFDO1FBQ25FLENBQUM7S0FDRixDQUFDO0lBRUYs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QztRQUN4RSxNQUFNLFdBQVcsR0FBRyxnQkFBTSxDQUFDLEdBQUcsQ0FBQyxrQkFBa0IsRUFBRSxJQUFBLGdCQUFNLEVBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQztRQUV0RSxNQUFNLFFBQVEsR0FBRyxNQUFNLGFBQWEsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLFdBQVcsQ0FBQyxDQUFDO1FBRTdELE9BQU87WUFDTCxPQUFPLEVBQUUsSUFBSTtZQUNiLFFBQVE7U0FDVCxDQUFDO0lBQ0osQ0FBQztDQUNGO0FBRUQsa0JBQWUsWUFBWSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IG1vbWVudCwgeyB0eXBlIE1vbWVudCB9IGZyb20gJ21vbWVudCc7XG5pbXBvcnQgeyB0eXBlIFBhZ2UgfSBmcm9tICdwdXBwZXRlZXInO1xuaW1wb3J0IHsgU0hFS0VMX0NVUlJFTkNZIH0gZnJvbSAnLi4vY29uc3RhbnRzJztcbmltcG9ydCB7XG4gIGNsaWNrQnV0dG9uLFxuICBlbGVtZW50UHJlc2VudE9uUGFnZSxcbiAgcGFnZUV2YWxBbGwsXG4gIHdhaXRVbnRpbEVsZW1lbnREaXNhcHBlYXIsXG4gIHdhaXRVbnRpbEVsZW1lbnRGb3VuZCxcbn0gZnJvbSAnLi4vaGVscGVycy9lbGVtZW50cy1pbnRlcmFjdGlvbnMnO1xuaW1wb3J0IHsgd2FpdEZvck5hdmlnYXRpb24gfSBmcm9tICcuLi9oZWxwZXJzL25hdmlnYXRpb24nO1xuaW1wb3J0IHsgVHJhbnNhY3Rpb25TdGF0dXNlcywgVHJhbnNhY3Rpb25UeXBlcywgdHlwZSBUcmFuc2FjdGlvbiwgdHlwZSBUcmFuc2FjdGlvbnNBY2NvdW50IH0gZnJvbSAnLi4vdHJhbnNhY3Rpb25zJztcbmltcG9ydCB7IEJhc2VTY3JhcGVyV2l0aEJyb3dzZXIsIExvZ2luUmVzdWx0cywgdHlwZSBQb3NzaWJsZUxvZ2luUmVzdWx0cyB9IGZyb20gJy4vYmFzZS1zY3JhcGVyLXdpdGgtYnJvd3Nlcic7XG5cbmNvbnN0IExPR0lOX1VSTCA9ICdodHRwczovL2xvZ2luLnlhaGF2LmNvLmlsL2xvZ2luLyc7XG5jb25zdCBCQVNFX1VSTCA9ICdodHRwczovL2RpZ2l0YWwueWFoYXYuY28uaWwvQmFOQ1NEaWdpdGFsVUkvYXBwL2luZGV4Lmh0bWwjLyc7XG5jb25zdCBJTlZBTElEX0RFVEFJTFNfU0VMRUNUT1IgPSAnLnVpLWRpYWxvZy1idXR0b25zJztcbmNvbnN0IENIQU5HRV9QQVNTV09SRF9PTERfUEFTUyA9ICdpbnB1dCNlZl9yZXFfcGFyYW1ldGVyX29sZF9jcmVkZW50aWFsJztcbmNvbnN0IEJBU0VfV0VMQ09NRV9VUkwgPSBgJHtCQVNFX1VSTH1tYWluL2hvbWVgO1xuXG5jb25zdCBBQ0NPVU5UX0lEX1NFTEVDVE9SID0gJ3NwYW4ucG9ydGZvbGlvLXZhbHVlW25nLWlmPVwibWFpbkNvbnRyb2xsZXIuZGF0YS5wb3J0Zm9saW9MaXN0Lmxlbmd0aCA9PT0gMVwiXSc7XG5jb25zdCBBQ0NPVU5UX0RFVEFJTFNfU0VMRUNUT1IgPSAnLmFjY291bnQtZGV0YWlscyc7XG5jb25zdCBEQVRFX0ZPUk1BVCA9ICdERC9NTS9ZWVlZJztcblxuY29uc3QgVVNFUl9FTEVNID0gJyN1c2VybmFtZSc7XG5jb25zdCBQQVNTV0RfRUxFTSA9ICcjcGFzc3dvcmQnO1xuY29uc3QgTkFUSU9OQUxJRF9FTEVNID0gJyNwaW5ubyc7XG5jb25zdCBTVUJNSVRfTE9HSU5fU0VMRUNUT1IgPSAnLmJ0bic7XG5cbmludGVyZmFjZSBTY3JhcGVkVHJhbnNhY3Rpb24ge1xuICBjcmVkaXQ6IHN0cmluZztcbiAgZGViaXQ6IHN0cmluZztcbiAgZGF0ZTogc3RyaW5nO1xuICByZWZlcmVuY2U/OiBzdHJpbmc7XG4gIGRlc2NyaXB0aW9uOiBzdHJpbmc7XG4gIG1lbW86IHN0cmluZztcbiAgc3RhdHVzOiBUcmFuc2FjdGlvblN0YXR1c2VzO1xufVxuXG5mdW5jdGlvbiBnZXRQb3NzaWJsZUxvZ2luUmVzdWx0cyhwYWdlOiBQYWdlKTogUG9zc2libGVMb2dpblJlc3VsdHMge1xuICAvLyBjaGVja291dCBmaWxlIGBiYXNlLXNjcmFwZXItd2l0aC1icm93c2VyLnRzYCBmb3IgYXZhaWxhYmxlIHJlc3VsdCB0eXBlc1xuICBjb25zdCB1cmxzOiBQb3NzaWJsZUxvZ2luUmVzdWx0cyA9IHt9O1xuICB1cmxzW0xvZ2luUmVzdWx0cy5TdWNjZXNzXSA9IFtgJHtCQVNFX1dFTENPTUVfVVJMfWBdO1xuICB1cmxzW0xvZ2luUmVzdWx0cy5JbnZhbGlkUGFzc3dvcmRdID0gW1xuICAgIGFzeW5jICgpID0+IHtcbiAgICAgIHJldHVybiBlbGVtZW50UHJlc2VudE9uUGFnZShwYWdlLCBgJHtJTlZBTElEX0RFVEFJTFNfU0VMRUNUT1J9YCk7XG4gICAgfSxcbiAgXTtcblxuICB1cmxzW0xvZ2luUmVzdWx0cy5DaGFuZ2VQYXNzd29yZF0gPSBbXG4gICAgYXN5bmMgKCkgPT4ge1xuICAgICAgcmV0dXJuIGVsZW1lbnRQcmVzZW50T25QYWdlKHBhZ2UsIGAke0NIQU5HRV9QQVNTV09SRF9PTERfUEFTU31gKTtcbiAgICB9LFxuICBdO1xuXG4gIHJldHVybiB1cmxzO1xufVxuXG5hc3luYyBmdW5jdGlvbiBnZXRBY2NvdW50SUQocGFnZTogUGFnZSk6IFByb21pc2U8c3RyaW5nPiB7XG4gIHRyeSB7XG4gICAgY29uc3Qgc2VsZWN0ZWRTbmlmQWNjb3VudCA9IGF3YWl0IHBhZ2UuJGV2YWwoQUNDT1VOVF9JRF9TRUxFQ1RPUiwgKGVsZW1lbnQ6IEVsZW1lbnQpID0+IHtcbiAgICAgIHJldHVybiBlbGVtZW50LnRleHRDb250ZW50IGFzIHN0cmluZztcbiAgICB9KTtcblxuICAgIHJldHVybiBzZWxlY3RlZFNuaWZBY2NvdW50O1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGNvbnN0IGVycm9yTWVzc2FnZSA9IGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogU3RyaW5nKGVycm9yKTtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICBgRmFpbGVkIHRvIHJldHJpZXZlIGFjY291bnQgSUQuIFBvc3NpYmxlIG91dGRhdGVkIHNlbGVjdG9yICcke0FDQ09VTlRfSURfU0VMRUNUT1J9OiAke2Vycm9yTWVzc2FnZX1gLFxuICAgICk7XG4gIH1cbn1cblxuZnVuY3Rpb24gZ2V0QW1vdW50RGF0YShhbW91bnRTdHI6IHN0cmluZykge1xuICBjb25zdCBhbW91bnRTdHJDb3B5ID0gYW1vdW50U3RyLnJlcGxhY2UoJywnLCAnJyk7XG4gIHJldHVybiBwYXJzZUZsb2F0KGFtb3VudFN0ckNvcHkpO1xufVxuXG5mdW5jdGlvbiBnZXRUeG5BbW91bnQodHhuOiBTY3JhcGVkVHJhbnNhY3Rpb24pIHtcbiAgY29uc3QgY3JlZGl0ID0gZ2V0QW1vdW50RGF0YSh0eG4uY3JlZGl0KTtcbiAgY29uc3QgZGViaXQgPSBnZXRBbW91bnREYXRhKHR4bi5kZWJpdCk7XG4gIHJldHVybiAoTnVtYmVyLmlzTmFOKGNyZWRpdCkgPyAwIDogY3JlZGl0KSAtIChOdW1iZXIuaXNOYU4oZGViaXQpID8gMCA6IGRlYml0KTtcbn1cblxudHlwZSBUcmFuc2FjdGlvbnNUciA9IHsgaWQ6IHN0cmluZzsgaW5uZXJEaXZzOiBzdHJpbmdbXSB9O1xuXG5mdW5jdGlvbiBjb252ZXJ0VHJhbnNhY3Rpb25zKHR4bnM6IFNjcmFwZWRUcmFuc2FjdGlvbltdKTogVHJhbnNhY3Rpb25bXSB7XG4gIHJldHVybiB0eG5zLm1hcCh0eG4gPT4ge1xuICAgIGNvbnN0IGNvbnZlcnRlZERhdGUgPSBtb21lbnQodHhuLmRhdGUsIERBVEVfRk9STUFUKS50b0lTT1N0cmluZygpO1xuICAgIGNvbnN0IGNvbnZlcnRlZEFtb3VudCA9IGdldFR4bkFtb3VudCh0eG4pO1xuICAgIHJldHVybiB7XG4gICAgICB0eXBlOiBUcmFuc2FjdGlvblR5cGVzLk5vcm1hbCxcbiAgICAgIGlkZW50aWZpZXI6IHR4bi5yZWZlcmVuY2UgPyBwYXJzZUludCh0eG4ucmVmZXJlbmNlLCAxMCkgOiB1bmRlZmluZWQsXG4gICAgICBkYXRlOiBjb252ZXJ0ZWREYXRlLFxuICAgICAgcHJvY2Vzc2VkRGF0ZTogY29udmVydGVkRGF0ZSxcbiAgICAgIG9yaWdpbmFsQW1vdW50OiBjb252ZXJ0ZWRBbW91bnQsXG4gICAgICBvcmlnaW5hbEN1cnJlbmN5OiBTSEVLRUxfQ1VSUkVOQ1ksXG4gICAgICBjaGFyZ2VkQW1vdW50OiBjb252ZXJ0ZWRBbW91bnQsXG4gICAgICBzdGF0dXM6IHR4bi5zdGF0dXMsXG4gICAgICBkZXNjcmlwdGlvbjogdHhuLmRlc2NyaXB0aW9uLFxuICAgICAgbWVtbzogdHhuLm1lbW8sXG4gICAgfTtcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIGhhbmRsZVRyYW5zYWN0aW9uUm93KHR4bnM6IFNjcmFwZWRUcmFuc2FjdGlvbltdLCB0eG5Sb3c6IFRyYW5zYWN0aW9uc1RyKSB7XG4gIGNvbnN0IGRpdiA9IHR4blJvdy5pbm5lckRpdnM7XG5cbiAgLy8gUmVtb3ZlIGFueXRoaW5nIGV4Y2VwdCBkaWdpdHMuXG4gIGNvbnN0IHJlZ2V4ID0gL1xcRCsvZ207XG5cbiAgY29uc3QgdHg6IFNjcmFwZWRUcmFuc2FjdGlvbiA9IHtcbiAgICBkYXRlOiBkaXZbMV0sXG4gICAgcmVmZXJlbmNlOiBkaXZbMl0ucmVwbGFjZShyZWdleCwgJycpLFxuICAgIG1lbW86ICcnLFxuICAgIGRlc2NyaXB0aW9uOiBkaXZbM10sXG4gICAgZGViaXQ6IGRpdls0XSxcbiAgICBjcmVkaXQ6IGRpdls1XSxcbiAgICBzdGF0dXM6IFRyYW5zYWN0aW9uU3RhdHVzZXMuQ29tcGxldGVkLFxuICB9O1xuXG4gIHR4bnMucHVzaCh0eCk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGdldEFjY291bnRUcmFuc2FjdGlvbnMocGFnZTogUGFnZSk6IFByb21pc2U8VHJhbnNhY3Rpb25bXT4ge1xuICAvLyBXYWl0IGZvciB0cmFuc2FjdGlvbnMuXG4gIGF3YWl0IHdhaXRVbnRpbEVsZW1lbnRGb3VuZChwYWdlLCAnLnVuZGVyLWxpbmUtdHhuLXRhYmxlLWhlYWRlcicsIHRydWUpO1xuXG4gIGNvbnN0IHR4bnM6IFNjcmFwZWRUcmFuc2FjdGlvbltdID0gW107XG4gIGNvbnN0IHRyYW5zYWN0aW9uc0RpdnMgPSBhd2FpdCBwYWdlRXZhbEFsbDxUcmFuc2FjdGlvbnNUcltdPihcbiAgICBwYWdlLFxuICAgICcubGlzdC1pdGVtLWhvbGRlciAuZW50aXJlLWNvbnRlbnQtY3RyJyxcbiAgICBbXSxcbiAgICBkaXZzID0+IHtcbiAgICAgIHJldHVybiAoZGl2cyBhcyBIVE1MRWxlbWVudFtdKS5tYXAoZGl2ID0+ICh7XG4gICAgICAgIGlkOiBkaXYuZ2V0QXR0cmlidXRlKCdpZCcpIHx8ICcnLFxuICAgICAgICBpbm5lckRpdnM6IEFycmF5LmZyb20oZGl2LmdldEVsZW1lbnRzQnlUYWdOYW1lKCdkaXYnKSkubWFwKGVsID0+IChlbCBhcyBIVE1MRWxlbWVudCkuaW5uZXJUZXh0KSxcbiAgICAgIH0pKTtcbiAgICB9LFxuICApO1xuXG4gIGZvciAoY29uc3QgdHhuUm93IG9mIHRyYW5zYWN0aW9uc0RpdnMpIHtcbiAgICBoYW5kbGVUcmFuc2FjdGlvblJvdyh0eG5zLCB0eG5Sb3cpO1xuICB9XG5cbiAgcmV0dXJuIGNvbnZlcnRUcmFuc2FjdGlvbnModHhucyk7XG59XG5cbi8vIE1hbmlwdWxhdGUgdGhlIGNhbGVuZGFyIGRyb3AgZG93biB0byBjaG9vc2UgdGhlIHR4cyBzdGFydCBkYXRlLlxuYXN5bmMgZnVuY3Rpb24gc2VhcmNoQnlEYXRlcyhwYWdlOiBQYWdlLCBzdGFydERhdGU6IE1vbWVudCkge1xuICAvLyBHZXQgdGhlIGRheSBudW1iZXIgZnJvbSBzdGFydERhdGUuIDEtMzEgKHVzdWFsbHkgMSlcbiAgY29uc3Qgc3RhcnREYXRlRGF5ID0gc3RhcnREYXRlLmZvcm1hdCgnRCcpO1xuICBjb25zdCBzdGFydERhdGVNb250aCA9IHN0YXJ0RGF0ZS5mb3JtYXQoJ00nKTtcbiAgY29uc3Qgc3RhcnREYXRlWWVhciA9IHN0YXJ0RGF0ZS5mb3JtYXQoJ1knKTtcblxuICAvLyBPcGVuIHRoZSBjYWxlbmRhciBkYXRlIHBpY2tlclxuICBjb25zdCBkYXRlRnJvbVBpY2sgPVxuICAgICdkaXYuZGF0ZS1vcHRpb25zLWNlbGw6bnRoLWNoaWxkKDcpID4gZGF0ZS1waWNrZXI6bnRoLWNoaWxkKDEpID4gZGl2Om50aC1jaGlsZCgxKSA+IHNwYW46bnRoLWNoaWxkKDIpJztcbiAgYXdhaXQgd2FpdFVudGlsRWxlbWVudEZvdW5kKHBhZ2UsIGRhdGVGcm9tUGljaywgdHJ1ZSk7XG4gIGF3YWl0IGNsaWNrQnV0dG9uKHBhZ2UsIGRhdGVGcm9tUGljayk7XG5cbiAgLy8gV2FpdCB1bnRpbCBmaXJzdCBkYXkgYXBwZWFyLlxuICBhd2FpdCB3YWl0VW50aWxFbGVtZW50Rm91bmQocGFnZSwgJy5wbXUtZGF5cyA+IGRpdjpudGgtY2hpbGQoMSknLCB0cnVlKTtcblxuICAvLyBPcGVuIE1vbnRocyBvcHRpb25zLlxuICBjb25zdCBtb250aEZyb21QaWNrID0gJy5wbXUtbW9udGgnO1xuICBhd2FpdCB3YWl0VW50aWxFbGVtZW50Rm91bmQocGFnZSwgbW9udGhGcm9tUGljaywgdHJ1ZSk7XG4gIGF3YWl0IGNsaWNrQnV0dG9uKHBhZ2UsIG1vbnRoRnJvbVBpY2spO1xuICBhd2FpdCB3YWl0VW50aWxFbGVtZW50Rm91bmQocGFnZSwgJy5wbXUtbW9udGhzID4gZGl2Om50aC1jaGlsZCgxKScsIHRydWUpO1xuXG4gIC8vIE9wZW4gWWVhciBvcHRpb25zLlxuICAvLyBVc2Ugc2FtZSBzZWxlY3Rvci4uLiBZYWhhdiBrbm93cyB3aHkuLi5cbiAgYXdhaXQgd2FpdFVudGlsRWxlbWVudEZvdW5kKHBhZ2UsIG1vbnRoRnJvbVBpY2ssIHRydWUpO1xuICBhd2FpdCBjbGlja0J1dHRvbihwYWdlLCBtb250aEZyb21QaWNrKTtcbiAgYXdhaXQgd2FpdFVudGlsRWxlbWVudEZvdW5kKHBhZ2UsICcucG11LXllYXJzID4gZGl2Om50aC1jaGlsZCgxKScsIHRydWUpO1xuXG4gIC8vIFNlbGVjdCB5ZWFyIGZyb20gYSAxMiB5ZWFyIGdyaWQuXG4gIGZvciAobGV0IGkgPSAxOyBpIDwgMTM7IGkgKz0gMSkge1xuICAgIGNvbnN0IHNlbGVjdG9yID0gYC5wbXUteWVhcnMgPiBkaXY6bnRoLWNoaWxkKCR7aX0pYDtcbiAgICBjb25zdCB5ZWFyID0gYXdhaXQgcGFnZS4kZXZhbChzZWxlY3RvciwgeSA9PiB7XG4gICAgICByZXR1cm4gKHkgYXMgSFRNTEVsZW1lbnQpLmlubmVyVGV4dDtcbiAgICB9KTtcbiAgICBpZiAoc3RhcnREYXRlWWVhciA9PT0geWVhcikge1xuICAgICAgYXdhaXQgY2xpY2tCdXR0b24ocGFnZSwgc2VsZWN0b3IpO1xuICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG5cbiAgLy8gU2VsZWN0IE1vbnRoLlxuICBhd2FpdCB3YWl0VW50aWxFbGVtZW50Rm91bmQocGFnZSwgJy5wbXUtbW9udGhzID4gZGl2Om50aC1jaGlsZCgxKScsIHRydWUpO1xuICAvLyBUaGUgZmlyc3QgZWxlbWVudCAoMSkgaXMgSmFudWFyeS5cbiAgY29uc3QgbW9udGhTZWxlY3RvciA9IGAucG11LW1vbnRocyA+IGRpdjpudGgtY2hpbGQoJHtzdGFydERhdGVNb250aH0pYDtcbiAgYXdhaXQgY2xpY2tCdXR0b24ocGFnZSwgbW9udGhTZWxlY3Rvcik7XG5cbiAgLy8gU2VsZWN0IERheS5cbiAgLy8gVGhlIGNhbGVuZGFyIGdyaWQgc2hvd3MgNyBkYXlzIGFuZCA2IHdlZWtzID0gNDIgZGF5cy5cbiAgLy8gSW4gdGhlb3J5LCB0aGUgZmlyc3QgZGF5IG9mIHRoZSBtb250aCB3aWxsIGJlIGluIHRoZSBmaXJzdCByb3cuXG4gIC8vIExldCdzIGNoZWNrIGV2ZXJ5dGhpbmcganVzdCBpbiBjYXNlLi4uXG4gIGZvciAobGV0IGkgPSAxOyBpIDwgNDI7IGkgKz0gMSkge1xuICAgIGNvbnN0IHNlbGVjdG9yID0gYC5wbXUtZGF5cyA+IGRpdjpudGgtY2hpbGQoJHtpfSlgO1xuICAgIGNvbnN0IGRheSA9IGF3YWl0IHBhZ2UuJGV2YWwoc2VsZWN0b3IsIGQgPT4ge1xuICAgICAgcmV0dXJuIChkIGFzIEhUTUxFbGVtZW50KS5pbm5lclRleHQ7XG4gICAgfSk7XG5cbiAgICBpZiAoc3RhcnREYXRlRGF5ID09PSBkYXkpIHtcbiAgICAgIGF3YWl0IGNsaWNrQnV0dG9uKHBhZ2UsIHNlbGVjdG9yKTtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiBmZXRjaEFjY291bnREYXRhKHBhZ2U6IFBhZ2UsIHN0YXJ0RGF0ZTogTW9tZW50LCBhY2NvdW50SUQ6IHN0cmluZyk6IFByb21pc2U8VHJhbnNhY3Rpb25zQWNjb3VudD4ge1xuICBhd2FpdCB3YWl0VW50aWxFbGVtZW50RGlzYXBwZWFyKHBhZ2UsICcubG9hZGluZy1iYXItc3Bpbm5lcicpO1xuICBhd2FpdCBzZWFyY2hCeURhdGVzKHBhZ2UsIHN0YXJ0RGF0ZSk7XG4gIGF3YWl0IHdhaXRVbnRpbEVsZW1lbnREaXNhcHBlYXIocGFnZSwgJy5sb2FkaW5nLWJhci1zcGlubmVyJyk7XG4gIGNvbnN0IHR4bnMgPSBhd2FpdCBnZXRBY2NvdW50VHJhbnNhY3Rpb25zKHBhZ2UpO1xuXG4gIHJldHVybiB7XG4gICAgYWNjb3VudE51bWJlcjogYWNjb3VudElELFxuICAgIHR4bnMsXG4gIH07XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGZldGNoQWNjb3VudHMocGFnZTogUGFnZSwgc3RhcnREYXRlOiBNb21lbnQpOiBQcm9taXNlPFRyYW5zYWN0aW9uc0FjY291bnRbXT4ge1xuICBjb25zdCBhY2NvdW50czogVHJhbnNhY3Rpb25zQWNjb3VudFtdID0gW107XG5cbiAgLy8gVE9ETzogZ2V0IG1vcmUgYWNjb3VudHMuIE5vdCBzdXJlIGlzIHN1cHBvcnRlZC5cbiAgY29uc3QgYWNjb3VudElEID0gYXdhaXQgZ2V0QWNjb3VudElEKHBhZ2UpO1xuICBjb25zdCBhY2NvdW50RGF0YSA9IGF3YWl0IGZldGNoQWNjb3VudERhdGEocGFnZSwgc3RhcnREYXRlLCBhY2NvdW50SUQpO1xuICBhY2NvdW50cy5wdXNoKGFjY291bnREYXRhKTtcblxuICByZXR1cm4gYWNjb3VudHM7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHdhaXRSZWFkaW5lc3NGb3JBbGwocGFnZTogUGFnZSkge1xuICBhd2FpdCB3YWl0VW50aWxFbGVtZW50Rm91bmQocGFnZSwgYCR7VVNFUl9FTEVNfWAsIHRydWUpO1xuICBhd2FpdCB3YWl0VW50aWxFbGVtZW50Rm91bmQocGFnZSwgYCR7UEFTU1dEX0VMRU19YCwgdHJ1ZSk7XG4gIGF3YWl0IHdhaXRVbnRpbEVsZW1lbnRGb3VuZChwYWdlLCBgJHtOQVRJT05BTElEX0VMRU19YCwgdHJ1ZSk7XG4gIGF3YWl0IHdhaXRVbnRpbEVsZW1lbnRGb3VuZChwYWdlLCBgJHtTVUJNSVRfTE9HSU5fU0VMRUNUT1J9YCwgdHJ1ZSk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHJlZGlyZWN0T3JEaWFsb2cocGFnZTogUGFnZSkge1xuICAvLyBDbGljayBvbiBiYW5rIG1lc3NhZ2VzIGlmIGFueS5cbiAgYXdhaXQgd2FpdEZvck5hdmlnYXRpb24ocGFnZSk7XG4gIGF3YWl0IHdhaXRVbnRpbEVsZW1lbnREaXNhcHBlYXIocGFnZSwgJy5sb2FkaW5nLWJhci1zcGlubmVyJyk7XG4gIGNvbnN0IGhhc01lc3NhZ2UgPSBhd2FpdCBlbGVtZW50UHJlc2VudE9uUGFnZShwYWdlLCAnLm1lc3NhZ2luZy1saW5rcy1jb250YWluZXInKTtcbiAgaWYgKGhhc01lc3NhZ2UpIHtcbiAgICBhd2FpdCBjbGlja0J1dHRvbihwYWdlLCAnLmxpbmstMScpO1xuICB9XG5cbiAgY29uc3QgcHJvbWlzZTEgPSBwYWdlLndhaXRGb3JTZWxlY3RvcihBQ0NPVU5UX0RFVEFJTFNfU0VMRUNUT1IsIHsgdGltZW91dDogMzAwMDAgfSk7XG4gIGNvbnN0IHByb21pc2UyID0gcGFnZS53YWl0Rm9yU2VsZWN0b3IoQ0hBTkdFX1BBU1NXT1JEX09MRF9QQVNTLCB7IHRpbWVvdXQ6IDMwMDAwIH0pO1xuICBjb25zdCBwcm9taXNlcyA9IFtwcm9taXNlMSwgcHJvbWlzZTJdO1xuXG4gIGF3YWl0IFByb21pc2UucmFjZShwcm9taXNlcyk7XG4gIGF3YWl0IHdhaXRVbnRpbEVsZW1lbnREaXNhcHBlYXIocGFnZSwgJy5sb2FkaW5nLWJhci1zcGlubmVyJyk7XG59XG5cbnR5cGUgU2NyYXBlclNwZWNpZmljQ3JlZGVudGlhbHMgPSB7IHVzZXJuYW1lOiBzdHJpbmc7IHBhc3N3b3JkOiBzdHJpbmc7IG5hdGlvbmFsSUQ6IHN0cmluZyB9O1xuXG5jbGFzcyBZYWhhdlNjcmFwZXIgZXh0ZW5kcyBCYXNlU2NyYXBlcldpdGhCcm93c2VyPFNjcmFwZXJTcGVjaWZpY0NyZWRlbnRpYWxzPiB7XG4gIGdldExvZ2luT3B0aW9ucyhjcmVkZW50aWFsczogU2NyYXBlclNwZWNpZmljQ3JlZGVudGlhbHMpIHtcbiAgICByZXR1cm4ge1xuICAgICAgbG9naW5Vcmw6IGAke0xPR0lOX1VSTH1gLFxuICAgICAgZmllbGRzOiBbXG4gICAgICAgIHsgc2VsZWN0b3I6IGAke1VTRVJfRUxFTX1gLCB2YWx1ZTogY3JlZGVudGlhbHMudXNlcm5hbWUgfSxcbiAgICAgICAgeyBzZWxlY3RvcjogYCR7UEFTU1dEX0VMRU19YCwgdmFsdWU6IGNyZWRlbnRpYWxzLnBhc3N3b3JkIH0sXG4gICAgICAgIHsgc2VsZWN0b3I6IGAke05BVElPTkFMSURfRUxFTX1gLCB2YWx1ZTogY3JlZGVudGlhbHMubmF0aW9uYWxJRCB9LFxuICAgICAgXSxcbiAgICAgIHN1Ym1pdEJ1dHRvblNlbGVjdG9yOiBgJHtTVUJNSVRfTE9HSU5fU0VMRUNUT1J9YCxcbiAgICAgIGNoZWNrUmVhZGluZXNzOiBhc3luYyAoKSA9PiB3YWl0UmVhZGluZXNzRm9yQWxsKHRoaXMucGFnZSksXG4gICAgICBwb3N0QWN0aW9uOiBhc3luYyAoKSA9PiByZWRpcmVjdE9yRGlhbG9nKHRoaXMucGFnZSksXG4gICAgICBwb3NzaWJsZVJlc3VsdHM6IGdldFBvc3NpYmxlTG9naW5SZXN1bHRzKHRoaXMucGFnZSksXG4gICAgfTtcbiAgfVxuXG4gIGFzeW5jIGZldGNoRGF0YSgpIHtcbiAgICAvLyBHb3RvIHN0YXRlbWVudHMgcGFnZVxuICAgIGF3YWl0IHdhaXRVbnRpbEVsZW1lbnRGb3VuZCh0aGlzLnBhZ2UsIEFDQ09VTlRfREVUQUlMU19TRUxFQ1RPUiwgdHJ1ZSk7XG4gICAgYXdhaXQgY2xpY2tCdXR0b24odGhpcy5wYWdlLCBBQ0NPVU5UX0RFVEFJTFNfU0VMRUNUT1IpO1xuICAgIGF3YWl0IHdhaXRVbnRpbEVsZW1lbnRGb3VuZCh0aGlzLnBhZ2UsICcuc3RhdGVtZW50LW9wdGlvbnMgLnNlbGVjdGVkLWl0ZW0tdG9wJywgdHJ1ZSk7XG5cbiAgICBjb25zdCBkZWZhdWx0U3RhcnRNb21lbnQgPSBtb21lbnQoKS5zdWJ0cmFjdCgzLCAnbW9udGhzJykuYWRkKDEsICdkYXknKTtcbiAgICBjb25zdCBzdGFydERhdGUgPSB0aGlzLm9wdGlvbnMuc3RhcnREYXRlIHx8IGRlZmF1bHRTdGFydE1vbWVudC50b0RhdGUoKTtcbiAgICBjb25zdCBzdGFydE1vbWVudCA9IG1vbWVudC5tYXgoZGVmYXVsdFN0YXJ0TW9tZW50LCBtb21lbnQoc3RhcnREYXRlKSk7XG5cbiAgICBjb25zdCBhY2NvdW50cyA9IGF3YWl0IGZldGNoQWNjb3VudHModGhpcy5wYWdlLCBzdGFydE1vbWVudCk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgc3VjY2VzczogdHJ1ZSxcbiAgICAgIGFjY291bnRzLFxuICAgIH07XG4gIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgWWFoYXZTY3JhcGVyO1xuIl19
246
+ var _default = exports.default = YahavScraper;
247
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfbW9tZW50IiwiX2ludGVyb3BSZXF1aXJlRGVmYXVsdCIsInJlcXVpcmUiLCJfY29uc3RhbnRzIiwiX2VsZW1lbnRzSW50ZXJhY3Rpb25zIiwiX25hdmlnYXRpb24iLCJfdHJhbnNhY3Rpb25zIiwiX2Jhc2VTY3JhcGVyV2l0aEJyb3dzZXIiLCJlIiwiX19lc01vZHVsZSIsImRlZmF1bHQiLCJMT0dJTl9VUkwiLCJCQVNFX1VSTCIsIklOVkFMSURfREVUQUlMU19TRUxFQ1RPUiIsIkNIQU5HRV9QQVNTV09SRF9PTERfUEFTUyIsIkJBU0VfV0VMQ09NRV9VUkwiLCJBQ0NPVU5UX0lEX1NFTEVDVE9SIiwiQUNDT1VOVF9ERVRBSUxTX1NFTEVDVE9SIiwiREFURV9GT1JNQVQiLCJVU0VSX0VMRU0iLCJQQVNTV0RfRUxFTSIsIk5BVElPTkFMSURfRUxFTSIsIlNVQk1JVF9MT0dJTl9TRUxFQ1RPUiIsImdldFBvc3NpYmxlTG9naW5SZXN1bHRzIiwicGFnZSIsInVybHMiLCJMb2dpblJlc3VsdHMiLCJTdWNjZXNzIiwiSW52YWxpZFBhc3N3b3JkIiwiZWxlbWVudFByZXNlbnRPblBhZ2UiLCJDaGFuZ2VQYXNzd29yZCIsImdldEFjY291bnRJRCIsInNlbGVjdGVkU25pZkFjY291bnQiLCIkZXZhbCIsImVsZW1lbnQiLCJ0ZXh0Q29udGVudCIsImVycm9yIiwiZXJyb3JNZXNzYWdlIiwiRXJyb3IiLCJtZXNzYWdlIiwiU3RyaW5nIiwiZ2V0QW1vdW50RGF0YSIsImFtb3VudFN0ciIsImFtb3VudFN0ckNvcHkiLCJyZXBsYWNlIiwicGFyc2VGbG9hdCIsImdldFR4bkFtb3VudCIsInR4biIsImNyZWRpdCIsImRlYml0IiwiTnVtYmVyIiwiaXNOYU4iLCJjb252ZXJ0VHJhbnNhY3Rpb25zIiwidHhucyIsIm1hcCIsImNvbnZlcnRlZERhdGUiLCJtb21lbnQiLCJkYXRlIiwidG9JU09TdHJpbmciLCJjb252ZXJ0ZWRBbW91bnQiLCJ0eXBlIiwiVHJhbnNhY3Rpb25UeXBlcyIsIk5vcm1hbCIsImlkZW50aWZpZXIiLCJyZWZlcmVuY2UiLCJwYXJzZUludCIsInVuZGVmaW5lZCIsInByb2Nlc3NlZERhdGUiLCJvcmlnaW5hbEFtb3VudCIsIm9yaWdpbmFsQ3VycmVuY3kiLCJTSEVLRUxfQ1VSUkVOQ1kiLCJjaGFyZ2VkQW1vdW50Iiwic3RhdHVzIiwiZGVzY3JpcHRpb24iLCJtZW1vIiwiaGFuZGxlVHJhbnNhY3Rpb25Sb3ciLCJ0eG5Sb3ciLCJkaXYiLCJpbm5lckRpdnMiLCJyZWdleCIsInR4IiwiVHJhbnNhY3Rpb25TdGF0dXNlcyIsIkNvbXBsZXRlZCIsInB1c2giLCJnZXRBY2NvdW50VHJhbnNhY3Rpb25zIiwid2FpdFVudGlsRWxlbWVudEZvdW5kIiwidHJhbnNhY3Rpb25zRGl2cyIsInBhZ2VFdmFsQWxsIiwiZGl2cyIsImlkIiwiZ2V0QXR0cmlidXRlIiwiQXJyYXkiLCJmcm9tIiwiZ2V0RWxlbWVudHNCeVRhZ05hbWUiLCJlbCIsImlubmVyVGV4dCIsInNlYXJjaEJ5RGF0ZXMiLCJzdGFydERhdGUiLCJzdGFydERhdGVEYXkiLCJmb3JtYXQiLCJzdGFydERhdGVNb250aCIsInN0YXJ0RGF0ZVllYXIiLCJkYXRlRnJvbVBpY2siLCJjbGlja0J1dHRvbiIsIm1vbnRoRnJvbVBpY2siLCJpIiwic2VsZWN0b3IiLCJ5ZWFyIiwieSIsIm1vbnRoU2VsZWN0b3IiLCJkYXkiLCJkIiwiZmV0Y2hBY2NvdW50RGF0YSIsImFjY291bnRJRCIsIndhaXRVbnRpbEVsZW1lbnREaXNhcHBlYXIiLCJhY2NvdW50TnVtYmVyIiwiZmV0Y2hBY2NvdW50cyIsImFjY291bnRzIiwiYWNjb3VudERhdGEiLCJ3YWl0UmVhZGluZXNzRm9yQWxsIiwicmVkaXJlY3RPckRpYWxvZyIsIndhaXRGb3JOYXZpZ2F0aW9uIiwiaGFzTWVzc2FnZSIsInByb21pc2UxIiwid2FpdEZvclNlbGVjdG9yIiwidGltZW91dCIsInByb21pc2UyIiwicHJvbWlzZXMiLCJQcm9taXNlIiwicmFjZSIsIllhaGF2U2NyYXBlciIsIkJhc2VTY3JhcGVyV2l0aEJyb3dzZXIiLCJnZXRMb2dpbk9wdGlvbnMiLCJjcmVkZW50aWFscyIsImxvZ2luVXJsIiwiZmllbGRzIiwidmFsdWUiLCJ1c2VybmFtZSIsInBhc3N3b3JkIiwibmF0aW9uYWxJRCIsInN1Ym1pdEJ1dHRvblNlbGVjdG9yIiwiY2hlY2tSZWFkaW5lc3MiLCJwb3N0QWN0aW9uIiwicG9zc2libGVSZXN1bHRzIiwiZmV0Y2hEYXRhIiwiZGVmYXVsdFN0YXJ0TW9tZW50Iiwic3VidHJhY3QiLCJhZGQiLCJvcHRpb25zIiwidG9EYXRlIiwic3RhcnRNb21lbnQiLCJtYXgiLCJzdWNjZXNzIiwiX2RlZmF1bHQiLCJleHBvcnRzIl0sInNvdXJjZXMiOlsiLi4vLi4vc3JjL3NjcmFwZXJzL3lhaGF2LnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBtb21lbnQsIHsgdHlwZSBNb21lbnQgfSBmcm9tICdtb21lbnQnO1xuaW1wb3J0IHsgdHlwZSBQYWdlIH0gZnJvbSAncHVwcGV0ZWVyJztcbmltcG9ydCB7IFNIRUtFTF9DVVJSRU5DWSB9IGZyb20gJy4uL2NvbnN0YW50cyc7XG5pbXBvcnQge1xuICBjbGlja0J1dHRvbixcbiAgZWxlbWVudFByZXNlbnRPblBhZ2UsXG4gIHBhZ2VFdmFsQWxsLFxuICB3YWl0VW50aWxFbGVtZW50RGlzYXBwZWFyLFxuICB3YWl0VW50aWxFbGVtZW50Rm91bmQsXG59IGZyb20gJy4uL2hlbHBlcnMvZWxlbWVudHMtaW50ZXJhY3Rpb25zJztcbmltcG9ydCB7IHdhaXRGb3JOYXZpZ2F0aW9uIH0gZnJvbSAnLi4vaGVscGVycy9uYXZpZ2F0aW9uJztcbmltcG9ydCB7IFRyYW5zYWN0aW9uU3RhdHVzZXMsIFRyYW5zYWN0aW9uVHlwZXMsIHR5cGUgVHJhbnNhY3Rpb24sIHR5cGUgVHJhbnNhY3Rpb25zQWNjb3VudCB9IGZyb20gJy4uL3RyYW5zYWN0aW9ucyc7XG5pbXBvcnQgeyBCYXNlU2NyYXBlcldpdGhCcm93c2VyLCBMb2dpblJlc3VsdHMsIHR5cGUgUG9zc2libGVMb2dpblJlc3VsdHMgfSBmcm9tICcuL2Jhc2Utc2NyYXBlci13aXRoLWJyb3dzZXInO1xuXG5jb25zdCBMT0dJTl9VUkwgPSAnaHR0cHM6Ly9sb2dpbi55YWhhdi5jby5pbC9sb2dpbi8nO1xuY29uc3QgQkFTRV9VUkwgPSAnaHR0cHM6Ly9kaWdpdGFsLnlhaGF2LmNvLmlsL0JhTkNTRGlnaXRhbFVJL2FwcC9pbmRleC5odG1sIy8nO1xuY29uc3QgSU5WQUxJRF9ERVRBSUxTX1NFTEVDVE9SID0gJy51aS1kaWFsb2ctYnV0dG9ucyc7XG5jb25zdCBDSEFOR0VfUEFTU1dPUkRfT0xEX1BBU1MgPSAnaW5wdXQjZWZfcmVxX3BhcmFtZXRlcl9vbGRfY3JlZGVudGlhbCc7XG5jb25zdCBCQVNFX1dFTENPTUVfVVJMID0gYCR7QkFTRV9VUkx9bWFpbi9ob21lYDtcblxuY29uc3QgQUNDT1VOVF9JRF9TRUxFQ1RPUiA9ICdzcGFuLnBvcnRmb2xpby12YWx1ZVtuZy1pZj1cIm1haW5Db250cm9sbGVyLmRhdGEucG9ydGZvbGlvTGlzdC5sZW5ndGggPT09IDFcIl0nO1xuY29uc3QgQUNDT1VOVF9ERVRBSUxTX1NFTEVDVE9SID0gJy5hY2NvdW50LWRldGFpbHMnO1xuY29uc3QgREFURV9GT1JNQVQgPSAnREQvTU0vWVlZWSc7XG5cbmNvbnN0IFVTRVJfRUxFTSA9ICcjdXNlcm5hbWUnO1xuY29uc3QgUEFTU1dEX0VMRU0gPSAnI3Bhc3N3b3JkJztcbmNvbnN0IE5BVElPTkFMSURfRUxFTSA9ICcjcGlubm8nO1xuY29uc3QgU1VCTUlUX0xPR0lOX1NFTEVDVE9SID0gJy5idG4nO1xuXG5pbnRlcmZhY2UgU2NyYXBlZFRyYW5zYWN0aW9uIHtcbiAgY3JlZGl0OiBzdHJpbmc7XG4gIGRlYml0OiBzdHJpbmc7XG4gIGRhdGU6IHN0cmluZztcbiAgcmVmZXJlbmNlPzogc3RyaW5nO1xuICBkZXNjcmlwdGlvbjogc3RyaW5nO1xuICBtZW1vOiBzdHJpbmc7XG4gIHN0YXR1czogVHJhbnNhY3Rpb25TdGF0dXNlcztcbn1cblxuZnVuY3Rpb24gZ2V0UG9zc2libGVMb2dpblJlc3VsdHMocGFnZTogUGFnZSk6IFBvc3NpYmxlTG9naW5SZXN1bHRzIHtcbiAgLy8gY2hlY2tvdXQgZmlsZSBgYmFzZS1zY3JhcGVyLXdpdGgtYnJvd3Nlci50c2AgZm9yIGF2YWlsYWJsZSByZXN1bHQgdHlwZXNcbiAgY29uc3QgdXJsczogUG9zc2libGVMb2dpblJlc3VsdHMgPSB7fTtcbiAgdXJsc1tMb2dpblJlc3VsdHMuU3VjY2Vzc10gPSBbYCR7QkFTRV9XRUxDT01FX1VSTH1gXTtcbiAgdXJsc1tMb2dpblJlc3VsdHMuSW52YWxpZFBhc3N3b3JkXSA9IFtcbiAgICBhc3luYyAoKSA9PiB7XG4gICAgICByZXR1cm4gZWxlbWVudFByZXNlbnRPblBhZ2UocGFnZSwgYCR7SU5WQUxJRF9ERVRBSUxTX1NFTEVDVE9SfWApO1xuICAgIH0sXG4gIF07XG5cbiAgdXJsc1tMb2dpblJlc3VsdHMuQ2hhbmdlUGFzc3dvcmRdID0gW1xuICAgIGFzeW5jICgpID0+IHtcbiAgICAgIHJldHVybiBlbGVtZW50UHJlc2VudE9uUGFnZShwYWdlLCBgJHtDSEFOR0VfUEFTU1dPUkRfT0xEX1BBU1N9YCk7XG4gICAgfSxcbiAgXTtcblxuICByZXR1cm4gdXJscztcbn1cblxuYXN5bmMgZnVuY3Rpb24gZ2V0QWNjb3VudElEKHBhZ2U6IFBhZ2UpOiBQcm9taXNlPHN0cmluZz4ge1xuICB0cnkge1xuICAgIGNvbnN0IHNlbGVjdGVkU25pZkFjY291bnQgPSBhd2FpdCBwYWdlLiRldmFsKEFDQ09VTlRfSURfU0VMRUNUT1IsIChlbGVtZW50OiBFbGVtZW50KSA9PiB7XG4gICAgICByZXR1cm4gZWxlbWVudC50ZXh0Q29udGVudCBhcyBzdHJpbmc7XG4gICAgfSk7XG5cbiAgICByZXR1cm4gc2VsZWN0ZWRTbmlmQWNjb3VudDtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBjb25zdCBlcnJvck1lc3NhZ2UgPSBlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IFN0cmluZyhlcnJvcik7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgYEZhaWxlZCB0byByZXRyaWV2ZSBhY2NvdW50IElELiBQb3NzaWJsZSBvdXRkYXRlZCBzZWxlY3RvciAnJHtBQ0NPVU5UX0lEX1NFTEVDVE9SfTogJHtlcnJvck1lc3NhZ2V9YCxcbiAgICApO1xuICB9XG59XG5cbmZ1bmN0aW9uIGdldEFtb3VudERhdGEoYW1vdW50U3RyOiBzdHJpbmcpIHtcbiAgY29uc3QgYW1vdW50U3RyQ29weSA9IGFtb3VudFN0ci5yZXBsYWNlKCcsJywgJycpO1xuICByZXR1cm4gcGFyc2VGbG9hdChhbW91bnRTdHJDb3B5KTtcbn1cblxuZnVuY3Rpb24gZ2V0VHhuQW1vdW50KHR4bjogU2NyYXBlZFRyYW5zYWN0aW9uKSB7XG4gIGNvbnN0IGNyZWRpdCA9IGdldEFtb3VudERhdGEodHhuLmNyZWRpdCk7XG4gIGNvbnN0IGRlYml0ID0gZ2V0QW1vdW50RGF0YSh0eG4uZGViaXQpO1xuICByZXR1cm4gKE51bWJlci5pc05hTihjcmVkaXQpID8gMCA6IGNyZWRpdCkgLSAoTnVtYmVyLmlzTmFOKGRlYml0KSA/IDAgOiBkZWJpdCk7XG59XG5cbnR5cGUgVHJhbnNhY3Rpb25zVHIgPSB7IGlkOiBzdHJpbmc7IGlubmVyRGl2czogc3RyaW5nW10gfTtcblxuZnVuY3Rpb24gY29udmVydFRyYW5zYWN0aW9ucyh0eG5zOiBTY3JhcGVkVHJhbnNhY3Rpb25bXSk6IFRyYW5zYWN0aW9uW10ge1xuICByZXR1cm4gdHhucy5tYXAodHhuID0+IHtcbiAgICBjb25zdCBjb252ZXJ0ZWREYXRlID0gbW9tZW50KHR4bi5kYXRlLCBEQVRFX0ZPUk1BVCkudG9JU09TdHJpbmcoKTtcbiAgICBjb25zdCBjb252ZXJ0ZWRBbW91bnQgPSBnZXRUeG5BbW91bnQodHhuKTtcbiAgICByZXR1cm4ge1xuICAgICAgdHlwZTogVHJhbnNhY3Rpb25UeXBlcy5Ob3JtYWwsXG4gICAgICBpZGVudGlmaWVyOiB0eG4ucmVmZXJlbmNlID8gcGFyc2VJbnQodHhuLnJlZmVyZW5jZSwgMTApIDogdW5kZWZpbmVkLFxuICAgICAgZGF0ZTogY29udmVydGVkRGF0ZSxcbiAgICAgIHByb2Nlc3NlZERhdGU6IGNvbnZlcnRlZERhdGUsXG4gICAgICBvcmlnaW5hbEFtb3VudDogY29udmVydGVkQW1vdW50LFxuICAgICAgb3JpZ2luYWxDdXJyZW5jeTogU0hFS0VMX0NVUlJFTkNZLFxuICAgICAgY2hhcmdlZEFtb3VudDogY29udmVydGVkQW1vdW50LFxuICAgICAgc3RhdHVzOiB0eG4uc3RhdHVzLFxuICAgICAgZGVzY3JpcHRpb246IHR4bi5kZXNjcmlwdGlvbixcbiAgICAgIG1lbW86IHR4bi5tZW1vLFxuICAgIH07XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBoYW5kbGVUcmFuc2FjdGlvblJvdyh0eG5zOiBTY3JhcGVkVHJhbnNhY3Rpb25bXSwgdHhuUm93OiBUcmFuc2FjdGlvbnNUcikge1xuICBjb25zdCBkaXYgPSB0eG5Sb3cuaW5uZXJEaXZzO1xuXG4gIC8vIFJlbW92ZSBhbnl0aGluZyBleGNlcHQgZGlnaXRzLlxuICBjb25zdCByZWdleCA9IC9cXEQrL2dtO1xuXG4gIGNvbnN0IHR4OiBTY3JhcGVkVHJhbnNhY3Rpb24gPSB7XG4gICAgZGF0ZTogZGl2WzFdLFxuICAgIHJlZmVyZW5jZTogZGl2WzJdLnJlcGxhY2UocmVnZXgsICcnKSxcbiAgICBtZW1vOiAnJyxcbiAgICBkZXNjcmlwdGlvbjogZGl2WzNdLFxuICAgIGRlYml0OiBkaXZbNF0sXG4gICAgY3JlZGl0OiBkaXZbNV0sXG4gICAgc3RhdHVzOiBUcmFuc2FjdGlvblN0YXR1c2VzLkNvbXBsZXRlZCxcbiAgfTtcblxuICB0eG5zLnB1c2godHgpO1xufVxuXG5hc3luYyBmdW5jdGlvbiBnZXRBY2NvdW50VHJhbnNhY3Rpb25zKHBhZ2U6IFBhZ2UpOiBQcm9taXNlPFRyYW5zYWN0aW9uW10+IHtcbiAgLy8gV2FpdCBmb3IgdHJhbnNhY3Rpb25zLlxuICBhd2FpdCB3YWl0VW50aWxFbGVtZW50Rm91bmQocGFnZSwgJy51bmRlci1saW5lLXR4bi10YWJsZS1oZWFkZXInLCB0cnVlKTtcblxuICBjb25zdCB0eG5zOiBTY3JhcGVkVHJhbnNhY3Rpb25bXSA9IFtdO1xuICBjb25zdCB0cmFuc2FjdGlvbnNEaXZzID0gYXdhaXQgcGFnZUV2YWxBbGw8VHJhbnNhY3Rpb25zVHJbXT4oXG4gICAgcGFnZSxcbiAgICAnLmxpc3QtaXRlbS1ob2xkZXIgLmVudGlyZS1jb250ZW50LWN0cicsXG4gICAgW10sXG4gICAgZGl2cyA9PiB7XG4gICAgICByZXR1cm4gKGRpdnMgYXMgSFRNTEVsZW1lbnRbXSkubWFwKGRpdiA9PiAoe1xuICAgICAgICBpZDogZGl2LmdldEF0dHJpYnV0ZSgnaWQnKSB8fCAnJyxcbiAgICAgICAgaW5uZXJEaXZzOiBBcnJheS5mcm9tKGRpdi5nZXRFbGVtZW50c0J5VGFnTmFtZSgnZGl2JykpLm1hcChlbCA9PiAoZWwgYXMgSFRNTEVsZW1lbnQpLmlubmVyVGV4dCksXG4gICAgICB9KSk7XG4gICAgfSxcbiAgKTtcblxuICBmb3IgKGNvbnN0IHR4blJvdyBvZiB0cmFuc2FjdGlvbnNEaXZzKSB7XG4gICAgaGFuZGxlVHJhbnNhY3Rpb25Sb3codHhucywgdHhuUm93KTtcbiAgfVxuXG4gIHJldHVybiBjb252ZXJ0VHJhbnNhY3Rpb25zKHR4bnMpO1xufVxuXG4vLyBNYW5pcHVsYXRlIHRoZSBjYWxlbmRhciBkcm9wIGRvd24gdG8gY2hvb3NlIHRoZSB0eHMgc3RhcnQgZGF0ZS5cbmFzeW5jIGZ1bmN0aW9uIHNlYXJjaEJ5RGF0ZXMocGFnZTogUGFnZSwgc3RhcnREYXRlOiBNb21lbnQpIHtcbiAgLy8gR2V0IHRoZSBkYXkgbnVtYmVyIGZyb20gc3RhcnREYXRlLiAxLTMxICh1c3VhbGx5IDEpXG4gIGNvbnN0IHN0YXJ0RGF0ZURheSA9IHN0YXJ0RGF0ZS5mb3JtYXQoJ0QnKTtcbiAgY29uc3Qgc3RhcnREYXRlTW9udGggPSBzdGFydERhdGUuZm9ybWF0KCdNJyk7XG4gIGNvbnN0IHN0YXJ0RGF0ZVllYXIgPSBzdGFydERhdGUuZm9ybWF0KCdZJyk7XG5cbiAgLy8gT3BlbiB0aGUgY2FsZW5kYXIgZGF0ZSBwaWNrZXJcbiAgY29uc3QgZGF0ZUZyb21QaWNrID1cbiAgICAnZGl2LmRhdGUtb3B0aW9ucy1jZWxsOm50aC1jaGlsZCg3KSA+IGRhdGUtcGlja2VyOm50aC1jaGlsZCgxKSA+IGRpdjpudGgtY2hpbGQoMSkgPiBzcGFuOm50aC1jaGlsZCgyKSc7XG4gIGF3YWl0IHdhaXRVbnRpbEVsZW1lbnRGb3VuZChwYWdlLCBkYXRlRnJvbVBpY2ssIHRydWUpO1xuICBhd2FpdCBjbGlja0J1dHRvbihwYWdlLCBkYXRlRnJvbVBpY2spO1xuXG4gIC8vIFdhaXQgdW50aWwgZmlyc3QgZGF5IGFwcGVhci5cbiAgYXdhaXQgd2FpdFVudGlsRWxlbWVudEZvdW5kKHBhZ2UsICcucG11LWRheXMgPiBkaXY6bnRoLWNoaWxkKDEpJywgdHJ1ZSk7XG5cbiAgLy8gT3BlbiBNb250aHMgb3B0aW9ucy5cbiAgY29uc3QgbW9udGhGcm9tUGljayA9ICcucG11LW1vbnRoJztcbiAgYXdhaXQgd2FpdFVudGlsRWxlbWVudEZvdW5kKHBhZ2UsIG1vbnRoRnJvbVBpY2ssIHRydWUpO1xuICBhd2FpdCBjbGlja0J1dHRvbihwYWdlLCBtb250aEZyb21QaWNrKTtcbiAgYXdhaXQgd2FpdFVudGlsRWxlbWVudEZvdW5kKHBhZ2UsICcucG11LW1vbnRocyA+IGRpdjpudGgtY2hpbGQoMSknLCB0cnVlKTtcblxuICAvLyBPcGVuIFllYXIgb3B0aW9ucy5cbiAgLy8gVXNlIHNhbWUgc2VsZWN0b3IuLi4gWWFoYXYga25vd3Mgd2h5Li4uXG4gIGF3YWl0IHdhaXRVbnRpbEVsZW1lbnRGb3VuZChwYWdlLCBtb250aEZyb21QaWNrLCB0cnVlKTtcbiAgYXdhaXQgY2xpY2tCdXR0b24ocGFnZSwgbW9udGhGcm9tUGljayk7XG4gIGF3YWl0IHdhaXRVbnRpbEVsZW1lbnRGb3VuZChwYWdlLCAnLnBtdS15ZWFycyA+IGRpdjpudGgtY2hpbGQoMSknLCB0cnVlKTtcblxuICAvLyBTZWxlY3QgeWVhciBmcm9tIGEgMTIgeWVhciBncmlkLlxuICBmb3IgKGxldCBpID0gMTsgaSA8IDEzOyBpICs9IDEpIHtcbiAgICBjb25zdCBzZWxlY3RvciA9IGAucG11LXllYXJzID4gZGl2Om50aC1jaGlsZCgke2l9KWA7XG4gICAgY29uc3QgeWVhciA9IGF3YWl0IHBhZ2UuJGV2YWwoc2VsZWN0b3IsIHkgPT4ge1xuICAgICAgcmV0dXJuICh5IGFzIEhUTUxFbGVtZW50KS5pbm5lclRleHQ7XG4gICAgfSk7XG4gICAgaWYgKHN0YXJ0RGF0ZVllYXIgPT09IHllYXIpIHtcbiAgICAgIGF3YWl0IGNsaWNrQnV0dG9uKHBhZ2UsIHNlbGVjdG9yKTtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuXG4gIC8vIFNlbGVjdCBNb250aC5cbiAgYXdhaXQgd2FpdFVudGlsRWxlbWVudEZvdW5kKHBhZ2UsICcucG11LW1vbnRocyA+IGRpdjpudGgtY2hpbGQoMSknLCB0cnVlKTtcbiAgLy8gVGhlIGZpcnN0IGVsZW1lbnQgKDEpIGlzIEphbnVhcnkuXG4gIGNvbnN0IG1vbnRoU2VsZWN0b3IgPSBgLnBtdS1tb250aHMgPiBkaXY6bnRoLWNoaWxkKCR7c3RhcnREYXRlTW9udGh9KWA7XG4gIGF3YWl0IGNsaWNrQnV0dG9uKHBhZ2UsIG1vbnRoU2VsZWN0b3IpO1xuXG4gIC8vIFNlbGVjdCBEYXkuXG4gIC8vIFRoZSBjYWxlbmRhciBncmlkIHNob3dzIDcgZGF5cyBhbmQgNiB3ZWVrcyA9IDQyIGRheXMuXG4gIC8vIEluIHRoZW9yeSwgdGhlIGZpcnN0IGRheSBvZiB0aGUgbW9udGggd2lsbCBiZSBpbiB0aGUgZmlyc3Qgcm93LlxuICAvLyBMZXQncyBjaGVjayBldmVyeXRoaW5nIGp1c3QgaW4gY2FzZS4uLlxuICBmb3IgKGxldCBpID0gMTsgaSA8IDQyOyBpICs9IDEpIHtcbiAgICBjb25zdCBzZWxlY3RvciA9IGAucG11LWRheXMgPiBkaXY6bnRoLWNoaWxkKCR7aX0pYDtcbiAgICBjb25zdCBkYXkgPSBhd2FpdCBwYWdlLiRldmFsKHNlbGVjdG9yLCBkID0+IHtcbiAgICAgIHJldHVybiAoZCBhcyBIVE1MRWxlbWVudCkuaW5uZXJUZXh0O1xuICAgIH0pO1xuXG4gICAgaWYgKHN0YXJ0RGF0ZURheSA9PT0gZGF5KSB7XG4gICAgICBhd2FpdCBjbGlja0J1dHRvbihwYWdlLCBzZWxlY3Rvcik7XG4gICAgICBicmVhaztcbiAgICB9XG4gIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gZmV0Y2hBY2NvdW50RGF0YShwYWdlOiBQYWdlLCBzdGFydERhdGU6IE1vbWVudCwgYWNjb3VudElEOiBzdHJpbmcpOiBQcm9taXNlPFRyYW5zYWN0aW9uc0FjY291bnQ+IHtcbiAgYXdhaXQgd2FpdFVudGlsRWxlbWVudERpc2FwcGVhcihwYWdlLCAnLmxvYWRpbmctYmFyLXNwaW5uZXInKTtcbiAgYXdhaXQgc2VhcmNoQnlEYXRlcyhwYWdlLCBzdGFydERhdGUpO1xuICBhd2FpdCB3YWl0VW50aWxFbGVtZW50RGlzYXBwZWFyKHBhZ2UsICcubG9hZGluZy1iYXItc3Bpbm5lcicpO1xuICBjb25zdCB0eG5zID0gYXdhaXQgZ2V0QWNjb3VudFRyYW5zYWN0aW9ucyhwYWdlKTtcblxuICByZXR1cm4ge1xuICAgIGFjY291bnROdW1iZXI6IGFjY291bnRJRCxcbiAgICB0eG5zLFxuICB9O1xufVxuXG5hc3luYyBmdW5jdGlvbiBmZXRjaEFjY291bnRzKHBhZ2U6IFBhZ2UsIHN0YXJ0RGF0ZTogTW9tZW50KTogUHJvbWlzZTxUcmFuc2FjdGlvbnNBY2NvdW50W10+IHtcbiAgY29uc3QgYWNjb3VudHM6IFRyYW5zYWN0aW9uc0FjY291bnRbXSA9IFtdO1xuXG4gIC8vIFRPRE86IGdldCBtb3JlIGFjY291bnRzLiBOb3Qgc3VyZSBpcyBzdXBwb3J0ZWQuXG4gIGNvbnN0IGFjY291bnRJRCA9IGF3YWl0IGdldEFjY291bnRJRChwYWdlKTtcbiAgY29uc3QgYWNjb3VudERhdGEgPSBhd2FpdCBmZXRjaEFjY291bnREYXRhKHBhZ2UsIHN0YXJ0RGF0ZSwgYWNjb3VudElEKTtcbiAgYWNjb3VudHMucHVzaChhY2NvdW50RGF0YSk7XG5cbiAgcmV0dXJuIGFjY291bnRzO1xufVxuXG5hc3luYyBmdW5jdGlvbiB3YWl0UmVhZGluZXNzRm9yQWxsKHBhZ2U6IFBhZ2UpIHtcbiAgYXdhaXQgd2FpdFVudGlsRWxlbWVudEZvdW5kKHBhZ2UsIGAke1VTRVJfRUxFTX1gLCB0cnVlKTtcbiAgYXdhaXQgd2FpdFVudGlsRWxlbWVudEZvdW5kKHBhZ2UsIGAke1BBU1NXRF9FTEVNfWAsIHRydWUpO1xuICBhd2FpdCB3YWl0VW50aWxFbGVtZW50Rm91bmQocGFnZSwgYCR7TkFUSU9OQUxJRF9FTEVNfWAsIHRydWUpO1xuICBhd2FpdCB3YWl0VW50aWxFbGVtZW50Rm91bmQocGFnZSwgYCR7U1VCTUlUX0xPR0lOX1NFTEVDVE9SfWAsIHRydWUpO1xufVxuXG5hc3luYyBmdW5jdGlvbiByZWRpcmVjdE9yRGlhbG9nKHBhZ2U6IFBhZ2UpIHtcbiAgLy8gQ2xpY2sgb24gYmFuayBtZXNzYWdlcyBpZiBhbnkuXG4gIGF3YWl0IHdhaXRGb3JOYXZpZ2F0aW9uKHBhZ2UpO1xuICBhd2FpdCB3YWl0VW50aWxFbGVtZW50RGlzYXBwZWFyKHBhZ2UsICcubG9hZGluZy1iYXItc3Bpbm5lcicpO1xuICBjb25zdCBoYXNNZXNzYWdlID0gYXdhaXQgZWxlbWVudFByZXNlbnRPblBhZ2UocGFnZSwgJy5tZXNzYWdpbmctbGlua3MtY29udGFpbmVyJyk7XG4gIGlmIChoYXNNZXNzYWdlKSB7XG4gICAgYXdhaXQgY2xpY2tCdXR0b24ocGFnZSwgJy5saW5rLTEnKTtcbiAgfVxuXG4gIGNvbnN0IHByb21pc2UxID0gcGFnZS53YWl0Rm9yU2VsZWN0b3IoQUNDT1VOVF9ERVRBSUxTX1NFTEVDVE9SLCB7IHRpbWVvdXQ6IDMwMDAwIH0pO1xuICBjb25zdCBwcm9taXNlMiA9IHBhZ2Uud2FpdEZvclNlbGVjdG9yKENIQU5HRV9QQVNTV09SRF9PTERfUEFTUywgeyB0aW1lb3V0OiAzMDAwMCB9KTtcbiAgY29uc3QgcHJvbWlzZXMgPSBbcHJvbWlzZTEsIHByb21pc2UyXTtcblxuICBhd2FpdCBQcm9taXNlLnJhY2UocHJvbWlzZXMpO1xuICBhd2FpdCB3YWl0VW50aWxFbGVtZW50RGlzYXBwZWFyKHBhZ2UsICcubG9hZGluZy1iYXItc3Bpbm5lcicpO1xufVxuXG50eXBlIFNjcmFwZXJTcGVjaWZpY0NyZWRlbnRpYWxzID0geyB1c2VybmFtZTogc3RyaW5nOyBwYXNzd29yZDogc3RyaW5nOyBuYXRpb25hbElEOiBzdHJpbmcgfTtcblxuY2xhc3MgWWFoYXZTY3JhcGVyIGV4dGVuZHMgQmFzZVNjcmFwZXJXaXRoQnJvd3NlcjxTY3JhcGVyU3BlY2lmaWNDcmVkZW50aWFscz4ge1xuICBnZXRMb2dpbk9wdGlvbnMoY3JlZGVudGlhbHM6IFNjcmFwZXJTcGVjaWZpY0NyZWRlbnRpYWxzKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGxvZ2luVXJsOiBgJHtMT0dJTl9VUkx9YCxcbiAgICAgIGZpZWxkczogW1xuICAgICAgICB7IHNlbGVjdG9yOiBgJHtVU0VSX0VMRU19YCwgdmFsdWU6IGNyZWRlbnRpYWxzLnVzZXJuYW1lIH0sXG4gICAgICAgIHsgc2VsZWN0b3I6IGAke1BBU1NXRF9FTEVNfWAsIHZhbHVlOiBjcmVkZW50aWFscy5wYXNzd29yZCB9LFxuICAgICAgICB7IHNlbGVjdG9yOiBgJHtOQVRJT05BTElEX0VMRU19YCwgdmFsdWU6IGNyZWRlbnRpYWxzLm5hdGlvbmFsSUQgfSxcbiAgICAgIF0sXG4gICAgICBzdWJtaXRCdXR0b25TZWxlY3RvcjogYCR7U1VCTUlUX0xPR0lOX1NFTEVDVE9SfWAsXG4gICAgICBjaGVja1JlYWRpbmVzczogYXN5bmMgKCkgPT4gd2FpdFJlYWRpbmVzc0ZvckFsbCh0aGlzLnBhZ2UpLFxuICAgICAgcG9zdEFjdGlvbjogYXN5bmMgKCkgPT4gcmVkaXJlY3RPckRpYWxvZyh0aGlzLnBhZ2UpLFxuICAgICAgcG9zc2libGVSZXN1bHRzOiBnZXRQb3NzaWJsZUxvZ2luUmVzdWx0cyh0aGlzLnBhZ2UpLFxuICAgIH07XG4gIH1cblxuICBhc3luYyBmZXRjaERhdGEoKSB7XG4gICAgLy8gR290byBzdGF0ZW1lbnRzIHBhZ2VcbiAgICBhd2FpdCB3YWl0VW50aWxFbGVtZW50Rm91bmQodGhpcy5wYWdlLCBBQ0NPVU5UX0RFVEFJTFNfU0VMRUNUT1IsIHRydWUpO1xuICAgIGF3YWl0IGNsaWNrQnV0dG9uKHRoaXMucGFnZSwgQUNDT1VOVF9ERVRBSUxTX1NFTEVDVE9SKTtcbiAgICBhd2FpdCB3YWl0VW50aWxFbGVtZW50Rm91bmQodGhpcy5wYWdlLCAnLnN0YXRlbWVudC1vcHRpb25zIC5zZWxlY3RlZC1pdGVtLXRvcCcsIHRydWUpO1xuXG4gICAgY29uc3QgZGVmYXVsdFN0YXJ0TW9tZW50ID0gbW9tZW50KCkuc3VidHJhY3QoMywgJ21vbnRocycpLmFkZCgxLCAnZGF5Jyk7XG4gICAgY29uc3Qgc3RhcnREYXRlID0gdGhpcy5vcHRpb25zLnN0YXJ0RGF0ZSB8fCBkZWZhdWx0U3RhcnRNb21lbnQudG9EYXRlKCk7XG4gICAgY29uc3Qgc3RhcnRNb21lbnQgPSBtb21lbnQubWF4KGRlZmF1bHRTdGFydE1vbWVudCwgbW9tZW50KHN0YXJ0RGF0ZSkpO1xuXG4gICAgY29uc3QgYWNjb3VudHMgPSBhd2FpdCBmZXRjaEFjY291bnRzKHRoaXMucGFnZSwgc3RhcnRNb21lbnQpO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIHN1Y2Nlc3M6IHRydWUsXG4gICAgICBhY2NvdW50cyxcbiAgICB9O1xuICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IFlhaGF2U2NyYXBlcjtcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBQUEsSUFBQUEsT0FBQSxHQUFBQyxzQkFBQSxDQUFBQyxPQUFBO0FBRUEsSUFBQUMsVUFBQSxHQUFBRCxPQUFBO0FBQ0EsSUFB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
@@ -0,0 +1 @@
1
+ export {};