UNPKG

@nova-ui/bits

Version:

SolarWinds Nova Framework

193 lines 23.8 kB
// © 2022 SolarWinds Worldwide, LLC. All rights reserved. // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to // deal in the Software without restriction, including without limitation the // rights to use, copy, modify, merge, publish, distribute, sublicense, and/or // sell copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // THE SOFTWARE. import { Directive, ElementRef, EventEmitter, Output, } from "@angular/core"; import filter from "lodash/filter"; import forEach from "lodash/forEach"; import * as i0 from "@angular/core"; /** * Directive that provides resize event for any element * * __Usage:__ * * In parent components use this to subscribe to resize event: * * `@ViewChild(ResizeDirective) child: ResizeDirective; * * public checkResize = () => { * * this.child.elementResize.subscribe((event: any) => console.log("change", event)); * * };` * * To remove resize event handler: * * `@ViewChild(ResizeDirective) child: ResizeDirective; * * this.child.removeResize()` * */ /** * <example-url>./../examples/index.html#/resize</example-url> */ /** * @ignore */ export class ResizeDirective { constructor(element) { this.element = element; /** * Event to be triggered on element resize */ this.elementResize = new EventEmitter(); /** * Class for dimension change detection * Using nested private class to prevent external class instantiation. */ this.resizeEventQueue = class { constructor() { this.events = []; } add(event) { this.events.push(event); } call() { forEach(this.events, (event) => event.call()); } remove(event) { this.events = filter(this.events, (item) => item !== event); } }; /** * Emits resize event */ this.resizeEmit = () => { this.elementResize.emit(true); }; /** * Removing resize listener from target element */ this.detachResizeEvent = (targetElement, event) => { if (targetElement.resizedAttached && typeof event === "function") { targetElement.resizedAttached.remove(event); } if (targetElement.contains(targetElement.resizeSensor)) { targetElement.removeChild(targetElement.resizeSensor); } delete targetElement.resizeSensor; delete targetElement.resizedAttached; }; } ngAfterViewInit() { this.attachResizeEvent(this.element.nativeElement, this.resizeEmit); } ngOnDestroy() { this.elementResize.unsubscribe(); this.removeResize(); } /** * Removes resize listener from the element for public use. We could stop resize event * listener by using this method in parent through @ViewChild */ removeResize() { this.detachResizeEvent(this.element.nativeElement, this.resizeEmit); } /** * Add resize event which will be done by default */ attachResizeEvent(targetElement, resizeCallback) { if (targetElement.resizedAttached) { targetElement.resizedAttached.add(resizeCallback); return; } targetElement.resizedAttached = new this.resizeEventQueue(); targetElement.resizedAttached.add(resizeCallback); // This elements is hidden and helping to trigger scroll event when user resize element with nuiResize. targetElement.resizeSensor = document.createElement("div"); targetElement.resizeSensor.className = "resize-sensor"; const style = "position: absolute; left: 0; top: 0; right: 0; " + "bottom: 0; overflow: hidden; z-index: -1; visibility: hidden;"; const styleChild = "position: absolute; left: 0; top: 0; transition: 0s;"; targetElement.resizeSensor.style.cssText = style; targetElement.resizeSensor.innerHTML = `<div class="resize-sensor-expand" style="${style}"> <div style="${styleChild}"></div> </div> <div class="resize-sensor-shrink" style="${style}"> <div style="${styleChild} width: 200%; height: 200%"></div> </div>`; targetElement.appendChild(targetElement.resizeSensor); if (targetElement.resizeSensor.offsetParent !== targetElement) { targetElement.style.position = "relative"; } const expand = targetElement.resizeSensor.childNodes[0]; const expandChild = expand.childNodes[1]; const shrink = targetElement.resizeSensor.childNodes[2]; let lastWidth = targetElement.offsetWidth; let lastHeight = targetElement.offsetHeight; let dirty; let rafId; let newWidth; let newHeight; function reset() { expandChild.style.width = "100000px"; expandChild.style.height = "100000px"; expand.scrollLeft = 100000; expand.scrollTop = 100000; shrink.scrollLeft = 100000; shrink.scrollTop = 100000; } reset(); function onResized() { rafId = 0; if (!dirty) { return; } lastWidth = newWidth; lastHeight = newHeight; if (targetElement.resizedAttached) { targetElement.resizedAttached.call(); } } function onScroll() { newWidth = targetElement.offsetWidth; newHeight = targetElement.offsetHeight; dirty = newWidth !== lastWidth || newHeight !== lastHeight; if (dirty && !rafId) { rafId = requestAnimationFrame(onResized); } reset(); } function addEvent(element, event, callback) { element.addEventListener(event, callback); } addEvent(expand, "scroll", onScroll); addEvent(shrink, "scroll", onScroll); } static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: ResizeDirective, deps: [{ token: i0.ElementRef }], target: i0.ɵɵFactoryTarget.Directive }); } static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "17.3.12", type: ResizeDirective, selector: "[nuiResize]", outputs: { elementResize: "elementResize" }, ngImport: i0 }); } } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: ResizeDirective, decorators: [{ type: Directive, args: [{ selector: "[nuiResize]", }] }], ctorParameters: () => [{ type: i0.ElementRef }], propDecorators: { elementResize: [{ type: Output }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVzaXplLmRpcmVjdGl2ZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9jb21tb24vZGlyZWN0aXZlcy9yZXNpemUvcmVzaXplLmRpcmVjdGl2ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSx5REFBeUQ7QUFDekQsRUFBRTtBQUNGLCtFQUErRTtBQUMvRSw0RUFBNEU7QUFDNUUsOEVBQThFO0FBQzlFLCtFQUErRTtBQUMvRSw4RUFBOEU7QUFDOUUsNERBQTREO0FBQzVELEVBQUU7QUFDRiw2RUFBNkU7QUFDN0UsdURBQXVEO0FBQ3ZELEVBQUU7QUFDRiw2RUFBNkU7QUFDN0UsNEVBQTRFO0FBQzVFLCtFQUErRTtBQUMvRSwwRUFBMEU7QUFDMUUsaUZBQWlGO0FBQ2pGLDZFQUE2RTtBQUM3RSxpQkFBaUI7QUFFakIsT0FBTyxFQUVILFNBQVMsRUFDVCxVQUFVLEVBQ1YsWUFBWSxFQUVaLE1BQU0sR0FDVCxNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLE1BQU0sTUFBTSxlQUFlLENBQUM7QUFDbkMsT0FBTyxPQUFPLE1BQU0sZ0JBQWdCLENBQUM7O0FBZXJDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FxQkc7QUFDSDs7R0FFRztBQUNIOztHQUVHO0FBSUgsTUFBTSxPQUFPLGVBQWU7SUE2QnhCLFlBQW9CLE9BQW1CO1FBQW5CLFlBQU8sR0FBUCxPQUFPLENBQVk7UUE1QnZDOztXQUVHO1FBQ2Msa0JBQWEsR0FBRyxJQUFJLFlBQVksRUFBVyxDQUFDO1FBRTdEOzs7V0FHRztRQUNLLHFCQUFnQixHQUFHO1lBQUE7Z0JBQ2hCLFdBQU0sR0FBVSxFQUFFLENBQUM7WUFnQjlCLENBQUM7WUFkVSxHQUFHLENBQUMsS0FBZTtnQkFDdEIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDNUIsQ0FBQztZQUVNLElBQUk7Z0JBQ1AsT0FBTyxDQUFDLElBQUksQ0FBQyxNQUFNLEVB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QUFDLFlBQVksQ0FBQztZQUN2QyxLQUFLLEdBQUcsUUFBUSxLQUFLLFNBQVMsSUFBSSxTQUFTLEtBQUssVUFBVSxDQUFDO1lBRTNELElBQUksS0FBSyxJQUFJLENBQUMsS0FBSyxFQUFFO2dCQUNqQixLQUFLLEdBQUcscUJBQXFCLENBQUMsU0FBUyxDQUFDLENBQUM7YUFDNUM7WUFFRCxLQUFLLEVBQUUsQ0FBQztRQUNaLENBQUM7UUFFRCxTQUFTLFFBQVEsQ0FDYixPQUF1QixFQUN2QixLQUFhLEVBQ2IsUUFBdUI7WUFFdkIsT0FBTyxDQUFDLGdCQUFnQixDQUFDLEtBQUssRUFBRSxRQUFRLENBQUMsQ0FBQztRQUM5QyxDQUFDO1FBRUQsUUFBUSxDQUFDLE1BQU0sRUFBRSxRQUFRLEVBQUUsUUFBUSxDQUFDLENBQUM7UUFDckMsUUFBUSxDQUFDLE1BQU0sRUFBRSxRQUFRLEVBQUUsUUFBUSxDQUFDLENBQUM7SUFDekMsQ0FBQzsrR0F6SlEsZUFBZTttR0FBZixlQUFlOzs0RkFBZixlQUFlO2tCQUgzQixTQUFTO21CQUFDO29CQUNQLFFBQVEsRUFBRSxhQUFhO2lCQUMxQjsrRUFLb0IsYUFBYTtzQkFBN0IsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbIi8vIMKpIDIwMjIgU29sYXJXaW5kcyBXb3JsZHdpZGUsIExMQy4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbi8vXG4vLyBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5XG4vLyAgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgXCJTb2Z0d2FyZVwiKSwgdG9cbi8vICBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZVxuLy8gIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vclxuLy8gIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzXG4vLyAgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczpcbi8vXG4vLyBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpblxuLy8gIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLlxuLy9cbi8vIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1Jcbi8vICBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSxcbi8vICBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEVcbi8vICBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSXG4vLyAgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSxcbi8vICBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOXG4vLyAgVEhFIFNPRlRXQVJFLlxuXG5pbXBvcnQge1xuICAgIEFmdGVyVmlld0luaXQsXG4gICAgRGlyZWN0aXZlLFxuICAgIEVsZW1lbnRSZWYsXG4gICAgRXZlbnRFbWl0dGVyLFxuICAgIE9uRGVzdHJveSxcbiAgICBPdXRwdXQsXG59IGZyb20gXCJAYW5ndWxhci9jb3JlXCI7XG5pbXBvcnQgZmlsdGVyIGZyb20gXCJsb2Rhc2gvZmlsdGVyXCI7XG5pbXBvcnQgZm9yRWFjaCBmcm9tIFwibG9kYXNoL2ZvckVhY2hcIjtcblxuLyoqIEBpZ25vcmUgKi9cbmludGVyZmFjZSBJUmVzaXplRXZlbnRRdWV1ZSB7XG4gICAgZXZlbnRzOiBhbnlbXTtcbiAgICBhZGQoZXZlbnQ6IEZ1bmN0aW9uKTogdm9pZDtcbiAgICBjYWxsKCk6IHZvaWQ7XG4gICAgcmVtb3ZlKGV2ZW50OiBGdW5jdGlvbik6IHZvaWQ7XG59XG4vKiogQGlnbm9yZSAqL1xuaW50ZXJmYWNlIElSZXNpemVFbGVtZW50IGV4dGVuZHMgSFRNTEVsZW1lbnQge1xuICAgIHJlc2l6ZWRBdHRhY2hlZD86IElSZXNpemVFdmVudFF1ZXVlO1xuICAgIHJlc2l6ZVNlbnNvcj86IGFueTtcbn1cblxuLyoqXG4gKiBEaXJlY3RpdmUgdGhhdCBwcm92aWRlcyByZXNpemUgZXZlbnQgZm9yIGFueSBlbGVtZW50XG4gKlxuICogX19Vc2FnZTpfX1xuICpcbiAqIEluIHBhcmVudCBjb21wb25lbnRzIHVzZSB0aGlzIHRvIHN1YnNjcmliZSB0byByZXNpemUgZXZlbnQ6XG4gKlxuICogICAgICAgYEBWaWV3Q2hpbGQoUmVzaXplRGlyZWN0aXZlKSBjaGlsZDogUmVzaXplRGlyZWN0aXZlO1xuICpcbiAqICAgICAgIHB1YmxpYyBjaGVja1Jlc2l6ZSA9ICgpID0+IHtcbiAqXG4gKiAgICAgICB0aGlzLmNoaWxkLmVsZW1lbnRSZXNpemUuc3Vic2NyaWJlKChldmVudDogYW55KSA9PiBjb25zb2xlLmxvZyhcImNoYW5nZVwiLCBldmVudCkpO1xuICpcbiAqICAgICAgIH07YFxuICpcbiAqIFRvIHJlbW92ZSByZXNpemUgZXZlbnQgaGFuZGxlcjpcbiAqXG4gKiAgICAgICBgQFZpZXdDaGlsZChSZXNpemVEaXJlY3RpdmUpIGNoaWxkOiBSZXNpemVEaXJlY3RpdmU7XG4gKlxuICogICAgICAgIHRoaXMuY2hpbGQucmVtb3ZlUmVzaXplKClgXG4gKlxuICovXG4vKipcbiAqIDxleGFtcGxlLXVybD4uLy4uL2V4YW1wbGVzL2luZGV4Lmh0bWwjL3Jlc2l6ZTwvZXhhbXBsZS11cmw+XG4gKi9cbi8qKlxuICogQGlnbm9yZVxuICovXG5ARGlyZWN0aXZlKHtcbiAgICBzZWxlY3RvcjogXCJbbnVpUmVzaXplXVwiLFxufSlcbmV4cG9ydCBjbGFzcyBSZXNpemVEaXJlY3RpdmUgaW1wbGVtZW50cyBBZnRlclZpZXdJbml0LCBPbkRlc3Ryb3kge1xuICAgIC8qKlxuICAgICAqIEV2ZW50IHRvIGJlIHRyaWdnZXJlZCBvbiBlbGVtZW50IHJlc2l6ZVxuICAgICAqL1xuICAgIEBPdXRwdXQoKSBwdWJsaWMgZWxlbWVudFJlc2l6ZSA9IG5ldyBFdmVudEVtaXR0ZXI8Ym9vbGVhbj4oKTtcblxuICAgIC8qKlxuICAgICAqIENsYXNzIGZvciBkaW1lbnNpb24gY2hhbmdlIGRldGVjdGlvblxuICAgICAqIFVzaW5nIG5lc3RlZCBwcml2YXRlIGNsYXNzIHRvIHByZXZlbnQgZXh0ZXJuYWwgY2xhc3MgaW5zdGFudGlhdGlvbi5cbiAgICAgKi9cbiAgICBwcml2YXRlIHJlc2l6ZUV2ZW50UXVldWUgPSBjbGFzcyBpbXBsZW1lbnRzIElSZXNpemVFdmVudFF1ZXVlIHtcbiAgICAgICAgcHVibGljIGV2ZW50czogYW55W10gPSBbXTtcblxuICAgICAgICBwdWJsaWMgYWRkKGV2ZW50OiBGdW5jdGlvbikge1xuICAgICAgICAgICAgdGhpcy5ldmVudHMucHVzaChldmVudCk7XG4gICAgICAgIH1cblxuICAgICAgICBwdWJsaWMgY2FsbCgpIHtcbiAgICAgICAgICAgIGZvckVhY2godGhpcy5ldmVudHMsIChldmVudCkgPT4gZXZlbnQuY2FsbCgpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHB1YmxpYyByZW1vdmUoZXZlbnQ6IEZ1bmN0aW9uKSB7XG4gICAgICAgICAgICB0aGlzLmV2ZW50cyA9IGZpbHRlcihcbiAgICAgICAgICAgICAgICB0aGlzLmV2ZW50cyxcbiAgICAgICAgICAgICAgICAoaXRlbTogRnVuY3Rpb24pID0+IGl0ZW0gIT09IGV2ZW50XG4gICAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgfTtcblxuICAgIGNvbnN0cnVjdG9yKHByaXZhdGUgZWxlbWVudDogRWxlbWVudFJlZikge31cblxuICAgIHB1YmxpYyBuZ0FmdGVyVmlld0luaXQoKTogdm9pZCB7XG4gICAgICAgIHRoaXMuYXR0YWNoUmVzaXplRXZlbnQodGhpcy5lbGVtZW50Lm5hdGl2ZUVsZW1lbnQsIHRoaXMucmVzaXplRW1pdCk7XG4gICAgfVxuXG4gICAgcHVibGljIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgICAgICB0aGlzLmVsZW1lbnRSZXNpemUudW5zdWJzY3JpYmUoKTtcbiAgICAgICAgdGhpcy5yZW1vdmVSZXNpemUoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZW1vdmVzIHJlc2l6ZSBsaXN0ZW5lciBmcm9tIHRoZSBlbGVtZW50IGZvciBwdWJsaWMgdXNlLiBXZSBjb3VsZCBzdG9wIHJlc2l6ZSBldmVudFxuICAgICAqIGxpc3RlbmVyIGJ5IHVzaW5nIHRoaXMgbWV0aG9kIGluIHBhcmVudCB0aHJvdWdoIEBWaWV3Q2hpbGRcbiAgICAgKi9cbiAgICBwdWJsaWMgcmVtb3ZlUmVzaXplKCk6IHZvaWQge1xuICAgICAgICB0aGlzLmRldGFjaFJlc2l6ZUV2ZW50KHRoaXMuZWxlbWVudC5uYXRpdmVFbGVtZW50LCB0aGlzLnJlc2l6ZUVtaXQpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEVtaXRzIHJlc2l6ZSBldmVudFxuICAgICAqL1xuICAgIHByaXZhdGUgcmVzaXplRW1pdCA9ICgpOiB2b2lkID0+IHtcbiAgICAgICAgdGhpcy5lbGVtZW50UmVzaXplLmVtaXQodHJ1ZSk7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIEFkZCByZXNpemUgZXZlbnQgd2hpY2ggd2lsbCBiZSBkb25lIGJ5IGRlZmF1bHRcbiAgICAgKi9cbiAgICBwcml2YXRlIGF0dGFjaFJlc2l6ZUV2ZW50KFxuICAgICAgICB0YXJnZXRFbGVtZW50OiBJUmVzaXplRWxlbWVudCxcbiAgICAgICAgcmVzaXplQ2FsbGJhY2s6IEZ1bmN0aW9uXG4gICAgKTogdm9pZCB7XG4gICAgICAgIGlmICh0YXJnZXRFbGVtZW50LnJlc2l6ZWRBdHRhY2hlZCkge1xuICAgICAgICAgICAgdGFyZ2V0RWxlbWVudC5yZXNpemVkQXR0YWNoZWQuYWRkKHJlc2l6ZUNhbGxiYWNrKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRhcmdldEVsZW1lbnQucmVzaXplZEF0dGFjaGVkID0gbmV3IHRoaXMucmVzaXplRXZlbnRRdWV1ZSgpO1xuICAgICAgICB0YXJnZXRFbGVtZW50LnJlc2l6ZWRBdHRhY2hlZC5hZGQocmVzaXplQ2FsbGJhY2spO1xuXG4gICAgICAgIC8vIFRoaXMgZWxlbWVudHMgaXMgaGlkZGVuIGFuZCBoZWxwaW5nIHRvIHRyaWdnZXIgc2Nyb2xsIGV2ZW50IHdoZW4gdXNlciByZXNpemUgZWxlbWVudCB3aXRoIG51aVJlc2l6ZS5cbiAgICAgICAgdGFyZ2V0RWxlbWVudC5yZXNpemVTZW5zb3IgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuICAgICAgICB0YXJnZXRFbGVtZW50LnJlc2l6ZVNlbnNvci5jbGFzc05hbWUgPSBcInJlc2l6ZS1zZW5zb3JcIjtcbiAgICAgICAgY29uc3Qgc3R5bGUgPVxuICAgICAgICAgICAgXCJwb3NpdGlvbjogYWJzb2x1dGU7IGxlZnQ6IDA7IHRvcDogMDsgcmlnaHQ6IDA7IFwiICtcbiAgICAgICAgICAgIFwiYm90dG9tOiAwOyBvdmVyZmxvdzogaGlkZGVuOyB6LWluZGV4OiAtMTsgdmlzaWJpbGl0eTogaGlkZGVuO1wiO1xuICAgICAgICBjb25zdCBzdHlsZUNoaWxkID1cbiAgICAgICAgICAgIFwicG9zaXRpb246IGFic29sdXRlOyBsZWZ0OiAwOyB0b3A6IDA7IHRyYW5zaXRpb246IDBzO1wiO1xuXG4gICAgICAgIHRhcmdldEVsZW1lbnQucmVzaXplU2Vuc29yLnN0eWxlLmNzc1RleHQgPSBzdHlsZTtcbiAgICAgICAgdGFyZ2V0RWxlbWVudC5yZXNpemVTZW5zb3IuaW5uZXJIVE1MID0gYDxkaXYgY2xhc3M9XCJyZXNpemUtc2Vuc29yLWV4cGFuZFwiIHN0eWxlPVwiJHtzdHlsZX1cIj5cbiAgICAgICAgICAgICAgICA8ZGl2IHN0eWxlPVwiJHtzdHlsZUNoaWxkfVwiPjwvZGl2PlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJlc2l6ZS1zZW5zb3Itc2hyaW5rXCIgc3R5bGU9XCIke3N0eWxlfVwiPlxuICAgICAgICAgICAgICAgIDxkaXYgc3R5bGU9XCIke3N0eWxlQ2hpbGR9IHdpZHRoOiAyMDAlOyBoZWlnaHQ6IDIwMCVcIj48L2Rpdj5cbiAgICAgICAgICAgICAgPC9kaXY+YDtcblxuICAgICAgICB0YXJnZXRFbGVtZW50LmFwcGVuZENoaWxkKHRhcmdldEVsZW1lbnQucmVzaXplU2Vuc29yKTtcblxuICAgICAgICBpZiAodGFyZ2V0RWxlbWVudC5yZXNpemVTZW5zb3Iub2Zmc2V0UGFyZW50ICE9PSB0YXJnZXRFbGVtZW50KSB7XG4gICAgICAgICAgICB0YXJnZXRFbGVtZW50LnN0eWxlLnBvc2l0aW9uID0gXCJyZWxhdGl2ZVwiO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgZXhwYW5kID0gdGFyZ2V0RWxlbWVudC5yZXNpemVTZW5zb3IuY2hpbGROb2Rlc1swXTtcbiAgICAgICAgY29uc3QgZXhwYW5kQ2hpbGQgPSBleHBhbmQuY2hpbGROb2Rlc1sxXTtcbiAgICAgICAgY29uc3Qgc2hyaW5rID0gdGFyZ2V0RWxlbWVudC5yZXNpemVTZW5zb3IuY2hpbGROb2Rlc1syXTtcbiAgICAgICAgbGV0IGxhc3RXaWR0aCA9IHRhcmdldEVsZW1lbnQub2Zmc2V0V2lkdGg7XG4gICAgICAgIGxldCBsYXN0SGVpZ2h0ID0gdGFyZ2V0RWxlbWVudC5vZmZzZXRIZWlnaHQ7XG4gICAgICAgIGxldCBkaXJ0eTogYm9vbGVhbjtcbiAgICAgICAgbGV0IHJhZklkOiBudW1iZXI7XG4gICAgICAgIGxldCBuZXdXaWR0aDogbnVtYmVyO1xuICAgICAgICBsZXQgbmV3SGVpZ2h0OiBudW1iZXI7XG5cbiAgICAgICAgZnVuY3Rpb24gcmVzZXQoKTogdm9pZCB7XG4gICAgICAgICAgICBleHBhbmRDaGlsZC5zdHlsZS53aWR0aCA9IFwiMTAwMDAwcHhcIjtcbiAgICAgICAgICAgIGV4cGFuZENoaWxkLnN0eWxlLmhlaWdodCA9IFwiMTAwMDAwcHhcIjtcblxuICAgICAgICAgICAgZXhwYW5kLnNjcm9sbExlZnQgPSAxMDAwMDA7XG4gICAgICAgICAgICBleHBhbmQuc2Nyb2xsVG9wID0gMTAwMDAwO1xuXG4gICAgICAgICAgICBzaHJpbmsuc2Nyb2xsTGVmdCA9IDEwMDAwMDtcbiAgICAgICAgICAgIHNocmluay5zY3JvbGxUb3AgPSAxMDAwMDA7XG4gICAgICAgIH1cblxuICAgICAgICByZXNldCgpO1xuXG4gICAgICAgIGZ1bmN0aW9uIG9uUmVzaXplZCgpOiB2b2lkIHtcbiAgICAgICAgICAgIHJhZklkID0gMDtcblxuICAgICAgICAgICAgaWYgKCFkaXJ0eSkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgbGFzdFdpZHRoID0gbmV3V2lkdGg7XG4gICAgICAgICAgICBsYXN0SGVpZ2h0ID0gbmV3SGVpZ2h0O1xuXG4gICAgICAgICAgICBpZiAodGFyZ2V0RWxlbWVudC5yZXNpemVkQXR0YWNoZWQpIHtcbiAgICAgICAgICAgICAgICB0YXJnZXRFbGVtZW50LnJlc2l6ZWRBdHRhY2hlZC5jYWxsKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBmdW5jdGlvbiBvblNjcm9sbCgpOiB2b2lkIHtcbiAgICAgICAgICAgIG5ld1dpZHRoID0gdGFyZ2V0RWxlbWVudC5vZmZzZXRXaWR0aDtcbiAgICAgICAgICAgIG5ld0hlaWdodCA9IHRhcmdldEVsZW1lbnQub2Zmc2V0SGVpZ2h0O1xuICAgICAgICAgICAgZGlydHkgPSBuZXdXaWR0aCAhPT0gbGFzdFdpZHRoIHx8IG5ld0hlaWdodCAhPT0gbGFzdEhlaWdodDtcblxuICAgICAgICAgICAgaWYgKGRpcnR5ICYmICFyYWZJZCkge1xuICAgICAgICAgICAgICAgIHJhZklkID0gcmVxdWVzdEFuaW1hdGlvbkZyYW1lKG9uUmVzaXplZCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJlc2V0KCk7XG4gICAgICAgIH1cblxuICAgICAgICBmdW5jdGlvbiBhZGRFdmVudChcbiAgICAgICAgICAgIGVsZW1lbnQ6IElSZXNpemVFbGVtZW50LFxuICAgICAgICAgICAgZXZlbnQ6IHN0cmluZyxcbiAgICAgICAgICAgIGNhbGxiYWNrOiBFdmVudExpc3RlbmVyXG4gICAgICAgICk6IHZvaWQge1xuICAgICAgICAgICAgZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKGV2ZW50LCBjYWxsYmFjayk7XG4gICAgICAgIH1cblxuICAgICAgICBhZGRFdmVudChleHBhbmQsIFwic2Nyb2xsXCIsIG9uU2Nyb2xsKTtcbiAgICAgICAgYWRkRXZlbnQoc2hyaW5rLCBcInNjcm9sbFwiLCBvblNjcm9sbCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVtb3ZpbmcgcmVzaXplIGxpc3RlbmVyIGZyb20gdGFyZ2V0IGVsZW1lbnRcbiAgICAgKi9cbiAgICBwcml2YXRlIGRldGFjaFJlc2l6ZUV2ZW50ID0gKFxuICAgICAgICB0YXJnZXRFbGVtZW50OiBJUmVzaXplRWxlbWVudCxcbiAgICAgICAgZXZlbnQ6IEZ1bmN0aW9uXG4gICAgKSA9PiB7XG4gICAgICAgIGlmICh0YXJnZXRFbGVtZW50LnJlc2l6ZWRBdHRhY2hlZCAmJiB0eXBlb2YgZXZlbnQgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICAgICAgdGFyZ2V0RWxlbWVudC5yZXNpemVkQXR0YWNoZWQucmVtb3ZlKGV2ZW50KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGFyZ2V0RWxlbWVudC5jb250YWlucyh0YXJnZXRFbGVtZW50LnJlc2l6ZVNlbnNvcikpIHtcbiAgICAgICAgICAgIHRhcmdldEVsZW1lbnQucmVtb3ZlQ2hpbGQodGFyZ2V0RWxlbWVudC5yZXNpemVTZW5zb3IpO1xuICAgICAgICB9XG5cbiAgICAgICAgZGVsZXRlIHRhcmdldEVsZW1lbnQucmVzaXplU2Vuc29yO1xuICAgICAgICBkZWxldGUgdGFyZ2V0RWxlbWVudC5yZXNpemVkQXR0YWNoZWQ7XG4gICAgfTtcbn1cbiJdfQ==