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)
163 lines (162 loc) • 19.3 kB
JavaScript
;
function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) {
try {
var info = gen[key](arg);
var value = info.value;
} catch (error) {
reject(error);
return;
}
if (info.done) {
resolve(value);
} else {
Promise.resolve(value).then(_next, _throw);
}
}
function _async_to_generator(fn) {
return function() {
var self = this, args = arguments;
return new Promise(function(resolve, reject) {
var gen = fn.apply(self, args);
function _next(value) {
asyncGeneratorStep(gen, resolve, reject, _next, _throw, "next", value);
}
function _throw(err) {
asyncGeneratorStep(gen, resolve, reject, _next, _throw, "throw", err);
}
_next(undefined);
});
};
}
function _define_property(obj, key, value) {
if (key in obj) {
Object.defineProperty(obj, key, {
value: value,
enumerable: true,
configurable: true,
writable: true
});
} else {
obj[key] = value;
}
return obj;
}
import MetaApiClient from '../metaApi.client';
import LoggerManager from '../../logger';
import { NotFoundError } from '../errorHandler';
let ClientApiClient = class ClientApiClient extends MetaApiClient {
/**
* Type hashing ignored field lists
* @typedef {Object} TypeHashingIgnoredFieldLists
* @property {String[]} specification specification ignored fields
* @property {String[]} position position ignored fields
* @property {String[]} order order ignored fields
*/ /**
* Hashing ignored field lists
* @typedef {Object} HashingIgnoredFieldLists
* @property {TypeHashingIgnoredFieldLists} g1 g1 hashing ignored field lists
* @property {TypeHashingIgnoredFieldLists} g2 g2 hashing ignored field lists
*/ /**
* Refreshes hashing ignored field lists
* @param {String} region account region
* @returns {Promise} promise resolving when the hashing field lists are updated.
*/ refreshIgnoredFieldLists(region) {
var _this = this;
return _async_to_generator(function*() {
if (_this._ignoredFieldListsCaches[region] && _this._ignoredFieldListsCaches[region].requestPromise) {
yield _this._ignoredFieldListsCaches[region].requestPromise;
} else if (_this._ignoredFieldListsCaches[region] && Date.now() - _this._ignoredFieldListsCaches[region].lastUpdated < _this._updateInterval) {
return;
} else {
if (!_this._ignoredFieldListsCaches[region]) {
_this._ignoredFieldListsCaches[region] = {
lastUpdated: 0,
data: null,
requestPromise: null,
updateJob: setInterval(()=>_this._refreshIgnoredFieldListsJob(region), 60000)
};
}
let resolve, reject;
_this._ignoredFieldListsCaches[region].requestPromise = new Promise((res, rej)=>{
resolve = res, reject = rej;
});
let isCacheUpdated = false;
while(!isCacheUpdated){
try {
const host = yield _this._domainClient.getUrl(_this._host, region);
const opts = {
url: `${host}/hashing-ignored-field-lists`,
method: 'GET',
json: true,
headers: {
'auth-token': _this._token
}
};
const response = yield _this._httpClient.request(opts, 'getHashingIgnoredFieldLists');
_this._ignoredFieldListsCaches[region] = {
lastUpdated: Date.now(),
data: response,
requestPromise: null
};
_this._ignoredFieldListsFreshestCache = response;
resolve(response);
isCacheUpdated = true;
_this._ignoredFieldListsCaches[region].retryIntervalInSeconds = _this._retryIntervalInSeconds;
} catch (err) {
_this._logger.error('Failed to update hashing ignored field list', err);
_this._ignoredFieldListsCaches[region].retryIntervalInSeconds = Math.min(_this._ignoredFieldListsCaches[region].retryIntervalInSeconds * 2, 300);
yield new Promise((res)=>setTimeout(res, _this._ignoredFieldListsCaches[region].retryIntervalInSeconds * 1000));
}
}
}
})();
}
/**
* Retrieves hashing ignored field lists
* @param {String} region account region
* @returns {HashingIgnoredFieldLists} promise resolving with hashing ignored field lists
*/ getHashingIgnoredFieldLists(region) {
if (region === 'combined') {
if (this._ignoredFieldListsFreshestCache) {
return this._ignoredFieldListsFreshestCache;
} else {
throw new NotFoundError('Ignored field lists not found');
}
}
if (this._ignoredFieldListsCaches[region] && this._ignoredFieldListsCaches[region].data) {
return this._ignoredFieldListsCaches[region].data;
} else {
throw new NotFoundError(`Ignored field lists for region ${region} not found`);
}
}
_refreshIgnoredFieldListsJob(region) {
var _this = this;
return _async_to_generator(function*() {
if (!_this._ignoredFieldListsCaches[region].requestPromise && Date.now() - _this._ignoredFieldListsCaches[region].lastUpdated > _this._updateInterval) {
yield _this.refreshIgnoredFieldLists(region);
}
})();
}
/**
* Constructs client API client instance
* @param {HttpClient} httpClient HTTP client
* @param {DomainClient} domainClient domain client
*/ constructor(httpClient, domainClient){
super(httpClient, domainClient);
_define_property(this, "_retryIntervalInSeconds", void 0);
_define_property(this, "_updateInterval", void 0);
_define_property(this, "_ignoredFieldListsCaches", void 0);
_define_property(this, "_ignoredFieldListsFreshestCache", void 0);
_define_property(this, "_logger", void 0);
this._host = 'https://mt-client-api-v1';
this._retryIntervalInSeconds = 1;
this._updateInterval = 60 * 60 * 1000;
this._ignoredFieldListsCaches = {};
this._ignoredFieldListsFreshestCache = null;
this._logger = LoggerManager.getLogger('ClientApiClient');
}
};
/**
* metaapi.cloud client API client (see https://metaapi.cloud/docs/client/)
*/ export { ClientApiClient as default };
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIjxhbm9uPiJdLCJzb3VyY2VzQ29udGVudCI6WyIndXNlIHN0cmljdCc7XG5cbmltcG9ydCBNZXRhQXBpQ2xpZW50IGZyb20gJy4uL21ldGFBcGkuY2xpZW50JztcbmltcG9ydCBMb2dnZXJNYW5hZ2VyLCB7TG9nZ2VyfSBmcm9tICcuLi8uLi9sb2dnZXInO1xuaW1wb3J0IHtOb3RGb3VuZEVycm9yfSBmcm9tICcuLi9lcnJvckhhbmRsZXInO1xuaW1wb3J0IEh0dHBDbGllbnQgZnJvbSAnLi4vaHR0cENsaWVudCc7XG5pbXBvcnQgRG9tYWluQ2xpZW50IGZyb20gJy4uL2RvbWFpbi5jbGllbnQnO1xuXG4vKipcbiAqIG1ldGFhcGkuY2xvdWQgY2xpZW50IEFQSSBjbGllbnQgKHNlZSBodHRwczovL21ldGFhcGkuY2xvdWQvZG9jcy9jbGllbnQvKVxuICovXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBDbGllbnRBcGlDbGllbnQgZXh0ZW5kcyBNZXRhQXBpQ2xpZW50IHtcbiAgXG4gIHByaXZhdGUgX3JldHJ5SW50ZXJ2YWxJblNlY29uZHM6IG51bWJlcjtcbiAgcHJpdmF0ZSBfdXBkYXRlSW50ZXJ2YWw6IG51bWJlcjtcbiAgcHJpdmF0ZSBfaWdub3JlZEZpZWxkTGlzdHNDYWNoZXM6IHt9O1xuICBwcml2YXRlIF9pZ25vcmVkRmllbGRMaXN0c0ZyZXNoZXN0Q2FjaGU6IG51bGw7XG4gIHByaXZhdGUgX2xvZ2dlcjogTG9nZ2VyO1xuXG4gIC8qKlxuICAgKiBDb25zdHJ1Y3RzIGNsaWVudCBBUEkgY2xpZW50IGluc3RhbmNlXG4gICAqIEBwYXJhbSB7SHR0cENsaWVudH0gaHR0cENsaWVudCBIVFRQIGNsaWVudFxuICAgKiBAcGFyYW0ge0RvbWFpbkNsaWVudH0gZG9tYWluQ2xpZW50IGRvbWFpbiBjbGllbnRcbiAgICovXG4gIGNvbnN0cnVjdG9yKGh0dHBDbGllbnQ6IEh0dHBDbGllbnQsIGRvbWFpbkNsaWVudDogRG9tYWluQ2xpZW50KSB7XG4gICAgc3VwZXIoaHR0cENsaWVudCwgZG9tYWluQ2xpZW50KTtcbiAgICB0aGlzLl9ob3N0ID0gJ2h0dHBzOi8vbXQtY2xpZW50LWFwaS12MSc7XG4gICAgdGhpcy5fcmV0cnlJbnRlcnZhbEluU2Vjb25kcyA9IDE7XG4gICAgdGhpcy5fdXBkYXRlSW50ZXJ2YWwgPSA2MCAqIDYwICogMTAwMDtcbiAgICB0aGlzLl9pZ25vcmVkRmllbGRMaXN0c0NhY2hlcyA9IHt9O1xuICAgIHRoaXMuX2lnbm9yZWRGaWVsZExpc3RzRnJlc2hlc3RDYWNoZSA9IG51bGw7XG4gICAgdGhpcy5fbG9nZ2VyID0gTG9nZ2VyTWFuYWdlci5nZXRMb2dnZXIoJ0NsaWVudEFwaUNsaWVudCcpO1xuICB9XG5cbiAgLyoqXG4gICAqIFR5cGUgaGFzaGluZyBpZ25vcmVkIGZpZWxkIGxpc3RzXG4gICAqIEB0eXBlZGVmIHtPYmplY3R9IFR5cGVIYXNoaW5nSWdub3JlZEZpZWxkTGlzdHNcbiAgICogQHByb3BlcnR5IHtTdHJpbmdbXX0gc3BlY2lmaWNhdGlvbiBzcGVjaWZpY2F0aW9uIGlnbm9yZWQgZmllbGRzXG4gICAqIEBwcm9wZXJ0eSB7U3RyaW5nW119IHBvc2l0aW9uIHBvc2l0aW9uIGlnbm9yZWQgZmllbGRzXG4gICAqIEBwcm9wZXJ0eSB7U3RyaW5nW119IG9yZGVyIG9yZGVyIGlnbm9yZWQgZmllbGRzXG4gICAqL1xuXG4gIC8qKlxuICAgKiBIYXNoaW5nIGlnbm9yZWQgZmllbGQgbGlzdHNcbiAgICogQHR5cGVkZWYge09iamVjdH0gSGFzaGluZ0lnbm9yZWRGaWVsZExpc3RzXG4gICAqIEBwcm9wZXJ0eSB7VHlwZUhhc2hpbmdJZ25vcmVkRmllbGRMaXN0c30gZzEgZzEgaGFzaGluZyBpZ25vcmVkIGZpZWxkIGxpc3RzXG4gICAqIEBwcm9wZXJ0eSB7VHlwZUhhc2hpbmdJZ25vcmVkRmllbGRMaXN0c30gZzIgZzIgaGFzaGluZyBpZ25vcmVkIGZpZWxkIGxpc3RzXG4gICAqL1xuXG4gIC8qKlxuICAgKiBSZWZyZXNoZXMgaGFzaGluZyBpZ25vcmVkIGZpZWxkIGxpc3RzXG4gICAqIEBwYXJhbSB7U3RyaW5nfSByZWdpb24gYWNjb3VudCByZWdpb25cbiAgICogQHJldHVybnMge1Byb21pc2V9IHByb21pc2UgcmVzb2x2aW5nIHdoZW4gdGhlIGhhc2hpbmcgZmllbGQgbGlzdHMgYXJlIHVwZGF0ZWQuXG4gICAqL1xuICBhc3luYyByZWZyZXNoSWdub3JlZEZpZWxkTGlzdHMocmVnaW9uOiBzdHJpbmcpOiBQcm9taXNlPGFueT4ge1xuICAgIGlmKHRoaXMuX2lnbm9yZWRGaWVsZExpc3RzQ2FjaGVzW3JlZ2lvbl0gJiYgdGhpcy5faWdub3JlZEZpZWxkTGlzdHNDYWNoZXNbcmVnaW9uXS5yZXF1ZXN0UHJvbWlzZSkge1xuICAgICAgYXdhaXQgdGhpcy5faWdub3JlZEZpZWxkTGlzdHNDYWNoZXNbcmVnaW9uXS5yZXF1ZXN0UHJvbWlzZTtcbiAgICB9IGVsc2UgaWYgKHRoaXMuX2lnbm9yZWRGaWVsZExpc3RzQ2FjaGVzW3JlZ2lvbl0gJiYgXG4gICAgICBEYXRlLm5vdygpIC0gdGhpcy5faWdub3JlZEZpZWxkTGlzdHNDYWNoZXNbcmVnaW9uXS5sYXN0VXBkYXRlZCA8IHRoaXMuX3VwZGF0ZUludGVydmFsKSB7XG4gICAgICByZXR1cm47XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmKCF0aGlzLl9pZ25vcmVkRmllbGRMaXN0c0NhY2hlc1tyZWdpb25dKSB7XG4gICAgICAgIHRoaXMuX2lnbm9yZWRGaWVsZExpc3RzQ2FjaGVzW3JlZ2lvbl0gPSB7XG4gICAgICAgICAgbGFzdFVwZGF0ZWQ6IDAsXG4gICAgICAgICAgZGF0YTogbnVsbCxcbiAgICAgICAgICByZXF1ZXN0UHJvbWlzZTogbnVsbCxcbiAgICAgICAgICB1cGRhdGVKb2I6IHNldEludGVydmFsKCgpID0+IHRoaXMuX3JlZnJlc2hJZ25vcmVkRmllbGRMaXN0c0pvYihyZWdpb24pLCA2MDAwMClcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICAgIGxldCByZXNvbHZlLCByZWplY3Q7XG4gICAgICB0aGlzLl9pZ25vcmVkRmllbGRMaXN0c0NhY2hlc1tyZWdpb25dLnJlcXVlc3RQcm9taXNlID0gbmV3IFByb21pc2UoKHJlcywgcmVqKSA9PiB7XG4gICAgICAgIHJlc29sdmUgPSByZXMsIHJlamVjdCA9IHJlajtcbiAgICAgIH0pO1xuICAgICAgbGV0IGlzQ2FjaGVVcGRhdGVkID0gZmFsc2U7XG4gICAgICB3aGlsZSghaXNDYWNoZVVwZGF0ZWQpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBjb25zdCBob3N0ID0gYXdhaXQgdGhpcy5fZG9tYWluQ2xpZW50LmdldFVybCh0aGlzLl9ob3N0LCByZWdpb24pO1xuICAgICAgICAgIGNvbnN0IG9wdHMgPSB7XG4gICAgICAgICAgICB1cmw6IGAke2hvc3R9L2hhc2hpbmctaWdub3JlZC1maWVsZC1saXN0c2AsXG4gICAgICAgICAgICBtZXRob2Q6ICdHRVQnLFxuICAgICAgICAgICAganNvbjogdHJ1ZSxcbiAgICAgICAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgICAgICAgJ2F1dGgtdG9rZW4nOiB0aGlzLl90b2tlblxuICAgICAgICAgICAgfVxuICAgICAgICAgIH07XG4gICAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCB0aGlzLl9odHRwQ2xpZW50LnJlcXVlc3Qob3B0cywgJ2dldEhhc2hpbmdJZ25vcmVkRmllbGRMaXN0cycpO1xuICAgICAgICAgIHRoaXMuX2lnbm9yZWRGaWVsZExpc3RzQ2FjaGVzW3JlZ2lvbl0gPSB7IGxhc3RVcGRhdGVkOiBEYXRlLm5vdygpLCBkYXRhOiByZXNwb25zZSwgcmVxdWVzdFByb21pc2U6IG51bGwgfTtcbiAgICAgICAgICB0aGlzLl9pZ25vcmVkRmllbGRMaXN0c0ZyZXNoZXN0Q2FjaGUgPSByZXNwb25zZTtcbiAgICAgICAgICByZXNvbHZlKHJlc3BvbnNlKTtcbiAgICAgICAgICBpc0NhY2hlVXBkYXRlZCA9IHRydWU7XG4gICAgICAgICAgdGhpcy5faWdub3JlZEZpZWxkTGlzdHNDYWNoZXNbcmVnaW9uXS5yZXRyeUludGVydmFsSW5TZWNvbmRzID0gdGhpcy5fcmV0cnlJbnRlcnZhbEluU2Vjb25kcztcbiAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgdGhpcy5fbG9nZ2VyLmVycm9yKCdGYWlsZWQgdG8gdXBkYXRlIGhhc2hpbmcgaWdub3JlZCBmaWVsZCBsaXN0JywgZXJyKTtcbiAgICAgICAgICB0aGlzLl9pZ25vcmVkRmllbGRMaXN0c0NhY2hlc1tyZWdpb25dLnJldHJ5SW50ZXJ2YWxJblNlY29uZHMgPVxuICAgICAgICAgICAgTWF0aC5taW4odGhpcy5faWdub3JlZEZpZWxkTGlzdHNDYWNoZXNbcmVnaW9uXS5yZXRyeUludGVydmFsSW5TZWNvbmRzICogMiwgMzAwKTtcbiAgICAgICAgICBhd2FpdCBuZXcgUHJvbWlzZShyZXMgPT4gc2V0VGltZW91dChyZXMsIFxuICAgICAgICAgICAgdGhpcy5faWdub3JlZEZpZWxkTGlzdHNDYWNoZXNbcmVnaW9uXS5yZXRyeUludGVydmFsSW5TZWNvbmRzICogMTAwMCkpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJldHJpZXZlcyBoYXNoaW5nIGlnbm9yZWQgZmllbGQgbGlzdHNcbiAgICogQHBhcmFtIHtTdHJpbmd9IHJlZ2lvbiBhY2NvdW50IHJlZ2lvblxuICAgKiBAcmV0dXJucyB7SGFzaGluZ0lnbm9yZWRGaWVsZExpc3RzfSBwcm9taXNlIHJlc29sdmluZyB3aXRoIGhhc2hpbmcgaWdub3JlZCBmaWVsZCBsaXN0c1xuICAgKi9cbiAgZ2V0SGFzaGluZ0lnbm9yZWRGaWVsZExpc3RzKHJlZ2lvbjogc3RyaW5nKTogSGFzaGluZ0lnbm9yZWRGaWVsZExpc3RzIHtcbiAgICBpZihyZWdpb24gPT09ICdjb21iaW5lZCcpIHtcbiAgICAgIGlmICh0aGlzLl9pZ25vcmVkRmllbGRMaXN0c0ZyZXNoZXN0Q2FjaGUpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2lnbm9yZWRGaWVsZExpc3RzRnJlc2hlc3RDYWNoZTtcbiAgICAgIH0gZWxzZXsgXG4gICAgICAgIHRocm93IG5ldyBOb3RGb3VuZEVycm9yKCdJZ25vcmVkIGZpZWxkIGxpc3RzIG5vdCBmb3VuZCcpO1xuICAgICAgfVxuICAgIH1cbiAgICBpZih0aGlzLl9pZ25vcmVkRmllbGRMaXN0c0NhY2hlc1tyZWdpb25dICYmIHRoaXMuX2lnbm9yZWRGaWVsZExpc3RzQ2FjaGVzW3JlZ2lvbl0uZGF0YSkge1xuICAgICAgcmV0dXJuIHRoaXMuX2lnbm9yZWRGaWVsZExpc3RzQ2FjaGVzW3JlZ2lvbl0uZGF0YTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgbmV3IE5vdEZvdW5kRXJyb3IoYElnbm9yZWQgZmllbGQgbGlzdHMgZm9yIHJlZ2lvbiAke3JlZ2lvbn0gbm90IGZvdW5kYCk7XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgX3JlZnJlc2hJZ25vcmVkRmllbGRMaXN0c0pvYihyZWdpb24pIHtcbiAgICBpZighdGhpcy5faWdub3JlZEZpZWxkTGlzdHNDYWNoZXNbcmVnaW9uXS5yZXF1ZXN0UHJvbWlzZSAmJiBcbiAgICAgIERhdGUubm93KCkgLSB0aGlzLl9pZ25vcmVkRmllbGRMaXN0c0NhY2hlc1tyZWdpb25dLmxhc3RVcGRhdGVkID4gdGhpcy5fdXBkYXRlSW50ZXJ2YWwpIHtcbiAgICAgIGF3YWl0IHRoaXMucmVmcmVzaElnbm9yZWRGaWVsZExpc3RzKHJlZ2lvbik7XG4gICAgfVxuICB9XG59XG5cbi8qKlxuICogVHlwZSBoYXNoaW5nIGlnbm9yZWQgZmllbGQgbGlzdHNcbiAqL1xuZXhwb3J0IGRlY2xhcmUgdHlwZSBUeXBlSGFzaGluZ0lnbm9yZWRGaWVsZExpc3RzID0ge1xuXG4gIC8qKlxuICAgKiBzcGVjaWZpY2F0aW9ucyBpZ25vcmVkIGZpZWxkc1xuICAgKi9cbiAgc3BlY2lmaWNhdGlvbjogc3RyaW5nW10sXG5cbiAgLyoqXG4gICAqIHBvc2l0aW9uIGlnbm9yZWQgZmllbGRzXG4gICAqL1xuICBwb3NpdGlvbjogc3RyaW5nW10sXG5cbiAgLyoqXG4gICAqIG9yZGVyIGlnbm9yZWQgZmllbGRzXG4gICAqL1xuICBvcmRlcjogc3RyaW5nW10sXG59XG5cbi8qKlxuICogSGFzaGluZyBpZ25vcmVkIGZpZWxkIGxpc3RzXG4gKi9cbmV4cG9ydCBkZWNsYXJlIHR5cGUgSGFzaGluZ0lnbm9yZWRGaWVsZExpc3RzID0ge1xuXG4gIC8qKlxuICAgKiBnMSBoYXNoaW5nIGlnbm9yZWQgZmllbGQgbGlzdHNcbiAgICovXG4gIGcxOiBUeXBlSGFzaGluZ0lnbm9yZWRGaWVsZExpc3RzLFxuXG4gIC8qKlxuICAgKiBnMiBoYXNoaW5nIGlnbm9yZWQgZmllbGQgbGlzdHNcbiAgICovXG4gIGcyOiBUeXBlSGFzaGluZ0lnbm9yZWRGaWVsZExpc3RzLFxufVxuIl0sIm5hbWVzIjpbIk1ldGFBcGlDbGllbnQiLCJMb2dnZXJNYW5hZ2VyIiwiTm90Rm91bmRFcnJvciIsIkNsaWVudEFwaUNsaWVudCIsInJlZnJlc2hJZ25vcmVkRmllbGRMaXN0cyIsInJlZ2lvbiIsIl9pZ25vcmVkRmllbGRMaXN0c0NhY2hlcyIsInJlcXVlc3RQcm9taXNlIiwiRGF0ZSIsIm5vdyIsImxhc3RVcGRhdGVkIiwiX3VwZGF0ZUludGVydmFsIiwiZGF0YSIsInVwZGF0ZUpvYiIsInNldEludGVydmFsIiwiX3JlZnJlc2hJZ25vcmVkRmllbGRMaXN0c0pvYiIsInJlc29sdmUiLCJyZWplY3QiLCJQcm9taXNlIiwicmVzIiwicmVqIiwiaXNDYWNoZVVwZGF0ZWQiLCJob3N0IiwiX2RvbWFpbkNsaWVudCIsImdldFVybCIsIl9ob3N0Iiwib3B0cyIsInVybCIsIm1ldGhvZCIsImpzb24iLCJoZWFkZXJzIiwiX3Rva2VuIiwicmVzcG9uc2UiLCJfaHR0cENsaWVudCIsInJlcXVlc3QiLCJfaWdub3JlZEZpZWxkTGlzdHNGcmVzaGVzdENhY2hlIiwicmV0cnlJbnRlcnZhbEluU2Vjb25kcyIsIl9yZXRyeUludGVydmFsSW5TZWNvbmRzIiwiZXJyIiwiX2xvZ2dlciIsImVycm9yIiwiTWF0aCIsIm1pbiIsInNldFRpbWVvdXQiLCJnZXRIYXNoaW5nSWdub3JlZEZpZWxkTGlzdHMiLCJjb25zdHJ1Y3RvciIsImh0dHBDbGllbnQiLCJkb21haW5DbGllbnQiLCJnZXRMb2dnZXIiXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBRUEsT0FBT0EsbUJBQW1CLG9CQUFvQjtBQUM5QyxPQUFPQyxtQkFBNkIsZUFBZTtBQUNuRCxTQUFRQyxhQUFhLFFBQU8sa0JBQWtCO0FBTy9CLElBQUEsQUFBTUMsa0JBQU4sTUFBTUEsd0JBQXdCSDtJQXVCM0M7Ozs7OztHQU1DLEdBRUQ7Ozs7O0dBS0MsR0FFRDs7OztHQUlDLEdBQ0QsQUFBTUkseUJBQXlCQyxNQUFjOztlQUE3QyxvQkFBQTtZQUNFLElBQUcsTUFBS0Msd0JBQXdCLENBQUNELE9BQU8sSUFBSSxNQUFLQyx3QkFBd0IsQ0FBQ0QsT0FBTyxDQUFDRSxjQUFjLEVBQUU7Z0JBQ2hHLE1BQU0sTUFBS0Qsd0JBQXdCLENBQUNELE9BQU8sQ0FBQ0UsY0FBYztZQUM1RCxPQUFPLElBQUksTUFBS0Qsd0JBQXdCLENBQUNELE9BQU8sSUFDOUNHLEtBQUtDLEdBQUcsS0FBSyxNQUFLSCx3QkFBd0IsQ0FBQ0QsT0FBTyxDQUFDSyxXQUFXLEdBQUcsTUFBS0MsZUFBZSxFQUFFO2dCQUN2RjtZQUNGLE9BQU87Z0JBQ0wsSUFBRyxDQUFDLE1BQUtMLHdCQUF3QixDQUFDRCxPQUFPLEVBQUU7b0JBQ3pDLE1BQUtDLHdCQUF3QixDQUFDRCxPQUFPLEdBQUc7d0JBQ3RDSyxhQUFhO3dCQUNiRSxNQUFNO3dCQUNOTCxnQkFBZ0I7d0JBQ2hCTSxXQUFXQyxZQUFZLElBQU0sTUFBS0MsNEJBQTRCLENBQUNWLFNBQVM7b0JBQzFFO2dCQUNGO2dCQUNBLElBQUlXLFNBQVNDO2dCQUNiLE1BQUtYLHdCQUF3QixDQUFDRCxPQUFPLENBQUNFLGNBQWMsR0FB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