@rudderstack/integrations-lib
Version:
A comprehensive TypeScript library providing shared utilities, SDKs, and tools for RudderStack integrations and destinations.
121 lines • 18.2 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
const types_1 = require("./types");
const base_sdk_1 = require("../common/base-sdk");
class ZOHO extends base_sdk_1.BaseSDK {
// eslint-disable-next-line class-methods-use-this
validateAuthObject(authObject) {
if (!authObject) {
throw new Error('authObject is required.');
}
const { accessToken, dataCenter, refreshAccesTokenFunc } = authObject;
if (!accessToken) {
throw new Error('ZOHO accessToken is required.');
}
if (!dataCenter) {
throw new Error('ZOHO dataCenter is required.');
}
if (!refreshAccesTokenFunc) {
throw new Error('ZOHO a refresh access token function is required.');
}
}
buildRequestUrl(endpoint) {
// Ensure endpoint starts with /
const cleanEndpoint = endpoint.startsWith('/') ? endpoint : `/${endpoint}`;
return `${types_1.DATA_CENTRE_BASE_ENDPOINTS_MAP[this.authObject.dataCenter]}${cleanEndpoint}`;
}
getHeaders() {
return {
Authorization: `Zoho-oauthtoken ${this.authObject.accessToken}`,
};
}
// eslint-disable-next-line class-methods-use-this
shouldRetryOnError(response) {
// Retry on 401 (unauthorized) errors for token refresh
return (response.statusCode === 401 &&
response.type === 'application-error' &&
// eslint-disable-next-line @typescript-eslint/no-explicit-any
response.responseBody?.code === 'INVALID_TOKEN');
}
async refreshToken() {
try {
const accessToken = await this.authObject.refreshAccesTokenFunc();
this.authObject.accessToken = accessToken;
}
catch (error) {
throw new Error(`Unable to refresh token, with error: ${error}`);
}
}
async fetchDynamicFields({ moduleName, systemRequiredOnly = false, statTags, }) {
const fieldsApiPath = `/crm/v6/settings/fields?module=${moduleName}`;
const customStatTags = {
...statTags,
endpointPath: `/crm/v6/settings/fields?module=${moduleName}`,
};
const res = await this.executeRequestWithTokenRefreshAttempts('get', fieldsApiPath, undefined, customStatTags);
if (!systemRequiredOnly || res.type === 'application-error' || res.type === 'client-error') {
return res;
}
const { fields } = res.responseBody;
// eslint-disable-next-line @typescript-eslint/no-explicit-any
const systemFields = fields.filter(({ system_mandatory }) => system_mandatory);
return {
...res,
responseBody: {
fields: [...systemFields],
},
};
}
async fetchModules({ upsertOnly = false, statTags, } = {}) {
const objsPath = '/crm/v6/settings/modules';
const customStatTags = {
...statTags,
endpointPath: `/crm/v6/settings/modules`,
};
const res = await this.executeRequestWithTokenRefreshAttempts('get', objsPath, undefined, customStatTags);
if (!upsertOnly || res.type === 'application-error' || res.type === 'client-error') {
return res;
}
const { modules } = res.responseBody;
// eslint-disable-next-line @typescript-eslint/no-explicit-any
const filteredModules = modules.filter(({ api_name }) =>
// eslint-disable-next-line @typescript-eslint/no-explicit-any
types_1.UPSERT_MODULES.some((module) => module === api_name));
const customGeneratedModules = modules.filter(
// eslint-disable-next-line @typescript-eslint/no-explicit-any
(module) => module.generated_type === types_1.CUSTOM_GENERATED_TYPE);
return {
...res,
responseBody: {
modules: [...filteredModules, ...customGeneratedModules],
},
};
}
// Fetches the module wise duplicate check field for a given module name
// If the module is not custom generated, it returns the system defined duplicate check field
static fetchModuleWiseDuplicateCheckField(moduleName) {
const moduleCheckDuplicateField = types_1.MODULE_WISE_DUPLICATE_CHECK_FIELD[moduleName];
if (moduleCheckDuplicateField) {
return [moduleCheckDuplicateField];
}
// We assume that the module is custom generated if the module wise duplicate check field is not found
return [types_1.SYSTEM_DEFINED_DUPLICATE_CHECK_FIELD_FOR_CUSTOM_MODULE];
}
// Fetches the module wise mandatory fields for a given module name
// If the module is not found, it returns an empty array
static fetchModuleWiseMandatoryFields(moduleName) {
if (!types_1.MODULE_MANDATORY_FIELD_CONFIG[moduleName]) {
return [];
}
return types_1.MODULE_MANDATORY_FIELD_CONFIG[moduleName];
}
static getBaseRecordUrl({ dataCenter = 'US', moduleName, }) {
if (!moduleName) {
throw new Error('moduleName is required.');
}
const baseURl = types_1.DATA_CENTRE_BASE_ENDPOINTS_MAP[dataCenter];
return `${baseURl}${(0, types_1.getRecordPath)(moduleName)}`;
}
}
exports.default = ZOHO;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiem9oby5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9zZGtzL3pvaG8vem9oby50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUFBLG1DQWFpQjtBQUVqQixpREFBNkM7QUFFN0MsTUFBcUIsSUFBSyxTQUFRLGtCQUErQjtJQUMvRCxrREFBa0Q7SUFDbEQsa0JBQWtCLENBQUMsVUFBc0I7UUFDdkMsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO1lBQ2hCLE1BQU0sSUFBSSxLQUFLLENBQUMseUJBQXlCLENBQUMsQ0FBQztRQUM3QyxDQUFDO1FBQ0QsTUFBTSxFQUFFLFdBQVcsRUFBRSxVQUFVLEVBQUUscUJBQXFCLEVBQUUsR0FBRyxVQUFVLENBQUM7UUFDdEUsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO1lBQ2pCLE1BQU0sSUFBSSxLQUFLLENBQUMsK0JBQStCLENBQUMsQ0FBQztRQUNuRCxDQUFDO1FBQ0QsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO1lBQ2hCLE1BQU0sSUFBSSxLQUFLLENBQUMsOEJBQThCLENBQUMsQ0FBQztRQUNsRCxDQUFDO1FBQ0QsSUFBSSxDQUFDLHFCQUFxQixFQUFFLENBQUM7WUFDM0IsTUFBTSxJQUFJLEtBQUssQ0FBQyxtREFBbUQsQ0FBQyxDQUFDO1FBQ3ZFLENBQUM7SUFDSCxDQUFDO0lBRVMsZUFBZSxDQUFDLFFBQWdCO1FBQ3hDLGdDQUFnQztRQUNoQyxNQUFNLGFBQWEsR0FBRyxRQUFRLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLElBQUksUUFBUSxFQUFFLENBQUM7UUFDM0UsT0FBTyxHQUFHLHNDQUE4QixDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsVUFBVSxDQUFDLEdBQUcsYUFBYSxFQUFFLENBQUM7SUFDekYsQ0FBQztJQUVTLFVBQVU7UUFDbEIsT0FBTztZQUNMLGFBQWEsRUFBRSxtQkFBbUIsSUFBSSxDQUFD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QUFDO0lBQ2xELENBQUM7Q0FDRjtBQTVKRCx1QkE0SkMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBBdXRoT2JqZWN0LFxuICBEQVRBX0NFTlRSRV9CQVNFX0VORFBPSU5UU19NQVAsXG4gIEZpZWxkLFxuICBNb2R1bGUsXG4gIE1PRFVMRV9XSVNFX0RVUExJQ0FURV9DSEVDS19GSUVMRCxcbiAgQ1VTVE9NX0dFTkVSQVRFRF9UWVBFLFxuICBTWVNURU1fREVGSU5FRF9EVVBMSUNBVEVfQ0hFQ0tfRklFTERfRk9SX0NVU1RPTV9NT0RVTEUsXG4gIFVQU0VSVF9NT0RVTEVTLFxuICBNT0RVTEVfTUFOREFUT1JZX0ZJRUxEX0NPTkZJRyxcbiAgUmVnaW9uS2V5cyxcbiAgZ2V0UmVjb3JkUGF0aCxcbiAgWm9ob0NvbmZpZyxcbn0gZnJvbSAnLi90eXBlcyc7XG5pbXBvcnQgeyBBcGlSZXNwb25zZSwgU3RhdFRhZ3MgfSBmcm9tICcuLi8uLi9uZXR3b3JrL2NsaWVudHMvdHlwZXMnO1xuaW1wb3J0IHsgQmFzZVNESyB9IGZyb20gJy4uL2NvbW1vbi9iYXNlLXNkayc7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFpPSE8gZXh0ZW5kcyBCYXNlU0RLPEF1dGhPYmplY3QsIFpvaG9Db25maWc+IHtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGNsYXNzLW1ldGhvZHMtdXNlLXRoaXNcbiAgdmFsaWRhdGVBdXRoT2JqZWN0KGF1dGhPYmplY3Q6IEF1dGhPYmplY3QpOiB2b2lkIHtcbiAgICBpZiAoIWF1dGhPYmplY3QpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignYXV0aE9iamVjdCBpcyByZXF1aXJlZC4nKTtcbiAgICB9XG4gICAgY29uc3QgeyBhY2Nlc3NUb2tlbiwgZGF0YUNlbnRlciwgcmVmcmVzaEFjY2VzVG9rZW5GdW5jIH0gPSBhdXRoT2JqZWN0O1xuICAgIGlmICghYWNjZXNzVG9rZW4pIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignWk9ITyBhY2Nlc3NUb2tlbiBpcyByZXF1aXJlZC4nKTtcbiAgICB9XG4gICAgaWYgKCFkYXRhQ2VudGVyKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1pPSE8gZGF0YUNlbnRlciBpcyByZXF1aXJlZC4nKTtcbiAgICB9XG4gICAgaWYgKCFyZWZyZXNoQWNjZXNUb2tlbkZ1bmMpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignWk9ITyBhIHJlZnJlc2ggYWNjZXNzIHRva2VuIGZ1bmN0aW9uIGlzIHJlcXVpcmVkLicpO1xuICAgIH1cbiAgfVxuXG4gIHByb3RlY3RlZCBidWlsZFJlcXVlc3RVcmwoZW5kcG9pbnQ6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgLy8gRW5zdXJlIGVuZHBvaW50IHN0YXJ0cyB3aXRoIC9cbiAgICBjb25zdCBjbGVhbkVuZHBvaW50ID0gZW5kcG9pbnQuc3RhcnRzV2l0aCgnLycpID8gZW5kcG9pbnQgOiBgLyR7ZW5kcG9pbnR9YDtcbiAgICByZXR1cm4gYCR7REFUQV9DRU5UUkVfQkFTRV9FTkRQT0lOVFNfTUFQW3RoaXMuYXV0aE9iamVjdC5kYXRhQ2VudGVyXX0ke2NsZWFuRW5kcG9pbnR9YDtcbiAgfVxuXG4gIHByb3RlY3RlZCBnZXRIZWFkZXJzKCk6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4ge1xuICAgIHJldHVybiB7XG4gICAgICBBdXRob3JpemF0aW9uOiBgWm9oby1vYXV0aHRva2VuICR7dGhpcy5hdXRoT2JqZWN0LmFjY2Vzc1Rva2VufWAsXG4gICAgfTtcbiAgfVxuXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBjbGFzcy1tZXRob2RzLXVzZS10aGlzXG4gIHNob3VsZFJldHJ5T25FcnJvcihyZXNwb25zZTogQXBpUmVzcG9uc2U8dW5rbm93bj4pOiBib29sZWFuIHtcbiAgICAvLyBSZXRyeSBvbiA0MDEgKHVuYXV0aG9yaXplZCkgZXJyb3JzIGZvciB0b2tlbiByZWZyZXNoXG4gICAgcmV0dXJuIChcbiAgICAgIHJlc3BvbnNlLnN0YXR1c0NvZGUgPT09IDQwMSAmJlxuICAgICAgcmVzcG9uc2UudHlwZSA9PT0gJ2FwcGxpY2F0aW9uLWVycm9yJyAmJlxuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICAgIChyZXNwb25zZSBhcyBhbnkpLnJlc3BvbnNlQm9keT8uY29kZSA9PT0gJ0lOVkFMSURfVE9LRU4nXG4gICAgKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBhc3luYyByZWZyZXNoVG9rZW4oKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGFjY2Vzc1Rva2VuID0gYXdhaXQgdGhpcy5hdXRoT2JqZWN0LnJlZnJlc2hBY2Nlc1Rva2VuRnVuYygpO1xuICAgICAgdGhpcy5hdXRoT2JqZWN0LmFjY2Vzc1Rva2VuID0gYWNjZXNzVG9rZW47XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgVW5hYmxlIHRvIHJlZnJlc2ggdG9rZW4sIHdpdGggZXJyb3I6ICR7ZXJyb3J9YCk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIGFzeW5jIGZldGNoRHluYW1pY0ZpZWxkcyh7XG4gICAgbW9kdWxlTmFtZSxcbiAgICBzeXN0ZW1SZXF1aXJlZE9ubHkgPSBmYWxzZSxcbiAgICBzdGF0VGFncyxcbiAgfToge1xuICAgIG1vZHVsZU5hbWU6IHN0cmluZztcbiAgICBzeXN0ZW1SZXF1aXJlZE9ubHk/OiBib29sZWFuO1xuICAgIHN0YXRUYWdzPzogU3RhdFRhZ3M7XG4gIH0pOiBQcm9taXNlPEFwaVJlc3BvbnNlPHsgZmllbGRzOiBGaWVsZFtdIH0+PiB7XG4gICAgY29uc3QgZmllbGRzQXBpUGF0aCA9IGAvY3JtL3Y2L3NldHRpbmdzL2ZpZWxkcz9tb2R1bGU9JHttb2R1bGVOYW1lfWA7XG4gICAgY29uc3QgY3VzdG9tU3RhdFRhZ3M6IFN0YXRUYWdzID0ge1xuICAgICAgLi4uc3RhdFRhZ3MsXG4gICAgICBlbmRwb2ludFBhdGg6IGAvY3JtL3Y2L3NldHRpbmdzL2ZpZWxkcz9tb2R1bGU9JHttb2R1bGVOYW1lfWAsXG4gICAgfTtcbiAgICBjb25zdCByZXMgPSBhd2FpdCB0aGlzLmV4ZWN1dGVSZXF1ZXN0V2l0aFRva2VuUmVmcmVzaEF0dGVtcHRzPHsgZmllbGRzOiBGaWVsZFtdIH0+KFxuICAgICAgJ2dldCcsXG4gICAgICBmaWVsZHNBcGlQYXRoLFxuICAgICAgdW5kZWZpbmVkLFxuICAgICAgY3VzdG9tU3RhdFRhZ3MsXG4gICAgKTtcbiAgICBpZiAoIXN5c3RlbVJlcXVpcmVkT25seSB8fCByZXMudHlwZSA9PT0gJ2FwcGxpY2F0aW9uLWVycm9yJyB8fCByZXMudHlwZSA9PT0gJ2NsaWVudC1lcnJvcicpIHtcbiAgICAgIHJldHVybiByZXM7XG4gICAgfVxuICAgIGNvbnN0IHsgZmllbGRzIH0gPSByZXMucmVzcG9uc2VCb2R5O1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICAgY29uc3Qgc3lzdGVtRmllbGRzID0gZmllbGRzLmZpbHRlcigoeyBzeXN0ZW1fbWFuZGF0b3J5IH06IGFueSkgPT4gc3lzdGVtX21hbmRhdG9yeSk7XG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLnJlcyxcbiAgICAgIHJlc3BvbnNlQm9keToge1xuICAgICAgICBmaWVsZHM6IFsuLi5zeXN0ZW1GaWVsZHNdLFxuICAgICAgfSxcbiAgICB9O1xuICB9XG5cbiAgcHVibGljIGFzeW5jIGZldGNoTW9kdWxlcyh7XG4gICAgdXBzZXJ0T25seSA9IGZhbHNlLFxuICAgIHN0YXRUYWdzLFxuICB9OiB7XG4gICAgdXBzZXJ0T25seT86IGJvb2xlYW47XG4gICAgc3RhdFRhZ3M/OiBTdGF0VGFncztcbiAgfSA9IHt9KTogUHJvbWlzZTxBcGlSZXNwb25zZTx7IG1vZHVsZXM6IE1vZHVsZVtdIH0+PiB7XG4gICAgY29uc3Qgb2Jqc1BhdGggPSAnL2NybS92Ni9zZXR0aW5ncy9tb2R1bGVzJztcbiAgICBjb25zdCBjdXN0b21TdGF0VGFnczogU3RhdFRhZ3MgPSB7XG4gICAgICAuLi5zdGF0VGFncyxcbiAgICAgIGVuZHBvaW50UGF0aDogYC9jcm0vdjYvc2V0dGluZ3MvbW9kdWxlc2AsXG4gICAgfTtcbiAgICBjb25zdCByZXMgPSBhd2FpdCB0aGlzLmV4ZWN1dGVSZXF1ZXN0V2l0aFRva2VuUmVmcmVzaEF0dGVtcHRzPHsgbW9kdWxlczogTW9kdWxlW10gfT4oXG4gICAgICAnZ2V0JyxcbiAgICAgIG9ianNQYXRoLFxuICAgICAgdW5kZWZpbmVkLFxuICAgICAgY3VzdG9tU3RhdFRhZ3MsXG4gICAgKTtcbiAgICBpZiAoIXVwc2VydE9ubHkgfHwgcmVzLnR5cGUgPT09ICdhcHBsaWNhdGlvbi1lcnJvcicgfHwgcmVzLnR5cGUgPT09ICdjbGllbnQtZXJyb3InKSB7XG4gICAgICByZXR1cm4gcmVzO1xuICAgIH1cbiAgICBjb25zdCB7IG1vZHVsZXMgfSA9IHJlcy5yZXNwb25zZUJvZHk7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICBjb25zdCBmaWx0ZXJlZE1vZHVsZXMgPSBtb2R1bGVzLmZpbHRlcigoeyBhcGlfbmFtZSB9OiBhbnkpID0+XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICAgICAgVVBTRVJUX01PRFVMRVMuc29tZSgobW9kdWxlOiBhbnkpID0+IG1vZHVsZSA9PT0gYXBpX25hbWUpLFxuICAgICk7XG4gICAgY29uc3QgY3VzdG9tR2VuZXJhdGVkTW9kdWxlcyA9IG1vZHVsZXMuZmlsdGVyKFxuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICAgIChtb2R1bGU6IGFueSkgPT4gbW9kdWxlLmdlbmVyYXRlZF90eXBlID09PSBDVVNUT01fR0VORVJBVEVEX1RZUEUsXG4gICAgKTtcbiAgICByZXR1cm4ge1xuICAgICAgLi4ucmVzLFxuICAgICAgcmVzcG9uc2VCb2R5OiB7XG4gICAgICAgIG1vZHVsZXM6IFsuLi5maWx0ZXJlZE1vZHVsZXMsIC4uLmN1c3RvbUdlbmVyYXRlZE1vZHVsZXNdLFxuICAgICAgfSxcbiAgICB9O1xuICB9XG5cbiAgLy8gRmV0Y2hlcyB0aGUgbW9kdWxlIHdpc2UgZHVwbGljYXRlIGNoZWNrIGZpZWxkIGZvciBhIGdpdmVuIG1vZHVsZSBuYW1lXG4gIC8vIElmIHRoZSBtb2R1bGUgaXMgbm90IGN1c3RvbSBnZW5lcmF0ZWQsIGl0IHJldHVybnMgdGhlIHN5c3RlbSBkZWZpbmVkIGR1cGxpY2F0ZSBjaGVjayBmaWVsZFxuICBwdWJsaWMgc3RhdGljIGZldGNoTW9kdWxlV2lzZUR1cGxpY2F0ZUNoZWNrRmllbGQobW9kdWxlTmFtZTogc3RyaW5nKTogc3RyaW5nW10ge1xuICAgIGNvbnN0IG1vZHVsZUNoZWNrRHVwbGljYXRlRmllbGQgPSBNT0RVTEVfV0lTRV9EVVBMSUNBVEVfQ0hFQ0tfRklFTERbbW9kdWxlTmFtZV07XG4gICAgaWYgKG1vZHVsZUNoZWNrRHVwbGljYXRlRmllbGQpIHtcbiAgICAgIHJldHVybiBbbW9kdWxlQ2hlY2tEdXBsaWNhdGVGaWVsZF07XG4gICAgfVxuICAgIC8vIFdlIGFzc3VtZSB0aGF0IHRoZSBtb2R1bGUgaXMgY3VzdG9tIGdlbmVyYXRlZCBpZiB0aGUgbW9kdWxlIHdpc2UgZHVwbGljYXRlIGNoZWNrIGZpZWxkIGlzIG5vdCBmb3VuZFxuICAgIHJldHVybiBbU1lTVEVNX0RFRklORURfRFVQTElDQVRFX0NIRUNLX0ZJRUxEX0ZPUl9DVVNUT01fTU9EVUxFXTtcbiAgfVxuXG4gIC8vIEZldGNoZXMgdGhlIG1vZHVsZSB3aXNlIG1hbmRhdG9yeSBmaWVsZHMgZm9yIGEgZ2l2ZW4gbW9kdWxlIG5hbWVcbiAgLy8gSWYgdGhlIG1vZHVsZSBpcyBub3QgZm91bmQsIGl0IHJldHVybnMgYW4gZW1wdHkgYXJyYXlcbiAgcHVibGljIHN0YXRpYyBmZXRjaE1vZHVsZVdpc2VNYW5kYXRvcnlGaWVsZHMobW9kdWxlTmFtZTogc3RyaW5nKTogc3RyaW5nW10ge1xuICAgIGlmICghTU9EVUxFX01BTkRBVE9SWV9GSUVMRF9DT05GSUdbbW9kdWxlTmFtZV0pIHtcbiAgICAgIHJldHVybiBbXTtcbiAgICB9XG4gICAgcmV0dXJuIE1PRFVMRV9NQU5EQVRPUllfRklFTERfQ09ORklHW21vZHVsZU5hbWVdO1xuICB9XG5cbiAgcHVibGljIHN0YXRpYyBnZXRCYXNlUmVjb3JkVXJsKHtcbiAgICBkYXRhQ2VudGVyID0gJ1VTJyxcbiAgICBtb2R1bGVOYW1lLFxuICB9OiB7XG4gICAgZGF0YUNlbnRlcj86IFJlZ2lvbktleXM7XG4gICAgbW9kdWxlTmFtZTogc3RyaW5nO1xuICB9KTogc3RyaW5nIHtcbiAgICBpZiAoIW1vZHVsZU5hbWUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignbW9kdWxlTmFtZSBpcyByZXF1aXJlZC4nKTtcbiAgICB9XG4gICAgY29uc3QgYmFzZVVSbCA9IERBVEFfQ0VOVFJFX0JBU0VfRU5EUE9JTlRTX01BUFtkYXRhQ2VudGVyXTtcbiAgICByZXR1cm4gYCR7YmFzZVVSbH0ke2dldFJlY29yZFBhdGgobW9kdWxlTmFtZSl9YDtcbiAgfVxufVxuIl19