UNPKG

@duoduo-oba/ng-devui

Version:

DevUI components based on Angular

394 lines 39.4 kB
/** * @fileoverview added by tsickle * Generated from: helper-utils.ts * @suppress {checkTypes,constantProperty,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc */ import { Directive, HostListener, Input } from '@angular/core'; import { HttpParams } from '@angular/common/http'; var HelperUtils = /** @class */ (function () { function HelperUtils() { } /** * @param {?} url * @param {?=} target * @return {?} */ HelperUtils.jumpOuterUrl = /** * @param {?} url * @param {?=} target * @return {?} */ function (url, target) { if (target === void 0) { target = '_blank'; } if (url !== undefined) { /** @type {?} */ var tempLink = document.createElement('a'); tempLink.style.display = 'none'; // for IE 11 tempLink.target = target; tempLink.href = url; document.body.appendChild(tempLink); // for IE 11, IE11需要append到document.body里面的a链接才会生效 // for IE 11, IE11需要append到document.body里面的a链接才会生效 /** @type {?} */ var event_1 = document.createEvent('MouseEvents'); event_1.initEvent('click', false, true); tempLink.dispatchEvent(event_1); document.body.removeChild(tempLink); // for IE 11 } }; /** * @param {?} url * @param {?=} option * @param {?=} onError * @return {?} */ HelperUtils.downloadFile = /** * @param {?} url * @param {?=} option * @param {?=} onError * @return {?} */ function (url, option, onError) { if (document.querySelector('iframe[name=' + (option && option.iframename || 'download') + ']')) { document.body.removeChild(document.querySelector('iframe[name=' + (option && option.iframename || 'download') + ']')); } /** @type {?} */ var tempiframe = document.createElement('iframe'); tempiframe.name = option && option.iframename || 'download'; tempiframe.style.display = 'none'; /** @type {?} */ var tempform = document.createElement('form'); tempform.action = url; tempform.method = option && option.method || 'post'; tempform.target = option && option.iframename || 'download'; tempform.enctype = option && option.enctype || 'application/x-www-form-urlencoded'; tempform.style.display = 'none'; if (option && option.params) { Object.keys(option.params).forEach((/** * @param {?} key * @return {?} */ function (key) { /** @type {?} */ var opt = document.createElement('input'); opt.name = key; opt.value = option.params[key]; tempform.appendChild(opt); })); } /** @type {?} */ var submit = document.createElement('input'); submit.type = 'submit'; tempform.appendChild(submit); tempiframe.appendChild(tempform); document.body.appendChild(tempiframe); // 下载错误处理。下载成功并不会响应,因为响应头中带有Content-Disposition(下载头)的url,无法监听iframe的load事件,load事件不会触发 tempiframe.addEventListener('load', (/** * @param {?} event * @return {?} */ function (event) { try { /** @type {?} */ var iframeDoc = tempiframe.contentDocument; if (onError !== undefined) { /** @type {?} */ var response = void 0; try { response = JSON.parse(iframeDoc.body && iframeDoc.body.textContent); } catch (e) { response = iframeDoc.body && iframeDoc.body.textContent; } if (!response) { response = 'Error'; } onError(response); } } catch (e) { onError('Error'); } document.body.removeChild(tempiframe); })); tempform.submit(); }; /** * @param {?} httpClient * @param {?} url * @param {?=} option * @param {?=} onError * @param {?=} onSuccess * @return {?} */ HelperUtils.downloadFileByHttpClient = /** * @param {?} httpClient * @param {?} url * @param {?=} option * @param {?=} onError * @param {?=} onSuccess * @return {?} */ function (httpClient, url, option, onError, onSuccess) { /** @type {?} */ var requestMethod = option && option.method && option.method.toLowerCase() || 'post'; /** @type {?} */ var requestHeaderContentType = option.enctype || 'application/x-www-form-urlencoded'; /** @type {?} */ var requestParams = option.params ? new HttpParams({ fromObject: option.params }) : null; /** @type {?} */ var requestUrl = url; /** @type {?} */ var requestOptionParams = requestMethod === 'get' ? requestParams : undefined; /** @type {?} */ var requestBody = requestMethod === 'post' ? requestParams && requestParams.toString() : undefined; /** @type {?} */ var responseOption = option.responseOption; /** @type {?} */ var requestOption = Object.assign({}, { body: requestBody, observe: 'response', params: requestOptionParams, headers: { 'Content-Type': requestHeaderContentType }, responseType: 'arraybuffer' }, { headers: option.header }); /** @type {?} */ var handleResponse = ((/** * @param {?} resOption * @return {?} */ function (resOption) { switch (resOption) { case 'response': return (/** * @param {?} res * @return {?} */ function (res) { return res; }); case 'body': return (/** * @param {?} res * @return {?} */ function (res) { /** @type {?} */ var arrayBuffer = (/** @type {?} */ (((/** @type {?} */ (res))).body)) || ((/** @type {?} */ (res))).error; /** @type {?} */ var body = HelperUtils.utf8ArrayToStr(arrayBuffer); return body; }); case 'json': default: return (/** * @param {?} res * @return {?} */ function (res) { /** @type {?} */ var arrayBuffer = (/** @type {?} */ (((/** @type {?} */ (res))).body)) || ((/** @type {?} */ (res))).error; /** @type {?} */ var response; try { /** @type {?} */ var body = HelperUtils.utf8ArrayToStr(arrayBuffer); try { response = JSON.parse(body); } catch (e) { /** @type {?} */ var parser = new DOMParser(); /** @type {?} */ var html = parser.parseFromString(body, 'text/html'); response = html.body.textContent; } } catch (e) { throw new Error('Parsing Error:' + e); } if (!response) { response = 'Error'; } return response; }); } }))(responseOption); /** @type {?} */ var downloadFileFromArrayBuffer = (/** * @param {?} data * @param {?} filename * @param {?} contentType * @return {?} */ function (data, filename, contentType) { if (window.navigator && window.navigator.msSaveOrOpenBlob) { // IE11 support // IE11 support /** @type {?} */ var blob = new Blob([data], { type: contentType }); window.navigator.msSaveOrOpenBlob(blob, filename); } else { // other browsers if ('download' in document.createElement('a')) { /** @type {?} */ var blob = new Blob([data], { type: contentType }); /** @type {?} */ var link = document.createElement('a'); link.href = URL.createObjectURL(blob); link.download = filename; document.body.appendChild(link); link.click(); document.body.removeChild(link); URL.revokeObjectURL(link.href); } else { // not support tag a download attribute use file download, filename won't support /** @type {?} */ var file = new File([data], filename, { type: contentType }); /** @type {?} */ var exportUrl = URL.createObjectURL(file); window.location.assign(exportUrl); URL.revokeObjectURL(exportUrl); } } }); /** @type {?} */ var getFilenameFromDisposition = (/** * @param {?} disposition * @return {?} */ function (disposition) { /** @type {?} */ var filenamePair = disposition.split(';').filter((/** * @param {?} str * @return {?} */ function (str) { return /^filename=/.test(str.trim()); })).pop(); if (filenamePair) { /** @type {?} */ var str = filenamePair.trim(); str = str.split('=')[1]; str = str.replace(/['"]/g, ''); return decodeURIComponent(str); } else { return null; } }); httpClient.request(requestMethod, requestUrl, requestOption).subscribe((/** * @param {?} res * @return {?} */ function (res) { /** @type {?} */ var disposition = ((/** @type {?} */ (res.headers))).get('content-disposition'); /** @type {?} */ var contentType = ((/** @type {?} */ (res.headers))).get('content-type'); if (/^attachment/i.test(disposition) || option.downloadWithoutDispositionHeader) { /** @type {?} */ var downloadFilename = option.filename || disposition && getFilenameFromDisposition(disposition) || url; downloadFileFromArrayBuffer(res.body, downloadFilename, contentType); if (onSuccess) { onSuccess(res); } } else { if (onError) { /** @type {?} */ var response = void 0; try { response = handleResponse(res); } catch (e) { response = res; } onError(response); } } }), (/** * @param {?} err * @return {?} */ function (err) { if (onError) { /** @type {?} */ var response = void 0; try { response = handleResponse(err); } catch (e) { response = err; } onError(response); } })); }; /** * @private * @param {?} arrayBuffer * @return {?} */ HelperUtils.utf8ArrayToStr = /** * @private * @param {?} arrayBuffer * @return {?} */ function (arrayBuffer) { if (typeof TextDecoder !== 'undefined') { return new TextDecoder('utf-8').decode(arrayBuffer); } else { /** * fallback 方案,无TextDecoder场景使用直接解析,英文无问题,中文会存在乱码 * ie 11 下支持中文需要使用MDN推荐的 fastestsmallesttextencoderdecoder以支持TextDecoder * npm install fastestsmallesttextencoderdecoder * polyfill.ts includes * ``` * // polyfill for TextDecoder on IE 11 * import 'fastestsmallesttextencoderdecoder'; * ``` */ return String.fromCharCode.apply(null, new Uint8Array(arrayBuffer)); } }; return HelperUtils; }()); export { HelperUtils }; var SimulateATagDirective = /** @class */ (function () { function SimulateATagDirective() { this.target = '_blank'; } /** * @return {?} */ SimulateATagDirective.prototype.onClick = /** * @return {?} */ function () { HelperUtils.jumpOuterUrl(this.href, this.target); }; SimulateATagDirective.decorators = [ { type: Directive, args: [{ selector: '[dSimulateATag]' },] } ]; /** @nocollapse */ SimulateATagDirective.ctorParameters = function () { return []; }; SimulateATagDirective.propDecorators = { href: [{ type: Input }], target: [{ type: Input }], onClick: [{ type: HostListener, args: ['click',] }] }; return SimulateATagDirective; }()); export { SimulateATagDirective }; if (false) { /** @type {?} */ SimulateATagDirective.prototype.href; /** @type {?} */ SimulateATagDirective.prototype.target; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaGVscGVyLXV0aWxzLmpzIiwic291cmNlUm9vdCI6Im5nOi8vbmctZGV2dWkvY29tbW9uLyIsInNvdXJjZXMiOlsiaGVscGVyLXV0aWxzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxZQUFZLEVBQUUsS0FBSyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQy9ELE9BQU8sRUFBMkIsVUFBVSxFQUFtQyxNQUFNLHNCQUFzQixDQUFDO0FBRTVHO0lBQUE7SUFxUEEsQ0FBQzs7Ozs7O0lBcFBRLHdCQUFZOzs7OztJQUFuQixVQUFvQixHQUFHLEVBQUUsTUFBaUI7UUFBakIsdUJBQUEsRUFBQSxpQkFBaUI7UUFDckMsSUFBSSxHQUFHLEtBQUssU0FBUyxFQUFFOztnQkFDZCxRQUFRLEdBQUcsUUFBUSxDQUFDLGFBQWEsQ0FBQyxHQUFHLENBQUM7WUFDNUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxPQUFPLEdBQUcsTUFBTSxDQUFDLENBQUssWUFBWTtZQUNqRCxRQUFRLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQztZQUN6QixRQUFRLENBQUMsSUFBSSxHQUFHLEdBQUcsQ0FBQztZQUNwQixRQUFRLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLGtEQUFrRDs7O2dCQUNqRixPQUFLLEdBQUcsUUFBUSxDQUFDLFdBQVcsQ0FBQyxhQUFhLENBQUM7WUFDakQsT0FBSyxDQUFDLFNBQVMsQ0FBQyxPQUFPLEVBQUUsS0FBSyxFQUFFLElBQUksQ0FBQyxDQUFDO1lBQ3RDLFFBQVEsQ0FBQyxhQUFhLENBQUMsT0FBSyxDQUFDLENBQUM7WUFDOUIsUUFBUSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxZQUFZO1NBQ3BEO0lBQ0wsQ0FBQzs7Ozs7OztJQUVNLHdCQUFZOzs7Ozs7SUFBbkIsVUFDSSxHQUFXLEVBQ1gsTUFLQyxFQUNELE9BQTRCO1FBRTVCLElBQUks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S0FBSyxXQUFXLEVBQUU7WUFDdEMsT0FBTyxJQUFJLFdBQVcsQ0FBQyxPQUFPLENBQUMsQ0FBQyxNQUFNLENBQUMsV0FBVyxDQUFDLENBQUM7U0FDckQ7YUFBTTtZQUNMOzs7Ozs7Ozs7ZUFTRztZQUNILE9BQU8sTUFBTSxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUMsSUFBSSxFQUFFLElBQUksVUFBVSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUM7U0FDckU7SUFDSCxDQUFDO0lBQ0gsa0JBQUM7QUFBRCxDQUFDLEFBclBELElBcVBDOztBQUVEO0lBTUk7UUFEUyxXQUFNLEdBQXVELFFBQVEsQ0FBQztJQUNoRSxDQUFDOzs7O0lBQ08sdUNBQU87OztJQUE5QjtRQUNJLFdBQVcsQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDckQsQ0FBQzs7Z0JBVEosU0FBUyxTQUFDO29CQUNULFFBQVEsRUFBRSxpQkFBaUI7aUJBQzVCOzs7Ozt1QkFFSSxLQUFLO3lCQUNMLEtBQUs7MEJBRUwsWUFBWSxTQUFDLE9BQU87O0lBR3pCLDRCQUFDO0NBQUEsQUFWRCxJQVVDO1NBUFkscUJBQXFCOzs7SUFDOUIscUNBQXNCOztJQUN0Qix1Q0FBK0UiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBEaXJlY3RpdmUsIEhvc3RMaXN0ZW5lciwgSW5wdXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgSHR0cENsaWVudCwgSHR0cEhlYWRlcnMsIEh0dHBQYXJhbXMsIEh0dHBSZXNwb25zZSwgSHR0cEVycm9yUmVzcG9uc2UgfSBmcm9tICdAYW5ndWxhci9jb21tb24vaHR0cCc7XHJcblxyXG5leHBvcnQgY2xhc3MgSGVscGVyVXRpbHMge1xyXG4gIHN0YXRpYyBqdW1wT3V0ZXJVcmwodXJsLCB0YXJnZXQgPSAnX2JsYW5rJykge1xyXG4gICAgICAgaWYgKHVybCAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICBjb25zdCB0ZW1wTGluayA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2EnKTtcclxuICAgICAgICAgIHRlbXBMaW5rLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7ICAgICAvLyBmb3IgSUUgMTFcclxuICAgICAgICAgIHRlbXBMaW5rLnRhcmdldCA9IHRhcmdldDtcclxuICAgICAgICAgIHRlbXBMaW5rLmhyZWYgPSB1cmw7XHJcbiAgICAgICAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHRlbXBMaW5rKTsgLy8gZm9yIElFIDExLCBJRTEx6ZyA6KaBYXBwZW5k5YiwZG9jdW1lbnQuYm9keemHjOmdoueahGHpk77mjqXmiY3kvJrnlJ/mlYhcclxuICAgICAgICAgIGNvbnN0IGV2ZW50ID0gZG9jdW1lbnQuY3JlYXRlRXZlbnQoJ01vdXNlRXZlbnRzJyk7XHJcbiAgICAgICAgICBldmVudC5pbml0RXZlbnQoJ2NsaWNrJywgZmFsc2UsIHRydWUpO1xyXG4gICAgICAgICAgdGVtcExpbmsuZGlzcGF0Y2hFdmVudChldmVudCk7XHJcbiAgICAgICAgICBkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKHRlbXBMaW5rKTsgLy8gZm9yIElFIDExXHJcbiAgICAgIH1cclxuICB9XHJcblxyXG4gIHN0YXRpYyBkb3dubG9hZEZpbGUoXHJcbiAgICAgIHVybDogc3RyaW5nLFxyXG4gICAgICBvcHRpb24/OiB7XHJcbiAgICAgICAgICBtZXRob2Q/OiAnUE9TVCd8ICdHRVQnIHwgJ3Bvc3QnIHwgJ2dldCcsXHJcbiAgICAgICAgICBwYXJhbXM/OiB7W3Byb3BlcnR5OiBzdHJpbmddOiBzdHJpbmd9LFxyXG4gICAgICAgICAgZW5jdHlwZT86ICdhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQnIHwgJ211bHRpcGFydC9mb3JtLWRhdGEnfCAndGV4dC9wbGFpbicsXHJcbiAgICAgICAgICBpZnJhbWVuYW1lPzogc3RyaW5nXHJcbiAgICAgIH0sXHJcbiAgICAgIG9uRXJyb3I/OiAocmVzcG9uc2UpID0+IHZvaWRcclxuICApIHtcclxuICAgICAgaWYgKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ2lmcmFtZVtuYW1lPScgKyAob3B0aW9uICYmIG9wdGlvbi5pZnJhbWVuYW1lIHx8ICdkb3dubG9hZCcpICsgJ10nKSkge1xyXG4gICAgICAgIGRvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoZG9jdW1lbnQucXVlcnlTZWxlY3RvcignaWZyYW1lW25hbWU9JyArIChvcHRpb24gJiYgb3B0aW9uLmlmcmFtZW5hbWUgfHwgJ2Rvd25sb2FkJykgKyAnXScpKTtcclxuICAgICAgfVxyXG4gICAgICBjb25zdCB0ZW1waWZyYW1lID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnaWZyYW1lJyk7XHJcbiAgICAgIHRlbXBpZnJhbWUubmFtZSA9IG9wdGlvbiAmJiBvcHRpb24uaWZyYW1lbmFtZSB8fCAnZG93bmxvYWQnO1xyXG4gICAgICB0ZW1waWZyYW1lLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XHJcblxyXG4gICAgICBjb25zdCB0ZW1wZm9ybSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2Zvcm0nKTtcclxuICAgICAgdGVtcGZvcm0uYWN0aW9uID0gdXJsO1xyXG4gICAgICB0ZW1wZm9ybS5tZXRob2QgPSBvcHRpb24gJiYgb3B0aW9uLm1ldGhvZCB8fCAncG9zdCc7XHJcbiAgICAgIHRlbXBmb3JtLnRhcmdldCA9IG9wdGlvbiAmJiBvcHRpb24uaWZyYW1lbmFtZSB8fCAnZG93bmxvYWQnO1xyXG4gICAgICB0ZW1wZm9ybS5lbmN0eXBlID0gb3B0aW9uICYmIG9wdGlvbi5lbmN0eXBlIHx8ICdhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQnO1xyXG4gICAgICB0ZW1wZm9ybS5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xyXG5cclxuICAgICAgaWYgKG9wdGlvbiAmJiBvcHRpb24ucGFyYW1zKSB7XHJcbiAgICAgICAgICBPYmplY3Qua2V5cyhvcHRpb24ucGFyYW1zKS5mb3JFYWNoKGtleSA9PiB7XHJcbiAgICAgICAgICAgICAgY29uc3Qgb3B0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnaW5wdXQnKTtcclxuICAgICAgICAgICAgICBvcHQubmFtZSA9IGtleTtcclxuICAgICAgICAgICAgICBvcHQudmFsdWUgPSBvcHRpb24ucGFyYW1zW2tleV07XHJcbiAgICAgICAgICAgICAgdGVtcGZvcm0uYXBwZW5kQ2hpbGQob3B0KTtcclxuICAgICAgICAgIH0pO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBjb25zdCBzdWJtaXQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdpbnB1dCcpO1xyXG4gICAgICBzdWJtaXQudHlwZSA9ICdzdWJtaXQnO1xyXG5cclxuICAgICAgdGVtcGZvcm0uYXBwZW5kQ2hpbGQoc3VibWl0KTtcclxuICAgICAgdGVtcGlmcmFtZS5hcHBlbmRDaGlsZCh0ZW1wZm9ybSk7XHJcbiAgICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQodGVtcGlmcmFtZSk7XHJcblxyXG4gICAgICAvLyDkuIvovb3plJnor6/lpITnkIbjgILkuIvovb3miJDlip/lubbkuI3kvJrlk43lupTvvIzlm6DkuLrlk43lupTlpLTkuK3luKbmnIlDb250ZW50LURpc3Bvc2l0aW9u77yI5LiL6L295aS077yJ55qEdXJs77yM5peg5rOV55uR5ZCsaWZyYW1l55qEbG9hZOS6i+S7tu+8jGxvYWTkuovku7bkuI3kvJrop6blj5FcclxuICAgICAgdGVtcGlmcmFtZS5hZGRFdmVudExpc3RlbmVyKCdsb2FkJywgKGV2ZW50KSA9PiB7XHJcbiAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBpZnJhbWVEb2MgPSAgdGVtcGlmcmFtZS5jb250ZW50RG9jdW1lbnQ7XHJcbiAgICAgICAgICAgICAgICBpZiAob25FcnJvciAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgbGV0IHJlc3BvbnNlO1xyXG4gICAgICAgICAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICByZXNwb25zZSA9IEpTT04ucGFyc2UoaWZyYW1lRG9jLmJvZHkgJiYgaWZyYW1lRG9jLmJvZHkudGV4dENvbnRlbnQpO1xyXG4gICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlID0gaWZyYW1lRG9jLmJvZHkgJiYgaWZyYW1lRG9jLmJvZHkudGV4dENvbnRlbnQ7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIGlmICghcmVzcG9uc2UpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2UgPSAnRXJyb3InO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBvbkVycm9yKHJlc3BvbnNlKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICAgICAgb25FcnJvcignRXJyb3InKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKHRlbXBpZnJhbWUpO1xyXG4gICAgICB9KTtcclxuICAgICAgdGVtcGZvcm0uc3VibWl0KCk7XHJcbiAgfVxyXG5cclxuICBzdGF0aWMgZG93bmxvYWRGaWxlQnlIdHRwQ2xpZW50KFxyXG4gICAgaHR0cENsaWVudDogSHR0cENsaWVudCxcclxuICAgIHVybDogc3RyaW5nLFxyXG4gICAgb3B0aW9uPzoge1xyXG4gICAgICBtZXRob2Q/OiAnUE9TVCcgfCAnR0VUJyB8ICdwb3N0JyB8ICdnZXQnLFxyXG4gICAgICBwYXJhbXM/OiB7W3Byb3BlcnR5OiBzdHJpbmddOiBzdHJpbmd9LFxyXG4gICAgICBlbmN0eXBlPzogJ2FwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCcgfCAnbXVsdGlwYXJ0L2Zvcm0tZGF0YScgfCAndGV4dC9wbGFpbicsXHJcbiAgICAgIGhlYWRlcj86IHtcclxuICAgICAgICBbaGVhZGVyOiBzdHJpbmddOiBzdHJpbmcgfCBzdHJpbmdbXTtcclxuICAgICAgfSxcclxuICAgICAgcmVzcG9uc2VPcHRpb24/OiAncmVzcG9uc2UnIHwgJ2JvZHknIHwgJ2pzb24nLFxyXG4gICAgICBmaWxlbmFtZT86IHN0cmluZyxcclxuICAgICAgd2l0aENyZWRlbnRpYWxzPzogYm9vbGVhbixcclxuICAgICAgZG93bmxvYWRXaXRob3V0RGlzcG9zaXRpb25IZWFkZXI/OiBib29sZWFuXHJcbiAgICB9LFxyXG4gICAgb25FcnJvcj86IChyZXNwb25zZSkgPT4gdm9pZCxcclxuICAgIG9uU3VjY2Vzcz86IChyZXNwb25zZSkgPT4gdm9pZCxcclxuICApIHtcclxuXHJcbiAgICBjb25zdCByZXF1ZXN0TWV0aG9kID0gb3B0aW9uICYmIG9wdGlvbi5tZXRob2QgJiYgb3B0aW9uLm1ldGhvZC50b0xvd2VyQ2FzZSgpIHx8ICdwb3N0JztcclxuICAgIGNvbnN0IHJlcXVlc3RIZWFkZXJDb250ZW50VHlwZSA9IG9wdGlvbi5lbmN0eXBlIHx8ICdhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQnO1xyXG4gICAgY29uc3QgcmVxdWVzdFBhcmFtcyA9IG9wdGlvbi5wYXJhbXMgPyBuZXcgSHR0cFBhcmFtcyh7XHJcbiAgICAgIGZyb21PYmplY3Q6IG9wdGlvbi5wYXJhbXNcclxuICAgIH0pIDogbnVsbDtcclxuXHJcbiAgICBjb25zdCByZXF1ZXN0VXJsID0gdXJsO1xyXG4gICAgY29uc3QgcmVxdWVzdE9wdGlvblBhcmFtcyA9IHJlcXVlc3RNZXRob2QgPT09ICdnZXQnID8gcmVxdWVzdFBhcmFtcyA6IHVuZGVmaW5lZDtcclxuICAgIGNvbnN0IHJlcXVlc3RCb2R5ID0gcmVxdWVzdE1ldGhvZCA9PT0gJ3Bvc3QnID8gcmVxdWVzdFBhcmFtcyAmJiByZXF1ZXN0UGFyYW1zLnRvU3RyaW5nKCkgOiB1bmRlZmluZWQ7XHJcblxyXG4gICAgY29uc3QgcmVzcG9uc2VPcHRpb24gPSBvcHRpb24ucmVzcG9uc2VPcHRpb247XHJcblxyXG4gICAgY29uc3QgcmVxdWVzdE9wdGlvbiA9IE9iamVjdC5hc3NpZ24oe30sIHtcclxuICAgICAgYm9keTogcmVxdWVzdEJvZHksXHJcbiAgICAgIG9ic2VydmU6ICdyZXNwb25zZScsXHJcbiAgICAgIHBhcmFtczogcmVxdWVzdE9wdGlvblBhcmFtcyxcclxuICAgICAgaGVhZGVyczoge1xyXG4gICAgICAgICdDb250ZW50LVR5cGUnOiByZXF1ZXN0SGVhZGVyQ29udGVudFR5cGVcclxuICAgICAgfSxcclxuICAgICAgcmVzcG9uc2VUeXBlOiAnYXJyYXlidWZmZXInXHJcbiAgICB9LCB7XHJcbiAgICAgIGhlYWRlcnM6IG9wdGlvbi5oZWFkZXJcclxuICAgIH0pO1xyXG5cclxuICAgIGNvbnN0IGhhbmRsZVJlc3BvbnNlID0gKHJlc09wdGlvbiA9PiB7XHJcbiAgICAgIHN3aXRjaCAocmVzT3B0aW9uKSB7XHJcbiAgICAgICAgY2FzZSAncmVzcG9uc2UnOlxyXG4gICAgICAgICAgcmV0dXJuIChyZXM6IEh0dHBSZXNwb25zZTxBcnJheUJ1ZmZlcj4pID0+IHJlcztcclxuICAgICAgICBjYXNlICdib2R5JzpcclxuICAgICAgICAgIHJldHVybiAocmVzOiBIdHRwUmVzcG9uc2U8QXJyYXlCdWZmZXI+IHwgSHR0cEVycm9yUmVzcG9uc2UpID0+IHtcclxuICAgICAgICAgICAgY29uc3QgYXJyYXlCdWZmZXIgPSA8QXJyYXlCdWZmZXI+KDxIdHRwUmVzcG9uc2U8QXJyYXlCdWZmZXI+PnJlcykuYm9keSB8fCAoPEh0dHBFcnJvclJlc3BvbnNlPnJlcykuZXJyb3I7XHJcbiAgICAgICAgICAgIGNvbnN0IGJvZHkgPSBIZWxwZXJVdGlscy51dGY4QXJyYXlUb1N0cihhcnJheUJ1ZmZlcik7XHJcbiAgICAgICAgICAgIHJldHVybiBib2R5O1xyXG4gICAgICAgICAgfTtcclxuICAgICAgICBjYXNlICdqc29uJzpcclxuICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgcmV0dXJuIChyZXM6IEh0dHBSZXNwb25zZTxBcnJheUJ1ZmZlcj4gfCBIdHRwRXJyb3JSZXNwb25zZSkgPT4ge1xyXG4gICAgICAgICAgICBjb25zdCBhcnJheUJ1ZmZlciA9IDxBcnJheUJ1ZmZlcj4oPEh0dHBSZXNwb25zZTxBcnJheUJ1ZmZlcj4+cmVzKS5ib2R5IHx8ICg8SHR0cEVycm9yUmVzcG9uc2U+cmVzKS5lcnJvcjtcclxuICAgICAgICAgICAgbGV0IHJlc3BvbnNlO1xyXG4gICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgIGNvbnN0IGJvZHkgPSBIZWxwZXJVdGlscy51dGY4QXJyYXlUb1N0cihhcnJheUJ1ZmZlcik7XHJcbiAgICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgIHJlc3BvbnNlID0gSlNPTi5wYXJzZShib2R5KTtcclxuICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBwYXJzZXIgPSBuZXcgRE9NUGFyc2VyKCk7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBodG1sID0gcGFyc2VyLnBhcnNlRnJvbVN0cmluZyhib2R5LCAndGV4dC9odG1sJyk7XHJcbiAgICAgICAgICAgICAgICByZXNwb25zZSA9IGh0bWwuYm9keS50ZXh0Q29udGVudDtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1BhcnNpbmcgRXJyb3I6JyArIGUpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmICghcmVzcG9uc2UpIHtcclxuICAgICAgICAgICAgICAgIHJlc3BvbnNlID0gJ0Vycm9yJztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZXR1cm4gcmVzcG9uc2U7XHJcbiAgICAgICAgICB9O1xyXG4gICAgICB9XHJcbiAgICB9KShyZXNwb25zZU9wdGlvbik7XHJcblxyXG4gICAgY29uc3QgZG93bmxvYWRGaWxlRnJvbUFycmF5QnVmZmVyID0gKGRhdGE6IEFycmF5QnVmZmVyLCBmaWxlbmFtZTogc3RyaW5nLCBjb250ZW50VHlwZTogc3RyaW5nKSA9PiB7XHJcbiAgICAgIGlmICh3aW5kb3cubmF2aWdhdG9yICYmIHdpbmRvdy5uYXZpZ2F0b3IubXNTYXZlT3JPcGVuQmxvYikgeyAvLyBJRTExIHN1cHBvcnRcclxuICAgICAgICAgIGNvbnN0IGJsb2IgPSBuZXcgQmxvYihbZGF0YV0sIHt0eXBlOiBjb250ZW50VHlwZX0pO1xyXG4gICAgICAgICAgd2luZG93Lm5hdmlnYXRvci5tc1NhdmVPck9wZW5CbG9iKGJsb2IsIGZpbGVuYW1lKTtcclxuICAgICAgfSBlbHNlIHsvLyBvdGhlciBicm93c2Vyc1xyXG4gICAgICAgICAgaWYgKCdkb3dubG9hZCcgaW4gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYScpKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGJsb2IgPSBuZXcgQmxvYihbZGF0YV0sIHt0eXBlOiBjb250ZW50VHlwZX0pO1xyXG4gICAgICAgICAgICBjb25zdCBsaW5rID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYScpO1xyXG4gICAgICAgICAgICBsaW5rLmhyZWYgPSBVUkwuY3JlYXRlT2JqZWN0VVJMKGJsb2IpO1xyXG4gICAgICAgICAgICBsaW5rLmRvd25sb2FkID0gZmlsZW5hbWU7XHJcbiAgICAgICAgICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQobGluayk7XHJcbiAgICAgICAgICAgIGxpbmsuY2xpY2soKTtcclxuICAgICAgICAgICAgZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChsaW5rKTtcclxuICAgICAgICAgICAgVVJMLnJldm9rZU9iamVjdFVSTChsaW5rLmhyZWYpO1xyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgLy8gbm90IHN1cHBvcnQgdGFnIGEgZG93bmxvYWQgYXR0cmlidXRlIHVzZSBmaWxlIGRvd25sb2FkLCBmaWxlbmFtZSB3b24ndCBzdXBwb3J0XHJcbiAgICAgICAgICAgIGNvbnN0IGZpbGUgPSBuZXcgRmlsZShbZGF0YV0sIGZpbGVuYW1lLCB7dHlwZTogY29udGVudFR5cGV9KTtcclxuICAgICAgICAgICAgY29uc3QgZXhwb3J0VXJsID0gVVJMLmNyZWF0ZU9iamVjdFVSTChmaWxlKTtcclxuICAgICAgICAgICAgd2luZG93LmxvY2F0aW9uLmFzc2lnbihleHBvcnRVcmwpO1xyXG4gICAgICAgICAgICBVUkwucmV2b2tlT2JqZWN0VVJMKGV4cG9ydFVybCk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH07XHJcblxyXG4gICAgY29uc3QgZ2V0RmlsZW5hbWVGcm9tRGlzcG9zaXRpb24gPSAoZGlzcG9zaXRpb246IHN0cmluZykgPT4ge1xyXG4gICAgICBjb25zdCBmaWxlbmFtZVBhaXIgPSAgZGlzcG9zaXRpb24uc3BsaXQoJzsnKS5maWx0ZXIoc3RyID0+IC9eZmlsZW5hbWU9Ly50ZXN0KHN0ci50cmltKCkpKS5wb3AoKTtcclxuICAgICAgaWYgKGZpbGVuYW1lUGFpcikge1xyXG4gICAgICAgIGxldCBzdHIgPSBmaWxlbmFtZVBhaXIudHJpbSgpO1xyXG4gICAgICAgIHN0ciA9IHN0ci5zcGxpdCgnPScpWzFdO1xyXG4gICAgICAgIHN0ciA9IHN0ci5yZXBsYWNlKC9bJ1wiXS9nLCAnJyk7XHJcbiAgICAgICAgcmV0dXJuIGRlY29kZVVSSUNvbXBvbmVudChzdHIpO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICB9XHJcbiAgICB9O1xyXG5cclxuXHJcbiAgICBodHRwQ2xpZW50LnJlcXVlc3QocmVxdWVzdE1ldGhvZCwgcmVxdWVzdFVybCwgcmVxdWVzdE9wdGlvbikuc3Vic2NyaWJlKChyZXM6IEh0dHBSZXNwb25zZTxhbnk+KSA9PiB7XHJcbiAgICAgIGNvbnN0IGRpc3Bvc2l0aW9uID0gKDxIdHRwSGVhZGVycz5yZXMuaGVhZGVycykuZ2V0KCdjb250ZW50LWRpc3Bvc2l0aW9uJyk7XHJcbiAgICAgIGNvbnN0IGNvbnRlbnRUeXBlID0gKDxIdHRwSGVhZGVycz5yZXMuaGVhZGVycykuZ2V0KCdjb250ZW50LXR5cGUnKTtcclxuICAgICAgaWYgKC9eYXR0YWNobWVudC9pLnRlc3QoZGlzcG9zaXRpb24pIHx8IG9wdGlvbi5kb3dubG9hZFdpdGhvdXREaXNwb3NpdGlvbkhlYWRlciApIHtcclxuICAgICAgICBjb25zdCBkb3dubG9hZEZpbGVuYW1lID0gb3B0aW9uLmZpbGVuYW1lIHx8IGRpc3Bvc2l0aW9uICYmIGdldEZpbGVuYW1lRnJvbURpc3Bvc2l0aW9uKGRpc3Bvc2l0aW9uKSB8fCB1cmwgO1xyXG4gICAgICAgIGRvd25sb2FkRmlsZUZyb21BcnJheUJ1ZmZlcihyZXMuYm9keSwgZG93bmxvYWRGaWxlbmFtZSwgY29udGVudFR5cGUpO1xyXG4gICAgICAgIGlmIChvblN1Y2Nlc3MpIHtcclxuICAgICAgICAgIG9uU3VjY2VzcyhyZXMpO1xyXG4gICAgICAgIH1cclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBpZiAob25FcnJvcikge1xyXG4gICAgICAgICAgbGV0IHJlc3BvbnNlO1xyXG4gICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgcmVzcG9uc2UgPSBoYW5kbGVSZXNwb25zZShyZXMpO1xyXG4gICAgICAgICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICByZXNwb25zZSA9IHJlcztcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIG9uRXJyb3IocmVzcG9uc2UpO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG5cclxuICAgIH0sIGVyciA9PiB7XHJcbiAgICAgIGlmIChvbkVycm9yKSB7XHJcbiAgICAgICAgbGV0IHJlc3BvbnNlO1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICByZXNwb25zZSA9IGhhbmRsZVJlc3BvbnNlKGVycik7XHJcbiAgICAgICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgcmVzcG9uc2UgPSBlcnI7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIG9uRXJyb3IocmVzcG9uc2UpO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgc3RhdGljIHV0ZjhBcnJheVRvU3RyKGFycmF5QnVmZmVyKSB7XHJcbiAgICBpZiAodHlwZW9mIFRleHREZWNvZGVyICE9PSAndW5kZWZpbmVkJykge1xyXG4gICAgICByZXR1cm4gbmV3IFRleHREZWNvZGVyKCd1dGYtOCcpLmRlY29kZShhcnJheUJ1ZmZlcik7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICAvKipcclxuICAgICAgICogZmFsbGJhY2sg5pa55qGI77yM5pegVGV4dERlY29kZXLlnLrmma/kvb/nlKjnm7TmjqXop6PmnpDvvIzoi7Hmlofml6Dpl67popjvvIzkuK3mlofkvJrlrZjlnKjkubHnoIFcclxuICAgICAgICogaWUgMTEg5LiL5pSv5oyB5Lit5paH6ZyA6KaB5L2/55SoTURO5o6o6I2Q55qEIGZhc3Rlc3RzbWFsbGVzdHRleHRlbmNvZGVyZGVjb2RlcuS7peaUr+aMgVRleHREZWNvZGVyXHJcbiAgICAgICAqIG5wbSBpbnN0YWxsIGZhc3Rlc3RzbWFsbGVzdHRleHRlbmNvZGVyZGVjb2RlclxyXG4gICAgICAgKiBwb2x5ZmlsbC50cyBpbmNsdWRlc1xyXG4gICAgICAgKiBgYGBcclxuICAgICAgICogLy8gcG9seWZpbGwgZm9yIFRleHREZWNvZGVyIG9uIElFIDExXHJcbiAgICAgICAqIGltcG9ydCAnZmFzdGVzdHNtYWxsZXN0dGV4dGVuY29kZXJkZWNvZGVyJztcclxuICAgICAgICogYGBgXHJcbiAgICAgICAqL1xyXG4gICAgICByZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZS5hcHBseShudWxsLCBuZXcgVWludDhBcnJheShhcnJheUJ1ZmZlcikpO1xyXG4gICAgfVxyXG4gIH1cclxufVxyXG5cclxuQERpcmVjdGl2ZSh7XHJcbiAgc2VsZWN0b3I6ICdbZFNpbXVsYXRlQVRhZ10nXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBTaW11bGF0ZUFUYWdEaXJlY3RpdmUge1xyXG4gICAgQElucHV0KCkgaHJlZjogc3RyaW5nO1xyXG4gICAgQElucHV0KCkgdGFyZ2V0OiAnX2JsYW5rJyB8ICdfc2VsZicgfCAnX3BhcmVudCcgfCAnX3RvcCcgfCBzdHJpbmcgICA9ICdfYmxhbmsnO1xyXG4gICAgY29uc3RydWN0b3IoKSB7fVxyXG4gICAgQEhvc3RMaXN0ZW5lcignY2xpY2snKSBvbkNsaWNrKCkge1xyXG4gICAgICAgIEhlbHBlclV0aWxzLmp1bXBPdXRlclVybCh0aGlzLmhyZWYsIHRoaXMudGFyZ2V0KTtcclxuICAgIH1cclxufVxyXG5cclxuXHJcblxyXG4iXX0=