nsrtm-gestionarchivo-npm-prueba2
Version:
Proyecto de Libreria Frontend para la Gestión de Archivos
337 lines • 44.4 kB
JavaScript
/* 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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVxdWVzdC1idWlsZGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vYXJjaGl2by9uc3J0bS1nZXN0aW9uYXJjaGl2by1ucG0vc3JjL2FwcC9hcGkvZ2VzdGlvbmFyY2hpdm8vcmVxdWVzdC1idWlsZGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLG9CQUFvQjtBQUNwQixvQkFBb0I7QUFDcEIsT0FBTyxFQUFFLFdBQVcsRUFBc0IsVUFBVSxFQUFFLFdBQVcsRUFBZSxNQUFNLHNCQUFzQixDQUFDO0FBRTdHOzs7R0FHRztBQUNILE1BQU0sY0FBYztJQUNsQixTQUFTLENBQUMsR0FBVztRQUNuQixPQUFPLGtCQUFrQixDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ2pDLENBQUM7SUFFRCxXQUFXLENBQUMsS0FBYTtRQUN2QixPQUFPLGtCQUFrQixDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ25DLENBQUM7SUFFRCxTQUFTLENBQUMsR0FBVztRQUNuQixPQUFPLGtCQUFrQixDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ2pDLENBQUM7SUFFRCxXQUFXLENBQUMsS0FBYTtRQUN2QixPQUFPLGtCQUFrQixDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ25DLENBQUM7Q0FDRjtBQUNELE1BQU0sc0JBQXNCLEdBQUcsSUFBSSxjQUFjLEVBQUUsQ0FBQztBQVVwRDs7R0FFRztBQUNILE1BQWUsU0FBUztJQUN0QixZQUFtQixJQUFZLEVBQVMsS0FBVSxFQUFTLE9BQXlCLEVBQUUsWUFBb0IsRUFBRSxjQUF1QjtRQUFoSCxTQUFJLEdBQUosSUFBSSxDQUFRO1FBQVMsVUFBSyxHQUFMLEtBQUssQ0FBSztRQUFTLFlBQU8sR0FBUCxPQUFPLENBQWtCO1FBQ2xGLElBQUksQ0FBQyxPQUFPLEdBQUcsT0FBTyxJQUFJLEVBQUUsQ0FBQztRQUM3QixJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxLQUFLLElBQUksSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLEtBQUssS0FBSyxTQUFTLEVBQUU7WUFDbkUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLEdBQUcsWUFBWSxDQUFDO1NBQ25DO1FBQ0QsSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sS0FBSyxJQUFJLElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLEtBQUssU0FBUyxFQUFFO1lBQ3ZFLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxHQUFHLGNBQWMsQ0FBQztTQUN2QztJQUNILENBQUM7SUFFRCxjQUFjLENBQUMsS0FBVSxFQUFFLFNBQVMsR0FBRyxHQUFHO1FBQ3hDLElBQUksS0FBSyxLQUFLLElBQUksSUFBSSxLQUFLLEtBQUssU0FBUyxFQUFFO1lBQ3pDLE9BQU8sRUFBRSxDQUFDO1NBQ1g7YUFBTSxJQUFJLEtBQUssWUFBWSxLQUFLLEVBQUU7WUFDakMsT0FBTyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLENBQUMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUM7U0FDcEg7YUFBTSxJQUFJLE9BQU8sS0FBSyxLQUFLLFFBQVEsRUFBRTtZQUNwQyxNQUFNLEtBQUssR0FBYSxFQUFFLENBQUM7WUFDM0IsS0FBSyxNQUFNLEdBQUcsSUFBSSxNQUFNLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxFQUFFO2dCQUNwQyxJQUFJLE9BQU8sR0FBRyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7Z0JBQ3pCLElBQUksT0FBTyxLQUFLLElBQUksSUFBSSxPQUFPLEtBQUssU0FBUyxFQUFFO29CQUM3QyxPQUFPLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLENBQUMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUM7b0JBQzVGLElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLEVBQUU7d0JBQ3hCLEtBQUssQ0FBQyxJQUFJLENBQUMsR0FBRyxHQUFHLElBQUksT0FBTyxFQUFFLENBQUMsQ0FBQztxQkFDakM7eUJBQU07d0JBQ0wsS0FBSyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQzt3QkFDaEIsS0FBSyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztxQkFDckI7aUJBQ0Y7YUFDRjtZQUNELE9BQU8sS0FBSyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQztTQUM5QjthQUFNO1lBQ0wsT0FBTyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7U0FDdEI7SUFDSCxDQUFDO0NBQ0Y7QUFFRDs7R0FFRztBQUNILE1BQU0sYUFBYyxTQUFRLFNBQVM7SUFDbkMsWUFBWSxJQUFZLEVBQUUsS0FBVSxFQUFFLE9BQXlCO1FBQzdELEtBQUssQ0FBQyxJQUFJLEVBQUUsS0FBSyxFQUFFLE9BQU8sRUFBRSxRQUFRLEVBQUUsS0FBSyxDQUFDLENBQUM7SUFDL0MsQ0FBQztJQUVELE1BQU0sQ0FBQyxJQUFZO1FBQ2pCLElBQUksS0FBSyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUM7UUFDdkIsSUFBSSxLQUFLLEtBQUssSUFBSSxJQUFJLEtBQUssS0FBSyxTQUFTLEVBQUU7WUFDekMsS0FBSyxHQUFHLEVBQUUsQ0FBQztTQUNaO1FBQ0QsSUFBSSxNQUFNLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLEtBQUssT0FBTyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztRQUN2RCxJQUFJLFNBQVMsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsTUFBTSxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQztRQUMxRSxJQUFJLGlCQUFpQixHQUFHLEtBQUssQ0FBQztRQUM5QixJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxLQUFLLFFBQVEsRUFBRTtZQUNuQyxxRUFBcUU7WUFDckUsTUFBTSxHQUFHLElBQUksSUFBSSxDQUFDLElBQUksR0FBRyxDQUFDO1lBQzFCLElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLElBQUksT0FBTyxLQUFLLEtBQUssUUFBUSxFQUFFO2dCQUNyRCxNQUFNLEdBQUcsR0FBRyxDQUFDO2dCQUNiLElBQUksS0FBSyxZQUFZLEtBQUssRUFBRTtvQkFDMUIseURBQXlEO29CQUN6RCxLQUFLLEdBQUcsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLElBQUksSUFBSSxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUM7b0JBQ3RFLEtBQUssR0FBRyxLQUFLLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO29CQUN4QixpQkFBaUIsR0FBRyxJQUFJLENBQUM7aUJBQzFCO3FCQUFNO29CQUNMLHdEQUF3RDtvQkFDeEQsS0FBSyxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsS0FBSyxFQUFFLEdBQUcsQ0FBQyxDQUFDO29CQUN4QyxpQkFBaUIsR0FBRyxJQUFJLENBQUE7aUJBQ3pCO2FBQ0Y7U0FDRjtRQUNELEtBQUssR0FBRyxNQUFNLEdBQUcsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLEtBQUssRUFBRSxTQUFTLENBQUMsQ0FBQyxDQUFDO1FBQ3JGLDhHQUE4RztRQUM5RyxJQUFJLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLElBQUksQ0FBQyxJQUFJLEdBQUcsRUFBRSxLQUFLLENBQUMsQ0FBQztRQUM3QyxJQUFJLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLE1BQU0sR0FBRyxJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsR0FBRyxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBQ3hGLE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztJQUVELGFBQWE7SUFDYixjQUFjLENBQUMsS0FBVSxFQUFFLFNBQVMsR0FBRyxHQUFHO1FBQ3hDLElBQUksTUFBTSxHQUFHLE9BQU8sS0FBSyxLQUFLLFFBQVEsQ0FBQyxDQUFDLENBQUMsa0JBQWtCLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxjQUFjLENBQUMsS0FBSyxFQUFFLFNBQVMsQ0FBQyxDQUFDO1FBQzVHLE1BQU0sR0FBRyxNQUFNLENBQUMsT0FBTyxDQUFDLE1BQU0sRUFBRSxHQUFHLENBQUMsQ0FBQztRQUNyQyxNQUFNLEdBQUcsTUFBTSxDQUFDLE9BQU8sQ0FBQyxNQUFNLEVBQUUsR0FBRyxDQUFDLENBQUM7UUFDckMsTUFBTSxHQUFHLE1BQU0sQ0FBQyxPQUFPLENBQUMsTUFBTSxFQUFFLEdBQUcsQ0FBQyxDQUFDO1FBQ3JDLE9BQU8sTUFBTSxDQUFDO0lBQ2hCLENBQUM7Q0FDRjtBQUVEOztHQUVHO0FBQ0gsTUFBTSxjQUFlLFNBQVEsU0FBUztJQUNwQyxZQUFZLElBQVksRUFBRSxLQUFVLEVBQUUsT0FBeUI7UUFDN0QsS0FBSyxDQUFDLElBQUksRUFBRSxLQUFLLEVBQUUsT0FBTyxFQUFFLE1BQU0sRUFBRSxJQUFJLENBQUMsQ0FBQztJQUM1QyxDQUFDO0lBRUQsTUFBTSxDQUFDLE1BQWtCO1FBQ3ZCLElBQUksSUFBSSxDQUFDLEtBQUssWUFBWSxLQUFLLEVBQUU7WUFDL0Isc0JBQXNCO1lBQ3RCLElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLEVBQUU7Z0JBQ3hCLEtBQUssTUFBTSxDQUFDLElBQUksSUFBSSxDQUFDLEtBQUssRUFBRTtvQkFDMUIsTUFBTSxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7aUJBQzNEO2FBQ0Y7aUJBQU07Z0JBQ0wsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLEtBQUssZ0JBQWdCO29CQUN2RCxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLEtBQUssS0FBSyxlQUFlO29CQUM1QyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUM7Z0JBQ2hCLE9BQU8sTUFBTSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxTQUFTLENBQUMsQ0FBQyxDQUFDO2FBQzdFO1NBQ0Y7YUFBTSxJQUFJLElBQUksQ0FBQyxLQUFLLEtBQUssSUFBSSxJQUFJLE9BQU8sSUFBSSxDQUFDLEtBQUssS0FBSyxRQUFRLEVBQUU7WUFDaEUsdUJBQXVCO1lBQ3ZCLElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLEtBQUssWUFBWSxFQUFFO2dCQUN2QywyREFBMkQ7Z0JBQzNELEtBQUssTUFBTSxHQUFHLElBQUksTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEVBQUU7b0JBQ3pDLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7b0JBQ2hDLElBQUksT0FBTyxLQUFLLElBQUksSUFBSSxPQUFPLEtBQUssU0FBUyxFQUFFO3dCQUM3QyxNQUFNLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQyxHQUFHLElBQUksQ0FBQyxJQUFJLElBQUksR0FBRyxHQUFHLEVBQUUsSUFBSSxDQUFDLGNBQWMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDO3FCQUM5RTtpQkFDRjthQUNGO2lCQUFNLElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLEVBQUU7Z0JBQy9CLG1FQUFtRTtnQkFDbkUsS0FBSyxNQUFNLEdBQUcsSUFBSSxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRTtvQkFDekMsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQztvQkFDaEMsSUFBSSxPQUFPLEtBQUssSUFBSSxJQUFJLE9BQU8sS0FBSyxTQUFTLEVBQUU7d0JBQzdDLE1BQU0sR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsY0FBYyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUM7cUJBQzNEO2lCQUNGO2FBQ0Y7aUJBQU07Z0JBQ0wsOEZBQThGO2dCQUM5RixNQUFNLEtBQUssR0FBVSxFQUFFLENBQUM7Z0JBQ3hCLEtBQUssTUFBTSxHQUFHLElBQUksTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEVBQUU7b0JBQ3pDLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7b0JBQ2hDLElBQUksT0FBTyxLQUFLLElBQUksSUFBSSxPQUFPLEtBQUssU0FBUyxFQUFFO3dCQUM3QyxLQUFLLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO3dCQUNoQixLQUFLLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO3FCQUNyQjtpQkFDRjtnQkFDRCxNQUFNLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxjQUFjLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQzthQUMvRDtTQUNGO2FBQU0sSUFBSSxJQUFJLENBQUMsS0FBSyxLQUFLLElBQUksSUFBSSxJQUFJLENBQUMsS0FBSyxLQUFLLFNBQVMsRUFBRTtZQUMxRCxjQUFjO1lBQ2QsTUFBTSxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO1NBQ3BFO1FBQ0QsT0FBTyxNQUFNLENBQUM7SUFDaEIsQ0FBQztDQUNGO0FBRUQ7O0dBRUc7QUFDSCxNQUFNLGVBQWdCLFNBQVEsU0FBUztJQUNyQyxZQUFZLElBQVksRUFBRSxLQUFVLEVBQUUsT0FBeUI7UUFDN0QsS0FBSyxDQUFDLElBQUksRUFBRSxLQUFLLEVBQUUsT0FBTyxFQUFFLFFBQVEsRUFBRSxLQUFLLENBQUMsQ0FBQztJQUMvQyxDQUFDO0lBRUQsTUFBTSxDQUFDLE9BQW9CO1FBQ3pCLElBQUksSUFBSSxDQUFDLEtBQUssS0FBSyxJQUFJLElBQUksSUFBSSxDQUFDLEtBQUssS0FBSyxTQUFTLEVBQUU7WUFDbkQsSUFBSSxJQUFJLENBQUMsS0FBSyxZQUFZLEtBQUssRUFBRTtnQkFDL0IsS0FBSyxNQUFNLENBQUMsSUFBSSxJQUFJLENBQUMsS0FBSyxFQUFFO29CQUMxQixPQUFPLEdBQUcsT0FBTyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztpQkFDN0Q7YUFDRjtpQkFBTTtnQkFDTCxPQUFPLEdBQUcsT0FBTyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7YUFDdEU7U0FDRjtRQUNELE9BQU8sT0FBTyxDQUFDO0lBQ2pCLENBQUM7Q0FDRjtBQUVEOztHQUVHO0FBQ0gsTUFBTSxPQUFPLGNBQWM7SUFRekIsWUFDUyxPQUFlLEVBQ2YsYUFBcUIsRUFDckIsTUFBYztRQUZkLFlBQU8sR0FBUCxPQUFPLENBQVE7UUFDZixrQkFBYSxHQUFiLGFBQWEsQ0FBUTtRQUNyQixXQUFNLEdBQU4sTUFBTSxDQUFRO1FBVGYsVUFBSyxHQUFHLElBQUksR0FBRyxFQUF5QixDQUFDO1FBQ3pDLFdBQU0sR0FBRyxJQUFJLEdBQUcsRUFBMEIsQ0FBQztRQUMzQyxZQUFPLEdBQUcsSUFBSSxHQUFHLEVBQTJCLENBQUM7SUFRckQsQ0FBQztJQUVEOztPQUVHO0lBQ0gsSUFBSSxDQUFDLElBQVksRUFBRSxLQUFVLEVBQUUsT0FBMEI7UUFDdkQsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsSUFBSSxFQUFFLElBQUksYUFBYSxDQUFDLElBQUksRUFBRSxLQUFLLEVBQUUsT0FBTyxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDdEUsQ0FBQztJQUVEOztPQUVHO0lBQ0gsS0FBSyxDQUFDLElBQVksRUFBRSxLQUFVLEVBQUUsT0FBMEI7UUFDeEQsSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsSUFBSSxFQUFFLElBQUksY0FBYyxDQUFDLElBQUksRUFBRSxLQUFLLEVBQUUsT0FBTyxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDeEUsQ0FBQztJQUVEOztPQUVHO0lBQ0gsTUFBTSxDQUFDLElBQVksRUFBRSxLQUFVLEVBQUUsT0FBMEI7UUFDekQsSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsSUFBSSxFQUFFLElBQUksZUFBZSxDQUFDLElBQUksRUFBRSxLQUFLLEVBQUUsT0FBTyxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDMUUsQ0FBQztJQUVEOztPQUVHO0lBQ0gsSUFBSSxDQUFDLEtBQVUsRUFBRSxXQUFXLEdBQUcsa0JBQWtCO1FBQy9DLElBQUksS0FBSyxZQUFZLElBQUksRUFBRTtZQUN6QixJQUFJLENBQUMsZ0JBQWdCLEdBQUcsS0FBSyxDQUFDLElBQUksQ0FBQztTQUNwQzthQUFNO1lBQ0wsSUFBSSxDQUFDLGdCQUFnQixHQUFHLFdBQVcsQ0FBQztTQUNyQztRQUNELElBQUksSUFBSSxDQUFDLGdCQUFnQixLQUFLLG1DQUFtQyxJQUFJLEtBQUssS0FBSyxJQUFJLElBQUksT0FBTyxLQUFLLEtBQUssUUFBUSxFQUFFO1lBQ2hILDBCQUEwQjtZQUMxQixNQUFNLEtBQUssR0FBNEIsRUFBRSxDQUFDO1lBQzFDLEtBQUssTUFBTSxHQUFHLElBQUksTUFBTSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRTtnQkFDcEMsSUFBSSxHQUFHLEdBQUcsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO2dCQUNyQixJQUFJLENBQUMsQ0FBQyxHQUFHLFlBQVksS0FBSyxDQUFDLEVBQUU7b0JBQzNCLEdBQUcsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO2lCQUNiO2dCQUNELEtBQUssTUFBTSxDQUFDLElBQUksR0FBRyxFQUFFO29CQUNuQixNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDO29CQUN4QyxJQUFJLFNBQVMsS0FBSyxJQUFJLEVBQUU7d0JBQ3RCLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQyxHQUFHLEVBQUUsU0FBUyxDQUFDLENBQUMsQ0FBQztxQkFDOUI7aUJBQ0Y7YUFDRjtZQUNELElBQUksQ0FBQyxZQUFZLEdBQUcsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsa0JBQWtCLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksa0JBQWtCLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztTQUN6RzthQUFNLElBQUksSUFBSSxDQUFDLGdCQUFnQixLQUFLLHFCQUFxQixFQUFFO1lBQzFELDZCQUE2QjtZQUM3QixNQUFNLFFBQVEsR0FBRyxJQUFJLFFBQVEsRUFBRSxDQUFDO1lBQ2hDLElBQUksS0FBSyxLQUFLLElBQUksSUFBSSxLQUFLLEtBQUssU0FBUyxFQUFFO2dCQUN6QyxLQUFLLE1BQU0sR0FBRyxJQUFJLE1BQU0sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEVBQUU7b0JBQ3BDLE1BQU0sR0FBRyxHQUFHLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQztvQkFDdkIsSUFBSSxHQUFHLFlBQVksS0FBSyxFQUFFO3dCQUN4QixLQUFLLE1BQU0sQ0FBQyxJQUFJLEdBQUcsRUFBRTs0QkFDbkIsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQzs0QkFDdkMsSUFBSSxRQUFRLEtBQUssSUFBSSxFQUFFO2dDQUNyQixRQUFRLENBQUMsTUFBTSxDQUFDLEdBQUcsRUFBRSxRQUFRLENBQUMsQ0FBQzs2QkFDaEM7eUJBQ0Y7cUJBQ0Y7eUJBQU07d0JBQ0wsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxHQUFHLENBQUMsQ0FBQzt3QkFDekMsSUFBSSxRQUFRLEtBQUssSUFBSSxFQUFFOzRCQUNyQixRQUFRLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxRQUFRLENBQUMsQ0FBQzt5QkFDN0I7cUJBQ0Y7aUJBQ0Y7YUFDRjtZQUNELElBQUksQ0FBQyxZQUFZLEdBQUcsUUFBUSxDQUFDO1NBQzlCO2FBQU07WUFDTCxnQ0FBZ0M7WUFDaEMsSUFBSSxDQUFDLFlBQVksR0FBRyxLQUFLLENBQUM7U0FDM0I7SUFDSCxDQUFDO0lBRU8sYUFBYSxDQUFDLEtBQVU7UUFDOUIsSUFBSSxLQUFLLEtBQUssSUFBSSxJQUFJLEtBQUssS0FBSyxTQUFTLEVBQUU7WUFDekMsT0FBTyxJQUFJLENBQUM7U0FDYjtRQUNELElBQUksS0FBSyxZQUFZLElBQUksRUFBRTtZQUN6QixPQUFPLEtBQUssQ0FBQztTQUNkO1FBQ0QsSUFBSSxPQUFPLEtBQUssS0FBSyxRQUFRLEVBQUU7WUFDN0IsT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxDQUFDO1NBQzlCO1FBQ0QsT0FBTyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDdkIsQ0FBQztJQUVEOztPQUVHO0lBQ0gsS0FBSyxDQUFVLE9BWWQ7UUFFQyxPQUFPLEdBQUcsT0FBTyxJQUFJLEVBQUUsQ0FBQztRQUV4QixrQkFBa0I7UUFDbEIsSUFBSSxJQUFJLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQztRQUM5QixLQUFLLE1BQU0sU0FBUyxJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxFQUFFLEVBQUU7WUFDM0MsSUFBSSxHQUFHLFNBQVMsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUM7U0FDL0I7UUFDRCxNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQztRQUVoQyxtQkFBbUI7UUFDbkIsSUFBSSxVQUFVLEdBQUcsSUFBSSxVQUFVLENBQUM7WUFDOUIsT0FBTyxFQUFFLHNCQUFzQjtTQUNoQyxDQUFDLENBQUM7UUFDSCxLQUFLLE1BQU0sVUFBVSxJQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxFQUFFLEVBQUU7WUFDN0MsVUFBVSxHQUFHLFVBQVUsQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLENBQUM7U0FDNUM7UUFFRCxvQkFBb0I7UUFDcEIsSUFBSSxXQUFXLEdBQUcsSUFBSSxXQUFXLEVBQUUsQ0FBQztRQUNwQyxJQUFJLE9BQU8sQ0FBQyxNQUFNLEVBQUU7WUFDbEIsV0FBVyxHQUFHLFdBQVcsQ0FBQyxNQUFNLENBQUMsUUFBUSxFQUFFLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQztTQUM1RDtRQUNELEtBQUssTUFBTSxXQUFXLElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLEVBQUUsRUFBRTtZQUMvQyxXQUFXLEdBQUcsV0FBVyxDQUFDLE1BQU0sQ0FBQyxXQUFXLENBQUMsQ0FBQztTQUMvQztRQUVELDBCQUEwQjtRQUMxQixJQUFJLElBQUksQ0FBQyxnQkFBZ0IsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLFlBQVksWUFBWSxRQUFRLENBQUMsRUFBRTtZQUNyRSxXQUFXLEdBQUcsV0FBVyxDQUFDLEdBQUcsQ0FBQyxjQUFjLEVBQUUsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUM7U0FDdEU7UUFFRCxzQkFBc0I7UUFDdEIsT0FBTyxJQUFJLFdBQVcsQ0FBSSxJQUFJLENBQUMsTUFBTSxDQUFDLFdBQVcsRUFBRSxFQUFFLEdBQUcsRUFBRSxJQUFJLENBQUMsWUFBWSxFQUFFO1lBQzNFLE1BQU0sRUFBRSxVQUFVO1lBQ2xCLE9BQU8sRUFBRSxXQUFXO1lBQ3BCLFlBQVksRUFBRSxPQUFPLENBQUMsWUFBWTtZQUNsQyxjQUFjLEVBQUUsT0FBTyxDQUFDLGNBQWM7WUFDdEMsT0FBTyxFQUFFLE9BQU8sQ0FBQyxPQUFPO1NBQ3pCLENBQUMsQ0FBQztJQUNMLENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbIi8qIHRzbGludDpkaXNhYmxlICovXHJcbi8qIGVzbGludC1kaXNhYmxlICovXHJcbmltcG9ydCB7IEh0dHBSZXF1ZXN0LCBIdHRwUGFyYW1ldGVyQ29kZWMsIEh0dHBQYXJhbXMsIEh0dHBIZWFkZXJzLCBIdHRwQ29udGV4dCB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbi9odHRwJztcclxuXHJcbi8qKlxyXG4gKiBDdXN0b20gcGFyYW1ldGVyIGNvZGVjIHRvIGNvcnJlY3RseSBoYW5kbGUgdGhlIHBsdXMgc2lnbiBpbiBwYXJhbWV0ZXJcclxuICogdmFsdWVzLiBTZWUgaHR0cHM6Ly9naXRodWIuY29tL2FuZ3VsYXIvYW5ndWxhci9pc3N1ZXMvMTgyNjFcclxuICovXHJcbmNsYXNzIFBhcmFtZXRlckNvZGVjIGltcGxlbWVudHMgSHR0cFBhcmFtZXRlckNvZGVjIHtcclxuICBlbmNvZGVLZXkoa2V5OiBzdHJpbmcpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIGVuY29kZVVSSUNvbXBvbmVudChrZXkpO1xyXG4gIH1cclxuXHJcbiAgZW5jb2RlVmFsdWUodmFsdWU6IHN0cmluZyk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gZW5jb2RlVVJJQ29tcG9uZW50KHZhbHVlKTtcclxuICB9XHJcblxyXG4gIGRlY29kZUtleShrZXk6IHN0cmluZyk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gZGVjb2RlVVJJQ29tcG9uZW50KGtleSk7XHJcbiAgfVxyXG5cclxuICBkZWNvZGVWYWx1ZSh2YWx1ZTogc3RyaW5nKTogc3RyaW5nIHtcclxuICAgIHJldHVybiBkZWNvZGVVUklDb21wb25lbnQodmFsdWUpO1xyXG4gIH1cclxufVxyXG5jb25zdCBQYXJhbWV0ZXJDb2RlY0luc3RhbmNlID0gbmV3IFBhcmFtZXRlckNvZGVjKCk7XHJcblxyXG4vKipcclxuICogRGVmaW5lcyB0aGUgb3B0aW9ucyBmb3IgYXBwZW5kaW5nIGEgcGFyYW1ldGVyXHJcbiAqL1xyXG5pbnRlcmZhY2UgUGFyYW1ldGVyT3B0aW9ucyB7XHJcbiAgc3R5bGU/OiBzdHJpbmc7XHJcbiAgZXhwbG9kZT86IGJvb2xlYW47XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBCYXNlIGNsYXNzIGZvciBhIHBhcmFtZXRlclxyXG4gKi9cclxuYWJzdHJhY3QgY2xhc3MgUGFyYW1ldGVyIHtcclxuICBjb25zdHJ1Y3RvcihwdWJsaWMgbmFtZTogc3RyaW5nLCBwdWJsaWMgdmFsdWU6IGFueSwgcHVibGljIG9wdGlvbnM6IFBhcmFtZXRlck9wdGlvbnMsIGRlZmF1bHRTdHlsZTogc3RyaW5nLCBkZWZhdWx0RXhwbG9kZTogYm9vbGVhbikge1xyXG4gICAgdGhpcy5vcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcclxuICAgIGlmICh0aGlzLm9wdGlvbnMuc3R5bGUgPT09IG51bGwgfHwgdGhpcy5vcHRpb25zLnN0eWxlID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgdGhpcy5vcHRpb25zLnN0eWxlID0gZGVmYXVsdFN0eWxlO1xyXG4gICAgfVxyXG4gICAgaWYgKHRoaXMub3B0aW9ucy5leHBsb2RlID09PSBudWxsIHx8IHRoaXMub3B0aW9ucy5leHBsb2RlID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgdGhpcy5vcHRpb25zLmV4cGxvZGUgPSBkZWZhdWx0RXhwbG9kZTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHNlcmlhbGl6ZVZhbHVlKHZhbHVlOiBhbnksIHNlcGFyYXRvciA9ICcsJyk6IHN0cmluZyB7XHJcbiAgICBpZiAodmFsdWUgPT09IG51bGwgfHwgdmFsdWUgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICByZXR1cm4gJyc7XHJcbiAgICB9IGVsc2UgaWYgKHZhbHVlIGluc3RhbmNlb2YgQXJyYXkpIHtcclxuICAgICAgcmV0dXJuIHZhbHVlLm1hcCh2ID0+IHRoaXMuc2VyaWFsaXplVmFsdWUodikuc3BsaXQoc2VwYXJhdG9yKS5qb2luKGVuY29kZVVSSUNvbXBvbmVudChzZXBhcmF0b3IpKSkuam9pbihzZXBhcmF0b3IpO1xyXG4gICAgfSBlbHNlIGlmICh0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnKSB7XHJcbiAgICAgIGNvbnN0IGFycmF5OiBzdHJpbmdbXSA9IFtdO1xyXG4gICAgICBmb3IgKGNvbnN0IGtleSBvZiBPYmplY3Qua2V5cyh2YWx1ZSkpIHtcclxuICAgICAgICBsZXQgcHJvcFZhbCA9IHZhbHVlW2tleV07XHJcbiAgICAgICAgaWYgKHByb3BWYWwgIT09IG51bGwgJiYgcHJvcFZhbCAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICBwcm9wVmFsID0gdGhpcy5zZXJpYWxpemVWYWx1ZShwcm9wVmFsKS5zcGxpdChzZXBhcmF0b3IpLmpvaW4oZW5jb2RlVVJJQ29tcG9uZW50KHNlcGFyYXRvcikpO1xyXG4gICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5leHBsb2RlKSB7XHJcbiAgICAgICAgICAgIGFycmF5LnB1c2goYCR7a2V5fT0ke3Byb3BWYWx9YCk7XHJcbiAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBhcnJheS5wdXNoKGtleSk7XHJcbiAgICAgICAgICAgIGFycmF5LnB1c2gocHJvcFZhbCk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICAgIHJldHVybiBhcnJheS5qb2luKHNlcGFyYXRvcik7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICByZXR1cm4gU3RyaW5nKHZhbHVlKTtcclxuICAgIH1cclxuICB9XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBBIHBhcmFtZXRlciBpbiB0aGUgb3BlcmF0aW9uIHBhdGhcclxuICovXHJcbmNsYXNzIFBhdGhQYXJhbWV0ZXIgZXh0ZW5kcyBQYXJhbWV0ZXIge1xyXG4gIGNvbnN0cnVjdG9yKG5hbWU6IHN0cmluZywgdmFsdWU6IGFueSwgb3B0aW9uczogUGFyYW1ldGVyT3B0aW9ucykge1xyXG4gICAgc3VwZXIobmFtZSwgdmFsdWUsIG9wdGlvbnMsICdzaW1wbGUnLCBmYWxzZSk7XHJcbiAgfVxyXG5cclxuICBhcHBlbmQocGF0aDogc3RyaW5nKTogc3RyaW5nIHtcclxuICAgIGxldCB2YWx1ZSA9IHRoaXMudmFsdWU7XHJcbiAgICBpZiAodmFsdWUgPT09IG51bGwgfHwgdmFsdWUgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICB2YWx1ZSA9ICcnO1xyXG4gICAgfVxyXG4gICAgbGV0IHByZWZpeCA9IHRoaXMub3B0aW9ucy5zdHlsZSA9PT0gJ2xhYmVsJyA/ICcuJyA6ICcnO1xyXG4gICAgbGV0IHNlcGFyYXRvciA9IHRoaXMub3B0aW9ucy5leHBsb2RlID8gcHJlZml4ID09PSAnJyA/ICcsJyA6IHByZWZpeCA6ICcsJztcclxuICAgIGxldCBhbHJlYWR5U2VyaWFsaXplZCA9IGZhbHNlO1xyXG4gICAgaWYgKHRoaXMub3B0aW9ucy5zdHlsZSA9PT0gJ21hdHJpeCcpIHtcclxuICAgICAgLy8gVGhlIHBhcmFtZXRlciBuYW1lIGlzIGp1c3QgdXNlZCBhcyBwcmVmaXgsIGV4Y2VwdCBpbiBzb21lIGNhc2VzLi4uXHJcbiAgICAgIHByZWZpeCA9IGA7JHt0aGlzLm5hbWV9PWA7XHJcbiAgICAgIGlmICh0aGlzLm9wdGlvbnMuZXhwbG9kZSAmJiB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnKSB7XHJcbiAgICAgICAgcHJlZml4ID0gJzsnO1xyXG4gICAgICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIEFycmF5KSB7XHJcbiAgICAgICAgICAvLyBGb3IgYXJyYXlzIHdlIGhhdmUgdG8gcmVwZWF0IHRoZSBuYW1lIGZvciBlYWNoIGVsZW1lbnRcclxuICAgICAgICAgIHZhbHVlID0gdmFsdWUubWFwKHYgPT4gYCR7dGhpcy5uYW1lfT0ke3RoaXMuc2VyaWFsaXplVmFsdWUodiwgJzsnKX1gKTtcclxuICAgICAgICAgIHZhbHVlID0gdmFsdWUuam9pbignOycpO1xyXG4gICAgICAgICAgYWxyZWFkeVNlcmlhbGl6ZWQgPSB0cnVlO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAvLyBGb3Igb2JqZWN0cyB3ZSBoYXZlIHRvIHB1dCBlYWNoIHRoZSBrZXkgLyB2YWx1ZSBwYWlyc1xyXG4gICAgICAgICAgdmFsdWUgPSB0aGlzLnNlcmlhbGl6ZVZhbHVlKHZhbHVlLCAnOycpO1xyXG4gICAgICAgICAgYWxyZWFkeVNlcmlhbGl6ZWQgPSB0cnVlXHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICB2YWx1ZSA9IHByZWZpeCArIChhbHJlYWR5U2VyaWFsaXplZCA/IHZhbHVlIDogdGhpcy5zZXJpYWxpemVWYWx1ZSh2YWx1ZSwgc2VwYXJhdG9yKSk7XHJcbiAgICAvLyBSZXBsYWNlIGJvdGggdGhlIHBsYWluIHZhcmlhYmxlIGFuZCB0aGUgY29ycmVzcG9uZGluZyB2YXJpYW50IHRha2luZyBpbiB0aGUgcHJlZml4IGFuZCBleHBsb2RlIGludG8gYWNjb3VudFxyXG4gICAgcGF0aCA9IHBhdGgucmVwbGFjZShgeyR7dGhpcy5uYW1lfX1gLCB2YWx1ZSk7XHJcbiAgICBwYXRoID0gcGF0aC5yZXBsYWNlKGB7JHtwcmVmaXh9JHt0aGlzLm5hbWV9JHt0aGlzLm9wdGlvbnMuZXhwbG9kZSA/ICcqJyA6ICcnfX1gLCB2YWx1ZSk7XHJcbiAgICByZXR1cm4gcGF0aDtcclxuICB9XHJcblxyXG4gIC8vIEB0cy1pZ25vcmVcclxuICBzZXJpYWxpemVWYWx1ZSh2YWx1ZTogYW55LCBzZXBhcmF0b3IgPSAnLCcpOiBzdHJpbmcge1xyXG4gICAgdmFyIHJlc3VsdCA9IHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycgPyBlbmNvZGVVUklDb21wb25lbnQodmFsdWUpIDogc3VwZXIuc2VyaWFsaXplVmFsdWUodmFsdWUsIHNlcGFyYXRvcik7XHJcbiAgICByZXN1bHQgPSByZXN1bHQucmVwbGFjZSgvJTNEL2csICc9Jyk7XHJcbiAgICByZXN1bHQgPSByZXN1bHQucmVwbGFjZSgvJTNCL2csICc7Jyk7XHJcbiAgICByZXN1bHQgPSByZXN1bHQucmVwbGFjZSgvJTJDL2csICcsJyk7XHJcbiAgICByZXR1cm4gcmVzdWx0O1xyXG4gIH1cclxufVxyXG5cclxuLyoqXHJcbiAqIEEgcGFyYW1ldGVyIGluIHRoZSBxdWVyeVxyXG4gKi9cclxuY2xhc3MgUXVlcnlQYXJhbWV0ZXIgZXh0ZW5kcyBQYXJhbWV0ZXIge1xyXG4gIGNvbnN0cnVjdG9yKG5hbWU6IHN0cmluZywgdmFsdWU6IGFueSwgb3B0aW9uczogUGFyYW1ldGVyT3B0aW9ucykge1xyXG4gICAgc3VwZXIobmFtZSwgdmFsdWUsIG9wdGlvbnMsICdmb3JtJywgdHJ1ZSk7XHJcbiAgfVxyXG5cclxuICBhcHBlbmQocGFyYW1zOiBIdHRwUGFyYW1zKTogSHR0cFBhcmFtcyB7XHJcbiAgICBpZiAodGhpcy52YWx1ZSBpbnN0YW5jZW9mIEFycmF5KSB7XHJcbiAgICAgIC8vIEFycmF5IHNlcmlhbGl6YXRpb25cclxuICAgICAgaWYgKHRoaXMub3B0aW9ucy5leHBsb2RlKSB7XHJcbiAgICAgICAgZm9yIChjb25zdCB2IG9mIHRoaXMudmFsdWUpIHtcclxuICAgICAgICAgIHBhcmFtcyA9IHBhcmFtcy5hcHBlbmQodGhpcy5uYW1lLCB0aGlzLnNlcmlhbGl6ZVZhbHVlKHYpKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgY29uc3Qgc2VwYXJhdG9yID0gdGhpcy5vcHRpb25zLnN0eWxlID09PSAnc3BhY2VEZWxpbWl0ZWQnXHJcbiAgICAgICAgICA/ICcgJyA6IHRoaXMub3B0aW9ucy5zdHlsZSA9PT0gJ3BpcGVEZWxpbWl0ZWQnXHJcbiAgICAgICAgICAgID8gJ3wnIDogJywnO1xyXG4gICAgICAgIHJldHVybiBwYXJhbXMuYXBwZW5kKHRoaXMubmFtZSwgdGhpcy5zZXJpYWxpemVWYWx1ZSh0aGlzLnZhbHVlLCBzZXBhcmF0b3IpKTtcclxuICAgICAgfVxyXG4gICAgfSBlbHNlIGlmICh0aGlzLnZhbHVlICE9PSBudWxsICYmIHR5cGVvZiB0aGlzLnZhbHVlID09PSAnb2JqZWN0Jykge1xyXG4gICAgICAvLyBPYmplY3Qgc2VyaWFsaXphdGlvblxyXG4gICAgICBpZiAodGhpcy5vcHRpb25zLnN0eWxlID09PSAnZGVlcE9iamVjdCcpIHtcclxuICAgICAgICAvLyBBcHBlbmQgYSBwYXJhbWV0ZXIgZm9yIGVhY2gga2V5LCBpbiB0aGUgZm9ybSBgbmFtZVtrZXldYFxyXG4gICAgICAgIGZvciAoY29uc3Qga2V5IG9mIE9iamVjdC5rZXlzKHRoaXMudmFsdWUpKSB7XHJcbiAgICAgICAgICBjb25zdCBwcm9wVmFsID0gdGhpcy52YWx1ZVtrZXldO1xyXG4gICAgICAgICAgaWYgKHByb3BWYWwgIT09IG51bGwgJiYgcHJvcFZhbCAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIHBhcmFtcyA9IHBhcmFtcy5hcHBlbmQoYCR7dGhpcy5uYW1lfVske2tleX1dYCwgdGhpcy5zZXJpYWxpemVWYWx1ZShwcm9wVmFsKSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9IGVsc2UgaWYgKHRoaXMub3B0aW9ucy5leHBsb2RlKSB7XHJcbiAgICAgICAgLy8gQXBwZW5kIGEgcGFyYW1ldGVyIGZvciBlYWNoIGtleSB3aXRob3V0IHVzaW5nIHRoZSBwYXJhbWV0ZXIgbmFtZVxyXG4gICAgICAgIGZvciAoY29uc3Qga2V5IG9mIE9iamVjdC5rZXlzKHRoaXMudmFsdWUpKSB7XHJcbiAgICAgICAgICBjb25zdCBwcm9wVmFsID0gdGhpcy52YWx1ZVtrZXldO1xyXG4gICAgICAgICAgaWYgKHByb3BWYWwgIT09IG51bGwgJiYgcHJvcFZhbCAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIHBhcmFtcyA9IHBhcmFtcy5hcHBlbmQoa2V5LCB0aGlzLnNlcmlhbGl6ZVZhbHVlKHByb3BWYWwpKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgLy8gQXBwZW5kIGEgc2luZ2xlIHBhcmFtZXRlciB3aG9zZSB2YWx1ZXMgYXJlIGEgY29tbWEtc2VwYXJhdGVkIGxpc3Qgb2Yga2V5LHZhbHVlLGtleSx2YWx1ZS4uLlxyXG4gICAgICAgIGNvbnN0IGFycmF5OiBhbnlbXSA9IFtdO1xyXG4gICAgICAgIGZvciAoY29uc3Qga2V5IG9mIE9iamVjdC5rZXlzKHRoaXMudmFsdWUpKSB7XHJcbiAgICAgICAgICBjb25zdCBwcm9wVmFsID0gdGhpcy52YWx1ZVtrZXldO1xyXG4gICAgICAgICAgaWYgKHByb3BWYWwgIT09IG51bGwgJiYgcHJvcFZhbCAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIGFycmF5LnB1c2goa2V5KTtcclxuICAgICAgICAgICAgYXJyYXkucHVzaChwcm9wVmFsKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcGFyYW1zID0gcGFyYW1zLmFwcGVuZCh0aGlzLm5hbWUsIHRoaXMuc2VyaWFsaXplVmFsdWUoYXJyYXkpKTtcclxuICAgICAgfVxyXG4gICAgfSBlbHNlIGlmICh0aGlzLnZhbHVlICE9PSBudWxsICYmIHRoaXMudmFsdWUgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAvLyBQbGFpbiB2YWx1ZVxyXG4gICAgICBwYXJhbXMgPSBwYXJhbXMuYXBwZW5kKHRoaXMubmFtZSwgdGhpcy5zZXJpYWxpemVWYWx1ZSh0aGlzLnZhbHVlKSk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gcGFyYW1zO1xyXG4gIH1cclxufVxyXG5cclxuLyoqXHJcbiAqIEEgcGFyYW1ldGVyIGluIHRoZSBIVFRQIHJlcXVlc3QgaGVhZGVyXHJcbiAqL1xyXG5jbGFzcyBIZWFkZXJQYXJhbWV0ZXIgZXh0ZW5kcyBQYXJhbWV0ZXIge1xyXG4gIGNvbnN0cnVjdG9yKG5hbWU6IHN0cmluZywgdmFsdWU6IGFueSwgb3B0aW9uczogUGFyYW1ldGVyT3B0aW9ucykge1xyXG4gICAgc3VwZXIobmFtZSwgdmFsdWUsIG9wdGlvbnMsICdzaW1wbGUnLCBmYWxzZSk7XHJcbiAgfVxyXG5cclxuICBhcHBlbmQoaGVhZGVyczogSHR0cEhlYWRlcnMpOiBIdHRwSGVhZGVycyB7XHJcbiAgICBpZiAodGhpcy52YWx1ZSAhPT0gbnVsbCAmJiB0aGlzLnZhbHVlICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgaWYgKHRoaXMudmFsdWUgaW5zdGFuY2VvZiBBcnJheSkge1xyXG4gICAgICAgIGZvciAoY29uc3QgdiBvZiB0aGlzLnZhbHVlKSB7XHJcbiAgICAgICAgICBoZWFkZXJzID0gaGVhZGVycy5hcHBlbmQodGhpcy5uYW1lLCB0aGlzLnNlcmlhbGl6ZVZhbHVlKHYpKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgaGVhZGVycyA9IGhlYWRlcnMuYXBwZW5kKHRoaXMubmFtZSwgdGhpcy5zZXJpYWxpemVWYWx1ZSh0aGlzLnZhbHVlKSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiBoZWFkZXJzO1xyXG4gIH1cclxufVxyXG5cclxuLyoqXHJcbiAqIEhlbHBlciB0byBidWlsZCBodHRwIHJlcXVlc3RzIGZyb20gcGFyYW1ldGVyc1xyXG4gKi9cclxuZXhwb3J0IGNsYXNzIFJlcXVlc3RCdWlsZGVyIHtcclxuXHJcbiAgcHJpdmF0ZSBfcGF0aCA9IG5ldyBNYXA8c3RyaW5nLCBQYXRoUGFyYW1ldGVyPigpO1xyXG4gIHByaXZhdGUgX3F1ZXJ5ID0gbmV3IE1hcDxzdHJpbmcsIFF1ZXJ5UGFyYW1ldGVyPigpO1xyXG4gIHByaXZhdGUgX2hlYWRlciA9IG5ldyBNYXA8c3RyaW5nLCBIZWFkZXJQYXJhbWV0ZXI+KCk7XHJcbiAgX2JvZHlDb250ZW50OiBhbnkgfCBudWxsO1xyXG4gIF9ib2R5Q29udGVudFR5cGU/OiBzdHJpbmc7XHJcblxyXG4gIGNvbnN0cnVjdG9yKFxyXG4gICAgcHVibGljIHJvb3RVcmw6IHN0cmluZyxcclxuICAgIHB1YmxpYyBvcGVyYXRpb25QYXRoOiBzdHJpbmcsXHJcbiAgICBwdWJsaWMgbWV0aG9kOiBzdHJpbmcpIHtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFNldHMgYSBwYXRoIHBhcmFtZXRlclxyXG4gICAqL1xyXG4gIHBhdGgobmFtZTogc3RyaW5nLCB2YWx1ZTogYW55LCBvcHRpb25zPzogUGFyYW1ldGVyT3B0aW9ucyk6IHZvaWQge1xyXG4gICAgdGhpcy5fcGF0aC5zZXQobmFtZSwgbmV3IFBhdGhQYXJhbWV0ZXIobmFtZSwgdmFsdWUsIG9wdGlvbnMgfHwge30pKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFNldHMgYSBxdWVyeSBwYXJhbWV0ZXJcclxuICAgKi9cclxuICBxdWVyeShuYW1lOiBzdHJpbmcsIHZhbHVlOiBhbnksIG9wdGlvbnM/OiBQYXJhbWV0ZXJPcHRpb25zKTogdm9pZCB7XHJcbiAgICB0aGlzLl9xdWVyeS5zZXQobmFtZSwgbmV3IFF1ZXJ5UGFyYW1ldGVyKG5hbWUsIHZhbHVlLCBvcHRpb25zIHx8IHt9KSk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBTZXRzIGEgaGVhZGVyIHBhcmFtZXRlclxyXG4gICAqL1xyXG4gIGhlYWRlcihuYW1lOiBzdHJpbmcsIHZhbHVlOiBhbnksIG9wdGlvbnM/OiBQYXJhbWV0ZXJPcHRpb25zKTogdm9pZCB7XHJcbiAgICB0aGlzLl9oZWFkZXIuc2V0KG5hbWUsIG5ldyBIZWFkZXJQYXJhbWV0ZXIobmFtZSwgdmFsdWUsIG9wdGlvbnMgfHwge30pKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFNldHMgdGhlIGJvZHkgY29udGVudCwgYWxvbmcgd2l0aCB0aGUgY29udGVudCB0eXBlXHJcbiAgICovXHJcbiAgYm9keSh2YWx1ZTogYW55LCBjb250ZW50VHlwZSA9ICdhcHBsaWNhdGlvbi9qc29uJyk6IHZvaWQge1xyXG4gICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgQmxvYikge1xyXG4gICAgICB0aGlzLl9ib2R5Q29udGVudFR5cGUgPSB2YWx1ZS50eXBlO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5fYm9keUNvbnRlbnRUeXBlID0gY29udGVudFR5cGU7XHJcbiAgICB9XHJcbiAgICBpZiAodGhpcy5fYm9keUNvbnRlbnRUeXBlID09PSAnYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkJyAmJiB2YWx1ZSAhPT0gbnVsbCAmJiB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnKSB7XHJcbiAgICAgIC8vIEhhbmRsZSBVUkwtZW5jb2RlZCBkYXRhXHJcbiAgICAgIGNvbnN0IHBhaXJzOiBBcnJheTxbc3RyaW5nLCBzdHJpbmddPiA9IFtdO1xyXG4gICAgICBmb3IgKGNvbnN0IGtleSBvZiBPYmplY3Qua2V5cyh2YWx1ZSkpIHtcclxuICAgICAgICBsZXQgdmFsID0gdmFsdWVba2V5XTtcclxuICAgICAgICBpZiAoISh2YWwgaW5zdGFuY2VvZiBBcnJheSkpIHtcclxuICAgICAgICAgIHZhbCA9IFt2YWxdO1xyXG4gICAgICAgIH1cclxuICAgICAgICBmb3IgKGNvbnN0IHYgb2YgdmFsKSB7XHJcbiAgICAgICAgICBjb25zdCBmb3JtVmFsdWUgPSB0aGlzLmZvcm1EYXRhVmFsdWUodik7XHJcbiAgICAgICAgICBpZiAoZm9ybVZhbHVlICE9PSBudWxsKSB7XHJcbiAgICAgICAgICAgIHBhaXJzLnB1c2goW2tleSwgZm9ybVZhbHVlXSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICAgIHRoaXMuX2JvZHlDb250ZW50ID0gcGFpcnMubWFwKHAgPT4gYCR7ZW5jb2RlVVJJQ29tcG9uZW50KHBbMF0pfT0ke2VuY29kZVVSSUNvbXBvbmVudChwWzFdKX1gKS5qb2luKCcmJyk7XHJcbiAgICB9IGVsc2UgaWYgKHRoaXMuX2JvZHlDb250ZW50VHlwZSA9PT0gJ211bHRpcGFydC9mb3JtLWRhdGEnKSB7XHJcbiAgICAgIC8vIEhhbmRsZSBtdWx0aXBhcnQgZm9ybSBkYXRhXHJcbiAgICAgIGNvbnN0IGZvcm1EYXRhID0gbmV3IEZvcm1EYXRhKCk7XHJcbiAgICAgIGlmICh2YWx1ZSAhPT0gbnVsbCAmJiB2YWx1ZSAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgZm9yIChjb25zdCBrZXkgb2YgT2JqZWN0LmtleXModmFsdWUpKSB7XHJcbiAgICAgICAgICBjb25zdCB2YWwgPSB2YWx1ZVtrZXldO1xyXG4gICAgICAgICAgaWYgKHZhbCBpbnN0YW5jZW9mIEFycmF5KSB7XHJcbiAgICAgICAgICAgIGZvciAoY29uc3QgdiBvZiB2YWwpIHtcclxuICAgICAgICAgICAgICBjb25zdCB0b0FwcGVuZCA9IHRoaXMuZm9ybURhdGFWYWx1ZSh2KTtcclxuICAgICAgICAgICAgICBpZiAodG9BcHBlbmQgIT09IG51bGwpIHtcclxuICAgICAgICAgICAgICAgIGZvcm1EYXRhLmFwcGVuZChrZXksIHRvQXBwZW5kKTtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHRvQXBwZW5kID0gdGhpcy5mb3JtRGF0YVZhbHVlKHZhbCk7XHJcbiAgICAgICAgICAgIGlmICh0b0FwcGVuZCAhPT0gbnVsbCkge1xyXG4gICAgICAgICAgICAgIGZvcm1EYXRhLnNldChrZXksIHRvQXBwZW5kKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgICB0aGlzLl9ib2R5Q29udGVudCA9IGZvcm1EYXRhO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgLy8gVGhlIGJvZHkgaXMgdGhlIHBsYWluIGNvbnRlbnRcclxuICAgICAgdGhpcy5fYm9keUNvbnRlbnQgPSB2YWx1ZTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgZm9ybURhdGFWYWx1ZSh2YWx1ZTogYW55KTogYW55IHtcclxuICAgIGlmICh2YWx1ZSA9PT0gbnVsbCB8fCB2YWx1ZSA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG4gICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgQmxvYikge1xyXG4gICAgICByZXR1cm4gdmFsdWU7XHJcbiAgICB9XHJcbiAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnb2JqZWN0Jykge1xyXG4gICAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkodmFsdWUpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIFN0cmluZyh2YWx1ZSk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBCdWlsZHMgdGhlIHJlcXVlc3Qgd2l0aCB0aGUgY3VycmVudCBzZXQgcGFyYW1ldGVyc1xyXG4gICAqL1xyXG4gIGJ1aWxkPFQgPSBhbnk+KG9wdGlvbnM/OiB7XHJcbiAgICAvKiogV2hpY2ggY29udGVudCB0eXBlcyB0byBhY2NlcHQgKi9cclxuICAgIGFjY2VwdD86IHN0cmluZztcclxuXHJcbiAgICAvKiogVGhlIGV4cGVjdGVkIHJlc3BvbnNlIHR5cGUgKi9cclxuICAgIHJlc3BvbnNlVHlwZT86ICdqc29uJyB8ICd0ZXh0JyB8ICdibG9iJyB8ICdhcnJheWJ1ZmZlcic7XHJcblxyXG4gICAgLyoqIFdoZXRoZXIgdG8gcmVwb3J0IHByb2dyZXNzIG9uIHVwbG9hZHMgLyBkb3dubG9hZHMgKi9cclxuICAgIHJlcG9ydFByb2dyZXNzPzogYm9vbGVhbjtcclxuXHJcbiAgICAvKiogQWxsb3cgcGFzc2luZyBIdHRwQ29udGV4dCBmb3IgSHR0cENsaWVudCAqL1xyXG4gICAgY29udGV4dD86IEh0dHBDb250ZXh0O1xyXG4gIH0pOiBIdHRwUmVxdWVzdDxUPiB7XHJcblxyXG4gICAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XHJcblxyXG4gICAgLy8gUGF0aCBwYXJhbWV0ZXJzXHJcbiAgICBsZXQgcGF0aCA9IHRoaXMub3BlcmF0aW9uUGF0aDtcclxuICAgIGZvciAoY29uc3QgcGF0aFBhcmFtIG9mIHRoaXMuX3BhdGgudmFsdWVzKCkpIHtcclxuICAgICAgcGF0aCA9IHBhdGhQYXJhbS5hcHBlbmQocGF0aCk7XHJcbiAgICB9XHJcbiAgICBjb25zdCB1cmwgPSB0aGlzLnJvb3RVcmwgKyBwYXRoO1xyXG5cclxuICAgIC8vIFF1ZXJ5IHBhcmFtZXRlcnNcclxuICAgIGxldCBodHRwUGFyYW1zID0gbmV3IEh0dHBQYXJhbXMoe1xyXG4gICAgICBlbmNvZGVyOiBQYXJhbWV0ZXJDb2RlY0luc3RhbmNlXHJcbiAgICB9KTtcclxuICAgIGZvciAoY29uc3QgcXVlcnlQYXJhbSBvZiB0aGlzLl9xdWVyeS52YWx1ZXMoKSkge1xyXG4gICAgICBodHRwUGFyYW1zID0gcXVlcnlQYXJhbS5hcHBlbmQoaHR0cFBhcmFtcyk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gSGVhZGVyIHBhcmFtZXRlcnNcclxuICAgIGxldCBodHRwSGVhZGVycyA9IG5ldyBIdHRwSGVhZGVycygpO1xyXG4gICAgaWYgKG9wdGlvbnMuYWNjZXB0KSB7XHJcbiAgICAgIGh0dHBIZWFkZXJzID0gaHR0cEhlYWRlcnMuYXBwZW5kKCdBY2NlcHQnLCBvcHRpb25zLmFjY2VwdCk7XHJcbiAgICB9XHJcbiAgICBmb3IgKGNvbnN0IGhlYWRlclBhcmFtIG9mIHRoaXMuX2hlYWRlci52YWx1ZXMoKSkge1xyXG4gICAgICBodHRwSGVhZGVycyA9IGhlYWRlclBhcmFtLmFwcGVuZChodHRwSGVhZGVycyk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gUmVxdWVzdCBjb250ZW50IGhlYWRlcnNcclxuICAgIGlmICh0aGlzLl9ib2R5Q29udGVudFR5cGUgJiYgISh0aGlzLl9ib2R5Q29udGVudCBpbnN0YW5jZW9mIEZvcm1EYXRhKSkge1xyXG4gICAgICBodHRwSGVhZGVycyA9IGh0dHBIZWFkZXJzLnNldCgnQ29udGVudC1UeXBlJywgdGhpcy5fYm9keUNvbnRlbnRUeXBlKTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBQZXJmb3JtIHRoZSByZXF1ZXN0XHJcbiAgICByZXR1cm4gbmV3IEh0dHBSZXF1ZXN0PFQ+KHRoaXMubWV0aG9kLnRvVXBwZXJDYXNlKCksIHVybCwgdGhpcy5fYm9keUNvbnRlbnQsIHtcclxuICAgICAgcGFyYW1zOiBodHRwUGFyYW1zLFxyXG4gICAgICBoZWFkZXJzOiBodHRwSGVhZGVycyxcclxuICAgICAgcmVzcG9uc2VUeXBlOiBvcHRpb25zLnJlc3BvbnNlVHlwZSxcclxuICAgICAgcmVwb3J0UHJvZ3Jlc3M6IG9wdGlvbnMucmVwb3J0UHJvZ3Jlc3MsXHJcbiAgICAgIGNvbnRleHQ6IG9wdGlvbnMuY29udGV4dFxyXG4gICAgfSk7XHJcbiAgfVxyXG59XHJcbiJdfQ==