devextreme-angular
Version:
Angular UI and visualization components based on DevExtreme widgets
216 lines • 33.9 kB
JavaScript
/*!
* devextreme-angular
* Version: 25.1.4
* Build date: Tue Aug 05 2025
*
* Copyright (c) 2012 - 2025 Developer Express Inc. ALL RIGHTS RESERVED
*
* This software may be modified and distributed under the terms
* of the MIT license. See the LICENSE file in the root of the project for details.
*
* https://github.com/DevExpress/devextreme-angular
*/
import { HttpEventType, HttpParams, } from '@angular/common/http';
import { throwError, Subject } from 'rxjs';
import { takeUntil, timeoutWith } from 'rxjs/operators';
import { Deferred } from 'devextreme/core/utils/deferred';
import { isDefined } from 'devextreme/core/utils/type';
import { getWindow } from 'devextreme/core/utils/window';
import { isCrossDomain, evalCrossDomainScript, getRequestOptions, getJsonpCallbackName, getRequestHeaders as getAjaxRequestHeaders, getAcceptHeader, getMethod, evalScript, } from 'devextreme/core/utils/ajax_utils';
const PARSER_ERROR = 'parsererror';
const SUCCESS = 'success';
const ERROR = 'error';
const NO_CONTENT = 'nocontent';
const TIMEOUT = 'timeout';
const STATUS_ABORT = 0;
const CONTENT_TYPE = 'Content-Type';
const URLENCODED = 'application/x-www-form-urlencoded';
function assignResponseProps(xhrSurrogate, response) {
const getResponseHeader = (name) => response.headers.get(name);
function makeResponseText() {
const body = 'error' in response ? response.error : response.body;
if (typeof body !== 'string' || String(getResponseHeader(CONTENT_TYPE)).startsWith('application/json')) {
return JSON.stringify(body);
}
return body;
}
Object.assign(xhrSurrogate, {
status: response.status,
statusText: response.statusText,
getResponseHeader,
responseText: makeResponseText(),
});
return xhrSurrogate;
}
function isGetMethod(options) {
return getMethod(options) === 'GET';
}
function isCacheNeed(options) {
if (options.cache === undefined) {
return !(isUsedScript(options) || isUsedJSONP(options));
}
return options.cache;
}
function isUsedScript(options) {
return options.dataType === 'script';
}
function isUsedJSONP(options) {
return options.dataType === 'jsonp';
}
function getRequestHeaders(options) {
const headers = getAjaxRequestHeaders(options);
const { upload } = options;
if (!headers.Accept) {
headers.Accept = getAcceptHeader(options);
}
if (!upload && !isGetMethod(options) && !headers[CONTENT_TYPE]) {
headers[CONTENT_TYPE] = options.contentType || `${URLENCODED};charset=utf-8`;
}
return Object.keys(headers).reduce((acc, key) => {
if (isDefined(headers[key])) {
acc[key] = headers[key];
}
return acc;
}, {});
}
function rejectIfAborted(deferred, xhrSurrogate, callback) {
if (xhrSurrogate.aborted) {
deferred.reject({ status: STATUS_ABORT, statusText: 'aborted', ok: false });
callback?.();
}
}
function getJsonpParameters(options) {
const patchedOptions = { ...options };
const callbackName = getJsonpCallbackName(patchedOptions);
return { callbackName, data: patchedOptions.data };
}
function addJsonpCallback(callbackName, deferred, xhrSurrogate) {
getWindow()[callbackName] = (data) => deferred.resolve(data, SUCCESS, xhrSurrogate);
}
function sendRequestByScript(url, deferred, xhrSurrogate) {
evalCrossDomainScript(url).then(() => deferred.resolve(null, SUCCESS, xhrSurrogate), () => deferred.reject(xhrSurrogate, ERROR));
}
function getRequestCallbacks(options, deferred, xhrSurrogate) {
return {
next(response) {
if (isUsedJSONP(options)) {
return options.crossDomain
? deferred.resolve(response, 'success', assignResponseProps(xhrSurrogate, response))
: evalScript(response.body);
}
if (isUsedScript(options)) {
evalScript(response.body);
}
return deferred.resolve(response.body, response.body ? 'success' : NO_CONTENT, assignResponseProps(xhrSurrogate, response));
},
error(error) {
error = error && typeof error === 'object' ? error : { error };
let errorStatus = error?.statusText === TIMEOUT ? TIMEOUT : 'error';
errorStatus = options.dataType === 'json' && error?.message?.includes?.('parsing')
? PARSER_ERROR
: errorStatus;
return deferred.reject(assignResponseProps(xhrSurrogate, { status: 400, ...error }), errorStatus, error);
},
complete() {
rejectIfAborted(deferred, xhrSurrogate);
},
};
}
function getUploadCallbacks(options, deferred, xhrSurrogate) {
let total = 0;
let isUploadStarted = false;
return {
next: (event) => {
if (!isUploadStarted
&& [HttpEventType.UploadProgress, HttpEventType.Sent].includes(event.type)) {
options.upload.onloadstart?.(event);
isUploadStarted = true;
}
if (event.type === HttpEventType.UploadProgress) {
total += event.loaded;
options.upload.onprogress?.({ ...event, total });
}
else if (event.type === HttpEventType.Response) {
xhrSurrogate.status = event.status;
xhrSurrogate.statusText = event.statusText;
xhrSurrogate.response = event;
const result = options?.dataType === 'json' && typeof event.body === 'object'
? event.body
: xhrSurrogate;
return deferred.resolve(result, SUCCESS);
}
return null;
},
error(error) {
error = error && typeof error === 'object' ? error : { error };
return deferred.reject(assignResponseProps(xhrSurrogate, { status: 400, ...error }), error.status, error);
},
complete() {
rejectIfAborted(deferred, xhrSurrogate, () => {
options.upload?.onabort?.(xhrSurrogate);
});
},
};
}
export const sendRequestFactory = (httpClient) => (options) => {
const abort$ = new Subject();
const deferred = Deferred();
const result = deferred.promise();
const isGet = isGetMethod(options);
const isJSONP = isUsedJSONP(options);
const isScript = isUsedScript(options);
options.crossDomain = isCrossDomain(options.url);
options.cache = isCacheNeed(options);
const headers = getRequestHeaders(options);
const xhrSurrogate = {
type: 'XMLHttpRequestSurrogate',
aborted: false,
abort() {
this.aborted = true;
abort$.next();
},
};
result.abort = () => xhrSurrogate.abort();
if (!options.crossDomain && isJSONP) {
const { callbackName, data } = getJsonpParameters(options);
options.data = { ...options.data, ...data };
addJsonpCallback(callbackName, deferred, xhrSurrogate);
}
const { url, parameters: data } = getRequestOptions(options, headers);
const { upload, beforeSend, xhrFields } = options;
beforeSend?.(xhrSurrogate);
if (options.crossDomain && isScript && !xhrSurrogate.aborted) {
sendRequestByScript(url, deferred, xhrSurrogate);
return result;
}
if (options.cache === false && isGet && data) {
data._ = Date.now() + 1;
}
const makeBody = () => (!upload && typeof data === 'object' && headers[CONTENT_TYPE].indexOf(URLENCODED) === 0
? Object.keys(data).reduce((httpParams, key) => httpParams.set(key, data[key]), new HttpParams()).toString()
: data);
const body = isGet ? undefined : makeBody();
const params = isGet ? data : undefined;
const request = options.crossDomain && isJSONP
? httpClient.jsonp(url, options.jsonp || 'callback')
: httpClient.request(getMethod(options), url, {
params,
body,
headers,
reportProgress: true,
withCredentials: xhrFields?.withCredentials,
observe: upload ? 'events' : 'response',
responseType: options.responseType || (isScript || isJSONP ? 'text' : options.dataType),
});
const subscriptionCallbacks = upload
? getUploadCallbacks
: getRequestCallbacks;
request.pipe.apply(request, [
takeUntil(abort$),
...options.timeout
? [timeoutWith(options.timeout, throwError({ statusText: TIMEOUT, status: 0, ok: false }))]
: [],
]).subscribe(subscriptionCallbacks(options, deferred, xhrSurrogate));
return result;
};
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWpheC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL2Rpc3QvaHR0cC9hamF4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7OztHQVdHO0FBRUgsT0FBTyxFQUNPLGFBQWEsRUFBRSxVQUFVLEdBQ3RDLE1BQU0sc0JBQXNCLENBQUM7QUFDOUIsT0FBTyxFQUFFLFVBQVUsRUFBRSxPQUFPLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDM0MsT0FBTyxFQUFFLFNBQVMsRUFBRSxXQUFXLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUN4RCxPQUFPLEVBQUUsUUFBUSxFQUFlLE1BQU0sZ0NBQWdDLENBQUM7QUFDdkUsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQ3ZELE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUN6RCxPQUFPLEVBQ0wsYUFBYSxFQUNiLHFCQUFxQixFQUNyQixpQkFBaUIsRUFDakIsb0JBQW9CLEVBQ3BCLGlCQUFpQixJQUFJLHFCQUFxQixFQUMxQyxlQUFlLEVBQ2YsU0FBUyxFQUNULFVBQVUsR0FDWCxNQUFNLGtDQUFrQyxDQUFDO0FBa0IxQyxNQUFNLFlBQVksR0FBRyxhQUFhLENBQUM7QUFDbkMsTUFBTSxPQUFPLEdBQUcsU0FBUyxDQUFDO0FBQzFCLE1BQU0sS0FBSyxHQUFHLE9BQU8sQ0FBQztBQUN0QixNQUFNLFVBQVUsR0FBRyxXQUFXLENBQUM7QUFDL0IsTUFBTSxPQUFPLEdBQUcsU0FBUyxDQUFDO0FBQzFCLE1BQU0sWUFBWSxHQUFHLENBQUMsQ0FBQztBQUN2QixNQUFNLFlBQVksR0FBRyxjQUFjLENBQUM7QUFDcEMsTUFBTSxVQUFVLEdBQUcsbUNBQW1DLENBQUM7QUFFdkQsU0FBUyxtQkFBbUIsQ0FBQyxZQUEwQixFQUFFLFFBQStDO0lBQ3RHLE1BQU0saUJBQWlCLEdBQUcsQ0FBQyxJQUFZLEVBQUUsRUFBRSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDO0lBRXZFLFNBQVMsZ0JBQWdCO1FBQ3ZCLE1BQU0sSUFBSSxHQUFHLE9BQU8sSUFBSSxRQUFRLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUM7UUFFbEUsSUFBSSxPQUFPLElBQUksS0FBSyxRQUFRLElBQUksTUFBTSxDQUFDLGlCQUFpQixDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLGtCQUFrQixDQUFDLEVBQUUsQ0FBQztZQUN2RyxPQUFPLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDOUIsQ0FBQztRQUVELE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztJQUVELE1BQU0sQ0FBQyxNQUFNLENBQUMsWUFBWSxFQUFFO1FBQzFCLE1BQU0sRUFBRSxRQUFRLENBQUMsTUFBTTtRQUN2QixVQUFVLEVBQUUsUUFBUSxDQUFDLFVBQVU7UUFDL0IsaUJBQWlCO1FBQ2pCLFlBQVksRUFBRSxnQkFBZ0IsRUFBRTtLQUNqQyxDQUFDLENBQUM7SUFFSCxPQUFPLFlBQVksQ0FBQztBQUN0QixDQUFDO0FBRUQsU0FBUyxXQUFXLENBQUMsT0FBZ0I7SUFDbkMsT0FBTyxTQUFTLENBQUMsT0FBTyxDQUFDLEtBQUssS0FBSyxDQUFDO0FBQ3RDLENBQUM7QUFFRCxTQUFTLFdBQVcsQ0FBQyxPQUFnQjtJQUNuQyxJQUFJLE9BQU8sQ0FBQyxLQUFLLEtBQUssU0FBUyxFQUFFLENBQUM7UUFDaEMsT0FBTyxDQUFDLENBQUMsWUFBWSxDQUFDLE9BQU8sQ0FBQyxJQUFJLFdBQVcsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDO0lBQzFELENBQUM7SUFFRCxPQUFPLE9BQU8sQ0FBQyxLQUFLLENBQUM7QUFDdkIsQ0FBQztBQUVELFNBQVMsWUFBWSxDQUFDLE9BQWdCO0lBQ3BDLE9BQU8sT0FBTyxDQUFDLFFBQVEsS0FBSyxRQUFRLENBQUM7QUFDdkMsQ0FBQztBQUVELFNBQVMsV0FBVyxDQUFDLE9BQWdCO0lBQ25DLE9BQU8sT0FBTyxDQUFDLFFBQVEsS0FBSyxPQUFPLENBQUM7QUFDdEMsQ0FBQztBQUVELFNBQVMsaUJBQWlCLENBQUMsT0FBZ0I7SUFDekMsTUFBTSxPQUFPLEdBQUcscUJBQXFCLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDL0MsTUFBTSxFQUFFLE1BQU0sRUFBRSxHQUFHLE9BQU8sQ0FBQztJQUUzQixJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sRUFBRSxDQUFDO1FBQ3BCLE9BQU8sQ0FBQyxNQUFNLEdBQUcsZUFBZSxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQzVDLENBQUM7SUFFRCxJQUFJLENBQUMsTUFBTSxJQUFJLENBQUMsV0FBVyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLFlBQVksQ0FBQyxFQUFFLENBQUM7UUFDL0QsT0FBTyxDQUFDLFlBQVksQ0FBQyxHQUFHLE9BQU8sQ0FBQyxXQUFXLElBQUksR0FBRyxVQUFVLGdCQUFnQixDQUFDO0lBQy9FLENBQUM7SUFFRCxPQUFPLE1BQU0sQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxFQUFFO1FBQzlDLElBQUksU0FBUyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUM7WUFDNUIsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUMxQixDQUFDO1FBQ0QsT0FBTyxHQUFHLENBQUM7SUFDYixDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7QUFDVCxDQUFDO0FBRUQsU0FBUyxlQUFlLENBQUMsUUFBd0IsRUFBRSxZQUEwQixFQUFFLFFBQXFCO0lBQ2xHLElBQUksWUFBWSxDQUFDLE9BQU8sRUFBRSxDQUFDO1FBQ3pCLFFBQVEsQ0FBQyxNQUFNLENBQUMsRUFBRSxNQUFNLEVBQUUsWUFBWSxFQUFFLFVBQVUsRUFBRSxTQUFTLEVBQUUsRUFBRSxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUM7UUFDNUUsUUFBUSxFQUFFLEVBQUUsQ0FBQztJQUNmLENBQUM7QUFDSCxDQUFDO0FBRUQsU0FBUyxrQkFBa0IsQ0FBQyxPQUFnQjtJQUMxQyxNQUFNLGNBQWMsR0FBRyxFQUFFLEdBQUcsT0FBTyxFQUFFLENBQUM7SUFDdEMsTUFBTSxZQUFZLEdBQUcsb0JBQW9CLENBQUMsY0FBYyxDQUFDLENBQUM7SUFFMUQsT0FBTyxFQUFFLFlBQVksRUFBRSxJQUFJLEVBQUUsY0FBYyxDQUFDLElBQUksRUFBRSxDQUFDO0FBQ3JELENBQUM7QUFFRCxTQUFTLGdCQUFnQixDQUFDLFlBQW9CLEVBQUUsUUFBd0IsRUFBRSxZQUEwQjtJQUNsRyxTQUFTLEVBQUUsQ0FBQyxZQUFZLENBQUMsR0FBRyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxJQUFJLEVBQUUsT0FBTyxFQUFFLFlBQVksQ0FBQyxDQUFDO0FBQ3RGLENBQUM7QUFFRCxTQUFTLG1CQUFtQixDQUFDLEdBQVcsRUFBRSxRQUF3QixFQUFFLFlBQTBCO0lBQzVGLHFCQUFxQixDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FDN0IsR0FBRyxFQUFFLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxJQUFJLEVBQUUsT0FBTyxFQUFFLFlBQVksQ0FBQyxFQUNuRCxHQUFHLEVBQUUsQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLFlBQVksRUFBRSxLQUFLLENBQUMsQ0FDM0MsQ0FBQztBQUNKLENBQUM7QUFFRCxTQUFTLG1CQUFtQixDQUFDLE9BQWdCLEVBQUUsUUFBd0IsRUFBRSxZQUEwQjtJQUNqRyxPQUFPO1FBQ0wsSUFBSSxDQUFDLFFBQTJCO1lBQzlCLElBQUksV0FBVyxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUM7Z0JBQ3pCLE9BQU8sT0FBTyxDQUFDLFdBQVc7b0JBQ3hCLENBQUMsQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLFFBQVEsRUFBRSxTQUFTLEVBQUUsbUJBQW1CLENBQUMsWUFBWSxFQUFFLFFBQVEsQ0FBQyxDQUFDO29CQUNwRixDQUFDLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUNoQyxDQUFDO1lBRUQsSUFBSSxZQUFZLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQztnQkFDMUIsVUFBVSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUM1QixDQUFDO1lBRUQsT0FBTyxRQUFRLENBQUMsT0FBTyxDQUNyQixRQUFRLENBQUMsSUFBSSxFQUNiLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsVUFBVSxFQUN0QyxtQkFBbUIsQ0FBQyxZQUFZLEVBQUUsUUFBUSxDQUFDLENBQzVDLENBQUM7UUFDSixDQUFDO1FBQ0QsS0FBSyxDQUFDLEtBQXdCO1lBQzVCLEtBQUssR0FBRyxLQUFLLElBQUksT0FBTyxLQUFLLEtBQUssUUFBUSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsS0FBSyxFQUFrQyxDQUFDO1lBQy9GLElBQUksV0FBVyxHQUFHLEtBQUssRUFBRSxVQUFVLEtBQUssT0FBTyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQztZQUVwRSxXQUFXLEdBQUcsT0FBTyxDQUFDLFFBQVEsS0FBSyxNQUFNLElBQUksS0FBSyxFQUFFLE9BQU8sRUFBRSxRQUFRLEVBQUUsQ0FBQyxTQUFTLENBQUM7Z0JBQ2hGLENBQUMsQ0FBQyxZQUFZO2dCQUNkLENBQUMsQ0FBQyxXQUFXLENBQUM7WUFFaEIsT0FBTyxRQUFRLENBQUMsTUFBTSxDQUFDLG1CQUFtQixDQUFDLFlBQVksRUFBRSxFQUFFLE1BQU0sRUFBRSxHQUFHLEVBQUUsR0FBRyxLQUFLLEVBQXVCLENBQUMsRUFBRSxXQUFXLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFDaEksQ0FBQztRQUNELFFBQVE7WUFDTixlQUFlLENBQUMsUUFBUSxFQUFFLFlBQVksQ0FBQyxDQUFDO1FBQzFDLENBQUM7S0FDRixDQUFDO0FBQ0osQ0FBQztBQUVELFNBQVMsa0JBQWtCLENBQUMsT0FBZ0IsRUFBRSxRQUF3QixFQUFFLFlBQTBCO0lBQ2hHLElBQUksS0FBSyxHQUFHLENBQUMsQ0FBQztJQUNkLElBQUksZUFBZSxHQUFHLEtBQUssQ0FBQztJQUU1QixPQUFPO1FBQ0wsSUFBSSxFQUFFLENBQUMsS0FBd0IsRUFBRSxFQUFFO1lBQ2pDLElBQUksQ0FBQyxlQUFlO21CQUNiLENBQUMsYUFBYSxDQUFDLGNBQWMsRUFBRSxhQUFhLENBQUMsSUFBSSxDQUFDLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDO2dCQUMvRSxPQUFPLENBQUMsTUFBTSxDQUFDLFdBQVcsRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFDO2dCQUNwQyxlQUFlLEdBQUcsSUFBSSxDQUFDO1lBQ3pCLENBQUM7WUFFRCxJQUFJLEtBQUssQ0FBQyxJQUFJLEtBQUssYUFBYSxDQUFDLGNBQWMsRUFBRSxDQUFDO2dCQUNoRCxLQUFLLElBQUksS0FBSyxDQUFDLE1BQU0sQ0FBQztnQkFDdEIsT0FBTyxDQUFDLE1BQU0sQ0FBQyxVQUFVLEVBQUUsQ0FBQyxFQUFFLEdBQUcsS0FBSyxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUM7WUFDbkQsQ0FBQztpQkFBTSxJQUFJLEtBQUssQ0FBQyxJQUFJLEtBQUssYUFBYSxDQUFDLFFBQVEsRUFBRSxDQUFDO2dCQUNqRCxZQUFZLENBQUMsTUFBTSxHQUFHLEtBQUssQ0FBQyxNQUFNLENBQUM7Z0JBQ25DLFlBQVksQ0FBQyxVQUFVLEdBQUcsS0FBSyxDQUFDLFVBQVUsQ0FBQztnQkFDM0MsWUFBWSxDQUFDLFFBQVEsR0FBRyxLQUFLLENBQUM7Z0JBRTlCLE1BQU0sTUFBTSxHQUFHLE9BQU8sRUFBRSxRQUFRLEtBQUssTUFBTSxJQUFJLE9BQU8sS0FBSyxDQUFDLElBQUksS0FBSyxRQUFRO29CQUMzRSxDQUFDLENBQUMsS0FBSyxDQUFDLElBQUk7b0JBQ1osQ0FBQyxDQUFDLFlBQVksQ0FBQztnQkFFakIsT0FBTyxRQUFRLENBQUMsT0FBTyxDQUFDLE1BQU0sRUFBRSxPQUFPLENBQUMsQ0FBQztZQUMzQyxDQUFDO1lBQ0QsT0FBTyxJQUFJLENBQUM7UUFDZCxDQUFDO1FBQ0QsS0FBSyxDQUFDLEtBQXdCO1lBQzVCLEtBQUssR0FBRyxLQUFLLElBQUksT0FBTyxLQUFLLEtBQUssUUFBUSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsS0FBSyxFQUFrQyxDQUFDO1lBQy9GLE9BQU8sUUFBUSxDQUFDLE1BQU0sQ0FBQyxtQkFBbUIsQ0FBQyxZQUFZLEVBQUUsRUFBRSxNQUFNLEVBQUUsR0FBRyxFQUFFLEdBQUcsS0FBSyxFQUF1QixDQUFDLEVBQUUsS0FBSyxDQUFDLE1BQU0sRUFBRSxLQUFLLENBQUMsQ0FBQztRQUNqSSxDQUFDO1FBQ0QsUUFBUTtZQUNOLGVBQWUsQ0FBQyxRQUFRLEVBQUUsWUFBWSxFQUFFLEdBQUcsRUFBRTtnQkFDM0MsT0FBTyxDQUFDLE1BQU0sRUFBRSxPQUFPLEVBQUUsQ0FBQyxZQUFZLENBQUMsQ0FBQztZQUMxQyxDQUFDLENBQUMsQ0FBQztRQUNMLENBQUM7S0FDRixDQUFDO0FBQ0osQ0FBQztBQUVELE1BQU0sQ0FBQyxNQUFNLGtCQUFrQixHQUFHLENBQUMsVUFBc0IsRUFBRSxFQUFFLENBQUMsQ0FBQyxPQUFnQixFQUFFLEVBQUU7SUFDakYsTUFBTSxNQUFNLEdBQUcsSUFBSSxPQUFPLEVBQVEsQ0FBQztJQUNuQyxNQUFNLFFBQVEsR0FBbUIsUUFBUSxFQUFFLENBQUM7SUFDNUMsTUFBTSxNQUFNLEdBQUcsUUFBUSxDQUFDLE9BQU8sRUFBWSxDQUFDO0lBQzVDLE1BQU0sS0FBSyxHQUFHLFdBQVcsQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUNuQyxNQUFNLE9BQU8sR0FBRyxXQUFXLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDckMsTUFBTSxRQUFRLEdBQUcsWUFBWSxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBRXZDLE9BQU8sQ0FBQyxXQUFXLEdBQUcsYUFBYSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUNqRCxPQUFPLENBQUMsS0FBSyxHQUFHLFdBQVcsQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUVyQyxNQUFNLE9BQU8sR0FBRyxpQkFBaUIsQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUMzQyxNQUFNLFlBQVksR0FBaUI7UUFDakMsSUFBSSxFQUFFLHlCQUF5QjtRQUMvQixPQUFPLEVBQUUsS0FBSztRQUNkLEtBQUs7WUFDSCxJQUFJLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQztZQUNwQixNQUFNLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDaEIsQ0FBQztLQUNGLENBQUM7SUFFRixNQUFNLENBQUMsS0FBSyxHQUFHLEdBQUcsRUFBRSxDQUFDLFlBQVksQ0FBQyxLQUFLLEVBQUUsQ0FBQztJQUUxQyxJQUFJLENBQUMsT0FBTyxDQUFDLFdBQVcsSUFBSSxPQUFPLEVBQUUsQ0FBQztRQUNwQyxNQUFNLEVBQUUsWUFBWSxFQUFFLElBQUksRUFBRSxHQUFHLGtCQUFrQixDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBRTNELE9BQU8sQ0FBQyxJQUFJLEdBQUcsRUFBRSxHQUFHLE9BQU8sQ0FBQyxJQUFJLEVBQUUsR0FBRyxJQUFJLEVBQUUsQ0FBQztRQUU1QyxnQkFBZ0IsQ0FBQyxZQUFZLEVBQUUsUUFBUSxFQUFFLFlBQVksQ0FBQyxDQUFDO0lBQ3pELENBQUM7SUFFRCxNQUFNLEVBQUUsR0FBRyxFQUFFLFVBQVUsRUFBRSxJQUFJLEVBQUUsR0FBRyxpQkFBaUIsQ0FBQyxPQUFPLEVBQUUsT0FBTyxDQUFDLENBQUM7SUFDdEUsTUFBTSxFQUFFLE1BQU0sRUFBRSxVQUFVLEVBQUUsU0FBUyxFQUFFLEdBQUcsT0FBTyxDQUFDO0lBRWxELFVBQVUsRUFBRSxDQUFDLFlBQVksQ0FBQyxDQUFDO0lBRTNCLElBQUksT0FBTyxDQUFDLFdBQVcsSUFBSSxRQUFRLElBQUksQ0FBQyxZQUFZLENBQUMsT0FBTyxFQUFFLENBQUM7UUFDN0QsbUJBQW1CLENBQUMsR0FBRyxFQUFFLFFBQVEsRUFBRSxZQUFZLENBQUMsQ0FBQztRQUNqRCxPQUFPLE1BQU0sQ0FBQztJQUNoQixDQUFDO0lBRUQsSUFBSSxPQUFPLENBQUMsS0FBSyxLQUFLLEtBQUssSUFBSSxLQUFLLElBQUksSUFBSSxFQUFFLENBQUM7UUFDN0MsSUFBSSxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDO0lBQzFCLENBQUM7SUFFRCxNQUFNLFFBQVEsR0FBRyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsTUFBTSxJQUFJLE9BQU8sSUFBSSxLQUFLLFFBQVEsSUFBSSxPQUFPLENBQUMsWUFBWSxDQUFDLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUM7UUFDNUcsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsTUFBTSxDQUN4QixDQUFDLFVBQVUsRUFBRSxHQUFHLEVBQUUsRUFBRSxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUNuRCxJQUFJLFVBQVUsRUFBRSxDQUNqQixDQUFDLFFBQVEsRUFBRTtRQUNaLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUVWLE1BQU0sSUFBSSxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxRQUFRLEVBQUUsQ0FBQztJQUM1QyxNQUFNLE1BQU0sR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO0lBRXhDLE1BQU0sT0FBTyxHQUFHLE9BQU8sQ0FBQyxXQUFXLElBQUksT0FBTztRQUM1QyxDQUFDLENBQUMsVUFBVSxDQUFDLEtBQUssQ0FBQyxHQUFHLEVBQUUsT0FBTyxDQUFDLEtBQUssSUFBSSxVQUFVLENBQUM7UUFDcEQsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQ2xCLFNBQVMsQ0FBQyxPQUFPLENBQUMsRUFDbEIsR0FBRyxFQUNIO1lBQ0UsTUFBTTtZQUNOLElBQUk7WUFDSixPQUFPO1lBQ1AsY0FBYyxFQUFFLElBQUk7WUFDcEIsZUFBZSxFQUFFLFNBQVMsRUFBRSxlQUFlO1lBQzNDLE9BQU8sRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsVUFBVTtZQUN2QyxZQUFZLEVBQUUsT0FBTyxDQUFDLFlBQVksSUFBSSxDQUFDLFFBQVEsSUFBSSxPQUFPLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQztTQUN4RixDQUNGLENBQUM7SUFFSixNQUFNLHFCQUFxQixHQUFHLE1BQU07UUFDbEMsQ0FBQyxDQUFDLGtCQUFrQjtRQUNwQixDQUFDLENBQUMsbUJBQW1CLENBQUM7SUFFeEIsT0FBTyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxFQUFFO1FBQzFCLFNBQVMsQ0FBQyxNQUFNLENBQVE7UUFDeEIsR0FBRyxPQUFPLENBQUMsT0FBTztZQUNoQixDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsT0FBTyxDQUFDLE9BQU8sRUFBRSxVQUFVLENBQUMsRUFBRSxVQUFVLEVBQUUsT0FBTyxFQUFFLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLEtBQUssRUFBRSxDQUFDLENBQVEsQ0FBQztZQUNsRyxDQUFDLENBQUMsRUFBRTtLQUNQLENBQUMsQ0FBQyxTQUFTLENBQ1YscUJBQXFCLENBQUMsT0FBTyxFQUFFLFFBQVEsRUFBRSxZQUFZLENBQUMsQ0FDdkQsQ0FBQztJQUVGLE9BQU8sTUFBTSxDQUFDO0FBQ2hCLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qIVxuICogZGV2ZXh0cmVtZS1hbmd1bGFyXG4gKiBWZXJzaW9uOiAyNS4xLjRcbiAqIEJ1aWxkIGRhdGU6IFR1ZSBBdWcgMDUgMjAyNVxuICpcbiAqIENvcHlyaWdodCAoYykgMjAxMiAtIDIwMjUgRGV2ZWxvcGVyIEV4cHJlc3MgSW5jLiBBTEwgUklHSFRTIFJFU0VSVkVEXG4gKlxuICogVGhpcyBzb2Z0d2FyZSBtYXkgYmUgbW9kaWZpZWQgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtc1xuICogb2YgdGhlIE1JVCBsaWNlbnNlLiBTZWUgdGhlIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgcHJvamVjdCBmb3IgZGV0YWlscy5cbiAqXG4gKiBodHRwczovL2dpdGh1Yi5jb20vRGV2RXhwcmVzcy9kZXZleHRyZW1lLWFuZ3VsYXJcbiAqL1xuXG5pbXBvcnQge1xyXG4gIEh0dHBDbGllbnQsIEh0dHBFdmVudFR5cGUsIEh0dHBQYXJhbXMsIEh0dHBFdmVudCwgSHR0cEVycm9yUmVzcG9uc2UsIEh0dHBSZXNwb25zZSxcclxufSBmcm9tICdAYW5ndWxhci9jb21tb24vaHR0cCc7XHJcbmltcG9ydCB7IHRocm93RXJyb3IsIFN1YmplY3QgfSBmcm9tICdyeGpzJztcclxuaW1wb3J0IHsgdGFrZVVudGlsLCB0aW1lb3V0V2l0aCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcclxuaW1wb3J0IHsgRGVmZXJyZWQsIERlZmVycmVkT2JqIH0gZnJvbSAnZGV2ZXh0cmVtZS9jb3JlL3V0aWxzL2RlZmVycmVkJztcclxuaW1wb3J0IHsgaXNEZWZpbmVkIH0gZnJvbSAnZGV2ZXh0cmVtZS9jb3JlL3V0aWxzL3R5cGUnO1xyXG5pbXBvcnQgeyBnZXRXaW5kb3cgfSBmcm9tICdkZXZleHRyZW1lL2NvcmUvdXRpbHMvd2luZG93JztcclxuaW1wb3J0IHtcclxuICBpc0Nyb3NzRG9tYWluLFxyXG4gIGV2YWxDcm9zc0RvbWFpblNjcmlwdCxcclxuICBnZXRSZXF1ZXN0T3B0aW9ucyxcclxuICBnZXRKc29ucENhbGxiYWNrTmFtZSxcclxuICBnZXRSZXF1ZXN0SGVhZGVycyBhcyBnZXRBamF4UmVxdWVzdEhlYWRlcnMsXHJcbiAgZ2V0QWNjZXB0SGVhZGVyLFxyXG4gIGdldE1ldGhvZCxcclxuICBldmFsU2NyaXB0LFxyXG59IGZyb20gJ2RldmV4dHJlbWUvY29yZS91dGlscy9hamF4X3V0aWxzJztcclxuXHJcbnR5cGUgUmVzdWx0ID0gUHJvbWlzZTxhbnk+ICYgeyBhYm9ydDogKCkgPT4gdm9pZCB9O1xyXG50eXBlIERlZmVycmVkUmVzdWx0ID0gRGVmZXJyZWRPYmo8YW55PjtcclxuaW50ZXJmYWNlIE9wdGlvbnMge1xyXG4gIHVybDogc3RyaW5nO1xyXG4gIFtrZXk6IHN0cmluZ106IGFueTtcclxufVxyXG5cclxuaW50ZXJmYWNlIFhIUlN1cnJvZ2F0ZSB7XHJcbiAgdHlwZT86IHN0cmluZztcclxuICBhYm9ydGVkOiBib29sZWFuO1xyXG4gIGFib3J0OiAoKSA9PiB2b2lkO1xyXG4gIHJlc3BvbnNlPzogSHR0cFJlc3BvbnNlPG9iamVjdD47XHJcbiAgc3RhdHVzPzogbnVtYmVyO1xyXG4gIHN0YXR1c1RleHQ/OiBzdHJpbmc7XHJcbn1cclxuXHJcbmNvbnN0IFBBUlNFUl9FUlJPUiA9ICdwYXJzZXJlcnJvcic7XHJcbmNvbnN0IFNVQ0NFU1MgPSAnc3VjY2Vzcyc7XHJcbmNvbnN0IEVSUk9SID0gJ2Vycm9yJztcclxuY29uc3QgTk9fQ09OVEVOVCA9ICdub2NvbnRlbnQnO1xyXG5jb25zdCBUSU1FT1VUID0gJ3RpbWVvdXQnO1xyXG5jb25zdCBTVEFUVVNfQUJPUlQgPSAwO1xyXG5jb25zdCBDT05URU5UX1RZUEUgPSAnQ29udGVudC1UeXBlJztcclxuY29uc3QgVVJMRU5DT0RFRCA9ICdhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQnO1xyXG5cclxuZnVuY3Rpb24gYXNzaWduUmVzcG9uc2VQcm9wcyh4aHJTdXJyb2dhdGU6IFhIUlN1cnJvZ2F0ZSwgcmVzcG9uc2U6IEh0dHBSZXNwb25zZTxhbnk+IHwgSHR0cEVycm9yUmVzcG9uc2UpIHtcclxuICBjb25zdCBnZXRSZXNwb25zZUhlYWRlciA9IChuYW1lOiBzdHJpbmcpID0+IHJlc3BvbnNlLmhlYWRlcnMuZ2V0KG5hbWUpO1xyXG5cclxuICBmdW5jdGlvbiBtYWtlUmVzcG9uc2VUZXh0KCkge1xyXG4gICAgY29uc3QgYm9keSA9ICdlcnJvcicgaW4gcmVzcG9uc2UgPyByZXNwb25zZS5lcnJvciA6IHJlc3BvbnNlLmJvZHk7XHJcblxyXG4gICAgaWYgKHR5cGVvZiBib2R5ICE9PSAnc3RyaW5nJyB8fCBTdHJpbmcoZ2V0UmVzcG9uc2VIZWFkZXIoQ09OVEVOVF9UWVBFKSkuc3RhcnRzV2l0aCgnYXBwbGljYXRpb24vanNvbicpKSB7XHJcbiAgICAgIHJldHVybiBKU09OLnN0cmluZ2lmeShib2R5KTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gYm9keTtcclxuICB9XHJcblxyXG4gIE9iamVjdC5hc3NpZ24oeGhyU3Vycm9nYXRlLCB7XHJcbiAgICBzdGF0dXM6IHJlc3BvbnNlLnN0YXR1cyxcclxuICAgIHN0YXR1c1RleHQ6IHJlc3BvbnNlLnN0YXR1c1RleHQsXHJcbiAgICBnZXRSZXNwb25zZUhlYWRlcixcclxuICAgIHJlc3BvbnNlVGV4dDogbWFrZVJlc3BvbnNlVGV4dCgpLFxyXG4gIH0pO1xyXG5cclxuICByZXR1cm4geGhyU3Vycm9nYXRlO1xyXG59XHJcblxyXG5mdW5jdGlvbiBpc0dldE1ldGhvZChvcHRpb25zOiBPcHRpb25zKSB7XHJcbiAgcmV0dXJuIGdldE1ldGhvZChvcHRpb25zKSA9PT0gJ0dFVCc7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIGlzQ2FjaGVOZWVkKG9wdGlvbnM6IE9wdGlvbnMpIHtcclxuICBpZiAob3B0aW9ucy5jYWNoZSA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICByZXR1cm4gIShpc1VzZWRTY3JpcHQob3B0aW9ucykgfHwgaXNVc2VkSlNPTlAob3B0aW9ucykpO1xyXG4gIH1cclxuXHJcbiAgcmV0dXJuIG9wdGlvbnMuY2FjaGU7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIGlzVXNlZFNjcmlwdChvcHRpb25zOiBPcHRpb25zKSB7XHJcbiAgcmV0dXJuIG9wdGlvbnMuZGF0YVR5cGUgPT09ICdzY3JpcHQnO1xyXG59XHJcblxyXG5mdW5jdGlvbiBpc1VzZWRKU09OUChvcHRpb25zOiBPcHRpb25zKSB7XHJcbiAgcmV0dXJuIG9wdGlvbnMuZGF0YVR5cGUgPT09ICdqc29ucCc7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIGdldFJlcXVlc3RIZWFkZXJzKG9wdGlvbnM6IE9wdGlvbnMpIHtcclxuICBjb25zdCBoZWFkZXJzID0gZ2V0QWpheFJlcXVlc3RIZWFkZXJzKG9wdGlvbnMpO1xyXG4gIGNvbnN0IHsgdXBsb2FkIH0gPSBvcHRpb25zO1xyXG5cclxuICBpZiAoIWhlYWRlcnMuQWNjZXB0KSB7XHJcbiAgICBoZWFkZXJzLkFjY2VwdCA9IGdldEFjY2VwdEhlYWRlcihvcHRpb25zKTtcclxuICB9XHJcblxyXG4gIGlmICghdXBsb2FkICYmICFpc0dldE1ldGhvZChvcHRpb25zKSAmJiAhaGVhZGVyc1tDT05URU5UX1RZUEVdKSB7XHJcbiAgICBoZWFkZXJzW0NPTlRFTlRfVFlQRV0gPSBvcHRpb25zLmNvbnRlbnRUeXBlIHx8IGAke1VSTEVOQ09ERUR9O2NoYXJzZXQ9dXRmLThgO1xyXG4gIH1cclxuXHJcbiAgcmV0dXJuIE9iamVjdC5rZXlzKGhlYWRlcnMpLnJlZHVjZSgoYWNjLCBrZXkpID0+IHtcclxuICAgIGlmIChpc0RlZmluZWQoaGVhZGVyc1trZXldKSkge1xyXG4gICAgICBhY2Nba2V5XSA9IGhlYWRlcnNba2V5XTtcclxuICAgIH1cclxuICAgIHJldHVybiBhY2M7XHJcbiAgfSwge30pO1xyXG59XHJcblxyXG5mdW5jdGlvbiByZWplY3RJZkFib3J0ZWQoZGVmZXJyZWQ6IERlZmVycmVkUmVzdWx0LCB4aHJTdXJyb2dhdGU6IFhIUlN1cnJvZ2F0ZSwgY2FsbGJhY2s/OiAoKSA9PiB2b2lkKSB7XHJcbiAgaWYgKHhoclN1cnJvZ2F0ZS5hYm9ydGVkKSB7XHJcbiAgICBkZWZlcnJlZC5yZWplY3QoeyBzdGF0dXM6IFNUQVRVU19BQk9SVCwgc3RhdHVzVGV4dDogJ2Fib3J0ZWQnLCBvazogZmFsc2UgfSk7XHJcbiAgICBjYWxsYmFjaz8uKCk7XHJcbiAgfVxyXG59XHJcblxyXG5mdW5jdGlvbiBnZXRKc29ucFBhcmFtZXRlcnMob3B0aW9uczogT3B0aW9ucykge1xyXG4gIGNvbnN0IHBhdGNoZWRPcHRpb25zID0geyAuLi5vcHRpb25zIH07XHJcbiAgY29uc3QgY2FsbGJhY2tOYW1lID0gZ2V0SnNvbnBDYWxsYmFja05hbWUocGF0Y2hlZE9wdGlvbnMpO1xyXG5cclxuICByZXR1cm4geyBjYWxsYmFja05hbWUsIGRhdGE6IHBhdGNoZWRPcHRpb25zLmRhdGEgfTtcclxufVxyXG5cclxuZnVuY3Rpb24gYWRkSnNvbnBDYWxsYmFjayhjYWxsYmFja05hbWU6IHN0cmluZywgZGVmZXJyZWQ6IERlZmVycmVkUmVzdWx0LCB4aHJTdXJyb2dhdGU6IFhIUlN1cnJvZ2F0ZSkge1xyXG4gIGdldFdpbmRvdygpW2NhbGxiYWNrTmFtZV0gPSAoZGF0YSkgPT4gZGVmZXJyZWQucmVzb2x2ZShkYXRhLCBTVUNDRVNTLCB4aHJTdXJyb2dhdGUpO1xyXG59XHJcblxyXG5mdW5jdGlvbiBzZW5kUmVxdWVzdEJ5U2NyaXB0KHVybDogc3RyaW5nLCBkZWZlcnJlZDogRGVmZXJyZWRSZXN1bHQsIHhoclN1cnJvZ2F0ZTogWEhSU3Vycm9nYXRlKSB7XHJcbiAgZXZhbENyb3NzRG9tYWluU2NyaXB0KHVybCkudGhlbihcclxuICAgICgpID0+IGRlZmVycmVkLnJlc29sdmUobnVsbCwgU1VDQ0VTUywgeGhyU3Vycm9nYXRlKSxcclxuICAgICgpID0+IGRlZmVycmVkLnJlamVjdCh4aHJTdXJyb2dhdGUsIEVSUk9SKSxcclxuICApO1xyXG59XHJcblxyXG5mdW5jdGlvbiBnZXRSZXF1ZXN0Q2FsbGJhY2tzKG9wdGlvbnM6IE9wdGlvbnMsIGRlZmVycmVkOiBEZWZlcnJlZFJlc3VsdCwgeGhyU3Vycm9nYXRlOiBYSFJTdXJyb2dhdGUpIHtcclxuICByZXR1cm4ge1xyXG4gICAgbmV4dChyZXNwb25zZTogSHR0cFJlc3BvbnNlPGFueT4pIHtcclxuICAgICAgaWYgKGlzVXNlZEpTT05QKG9wdGlvbnMpKSB7XHJcbiAgICAgICAgcmV0dXJuIG9wdGlvbnMuY3Jvc3NEb21haW5cclxuICAgICAgICAgID8gZGVmZXJyZWQucmVzb2x2ZShyZXNwb25zZSwgJ3N1Y2Nlc3MnLCBhc3NpZ25SZXNwb25zZVByb3BzKHhoclN1cnJvZ2F0ZSwgcmVzcG9uc2UpKVxyXG4gICAgICAgICAgOiBldmFsU2NyaXB0KHJlc3BvbnNlLmJvZHkpO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBpZiAoaXNVc2VkU2NyaXB0KG9wdGlvbnMpKSB7XHJcbiAgICAgICAgZXZhbFNjcmlwdChyZXNwb25zZS5ib2R5KTtcclxuICAgICAgfVxyXG5cclxuICAgICAgcmV0dXJuIGRlZmVycmVkLnJlc29sdmUoXHJcbiAgICAgICAgcmVzcG9uc2UuYm9keSxcclxuICAgICAgICByZXNwb25zZS5ib2R5ID8gJ3N1Y2Nlc3MnIDogTk9fQ09OVEVOVCxcclxuICAgICAgICBhc3NpZ25SZXNwb25zZVByb3BzKHhoclN1cnJvZ2F0ZSwgcmVzcG9uc2UpLFxyXG4gICAgICApO1xyXG4gICAgfSxcclxuICAgIGVycm9yKGVycm9yOiBIdHRwRXJyb3JSZXNwb25zZSkge1xyXG4gICAgICBlcnJvciA9IGVycm9yICYmIHR5cGVvZiBlcnJvciA9PT0gJ29iamVjdCcgPyBlcnJvciA6IHsgZXJyb3IgfSBhcyB1bmtub3duIGFzIEh0dHBFcnJvclJlc3BvbnNlO1xyXG4gICAgICBsZXQgZXJyb3JTdGF0dXMgPSBlcnJvcj8uc3RhdHVzVGV4dCA9PT0gVElNRU9VVCA/IFRJTUVPVVQgOiAnZXJyb3InO1xyXG5cclxuICAgICAgZXJyb3JTdGF0dXMgPSBvcHRpb25zLmRhdGFUeXBlID09PSAnanNvbicgJiYgZXJyb3I/Lm1lc3NhZ2U/LmluY2x1ZGVzPy4oJ3BhcnNpbmcnKVxyXG4gICAgICAgID8gUEFSU0VSX0VSUk9SXHJcbiAgICAgICAgOiBlcnJvclN0YXR1cztcclxuXHJcbiAgICAgIHJldHVybiBkZWZlcnJlZC5yZWplY3QoYXNzaWduUmVzcG9uc2VQcm9wcyh4aHJTdXJyb2dhdGUsIHsgc3RhdHVzOiA0MDAsIC4uLmVycm9yIH0gYXMgSHR0cEVycm9yUmVzcG9uc2UpLCBlcnJvclN0YXR1cywgZXJyb3IpO1xyXG4gICAgfSxcclxuICAgIGNvbXBsZXRlKCkge1xyXG4gICAgICByZWplY3RJZkFib3J0ZWQoZGVmZXJyZWQsIHhoclN1cnJvZ2F0ZSk7XHJcbiAgICB9LFxyXG4gIH07XHJcbn1cclxuXHJcbmZ1bmN0aW9uIGdldFVwbG9hZENhbGxiYWNrcyhvcHRpb25zOiBPcHRpb25zLCBkZWZlcnJlZDogRGVmZXJyZWRSZXN1bHQsIHhoclN1cnJvZ2F0ZTogWEhSU3Vycm9nYXRlKSB7XHJcbiAgbGV0IHRvdGFsID0gMDtcclxuICBsZXQgaXNVcGxvYWRTdGFydGVkID0gZmFsc2U7XHJcblxyXG4gIHJldHVybiB7XHJcbiAgICBuZXh0OiAoZXZlbnQ6IEh0dHBFdmVudDxvYmplY3Q+KSA9PiB7XHJcbiAgICAgIGlmICghaXNVcGxvYWRTdGFydGVkXHJcbiAgICAgICAgICAmJiBbSHR0cEV2ZW50VHlwZS5VcGxvYWRQcm9ncmVzcywgSHR0cEV2ZW50VHlwZS5TZW50XS5pbmNsdWRlcyhldmVudC50eXBlKSkge1xyXG4gICAgICAgIG9wdGlvbnMudXBsb2FkLm9ubG9hZHN0YXJ0Py4oZXZlbnQpO1xyXG4gICAgICAgIGlzVXBsb2FkU3RhcnRlZCA9IHRydWU7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmIChldmVudC50eXBlID09PSBIdHRwRXZlbnRUeXBlLlVwbG9hZFByb2dyZXNzKSB7XHJcbiAgICAgICAgdG90YWwgKz0gZXZlbnQubG9hZGVkO1xyXG4gICAgICAgIG9wdGlvbnMudXBsb2FkLm9ucHJvZ3Jlc3M/Lih7IC4uLmV2ZW50LCB0b3RhbCB9KTtcclxuICAgICAgfSBlbHNlIGlmIChldmVudC50eXBlID09PSBIdHRwRXZlbnRUeXBlLlJlc3BvbnNlKSB7XHJcbiAgICAgICAgeGhyU3Vycm9nYXRlLnN0YXR1cyA9IGV2ZW50LnN0YXR1cztcclxuICAgICAgICB4aHJTdXJyb2dhdGUuc3RhdHVzVGV4dCA9IGV2ZW50LnN0YXR1c1RleHQ7XHJcbiAgICAgICAgeGhyU3Vycm9nYXRlLnJlc3BvbnNlID0gZXZlbnQ7XHJcblxyXG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IG9wdGlvbnM/LmRhdGFUeXBlID09PSAnanNvbicgJiYgdHlwZW9mIGV2ZW50LmJvZHkgPT09ICdvYmplY3QnXHJcbiAgICAgICAgICA/IGV2ZW50LmJvZHlcclxuICAgICAgICAgIDogeGhyU3Vycm9nYXRlO1xyXG5cclxuICAgICAgICByZXR1cm4gZGVmZXJyZWQucmVzb2x2ZShyZXN1bHQsIFNVQ0NFU1MpO1xyXG4gICAgICB9XHJcbiAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfSxcclxuICAgIGVycm9yKGVycm9yOiBIdHRwRXJyb3JSZXNwb25zZSkge1xyXG4gICAgICBlcnJvciA9IGVycm9yICYmIHR5cGVvZiBlcnJvciA9PT0gJ29iamVjdCcgPyBlcnJvciA6IHsgZXJyb3IgfSBhcyB1bmtub3duIGFzIEh0dHBFcnJvclJlc3BvbnNlO1xyXG4gICAgICByZXR1cm4gZGVmZXJyZWQucmVqZWN0KGFzc2lnblJlc3BvbnNlUHJvcHMoeGhyU3Vycm9nYXRlLCB7IHN0YXR1czogNDAwLCAuLi5lcnJvciB9IGFzIEh0dHBFcnJvclJlc3BvbnNlKSwgZXJyb3Iuc3RhdHVzLCBlcnJvcik7XHJcbiAgICB9LFxyXG4gICAgY29tcGxldGUoKSB7XHJcbiAgICAgIHJlamVjdElmQWJvcnRlZChkZWZlcnJlZCwgeGhyU3Vycm9nYXRlLCAoKSA9PiB7XHJcbiAgICAgICAgb3B0aW9ucy51cGxvYWQ/Lm9uYWJvcnQ/Lih4aHJTdXJyb2dhdGUpO1xyXG4gICAgICB9KTtcclxuICAgIH0sXHJcbiAgfTtcclxufVxyXG5cclxuZXhwb3J0IGNvbnN0IHNlbmRSZXF1ZXN0RmFjdG9yeSA9IChodHRwQ2xpZW50OiBIdHRwQ2xpZW50KSA9PiAob3B0aW9uczogT3B0aW9ucykgPT4ge1xyXG4gIGNvbnN0IGFib3J0JCA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XHJcbiAgY29uc3QgZGVmZXJyZWQ6IERlZmVycmVkUmVzdWx0ID0gRGVmZXJyZWQoKTtcclxuICBjb25zdCByZXN1bHQgPSBkZWZlcnJlZC5wcm9taXNlKCkgYXMgUmVzdWx0O1xyXG4gIGNvbnN0IGlzR2V0ID0gaXNHZXRNZXRob2Qob3B0aW9ucyk7XHJcbiAgY29uc3QgaXNKU09OUCA9IGlzVXNlZEpTT05QKG9wdGlvbnMpO1xyXG4gIGNvbnN0IGlzU2NyaXB0ID0gaXNVc2VkU2NyaXB0KG9wdGlvbnMpO1xyXG5cclxuICBvcHRpb25zLmNyb3NzRG9tYWluID0gaXNDcm9zc0RvbWFpbihvcHRpb25zLnVybCk7XHJcbiAgb3B0aW9ucy5jYWNoZSA9IGlzQ2FjaGVOZWVkKG9wdGlvbnMpO1xyXG5cclxuICBjb25zdCBoZWFkZXJzID0gZ2V0UmVxdWVzdEhlYWRlcnMob3B0aW9ucyk7XHJcbiAgY29uc3QgeGhyU3Vycm9nYXRlOiBYSFJTdXJyb2dhdGUgPSB7XHJcbiAgICB0eXBlOiAnWE1MSHR0cFJlcXVlc3RTdXJyb2dhdGUnLFxyXG4gICAgYWJvcnRlZDogZmFsc2UsXHJcbiAgICBhYm9ydCgpIHtcclxuICAgICAgdGhpcy5hYm9ydGVkID0gdHJ1ZTtcclxuICAgICAgYWJvcnQkLm5leHQoKTtcclxuICAgIH0sXHJcbiAgfTtcclxuXHJcbiAgcmVzdWx0LmFib3J0ID0gKCkgPT4geGhyU3Vycm9nYXRlLmFib3J0KCk7XHJcblxyXG4gIGlmICghb3B0aW9ucy5jcm9zc0RvbWFpbiAmJiBpc0pTT05QKSB7XHJcbiAgICBjb25zdCB7IGNhbGxiYWNrTmFtZSwgZGF0YSB9ID0gZ2V0SnNvbnBQYXJhbWV0ZXJzKG9wdGlvbnMpO1xyXG5cclxuICAgIG9wdGlvbnMuZGF0YSA9IHsgLi4ub3B0aW9ucy5kYXRhLCAuLi5kYXRhIH07XHJcblxyXG4gICAgYWRkSnNvbnBDYWxsYmFjayhjYWxsYmFja05hbWUsIGRlZmVycmVkLCB4aHJTdXJyb2dhdGUpO1xyXG4gIH1cclxuXHJcbiAgY29uc3QgeyB1cmwsIHBhcmFtZXRlcnM6IGRhdGEgfSA9IGdldFJlcXVlc3RPcHRpb25zKG9wdGlvbnMsIGhlYWRlcnMpO1xyXG4gIGNvbnN0IHsgdXBsb2FkLCBiZWZvcmVTZW5kLCB4aHJGaWVsZHMgfSA9IG9wdGlvbnM7XHJcblxyXG4gIGJlZm9yZVNlbmQ/Lih4aHJTdXJyb2dhdGUpO1xyXG5cclxuICBpZiAob3B0aW9ucy5jcm9zc0RvbWFpbiAmJiBpc1NjcmlwdCAmJiAheGhyU3Vycm9nYXRlLmFib3J0ZWQpIHtcclxuICAgIHNlbmRSZXF1ZXN0QnlTY3JpcHQodXJsLCBkZWZlcnJlZCwgeGhyU3Vycm9nYXRlKTtcclxuICAgIHJldHVybiByZXN1bHQ7XHJcbiAgfVxyXG5cclxuICBpZiAob3B0aW9ucy5jYWNoZSA9PT0gZmFsc2UgJiYgaXNHZXQgJiYgZGF0YSkge1xyXG4gICAgZGF0YS5fID0gRGF0ZS5ub3coKSArIDE7XHJcbiAgfVxyXG5cclxuICBjb25zdCBtYWtlQm9keSA9ICgpID0+ICghdXBsb2FkICYmIHR5cGVvZiBkYXRhID09PSAnb2JqZWN0JyAmJiBoZWFkZXJzW0NPTlRFTlRfVFlQRV0uaW5kZXhPZihVUkxFTkNPREVEKSA9PT0gMFxyXG4gICAgPyBPYmplY3Qua2V5cyhkYXRhKS5yZWR1Y2UoXHJcbiAgICAgIChodHRwUGFyYW1zLCBrZXkpID0+IGh0dHBQYXJhbXMuc2V0KGtleSwgZGF0YVtrZXldKSxcclxuICAgICAgbmV3IEh0dHBQYXJhbXMoKSxcclxuICAgICkudG9TdHJpbmcoKVxyXG4gICAgOiBkYXRhKTtcclxuXHJcbiAgY29uc3QgYm9keSA9IGlzR2V0ID8gdW5kZWZpbmVkIDogbWFrZUJvZHkoKTtcclxuICBjb25zdCBwYXJhbXMgPSBpc0dldCA/IGRhdGEgOiB1bmRlZmluZWQ7XHJcblxyXG4gIGNvbnN0IHJlcXVlc3QgPSBvcHRpb25zLmNyb3NzRG9tYWluICYmIGlzSlNPTlBcclxuICAgID8gaHR0cENsaWVudC5qc29ucCh1cmwsIG9wdGlvbnMuanNvbnAgfHwgJ2NhbGxiYWNrJylcclxuICAgIDogaHR0cENsaWVudC5yZXF1ZXN0KFxyXG4gICAgICBnZXRNZXRob2Qob3B0aW9ucyksXHJcbiAgICAgIHVybCxcclxuICAgICAge1xyXG4gICAgICAgIHBhcmFtcyxcclxuICAgICAgICBib2R5LFxyXG4gICAgICAgIGhlYWRlcnMsXHJcbiAgICAgICAgcmVwb3J0UHJvZ3Jlc3M6IHRydWUsXHJcbiAgICAgICAgd2l0aENyZWRlbnRpYWxzOiB4aHJGaWVsZHM/LndpdGhDcmVkZW50aWFscyxcclxuICAgICAgICBvYnNlcnZlOiB1cGxvYWQgPyAnZXZlbnRzJyA6ICdyZXNwb25zZScsXHJcbiAgICAgICAgcmVzcG9uc2VUeXBlOiBvcHRpb25zLnJlc3BvbnNlVHlwZSB8fCAoaXNTY3JpcHQgfHwgaXNKU09OUCA/ICd0ZXh0JyA6IG9wdGlvbnMuZGF0YVR5cGUpLFxyXG4gICAgICB9LFxyXG4gICAgKTtcclxuXHJcbiAgY29uc3Qgc3Vic2NyaXB0aW9uQ2FsbGJhY2tzID0gdXBsb2FkXHJcbiAgICA/IGdldFVwbG9hZENhbGxiYWNrc1xyXG4gICAgOiBnZXRSZXF1ZXN0Q2FsbGJhY2tzO1xyXG5cclxuICByZXF1ZXN0LnBpcGUuYXBwbHkocmVxdWVzdCwgW1xyXG4gICAgdGFrZVVudGlsKGFib3J0JCkgYXMgYW55LFxyXG4gICAgLi4ub3B0aW9ucy50aW1lb3V0XHJcbiAgICAgID8gW3RpbWVvdXRXaXRoKG9wdGlvbnMudGltZW91dCwgdGhyb3dFcnJvcih7IHN0YXR1c1RleHQ6IFRJTUVPVVQsIHN0YXR1czogMCwgb2s6IGZhbHNlIH0pKSBhcyBhbnldXHJcbiAgICAgIDogW10sXHJcbiAgXSkuc3Vic2NyaWJlKFxyXG4gICAgc3Vic2NyaXB0aW9uQ2FsbGJhY2tzKG9wdGlvbnMsIGRlZmVycmVkLCB4aHJTdXJyb2dhdGUpLFxyXG4gICk7XHJcblxyXG4gIHJldHVybiByZXN1bHQ7XHJcbn07XHJcbiJdfQ==