@rendomnet/apiservice 1.3.5 → 1.3.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js CHANGED
@@ -1,234 +1,405 @@
1
1
  "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- const ApiKeyAuthProvider_1 = require("./ApiKeyAuthProvider");
4
- const components_1 = require("./components");
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports["default"] = void 0;
7
+ var _ApiKeyAuthProvider = require("./ApiKeyAuthProvider");
8
+ var _components = require("./components");
9
+ function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); }
10
+ function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
11
+ function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
12
+ function _regenerator() { /*! regenerator-runtime -- Copyright (c) 2014-present, Facebook, Inc. -- license (MIT): https://github.com/babel/babel/blob/main/packages/babel-helpers/LICENSE */ var e, t, r = "function" == typeof Symbol ? Symbol : {}, n = r.iterator || "@@iterator", o = r.toStringTag || "@@toStringTag"; function i(r, n, o, i) { var c = n && n.prototype instanceof Generator ? n : Generator, u = Object.create(c.prototype); return _regeneratorDefine2(u, "_invoke", function (r, n, o) { var i, c, u, f = 0, p = o || [], y = !1, G = { p: 0, n: 0, v: e, a: d, f: d.bind(e, 4), d: function d(t, r) { return i = t, c = 0, u = e, G.n = r, a; } }; function d(r, n) { for (c = r, u = n, t = 0; !y && f && !o && t < p.length; t++) { var o, i = p[t], d = G.p, l = i[2]; r > 3 ? (o = l === n) && (u = i[(c = i[4]) ? 5 : (c = 3, 3)], i[4] = i[5] = e) : i[0] <= d && ((o = r < 2 && d < i[1]) ? (c = 0, G.v = n, G.n = i[1]) : d < l && (o = r < 3 || i[0] > n || n > l) && (i[4] = r, i[5] = n, G.n = l, c = 0)); } if (o || r > 1) return a; throw y = !0, n; } return function (o, p, l) { if (f > 1) throw TypeError("Generator is already running"); for (y && 1 === p && d(p, l), c = p, u = l; (t = c < 2 ? e : u) || !y;) { i || (c ? c < 3 ? (c > 1 && (G.n = -1), d(c, u)) : G.n = u : G.v = u); try { if (f = 2, i) { if (c || (o = "next"), t = i[o]) { if (!(t = t.call(i, u))) throw TypeError("iterator result is not an object"); if (!t.done) return t; u = t.value, c < 2 && (c = 0); } else 1 === c && (t = i["return"]) && t.call(i), c < 2 && (u = TypeError("The iterator does not provide a '" + o + "' method"), c = 1); i = e; } else if ((t = (y = G.n < 0) ? u : r.call(n, G)) !== a) break; } catch (t) { i = e, c = 1, u = t; } finally { f = 1; } } return { value: t, done: y }; }; }(r, o, i), !0), u; } var a = {}; function Generator() {} function GeneratorFunction() {} function GeneratorFunctionPrototype() {} t = Object.getPrototypeOf; var c = [][n] ? t(t([][n]())) : (_regeneratorDefine2(t = {}, n, function () { return this; }), t), u = GeneratorFunctionPrototype.prototype = Generator.prototype = Object.create(c); function f(e) { return Object.setPrototypeOf ? Object.setPrototypeOf(e, GeneratorFunctionPrototype) : (e.__proto__ = GeneratorFunctionPrototype, _regeneratorDefine2(e, o, "GeneratorFunction")), e.prototype = Object.create(u), e; } return GeneratorFunction.prototype = GeneratorFunctionPrototype, _regeneratorDefine2(u, "constructor", GeneratorFunctionPrototype), _regeneratorDefine2(GeneratorFunctionPrototype, "constructor", GeneratorFunction), GeneratorFunction.displayName = "GeneratorFunction", _regeneratorDefine2(GeneratorFunctionPrototype, o, "GeneratorFunction"), _regeneratorDefine2(u), _regeneratorDefine2(u, o, "Generator"), _regeneratorDefine2(u, n, function () { return this; }), _regeneratorDefine2(u, "toString", function () { return "[object Generator]"; }), (_regenerator = function _regenerator() { return { w: i, m: f }; })(); }
13
+ function _regeneratorDefine2(e, r, n, t) { var i = Object.defineProperty; try { i({}, "", {}); } catch (e) { i = 0; } _regeneratorDefine2 = function _regeneratorDefine(e, r, n, t) { if (r) i ? i(e, r, { value: n, enumerable: !t, configurable: !t, writable: !t }) : e[r] = n;else { var o = function o(r, n) { _regeneratorDefine2(e, r, function (e) { return this._invoke(r, n, e); }); }; o("next", 0), o("throw", 1), o("return", 2); } }, _regeneratorDefine2(e, r, n, t); }
14
+ function asyncGeneratorStep(n, t, e, r, o, a, c) { try { var i = n[a](c), u = i.value; } catch (n) { return void e(n); } i.done ? t(u) : Promise.resolve(u).then(r, o); }
15
+ function _asyncToGenerator(n) { return function () { var t = this, e = arguments; return new Promise(function (r, o) { var a = n.apply(t, e); function _next(n) { asyncGeneratorStep(a, r, o, _next, _throw, "next", n); } function _throw(n) { asyncGeneratorStep(a, r, o, _next, _throw, "throw", n); } _next(void 0); }); }; }
16
+ function _slicedToArray(r, e) { return _arrayWithHoles(r) || _iterableToArrayLimit(r, e) || _unsupportedIterableToArray(r, e) || _nonIterableRest(); }
17
+ function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
18
+ function _unsupportedIterableToArray(r, a) { if (r) { if ("string" == typeof r) return _arrayLikeToArray(r, a); var t = {}.toString.call(r).slice(8, -1); return "Object" === t && r.constructor && (t = r.constructor.name), "Map" === t || "Set" === t ? Array.from(r) : "Arguments" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0; } }
19
+ function _arrayLikeToArray(r, a) { (null == a || a > r.length) && (a = r.length); for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; return n; }
20
+ function _iterableToArrayLimit(r, l) { var t = null == r ? null : "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (null != t) { var e, n, i, u, a = [], f = !0, o = !1; try { if (i = (t = t.call(r)).next, 0 === l) { if (Object(t) !== t) return; f = !1; } else for (; !(f = (e = i.call(t)).done) && (a.push(e.value), a.length !== l); f = !0); } catch (r) { o = !0, n = r; } finally { try { if (!f && null != t["return"] && (u = t["return"](), Object(u) !== u)) return; } finally { if (o) throw n; } } return a; } }
21
+ function _arrayWithHoles(r) { if (Array.isArray(r)) return r; }
22
+ function _classCallCheck(a, n) { if (!(a instanceof n)) throw new TypeError("Cannot call a class as a function"); }
23
+ function _defineProperties(e, r) { for (var t = 0; t < r.length; t++) { var o = r[t]; o.enumerable = o.enumerable || !1, o.configurable = !0, "value" in o && (o.writable = !0), Object.defineProperty(e, _toPropertyKey(o.key), o); } }
24
+ function _createClass(e, r, t) { return r && _defineProperties(e.prototype, r), t && _defineProperties(e, t), Object.defineProperty(e, "prototype", { writable: !1 }), e; }
25
+ 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; }
26
+ function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : i + ""; }
27
+ 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); }
5
28
  /**
6
29
  * ApiService - Core API service for making authenticated API calls
7
30
  * with caching, retry, and hook support.
8
31
  */
