UNPKG

ngx-tree-dnd

Version:

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

313 lines (312 loc) 28.1 kB
/** * @fileoverview added by tsickle * @suppress {checkTypes,extraRequire,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc */ 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'; export class NgxTreeParentComponent { /** * @param {?} treeService * @param {?} fb */ constructor(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(); } /** * @param {?} config * @return {?} */ set config(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); } } /** * @param {?} item * @return {?} */ set treeData(item) { // get user tree data this.getTreeData(item); } // set user config /** * @param {?} config * @return {?} */ setConfig(config) { for (const key of Object.keys(config)) { this.setValue(key, config); } this.renameForm.patchValue({ name: this.userConfig.rootTitle }); } // set value to keys of config /** * @param {?} item * @param {?} config * @return {?} */ setValue(item, config) { this.userConfig[item] = config[item]; } // subscribe to all events and emit them to user. /** * @return {?} */ enableSubscribers() { this.treeService.onDrop.subscribe((event) => { this.ondrop.emit(event); }); this.treeService.onDragStart.subscribe((event) => { this.ondragstart.emit(event); }); this.treeService.onAllowDrop.subscribe((event) => { this.onallowdrop.emit(event); }); this.treeService.onDragEnd.subscribe((event) => { this.ondragend.emit(event); }); this.treeService.onAddItem.subscribe((event) => { this.onadditem.emit(event); }); this.treeService.onStartRenameItem.subscribe((event) => { this.onStartRenameItem.emit(event); }); this.treeService.onFinishRenameItem.subscribe((event) => { this.onFinishRenameItem.emit(event); }); this.treeService.onStartDeleteItem.subscribe((event) => { this.onStartDeleteItem.emit(event); }); this.treeService.onFinishDeleteItem.subscribe((event) => { this.onFinishDeleteItem.emit(event); }); this.treeService.onCancelDeleteItem.subscribe((event) => { this.onCancelDeleteItem.emit(event); }); this.treeService.onDragEnter.subscribe((event) => { this.ondragenter.emit(event); }); this.treeService.onDragLeave.subscribe((event) => { this.ondragleave.emit(event); }); } // get tree data from treeService. /** * @param {?} userTree * @return {?} */ getTreeData(userTree) { this.treeService.getLocalData(userTree).subscribe((tree) => { this.treeView = tree; setTimeout(() => { this.treeService.sortTree(); }); }, (error) => { console.log(error); }); } // create edit form /** * @return {?} */ createForm() { this.renameForm = this.fb.group({ name: [this.userConfig.rootTitle || '', [ Validators.required, Validators.minLength(this.userConfig.minCharacterLength) ]], }); } /** * @return {?} */ enableRootRenameMode() { this.userConfig.options.edit = true; } /** * @param {?} name * @return {?} */ submitAdd(name) { /** @type {?} */ const d = `${new Date().getFullYear()}${new Date().getDay()}${new Date().getTime()}`; /** @type {?} */ const elemId = parseInt(d, null); this.treeService.addNewItem(elemId, name, null); } /** * @return {?} */ submitRootRename() { if (this.renameForm.valid) { this.showError = false; this.userConfig.rootTitle = this.renameForm.value.name; this.userConfig.options.edit = false; } else { this.showError = true; } } /** * @return {?} */ ngAfterViewInit() { } } NgxTreeParentComponent.decorators = [ { type: Component, args: [{ selector: 'lib-ngx-tree-component', template: `<div id='threeWrapper' *ngIf="treeView" [style.font-size.px]='userConfig.setFontSize'> <div class='root-title d-inline-flex pos-relative' *ngIf="!userConfig.options.edit;else onEdit"> <div class='root-text'> {{userConfig.rootTitle}} </div> <div class='d-flex buttons-bar' *ngIf="userConfig.showActionButtons && userConfig.showRootActionButtons"> <div class='d-flex'> <button class="tree-btn add-btn" *ngIf="userConfig.showAddButtons" (click)="submitAdd(null)"> <fa-icon icon="plus" [style.font-size.px]='userConfig.setIconSize'></fa-icon> </button> </div> <div class='d-flex'> <button class="tree-btn edit-btn" *ngIf="userConfig.showRenameButtons" (click)="enableRootRenameMode()"> <fa-icon icon="edit" [style.font-size.px]='userConfig.setIconSize'></fa-icon> </button> </div> </div> </div> <ng-template #onEdit> <div class='d-inline-flex'> <form [formGroup]="renameForm" class='d-flex' (submit)='submitRootRename()'> <input type="text" class='input-rename' formControlName="name" libAutoFocus="true" [style.font-size.px]='userConfig.setFontSize'> </form> <div class='d-flex'> <button class='tree-btn submit-btn' (click)='submitRootRename()'> <fa-icon icon="check" [style.font-size.px]='userConfig.setIconSize'></fa-icon> </button> <div class='error-edit-wrap' *ngIf="showError"> {{userConfig.validationText}} </div> </div> </div> </ng-template> <div class='tree-child'> <div class="tree-content-main"> <lib-ngx-tree-children [setItem]="clild" *ngFor='let clild of treeView'></lib-ngx-tree-children> </div> </div> </div>` },] }, ]; /** @nocollapse */ NgxTreeParentComponent.ctorParameters = () => [ { 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 }] }; 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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmd4LXRyZWUtZG5kLXBhcmVudC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9uZ3gtdHJlZS1kbmQvIiwic291cmNlcyI6WyJsaWIvbmd4LXRyZWUtZG5kLXBhcmVudC9uZ3gtdHJlZS1kbmQtcGFyZW50LmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7O0FBQUEsT0FBTyxFQUFFLFdBQVcsRUFBRSxVQUFVLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQzs7Ozs7O0FBTXpELE9BQU8sRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxZQUFZLEVBQWlCLE1BQU0sZUFBZSxDQUFDO0FBRXRGLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQThDekQsTUFBTSxPQUFPLHNCQUFzQjs7Ozs7SUF3RGpDLFlBQW1CLFdBQTJCLEVBQVUsRUFBZTtRQUFwRCxnQkFBVyxHQUFYLFdBQVcsQ0FBZ0I7UUFBVSxPQUFFLEdBQUYsRUFBRSxDQUFhO1FBdER2RSxlQUFVLEdBQWU7WUFDckIsaUJBQWlCLEVBQUUsSUFBSTtZQUN2QixjQUFjLEVBQUUsSUFBSTtZQUNwQixpQkFBaUIsRUFBRSxJQUFJO1lBQ3ZCLGlCQUFpQixFQUFFLElBQUk7WUFDdkIscUJBQXFCLEVBQUUsSUFBSTtZQUMzQixtQkFBbUIsRUFBRSxJQUFJO1lBQ3pCLGNBQWMsRUFBRSxJQUFJO1lBQ3BCLFNBQVMsRUFBRSxNQUFNO1lBQ2pCLE9BQU8sRUFBRTtnQkFDUCxJQUFJLEVBQUUsS0FBSzthQUNaO1lBQ0QsY0FBYyxFQUFFLGtCQUFrQjtZQUNsQyxrQkFBa0IsRUFBRSxDQUFDO1lBQ3JCLGVBQWUsRUFBRSxLQUFLO1lBQ3RCLFdBQVcsRUFBRSxFQUFFO1lBQ2YsV0FBVyxFQUFFLEVBQUU7U0FDaEIsQ0FBQztRQUdNLGdCQUFXLEdBQXNCLElBQUksWUFBWSxFQUFFLENBQUM7UUFDcEQsZ0JBQVcsR0FBc0IsSUFBSSxZQUFZLEVBQUUsQ0FBQztR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RSxFQUFFO1lBQ1IsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDN0IsQ0FBQyxDQUNGLENBQUM7UUFDRixJQUFJLENBQUMsV0FBVyxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQ2xDLENBQUMsS0FBSyxFQUFFLEVBQUU7WUFDUixJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUM3QixDQUFDLENBQ0YsQ0FBQztRQUNGLElBQUksQ0FBQyxXQUFXLENBQUMsaUJBQWlCLENBQUMsU0FBUyxDQUMxQyxDQUFDLEtBQUssRUFBRSxFQUFFO1lBQ1IsSUFBSSxDQUFDLGlCQUFpQixDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUNyQyxDQUFDLENBQ0YsQ0FBQztRQUNGLElBQUksQ0FBQyxXQUFXLENBQUMsa0JBQWtCLENBQUMsU0FBUyxDQUMzQyxDQUFDLEtBQUssRUFBRSxFQUFFO1lBQ1IsSUFBSSxDQUFDLGtCQUFrQixDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUN0QyxDQUFDLENBQ0YsQ0FBQztRQUNGLElBQUksQ0FBQyxXQUFXLENBQUMsaUJBQWlCLENBQUMsU0FBUyxDQUMxQyxDQUFDLEtBQUssRUFBRSxFQUFFO1lBQ1IsSUFBSSxDQUFDLGlCQUFpQixDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUNyQyxDQUFDLENBQ0YsQ0FBQztRQUNGLElBQUksQ0FBQyxXQUFXLENBQUMsa0JBQWtCLENBQUMsU0FBUyxDQUMzQyxDQUFDLEtBQUssRUFBRSxFQUFFO1lBQ1IsSUFBSSxDQUFDLGtCQUFrQixDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUN0QyxDQUFDLENBQ0YsQ0FBQztRQUNGLElBQUksQ0FBQyxXQUFXLENBQUMsa0JBQWtCLENBQUMsU0FBUyxDQUMzQyxDQUFDLEtBQUssRUFBRSxFQUFFO1lBQ1IsSUFBSSxDQUFDLGtCQUFrQixDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztR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TUFBTTtpQ0FDTixNQUFNO2lDQUNOLE1BQU07cUJBRU4sS0FBSzt1QkFlTCxLQUFLOzs7O0lBakROLDBDQUFzQjs7SUFDdEIsNENBaUJJOztJQUNKLDJDQUFtQjs7SUFDbkIsNENBQVc7O0lBQ1gsNkNBQThEOztJQUM5RCw2Q0FBOEQ7O0lBQzlELDZDQUE4RDs7SUFDOUQsd0NBQXlEOztJQUN6RCw2Q0FBOEQ7O0lBQzlELDJDQUE0RDs7SUFDNUQsMkNBQTREOztJQUM1RCxtREFBb0U7O0lBQ3BFLG9EQUFxRTs7SUFDckUsbURBQW9FOztJQUNwRSxvREFBcUU7O0lBQ3JFLG9EQUFxRTs7SUF1QnpELDZDQUFrQzs7Ozs7SUFBRSxvQ0FBdUIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBGb3JtQnVpbGRlciwgVmFsaWRhdG9ycyB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbi8qXG4gQ29weXJpZ2h0IChDKSAyMDE4IFlhcm9zbGF2IEtpa290XG4gVGhpcyBwcm9qZWN0IGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgTUlUIGxpY2Vuc2UuXG4gaHR0cHM6Ly9naXRodWIuY29tL1ppY3JhZWwvbmd4LXRyZWUtZG5kXG4gKi9cbmltcG9ydCB7IENvbXBvbmVudCwgSW5wdXQsIE91dHB1dCwgRXZlbnRFbWl0dGVyLCBBZnRlclZpZXdJbml0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbmltcG9ydCB7IE5neFRyZWVTZXJ2aWNlIH0gZnJvbSAnLi4vbmd4LXRyZWUtZG5kLnNlcnZpY2UnO1xuaW1wb3J0IHsgVHJlZU1vZGVsLCBUcmVlQ29uZmlnIH0gZnJvbSAnLi4vbW9kZWxzL3RyZWUtdmlldy5tb2RlbCc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2xpYi1uZ3gtdHJlZS1jb21wb25lbnQnLFxuICB0ZW1wbGF0ZTogYDxkaXYgaWQ9J3RocmVlV3JhcHBlcicgKm5nSWY9XCJ0cmVlVmlld1wiIFtzdHlsZS5mb250LXNpemUucHhdPSd1c2VyQ29uZmlnLnNldEZvbnRTaXplJz5cbiAgICA8ZGl2IGNsYXNzPSdyb290LXRpdGxlIGQtaW5saW5lLWZsZXggcG9zLXJlbGF0aXZlJyAqbmdJZj1cIiF1c2VyQ29uZmlnLm9wdGlvbnMuZWRpdDtlbHNlIG9uRWRpdFwiPlxuICAgICAgPGRpdiBjbGFzcz0ncm9vdC10ZXh0Jz5cbiAgICAgICAge3t1c2VyQ29uZmlnLnJvb3RUaXRsZX19XG4gICAgICA8L2Rpdj5cbiAgICAgIFxuICAgICAgPGRpdiBjbGFzcz0nZC1mbGV4IGJ1dHRvbnMtYmFyJyAqbmdJZj1cInVzZXJDb25maWcuc2hvd0FjdGlvbkJ1dHRvbnMgJiYgdXNlckNvbmZpZy5zaG93Um9vdEFjdGlvbkJ1dHRvbnNcIj5cbiAgICAgICAgPGRpdiBjbGFzcz0nZC1mbGV4Jz5cbiAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwidHJlZS1idG4gYWRkLWJ0blwiICpuZ0lmPVwidXNlckNvbmZpZy5zaG93QWRkQnV0dG9uc1wiIChjbGljayk9XCJzdWJtaXRBZGQobnVsbClcIj5cbiAgICAgICAgICAgIDxmYS1pY29uIGljb249XCJwbHVzXCIgW3N0eWxlLmZvbnQtc2l6ZS5weF09J3VzZXJDb25maWcuc2V0SWNvblNpemUnPjwvZmEtaWNvbj5cbiAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9J2QtZmxleCc+XG4gICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cInRyZWUtYnRuIGVkaXQtYnRuXCIgKm5nSWY9XCJ1c2VyQ29uZmlnLnNob3dSZW5hbWVCdXR0b25zXCIgKGNsaWNrKT1cImVuYWJsZVJvb3RSZW5hbWVNb2RlKClcIj5cbiAgICAgICAgICAgIDxmYS1pY29uIGljb249XCJlZGl0XCIgW3N0eWxlLmZvbnQtc2l6ZS5weF09J3VzZXJDb25maWcuc2V0SWNvblNpemUnPjwvZmEtaWNvbj5cbiAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgICA8bmctdGVtcGxhdGUgI29uRWRpdD5cbiAgICAgIDxkaXYgY2xhc3M9J2QtaW5saW5lLWZsZXgnPlxuICAgICAgICA8Zm9ybSBbZm9ybUdyb3VwXT1cInJlbmFtZUZvcm1cIiBjbGFzcz0nZC1mbGV4JyAoc3VibWl0KT0nc3VibWl0Um9vdFJlbmFtZSgpJz5cbiAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBjbGFzcz0naW5wdXQtcmVuYW1lJyBmb3JtQ29udHJvbE5hbWU9XCJuYW1lXCIgbGliQXV0b0ZvY3VzPVwidHJ1ZVwiIFtzdHlsZS5mb250LXNpemUucHhdPSd1c2VyQ29uZmlnLnNldEZvbnRTaXplJz5cbiAgICAgICAgPC9mb3JtPlxuICAgICAgICA8ZGl2IGNsYXNzPSdkLWZsZXgnPlxuICAgICAgICAgIDxidXR0b24gY2xhc3M9J3RyZWUtYnRuIHN1Ym1pdC1idG4nIChjbGljayk9J3N1Ym1pdFJvb3RSZW5hbWUoKSc+XG4gICAgICAgICAgICA8ZmEtaWNvbiBpY29uPVwiY2hlY2tcIiBbc3R5bGUuZm9udC1zaXplLnB4XT0ndXNlckNvbmZpZy5zZXRJY29uU2l6ZSc+PC9mYS1pY29uPlxuICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgIDxkaXYgY2xhc3M9J2Vycm9yLWVkaXQtd3JhcCcgKm5nSWY9XCJzaG93RXJyb3JcIj5cbiAgICAgICAgICAgIHt7dXNlckNvbmZpZy52YWxpZGF0aW9uVGV4dH19XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgPC9uZy10ZW1wbGF0ZT5cbiAgICA8ZGl2IGNsYXNzPSd0cmVlLWNoaWxkJz5cbiAgICAgIDxkaXYgY2xhc3M9XCJ0cmVlLWNvbnRlbnQtbWFpblwiPlxuICAgICAgICAgIDxsaWItbmd4LXRyZWUtY2hpbGRyZW4gW3NldEl0ZW1dPVwiY2xpbGRcIiAqbmdGb3I9J2xldCBjbGlsZCBvZiB0cmVlVmlldyc+PC9saWItbmd4LXRyZWUtY2hpbGRyZW4+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+YFxufSlcbmV4cG9ydCBjbGFzcyBOZ3hUcmVlUGFyZW50Q29tcG9uZW50IGltcGxlbWVudHMgQWZ0ZXJWaWV3SW5pdCB7XG4gIHRyZWVWaWV3OiBUcmVlTW9kZWxbXTtcbiAgdXNlckNvbmZpZzogVHJlZUNvbmZpZyA9IHtcbiAgICAgIHNob3dBY3Rpb25CdXR0b25zOiB0cnVlLFxuICAgICAgc2hvd0FkZEJ1dHRvbnM6IHRydWUsXG4gICAgICBzaG93UmVuYW1lQnV0dG9uczogdHJ1ZSxcbiAgICAgIHNob3dEZWxldGVCdXR0b25zOiB0cnVlLFxuICAgICAgc2hvd1Jvb3RBY3Rpb25CdXR0b25zOiB0cnVlLFxuICAgICAgZW5hYmxlRXhwYW5kQnV0dG9uczogdHJ1ZSxcbiAgICAgIGVuYWJsZURyYWdnaW5nOiB0cnVlLFxuICAgICAgcm9vdFRpdGxlOiAnUm9vdCcsXG4gICAgICBvcHRpb25zOiB7XG4gICAgICAgIGVkaXQ6IGZhbHNlXG4gICAgICB9LFxuICAgICAgdmFsaWRhdGlvblRleHQ6ICdFbnRlciB2YWxpZCBuYW1lJyxcbiAgICAgIG1pbkNoYXJhY3Rlckxlbmd0aDogMSxcbiAgICAgIHNldEl0ZW1zQXNMaW5rczogZmFsc2UsXG4gICAgICBzZXRGb250U2l6ZTogMTYsXG4gICAgICBzZXRJY29uU2l6ZTogMTRcbiAgICB9O1xuICBzaG93RXJyb3I6IGJvb2xlYW47XG4gIHJlbmFtZUZvcm07XG4gIEBPdXRwdXQoKSBvbmRyYWdzdGFydDogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG4gIEBPdXRwdXQoKSBvbmRyYWdlbnRlcjogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG4gIEBPdXRwdXQoKSBvbmRyYWdsZWF2ZTogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG4gIEBPdXRwdXQoKSBvbmRyb3A6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICBAT3V0cHV0KCkgb25hbGxvd2Ryb3A6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICBAT3V0cHV0KCkgb25kcmFnZW5kOiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgQE91dHB1dCgpIG9uYWRkaXRlbTogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG4gIEBPdXRwdXQoKSBvblN0YXJ0UmVuYW1lSXRlbTogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG4gIEBPdXRwdXQoKSBvbkZpbmlzaFJlbmFtZUl0ZW06IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICBAT3V0cHV0KCkgb25TdGFydERlbGV0ZUl0ZW06IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICBAT3V0cHV0KCkgb25GaW5pc2hEZWxldGVJdGVtOiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgQE91dHB1dCgpIG9uQ2FuY2VsRGVsZXRlSXRlbTogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG5cbiAgQElucHV0KClcbiAgc2V0IGNvbmZpZyhjb25maWc6IFRyZWVDb25maWcpIHtcbiAgICAvLyBzZWFsIGNvbmZpZ1xuICAgIE9iamVjdC5zZWFsKHRoaXMudXNlckNvbmZpZyk7XG4gICAgdHJ5IHtcbiAgICAgIC8vIGlmIGNvbmZpZyBpdGBzIHBhc3NcbiAgICAgIHRoaXMuc2V0Q29uZmlnKGNvbmZpZyk7XG4gICAgICB0aGlzLnRyZWVTZXJ2aWNlLmNvbmZpZy5uZXh0KHRoaXMudXNlckNvbmZpZyk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIC8vIGlmIGNvbmZpZyBpbnZhbGlkXG4gICAgICBjb25zb2xlLmxvZygnQ29uZmlnIGlzIGludmFsaWQhIERlZmF1bHQgY29uZmlndXJhZ2lvbiB3aWxsIGJlIGFwcGVhcmVkJyk7XG4gICAgICB0aGlzLnRyZWVTZXJ2aWNlLmNvbmZpZy5uZXh0KHRoaXMudHJlZVNlcnZpY2UuZGVmYXVsQ29uZmlnKTtcbiAgICB9XG4gIH1cblxuICBASW5wdXQoKVxuICBzZXQgdHJlZURhdGEoaXRlbTogVHJlZU1vZGVsW10pIHtcbiAgICAvLyBnZXQgdXNlciB0cmVlIGRhdGFcbiAgICAgIHRoaXMuZ2V0VHJlZURhdGEoaXRlbSk7XG4gIH1cblxuICBjb25zdHJ1Y3RvcihwdWJsaWMgdHJlZVNlcnZpY2U6IE5neFRyZWVTZXJ2aWNlLCBwcml2YXRlIGZiOiBGb3JtQnVpbGRlciApIHtcbiAgICB0aGlzLmVuYWJsZVN1YnNjcmliZXJzKCk7XG4gICAgdGhpcy5jcmVhdGVGb3JtKCk7XG4gIH1cblxuICAvLyBzZXQgdXNlciBjb25maWdcbiAgc2V0Q29uZmlnKGNvbmZpZykge1xuICAgIGZvciAoY29uc3Qga2V5IG9mIE9iamVjdC5rZXlzKGNvbmZpZykpIHtcbiAgICAgIHRoaXMuc2V0VmFsdWUoa2V5LCBjb25maWcpO1xuICAgIH1cbiAgICB0aGlzLnJlbmFtZUZvcm0ucGF0Y2hWYWx1ZSh7XG4gICAgICBuYW1lOiB0aGlzLnVzZXJDb25maWcucm9vdFRpdGxlXG4gICAgfSk7XG4gIH1cbiAgLy8gc2V0IHZhbHVlIHRvIGtleXMgb2YgY29uZmlnXG4gIHNldFZhbHVlKGl0ZW0sIGNvbmZpZykge1xuICAgIHRoaXMudXNlckNvbmZpZ1tpdGVtXSA9IGNvbmZpZ1tpdGVtXTtcbiAgfVxuXG4gIC8vIHN1YnNjcmliZSB0byBhbGwgZXZlbnRzIGFuZCBlbWl0IHRoZW0gdG8gdXNlci5cbiAgZW5hYmxlU3Vic2NyaWJlcnMoKSB7XG4gICAgdGhpcy50cmVlU2VydmljZS5vbkRyb3Auc3Vic2NyaWJlKFxuICAgICAgKGV2ZW50KSA9PiB7XG4gICAgICAgIHRoaXMub25kcm9wLmVtaXQoZXZlbnQpO1xuICAgICAgfVxuICAgICk7XG4gICAgdGhpcy50cmVlU2VydmljZS5vbkRyYWdTdGFydC5zdWJzY3JpYmUoXG4gICAgICAoZXZlbnQpID0+IHtcbiAgICAgICAgdGhpcy5vbmRyYWdzdGFydC5lbWl0KGV2ZW50KTtcbiAgICAgIH1cbiAgICApO1xuICAgIHRoaXMudHJlZVNlcnZpY2Uub25BbGxvd0Ryb3Auc3Vic2NyaWJlKFxuICAgICAgKGV2ZW50KSA9PiB7XG4gICAgICAgIHRoaXMub25hbGxvd2Ryb3AuZW1pdChldmVudCk7XG4gICAgICB9XG4gICAgKTtcbiAgICB0aGlzLnRyZWVTZXJ2aWNlLm9uRHJhZ0VuZC5zdWJzY3JpYmUoXG4gICAgICAoZXZlbnQpID0+IHtcbiAgICAgICAgdGhpcy5vbmRyYWdlbmQuZW1pdChldmVudCk7XG4gICAgICB9XG4gICAgKTtcbiAgICB0aGlzLnRyZWVTZXJ2aWNlLm9uQWRkSXRlbS5zdWJzY3JpYmUoXG4gICAgICAoZXZlbnQpID0+IHtcbiAgICAgICAgdGhpcy5vbmFkZGl0ZW0uZW1pdChldmVudCk7XG4gICAgICB9XG4gICAgKTtcbiAgICB0aGlzLnRyZWVTZXJ2aWNlLm9uU3RhcnRSZW5hbWVJdGVtLnN1YnNjcmliZShcbiAgICAgIChldmVudCkgPT4ge1xuICAgICAgICB0aGlzLm9uU3RhcnRSZW5hbWVJdGVtLmVtaXQoZXZlbnQpO1xuICAgICAgfVxuICAgICk7XG4gICAgdGhpcy50cmVlU2VydmljZS5vbkZpbmlzaFJlbmFtZUl0ZW0uc3Vic2NyaWJlKFxuICAgICAgKGV2ZW50KSA9PiB7XG4gICAgICAgIHRoaXMub25GaW5pc2hSZW5hbWVJdGVtLmVtaXQoZXZlbnQpO1xuICAgICAgfVxuICAgICk7XG4gICAgdGhpcy50cmVlU2VydmljZS5vblN0YXJ0RGVsZXRlSXRlbS5zdWJzY3JpYmUoXG4gICAgICAoZXZlbnQpID0+IHtcbiAgICAgICAgdGhpcy5vblN0YXJ0RGVsZXRlSXRlbS5lbWl0KGV2ZW50KTtcbiAgICAgIH1cbiAgICApO1xuICAgIHRoaXMudHJlZVNlcnZpY2Uub25GaW5pc2hEZWxldGVJdGVtLnN1YnNjcmliZShcbiAgICAgIChldmVudCkgPT4ge1xuICAgICAgICB0aGlzLm9uRmluaXNoRGVsZXRlSXRlbS5lbWl0KGV2ZW50KTtcbiAgICAgIH1cbiAgICApO1xuICAgIHRoaXMudHJlZVNlcnZpY2Uub25DYW5jZWxEZWxldGVJdGVtLnN1YnNjcmliZShcbiAgICAgIChldmVudCkgPT4ge1xuICAgICAgICB0aGlzLm9uQ2FuY2VsRGVsZXRlSXRlbS5lbWl0KGV2ZW50KTtcbiAgICAgIH1cbiAgICApO1xuICAgIHRoaXMudHJlZVNlcnZpY2Uub25EcmFnRW50ZXIuc3Vic2NyaWJlKFxuICAgICAgKGV2ZW50KSA9PiB7XG4gICAgICAgIHRoaXMub25kcmFnZW50ZXIuZW1pdChldmVudCk7XG4gICAgICB9XG4gICAgKTtcbiAgICB0aGlzLnRyZWVTZXJ2aWNlLm9uRHJhZ0xlYXZlLnN1YnNjcmliZShcbiAgICAgIChldmVudCkgPT4ge1xuICAgICAgICB0aGlzLm9uZHJhZ2xlYXZlLmVtaXQoZXZlbnQpO1xuICAgICAgfVxuICAgICk7XG4gIH1cblxuICAvLyBnZXQgdHJlZSBkYXRhIGZyb20gdHJlZVNlcnZpY2UuXG4gIGdldFRyZWVEYXRhKHVzZXJUcmVlKSB7XG4gICAgdGhpcy50cmVlU2VydmljZS5nZXRMb2NhbERhdGEodXNlclRyZWUpLnN1YnNjcmliZShcbiAgICAgICh0cmVlOiBUcmVlTW9kZWxbXSkgPT4ge1xuICAgICAgICB0aGlzLnRyZWVWaWV3ID0gdHJlZTtcbiAgICAgICAgc2V0VGltZW91dCggKCkgPT4ge1xuICAgICAgICAgIHRoaXMudHJlZVNlcnZpY2Uuc29ydFRyZWUoKTtcbiAgICAgICAgfSk7XG4gICAgICB9LCAoZXJyb3IpID0+IHtcbiAgICAgICAgY29uc29sZS5sb2coZXJyb3IpO1xuICAgICAgfVxuICAgICk7XG4gIH1cblxuICAvLyBjcmVhdGUgZWRpdCBmb3JtXG4gIGNyZWF0ZUZvcm0oKSB7XG4gICAgdGhpcy5yZW5hbWVGb3JtID0gdGhpcy5mYi5ncm91cCh7XG4gICAgICBuYW1lOiBbdGhpcy51c2VyQ29uZmlnLnJvb3RUaXRsZSB8fCAnJywgW1xuICAgICAgICBWYWxpZGF0b3JzLnJlcXVpcmVkLFxuICAgICAgICBWYWxpZGF0b3JzLm1pbkxlbmd0aCh0aGlzLnVzZXJDb25maWcubWluQ2hhcmFjdGVyTGVuZ3RoKVxuICAgICAgXV0sXG4gICAgfSk7XG4gIH1cblxuICBlbmFibGVSb290UmVuYW1lTW9kZSgpIHtcbiAgICB0aGlzLnVzZXJDb25maWcub3B0aW9ucy5lZGl0ID0gdHJ1ZTtcbiAgfVxuXG4gIHN1Ym1pdEFkZChuYW1lKSB7XG4gICAgY29uc3QgZCA9IGAke25ldyBEYXRlKCkuZ2V0RnVsbFllYXIoKX0ke25ldyBEYXRlKCkuZ2V0RGF5KCl9JHtuZXcgRGF0ZSgpLmdldFRpbWUoKX1gO1xuICAgIGNvbnN0IGVsZW1JZCA9IHBhcnNlSW50KGQsIG51bGwpO1xuICAgIHRoaXMudHJlZVNlcnZpY2UuYWRkTmV3SXRlbShlbGVtSWQsIG5hbWUsIG51bGwpO1xuICB9XG5cbiAgc3VibWl0Um9vdFJlbmFtZSgpIHtcbiAgICBpZiAodGhpcy5yZW5hbWVGb3JtLnZhbGlkKSB7XG4gICAgICB0aGlzLnNob3dFcnJvciA9IGZhbHNlO1xuICAgICAgdGhpcy51c2VyQ29uZmlnLnJvb3RUaXRsZSA9IHRoaXMucmVuYW1lRm9ybS52YWx1ZS5uYW1lO1xuICAgICAgdGhpcy51c2VyQ29uZmlnLm9wdGlvbnMuZWRpdCA9IGZhbHNlO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnNob3dFcnJvciA9IHRydWU7XG4gICAgfVxuICB9XG5cbiAgbmdBZnRlclZpZXdJbml0KCkge31cblxuXG59Il19