UNPKG

metaapi.cloud-sdk

Version:

SDK for MetaApi, a professional cloud forex API which includes MetaTrader REST API and MetaTrader websocket API. Supports both MetaTrader 5 (MT5) and MetaTrader 4 (MT4). CopyFactory copy trading API included. (https://metaapi.cloud)

200 lines (199 loc) 24.4 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); function _export(target, all) { for(var name in all)Object.defineProperty(target, name, { enumerable: true, get: all[name] }); } _export(exports, { assembleLog4jsConfig: function() { return assembleLog4jsConfig; }, createHandlePromise: function() { return createHandlePromise; }, delay: function() { return delay; }, ensurePromise: function() { return ensurePromise; }, expBackoffDelay: function() { return expBackoffDelay; }, wait: function() { return wait; }, waitAny: function() { return waitAny; }, waitPass: function() { return waitPass; }, waitTrue: function() { return waitTrue; }, wrapHandlePromise: function() { return wrapHandlePromise; } }); const _timeoutError = /*#__PURE__*/ _interop_require_default(require("../clients/timeoutError")); const _logger = /*#__PURE__*/ _interop_require_default(require("../logger")); const _lodash = /*#__PURE__*/ _interop_require_default(require("lodash")); function _interop_require_default(obj) { return obj && obj.__esModule ? obj : { default: obj }; } const realSetTimeout = setTimeout; const realDateNow = Date.now.bind(Date); function createHandlePromise() { let resolve, reject; let promise = new Promise((res, rej)=>{ resolve = res; reject = rej; }); promise.completed = false; promise.resolve = (result)=>{ if (!promise.completed) { promise.completed = true; promise.resolved = true; promise.result = result; resolve(result); } }; promise.reject = (err)=>{ if (!promise.completed) { promise.completed = true; promise.rejected = true; promise.error = err; reject(err); } }; promise.timeout = (milliseconds, errorMessage)=>{ if (!promise.completed) { let timeout = setTimeout(()=>promise.reject(new _timeoutError.default(errorMessage)), milliseconds); promise.finally(()=>clearTimeout(timeout)).catch(()=>{}); } return promise; }; promise.catch(()=>{}); return promise; } function wrapHandlePromise(promise) { let result = createHandlePromise(); promise.then(result.resolve).catch(()=>{}); promise.catch(result.reject); return result; } async function ensurePromise(call) { return call(); } function delay(ms, options) { let resolve; let timeout; let canceled = false; let result = new Promise((res)=>{ timeout = (options === null || options === void 0 ? void 0 : options.ignoreSinonClock) ? realSetTimeout(res, ms) : setTimeout(res, ms); resolve = res; }); Object.defineProperty(result, "canceled", { get: ()=>canceled, enumerable: true, configurable: true }); result.cancel = ()=>{ canceled = true; clearTimeout(timeout); resolve(); }; return result; } function assembleLog4jsConfig(config = {}) { let appenders = { console: { type: "console" } }; let categories = { default: { appenders: Object.keys(appenders), level: config.defaultLevel || "INFO" } }; Object.keys(config.levels || {}).forEach((category)=>{ categories[category] = { appenders: Object.keys(appenders), level: config.levels[category] }; }); return { appenders, categories }; } async function wait(callable, intervalInMs = 25, options) { const logger = _logger.default.getLogger("helpers.wait"); if (typeof intervalInMs === "object") { // for backward compatibility options = intervalInMs; intervalInMs = _lodash.default.defaultTo(options.intervalInMs, 1000); } const dateNow = (options === null || options === void 0 ? void 0 : options.ignoreSinonClock) ? realDateNow : ()=>Date.now(); let result = false, lastError; let timesAt = dateNow() + _lodash.default.defaultTo(options === null || options === void 0 ? void 0 : options.timeoutInMs, 30000); while(!result && dateNow() < timesAt){ try { result = await callable(); } catch (err) { lastError = err; logger.debug("The executor failed", err); if (dateNow() >= timesAt) { throw err; } } finally{ if (!result) { logger.debug("Waiting because the result is", result); await delay(intervalInMs, options); } } } if (dateNow() >= timesAt) { if (lastError) { throw lastError; } throw new _timeoutError.default("Timed out till specified callable returns true"); } return result; } function waitTrue(callable, intervalInMs = 25, options) { return wait(callable, intervalInMs, options); } async function waitPass(callable, intervalInMs = 25, options) { let result; await wait(async ()=>{ result = await callable(); return true; }, intervalInMs, options); return result; } async function waitAny(callable, intervalInMs = 25, options) { let result; await waitTrue(async ()=>{ result = await callable(); if (result !== undefined) { return true; } }, intervalInMs, options); return result; } function expBackoffDelay(iteration, startDelay, maxDelay) { if (iteration === 0) { return 0; } return Math.min(startDelay * Math.pow(2, iteration - 1), maxDelay); } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIjxhbm9uPiJdLCJzb3VyY2VzQ29udGVudCI6WyIndXNlIHN0cmljdCc7XG5cbmltcG9ydCBUaW1lb3V0RXJyb3IgZnJvbSAnLi4vY2xpZW50cy90aW1lb3V0RXJyb3InO1xuaW1wb3J0IExvZ2dlck1hbmFnZXIgZnJvbSAnLi4vbG9nZ2VyJztcbmltcG9ydCB7UHJvbWlzZU9yTm90fSBmcm9tICcuLi90eXBlcy91dGlsJztcbmltcG9ydCBfIGZyb20gJ2xvZGFzaCc7XG5cbmNvbnN0IHJlYWxTZXRUaW1lb3V0ID0gc2V0VGltZW91dDtcbmNvbnN0IHJlYWxEYXRlTm93ID0gRGF0ZS5ub3cuYmluZChEYXRlKTtcblxuLyoqIEFuIGV4dGVuZGVkIHByb21pc2Ugd2l0aCBhZGRpdGlvbmFsIHByb3BlcnRpZXMgYW5kIG1ldGhvZHMgKi9cbmV4cG9ydCBpbnRlcmZhY2UgSGFuZGxlUHJvbWlzZTxUPiBleHRlbmRzIFByb21pc2U8VD4ge1xuICAvKiogV2hldGhlciB0aGUgcHJvbWlzZSBpcyByZXNvbHZlZCBvciByZWplY3RlZCAqL1xuICBjb21wbGV0ZWQ6IGJvb2xlYW4sXG4gIC8qKiBXaGV0aGVyIHRoZSBwcm9taXNlIGlzIHJlc29sdmVkICovXG4gIHJlc29sdmVkPzogYm9vbGVhbixcbiAgLyoqIFdoZXRoZXIgdGhlIHByb21pc2UgaXMgcmVqZWN0ZWQgKi9cbiAgcmVqZWN0ZWQ/OiBib29sZWFuLFxuICAvKiogUmVzdWx0IHZhbHVlIHRoZSBwcm9taXNlIHJlc29sdmVkIHdpdGggKi9cbiAgcmVzdWx0PzogVCxcbiAgLyoqIEVycm9yIHRoZSBwcm9taXNlIHJlamVjdGVkIHdpdGggKi9cbiAgZXJyb3I/OiBFcnJvcixcbiAgLyoqXG4gICAqIFJlc29sdmVzIHRoZSBwcm9taXNlIHdpdGggc3BlY2lmaWVkIHZhbHVlXG4gICAqIEBwYXJhbSByZXN1bHQgVmFsdWUgdG8gcmVzb2x2ZSB0aGUgcHJvbWlzZSB3aXRoXG4gICAqL1xuICByZXNvbHZlKHJlc3VsdD86IFQpOiB2b2lkLFxuICAvKipcbiAgICogUmVqZWN0cyB0aGUgcHJvbWlzZSB3aXRoIHNwZWNpZmllZCBlcnJvclxuICAgKiBAcGFyYW0gZXJyIEVycm9yIHRvIHJlamVjdCB0aGUgcHJvbWlzZSB3aXRoXG4gICAqL1xuICByZWplY3QoZXJyOiBFcnJvcik6IHZvaWQsXG4gIC8qKlxuICAgKiBBZGRzIGEgdGltZW91dCB0byByZWplY3QgdGhlIHByb21pc2Ugd2l0aCBgVGltZW91dEVycm9yYFxuICAgKiBAcGFyYW0gbWlsbGlzZWNvbmRzIHRpbWVvdXQgaW4gbWlsbGlzZWNvbmRzXG4gICAqIEBwYXJhbSBlcnJvck1lc3NhZ2UgZXJyb3IgbWVzc2FnZVxuICAgKiBAcmV0dXJucyBzZWxmXG4gICAqL1xuICB0aW1lb3V0KG1pbGxpc2Vjb25kczogbnVtYmVyLCBlcnJvck1lc3NhZ2U6IHN0cmluZyk6IEhhbmRsZVByb21pc2U8VD5cbn1cblxuLyoqXG4gKiBDcmVhdGVzIGEgcHJvbWlzZSB0aGF0IGNhbiBiZSB1c2VkIGFzIGEgaGFuZGxlLiBJdCB3aWxsIG5vdCByYWlzZSBlcnJvcnMgd2hlbiByZWplY3RlZCB1bnRpbCBpdCBpcyBleHBsaWNpdGx5XG4gKiBhd2FpdGVkIG9yIGNhdGNoIGlzIHNldFxuICogQHJldHVybnMgbW9kaWZpZWQgaGFuZGxlIHByb21pc2VcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUhhbmRsZVByb21pc2U8VD4oKTogSGFuZGxlUHJvbWlzZTxUPiB7XG4gIGxldCByZXNvbHZlLCByZWplY3Q7XG4gIGxldCBwcm9taXNlID0gbmV3IFByb21pc2UoKHJlcywgcmVqKSA9PiB7XG4gICAgcmVzb2x2ZSA9IHJlcztcbiAgICByZWplY3QgPSByZWo7XG4gIH0pIGFzIEhhbmRsZVByb21pc2U8VD47XG4gIHByb21pc2UuY29tcGxldGVkID0gZmFsc2U7XG4gIHByb21pc2UucmVzb2x2ZSA9IChyZXN1bHQpID0+IHtcbiAgICBpZiAoIXByb21pc2UuY29tcGxldGVkKSB7XG4gICAgICBwcm9taXNlLmNvbXBsZXRlZCA9IHRydWU7XG4gICAgICBwcm9taXNlLnJlc29sdmVkID0gdHJ1ZTtcbiAgICAgIHByb21pc2UucmVzdWx0ID0gcmVzdWx0O1xuICAgICAgcmVzb2x2ZShyZXN1bHQpO1xuICAgIH1cbiAgfTtcbiAgcHJvbWlzZS5yZWplY3QgPSAoZXJyKSA9PiB7XG4gICAgaWYgKCFwcm9taXNlLmNvbXBsZXRlZCkge1xuICAgICAgcHJvbWlzZS5jb21wbGV0ZWQgPSB0cnVlO1xuICAgICAgcHJvbWlzZS5yZWplY3RlZCA9IHRydWU7XG4gICAgICBwcm9taXNlLmVycm9yID0gZXJyO1xuICAgICAgcmVqZWN0KGVycik7XG4gICAgfVxuICB9O1xuICBwcm9taXNlLnRpbWVvdXQgPSAobWlsbGlzZWNvbmRzLCBlcnJvck1lc3NhZ2UpID0+IHtcbiAgICBpZiAoIXByb21pc2UuY29tcGxldGVkKSB7XG4gICAgICBsZXQgdGltZW91dCA9IHNldFRpbWVvdXQoKCkgPT4gcHJvbWlzZS5yZWplY3QobmV3IFRpbWVvdXRFcnJvcihlcnJvck1lc3NhZ2UpKSwgbWlsbGlzZWNvbmRzKTtcbiAgICAgIHByb21pc2UuZmluYWxseSgoKSA9PiBjbGVhclRpbWVvdXQodGltZW91dCkpLmNhdGNoKCgpID0+IHt9KTtcbiAgICB9XG4gICAgcmV0dXJuIHByb21pc2U7XG4gIH07XG4gIHByb21pc2UuY2F0Y2goKCkgPT4ge30pO1xuICByZXR1cm4gcHJvbWlzZTtcbn1cblxuLyoqXG4gKiBXcmFwcyBhIHByb21pc2UgaW50byBhIGhhbmRsZSBwcm9taXNlXG4gKiBAcGFyYW0gcHJvbWlzZSBuYXRpdmUgcHJvbWlzZVxuICogQHJldHVybnMgaGFuZGxlIHByb21pc2VcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHdyYXBIYW5kbGVQcm9taXNlPFQ+KHByb21pc2U6IFByb21pc2U8VD4pOiBIYW5kbGVQcm9taXNlPFQ+IHtcbiAgbGV0IHJlc3VsdCA9IGNyZWF0ZUhhbmRsZVByb21pc2U8VD4oKTtcbiAgcHJvbWlzZS50aGVuKHJlc3VsdC5yZXNvbHZlKS5jYXRjaCgoKSA9PiB7fSk7XG4gIHByb21pc2UuY2F0Y2gocmVzdWx0LnJlamVjdCk7XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbi8qKlxuICogVGhpcyBmdW5jdGlvbiBlbnN1cmVzIHRoYXQgYSBwcm9taXNlIGlzIHJldHVybmVkXG4gKiBAcGFyYW0gY2FsbCBjYWxsXG4gKiBAcmV0dXJucyBwcm9taXNlXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBlbnN1cmVQcm9taXNlPFQ+KGNhbGw6ICgpID0+IFByb21pc2VPck5vdDxUPik6IFByb21pc2U8VD4ge1xuICByZXR1cm4gY2FsbCgpO1xufVxuXG4vKiogQWRkaXRpb25hbCBkZWxheSBvcHRpb25zICovXG5leHBvcnQgdHlwZSBEZWxheU9wdGlvbnMgPSB7XG4gIC8qKiBXaGV0aGVyIHRvIGRlbGF5IHJlYWwgdGltZSwgaWYgYSBzdHViYmVkIGZyb3plbiBgc2lub25gIGNsb2NrIGlzIHVzZWQgKi9cbiAgaWdub3JlU2lub25DbG9jaz86IGJvb2xlYW5cbn07XG5cbi8qKlxuICogV2FpdHMgc3BlY2lmaWVkIGRlbGF5XG4gKiBAcGFyYW0gbXMgTWlsbGlzZWNvbmRzIHRvIHdhaXRcbiAqIEBwYXJhbSBvcHRpb25zIEFkZGl0aW9uYWwgb3B0aW9uc1xuICogQHJldHVybiBwcm9taXNlIHJlc29sdmluZyB3aGVuIHRoZSBkZWxheSBoYXMgZW5kZWRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRlbGF5KG1zOiBudW1iZXIsIG9wdGlvbnM/OiBEZWxheU9wdGlvbnMpOiBEZWxheVByb21pc2Uge1xuICBsZXQgcmVzb2x2ZTogKCkgPT4gdm9pZDtcbiAgbGV0IHRpbWVvdXQ6IE5vZGVKUy5UaW1lb3V0O1xuICBsZXQgY2FuY2VsZWQgPSBmYWxzZTtcbiAgbGV0IHJlc3VsdCA9IG5ldyBQcm9taXNlPHZvaWQ+KHJlcyA9PiB7XG4gICAgdGltZW91dCA9IG9wdGlvbnM/Lmlnbm9yZVNpbm9uQ2xvY2sgPyByZWFsU2V0VGltZW91dChyZXMsIG1zKSA6IHNldFRpbWVvdXQocmVzLCBtcyk7XG4gICAgcmVzb2x2ZSA9IHJlcztcbiAgfSkgYXMgRGVsYXlQcm9taXNlO1xuICBPYmplY3QuZGVmaW5lUHJvcGVydHkocmVzdWx0LCAnY2FuY2VsZWQnLCB7XG4gICAgZ2V0OiAoKSA9PiBjYW5jZWxlZCxcbiAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICB9KTtcbiAgcmVzdWx0LmNhbmNlbCA9ICgpID0+IHtcbiAgICBjYW5jZWxlZCA9IHRydWU7XG4gICAgY2xlYXJUaW1lb3V0KHRpbWVvdXQpO1xuICAgIHJlc29sdmUoKTtcbiAgfTtcbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuLyoqXG4gKiBEZWxheSBwcm9taXNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRGVsYXlQcm9taXNlIGV4dGVuZHMgUHJvbWlzZTx2b2lkPiB7XG4gIC8qKlxuICAgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIHByb21pc2UgaXMgY2FuY2VsZWRcbiAgICogQHJldHVybnMgd2hldGhlciBjYW5jZWxlZFxuICAgKi9cbiAgZ2V0IGNhbmNlbGVkKCk6IGJvb2xlYW47XG4gIC8qKlxuICAgKiBDYW5jZWxzIHdhaXRpbmcgYW5kIHJlc29sdmVzIHRoZSBwcm9taXNlIGltbWVkaWF0ZWx5XG4gICAqL1xuICBjYW5jZWwoKTogdm9pZDtcbn1cblxuLyoqXG4gKiBBc3NlbWJsZXMgbG9nNGpzIGNvbmZpZyBmcm9tIGxvZ2dpbmcgbGV2ZWwgbWFwXG4gKiBAcGFyYW0ge09iamVjdH0gW2NvbmZpZ10gbG9nNGpzIGNvbmZpZ1xuICogQHBhcmFtIHtTdHJpbmd9IFtjb25maWcuZGVmYXVsdExldmVsID0gJ0lORk8nXSBEZWZhdWx0IGxvZ2dpbmcgbGV2ZWxcbiAqIEBwYXJhbSB7T2JqZWN0fSBbY29uZmlnLmxldmVsc10gTG9nZ2luZyBsZXZlbHNcbiAqIEByZXR1cm4ge09iamVjdH0gTG9nNGpzIGNvbmZpZ1xuICovXG5leHBvcnQgZnVuY3Rpb24gYXNzZW1ibGVMb2c0anNDb25maWcoY29uZmlnOiBhbnkgPSB7fSkge1xuICBsZXQgYXBwZW5kZXJzID0ge2NvbnNvbGU6IHt0eXBlOiAnY29uc29sZSd9fTtcbiAgbGV0IGNhdGVnb3JpZXMgPSB7XG4gICAgZGVmYXVsdDoge1xuICAgICAgYXBwZW5kZXJzOiBPYmplY3Qua2V5cyhhcHBlbmRlcnMpLFxuICAgICAgbGV2ZWw6IGNvbmZpZy5kZWZhdWx0TGV2ZWwgfHwgJ0lORk8nXG4gICAgfVxuICB9O1xuICBPYmplY3Qua2V5cyhjb25maWcubGV2ZWxzIHx8IHt9KS5mb3JFYWNoKChjYXRlZ29yeSkgPT4ge1xuICAgIGNhdGVnb3JpZXNbY2F0ZWdvcnldID0ge1xuICAgICAgYXBwZW5kZXJzOiBPYmplY3Qua2V5cyhhcHBlbmRlcnMpLFxuICAgICAgbGV2ZWw6IGNvbmZpZy5sZXZlbHNbY2F0ZWdvcnldXG4gICAgfTtcbiAgfSk7XG4gIHJldHVybiB7YXBwZW5kZXJzLCBjYXRlZ29yaWVzfTtcbn1cblxuLyoqIE9wdGlvbnMgZm9yIGB3YWl0KmAgZnVuY3Rpb25zICovXG5leHBvcnQgdHlwZSBXYWl0T3B0aW9ucyA9IHtcbiAgLyoqIFdhaXQgdGltZW91dCBpbiBtaWxsaXNlY29uZHMuIERlZmF1bHRzIHRvIGAzMDAwMGAgKi9cbiAgdGltZW91dEluTXM/OiBudW1iZXJcbn07XG5cbi8qKlxuICogV2FpdHMgdW50aWxsIHNwZWNpZmllZCBjYWxsYWJsZSB3aWxsIHBhc3Mgc3VjY2Vzc2Z1bGx5IGFuZCByZXR1cm4gdHJ1ZS4gVXNlcyBsb2c0anMgbG9nZ2VyIG5hbWVkIGBoZWxwZXJzLndhaXRgXG4gKiBAcGFyYW0geygpID0+IGJvb2xlYW58UHJvbWlzZTxib29sZWFuPn0gY2FsbGFibGUgQ2FsbGFibGUgdG8gY2FsbCB1bnRpbCBpdCByZXR1cm5zIHRydWVcbiAqIEBwYXJhbSB7TnVtYmVyfSBbaW50ZXJ2YWxJbk1zID0gMjVdIEludGVydmFsIGluIG1pbGxpc2Vjb25kcyBiZXR3ZWVuIHRoZSBjaGVja3NcbiAqIEBwYXJhbSB7V2FpdE9wdGlvbnMgJiBEZWxheU9wdGlvbnN9IFtvcHRpb25zXSBBZGRpdGlvbmFsIHdhaXQgb3B0aW9uc1xuICogQHJldHVybiB7UHJvbWlzZX0gUHJvbWlzZSByZXNvbHZpbmcgd2l0aCBjYWxsYWJsZSByZXR1cm4gdmFsdWUgd2hlbiB3YWl0ZWRcbiAqIEB0aHJvd3Mge0Vycm9yfFRpbWVvdXRFcnJvcn0gRXJyb3IgZnJvbSB0aGUgY2FsbGFibGUgb3IgdGltZW91dCBlcnJvciB3aGVuIHRpbWVkIG91dFxuICovXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgY29tcGxleGl0eVxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHdhaXQoY2FsbGFibGUsIGludGVydmFsSW5NcyA9IDI1LCBvcHRpb25zPzogV2FpdE9wdGlvbnMgJiBEZWxheU9wdGlvbnMpIHtcbiAgY29uc3QgbG9nZ2VyID0gTG9nZ2VyTWFuYWdlci5nZXRMb2dnZXIoJ2hlbHBlcnMud2FpdCcpO1xuICBpZiAodHlwZW9mIGludGVydmFsSW5NcyA9PT0gJ29iamVjdCcpIHtcbiAgICAvLyBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eVxuICAgIG9wdGlvbnMgPSBpbnRlcnZhbEluTXM7XG4gICAgaW50ZXJ2YWxJbk1zID0gXy5kZWZhdWx0VG8oKG9wdGlvbnMgYXMgYW55KS5pbnRlcnZhbEluTXMsIDEwMDApO1xuICB9XG4gIGNvbnN0IGRhdGVOb3cgPSBvcHRpb25zPy5pZ25vcmVTaW5vbkNsb2NrID8gcmVhbERhdGVOb3cgOiAoKSA9PiBEYXRlLm5vdygpO1xuICBsZXQgcmVzdWx0ID0gZmFsc2UsIGxhc3RFcnJvcjtcbiAgbGV0IHRpbWVzQXQgPSBkYXRlTm93KCkgKyBfLmRlZmF1bHRUbyhvcHRpb25zPy50aW1lb3V0SW5NcywgMzAwMDApO1xuICB3aGlsZSAoIXJlc3VsdCAmJiBkYXRlTm93KCkgPCB0aW1lc0F0KSB7XG4gICAgdHJ5IHtcbiAgICAgIHJlc3VsdCA9IGF3YWl0IGNhbGxhYmxlKCk7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBsYXN0RXJyb3IgPSBlcnI7XG4gICAgICBsb2dnZXIuZGVidWcoJ1RoZSBleGVjdXRvciBmYWlsZWQnLCBlcnIpO1xuICAgICAgaWYgKGRhdGVOb3coKSA+PSB0aW1lc0F0KSB7XG4gICAgICAgIHRocm93IGVycjtcbiAgICAgIH1cbiAgICB9IGZpbmFsbHkge1xuICAgICAgaWYgKCFyZXN1bHQpIHtcbiAgICAgICAgbG9nZ2VyLmRlYnVnKCdXYWl0aW5nIGJlY2F1c2UgdGhlIHJlc3VsdCBpcycsIHJlc3VsdCk7XG4gICAgICAgIGF3YWl0IGRlbGF5KGludGVydmFsSW5Ncywgb3B0aW9ucyk7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIGlmIChkYXRlTm93KCkgPj0gdGltZXNBdCkge1xuICAgIGlmIChsYXN0RXJyb3IpIHtcbiAgICAgIHRocm93IGxhc3RFcnJvcjtcbiAgICB9XG4gICAgdGhyb3cgbmV3IFRpbWVvdXRFcnJvcignVGltZWQgb3V0IHRpbGwgc3BlY2lmaWVkIGNhbGxhYmxlIHJldHVybnMgdHJ1ZScpO1xuICB9XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbi8qKlxuICogV2FpdHMgdW50aWxsIHNwZWNpZmllZCBjYWxsYWJsZSB3aWxsIHBhc3Mgc3VjY2Vzc2Z1bGx5IGFuZCByZXR1cm4gdHJ1ZS4gVXNlcyBsb2c0anMgbG9nZ2VyIG5hbWVkIGBoZWxwZXJzLndhaXRgXG4gKiBAcGFyYW0geygpID0+IGJvb2xlYW58UHJvbWlzZTxib29sZWFuPn0gY2FsbGFibGUgQ2FsbGFibGUgdG8gY2FsbCB1bnRpbCBpdCByZXR1cm5zIHRydWVcbiAqIEBwYXJhbSB7TnVtYmVyfSBbaW50ZXJ2YWxJbk1zID0gMjVdIEludGVydmFsIGluIG1pbGxpc2Vjb25kcyBiZXR3ZWVuIHRoZSBjaGVja3NcbiAqIEBwYXJhbSB7V2FpdE9wdGlvbnMgJiBEZWxheU9wdGlvbnN9IFtvcHRpb25zXSBBZGRpdGlvbmFsIHdhaXQgb3B0aW9uc1xuICogQHJldHVybiB7UHJvbWlzZX0gUHJvbWlzZSByZXNvbHZpbmcgd2l0aCBjYWxsYWJsZSByZXR1cm4gdmFsdWUgd2hlbiB3YWl0ZWRcbiAqIEB0aHJvd3Mge0Vycm9yfFRpbWVvdXRFcnJvcn0gRXJyb3IgZnJvbSB0aGUgY2FsbGFibGUgb3IgdGltZW91dCBlcnJvciB3aGVuIHRpbWVkIG91dFxuICovXG5leHBvcnQgZnVuY3Rpb24gd2FpdFRydWUoY2FsbGFibGUsIGludGVydmFsSW5NcyA9IDI1LCBvcHRpb25zPzogV2FpdE9wdGlvbnMgJiBEZWxheU9wdGlvbnMpIHtcbiAgcmV0dXJuIHdhaXQoY2FsbGFibGUsIGludGVydmFsSW5Ncywgb3B0aW9ucyk7XG59XG5cbi8qKlxuICogV2FpdHMgdW50aWxsIHNwZWNpZmllZCBjYWxsYWJsZSB3aWxsIHBhc3Mgc3VjY2Vzc2Z1bGx5LiBVc2VzIGxvZzRqcyBsb2dnZXIgbmFtZWQgYGhlbHBlcnMud2FpdGBcbiAqIEBwYXJhbSB7KCkgPT4gYm9vbGVhbnxQcm9taXNlPGJvb2xlYW4+fSBjYWxsYWJsZSBDYWxsYWJsZSB0byBjYWxsXG4gKiBAcGFyYW0ge051bWJlcn0gW2ludGVydmFsSW5NcyA9IDI1XSBJbnRlcnZhbCBpbiBtaWxsaXNlY29uZHMgYmV0d2VlbiB0aGUgY2hlY2tzXG4gKiBAcGFyYW0ge1dhaXRPcHRpb25zICYgRGVsYXlPcHRpb25zfSBbb3B0aW9uc10gQWRkaXRpb25hbCB3YWl0IG9wdGlvbnNcbiAqIEByZXR1cm4ge1Byb21pc2V9IFByb21pc2UgcmVzb2x2aW5nIHdpdGggY2FsbGFibGUgcmV0dXJuIHZhbHVlIHdoZW4gd2FpdGVkXG4gKiBAdGhyb3dzIHtFcnJvcnxUaW1lb3V0RXJyb3J9IEVycm9yIGZyb20gdGhlIGNhbGxhYmxlIG9yIHRpbWVvdXQgZXJyb3Igd2hlbiB0aW1lZCBvdXRcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHdhaXRQYXNzPFQgPSB2b2lkPihcbiAgY2FsbGFibGU6ICgpID0+IFByb21pc2VPck5vdDxUPixcbiAgaW50ZXJ2YWxJbk1zID0gMjUsXG4gIG9wdGlvbnM/OiBXYWl0T3B0aW9ucyAmIERlbGF5T3B0aW9uc1xuKTogUHJvbWlzZTxUPiB7XG4gIGxldCByZXN1bHQ7XG4gIGF3YWl0IHdhaXQoYXN5bmMgKCkgPT4ge1xuICAgIHJlc3VsdCA9IGF3YWl0IGNhbGxhYmxlKCk7XG4gICAgcmV0dXJuIHRydWU7XG4gIH0sIGludGVydmFsSW5Ncywgb3B0aW9ucyk7XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbi8qKlxuICogV2FpdHMgdW50aWxsIHNwZWNpZmllZCBjYWxsYWJsZSBzdWNjZXNzZnVsbHkgcmV0dXJucyBhbnkgbm9uLXVuZGVmaW5lZCB2YWx1ZS4gVXNlcyBsb2c0anMgbG9nZ2VyIG5hbWVkIGBoZWxwZXJzLndhaXRgXG4gKiBAcGFyYW0gY2FsbGFibGUgQ2FsbGFibGUgdG8gY2FsbFxuICogQHBhcmFtIGludGVydmFsSW5NcyBJbnRlcnZhbCBpbiBtaWxsaXNlY29uZHMgYmV0d2VlbiB0aGUgY2hlY2tzXG4gKiBAcGFyYW0gb3B0aW9ucyBBZGRpdGlvbmFsIHdhaXQgb3B0aW9uc1xuICogQHJldHVybiBQcm9taXNlIHJlc29sdmluZyB3aXRoIGNhbGxhYmxlIHJldHVybiB2YWx1ZSB3aGVuIHdhaXRlZFxuICogQHRocm93cyB7RXJyb3J8VGltZW91dEVycm9yfSBFcnJvciBmcm9tIHRoZSBjYWxsYWJsZSBvciB0aW1lb3V0IGVycm9yIHdoZW4gdGltZWQgb3V0XG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiB3YWl0QW55PFQ+KFxuICBjYWxsYWJsZTogKCkgPT4gUHJvbWlzZU9yTm90PFQ+LCBpbnRlcnZhbEluTXMgPSAyNSwgb3B0aW9ucz86IFdhaXRPcHRpb25zXG4pOiBQcm9taXNlPFQ+IHtcbiAgbGV0IHJlc3VsdDogVDtcbiAgYXdhaXQgd2FpdFRydWUoYXN5bmMgKCkgPT4ge1xuICAgIHJlc3VsdCA9IGF3YWl0IGNhbGxhYmxlKCk7XG4gICAgaWYgKHJlc3VsdCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gIH0sIGludGVydmFsSW5Ncywgb3B0aW9ucyk7XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbi8qKlxuICogQ2FsY3VsYXRlcyBleHBvbmVudGlhbCBiYWNrb2ZmIGRlbGF5LiBBdCB0aGUgaW5pdGlhbCBpdGVyYXRpb24sIHRoZXJlIGlzIG5vIGRlbGF5LiBBdCB0aGUgbmV4dCBpdGVyYXRpb24sIHRoZSBkZWxheVxuICogaXMgYHN0YXJ0RGVsYXlgLiBGdXJ0aGVyLCBhdCB0aGUgZXZlcnkgbmV4dCBpdGVyYXRpb24gdGhlIHByZXZpb3VzIGRlbGF5IG11bHRpcGxpZXMgdG8gMlxuICogQHBhcmFtIGl0ZXJhdGlvbiBjdXJyZW50IGl0ZXJhdGlvbiwgd2hlcmUgMCBpcyBpbml0aWFsIGl0ZXJhdGlvbiB3aXRob3V0IGRlbGF5aW5nXG4gKiBAcGFyYW0gc3RhcnREZWxheSBzdGFydCBkZWxheVxuICogQHBhcmFtIG1heERlbGF5IG1heGltdW0gZGVsYXlcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGV4cEJhY2tvZmZEZWxheShpdGVyYXRpb246IG51bWJlciwgc3RhcnREZWxheTogbnVtYmVyLCBtYXhEZWxheTogbnVtYmVyKSB7XG4gIGlmIChpdGVyYXRpb24gPT09IDApIHtcbiAgICByZXR1cm4gMDtcbiAgfVxuICByZXR1cm4gTWF0aC5taW4oc3RhcnREZWxheSAqIE1hdGgucG93KDIsIGl0ZXJhdGlvbiAtIDEpLCBtYXhEZWxheSk7XG59XG4iXSwibmFtZXMiOlsiYXNzZW1ibGVMb2c0anNDb25maWciLCJjcmVhdGVIYW5kbGVQcm9taXNlIiwiZGVsYXkiLCJlbnN1cmVQcm9taXNlIiwiZXhwQmFja29mZkRlbGF5Iiwid2FpdCIsIndhaXRBbnkiLCJ3YWl0UGFzcyIsIndhaXRUcnVlIiwid3JhcEhhbmRsZVByb21pc2UiLCJyZWFsU2V0VGltZW91dCIsInNldFRpbWVvdXQiLCJyZWFsRGF0ZU5vdyIsIkRhdGUiLCJub3ciLCJiaW5kIiwicmVzb2x2ZSIsInJlamVjdCIsInByb21pc2UiLCJQcm9taXNlIiwicmVzIiwicmVqIiwiY29tcGxldGVkIiwicmVzdWx0IiwicmVzb2x2ZWQiLCJlcnIiLCJyZWplY3RlZCIsImVycm9yIiwidGltZW91dCIsIm1pbGxpc2Vjb25kcyIsImVycm9yTWVzc2FnZSIsIlRpbWVvdXRFcnJvciIsImZpbmFsbHkiLCJjbGVhclRpbWVvdXQiLCJjYXRjaCIsInRoZW4iLCJjYWxsIiwibXMiLCJvcHRpb25zIiwiY2FuY2VsZWQiLCJpZ25vcmVTaW5vbkNsb2NrIiwiT2JqZWN0IiwiZGVmaW5lUHJvcGVydHkiLCJnZXQiLCJlbnVtZXJhYmxlIiwiY29uZmlndXJhYmxlIiwiY2FuY2VsIiwiY29uZmlnIiwiYXBwZW5kZXJzIiwiY29uc29sZSIsInR5cGUiLCJjYXRlZ29yaWVzIiwiZGVmYXVsdCIsImtleXMiLCJsZXZlbCIsImRlZmF1bHRMZXZlbCIsImxldmVscyIsImZvckVhY2giLCJjYXRlZ29yeSIsImNhbGxhYmxlIiwiaW50ZXJ2YWxJbk1zIiwibG9nZ2VyIiwiTG9nZ2VyTWFuYWdlciIsImdldExvZ2dlciIsIl8iLCJkZWZhdWx0VG8iLCJkYXRlTm93IiwibGFzdEVycm9yIiwidGltZXNBdCIsInRpbWVvdXRJbk1zIiwiZGVidWciLCJ1bmRlZmluZWQiLCJpdGVyYXRpb24iLCJzdGFydERlbGF5IiwibWF4RGVsYXkiLCJNYXRoIiwibWluIiwicG93Il0sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7SUE0SmdCQSxvQkFBb0I7ZUFBcEJBOztJQTlHQUMsbUJBQW1CO2VBQW5CQTs7SUFtRUFDLEtBQUs7ZUFBTEE7O0lBaEJNQyxhQUFhO2VBQWJBOztJQTJMTkMsZUFBZTtlQUFmQTs7SUFoR01DLElBQUk7ZUFBSkE7O0lBNEVBQyxPQUFPO2VBQVBBOztJQXJCQUMsUUFBUTtlQUFSQTs7SUFaTkMsUUFBUTtlQUFSQTs7SUFsSkFDLGlCQUFpQjtlQUFqQkE7OztxRUFu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