UNPKG

@ngx-resource/core

Version:
271 lines 35.7 kB
import { ResourceQueryMappingMethod, ResourceRequestBodyType } from './Declarations'; export class ResourceHelper { static isRunningInBrowser() { if (this.isBrowser !== null) { return this.isBrowser; } try { this.isBrowser = !!window; } catch (e) { this.isBrowser = false; } return this.isBrowser; } static getRealTypeOf(data) { if (!data) { return ResourceRequestBodyType.NONE; } if (this.isRunningInBrowser()) { if (FormData && data instanceof FormData) { return ResourceRequestBodyType.FORM_DATA; } if (Blob && data instanceof Blob) { return ResourceRequestBodyType.BLOB; } } if (data instanceof ArrayBuffer) { return ResourceRequestBodyType.ARRAY_BUFFER; } if (['string', 'number'].indexOf(typeof data) > -1) { return ResourceRequestBodyType.TEXT; } return ResourceRequestBodyType.JSON; } static defaults(dst, src) { if (!dst) { dst = {}; } Object.keys(src) .forEach((key) => { if (dst[key] === undefined) { dst[key] = src[key]; } }); return dst; } static isNullOrUndefined(value) { return value === null || value === undefined; } static cleanData(obj) { if (Array.isArray(obj)) { return this.cleanDataArray(obj); } else { return this.cleanDataObject(obj); } } static cleanDataArray(obj) { obj = obj.filter(value => typeof value !== 'function'); return obj; } static cleanDataObject(obj) { const cleanedObj = {}; for (const propName in obj) { if (typeof obj[propName] !== 'function' && this.cleanDataFields.indexOf(propName) === -1) { cleanedObj[propName] = obj[propName]; } } return cleanedObj; } static defineReturnDataPropertiesResolvedAbort(returnData) { Object.defineProperty(returnData, '$resolved', { enumerable: false, configurable: true, writable: true, value: false }); Object.defineProperty(returnData, '$abort', { enumerable: false, configurable: true, writable: true, value: () => { // does nothing for now } }); } static defineReturnDataPropertiesPromise(returnData, value) { Object.defineProperty(returnData, '$promise', { enumerable: false, configurable: true, writable: true, value }); } static getRequestOptionsOrThrow(options) { // tslint:disable-next-line: prefer-immediate-return const value = this.getResourceActionInnerOrThrow(options, 'requestOptions'); return value; } // tslint:disable-next-line: no-identical-functions static getResolvedOptionsOrThrow(options) { // tslint:disable-next-line: prefer-immediate-return const value = this.getResourceActionInnerOrThrow(options, 'resolvedOptions'); return value; } // tslint:disable-next-line: no-identical-functions static getActionAttributesOrThrow(options) { // tslint:disable-next-line: prefer-immediate-return const value = this.getResourceActionInnerOrThrow(options, 'actionAttributes'); return value; } // tslint:disable-next-line: no-identical-functions static getActionOptionsOrThrow(options) { // tslint:disable-next-line: prefer-immediate-return const value = this.getResourceActionInnerOrThrow(options, 'actionOptions'); return value; } static setRequestOptionsUrlParams(requestOptions, resolvedOptions, actionAttributes, usedInPath) { if (!requestOptions.url) { throw new Error('setRequestOptionsUrlParams options.requestOptions.url missing'); } const params = this.defaults(actionAttributes.params, resolvedOptions.params); const pathParams = requestOptions.url.match(/{([^}]*)}/g) || []; for (const pathParam of pathParams) { let pathKey = pathParam.substr(1, pathParam.length - 2); const isMandatory = pathKey[0] === '!'; if (isMandatory) { pathKey = pathKey.substr(1); } const onlyPathParam = pathKey[0] === ':'; if (onlyPathParam) { pathKey = pathKey.substr(1); } if (actionAttributes.query && actionAttributes.query === actionAttributes.params) { usedInPath[pathKey] = true; } const value = params[pathKey]; if (onlyPathParam) { delete params[pathKey]; } // Replacing in the url requestOptions.url = this.setRequestOptionsUrlParamsNewUrl(value, isMandatory, pathParam, requestOptions); } } static setRequestOptionsUrlParamsNewUrl(value, isMandatory, pathParam, requestOptions) { if (!requestOptions.url) { throw new Error('setRequestOptionsUrlParamsNewUrl requestOptions.url missing'); } if (this.isNullOrUndefined(value)) { if (isMandatory) { const consoleMsg = `Mandatory ${pathParam} path parameter is missing`; console.warn(consoleMsg); throw new Error(consoleMsg); } return requestOptions.url.substr(0, requestOptions.url.indexOf(pathParam)); } return requestOptions.url.replace(pathParam, value); } static createRequestOptionsFormDataBody(body, actionOptions) { const newBody = new FormData(); Object.keys(body).forEach((key) => { const value = body[key]; if (body.hasOwnProperty(key) && typeof value !== 'function') { const isArrayOfFiles = value instanceof Array && value.reduce((acc, elem) => acc && elem instanceof File, true); if (isArrayOfFiles) { value.forEach((f, index) => { newBody.append(`${key}[${index}]`, f, f.name); }); } else if (value instanceof File) { newBody.append(key, value, value.name); } else if (!actionOptions.rootNode) { newBody.append(key, value); } } }); if (actionOptions.rootNode) { newBody.append(actionOptions.rootNode, JSON.stringify(body)); } return newBody; } static appendQueryParams(query, key, value, queryMappingMethod) { if (value instanceof Date) { query[key] = value.toISOString(); return; } if (typeof value === 'object') { switch (queryMappingMethod) { case ResourceQueryMappingMethod.Plain: this.appendQueryParamsMappingMethodPlain(query, key, value); return; case ResourceQueryMappingMethod.Bracket: /// Convert object and arrays to query params this.appendQueryParamsMappingMethodBracket(query, key, value, queryMappingMethod); return; case ResourceQueryMappingMethod.JQueryParamsBracket: /// Convert object and arrays to query params according to $.params this.appendQueryParamsMappingMethodJQueryParamsBracket(query, key, value, queryMappingMethod); return; } } query[key] = value; } static appendQueryParamsMappingMethodPlain(query, key, value) { if (Array.isArray(value)) { query[key] = value.join(','); } else { if (value && typeof value === 'object') { /// Convert dates to ISO format string if (value instanceof Date) { value = value.toISOString(); } else { value = JSON.stringify(value); } } query[key] = value; } } static appendQueryParamsMappingMethodBracket(query, key, value, queryMappingMethod) { for (const k in value) { if (value.hasOwnProperty(k)) { this.appendQueryParams(query, `${key}[${k}]`, value[k], queryMappingMethod); } } } static appendQueryParamsMappingMethodJQueryParamsBracket(query, key, value, queryMappingMethod) { for (const k in value) { if (value.hasOwnProperty(k)) { let path = `${key}[${k}]`; if (Array.isArray(value) && typeof value[k] !== 'object') { path = `${key}[]`; } this.appendQueryParams(query, path, value[k], queryMappingMethod); } } } /** * Creates new abort method from subscription */ static createNewAbortMethod(options) { if (options.returnData && options.subscription) { const abort = options.returnData.abort; options.returnData.abort = () => { if (abort) { abort(); } if (options.subscription) { options.subscription.unsubscribe(); options.subscription = null; } }; } } static getResourceActionInnerOrThrow(options, param) { if (options[param]) { return options[param]; } throw new Error('getResourceActionInnerOrThrow options.' + param + ' missing'); } } ResourceHelper.cleanDataFields = [ '$resolved', '$promise', '$abort', '$resource' ]; ResourceHelper.isBrowser = null; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUmVzb3VyY2VIZWxwZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtcmVzb3VyY2UvY29yZS9zcmMvbGliL1Jlc291cmNlSGVscGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFNTCwwQkFBMEIsRUFDMUIsdUJBQXVCLEVBQ3hCLE1BQU0sZ0JBQWdCLENBQUM7QUFFeEIsTUFBTSxPQUFPLGNBQWM7SUFZekIsTUFBTSxDQUFDLGtCQUFrQjtRQUV2QixJQUFJLElBQUksQ0FBQyxTQUFTLEtBQUssSUFBSSxFQUFFO1lBQzNCLE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQztTQUN2QjtRQUVELElBQUk7WUFDRixJQUFJLENBQUMsU0FBUyxHQUFHLENBQUMsQ0FBQyxNQUFNLENBQUM7U0FDM0I7UUFBQyxPQUFPLENBQUMsRUFBRTtZQUNWLElBQUksQ0FBQyxTQUFTLEdBQUcsS0FBSyxDQUFDO1NBQ3hCO1FBRUQsT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDO0lBQ3hCLENBQUM7SUFFRCxNQUFNLENBQUMsYUFBYSxDQUFDLElBQVM7UUFDNUIsSUFBSSxDQUFDLElBQUksRUFBRTtZQUNULE9BQU8sdUJBQXVCLENBQUMsSUFBSSxDQUFDO1NBQ3JDO1FBRUQsSUFBSSxJQUFJLENBQUMsa0JBQWtCLEVBQUUsRUFBRTtZQUM3QixJQUFJLFFBQVEsSUFBSSxJQUFJLFlBQVksUUFBUSxFQUFFO2dCQUN4QyxPQUFPLHVCQUF1QixDQUFDLFNBQVMsQ0FBQzthQUMxQztZQUVELElBQUksSUFBSSxJQUFJLElBQUksWUFBWSxJQUFJLEVBQUU7Z0JBQ2hDLE9BQU8sdUJBQXVCLENBQUMsSUFBSSxDQUFDO2FBQ3JDO1NBQ0Y7UUFFRCxJQUFJLElBQUksWUFBWSxXQUFXLEVBQUU7WUFDL0IsT0FBTyx1QkFBdUIsQ0FBQyxZQUFZLENBQUM7U0FDN0M7UUFFRCxJQUFJLENBQUMsUUFBUSxFQUFFLFFBQVEs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QUE2QixFQUFFLEtBQWE7UUFDdkYsSUFBSSxPQUFPLENBQUMsS0FBSyxDQUFDLEVBQUU7WUFDbEIsT0FBTyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUM7U0FDdkI7UUFFRCxNQUFNLElBQUksS0FBSyxDQUFDLHdDQUF3QyxHQUFHLEtBQUssR0FBRyxVQUFVLENBQUMsQ0FBQztJQUNqRixDQUFDOztBQTVYTSw4QkFBZSxHQUFhO0lBQ2pDLFdBQVc7SUFDWCxVQUFVO0lBQ1YsUUFBUTtJQUNSLFdBQVc7Q0FDWixDQUFDO0FBR2Esd0JBQVMsR0FBbUIsSUFBSSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgSVJlc291cmNlQWN0aW9uLFxuICBJUmVzb3VyY2VBY3Rpb25BdHRyaWJ1dGVzLFxuICBJUmVzb3VyY2VBY3Rpb25Jbm5lcixcbiAgSVJlc291cmNlUGFyYW1zQmFzZSxcbiAgSVJlc291cmNlUmVxdWVzdCxcbiAgUmVzb3VyY2VRdWVyeU1hcHBpbmdNZXRob2QsXG4gIFJlc291cmNlUmVxdWVzdEJvZHlUeXBlXG59IGZyb20gJy4vRGVjbGFyYXRpb25zJztcblxuZXhwb3J0IGNsYXNzIFJlc291cmNlSGVscGVyIHtcblxuICBzdGF0aWMgY2xlYW5EYXRhRmllbGRzOiBzdHJpbmdbXSA9IFtcbiAgICAnJHJlc29sdmVkJyxcbiAgICAnJHByb21pc2UnLFxuICAgICckYWJvcnQnLFxuICAgICckcmVzb3VyY2UnXG4gIF07XG5cblxuICBwcml2YXRlIHN0YXRpYyBpc0Jyb3dzZXI6IGJvb2xlYW4gfCBudWxsID0gbnVsbDtcblxuICBzdGF0aWMgaXNSdW5uaW5nSW5Ccm93c2VyKCk6IGJvb2xlYW4ge1xuXG4gICAgaWYgKHRoaXMuaXNCcm93c2VyICE9PSBudWxsKSB7XG4gICAgICByZXR1cm4gdGhpcy5pc0Jyb3dzZXI7XG4gICAgfVxuXG4gICAgdHJ5IHtcbiAgICAgIHRoaXMuaXNCcm93c2VyID0gISF3aW5kb3c7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgdGhpcy5pc0Jyb3dzZXIgPSBmYWxzZTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5pc0Jyb3dzZXI7XG4gIH1cblxuICBzdGF0aWMgZ2V0UmVhbFR5cGVPZihkYXRhOiBhbnkpOiBSZXNvdXJjZVJlcXVlc3RCb2R5VHlwZSB7XG4gICAgaWYgKCFkYXRhKSB7XG4gICAgICByZXR1cm4gUmVzb3VyY2VSZXF1ZXN0Qm9keVR5cGUuTk9ORTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5pc1J1bm5pbmdJbkJyb3dzZXIoKSkge1xuICAgICAgaWYgKEZvcm1EYXRhICYmIGRhdGEgaW5zdGFuY2VvZiBGb3JtRGF0YSkge1xuICAgICAgICByZXR1cm4gUmVzb3VyY2VSZXF1ZXN0Qm9keVR5cGUuRk9STV9EQVRBO1xuICAgICAgfVxuXG4gICAgICBpZiAoQmxvYiAmJiBkYXRhIGluc3RhbmNlb2YgQmxvYikge1xuICAgICAgICByZXR1cm4gUmVzb3VyY2VSZXF1ZXN0Qm9keVR5cGUuQkxPQjtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoZGF0YSBpbnN0YW5jZW9mIEFycmF5QnVmZmVyKSB7XG4gICAgICByZXR1cm4gUmVzb3VyY2VSZXF1ZXN0Qm9keVR5cGUuQVJSQVlfQlVGRkVSO1xuICAgIH1cblxuICAgIGlmIChbJ3N0cmluZycsICdudW1iZXInXS5pbmRleE9mKHR5cGVvZiBkYXRhKSA+IC0xKSB7XG4gICAgICByZXR1cm4gUmVzb3VyY2VSZXF1ZXN0Qm9keVR5cGUuVEVYVDtcbiAgICB9XG5cbiAgICByZXR1cm4gUmVzb3VyY2VSZXF1ZXN0Qm9keVR5cGUuSlNPTjtcbiAgfVxuXG4gIHN0YXRpYyBkZWZhdWx0cyhkc3Q6IGFueSwgc3JjOiBhbnkpOiBhbnkge1xuXG4gICAgaWYgKCFkc3QpIHtcbiAgICAgIGRzdCA9IHt9O1xuICAgIH1cblxuICAgIE9iamVjdC5rZXlzKHNyYylcbiAgICAgIC5mb3JFYWNoKChrZXk6IHN0cmluZykgPT4ge1xuICAgICAgICBpZiAoZHN0W2tleV0gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIGRzdFtrZXldID0gc3JjW2tleV07XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgcmV0dXJuIGRzdDtcblxuICB9XG5cbiAgc3RhdGljIGlzTnVsbE9yVW5kZWZpbmVkKHZhbHVlOiBhbnkpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdmFsdWUgPT09IG51bGwgfHwgdmFsdWUgPT09IHVuZGVmaW5lZDtcbiAgfVxuXG4gIHN0YXRpYyBjbGVhbkRhdGEob2JqOiBhbnkpOiBhbnkge1xuXG4gICAgaWYgKEFycmF5LmlzQXJyYXkob2JqKSkge1xuICAgICAgcmV0dXJuIHRoaXMuY2xlYW5EYXRhQXJyYXkob2JqKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHRoaXMuY2xlYW5EYXRhT2JqZWN0KG9iaik7XG4gICAgfVxuXG4gIH1cblxuICBzdGF0aWMgY2xlYW5EYXRhQXJyYXkob2JqOiBhbnlbXSk6IGFueVtdIHtcblxuICAgIG9iaiA9IG9iai5maWx0ZXIodmFsdWUgPT4gdHlwZW9mIHZhbHVlICE9PSAnZnVuY3Rpb24nKTtcblxuICAgIHJldHVybiBvYmo7XG5cbiAgfVxuXG4gIHN0YXRpYyBjbGVhbkRhdGFPYmplY3Qob2JqOiBhbnkpOiBhbnkge1xuICAgIGNvbnN0IGNsZWFuZWRPYmo6IGFueSA9IHt9O1xuXG4gICAgZm9yIChjb25zdCBwcm9wTmFtZSBpbiBvYmopIHtcblxuICAgICAgaWYgKHR5cGVvZiBvYmpbcHJvcE5hbWVdICE9PSAnZnVuY3Rpb24nICYmIHRoaXMuY2xlYW5EYXRhRmllbGRzLmluZGV4T2YocHJvcE5hbWUpID09PSAtMSkge1xuICAgICAgICBjbGVhbmVkT2JqW3Byb3BOYW1lXSA9IG9ialtwcm9wTmFtZV07XG4gICAgICB9XG5cbiAgICB9XG5cbiAgICByZXR1cm4gY2xlYW5lZE9iajtcbiAgfVxuXG4gIHN0YXRpYyBkZWZpbmVSZXR1cm5EYXRhUHJvcGVydGllc1Jlc29sdmVkQWJvcnQocmV0dXJuRGF0YTogYW55KSB7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHJldHVybkRhdGEsICckcmVzb2x2ZWQnLCB7XG4gICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgICAgdmFsdWU6IGZhbHNlXG4gICAgfSk7XG5cbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkocmV0dXJuRGF0YSwgJyRhYm9ydCcsIHtcbiAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgd3JpdGFibGU6IHRydWUsXG4gICAgICB2YWx1ZTogKCkgPT4ge1xuICAgICAgICAvLyBkb2VzIG5vdGhpbmcgZm9yIG5vd1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgc3RhdGljIGRlZmluZVJldHVybkRhdGFQcm9wZXJ0aWVzUHJvbWlzZShyZXR1cm5EYXRhOiBhbnksIHZhbHVlOiBhbnkpIHtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkocmV0dXJuRGF0YSwgJyRwcm9taXNlJywge1xuICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICAgIHZhbHVlXG4gICAgfSk7XG4gIH1cblxuICBzdGF0aWMgZ2V0UmVxdWVzdE9wdGlvbnNPclRocm93KG9wdGlvbnM6IElSZXNvdXJjZUFjdGlvbklubmVyKTogSVJlc291cmNlUmVxdWVzdCB7XG4gICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOiBwcmVmZXItaW1tZWRpYXRlLXJldHVyblxuICAgIGNvbnN0IHZhbHVlID0gdGhpcy5nZXRSZXNvdXJjZUFjdGlvbklubmVyT3JUaHJvdyhvcHRpb25zLCAncmVxdWVzdE9wdGlvbnMnKTtcblxuICAgIHJldHVybiB2YWx1ZTtcbiAgfVxuXG4gIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTogbm8taWRlbnRpY2FsLWZ1bmN0aW9uc1xuICBzdGF0aWMgZ2V0UmVzb2x2ZWRPcHRpb25zT3JUaHJvdyhvcHRpb25zOiBJUmVzb3VyY2VBY3Rpb25Jbm5lcik6IElSZXNvdXJjZVBhcmFtc0Jhc2Uge1xuICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTogcHJlZmVyLWltbWVkaWF0ZS1yZXR1cm5cbiAgICBjb25zdCB2YWx1ZSA9IHRoaXMuZ2V0UmVzb3VyY2VBY3Rpb25Jbm5lck9yVGhyb3cob3B0aW9ucywgJ3Jlc29sdmVkT3B0aW9ucycpO1xuXG4gICAgcmV0dXJuIHZhbHVlO1xuICB9XG5cbiAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOiBuby1pZGVudGljYWwtZnVuY3Rpb25zXG4gIHN0YXRpYyBnZXRBY3Rpb25BdHRyaWJ1dGVzT3JUaHJvdyhvcHRpb25zOiBJUmVzb3VyY2VBY3Rpb25Jbm5lcik6IElSZXNvdXJjZUFjdGlvbkF0dHJpYnV0ZXMge1xuICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTogcHJlZmVyLWltbWVkaWF0ZS1yZXR1cm5cbiAgICBjb25zdCB2YWx1ZSA9IHRoaXMuZ2V0UmVzb3VyY2VBY3Rpb25Jbm5lck9yVGhyb3cob3B0aW9ucywgJ2FjdGlvbkF0dHJpYnV0ZXMnKTtcblxuICAgIHJldHVybiB2YWx1ZTtcbiAgfVxuXG4gIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTogbm8taWRlbnRpY2FsLWZ1bmN0aW9uc1xuICBzdGF0aWMgZ2V0QWN0aW9uT3B0aW9uc09yVGhyb3cob3B0aW9uczogSVJlc291cmNlQWN0aW9uSW5uZXIpOiBJUmVzb3VyY2VBY3Rpb24ge1xuICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTogcHJlZmVyLWltbWVkaWF0ZS1yZXR1cm5cbiAgICBjb25zdCB2YWx1ZSA9IHRoaXMuZ2V0UmVzb3VyY2VBY3Rpb25Jbm5lck9yVGhyb3cob3B0aW9ucywgJ2FjdGlvbk9wdGlvbnMnKTtcblxuICAgIHJldHVybiB2YWx1ZTtcbiAgfVxuXG4gIHN0YXRpYyBzZXRSZXF1ZXN0T3B0aW9uc1VybFBhcmFtcyhyZXF1ZXN0T3B0aW9uczogSVJlc291cmNlUmVxdWVzdCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmVkT3B0aW9uczogSVJlc291cmNlUGFyYW1zQmFzZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjdGlvbkF0dHJpYnV0ZXM6IElSZXNvdXJjZUFjdGlvbkF0dHJpYnV0ZXMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VkSW5QYXRoOiB7IFtrZXk6IHN0cmluZ106IGJvb2xlYW4gfSkge1xuXG4gICAgaWYgKCFyZXF1ZXN0T3B0aW9ucy51cmwpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignc2V0UmVxdWVzdE9wdGlvbnNVcmxQYXJhbXMgb3B0aW9ucy5yZXF1ZXN0T3B0aW9ucy51cmwgbWlzc2luZycpO1xuICAgIH1cblxuICAgIGNvbnN0IHBhcmFtcyA9IHRoaXMuZGVmYXVsdHMoYWN0aW9uQXR0cmlidXRlcy5wYXJhbXMsIHJlc29sdmVkT3B0aW9ucy5wYXJhbXMpO1xuICAgIGNvbnN0IHBhdGhQYXJhbXMgPSByZXF1ZXN0T3B0aW9ucy51cmwubWF0Y2goL3soW159XSopfS9nKSB8fCBbXTtcblxuICAgIGZvciAoY29uc3QgcGF0aFBhcmFtIG9mIHBhdGhQYXJhbXMpIHtcblxuICAgICAgbGV0IHBhdGhLZXkgPSBwYXRoUGFyYW0uc3Vic3RyKDEsIHBhdGhQYXJhbS5sZW5ndGggLSAyKTtcbiAgICAgIGNvbnN0IGlzTWFuZGF0b3J5ID0gcGF0aEtleVswXSA9PT0gJyEnO1xuICAgICAgaWYgKGlzTWFuZGF0b3J5KSB7XG4gICAgICAgIHBhdGhLZXkgPSBwYXRoS2V5LnN1YnN0cigxKTtcbiAgICAgIH1cblxuICAgICAgY29uc3Qgb25seVBhdGhQYXJhbSA9IHBhdGhLZXlbMF0gPT09ICc6JztcbiAgICAgIGlmIChvbmx5UGF0aFBhcmFtKSB7XG4gICAgICAgIHBhdGhLZXkgPSBwYXRoS2V5LnN1YnN0cigxKTtcbiAgICAgIH1cblxuICAgICAgaWYgKGFjdGlvbkF0dHJpYnV0ZXMucXVlcnkgJiYgYWN0aW9uQXR0cmlidXRlcy5xdWVyeSA9PT0gYWN0aW9uQXR0cmlidXRlcy5wYXJhbXMpIHtcbiAgICAgICAgdXNlZEluUGF0aFtwYXRoS2V5XSA9IHRydWU7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHZhbHVlID0gcGFyYW1zW3BhdGhLZXldO1xuXG4gICAgICBpZiAob25seVBhdGhQYXJhbSkge1xuICAgICAgICBkZWxldGUgcGFyYW1zW3BhdGhLZXldO1xuICAgICAgfVxuXG4gICAgICAvLyBSZXBsYWNpbmcgaW4gdGhlIHVybFxuICAgICAgcmVxdWVzdE9wdGlvbnMudXJsID0gdGhpcy5zZXRSZXF1ZXN0T3B0aW9uc1VybFBhcmFtc05ld1VybCh2YWx1ZSwgaXNNYW5kYXRvcnksIHBhdGhQYXJhbSwgcmVxdWVzdE9wdGlvbnMpO1xuXG4gICAgfVxuICB9XG5cbiAgc3RhdGljIHNldFJlcXVlc3RPcHRpb25zVXJsUGFyYW1zTmV3VXJsKHZhbHVlOiBhbnksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc01hbmRhdG9yeTogYm9vbGVhbixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGhQYXJhbTogc3RyaW5nLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdE9wdGlvbnM6IElSZXNvdXJjZVJlcXVlc3QpOiBzdHJpbmcge1xuXG4gICAgaWYgKCFyZXF1ZXN0T3B0aW9ucy51cmwpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignc2V0UmVxdWVzdE9wdGlvbnNVcmxQYXJhbXNOZXdVcmwgcmVxdWVzdE9wdGlvbnMudXJsIG1pc3NpbmcnKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5pc051bGxPclVuZGVmaW5lZCh2YWx1ZSkpIHtcbiAgICAgIGlmIChpc01hbmRhdG9yeSkge1xuICAgICAgICBjb25zdCBjb25zb2xlTXNnID0gYE1hbmRhdG9yeSAke3BhdGhQYXJhbX0gcGF0aCBwYXJhbWV0ZXIgaXMgbWlzc2luZ2A7XG4gICAgICAgIGNvbnNvbGUud2Fybihjb25zb2xlTXNnKTtcblxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoY29uc29sZU1zZyk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiByZXF1ZXN0T3B0aW9ucy51cmwuc3Vic3RyKDAsIHJlcXVlc3RPcHRpb25zLnVybC5pbmRleE9mKHBhdGhQYXJhbSkpO1xuXG4gICAgfVxuXG4gICAgcmV0dXJuIHJlcXVlc3RPcHRpb25zLnVybC5yZXBsYWNlKHBhdGhQYXJhbSwgdmFsdWUpO1xuICB9XG5cbiAgc3RhdGljIGNyZWF0ZVJlcXVlc3RPcHRpb25zRm9ybURhdGFCb2R5KGJvZHk6IGFueSwgYWN0aW9uT3B0aW9uczogSVJlc291cmNlQWN0aW9uKTogRm9ybURhdGEge1xuXG4gICAgY29uc3QgbmV3Qm9keSA9IG5ldyBGb3JtRGF0YSgpO1xuXG4gICAgT2JqZWN0LmtleXMoYm9keSkuZm9yRWFjaCgoa2V5OiBzdHJpbmcpID0+IHtcblxuICAgICAgY29uc3QgdmFsdWUgPSBib2R5W2tleV07XG5cbiAgICAgIGlmIChib2R5Lmhhc093blByb3BlcnR5KGtleSkgJiYgdHlwZW9mIHZhbHVlICE9PSAnZnVuY3Rpb24nKSB7XG5cbiAgICAgICAgY29uc3QgaXNBcnJheU9mRmlsZXMgPSB2YWx1ZSBpbnN0YW5jZW9mIEFycmF5ICYmIHZhbHVlLnJlZHVjZSgoYWNjLCBlbGVtKSA9PiBhY2MgJiYgZWxlbSBpbnN0YW5jZW9mIEZpbGUsIHRydWUpO1xuXG4gICAgICAgIGlmIChpc0FycmF5T2ZGaWxlcykge1xuICAgICAgICAgIHZhbHVlLmZvckVhY2goKGY6IEZpbGUsIGluZGV4OiBudW1iZXIpID0+IHtcbiAgICAgICAgICAgIG5ld0JvZHkuYXBwZW5kKGAke2tleX1bJHtpbmRleH1dYCwgZiwgZi5uYW1lKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSBlbHNlIGlmICh2YWx1ZSBpbnN0YW5jZW9mIEZpbGUpIHtcbiAgICAgICAgICBuZXdCb2R5LmFwcGVuZChrZXksIHZhbHVlLCB2YWx1ZS5uYW1lKTtcbiAgICAgICAgfSBlbHNlIGlmICghYWN0aW9uT3B0aW9ucy5yb290Tm9kZSkge1xuICAgICAgICAgIG5ld0JvZHkuYXBwZW5kKGtleSwgdmFsdWUpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICB9KTtcblxuICAgIGlmIChhY3Rpb25PcHRpb25zLnJvb3ROb2RlKSB7XG4gICAgICBuZXdCb2R5LmFwcGVuZChhY3Rpb25PcHRpb25zLnJvb3ROb2RlLCBKU09OLnN0cmluZ2lmeShib2R5KSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIG5ld0JvZHk7XG5cbiAgfVxuXG4gIHN0YXRpYyBhcHBlbmRRdWVyeVBhcmFtcyhxdWVyeTogeyBbcHJvcDogc3RyaW5nXTogc3RyaW5nIHwgYW55W10gfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleTogc3RyaW5nLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IGFueSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1ZXJ5TWFwcGluZ01ldGhvZD86IFJlc291cmNlUXVlcnlNYXBwaW5nTWV0aG9kKTogdm9pZCB7XG5cbiAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBEYXRlKSB7XG4gICAgICBxdWVyeVtrZXldID0gdmFsdWUudG9JU09TdHJpbmcoKTtcblxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnKSB7XG5cbiAgICAgIHN3aXRjaCAocXVlcnlNYXBwaW5nTWV0aG9kKSB7XG5cbiAgICAgICAgY2FzZSBSZXNvdXJjZVF1ZXJ5TWFwcGluZ01ldGhvZC5QbGFpbjpcbiAgICAgICAgICB0aGlzLmFwcGVuZFF1ZXJ5UGFyYW1zTWFwcGluZ01ldGhvZFBsYWluKHF1ZXJ5LCBrZXksIHZhbHVlKTtcblxuICAgICAgICAgIHJldHVybjtcblxuICAgICAgICBjYXNlIFJlc291cmNlUXVlcnlNYXBwaW5nTWV0aG9kLkJyYWNrZXQ6XG4gICAgICAgICAgLy8vIENvbnZlcnQgb2JqZWN0IGFuZCBhcnJheXMgdG8gcXVlcnkgcGFyYW1zXG4gICAgICAgICAgdGhpcy5hcHBlbmRRdWVyeVBhcmFtc01hcHBpbmdNZXRob2RCcmFja2V0KHF1ZXJ5LCBrZXksIHZhbHVlLCBxdWVyeU1hcHBpbmdNZXRob2QpO1xuXG4gICAgICAgICAgcmV0dXJuO1xuXG4gICAgICAgIGNhc2UgUmVzb3VyY2VRdWVyeU1hcHBpbmdNZXRob2QuSlF1ZXJ5UGFyYW1zQnJhY2tldDpcbiAgICAgICAgICAvLy8gQ29udmVydCBvYmplY3QgYW5kIGFycmF5cyB0byBxdWVyeSBwYXJhbXMgYWNjb3JkaW5nIHRvICQucGFyYW1zXG4gICAgICAgICAgdGhpcy5hcHBlbmRRdWVyeVBhcmFtc01hcHBpbmdNZXRob2RKUXVlcnlQYXJhbXNCcmFja2V0KHF1ZXJ5LCBrZXksIHZhbHVlLCBxdWVyeU1hcHBpbmdNZXRob2QpO1xuXG4gICAgICAgICAgcmV0dXJuO1xuXG4gICAgICB9XG5cbiAgICB9XG5cbiAgICBxdWVyeVtrZXldID0gdmFsdWU7XG5cbiAgfVxuXG4gIHN0YXRpYyBhcHBlbmRRdWVyeVBhcmFtc01hcHBpbmdNZXRob2RQbGFpbihxdWVyeTogeyBbcHJvcDogc3RyaW5nXTogYW55IH0sIGtleTogc3RyaW5nLCB2YWx1ZTogYW55KSB7XG5cbiAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgIHF1ZXJ5W2tleV0gPSB2YWx1ZS5qb2luKCcsJyk7XG4gICAgfSBlbHNlIHtcblxuICAgICAgaWYgKHZhbHVlICYmIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgLy8vIENvbnZlcnQgZGF0ZXMgdG8gSVNPIGZvcm1hdCBzdHJpbmdcbiAgICAgICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgRGF0ZSkge1xuICAgICAgICAgIHZhbHVlID0gdmFsdWUudG9JU09TdHJpbmcoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB2YWx1ZSA9IEpTT04uc3RyaW5naWZ5KHZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBxdWVyeVtrZXldID0gdmFsdWU7XG4gICAgfVxuICB9XG5cbiAgc3RhdGljIGFwcGVuZFF1ZXJ5UGFyYW1zTWFwcGluZ01ldGhvZEJyYWNrZXQocXVlcnk6IHsgW3Byb3A6IHN0cmluZ106IGFueSB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXk6IHN0cmluZyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IGFueSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVlcnlNYXBwaW5nTWV0aG9kOiBSZXNvdXJjZVF1ZXJ5TWFwcGluZ01ldGhvZCkge1xuXG4gICAgZm9yIChjb25zdCBrIGluIHZhbHVlKSB7XG4gICAgICBpZiAodmFsdWUuaGFzT3duUHJvcGVydHkoaykpIHtcbiAgICAgICAgdGhpcy5hcHBlbmRRdWVyeVBhcmFtcyhxdWVyeSwgYCR7a2V5fVske2t9XWAsIHZhbHVlW2tdLCBxdWVyeU1hcHBpbmdNZXRob2QpO1xuICAgICAgfVxuICAgIH1cblxuICB9XG5cbiAgc3RhdGljIGFwcGVuZFF1ZXJ5UGFyYW1zTWFwcGluZ01ldGhvZEpRdWVyeVBhcmFtc0JyYWNrZXQocXVlcnk6IHsgW3Byb3A6IHN0cmluZ106IGFueSB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXk6IHN0cmluZyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IGFueSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVlcnlNYXBwaW5nTWV0aG9kOiBSZXNvdXJjZVF1ZXJ5TWFwcGluZ01ldGhvZCkge1xuXG4gICAgZm9yIChjb25zdCBrIGluIHZhbHVlKSB7XG4gICAgICBpZiAodmFsdWUuaGFzT3duUHJvcGVydHkoaykpIHtcbiAgICAgICAgbGV0IHBhdGggPSBgJHtrZXl9WyR7a31dYDtcblxuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkgJiYgdHlwZW9mIHZhbHVlW2tdICE9PSAnb2JqZWN0Jykge1xuICAgICAgICAgIHBhdGggPSBgJHtrZXl9W11gO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuYXBwZW5kUXVlcnlQYXJhbXMocXVlcnksIHBhdGgsIHZhbHVlW2tdLCBxdWVyeU1hcHBpbmdNZXRob2QpO1xuICAgICAgfVxuICAgIH1cblxuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgbmV3IGFib3J0IG1ldGhvZCBmcm9tIHN1YnNjcmlwdGlvblxuICAgKi9cbiAgc3RhdGljIGNyZWF0ZU5ld0Fib3J0TWV0aG9kKG9wdGlvbnM6IElSZXNvdXJjZUFjdGlvbklubmVyKSB7XG4gICAgaWYgKG9wdGlvbnMucmV0dXJuRGF0YSAmJiBvcHRpb25zLnN1YnNjcmlwdGlvbikge1xuXG4gICAgICBjb25zdCBhYm9ydCA9IG9wdGlvbnMucmV0dXJuRGF0YS5hYm9ydDtcblxuICAgICAgb3B0aW9ucy5yZXR1cm5EYXRhLmFib3J0ID0gKCkgPT4ge1xuXG4gICAgICAgIGlmIChhYm9ydCkge1xuICAgICAgICAgIGFib3J0KCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAob3B0aW9ucy5zdWJzY3JpcHRpb24pIHtcbiAgICAgICAgICBvcHRpb25zLnN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xuICAgICAgICAgIG9wdGlvbnMuc3Vic2NyaXB0aW9uID0gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICB9O1xuICAgIH1cbiAgfVxuXG5cbiAgcHJpdmF0ZSBzdGF0aWMgZ2V0UmVzb3VyY2VBY3Rpb25Jbm5lck9yVGhyb3cob3B0aW9uczogSVJlc291cmNlQWN0aW9uSW5uZXIsIHBhcmFtOiBzdHJpbmcpOiBhbnkge1xuICAgIGlmIChvcHRpb25zW3BhcmFtXSkge1xuICAgICAgcmV0dXJuIG9wdGlvbnNbcGFyYW1dO1xuICAgIH1cblxuICAgIHRocm93IG5ldyBFcnJvcignZ2V0UmVzb3VyY2VBY3Rpb25Jbm5lck9yVGhyb3cgb3B0aW9ucy4nICsgcGFyYW0gKyAnIG1pc3NpbmcnKTtcbiAgfVxuXG59XG4iXX0=