UNPKG

nsrtm-gestionarchivo-npm-prueba2

Version:

Proyecto de Libreria Frontend para la Gestión de Archivos

337 lines 44.4 kB
/* tslint:disable */ /* eslint-disable */ import { HttpRequest, HttpParams, HttpHeaders } from '@angular/common/http'; /** * Custom parameter codec to correctly handle the plus sign in parameter * values. See https://github.com/angular/angular/issues/18261 */ class ParameterCodec { encodeKey(key) { return encodeURIComponent(key); } encodeValue(value) { return encodeURIComponent(value); } decodeKey(key) { return decodeURIComponent(key); } decodeValue(value) { return decodeURIComponent(value); } } const ParameterCodecInstance = new ParameterCodec(); /** * Base class for a parameter */ class Parameter { constructor(name, value, options, defaultStyle, defaultExplode) { this.name = name; this.value = value; this.options = options; this.options = options || {}; if (this.options.style === null || this.options.style === undefined) { this.options.style = defaultStyle; } if (this.options.explode === null || this.options.explode === undefined) { this.options.explode = defaultExplode; } } serializeValue(value, separator = ',') { if (value === null || value === undefined) { return ''; } else if (value instanceof Array) { return value.map(v => this.serializeValue(v).split(separator).join(encodeURIComponent(separator))).join(separator); } else if (typeof value === 'object') { const array = []; for (const key of Object.keys(value)) { let propVal = value[key]; if (propVal !== null && propVal !== undefined) { propVal = this.serializeValue(propVal).split(separator).join(encodeURIComponent(separator)); if (this.options.explode) { array.push(`${key}=${propVal}`); } else { array.push(key); array.push(propVal); } } } return array.join(separator); } else { return String(value); } } } /** * A parameter in the operation path */ class PathParameter extends Parameter { constructor(name, value, options) { super(name, value, options, 'simple', false); } append(path) { let value = this.value; if (value === null || value === undefined) { value = ''; } let prefix = this.options.style === 'label' ? '.' : ''; let separator = this.options.explode ? prefix === '' ? ',' : prefix : ','; let alreadySerialized = false; if (this.options.style === 'matrix') { // The parameter name is just used as prefix, except in some cases... prefix = `;${this.name}=`; if (this.options.explode && typeof value === 'object') { prefix = ';'; if (value instanceof Array) { // For arrays we have to repeat the name for each element value = value.map(v => `${this.name}=${this.serializeValue(v, ';')}`); value = value.join(';'); alreadySerialized = true; } else { // For objects we have to put each the key / value pairs value = this.serializeValue(value, ';'); alreadySerialized = true; } } } value = prefix + (alreadySerialized ? value : this.serializeValue(value, separator)); // Replace both the plain variable and the corresponding variant taking in the prefix and explode into account path = path.replace(`{${this.name}}`, value); path = path.replace(`{${prefix}${this.name}${this.options.explode ? '*' : ''}}`, value); return path; } // @ts-ignore serializeValue(value, separator = ',') { var result = typeof value === 'string' ? encodeURIComponent(value) : super.serializeValue(value, separator); result = result.replace(/%3D/g, '='); result = result.replace(/%3B/g, ';'); result = result.replace(/%2C/g, ','); return result; } } /** * A parameter in the query */ class QueryParameter extends Parameter { constructor(name, value, options) { super(name, value, options, 'form', true); } append(params) { if (this.value instanceof Array) { // Array serialization if (this.options.explode) { for (const v of this.value) { params = params.append(this.name, this.serializeValue(v)); } } else { const separator = this.options.style === 'spaceDelimited' ? ' ' : this.options.style === 'pipeDelimited' ? '|' : ','; return params.append(this.name, this.serializeValue(this.value, separator)); } } else if (this.value !== null && typeof this.value === 'object') { // Object serialization if (this.options.style === 'deepObject') { // Append a parameter for each key, in the form `name[key]` for (const key of Object.keys(this.value)) { const propVal = this.value[key]; if (propVal !== null && propVal !== undefined) { params = params.append(`${this.name}[${key}]`, this.serializeValue(propVal)); } } } else if (this.options.explode) { // Append a parameter for each key without using the parameter name for (const key of Object.keys(this.value)) { const propVal = this.value[key]; if (propVal !== null && propVal !== undefined) { params = params.append(key, this.serializeValue(propVal)); } } } else { // Append a single parameter whose values are a comma-separated list of key,value,key,value... const array = []; for (const key of Object.keys(this.value)) { const propVal = this.value[key]; if (propVal !== null && propVal !== undefined) { array.push(key); array.push(propVal); } } params = params.append(this.name, this.serializeValue(array)); } } else if (this.value !== null && this.value !== undefined) { // Plain value params = params.append(this.name, this.serializeValue(this.value)); } return params; } } /** * A parameter in the HTTP request header */ class HeaderParameter extends Parameter { constructor(name, value, options) { super(name, value, options, 'simple', false); } append(headers) { if (this.value !== null && this.value !== undefined) { if (this.value instanceof Array) { for (const v of this.value) { headers = headers.append(this.name, this.serializeValue(v)); } } else { headers = headers.append(this.name, this.serializeValue(this.value)); } } return headers; } } /** * Helper to build http requests from parameters */ export class RequestBuilder { constructor(rootUrl, operationPath, method) { this.rootUrl = rootUrl; this.operationPath = operationPath; this.method = method; this._path = new Map(); this._query = new Map(); this._header = new Map(); } /** * Sets a path parameter */ path(name, value, options) { this._path.set(name, new PathParameter(name, value, options || {})); } /** * Sets a query parameter */ query(name, value, options) { this._query.set(name, new QueryParameter(name, value, options || {})); } /** * Sets a header parameter */ header(name, value, options) { this._header.set(name, new HeaderParameter(name, value, options || {})); } /** * Sets the body content, along with the content type */ body(value, contentType = 'application/json') { if (value instanceof Blob) { this._bodyContentType = value.type; } else { this._bodyContentType = contentType; } if (this._bodyContentType === 'application/x-www-form-urlencoded' && value !== null && typeof value === 'object') { // Handle URL-encoded data const pairs = []; for (const key of Object.keys(value)) { let val = value[key]; if (!(val instanceof Array)) { val = [val]; } for (const v of val) { const formValue = this.formDataValue(v); if (formValue !== null) { pairs.push([key, formValue]); } } } this._bodyContent = pairs.map(p => `${encodeURIComponent(p[0])}=${encodeURIComponent(p[1])}`).join('&'); } else if (this._bodyContentType === 'multipart/form-data') { // Handle multipart form data const formData = new FormData(); if (value !== null && value !== undefined) { for (const key of Object.keys(value)) { const val = value[key]; if (val instanceof Array) { for (const v of val) { const toAppend = this.formDataValue(v); if (toAppend !== null) { formData.append(key, toAppend); } } } else { const toAppend = this.formDataValue(val); if (toAppend !== null) { formData.set(key, toAppend); } } } } this._bodyContent = formData; } else { // The body is the plain content this._bodyContent = value; } } formDataValue(value) { if (value === null || value === undefined) { return null; } if (value instanceof Blob) { return value; } if (typeof value === 'object') { return JSON.stringify(value); } return String(value); } /** * Builds the request with the current set parameters */ build(options) { options = options || {}; // Path parameters let path = this.operationPath; for (const pathParam of this._path.values()) { path = pathParam.append(path); } const url = this.rootUrl + path; // Query parameters let httpParams = new HttpParams({ encoder: ParameterCodecInstance }); for (const queryParam of this._query.values()) { httpParams = queryParam.append(httpParams); } // Header parameters let httpHeaders = new HttpHeaders(); if (options.accept) { httpHeaders = httpHeaders.append('Accept', options.accept); } for (const headerParam of this._header.values()) { httpHeaders = headerParam.append(httpHeaders); } // Request content headers if (this._bodyContentType && !(this._bodyContent instanceof FormData)) { httpHeaders = httpHeaders.set('Content-Type', this._bodyContentType); } // Perform the request return new HttpRequest(this.method.toUpperCase(), url, this._bodyContent, { params: httpParams, headers: httpHeaders, responseType: options.responseType, reportProgress: options.reportProgress, context: options.context }); } } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVxdWVzdC1idWlsZGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vYXJjaGl2by9uc3J0bS1nZXN0aW9uYXJjaGl2by1ucG0vc3JjL2FwcC9hcGkvZ2VzdGlvbmFyY2hpdm8vcmVxdWVzdC1idWlsZGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLG9CQUFvQjtBQUNwQixvQkFBb0I7QUFDcEIsT0FBTyxFQUFFLFdBQVcsRUFBc0IsVUFBVSxFQUFFLFdBQVcsRUFBZSxNQUFNLHNCQUFzQixDQUFDO0FBRTdHOzs7R0FHRztBQUNILE1BQU0sY0FBYztJQUNsQixTQUFTLENBQUMsR0FBVztRQUNuQixPQUFPLGtCQUFrQixDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ2pDLENBQUM7SUFFRCxXQUFXLENBQUMsS0FBYTtRQUN2QixPQUFPLGtCQUFrQixDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ25DLENBQUM7SUFFRCxTQUFTLENBQUMsR0FBVztRQUNuQixPQUFPLGtCQUFrQixDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ2pDLENBQUM7SUFFRCxXQUFXLENBQUMsS0FBYTtRQUN2QixPQUFPLGtCQUFrQixDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ25DLENBQUM7Q0FDRjtBQUNELE1BQU0sc0JBQXNCLEdBQUcsSUFBSSxjQUFjLEVBQUUsQ0FBQztBQVVwRDs7R0FFRztBQUNILE1BQWUsU0FBUztJQUN0QixZQUFtQixJQUFZLEVBQVMsS0FBVSxFQUFTLE9BQXlCLEVBQUUsWUFBb0IsRUFBRSxjQUF1QjtRQUFoSCxTQUFJLEdBQUosSUFBSSxDQUFRO1FBQVMsVUFBSyxHQUFMLEtBQUssQ0FBSztRQUFTLFlBQU8sR0FBUCxPQUFPLENBQWtCO1FBQ2xGLElBQUksQ0FBQyxPQUFPLEdBQUcsT0FBTyxJQUFJLEVBQUUsQ0FBQztRQUM3QixJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxLQUFLLElBQUksSUFBSSxJQUFJLENB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QVksRUFBRSxPQUFPLENBQUMsWUFBWTtZQUNsQyxjQUFjLEVBQUUsT0FBTyxDQUFDLGNBQWM7WUFDdEMsT0FBTyxFQUFFLE9BQU8sQ0FBQyxPQUFPO1NBQ3pCLENBQUMsQ0FBQztJQUNMLENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbIi8qIHRzbGludDpkaXNhYmxlICovXHJcbi8qIGVzbGludC1kaXNhYmxlICovXHJcbmltcG9ydCB7IEh0dHBSZXF1ZXN0LCBIdHRwUGFyYW1ldGVyQ29kZWMsIEh0dHBQYXJhbXMsIEh0dHBIZWFkZXJzLCBIdHRwQ29udGV4dCB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbi9odHRwJztcclxuXHJcbi8qKlxyXG4gKiBDdXN0b20gcGFyYW1ldGVyIGNvZGVjIHRvIGNvcnJlY3RseSBoYW5kbGUgdGhlIHBsdXMgc2lnbiBpbiBwYXJhbWV0ZXJcclxuICogdmFsdWVzLiBTZWUgaHR0cHM6Ly9naXRodWIuY29tL2FuZ3VsYXIvYW5ndWxhci9pc3N1ZXMvMTgyNjFcclxuICovXHJcbmNsYXNzIFBhcmFtZXRlckNvZGVjIGltcGxlbWVudHMgSHR0cFBhcmFtZXRlckNvZGVjIHtcclxuICBlbmNvZGVLZXkoa2V5OiBzdHJpbmcpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIGVuY29kZVVSSUNvbXBvbmVudChrZXkpO1xyXG4gIH1cclxuXHJcbiAgZW5jb2RlVmFsdWUodmFsdWU6IHN0cmluZyk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gZW5jb2RlVVJJQ29tcG9uZW50KHZhbHVlKTtcclxuICB9XHJcblxyXG4gIGRlY29kZUtleShrZXk6IHN0cmluZyk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gZGVjb2RlVVJJQ29tcG9uZW50KGtleSk7XHJcbiAgfVxyXG5cclxuICBkZWNvZGVWYWx1ZSh2YWx1ZTogc3RyaW5nKTogc3RyaW5nIHtcclxuICAgIHJldHVybiBkZWNvZGVVUklDb21wb25lbnQodmFsdWUpO1xyXG4gIH1cclxufVxyXG5jb25zdCBQYXJhbWV0ZXJDb2RlY0luc3RhbmNlID0gbmV3IFBhcmFtZXRlckNvZGVjKCk7XHJcblxyXG4vKipcclxuICogRGVmaW5lcyB0aGUgb3B0aW9ucyBmb3IgYXBwZW5kaW5nIGEgcGFyYW1ldGVyXHJcbiAqL1xyXG5pbnRlcmZhY2UgUGFyYW1ldGVyT3B0aW9ucyB7XHJcbiAgc3R5bGU/OiBzdHJpbmc7XHJcbiAgZXhwbG9kZT86IGJvb2xlYW47XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBCYXNlIGNsYXNzIGZvciBhIHBhcmFtZXRlclxyXG4gKi9cclxuYWJzdHJhY3QgY2xhc3MgUGFyYW1ldGVyIHtcclxuICBjb25zdHJ1Y3RvcihwdWJsaWMgbmFtZTogc3RyaW5nLCBwdWJsaWMgdmFsdWU6IGFueSwgcHVibGljIG9wdGlvbnM6IFBhcmFtZXRlck9wdGlvbnMsIGRlZmF1bHRTdHlsZTogc3RyaW5nLCBkZWZhdWx0RXhwbG9kZTogYm9vbGVhbikge1xyXG4gICAgdGhpcy5vcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcclxuICAgIGlmICh0aGlzLm9wdGlvbnMuc3R5bGUgPT09IG51bGwgfHwgdGhpcy5vcHRpb25zLnN0eWxlID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgdGhpcy5vcHRpb25zLnN0eWxlID0gZGVmYXVsdFN0eWxlO1xyXG4gICAgfVxyXG4gICAgaWYgKHRoaXMub3B0aW9ucy5leHBsb2RlID09PSBudWxsIHx8IHRoaXMub3B0aW9ucy5leHBsb2RlID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgdGhpcy5vcHRpb25zLmV4cGxvZGUgPSBkZWZhdWx0RXhwbG9kZTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHNlcmlhbGl6ZVZhbHVlKHZhbHVlOiBhbnksIHNlcGFyYXRvciA9ICcsJyk6IHN0cmluZyB7XHJcbiAgICBpZiAodmFsdWUgPT09IG51bGwgfHwgdmFsdWUgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICByZXR1cm4gJyc7XHJcbiAgICB9IGVsc2UgaWYgKHZhbHVlIGluc3RhbmNlb2YgQXJyYXkpIHtcclxuICAgICAgcmV0dXJuIHZhbHVlLm1hcCh2ID0+IHRoaXMuc2VyaWFsaXplVmFsdWUodikuc3BsaXQoc2VwYXJhdG9yKS5qb2luKGVuY29kZVVSSUNvbXBvbmVudChzZXBhcmF0b3IpKSkuam9pbihzZXBhcmF0b3IpO1xyXG4gICAgfSBlbHNlIGlmICh0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnKSB7XHJcbiAgICAgIGNvbnN0IGFycmF5OiBzdHJpbmdbXSA9IFtdO1xyXG4gICAgICBmb3IgKGNvbnN0IGtleSBvZiBPYmplY3Qua2V5cyh2YWx1ZSkpIHtcclxuICAgICAgICBsZXQgcHJvcFZhbCA9IHZhbHVlW2tleV07XHJcbiAgICAgICAgaWYgKHByb3BWYWwgIT09IG51bGwgJiYgcHJvcFZhbCAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICBwcm9wVmFsID0gdGhpcy5zZXJpYWxpemVWYWx1ZShwcm9wVmFsKS5zcGxpdChzZXBhcmF0b3IpLmpvaW4oZW5jb2RlVVJJQ29tcG9uZW50KHNlcGFyYXRvcikpO1xyXG4gICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5leHBsb2RlKSB7XHJcbiAgICAgICAgICAgIGFycmF5LnB1c2goYCR7a2V5fT0ke3Byb3BWYWx9YCk7XHJcbiAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBhcnJheS5wdXNoKGtleSk7XHJcbiAgICAgICAgICAgIGFycmF5LnB1c2gocHJvcFZhbCk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICAgIHJldHVybiBhcnJheS5qb2luKHNlcGFyYXRvcik7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICByZXR1cm4gU3RyaW5nKHZhbHVlKTtcclxuICAgIH1cclxuICB9XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBBIHBhcmFtZXRlciBpbiB0aGUgb3BlcmF0aW9uIHBhdGhcclxuICovXHJcbmNsYXNzIFBhdGhQYXJhbWV0ZXIgZXh0ZW5kcyBQYXJhbWV0ZXIge1xyXG4gIGNvbnN0cnVjdG9yKG5hbWU6IHN0cmluZywgdmFsdWU6IGFueSwgb3B0aW9uczogUGFyYW1ldGVyT3B0aW9ucykge1xyXG4gICAgc3VwZXIobmFtZSwgdmFsdWUsIG9wdGlvbnMsICdzaW1wbGUnLCBmYWxzZSk7XHJcbiAgfVxyXG5cclxuICBhcHBlbmQocGF0aDogc3RyaW5nKTogc3RyaW5nIHtcclxuICAgIGxldCB2YWx1ZSA9IHRoaXMudmFsdWU7XHJcbiAgICBpZiAodmFsdWUgPT09IG51bGwgfHwgdmFsdWUgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICB2YWx1ZSA9ICcnO1xyXG4gICAgfVxyXG4gICAgbGV0IHByZWZpeCA9IHRoaXMub3B0aW9ucy5zdHlsZSA9PT0gJ2xhYmVsJyA/ICcuJyA6ICcnO1xyXG4gICAgbGV0IHNlcGFyYXRvciA9IHRoaXMub3B0aW9ucy5leHBsb2RlID8gcHJlZml4ID09PSAnJyA/ICcsJyA6IHByZWZpeCA6ICcsJztcclxuICAgIGxldCBhbHJlYWR5U2VyaWFsaXplZCA9IGZhbHNlO1xyXG4gICAgaWYgKHRoaXMub3B0aW9ucy5zdHlsZSA9PT0gJ21hdHJpeCcpIHtcclxuICAgICAgLy8gVGhlIHBhcmFtZXRlciBuYW1lIGlzIGp1c3QgdXNlZCBhcyBwcmVmaXgsIGV4Y2VwdCBpbiBzb21lIGNhc2VzLi4uXHJcbiAgICAgIHByZWZpeCA9IGA7JHt0aGlzLm5hbWV9PWA7XHJcbiAgICAgIGlmICh0aGlzLm9wdGlvbnMuZXhwbG9kZSAmJiB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnKSB7XHJcbiAgICAgICAgcHJlZml4ID0gJzsnO1xyXG4gICAgICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIEFycmF5KSB7XHJcbiAgICAgICAgICAvLyBGb3IgYXJyYXlzIHdlIGhhdmUgdG8gcmVwZWF0IHRoZSBuYW1lIGZvciBlYWNoIGVsZW1lbnRcclxuICAgICAgICAgIHZhbHVlID0gdmFsdWUubWFwKHYgPT4gYCR7dGhpcy5uYW1lfT0ke3RoaXMuc2VyaWFsaXplVmFsdWUodiwgJzsnKX1gKTtcclxuICAgICAgICAgIHZhbHVlID0gdmFsdWUuam9pbignOycpO1xyXG4gICAgICAgICAgYWxyZWFkeVNlcmlhbGl6ZWQgPSB0cnVlO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAvLyBGb3Igb2JqZWN0cyB3ZSBoYXZlIHRvIHB1dCBlYWNoIHRoZSBrZXkgLyB2YWx1ZSBwYWlyc1xyXG4gICAgICAgICAgdmFsdWUgPSB0aGlzLnNlcmlhbGl6ZVZhbHVlKHZhbHVlLCAnOycpO1xyXG4gICAgICAgICAgYWxyZWFkeVNlcmlhbGl6ZWQgPSB0cnVlXHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICB2YWx1ZSA9IHByZWZpeCArIChhbHJlYWR5U2VyaWFsaXplZCA/IHZhbHVlIDogdGhpcy5zZXJpYWxpemVWYWx1ZSh2YWx1ZSwgc2VwYXJhdG9yKSk7XHJcbiAgICAvLyBSZXBsYWNlIGJvdGggdGhlIHBsYWluIHZhcmlhYmxlIGFuZCB0aGUgY29ycmVzcG9uZGluZyB2YXJpYW50IHRha2luZyBpbiB0aGUgcHJlZml4IGFuZCBleHBsb2RlIGludG8gYWNjb3VudFxyXG4gICAgcGF0aCA9IHBhdGgucmVwbGFjZShgeyR7dGhpcy5uYW1lfX1gLCB2YWx1ZSk7XHJcbiAgICBwYXRoID0gcGF0aC5yZXBsYWNlKGB7JHtwcmVmaXh9JHt0aGlzLm5hbWV9JHt0aGlzLm9wdGlvbnMuZXhwbG9kZSA/ICcqJyA6ICcnfX1gLCB2YWx1ZSk7XHJcbiAgICByZXR1cm4gcGF0aDtcclxuICB9XHJcblxyXG4gIC8vIEB0cy1pZ25vcmVcclxuICBzZXJpYWxpemVWYWx1ZSh2YWx1ZTogYW55LCBzZXBhcmF0b3IgPSAnLCcpOiBzdHJpbmcge1xyXG4gICAgdmFyIHJlc3VsdCA9IHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycgPyBlbmNvZGVVUklDb21wb25lbnQodmFsdWUpIDogc3VwZXIuc2VyaWFsaXplVmFsdWUodmFsdWUsIHNlcGFyYXRvcik7XHJcbiAgICByZXN1bHQgPSByZXN1bHQucmVwbGFjZSgvJTNEL2csICc9Jyk7XHJcbiAgICByZXN1bHQgPSByZXN1bHQucmVwbGFjZSgvJTNCL2csICc7Jyk7XHJcbiAgICByZXN1bHQgPSByZXN1bHQucmVwbGFjZSgvJTJDL2csICcsJyk7XHJcbiAgICByZXR1cm4gcmVzdWx0O1xyXG4gIH1cclxufVxyXG5cclxuLyoqXHJcbiAqIEEgcGFyYW1ldGVyIGluIHRoZSBxdWVyeVxyXG4gKi9cclxuY2xhc3MgUXVlcnlQYXJhbWV0ZXIgZXh0ZW5kcyBQYXJhbWV0ZXIge1xyXG4gIGNvbnN0cnVjdG9yKG5hbWU6IHN0cmluZywgdmFsdWU6IGFueSwgb3B0aW9uczogUGFyYW1ldGVyT3B0aW9ucykge1xyXG4gICAgc3VwZXIobmFtZSwgdmFsdWUsIG9wdGlvbnMsICdmb3JtJywgdHJ1ZSk7XHJcbiAgfVxyXG5cclxuICBhcHBlbmQocGFyYW1zOiBIdHRwUGFyYW1zKTogSHR0cFBhcmFtcyB7XHJcbiAgICBpZiAodGhpcy52YWx1ZSBpbnN0YW5jZW9mIEFycmF5KSB7XHJcbiAgICAgIC8vIEFycmF5IHNlcmlhbGl6YXRpb25cclxuICAgICAgaWYgKHRoaXMub3B0aW9ucy5leHBsb2RlKSB7XHJcbiAgICAgICAgZm9yIChjb25zdCB2IG9mIHRoaXMudmFsdWUpIHtcclxuICAgICAgICAgIHBhcmFtcyA9IHBhcmFtcy5hcHBlbmQodGhpcy5uYW1lLCB0aGlzLnNlcmlhbGl6ZVZhbHVlKHYpKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgY29uc3Qgc2VwYXJhdG9yID0gdGhpcy5vcHRpb25zLnN0eWxlID09PSAnc3BhY2VEZWxpbWl0ZWQnXHJcbiAgICAgICAgICA/ICcgJyA6IHRoaXMub3B0aW9ucy5zdHlsZSA9PT0gJ3BpcGVEZWxpbWl0ZWQnXHJcbiAgICAgICAgICAgID8gJ3wnIDogJywnO1xyXG4gICAgICAgIHJldHVybiBwYXJhbXMuYXBwZW5kKHRoaXMubmFtZSwgdGhpcy5zZXJpYWxpemVWYWx1ZSh0aGlzLnZhbHVlLCBzZXBhcmF0b3IpKTtcclxuICAgICAgfVxyXG4gICAgfSBlbHNlIGlmICh0aGlzLnZhbHVlICE9PSBudWxsICYmIHR5cGVvZiB0aGlzLnZhbHVlID09PSAnb2JqZWN0Jykge1xyXG4gICAgICAvLyBPYmplY3Qgc2VyaWFsaXphdGlvblxyXG4gICAgICBpZiAodGhpcy5vcHRpb25zLnN0eWxlID09PSAnZGVlcE9iamVjdCcpIHtcclxuICAgICAgICAvLyBBcHBlbmQgYSBwYXJhbWV0ZXIgZm9yIGVhY2gga2V5LCBpbiB0aGUgZm9ybSBgbmFtZVtrZXldYFxyXG4gICAgICAgIGZvciAoY29uc3Qga2V5IG9mIE9iamVjdC5rZXlzKHRoaXMudmFsdWUpKSB7XHJcbiAgICAgICAgICBjb25zdCBwcm9wVmFsID0gdGhpcy52YWx1ZVtrZXldO1xyXG4gICAgICAgICAgaWYgKHByb3BWYWwgIT09IG51bGwgJiYgcHJvcFZhbCAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIHBhcmFtcyA9IHBhcmFtcy5hcHBlbmQoYCR7dGhpcy5uYW1lfVske2tleX1dYCwgdGhpcy5zZXJpYWxpemVWYWx1ZShwcm9wVmFsKSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9IGVsc2UgaWYgKHRoaXMub3B0aW9ucy5leHBsb2RlKSB7XHJcbiAgICAgICAgLy8gQXBwZW5kIGEgcGFyYW1ldGVyIGZvciBlYWNoIGtleSB3aXRob3V0IHVzaW5nIHRoZSBwYXJhbWV0ZXIgbmFtZVxyXG4gICAgICAgIGZvciAoY29uc3Qga2V5IG9mIE9iamVjdC5rZXlzKHRoaXMudmFsdWUpKSB7XHJcbiAgICAgICAgICBjb25zdCBwcm9wVmFsID0gdGhpcy52YWx1ZVtrZXldO1xyXG4gICAgICAgICAgaWYgKHByb3BWYWwgIT09IG51bGwgJiYgcHJvcFZhbCAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIHBhcmFtcyA9IHBhcmFtcy5hcHBlbmQoa2V5LCB0aGlzLnNlcmlhbGl6ZVZhbHVlKHByb3BWYWwpKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgLy8gQXBwZW5kIGEgc2luZ2xlIHBhcmFtZXRlciB3aG9zZSB2YWx1ZXMgYXJlIGEgY29tbWEtc2VwYXJhdGVkIGxpc3Qgb2Yga2V5LHZhbHVlLGtleSx2YWx1ZS4uLlxyXG4gICAgICAgIGNvbnN0IGFycmF5OiBhbnlbXSA9IFtdO1xyXG4gICAgICAgIGZvciAoY29uc3Qga2V5IG9mIE9iamVjdC5rZXlzKHRoaXMudmFsdWUpKSB7XHJcbiAgICAgICAgICBjb25zdCBwcm9wVmFsID0gdGhpcy52YWx1ZVtrZXldO1xyXG4gICAgICAgICAgaWYgKHByb3BWYWwgIT09IG51bGwgJiYgcHJvcFZhbCAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIGFycmF5LnB1c2goa2V5KTtcclxuICAgICAgICAgICAgYXJyYXkucHVzaChwcm9wVmFsKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcGFyYW1zID0gcGFyYW1zLmFwcGVuZCh0aGlzLm5hbWUsIHRoaXMuc2VyaWFsaXplVmFsdWUoYXJyYXkpKTtcclxuICAgICAgfVxyXG4gICAgfSBlbHNlIGlmICh0aGlzLnZhbHVlICE9PSBudWxsICYmIHRoaXMudmFsdWUgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAvLyBQbGFpbiB2YWx1ZVxyXG4gICAgICBwYXJhbXMgPSBwYXJhbXMuYXBwZW5kKHRoaXMubmFtZSwgdGhpcy5zZXJpYWxpemVWYWx1ZSh0aGlzLnZhbHVlKSk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gcGFyYW1zO1xyXG4gIH1cclxufVxyXG5cclxuLyoqXHJcbiAqIEEgcGFyYW1ldGVyIGluIHRoZSBIVFRQIHJlcXVlc3QgaGVhZGVyXHJcbiAqL1xyXG5jbGFzcyBIZWFkZXJQYXJhbWV0ZXIgZXh0ZW5kcyBQYXJhbWV0ZXIge1xyXG4gIGNvbnN0cnVjdG9yKG5hbWU6IHN0cmluZywgdmFsdWU6IGFueSwgb3B0aW9uczogUGFyYW1ldGVyT3B0aW9ucykge1xyXG4gICAgc3VwZXIobmFtZSwgdmFsdWUsIG9wdGlvbnMsICdzaW1wbGUnLCBmYWxzZSk7XHJcbiAgfVxyXG5cclxuICBhcHBlbmQoaGVhZGVyczogSHR0cEhlYWRlcnMpOiBIdHRwSGVhZGVycyB7XHJcbiAgICBpZiAodGhpcy52YWx1ZSAhPT0gbnVsbCAmJiB0aGlzLnZhbHVlICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgaWYgKHRoaXMudmFsdWUgaW5zdGFuY2VvZiBBcnJheSkge1xyXG4gICAgICAgIGZvciAoY29uc3QgdiBvZiB0aGlzLnZhbHVlKSB7XHJcbiAgICAgICAgICBoZWFkZXJzID0gaGVhZGVycy5hcHBlbmQodGhpcy5uYW1lLCB0aGlzLnNlcmlhbGl6ZVZhbHVlKHYpKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgaGVhZGVycyA9IGhlYWRlcnMuYXBwZW5kKHRoaXMubmFtZSwgdGhpcy5zZXJpYWxpemVWYWx1ZSh0aGlzLnZhbHVlKSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiBoZWFkZXJzO1xyXG4gIH1cclxufVxyXG5cclxuLyoqXHJcbiAqIEhlbHBlciB0byBidWlsZCBodHRwIHJlcXVlc3RzIGZyb20gcGFyYW1ldGVyc1xyXG4gKi9cclxuZXhwb3J0IGNsYXNzIFJlcXVlc3RCdWlsZGVyIHtcclxuXHJcbiAgcHJpdmF0ZSBfcGF0aCA9IG5ldyBNYXA8c3RyaW5nLCBQYXRoUGFyYW1ldGVyPigpO1xyXG4gIHByaXZhdGUgX3F1ZXJ5ID0gbmV3IE1hcDxzdHJpbmcsIFF1ZXJ5UGFyYW1ldGVyPigpO1xyXG4gIHByaXZhdGUgX2hlYWRlciA9IG5ldyBNYXA8c3RyaW5nLCBIZWFkZXJQYXJhbWV0ZXI+KCk7XHJcbiAgX2JvZHlDb250ZW50OiBhbnkgfCBudWxsO1xyXG4gIF9ib2R5Q29udGVudFR5cGU/OiBzdHJpbmc7XHJcblxyXG4gIGNvbnN0cnVjdG9yKFxyXG4gICAgcHVibGljIHJvb3RVcmw6IHN0cmluZyxcclxuICAgIHB1YmxpYyBvcGVyYXRpb25QYXRoOiBzdHJpbmcsXHJcbiAgICBwdWJsaWMgbWV0aG9kOiBzdHJpbmcpIHtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFNldHMgYSBwYXRoIHBhcmFtZXRlclxyXG4gICAqL1xyXG4gIHBhdGgobmFtZTogc3RyaW5nLCB2YWx1ZTogYW55LCBvcHRpb25zPzogUGFyYW1ldGVyT3B0aW9ucyk6IHZvaWQge1xyXG4gICAgdGhpcy5fcGF0aC5zZXQobmFtZSwgbmV3IFBhdGhQYXJhbWV0ZXIobmFtZSwgdmFsdWUsIG9wdGlvbnMgfHwge30pKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFNldHMgYSBxdWVyeSBwYXJhbWV0ZXJcclxuICAgKi9cclxuICBxdWVyeShuYW1lOiBzdHJpbmcsIHZhbHVlOiBhbnksIG9wdGlvbnM/OiBQYXJhbWV0ZXJPcHRpb25zKTogdm9pZCB7XHJcbiAgICB0aGlzLl9xdWVyeS5zZXQobmFtZSwgbmV3IFF1ZXJ5UGFyYW1ldGVyKG5hbWUsIHZhbHVlLCBvcHRpb25zIHx8IHt9KSk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBTZXRzIGEgaGVhZGVyIHBhcmFtZXRlclxyXG4gICAqL1xyXG4gIGhlYWRlcihuYW1lOiBzdHJpbmcsIHZhbHVlOiBhbnksIG9wdGlvbnM/OiBQYXJhbWV0ZXJPcHRpb25zKTogdm9pZCB7XHJcbiAgICB0aGlzLl9oZWFkZXIuc2V0KG5hbWUsIG5ldyBIZWFkZXJQYXJhbWV0ZXIobmFtZSwgdmFsdWUsIG9wdGlvbnMgfHwge30pKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFNldHMgdGhlIGJvZHkgY29udGVudCwgYWxvbmcgd2l0aCB0aGUgY29udGVudCB0eXBlXHJcbiAgICovXHJcbiAgYm9keSh2YWx1ZTogYW55LCBjb250ZW50VHlwZSA9ICdhcHBsaWNhdGlvbi9qc29uJyk6IHZvaWQge1xyXG4gICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgQmxvYikge1xyXG4gICAgICB0aGlzLl9ib2R5Q29udGVudFR5cGUgPSB2YWx1ZS50eXBlO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5fYm9keUNvbnRlbnRUeXBlID0gY29udGVudFR5cGU7XHJcbiAgICB9XHJcbiAgICBpZiAodGhpcy5fYm9keUNvbnRlbnRUeXBlID09PSAnYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkJyAmJiB2YWx1ZSAhPT0gbnVsbCAmJiB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnKSB7XHJcbiAgICAgIC8vIEhhbmRsZSBVUkwtZW5jb2RlZCBkYXRhXHJcbiAgICAgIGNvbnN0IHBhaXJzOiBBcnJheTxbc3RyaW5nLCBzdHJpbmddPiA9IFtdO1xyXG4gICAgICBmb3IgKGNvbnN0IGtleSBvZiBPYmplY3Qua2V5cyh2YWx1ZSkpIHtcclxuICAgICAgICBsZXQgdmFsID0gdmFsdWVba2V5XTtcclxuICAgICAgICBpZiAoISh2YWwgaW5zdGFuY2VvZiBBcnJheSkpIHtcclxuICAgICAgICAgIHZhbCA9IFt2YWxdO1xyXG4gICAgICAgIH1cclxuICAgICAgICBmb3IgKGNvbnN0IHYgb2YgdmFsKSB7XHJcbiAgICAgICAgICBjb25zdCBmb3JtVmFsdWUgPSB0aGlzLmZvcm1EYXRhVmFsdWUodik7XHJcbiAgICAgICAgICBpZiAoZm9ybVZhbHVlICE9PSBudWxsKSB7XHJcbiAgICAgICAgICAgIHBhaXJzLnB1c2goW2tleSwgZm9ybVZhbHVlXSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICAgIHRoaXMuX2JvZHlDb250ZW50ID0gcGFpcnMubWFwKHAgPT4gYCR7ZW5jb2RlVVJJQ29tcG9uZW50KHBbMF0pfT0ke2VuY29kZVVSSUNvbXBvbmVudChwWzFdKX1gKS5qb2luKCcmJyk7XHJcbiAgICB9IGVsc2UgaWYgKHRoaXMuX2JvZHlDb250ZW50VHlwZSA9PT0gJ211bHRpcGFydC9mb3JtLWRhdGEnKSB7XHJcbiAgICAgIC8vIEhhbmRsZSBtdWx0aXBhcnQgZm9ybSBkYXRhXHJcbiAgICAgIGNvbnN0IGZvcm1EYXRhID0gbmV3IEZvcm1EYXRhKCk7XHJcbiAgICAgIGlmICh2YWx1ZSAhPT0gbnVsbCAmJiB2YWx1ZSAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgZm9yIChjb25zdCBrZXkgb2YgT2JqZWN0LmtleXModmFsdWUpKSB7XHJcbiAgICAgICAgICBjb25zdCB2YWwgPSB2YWx1ZVtrZXldO1xyXG4gICAgICAgICAgaWYgKHZhbCBpbnN0YW5jZW9mIEFycmF5KSB7XHJcbiAgICAgICAgICAgIGZvciAoY29uc3QgdiBvZiB2YWwpIHtcclxuICAgICAgICAgICAgICBjb25zdCB0b0FwcGVuZCA9IHRoaXMuZm9ybURhdGFWYWx1ZSh2KTtcclxuICAgICAgICAgICAgICBpZiAodG9BcHBlbmQgIT09IG51bGwpIHtcclxuICAgICAgICAgICAgICAgIGZvcm1EYXRhLmFwcGVuZChrZXksIHRvQXBwZW5kKTtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHRvQXBwZW5kID0gdGhpcy5mb3JtRGF0YVZhbHVlKHZhbCk7XHJcbiAgICAgICAgICAgIGlmICh0b0FwcGVuZCAhPT0gbnVsbCkge1xyXG4gICAgICAgICAgICAgIGZvcm1EYXRhLnNldChrZXksIHRvQXBwZW5kKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgICB0aGlzLl9ib2R5Q29udGVudCA9IGZvcm1EYXRhO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgLy8gVGhlIGJvZHkgaXMgdGhlIHBsYWluIGNvbnRlbnRcclxuICAgICAgdGhpcy5fYm9keUNvbnRlbnQgPSB2YWx1ZTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgZm9ybURhdGFWYWx1ZSh2YWx1ZTogYW55KTogYW55IHtcclxuICAgIGlmICh2YWx1ZSA9PT0gbnVsbCB8fCB2YWx1ZSA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG4gICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgQmxvYikge1xyXG4gICAgICByZXR1cm4gdmFsdWU7XHJcbiAgICB9XHJcbiAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnb2JqZWN0Jykge1xyXG4gICAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkodmFsdWUpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIFN0cmluZyh2YWx1ZSk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBCdWlsZHMgdGhlIHJlcXVlc3Qgd2l0aCB0aGUgY3VycmVudCBzZXQgcGFyYW1ldGVyc1xyXG4gICAqL1xyXG4gIGJ1aWxkPFQgPSBhbnk+KG9wdGlvbnM/OiB7XHJcbiAgICAvKiogV2hpY2ggY29udGVudCB0eXBlcyB0byBhY2NlcHQgKi9cclxuICAgIGFjY2VwdD86IHN0cmluZztcclxuXHJcbiAgICAvKiogVGhlIGV4cGVjdGVkIHJlc3BvbnNlIHR5cGUgKi9cclxuICAgIHJlc3BvbnNlVHlwZT86ICdqc29uJyB8ICd0ZXh0JyB8ICdibG9iJyB8ICdhcnJheWJ1ZmZlcic7XHJcblxyXG4gICAgLyoqIFdoZXRoZXIgdG8gcmVwb3J0IHByb2dyZXNzIG9uIHVwbG9hZHMgLyBkb3dubG9hZHMgKi9cclxuICAgIHJlcG9ydFByb2dyZXNzPzogYm9vbGVhbjtcclxuXHJcbiAgICAvKiogQWxsb3cgcGFzc2luZyBIdHRwQ29udGV4dCBmb3IgSHR0cENsaWVudCAqL1xyXG4gICAgY29udGV4dD86IEh0dHBDb250ZXh0O1xyXG4gIH0pOiBIdHRwUmVxdWVzdDxUPiB7XHJcblxyXG4gICAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XHJcblxyXG4gICAgLy8gUGF0aCBwYXJhbWV0ZXJzXHJcbiAgICBsZXQgcGF0aCA9IHRoaXMub3BlcmF0aW9uUGF0aDtcclxuICAgIGZvciAoY29uc3QgcGF0aFBhcmFtIG9mIHRoaXMuX3BhdGgudmFsdWVzKCkpIHtcclxuICAgICAgcGF0aCA9IHBhdGhQYXJhbS5hcHBlbmQocGF0aCk7XHJcbiAgICB9XHJcbiAgICBjb25zdCB1cmwgPSB0aGlzLnJvb3RVcmwgKyBwYXRoO1xyXG5cclxuICAgIC8vIFF1ZXJ5IHBhcmFtZXRlcnNcclxuICAgIGxldCBodHRwUGFyYW1zID0gbmV3IEh0dHBQYXJhbXMoe1xyXG4gICAgICBlbmNvZGVyOiBQYXJhbWV0ZXJDb2RlY0luc3RhbmNlXHJcbiAgICB9KTtcclxuICAgIGZvciAoY29uc3QgcXVlcnlQYXJhbSBvZiB0aGlzLl9xdWVyeS52YWx1ZXMoKSkge1xyXG4gICAgICBodHRwUGFyYW1zID0gcXVlcnlQYXJhbS5hcHBlbmQoaHR0cFBhcmFtcyk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gSGVhZGVyIHBhcmFtZXRlcnNcclxuICAgIGxldCBodHRwSGVhZGVycyA9IG5ldyBIdHRwSGVhZGVycygpO1xyXG4gICAgaWYgKG9wdGlvbnMuYWNjZXB0KSB7XHJcbiAgICAgIGh0dHBIZWFkZXJzID0gaHR0cEhlYWRlcnMuYXBwZW5kKCdBY2NlcHQnLCBvcHRpb25zLmFjY2VwdCk7XHJcbiAgICB9XHJcbiAgICBmb3IgKGNvbnN0IGhlYWRlclBhcmFtIG9mIHRoaXMuX2hlYWRlci52YWx1ZXMoKSkge1xyXG4gICAgICBodHRwSGVhZGVycyA9IGhlYWRlclBhcmFtLmFwcGVuZChodHRwSGVhZGVycyk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gUmVxdWVzdCBjb250ZW50IGhlYWRlcnNcclxuICAgIGlmICh0aGlzLl9ib2R5Q29udGVudFR5cGUgJiYgISh0aGlzLl9ib2R5Q29udGVudCBpbnN0YW5jZW9mIEZvcm1EYXRhKSkge1xyXG4gICAgICBodHRwSGVhZGVycyA9IGh0dHBIZWFkZXJzLnNldCgnQ29udGVudC1UeXBlJywgdGhpcy5fYm9keUNvbnRlbnRUeXBlKTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBQZXJmb3JtIHRoZSByZXF1ZXN0XHJcbiAgICByZXR1cm4gbmV3IEh0dHBSZXF1ZXN0PFQ+KHRoaXMubWV0aG9kLnRvVXBwZXJDYXNlKCksIHVybCwgdGhpcy5fYm9keUNvbnRlbnQsIHtcclxuICAgICAgcGFyYW1zOiBodHRwUGFyYW1zLFxyXG4gICAgICBoZWFkZXJzOiBodHRwSGVhZGVycyxcclxuICAgICAgcmVzcG9uc2VUeXBlOiBvcHRpb25zLnJlc3BvbnNlVHlwZSxcclxuICAgICAgcmVwb3J0UHJvZ3Jlc3M6IG9wdGlvbnMucmVwb3J0UHJvZ3Jlc3MsXHJcbiAgICAgIGNvbnRleHQ6IG9wdGlvbnMuY29udGV4dFxyXG4gICAgfSk7XHJcbiAgfVxyXG59XHJcbiJdfQ==