ngx-tree-dnd
Version:
Angular 7 support tree with drag-and-drop sortable data tree. It`s fast and smart.
338 lines • 30.5 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
import * as tslib_1 from "tslib";
/*
Copyright (C) 2018 Yaroslav Kikot
This project is licensed under the terms of the MIT license.
https://github.com/Zicrael/ngx-tree-dnd
*/
import { Component, Input } from '@angular/core';
import { FormBuilder, Validators } from '@angular/forms';
import { NgxTreeService } from '../ngx-tree-dnd.service';
var NgxTreeChildrenComponent = /** @class */ (function () {
function NgxTreeChildrenComponent(treeService, fb) {
this.treeService = treeService;
this.fb = fb;
}
Object.defineProperty(NgxTreeChildrenComponent.prototype, "setItem", {
// get item from parent component
set:
// get item from parent component
/**
* @param {?} data
* @return {?}
*/
function (data) {
this.element = data;
this.itemOptions = {
href: '#',
hidden: false,
hideChildrens: false,
position: this.treeService.getItemPosition(this.element),
draggable: true,
edit: false,
showActionButtons: true,
currentlyDragging: false,
destenationTop: false,
destenationBottom: false,
disabled: false,
showExpandButton: true,
showDeleteButton: true
};
if (this.element.options) {
this.setOptions(this.element.options);
this.element.options = this.itemOptions;
}
else {
this.element.options = this.itemOptions;
}
// enable subscribers
this.enableSubscribers();
// create form
this.createForm();
},
enumerable: true,
configurable: true
});
// enable subscribe to config
// enable subscribe to config
/**
* @return {?}
*/
NgxTreeChildrenComponent.prototype.enableSubscribers =
// enable subscribe to config
/**
* @return {?}
*/
function () {
var _this = this;
this.treeService.config.subscribe(function (config) {
if (config !== null) {
_this.config = config;
}
else {
_this.config = _this.treeService.defaulConfig;
}
if (_this.element.options.draggable) {
_this.element.options.draggable = _this.config.enableDragging;
}
});
};
// set options to item
// set options to item
/**
* @param {?} options
* @return {?}
*/
NgxTreeChildrenComponent.prototype.setOptions =
// set options to item
/**
* @param {?} options
* @return {?}
*/
function (options) {
var e_1, _a;
try {
for (var _b = tslib_1.__values(Object.keys(options)), _c = _b.next(); !_c.done; _c = _b.next()) {
var key = _c.value;
this.setValue(key, options);
}
}
catch (e_1_1) { e_1 = { error: e_1_1 }; }
finally {
try {
if (_c && !_c.done && (_a = _b.return)) _a.call(_b);
}
finally { if (e_1) throw e_1.error; }
}
};
// set value to options keys
// set value to options keys
/**
* @param {?} item
* @param {?} options
* @return {?}
*/
NgxTreeChildrenComponent.prototype.setValue =
// set value to options keys
/**
* @param {?} item
* @param {?} options
* @return {?}
*/
function (item, options) {
this.itemOptions[item] = options[item];
};
// create edit form
// create edit form
/**
* @return {?}
*/
NgxTreeChildrenComponent.prototype.createForm =
// create edit form
/**
* @return {?}
*/
function () {
this.renameForm = this.fb.group({
name: [this.element.name || '', [
Validators.required,
Validators.minLength(this.config.minCharacterLength)
]],
});
};
/*
Event: onStartRenameItem;
Enable rename mode in element
Call onStartRenameItem() from tree service.
*/
/*
Event: onStartRenameItem;
Enable rename mode in element
Call onStartRenameItem() from tree service.
*/
/**
* @param {?} element
* @return {?}
*/
NgxTreeChildrenComponent.prototype.enableRenameMode = /*
Event: onStartRenameItem;
Enable rename mode in element
Call onStartRenameItem() from tree service.
*/
/**
* @param {?} element
* @return {?}
*/
function (element) {
element.options.edit = true;
this.treeService.startRenameItem(element);
};
/*
Event: onadditem;
Generate id by new Date() by 'full year + day + time'.
Call addNewItem() from tree service.
*/
/*
Event: onadditem;
Generate id by new Date() by 'full year + day + time'.
Call addNewItem() from tree service.
*/
/**
* @param {?} name
* @param {?} item
* @return {?}
*/
NgxTreeChildrenComponent.prototype.submitAdd = /*
Event: onadditem;
Generate id by new Date() by 'full year + day + time'.
Call addNewItem() from tree service.
*/
/**
* @param {?} name
* @param {?} item
* @return {?}
*/
function (name, item) {
/** @type {?} */
var d = "" + new Date().getFullYear() + new Date().getDay() + new Date().getTime();
/** @type {?} */
var elemId = parseInt(d, null);
this.treeService.addNewItem(elemId, name, item);
this.element.options.hideChildrens = false;
};
/*
Event: onFinishRenameItem;
Check is form valid.
Call addNewItem() from tree service.
*/
/*
Event: onFinishRenameItem;
Check is form valid.
Call addNewItem() from tree service.
*/
/**
* @param {?} item
* @return {?}
*/
NgxTreeChildrenComponent.prototype.submitRename = /*
Event: onFinishRenameItem;
Check is form valid.
Call addNewItem() from tree service.
*/
/**
* @param {?} item
* @return {?}
*/
function (item) {
if (this.renameForm.valid) {
this.showError = false;
this.treeService.finishRenameItem(this.renameForm.value.name, item.id);
this.element.options.edit = false;
}
else {
this.showError = true;
}
};
/*
Events:
onStartDeleteItem,
onFinishDeleteItem,
onCancelDeleteItem.
Check is item edit, then if name empty delete item.
Call deleteItem() from tree service.
*/
/*
Events:
onStartDeleteItem,
onFinishDeleteItem,
onCancelDeleteItem.
Check is item edit, then if name empty delete item.
Call deleteItem() from tree service.
*/
/**
* @param {?} item
* @return {?}
*/
NgxTreeChildrenComponent.prototype.onSubmitDelete = /*
Events:
onStartDeleteItem,
onFinishDeleteItem,
onCancelDeleteItem.
Check is item edit, then if name empty delete item.
Call deleteItem() from tree service.
*/
/**
* @param {?} item
* @return {?}
*/
function (item) {
if (!this.element.options.edit) {
this.treeService.deleteItem(item.id);
}
else {
if (item.name === null) {
this.treeService.deleteItem(item.id);
}
else {
this.element.options.edit = false;
}
}
};
// after view init
// after view init
/**
* @return {?}
*/
NgxTreeChildrenComponent.prototype.ngAfterViewInit =
// after view init
/**
* @return {?}
*/
function () { };
NgxTreeChildrenComponent.decorators = [
{ type: Component, args: [{
selector: 'lib-ngx-tree-children',
template: "<div class='tree-child' id={{element.id}} libDragElement [draggableValue]='element.options.draggable' [item]='element' [ngClass]=\"{disabled : element.options.disabled}\">\n <div *ngIf=\"element && element.options\" class='d-flex'>\n <div *ngIf='config' [ngClass]=\"{hidden : element.options.hidden}\">\n <div class='tree-title d-inline-flex pos-relative' [ngClass]=\"{destenationTop : element.options.destenationTop, destenationBottom: element.options.destenationBottom}\" *ngIf=\"!element.options.edit;else onEdit\">\n <div *ngIf=\"!config.setItemsAsLinks; else link\" [ngClass]=\"{addOpacity : element.options.currentlyDragging}\" libDropElement\n [item]='element' class='draggable-item'>\n {{element.name}}\n </div>\n <ng-template #link>\n <div [ngClass]=\"{addOpacity : element.options.currentlyDragging}\" libDropElement\n [item]='element' class='draggable-item'>\n <a [href]=\"element.options.href\" class='tree-link'>{{element.name}}</a>\n </div>\n </ng-template>\n <div class='d-flex buttons-bar' *ngIf=\"config.showActionButtons && element.options.showActionButtons && !element.options.disabled\">\n <div class='d-flex'>\n <button class=\"tree-btn add-btn\" *ngIf=\"config.showAddButtons\" (click)=\"submitAdd(null, element)\">\n <fa-icon icon=\"plus\" [style.font-size.px]='config.setIconSize'></fa-icon>\n </button>\n </div>\n <div class='d-flex'>\n <button class=\"tree-btn edit-btn\" *ngIf=\"config.showRenameButtons\" (click)=\"enableRenameMode(element)\">\n <fa-icon icon=\"edit\" [style.font-size.px]='config.setIconSize'></fa-icon>\n </button>\n </div>\n <div class='d-flex'>\n <button class=\"tree-btn delete-btn\" *ngIf=\"config.showDeleteButtons && element.options.showDeleteButton\" (click)=\"onSubmitDelete( element )\">\n <fa-icon icon=\"times\" [style.font-size.px]='config.setIconSize'></fa-icon>\n </button>\n </div>\n </div>\n <div class='child-drop-place' [attr.data-id]='element.id' libDropElement *ngIf='element.options.showDropChildZone && !element.options.disabled'>\n <fa-icon icon=\"arrow-down\" [style.font-size.px]='config.setIconSize'></fa-icon>\n </div>\n <div class='show-hide-switch' *ngIf=\"config.enableExpandButtons && element.options.showExpandButton && element.childrens.length > 0 && !element.options.disabled\">\n <div *ngIf=\"element.options.hideChildrens; else visible\">\n <button class='tree-btn show-btn' (click)='element.options.hideChildrens = false'>\n <fa-icon icon=\"plus\" [style.font-size.px]='config.setIconSize'></fa-icon>\n </button>\n </div>\n <ng-template #visible>\n <button class='tree-btn hide-btn' (click)='element.options.hideChildrens = true'>\n <fa-icon icon=\"minus\" [style.font-size.px]='config.setIconSize'></fa-icon>\n </button>\n </ng-template>\n </div>\n </div>\n <ng-template #onEdit>\n <div class='tree-title d-inline-flex'>\n <form [formGroup]=\"renameForm\" class='d-flex' (submit)='submitRename(element)'>\n <input type=\"text\" class='input-rename' formControlName=\"name\" libAutoFocus=\"true\" [style.font-size.px]='config.setFontSize'>\n </form>\n <div class='d-flex'>\n <button class='tree-btn submit-btn' (click)='submitRename(element)'>\n <fa-icon icon=\"check\" [style.font-size.px]='config.setIconSize'></fa-icon>\n </button>\n <button class='tree-btn delete-btn' (click)='onSubmitDelete(element)'>\n <fa-icon icon=\"times\" [style.font-size.px]='config.setIconSize'></fa-icon>\n </button>\n <div class='error-edit-wrap' *ngIf=\"showError\">\n {{config.validationText}}\n </div>\n </div>\n </div>\n </ng-template>\n <div class=\"tree-content\" *ngIf=\"element.childrens && !element.options.hideChildrens\">\n <lib-ngx-tree-children [setItem]=\"child\" *ngFor='let child of element.childrens'></lib-ngx-tree-children>\n </div>\n </div>\n </div>\n</div>\n"
},] },
];
/** @nocollapse */
NgxTreeChildrenComponent.ctorParameters = function () { return [
{ type: NgxTreeService },
{ type: FormBuilder }
]; };
NgxTreeChildrenComponent.propDecorators = {
setItem: [{ type: Input }]
};
return NgxTreeChildrenComponent;
}());
export { NgxTreeChildrenComponent };
if (false) {
/** @type {?} */
NgxTreeChildrenComponent.prototype.showError;
/** @type {?} */
NgxTreeChildrenComponent.prototype.config;
/** @type {?} */
NgxTreeChildrenComponent.prototype.element;
/** @type {?} */
NgxTreeChildrenComponent.prototype.dragable;
/** @type {?} */
NgxTreeChildrenComponent.prototype.itemOptions;
/** @type {?} */
NgxTreeChildrenComponent.prototype.childrensArray;
/** @type {?} */
NgxTreeChildrenComponent.prototype.renameForm;
/**
* @type {?}
* @private
*/
NgxTreeChildrenComponent.prototype.treeService;
/**
* @type {?}
* @private
*/
NgxTreeChildrenComponent.prototype.fb;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmd4LXRyZWUtZG5kLWNoaWxkcmVuLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiJuZzovL25neC10cmVlLWRuZC8iLCJzb3VyY2VzIjpbImxpYi9uZ3gtdHJlZS1kbmQtY2hpbGRyZW4vbmd4LXRyZWUtZG5kLWNoaWxkcmVuLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7O0FBTUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQWlCLE1BQU0sZUFBZSxDQUFDO0FBQ2hFLE9BQU8sRUFBRSxXQUFXLEVBQUUsVUFBVSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFFekQsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBR3pEO0lBb0hFLGtDQUFvQixXQUEyQixFQUFVLEVBQWU7UUFBcEQsZ0JBQVcsR0FBWCxXQUFXLENBQWdCO1FBQVUsT0FBRSxHQUFGLEVBQUUsQ0FBYTtJQUFHLENBQUM7SUEvQjVFLHNCQUNJLDZDQUFPO1FBRlgsaUNBQWlDOzs7Ozs7O1FBQ2pDLFVBQ1ksSUFBZTtZQUN6QixJQUFJLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQztZQUNwQixJQUFJLENBQUMsV0FBVyxHQUFHO2dCQUNqQixJQUFJLEVBQUUsR0FBRztnQkFDVCxNQUFNLEVBQUUsS0FBSztnQkFDYixhQUFhLEVBQUUsS0FBSztnQkFDcEIsUUFBUSxFQUFFLElBQUksQ0FBQyxXQUFXLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUM7Z0JBQ3hELFNBQVMsRUFBRSxJQUFJO2dCQUNmLElBQUksRUFBRSxLQUFLO2dCQUNYLGlCQUFpQixFQUFFLElBQUk7Z0JBQ3ZCLGlCQUFpQixFQUFFLEtBQUs7Z0JBQ3hCLGNBQWMsRUFBRSxLQUFLO2dCQUNyQixpQkFBaUIsRUFBRSxLQUFLO2dCQUN4QixRQUFRLEVBQUUsS0FBSztnQkFDZixnQkFBZ0IsRUFBRSxJQUFJO2dCQUN0QixnQkFBZ0IsRUFBRSxJQUFJO2FBQ3ZC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Y0FBbUIsQ0FBQzs7Z0JBdE5yQixTQUFTLFNBQUM7b0JBQ1QsUUFBUSxFQUFFLHVCQUF1QjtvQkFDakMsUUFBUSxFQUFFLHd3SUF1RVg7aUJBQ0E7Ozs7Z0JBN0VRLGNBQWM7Z0JBRmQsV0FBVzs7OzBCQTBGakIsS0FBSzs7SUFrSVIsK0JBQUM7Q0FBQSxBQXZORCxJQXVOQztTQTVJWSx3QkFBd0I7OztJQUNuQyw2Q0FBbUI7O0lBQ25CLDBDQUFtQjs7SUFDbkIsMkNBQW1COztJQUNuQiw0Q0FBa0I7O0lBQ2xCLCtDQUE2Qjs7SUFDN0Isa0RBQTRCOztJQUM1Qiw4Q0FBVzs7Ozs7SUFrQ0MsK0NBQW1DOzs7OztJQUFFLHNDQUF1QiIsInNvdXJjZXNDb250ZW50IjpbIi8qXG4gQ29weXJpZ2h0IChDKSAyMDE4IFlhcm9zbGF2IEtpa290XG4gVGhpcyBwcm9qZWN0IGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgTUlUIGxpY2Vuc2UuXG4gaHR0cHM6Ly9naXRodWIuY29tL1ppY3JhZWwvbmd4LXRyZWUtZG5kXG4gKi9cblxuaW1wb3J0IHsgQ29tcG9uZW50LCBJbnB1dCwgQWZ0ZXJWaWV3SW5pdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgRm9ybUJ1aWxkZXIsIFZhbGlkYXRvcnMgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5cbmltcG9ydCB7IE5neFRyZWVTZXJ2aWNlIH0gZnJvbSAnLi4vbmd4LXRyZWUtZG5kLnNlcnZpY2UnO1xuaW1wb3J0IHsgVHJlZU1vZGVsLCBUcmVlQ29uZmlnLCBUcmVlSXRlbU9wdGlvbnMgfSBmcm9tICcuLi9tb2RlbHMvdHJlZS12aWV3Lm1vZGVsJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnbGliLW5neC10cmVlLWNoaWxkcmVuJyxcbiAgdGVtcGxhdGU6IGA8ZGl2IGNsYXNzPSd0cmVlLWNoaWxkJyBpZD17e2VsZW1lbnQuaWR9fSBsaWJEcmFnRWxlbWVudCBbZHJhZ2dhYmxlVmFsdWVdPSdlbGVtZW50Lm9wdGlvbnMuZHJhZ2dhYmxlJyBbaXRlbV09J2VsZW1lbnQnIFtuZ0NsYXNzXT1cIntkaXNhYmxlZCA6IGVsZW1lbnQub3B0aW9ucy5kaXNhYmxlZH1cIj5cbiAgPGRpdiAqbmdJZj1cImVsZW1lbnQgJiYgZWxlbWVudC5vcHRpb25zXCIgY2xhc3M9J2QtZmxleCc+XG4gICAgPGRpdiAqbmdJZj0nY29uZmlnJyBbbmdDbGFzc109XCJ7aGlkZGVuIDogZWxlbWVudC5vcHRpb25zLmhpZGRlbn1cIj5cbiAgICAgIDxkaXYgY2xhc3M9J3RyZWUtdGl0bGUgZC1pbmxpbmUtZmxleCBwb3MtcmVsYXRpdmUnIFtuZ0NsYXNzXT1cIntkZXN0ZW5hdGlvblRvcCA6IGVsZW1lbnQub3B0aW9ucy5kZXN0ZW5hdGlvblRvcCwgZGVzdGVuYXRpb25Cb3R0b206IGVsZW1lbnQub3B0aW9ucy5kZXN0ZW5hdGlvbkJvdHRvbX1cIiAqbmdJZj1cIiFlbGVtZW50Lm9wdGlvbnMuZWRpdDtlbHNlIG9uRWRpdFwiPlxuICAgICAgICA8ZGl2ICpuZ0lmPVwiIWNvbmZpZy5zZXRJdGVtc0FzTGlua3M7IGVsc2UgbGlua1wiIFtuZ0NsYXNzXT1cInthZGRPcGFjaXR5IDogZWxlbWVudC5vcHRpb25zLmN1cnJlbnRseURyYWdnaW5nfVwiIGxpYkRyb3BFbGVtZW50XG4gICAgICAgICAgW2l0ZW1dPSdlbGVtZW50JyBjbGFzcz0nZHJhZ2dhYmxlLWl0ZW0nPlxuICAgICAgICAgIHt7ZWxlbWVudC5uYW1lfX1cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxuZy10ZW1wbGF0ZSAjbGluaz5cbiAgICAgICAgICA8ZGl2IFtuZ0NsYXNzXT1cInthZGRPcGFjaXR5IDogZWxlbWVudC5vcHRpb25zLmN1cnJlbnRseURyYWdnaW5nfVwiIGxpYkRyb3BFbGVtZW50XG4gICAgICAgICAgW2l0ZW1dPSdlbGVtZW50JyBjbGFzcz0nZHJhZ2dhYmxlLWl0ZW0nPlxuICAgICAgICAgICAgPGEgW2hyZWZdPVwiZWxlbWVudC5vcHRpb25zLmhyZWZcIiBjbGFzcz0ndHJlZS1saW5rJz57e2VsZW1lbnQubmFtZX19PC9hPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICA8ZGl2IGNsYXNzPSdkLWZsZXggYnV0dG9ucy1iYXInICpuZ0lmPVwiY29uZmlnLnNob3dBY3Rpb25CdXR0b25zICYmIGVsZW1lbnQub3B0aW9ucy5zaG93QWN0aW9uQnV0dG9ucyAmJiAhZWxlbWVudC5vcHRpb25zLmRpc2FibGVkXCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz0nZC1mbGV4Jz5cbiAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJ0cmVlLWJ0biBhZGQtYnRuXCIgKm5nSWY9XCJjb25maWcuc2hvd0FkZEJ1dHRvbnNcIiAoY2xpY2spPVwic3VibWl0QWRkKG51bGwsIGVsZW1lbnQpXCI+XG4gICAgICAgICAgICAgIDxmYS1pY29uIGljb249XCJwbHVzXCIgW3N0eWxlLmZvbnQtc2l6ZS5weF09J2NvbmZpZy5zZXRJY29uU2l6ZSc+PC9mYS1pY29uPlxuICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPGRpdiBjbGFzcz0nZC1mbGV4Jz5cbiAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJ0cmVlLWJ0biBlZGl0LWJ0blwiICpuZ0lmPVwiY29uZmlnLnNob3dSZW5hbWVCdXR0b25zXCIgKGNsaWNrKT1cImVuYWJsZVJlbmFtZU1vZGUoZWxlbWVudClcIj5cbiAgICAgICAgICAgICAgPGZhLWljb24gaWNvbj1cImVkaXRcIiBbc3R5bGUuZm9udC1zaXplLnB4XT0nY29uZmlnLnNldEljb25TaXplJz48L2ZhLWljb24+XG4gICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPSdkLWZsZXgnPlxuICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cInRyZWUtYnRuIGRlbGV0ZS1idG5cIiAqbmdJZj1cImNvbmZpZy5zaG93RGVsZXRlQnV0dG9ucyAmJiBlbGVtZW50Lm9wdGlvbnMuc2hvd0RlbGV0ZUJ1dHRvblwiIChjbGljayk9XCJvblN1Ym1pdERlbGV0ZSggZWxlbWVudCApXCI+XG4gICAgICAgICAgICAgIDxmYS1pY29uIGljb249XCJ0aW1lc1wiIFtzdHlsZS5mb250LXNpemUucHhdPSdjb25maWcuc2V0SWNvblNpemUnPjwvZmEtaWNvbj5cbiAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz0nY2hpbGQtZHJvcC1wbGFjZScgW2F0dHIuZGF0YS1pZF09J2VsZW1lbnQuaWQnICBsaWJEcm9wRWxlbWVudCAqbmdJZj0nZWxlbWVudC5vcHRpb25zLnNob3dEcm9wQ2hpbGRab25lICYmICFlbGVtZW50Lm9wdGlvbnMuZGlzYWJsZWQnPlxuICAgICAgICAgIDxmYS1pY29uIGljb249XCJhcnJvdy1kb3duXCIgW3N0eWxlLmZvbnQtc2l6ZS5weF09J2NvbmZpZy5zZXRJY29uU2l6ZSc+PC9mYS1pY29uPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz0nc2hvdy1oaWRlLXN3aXRjaCcgKm5nSWY9XCJjb25maWcuZW5hYmxlRXhwYW5kQnV0dG9ucyAmJiBlbGVtZW50Lm9wdGlvbnMuc2hvd0V4cGFuZEJ1dHRvbiAmJiBlbGVtZW50LmNoaWxkcmVucy5sZW5ndGggPiAwICYmICFlbGVtZW50Lm9wdGlvbnMuZGlzYWJsZWRcIj5cbiAgICAgICAgICA8ZGl2ICpuZ0lmPVwiZWxlbWVudC5vcHRpb25zLmhpZGVDaGlsZHJlbnM7IGVsc2UgdmlzaWJsZVwiPlxuICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz0ndHJlZS1idG4gc2hvdy1idG4nIChjbGljayk9J2VsZW1lbnQub3B0aW9ucy5oaWRlQ2hpbGRyZW5zID0gZmFsc2UnPlxuICAgICAgICAgICAgICA8ZmEtaWNvbiBpY29uPVwicGx1c1wiIFtzdHlsZS5mb250LXNpemUucHhdPSdjb25maWcuc2V0SWNvblNpemUnPjwvZmEtaWNvbj5cbiAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjdmlzaWJsZT5cbiAgICAgICAgICAgIDxidXR0b24gY2xhc3M9J3RyZWUtYnRuIGhpZGUtYnRuJyAoY2xpY2spPSdlbGVtZW50Lm9wdGlvbnMuaGlkZUNoaWxkcmVucyA9IHRydWUnPlxuICAgICAgICAgICAgICA8ZmEtaWNvbiBpY29uPVwibWludXNcIiBbc3R5bGUuZm9udC1zaXplLnB4XT0nY29uZmlnLnNldEljb25TaXplJz48L2ZhLWljb24+XG4gICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgICAgPG5nLXRlbXBsYXRlICNvbkVkaXQ+XG4gICAgICAgIDxkaXYgY2xhc3M9J3RyZWUtdGl0bGUgZC1pbmxpbmUtZmxleCc+XG4gICAgICAgICAgPGZvcm0gW2Zvcm1Hcm91cF09XCJyZW5hbWVGb3JtXCIgY2xhc3M9J2QtZmxleCcgKHN1Ym1pdCk9J3N1Ym1pdFJlbmFtZShlbGVtZW50KSc+XG4gICAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBjbGFzcz0naW5wdXQtcmVuYW1lJyBmb3JtQ29udHJvbE5hbWU9XCJuYW1lXCIgbGliQXV0b0ZvY3VzPVwidHJ1ZVwiIFtzdHlsZS5mb250LXNpemUucHhdPSdjb25maWcuc2V0Rm9udFNpemUnPlxuICAgICAgICAgIDwvZm9ybT5cbiAgICAgICAgICA8ZGl2IGNsYXNzPSdkLWZsZXgnPlxuICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz0ndHJlZS1idG4gc3VibWl0LWJ0bicgKGNsaWNrKT0nc3VibWl0UmVuYW1lKGVsZW1lbnQpJz5cbiAgICAgICAgICAgICAgPGZhLWljb24gaWNvbj1cImNoZWNrXCIgW3N0eWxlLmZvbnQtc2l6ZS5weF09J2NvbmZpZy5zZXRJY29uU2l6ZSc+PC9mYS1pY29uPlxuICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICA8YnV0dG9uIGNsYXNzPSd0cmVlLWJ0biBkZWxldGUtYnRuJyAoY2xpY2spPSdvblN1Ym1pdERlbGV0ZShlbGVtZW50KSc+XG4gICAgICAgICAgICAgIDxmYS1pY29uIGljb249XCJ0aW1lc1wiIFtzdHlsZS5mb250LXNpemUucHhdPSdjb25maWcuc2V0SWNvblNpemUnPjwvZmEtaWNvbj5cbiAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz0nZXJyb3ItZWRpdC13cmFwJyAqbmdJZj1cInNob3dFcnJvclwiPlxuICAgICAgICAgICAgICB7e2NvbmZpZy52YWxpZGF0aW9uVGV4dH19XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgPGRpdiBjbGFzcz1cInRyZWUtY29udGVudFwiICpuZ0lmPVwiZWxlbWVudC5jaGlsZHJlbnMgJiYgIWVsZW1lbnQub3B0aW9ucy5oaWRlQ2hpbGRyZW5zXCI+XG4gICAgICAgIDxsaWItbmd4LXRyZWUtY2hpbGRyZW4gW3NldEl0ZW1dPVwiY2hpbGRcIiAqbmdGb3I9J2xldCBjaGlsZCBvZiBlbGVtZW50LmNoaWxkcmVucyc+PC9saWItbmd4LXRyZWUtY2hpbGRyZW4+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG48L2Rpdj5cbmBcbn0pXG5leHBvcnQgY2xhc3MgTmd4VHJlZUNoaWxkcmVuQ29tcG9uZW50IGltcGxlbWVudHMgQWZ0ZXJWaWV3SW5pdCB7XG4gIHNob3dFcnJvcjogYm9vbGVhbjtcbiAgY29uZmlnOiBUcmVlQ29uZmlnO1xuICBlbGVtZW50OiBUcmVlTW9kZWw7XG4gIGRyYWdhYmxlOiBib29sZWFuO1xuICBpdGVtT3B0aW9uczogVHJlZUl0ZW1PcHRpb25zO1xuICBjaGlsZHJlbnNBcnJheTogVHJlZU1vZGVsW107XG4gIHJlbmFtZUZvcm07XG5cbiAgLy8gZ2V0IGl0ZW0gZnJvbSBwYXJlbnQgY29tcG9uZW50XG4gIEBJbnB1dCgpXG4gIHNldCBzZXRJdGVtKGRhdGE6IFRyZWVNb2RlbCkge1xuICAgIHRoaXMuZWxlbWVudCA9IGRhdGE7XG4gICAgdGhpcy5pdGVtT3B0aW9ucyA9IHtcbiAgICAgIGhyZWY6ICcjJyxcbiAgICAgIGhpZGRlbjogZmFsc2UsXG4gICAgICBoaWRlQ2hpbGRyZW5zOiBmYWxzZSxcbiAgICAgIHBvc2l0aW9uOiB0aGlzLnRyZWVTZXJ2aWNlLmdldEl0ZW1Qb3NpdGlvbih0aGlzLmVsZW1lbnQpLFxuICAgICAgZHJhZ2dhYmxlOiB0cnVlLFxuICAgICAgZWRpdDogZmFsc2UsXG4gICAgICBzaG93QWN0aW9uQnV0dG9uczogdHJ1ZSxcbiAgICAgIGN1cnJlbnRseURyYWdnaW5nOiBmYWxzZSxcbiAgICAgIGRlc3RlbmF0aW9uVG9wOiBmYWxzZSxcbiAgICAgIGRlc3RlbmF0aW9uQm90dG9tOiBmYWxzZSxcbiAgICAgIGRpc2FibGVkOiBmYWxzZSxcbiAgICAgIHNob3dFeHBhbmRCdXR0b246IHRydWUsXG4gICAgICBzaG93RGVsZXRlQnV0dG9uOiB0cnVlXG4gICAgfTtcbiAgICBpZiAodGhpcy5lbGVtZW50Lm9wdGlvbnMpIHtcbiAgICAgIHRoaXMuc2V0T3B0aW9ucyh0aGlzLmVsZW1lbnQub3B0aW9ucyk7XG4gICAgICB0aGlzLmVsZW1lbnQub3B0aW9ucyA9IHRoaXMuaXRlbU9wdGlvbnM7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuZWxlbWVudC5vcHRpb25zID0gdGhpcy5pdGVtT3B0aW9ucztcbiAgICB9XG5cbiAgICAvLyBlbmFibGUgc3Vic2NyaWJlcnNcbiAgICB0aGlzLmVuYWJsZVN1YnNjcmliZXJzKCk7XG4gICAgLy8gY3JlYXRlIGZvcm1cbiAgICB0aGlzLmNyZWF0ZUZvcm0oKTtcbiAgfVxuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgdHJlZVNlcnZpY2U6IE5neFRyZWVTZXJ2aWNlLCBwcml2YXRlIGZiOiBGb3JtQnVpbGRlcikge31cblxuICAvLyBlbmFibGUgc3Vic2NyaWJlIHRvIGNvbmZpZ1xuICBlbmFibGVTdWJzY3JpYmVycygpIHtcbiAgICB0aGlzLnRyZWVTZXJ2aWNlLmNvbmZpZy5zdWJzY3JpYmUoXG4gICAgICAoY29uZmlnKSA9PiB7XG4gICAgICAgIGlmICggY29uZmlnICE9PSBudWxsICkge1xuICAgICAgICAgIHRoaXMuY29uZmlnID0gY29uZmlnO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMuY29uZmlnID0gdGhpcy50cmVlU2VydmljZS5kZWZhdWxDb25maWc7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuZWxlbWVudC5vcHRpb25zLmRyYWdnYWJsZSkge1xuICAgICAgICAgIHRoaXMuZWxlbWVudC5vcHRpb25zLmRyYWdnYWJsZSA9IHRoaXMuY29uZmlnLmVuYWJsZURyYWdnaW5nO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgKTtcbiAgfVxuXG4gIC8vIHNldCBvcHRpb25zIHRvIGl0ZW1cbiAgc2V0T3B0aW9ucyhvcHRpb25zKSB7XG4gICAgZm9yIChjb25zdCBrZXkgb2YgT2JqZWN0LmtleXMob3B0aW9ucykpIHtcbiAgICAgIHRoaXMuc2V0VmFsdWUoa2V5LCBvcHRpb25zKTtcbiAgICB9XG4gIH1cblxuICAvLyBzZXQgdmFsdWUgdG8gb3B0aW9ucyBrZXlzXG4gIHNldFZhbHVlKGl0ZW0sIG9wdGlvbnMpIHtcbiAgICB0aGlzLml0ZW1PcHRpb25zW2l0ZW1dID0gb3B0aW9uc1tpdGVtXTtcbiAgfVxuXG4gIC8vIGNyZWF0ZSBlZGl0IGZvcm1cbiAgY3JlYXRlRm9ybSgpIHtcbiAgICB0aGlzLnJlbmFtZUZvcm0gPSB0aGlzLmZiLmdyb3VwKHtcbiAgICAgIG5hbWU6IFt0aGlzLmVsZW1lbnQubmFtZSB8fCAnJyAsIFtcbiAgICAgICAgVmFsaWRhdG9ycy5yZXF1aXJlZCxcbiAgICAgICAgVmFsaWRhdG9ycy5taW5MZW5ndGgoIHRoaXMuY29uZmlnLm1pbkNoYXJhY3Rlckxlbmd0aCApXG4gICAgICBdXSxcbiAgICB9KTtcbiAgfVxuXG4gIC8qXG4gICAgRXZlbnQ6IG9uU3RhcnRSZW5hbWVJdGVtO1xuICAgIEVuYWJsZSByZW5hbWUgbW9kZSBpbiBlbGVtZW50XG4gICAgQ2FsbCBvblN0YXJ0UmVuYW1lSXRlbSgpIGZyb20gdHJlZSBzZXJ2aWNlLlxuICAqL1xuICBlbmFibGVSZW5hbWVNb2RlKGVsZW1lbnQpIHtcbiAgICBlbGVtZW50Lm9wdGlvbnMuZWRpdCA9IHRydWU7XG4gICAgdGhpcy50cmVlU2VydmljZS5zdGFydFJlbmFtZUl0ZW0oZWxlbWVudCk7XG4gIH1cblxuICAvKlxuICAgIEV2ZW50OiBvbmFkZGl0ZW07XG4gICAgR2VuZXJhdGUgaWQgYnkgbmV3IERhdGUoKSBieSAnZnVsbCB5ZWFyICsgZGF5ICsgdGltZScuXG4gICAgQ2FsbCBhZGROZXdJdGVtKCkgZnJvbSB0cmVlIHNlcnZpY2UuXG4gICovXG4gIHN1Ym1pdEFkZChuYW1lLCBpdGVtICkge1xuICAgICAgY29uc3QgZCA9IGAke25ldyBEYXRlKCkuZ2V0RnVsbFllYXIoKX0ke25ldyBEYXRlKCkuZ2V0RGF5KCl9JHtuZXcgRGF0ZSgpLmdldFRpbWUoKX1gO1xuICAgICAgY29uc3QgZWxlbUlkID0gIHBhcnNlSW50KGQsIG51bGwpO1xuICAgICAgdGhpcy50cmVlU2VydmljZS5hZGROZXdJdGVtKGVsZW1JZCwgbmFtZSwgaXRlbSk7XG4gICAgICB0aGlzLmVsZW1lbnQub3B0aW9ucy5oaWRlQ2hpbGRyZW5zID0gZmFsc2U7XG4gIH1cblxuICAvKlxuICAgIEV2ZW50OiBvbkZpbmlzaFJlbmFtZUl0ZW07XG4gICAgQ2hlY2sgaXMgZm9ybSB2YWxpZC5cbiAgICBDYWxsIGFkZE5ld0l0ZW0oKSBmcm9tIHRyZWUgc2VydmljZS5cbiAgKi9cbiAgc3VibWl0UmVuYW1lKGl0ZW0pIHtcbiAgICBpZiAodGhpcy5yZW5hbWVGb3JtLnZhbGlkKSB7XG4gICAgICB0aGlzLnNob3dFcnJvciA9IGZhbHNlO1xuICAgICAgdGhpcy50cmVlU2VydmljZS5maW5pc2hSZW5hbWVJdGVtKHRoaXMucmVuYW1lRm9ybS52YWx1ZS5uYW1lLCBpdGVtLmlkKTtcbiAgICAgIHRoaXMuZWxlbWVudC5vcHRpb25zLmVkaXQgPSBmYWxzZTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5zaG93RXJyb3IgPSB0cnVlO1xuICAgIH1cbiAgfVxuXG4gIC8qXG4gICAgRXZlbnRzOlxuICAgIG9uU3RhcnREZWxldGVJdGVtLFxuICAgIG9uRmluaXNoRGVsZXRlSXRlbSwgICAgXG4gICAgb25DYW5jZWxEZWxldGVJdGVtLlxuICAgIENoZWNrIGlzIGl0ZW0gZWRpdCwgdGhlbiBpZiBuYW1lIGVtcHR5IGRlbGV0ZSBpdGVtLlxuICAgIENhbGwgZGVsZXRlSXRlbSgpIGZyb20gdHJlZSBzZXJ2aWNlLlxuICAqL1xuICBvblN1Ym1pdERlbGV0ZShpdGVtKSB7XG4gICAgaWYgKCF0aGlzLmVsZW1lbnQub3B0aW9ucy5lZGl0KSB7XG4gICAgICB0aGlzLnRyZWVTZXJ2aWNlLmRlbGV0ZUl0ZW0oaXRlbS5pZCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmICggaXRlbS5uYW1lID09PSBudWxsICkge1xuICAgICAgICB0aGlzLnRyZWVTZXJ2aWNlLmRlbGV0ZUl0ZW0oaXRlbS5pZCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmVsZW1lbnQub3B0aW9ucy5lZGl0ID0gZmFsc2U7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLy8gYWZ0ZXIgdmlldyBpbml0XG4gIG5nQWZ0ZXJWaWV3SW5pdCgpIHt9XG59XG4iXX0=