@spartacus/core
Version:
Spartacus - the core framework
172 lines • 24.3 kB
JavaScript
import { HttpParams } from '@angular/common/http';
import { Injectable, isDevMode, Optional } from '@angular/core';
import { StringTemplate } from '../../config/utils/string-template';
import { getContextParameterDefault } from '../../site-context/config/context-config-utils';
import { BASE_SITE_CONTEXT_ID } from '../../site-context/providers/context-ids';
import { HttpParamsURIEncoder } from '../../util/http-params-uri.encoder';
import { DEFAULT_SCOPE } from '../occ-models/occ-endpoints.model';
import { urlPathJoin } from '../utils/occ-url-util';
import * as i0 from "@angular/core";
import * as i1 from "../config/occ-config";
import * as i2 from "../../site-context/facade/base-site.service";
export class OccEndpointsService {
constructor(config, baseSiteService) {
this.config = config;
this.baseSiteService = baseSiteService;
if (this.baseSiteService) {
this.baseSiteService
.getActive()
.subscribe((value) => (this._activeBaseSite = value));
}
}
get activeBaseSite() {
var _a;
return ((_a = this._activeBaseSite) !== null && _a !== void 0 ? _a : getContextParameterDefault(this.config, BASE_SITE_CONTEXT_ID));
}
/**
* Returns the value configured for a specific endpoint
*
* @param endpointKey the configuration key for the endpoint to return
* @param scope endpoint configuration scope
*/
getRawEndpointValue(endpoint, scope) {
const endpointValue = this.getEndpointForScope(endpoint, scope);
return endpointValue;
}
/**
* Returns true when the endpoint is configured
*
* @param endpointKey the configuration key for the endpoint to return
* @param scope endpoint configuration scope
*/
isConfigured(endpoint, scope) {
return !(typeof this.getEndpointFromConfig(endpoint, scope) === 'undefined');
}
/**
* Returns base OCC endpoint (baseUrl + prefix + baseSite) base on provided values
*
* @param baseUrlProperties Specify properties to not add to the url (baseUrl, prefix, baseSite)
*/
getBaseUrl(baseUrlProperties = {
baseUrl: true,
prefix: true,
baseSite: true,
}) {
var _a, _b, _c, _d;
const baseUrl = baseUrlProperties.baseUrl === false
? ''
: (_d = (_c = (_b = (_a = this.config) === null || _a === void 0 ? void 0 : _a.backend) === null || _b === void 0 ? void 0 : _b.occ) === null || _c === void 0 ? void 0 : _c.baseUrl) !== null && _d !== void 0 ? _d : '';
const prefix = baseUrlProperties.prefix === false ? '' : this.getPrefix();
const baseSite = baseUrlProperties.baseSite === false ? '' : this.activeBaseSite;
return urlPathJoin(baseUrl, prefix, baseSite);
}
/**
* Returns a fully qualified OCC Url
*
* @param endpoint Name of the OCC endpoint key
* @param attributes Dynamic attributes used to build the url
* @param propertiesToOmit Specify properties to not add to the url (baseUrl, prefix, baseSite)
*/
buildUrl(endpoint, attributes, propertiesToOmit) {
let url = this.getEndpointForScope(endpoint, attributes === null || attributes === void 0 ? void 0 : attributes.scope);
if (attributes) {
const { urlParams, queryParams } = attributes;
if (urlParams) {
url = StringTemplate.resolve(url, attributes.urlParams, true);
}
if (queryParams) {
let httpParamsOptions = { encoder: new HttpParamsURIEncoder() };
if (url.includes('?')) {
let queryParamsFromEndpoint;
[url, queryParamsFromEndpoint] = url.split('?');
httpParamsOptions = Object.assign(Object.assign({}, httpParamsOptions), { fromString: queryParamsFromEndpoint });
}
let httpParams = new HttpParams(httpParamsOptions);
Object.keys(queryParams).forEach((key) => {
const value = queryParams[key];
if (value !== undefined) {
if (value === null) {
httpParams = httpParams.delete(key);
}
else {
httpParams = httpParams.set(key, value);
}
}
});
const params = httpParams.toString();
if (params.length) {
url += '?' + params;
}
}
}
return this.buildUrlFromEndpointString(url, propertiesToOmit);
}
getEndpointFromConfig(endpoint, scope) {
var _a, _b;
const endpointsConfig = (_b = (_a = this.config.backend) === null || _a === void 0 ? void 0 : _a.occ) === null || _b === void 0 ? void 0 : _b.endpoints;
if (!endpointsConfig) {
return undefined;
}
const endpointConfig = endpointsConfig[endpoint];
if (scope) {
if (scope === DEFAULT_SCOPE && typeof endpointConfig === 'string') {
return endpointConfig;
}
return endpointConfig === null || endpointConfig === void 0 ? void 0 : endpointConfig[scope];
}
return typeof endpointConfig === 'string'
? endpointConfig
: endpointConfig === null || endpointConfig === void 0 ? void 0 : endpointConfig[DEFAULT_SCOPE];
}
// TODO: Can we reuse getEndpointFromConfig in this method? Should we change behavior of this function?
getEndpointForScope(endpoint, scope) {
var _a, _b;
const endpointsConfig = (_b = (_a = this.config.backend) === null || _a === void 0 ? void 0 : _a.occ) === null || _b === void 0 ? void 0 : _b.endpoints;
if (!Boolean(endpointsConfig)) {
return '';
}
const endpointConfig = endpointsConfig[endpoint];
if (scope) {
if (endpointConfig === null || endpointConfig === void 0 ? void 0 : endpointConfig[scope]) {
return endpointConfig === null || endpointConfig === void 0 ? void 0 : endpointConfig[scope];
}
if (scope === DEFAULT_SCOPE && typeof endpointConfig === 'string') {
return endpointConfig;
}
if (isDevMode()) {
console.warn(`${endpoint} endpoint configuration missing for scope "${scope}"`);
}
}
return ((typeof endpointConfig === 'string'
? endpointConfig
: endpointConfig === null || endpointConfig === void 0 ? void 0 : endpointConfig[DEFAULT_SCOPE]) || endpoint);
}
/**
* Add the base OCC url properties to the specified endpoint string
*
* @param endpointString String value for the url endpoint
* @param propertiesToOmit Specify properties to not add to the url (baseUrl, prefix, baseSite)
*/
buildUrlFromEndpointString(endpointString, propertiesToOmit) {
return urlPathJoin(this.getBaseUrl(propertiesToOmit), endpointString);
}
getPrefix() {
var _a, _b, _c, _d, _e, _f, _g;
if (((_c = (_b = (_a = this.config) === null || _a === void 0 ? void 0 : _a.backend) === null || _b === void 0 ? void 0 : _b.occ) === null || _c === void 0 ? void 0 : _c.prefix) &&
!this.config.backend.occ.prefix.startsWith('/')) {
return '/' + this.config.backend.occ.prefix;
}
return (_g = (_f = (_e = (_d = this.config) === null || _d === void 0 ? void 0 : _d.backend) === null || _e === void 0 ? void 0 : _e.occ) === null || _f === void 0 ? void 0 : _f.prefix) !== null && _g !== void 0 ? _g : '';
}
}
OccEndpointsService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.0.5", ngImport: i0, type: OccEndpointsService, deps: [{ token: i1.OccConfig }, { token: i2.BaseSiteService, optional: true }], target: i0.ɵɵFactoryTarget.Injectable });
OccEndpointsService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "12.0.5", ngImport: i0, type: OccEndpointsService, providedIn: 'root' });
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.0.5", ngImport: i0, type: OccEndpointsService, decorators: [{
type: Injectable,
args: [{
providedIn: 'root',
}]
}], ctorParameters: function () { return [{ type: i1.OccConfig }, { type: i2.BaseSiteService, decorators: [{
type: Optional
}] }]; } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib2NjLWVuZHBvaW50cy5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvY29yZS9zcmMvb2NjL3NlcnZpY2VzL29jYy1lbmRwb2ludHMuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDbEQsT0FBTyxFQUFFLFVBQVUsRUFBRSxTQUFTLEVBQUUsUUFBUSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ2hFLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxvQ0FBb0MsQ0FBQztBQUNwRSxPQUFPLEVBQUUsMEJBQTBCLEVBQUUsTUFBTSxnREFBZ0QsQ0FBQztBQUU1RixPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSwwQ0FBMEMsQ0FBQztBQUNoRixPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxvQ0FBb0MsQ0FBQztBQUUxRSxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sbUNBQW1DLENBQUM7QUFDbEUsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLHVCQUF1QixDQUFDOzs7O0FBaUJwRCxNQUFNLE9BQU8sbUJBQW1CO0lBVTlCLFlBQ1UsTUFBaUIsRUFDTCxlQUFnQztRQUQ1QyxXQUFNLEdBQU4sTUFBTSxDQUFXO1FBQ0wsb0JBQWUsR0FBZixlQUFlLENBQWlCO1FBRXBELElBQUksSUFBSSxDQUFDLGVBQWUsRUFBRTtZQUN4QixJQUFJLENBQUMsZUFBZTtpQkFDakIsU0FBUyxFQUFFO2lCQUNYLFNBQVMsQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsZUFBZSxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUM7U0FDekQ7SUFDSCxDQUFDO0lBaEJELElBQVksY0FBYzs7UUFDeEIsT0FBTyxDQUNMLE1BQUEsSUFBSSxDQUFDLGVBQWUsbUNBQ3BCLDBCQUEwQixDQUFDLElBQUksQ0FB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TSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsRUFDL0M7WUFDQSxPQUFPLEdBQUcsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDO1NBQzdDO1FBQ0QsT0FBTyxNQUFBLE1BQUEsTUFBQSxNQUFBLElBQUksQ0FBQyxNQUFNLDBDQUFFLE9BQU8sMENBQUUsR0FBRywwQ0FBRSxNQUFNLG1DQUFJLEVBQUUsQ0FBQztJQUNqRCxDQUFDOztnSEF2TVUsbUJBQW1CO29IQUFuQixtQkFBbUIsY0FGbEIsTUFBTTsyRkFFUCxtQkFBbUI7a0JBSC9CLFVBQVU7bUJBQUM7b0JBQ1YsVUFBVSxFQUFFLE1BQU07aUJBQ25COzswQkFhSSxRQUFRIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSHR0cFBhcmFtcyB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbi9odHRwJztcbmltcG9ydCB7IEluamVjdGFibGUsIGlzRGV2TW9kZSwgT3B0aW9uYWwgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IFN0cmluZ1RlbXBsYXRlIH0gZnJvbSAnLi4vLi4vY29uZmlnL3V0aWxzL3N0cmluZy10ZW1wbGF0ZSc7XG5pbXBvcnQgeyBnZXRDb250ZXh0UGFyYW1ldGVyRGVmYXVsdCB9IGZyb20gJy4uLy4uL3NpdGUtY29udGV4dC9jb25maWcvY29udGV4dC1jb25maWctdXRpbHMnO1xuaW1wb3J0IHsgQmFzZVNpdGVTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2l0ZS1jb250ZXh0L2ZhY2FkZS9iYXNlLXNpdGUuc2VydmljZSc7XG5pbXBvcnQgeyBCQVNFX1NJVEVfQ09OVEVYVF9JRCB9IGZyb20gJy4uLy4uL3NpdGUtY29udGV4dC9wcm92aWRlcnMvY29udGV4dC1pZHMnO1xuaW1wb3J0IHsgSHR0cFBhcmFtc1VSSUVuY29kZXIgfSBmcm9tICcuLi8uLi91dGlsL2h0dHAtcGFyYW1zLXVyaS5lbmNvZGVyJztcbmltcG9ydCB7IE9jY0NvbmZpZyB9IGZyb20gJy4uL2NvbmZpZy9vY2MtY29uZmlnJztcbmltcG9ydCB7IERFRkFVTFRfU0NPUEUgfSBmcm9tICcuLi9vY2MtbW9kZWxzL29jYy1lbmRwb2ludHMubW9kZWwnO1xuaW1wb3J0IHsgdXJsUGF0aEpvaW4gfSBmcm9tICcuLi91dGlscy9vY2MtdXJsLXV0aWwnO1xuXG5leHBvcnQgaW50ZXJmYWNlIEJhc2VPY2NVcmxQcm9wZXJ0aWVzIHtcbiAgYmFzZVVybD86IGJvb2xlYW47XG4gIHByZWZpeD86IGJvb2xlYW47XG4gIGJhc2VTaXRlPzogYm9vbGVhbjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBEeW5hbWljQXR0cmlidXRlcyB7XG4gIHVybFBhcmFtcz86IG9iamVjdDtcbiAgcXVlcnlQYXJhbXM/OiBvYmplY3Q7XG4gIHNjb3BlPzogc3RyaW5nO1xufVxuXG5ASW5qZWN0YWJsZSh7XG4gIHByb3ZpZGVkSW46ICdyb290Jyxcbn0pXG5leHBvcnQgY2xhc3MgT2NjRW5kcG9pbnRzU2VydmljZSB7XG4gIHByaXZhdGUgX2FjdGl2ZUJhc2VTaXRlOiBzdHJpbmc7XG5cbiAgcHJpdmF0ZSBnZXQgYWN0aXZlQmFzZVNpdGUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gKFxuICAgICAgdGhpcy5fYWN0aXZlQmFzZVNpdGUgPz9cbiAgICAgIGdldENvbnRleHRQYXJhbWV0ZXJEZWZhdWx0KHRoaXMuY29uZmlnLCBCQVNFX1NJVEVfQ09OVEVYVF9JRClcbiAgICApO1xuICB9XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBjb25maWc6IE9jY0NvbmZpZyxcbiAgICBAT3B0aW9uYWwoKSBwcml2YXRlIGJhc2VTaXRlU2VydmljZTogQmFzZVNpdGVTZXJ2aWNlXG4gICkge1xuICAgIGlmICh0aGlzLmJhc2VTaXRlU2VydmljZSkge1xuICAgICAgdGhpcy5iYXNlU2l0ZVNlcnZpY2VcbiAgICAgICAgLmdldEFjdGl2ZSgpXG4gICAgICAgIC5zdWJzY3JpYmUoKHZhbHVlKSA9PiAodGhpcy5fYWN0aXZlQmFzZVNpdGUgPSB2YWx1ZSkpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSB2YWx1ZSBjb25maWd1cmVkIGZvciBhIHNwZWNpZmljIGVuZHBvaW50XG4gICAqXG4gICAqIEBwYXJhbSBlbmRwb2ludEtleSB0aGUgY29uZmlndXJhdGlvbiBrZXkgZm9yIHRoZSBlbmRwb2ludCB0byByZXR1cm5cbiAgICogQHBhcmFtIHNjb3BlIGVuZHBvaW50IGNvbmZpZ3VyYXRpb24gc2NvcGVcbiAgICovXG4gIGdldFJhd0VuZHBvaW50VmFsdWUoZW5kcG9pbnQ6IHN0cmluZywgc2NvcGU/OiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGNvbnN0IGVuZHBvaW50VmFsdWUgPSB0aGlzLmdldEVuZHBvaW50Rm9yU2NvcGUoZW5kcG9pbnQsIHNjb3BlKTtcblxuICAgIHJldHVybiBlbmRwb2ludFZhbHVlO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdHJ1ZSB3aGVuIHRoZSBlbmRwb2ludCBpcyBjb25maWd1cmVkXG4gICAqXG4gICAqIEBwYXJhbSBlbmRwb2ludEtleSB0aGUgY29uZmlndXJhdGlvbiBrZXkgZm9yIHRoZSBlbmRwb2ludCB0byByZXR1cm5cbiAgICogQHBhcmFtIHNjb3BlIGVuZHBvaW50IGNvbmZpZ3VyYXRpb24gc2NvcGVcbiAgICovXG4gIGlzQ29uZmlndXJlZChlbmRwb2ludDogc3RyaW5nLCBzY29wZT86IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAhKFxuICAgICAgdHlwZW9mIHRoaXMuZ2V0RW5kcG9pbnRGcm9tQ29uZmlnKGVuZHBvaW50LCBzY29wZSkgPT09ICd1bmRlZmluZWQnXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIGJhc2UgT0NDIGVuZHBvaW50IChiYXNlVXJsICsgcHJlZml4ICsgYmFzZVNpdGUpIGJhc2Ugb24gcHJvdmlkZWQgdmFsdWVzXG4gICAqXG4gICAqIEBwYXJhbSBiYXNlVXJsUHJvcGVydGllcyBTcGVjaWZ5IHByb3BlcnRpZXMgdG8gbm90IGFkZCB0byB0aGUgdXJsIChiYXNlVXJsLCBwcmVmaXgsIGJhc2VTaXRlKVxuICAgKi9cbiAgZ2V0QmFzZVVybChcbiAgICBiYXNlVXJsUHJvcGVydGllczogQmFzZU9jY1VybFByb3BlcnRpZXMgPSB7XG4gICAgICBiYXNlVXJsOiB0cnVlLFxuICAgICAgcHJlZml4OiB0cnVlLFxuICAgICAgYmFzZVNpdGU6IHRydWUsXG4gICAgfVxuICApOiBzdHJpbmcge1xuICAgIGNvbnN0IGJhc2VVcmwgPVxuICAgICAgYmFzZVVybFByb3BlcnRpZXMuYmFzZVVybCA9PT0gZmFsc2VcbiAgICAgICAgPyAnJ1xuICAgICAgICA6IHRoaXMuY29uZmlnPy5iYWNrZW5kPy5vY2M/LmJhc2VVcmwgPz8gJyc7XG4gICAgY29uc3QgcHJlZml4ID0gYmFzZVVybFByb3BlcnRpZXMucHJlZml4ID09PSBmYWxzZSA/ICcnIDogdGhpcy5nZXRQcmVmaXgoKTtcbiAgICBjb25zdCBiYXNlU2l0ZSA9XG4gICAgICBiYXNlVXJsUHJvcGVydGllcy5iYXNlU2l0ZSA9PT0gZmFsc2UgPyAnJyA6IHRoaXMuYWN0aXZlQmFzZVNpdGU7XG5cbiAgICByZXR1cm4gdXJsUGF0aEpvaW4oYmFzZVVybCwgcHJlZml4LCBiYXNlU2l0ZSk7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBhIGZ1bGx5IHF1YWxpZmllZCBPQ0MgVXJsXG4gICAqXG4gICAqIEBwYXJhbSBlbmRwb2ludCBOYW1lIG9mIHRoZSBPQ0MgZW5kcG9pbnQga2V5XG4gICAqIEBwYXJhbSBhdHRyaWJ1dGVzIER5bmFtaWMgYXR0cmlidXRlcyB1c2VkIHRvIGJ1aWxkIHRoZSB1cmxcbiAgICogQHBhcmFtIHByb3BlcnRpZXNUb09taXQgU3BlY2lmeSBwcm9wZXJ0aWVzIHRvIG5vdCBhZGQgdG8gdGhlIHVybCAoYmFzZVVybCwgcHJlZml4LCBiYXNlU2l0ZSlcbiAgICovXG4gIGJ1aWxkVXJsKFxuICAgIGVuZHBvaW50OiBzdHJpbmcsXG4gICAgYXR0cmlidXRlcz86IER5bmFtaWNBdHRyaWJ1dGVzLFxuICAgIHByb3BlcnRpZXNUb09taXQ/OiBCYXNlT2NjVXJsUHJvcGVydGllc1xuICApOiBzdHJpbmcge1xuICAgIGxldCB1cmwgPSB0aGlzLmdldEVuZHBvaW50Rm9yU2NvcGUoZW5kcG9pbnQsIGF0dHJpYnV0ZXM/LnNjb3BlKTtcblxuICAgIGlmIChhdHRyaWJ1dGVzKSB7XG4gICAgICBjb25zdCB7IHVybFBhcmFtcywgcXVlcnlQYXJhbXMgfSA9IGF0dHJpYnV0ZXM7XG5cbiAgICAgIGlmICh1cmxQYXJhbXMpIHtcbiAgICAgICAgdXJsID0gU3RyaW5nVGVtcGxhdGUucmVzb2x2ZSh1cmwsIGF0dHJpYnV0ZXMudXJsUGFyYW1zLCB0cnVlKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHF1ZXJ5UGFyYW1zKSB7XG4gICAgICAgIGxldCBodHRwUGFyYW1zT3B0aW9ucyA9IHsgZW5jb2RlcjogbmV3IEh0dHBQYXJhbXNVUklFbmNvZGVyKCkgfTtcblxuICAgICAgICBpZiAodXJsLmluY2x1ZGVzKCc/JykpIHtcbiAgICAgICAgICBsZXQgcXVlcnlQYXJhbXNGcm9tRW5kcG9pbnQ6IHN0cmluZztcbiAgICAgICAgICBbdXJsLCBxdWVyeVBhcmFtc0Zyb21FbmRwb2ludF0gPSB1cmwuc3BsaXQoJz8nKTtcbiAgICAgICAgICBodHRwUGFyYW1zT3B0aW9ucyA9IHtcbiAgICAgICAgICAgIC4uLmh0dHBQYXJhbXNPcHRpb25zLFxuICAgICAgICAgICAgLi4ueyBmcm9tU3RyaW5nOiBxdWVyeVBhcmFtc0Zyb21FbmRwb2ludCB9LFxuICAgICAgICAgIH07XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgaHR0cFBhcmFtcyA9IG5ldyBIdHRwUGFyYW1zKGh0dHBQYXJhbXNPcHRpb25zKTtcbiAgICAgICAgT2JqZWN0LmtleXMocXVlcnlQYXJhbXMpLmZvckVhY2goKGtleSkgPT4ge1xuICAgICAgICAgIGNvbnN0IHZhbHVlID0gcXVlcnlQYXJhbXNba2V5XTtcbiAgICAgICAgICBpZiAodmFsdWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgaWYgKHZhbHVlID09PSBudWxsKSB7XG4gICAgICAgICAgICAgIGh0dHBQYXJhbXMgPSBodHRwUGFyYW1zLmRlbGV0ZShrZXkpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgaHR0cFBhcmFtcyA9IGh0dHBQYXJhbXMuc2V0KGtleSwgdmFsdWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgY29uc3QgcGFyYW1zID0gaHR0cFBhcmFtcy50b1N0cmluZygpO1xuICAgICAgICBpZiAocGFyYW1zLmxlbmd0aCkge1xuICAgICAgICAgIHVybCArPSAnPycgKyBwYXJhbXM7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5idWlsZFVybEZyb21FbmRwb2ludFN0cmluZyh1cmwsIHByb3BlcnRpZXNUb09taXQpO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRFbmRwb2ludEZyb21Db25maWcoXG4gICAgZW5kcG9pbnQ6IHN0cmluZyxcbiAgICBzY29wZT86IHN0cmluZ1xuICApOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IGVuZHBvaW50c0NvbmZpZyA9IHRoaXMuY29uZmlnLmJhY2tlbmQ/Lm9jYz8uZW5kcG9pbnRzO1xuXG4gICAgaWYgKCFlbmRwb2ludHNDb25maWcpIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgY29uc3QgZW5kcG9pbnRDb25maWcgPSBlbmRwb2ludHNDb25maWdbZW5kcG9pbnRdO1xuXG4gICAgaWYgKHNjb3BlKSB7XG4gICAgICBpZiAoc2NvcGUgPT09IERFRkFVTFRfU0NPUEUgJiYgdHlwZW9mIGVuZHBvaW50Q29uZmlnID09PSAnc3RyaW5nJykge1xuICAgICAgICByZXR1cm4gZW5kcG9pbnRDb25maWc7XG4gICAgICB9XG4gICAgICByZXR1cm4gZW5kcG9pbnRDb25maWc/LltzY29wZV07XG4gICAgfVxuXG4gICAgcmV0dXJuIHR5cGVvZiBlbmRwb2ludENvbmZpZyA9PT0gJ3N0cmluZydcbiAgICAgID8gZW5kcG9pbnRDb25maWdcbiAgICAgIDogZW5kcG9pbnRDb25maWc/LltERUZBVUxUX1NDT1BFXTtcbiAgfVxuXG4gIC8vIFRPRE86IENhbiB3ZSByZXVzZSBnZXRFbmRwb2ludEZyb21Db25maWcgaW4gdGhpcyBtZXRob2Q/IFNob3VsZCB3ZSBjaGFuZ2UgYmVoYXZpb3Igb2YgdGhpcyBmdW5jdGlvbj9cbiAgcHJpdmF0ZSBnZXRFbmRwb2ludEZvclNjb3BlKGVuZHBvaW50OiBzdHJpbmcsIHNjb3BlPzogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBjb25zdCBlbmRwb2ludHNDb25maWcgPSB0aGlzLmNvbmZpZy5iYWNrZW5kPy5vY2M/LmVuZHBvaW50cztcblxuICAgIGlmICghQm9vbGVhbihlbmRwb2ludHNDb25maWcpKSB7XG4gICAgICByZXR1cm4gJyc7XG4gICAgfVxuXG4gICAgY29uc3QgZW5kcG9pbnRDb25maWcgPSBlbmRwb2ludHNDb25maWdbZW5kcG9pbnRdO1xuXG4gICAgaWYgKHNjb3BlKSB7XG4gICAgICBpZiAoZW5kcG9pbnRDb25maWc/LltzY29wZV0pIHtcbiAgICAgICAgcmV0dXJuIGVuZHBvaW50Q29uZmlnPy5bc2NvcGVdO1xuICAgICAgfVxuICAgICAgaWYgKHNjb3BlID09PSBERUZBVUxUX1NDT1BFICYmIHR5cGVvZiBlbmRwb2ludENvbmZpZyA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgcmV0dXJuIGVuZHBvaW50Q29uZmlnO1xuICAgICAgfVxuICAgICAgaWYgKGlzRGV2TW9kZSgpKSB7XG4gICAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgICBgJHtlbmRwb2ludH0gZW5kcG9pbnQgY29uZmlndXJhdGlvbiBtaXNzaW5nIGZvciBzY29wZSBcIiR7c2NvcGV9XCJgXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIChcbiAgICAgICh0eXBlb2YgZW5kcG9pbnRDb25maWcgPT09ICdzdHJpbmcnXG4gICAgICAgID8gZW5kcG9pbnRDb25maWdcbiAgICAgICAgOiBlbmRwb2ludENvbmZpZz8uW0RFRkFVTFRfU0NPUEVdKSB8fCBlbmRwb2ludFxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogQWRkIHRoZSBiYXNlIE9DQyB1cmwgcHJvcGVydGllcyB0byB0aGUgc3BlY2lmaWVkIGVuZHBvaW50IHN0cmluZ1xuICAgKlxuICAgKiBAcGFyYW0gZW5kcG9pbnRTdHJpbmcgU3RyaW5nIHZhbHVlIGZvciB0aGUgdXJsIGVuZHBvaW50XG4gICAqIEBwYXJhbSBwcm9wZXJ0aWVzVG9PbWl0IFNwZWNpZnkgcHJvcGVydGllcyB0byBub3QgYWRkIHRvIHRoZSB1cmwgKGJhc2VVcmwsIHByZWZpeCwgYmFzZVNpdGUpXG4gICAqL1xuICBwcml2YXRlIGJ1aWxkVXJsRnJvbUVuZHBvaW50U3RyaW5nKFxuICAgIGVuZHBvaW50U3RyaW5nOiBzdHJpbmcsXG4gICAgcHJvcGVydGllc1RvT21pdD86IEJhc2VPY2NVcmxQcm9wZXJ0aWVzXG4gICk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHVybFBhdGhKb2luKHRoaXMuZ2V0QmFzZVVybChwcm9wZXJ0aWVzVG9PbWl0KSwgZW5kcG9pbnRTdHJpbmcpO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRQcmVmaXgoKTogc3RyaW5nIHtcbiAgICBpZiAoXG4gICAgICB0aGlzLmNvbmZpZz8uYmFja2VuZD8ub2NjPy5wcmVmaXggJiZcbiAgICAgICF0aGlzLmNvbmZpZy5iYWNrZW5kLm9jYy5wcmVmaXguc3RhcnRzV2l0aCgnLycpXG4gICAgKSB7XG4gICAgICByZXR1cm4gJy8nICsgdGhpcy5jb25maWcuYmFja2VuZC5vY2MucHJlZml4O1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5jb25maWc/LmJhY2tlbmQ/Lm9jYz8ucHJlZml4ID8/ICcnO1xuICB9XG59XG4iXX0=