e5core-angular-ui
Version:
e5 Anywhere Angular UI
412 lines • 38.5 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
import { Component, ChangeDetectionStrategy, Input, Output, EventEmitter, QueryList, ViewChildren, ChangeDetectorRef } from '@angular/core';
import { BehaviorSubject } from 'rxjs';
import { WorkItemService, TaxonomyFieldDefinitionService } from 'e5core-angular-services';
import { Guid } from 'guid-typescript';
import { E5coreUiWorkRelatedItemsBaseComponent } from './component/e5core-ui-work-related-items-base';
import { PrimeTreeTableModel } from '../../models/prime-tree-table.model';
import { KeyValuePair } from '../../util/key-value-pair';
var E5coreUiWorkRelatedItemsComponent = /** @class */ (function () {
function E5coreUiWorkRelatedItemsComponent(workItemService, fieldDefinitonServices, changeDetectorRef) {
this.workItemService = workItemService;
this.fieldDefinitonServices = fieldDefinitonServices;
this.changeDetectorRef = changeDetectorRef;
this.findId = 0;
this.createButtonText = "Create";
this.fieldsToShow = null;
this.showCreateChildButton = true;
this.showDefinedChildrenOnly = true;
this.workItemSelectEvent = new EventEmitter();
this.attachmentSelectEvent = new EventEmitter();
this.categorisationChangeEvent = new EventEmitter();
this.createChildWorkItemEvent = new EventEmitter();
this.labels = [];
}
/**
* @return {?}
*/
E5coreUiWorkRelatedItemsComponent.prototype.ngOnInit = /**
* @return {?}
*/
function () {
var _this = this;
if (typeof this.workItem$ == 'undefined') {
console.error('e5core-ui-work-related-items [workItem$] must have a BehaviorSubject<WorkItemModel>');
return;
}
if (this.fieldsToShow) {
this.fieldsToShow.forEach(function (element) {
_this.setLabel(element);
});
}
if (typeof this.workItem$ != 'undefined') {
this.workItem$.subscribe(function (wim) {
if (wim.workId != null && wim.workId != Guid.EMPTY) {
_this.workId = wim.workId;
_this.populateWorkRelatedItems(_this.workId);
if (_this.showDefinedChildrenOnly)
_this.populateWorkClassChildren(wim.workId.toString());
}
});
}
};
/**
* @private
* @param {?} findField
* @return {?}
*/
E5coreUiWorkRelatedItemsComponent.prototype.setLabel = /**
* @private
* @param {?} findField
* @return {?}
*/
function (findField) {
var _this = this;
if (findField.value == "") {
/** @type {?} */
var index = this.labels.length;
this.labels[this.labels.length] = "";
this.fieldDefinitonServices.get(findField.key).subscribe(function (fd) {
_this.labels[index] = fd.label;
_this.changeDetectorRef.detectChanges();
});
}
else {
this.labels[this.labels.length] = findField.value;
}
};
/**
* @private
* @param {?} wid
* @return {?}
*/
E5coreUiWorkRelatedItemsComponent.prototype.populateWorkClassChildren = /**
* @private
* @param {?} wid
* @return {?}
*/
function (wid) {
var _this = this;
this.workItemService.getWorkWorkClassChildren(wid).subscribe(function (s) {
_this.workRelatedItemsComponents.forEach(function (element) {
element.childWorkItemCategories = s;
});
}, function (error) {
console.error(error);
});
};
/**
* @private
* @param {?} wid
* @return {?}
*/
E5coreUiWorkRelatedItemsComponent.prototype.populateWorkRelatedItems = /**
* @private
* @param {?} wid
* @return {?}
*/
function (wid) {
var _this = this;
this.workItemService.getWorkRelatedItems(wid, {
findId: this.findId,
pageSize: this.selectedPage.pageSize,
pageNo: this.selectedPage.pageIndex,
doSearchFromRoot: true
}).subscribe(function (s) {
/** @type {?} */
var rootModel = _this.convertToUiModel(s.relatedItems);
_this.workRelatedItemsComponents.forEach(function (element) {
element.length = s.total;
element.treeData = (/** @type {?} */ ([rootModel]));
_this.changeDetectorRef.detectChanges();
});
_this.changeDetectorRef.detectChanges();
}, function (error) {
console.error(error);
});
};
/**
* @private
* @param {?} apiModels
* @return {?}
*/
E5coreUiWorkRelatedItemsComponent.prototype.convertToUiModel = /**
* @private
* @param {?} apiModels
* @return {?}
*/
function (apiModels) {
var _this = this;
if (!apiModels)
return; // Nothing to do
// Nothing to do
/** @type {?} */
var current = apiModels.filter(function (u) { return u.id == _this.workId; });
if (current.length == 0)
return;
/** @type {?} */
var parent = apiModels.filter(function (u) { return u.id == current[0].parentId; });
if (current[0].parentId == Guid.EMPTY)
parent = current;
/** @type {?} */
var children = apiModels.filter(function (u) { return u.parentId == _this.workId; });
/** @type {?} */
var rootModel = new PrimeTreeTableModel();
rootModel.data.id = parent[0].id;
rootModel.data.attachmentCount = parent[0].attachmentCount;
rootModel.data.parentId = parent[0].parentId;
rootModel.expanded = true;
this.populateDataFields(rootModel.data, parent[0]);
this.processChildren(rootModel, children, apiModels);
return rootModel;
};
/**
* @private
* @param {?} parent
* @param {?} children
* @param {?} apiModels
* @return {?}
*/
E5coreUiWorkRelatedItemsComponent.prototype.processChildren = /**
* @private
* @param {?} parent
* @param {?} children
* @param {?} apiModels
* @return {?}
*/
function (parent, children, apiModels) {
for (var i = 0; i < children.length; i++) {
/** @type {?} */
var child = children[i];
/** @type {?} */
var model = new PrimeTreeTableModel();
model.data.id = child.id;
model.data.attachmentCount = child.attachmentCount;
model.data.parentId = child.parentId;
this.populateDataFields(model.data, child);
parent.children[parent.children.length] = model;
/** @type {?} */
var moreChildren = apiModels.filter(function (u) { return u.parentId == child.id; });
if (moreChildren.length > 0) {
this.processChildren(model, moreChildren, apiModels);
}
}
};
/**
* @private
* @param {?} modelData
* @param {?} child
* @return {?}
*/
E5coreUiWorkRelatedItemsComponent.prototype.populateDataFields = /**
* @private
* @param {?} modelData
* @param {?} child
* @return {?}
*/
function (modelData, child) {
if (!this.fieldsToShow) {
modelData.fieldValues = [];
}
else {
for (var i = 0; i < this.fieldsToShow.length; i++) {
/** @type {?} */
var findField = this.fieldsToShow[i];
/** @type {?} */
var field = child.fieldValues.filter(function (u) { return u.key == findField.key; });
if (field == null || field.length == 0) {
field = [{ key: findField.key, value: "" }];
}
/** @type {?} */
var keyValuePair = new KeyValuePair();
keyValuePair.key = field[0].key;
keyValuePair.value = field[0].value;
modelData.fieldValues[modelData.fieldValues.length] = keyValuePair;
}
}
};
/**
* @return {?}
*/
E5coreUiWorkRelatedItemsComponent.prototype.ngAfterViewInit = /**
* @return {?}
*/
function () {
};
/**
* @param {?} selectedCategory
* @return {?}
*/
E5coreUiWorkRelatedItemsComponent.prototype.CreateChildWorkItem = /**
* @param {?} selectedCategory
* @return {?}
*/
function (selectedCategory) {
var _this = this;
if (!this.workId) {
console.error("e5core-ui-work-related-items has no work item.");
return;
}
/** @type {?} */
var workItemCreateModel = {
category1Id: selectedCategory.category1Id,
category2Id: selectedCategory.category2Id,
category3Id: selectedCategory.category3Id,
workItemFields: [
{
fieldId: "Parent_id",
fieldValue: this.workId,
fieldType: "Guid"
}
]
};
this.workItemService.create(workItemCreateModel).subscribe(function (s) {
_this.createChildWorkItemEvent.emit({ workId: s.id, reference: s.reference, type: "related" });
_this.populateWorkRelatedItems(_this.workId);
}, function (error) {
console.error(error);
});
};
/**
* @return {?}
*/
E5coreUiWorkRelatedItemsComponent.prototype.onCreateChildWorkItem = /**
* @return {?}
*/
function () {
this.CreateChildWorkItem(this.selectedCategory);
};
/**
* @param {?} $event
* @return {?}
*/
E5coreUiWorkRelatedItemsComponent.prototype.onCategorizationChange = /**
* @param {?} $event
* @return {?}
*/
function ($event) {
this.selectedCategory = $event;
this.categorisationChangeEvent.emit($event);
};
/**
* @param {?} openWorkEvent
* @return {?}
*/
E5coreUiWorkRelatedItemsComponent.prototype.onWorkItemSelect = /**
* @param {?} openWorkEvent
* @return {?}
*/
function (openWorkEvent) {
this.workItemSelectEvent.emit(openWorkEvent);
};
/**
* @param {?} viewerDisplayEvent
* @return {?}
*/
E5coreUiWorkRelatedItemsComponent.prototype.onAttachmentSelect = /**
* @param {?} viewerDisplayEvent
* @return {?}
*/
function (viewerDisplayEvent) {
this.attachmentSelectEvent.emit(viewerDisplayEvent);
};
/**
* @param {?} event
* @return {?}
*/
E5coreUiWorkRelatedItemsComponent.prototype.onPageEvent = /**
* @param {?} event
* @return {?}
*/
function (event) {
this.selectedPage = event;
if (typeof this.workId != 'undefined' && this.workId != Guid.EMPTY) {
this.populateWorkRelatedItems(this.workId);
}
};
E5coreUiWorkRelatedItemsComponent.decorators = [
{ type: Component, args: [{
selector: 'e5core-ui-work-related-items',
template: "\n <span *ngIf=\"workItem$\">\n <e5core-ui-work-related-items-prime [labels]=\"labels\" [showCreateChildButton]=\"showCreateChildButton\" [createButtonText]=\"createButtonText\" [showDefinedChildrenOnly]=\"showDefinedChildrenOnly\" [readonly]=\"readonly\" (workItemSelectEvent)=\"onWorkItemSelect($event)\" (attachmentSelectEvent)=\"onAttachmentSelect($event)\" (categorisationChangeEvent)=\"onCategorizationChange($event)\" (createChildWorkItemEvent)=\"onCreateChildWorkItem()\" (pageEvent)=\"onPageEvent($event)\"></e5core-ui-work-related-items-prime>\n </span>\n <div *ngIf=\"!(workItem$)\" class=\"e5core-component-error\"><e5core-ui-work-related-items> [workItem$] must have a BehaviorSubject<WorkItemModel></div>",
changeDetection: ChangeDetectionStrategy.OnPush
}] }
];
/** @nocollapse */
E5coreUiWorkRelatedItemsComponent.ctorParameters = function () { return [
{ type: WorkItemService },
{ type: TaxonomyFieldDefinitionService },
{ type: ChangeDetectorRef }
]; };
E5coreUiWorkRelatedItemsComponent.propDecorators = {
workItem$: [{ type: Input }],
findId: [{ type: Input }],
createButtonText: [{ type: Input }],
fieldsToShow: [{ type: Input }],
readonly: [{ type: Input }],
pagesizes: [{ type: Input }],
showCreateChildButton: [{ type: Input }],
showDefinedChildrenOnly: [{ type: Input }],
workItemSelectEvent: [{ type: Output }],
attachmentSelectEvent: [{ type: Output }],
categorisationChangeEvent: [{ type: Output }],
createChildWorkItemEvent: [{ type: Output }],
workRelatedItemsComponents: [{ type: ViewChildren, args: [E5coreUiWorkRelatedItemsBaseComponent,] }]
};
return E5coreUiWorkRelatedItemsComponent;
}());
export { E5coreUiWorkRelatedItemsComponent };
if (false) {
/** @type {?} */
E5coreUiWorkRelatedItemsComponent.prototype.workItem$;
/** @type {?} */
E5coreUiWorkRelatedItemsComponent.prototype.findId;
/** @type {?} */
E5coreUiWorkRelatedItemsComponent.prototype.createButtonText;
/** @type {?} */
E5coreUiWorkRelatedItemsComponent.prototype.fieldsToShow;
/** @type {?} */
E5coreUiWorkRelatedItemsComponent.prototype.readonly;
/** @type {?} */
E5coreUiWorkRelatedItemsComponent.prototype.pagesizes;
/** @type {?} */
E5coreUiWorkRelatedItemsComponent.prototype.showCreateChildButton;
/** @type {?} */
E5coreUiWorkRelatedItemsComponent.prototype.showDefinedChildrenOnly;
/** @type {?} */
E5coreUiWorkRelatedItemsComponent.prototype.workItemSelectEvent;
/** @type {?} */
E5coreUiWorkRelatedItemsComponent.prototype.attachmentSelectEvent;
/** @type {?} */
E5coreUiWorkRelatedItemsComponent.prototype.categorisationChangeEvent;
/** @type {?} */
E5coreUiWorkRelatedItemsComponent.prototype.createChildWorkItemEvent;
/** @type {?} */
E5coreUiWorkRelatedItemsComponent.prototype.workId;
/** @type {?} */
E5coreUiWorkRelatedItemsComponent.prototype.selectedPage;
/** @type {?} */
E5coreUiWorkRelatedItemsComponent.prototype.selectedCategory;
/** @type {?} */
E5coreUiWorkRelatedItemsComponent.prototype.labels;
/** @type {?} */
E5coreUiWorkRelatedItemsComponent.prototype.workRelatedItemsComponents;
/**
* @type {?}
* @private
*/
E5coreUiWorkRelatedItemsComponent.prototype.workItemService;
/**
* @type {?}
* @private
*/
E5coreUiWorkRelatedItemsComponent.prototype.fieldDefinitonServices;
/**
* @type {?}
* @private
*/
E5coreUiWorkRelatedItemsComponent.prototype.changeDetectorRef;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZTVjb3JlLXVpLXdvcmstcmVsYXRlZC1pdGVtcy5jb21wb25lbnQuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9lNWNvcmUtYW5ndWxhci11aS8iLCJzb3VyY2VzIjpbImxpYi9jb21wb25lbnRzL2U1Y29yZS11aS13b3JrLXJlbGF0ZWQtaXRlbXMvZTVjb3JlLXVpLXdvcmstcmVsYXRlZC1pdGVtcy5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7OztBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQVUsdUJBQXVCLEVBQUUsS0FBSyxFQUFpQixNQUFNLEVBQUUsWUFBWSxFQUFFLFNBQVMsRUFBRSxZQUFZLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDbkssT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUV2QyxPQUFPLEVBQUUsZUFBZSxFQUFFLDhCQUE4QixFQUF3QixNQUFNLHlCQUF5QixDQUFDO0FBQ2hILE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUN2QyxPQUFPLEVBQUUscUNBQXFDLEVBQUUsTUFBTSwrQ0FBK0MsQ0FBQztBQUd0RyxPQUFPLEVBQUUsbUJBQW1CLEVBQXNCLE1BQU0scUNBQXFDLENBQUM7QUFFOUYsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBR3pEO0lBaUNFLDJDQUNVLGVBQWdDLEVBQ2hDLHNCQUFzRCxFQUN0RCxpQkFBb0M7UUFGcEMsb0JBQWUsR0FBZixlQUFlLENBQWlCO1FBQ2hDLDJCQUFzQixHQUF0QixzQkFBc0IsQ0FBZ0M7UUFDdEQsc0JBQWlCLEdBQWpCLGlCQUFpQixDQUFtQjtRQXhCckMsV0FBTSxHQUFZLENBQUMsQ0FBQztRQUNwQixxQkFBZ0IsR0FBWSxRQUFRLENBQUM7UUFDckMsaUJBQVksR0FBb0IsSUFBSSxDQUFDO1FBR3JDLDBCQUFxQixHQUFhLElBQUksQ0FBQztRQUN2Qyw0QkFBdUIsR0FBYSxJQUFJLENBQUM7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QUFXLElBQUksSUFBSSxDQUFDLE1BQU0sSUFBSSxJQUFJLENBQUMsS0FBSyxFQUFFO1lBQ2xFLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7U0FDNUM7SUFDSCxDQUFDOztnQkFoUEYsU0FBUyxTQUFDO29CQUNULFFBQVEsRUFBRSw4QkFBOEI7b0JBQ3hDLFFBQVEsRUFBRSxrdUJBSXVKO29CQUNqSyxlQUFlLEVBQUUsdUJBQXVCLENBQUMsTUFBTTtpQkFDaEQ7Ozs7Z0JBbEJRLGVBQWU7Z0JBQUUsOEJBQThCO2dCQUhrRSxpQkFBaUI7Ozs0QkF3QnhJLEtBQUs7eUJBQ0wsS0FBSzttQ0FDTCxLQUFLOytCQUNMLEtBQUs7MkJBQ0wsS0FBSzs0QkFDTCxLQUFLO3dDQUNMLEtBQUs7MENBQ0wsS0FBSztzQ0FFTCxNQUFNO3dDQUNOLE1BQU07NENBQ04sTUFBTTsyQ0FDTixNQUFNOzZDQU9OLFlBQVksU0FBQyxxQ0FBcUM7O0lBbU5yRCx3Q0FBQztDQUFBLEFBalBELElBaVBDO1NBeE9ZLGlDQUFpQzs7O0lBRTVDLHNEQUFvRDs7SUFDcEQsbURBQTZCOztJQUM3Qiw2REFBOEM7O0lBQzlDLHlEQUE4Qzs7SUFDOUMscURBQTRCOztJQUM1QixzREFBOEI7O0lBQzlCLGtFQUFnRDs7SUFDaEQsb0VBQWtEOztJQUVsRCxnRUFBa0U7O0lBQ2xFLGtFQUF5RTs7SUFDekUsc0VBQW9GOztJQUNwRixxRUFBdUU7O0lBRXZFLG1EQUFpQjs7SUFDakIseURBQWtCOztJQUNsQiw2REFBdUI7O0lBQ3ZCLG1EQUFzQjs7SUFFdEIsdUVBQ29GOzs7OztJQUdsRiw0REFBd0M7Ozs7O0lBQ3hDLG1FQUE4RDs7Ozs7SUFDOUQsOERBQTRDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBPbkluaXQsIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LCBJbnB1dCwgQWZ0ZXJWaWV3SW5pdCwgT3V0cHV0LCBFdmVudEVtaXR0ZXIsIFF1ZXJ5TGlzdCwgVmlld0NoaWxkcmVuLCBDaGFuZ2VEZXRlY3RvclJlZiB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQmVoYXZpb3JTdWJqZWN0IH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBXb3JrSXRlbU1vZGVsIH0gZnJvbSAnLi4vLi4vbW9kZWxzL3dvcmstaXRlbSc7XG5pbXBvcnQgeyBXb3JrSXRlbVNlcnZpY2UsIFRheG9ub215RmllbGREZWZpbml0aW9uU2VydmljZSwgV29ya1JlbGF0ZWRJdGVtTW9kZWwgfSBmcm9tICdlNWNvcmUtYW5ndWxhci1zZXJ2aWNlcyc7XG5pbXBvcnQgeyBHdWlkIH0gZnJvbSAnZ3VpZC10eXBlc2NyaXB0JztcbmltcG9ydCB7IEU1Y29yZVVpV29ya1JlbGF0ZWRJdGVtc0Jhc2VDb21wb25lbnQgfSBmcm9tICcuL2NvbXBvbmVudC9lNWNvcmUtdWktd29yay1yZWxhdGVkLWl0ZW1zLWJhc2UnO1xuaW1wb3J0IHsgVmlld2VyRGlzcGxheUV2ZW50IH0gZnJvbSAnLi4vLi4vZXZlbnRzL3ZpZXdlci1kaXNwbGF5LWV2ZW50JztcbmltcG9ydCB7IE9wZW5Xb3JrRXZlbnQgfSBmcm9tICcuLi8uLi9ldmVudHMvb3Blbi13b3JrLWV2ZW50JztcbmltcG9ydCB7IFByaW1lVHJlZVRhYmxlTW9kZWwsIFRyZWVUYWJsZURhdGFNb2RlbCB9IGZyb20gJy4uLy4uL21vZGVscy9wcmltZS10cmVlLXRhYmxlLm1vZGVsJztcbmltcG9ydCB7IENhdGVnb3JpemF0aW9uQ2hhbmdlRXZlbnQgfSBmcm9tICcuLi8uLi9ldmVudHMvY2F0ZWdvcml6YXRpb24tY2hhbmdlLWV2ZW50JztcbmltcG9ydCB7IEtleVZhbHVlUGFpciB9IGZyb20gJy4uLy4uL3V0aWwva2V5LXZhbHVlLXBhaXInO1xuaW1wb3J0IHsgRHluYW1pYyB9IGZyb20gJy4uLy4uL3V0aWwvZHluYW1pYyc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2U1Y29yZS11aS13b3JrLXJlbGF0ZWQtaXRlbXMnLFxuICB0ZW1wbGF0ZTogYFxuICA8c3BhbiAqbmdJZj1cIndvcmtJdGVtJFwiPlxuICAgIDxlNWNvcmUtdWktd29yay1yZWxhdGVkLWl0ZW1zLXByaW1lIFtsYWJlbHNdPVwibGFiZWxzXCIgW3Nob3dDcmVhdGVDaGlsZEJ1dHRvbl09XCJzaG93Q3JlYXRlQ2hpbGRCdXR0b25cIiBbY3JlYXRlQnV0dG9uVGV4dF09XCJjcmVhdGVCdXR0b25UZXh0XCIgW3Nob3dEZWZpbmVkQ2hpbGRyZW5Pbmx5XT1cInNob3dEZWZpbmVkQ2hpbGRyZW5Pbmx5XCIgW3JlYWRvbmx5XT1cInJlYWRvbmx5XCIgKHdvcmtJdGVtU2VsZWN0RXZlbnQpPVwib25Xb3JrSXRlbVNlbGVjdCgkZXZlbnQpXCIgKGF0dGFjaG1lbnRTZWxlY3RFdmVudCk9XCJvbkF0dGFjaG1lbnRTZWxlY3QoJGV2ZW50KVwiIChjYXRlZ29yaXNhdGlvbkNoYW5nZUV2ZW50KT1cIm9uQ2F0ZWdvcml6YXRpb25DaGFuZ2UoJGV2ZW50KVwiIChjcmVhdGVDaGlsZFdvcmtJdGVtRXZlbnQpPVwib25DcmVhdGVDaGlsZFdvcmtJdGVtKClcIiAocGFnZUV2ZW50KT1cIm9uUGFnZUV2ZW50KCRldmVudClcIj48L2U1Y29yZS11aS13b3JrLXJlbGF0ZWQtaXRlbXMtcHJpbWU+XG4gIDwvc3Bhbj5cbiAgPGRpdiAqbmdJZj1cIiEod29ya0l0ZW0kKVwiIGNsYXNzPVwiZTVjb3JlLWNvbXBvbmVudC1lcnJvclwiPiZsdDtlNWNvcmUtdWktd29yay1yZWxhdGVkLWl0ZW1zJmd0OyBbd29ya0l0ZW0kXSBtdXN0IGhhdmUgYSBCZWhhdmlvclN1YmplY3QmbHQ7V29ya0l0ZW1Nb2RlbCZndDs8L2Rpdj5gLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaFxufSlcbmV4cG9ydCBjbGFzcyBFNWNvcmVVaVdvcmtSZWxhdGVkSXRlbXNDb21wb25lbnQgIGltcGxlbWVudHMgQWZ0ZXJWaWV3SW5pdCwgT25Jbml0IHtcblxuICBASW5wdXQoKSB3b3JrSXRlbSQgOiBCZWhhdmlvclN1YmplY3Q8V29ya0l0ZW1Nb2RlbD47XG4gIEBJbnB1dCgpIGZpbmRJZCA6IG51bWJlciA9IDA7XG4gIEBJbnB1dCgpIGNyZWF0ZUJ1dHRvblRleHQgOiBzdHJpbmcgPSBcIkNyZWF0ZVwiO1xuICBASW5wdXQoKSBmaWVsZHNUb1Nob3cgOiBLZXlWYWx1ZVBhaXJbXSA9IG51bGw7XG4gIEBJbnB1dCgpIHJlYWRvbmx5IDogYm9vbGVhbjtcbiAgQElucHV0KCkgcGFnZXNpemVzIDogbnVtYmVyW107XG4gIEBJbnB1dCgpIHNob3dDcmVhdGVDaGlsZEJ1dHRvbiA6IGJvb2xlYW4gPSB0cnVlO1xuICBASW5wdXQoKSBzaG93RGVmaW5lZENoaWxkcmVuT25seSA6IGJvb2xlYW4gPSB0cnVlO1xuICBcbiAgQE91dHB1dCgpIHdvcmtJdGVtU2VsZWN0RXZlbnQgPSBuZXcgRXZlbnRFbWl0dGVyPE9wZW5Xb3JrRXZlbnQ+KCk7XG4gIEBPdXRwdXQoKSBhdHRhY2htZW50U2VsZWN0RXZlbnQgPSBuZXcgRXZlbnRFbWl0dGVyPFZpZXdlckRpc3BsYXlFdmVudD4oKTtcbiAgQE91dHB1dCgpIGNhdGVnb3Jpc2F0aW9uQ2hhbmdlRXZlbnQgPSBuZXcgRXZlbnRFbWl0dGVyPENhdGVnb3JpemF0aW9uQ2hhbmdlRXZlbnQ+KCk7XG4gIEBPdXRwdXQoKSBjcmVhdGVDaGlsZFdvcmtJdGVtRXZlbnQgPSBuZXcgRXZlbnRFbWl0dGVyPE9wZW5Xb3JrRXZlbnQ+KCk7XG5cbiAgd29ya0lkIDogc3RyaW5nIDtcbiAgc2VsZWN0ZWRQYWdlOiBhbnk7XG4gIHNlbGVjdGVkQ2F0ZWdvcnkgOiBhbnk7XG4gIGxhYmVsczpzdHJpbmdbXSA9IFtdIDtcbiAgXG4gIEBWaWV3Q2hpbGRyZW4oRTVjb3JlVWlXb3JrUmVsYXRlZEl0ZW1zQmFzZUNvbXBvbmVudClcbiAgcHVibGljIHdvcmtSZWxhdGVkSXRlbXNDb21wb25lbnRzOiBRdWVyeUxpc3Q8RTVjb3JlVWlXb3JrUmVsYXRlZEl0ZW1zQmFzZUNvbXBvbmVudD47XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSB3b3JrSXRlbVNlcnZpY2U6IFdvcmtJdGVtU2VydmljZSxcbiAgICBwcml2YXRlIGZpZWxkRGVmaW5pdG9uU2VydmljZXM6IFRheG9ub215RmllbGREZWZpbml0aW9uU2VydmljZSxcbiAgICBwcml2YXRlIGNoYW5nZURldGVjdG9yUmVmOiBDaGFuZ2VEZXRlY3RvclJlZlxuICApIHsgfVxuXG4gIG5nT25Jbml0KCkge1xuICAgIGlmICh0eXBlb2YgdGhpcy53b3JrSXRlbSQgPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ2U1Y29yZS11aS13b3JrLXJlbGF0ZWQtaXRlbXMgW3dvcmtJdGVtJF0gbXVzdCBoYXZlIGEgQmVoYXZpb3JTdWJqZWN0PFdvcmtJdGVtTW9kZWw+Jyk7XG4gICAgICByZXR1cm4gO1xuICAgIH1cblxuICAgIGlmKHRoaXMuZmllbGRzVG9TaG93KSB7XG4gICAgICB0aGlzLmZpZWxkc1RvU2hvdy5mb3JFYWNoKGVsZW1lbnQgPT4ge1xuICAgICAgICB0aGlzLnNldExhYmVsKGVsZW1lbnQpO1xuICAgICAgfSk7ICBcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIHRoaXMud29ya0l0ZW0kICE9ICd1bmRlZmluZWQnKSB7XG4gICAgICB0aGlzLndvcmtJdGVtJC5zdWJzY3JpYmUoXG4gICAgICAgIHdpbSA9PiB7XG4gICAgICAgICAgaWYgKHdpbS53b3JrSWQgIT0gbnVsbCAmJiB3aW0ud29ya0lkICE9IEd1aWQuRU1QVFkpIHtcbiAgICAgICAgICAgIHRoaXMud29ya0lkID0gd2ltLndvcmtJZDtcblxuICAgICAgICAgICAgdGhpcy5wb3B1bGF0ZVdvcmtSZWxhdGVkSXRlbXModGhpcy53b3JrSWQpO1xuXG4gICAgICAgICAgICBpZiAodGhpcy5zaG93RGVmaW5lZENoaWxkcmVuT25seSlcbiAgICAgICAgICAgICAgdGhpcy5wb3B1bGF0ZVdvcmtDbGFzc0NoaWxkcmVuKHdpbS53b3JrSWQudG9TdHJpbmcoKSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICApXG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBzZXRMYWJlbChmaW5kRmllbGQgOiBLZXlWYWx1ZVBhaXIpIHtcbiAgICBpZiAoZmluZEZpZWxkLnZhbHVlID09IFwiXCIpIHtcbiAgICAgIHZhciBpbmRleCA9IHRoaXMubGFiZWxzLmxlbmd0aDtcbiAgICAgIHRoaXMubGFiZWxzW3RoaXMubGFiZWxzLmxlbmd0aF0gPSBcIlwiO1xuICAgICAgdGhpcy5maWVsZERlZmluaXRvblNlcnZpY2VzLmdldChmaW5kRmllbGQua2V5KS5zdWJzY3JpYmUoIFxuICAgICAgICBmZCA9PiB7XG4gICAgICAgICAgdGhpcy5sYWJlbHNbaW5kZXhdID0gZmQubGFiZWw7XG4gICAgICAgICAgdGhpcy5jaGFuZ2VEZXRlY3RvclJlZi5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgICAgIH0pIDtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5sYWJlbHNbdGhpcy5sYWJlbHMubGVuZ3RoXSA9IGZpbmRGaWVsZC52YWx1ZTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHBvcHVsYXRlV29ya0NsYXNzQ2hpbGRyZW4od2lkOiBzdHJpbmcpIHtcbiAgICB0aGlzLndvcmtJdGVtU2VydmljZS5nZXRXb3JrV29ya0NsYXNzQ2hpbGRyZW4od2lkKS5zdWJzY3JpYmUoXG4gICAgICBzID0+IHtcbiAgICAgICAgdGhpcy53b3JrUmVsYXRlZEl0ZW1zQ29tcG9uZW50cy5mb3JFYWNoKGVsZW1lbnQgPT4ge1xuICAgICAgICAgIGVsZW1lbnQuY2hpbGRXb3JrSXRlbUNhdGVnb3JpZXMgPSBzO1xuICAgICAgICB9KTtcbiAgICAgIH0sXG4gICAgICBlcnJvciA9PiB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoZXJyb3IpO1xuICAgICAgfVxuICAgIClcbiAgfVxuXG4gIHByaXZhdGUgcG9wdWxhdGVXb3JrUmVsYXRlZEl0ZW1zKHdpZDogc3RyaW5nKSB7XG4gICAgdGhpcy53b3JrSXRlbVNlcnZpY2UuZ2V0V29ya1JlbGF0ZWRJdGVtcyh3aWQsIHtcbiAgICAgIGZpbmRJZDogdGhpcy5maW5kSWQsXG4gICAgICBwYWdlU2l6ZTogdGhpcy5zZWxlY3RlZFBhZ2UucGFnZVNpemUsXG4gICAgICBwYWdlTm86IHRoaXMuc2VsZWN0ZWRQYWdlLnBhZ2VJbmRleCxcbiAgICAgIGRvU2VhcmNoRnJvbVJvb3Q6IHRydWVcbiAgICAgIH0pLnN1YnNjcmliZShcbiAgICAgIHMgPT4ge1xuICAgICAgICB2YXIgcm9vdE1vZGVsID0gdGhpcy5jb252ZXJ0VG9VaU1vZGVsKHMucmVsYXRlZEl0ZW1zKTtcbiAgICAgICAgdGhpcy53b3JrUmVsYXRlZEl0ZW1zQ29tcG9uZW50cy5mb3JFYWNoKGVsZW1lbnQgPT4ge1xuICAgICAgICAgIGVsZW1lbnQubGVuZ3RoID0gcy50b3RhbDtcbiAgICAgICAgICBlbGVtZW50LnRyZWVEYXRhID0gPFByaW1lVHJlZVRhYmxlTW9kZWxbXT5bcm9vdE1vZGVsXTtcbiAgICAgICAgICB0aGlzLmNoYW5nZURldGVjdG9yUmVmLmRldGVjdENoYW5nZXMoKTtcbiAgICAgICAgfSk7XG4gICAgICAgIFxuICAgICAgICB0aGlzLmNoYW5nZURldGVjdG9yUmVmLmRldGVjdENoYW5nZXMoKTtcbiAgICAgIH0sXG4gICAgICBlcnJvciA9PiB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoZXJyb3IpO1xuICAgICAgfVxuICAgIClcbiAgfVxuXG4gIHByaXZhdGUgY29udmVydFRvVWlNb2RlbChhcGlNb2RlbHM6IFdvcmtSZWxhdGVkSXRlbU1vZGVsW10pOiBQcmltZVRyZWVUYWJsZU1vZGVsIHtcbiAgICBpZighYXBpTW9kZWxzKVxuICAgICAgcmV0dXJuIDsgLy8gTm90aGluZyB0byBkb1xuICAgICAgXG4gICAgdmFyIGN1cnJlbnQgPSBhcGlNb2RlbHMuZmlsdGVyKHUgPT4gdS5pZCA9PSB0aGlzLndvcmtJZCk7XG5cbiAgICBpZiAoY3VycmVudC5sZW5ndGggPT0gMClcbiAgICAgIHJldHVybjtcblxuICAgICAgIFxuICAgIHZhciBwYXJlbnQgPSBhcGlNb2RlbHMuZmlsdGVyKHUgPT4gdS5pZCA9PSBjdXJyZW50WzBdLnBhcmVudElkKTtcbiAgICBcbiAgICBpZihjdXJyZW50WzBdLnBhcmVudElkPT1HdWlkLkVNUFRZKVxuICAgICAgcGFyZW50ID0gY3VycmVudDtcblxuICAgIHZhciBjaGlsZHJlbiA9IGFwaU1vZGVscy5maWx0ZXIodSA9PiB1LnBhcmVudElkID09IHRoaXMud29ya0lkKTtcblxuICAgIHZhciByb290TW9kZWwgPSBuZXcgUHJpbWVUcmVlVGFibGVNb2RlbCgpO1xuICAgIHJvb3RNb2RlbC5kYXRhLmlkID0gcGFyZW50WzBdLmlkO1xuICAgIHJvb3RNb2RlbC5kYXRhLmF0dGFjaG1lbnRDb3VudCA9IHBhcmVudFswXS5hdHRhY2htZW50Q291bnQ7XG4gICAgcm9vdE1vZGVsLmRhdGEucGFyZW50SWQgPSBwYXJlbnRbMF0ucGFyZW50SWQ7XG4gICAgcm9vdE1vZGVsLmV4cGFuZGVkID0gdHJ1ZTtcbiAgICB0aGlzLnBvcHVsYXRlRGF0YUZpZWxkcyhyb290TW9kZWwuZGF0YSwgcGFyZW50WzBdKTtcbiAgICB0aGlzLnByb2Nlc3NDaGlsZHJlbihyb290TW9kZWwsIGNoaWxkcmVuLCBhcGlNb2RlbHMpXG5cbiAgICByZXR1cm4gcm9vdE1vZGVsO1xuICB9XG5cbiAgcHJpdmF0ZSBwcm9jZXNzQ2hpbGRyZW4ocGFyZW50OiBQcmltZVRyZWVUYWJsZU1vZGVsLCBjaGlsZHJlbjogV29ya1JlbGF0ZWRJdGVtTW9kZWxbXSwgYXBpTW9kZWxzOiBXb3JrUmVsYXRlZEl0ZW1Nb2RlbFtdKSB7XG5cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgY2hpbGQgPSBjaGlsZHJlbltpXTtcbiAgICAgIHZhciBtb2RlbCA9IG5ldyBQcmltZVRyZWVUYWJsZU1vZGVsKCk7XG4gICAgICBtb2RlbC5kYXRhLmlkID0gY2hpbGQuaWQ7XG4gICAgICBtb2RlbC5kYXRhLmF0dGFjaG1lbnRDb3VudCA9IGNoaWxkLmF0dGFjaG1lbnRDb3VudDtcbiAgICAgIG1vZGVsLmRhdGEucGFyZW50SWQgPSBjaGlsZC5wYXJlbnRJZDtcblxuICAgICAgdGhpcy5wb3B1bGF0ZURhdGFGaWVsZHMobW9kZWwuZGF0YSwgY2hpbGQpO1xuICAgICAgcGFyZW50LmNoaWxkcmVuW3BhcmVudC5jaGlsZHJlbi5sZW5ndGhdID0gbW9kZWw7XG5cbiAgICAgIHZhciBtb3JlQ2hpbGRyZW4gPSBhcGlNb2RlbHMuZmlsdGVyKHUgPT4gdS5wYXJlbnRJZCA9PSBjaGlsZC5pZCk7XG5cbiAgICAgIGlmIChtb3JlQ2hpbGRyZW4ubGVuZ3RoID4gMCkge1xuICAgICAgICB0aGlzLnByb2Nlc3NDaGlsZHJlbihtb2RlbCwgbW9yZUNoaWxkcmVuLCBhcGlNb2RlbHMpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgcG9wdWxhdGVEYXRhRmllbGRzKG1vZGVsRGF0YTogVHJlZVRhYmxlRGF0YU1vZGVsLCBjaGlsZDogYW55KSB7XG4gICAgaWYoIXRoaXMuZmllbGRzVG9TaG93KSB7XG4gICAgICBtb2RlbERhdGEuZmllbGRWYWx1ZXMgPSBbXSA7XG4gICAgfSBlbHNlIHtcbiAgICAgIGZvcih2YXIgaSA9IDA7IGkgPCB0aGlzLmZpZWxkc1RvU2hvdy5sZW5ndGg7IGkrKykge1xuICAgICAgICB2YXIgZmluZEZpZWxkID0gdGhpcy5maWVsZHNUb1Nob3dbaV07XG4gICAgICAgIHZhciBmaWVsZCA9IGNoaWxkLmZpZWxkVmFsdWVzLmZpbHRlcih1ID0+IHUua2V5ID09IGZpbmRGaWVsZC5rZXkpO1xuICAgICAgICBpZiAoZmllbGQgPT0gbnVsbCB8fCBmaWVsZC5sZW5ndGggPT0gMCkge1xuICAgICAgICAgIGZpZWxkID0gW3trZXk6IGZpbmRGaWVsZC5rZXksIHZhbHVlOiBcIlwifV1cbiAgICAgICAgfVxuICBcbiAgICAgICAgdmFyIGtleVZhbHVlUGFpciA9IG5ldyBLZXlWYWx1ZVBhaXIoKTtcbiAgICAgICAga2V5VmFsdWVQYWlyLmtleSA9IGZpZWxkWzBdLmtleTtcbiAgICAgICAga2V5VmFsdWVQYWlyLnZhbHVlID0gZmllbGRbMF0udmFsdWU7XG4gICAgICAgIG1vZGVsRGF0YS5maWVsZFZhbHVlc1ttb2RlbERhdGEuZmllbGRWYWx1ZXMubGVuZ3RoXSA9IGtleVZhbHVlUGFpcjtcbiAgICAgIH0gIFxuICAgIH1cbiAgfVxuICBcbiAgbmdBZnRlclZpZXdJbml0KCkge1xuICB9XG5cbiAgcHVibGljIENyZWF0ZUNoaWxkV29ya0l0ZW0oc2VsZWN0ZWRDYXRlZ29yeSA6IGFueSkgOiB2b2lkIHtcbiAgICBpZighdGhpcy53b3JrSWQpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoXCJlNWNvcmUtdWktd29yay1yZWxhdGVkLWl0ZW1zIGhhcyBubyB3b3JrIGl0ZW0uXCIpIDtcbiAgICAgIHJldHVybiA7XG4gICAgfVxuXG4gICAgdmFyIHdvcmtJdGVtQ3JlYXRlTW9kZWwgPSB7XG4gICAgICAgICAgY2F0ZWdvcnkxSWQ6IHNlbGVjdGVkQ2F0ZWdvcnkuY2F0ZWdvcnkxSWQsXG4gICAgICAgICAgY2F0ZWdvcnkySWQ6IHNlbGVjdGVkQ2F0ZWdvcnkuY2F0ZWdvcnkySWQsXG4gICAgICAgICAgY2F0ZWdvcnkzSWQ6IHNlbGVjdGVkQ2F0ZWdvcnkuY2F0ZWdvcnkzSWQsXG4gICAgICAgICAgd29ya0l0ZW1GaWVsZHM6IFtcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgZmllbGRJZDogXCJQYXJlbnRfaWRcIixcbiAgICAgICAgICAgICAgZmllbGRWYWx1ZTogdGhpcy53b3JrSWQsXG4gICAgICAgICAgICAgIGZpZWxkVHlwZTogXCJHdWlkXCJcbiAgICAgICAgICAgIH1cbiAgICAgICAgICBdIFxuICAgICAgICB9O1xuXG4gICAgdGhpcy53b3JrSXRlbVNlcnZpY2UuY3JlYXRlKHdvcmtJdGVtQ3JlYXRlTW9kZWwpLnN1YnNjcmliZShcbiAgICAgIHMgPT4ge1xuICAgICAgICB0aGlzLmNyZWF0ZUNoaWxkV29ya0l0ZW1FdmVudC5lbWl0KHt3b3JrSWQ6IHMuaWQsIHJlZmVyZW5jZTogcy5yZWZlcmVuY2UsIHR5cGU6IFwicmVsYXRlZFwifSk7XG4gICAgICAgIHRoaXMucG9wdWxhdGVXb3JrUmVsYXRlZEl0ZW1zKHRoaXMud29ya0lkKTtcbiAgICAgIH0sXG4gICAgICBlcnJvciA9PiB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoZXJyb3IpO1xuICAgICAgfVxuICAgIClcbiAgfVxuXG4gIHB1YmxpYyBvbkNyZWF0ZUNoaWxkV29ya0l0ZW0oKSA6IHZvaWQge1xuICAgIHRoaXMuQ3JlYXRlQ2hpbGRXb3JrSXRlbSh0aGlzLnNlbGVjdGVkQ2F0ZWdvcnkpO1xuICB9XG5cbiAgcHVibGljIG9uQ2F0ZWdvcml6YXRpb25DaGFuZ2UoJGV2ZW50OiBDYXRlZ29yaXphdGlvbkNoYW5nZUV2ZW50KSA6IHZvaWQge1xuICAgIHRoaXMuc2VsZWN0ZWRDYXRlZ29yeSA9ICRldmVudDtcbiAgICB0aGlzLmNhdGVnb3Jpc2F0aW9uQ2hhbmdlRXZlbnQuZW1pdCgkZXZlbnQpO1xuICB9XG5cbiAgcHVibGljIG9uV29ya0l0ZW1TZWxlY3Qob3BlbldvcmtFdmVudCA6IE9wZW5Xb3JrRXZlbnQpIDogdm9pZCB7XG4gICAgdGhpcy53b3JrSXRlbVNlbGVjdEV2ZW50LmVtaXQob3BlbldvcmtFdmVudCk7XG4gIH1cblxuICBwdWJsaWMgb25BdHRhY2htZW50U2VsZWN0KHZpZXdlckRpc3BsYXlFdmVudCA6IFZpZXdlckRpc3BsYXlFdmVudCkgOiB2b2lkIHtcbiAgICB0aGlzLmF0dGFjaG1lbnRTZWxlY3RFdmVudC5lbWl0KHZpZXdlckRpc3BsYXlFdmVudCk7XG4gIH1cblxuICBwdWJsaWMgb25QYWdlRXZlbnQoZXZlbnQpIDogdm9pZCB7XG4gICAgdGhpcy5zZWxlY3RlZFBhZ2UgPSBldmVudDtcbiAgICBcbiAgICBpZiAodHlwZW9mIHRoaXMud29ya0lkICE9ICd1bmRlZmluZWQnICYmIHRoaXMud29ya0lkICE9IEd1aWQuRU1QVFkpIHtcbiAgICAgIHRoaXMucG9wdWxhdGVXb3JrUmVsYXRlZEl0ZW1zKHRoaXMud29ya0lkKTtcbiAgICB9XG4gIH1cbn1cbiJdfQ==