9
- class ApiService {
10
- constructor() {
11
- this.baseUrl = ''; // Default base URL
12
- // Default max attempts for API calls
13
- this.maxAttempts = 10;
14
- this.provider = '';
15
- this.authProvider = {};
16
- // Initialize component managers
17
- this.cacheManager = new components_1.CacheManager();
18
- this.retryManager = new components_1.RetryManager();
19
- this.hookManager = new components_1.HookManager();
20
- this.httpClient = new components_1.HttpClient();
21
- this.accountManager = new components_1.AccountManager();
22
- }
23
- /**
24
- * Setup the API service
25
- */
26
- setup({ provider, authProvider, hooks = {}, cacheTime, baseUrl = '', }) {
27
- this.provider = provider;
28
- this.authProvider = authProvider;
29
- this.baseUrl = baseUrl;
30
- // Create a copy of hooks to avoid modifying the input
31
- const finalHooks = {};
32
- // Apply default 401 handler if:
33
- // 1. No 401 hook is explicitly defined (or is explicitly null)
34
- // 2. AuthProvider has a refresh method
35
- if (hooks[401] === undefined && typeof this.authProvider.refresh === 'function') {
36
- finalHooks[401] = this.createDefaultAuthRefreshHandler();
37
- }
38
- // Add user-defined hooks (skipping null/undefined values)
39
- for (const [statusCode, hook] of Object.entries(hooks)) {
40
- if (hook) {
41
- finalHooks[statusCode] = hook;
42
- }
43
- }
44
- // Set the hooks if we have any
45
- if (Object.keys(finalHooks).length > 0) {
46
- this.hookManager.setHooks(finalHooks);
47
- }
48
- if (typeof cacheTime !== 'undefined') {
49
- this.cacheManager.setCacheTime(cacheTime);
32
+ var ApiService = /*#__PURE__*/function () {
33
+ function ApiService() {
34
+ _classCallCheck(this, ApiService);
35
+ // Service provider name
36
+ _defineProperty(this, "baseUrl", '');
37
+ // Default max attempts for API calls
38
+ _defineProperty(this, "maxAttempts", 10);
39
+ this.provider = '';
40
+ this.authProvider = {};
41
+
42
+ // Initialize component managers
43
+ this.cacheManager = new _components.CacheManager();
44
+ this.retryManager = new _components.RetryManager();
45
+ this.hookManager = new _components.HookManager();
46
+ this.httpClient = new _components.HttpClient();
47
+ this.accountManager = new _components.AccountManager();
48
+ }
49
+
50
+ /**
51
+ * Setup the API service
52
+ */
53
+ return _createClass(ApiService, [{
54
+ key: "setup",
55
+ value: function setup(_ref) {
56
+ var provider = _ref.provider,
57
+ authProvider = _ref.authProvider,
58
+ _ref$hooks = _ref.hooks,
59
+ hooks = _ref$hooks === void 0 ? {} : _ref$hooks,
60
+ cacheTime = _ref.cacheTime,
61
+ _ref$baseUrl = _ref.baseUrl,
62
+ baseUrl = _ref$baseUrl === void 0 ? '' : _ref$baseUrl;
63
+ this.provider = provider;
64
+ this.authProvider = authProvider;
65
+ this.baseUrl = baseUrl;
66
+
67
+ // Create a copy of hooks to avoid modifying the input
68
+ var finalHooks = {};
69
+
70
+ // Apply default 401 handler if:
71
+ // 1. No 401 hook is explicitly defined (or is explicitly null)
72
+ // 2. AuthProvider has a refresh method
73
+ if (hooks[401] === undefined && typeof this.authProvider.refresh === 'function') {
74
+ finalHooks[401] = this.createDefaultAuthRefreshHandler();
75
+ }
76
+
77
+ // Add user-defined hooks (skipping null/undefined values)
78
+ for (var _i = 0, _Object$entries = Object.entries(hooks); _i < _Object$entries.length; _i++) {
79
+ var _Object$entries$_i = _slicedToArray(_Object$entries[_i], 2),
80
+ statusCode = _Object$entries$_i[0],
81
+ hook = _Object$entries$_i[1];
82
+ if (hook) {
83
+ finalHooks[statusCode] = hook;
50
84
  }
85
+ }
86
+
87
+ // Set the hooks if we have any
88
+ if (Object.keys(finalHooks).length > 0) {
89
+ this.hookManager.setHooks(finalHooks);
90
+ }
91
+ if (typeof cacheTime !== 'undefined') {
92
+ this.cacheManager.setCacheTime(cacheTime);
93
+ }
51
94
  }
95
+
52
96
  /**
53
97
  * Create a default handler for 401 (Unauthorized) errors
54
98
  * that implements standard credential refresh behavior
55
99
  */
56
- createDefaultAuthRefreshHandler() {
57
- return {
58
- shouldRetry: true,
59
- useRetryDelay: true,
60
- preventConcurrentCalls: true,
61
- maxRetries: 1,
62
- handler: async (accountId) => {
63
- try {
64
- console.log(`🔄 Using default auth refresh handler for ${accountId}`);
65
- if (!this.authProvider.refresh) {
66
- throw new Error('No refresh method available on auth provider');
67
- }
68
- // You may want to store refresh token in account data or pass it in another way
69
- // For now, assume refresh token is managed internally by the provider
70
- await this.authProvider.refresh('', accountId);
71
- return {};
72
- }
73
- catch (error) {
74
- console.error(`Auth refresh failed for ${accountId}:`, error);
75
- throw error;
76
- }
77
- },
78
- onMaxRetriesExceeded: async (accountId, error) => {
79
- console.error(`Authentication failed after refresh attempt for ${accountId}:`, error);
80
- }
81
- };
100
+ }, {
101
+ key: "createDefaultAuthRefreshHandler",
102
+ value: function createDefaultAuthRefreshHandler() {
103
+ var _this = this;
104
+ return {
105
+ shouldRetry: true,
106
+ useRetryDelay: true,
107
+ preventConcurrentCalls: true,
108
+ maxRetries: 1,
109
+ handler: function () {
110
+ var _handler = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee(accountId) {
111
+ var _t;
112
+ return _regenerator().w(function (_context) {
113
+ while (1) switch (_context.n) {
114
+ case 0:
115
+ _context.p = 0;
116
+ console.log("\uD83D\uDD04 Using default auth refresh handler for ".concat(accountId));
117
+ if (_this.authProvider.refresh) {
118
+ _context.n = 1;
119
+ break;
120
+ }
121
+ throw new Error('No refresh method available on auth provider');
122
+ case 1:
123
+ _context.n = 2;
124
+ return _this.authProvider.refresh('', accountId);
125
+ case 2:
126
+ return _context.a(2, {});
127
+ case 3:
128
+ _context.p = 3;
129
+ _t = _context.v;
130
+ console.error("Auth refresh failed for ".concat(accountId, ":"), _t);
131
+ throw _t;
132
+ case 4:
133
+ return _context.a(2);
134
+ }
135
+ }, _callee, null, [[0, 3]]);
136
+ }));
137
+ function handler(_x) {
138
+ return _handler.apply(this, arguments);
139
+ }
140
+ return handler;
141
+ }(),
142
+ onMaxRetriesExceeded: function () {
143
+ var _onMaxRetriesExceeded = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee2(accountId, error) {
144
+ return _regenerator().w(function (_context2) {
145
+ while (1) switch (_context2.n) {
146
+ case 0:
147
+ console.error("Authentication failed after refresh attempt for ".concat(accountId, ":"), error);
148
+ case 1:
149
+ return _context2.a(2);
150
+ }
151
+ }, _callee2);
152
+ }));
153
+ function onMaxRetriesExceeded(_x2, _x3) {
154
+ return _onMaxRetriesExceeded.apply(this, arguments);
155
+ }
156
+ return onMaxRetriesExceeded;
157
+ }()
158
+ };
82
159
  }
160
+
83
161
  /**
84
162
  * Set the maximum number of retry attempts
85
163
  */
86
- setMaxAttempts(attempts) {
87
- this.maxAttempts = attempts;
164
+ }, {
165
+ key: "setMaxAttempts",
166
+ value: function setMaxAttempts(attempts) {
167
+ this.maxAttempts = attempts;
88
168
  }
169
+
89
170
  /**
90
171
  * Update account data
91
172
  */
92
- updateAccountData(accountId, data) {
93
- this.accountManager.updateAccountData(accountId, data);
173
+ }, {
174
+ key: "updateAccountData",
175
+ value: function updateAccountData(accountId, data) {
176
+ this.accountManager.updateAccountData(accountId, data);
94
177
  }
178
+
95
179
  /**
96
180
  * Make an API call with all features (caching, retry, hooks)
97
181
  */
98
- async call(apiCallParams) {
99
- // Use 'default' as fallback if accountId is not provided
100
- // and use default baseUrl if not provided
101
- const params = {
102
- ...apiCallParams,
103
- accountId: apiCallParams.accountId || 'default',
104
- base: apiCallParams.base || this.baseUrl,
105
- };
106
- // If using ApiKeyAuthProvider with queryParamName, add API key to queryParams
107
- if (this.authProvider instanceof ApiKeyAuthProvider_1.ApiKeyAuthProvider &&
108
- this.authProvider.queryParamName) {
109
- const queryParamName = this.authProvider.queryParamName;
110
- const apiKey = this.authProvider.apiKey;
111
- const urlParams = params.queryParams ? new URLSearchParams(params.queryParams) : new URLSearchParams();
112
- urlParams.set(queryParamName, apiKey);
113
- params.queryParams = urlParams;
114
- }
115
- console.log('🔄 API call', this.provider, params.accountId, params.method, params.route);
116
- // Check cache first
117
- const cachedData = this.cacheManager.getFromCache(params);
118
- if (cachedData)
119
- return cachedData;
120
- // Make the API call with retry capability
121
- const result = await this.makeRequestWithRetry(params);
122
- // Cache the result
123
- this.cacheManager.saveToCache(params, result);
124
- return result;
125
- }
182
+ }, {
183
+ key: "call",
184
+ value: (function () {
185
+ var _call = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee3(apiCallParams) {
186
+ var params, queryParamName, apiKey, urlParams, cachedData, result;
187
+ return _regenerator().w(function (_context3) {
188
+ while (1) switch (_context3.n) {
189
+ case 0:
190
+ // Use 'default' as fallback if accountId is not provided
191
+ // and use default baseUrl if not provided
192
+ params = _objectSpread(_objectSpread({}, apiCallParams), {}, {
193
+ accountId: apiCallParams.accountId || 'default',
194
+ base: apiCallParams.base || this.baseUrl
195
+ }); // If using ApiKeyAuthProvider with queryParamName, add API key to queryParams
196
+ if (this.authProvider instanceof _ApiKeyAuthProvider.ApiKeyAuthProvider && this.authProvider.queryParamName) {
197
+ queryParamName = this.authProvider.queryParamName;
198
+ apiKey = this.authProvider.apiKey;
199
+ urlParams = params.queryParams ? new URLSearchParams(params.queryParams) : new URLSearchParams();
200
+ urlParams.set(queryParamName, apiKey);
201
+ params.queryParams = urlParams;
202
+ }
203
+ console.log('🔄 API call', this.provider, params.accountId, params.method, params.route);
204
+
205
+ // Check cache first
206
+ cachedData = this.cacheManager.getFromCache(params);
207
+ if (!cachedData) {
208
+ _context3.n = 1;
209
+ break;
210
+ }
211
+ return _context3.a(2, cachedData);
212
+ case 1:
213
+ _context3.n = 2;
214
+ return this.makeRequestWithRetry(params);
215
+ case 2:
216
+ result = _context3.v;
217
+ // Cache the result
218
+ this.cacheManager.saveToCache(params, result);
219
+ return _context3.a(2, result);
220
+ }
221
+ }, _callee3, this);
222
+ }));
223
+ function call(_x4) {
224
+ return _call.apply(this, arguments);
225
+ }
226
+ return call;
227
+ }()
126
228
  /**
127
229
  * Legacy method for backward compatibility
128
230
  * @deprecated Use call() instead
129
231
  */
130
- async makeApiCall(apiCallParams) {
131
- return this.call(apiCallParams);
132
- }
232
+ )
233
+ }, {
234
+ key: "makeApiCall",
235
+ value: (function () {
236
+ var _makeApiCall = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee4(apiCallParams) {
237
+ return _regenerator().w(function (_context4) {
238
+ while (1) switch (_context4.n) {
239
+ case 0:
240
+ return _context4.a(2, this.call(apiCallParams));
241
+ }
242
+ }, _callee4, this);
243
+ }));
244
+ function makeApiCall(_x5) {
245
+ return _makeApiCall.apply(this, arguments);
246
+ }
247
+ return makeApiCall;
248
+ }()
133
249
  /**
134
250
  * Make a request with retry capability
135
251
  */
136
- async makeRequestWithRetry(apiCallParams) {
137
- var _a;
138
- const { accountId, abortSignal } = apiCallParams;
139
- let attempts = 0;
140
- const statusRetries = {};
141
- let currentParams = { ...apiCallParams };
142
- // If using ApiKeyAuthProvider with queryParamName, add API key to queryParams
143
- if (this.authProvider instanceof ApiKeyAuthProvider_1.ApiKeyAuthProvider &&
144
- this.authProvider.queryParamName) {
145
- const queryParamName = this.authProvider.queryParamName;
146
- const apiKey = this.authProvider.apiKey;
147
- const urlParams = currentParams.queryParams ? new URLSearchParams(currentParams.queryParams) : new URLSearchParams();
148
- urlParams.set(queryParamName, apiKey);
149
- currentParams.queryParams = urlParams;
150
- }
151
- // Main retry loop
152
- while (attempts < this.maxAttempts) {
153
- if (abortSignal === null || abortSignal === void 0 ? void 0 : abortSignal.aborted) {
154
- throw new Error('Request aborted');
155
- }
156
- attempts++;
157
- try {
158
- // Get authentication headers if needed
159
- const authHeaders = apiCallParams.useAuth !== false
160
- ? await this.authProvider.getAuthHeaders(accountId)
161
- : {};
162
- // Merge auth headers into params.headers
163
- currentParams.headers = {
164
- ...(currentParams.headers || {}),
165
- ...authHeaders,
166
- };
167
- // Verify we have authentication if required
168
- if (apiCallParams.useAuth !== false &&
169
- Object.keys(authHeaders).length === 0 &&
170
- !(this.authProvider instanceof ApiKeyAuthProvider_1.ApiKeyAuthProvider &&
171
- this.authProvider.queryParamName)) {
172
- throw new Error(`${this.provider} credentials not found for account ID ${accountId}`);
173
- }
174
- // Make the actual API call
175
- const response = await this.httpClient.makeRequest(currentParams, {});
176
- // Success - update account status and return result
177
- this.accountManager.setLastRequestFailed(accountId, false);
178
- return response;
179
- }
180
- catch (error) {
181
- const status = error === null || error === void 0 ? void 0 : error.status;
182
- // If no hook exists for this error, or we shouldn't retry, throw
183
- if (!this.hookManager.shouldRetry(status)) {
184
- throw error;
185
- }
186
- // Track retries for this status code
187
- statusRetries[status] = (statusRetries[status] || 0) + 1;
188
- const activeHook = this.hookManager.getHook(status);
189
- const maxRetries = (_a = activeHook === null || activeHook === void 0 ? void 0 : activeHook.maxRetries) !== null && _a !== void 0 ? _a : this.retryManager.getDefaultMaxRetries();
190
- // Check if we've exceeded retries for this status
191
- if (statusRetries[status] > maxRetries) {
192
- await this.hookManager.handleRetryFailure(accountId, status, error);
193
- this.accountManager.setLastRequestFailed(accountId, true);
194
- throw error;
195
- }
196
- // Process the hook to get updated params
197
- try {
198
- const hookResult = await this.hookManager.processHook(accountId, status, error);
199
- if (hookResult) {
200
- currentParams = { ...currentParams, ...hookResult };
201
- }
202
- }
203
- catch (hookError) {
204
- this.accountManager.setLastRequestFailed(accountId, true);
205
- throw hookError;
206
- }
207
- // Wait before retrying if needed
208
- if (activeHook === null || activeHook === void 0 ? void 0 : activeHook.useRetryDelay) {
209
- await this.retryManager.calculateAndDelay({
210
- attempt: statusRetries[status],
211
- response: error.response,
212
- hook: activeHook,
213
- });
214
- }
215
- }
216
- }
217
- // If we've reached here, we've exceeded our maximum attempts
218
- this.accountManager.setLastRequestFailed(accountId, true);
219
- throw new Error(`Exceeded maximum attempts (${this.maxAttempts}) for API call to ${accountId}`);
220
- }
252
+ )
253
+ }, {
254
+ key: "makeRequestWithRetry",
255
+ value: (function () {
256
+ var _makeRequestWithRetry = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee5(apiCallParams) {
257
+ var accountId, abortSignal, attempts, statusRetries, currentParams, queryParamName, apiKey, urlParams, authHeaders, response, _activeHook$maxRetrie, status, activeHook, maxRetries, hookResult, _t2, _t3, _t4;
258
+ return _regenerator().w(function (_context5) {
259
+ while (1) switch (_context5.n) {
260
+ case 0:
261
+ accountId = apiCallParams.accountId, abortSignal = apiCallParams.abortSignal;
262
+ attempts = 0;
263
+ statusRetries = {};
264
+ currentParams = _objectSpread({}, apiCallParams); // If using ApiKeyAuthProvider with queryParamName, add API key to queryParams
265
+ if (this.authProvider instanceof _ApiKeyAuthProvider.ApiKeyAuthProvider && this.authProvider.queryParamName) {
266
+ queryParamName = this.authProvider.queryParamName;
267
+ apiKey = this.authProvider.apiKey;
268
+ urlParams = currentParams.queryParams ? new URLSearchParams(currentParams.queryParams) : new URLSearchParams();
269
+ urlParams.set(queryParamName, apiKey);
270
+ currentParams.queryParams = urlParams;
271
+ }
272
+ // Main retry loop
273
+ case 1:
274
+ if (!(attempts < this.maxAttempts)) {
275
+ _context5.n = 17;
276
+ break;
277
+ }
278
+ if (!(abortSignal !== null && abortSignal !== void 0 && abortSignal.aborted)) {
279
+ _context5.n = 2;
280
+ break;
281
+ }
282
+ throw new Error('Request aborted');
283
+ case 2:
284
+ attempts++;
285
+ _context5.p = 3;
286
+ if (!(apiCallParams.useAuth !== false)) {
287
+ _context5.n = 5;
288
+ break;
289
+ }
290
+ _context5.n = 4;
291
+ return this.authProvider.getAuthHeaders(accountId);
292
+ case 4:
293
+ _t2 = _context5.v;
294
+ _context5.n = 6;
295
+ break;
296
+ case 5:
297
+ _t2 = {};
298
+ case 6:
299
+ authHeaders = _t2;
300
+ // Merge auth headers into params.headers
301
+ currentParams.headers = _objectSpread(_objectSpread({}, currentParams.headers || {}), authHeaders);
302
+
303
+ // Verify we have authentication if required
304
+ if (!(apiCallParams.useAuth !== false && Object.keys(authHeaders).length === 0 && !(this.authProvider instanceof _ApiKeyAuthProvider.ApiKeyAuthProvider && this.authProvider.queryParamName))) {
305
+ _context5.n = 7;
306
+ break;
307
+ }
308
+ throw new Error("".concat(this.provider, " credentials not found for account ID ").concat(accountId));
309
+ case 7:
310
+ _context5.n = 8;
311
+ return this.httpClient.makeRequest(currentParams, {});
312
+ case 8:
313
+ response = _context5.v;
314
+ // Success - update account status and return result
315
+ this.accountManager.setLastRequestFailed(accountId, false);
316
+ return _context5.a(2, response);
317
+ case 9:
318
+ _context5.p = 9;
319
+ _t3 = _context5.v;
320
+ status = _t3 === null || _t3 === void 0 ? void 0 : _t3.status; // If no hook exists for this error, or we shouldn't retry, throw
321
+ if (this.hookManager.shouldRetry(status)) {
322
+ _context5.n = 10;
323
+ break;
324
+ }
325
+ throw _t3;
326
+ case 10:
327
+ // Track retries for this status code
328
+ statusRetries[status] = (statusRetries[status] || 0) + 1;
329
+ activeHook = this.hookManager.getHook(status);
330
+ maxRetries = (_activeHook$maxRetrie = activeHook === null || activeHook === void 0 ? void 0 : activeHook.maxRetries) !== null && _activeHook$maxRetrie !== void 0 ? _activeHook$maxRetrie : this.retryManager.getDefaultMaxRetries(); // Check if we've exceeded retries for this status
331
+ if (!(statusRetries[status] > maxRetries)) {
332
+ _context5.n = 12;
333
+ break;
334
+ }
335
+ _context5.n = 11;
336
+ return this.hookManager.handleRetryFailure(accountId, status, _t3);
337
+ case 11:
338
+ this.accountManager.setLastRequestFailed(accountId, true);
339
+ throw _t3;
340
+ case 12:
341
+ _context5.p = 12;
342
+ _context5.n = 13;
343
+ return this.hookManager.processHook(accountId, status, _t3);
344
+ case 13:
345
+ hookResult = _context5.v;
346
+ if (hookResult) {
347
+ currentParams = _objectSpread(_objectSpread({}, currentParams), hookResult);
348
+ }
349
+ _context5.n = 15;
350
+ break;
351
+ case 14:
352
+ _context5.p = 14;
353
+ _t4 = _context5.v;
354
+ this.accountManager.setLastRequestFailed(accountId, true);
355
+ throw _t4;
356
+ case 15:
357
+ if (!(activeHook !== null && activeHook !== void 0 && activeHook.useRetryDelay)) {
358
+ _context5.n = 16;
359
+ break;
360
+ }
361
+ _context5.n = 16;
362
+ return this.retryManager.calculateAndDelay({
363
+ attempt: statusRetries[status],
364
+ response: _t3.response,
365
+ hook: activeHook
366
+ });
367
+ case 16:
368
+ _context5.n = 1;
369
+ break;
370
+ case 17:
371
+ // If we've reached here, we've exceeded our maximum attempts
372
+ this.accountManager.setLastRequestFailed(accountId, true);
373
+ throw new Error("Exceeded maximum attempts (".concat(this.maxAttempts, ") for API call to ").concat(accountId));
374
+ case 18:
375
+ return _context5.a(2);
376
+ }
377
+ }, _callee5, this, [[12, 14], [3, 9]]);
378
+ }));
379
+ function makeRequestWithRetry(_x6) {
380
+ return _makeRequestWithRetry.apply(this, arguments);
381
+ }
382
+ return makeRequestWithRetry;
383
+ }()
221
384
  /**
222
385
  * Set the cache time in milliseconds
223
386
  */
224
- setCacheTime(milliseconds) {
225
- this.cacheManager.setCacheTime(milliseconds);
387
+ )
388
+ }, {
389
+ key: "setCacheTime",
390
+ value: function setCacheTime(milliseconds) {
391
+ this.cacheManager.setCacheTime(milliseconds);
226
392
  }
393
+
227
394
  /**
228
395
  * Clear the cache
229
396
  */
230
- clearCache() {
231
- this.cacheManager.clearCache();
397
+ }, {
398
+ key: "clearCache",
399
+ value: function clearCache() {
400
+ this.cacheManager.clearCache();
232
401
  }
233
- }
234
- exports.default = ApiService;
402
+ }]);
403
+ }();
404
+ var _default = exports["default"] = ApiService;
405
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfQXBpS2V5QXV0aFByb3ZpZGVyIiwicmVxdWlyZSIsIl9jb21wb25lbnRzIiwiX3R5cGVvZiIsIm8iLCJTeW1ib2wiLCJpdGVyYXRvciIsImNvbnN0cnVjdG9yIiwicHJvdG90eXBlIiwib3duS2V5cyIsImUiLCJyIiwidCIsIk9iamVjdCIsImtleXMiLCJnZXRPd25Qcm9wZXJ0eVN5bWJvbHMiLCJmaWx0ZXIiLCJnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IiLCJlbnVtZXJhYmxlIiwicHVzaCIsImFwcGx5IiwiX29iamVjdFNwcmVhZCIsImFyZ3VtZW50cyIsImxlbmd0aCIsImZvckVhY2giLCJfZGVmaW5lUHJvcGVydHkiLCJnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzIiwiZGVmaW5lUHJvcGVydGllcyIsImRlZmluZVByb3BlcnR5IiwiX3JlZ2VuZXJhdG9yIiwibiIsInRvU3RyaW5nVGFnIiwiaSIsImMiLCJHZW5lcmF0b3IiLCJ1IiwiY3JlYXRlIiwiX3JlZ2VuZXJhdG9yRGVmaW5lMiIsImYiLCJwIiwieSIsIkciLCJ2IiwiYSIsImQiLCJiaW5kIiwibCIsIlR5cGVFcnJvciIsImNhbGwiLCJkb25lIiwidmFsdWUiLCJHZW5lcmF0b3JGdW5jdGlvbiIsIkdlbmVyYXRvckZ1bmN0aW9uUHJvdG90eXBlIiwiZ2V0UHJvdG90eXBlT2YiLCJzZXRQcm90b3R5cGVPZiIsIl9fcHJvdG9fXyIsImRpc3BsYXlOYW1lIiwidyIsIm0iLCJfcmVnZW5lcmF0b3JEZWZpbmUiLCJjb25maWd1cmFibGUiLCJ3cml0YWJsZSIsIl9pbnZva2UiLCJhc3luY0dlbmVyYXRvclN0ZXAiLCJQcm9taXNlIiwicmVzb2x2ZSIsInRoZW4iLCJfYXN5bmNUb0dlbmVyYXRvciIsIl9uZXh0IiwiX3Rocm93IiwiX3NsaWNlZFRvQXJyYXkiLCJfYXJyYXlXaXRoSG9sZXMiLCJfaXRlcmFibGVUb0FycmF5TGltaXQiLCJfdW5zdXBwb3J0ZWRJdGVyYWJsZVRvQXJyYXkiLCJfbm9uSXRlcmFibGVSZXN0IiwiX2FycmF5TGlrZVRvQXJyYXkiLCJ0b1N0cmluZyIsInNsaWNlIiwibmFtZSIsIkFycmF5IiwiZnJvbSIsInRlc3QiLCJuZXh0IiwiaXNBcnJheSIsIl9jbGFzc0NhbGxDaGVjayIsIl9kZWZpbmVQcm9wZXJ0aWVzIiwiX3RvUHJvcGVydHlLZXkiLCJrZXkiLCJfY3JlYXRlQ2xhc3MiLCJfdG9QcmltaXRpdmUiLCJ0b1ByaW1pdGl2ZSIsIlN0cmluZyIsIk51bWJlciIsIkFwaVNlcnZpY2UiLCJwcm92aWRlciIsImF1dGhQcm92aWRlciIsImNhY2hlTWFuYWdlciIsIkNhY2hlTWFuYWdlciIsInJldHJ5TWFuYWdlciIsIlJldHJ5TWFuYWdlciIsImhvb2tNYW5hZ2VyIiwiSG9va01hbmFnZXIiLCJodHRwQ2xpZW50IiwiSHR0cENsaWVudCIsImFjY291bnRNYW5hZ2VyIiwiQWNjb3VudE1hbmFnZXIiLCJzZXR1cCIsIl9yZWYiLCJfcmVmJGhvb2tzIiwiaG9va3MiLCJjYWNoZVRpbWUiLCJfcmVmJGJhc2VVcmwiLCJiYXNlVXJsIiwiZmluYWxIb29rcyIsInVuZGVmaW5lZCIsInJlZnJlc2giLCJjcmVhdGVEZWZhdWx0QXV0aFJlZnJlc2hIYW5kbGVyIiwiX2kiLCJfT2JqZWN0JGVudHJpZXMiLCJlbnRyaWVzIiwiX09iamVjdCRlbnRyaWVzJF9pIiwic3RhdHVzQ29kZSIsImhvb2siLCJzZXRIb29rcyIsInNldENhY2hlVGltZSIsIl90aGlzIiwic2hvdWxkUmV0cnkiLCJ1c2VSZXRyeURlbGF5IiwicHJldmVudENvbmN1cnJlbnRDYWxscyIsIm1heFJldHJpZXMiLCJoYW5kbGVyIiwiX2hhbmRsZXIiLCJfY2FsbGVlIiwiYWNjb3VudElkIiwiX3QiLCJfY29udGV4dCIsImNvbnNvbGUiLCJsb2ciLCJjb25jYXQiLCJFcnJvciIsImVycm9yIiwiX3giLCJvbk1heFJldHJpZXNFeGNlZWRlZCIsIl9vbk1heFJldHJpZXNFeGNlZWRlZCIsIl9jYWxsZWUyIiwiX2NvbnRleHQyIiwiX3gyIiwiX3gzIiwic2V0TWF4QXR0ZW1wdHMiLCJhdHRlbXB0cyIsIm1heEF0dGVtcHRzIiwidXBkYXRlQWNjb3VudERhdGEiLCJkYXRhIiwiX2NhbGwiLCJfY2FsbGVlMyIsImFwaUNhbGxQYXJhbXMiLCJwYXJhbXMiLCJxdWVyeVBhcmFtTmFtZSIsImFwaUtleSIsInVybFBhcmFtcyIsImNhY2hlZERhdGEiLCJyZXN1bHQiLCJfY29udGV4dDMiLCJiYXNlIiwiQXBpS2V5QXV0aFByb3ZpZGVyIiwicXVlcnlQYXJhbXMiLCJVUkxTZWFyY2hQYXJhbXMiLCJzZXQiLCJtZXRob2QiLCJyb3V0ZSIsImdldEZyb21DYWNoZSIsIm1ha2VSZXF1ZXN0V2l0aFJldHJ5Iiwic2F2ZVRvQ2FjaGUiLCJfeDQiLCJfbWFrZUFwaUNhbGwiLCJfY2FsbGVlNCIsIl9jb250ZXh0NCIsIm1ha2VBcGlDYWxsIiwiX3g1IiwiX21ha2VSZXF1ZXN0V2l0aFJldHJ5IiwiX2NhbGxlZTUiLCJhYm9ydFNpZ25hbCIsInN0YXR1c1JldHJpZXMiLCJjdXJyZW50UGFyYW1zIiwiYXV0aEhlYWRlcnMiLCJyZXNwb25zZSIsIl9hY3RpdmVIb29rJG1heFJldHJpZSIsInN0YXR1cyIsImFjdGl2ZUhvb2siLCJob29rUmVzdWx0IiwiX3QyIiwiX3QzIiwiX3Q0IiwiX2NvbnRleHQ1IiwiYWJvcnRlZCIsInVzZUF1dGgiLCJnZXRBdXRoSGVhZGVycyIsImhlYWRlcnMiLCJtYWtlUmVxdWVzdCIsInNldExhc3RSZXF1ZXN0RmFpbGVkIiwiZ2V0SG9vayIsImdldERlZmF1bHRNYXhSZXRyaWVzIiwiaGFuZGxlUmV0cnlGYWlsdXJlIiwicHJvY2Vzc0hvb2siLCJjYWxjdWxhdGVBbmREZWxheSIsImF0dGVtcHQiLCJfeDYiLCJtaWxsaXNlY29uZHMiLCJjbGVhckNhY2hlIiwiX2RlZmF1bHQiLCJleHBvcnRzIl0sInNvdXJjZXMiOlsiLi4vc3JjL2luZGV4LnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFxuICBBdXRoUHJvdmlkZXIsXG4gIEFwaUNhbGxQYXJhbXMsXG4gIEhvb2tTZXR0aW5ncyxcbiAgU3RhdHVzQ29kZSxcbiAgVG9rZW4sXG4gIE9BdXRoVG9rZW5cbn0gZnJvbSAnLi90eXBlcyc7XG5pbXBvcnQgeyBBcGlLZXlBdXRoUHJvdmlkZXIgfSBmcm9tICcuL0FwaUtleUF1dGhQcm92aWRlcic7XG5pbXBvcnQge1xuICBDYWNoZU1hbmFnZXIsXG4gIFJldHJ5TWFuYWdlcixcbiAgSG9va01hbmFnZXIsXG4gIEh0dHBDbGllbnQsXG4gIEFjY291bnRNYW5hZ2VyXG59IGZyb20gJy4vY29tcG9uZW50cyc7XG5cbi8qKlxuICogQXBpU2VydmljZSAtIENvcmUgQVBJIHNlcnZpY2UgZm9yIG1ha2luZyBhdXRoZW50aWNhdGVkIEFQSSBjYWxsc1xuICogd2l0aCBjYWNoaW5nLCByZXRyeSwgYW5kIGhvb2sgc3VwcG9ydC5cbiAqL1xuY2xhc3MgQXBpU2VydmljZSB7XG4gIHB1YmxpYyBwcm92aWRlcjogc3RyaW5nOyAvLyBTZXJ2aWNlIHByb3ZpZGVyIG5hbWVcbiAgcHJpdmF0ZSBhdXRoUHJvdmlkZXI6IEF1dGhQcm92aWRlcjtcbiAgcHJpdmF0ZSBiYXNlVXJsOiBzdHJpbmcgPSAnJzsgLy8gRGVmYXVsdCBiYXNlIFVSTFxuICBcbiAgLy8gQ29tcG9uZW50IG1hbmFnZXJzXG4gIHByaXZhdGUgY2FjaGVNYW5hZ2VyOiBDYWNoZU1hbmFnZXI7XG4gIHByaXZhdGUgcmV0cnlNYW5hZ2VyOiBSZXRyeU1hbmFnZXI7XG4gIHByaXZhdGUgaG9va01hbmFnZXI6IEhvb2tNYW5hZ2VyO1xuICBwcml2YXRlIGh0dHBDbGllbnQ6IEh0dHBDbGllbnQ7XG4gIHByaXZhdGUgYWNjb3VudE1hbmFnZXI6IEFjY291bnRNYW5hZ2VyO1xuICBcbiAgLy8gRGVmYXVsdCBtYXggYXR0ZW1wdHMgZm9yIEFQSSBjYWxsc1xuICBwcml2YXRlIG1heEF0dGVtcHRzID0gMTA7XG5cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgdGhpcy5wcm92aWRlciA9ICcnO1xuICAgIHRoaXMuYXV0aFByb3ZpZGVyID0ge30gYXMgQXV0aFByb3ZpZGVyO1xuICAgIFxuICAgIC8vIEluaXRpYWxpemUgY29tcG9uZW50IG1hbmFnZXJzXG4gICAgdGhpcy5jYWNoZU1hbmFnZXIgPSBuZXcgQ2FjaGVNYW5hZ2VyKCk7XG4gICAgdGhpcy5yZXRyeU1hbmFnZXIgPSBuZXcgUmV0cnlNYW5hZ2VyKCk7XG4gICAgdGhpcy5ob29rTWFuYWdlciA9IG5ldyBIb29rTWFuYWdlcigpO1xuICAgIHRoaXMuaHR0cENsaWVudCA9IG5ldyBIdHRwQ2xpZW50KCk7XG4gICAgdGhpcy5hY2NvdW50TWFuYWdlciA9IG5ldyBBY2NvdW50TWFuYWdlcigpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHVwIHRoZSBBUEkgc2VydmljZVxuICAgKi9cbiAgcHVibGljIHNldHVwKHtcbiAgICBwcm92aWRlcixcbiAgICBhdXRoUHJvdmlkZXIsXG4gICAgaG9va3MgPSB7fSxcbiAgICBjYWNoZVRpbWUsXG4gICAgYmFzZVVybCA9ICcnLFxuICB9OiB7XG4gICAgcHJvdmlkZXI6IHN0cmluZztcbiAgICBhdXRoUHJvdmlkZXI6IEF1dGhQcm92aWRlcjtcbiAgICBob29rcz86IFJlY29yZDxTdGF0dXNDb2RlLCBIb29rU2V0dGluZ3MgfCBudWxsPjtcbiAgICBjYWNoZVRpbWU6IG51bWJlcjtcbiAgICBiYXNlVXJsPzogc3RyaW5nO1xuICB9KSB7XG4gICAgdGhpcy5wcm92aWRlciA9IHByb3ZpZGVyO1xuICAgIHRoaXMuYXV0aFByb3ZpZGVyID0gYXV0aFByb3ZpZGVyO1xuICAgIHRoaXMuYmFzZVVybCA9IGJhc2VVcmw7XG4gICAgXG4gICAgLy8gQ3JlYXRlIGEgY29weSBvZiBob29rcyB0byBhdm9pZCBtb2RpZnlpbmcgdGhlIGlucHV0XG4gICAgY29uc3QgZmluYWxIb29rczogUmVjb3JkPFN0YXR1c0NvZGUsIEhvb2tTZXR0aW5ncz4gPSB7fTtcbiAgICBcbiAgICAvLyBBcHBseSBkZWZhdWx0IDQwMSBoYW5kbGVyIGlmOlxuICAgIC8vIDEuIE5vIDQwMSBob29rIGlzIGV4cGxpY2l0bHkgZGVmaW5lZCAob3IgaXMgZXhwbGljaXRseSBudWxsKVxuICAgIC8vIDIuIEF1dGhQcm92aWRlciBoYXMgYSByZWZyZXNoIG1ldGhvZFxuICAgIGlmIChob29rc1s0MDFdID09PSB1bmRlZmluZWQgJiYgdHlwZW9mIHRoaXMuYXV0aFByb3ZpZGVyLnJlZnJlc2ggPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGZpbmFsSG9va3NbNDAxXSA9IHRoaXMuY3JlYXRlRGVmYXVsdEF1dGhSZWZyZXNoSGFuZGxlcigpO1xuICAgIH1cbiAgICBcbiAgICAvLyBBZGQgdXNlci1kZWZpbmVkIGhvb2tzIChza2lwcGluZyBudWxsL3VuZGVmaW5lZCB2YWx1ZXMpXG4gICAgZm9yIChjb25zdCBbc3RhdHVzQ29kZSwgaG9va10gb2YgT2JqZWN0LmVudHJpZXMoaG9va3MpKSB7XG4gICAgICBpZiAoaG9vaykge1xuICAgICAgICBmaW5hbEhvb2tzW3N0YXR1c0NvZGVdID0gaG9vaztcbiAgICAgIH1cbiAgICB9XG4gICAgXG4gICAgLy8gU2V0IHRoZSBob29rcyBpZiB3ZSBoYXZlIGFueVxuICAgIGlmIChPYmplY3Qua2V5cyhmaW5hbEhvb2tzKS5sZW5ndGggPiAwKSB7XG4gICAgICB0aGlzLmhvb2tNYW5hZ2VyLnNldEhvb2tzKGZpbmFsSG9va3MpO1xuICAgIH1cbiAgICBcbiAgICBpZiAodHlwZW9mIGNhY2hlVGltZSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIHRoaXMuY2FjaGVNYW5hZ2VyLnNldENhY2hlVGltZShjYWNoZVRpbWUpO1xuICAgIH1cbiAgfVxuICBcbiAgLyoqXG4gICAqIENyZWF0ZSBhIGRlZmF1bHQgaGFuZGxlciBmb3IgNDAxIChVbmF1dGhvcml6ZWQpIGVycm9yc1xuICAgKiB0aGF0IGltcGxlbWVudHMgc3RhbmRhcmQgY3JlZGVudGlhbCByZWZyZXNoIGJlaGF2aW9yXG4gICAqL1xuICBwcml2YXRlIGNyZWF0ZURlZmF1bHRBdXRoUmVmcmVzaEhhbmRsZXIoKTogSG9va1NldHRpbmdzIHtcbiAgICByZXR1cm4ge1xuICAgICAgc2hvdWxkUmV0cnk6IHRydWUsXG4gICAgICB1c2VSZXRyeURlbGF5OiB0cnVlLFxuICAgICAgcHJldmVudENvbmN1cnJlbnRDYWxsczogdHJ1ZSxcbiAgICAgIG1heFJldHJpZXM6IDEsXG4gICAgICBoYW5kbGVyOiBhc3luYyAoYWNjb3VudElkKSA9PiB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29uc29sZS5sb2coYPCflIQgVXNpbmcgZGVmYXVsdCBhdXRoIHJlZnJlc2ggaGFuZGxlciBmb3IgJHthY2NvdW50SWR9YCk7XG4gICAgICAgICAgaWYgKCF0aGlzLmF1dGhQcm92aWRlci5yZWZyZXNoKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ05vIHJlZnJlc2ggbWV0aG9kIGF2YWlsYWJsZSBvbiBhdXRoIHByb3ZpZGVyJyk7XG4gICAgICAgICAgfVxuICAgICAgICAgIC8vIFlvdSBtYXkgd2FudCB0byBzdG9yZSByZWZyZXNoIHRva2VuIGluIGFjY291bnQgZGF0YSBvciBwYXNzIGl0IGluIGFub3RoZXIgd2F5XG4gICAgICAgICAgLy8gRm9yIG5vdywgYXNzdW1lIHJlZnJlc2ggdG9rZW4gaXMgbWFuYWdlZCBpbnRlcm5hbGx5IGJ5IHRoZSBwcm92aWRlclxuICAgICAgICAgIGF3YWl0IHRoaXMuYXV0aFByb3ZpZGVyLnJlZnJlc2goJycsIGFjY291bnRJZCk7XG4gICAgICAgICAgcmV0dXJuIHt9O1xuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoYEF1dGggcmVmcmVzaCBmYWlsZWQgZm9yICR7YWNjb3VudElkfTpgLCBlcnJvcik7XG4gICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBvbk1heFJldHJpZXNFeGNlZWRlZDogYXN5bmMgKGFjY291bnRJZCwgZXJyb3IpID0+IHtcbiAgICAgICAgY29uc29sZS5lcnJvcihgQXV0aGVudGljYXRpb24gZmFpbGVkIGFmdGVyIHJlZnJlc2ggYXR0ZW1wdCBmb3IgJHthY2NvdW50SWR9OmAsIGVycm9yKTtcbiAgICAgIH1cbiAgICB9O1xuICB9XG4gIFxuICAvKipcbiAgICogU2V0IHRoZSBtYXhpbXVtIG51bWJlciBvZiByZXRyeSBhdHRlbXB0c1xuICAgKi9cbiAgcHVibGljIHNldE1heEF0dGVtcHRzKGF0dGVtcHRzOiBudW1iZXIpOiB2b2lkIHtcbiAgICB0aGlzLm1heEF0dGVtcHRzID0gYXR0ZW1wdHM7XG4gIH1cblxuICAvKipcbiAgICogVXBkYXRlIGFjY291bnQgZGF0YVxuICAgKi9cbiAgcHVibGljIHVwZGF0ZUFjY291bnREYXRhKGFjY291bnRJZDogc3RyaW5nLCBkYXRhOiBQYXJ0aWFsPFJlY29yZDxzdHJpbmcsIGFueT4+KTogdm9pZCB7XG4gICAgdGhpcy5hY2NvdW50TWFuYWdlci51cGRhdGVBY2NvdW50RGF0YShhY2NvdW50SWQsIGRhdGEpO1xuICB9XG5cbiAgLyoqXG4gICAqIE1ha2UgYW4gQVBJIGNhbGwgd2l0aCBhbGwgZmVhdHVyZXMgKGNhY2hpbmcsIHJldHJ5LCBob29rcylcbiAgICovXG4gIHB1YmxpYyBhc3luYyBjYWxsKGFwaUNhbGxQYXJhbXM6IE9taXQ8QXBpQ2FsbFBhcmFtcywgJ2FjY291bnRJZCc+ICYgeyBhY2NvdW50SWQ/OiBzdHJpbmc7IGFib3J0U2lnbmFsPzogQWJvcnRTaWduYWwgfSk6IFByb21pc2U8YW55PiB7XG4gICAgLy8gVXNlICdkZWZhdWx0JyBhcyBmYWxsYmFjayBpZiBhY2NvdW50SWQgaXMgbm90IHByb3ZpZGVkXG4gICAgLy8gYW5kIHVzZSBkZWZhdWx0IGJhc2VVcmwgaWYgbm90IHByb3ZpZGVkXG4gICAgY29uc3QgcGFyYW1zOiBBcGlDYWxsUGFyYW1zID0ge1xuICAgICAgLi4uYXBpQ2FsbFBhcmFtcyxcbiAgICAgIGFjY291bnRJZDogYXBpQ2FsbFBhcmFtcy5hY2NvdW50SWQgfHwgJ2RlZmF1bHQnLFxuICAgICAgYmFzZTogYXBpQ2FsbFBhcmFtcy5iYXNlIHx8IHRoaXMuYmFzZVVybCxcbiAgICB9O1xuXG4gICAgLy8gSWYgdXNpbmcgQXBpS2V5QXV0aFByb3ZpZGVyIHdpdGggcXVlcnlQYXJhbU5hbWUsIGFkZCBBUEkga2V5IHRvIHF1ZXJ5UGFyYW1zXG4gICAgaWYgKFxuICAgICAgdGhpcy5hdXRoUHJvdmlkZXIgaW5zdGFuY2VvZiBBcGlLZXlBdXRoUHJvdmlkZXIgJiZcbiAgICAgICh0aGlzLmF1dGhQcm92aWRlciBhcyBhbnkpLnF1ZXJ5UGFyYW1OYW1lXG4gICAgKSB7XG4gICAgICBjb25zdCBxdWVyeVBhcmFtTmFtZSA9ICh0aGlzLmF1dGhQcm92aWRlciBhcyBhbnkpLnF1ZXJ5UGFyYW1OYW1lO1xuICAgICAgY29uc3QgYXBpS2V5ID0gKHRoaXMuYXV0aFByb3ZpZGVyIGFzIGFueSkuYXBpS2V5O1xuICAgICAgY29uc3QgdXJsUGFyYW1zID0gcGFyYW1zLnF1ZXJ5UGFyYW1zID8gbmV3IFVSTFNlYXJjaFBhcmFtcyhwYXJhbXMucXVlcnlQYXJhbXMpIDogbmV3IFVSTFNlYXJjaFBhcmFtcygpO1xuICAgICAgdXJsUGFyYW1zLnNldChxdWVyeVBhcmFtTmFtZSwgYXBpS2V5KTtcbiAgICAgIHBhcmFtcy5xdWVyeVBhcmFtcyA9IHVybFBhcmFtcztcbiAgICB9XG5cbiAgICBjb25zb2xlLmxvZygn8J+UhCBBUEkgY2FsbCcsIHRoaXMucHJvdmlkZXIsIHBhcmFtcy5hY2NvdW50SWQsIHBhcmFtcy5tZXRob2QsIHBhcmFtcy5yb3V0ZSk7XG4gICAgXG4gICAgLy8gQ2hlY2sgY2FjaGUgZmlyc3RcbiAgICBjb25zdCBjYWNoZWREYXRhID0gdGhpcy5jYWNoZU1hbmFnZXIuZ2V0RnJvbUNhY2hlKHBhcmFtcyk7XG4gICAgaWYgKGNhY2hlZERhdGEpIHJldHVybiBjYWNoZWREYXRhO1xuXG4gICAgLy8gTWFrZSB0aGUgQVBJIGNhbGwgd2l0aCByZXRyeSBjYXBhYmlsaXR5XG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5tYWtlUmVxdWVzdFdpdGhSZXRyeShwYXJhbXMpO1xuICAgIFxuICAgIC8vIENhY2hlIHRoZSByZXN1bHRcbiAgICB0aGlzLmNhY2hlTWFuYWdlci5zYXZlVG9DYWNoZShwYXJhbXMsIHJlc3VsdCk7XG4gICAgXG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIC8qKlxuICAgKiBMZWdhY3kgbWV0aG9kIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5XG4gICAqIEBkZXByZWNhdGVkIFVzZSBjYWxsKCkgaW5zdGVhZFxuICAgKi9cbiAgcHVibGljIGFzeW5jIG1ha2VBcGlDYWxsKGFwaUNhbGxQYXJhbXM6IE9taXQ8QXBpQ2FsbFBhcmFtcywgJ2FjY291bnRJZCc+ICYgeyBhY2NvdW50SWQ/OiBzdHJpbmc7IGFib3J0U2lnbmFsPzogQWJvcnRTaWduYWwgfSk6IFByb21pc2U8YW55PiB7XG4gICAgcmV0dXJuIHRoaXMuY2FsbChhcGlDYWxsUGFyYW1zKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBNYWtlIGEgcmVxdWVzdCB3aXRoIHJldHJ5IGNhcGFiaWxpdHlcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgbWFrZVJlcXVlc3RXaXRoUmV0cnkoYXBpQ2FsbFBhcmFtczogQXBpQ2FsbFBhcmFtcyk6IFByb21pc2U8YW55PiB7XG4gICAgY29uc3QgeyBhY2NvdW50SWQsIGFib3J0U2lnbmFsIH0gPSBhcGlDYWxsUGFyYW1zO1xuICAgIGxldCBhdHRlbXB0cyA9IDA7XG4gICAgY29uc3Qgc3RhdHVzUmV0cmllczogUmVjb3JkPFN0YXR1c0NvZGUsIG51bWJlcj4gPSB7fTtcbiAgICBsZXQgY3VycmVudFBhcmFtcyA9IHsgLi4uYXBpQ2FsbFBhcmFtcyB9O1xuICAgIC8vIElmIHVzaW5nIEFwaUtleUF1dGhQcm92aWRlciB3aXRoIHF1ZXJ5UGFyYW1OYW1lLCBhZGQgQVBJIGtleSB0byBxdWVyeVBhcmFtc1xuICAgIGlmIChcbiAgICAgIHRoaXMuYXV0aFByb3ZpZGVyIGluc3RhbmNlb2YgQXBpS2V5QXV0aFByb3ZpZGVyICYmXG4gICAgICAodGhpcy5hdXRoUHJvdmlkZXIgYXMgYW55KS5xdWVyeVBhcmFtTmFtZVxuICAgICkge1xuICAgICAgY29uc3QgcXVlcnlQYXJhbU5hbWUgPSAodGhpcy5hdXRoUHJvdmlkZXIgYXMgYW55KS5xdWVyeVBhcmFtTmFtZTtcbiAgICAgIGNvbnN0IGFwaUtleSA9ICh0aGlzLmF1dGhQcm92aWRlciBhcyBhbnkpLmFwaUtleTtcbiAgICAgIGNvbnN0IHVybFBhcmFtcyA9IGN1cnJlbnRQYXJhbXMucXVlcnlQYXJhbXMgPyBuZXcgVVJMU2VhcmNoUGFyYW1zKGN1cnJlbnRQYXJhbXMucXVlcnlQYXJhbXMpIDogbmV3IFVSTFNlYXJjaFBhcmFtcygpO1xuICAgICAgdXJsUGFyYW1zLnNldChxdWVyeVBhcmFtTmFtZSwgYXBpS2V5KTtcbiAgICAgIGN1cnJlbnRQYXJhbXMucXVlcnlQYXJhbXMgPSB1cmxQYXJhbXM7XG4gICAgfVxuICAgIC8vIE1haW4gcmV0cnkgbG9vcFxuICAgIHdoaWxlIChhdHRlbXB0cyA8IHRoaXMubWF4QXR0ZW1wdHMpIHtcbiAgICAgIGlmIChhYm9ydFNpZ25hbD8uYWJvcnRlZCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1JlcXVlc3QgYWJvcnRlZCcpO1xuICAgICAgfVxuICAgICAgYXR0ZW1wdHMrKztcbiAgICAgIFxuICAgICAgdHJ5IHtcbiAgICAgICAgLy8gR2V0IGF1dGhlbnRpY2F0aW9uIGhlYWRlcnMgaWYgbmVlZGVkXG4gICAgICAgIGNvbnN0IGF1dGhIZWFkZXJzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0gYXBpQ2FsbFBhcmFtcy51c2VBdXRoICE9PSBmYWxzZVxuICAgICAgICAgID8gYXdhaXQgdGhpcy5hdXRoUHJvdmlkZXIuZ2V0QXV0aEhlYWRlcnMoYWNjb3VudElkKVxuICAgICAgICAgIDoge307XG4gICAgICAgIC8vIE1lcmdlIGF1dGggaGVhZGVycyBpbnRvIHBhcmFtcy5oZWFkZXJzXG4gICAgICAgIGN1cnJlbnRQYXJhbXMuaGVhZGVycyA9IHtcbiAgICAgICAgICAuLi4oY3VycmVudFBhcmFtcy5oZWFkZXJzIHx8IHt9KSxcbiAgICAgICAgICAuLi5hdXRoSGVhZGVycyxcbiAgICAgICAgfTtcbiAgICAgICAgXG4gICAgICAgIC8vIFZlcmlmeSB3ZSBoYXZlIGF1dGhlbnRpY2F0aW9uIGlmIHJlcXVpcmVkXG4gICAgICAgIGlmIChcbiAgICAgICAgICBhcGlDYWxsUGFyYW1zLnVzZUF1dGggIT09IGZhbHNlICYmXG4gICAgICAgICAgT2JqZWN0LmtleXMoYXV0aEhlYWRlcnMpLmxlbmd0aCA9PT0gMCAmJlxuICAgICAgICAgICEoXG4gICAgICAgICAgICB0aGlzLmF1dGhQcm92aWRlciBpbnN0YW5jZW9mIEFwaUtleUF1dGhQcm92aWRlciAmJlxuICAgICAgICAgICAgKHRoaXMuYXV0aFByb3ZpZGVyIGFzIGFueSkucXVlcnlQYXJhbU5hbWVcbiAgICAgICAgICApXG4gICAgICAgICkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgJHt0aGlzLnByb3ZpZGVyfSBjcmVkZW50aWFscyBub3QgZm91bmQgZm9yIGFjY291bnQgSUQgJHthY2NvdW50SWR9YCk7XG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgIC8vIE1ha2UgdGhlIGFjdHVhbCBBUEkgY2FsbFxuICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHRoaXMuaHR0cENsaWVudC5tYWtlUmVxdWVzdChjdXJyZW50UGFyYW1zLCB7fSk7XG4gICAgICAgIFxuICAgICAgICAvLyBTdWNjZXNzIC0gdXBkYXRlIGFjY291bnQgc3RhdHVzIGFuZCByZXR1cm4gcmVzdWx0XG4gICAgICAgIHRoaXMuYWNjb3VudE1hbmFnZXIuc2V0TGFzdFJlcXVlc3RGYWlsZWQoYWNjb3VudElkLCBmYWxzZSk7XG4gICAgICAgIHJldHVybiByZXNwb25zZTtcbiAgICAgIH0gXG4gICAgICBjYXRjaCAoZXJyb3I6IGFueSkge1xuICAgICAgICBjb25zdCBzdGF0dXMgPSBlcnJvcj8uc3RhdHVzO1xuICAgICAgICBcbiAgICAgICAgLy8gSWYgbm8gaG9vayBleGlzdHMgZm9yIHRoaXMgZXJyb3IsIG9yIHdlIHNob3VsZG4ndCByZXRyeSwgdGhyb3dcbiAgICAgICAgaWYgKCF0aGlzLmhvb2tNYW5hZ2VyLnNob3VsZFJldHJ5KHN0YXR1cykpIHtcbiAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgfVxuICAgICAgICBcbiAgICAgICAgLy8gVHJhY2sgcmV0cmllcyBmb3IgdGhpcyBzdGF0dXMgY29kZVxuICAgICAgICBzdGF0dXNSZXRyaWVzW3N0YXR1c10gPSAoc3RhdHVzUmV0cmllc1tzdGF0dXNdIHx8IDApICsgMTtcbiAgICAgICAgY29uc3QgYWN0aXZlSG9vayA9IHRoaXMuaG9va01hbmFnZXIuZ2V0SG9vayhzdGF0dXMpO1xuICAgICAgICBjb25zdCBtYXhSZXRyaWVzID0gYWN0aXZlSG9vaz8ubWF4UmV0cmllcyA/PyB0aGlzLnJldHJ5TWFuYWdlci5nZXREZWZhdWx0TWF4UmV0cmllcygpO1xuICAgICAgICBcbiAgICAgICAgLy8gQ2hlY2sgaWYgd2UndmUgZXhjZWVkZWQgcmV0cmllcyBmb3IgdGhpcyBzdGF0dXNcbiAgICAgICAgaWYgKHN0YXR1c1JldHJpZXNbc3RhdHVzXSA+IG1heFJldHJpZXMpIHtcbiAgICAgICAgICBhd2FpdCB0aGlzLmhvb2tNYW5hZ2VyLmhhbmRsZVJldHJ5RmFpbHVyZShhY2NvdW50SWQsIHN0YXR1cywgZXJyb3IpO1xuICAgICAgICAgIHRoaXMuYWNjb3VudE1hbmFnZXIuc2V0TGFzdFJlcXVlc3RGYWlsZWQoYWNjb3VudElkLCB0cnVlKTtcbiAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgfVxuICAgICAgICBcbiAgICAgICAgLy8gUHJvY2VzcyB0aGUgaG9vayB0byBnZXQgdXBkYXRlZCBwYXJhbXNcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBjb25zdCBob29rUmVzdWx0ID0gYXdhaXQgdGhpcy5ob29rTWFuYWdlci5wcm9jZXNzSG9vayhhY2NvdW50SWQsIHN0YXR1cywgZXJyb3IpO1xuICAgICAgICAgIGlmIChob29rUmVzdWx0KSB7XG4gICAgICAgICAgICBjdXJyZW50UGFyYW1zID0geyAuLi5jdXJyZW50UGFyYW1zLCAuLi5ob29rUmVzdWx0IH07XG4gICAgICAgICAgfVxuICAgICAgICB9IFxuICAgICAgICBjYXRjaCAoaG9va0Vycm9yKSB7XG4gICAgICAgICAgdGhpcy5hY2NvdW50TWFuYWdlci5zZXRMYXN0UmVxdWVzdEZhaWxlZChhY2NvdW50SWQsIHRydWUpO1xuICAgICAgICAgIHRocm93IGhvb2tFcnJvcjtcbiAgICAgICAgfVxuICAgICAgICBcbiAgICAgICAgLy8gV2FpdCBiZWZvcmUgcmV0cnlpbmcgaWYgbmVlZGVkXG4gICAgICAgIGlmIChhY3RpdmVIb29rPy51c2VSZXRyeURlbGF5KSB7XG4gICAgICAgICAgYXdhaXQgdGhpcy5yZXRyeU1hbmFnZXIuY2FsY3VsYXRlQW5kRGVsYXkoe1xuICAgICAgICAgICAgYXR0ZW1wdDogc3RhdHVzUmV0cmllc1tzdGF0dXNdLFxuICAgICAgICAgICAgcmVzcG9uc2U6IGVycm9yLnJlc3BvbnNlLFxuICAgICAgICAgICAgaG9vazogYWN0aXZlSG9vayxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICBcbiAgICAvLyBJZiB3ZSd2ZSByZWFjaGVkIGhlcmUsIHdlJ3ZlIGV4Y2VlZGVkIG91ciBtYXhpbXVtIGF0dGVtcHRzXG4gICAgdGhpcy5hY2NvdW50TWFuYWdlci5zZXRMYXN0UmVxdWVzdEZhaWxlZChhY2NvdW50SWQsIHRydWUpO1xuICAgIHRocm93IG5ldyBFcnJvcihgRXhjZWVkZWQgbWF4aW11bSBhdHRlbXB0cyAoJHt0aGlzLm1heEF0dGVtcHRzfSkgZm9yIEFQSSBjYWxsIHRvICR7YWNjb3VudElkfWApO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldCB0aGUgY2FjaGUgdGltZSBpbiBtaWxsaXNlY29uZHNcbiAgICovXG4gIHB1YmxpYyBzZXRDYWNoZVRpbWUobWlsbGlzZWNvbmRzOiBudW1iZXIpOiB2b2lkIHtcbiAgICB0aGlzLmNhY2hlTWFuYWdlci5zZXRDYWNoZVRpbWUobWlsbGlzZWNvbmRzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDbGVhciB0aGUgY2FjaGVcbiAgICovXG4gIHB1YmxpYyBjbGVhckNhY2hlKCk6IHZvaWQge1xuICAgIHRoaXMuY2FjaGVNYW5hZ2VyLmNsZWFyQ2FjaGUoKTtcbiAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBBcGlTZXJ2aWNlO1xuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7QUFRQSxJQUFBQSxtQkFBQSxHQUFBQyxPQUFBO0FBQ0EsSUFBQUMsV0FBQSxHQUFBRCxPQUFBO0FBTXNCLFNBQUFFLFFBQUFDLENBQUEsc0NBQUFELE9BQUEsd0JBQUFFLE1BQUEsdUJBQUFBLE1BQUEsQ0FBQUMsUUFBQSxhQUFBRixDQUFBLGtCQUFBQSxDQUFBLGdCQUFBQSxDQUFBLFdBQUFBLENBQUEseUJBQUFDLE1BQUEsSUFBQUQsQ0FBQSxDQUFBRyxXQUFBLEtBQUFGLE1BQUEsSUFBQUQsQ0FBQSxLQUFBQyxNQUFBLENBQUFHLFNBQUEscUJBQUFKLENBQUEsS0FBQUQsT0FBQSxDQUFBQyxDQUFBO0FBQUEsU0FBQUssUUFBQUMsQ0FBQSxFQUFBQyxDQUFBLFFBQUFDLENBQUEsR0FBQUMsTUFBQSxDQUFBQyxJQUFBLENBQUFKLENBQUEsT0FBQUcsTUFBQSxDQUFBRSxxQkFBQSxRQUFBWCxDQUFBLEdBQUFTLE1BQUEsQ0FBQUUscUJBQUEsQ0FBQUwsQ0FBQSxHQUFBQyxDQUFBLEtBQUFQLENBQUEsR0FBQUEsQ0FBQSxDQUFBWSxNQUFBLFdBQUFMLENBQUEsV0FBQUUsTUFBQSxDQUFBSSx3QkFBQSxDQUFBUCxDQUFBLEVBQUFDLENBQUEsRUFBQU8sVUFBQSxPQUFBTixDQUFBLENBQUFPLElBQUEs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