UNPKG

@linid-dm/directory-manager-client-core

Version:

Core package by providing a set of angular components for the Directory Manager app.

153 lines 23.7 kB
/** * Copyright (C) 2020-2024 Linagora * * This program is free software: you can redistribute it and/or modify it under * the terms of the GNU Affero General Public License as published by the Free * Software Foundation, either version 3 of the License, or (at your option) any * later version, provided you comply with the Additional Terms applicable for * LinID Directory Manager software by LINAGORA pursuant to Section 7 of the GNU * Affero General Public License, subsections (b), (c), and (e), pursuant to * which these Appropriate Legal Notices must notably (i) retain the display of * the "LinID™" trademark/logo at the top of the interface window, the display * of the “You are using the Open Source and free version of LinID™, powered by * Linagora © 2009–2013. Contribute to LinID R&D by subscribing to an Enterprise * offer!” infobox and in the e-mails sent with the Program, notice appended to * any type of outbound messages (e.g. e-mail and meeting requests) as well as * in the LinID Directory Manager user interface, (ii) retain all hypertext * links between LinID Directory Manager and https://linid.org/, as well as * between LINAGORA and LINAGORA.com, and (iii) refrain from infringing LINAGORA * intellectual property rights over its trademarks and commercial brands. Other * Additional Terms apply, see <http://www.linagora.com/licenses/> for more * details. * * This program is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS * FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more * details. * * You should have received a copy of the GNU Affero General Public License and * its applicable Additional Terms for LinID Directory Manager along with this * program. If not, see <http://www.gnu.org/licenses/> for the GNU Affero * General Public License version 3 and <http://www.linagora.com/licenses/> for * the Additional Terms applicable to the LinID Directory Manager software. */ import { EResourceComponent, } from '../interfaces/configs.interface'; import { EComponentName, EUserAction, } from '../interfaces/data.interface'; import { EUpdateOperations } from '../interfaces/ui.interface'; import { getSearchRequestScimBody } from './search.helper'; export function getRouterLinkValue(endpoint, label, parentEndpoint = null, parentLabel = null) { let link = '/home/'; if (!!parentEndpoint) { link = link.concat(parentEndpoint, '/', cleanLabel(parentLabel, false), '/'); } link = link.concat(endpoint, '/', cleanLabel(label, parentEndpoint != null)); return link; } function cleanLabel(label, isChildResourceType) { let cleanedLabel = label .toLocaleLowerCase() .replace(/\s\/\s/g, '/') .trim(); return isChildResourceType ? encodeURIComponent(cleanedLabel) : cleanedLabel; } export function getResponseAttributesIds(resourceTypeConfig = null, resourceTypeId = null, fieldConfig = null) { if (resourceTypeConfig !== null) { if (resourceTypeConfig.component === EResourceComponent.ARRAY) { return resourceTypeConfig.props.columns.map((column) => column.id); } else if (resourceTypeConfig.component === EResourceComponent.TREE) { return resourceTypeConfig.attributes.reduce((acc, currAttribute) => currAttribute.props.isTreeNodeName ? [...acc, currAttribute.modelRef] : acc, []); } } else if (fieldConfig !== null) { if (fieldConfig.value.field.componentName === EComponentName.array) { return fieldConfig.value.field.props.columns.map((column) => column.id); } else { let attributesIds = []; if (!!fieldConfig.value.field.nestedComponent) { const resourceTypeOptions = fieldConfig.value.field.nestedComponent.props.options[resourceTypeId]; attributesIds = [ ...new Set([ resourceTypeOptions.valuesField, ...resourceTypeOptions.optionsField, ]), ]; } return attributesIds; } } } export function getClickableCellsEndpoints(resourcesTypes, configsIds, selectedResourceTypeConfig) { const byId = selectedResourceTypeConfig.component === EResourceComponent.ARRAY ? selectedResourceTypeConfig?.props?.columns.reduce((acc, column) => column.isBackendLinkObject && resourcesTypes.allIds.includes(column.type) && configsIds.includes(column.type) ? { ...acc, [column.id]: resourcesTypes.byId[column.type].endpoint, } : acc, {}) : {}; return { byId, allIds: Object.keys(byId), }; } export function toScimPropertiesPatch(path, ids, operation) { const operations = ids.map((id, index) => Object.assign({}, { op: operation, path: path[index], }, operation !== EUpdateOperations.REMOVE ? { value: id, } : {})); return { schemas: ['urn:ietf:params:scim:api:messages:2.0:PatchOp'], Operations: operations, }; } export function getRequestsDetails(selectedResourceTypeId, configs, resourcesTypes, lastResourceTypeId) { const requestDetail = [ { endpoint: resourcesTypes.byId[selectedResourceTypeId].endpoint, resourceTypeId: selectedResourceTypeId, }, ]; const childId = configs.allIds.find((resourceTypeId) => configs.byId[resourceTypeId].props?.parent === selectedResourceTypeId); if (selectedResourceTypeId !== lastResourceTypeId && !!childId) { requestDetail.push(...getRequestsDetails(childId, configs, resourcesTypes)); } return requestDetail; } export function getUserActionOnResourceRequest(resourceComponent) { let userAction; switch (resourceComponent) { case EResourceComponent.ARRAY: userAction = EUserAction.ARRAY_GET; break; case EResourceComponent.TREE: userAction = EUserAction.TREE_GET; break; case EResourceComponent.LIST: userAction = EUserAction.LIST_GET; break; default: break; } return userAction; } export function resourceRequest(filterScim, requestDetail, responseAttributesIds, dataService) { if (!!filterScim) { return dataService.search(requestDetail.endpoint, filterScim, true, getSearchRequestScimBody(responseAttributesIds)); } else { return dataService.getDataList(requestDetail.endpoint, { attributes: responseAttributesIds, }); } } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVzb3VyY2VzLmhlbHBlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL3BhY2thZ2VzL2xpYnMvY2xpZW50LWNvcmUvc3JjL2xpYi9zaGFyZWQvaGVscGVycy9yZXNvdXJjZXMuaGVscGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQWdDRztBQUlILE9BQU8sRUFDTCxrQkFBa0IsR0FJbkIsTUFBTSxpQ0FBaUMsQ0FBQztBQUN6QyxPQUFPLEVBQ0wsY0FBYyxFQUNkLFdBQVcsR0FHWixNQUFNLDhCQUE4QixDQUFDO0FBTXRDLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBRy9ELE9BQU8sRUFBRSx3QkFBd0IsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBRTNELE1BQU0sVUFBVSxrQkFBa0IsQ0FDaEMsUUFBZ0IsRUFDaEIsS0FBYSxFQUNiLGlCQUF5QixJQUFJLEVBQzdCLGNBQXNCLElBQUk7SUFFMUIsSUFBSSxJQUFJLEdBQUcsUUFBUSxDQUFDO0lBQ3BCLElBQUksQ0FBQyxDQUFDLGNBQWMsRUFBRSxDQUFDO1FBQ3JCLElBQUksR0FBRyxJQUFJLENBQUMsTUFBTSxDQUNoQixjQUFjLEVBQ2QsR0FBRyxFQUNILFVBQVUsQ0FBQyxXQUFXLEVBQUUsS0FBSyxDQUFDLEVBQzlCLEdBQUcsQ0FDSixDQUFDO0lBQ0osQ0FBQztJQUNELElBQUksR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsRUFBRSxHQUFHLEVBQUUsVUFBVSxDQUFDLEtBQUssRUFBRSxjQUFjLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQztJQUM3RSxPQUFPLElBQUksQ0FBQztBQUNkLENBQUM7QUFFRCxTQUFTLFVBQVUsQ0FBQyxLQUFhLEVBQUUsbUJBQTRCO0lBQzdELElBQUksWUFBWSxHQUFHLEtBQUs7U0FDckIsaUJBQWlCLEVBQUU7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QUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIENvcHlyaWdodCAoQykgMjAyMC0yMDI0IExpbmFnb3JhXG4gKlxuICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU6IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXJcbiAqIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEFmZmVybyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZVxuICogU29mdHdhcmUgRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnlcbiAqIGxhdGVyIHZlcnNpb24sIHByb3ZpZGVkIHlvdSBjb21wbHkgd2l0aCB0aGUgQWRkaXRpb25hbCBUZXJtcyBhcHBsaWNhYmxlIGZvclxuICogTGluSUQgRGlyZWN0b3J5IE1hbmFnZXIgc29mdHdhcmUgYnkgTElOQUdPUkEgcHVyc3VhbnQgdG8gU2VjdGlvbiA3IG9mIHRoZSBHTlVcbiAqIEFmZmVybyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLCBzdWJzZWN0aW9ucyAoYiksIChjKSwgYW5kIChlKSwgcHVyc3VhbnQgdG9cbiAqIHdoaWNoIHRoZXNlIEFwcHJvcHJpYXRlIExlZ2FsIE5vdGljZXMgbXVzdCBub3RhYmx5IChpKSByZXRhaW4gdGhlIGRpc3BsYXkgb2ZcbiAqIHRoZSBcIkxpbklE4oSiXCIgdHJhZGVtYXJrL2xvZ28gYXQgdGhlIHRvcCBvZiB0aGUgaW50ZXJmYWNlIHdpbmRvdywgdGhlIGRpc3BsYXlcbiAqIG9mIHRoZSDigJxZb3UgYXJlIHVzaW5nIHRoZSBPcGVuIFNvdXJjZSBhbmQgZnJlZSB2ZXJzaW9uIG9mIExpbklE4oSiLCBwb3dlcmVkIGJ5XG4gKiBMaW5hZ29yYSDCqSAyMDA54oCTMjAxMy4gQ29udHJpYnV0ZSB0byBMaW5JRCBSJkQgYnkgc3Vic2NyaWJpbmcgdG8gYW4gRW50ZXJwcmlzZVxuICogb2ZmZXIh4oCdIGluZm9ib3ggYW5kIGluIHRoZSBlLW1haWxzIHNlbnQgd2l0aCB0aGUgUHJvZ3JhbSwgbm90aWNlIGFwcGVuZGVkIHRvXG4gKiBhbnkgdHlwZSBvZiBvdXRib3VuZCBtZXNzYWdlcyAoZS5nLiBlLW1haWwgYW5kIG1lZXRpbmcgcmVxdWVzdHMpIGFzIHdlbGwgYXNcbiAqIGluIHRoZSBMaW5JRCBEaXJlY3RvcnkgTWFuYWdlciB1c2VyIGludGVyZmFjZSwgKGlpKSByZXRhaW4gYWxsIGh5cGVydGV4dFxuICogbGlua3MgYmV0d2VlbiBMaW5JRCBEaXJlY3RvcnkgTWFuYWdlciBhbmQgaHR0cHM6Ly9saW5pZC5vcmcvLCBhcyB3ZWxsIGFzXG4gKiBiZXR3ZWVuIExJTkFHT1JBIGFuZCBMSU5BR09SQS5jb20sIGFuZCAoaWlpKSByZWZyYWluIGZyb20gaW5mcmluZ2luZyBMSU5BR09SQVxuICogaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBvdmVyIGl0cyB0cmFkZW1hcmtzIGFuZCBjb21tZXJjaWFsIGJyYW5kcy4gT3RoZXJcbiAqIEFkZGl0aW9uYWwgVGVybXMgYXBwbHksIHNlZSA8aHR0cDovL3d3dy5saW5hZ29yYS5jb20vbGljZW5zZXMvPiBmb3IgbW9yZVxuICogZGV0YWlscy5cbiAqXG4gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVRcbiAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTXG4gKiBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VIEFmZmVybyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlXG4gKiBkZXRhaWxzLlxuICpcbiAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBBZmZlcm8gR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmRcbiAqIGl0cyBhcHBsaWNhYmxlIEFkZGl0aW9uYWwgVGVybXMgZm9yIExpbklEIERpcmVjdG9yeSBNYW5hZ2VyIGFsb25nIHdpdGggdGhpc1xuICogcHJvZ3JhbS4gSWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+IGZvciB0aGUgR05VIEFmZmVyb1xuICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDMgYW5kIDxodHRwOi8vd3d3LmxpbmFnb3JhLmNvbS9saWNlbnNlcy8+IGZvclxuICogdGhlIEFkZGl0aW9uYWwgVGVybXMgYXBwbGljYWJsZSB0byB0aGUgTGluSUQgRGlyZWN0b3J5IE1hbmFnZXIgc29mdHdhcmUuXG4gKi9cblxuaW1wb3J0IHsgSHR0cEVycm9yUmVzcG9uc2UsIEh0dHBSZXNwb25zZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbi9odHRwJztcbmltcG9ydCB7IE9ic2VydmFibGUgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7XG4gIEVSZXNvdXJjZUNvbXBvbmVudCxcbiAgSUF0dHJpYnV0ZSxcbiAgSUNvbHVtbixcbiAgSUNvbmZpZyxcbn0gZnJvbSAnLi4vaW50ZXJmYWNlcy9jb25maWdzLmludGVyZmFjZSc7XG5pbXBvcnQge1xuICBFQ29tcG9uZW50TmFtZSxcbiAgRVVzZXJBY3Rpb24sXG4gIElEYXRhLFxuICBJRm9ybURhdGEsXG59IGZyb20gJy4uL2ludGVyZmFjZXMvZGF0YS5pbnRlcmZhY2UnO1xuaW1wb3J0IHtcbiAgSUNsaWNrYWJsZUNlbGxzRW5kcG9pbnRzLFxuICBJUmVzb3VyY2VUeXBlLFxuICBJUmVzb3VyY2VUeXBlUmVxdWVzdERldGFpbCxcbn0gZnJvbSAnLi4vaW50ZXJmYWNlcy9yZXNvdXJjZXMtdHlwZXMuaW50ZXJmYWNlJztcbmltcG9ydCB7IEVVcGRhdGVPcGVyYXRpb25zIH0gZnJvbSAnLi4vaW50ZXJmYWNlcy91aS5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgRGF0YVNlcnZpY2UgfSBmcm9tICcuLi9zZXJ2aWNlcy9kYXRhLnNlcnZpY2UnO1xuaW1wb3J0IHsgSnNUYWJsZSB9IGZyb20gJy4vanN0YWJsZS5oZWxwZXInO1xuaW1wb3J0IHsgZ2V0U2VhcmNoUmVxdWVzdFNjaW1Cb2R5IH0gZnJvbSAnLi9zZWFyY2guaGVscGVyJztcblxuZXhwb3J0IGZ1bmN0aW9uIGdldFJvdXRlckxpbmtWYWx1ZShcbiAgZW5kcG9pbnQ6IHN0cmluZyxcbiAgbGFiZWw6IHN0cmluZyxcbiAgcGFyZW50RW5kcG9pbnQ6IHN0cmluZyA9IG51bGwsXG4gIHBhcmVudExhYmVsOiBzdHJpbmcgPSBudWxsXG4pOiBzdHJpbmcge1xuICBsZXQgbGluayA9ICcvaG9tZS8nO1xuICBpZiAoISFwYXJlbnRFbmRwb2ludCkge1xuICAgIGxpbmsgPSBsaW5rLmNvbmNhdChcbiAgICAgIHBhcmVudEVuZHBvaW50LFxuICAgICAgJy8nLFxuICAgICAgY2xlYW5MYWJlbChwYXJlbnRMYWJlbCwgZmFsc2UpLFxuICAgICAgJy8nXG4gICAgKTtcbiAgfVxuICBsaW5rID0gbGluay5jb25jYXQoZW5kcG9pbnQsICcvJywgY2xlYW5MYWJlbChsYWJlbCwgcGFyZW50RW5kcG9pbnQgIT0gbnVsbCkpO1xuICByZXR1cm4gbGluaztcbn1cblxuZnVuY3Rpb24gY2xlYW5MYWJlbChsYWJlbDogc3RyaW5nLCBpc0NoaWxkUmVzb3VyY2VUeXBlOiBib29sZWFuKTogc3RyaW5nIHtcbiAgbGV0IGNsZWFuZWRMYWJlbCA9IGxhYmVsXG4gICAgLnRvTG9jYWxlTG93ZXJDYXNlKClcbiAgICAucmVwbGFjZSgvXFxzXFwvXFxzL2csICcvJylcbiAgICAudHJpbSgpO1xuICByZXR1cm4gaXNDaGlsZFJlc291cmNlVHlwZSA/IGVuY29kZVVSSUNvbXBvbmVudChjbGVhbmVkTGFiZWwpIDogY2xlYW5lZExhYmVsO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0UmVzcG9uc2VBdHRyaWJ1dGVzSWRzKFxuICByZXNvdXJjZVR5cGVDb25maWc6IElDb25maWcgPSBudWxsLFxuICByZXNvdXJjZVR5cGVJZDogc3RyaW5nID0gbnVsbCxcbiAgZmllbGRDb25maWc6IElGb3JtRGF0YSB8IElBdHRyaWJ1dGUgPSBudWxsXG4pOiBzdHJpbmdbXSB7XG4gIGlmIChyZXNvdXJjZVR5cGVDb25maWcgIT09IG51bGwpIHtcbiAgICBpZiAocmVzb3VyY2VUeXBlQ29uZmlnLmNvbXBvbmVudCA9PT0gRVJlc291cmNlQ29tcG9uZW50LkFSUkFZKSB7XG4gICAgICByZXR1cm4gcmVzb3VyY2VUeXBlQ29uZmlnLnByb3BzLmNvbHVtbnMubWFwKFxuICAgICAgICAoY29sdW1uOiBJQ29sdW1uKSA9PiBjb2x1bW4uaWRcbiAgICAgICk7XG4gICAgfSBlbHNlIGlmIChyZXNvdXJjZVR5cGVDb25maWcuY29tcG9uZW50ID09PSBFUmVzb3VyY2VDb21wb25lbnQuVFJFRSkge1xuICAgICAgcmV0dXJuIHJlc291cmNlVHlwZUNvbmZpZy5hdHRyaWJ1dGVzLnJlZHVjZShcbiAgICAgICAgKGFjYywgY3VyckF0dHJpYnV0ZSkgPT5cbiAgICAgICAgICBjdXJyQXR0cmlidXRlLnByb3BzLmlzVHJlZU5vZGVOYW1lXG4gICAgICAgICAgICA/IFsuLi5hY2MsIGN1cnJBdHRyaWJ1dGUubW9kZWxSZWZdXG4gICAgICAgICAgICA6IGFjYyxcbiAgICAgICAgW11cbiAgICAgICk7XG4gICAgfVxuICB9IGVsc2UgaWYgKGZpZWxkQ29uZmlnICE9PSBudWxsKSB7XG4gICAgaWYgKGZpZWxkQ29uZmlnLnZhbHVlLmZpZWxkLmNvbXBvbmVudE5hbWUgPT09IEVDb21wb25lbnROYW1lLmFycmF5KSB7XG4gICAgICByZXR1cm4gZmllbGRDb25maWcudmFsdWUuZmllbGQucHJvcHMuY29sdW1ucy5tYXAoXG4gICAgICAgIChjb2x1bW46IElDb2x1bW4pID0+IGNvbHVtbi5pZFxuICAgICAgKTtcbiAgICB9IGVsc2Uge1xuICAgICAgbGV0IGF0dHJpYnV0ZXNJZHM6IHN0cmluZ1tdID0gW107XG4gICAgICBpZiAoISFmaWVsZENvbmZpZy52YWx1ZS5maWVsZC5uZXN0ZWRDb21wb25lbnQpIHtcbiAgICAgICAgY29uc3QgcmVzb3VyY2VUeXBlT3B0aW9uczoge1xuICAgICAgICAgIHZhbHVlc0ZpZWxkOiBzdHJpbmc7XG4gICAgICAgICAgb3B0aW9uc0ZpZWxkOiBzdHJpbmdbXTtcbiAgICAgICAgfSA9XG4gICAgICAgICAgZmllbGRDb25maWcudmFsdWUuZmllbGQubmVzdGVkQ29tcG9uZW50LnByb3BzLm9wdGlvbnNbcmVzb3VyY2VUeXBlSWRdO1xuICAgICAgICBhdHRyaWJ1dGVzSWRzID0gW1xuICAgICAgICAgIC4uLm5ldyBTZXQ8c3RyaW5nPihbXG4gICAgICAgICAgICByZXNvdXJjZVR5cGVPcHRpb25zLnZhbHVlc0ZpZWxkLFxuICAgICAgICAgICAgLi4ucmVzb3VyY2VUeXBlT3B0aW9ucy5vcHRpb25zRmllbGQsXG4gICAgICAgICAgXSksXG4gICAgICAgIF07XG4gICAgICB9XG4gICAgICByZXR1cm4gYXR0cmlidXRlc0lkcztcbiAgICB9XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldENsaWNrYWJsZUNlbGxzRW5kcG9pbnRzKFxuICByZXNvdXJjZXNUeXBlczogSnNUYWJsZTxJUmVzb3VyY2VUeXBlPixcbiAgY29uZmlnc0lkczogc3RyaW5nW10sXG4gIHNlbGVjdGVkUmVzb3VyY2VUeXBlQ29uZmlnOiBJQ29uZmlnXG4pOiBKc1RhYmxlPHN0cmluZz4ge1xuICBjb25zdCBieUlkID1cbiAgICBzZWxlY3RlZFJlc291cmNlVHlwZUNvbmZpZy5jb21wb25lbnQgPT09IEVSZXNvdXJjZUNvbXBvbmVudC5BUlJBWVxuICAgICAgPyBzZWxlY3RlZFJlc291cmNlVHlwZUNvbmZpZz8ucHJvcHM/LmNvbHVtbnMucmVkdWNlKFxuICAgICAgICAgIChhY2MsIGNvbHVtbikgPT5cbiAgICAgICAgICAgIGNvbHVtbi5pc0JhY2tlbmRMaW5rT2JqZWN0ICYmXG4gICAgICAgICAgICByZXNvdXJjZXNUeXBlcy5hbGxJZHMuaW5jbHVkZXMoY29sdW1uLnR5cGUpICYmXG4gICAgICAgICAgICBjb25maWdzSWRzLmluY2x1ZGVzKGNvbHVtbi50eXBlKVxuICAgICAgICAgICAgICA/IHtcbiAgICAgICAgICAgICAgICAgIC4uLmFjYyxcbiAgICAgICAgICAgICAgICAgIFtjb2x1bW4uaWRdOiByZXNvdXJjZXNUeXBlcy5ieUlkW2NvbHVtbi50eXBlXS5lbmRwb2ludCxcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIDogYWNjLFxuICAgICAgICAgIHt9IGFzIElDbGlja2FibGVDZWxsc0VuZHBvaW50c1xuICAgICAgICApXG4gICAgICA6IHt9O1xuICByZXR1cm4ge1xuICAgIGJ5SWQsXG4gICAgYWxsSWRzOiBPYmplY3Qua2V5cyhieUlkKSxcbiAgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHRvU2NpbVByb3BlcnRpZXNQYXRjaChcbiAgcGF0aDogc3RyaW5nW10sXG4gIGlkczogc3RyaW5nW10sXG4gIG9wZXJhdGlvbjogc3RyaW5nXG4pOiBhbnkge1xuICBjb25zdCBvcGVyYXRpb25zOiB7XG4gICAgb3A6IHN0cmluZztcbiAgICBwYXRoOiBzdHJpbmc7XG4gICAgdmFsdWU/OiBzdHJpbmc7XG4gIH1bXSA9IGlkcy5tYXAoKGlkLCBpbmRleCkgPT5cbiAgICBPYmplY3QuYXNzaWduKFxuICAgICAge30sXG4gICAgICB7XG4gICAgICAgIG9wOiBvcGVyYXRpb24sXG4gICAgICAgIHBhdGg6IHBhdGhbaW5kZXhdLFxuICAgICAgfSxcbiAgICAgIG9wZXJhdGlvbiAhPT0gRVVwZGF0ZU9wZXJhdGlvbnMuUkVNT1ZFXG4gICAgICAgID8ge1xuICAgICAgICAgICAgdmFsdWU6IGlkLFxuICAgICAgICAgIH1cbiAgICAgICAgOiB7fVxuICAgIClcbiAgKTtcbiAgcmV0dXJuIHtcbiAgICBzY2hlbWFzOiBbJ3VybjppZXRmOnBhcmFtczpzY2ltOmFwaTptZXNzYWdlczoyLjA6UGF0Y2hPcCddLFxuICAgIE9wZXJhdGlvbnM6IG9wZXJhdGlvbnMsXG4gIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRSZXF1ZXN0c0RldGFpbHMoXG4gIHNlbGVjdGVkUmVzb3VyY2VUeXBlSWQ6IHN0cmluZyxcbiAgY29uZmlnczogSnNUYWJsZTxJQ29uZmlnPixcbiAgcmVzb3VyY2VzVHlwZXM6IEpzVGFibGU8SVJlc291cmNlVHlwZT4sXG4gIGxhc3RSZXNvdXJjZVR5cGVJZD86IHN0cmluZ1xuKTogSVJlc291cmNlVHlwZVJlcXVlc3REZXRhaWxbXSB7XG4gIGNvbnN0IHJlcXVlc3REZXRhaWw6IElSZXNvdXJjZVR5cGVSZXF1ZXN0RGV0YWlsW10gPSBbXG4gICAge1xuICAgICAgZW5kcG9pbnQ6IHJlc291cmNlc1R5cGVzLmJ5SWRbc2VsZWN0ZWRSZXNvdXJjZVR5cGVJZF0uZW5kcG9pbnQsXG4gICAgICByZXNvdXJjZVR5cGVJZDogc2VsZWN0ZWRSZXNvdXJjZVR5cGVJZCxcbiAgICB9LFxuICBdO1xuICBjb25zdCBjaGlsZElkOiBzdHJpbmcgPSBjb25maWdzLmFsbElkcy5maW5kKFxuICAgIChyZXNvdXJjZVR5cGVJZDogc3RyaW5nKSA9PlxuICAgICAgY29uZmlncy5ieUlkW3Jlc291cmNlVHlwZUlkXS5wcm9wcz8ucGFyZW50ID09PSBzZWxlY3RlZFJlc291cmNlVHlwZUlkXG4gICk7XG5cbiAgaWYgKHNlbGVjdGVkUmVzb3VyY2VUeXBlSWQgIT09IGxhc3RSZXNvdXJjZVR5cGVJZCAmJiAhIWNoaWxkSWQpIHtcbiAgICByZXF1ZXN0RGV0YWlsLnB1c2goLi4uZ2V0UmVxdWVzdHNEZXRhaWxzKGNoaWxkSWQsIGNvbmZpZ3MsIHJlc291cmNlc1R5cGVzKSk7XG4gIH1cbiAgcmV0dXJuIHJlcXVlc3REZXRhaWw7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRVc2VyQWN0aW9uT25SZXNvdXJjZVJlcXVlc3QoXG4gIHJlc291cmNlQ29tcG9uZW50OiBFUmVzb3VyY2VDb21wb25lbnRcbik6IEVVc2VyQWN0aW9uIHtcbiAgbGV0IHVzZXJBY3Rpb246IEVVc2VyQWN0aW9uO1xuICBzd2l0Y2ggKHJlc291cmNlQ29tcG9uZW50KSB7XG4gICAgY2FzZSBFUmVzb3VyY2VDb21wb25lbnQuQVJSQVk6XG4gICAgICB1c2VyQWN0aW9uID0gRVVzZXJBY3Rpb24uQVJSQVlfR0VUO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSBFUmVzb3VyY2VDb21wb25lbnQuVFJFRTpcbiAgICAgIHVzZXJBY3Rpb24gPSBFVXNlckFjdGlvbi5UUkVFX0dFVDtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgRVJlc291cmNlQ29tcG9uZW50LkxJU1Q6XG4gICAgICB1c2VyQWN0aW9uID0gRVVzZXJBY3Rpb24uTElTVF9HRVQ7XG4gICAgICBicmVhaztcbiAgICBkZWZhdWx0OlxuICAgICAgYnJlYWs7XG4gIH1cbiAgcmV0dXJuIHVzZXJBY3Rpb247XG59XG5cbmV4cG9ydCBmdW5jdGlvbiByZXNvdXJjZVJlcXVlc3QoXG4gIGZpbHRlclNjaW06IHN0cmluZyxcbiAgcmVxdWVzdERldGFpbDogSVJlc291cmNlVHlwZVJlcXVlc3REZXRhaWwsXG4gIHJlc3BvbnNlQXR0cmlidXRlc0lkczogc3RyaW5nW10sXG4gIGRhdGFTZXJ2aWNlOiBEYXRhU2VydmljZVxuKTogT2JzZXJ2YWJsZTxJRGF0YSB8IEh0dHBSZXNwb25zZTxJRGF0YT4gfCBIdHRwRXJyb3JSZXNwb25zZT4ge1xuICBpZiAoISFmaWx0ZXJTY2ltKSB7XG4gICAgcmV0dXJuIGRhdGFTZXJ2aWNlLnNlYXJjaChcbiAgICAgIHJlcXVlc3REZXRhaWwuZW5kcG9pbnQsXG4gICAgICBmaWx0ZXJTY2ltLFxuICAgICAgdHJ1ZSxcbiAgICAgIGdldFNlYXJjaFJlcXVlc3RTY2ltQm9keShyZXNwb25zZUF0dHJpYnV0ZXNJZHMpXG4gICAgKTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gZGF0YVNlcnZpY2UuZ2V0RGF0YUxpc3QocmVxdWVzdERldGFpbC5lbmRwb2ludCwge1xuICAgICAgYXR0cmlidXRlczogcmVzcG9uc2VBdHRyaWJ1dGVzSWRzLFxuICAgIH0pO1xuICB9XG59XG4iXX0=