@rudderstack/integrations-lib
Version:
A comprehensive TypeScript library providing shared utilities, SDKs, and tools for RudderStack integrations and destinations.
158 lines • 23.2 kB
JavaScript
;
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
var desc = Object.getOwnPropertyDescriptor(m, k);
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
desc = { enumerable: true, get: function() { return m[k]; } };
}
Object.defineProperty(o, k2, desc);
}) : (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
o[k2] = m[k];
}));
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
Object.defineProperty(o, "default", { enumerable: true, value: v });
}) : function(o, v) {
o["default"] = v;
});
var __importStar = (this && this.__importStar) || (function () {
var ownKeys = function(o) {
ownKeys = Object.getOwnPropertyNames || function (o) {
var ar = [];
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
return ar;
};
return ownKeys(o);
};
return function (mod) {
if (mod && mod.__esModule) return mod;
var result = {};
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
__setModuleDefault(result, mod);
return result;
};
})();
Object.defineProperty(exports, "__esModule", { value: true });
const lodash_1 = require("lodash");
const SqlString = __importStar(require("sqlstring"));
const base_sdk_1 = require("../common/base-sdk");
const config_1 = require("./config");
class GoogleAds extends base_sdk_1.BaseSDK {
// eslint-disable-next-line class-methods-use-this
validateAuthObject(authObject) {
if (!authObject.accessToken) {
throw new Error('Google Ads accessToken is required');
}
if (!authObject.customerId) {
throw new Error('Google Ads customerId is required');
}
if (!authObject.developerToken) {
throw new Error('Google Ads developerToken is required');
}
}
// eslint-disable-next-line class-methods-use-this
buildRequestUrl(endpoint) {
// Ensure endpoint starts with /
const cleanEndpoint = endpoint.startsWith('/') ? endpoint : `/${endpoint}`;
return `https://googleads.googleapis.com/${config_1.API_VERSION}/customers${cleanEndpoint}`;
}
getHeaders() {
return {
Authorization: `Bearer ${this.authObject.accessToken}`,
'developer-token': this.authObject.developerToken,
'login-customer-id': this.authObject.loginCustomerId
? this.authObject.loginCustomerId
: this.authObject.customerId,
};
}
async getConversionActionId(conversionName, statTags) {
const queryString = SqlString.format('SELECT conversion_action.id FROM conversion_action WHERE conversion_action.name = ?', [conversionName]);
const data = {
query: queryString,
};
const customStatTags = {
...statTags,
endpointPath: `/<customerId>/googleAds:search`,
};
const searchStreamResponse = await this.post(`/${this.authObject.customerId}/googleAds:searchStream`, data, customStatTags);
if (searchStreamResponse.type === 'success') {
const conversionAction = (0, lodash_1.get)(searchStreamResponse.responseBody[0], 'results.0.conversionAction.resourceName');
return conversionAction ?? null;
}
return searchStreamResponse;
}
async getCustomVariable(statTags) {
const queryString = SqlString.format('SELECT conversion_custom_variable.name FROM conversion_custom_variable');
const data = {
query: queryString,
};
const customStatTags = {
...statTags,
endpointPath: `/<customerId>/googleAds:search`,
};
const searchStreamResponse = await this.post(`/${this.authObject.customerId}/googleAds:searchStream`, data, customStatTags);
if (searchStreamResponse.type === 'success') {
const customVariables = (0, lodash_1.get)(searchStreamResponse.responseBody[0], 'results');
return customVariables;
}
return searchStreamResponse;
}
async addConversionAdjustMent(conversionAdjustMentData, statTags) {
const customStatTags = {
...statTags,
endpointPath: `/<customerId>:uploadConversionAdjustments`,
};
const conversionAdjustMentResponse = await this.post(`/${this.authObject.customerId}:uploadConversionAdjustments`, conversionAdjustMentData, customStatTags);
return conversionAdjustMentResponse;
}
async createOfflineUserDataJob(data, statTags) {
const customStatTags = {
...statTags,
endpointPath: `/<customerId>/offlineUserDataJobs:create`,
};
const conversionAdjustMentResponse = await this.post(`/${this.authObject.customerId}/offlineUserDataJobs:create`, data, customStatTags);
return conversionAdjustMentResponse;
}
async addUserToOfflineUserDataJob(jobId, offlineUserData, statTags) {
const customStatTags = {
...statTags,
endpointPath: `/<customerId>/offlineUserDataJobs/<jobId>:addOperations`,
};
const addUserToJobResponse = await this.post(`/${this.authObject.customerId}/offlineUserDataJobs/${jobId}:addOperations`, offlineUserData, customStatTags);
return addUserToJobResponse;
}
async addConversionsToOfflineUserDataJob(jobId, offlineUserData, statTags) {
const customStatTags = {
...statTags,
endpointPath: `/<customerId>/offlineUserDataJobs/<jobId>:addOperations`,
};
const addUserToJobResponse = await this.post(`/${this.authObject.customerId}/offlineUserDataJobs/${jobId}:addOperations`, offlineUserData, customStatTags);
return addUserToJobResponse;
}
async runOfflineUserDataJob(jobId, statTags) {
const customStatTags = {
...statTags,
endpointPath: `/<customerId>/offlineUserDataJobs/<jobId>:run`,
};
const conversionAdjustMentResponse = await this.post(`/${this.authObject.customerId}/offlineUserDataJobs/${jobId}:run`, {}, customStatTags);
return conversionAdjustMentResponse;
}
async uploadClickConversion(uploadClickConversionData, statTags) {
const customStatTags = {
...statTags,
endpointPath: `/<customerId>:uploadClickConversions`,
};
const uploadClickConversionResponse = await this.post(`/${this.authObject.customerId}:uploadClickConversions`, uploadClickConversionData, customStatTags);
return uploadClickConversionResponse;
}
async uploadCallConversion(uploadCallConversionData, statTags) {
const customStatTags = {
...statTags,
endpointPath: `/<customerId>:uploadCallConversions`,
};
const uploadCallConversionResponse = await this.post(`/${this.authObject.customerId}:uploadCallConversions`, uploadCallConversionData, customStatTags);
return uploadCallConversionResponse;
}
}
exports.default = GoogleAds;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ29vZ2xlQWRzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL3Nka3MvZ29vZ2xlQWRzUmVzdEFQSS9nb29nbGVBZHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSxtQ0FBNkI7QUFDN0IscURBQXVDO0FBRXZDLGlEQUE2QztBQUM3QyxxQ0FBdUM7QUFvQnZDLE1BQXFCLFNBQVUsU0FBUSxrQkFBb0M7SUFDekUsa0RBQWtEO0lBQ2xELGtCQUFrQixDQUFDLFVBQXNCO1FBQ3ZDLElBQUksQ0FBQyxVQUFVLENBQUMsV0FBVyxFQUFFLENBQUM7WUFDNUIsTUFBTSxJQUFJLEtBQUssQ0FBQyxvQ0FBb0MsQ0FBQyxDQUFDO1FBQ3hELENBQUM7UUFDRCxJQUFJLENBQUMsVUFBVSxDQUFDLFVBQVUsRUFBRSxDQUFDO1lBQzNCLE1BQU0sSUFBSSxLQUFLLENBQUMsbUNBQW1DLENBQUMsQ0FBQztRQUN2RCxDQUFDO1FBQ0QsSUFBSSxDQUFDLFVBQVUsQ0FBQyxjQUFjLEVBQUUsQ0FBQztZQUMvQixNQUFNLElBQUksS0FBSyxDQUFDLHVDQUF1QyxDQUFDLENBQUM7UUFDM0QsQ0FBQztJQUNILENBQUM7SUFFRCxrREFBa0Q7SUFDeEMsZUFBZSxDQUFDLFFBQWdCO1FBQ3hDLGdDQUFnQztRQUNoQyxNQUFNLGFBQWEsR0FBRyxRQUFRLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLElBQUksUUFBUSxFQUFFLENBQUM7UUFDM0UsT0FBTyxvQ0FBb0Msb0JBQVcsYUFBYSxhQUFhLEVBQUUsQ0FBQztJQUNyRixDQUFDO0lBRVMsVUFBVTtRQUNsQixPQUFPO1lBQ0wsYUFBYSxFQUFFLFVBQVUsSUFBSSxDQUFDLFVBQVUsQ0FBQyxXQUFXLEVBQUU7WUFDdEQsaUJBQWlCLEVBQUUsSUFBSSxDQUFDLFVBQVUsQ0FBQyxj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LE1BQU0sY0FBYyxHQUFhO1lBQy9CLEdBQUcsUUFBUTtZQUNYLFlBQVksRUFBRSxzQ0FBc0M7U0FDckQsQ0FBQztRQUNGLE1BQU0sNkJBQTZCLEdBQUcsTUFBTSxJQUFJLENBQUMsSUFBSSxDQUNuRCxJQUFJLElBQUksQ0FBQyxVQUFVLENBQUMsVUFBVSx5QkFBeUIsRUFDdkQseUJBQXlCLEVBQ3pCLGNBQWMsQ0FDZixDQUFDO1FBRUYsT0FBTyw2QkFBNkIsQ0FBQztJQUN2QyxDQUFDO0lBRU0sS0FBSyxDQUFDLG9CQUFvQixDQUMvQix3QkFBNEMsRUFDNUMsUUFBbUI7UUFFbkIsTUFBTSxjQUFjLEdBQWE7WUFDL0IsR0FBRyxRQUFRO1lBQ1gsWUFBWSxFQUFFLHFDQUFxQztTQUNwRCxDQUFDO1FBQ0YsTUFBTSw0QkFBNEIsR0FBRyxNQUFNLElBQUksQ0FBQyxJQUFJLENBQ2xELElBQUksSUFBSSxDQUFDLFVBQVUsQ0FBQyxVQUFVLHdCQUF3QixFQUN0RCx3QkFBd0IsRUFDeEIsY0FBYyxDQUNmLENBQUM7UUFFRixPQUFPLDRCQUE0QixDQUFDO0lBQ3RDLENBQUM7Q0FDRjtBQXpNRCw0QkF5TUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBnZXQgfSBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0ICogYXMgU3FsU3RyaW5nIGZyb20gJ3NxbHN0cmluZyc7XG5pbXBvcnQgeyBBcGlSZXNwb25zZSwgU3RhdFRhZ3MgfSBmcm9tICcuLi8uLi9uZXR3b3JrL2NsaWVudHMvdHlwZXMnO1xuaW1wb3J0IHsgQmFzZVNESyB9IGZyb20gJy4uL2NvbW1vbi9iYXNlLXNkayc7XG5pbXBvcnQgeyBBUElfVkVSU0lPTiB9IGZyb20gJy4vY29uZmlnJztcbmltcG9ydCB7XG4gIEF1dGhPYmplY3QsXG4gIENhbGxDb252ZXJzaW9uRGF0YSxcbiAgQ2FsbENvbnZlcnNpb25SZXNwb25zZSxcbiAgQ2xpY2tDb252ZXJzaW9uRGF0YSxcbiAgQ2xpY2tDb252ZXJzaW9uUmVzcG9uc2UsXG4gIENvbnZlcnNpb25BY3Rpb25SZXNwb25zZSxcbiAgQ29udmVyc2lvbkFkanVzdG1lbnREYXRhLFxuICBDb252ZXJzaW9uQWRqdXN0bWVudFJlc3BvbnNlLFxuICBDcmVhdGVPZmZsaW5lVXNlckRhdGFKb2JEYXRhLFxuICBDcmVhdGVPZmZsaW5lVXNlckRhdGFKb2JSZXNwb3NlLFxuICBDdXN0b21WYXJpYWJsZVJlc3VsdHMsXG4gIEdvb2dsZUFkc0NvbmZpZyxcbiAgT2ZmbGluZVVzZXJEYXRhSm9iQWRkRGF0YSxcbiAgT2ZmbGluZVVzZXJEYXRhSm9iQWRkRGF0YVJlc3BvbnNlLFxuICBSdW5PZmZsaW5lVXNlckRhdGFKb2JSZXNwb25zZSxcbiAgU2VhcmNoU3RyZWFtUmVzcG9uc2UsXG59IGZyb20gJy4vdHlwZXMnO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBHb29nbGVBZHMgZXh0ZW5kcyBCYXNlU0RLPEF1dGhPYmplY3QsIEdvb2dsZUFkc0NvbmZpZz4ge1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgY2xhc3MtbWV0aG9kcy11c2UtdGhpc1xuICB2YWxpZGF0ZUF1dGhPYmplY3QoYXV0aE9iamVjdDogQXV0aE9iamVjdCk6IHZvaWQge1xuICAgIGlmICghYXV0aE9iamVjdC5hY2Nlc3NUb2tlbikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdHb29nbGUgQWRzIGFjY2Vzc1Rva2VuIGlzIHJlcXVpcmVkJyk7XG4gICAgfVxuICAgIGlmICghYXV0aE9iamVjdC5jdXN0b21lcklkKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0dvb2dsZSBBZHMgY3VzdG9tZXJJZCBpcyByZXF1aXJlZCcpO1xuICAgIH1cbiAgICBpZiAoIWF1dGhPYmplY3QuZGV2ZWxvcGVyVG9rZW4pIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignR29vZ2xlIEFkcyBkZXZlbG9wZXJUb2tlbiBpcyByZXF1aXJlZCcpO1xuICAgIH1cbiAgfVxuXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBjbGFzcy1tZXRob2RzLXVzZS10aGlzXG4gIHByb3RlY3RlZCBidWlsZFJlcXVlc3RVcmwoZW5kcG9pbnQ6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgLy8gRW5zdXJlIGVuZHBvaW50IHN0YXJ0cyB3aXRoIC9cbiAgICBjb25zdCBjbGVhbkVuZHBvaW50ID0gZW5kcG9pbnQuc3RhcnRzV2l0aCgnLycpID8gZW5kcG9pbnQgOiBgLyR7ZW5kcG9pbnR9YDtcbiAgICByZXR1cm4gYGh0dHBzOi8vZ29vZ2xlYWRzLmdvb2dsZWFwaXMuY29tLyR7QVBJX1ZFUlNJT059L2N1c3RvbWVycyR7Y2xlYW5FbmRwb2ludH1gO1xuICB9XG5cbiAgcHJvdGVjdGVkIGdldEhlYWRlcnMoKTogUmVjb3JkPHN0cmluZywgc3RyaW5nPiB7XG4gICAgcmV0dXJuIHtcbiAgICAgIEF1dGhvcml6YXRpb246IGBCZWFyZXIgJHt0aGlzLmF1dGhPYmplY3QuYWNjZXNzVG9rZW59YCxcbiAgICAgICdkZXZlbG9wZXItdG9rZW4nOiB0aGlzLmF1dGhPYmplY3QuZGV2ZWxvcGVyVG9rZW4sXG4gICAgICAnbG9naW4tY3VzdG9tZXItaWQnOiB0aGlzLmF1dGhPYmplY3QubG9naW5DdXN0b21lcklkXG4gICAgICAgID8gdGhpcy5hdXRoT2JqZWN0LmxvZ2luQ3VzdG9tZXJJZFxuICAgICAgICA6IHRoaXMuYXV0aE9iamVjdC5jdXN0b21lcklkLFxuICAgIH07XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgZ2V0Q29udmVyc2lvbkFjdGlvbklkKFxuICAgIGNvbnZlcnNpb25OYW1lOiBzdHJpbmcsXG4gICAgc3RhdFRhZ3M/OiBTdGF0VGFncyxcbiAgKTogUHJvbWlzZTxzdHJpbmcgfCBBcGlSZXNwb25zZTxBcnJheTxTZWFyY2hTdHJlYW1SZXNwb25zZTxDb252ZXJzaW9uQWN0aW9uUmVzcG9uc2U+Pj4+IHtcbiAgICBjb25zdCBxdWVyeVN0cmluZyA9IFNxbFN0cmluZy5mb3JtYXQoXG4gICAgICAnU0VMRUNUIGNvbnZlcnNpb25fYWN0aW9uLmlkIEZST00gY29udmVyc2lvbl9hY3Rpb24gV0hFUkUgY29udmVyc2lvbl9hY3Rpb24ubmFtZSA9ID8nLFxuICAgICAgW2NvbnZlcnNpb25OYW1lXSxcbiAgICApO1xuICAgIGNvbnN0IGRhdGE6IHsgcXVlcnk6IHN0cmluZyB9ID0ge1xuICAgICAgcXVlcnk6IHF1ZXJ5U3RyaW5nLFxuICAgIH07XG5cbiAgICBjb25zdCBjdXN0b21TdGF0VGFnczogU3RhdFRhZ3MgPSB7XG4gICAgICAuLi5zdGF0VGFncyxcbiAgICAgIGVuZHBvaW50UGF0aDogYC88Y3VzdG9tZXJJZD4vZ29vZ2xlQWRzOnNlYXJjaGAsXG4gICAgfTtcbiAgICBjb25zdCBzZWFyY2hTdHJlYW1SZXNwb25zZSA9IGF3YWl0IHRoaXMucG9zdDxcbiAgICAgIEFycmF5PFNlYXJjaFN0cmVhbVJlc3BvbnNlPENvbnZlcnNpb25BY3Rpb25SZXNwb25zZT4+XG4gICAgPihgLyR7dGhpcy5hdXRoT2JqZWN0LmN1c3RvbWVySWR9L2dvb2dsZUFkczpzZWFyY2hTdHJlYW1gLCBkYXRhLCBjdXN0b21TdGF0VGFncyk7XG4gICAgaWYgKHNlYXJjaFN0cmVhbVJlc3BvbnNlLnR5cGUgPT09ICdzdWNjZXNzJykge1xuICAgICAgY29uc3QgY29udmVyc2lvbkFjdGlvbiA9IGdldChcbiAgICAgICAgc2VhcmNoU3RyZWFtUmVzcG9uc2UucmVzcG9uc2VCb2R5WzBdLFxuICAgICAgICAncmVzdWx0cy4wLmNvbnZlcnNpb25BY3Rpb24ucmVzb3VyY2VOYW1lJyxcbiAgICAgICk7XG4gICAgICByZXR1cm4gY29udmVyc2lvbkFjdGlvbiA/PyBudWxsO1xuICAgIH1cbiAgICByZXR1cm4gc2VhcmNoU3RyZWFtUmVzcG9uc2U7XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgZ2V0Q3VzdG9tVmFyaWFibGUoXG4gICAgc3RhdFRhZ3M/OiBTdGF0VGFncyxcbiAgKTogUHJvbWlzZTxcbiAgICBDdXN0b21WYXJpYWJsZVJlc3VsdHNbXSB8IEFwaVJlc3BvbnNlPEFycmF5PFNlYXJjaFN0cmVhbVJlc3BvbnNlPEN1c3RvbVZhcmlhYmxlUmVzdWx0cz4+PlxuICA+IHtcbiAgICBjb25zdCBxdWVyeVN0cmluZyA9IFNxbFN0cmluZy5mb3JtYXQoXG4gICAgICAnU0VMRUNUIGNvbnZlcnNpb25fY3VzdG9tX3ZhcmlhYmxlLm5hbWUgRlJPTSBjb252ZXJzaW9uX2N1c3RvbV92YXJpYWJsZScsXG4gICAgKTtcbiAgICBjb25zdCBkYXRhOiB7IHF1ZXJ5OiBzdHJpbmcgfSA9IHtcbiAgICAgIHF1ZXJ5OiBxdWVyeVN0cmluZyxcbiAgICB9O1xuXG4gICAgY29uc3QgY3VzdG9tU3RhdFRhZ3M6IFN0YXRUYWdzID0ge1xuICAgICAgLi4uc3RhdFRhZ3MsXG4gICAgICBlbmRwb2ludFBhdGg6IGAvPGN1c3RvbWVySWQ+L2dvb2dsZUFkczpzZWFyY2hgLFxuICAgIH07XG4gICAgY29uc3Qgc2VhcmNoU3RyZWFtUmVzcG9uc2UgPSBhd2FpdCB0aGlzLnBvc3Q8XG4gICAgICBBcnJheTxTZWFyY2hTdHJlYW1SZXNwb25zZTxDdXN0b21WYXJpYWJsZVJlc3VsdHM+PlxuICAgID4oYC8ke3RoaXMuYXV0aE9iamVjdC5jdXN0b21lcklkfS9nb29nbGVBZHM6c2VhcmNoU3RyZWFtYCwgZGF0YSwgY3VzdG9tU3RhdFRhZ3MpO1xuICAgIGlmIChzZWFyY2hTdHJlYW1SZXNwb25zZS50eXBlID09PSAnc3VjY2VzcycpIHtcbiAgICAgIGNvbnN0IGN1c3RvbVZhcmlhYmxlcyA9IGdldChzZWFyY2hTdHJlYW1SZXNwb25zZS5yZXNwb25zZUJvZHlbMF0sICdyZXN1bHRzJyk7XG4gICAgICByZXR1cm4gY3VzdG9tVmFyaWFibGVzO1xuICAgIH1cbiAgICByZXR1cm4gc2VhcmNoU3RyZWFtUmVzcG9uc2U7XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgYWRkQ29udmVyc2lvbkFkanVzdE1lbnQoXG4gICAgY29udmVyc2lvbkFkanVzdE1lbnREYXRhOiBDb252ZXJzaW9uQWRqdXN0bWVudERhdGEsXG4gICAgc3RhdFRhZ3M/OiBTdGF0VGFncyxcbiAgKTogUHJvbWlzZTxBcGlSZXNwb25zZTxDb252ZXJzaW9uQWRqdXN0bWVudFJlc3BvbnNlPj4ge1xuICAgIGNvbnN0IGN1c3RvbVN0YXRUYWdzOiBTdGF0VGFncyA9IHtcbiAgICAgIC4uLnN0YXRUYWdzLFxuICAgICAgZW5kcG9pbnRQYXRoOiBgLzxjdXN0b21lcklkPjp1cGxvYWRDb252ZXJzaW9uQWRqdXN0bWVudHNgLFxuICAgIH07XG4gICAgY29uc3QgY29udmVyc2lvbkFkanVzdE1lbnRSZXNwb25zZSA9IGF3YWl0IHRoaXMucG9zdDxDb252ZXJzaW9uQWRqdXN0bWVudFJlc3BvbnNlPihcbiAgICAgIGAvJHt0aGlzLmF1dGhPYmplY3QuY3VzdG9tZXJJZH06dXBsb2FkQ29udmVyc2lvbkFkanVzdG1lbnRzYCxcbiAgICAgIGNvbnZlcnNpb25BZGp1c3RNZW50RGF0YSxcbiAgICAgIGN1c3RvbVN0YXRUYWdzLFxuICAgICk7XG4gICAgcmV0dXJuIGNvbnZlcnNpb25BZGp1c3RNZW50UmVzcG9uc2U7XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgY3JlYXRlT2ZmbGluZVVzZXJEYXRhSm9iKFxuICAgIGRhdGE6IENyZWF0ZU9mZmxpbmVVc2VyRGF0YUpvYkRhdGEsXG4gICAgc3RhdFRhZ3M/OiBTdGF0VGFncyxcbiAgKTogUHJvbWlzZTxBcGlSZXNwb25zZTxDcmVhdGVPZmZsaW5lVXNlckRhdGFKb2JSZXNwb3NlPj4ge1xuICAgIGNvbnN0IGN1c3RvbVN0YXRUYWdzOiBTdGF0VGFncyA9IHtcbiAgICAgIC4uLnN0YXRUYWdzLFxuICAgICAgZW5kcG9pbnRQYXRoOiBgLzxjdXN0b21lcklkPi9vZmZsaW5lVXNlckRhdGFKb2JzOmNyZWF0ZWAsXG4gICAgfTtcbiAgICBjb25zdCBjb252ZXJzaW9uQWRqdXN0TWVudFJlc3BvbnNlID0gYXdhaXQgdGhpcy5wb3N0PENyZWF0ZU9mZmxpbmVVc2VyRGF0YUpvYlJlc3Bvc2U+KFxuICAgICAgYC8ke3RoaXMuYXV0aE9iamVjdC5jdXN0b21lcklkfS9vZmZsaW5lVXNlckRhdGFKb2JzOmNyZWF0ZWAsXG4gICAgICBkYXRhLFxuICAgICAgY3VzdG9tU3RhdFRhZ3MsXG4gICAgKTtcbiAgICByZXR1cm4gY29udmVyc2lvbkFkanVzdE1lbnRSZXNwb25zZTtcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBhZGRVc2VyVG9PZmZsaW5lVXNlckRhdGFKb2IoXG4gICAgam9iSWQ6IHN0cmluZyxcbiAgICBvZmZsaW5lVXNlckRhdGE6IE9mZmxpbmVVc2VyRGF0YUpvYkFkZERhdGEsXG4gICAgc3RhdFRhZ3M/OiBTdGF0VGFncyxcbiAgKSB7XG4gICAgY29uc3QgY3VzdG9tU3RhdFRhZ3M6IFN0YXRUYWdzID0ge1xuICAgICAgLi4uc3RhdFRhZ3MsXG4gICAgICBlbmRwb2ludFBhdGg6IGAvPGN1c3RvbWVySWQ+L29mZmxpbmVVc2VyRGF0YUpvYnMvPGpvYklkPjphZGRPcGVyYXRpb25zYCxcbiAgICB9O1xuICAgIGNvbnN0IGFkZFVzZXJUb0pvYlJlc3BvbnNlID0gYXdhaXQgdGhpcy5wb3N0PE9mZmxpbmVVc2VyRGF0YUpvYkFkZERhdGFSZXNwb25zZT4oXG4gICAgICBgLyR7dGhpcy5hdXRoT2JqZWN0LmN1c3RvbWVySWR9L29mZmxpbmVVc2VyRGF0YUpvYnMvJHtqb2JJZH06YWRkT3BlcmF0aW9uc2AsXG4gICAgICBvZmZsaW5lVXNlckRhdGEsXG4gICAgICBjdXN0b21TdGF0VGFncyxcbiAgICApO1xuICAgIHJldHVybiBhZGRVc2VyVG9Kb2JSZXNwb25zZTtcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBhZGRDb252ZXJzaW9uc1RvT2ZmbGluZVVzZXJEYXRhSm9iKFxuICAgIGpvYklkOiBzdHJpbmcsXG4gICAgb2ZmbGluZVVzZXJEYXRhOiBPZmZsaW5lVXNlckRhdGFKb2JBZGREYXRhLFxuICAgIHN0YXRUYWdzPzogU3RhdFRhZ3MsXG4gICkge1xuICAgIGNvbnN0IGN1c3RvbVN0YXRUYWdzOiBTdGF0VGFncyA9IHtcbiAgICAgIC4uLnN0YXRUYWdzLFxuICAgICAgZW5kcG9pbnRQYXRoOiBgLzxjdXN0b21lcklkPi9vZmZsaW5lVXNlckRhdGFKb2JzLzxqb2JJZD46YWRkT3BlcmF0aW9uc2AsXG4gICAgfTtcbiAgICBjb25zdCBhZGRVc2VyVG9Kb2JSZXNwb25zZSA9IGF3YWl0IHRoaXMucG9zdDxPZmZsaW5lVXNlckRhdGFKb2JBZGREYXRhUmVzcG9uc2U+KFxuICAgICAgYC8ke3RoaXMuYXV0aE9iamVjdC5jdXN0b21lcklkfS9vZmZsaW5lVXNlckRhdGFKb2JzLyR7am9iSWR9OmFkZE9wZXJhdGlvbnNgLFxuICAgICAgb2ZmbGluZVVzZXJEYXRhLFxuICAgICAgY3VzdG9tU3RhdFRhZ3MsXG4gICAgKTtcbiAgICByZXR1cm4gYWRkVXNlclRvSm9iUmVzcG9uc2U7XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgcnVuT2ZmbGluZVVzZXJEYXRhSm9iKFxuICAgIGpvYklkOiBzdHJpbmcsXG4gICAgc3RhdFRhZ3M/OiBTdGF0VGFncyxcbiAgKTogUHJvbWlzZTxBcGlSZXNwb25zZTxSdW5PZmZsaW5lVXNlckRhdGFKb2JSZXNwb25zZT4+IHtcbiAgICBjb25zdCBjdXN0b21TdGF0VGFnczogU3RhdFRhZ3MgPSB7XG4gICAgICAuLi5zdGF0VGFncyxcbiAgICAgIGVuZHBvaW50UGF0aDogYC88Y3VzdG9tZXJJZD4vb2ZmbGluZVVzZXJEYXRhSm9icy88am9iSWQ+OnJ1bmAsXG4gICAgfTtcbiAgICBjb25zdCBjb252ZXJzaW9uQWRqdXN0TWVudFJlc3BvbnNlID0gYXdhaXQgdGhpcy5wb3N0PFJ1bk9mZmxpbmVVc2VyRGF0YUpvYlJlc3BvbnNlPihcbiAgICAgIGAvJHt0aGlzLmF1dGhPYmplY3QuY3VzdG9tZXJJZH0vb2ZmbGluZVVzZXJEYXRhSm9icy8ke2pvYklkfTpydW5gLFxuICAgICAge30sXG4gICAgICBjdXN0b21TdGF0VGFncyxcbiAgICApO1xuICAgIHJldHVybiBjb252ZXJzaW9uQWRqdXN0TWVudFJlc3BvbnNlO1xuICB9XG5cbiAgcHVibGljIGFzeW5jIHVwbG9hZENsaWNrQ29udmVyc2lvbihcbiAgICB1cGxvYWRDbGlja0NvbnZlcnNpb25EYXRhOiBDbGlja0NvbnZlcnNpb25EYXRhLFxuICAgIHN0YXRUYWdzPzogU3RhdFRhZ3MsXG4gICk6IFByb21pc2U8QXBpUmVzcG9uc2U8Q2xpY2tDb252ZXJzaW9uUmVzcG9uc2U+PiB7XG4gICAgY29uc3QgY3VzdG9tU3RhdFRhZ3M6IFN0YXRUYWdzID0ge1xuICAgICAgLi4uc3RhdFRhZ3MsXG4gICAgICBlbmRwb2ludFBhdGg6IGAvPGN1c3RvbWVySWQ+OnVwbG9hZENsaWNrQ29udmVyc2lvbnNgLFxuICAgIH07XG4gICAgY29uc3QgdXBsb2FkQ2xpY2tDb252ZXJzaW9uUmVzcG9uc2UgPSBhd2FpdCB0aGlzLnBvc3Q8Q2xpY2tDb252ZXJzaW9uUmVzcG9uc2U+KFxuICAgICAgYC8ke3RoaXMuYXV0aE9iamVjdC5jdXN0b21lcklkfTp1cGxvYWRDbGlja0NvbnZlcnNpb25zYCxcbiAgICAgIHVwbG9hZENsaWNrQ29udmVyc2lvbkRhdGEsXG4gICAgICBjdXN0b21TdGF0VGFncyxcbiAgICApO1xuXG4gICAgcmV0dXJuIHVwbG9hZENsaWNrQ29udmVyc2lvblJlc3BvbnNlO1xuICB9XG5cbiAgcHVibGljIGFzeW5jIHVwbG9hZENhbGxDb252ZXJzaW9uKFxuICAgIHVwbG9hZENhbGxDb252ZXJzaW9uRGF0YTogQ2FsbENvbnZlcnNpb25EYXRhLFxuICAgIHN0YXRUYWdzPzogU3RhdFRhZ3MsXG4gICk6IFByb21pc2U8QXBpUmVzcG9uc2U8Q2FsbENvbnZlcnNpb25SZXNwb25zZT4+IHtcbiAgICBjb25zdCBjdXN0b21TdGF0VGFnczogU3RhdFRhZ3MgPSB7XG4gICAgICAuLi5zdGF0VGFncyxcbiAgICAgIGVuZHBvaW50UGF0aDogYC88Y3VzdG9tZXJJZD46dXBsb2FkQ2FsbENvbnZlcnNpb25zYCxcbiAgICB9O1xuICAgIGNvbnN0IHVwbG9hZENhbGxDb252ZXJzaW9uUmVzcG9uc2UgPSBhd2FpdCB0aGlzLnBvc3Q8Q2FsbENvbnZlcnNpb25SZXNwb25zZT4oXG4gICAgICBgLyR7dGhpcy5hdXRoT2JqZWN0LmN1c3RvbWVySWR9OnVwbG9hZENhbGxDb252ZXJzaW9uc2AsXG4gICAgICB1cGxvYWRDYWxsQ29udmVyc2lvbkRhdGEsXG4gICAgICBjdXN0b21TdGF0VGFncyxcbiAgICApO1xuXG4gICAgcmV0dXJuIHVwbG9hZENhbGxDb252ZXJzaW9uUmVzcG9uc2U7XG4gIH1cbn1cbiJdfQ==