UNPKG

stimulsoft-viewer-angular

Version:
228 lines 34 kB
import { Component, ViewChild } from '@angular/core'; import { trigger, state, transition, animate, style, keyframes } from '@angular/animations'; import * as i0 from "@angular/core"; import * as i1 from "../services/model.service"; import * as i2 from "../services/helper.service"; import * as i3 from "../services/controller.service"; import * as i4 from "@angular/common"; export class BookmarksPanelComponent { constructor(model, helper, controller) { this.model = model; this.helper = helper; this.controller = controller; controller.getMessage().subscribe((message) => { if (message.action === 'GetReport' || message.action === 'OpenReport') { setTimeout(() => { if (this.model.reportParams.bookmarksContent != null) { this.create(); } this.model.controls.bookmarksPanel.visible = this.model.reportParams.bookmarksContent !== null && !this.model.options.isMobileDevice; }); } else { // Go to the bookmark, if it present setTimeout(() => { if (this.model.options.bookmarkAnchor != null) { this.helper.scrollToAnchor(this.model.options.bookmarkAnchor, this.model.options.componentGuid); this.model.options.bookmarkAnchor = null; this.model.options.componentGuid = null; } }); } }); this.model.controls.bookmarksPanel.getVisibility().subscribe((value) => { if (!value) { this.helper.removeBookmarksLabel(); this.clearSelected(); } }); } ngAfterViewInit() { this.model.controls.bookmarksPanel.el = this.element; } ngOnInit() { } getImg1(node, i) { if (node.nodes?.length === 0) { return i !== this.model.nodes.length - 1 ? this.model.imagesForBookmark['join'] : this.model.imagesForBookmark['joinBottom']; } return node.open ? (i === this.model.nodes.length - 1 ? this.model.imagesForBookmark['minusBottom'] : this.model.imagesForBookmark['minus']) : (i === this.model.nodes.length - 1 ? this.model.imagesForBookmark['plusBottom'] : this.model.imagesForBookmark['plus']); } postAction(node) { this.clearSelected(); this.controller.postBookmarkNodeAction(node); } clearSelected() { this.model.nodes?.forEach((n) => { n.selected = false; n.nodes.forEach(element => element.selected = false); }); } create() { let bookmarks = JSON.parse(this.model.reportParams.bookmarksContent); this.rootName = bookmarks.bookmarksTree[0].title; const nodes = []; this.parseNodes(bookmarks, 0, nodes); this.model.nodes = nodes; } parseNodes(bookmarks, index, nodes) { let folder; bookmarks.bookmarksTree.splice(1).forEach((bookmark) => { let page = bookmark.componentGuid != null && bookmarks.bookmarksPageIndexes != null ? (bookmarks.bookmarksPageIndexes[bookmark.componentGuid] - 1 ?? 0) : 0; const node = { name: bookmark.title, url: bookmark.url, page: page, compunentGuid: bookmark.componentGuid, nodes: [], open: false, selected: false }; if (bookmark.parent === 0) { nodes.push(node); folder = node; } else { folder.nodes.push(node); } }); } unescape(str) { return str.replace(/\\&apos;/g, '\'') .replace(/\\&quot;/g, '"') .replace(/\\&gt;/g, '>') .replace(/\\&lt;/g, '<') .replace(/\\&amp;/g, '&'); } get bottom() { if (this.model.options.isMobileDevice) { return this.model.options.toolbar.autoHide ? '0' : '0.5in'; } else { return this.model.options.toolbar.displayMode === 'Separated' && this.model.options.toolbar.visible ? '35px' : '0'; } } static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: BookmarksPanelComponent, deps: [{ token: i1.ModelService }, { token: i2.HelperService }, { token: i3.ControllerService }], target: i0.ɵɵFactoryTarget.Component }); } static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: BookmarksPanelComponent, selector: "sti-bookmarks-panel", viewQueries: [{ propertyName: "element", first: true, predicate: ["element"], descendants: true }, { propertyName: "bookmarksPanel", first: true, predicate: ["bookmarksPanel"], descendants: true }], ngImport: i0, template: ` <div #element [style]="{fontFamily: model.options.toolbar.fontFamily, fontColor: helper.val(model.options.toolbar.fontColor)}" [class]="'stiJsViewerBookmarksPanel' + (model.options.toolbar.displayMode == 'Separated' ? ' stiJsViewerBookmarksPanelSeparated' : '')" [style.width.px]="model.options.appearance.bookmarksTreeWidth - (model.options.toolbar.displayMode == 'Simple' ? 0 : 1)" [style.bottom]="bottom" [style.top.px]="model.controls.bookmarksPanel.layout.top" [style.transition]="model.options.isMobileDevice ? 'opacity 300ms ease' : null" [style.display]="!this.model.options.isMobileDevice ? (model.controls.bookmarksPanel.visible ? '' : 'none') : null" [@visibility]="!this.model.options.isMobileDevice ? null : (model.controls.bookmarksPanel.visible ? 'visible' : 'hidden')"> <div #bookmarksPanel [class]="'stiJsViewerBookmarksContainer' + (model.options.toolbar.displayMode == 'Simple' ? ' stiJsViewerBookmarksContainerSimple' : '')" [style.background]="helper.val(model.options.toolbar.backgroundColor)" [style.border]="helper.val(model.options.toolbar.borderColor) != '' ? '1px solid ' + helper.val(model.options.toolbar.borderColor): ''"> <div class="stiTree"> <div class="stiTreeNode"> <img [style.width.px]="16" [style.height.px]="16" [src]="model.imagesForBookmark['root']"/> <a class="node">{{rootName}}</a> </div> <div class="clip" [style.display]="'block'"> <ng-container *ngFor="let node of model.nodes; index as i"> <div class="stiTreeNode"> <a (click)="node.open = !node.open"> <img [style.width.px]="18" [style.height.px]="18" [src]="getImg1(node, i)"/> </a> <img [style.width.px]="16" [style.height.px]="16" [src]="node.nodes?.length == 0 ? model.imagesForBookmark['node'] :(node.open ? model.imagesForBookmark['folderOpen'] : model.imagesForBookmark['folder'])"/> <a [class]="node.selected ? 'nodeSel' : 'node'" (click)="postAction(node)">{{node.name}}</a> </div> <div class="clip" [style.display]="node.open ? 'block' : 'none'"> <div *ngFor="let subNode of node.nodes; index as k" class="stiTreeNode"> <img [style.width.px]="18" [style.height.px]="18" [src]="i != model.nodes.length - 1 ? model.imagesForBookmark['line'] : model.imagesForBookmark['empty']"/> <img [style.width.px]="18" [style.height.px]="18" [src]="k == node.nodes.length - 1 ? model.imagesForBookmark['joinBottom'] : model.imagesForBookmark['join']"/> <img [style.width.px]="16" [style.height.px]="16" [src]="model.imagesForBookmark['node']" /> <a [class]="subNode.selected ? 'nodeSel' : 'node'" (click)="postAction(subNode)">{{subNode.name}}</a> </div> </div> </ng-container> </div> </div> </div> </div> `, isInline: true, dependencies: [{ kind: "directive", type: i4.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }], animations: [ trigger('visibility', [ state('visible', style({ opacity: 1, display: 'block' })), state('hidden', style({ opacity: 0, display: 'none' })), transition('hidden => visible', [ animate('300ms ease-in-out', keyframes([ style({ display: 'block', opacity: 0, offset: 0 }), style({ display: 'block', opacity: 1, offset: 1 }), ])) ]), transition('visible => hidden', [ animate('300ms ease-in-out', keyframes([ style({ display: 'block', opacity: 1, offset: 0 }), style({ display: 'none', opacity: 0, offset: 1 }), ])) ]) ]) ] }); } } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: BookmarksPanelComponent, decorators: [{ type: Component, args: [{ selector: 'sti-bookmarks-panel', template: ` <div #element [style]="{fontFamily: model.options.toolbar.fontFamily, fontColor: helper.val(model.options.toolbar.fontColor)}" [class]="'stiJsViewerBookmarksPanel' + (model.options.toolbar.displayMode == 'Separated' ? ' stiJsViewerBookmarksPanelSeparated' : '')" [style.width.px]="model.options.appearance.bookmarksTreeWidth - (model.options.toolbar.displayMode == 'Simple' ? 0 : 1)" [style.bottom]="bottom" [style.top.px]="model.controls.bookmarksPanel.layout.top" [style.transition]="model.options.isMobileDevice ? 'opacity 300ms ease' : null" [style.display]="!this.model.options.isMobileDevice ? (model.controls.bookmarksPanel.visible ? '' : 'none') : null" [@visibility]="!this.model.options.isMobileDevice ? null : (model.controls.bookmarksPanel.visible ? 'visible' : 'hidden')"> <div #bookmarksPanel [class]="'stiJsViewerBookmarksContainer' + (model.options.toolbar.displayMode == 'Simple' ? ' stiJsViewerBookmarksContainerSimple' : '')" [style.background]="helper.val(model.options.toolbar.backgroundColor)" [style.border]="helper.val(model.options.toolbar.borderColor) != '' ? '1px solid ' + helper.val(model.options.toolbar.borderColor): ''"> <div class="stiTree"> <div class="stiTreeNode"> <img [style.width.px]="16" [style.height.px]="16" [src]="model.imagesForBookmark['root']"/> <a class="node">{{rootName}}</a> </div> <div class="clip" [style.display]="'block'"> <ng-container *ngFor="let node of model.nodes; index as i"> <div class="stiTreeNode"> <a (click)="node.open = !node.open"> <img [style.width.px]="18" [style.height.px]="18" [src]="getImg1(node, i)"/> </a> <img [style.width.px]="16" [style.height.px]="16" [src]="node.nodes?.length == 0 ? model.imagesForBookmark['node'] :(node.open ? model.imagesForBookmark['folderOpen'] : model.imagesForBookmark['folder'])"/> <a [class]="node.selected ? 'nodeSel' : 'node'" (click)="postAction(node)">{{node.name}}</a> </div> <div class="clip" [style.display]="node.open ? 'block' : 'none'"> <div *ngFor="let subNode of node.nodes; index as k" class="stiTreeNode"> <img [style.width.px]="18" [style.height.px]="18" [src]="i != model.nodes.length - 1 ? model.imagesForBookmark['line'] : model.imagesForBookmark['empty']"/> <img [style.width.px]="18" [style.height.px]="18" [src]="k == node.nodes.length - 1 ? model.imagesForBookmark['joinBottom'] : model.imagesForBookmark['join']"/> <img [style.width.px]="16" [style.height.px]="16" [src]="model.imagesForBookmark['node']" /> <a [class]="subNode.selected ? 'nodeSel' : 'node'" (click)="postAction(subNode)">{{subNode.name}}</a> </div> </div> </ng-container> </div> </div> </div> </div> `, animations: [ trigger('visibility', [ state('visible', style({ opacity: 1, display: 'block' })), state('hidden', style({ opacity: 0, display: 'none' })), transition('hidden => visible', [ animate('300ms ease-in-out', keyframes([ style({ display: 'block', opacity: 0, offset: 0 }), style({ display: 'block', opacity: 1, offset: 1 }), ])) ]), transition('visible => hidden', [ animate('300ms ease-in-out', keyframes([ style({ display: 'block', opacity: 1, offset: 0 }), style({ display: 'none', opacity: 0, offset: 1 }), ])) ]) ]) ] }] }], ctorParameters: () => [{ type: i1.ModelService }, { type: i2.HelperService }, { type: i3.ControllerService }], propDecorators: { element: [{ type: ViewChild, args: ['element'] }], bookmarksPanel: [{ type: ViewChild, args: ['bookmarksPanel'] }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYm9va21hcmtzLXBhbmVsLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3N0aW11bHNvZnQtdmlld2VyLWFuZ3VsYXIvc3JjL2xpYi9jb21wb25lbnRzL2Jvb2ttYXJrcy1wYW5lbC5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBVSxTQUFTLEVBQTZCLE1BQU0sZUFBZSxDQUFDO0FBS3hGLE9BQU8sRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLFVBQVUsRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLFNBQVMsRUFBa0IsTUFBTSxxQkFBcUIsQ0FBQzs7Ozs7O0FBaUU1RyxNQUFNLE9BQU8sdUJBQXVCO0lBT2xDLFlBQW1CLEtBQW1CLEVBQVMsTUFBcUIsRUFBUyxVQUE2QjtRQUF2RixVQUFLLEdBQUwsS0FBSyxDQUFjO1FBQVMsV0FBTSxHQUFOLE1BQU0sQ0FBZTtRQUFTLGVBQVUsR0FBVixVQUFVLENBQW1CO1FBQ3hHLFVBQVUsQ0FBQyxVQUFVLEVBQUUsQ0FBQyxTQUFTLENBQUMsQ0FBQyxPQUFnQixFQUFFLEVBQUU7WUFDckQsSUFBSSxPQUFPLENBQUMsTUFBTSxLQUFLLFdBQVcsSUFBSSxPQUFPLENBQUMsTUFBTSxLQUFLLFlBQVksRUFBRSxDQUFDO2dCQUN0RSxVQUFVLENBQUMsR0FBRyxFQUFFO29CQUNkLElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxZQUFZLENBQUMsZ0JBQWdCLElBQUksSUFBSSxFQUFFLENBQUM7d0JBQ3JELElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztvQkFDaEIsQ0FBQztvQkFDRCxJQUFJLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxjQUFjLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsWUFBWSxDQUFDLGdCQUFnQixLQUFLLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENB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LCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIE9uSW5pdCwgVmlld0NoaWxkLCBFbGVtZW50UmVmLCBBZnRlclZpZXdJbml0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IE1vZGVsU2VydmljZSB9IGZyb20gJy4uL3NlcnZpY2VzL21vZGVsLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBIZWxwZXJTZXJ2aWNlIH0gZnJvbSAnLi4vc2VydmljZXMvaGVscGVyLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBDb250cm9sbGVyU2VydmljZSB9IGZyb20gJy4uL3NlcnZpY2VzL2NvbnRyb2xsZXIuc2VydmljZSc7XHJcbmltcG9ydCB7IEJvb2ttYXJrTm9kZSwgTWVzc2FnZSB9IGZyb20gJy4uL3NlcnZpY2VzL29iamVjdHMnO1xyXG5pbXBvcnQgeyB0cmlnZ2VyLCBzdGF0ZSwgdHJhbnNpdGlvbiwgYW5pbWF0ZSwgc3R5bGUsIGtleWZyYW1lcywgQW5pbWF0aW9uRXZlbnQgfSBmcm9tICdAYW5ndWxhci9hbmltYXRpb25zJztcclxuXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiAnc3RpLWJvb2ttYXJrcy1wYW5lbCcsXHJcbiAgdGVtcGxhdGU6IGBcclxuICAgIDxkaXYgI2VsZW1lbnQgW3N0eWxlXT1cIntmb250RmFtaWx5OiBtb2RlbC5vcHRpb25zLnRvb2xiYXIuZm9udEZhbWlseSwgZm9udENvbG9yOiBoZWxwZXIudmFsKG1vZGVsLm9wdGlvbnMudG9vbGJhci5mb250Q29sb3IpfVwiXHJcbiAgICAgIFtjbGFzc109XCInc3RpSnNWaWV3ZXJCb29rbWFya3NQYW5lbCcgKyAobW9kZWwub3B0aW9ucy50b29sYmFyLmRpc3BsYXlNb2RlID09ICdTZXBhcmF0ZWQnID8gJyBzdGlKc1ZpZXdlckJvb2ttYXJrc1BhbmVsU2VwYXJhdGVkJyA6ICcnKVwiXHJcbiAgICAgIFtzdHlsZS53aWR0aC5weF09XCJtb2RlbC5vcHRpb25zLmFwcGVhcmFuY2UuYm9va21hcmtzVHJlZVdpZHRoIC0gKG1vZGVsLm9wdGlvbnMudG9vbGJhci5kaXNwbGF5TW9kZSA9PSAnU2ltcGxlJyA/IDAgOiAxKVwiXHJcbiAgICAgIFtzdHlsZS5ib3R0b21dPVwiYm90dG9tXCJcclxuICAgICAgW3N0eWxlLnRvcC5weF09XCJtb2RlbC5jb250cm9scy5ib29rbWFya3NQYW5lbC5sYXlvdXQudG9wXCJcclxuICAgICAgW3N0eWxlLnRyYW5zaXRpb25dPVwibW9kZWwub3B0aW9ucy5pc01vYmlsZURldmljZSA/ICdvcGFjaXR5IDMwMG1zIGVhc2UnIDogbnVsbFwiXHJcbiAgICAgIFtzdHlsZS5kaXNwbGF5XT1cIiF0aGlzLm1vZGVsLm9wdGlvbnMuaXNNb2JpbGVEZXZpY2UgPyAobW9kZWwuY29udHJvbHMuYm9va21hcmtzUGFuZWwudmlzaWJsZSA/ICcnIDogJ25vbmUnKSA6IG51bGxcIlxyXG4gICAgICBbQHZpc2liaWxpdHldPVwiIXRoaXMubW9kZWwub3B0aW9ucy5pc01vYmlsZURldmljZSA/IG51bGwgOiAobW9kZWwuY29udHJvbHMuYm9va21hcmtzUGFuZWwudmlzaWJsZSA/ICd2aXNpYmxlJyA6ICdoaWRkZW4nKVwiPlxyXG4gICAgICA8ZGl2ICNib29rbWFya3NQYW5lbCBbY2xhc3NdPVwiJ3N0aUpzVmlld2VyQm9va21hcmtzQ29udGFpbmVyJyArIChtb2RlbC5vcHRpb25zLnRvb2xiYXIuZGlzcGxheU1vZGUgPT0gJ1NpbXBsZScgPyAnIHN0aUpzVmlld2VyQm9va21hcmtzQ29udGFpbmVyU2ltcGxlJyA6ICcnKVwiXHJcbiAgICAgICAgICAgW3N0eWxlLmJhY2tncm91bmRdPVwiaGVscGVyLnZhbChtb2RlbC5vcHRpb25zLnRvb2xiYXIuYmFja2dyb3VuZENvbG9yKVwiXHJcbiAgICAgICAgICAgW3N0eWxlLmJvcmRlcl09XCJoZWxwZXIudmFsKG1vZGVsLm9wdGlvbnMudG9vbGJhci5ib3JkZXJDb2xvcikgIT0gJycgPyAnMXB4IHNvbGlkICcgKyBoZWxwZXIudmFsKG1vZGVsLm9wdGlvbnMudG9vbGJhci5ib3JkZXJDb2xvcik6ICcnXCI+XHJcbiAgICAgICAgICAgPGRpdiBjbGFzcz1cInN0aVRyZWVcIj5cclxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic3RpVHJlZU5vZGVcIj5cclxuICAgICAgICAgICAgICAgIDxpbWcgW3N0eWxlLndpZHRoLnB4XT1cIjE2XCIgW3N0eWxlLmhlaWdodC5weF09XCIxNlwiIFtzcmNdPVwibW9kZWwuaW1hZ2VzRm9yQm9va21hcmtbJ3Jvb3QnXVwiLz5cclxuICAgICAgICAgICAgICAgIDxhIGNsYXNzPVwibm9kZVwiPnt7cm9vdE5hbWV9fTwvYT5cclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2xpcFwiIFtzdHlsZS5kaXNwbGF5XT1cIidibG9jaydcIj5cclxuICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IG5vZGUgb2YgbW9kZWwubm9kZXM7IGluZGV4IGFzIGlcIj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic3RpVHJlZU5vZGVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGEgKGNsaWNrKT1cIm5vZGUub3BlbiA9ICFub2RlLm9wZW5cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbWcgW3N0eWxlLndpZHRoLnB4XT1cIjE4XCIgW3N0eWxlLmhlaWdodC5weF09XCIxOFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3NyY109XCJnZXRJbWcxKG5vZGUsIGkpXCIvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2E+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxpbWcgW3N0eWxlLndpZHRoLnB4XT1cIjE2XCIgW3N0eWxlLmhlaWdodC5weF09XCIxNlwiIFtzcmNdPVwibm9kZS5ub2Rlcz8ubGVuZ3RoID09IDAgPyBtb2RlbC5pbWFnZXNGb3JCb29rbWFya1snbm9kZSddIDoobm9kZS5vcGVuID8gbW9kZWwuaW1hZ2VzRm9yQm9va21hcmtbJ2ZvbGRlck9wZW4nXSA6IG1vZGVsLmltYWdlc0ZvckJvb2ttYXJrWydmb2xkZXInXSlcIi8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxhIFtjbGFzc109XCJub2RlLnNlbGVjdGVkID8gJ25vZGVTZWwnIDogJ25vZGUnXCIgKGNsaWNrKT1cInBvc3RBY3Rpb24obm9kZSlcIj57e25vZGUubmFtZX19PC9hPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjbGlwXCIgW3N0eWxlLmRpc3BsYXldPVwibm9kZS5vcGVuID8gJ2Jsb2NrJyA6ICdub25lJ1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPGRpdiAqbmdGb3I9XCJsZXQgc3ViTm9kZSBvZiBub2RlLm5vZGVzOyBpbmRleCBhcyBrXCIgY2xhc3M9XCJzdGlUcmVlTm9kZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8aW1nIFtzdHlsZS53aWR0aC5weF09XCIxOFwiIFtzdHlsZS5oZWlnaHQucHhdPVwiMThcIiBbc3JjXT1cImkgIT0gbW9kZWwubm9kZXMubGVuZ3RoIC0gMSA/IG1vZGVsLmltYWdlc0ZvckJvb2ttYXJrWydsaW5lJ10gOiBtb2RlbC5pbWFnZXNGb3JCb29rbWFya1snZW1wdHknXVwiLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGltZyBbc3R5bGUud2lkdGgucHhdPVwiMThcIiBbc3R5bGUuaGVpZ2h0LnB4XT1cIjE4XCIgW3NyY109XCJrID09IG5vZGUubm9kZXMubGVuZ3RoIC0gMSA/IG1vZGVsLmltYWdlc0ZvckJvb2ttYXJrWydqb2luQm90dG9tJ10gOiBtb2RlbC5pbWFnZXNGb3JCb29rbWFya1snam9pbiddXCIvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8aW1nIFtzdHlsZS53aWR0aC5weF09XCIxNlwiIFtzdHlsZS5oZWlnaHQucHhdPVwiMTZcIiBbc3JjXT1cIm1vZGVsLmltYWdlc0ZvckJvb2ttYXJrWydub2RlJ11cIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8YSBbY2xhc3NdPVwic3ViTm9kZS5zZWxlY3RlZCA/ICdub2RlU2VsJyA6ICdub2RlJ1wiIChjbGljayk9XCJwb3N0QWN0aW9uKHN1Yk5vZGUpXCI+e3tzdWJOb2RlLm5hbWV9fTwvYT5cclxuICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuICBgLFxyXG4gIGFuaW1hdGlvbnM6IFtcclxuICAgIHRyaWdnZXIoJ3Zpc2liaWxpdHknLCBbXHJcbiAgICAgIHN0YXRlKCd2aXNpYmxlJywgc3R5bGUoeyBvcGFjaXR5OiAxLCBkaXNwbGF5OiAnYmxvY2snIH0pKSxcclxuICAgICAgc3RhdGUoJ2hpZGRlbicsIHN0eWxlKHsgb3BhY2l0eTogMCwgZGlzcGxheTogJ25vbmUnIH0pKSxcclxuICAgICAgdHJhbnNpdGlvbignaGlkZGVuID0+IHZpc2libGUnLCBbXHJcbiAgICAgICAgYW5pbWF0ZSgnMzAwbXMgZWFzZS1pbi1vdXQnLCBrZXlmcmFtZXMoW1xyXG4gICAgICAgICAgc3R5bGUoeyBkaXNwbGF5OiAnYmxvY2snLCBvcGFjaXR5OiAwLCBvZmZzZXQ6IDAgfSksXHJcbiAgICAgICAgICBzdHlsZSh7IGRpc3BsYXk6ICdibG9jaycsIG9wYWNpdHk6IDEsIG9mZnNldDogMSB9KSxcclxuICAgICAgICBdKSlcclxuICAgICAgXSksXHJcbiAgICAgIHRyYW5zaXRpb24oJ3Zpc2libGUgPT4gaGlkZGVuJywgW1xyXG4gICAgICAgIGFuaW1hdGUoJzMwMG1zIGVhc2UtaW4tb3V0Jywga2V5ZnJhbWVzKFtcclxuICAgICAgICAgIHN0eWxlKHsgZGlzcGxheTogJ2Jsb2NrJywgb3BhY2l0eTogMSwgb2Zmc2V0OiAwIH0pLFxyXG4gICAgICAgICAgc3R5bGUoeyBkaXNwbGF5OiAnbm9uZScsIG9wYWNpdHk6IDAsIG9mZnNldDogMSB9KSxcclxuICAgICAgICBdKSlcclxuICAgICAgXSlcclxuICAgIF0pXHJcbiAgXVxyXG59KVxyXG5cclxuZXhwb3J0IGNsYXNzIEJvb2ttYXJrc1BhbmVsQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBBZnRlclZpZXdJbml0IHtcclxuXHJcbiAgQFZpZXdDaGlsZCgnZWxlbWVudCcpIGVsZW1lbnQ6IEVsZW1lbnRSZWY7XHJcbiAgQFZpZXdDaGlsZCgnYm9va21hcmtzUGFuZWwnKSBib29rbWFya3NQYW5lbDogRWxlbWVudFJlZjtcclxuXHJcbiAgcHVibGljIHJvb3ROYW1lOiBzdHJpbmc7XHJcblxyXG4gIGNvbnN0cnVjdG9yKHB1YmxpYyBtb2RlbDogTW9kZWxTZXJ2aWNlLCBwdWJsaWMgaGVscGVyOiBIZWxwZXJTZXJ2aWNlLCBwdWJsaWMgY29udHJvbGxlcjogQ29udHJvbGxlclNlcnZpY2UpIHtcclxuICAgIGNvbnRyb2xsZXIuZ2V0TWVzc2FnZSgpLnN1YnNjcmliZSgobWVzc2FnZTogTWVzc2FnZSkgPT4ge1xyXG4gICAgICBpZiAobWVzc2FnZS5hY3Rpb24gPT09ICdHZXRSZXBvcnQnIHx8IG1lc3NhZ2UuYWN0aW9uID09PSAnT3BlblJlcG9ydCcpIHtcclxuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgIGlmICh0aGlzLm1vZGVsLnJlcG9ydFBhcmFtcy5ib29rbWFya3NDb250ZW50ICE9IG51bGwpIHtcclxuICAgICAgICAgICAgdGhpcy5jcmVhdGUoKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIHRoaXMubW9kZWwuY29udHJvbHMuYm9va21hcmtzUGFuZWwudmlzaWJsZSA9IHRoaXMubW9kZWwucmVwb3J0UGFyYW1zLmJvb2ttYXJrc0NvbnRlbnQgIT09IG51bGwgJiYgIXRoaXMubW9kZWwub3B0aW9ucy5pc01vYmlsZURldmljZTtcclxuICAgICAgICB9KTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICAvLyBHbyB0byB0aGUgYm9va21hcmssIGlmIGl0IHByZXNlbnRcclxuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgIGlmICh0aGlzLm1vZGVsLm9wdGlvbnMuYm9va21hcmtBbmNob3IgIT0gbnVsbCkge1xyXG4gICAgICAgICAgICB0aGlzLmhlbHBlci5zY3JvbGxUb0FuY2hvcih0aGlzLm1vZGVsLm9wdGlvbnMuYm9va21hcmtBbmNob3IsIHRoaXMubW9kZWwub3B0aW9ucy5jb21wb25lbnRHdWlkKTtcclxuICAgICAgICAgICAgdGhpcy5tb2RlbC5vcHRpb25zLmJvb2ttYXJrQW5jaG9yID0gbnVsbDtcclxuICAgICAgICAgICAgdGhpcy5tb2RlbC5vcHRpb25zLmNvbXBvbmVudEd1aWQgPSBudWxsO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuXHJcbiAgICB0aGlzLm1vZGVsLmNvbnRyb2xzLmJvb2ttYXJrc1BhbmVsLmdldFZpc2liaWxpdHkoKS5zdWJzY3JpYmUoKHZhbHVlKSA9PiB7XHJcbiAgICAgIGlmICghdmFsdWUpIHtcclxuICAgICAgICB0aGlzLmhlbHBlci5yZW1vdmVCb29rbWFya3NMYWJlbCgpO1xyXG4gICAgICAgIHRoaXMuY2xlYXJTZWxlY3RlZCgpO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIG5nQWZ0ZXJWaWV3SW5pdCgpOiB2b2lkIHtcclxuICAgIHRoaXMubW9kZWwuY29udHJvbHMuYm9va21hcmtzUGFuZWwuZWwgPSB0aGlzLmVsZW1lbnQ7XHJcbiAgfVxyXG5cclxuICBuZ09uSW5pdCgpIHsgfVxyXG5cclxuICBwdWJsaWMgZ2V0SW1nMShub2RlOiBCb29rbWFya05vZGUsIGk6IG51bWJlcik6IHN0cmluZyB7XHJcbiAgICBpZiAobm9kZS5ub2Rlcz8ubGVuZ3RoID09PSAwKSB7XHJcbiAgICAgIHJldHVybiBpICE9PSB0aGlzLm1vZGVsLm5vZGVzLmxlbmd0aCAtIDEgPyB0aGlzLm1vZGVsLmltYWdlc0ZvckJvb2ttYXJrWydqb2luJ10gOiB0aGlzLm1vZGVsLmltYWdlc0ZvckJvb2ttYXJrWydqb2luQm90dG9tJ107XHJcbiAgICB9XHJcbiAgICByZXR1cm4gbm9kZS5vcGVuID8gKGkgPT09IHRoaXMubW9kZWwubm9kZXMubGVuZ3RoIC0gMSA/IHRoaXMubW9kZWwuaW1hZ2VzRm9yQm9va21hcmtbJ21pbnVzQm90dG9tJ10gOiB0aGlzLm1vZGVsLmltYWdlc0ZvckJvb2ttYXJrWydtaW51cyddKSA6XHJcbiAgICAgIChpID09PSB0aGlzLm1vZGVsLm5vZGVzLmxlbmd0aCAtIDEgPyB0aGlzLm1vZGVsLmltYWdlc0ZvckJvb2ttYXJrWydwbHVzQm90dG9tJ10gOiB0aGlzLm1vZGVsLmltYWdlc0ZvckJvb2ttYXJrWydwbHVzJ10pO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHBvc3RBY3Rpb24obm9kZTogQm9va21hcmtOb2RlKSB7XHJcbiAgICB0aGlzLmNsZWFyU2VsZWN0ZWQoKTtcclxuICAgIHRoaXMuY29udHJvbGxlci5wb3N0Qm9va21hcmtOb2RlQWN0aW9uKG5vZGUpO1xyXG4gIH1cclxuXHJcbiAgY2xlYXJTZWxlY3RlZCgpIHtcclxuICAgIHRoaXMubW9kZWwubm9kZXM/LmZvckVhY2goKG4pID0+IHtcclxuICAgICAgbi5zZWxlY3RlZCA9IGZhbHNlO1xyXG4gICAgICBuLm5vZGVzLmZvckVhY2goZWxlbWVudCA9PiBlbGVtZW50LnNlbGVjdGVkID0gZmFsc2UpO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBjcmVhdGUoKSB7XHJcbiAgICBsZXQgYm9va21hcmtzID0gSlNPTi5wYXJzZSh0aGlzLm1vZGVsLnJlcG9ydFBhcmFtcy5ib29rbWFya3NDb250ZW50KTtcclxuICAgIHRoaXMucm9vdE5hbWUgPSBib29rbWFya3MuYm9va21hcmtzVHJlZVswXS50aXRsZTtcclxuXHJcbiAgICBjb25zdCBub2RlczogQm9va21hcmtOb2RlW10gPSBbXTtcclxuICAgIHRoaXMucGFyc2VOb2Rlcyhib29rbWFya3MsIDAsIG5vZGVzKTtcclxuICAgIHRoaXMubW9kZWwubm9kZXMgPSBub2RlcztcclxuICB9XHJcblxyXG4gIHBhcnNlTm9kZXMoYm9va21hcmtzOiBhbnksIGluZGV4OiBudW1iZXIsIG5vZGVzOiBCb29rbWFya05vZGVbXSkge1xyXG4gICAgbGV0IGZvbGRlcjogQm9va21hcmtOb2RlO1xyXG4gICAgYm9va21hcmtzLmJvb2ttYXJrc1RyZWUuc3BsaWNlKDEpLmZvckVhY2goKGJvb2ttYXJrKSA9PiB7XHJcbiAgICAgIGxldCBwYWdlID0gYm9va21hcmsuY29tcG9uZW50R3VpZCAhPSBudWxsICYmIGJvb2ttYXJrcy5ib29rbWFya3NQYWdlSW5kZXhlcyAhPSBudWxsID8gKGJvb2ttYXJrcy5ib29rbWFya3NQYWdlSW5kZXhlc1tib29rbWFyay5jb21wb25lbnRHdWlkXSAtIDEgPz8gMCkgOiAwO1xyXG4gICAgICBjb25zdCBub2RlOiBCb29rbWFya05vZGUgPSB7IG5hbWU6IGJvb2ttYXJrLnRpdGxlLCB1cmw6IGJvb2ttYXJrLnVybCwgcGFnZTogcGFnZSwgY29tcHVuZW50R3VpZDogYm9va21hcmsuY29tcG9uZW50R3VpZCwgbm9kZXM6IFtdLCBvcGVuOiBmYWxzZSwgc2VsZWN0ZWQ6IGZhbHNlIH07XHJcbiAgICAgIGlmIChib29rbWFyay5wYXJlbnQgPT09IDApIHtcclxuICAgICAgICBub2Rlcy5wdXNoKG5vZGUpO1xyXG4gICAgICAgIGZvbGRlciA9IG5vZGU7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgZm9sZGVyLm5vZGVzLnB1c2gobm9kZSk7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgdW5lc2NhcGUoc3RyOiBzdHJpbmcpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIHN0ci5yZXBsYWNlKC9cXFxcJmFwb3M7L2csICdcXCcnKVxyXG4gICAgICAucmVwbGFjZSgvXFxcXCZxdW90Oy9nLCAnXCInKVxyXG4gICAgICAucmVwbGFjZSgvXFxcXCZndDsvZywgJz4nKVxyXG4gICAgICAucmVwbGFjZSgvXFxcXCZsdDsvZywgJzwnKVxyXG4gICAgICAucmVwbGFjZSgvXFxcXCZhbXA7L2csICcmJyk7XHJcbiAgfVxyXG5cclxuICBnZXQgYm90dG9tKCk6IHN0cmluZyB7XHJcbiAgICBpZiAodGhpcy5tb2RlbC5vcHRpb25zLmlzTW9iaWxlRGV2aWNlKSB7XHJcbiAgICAgIHJldHVybiB0aGlzLm1vZGVsLm9wdGlvbnMudG9vbGJhci5hdXRvSGlkZSA/ICcwJyA6ICcwLjVpbic7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICByZXR1cm4gdGhpcy5tb2RlbC5vcHRpb25zLnRvb2xiYXIuZGlzcGxheU1vZGUgPT09ICdTZXBhcmF0ZWQnICYmIHRoaXMubW9kZWwub3B0aW9ucy50b29sYmFyLnZpc2libGUgPyAnMzVweCcgOiAnMCc7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxufVxyXG4iXX0=