UNPKG

ngx-tree-dnd

Version:

Angular 7 support tree with drag-and-drop sortable data tree. It`s fast and smart.

341 lines 30.6 kB
/** * @fileoverview added by tsickle * @suppress {checkTypes,extraRequire,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc */ import * as tslib_1 from "tslib"; import { FormBuilder, Validators } from '@angular/forms'; /* 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, Output, EventEmitter } from '@angular/core'; import { NgxTreeService } from '../ngx-tree-dnd.service'; var NgxTreeParentComponent = /** @class */ (function () { function NgxTreeParentComponent(treeService, fb) { this.treeService = treeService; this.fb = fb; this.userConfig = { showActionButtons: true, showAddButtons: true, showRenameButtons: true, showDeleteButtons: true, showRootActionButtons: true, enableExpandButtons: true, enableDragging: true, rootTitle: 'Root', options: { edit: false }, validationText: 'Enter valid name', minCharacterLength: 1, setItemsAsLinks: false, setFontSize: 16, setIconSize: 14 }; this.ondragstart = new EventEmitter(); this.ondragenter = new EventEmitter(); this.ondragleave = new EventEmitter(); this.ondrop = new EventEmitter(); this.onallowdrop = new EventEmitter(); this.ondragend = new EventEmitter(); this.onadditem = new EventEmitter(); this.onStartRenameItem = new EventEmitter(); this.onFinishRenameItem = new EventEmitter(); this.onStartDeleteItem = new EventEmitter(); this.onFinishDeleteItem = new EventEmitter(); this.onCancelDeleteItem = new EventEmitter(); this.enableSubscribers(); this.createForm(); } Object.defineProperty(NgxTreeParentComponent.prototype, "config", { set: /** * @param {?} config * @return {?} */ function (config) { // seal config Object.seal(this.userConfig); try { // if config it`s pass this.setConfig(config); this.treeService.config.next(this.userConfig); } catch (error) { // if config invalid console.log('Config is invalid! Default configuragion will be appeared'); this.treeService.config.next(this.treeService.defaulConfig); } }, enumerable: true, configurable: true }); Object.defineProperty(NgxTreeParentComponent.prototype, "treeData", { set: /** * @param {?} item * @return {?} */ function (item) { // get user tree data this.getTreeData(item); }, enumerable: true, configurable: true }); // set user config // set user config /** * @param {?} config * @return {?} */ NgxTreeParentComponent.prototype.setConfig = // set user config /** * @param {?} config * @return {?} */ function (config) { var e_1, _a; try { for (var _b = tslib_1.__values(Object.keys(config)), _c = _b.next(); !_c.done; _c = _b.next()) { var key = _c.value; this.setValue(key, config); } } 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; } } this.renameForm.patchValue({ name: this.userConfig.rootTitle }); }; // set value to keys of config // set value to keys of config /** * @param {?} item * @param {?} config * @return {?} */ NgxTreeParentComponent.prototype.setValue = // set value to keys of config /** * @param {?} item * @param {?} config * @return {?} */ function (item, config) { this.userConfig[item] = config[item]; }; // subscribe to all events and emit them to user. // subscribe to all events and emit them to user. /** * @return {?} */ NgxTreeParentComponent.prototype.enableSubscribers = // subscribe to all events and emit them to user. /** * @return {?} */ function () { var _this = this; this.treeService.onDrop.subscribe(function (event) { _this.ondrop.emit(event); }); this.treeService.onDragStart.subscribe(function (event) { _this.ondragstart.emit(event); }); this.treeService.onAllowDrop.subscribe(function (event) { _this.onallowdrop.emit(event); }); this.treeService.onDragEnd.subscribe(function (event) { _this.ondragend.emit(event); }); this.treeService.onAddItem.subscribe(function (event) { _this.onadditem.emit(event); }); this.treeService.onStartRenameItem.subscribe(function (event) { _this.onStartRenameItem.emit(event); }); this.treeService.onFinishRenameItem.subscribe(function (event) { _this.onFinishRenameItem.emit(event); }); this.treeService.onStartDeleteItem.subscribe(function (event) { _this.onStartDeleteItem.emit(event); }); this.treeService.onFinishDeleteItem.subscribe(function (event) { _this.onFinishDeleteItem.emit(event); }); this.treeService.onCancelDeleteItem.subscribe(function (event) { _this.onCancelDeleteItem.emit(event); }); this.treeService.onDragEnter.subscribe(function (event) { _this.ondragenter.emit(event); }); this.treeService.onDragLeave.subscribe(function (event) { _this.ondragleave.emit(event); }); }; // get tree data from treeService. // get tree data from treeService. /** * @param {?} userTree * @return {?} */ NgxTreeParentComponent.prototype.getTreeData = // get tree data from treeService. /** * @param {?} userTree * @return {?} */ function (userTree) { var _this = this; this.treeService.getLocalData(userTree).subscribe(function (tree) { _this.treeView = tree; setTimeout(function () { _this.treeService.sortTree(); }); }, function (error) { console.log(error); }); }; // create edit form // create edit form /** * @return {?} */ NgxTreeParentComponent.prototype.createForm = // create edit form /** * @return {?} */ function () { this.renameForm = this.fb.group({ name: [this.userConfig.rootTitle || '', [ Validators.required, Validators.minLength(this.userConfig.minCharacterLength) ]], }); }; /** * @return {?} */ NgxTreeParentComponent.prototype.enableRootRenameMode = /** * @return {?} */ function () { this.userConfig.options.edit = true; }; /** * @param {?} name * @return {?} */ NgxTreeParentComponent.prototype.submitAdd = /** * @param {?} name * @return {?} */ function (name) { /** @type {?} */ var d = "" + new Date().getFullYear() + new Date().getDay() + new Date().getTime(); /** @type {?} */ var elemId = parseInt(d, null); this.treeService.addNewItem(elemId, name, null); }; /** * @return {?} */ NgxTreeParentComponent.prototype.submitRootRename = /** * @return {?} */ function () { if (this.renameForm.valid) { this.showError = false; this.userConfig.rootTitle = this.renameForm.value.name; this.userConfig.options.edit = false; } else { this.showError = true; } }; /** * @return {?} */ NgxTreeParentComponent.prototype.ngAfterViewInit = /** * @return {?} */ function () { }; NgxTreeParentComponent.decorators = [ { type: Component, args: [{ selector: 'lib-ngx-tree-component', template: "<div id='threeWrapper' *ngIf=\"treeView\" [style.font-size.px]='userConfig.setFontSize'>\n <div class='root-title d-inline-flex pos-relative' *ngIf=\"!userConfig.options.edit;else onEdit\">\n <div class='root-text'>\n {{userConfig.rootTitle}}\n </div>\n \n <div class='d-flex buttons-bar' *ngIf=\"userConfig.showActionButtons && userConfig.showRootActionButtons\">\n <div class='d-flex'>\n <button class=\"tree-btn add-btn\" *ngIf=\"userConfig.showAddButtons\" (click)=\"submitAdd(null)\">\n <fa-icon icon=\"plus\" [style.font-size.px]='userConfig.setIconSize'></fa-icon>\n </button>\n </div>\n <div class='d-flex'>\n <button class=\"tree-btn edit-btn\" *ngIf=\"userConfig.showRenameButtons\" (click)=\"enableRootRenameMode()\">\n <fa-icon icon=\"edit\" [style.font-size.px]='userConfig.setIconSize'></fa-icon>\n </button>\n </div>\n </div>\n </div>\n <ng-template #onEdit>\n <div class='d-inline-flex'>\n <form [formGroup]=\"renameForm\" class='d-flex' (submit)='submitRootRename()'>\n <input type=\"text\" class='input-rename' formControlName=\"name\" libAutoFocus=\"true\" [style.font-size.px]='userConfig.setFontSize'>\n </form>\n <div class='d-flex'>\n <button class='tree-btn submit-btn' (click)='submitRootRename()'>\n <fa-icon icon=\"check\" [style.font-size.px]='userConfig.setIconSize'></fa-icon>\n </button>\n <div class='error-edit-wrap' *ngIf=\"showError\">\n {{userConfig.validationText}}\n </div>\n </div>\n </div>\n </ng-template>\n <div class='tree-child'>\n <div class=\"tree-content-main\">\n <lib-ngx-tree-children [setItem]=\"clild\" *ngFor='let clild of treeView'></lib-ngx-tree-children>\n </div>\n </div>\n </div>" },] }, ]; /** @nocollapse */ NgxTreeParentComponent.ctorParameters = function () { return [ { type: NgxTreeService }, { type: FormBuilder } ]; }; NgxTreeParentComponent.propDecorators = { ondragstart: [{ type: Output }], ondragenter: [{ type: Output }], ondragleave: [{ type: Output }], ondrop: [{ type: Output }], onallowdrop: [{ type: Output }], ondragend: [{ type: Output }], onadditem: [{ type: Output }], onStartRenameItem: [{ type: Output }], onFinishRenameItem: [{ type: Output }], onStartDeleteItem: [{ type: Output }], onFinishDeleteItem: [{ type: Output }], onCancelDeleteItem: [{ type: Output }], config: [{ type: Input }], treeData: [{ type: Input }] }; return NgxTreeParentComponent; }()); export { NgxTreeParentComponent }; if (false) { /** @type {?} */ NgxTreeParentComponent.prototype.treeView; /** @type {?} */ NgxTreeParentComponent.prototype.userConfig; /** @type {?} */ NgxTreeParentComponent.prototype.showError; /** @type {?} */ NgxTreeParentComponent.prototype.renameForm; /** @type {?} */ NgxTreeParentComponent.prototype.ondragstart; /** @type {?} */ NgxTreeParentComponent.prototype.ondragenter; /** @type {?} */ NgxTreeParentComponent.prototype.ondragleave; /** @type {?} */ NgxTreeParentComponent.prototype.ondrop; /** @type {?} */ NgxTreeParentComponent.prototype.onallowdrop; /** @type {?} */ NgxTreeParentComponent.prototype.ondragend; /** @type {?} */ NgxTreeParentComponent.prototype.onadditem; /** @type {?} */ NgxTreeParentComponent.prototype.onStartRenameItem; /** @type {?} */ NgxTreeParentComponent.prototype.onFinishRenameItem; /** @type {?} */ NgxTreeParentComponent.prototype.onStartDeleteItem; /** @type {?} */ NgxTreeParentComponent.prototype.onFinishDeleteItem; /** @type {?} */ NgxTreeParentComponent.prototype.onCancelDeleteItem; /** @type {?} */ NgxTreeParentComponent.prototype.treeService; /** * @type {?} * @private */ NgxTreeParentComponent.prototype.fb; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmd4LXRyZWUtZG5kLXBhcmVudC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9uZ3gtdHJlZS1kbmQvIiwic291cmNlcyI6WyJsaWIvbmd4LXRyZWUtZG5kLXBhcmVudC9uZ3gtdHJlZS1kbmQtcGFyZW50LmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFBLE9BQU8sRUFBRSxXQUFXLEVBQUUsVUFBVSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7Ozs7OztBQU16RCxPQUFPLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsWUFBWSxFQUFpQixNQUFNLGVBQWUsQ0FBQztBQUV0RixPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFHekQ7SUFtR0UsZ0NBQW1CLFdBQTJCLEVBQVUsRUFBZTtRQUFwRCxnQkFBVyxHQUFYLFdBQVcsQ0FBZ0I7UUFBVSxPQUFFLEdBQUYsRUFBRSxDQUFhO1FBdER2RSxlQUFVLEdBQWU7WUFDckIsaUJBQWlCLEVBQUUsSUFBSTtZQUN2QixjQUFjLEVBQUUsSUFBSTtZQUNwQixpQkFBaUIsRUFBRSxJQUFJO1lBQ3ZCLGlCQUFpQixFQUFFLElBQUk7WUFDdkIscUJBQXFCLEVBQUUsSUFBSTtZQUMzQixtQkFBbUIsRUFBRSxJQUFJO1lBQ3pCLGNBQWMsRUFBRSxJQUFJO1lBQ3BCLFNBQVMsRUFBRSxNQUFNO1lBQ2pCLE9BQU8sRUFBRTtnQkFDUCxJQUFJLEVBQUUsS0FBSzthQUNaO1lBQ0QsY0FBYyxFQUFFLGtCQUFrQjtZQUNsQyxrQkFBa0IsRUFBRSxDQUFDO1lBQ3JCLGVBQWUsRUFBRSxLQUFLO1lBQ3RCLFdBQVcsRUFBRSxFQUFFO1lBQ2YsV0FBVyxFQUFFLEVBQUU7U0FDaEIsQ0FBQztRQUdNLGdCQUFXLEdBQXNCLElBQUksWUFBWSxFQUFFLENBQUM7UUFDcEQsZ0JBQVcsR0FBc0IsSUFBSSxZQUFZLEVBQUUsQ0FBQztRQUNwRCxnQkFBVyxHQUFzQixJQUFJ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Q04sTUFBTTs0QkFDTixNQUFNO29DQUNOLE1BQU07cUNBQ04sTUFBTTtvQ0FDTixNQUFNO3FDQUNOLE1BQU07cUNBQ04sTUFBTTt5QkFFTixLQUFLOzJCQWVMLEtBQUs7O0lBd0lSLDZCQUFDO0NBQUEsQUFyT0QsSUFxT0M7U0ExTFksc0JBQXNCOzs7SUFDakMsMENBQXNCOztJQUN0Qiw0Q0FpQkk7O0lBQ0osMkNBQW1COztJQUNuQiw0Q0FBVzs7SUFDWCw2Q0FBOEQ7O0lBQzlELDZDQUE4RDs7SUFDOUQsNkNBQThEOztJQUM5RCx3Q0FBeUQ7O0lBQ3pELDZDQUE4RDs7SUFDOUQsMkNBQTREOztJQUM1RCwyQ0FBNEQ7O0lBQzVELG1EQUFvRTs7SUFDcEUsb0RBQXFFOztJQUNyRSxtREFBb0U7O0lBQ3BFLG9EQUFxRTs7SUFDckUsb0RBQXFFOztJQXVCekQsNkNBQWtDOzs7OztJQUFFLG9DQUF1QiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEZvcm1CdWlsZGVyLCBWYWxpZGF0b3JzIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuLypcbiBDb3B5cmlnaHQgKEMpIDIwMTggWWFyb3NsYXYgS2lrb3RcbiBUaGlzIHByb2plY3QgaXMgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBNSVQgbGljZW5zZS5cbiBodHRwczovL2dpdGh1Yi5jb20vWmljcmFlbC9uZ3gtdHJlZS1kbmRcbiAqL1xuaW1wb3J0IHsgQ29tcG9uZW50LCBJbnB1dCwgT3V0cHV0LCBFdmVudEVtaXR0ZXIsIEFmdGVyVmlld0luaXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuaW1wb3J0IHsgTmd4VHJlZVNlcnZpY2UgfSBmcm9tICcuLi9uZ3gtdHJlZS1kbmQuc2VydmljZSc7XG5pbXBvcnQgeyBUcmVlTW9kZWwsIFRyZWVDb25maWcgfSBmcm9tICcuLi9tb2RlbHMvdHJlZS12aWV3Lm1vZGVsJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnbGliLW5neC10cmVlLWNvbXBvbmVudCcsXG4gIHRlbXBsYXRlOiBgPGRpdiBpZD0ndGhyZWVXcmFwcGVyJyAqbmdJZj1cInRyZWVWaWV3XCIgW3N0eWxlLmZvbnQtc2l6ZS5weF09J3VzZXJDb25maWcuc2V0Rm9udFNpemUnPlxuICAgIDxkaXYgY2xhc3M9J3Jvb3QtdGl0bGUgZC1pbmxpbmUtZmxleCBwb3MtcmVsYXRpdmUnICpuZ0lmPVwiIXVzZXJDb25maWcub3B0aW9ucy5lZGl0O2Vsc2Ugb25FZGl0XCI+XG4gICAgICA8ZGl2IGNsYXNzPSdyb290LXRleHQnPlxuICAgICAgICB7e3VzZXJDb25maWcucm9vdFRpdGxlfX1cbiAgICAgIDwvZGl2PlxuICAgICAgXG4gICAgICA8ZGl2IGNsYXNzPSdkLWZsZXggYnV0dG9ucy1iYXInICpuZ0lmPVwidXNlckNvbmZpZy5zaG93QWN0aW9uQnV0dG9ucyAmJiB1c2VyQ29uZmlnLnNob3dSb290QWN0aW9uQnV0dG9uc1wiPlxuICAgICAgICA8ZGl2IGNsYXNzPSdkLWZsZXgnPlxuICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJ0cmVlLWJ0biBhZGQtYnRuXCIgKm5nSWY9XCJ1c2VyQ29uZmlnLnNob3dBZGRCdXR0b25zXCIgKGNsaWNrKT1cInN1Ym1pdEFkZChudWxsKVwiPlxuICAgICAgICAgICAgPGZhLWljb24gaWNvbj1cInBsdXNcIiBbc3R5bGUuZm9udC1zaXplLnB4XT0ndXNlckNvbmZpZy5zZXRJY29uU2l6ZSc+PC9mYS1pY29uPlxuICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz0nZC1mbGV4Jz5cbiAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwidHJlZS1idG4gZWRpdC1idG5cIiAqbmdJZj1cInVzZXJDb25maWcuc2hvd1JlbmFtZUJ1dHRvbnNcIiAoY2xpY2spPVwiZW5hYmxlUm9vdFJlbmFtZU1vZGUoKVwiPlxuICAgICAgICAgICAgPGZhLWljb24gaWNvbj1cImVkaXRcIiBbc3R5bGUuZm9udC1zaXplLnB4XT0ndXNlckNvbmZpZy5zZXRJY29uU2l6ZSc+PC9mYS1pY29uPlxuICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICAgIDxuZy10ZW1wbGF0ZSAjb25FZGl0PlxuICAgICAgPGRpdiBjbGFzcz0nZC1pbmxpbmUtZmxleCc+XG4gICAgICAgIDxmb3JtIFtmb3JtR3JvdXBdPVwicmVuYW1lRm9ybVwiIGNsYXNzPSdkLWZsZXgnIChzdWJtaXQpPSdzdWJtaXRSb290UmVuYW1lKCknPlxuICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIGNsYXNzPSdpbnB1dC1yZW5hbWUnIGZvcm1Db250cm9sTmFtZT1cIm5hbWVcIiBsaWJBdXRvRm9jdXM9XCJ0cnVlXCIgW3N0eWxlLmZvbnQtc2l6ZS5weF09J3VzZXJDb25maWcuc2V0Rm9udFNpemUnPlxuICAgICAgICA8L2Zvcm0+XG4gICAgICAgIDxkaXYgY2xhc3M9J2QtZmxleCc+XG4gICAgICAgICAgPGJ1dHRvbiBjbGFzcz0ndHJlZS1idG4gc3VibWl0LWJ0bicgKGNsaWNrKT0nc3VibWl0Um9vdFJlbmFtZSgpJz5cbiAgICAgICAgICAgIDxmYS1pY29uIGljb249XCJjaGVja1wiIFtzdHlsZS5mb250LXNpemUucHhdPSd1c2VyQ29uZmlnLnNldEljb25TaXplJz48L2ZhLWljb24+XG4gICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgPGRpdiBjbGFzcz0nZXJyb3ItZWRpdC13cmFwJyAqbmdJZj1cInNob3dFcnJvclwiPlxuICAgICAgICAgICAge3t1c2VyQ29uZmlnLnZhbGlkYXRpb25UZXh0fX1cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICA8L25nLXRlbXBsYXRlPlxuICAgIDxkaXYgY2xhc3M9J3RyZWUtY2hpbGQnPlxuICAgICAgPGRpdiBjbGFzcz1cInRyZWUtY29udGVudC1tYWluXCI+XG4gICAgICAgICAgPGxpYi1uZ3gtdHJlZS1jaGlsZHJlbiBbc2V0SXRlbV09XCJjbGlsZFwiICpuZ0Zvcj0nbGV0IGNsaWxkIG9mIHRyZWVWaWV3Jz48L2xpYi1uZ3gtdHJlZS1jaGlsZHJlbj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICA8L2Rpdj5gXG59KVxuZXhwb3J0IGNsYXNzIE5neFRyZWVQYXJlbnRDb21wb25lbnQgaW1wbGVtZW50cyBBZnRlclZpZXdJbml0IHtcbiAgdHJlZVZpZXc6IFRyZWVNb2RlbFtdO1xuICB1c2VyQ29uZmlnOiBUcmVlQ29uZmlnID0ge1xuICAgICAgc2hvd0FjdGlvbkJ1dHRvbnM6IHRydWUsXG4gICAgICBzaG93QWRkQnV0dG9uczogdHJ1ZSxcbiAgICAgIHNob3dSZW5hbWVCdXR0b25zOiB0cnVlLFxuICAgICAgc2hvd0RlbGV0ZUJ1dHRvbnM6IHRydWUsXG4gICAgICBzaG93Um9vdEFjdGlvbkJ1dHRvbnM6IHRydWUsXG4gICAgICBlbmFibGVFeHBhbmRCdXR0b25zOiB0cnVlLFxuICAgICAgZW5hYmxlRHJhZ2dpbmc6IHRydWUsXG4gICAgICByb290VGl0bGU6ICdSb290JyxcbiAgICAgIG9wdGlvbnM6IHtcbiAgICAgICAgZWRpdDogZmFsc2VcbiAgICAgIH0sXG4gICAgICB2YWxpZGF0aW9uVGV4dDogJ0VudGVyIHZhbGlkIG5hbWUnLFxuICAgICAgbWluQ2hhcmFjdGVyTGVuZ3RoOiAxLFxuICAgICAgc2V0SXRlbXNBc0xpbmtzOiBmYWxzZSxcbiAgICAgIHNldEZvbnRTaXplOiAxNixcbiAgICAgIHNldEljb25TaXplOiAxNFxuICAgIH07XG4gIHNob3dFcnJvcjogYm9vbGVhbjtcbiAgcmVuYW1lRm9ybTtcbiAgQE91dHB1dCgpIG9uZHJhZ3N0YXJ0OiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgQE91dHB1dCgpIG9uZHJhZ2VudGVyOiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgQE91dHB1dCgpIG9uZHJhZ2xlYXZlOiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgQE91dHB1dCgpIG9uZHJvcDogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG4gIEBPdXRwdXQoKSBvbmFsbG93ZHJvcDogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG4gIEBPdXRwdXQoKSBvbmRyYWdlbmQ6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICBAT3V0cHV0KCkgb25hZGRpdGVtOiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgQE91dHB1dCgpIG9uU3RhcnRSZW5hbWVJdGVtOiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgQE91dHB1dCgpIG9uRmluaXNoUmVuYW1lSXRlbTogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG4gIEBPdXRwdXQoKSBvblN0YXJ0RGVsZXRlSXRlbTogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG4gIEBPdXRwdXQoKSBvbkZpbmlzaERlbGV0ZUl0ZW06IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICBAT3V0cHV0KCkgb25DYW5jZWxEZWxldGVJdGVtOiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcblxuICBASW5wdXQoKVxuICBzZXQgY29uZmlnKGNvbmZpZzogVHJlZUNvbmZpZykge1xuICAgIC8vIHNlYWwgY29uZmlnXG4gICAgT2JqZWN0LnNlYWwodGhpcy51c2VyQ29uZmlnKTtcbiAgICB0cnkge1xuICAgICAgLy8gaWYgY29uZmlnIGl0YHMgcGFzc1xuICAgICAgdGhpcy5zZXRDb25maWcoY29uZmlnKTtcbiAgICAgIHRoaXMudHJlZVNlcnZpY2UuY29uZmlnLm5leHQodGhpcy51c2VyQ29uZmlnKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgLy8gaWYgY29uZmlnIGludmFsaWRcbiAgICAgIGNvbnNvbGUubG9nKCdDb25maWcgaXMgaW52YWxpZCEgRGVmYXVsdCBjb25maWd1cmFnaW9uIHdpbGwgYmUgYXBwZWFyZWQnKTtcbiAgICAgIHRoaXMudHJlZVNlcnZpY2UuY29uZmlnLm5leHQodGhpcy50cmVlU2VydmljZS5kZWZhdWxDb25maWcpO1xuICAgIH1cbiAgfVxuXG4gIEBJbnB1dCgpXG4gIHNldCB0cmVlRGF0YShpdGVtOiBUcmVlTW9kZWxbXSkge1xuICAgIC8vIGdldCB1c2VyIHRyZWUgZGF0YVxuICAgICAgdGhpcy5nZXRUcmVlRGF0YShpdGVtKTtcbiAgfVxuXG4gIGNvbnN0cnVjdG9yKHB1YmxpYyB0cmVlU2VydmljZTogTmd4VHJlZVNlcnZpY2UsIHByaXZhdGUgZmI6IEZvcm1CdWlsZGVyICkge1xuICAgIHRoaXMuZW5hYmxlU3Vic2NyaWJlcnMoKTtcbiAgICB0aGlzLmNyZWF0ZUZvcm0oKTtcbiAgfVxuXG4gIC8vIHNldCB1c2VyIGNvbmZpZ1xuICBzZXRDb25maWcoY29uZmlnKSB7XG4gICAgZm9yIChjb25zdCBrZXkgb2YgT2JqZWN0LmtleXMoY29uZmlnKSkge1xuICAgICAgdGhpcy5zZXRWYWx1ZShrZXksIGNvbmZpZyk7XG4gICAgfVxuICAgIHRoaXMucmVuYW1lRm9ybS5wYXRjaFZhbHVlKHtcbiAgICAgIG5hbWU6IHRoaXMudXNlckNvbmZpZy5yb290VGl0bGVcbiAgICB9KTtcbiAgfVxuICAvLyBzZXQgdmFsdWUgdG8ga2V5cyBvZiBjb25maWdcbiAgc2V0VmFsdWUoaXRlbSwgY29uZmlnKSB7XG4gICAgdGhpcy51c2VyQ29uZmlnW2l0ZW1dID0gY29uZmlnW2l0ZW1dO1xuICB9XG5cbiAgLy8gc3Vic2NyaWJlIHRvIGFsbCBldmVudHMgYW5kIGVtaXQgdGhlbSB0byB1c2VyLlxuICBlbmFibGVTdWJzY3JpYmVycygpIHtcbiAgICB0aGlzLnRyZWVTZXJ2aWNlLm9uRHJvcC5zdWJzY3JpYmUoXG4gICAgICAoZXZlbnQpID0+IHtcbiAgICAgICAgdGhpcy5vbmRyb3AuZW1pdChldmVudCk7XG4gICAgICB9XG4gICAgKTtcbiAgICB0aGlzLnRyZWVTZXJ2aWNlLm9uRHJhZ1N0YXJ0LnN1YnNjcmliZShcbiAgICAgIChldmVudCkgPT4ge1xuICAgICAgICB0aGlzLm9uZHJhZ3N0YXJ0LmVtaXQoZXZlbnQpO1xuICAgICAgfVxuICAgICk7XG4gICAgdGhpcy50cmVlU2VydmljZS5vbkFsbG93RHJvcC5zdWJzY3JpYmUoXG4gICAgICAoZXZlbnQpID0+IHtcbiAgICAgICAgdGhpcy5vbmFsbG93ZHJvcC5lbWl0KGV2ZW50KTtcbiAgICAgIH1cbiAgICApO1xuICAgIHRoaXMudHJlZVNlcnZpY2Uub25EcmFnRW5kLnN1YnNjcmliZShcbiAgICAgIChldmVudCkgPT4ge1xuICAgICAgICB0aGlzLm9uZHJhZ2VuZC5lbWl0KGV2ZW50KTtcbiAgICAgIH1cbiAgICApO1xuICAgIHRoaXMudHJlZVNlcnZpY2Uub25BZGRJdGVtLnN1YnNjcmliZShcbiAgICAgIChldmVudCkgPT4ge1xuICAgICAgICB0aGlzLm9uYWRkaXRlbS5lbWl0KGV2ZW50KTtcbiAgICAgIH1cbiAgICApO1xuICAgIHRoaXMudHJlZVNlcnZpY2Uub25TdGFydFJlbmFtZUl0ZW0uc3Vic2NyaWJlKFxuICAgICAgKGV2ZW50KSA9PiB7XG4gICAgICAgIHRoaXMub25TdGFydFJlbmFtZUl0ZW0uZW1pdChldmVudCk7XG4gICAgICB9XG4gICAgKTtcbiAgICB0aGlzLnRyZWVTZXJ2aWNlLm9uRmluaXNoUmVuYW1lSXRlbS5zdWJzY3JpYmUoXG4gICAgICAoZXZlbnQpID0+IHtcbiAgICAgICAgdGhpcy5vbkZpbmlzaFJlbmFtZUl0ZW0uZW1pdChldmVudCk7XG4gICAgICB9XG4gICAgKTtcbiAgICB0aGlzLnRyZWVTZXJ2aWNlLm9uU3RhcnREZWxldGVJdGVtLnN1YnNjcmliZShcbiAgICAgIChldmVudCkgPT4ge1xuICAgICAgICB0aGlzLm9uU3RhcnREZWxldGVJdGVtLmVtaXQoZXZlbnQpO1xuICAgICAgfVxuICAgICk7XG4gICAgdGhpcy50cmVlU2VydmljZS5vbkZpbmlzaERlbGV0ZUl0ZW0uc3Vic2NyaWJlKFxuICAgICAgKGV2ZW50KSA9PiB7XG4gICAgICAgIHRoaXMub25GaW5pc2hEZWxldGVJdGVtLmVtaXQoZXZlbnQpO1xuICAgICAgfVxuICAgICk7XG4gICAgdGhpcy50cmVlU2VydmljZS5vbkNhbmNlbERlbGV0ZUl0ZW0uc3Vic2NyaWJlKFxuICAgICAgKGV2ZW50KSA9PiB7XG4gICAgICAgIHRoaXMub25DYW5jZWxEZWxldGVJdGVtLmVtaXQoZXZlbnQpO1xuICAgICAgfVxuICAgICk7XG4gICAgdGhpcy50cmVlU2VydmljZS5vbkRyYWdFbnRlci5zdWJzY3JpYmUoXG4gICAgICAoZXZlbnQpID0+IHtcbiAgICAgICAgdGhpcy5vbmRyYWdlbnRlci5lbWl0KGV2ZW50KTtcbiAgICAgIH1cbiAgICApO1xuICAgIHRoaXMudHJlZVNlcnZpY2Uub25EcmFnTGVhdmUuc3Vic2NyaWJlKFxuICAgICAgKGV2ZW50KSA9PiB7XG4gICAgICAgIHRoaXMub25kcmFnbGVhdmUuZW1pdChldmVudCk7XG4gICAgICB9XG4gICAgKTtcbiAgfVxuXG4gIC8vIGdldCB0cmVlIGRhdGEgZnJvbSB0cmVlU2VydmljZS5cbiAgZ2V0VHJlZURhdGEodXNlclRyZWUpIHtcbiAgICB0aGlzLnRyZWVTZXJ2aWNlLmdldExvY2FsRGF0YSh1c2VyVHJlZSkuc3Vic2NyaWJlKFxuICAgICAgKHRyZWU6IFRyZWVNb2RlbFtdKSA9PiB7XG4gICAgICAgIHRoaXMudHJlZVZpZXcgPSB0cmVlO1xuICAgICAgICBzZXRUaW1lb3V0KCAoKSA9PiB7XG4gICAgICAgICAgdGhpcy50cmVlU2VydmljZS5zb3J0VHJlZSgpO1xuICAgICAgICB9KTtcbiAgICAgIH0sIChlcnJvcikgPT4ge1xuICAgICAgICBjb25zb2xlLmxvZyhlcnJvcik7XG4gICAgICB9XG4gICAgKTtcbiAgfVxuXG4gIC8vIGNyZWF0ZSBlZGl0IGZvcm1cbiAgY3JlYXRlRm9ybSgpIHtcbiAgICB0aGlzLnJlbmFtZUZvcm0gPSB0aGlzLmZiLmdyb3VwKHtcbiAgICAgIG5hbWU6IFt0aGlzLnVzZXJDb25maWcucm9vdFRpdGxlIHx8ICcnLCBbXG4gICAgICAgIFZhbGlkYXRvcnMucmVxdWlyZWQsXG4gICAgICAgIFZhbGlkYXRvcnMubWluTGVuZ3RoKHRoaXMudXNlckNvbmZpZy5taW5DaGFyYWN0ZXJMZW5ndGgpXG4gICAgICBdXSxcbiAgICB9KTtcbiAgfVxuXG4gIGVuYWJsZVJvb3RSZW5hbWVNb2RlKCkge1xuICAgIHRoaXMudXNlckNvbmZpZy5vcHRpb25zLmVkaXQgPSB0cnVlO1xuICB9XG5cbiAgc3VibWl0QWRkKG5hbWUpIHtcbiAgICBjb25zdCBkID0gYCR7bmV3IERhdGUoKS5nZXRGdWxsWWVhcigpfSR7bmV3IERhdGUoKS5nZXREYXkoKX0ke25ldyBEYXRlKCkuZ2V0VGltZSgpfWA7XG4gICAgY29uc3QgZWxlbUlkID0gcGFyc2VJbnQoZCwgbnVsbCk7XG4gICAgdGhpcy50cmVlU2VydmljZS5hZGROZXdJdGVtKGVsZW1JZCwgbmFtZSwgbnVsbCk7XG4gIH1cblxuICBzdWJtaXRSb290UmVuYW1lKCkge1xuICAgIGlmICh0aGlzLnJlbmFtZUZvcm0udmFsaWQpIHtcbiAgICAgIHRoaXMuc2hvd0Vycm9yID0gZmFsc2U7XG4gICAgICB0aGlzLnVzZXJDb25maWcucm9vdFRpdGxlID0gdGhpcy5yZW5hbWVGb3JtLnZhbHVlLm5hbWU7XG4gICAgICB0aGlzLnVzZXJDb25maWcub3B0aW9ucy5lZGl0ID0gZmFsc2U7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuc2hvd0Vycm9yID0gdHJ1ZTtcbiAgICB9XG4gIH1cblxuICBuZ0FmdGVyVmlld0luaXQoKSB7fVxuXG5cbn0iXX0=