@alfresco/adf-content-services
Version:
Alfresco ADF content services
169 lines • 29.7 kB
JavaScript
/*!
* @license
* Copyright © 2005-2025 Hyland Software, Inc. and its affiliates. All rights reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
import { inject, Injectable, Injector, runInInjectionContext } from '@angular/core';
import { AppConfigService, CardViewBoolItemModel, CardViewDateItemModel, CardViewDatetimeItemModel, CardViewFloatItemModel, CardViewIntItemModel, CardViewLongItemModel, CardViewSelectItemModel, CardViewTextItemModel, DecimalNumberPipe, LogService, MultiValuePipe, UserPreferencesService } from '@alfresco/adf-core';
import { of } from 'rxjs';
import * as i0 from "@angular/core";
const D_TEXT = 'd:text';
const D_MLTEXT = 'd:mltext';
const D_DATE = 'd:date';
const D_DATETIME = 'd:datetime';
const D_INT = 'd:int';
const D_LONG = 'd:long';
const D_FLOAT = 'd:float';
const D_DOUBLE = 'd:double';
const D_BOOLEAN = 'd:boolean';
export const RECOGNISED_ECM_TYPES = [D_TEXT, D_MLTEXT, D_DATE, D_DATETIME, D_INT, D_LONG, D_FLOAT, D_DOUBLE, D_BOOLEAN];
export class PropertyGroupTranslatorService {
constructor() {
this.userPreferenceService = inject(UserPreferencesService);
this.appConfig = inject(AppConfigService);
this.logService = inject(LogService);
this.injector = inject(Injector);
this.valueSeparator = this.appConfig.get('content-metadata.multi-value-pipe-separator');
}
translateToCardViewGroups(propertyGroups, propertyValues, definition) {
return propertyGroups.map((propertyGroup) => {
const translatedPropertyGroup = Object.assign({}, propertyGroup);
translatedPropertyGroup.properties = this.translateArray(propertyGroup.properties, propertyValues, definition);
translatedPropertyGroup.editable = translatedPropertyGroup.properties.some((property) => property.editable);
return translatedPropertyGroup;
});
}
translateProperty(property, startValue, allowEditing = false) {
this.checkECMTypeValidity(property.dataType);
const prefix = 'properties.';
const propertyDefinition = {
label: property.title || property.id,
value: startValue ? startValue : property.defaultValue,
key: `${prefix}${property.id}`,
default: property.defaultValue,
editable: property.isProtected ? false : allowEditing,
constraints: property?.constraints
};
return this.transform(propertyDefinition, property.dataType, property.isMultiValued);
}
translateArray(properties, propertyValues, definition) {
return properties.map((property) => this.translate(property, propertyValues, this.getPropertyConstraints(property.name, definition)));
}
translate(property, propertyValues, constraints) {
let propertyValue;
if (propertyValues && !this.isEmpty(propertyValues[property.name])) {
propertyValue = propertyValues[property.name];
}
this.checkECMTypeValidity(property.dataType);
const prefix = 'properties.';
const propertyDefinition = {
label: property.title || property.name,
value: propertyValue,
key: `${prefix}${property.name}`,
default: property.defaultValue,
editable: property.protected ? false : property.editable !== undefined ? property.editable : true,
constraints
};
return this.transform(propertyDefinition, property.dataType, property.multiValued);
}
transform(propertyDefinition, dataType, isMultiValued) {
let cardViewItemProperty;
if (this.isListOfValues(propertyDefinition.constraints)) {
const options = propertyDefinition.constraints[0].parameters.allowedValues.map((value) => ({ key: value, label: value }));
const properties = Object.assign(propertyDefinition, { options$: of(options) });
cardViewItemProperty = new CardViewSelectItemModel(properties);
}
else {
switch (dataType) {
case D_MLTEXT:
cardViewItemProperty = new CardViewTextItemModel(Object.assign(propertyDefinition, {
multiline: true
}));
break;
case D_INT:
cardViewItemProperty = new CardViewIntItemModel(Object.assign(propertyDefinition, {
multivalued: isMultiValued,
pipes: [{ pipe: new MultiValuePipe(), params: [this.valueSeparator] }]
}));
break;
case D_LONG:
cardViewItemProperty = new CardViewLongItemModel(Object.assign(propertyDefinition, {
multivalued: isMultiValued,
pipes: [{ pipe: new MultiValuePipe(), params: [this.valueSeparator] }]
}));
break;
case D_FLOAT:
case D_DOUBLE:
cardViewItemProperty = new CardViewFloatItemModel(Object.assign(propertyDefinition, {
multivalued: isMultiValued,
pipes: [{ pipe: this.getDecimalNumberPipe() }, { pipe: new MultiValuePipe(), params: [this.valueSeparator] }]
}));
break;
case D_DATE:
cardViewItemProperty = new CardViewDateItemModel(Object.assign(propertyDefinition, {
multivalued: isMultiValued,
pipes: [{ pipe: new MultiValuePipe(), params: [this.valueSeparator] }]
}));
break;
case D_DATETIME:
cardViewItemProperty = new CardViewDatetimeItemModel(Object.assign(propertyDefinition, {
multivalued: isMultiValued,
pipes: [{ pipe: new MultiValuePipe(), params: [this.valueSeparator] }]
}));
break;
case D_BOOLEAN:
cardViewItemProperty = new CardViewBoolItemModel(propertyDefinition);
break;
case D_TEXT:
default:
cardViewItemProperty = new CardViewTextItemModel(Object.assign(propertyDefinition, {
multivalued: isMultiValued,
multiline: isMultiValued,
pipes: [{ pipe: new MultiValuePipe(), params: [this.valueSeparator] }]
}));
}
}
return cardViewItemProperty;
}
isListOfValues(constraint) {
return constraint?.[0]?.type === 'LIST';
}
getPropertyConstraints(propertyName, definition) {
return definition?.properties.find((item) => item.id === propertyName)?.constraints ?? [];
}
checkECMTypeValidity(ecmPropertyType) {
if (RECOGNISED_ECM_TYPES.indexOf(ecmPropertyType) === -1) {
this.logService.error(`Unknown type for mapping: ${ecmPropertyType}`);
}
}
isEmpty(value) {
return value === undefined || value === null || value === '';
}
getDecimalNumberPipe() {
let decimalNumberPipe;
runInInjectionContext(this.injector, () => {
decimalNumberPipe = new DecimalNumberPipe(this.userPreferenceService, this.appConfig);
});
return decimalNumberPipe;
}
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.1.3", ngImport: i0, type: PropertyGroupTranslatorService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "17.1.3", ngImport: i0, type: PropertyGroupTranslatorService, providedIn: 'root' }); }
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.1.3", ngImport: i0, type: PropertyGroupTranslatorService, decorators: [{
type: Injectable,
args: [{
providedIn: 'root'
}]
}], ctorParameters: () => [] });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvcGVydHktZ3JvdXBzLXRyYW5zbGF0b3Iuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL2xpYi9jb250ZW50LXNlcnZpY2VzL3NyYy9saWIvY29udGVudC1tZXRhZGF0YS9zZXJ2aWNlcy9wcm9wZXJ0eS1ncm91cHMtdHJhbnNsYXRvci5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILE9BQU8sRUFBRSxNQUFNLEVBQUUsVUFBVSxFQUFFLFFBQVEsRUFBRSxxQkFBcUIsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNwRixPQUFPLEVBQ0gsZ0JBQWdCLEVBQ2hCLHFCQUFxQixFQUNyQixxQkFBcUIsRUFDckIseUJBQXlCLEVBQ3pCLHNCQUFzQixFQUN0QixvQkFBb0IsRUFHcEIscUJBQXFCLEVBQ3JCLHVCQUF1QixFQUN2QixxQkFBcUIsRUFDckIsaUJBQWlCLEVBQ2pCLFVBQVUsRUFDVixjQUFjLEVBQ2Qsc0JBQXNCLEVBQ3pCLE1BQU0sb0JBQW9CLENBQUM7QUFFNUIsT0FBTyxFQUFFLEVBQUUsRUFBRSxNQUFNLE1BQU0sQ0FBQzs7QUFHMUIsTUFBTSxNQUFNLEdBQUcsUUFBUSxDQUFDO0FBQ3hCLE1BQU0sUUFBUSxHQUFHLFVBQVUsQ0FBQztBQUM1QixNQUFNLE1BQU0sR0FBRyxRQUFRLENBQUM7QUFDeEIsTUFBTSxVQUFVLEdBQUcsWUFBWSxDQUFDO0FBQ2hDLE1BQU0sS0FBSyxHQUFHLE9BQU8sQ0FBQztBQUN0QixNQUFNLE1BQU0sR0FBRyxRQUFRLENBQUM7QUFDeEIsTUFBTSxPQUFPLEdBQUcsU0FBUyxDQUFDO0FBQzFCLE1BQU0sUUFBUSxHQUFHLFVBQVUsQ0FBQztBQUM1QixNQUFNLFNBQVMsR0FBRyxXQUFXLENBQUM7QUFFOUIsTUFBTSxDQUFDLE1BQU0sb0JBQW9CLEdBQUcsQ0FBQyxNQUFNLEVBQUUsUUFBUSxFQUFFLE1B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QixjQUYzQixNQUFNOzsyRkFFVCw4QkFBOEI7a0JBSDFDLFVBQVU7bUJBQUM7b0JBQ1IsVUFBVSxFQUFFLE1BQU07aUJBQ3JCIiwic291cmNlc0NvbnRlbnQiOlsiLyohXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IMKpIDIwMDUtMjAyNSBIeWxhbmQgU29mdHdhcmUsIEluYy4gYW5kIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuXG5pbXBvcnQgeyBpbmplY3QsIEluamVjdGFibGUsIEluamVjdG9yLCBydW5JbkluamVjdGlvbkNvbnRleHQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7XG4gICAgQXBwQ29uZmlnU2VydmljZSxcbiAgICBDYXJkVmlld0Jvb2xJdGVtTW9kZWwsXG4gICAgQ2FyZFZpZXdEYXRlSXRlbU1vZGVsLFxuICAgIENhcmRWaWV3RGF0ZXRpbWVJdGVtTW9kZWwsXG4gICAgQ2FyZFZpZXdGbG9hdEl0ZW1Nb2RlbCxcbiAgICBDYXJkVmlld0ludEl0ZW1Nb2RlbCxcbiAgICBDYXJkVmlld0l0ZW0sXG4gICAgQ2FyZFZpZXdJdGVtUHJvcGVydGllcyxcbiAgICBDYXJkVmlld0xvbmdJdGVtTW9kZWwsXG4gICAgQ2FyZFZpZXdTZWxlY3RJdGVtTW9kZWwsXG4gICAgQ2FyZFZpZXdUZXh0SXRlbU1vZGVsLFxuICAgIERlY2ltYWxOdW1iZXJQaXBlLFxuICAgIExvZ1NlcnZpY2UsXG4gICAgTXVsdGlWYWx1ZVBpcGUsXG4gICAgVXNlclByZWZlcmVuY2VzU2VydmljZVxufSBmcm9tICdAYWxmcmVzY28vYWRmLWNvcmUnO1xuaW1wb3J0IHsgQ2FyZFZpZXdHcm91cCwgT3JnYW5pc2VkUHJvcGVydHlHcm91cCwgUHJvcGVydHkgfSBmcm9tICcuLi9pbnRlcmZhY2VzL2NvbnRlbnQtbWV0YWRhdGEuaW50ZXJmYWNlcyc7XG5pbXBvcnQgeyBvZiB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgQ29uc3RyYWludCwgRGVmaW5pdGlvbiwgUHJvcGVydHkgYXMgUHJvcGVydHlCYXNlIH0gZnJvbSAnQGFsZnJlc2NvL2pzLWFwaSc7XG5cbmNvbnN0IERfVEVYVCA9ICdkOnRleHQnO1xuY29uc3QgRF9NTFRFWFQgPSAnZDptbHRleHQnO1xuY29uc3QgRF9EQVRFID0gJ2Q6ZGF0ZSc7XG5jb25zdCBEX0RBVEVUSU1FID0gJ2Q6ZGF0ZXRpbWUnO1xuY29uc3QgRF9JTlQgPSAnZDppbnQnO1xuY29uc3QgRF9MT05HID0gJ2Q6bG9uZyc7XG5jb25zdCBEX0ZMT0FUID0gJ2Q6ZmxvYXQnO1xuY29uc3QgRF9ET1VCTEUgPSAnZDpkb3VibGUnO1xuY29uc3QgRF9CT09MRUFOID0gJ2Q6Ym9vbGVhbic7XG5cbmV4cG9ydCBjb25zdCBSRUNPR05JU0VEX0VDTV9UWVBFUyA9IFtEX1RFWFQsIERfTUxURVhULCBEX0RBVEUsIERfREFURVRJTUUsIERfSU5ULCBEX0xPTkcsIERfRkxPQVQsIERfRE9VQkxFLCBEX0JPT0xFQU5dO1xuXG5ASW5qZWN0YWJsZSh7XG4gICAgcHJvdmlkZWRJbjogJ3Jvb3QnXG59KVxuZXhwb3J0IGNsYXNzIFByb3BlcnR5R3JvdXBUcmFuc2xhdG9yU2VydmljZSB7XG4gICAgcHJpdmF0ZSB1c2VyUHJlZmVyZW5jZVNlcnZpY2UgPSBpbmplY3QoVXNlclByZWZlcmVuY2VzU2VydmljZSk7XG4gICAgcHJpdmF0ZSBhcHBDb25maWcgPSBpbmplY3QoQXBwQ29uZmlnU2VydmljZSk7XG4gICAgcHJpdmF0ZSBsb2dTZXJ2aWNlID0gaW5qZWN0KExvZ1NlcnZpY2UpO1xuXG4gICAgdmFsdWVTZXBhcmF0b3I6IHN0cmluZztcblxuICAgIHByaXZhdGUgcmVhZG9ubHkgaW5qZWN0b3IgPSBpbmplY3QoSW5qZWN0b3IpO1xuXG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHRoaXMudmFsdWVTZXBhcmF0b3IgPSB0aGlzLmFwcENvbmZpZy5nZXQ8c3RyaW5nPignY29udGVudC1tZXRhZGF0YS5tdWx0aS12YWx1ZS1waXBlLXNlcGFyYXRvcicpO1xuICAgIH1cblxuICAgIHB1YmxpYyB0cmFuc2xhdGVUb0NhcmRWaWV3R3JvdXBzKHByb3BlcnR5R3JvdXBzOiBPcmdhbmlzZWRQcm9wZXJ0eUdyb3VwW10sIHByb3BlcnR5VmFsdWVzLCBkZWZpbml0aW9uOiBEZWZpbml0aW9uKTogQ2FyZFZpZXdHcm91cFtdIHtcbiAgICAgICAgcmV0dXJuIHByb3BlcnR5R3JvdXBzLm1hcCgocHJvcGVydHlHcm91cCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgdHJhbnNsYXRlZFByb3BlcnR5R3JvdXA6IGFueSA9IE9iamVjdC5hc3NpZ24oe30sIHByb3BlcnR5R3JvdXApO1xuICAgICAgICAgICAgdHJhbnNsYXRlZFByb3BlcnR5R3JvdXAucHJvcGVydGllcyA9IHRoaXMudHJhbnNsYXRlQXJyYXkocHJvcGVydHlHcm91cC5wcm9wZXJ0aWVzLCBwcm9wZXJ0eVZhbHVlcywgZGVmaW5pdGlvbik7XG4gICAgICAgICAgICB0cmFuc2xhdGVkUHJvcGVydHlHcm91cC5lZGl0YWJsZSA9IHRyYW5zbGF0ZWRQcm9wZXJ0eUdyb3VwLnByb3BlcnRpZXMuc29tZSgocHJvcGVydHkpID0+IHByb3BlcnR5LmVkaXRhYmxlKTtcbiAgICAgICAgICAgIHJldHVybiB0cmFuc2xhdGVkUHJvcGVydHlHcm91cDtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHVibGljIHRyYW5zbGF0ZVByb3BlcnR5KHByb3BlcnR5OiBQcm9wZXJ0eUJhc2UsIHN0YXJ0VmFsdWU/OiBhbnksIGFsbG93RWRpdGluZzogYm9vbGVhbiA9IGZhbHNlKTogQ2FyZFZpZXdJdGVtIHtcbiAgICAgICAgdGhpcy5jaGVja0VDTVR5cGVWYWxpZGl0eShwcm9wZXJ0eS5kYXRhVHlwZSk7XG5cbiAgICAgICAgY29uc3QgcHJlZml4ID0gJ3Byb3BlcnRpZXMuJztcblxuICAgICAgICBjb25zdCBwcm9wZXJ0eURlZmluaXRpb246IENhcmRWaWV3SXRlbVByb3BlcnRpZXMgPSB7XG4gICAgICAgICAgICBsYWJlbDogcHJvcGVydHkudGl0bGUgfHwgcHJvcGVydHkuaWQsXG4gICAgICAgICAgICB2YWx1ZTogc3RhcnRWYWx1ZSA/IHN0YXJ0VmFsdWUgOiBwcm9wZXJ0eS5kZWZhdWx0VmFsdWUsXG4gICAgICAgICAgICBrZXk6IGAke3ByZWZpeH0ke3Byb3BlcnR5LmlkfWAsXG4gICAgICAgICAgICBkZWZhdWx0OiBwcm9wZXJ0eS5kZWZhdWx0VmFsdWUsXG4gICAgICAgICAgICBlZGl0YWJsZTogcHJvcGVydHkuaXNQcm90ZWN0ZWQgPyBmYWxzZSA6IGFsbG93RWRpdGluZyxcbiAgICAgICAgICAgIGNvbnN0cmFpbnRzOiBwcm9wZXJ0eT8uY29uc3RyYWludHNcbiAgICAgICAgfTtcblxuICAgICAgICByZXR1cm4gdGhpcy50cmFuc2Zvcm0ocHJvcGVydHlEZWZpbml0aW9uLCBwcm9wZXJ0eS5kYXRhVHlwZSwgcHJvcGVydHkuaXNNdWx0aVZhbHVlZCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSB0cmFuc2xhdGVBcnJheShwcm9wZXJ0aWVzOiBQcm9wZXJ0eVtdLCBwcm9wZXJ0eVZhbHVlczogYW55LCBkZWZpbml0aW9uOiBEZWZpbml0aW9uKTogQ2FyZFZpZXdJdGVtW10ge1xuICAgICAgICByZXR1cm4gcHJvcGVydGllcy5tYXAoKHByb3BlcnR5KSA9PiB0aGlzLnRyYW5zbGF0ZShwcm9wZXJ0eSwgcHJvcGVydHlWYWx1ZXMsIHRoaXMuZ2V0UHJvcGVydHlDb25zdHJhaW50cyhwcm9wZXJ0eS5uYW1lLCBkZWZpbml0aW9uKSkpO1xuICAgIH1cblxuICAgIHByaXZhdGUgdHJhbnNsYXRlKHByb3BlcnR5OiBQcm9wZXJ0eSwgcHJvcGVydHlWYWx1ZXM6IGFueSwgY29uc3RyYWludHM6IENvbnN0cmFpbnRbXSk6IENhcmRWaWV3SXRlbSB7XG4gICAgICAgIGxldCBwcm9wZXJ0eVZhbHVlOiBhbnk7XG4gICAgICAgIGlmIChwcm9wZXJ0eVZhbHVlcyAmJiAhdGhpcy5pc0VtcHR5KHByb3BlcnR5VmFsdWVzW3Byb3BlcnR5Lm5hbWVdKSkge1xuICAgICAgICAgICAgcHJvcGVydHlWYWx1ZSA9IHByb3BlcnR5VmFsdWVzW3Byb3BlcnR5Lm5hbWVdO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5jaGVja0VDTVR5cGVWYWxpZGl0eShwcm9wZXJ0eS5kYXRhVHlwZSk7XG5cbiAgICAgICAgY29uc3QgcHJlZml4ID0gJ3Byb3BlcnRpZXMuJztcblxuICAgICAgICBjb25zdCBwcm9wZXJ0eURlZmluaXRpb246IENhcmRWaWV3SXRlbVByb3BlcnRpZXMgPSB7XG4gICAgICAgICAgICBsYWJlbDogcHJvcGVydHkudGl0bGUgfHwgcHJvcGVydHkubmFtZSxcbiAgICAgICAgICAgIHZhbHVlOiBwcm9wZXJ0eVZhbHVlLFxuICAgICAgICAgICAga2V5OiBgJHtwcmVmaXh9JHtwcm9wZXJ0eS5uYW1lfWAsXG4gICAgICAgICAgICBkZWZhdWx0OiBwcm9wZXJ0eS5kZWZhdWx0VmFsdWUsXG4gICAgICAgICAgICBlZGl0YWJsZTogcHJvcGVydHkucHJvdGVjdGVkID8gZmFsc2UgOiBwcm9wZXJ0eS5lZGl0YWJsZSAhPT0gdW5kZWZpbmVkID8gcHJvcGVydHkuZWRpdGFibGUgOiB0cnVlLFxuICAgICAgICAgICAgY29uc3RyYWludHNcbiAgICAgICAgfTtcblxuICAgICAgICByZXR1cm4gdGhpcy50cmFuc2Zvcm0ocHJvcGVydHlEZWZpbml0aW9uLCBwcm9wZXJ0eS5kYXRhVHlwZSwgcHJvcGVydHkubXVsdGlWYWx1ZWQpO1xuICAgIH1cblxuICAgIHByaXZhdGUgdHJhbnNmb3JtKHByb3BlcnR5RGVmaW5pdGlvbjogQ2FyZFZpZXdJdGVtUHJvcGVydGllcywgZGF0YVR5cGU6IHN0cmluZywgaXNNdWx0aVZhbHVlZDogYm9vbGVhbik6IENhcmRWaWV3SXRlbSB7XG4gICAgICAgIGxldCBjYXJkVmlld0l0ZW1Qcm9wZXJ0eTogQ2FyZFZpZXdJdGVtO1xuXG4gICAgICAgIGlmICh0aGlzLmlzTGlzdE9mVmFsdWVzKHByb3BlcnR5RGVmaW5pdGlvbi5jb25zdHJhaW50cykpIHtcbiAgICAgICAgICAgIGNvbnN0IG9wdGlvbnMgPSBwcm9wZXJ0eURlZmluaXRpb24uY29uc3RyYWludHNbMF0ucGFyYW1ldGVycy5hbGxvd2VkVmFsdWVzLm1hcCgodmFsdWUpID0+ICh7IGtleTogdmFsdWUsIGxhYmVsOiB2YWx1ZSB9KSk7XG4gICAgICAgICAgICBjb25zdCBwcm9wZXJ0aWVzID0gT2JqZWN0LmFzc2lnbihwcm9wZXJ0eURlZmluaXRpb24sIHsgb3B0aW9ucyQ6IG9mKG9wdGlvbnMpIH0pO1xuXG4gICAgICAgICAgICBjYXJkVmlld0l0ZW1Qcm9wZXJ0eSA9IG5ldyBDYXJkVmlld1NlbGVjdEl0ZW1Nb2RlbChwcm9wZXJ0aWVzKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHN3aXRjaCAoZGF0YVR5cGUpIHtcbiAgICAgICAgICAgICAgICBjYXNlIERfTUxURVhUOlxuICAgICAgICAgICAgICAgICAgICBjYXJkVmlld0l0ZW1Qcm9wZXJ0eSA9IG5ldyBDYXJkVmlld1RleHRJdGVtTW9kZWwoXG4gICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QuYXNzaWduKHByb3BlcnR5RGVmaW5pdGlvbiwge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG11bHRpbGluZTogdHJ1ZVxuICAgICAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICAgICAgICBjYXNlIERfSU5UOlxuICAgICAgICAgICAgICAgICAgICBjYXJkVmlld0l0ZW1Qcm9wZXJ0eSA9IG5ldyBDYXJkVmlld0ludEl0ZW1Nb2RlbChcbiAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdC5hc3NpZ24ocHJvcGVydHlEZWZpbml0aW9uLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbXVsdGl2YWx1ZWQ6IGlzTXVsdGlWYWx1ZWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGlwZXM6IFt7IHBpcGU6IG5ldyBNdWx0aVZhbHVlUGlwZSgpLCBwYXJhbXM6IFt0aGlzLnZhbHVlU2VwYXJhdG9yXSB9XVxuICAgICAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICAgICAgICBjYXNlIERfTE9ORzpcbiAgICAgICAgICAgICAgICAgICAgY2FyZFZpZXdJdGVtUHJvcGVydHkgPSBuZXcgQ2FyZFZpZXdMb25nSXRlbU1vZGVsKFxuICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0LmFzc2lnbihwcm9wZXJ0eURlZmluaXRpb24sIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtdWx0aXZhbHVlZDogaXNNdWx0aVZhbHVlZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaXBlczogW3sgcGlwZTogbmV3IE11bHRpVmFsdWVQaXBlKCksIHBhcmFtczogW3RoaXMudmFsdWVTZXBhcmF0b3JdIH1dXG4gICAgICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgICAgICAgIGNhc2UgRF9GTE9BVDpcbiAgICAgICAgICAgICAgICBjYXNlIERfRE9VQkxFOlxuICAgICAgICAgICAgICAgICAgICBjYXJkVmlld0l0ZW1Qcm9wZXJ0eSA9IG5ldyBDYXJkVmlld0Zsb2F0SXRlbU1vZGVsKFxuICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0LmFzc2lnbihwcm9wZXJ0eURlZmluaXRpb24sIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtdWx0aXZhbHVlZDogaXNNdWx0aVZhbHVlZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaXBlczogW3sgcGlwZTogdGhpcy5nZXREZWNpbWFsTnVtYmVyUGlwZSgpIH0sIHsgcGlwZTogbmV3IE11bHRpVmFsdWVQaXBlKCksIHBhcmFtczogW3RoaXMudmFsdWVTZXBhcmF0b3JdIH1dXG4gICAgICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgICAgICAgIGNhc2UgRF9EQVRFOlxuICAgICAgICAgICAgICAgICAgICBjYXJkVmlld0l0ZW1Qcm9wZXJ0eSA9IG5ldyBDYXJkVmlld0RhdGVJdGVtTW9kZWwoXG4gICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QuYXNzaWduKHByb3BlcnR5RGVmaW5pdGlvbiwge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG11bHRpdmFsdWVkOiBpc011bHRpVmFsdWVkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBpcGVzOiBbeyBwaXBlOiBuZXcgTXVsdGlWYWx1ZVBpcGUoKSwgcGFyYW1zOiBbdGhpcy52YWx1ZVNlcGFyYXRvcl0gfV1cbiAgICAgICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgICAgICAgY2FzZSBEX0RBVEVUSU1FOlxuICAgICAgICAgICAgICAgICAgICBjYXJkVmlld0l0ZW1Qcm9wZXJ0eSA9IG5ldyBDYXJkVmlld0RhdGV0aW1lSXRlbU1vZGVsKFxuICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0LmFzc2lnbihwcm9wZXJ0eURlZmluaXRpb24sIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtdWx0aXZhbHVlZDogaXNNdWx0aVZhbHVlZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaXBlczogW3sgcGlwZTogbmV3IE11bHRpVmFsdWVQaXBlKCksIHBhcmFtczogW3RoaXMudmFsdWVTZXBhcmF0b3JdIH1dXG4gICAgICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgICAgICAgIGNhc2UgRF9CT09MRUFOOlxuICAgICAgICAgICAgICAgICAgICBjYXJkVmlld0l0ZW1Qcm9wZXJ0eSA9IG5ldyBDYXJkVmlld0Jvb2xJdGVtTW9kZWwocHJvcGVydHlEZWZpbml0aW9uKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICAgICAgICBjYXNlIERfVEVYVDpcbiAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICBjYXJkVmlld0l0ZW1Qcm9wZXJ0eSA9IG5ldyBDYXJkVmlld1RleHRJdGVtTW9kZWwoXG4gICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QuYXNzaWduKHByb3BlcnR5RGVmaW5pdGlvbiwge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG11bHRpdmFsdWVkOiBpc011bHRpVmFsdWVkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG11bHRpbGluZTogaXNNdWx0aVZhbHVlZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaXBlczogW3sgcGlwZTogbmV3IE11bHRpVmFsdWVQaXBlKCksIHBhcmFtczogW3RoaXMudmFsdWVTZXBhcmF0b3JdIH1dXG4gICAgICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGNhcmRWaWV3SXRlbVByb3BlcnR5O1xuICAgIH1cblxuICAgIHByaXZhdGUgaXNMaXN0T2ZWYWx1ZXMoY29uc3RyYWludDogQ29uc3RyYWludFtdKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiBjb25zdHJhaW50Py5bMF0/LnR5cGUgPT09ICdMSVNUJztcbiAgICB9XG5cbiAgICBwcml2YXRlIGdldFByb3BlcnR5Q29uc3RyYWludHMocHJvcGVydHlOYW1lOiBzdHJpbmcsIGRlZmluaXRpb246IERlZmluaXRpb24pOiBDb25zdHJhaW50W10ge1xuICAgICAgICByZXR1cm4gZGVmaW5pdGlvbj8ucHJvcGVydGllcy5maW5kKChpdGVtKSA9PiBpdGVtLmlkID09PSBwcm9wZXJ0eU5hbWUpPy5jb25zdHJhaW50cyA/PyBbXTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGNoZWNrRUNNVHlwZVZhbGlkaXR5KGVjbVByb3BlcnR5VHlwZTogc3RyaW5nKSB7XG4gICAgICAgIGlmIChSRUNPR05JU0VEX0VDTV9UWVBFUy5pbmRleE9mKGVjbVByb3BlcnR5VHlwZSkgPT09IC0xKSB7XG4gICAgICAgICAgICB0aGlzLmxvZ1NlcnZpY2UuZXJyb3IoYFVua25vd24gdHlwZSBmb3IgbWFwcGluZzogJHtlY21Qcm9wZXJ0eVR5cGV9YCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIGlzRW1wdHkodmFsdWU6IGFueSk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdmFsdWUgPT09IHVuZGVmaW5lZCB8fCB2YWx1ZSA9PT0gbnVsbCB8fCB2YWx1ZSA9PT0gJyc7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBnZXREZWNpbWFsTnVtYmVyUGlwZSgpOiBEZWNpbWFsTnVtYmVyUGlwZSB7XG4gICAgICAgIGxldCBkZWNpbWFsTnVtYmVyUGlwZTogRGVjaW1hbE51bWJlclBpcGU7XG4gICAgICAgIHJ1bkluSW5qZWN0aW9uQ29udGV4dCh0aGlzLmluamVjdG9yLCAoKSA9PiB7XG4gICAgICAgICAgICBkZWNpbWFsTnVtYmVyUGlwZSA9IG5ldyBEZWNpbWFsTnVtYmVyUGlwZSh0aGlzLnVzZXJQcmVmZXJlbmNlU2VydmljZSwgdGhpcy5hcHBDb25maWcpO1xuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIGRlY2ltYWxOdW1iZXJQaXBlO1xuICAgIH1cbn1cbiJdfQ==