UNPKG

devextreme-angular

Version:

Angular UI and visualization components based on DevExtreme widgets

217 lines • 34.1 kB
/*! * devextreme-angular * Version: 24.2.6 * Build date: Mon Mar 17 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 */ /* eslint-disable @typescript-eslint/no-floating-promises */ 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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWpheC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL2Rpc3QvaHR0cC9hamF4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7OztHQVdHO0FBRUgsNERBQTREO0FBQzVELE9BQU8sRUFDTyxhQUFhLEVBQUUsVUFBVSxHQUN0QyxNQUFNLHNCQUFzQixDQUFDO0FBQzlCLE9BQU8sRUFBRSxVQUFVLEVBQUUsT0FBTyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQzNDLE9BQU8sRUFBRSxTQUFTLEVBQUUsV0FBVyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDeEQsT0FBTyxFQUFFLFFBQVEsRUFBZSxNQUFNLGdDQUFnQyxDQUFDO0FBQ3ZFLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUN2RCxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFDekQsT0FBTyxFQUNMLGFBQWEsRUFDYixxQkFBcUIsRUFDckIsaUJBQWlCLEVBQ2pCLG9CQUFvQixFQUNwQixpQkFBaUIsSUFBSSxxQkFBcUIsRUFDMUMsZUFBZSxFQUNmLFNBQVMsRUFDVCxVQUFVLEdBQ1gsTUFBTSxrQ0FBa0MsQ0FBQztBQWtCMUMsTUFBTSxZQUFZLEdBQUcsYUFBYSxDQUFDO0FBQ25DLE1BQU0sT0FBTyxHQUFHLFNBQVMsQ0FBQztBQUMxQixNQUFNLEtBQUssR0FBRyxPQUFPLENBQUM7QUFDdEIsTUFBTSxVQUFVLEdBQUcsV0FBVyxDQUFDO0FBQy9CLE1BQU0sT0FBTyxHQUFHLFNBQVMsQ0FBQztBQUMxQixNQUFNLFlBQVksR0FBRyxDQUFDLENBQUM7QUFDdkIsTUFBTSxZQUFZLEdBQUcsY0FBYyxDQUFDO0FBQ3BDLE1BQU0sVUFBVSxHQUFHLG1DQUFtQyxDQUFDO0FBRXZELFNBQVMsbUJBQW1CLENBQUMsWUFBMEIsRUFBRSxRQUErQztJQUN0RyxNQUFNLGlCQUFpQixHQUFHLENBQUMsSUFBWSxFQUFFLEVB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LEVBQ2xCLEdBQUcsRUFDSDtZQUNFLE1BQU07WUFDTixJQUFJO1lBQ0osT0FBTztZQUNQLGNBQWMsRUFBRSxJQUFJO1lBQ3BCLGVBQWUsRUFBRSxTQUFTLEVBQUUsZUFBZTtZQUMzQyxPQUFPLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLFVBQVU7WUFDdkMsWUFBWSxFQUFFLE9BQU8sQ0FBQyxZQUFZLElBQUksQ0FBQyxRQUFRLElBQUksT0FBTyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUM7U0FDeEYsQ0FDRixDQUFDO0lBRUosTUFBTSxxQkFBcUIsR0FBRyxNQUFNO1FBQ2xDLENBQUMsQ0FBQyxrQkFBa0I7UUFDcEIsQ0FBQyxDQUFDLG1CQUFtQixDQUFDO0lBRXhCLE9BQU8sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sRUFBRTtRQUMxQixTQUFTLENBQUMsTUFBTSxDQUFRO1FBQ3hCLEdBQUcsT0FBTyxDQUFDLE9BQU87WUFDaEIsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLE9BQU8sQ0FBQyxPQUFPLEVBQUUsVUFBVSxDQUFDLEVBQUUsVUFBVSxFQUFFLE9BQU8sRUFBRSxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFRLENBQUM7WUFDbEcsQ0FBQyxDQUFDLEVBQUU7S0FDUCxDQUFDLENBQUMsU0FBUyxDQUNWLHFCQUFxQixDQUFDLE9BQU8sRUFBRSxRQUFRLEVBQUUsWUFBWSxDQUFDLENBQ3ZELENBQUM7SUFFRixPQUFPLE1BQU0sQ0FBQztBQUNoQixDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKiFcbiAqIGRldmV4dHJlbWUtYW5ndWxhclxuICogVmVyc2lvbjogMjQuMi42XG4gKiBCdWlsZCBkYXRlOiBNb24gTWFyIDE3IDIwMjVcbiAqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTIgLSAyMDI1IERldmVsb3BlciBFeHByZXNzIEluYy4gQUxMIFJJR0hUUyBSRVNFUlZFRFxuICpcbiAqIFRoaXMgc29mdHdhcmUgbWF5IGJlIG1vZGlmaWVkIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXNcbiAqIG9mIHRoZSBNSVQgbGljZW5zZS4gU2VlIHRoZSBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHByb2plY3QgZm9yIGRldGFpbHMuXG4gKlxuICogaHR0cHM6Ly9naXRodWIuY29tL0RldkV4cHJlc3MvZGV2ZXh0cmVtZS1hbmd1bGFyXG4gKi9cblxuLyogZXNsaW50LWRpc2FibGUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWZsb2F0aW5nLXByb21pc2VzICovXHJcbmltcG9ydCB7XHJcbiAgSHR0cENsaWVudCwgSHR0cEV2ZW50VHlwZSwgSHR0cFBhcmFtcywgSHR0cEV2ZW50LCBIdHRwRXJyb3JSZXNwb25zZSwgSHR0cFJlc3BvbnNlLFxyXG59IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbi9odHRwJztcclxuaW1wb3J0IHsgdGhyb3dFcnJvciwgU3ViamVjdCB9IGZyb20gJ3J4anMnO1xyXG5pbXBvcnQgeyB0YWtlVW50aWwsIHRpbWVvdXRXaXRoIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xyXG5pbXBvcnQgeyBEZWZlcnJlZCwgRGVmZXJyZWRPYmogfSBmcm9tICdkZXZleHRyZW1lL2NvcmUvdXRpbHMvZGVmZXJyZWQnO1xyXG5pbXBvcnQgeyBpc0RlZmluZWQgfSBmcm9tICdkZXZleHRyZW1lL2NvcmUvdXRpbHMvdHlwZSc7XHJcbmltcG9ydCB7IGdldFdpbmRvdyB9IGZyb20gJ2RldmV4dHJlbWUvY29yZS91dGlscy93aW5kb3cnO1xyXG5pbXBvcnQge1xyXG4gIGlzQ3Jvc3NEb21haW4sXHJcbiAgZXZhbENyb3NzRG9tYWluU2NyaXB0LFxyXG4gIGdldFJlcXVlc3RPcHRpb25zLFxyXG4gIGdldEpzb25wQ2FsbGJhY2tOYW1lLFxyXG4gIGdldFJlcXVlc3RIZWFkZXJzIGFzIGdldEFqYXhSZXF1ZXN0SGVhZGVycyxcclxuICBnZXRBY2NlcHRIZWFkZXIsXHJcbiAgZ2V0TWV0aG9kLFxyXG4gIGV2YWxTY3JpcHQsXHJcbn0gZnJvbSAnZGV2ZXh0cmVtZS9jb3JlL3V0aWxzL2FqYXhfdXRpbHMnO1xyXG5cclxudHlwZSBSZXN1bHQgPSBQcm9taXNlPGFueT4gJiB7IGFib3J0OiAoKSA9PiB2b2lkIH07XHJcbnR5cGUgRGVmZXJyZWRSZXN1bHQgPSBEZWZlcnJlZE9iajxhbnk+O1xyXG5pbnRlcmZhY2UgT3B0aW9ucyB7XHJcbiAgdXJsOiBzdHJpbmc7XHJcbiAgW2tleTogc3RyaW5nXTogYW55O1xyXG59XHJcblxyXG5pbnRlcmZhY2UgWEhSU3Vycm9nYXRlIHtcclxuICB0eXBlPzogc3RyaW5nO1xyXG4gIGFib3J0ZWQ6IGJvb2xlYW47XHJcbiAgYWJvcnQ6ICgpID0+IHZvaWQ7XHJcbiAgcmVzcG9uc2U/OiBIdHRwUmVzcG9uc2U8b2JqZWN0PjtcclxuICBzdGF0dXM/OiBudW1iZXI7XHJcbiAgc3RhdHVzVGV4dD86IHN0cmluZztcclxufVxyXG5cclxuY29uc3QgUEFSU0VSX0VSUk9SID0gJ3BhcnNlcmVycm9yJztcclxuY29uc3QgU1VDQ0VTUyA9ICdzdWNjZXNzJztcclxuY29uc3QgRVJST1IgPSAnZXJyb3InO1xyXG5jb25zdCBOT19DT05URU5UID0gJ25vY29udGVudCc7XHJcbmNvbnN0IFRJTUVPVVQgPSAndGltZW91dCc7XHJcbmNvbnN0IFNUQVRVU19BQk9SVCA9IDA7XHJcbmNvbnN0IENPTlRFTlRfVFlQRSA9ICdDb250ZW50LVR5cGUnO1xyXG5jb25zdCBVUkxFTkNPREVEID0gJ2FwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCc7XHJcblxyXG5mdW5jdGlvbiBhc3NpZ25SZXNwb25zZVByb3BzKHhoclN1cnJvZ2F0ZTogWEhSU3Vycm9nYXRlLCByZXNwb25zZTogSHR0cFJlc3BvbnNlPGFueT4gfCBIdHRwRXJyb3JSZXNwb25zZSkge1xyXG4gIGNvbnN0IGdldFJlc3BvbnNlSGVhZGVyID0gKG5hbWU6IHN0cmluZykgPT4gcmVzcG9uc2UuaGVhZGVycy5nZXQobmFtZSk7XHJcblxyXG4gIGZ1bmN0aW9uIG1ha2VSZXNwb25zZVRleHQoKSB7XHJcbiAgICBjb25zdCBib2R5ID0gJ2Vycm9yJyBpbiByZXNwb25zZSA/IHJlc3BvbnNlLmVycm9yIDogcmVzcG9uc2UuYm9keTtcclxuXHJcbiAgICBpZiAodHlwZW9mIGJvZHkgIT09ICdzdHJpbmcnIHx8IFN0cmluZyhnZXRSZXNwb25zZUhlYWRlcihDT05URU5UX1RZUEUpKS5zdGFydHNXaXRoKCdhcHBsaWNhdGlvbi9qc29uJykpIHtcclxuICAgICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KGJvZHkpO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBib2R5O1xyXG4gIH1cclxuXHJcbiAgT2JqZWN0LmFzc2lnbih4aHJTdXJyb2dhdGUsIHtcclxuICAgIHN0YXR1czogcmVzcG9uc2Uuc3RhdHVzLFxyXG4gICAgc3RhdHVzVGV4dDogcmVzcG9uc2Uuc3RhdHVzVGV4dCxcclxuICAgIGdldFJlc3BvbnNlSGVhZGVyLFxyXG4gICAgcmVzcG9uc2VUZXh0OiBtYWtlUmVzcG9uc2VUZXh0KCksXHJcbiAgfSk7XHJcblxyXG4gIHJldHVybiB4aHJTdXJyb2dhdGU7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIGlzR2V0TWV0aG9kKG9wdGlvbnM6IE9wdGlvbnMpIHtcclxuICByZXR1cm4gZ2V0TWV0aG9kKG9wdGlvbnMpID09PSAnR0VUJztcclxufVxyXG5cclxuZnVuY3Rpb24gaXNDYWNoZU5lZWQob3B0aW9uczogT3B0aW9ucykge1xyXG4gIGlmIChvcHRpb25zLmNhY2hlID09PSB1bmRlZmluZWQpIHtcclxuICAgIHJldHVybiAhKGlzVXNlZFNjcmlwdChvcHRpb25zKSB8fCBpc1VzZWRKU09OUChvcHRpb25zKSk7XHJcbiAgfVxyXG5cclxuICByZXR1cm4gb3B0aW9ucy5jYWNoZTtcclxufVxyXG5cclxuZnVuY3Rpb24gaXNVc2VkU2NyaXB0KG9wdGlvbnM6IE9wdGlvbnMpIHtcclxuICByZXR1cm4gb3B0aW9ucy5kYXRhVHlwZSA9PT0gJ3NjcmlwdCc7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIGlzVXNlZEpTT05QKG9wdGlvbnM6IE9wdGlvbnMpIHtcclxuICByZXR1cm4gb3B0aW9ucy5kYXRhVHlwZSA9PT0gJ2pzb25wJztcclxufVxyXG5cclxuZnVuY3Rpb24gZ2V0UmVxdWVzdEhlYWRlcnMob3B0aW9uczogT3B0aW9ucykge1xyXG4gIGNvbnN0IGhlYWRlcnMgPSBnZXRBamF4UmVxdWVzdEhlYWRlcnMob3B0aW9ucyk7XHJcbiAgY29uc3QgeyB1cGxvYWQgfSA9IG9wdGlvbnM7XHJcblxyXG4gIGlmICghaGVhZGVycy5BY2NlcHQpIHtcclxuICAgIGhlYWRlcnMuQWNjZXB0ID0gZ2V0QWNjZXB0SGVhZGVyKG9wdGlvbnMpO1xyXG4gIH1cclxuXHJcbiAgaWYgKCF1cGxvYWQgJiYgIWlzR2V0TWV0aG9kKG9wdGlvbnMpICYmICFoZWFkZXJzW0NPTlRFTlRfVFlQRV0pIHtcclxuICAgIGhlYWRlcnNbQ09OVEVOVF9UWVBFXSA9IG9wdGlvbnMuY29udGVudFR5cGUgfHwgYCR7VVJMRU5DT0RFRH07Y2hhcnNldD11dGYtOGA7XHJcbiAgfVxyXG5cclxuICByZXR1cm4gT2JqZWN0LmtleXMoaGVhZGVycykucmVkdWNlKChhY2MsIGtleSkgPT4ge1xyXG4gICAgaWYgKGlzRGVmaW5lZChoZWFkZXJzW2tleV0pKSB7XHJcbiAgICAgIGFjY1trZXldID0gaGVhZGVyc1trZXldO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIGFjYztcclxuICB9LCB7fSk7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIHJlamVjdElmQWJvcnRlZChkZWZlcnJlZDogRGVmZXJyZWRSZXN1bHQsIHhoclN1cnJvZ2F0ZTogWEhSU3Vycm9nYXRlLCBjYWxsYmFjaz86ICgpID0+IHZvaWQpIHtcclxuICBpZiAoeGhyU3Vycm9nYXRlLmFib3J0ZWQpIHtcclxuICAgIGRlZmVycmVkLnJlamVjdCh7IHN0YXR1czogU1RBVFVTX0FCT1JULCBzdGF0dXNUZXh0OiAnYWJvcnRlZCcsIG9rOiBmYWxzZSB9KTtcclxuICAgIGNhbGxiYWNrPy4oKTtcclxuICB9XHJcbn1cclxuXHJcbmZ1bmN0aW9uIGdldEpzb25wUGFyYW1ldGVycyhvcHRpb25zOiBPcHRpb25zKSB7XHJcbiAgY29uc3QgcGF0Y2hlZE9wdGlvbnMgPSB7IC4uLm9wdGlvbnMgfTtcclxuICBjb25zdCBjYWxsYmFja05hbWUgPSBnZXRKc29ucENhbGxiYWNrTmFtZShwYXRjaGVkT3B0aW9ucyk7XHJcblxyXG4gIHJldHVybiB7IGNhbGxiYWNrTmFtZSwgZGF0YTogcGF0Y2hlZE9wdGlvbnMuZGF0YSB9O1xyXG59XHJcblxyXG5mdW5jdGlvbiBhZGRKc29ucENhbGxiYWNrKGNhbGxiYWNrTmFtZTogc3RyaW5nLCBkZWZlcnJlZDogRGVmZXJyZWRSZXN1bHQsIHhoclN1cnJvZ2F0ZTogWEhSU3Vycm9nYXRlKSB7XHJcbiAgZ2V0V2luZG93KClbY2FsbGJhY2tOYW1lXSA9IChkYXRhKSA9PiBkZWZlcnJlZC5yZXNvbHZlKGRhdGEsIFNVQ0NFU1MsIHhoclN1cnJvZ2F0ZSk7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIHNlbmRSZXF1ZXN0QnlTY3JpcHQodXJsOiBzdHJpbmcsIGRlZmVycmVkOiBEZWZlcnJlZFJlc3VsdCwgeGhyU3Vycm9nYXRlOiBYSFJTdXJyb2dhdGUpIHtcclxuICBldmFsQ3Jvc3NEb21haW5TY3JpcHQodXJsKS50aGVuKFxyXG4gICAgKCkgPT4gZGVmZXJyZWQucmVzb2x2ZShudWxsLCBTVUNDRVNTLCB4aHJTdXJyb2dhdGUpLFxyXG4gICAgKCkgPT4gZGVmZXJyZWQucmVqZWN0KHhoclN1cnJvZ2F0ZSwgRVJST1IpLFxyXG4gICk7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIGdldFJlcXVlc3RDYWxsYmFja3Mob3B0aW9uczogT3B0aW9ucywgZGVmZXJyZWQ6IERlZmVycmVkUmVzdWx0LCB4aHJTdXJyb2dhdGU6IFhIUlN1cnJvZ2F0ZSkge1xyXG4gIHJldHVybiB7XHJcbiAgICBuZXh0KHJlc3BvbnNlOiBIdHRwUmVzcG9uc2U8YW55Pikge1xyXG4gICAgICBpZiAoaXNVc2VkSlNPTlAob3B0aW9ucykpIHtcclxuICAgICAgICByZXR1cm4gb3B0aW9ucy5jcm9zc0RvbWFpblxyXG4gICAgICAgICAgPyBkZWZlcnJlZC5yZXNvbHZlKHJlc3BvbnNlLCAnc3VjY2VzcycsIGFzc2lnblJlc3BvbnNlUHJvcHMoeGhyU3Vycm9nYXRlLCByZXNwb25zZSkpXHJcbiAgICAgICAgICA6IGV2YWxTY3JpcHQocmVzcG9uc2UuYm9keSk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmIChpc1VzZWRTY3JpcHQob3B0aW9ucykpIHtcclxuICAgICAgICBldmFsU2NyaXB0KHJlc3BvbnNlLmJvZHkpO1xyXG4gICAgICB9XHJcblxyXG4gICAgICByZXR1cm4gZGVmZXJyZWQucmVzb2x2ZShcclxuICAgICAgICByZXNwb25zZS5ib2R5LFxyXG4gICAgICAgIHJlc3BvbnNlLmJvZHkgPyAnc3VjY2VzcycgOiBOT19DT05URU5ULFxyXG4gICAgICAgIGFzc2lnblJlc3BvbnNlUHJvcHMoeGhyU3Vycm9nYXRlLCByZXNwb25zZSksXHJcbiAgICAgICk7XHJcbiAgICB9LFxyXG4gICAgZXJyb3IoZXJyb3I6IEh0dHBFcnJvclJlc3BvbnNlKSB7XHJcbiAgICAgIGVycm9yID0gZXJyb3IgJiYgdHlwZW9mIGVycm9yID09PSAnb2JqZWN0JyA/IGVycm9yIDogeyBlcnJvciB9IGFzIHVua25vd24gYXMgSHR0cEVycm9yUmVzcG9uc2U7XHJcbiAgICAgIGxldCBlcnJvclN0YXR1cyA9IGVycm9yPy5zdGF0dXNUZXh0ID09PSBUSU1FT1VUID8gVElNRU9VVCA6ICdlcnJvcic7XHJcblxyXG4gICAgICBlcnJvclN0YXR1cyA9IG9wdGlvbnMuZGF0YVR5cGUgPT09ICdqc29uJyAmJiBlcnJvcj8ubWVzc2FnZT8uaW5jbHVkZXM/LigncGFyc2luZycpXHJcbiAgICAgICAgPyBQQVJTRVJfRVJST1JcclxuICAgICAgICA6IGVycm9yU3RhdHVzO1xyXG5cclxuICAgICAgcmV0dXJuIGRlZmVycmVkLnJlamVjdChhc3NpZ25SZXNwb25zZVByb3BzKHhoclN1cnJvZ2F0ZSwgeyBzdGF0dXM6IDQwMCwgLi4uZXJyb3IgfSBhcyBIdHRwRXJyb3JSZXNwb25zZSksIGVycm9yU3RhdHVzLCBlcnJvcik7XHJcbiAgICB9LFxyXG4gICAgY29tcGxldGUoKSB7XHJcbiAgICAgIHJlamVjdElmQWJvcnRlZChkZWZlcnJlZCwgeGhyU3Vycm9nYXRlKTtcclxuICAgIH0sXHJcbiAgfTtcclxufVxyXG5cclxuZnVuY3Rpb24gZ2V0VXBsb2FkQ2FsbGJhY2tzKG9wdGlvbnM6IE9wdGlvbnMsIGRlZmVycmVkOiBEZWZlcnJlZFJlc3VsdCwgeGhyU3Vycm9nYXRlOiBYSFJTdXJyb2dhdGUpIHtcclxuICBsZXQgdG90YWwgPSAwO1xyXG4gIGxldCBpc1VwbG9hZFN0YXJ0ZWQgPSBmYWxzZTtcclxuXHJcbiAgcmV0dXJuIHtcclxuICAgIG5leHQ6IChldmVudDogSHR0cEV2ZW50PE9iamVjdD4pID0+IHtcclxuICAgICAgaWYgKCFpc1VwbG9hZFN0YXJ0ZWRcclxuICAgICAgICAgICYmIFtIdHRwRXZlbnRUeXBlLlVwbG9hZFByb2dyZXNzLCBIdHRwRXZlbnRUeXBlLlNlbnRdLmluY2x1ZGVzKGV2ZW50LnR5cGUpKSB7XHJcbiAgICAgICAgb3B0aW9ucy51cGxvYWQub25sb2Fkc3RhcnQ/LihldmVudCk7XHJcbiAgICAgICAgaXNVcGxvYWRTdGFydGVkID0gdHJ1ZTtcclxuICAgICAgfVxyXG5cclxuICAgICAgaWYgKGV2ZW50LnR5cGUgPT09IEh0dHBFdmVudFR5cGUuVXBsb2FkUHJvZ3Jlc3MpIHtcclxuICAgICAgICB0b3RhbCArPSBldmVudC5sb2FkZWQ7XHJcbiAgICAgICAgb3B0aW9ucy51cGxvYWQub25wcm9ncmVzcz8uKHsgLi4uZXZlbnQsIHRvdGFsIH0pO1xyXG4gICAgICB9IGVsc2UgaWYgKGV2ZW50LnR5cGUgPT09IEh0dHBFdmVudFR5cGUuUmVzcG9uc2UpIHtcclxuICAgICAgICB4aHJTdXJyb2dhdGUuc3RhdHVzID0gZXZlbnQuc3RhdHVzO1xyXG4gICAgICAgIHhoclN1cnJvZ2F0ZS5zdGF0dXNUZXh0ID0gZXZlbnQuc3RhdHVzVGV4dDtcclxuICAgICAgICB4aHJTdXJyb2dhdGUucmVzcG9uc2UgPSBldmVudDtcclxuXHJcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gb3B0aW9ucz8uZGF0YVR5cGUgPT09ICdqc29uJyAmJiB0eXBlb2YgZXZlbnQuYm9keSA9PT0gJ29iamVjdCdcclxuICAgICAgICAgID8gZXZlbnQuYm9keVxyXG4gICAgICAgICAgOiB4aHJTdXJyb2dhdGU7XHJcblxyXG4gICAgICAgIHJldHVybiBkZWZlcnJlZC5yZXNvbHZlKHJlc3VsdCwgU1VDQ0VTUyk7XHJcbiAgICAgIH1cclxuICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9LFxyXG4gICAgZXJyb3IoZXJyb3I6IEh0dHBFcnJvclJlc3BvbnNlKSB7XHJcbiAgICAgIGVycm9yID0gZXJyb3IgJiYgdHlwZW9mIGVycm9yID09PSAnb2JqZWN0JyA/IGVycm9yIDogeyBlcnJvciB9IGFzIHVua25vd24gYXMgSHR0cEVycm9yUmVzcG9uc2U7XHJcbiAgICAgIHJldHVybiBkZWZlcnJlZC5yZWplY3QoYXNzaWduUmVzcG9uc2VQcm9wcyh4aHJTdXJyb2dhdGUsIHsgc3RhdHVzOiA0MDAsIC4uLmVycm9yIH0gYXMgSHR0cEVycm9yUmVzcG9uc2UpLCBlcnJvci5zdGF0dXMsIGVycm9yKTtcclxuICAgIH0sXHJcbiAgICBjb21wbGV0ZSgpIHtcclxuICAgICAgcmVqZWN0SWZBYm9ydGVkKGRlZmVycmVkLCB4aHJTdXJyb2dhdGUsICgpID0+IHtcclxuICAgICAgICBvcHRpb25zLnVwbG9hZD8ub25hYm9ydD8uKHhoclN1cnJvZ2F0ZSk7XHJcbiAgICAgIH0pO1xyXG4gICAgfSxcclxuICB9O1xyXG59XHJcblxyXG5leHBvcnQgY29uc3Qgc2VuZFJlcXVlc3RGYWN0b3J5ID0gKGh0dHBDbGllbnQ6IEh0dHBDbGllbnQpID0+IChvcHRpb25zOiBPcHRpb25zKSA9PiB7XHJcbiAgY29uc3QgYWJvcnQkID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcclxuICBjb25zdCBkZWZlcnJlZDogRGVmZXJyZWRSZXN1bHQgPSBEZWZlcnJlZCgpO1xyXG4gIGNvbnN0IHJlc3VsdCA9IGRlZmVycmVkLnByb21pc2UoKSBhcyBSZXN1bHQ7XHJcbiAgY29uc3QgaXNHZXQgPSBpc0dldE1ldGhvZChvcHRpb25zKTtcclxuICBjb25zdCBpc0pTT05QID0gaXNVc2VkSlNPTlAob3B0aW9ucyk7XHJcbiAgY29uc3QgaXNTY3JpcHQgPSBpc1VzZWRTY3JpcHQob3B0aW9ucyk7XHJcblxyXG4gIG9wdGlvbnMuY3Jvc3NEb21haW4gPSBpc0Nyb3NzRG9tYWluKG9wdGlvbnMudXJsKTtcclxuICBvcHRpb25zLmNhY2hlID0gaXNDYWNoZU5lZWQob3B0aW9ucyk7XHJcblxyXG4gIGNvbnN0IGhlYWRlcnMgPSBnZXRSZXF1ZXN0SGVhZGVycyhvcHRpb25zKTtcclxuICBjb25zdCB4aHJTdXJyb2dhdGU6IFhIUlN1cnJvZ2F0ZSA9IHtcclxuICAgIHR5cGU6ICdYTUxIdHRwUmVxdWVzdFN1cnJvZ2F0ZScsXHJcbiAgICBhYm9ydGVkOiBmYWxzZSxcclxuICAgIGFib3J0KCkge1xyXG4gICAgICB0aGlzLmFib3J0ZWQgPSB0cnVlO1xyXG4gICAgICBhYm9ydCQubmV4dCgpO1xyXG4gICAgfSxcclxuICB9O1xyXG5cclxuICByZXN1bHQuYWJvcnQgPSAoKSA9PiB4aHJTdXJyb2dhdGUuYWJvcnQoKTtcclxuXHJcbiAgaWYgKCFvcHRpb25zLmNyb3NzRG9tYWluICYmIGlzSlNPTlApIHtcclxuICAgIGNvbnN0IHsgY2FsbGJhY2tOYW1lLCBkYXRhIH0gPSBnZXRKc29ucFBhcmFtZXRlcnMob3B0aW9ucyk7XHJcblxyXG4gICAgb3B0aW9ucy5kYXRhID0geyAuLi5vcHRpb25zLmRhdGEsIC4uLmRhdGEgfTtcclxuXHJcbiAgICBhZGRKc29ucENhbGxiYWNrKGNhbGxiYWNrTmFtZSwgZGVmZXJyZWQsIHhoclN1cnJvZ2F0ZSk7XHJcbiAgfVxyXG5cclxuICBjb25zdCB7IHVybCwgcGFyYW1ldGVyczogZGF0YSB9ID0gZ2V0UmVxdWVzdE9wdGlvbnMob3B0aW9ucywgaGVhZGVycyk7XHJcbiAgY29uc3QgeyB1cGxvYWQsIGJlZm9yZVNlbmQsIHhockZpZWxkcyB9ID0gb3B0aW9ucztcclxuXHJcbiAgYmVmb3JlU2VuZD8uKHhoclN1cnJvZ2F0ZSk7XHJcblxyXG4gIGlmIChvcHRpb25zLmNyb3NzRG9tYWluICYmIGlzU2NyaXB0ICYmICF4aHJTdXJyb2dhdGUuYWJvcnRlZCkge1xyXG4gICAgc2VuZFJlcXVlc3RCeVNjcmlwdCh1cmwsIGRlZmVycmVkLCB4aHJTdXJyb2dhdGUpO1xyXG4gICAgcmV0dXJuIHJlc3VsdDtcclxuICB9XHJcblxyXG4gIGlmIChvcHRpb25zLmNhY2hlID09PSBmYWxzZSAmJiBpc0dldCAmJiBkYXRhKSB7XHJcbiAgICBkYXRhLl8gPSBEYXRlLm5vdygpICsgMTtcclxuICB9XHJcblxyXG4gIGNvbnN0IG1ha2VCb2R5ID0gKCkgPT4gKCF1cGxvYWQgJiYgdHlwZW9mIGRhdGEgPT09ICdvYmplY3QnICYmIGhlYWRlcnNbQ09OVEVOVF9UWVBFXS5pbmRleE9mKFVSTEVOQ09ERUQpID09PSAwXHJcbiAgICA/IE9iamVjdC5rZXlzKGRhdGEpLnJlZHVjZShcclxuICAgICAgKGh0dHBQYXJhbXMsIGtleSkgPT4gaHR0cFBhcmFtcy5zZXQoa2V5LCBkYXRhW2tleV0pLFxyXG4gICAgICBuZXcgSHR0cFBhcmFtcygpLFxyXG4gICAgKS50b1N0cmluZygpXHJcbiAgICA6IGRhdGEpO1xyXG5cclxuICBjb25zdCBib2R5ID0gaXNHZXQgPyB1bmRlZmluZWQgOiBtYWtlQm9keSgpO1xyXG4gIGNvbnN0IHBhcmFtcyA9IGlzR2V0ID8gZGF0YSA6IHVuZGVmaW5lZDtcclxuXHJcbiAgY29uc3QgcmVxdWVzdCA9IG9wdGlvbnMuY3Jvc3NEb21haW4gJiYgaXNKU09OUFxyXG4gICAgPyBodHRwQ2xpZW50Lmpzb25wKHVybCwgb3B0aW9ucy5qc29ucCB8fCAnY2FsbGJhY2snKVxyXG4gICAgOiBodHRwQ2xpZW50LnJlcXVlc3QoXHJcbiAgICAgIGdldE1ldGhvZChvcHRpb25zKSxcclxuICAgICAgdXJsLFxyXG4gICAgICB7XHJcbiAgICAgICAgcGFyYW1zLFxyXG4gICAgICAgIGJvZHksXHJcbiAgICAgICAgaGVhZGVycyxcclxuICAgICAgICByZXBvcnRQcm9ncmVzczogdHJ1ZSxcclxuICAgICAgICB3aXRoQ3JlZGVudGlhbHM6IHhockZpZWxkcz8ud2l0aENyZWRlbnRpYWxzLFxyXG4gICAgICAgIG9ic2VydmU6IHVwbG9hZCA/ICdldmVudHMnIDogJ3Jlc3BvbnNlJyxcclxuICAgICAgICByZXNwb25zZVR5cGU6IG9wdGlvbnMucmVzcG9uc2VUeXBlIHx8IChpc1NjcmlwdCB8fCBpc0pTT05QID8gJ3RleHQnIDogb3B0aW9ucy5kYXRhVHlwZSksXHJcbiAgICAgIH0sXHJcbiAgICApO1xyXG5cclxuICBjb25zdCBzdWJzY3JpcHRpb25DYWxsYmFja3MgPSB1cGxvYWRcclxuICAgID8gZ2V0VXBsb2FkQ2FsbGJhY2tzXHJcbiAgICA6IGdldFJlcXVlc3RDYWxsYmFja3M7XHJcblxyXG4gIHJlcXVlc3QucGlwZS5hcHBseShyZXF1ZXN0LCBbXHJcbiAgICB0YWtlVW50aWwoYWJvcnQkKSBhcyBhbnksXHJcbiAgICAuLi5vcHRpb25zLnRpbWVvdXRcclxuICAgICAgPyBbdGltZW91dFdpdGgob3B0aW9ucy50aW1lb3V0LCB0aHJvd0Vycm9yKHsgc3RhdHVzVGV4dDogVElNRU9VVCwgc3RhdHVzOiAwLCBvazogZmFsc2UgfSkpIGFzIGFueV1cclxuICAgICAgOiBbXSxcclxuICBdKS5zdWJzY3JpYmUoXHJcbiAgICBzdWJzY3JpcHRpb25DYWxsYmFja3Mob3B0aW9ucywgZGVmZXJyZWQsIHhoclN1cnJvZ2F0ZSksXHJcbiAgKTtcclxuXHJcbiAgcmV0dXJuIHJlc3VsdDtcclxufTtcclxuIl19