ng-devui
Version:
DevUI components based on Angular
203 lines • 31.2 kB
JavaScript
import { DOCUMENT } from '@angular/common';
import { Component, ElementRef, EventEmitter, Inject, Input, Output, Renderer2 } from '@angular/core';
import { DEFAULT_MODE, DEFAULT_ZINDEX, ESC_KEYCODE } from './fullscreen.config';
import * as i0 from "@angular/core";
export class FullscreenComponent {
constructor(doc, elementRef, render) {
this.doc = doc;
this.elementRef = elementRef;
this.render = render;
this.mode = DEFAULT_MODE;
this.zIndex = DEFAULT_ZINDEX;
this.fullscreenLaunch = new EventEmitter();
this.isFullscreen = false;
this.onFullScreenChange = (event) => {
if (this.currentTarget) {
const targetElement = this.currentTarget;
if (this.doc.fullscreenElement || this.doc.msFullscreenElement || this.doc.webkitFullscreenElement) {
this.addFullScreenStyle();
this.launchNormalFullscreen(targetElement);
}
else {
this.removeFullScreenStyle();
this.currentTarget = null;
this.exitNormalFullscreen(targetElement);
}
// F11退出全屏时,需要将全屏状态传出去
const isFullscreen = !!(this.doc.fullscreenElement || this.doc.msFullscreenElement || this.doc.webkitFullscreenElement);
this.fullscreenLaunch.emit({ isFullscreen });
this.isFullscreen = isFullscreen;
}
};
this.handleFullscreen = () => {
const targetElement = this.elementRef.nativeElement.querySelector('[fullscreen-target]');
const fullscreen = this.mode === 'normal'
? targetElement.classList.contains('fullscreen')
: !!(this.doc.fullscreenElement || this.doc.msFullscreenElement || this.doc.webkitFullscreenElement);
this.beforeChangeCheck(fullscreen, 'click', async () => {
this.isFullscreen =
this.mode === 'normal'
? this.normalFullscreenCallback(fullscreen, targetElement)
: await this.immersiveFullScreenCallback(fullscreen, targetElement);
this.fullscreenLaunch.emit({ isFullscreen: this.isFullscreen });
});
};
this.handleKeyDown = (event) => {
// 按ESC键退出全屏
if (event.keyCode === ESC_KEYCODE && this.isFullscreen) {
this.beforeChangeCheck(this.isFullscreen, 'esc', () => {
const targetElement = this.elementRef.nativeElement.querySelector('[fullscreen-target]');
if (this.mode === 'normal') {
this.removeFullScreenStyle();
this.exitNormalFullscreen(targetElement);
}
else if (this.doc.fullscreenElement) {
this.exitImmersiveFullScreen(this.doc);
}
this.isFullscreen = false;
this.fullscreenLaunch.emit({ isFullscreen: false });
});
}
};
this.document = this.doc;
}
ngOnInit() {
this.document.addEventListener('fullscreenchange', this.onFullScreenChange);
this.document.addEventListener('MSFullscreenChange', this.onFullScreenChange);
this.document.addEventListener('webkitfullscreenchange', this.onFullScreenChange);
this.document.addEventListener('keydown', this.handleKeyDown);
}
ngAfterViewInit() {
const btnLaunch = this.elementRef.nativeElement.querySelector('[fullscreen-launch]');
if (btnLaunch) {
btnLaunch.addEventListener('click', this.handleFullscreen);
}
}
ngOnDestroy() {
this.document.removeEventListener('fullscreenchange', this.onFullScreenChange);
this.document.removeEventListener('MSFullscreenChange', this.onFullScreenChange);
this.document.removeEventListener('webkitfullscreenchange', this.onFullScreenChange);
this.document.removeEventListener('keydown', this.handleKeyDown);
const btnLaunch = this.elementRef.nativeElement.querySelector('[fullscreen-launch]');
if (btnLaunch) {
btnLaunch.removeEventListener('click', this.handleFullscreen);
}
}
launchNormalFullscreen(targetElement) {
targetElement.classList.add('fullscreen');
if (this.zIndex) {
targetElement.setAttribute('style', `z-index: ${this.zIndex}`);
}
}
exitNormalFullscreen(targetElement) {
targetElement.classList.remove('fullscreen');
targetElement.style.zIndex = null;
}
async launchImmersiveFullScreen(docElement) {
let fullscreenLaunch;
if (docElement.requestFullscreen) {
fullscreenLaunch = docElement.requestFullscreen();
}
else if (docElement.mozRequestFullScreen) {
fullscreenLaunch = docElement.mozRequestFullScreen();
}
else if (docElement.webkitRequestFullScreen) {
fullscreenLaunch = Promise.resolve(docElement.webkitRequestFullScreen());
}
else if (docElement.msRequestFullscreen) {
fullscreenLaunch = Promise.resolve(docElement.msRequestFullscreen());
}
return await fullscreenLaunch.then(() => !!this.doc.fullscreenElement);
}
async exitImmersiveFullScreen(doc) {
let fullscreenExit;
if (doc.exitFullscreen) {
fullscreenExit = doc.exitFullscreen();
}
else if (doc.mozCancelFullScreen) {
fullscreenExit = doc.mozCancelFullScreen();
}
else if (doc.webkitCancelFullScreen) {
fullscreenExit = Promise.resolve(doc.webkitCancelFullScreen());
}
else if (doc.msExitFullscreen) {
fullscreenExit = Promise.resolve(doc.msExitFullscreen());
}
return await fullscreenExit.then(() => !!this.doc.fullscreenElement);
}
canChange(isFullscreen, trigger) {
let changeResult = Promise.resolve(true);
if (this.beforeChange) {
const result = this.beforeChange(isFullscreen, trigger);
if (typeof result !== 'undefined') {
if (result.then) {
changeResult = result;
}
else if (result.subscribe) {
changeResult = result.toPromise();
}
else {
changeResult = Promise.resolve(result);
}
}
}
return changeResult;
}
beforeChangeCheck(fullscreen, trigger, func) {
this.canChange(fullscreen, trigger).then((permission) => permission && func());
}
normalFullscreenCallback(fullscreen, targetElement) {
if (fullscreen) {
this.removeFullScreenStyle();
this.exitNormalFullscreen(targetElement);
return false;
}
else {
this.addFullScreenStyle();
this.launchNormalFullscreen(targetElement);
return true;
}
}
async immersiveFullScreenCallback(fullscreen, targetElement) {
this.currentTarget = targetElement;
return fullscreen ? await this.exitImmersiveFullScreen(this.doc) : await this.launchImmersiveFullScreen(this.doc.documentElement);
}
addFullScreenStyle() {
if (this.container) {
this.render.addClass(this.container, 'devui-container-fullscreen');
}
else {
this.render.addClass(this.document.getElementsByTagName('html')[0], 'devui-fullscreen');
}
}
removeFullScreenStyle() {
if (this.container) {
this.render.removeClass(this.container, 'devui-container-fullscreen');
}
else {
this.render.removeClass(this.document.getElementsByTagName('html')[0], 'devui-fullscreen');
}
}
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: FullscreenComponent, deps: [{ token: DOCUMENT }, { token: i0.ElementRef }, { token: i0.Renderer2 }], target: i0.ɵɵFactoryTarget.Component }); }
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: FullscreenComponent, selector: "d-fullscreen", inputs: { mode: "mode", zIndex: "zIndex", target: "target", container: "container", beforeChange: "beforeChange" }, outputs: { fullscreenLaunch: "fullscreenLaunch" }, ngImport: i0, template: "<div class=\"fullscreen-container\">\n <ng-content select=\"[fullscreen-launch]\"></ng-content>\n <ng-content select=\"[fullscreen-target]\"></ng-content>\n</div>\n", styles: [":host ::ng-deep .fullscreen{position:fixed;top:0;left:0;width:100%;height:100%;z-index:10;overflow:auto;background-color:var(--devui-base-bg, #ffffff)}::ng-deep .devui-fullscreen{overflow:hidden}::ng-deep .devui-container-fullscreen{transform:translateZ(0)}\n"] }); }
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: FullscreenComponent, decorators: [{
type: Component,
args: [{ selector: 'd-fullscreen', preserveWhitespaces: false, template: "<div class=\"fullscreen-container\">\n <ng-content select=\"[fullscreen-launch]\"></ng-content>\n <ng-content select=\"[fullscreen-target]\"></ng-content>\n</div>\n", styles: [":host ::ng-deep .fullscreen{position:fixed;top:0;left:0;width:100%;height:100%;z-index:10;overflow:auto;background-color:var(--devui-base-bg, #ffffff)}::ng-deep .devui-fullscreen{overflow:hidden}::ng-deep .devui-container-fullscreen{transform:translateZ(0)}\n"] }]
}], ctorParameters: () => [{ type: undefined, decorators: [{
type: Inject,
args: [DOCUMENT]
}] }, { type: i0.ElementRef }, { type: i0.Renderer2 }], propDecorators: { mode: [{
type: Input
}], zIndex: [{
type: Input
}], target: [{
type: Input
}], container: [{
type: Input
}], beforeChange: [{
type: Input
}], fullscreenLaunch: [{
type: Output
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZnVsbHNjcmVlbi5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9kZXZ1aS9mdWxsc2NyZWVuL2Z1bGxzY3JlZW4uY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vZGV2dWkvZnVsbHNjcmVlbi9mdWxsc2NyZWVuLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMzQyxPQUFPLEVBQWlCLFNBQVMsRUFBRSxVQUFVLEVBQUUsWUFBWSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQXFCLE1BQU0sRUFBRSxTQUFTLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFFeEksT0FBTyxFQUFFLFlBQVksRUFBRSxjQUFjLEVBQUUsV0FBVyxFQUFFLE1BQU0scUJBQXFCLENBQUM7O0FBU2hGLE1BQU0sT0FBTyxtQkFBbUI7SUFjOUIsWUFBc0MsR0FBUSxFQUFVLFVBQXNCLEVBQVUsTUFBaUI7UUFBbkUsUUFBRyxHQUFILEdBQUcsQ0FBSztRQUFVLGVBQVUsR0FBVixVQUFVLENBQVk7UUFBVSxXQUFNLEdBQU4sTUFBTSxDQUFXO1FBYmhHLFNBQUksR0FBbUIsWUFBWSxDQUFDO1FBQ3BDLFdBQU0sR0FBRyxjQUFjLENBQUM7UUFPdkIscUJBQWdCLEdBQXNCLElBQUksWUFBWSxFQUFPLENBQUM7UUFHaEUsaUJBQVksR0FBRyxLQUFLLENBQUM7UUE4RnJCLHVCQUFrQixHQUFHLENBQUMsS0FBSyxFQUFFLEVBQUU7WUFDckMsSUFBSSxJQUFJLENBQUMsYUFBYSxFQUFFLENBQUM7Z0JBQ3ZCLE1BQU0sYUFBYSxHQUFnQixJQUFJLENBQUMsYUFBYSxDQUFDO2dCQUN0RCxJQUFJLElBQUksQ0FBQyxHQUFHLENBQUMsaUJBQWlCLElBQUksSUFBSSxDQUFDLEdBQUcsQ0FBQyxtQkFBbUIsSUFBSSxJQUFJLENBQUMsR0FBRyxDQUFDLHVCQUF1QixFQUFFLENBQUM7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QkFBbUI7a0JBTi9CLFNBQVM7K0JBQ0UsY0FBYyx1QkFHSCxLQUFLOzswQkFnQmIsTUFBTTsyQkFBQyxRQUFROzBGQWJuQixJQUFJO3NCQUFaLEtBQUs7Z0JBQ0csTUFBTTtzQkFBZCxLQUFLO2dCQUlHLE1BQU07c0JBQWQsS0FBSztnQkFDRyxTQUFTO3NCQUFqQixLQUFLO2dCQUNHLFlBQVk7c0JBQXBCLEtBQUs7Z0JBQ0ksZ0JBQWdCO3NCQUF6QixNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRE9DVU1FTlQgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgQWZ0ZXJWaWV3SW5pdCwgQ29tcG9uZW50LCBFbGVtZW50UmVmLCBFdmVudEVtaXR0ZXIsIEluamVjdCwgSW5wdXQsIE9uRGVzdHJveSwgT25Jbml0LCBPdXRwdXQsIFJlbmRlcmVyMiB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgT2JzZXJ2YWJsZSB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgREVGQVVMVF9NT0RFLCBERUZBVUxUX1pJTkRFWCwgRVNDX0tFWUNPREUgfSBmcm9tICcuL2Z1bGxzY3JlZW4uY29uZmlnJztcbmltcG9ydCB7IEZ1bGxzY3JlZW5Nb2RlIH0gZnJvbSAnLi9mdWxsc2NyZWVuLnR5cGUnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdkLWZ1bGxzY3JlZW4nLFxuICB0ZW1wbGF0ZVVybDogJy4vZnVsbHNjcmVlbi5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL2Z1bGxzY3JlZW4uY29tcG9uZW50LnNjc3MnXSxcbiAgcHJlc2VydmVXaGl0ZXNwYWNlczogZmFsc2UsXG59KVxuZXhwb3J0IGNsYXNzIEZ1bGxzY3JlZW5Db21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSwgQWZ0ZXJWaWV3SW5pdCB7XG4gIEBJbnB1dCgpIG1vZGU6IEZ1bGxzY3JlZW5Nb2RlID0gREVGQVVMVF9NT0RFO1xuICBASW5wdXQoKSB6SW5kZXggPSBERUZBVUxUX1pJTkRFWDtcbiAgLyoqXG4gICAqIEBkZXByZWNhdGVkXG4gICAqL1xuICBASW5wdXQoKSB0YXJnZXQ6IEhUTUxFbGVtZW50O1xuICBASW5wdXQoKSBjb250YWluZXI6IEhUTUxFbGVtZW50O1xuICBASW5wdXQoKSBiZWZvcmVDaGFuZ2U6IChpc0Z1bGxzY3JlZW46IGJvb2xlYW4sIHRyaWdnZXI6IHN0cmluZykgPT4gYm9vbGVhbiB8IFByb21pc2U8Ym9vbGVhbj4gfCBPYnNlcnZhYmxlPGJvb2xlYW4+O1xuICBAT3V0cHV0KCkgZnVsbHNjcmVlbkxhdW5jaDogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcbiAgZG9jdW1lbnQ6IERvY3VtZW50O1xuICBwcml2YXRlIGN1cnJlbnRUYXJnZXQ6IEhUTUxFbGVtZW50O1xuICBwcml2YXRlIGlzRnVsbHNjcmVlbiA9IGZhbHNlO1xuXG4gIGNvbnN0cnVjdG9yKEBJbmplY3QoRE9DVU1FTlQpIHByaXZhdGUgZG9jOiBhbnksIHByaXZhdGUgZWxlbWVudFJlZjogRWxlbWVudFJlZiwgcHJpdmF0ZSByZW5kZXI6IFJlbmRlcmVyMikge1xuICAgIHRoaXMuZG9jdW1lbnQgPSB0aGlzLmRvYztcbiAgfVxuXG4gIG5nT25Jbml0KCkge1xuICAgIHRoaXMuZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignZnVsbHNjcmVlbmNoYW5nZScsIHRoaXMub25GdWxsU2NyZWVuQ2hhbmdlKTtcbiAgICB0aGlzLmRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ01TRnVsbHNjcmVlbkNoYW5nZScsIHRoaXMub25GdWxsU2NyZWVuQ2hhbmdlKTtcbiAgICB0aGlzLmRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ3dlYmtpdGZ1bGxzY3JlZW5jaGFuZ2UnLCB0aGlzLm9uRnVsbFNjcmVlbkNoYW5nZSk7XG4gICAgdGhpcy5kb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdrZXlkb3duJywgdGhpcy5oYW5kbGVLZXlEb3duKTtcbiAgfVxuXG4gIG5nQWZ0ZXJWaWV3SW5pdCgpIHtcbiAgICBjb25zdCBidG5MYXVuY2ggPSB0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudC5xdWVyeVNlbGVjdG9yKCdbZnVsbHNjcmVlbi1sYXVuY2hdJyk7XG4gICAgaWYgKGJ0bkxhdW5jaCkge1xuICAgICAgYnRuTGF1bmNoLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgdGhpcy5oYW5kbGVGdWxsc2NyZWVuKTtcbiAgICB9XG4gIH1cblxuICBuZ09uRGVzdHJveSgpIHtcbiAgICB0aGlzLmRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2Z1bGxzY3JlZW5jaGFuZ2UnLCB0aGlzLm9uRnVsbFNjcmVlbkNoYW5nZSk7XG4gICAgdGhpcy5kb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdNU0Z1bGxzY3JlZW5DaGFuZ2UnLCB0aGlzLm9uRnVsbFNjcmVlbkNoYW5nZSk7XG4gICAgdGhpcy5kb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCd3ZWJraXRmdWxsc2NyZWVuY2hhbmdlJywgdGhpcy5vbkZ1bGxTY3JlZW5DaGFuZ2UpO1xuICAgIHRoaXMuZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsIHRoaXMuaGFuZGxlS2V5RG93bik7XG4gICAgY29uc3QgYnRuTGF1bmNoID0gdGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQucXVlcnlTZWxlY3RvcignW2Z1bGxzY3JlZW4tbGF1bmNoXScpO1xuICAgIGlmIChidG5MYXVuY2gpIHtcbiAgICAgIGJ0bkxhdW5jaC5yZW1vdmVFdmVudExpc3RlbmVyKCdjbGljaycsIHRoaXMuaGFuZGxlRnVsbHNjcmVlbik7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBsYXVuY2hOb3JtYWxGdWxsc2NyZWVuKHRhcmdldEVsZW1lbnQ6IEhUTUxFbGVtZW50KSB7XG4gICAgdGFyZ2V0RWxlbWVudC5jbGFzc0xpc3QuYWRkKCdmdWxsc2NyZWVuJyk7XG4gICAgaWYgKHRoaXMuekluZGV4KSB7XG4gICAgICB0YXJnZXRFbGVtZW50LnNldEF0dHJpYnV0ZSgnc3R5bGUnLCBgei1pbmRleDogJHt0aGlzLnpJbmRleH1gKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGV4aXROb3JtYWxGdWxsc2NyZWVuKHRhcmdldEVsZW1lbnQ6IEhUTUxFbGVtZW50KSB7XG4gICAgdGFyZ2V0RWxlbWVudC5jbGFzc0xpc3QucmVtb3ZlKCdmdWxsc2NyZWVuJyk7XG4gICAgdGFyZ2V0RWxlbWVudC5zdHlsZS56SW5kZXggPSBudWxsO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBsYXVuY2hJbW1lcnNpdmVGdWxsU2NyZWVuKGRvY0VsZW1lbnQ6IGFueSkge1xuICAgIGxldCBmdWxsc2NyZWVuTGF1bmNoO1xuICAgIGlmIChkb2NFbGVtZW50LnJlcXVlc3RGdWxsc2NyZWVuKSB7XG4gICAgICBmdWxsc2NyZWVuTGF1bmNoID0gZG9jRWxlbWVudC5yZXF1ZXN0RnVsbHNjcmVlbigpO1xuICAgIH0gZWxzZSBpZiAoZG9jRWxlbWVudC5tb3pSZXF1ZXN0RnVsbFNjcmVlbikge1xuICAgICAgZnVsbHNjcmVlbkxhdW5jaCA9IGRvY0VsZW1lbnQubW96UmVxdWVzdEZ1bGxTY3JlZW4oKTtcbiAgICB9IGVsc2UgaWYgKGRvY0VsZW1lbnQud2Via2l0UmVxdWVzdEZ1bGxTY3JlZW4pIHtcbiAgICAgIGZ1bGxzY3JlZW5MYXVuY2ggPSBQcm9taXNlLnJlc29sdmUoZG9jRWxlbWVudC53ZWJraXRSZXF1ZXN0RnVsbFNjcmVlbigpKTtcbiAgICB9IGVsc2UgaWYgKGRvY0VsZW1lbnQubXNSZXF1ZXN0RnVsbHNjcmVlbikge1xuICAgICAgZnVsbHNjcmVlbkxhdW5jaCA9IFByb21pc2UucmVzb2x2ZShkb2NFbGVtZW50Lm1zUmVxdWVzdEZ1bGxzY3JlZW4oKSk7XG4gICAgfVxuICAgIHJldHVybiBhd2FpdCBmdWxsc2NyZWVuTGF1bmNoLnRoZW4oKCkgPT4gISF0aGlzLmRvYy5mdWxsc2NyZWVuRWxlbWVudCk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGV4aXRJbW1lcnNpdmVGdWxsU2NyZWVuKGRvYzogYW55KSB7XG4gICAgbGV0IGZ1bGxzY3JlZW5FeGl0O1xuICAgIGlmIChkb2MuZXhpdEZ1bGxzY3JlZW4pIHtcbiAgICAgIGZ1bGxzY3JlZW5FeGl0ID0gZG9jLmV4aXRGdWxsc2NyZWVuKCk7XG4gICAgfSBlbHNlIGlmIChkb2MubW96Q2FuY2VsRnVsbFNjcmVlbikge1xuICAgICAgZnVsbHNjcmVlbkV4aXQgPSBkb2MubW96Q2FuY2VsRnVsbFNjcmVlbigpO1xuICAgIH0gZWxzZSBpZiAoZG9jLndlYmtpdENhbmNlbEZ1bGxTY3JlZW4pIHtcbiAgICAgIGZ1bGxzY3JlZW5FeGl0ID0gUHJvbWlzZS5yZXNvbHZlKGRvYy53ZWJraXRDYW5jZWxGdWxsU2NyZWVuKCkpO1xuICAgIH0gZWxzZSBpZiAoZG9jLm1zRXhpdEZ1bGxzY3JlZW4pIHtcbiAgICAgIGZ1bGxzY3JlZW5FeGl0ID0gUHJvbWlzZS5yZXNvbHZlKGRvYy5tc0V4aXRGdWxsc2NyZWVuKCkpO1xuICAgIH1cbiAgICByZXR1cm4gYXdhaXQgZnVsbHNjcmVlbkV4aXQudGhlbigoKSA9PiAhIXRoaXMuZG9jLmZ1bGxzY3JlZW5FbGVtZW50KTtcbiAgfVxuXG4gIHByaXZhdGUgY2FuQ2hhbmdlKGlzRnVsbHNjcmVlbjogYm9vbGVhbiwgdHJpZ2dlcjogc3RyaW5nKSB7XG4gICAgbGV0IGNoYW5nZVJlc3VsdCA9IFByb21pc2UucmVzb2x2ZSh0cnVlKTtcblxuICAgIGlmICh0aGlzLmJlZm9yZUNoYW5nZSkge1xuICAgICAgY29uc3QgcmVzdWx0OiBhbnkgPSB0aGlzLmJlZm9yZUNoYW5nZShpc0Z1bGxzY3JlZW4sIHRyaWdnZXIpO1xuICAgICAgaWYgKHR5cGVvZiByZXN1bHQgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIGlmIChyZXN1bHQudGhlbikge1xuICAgICAgICAgIGNoYW5nZVJlc3VsdCA9IHJlc3VsdDtcbiAgICAgICAgfSBlbHNlIGlmIChyZXN1bHQuc3Vic2NyaWJlKSB7XG4gICAgICAgICAgY2hhbmdlUmVzdWx0ID0gKHJlc3VsdCBhcyBPYnNlcnZhYmxlPGJvb2xlYW4+KS50b1Byb21pc2UoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjaGFuZ2VSZXN1bHQgPSBQcm9taXNlLnJlc29sdmUocmVzdWx0KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBjaGFuZ2VSZXN1bHQ7XG4gIH1cblxuICBwcml2YXRlIGJlZm9yZUNoYW5nZUNoZWNrKGZ1bGxzY3JlZW46IGJvb2xlYW4sIHRyaWdnZXI6IHN0cmluZywgZnVuYzogRnVuY3Rpb24pIHtcbiAgICB0aGlzLmNhbkNoYW5nZShmdWxsc2NyZWVuLCB0cmlnZ2VyKS50aGVuKChwZXJtaXNzaW9uOiBib29sZWFuKSA9PiBwZXJtaXNzaW9uICYmIGZ1bmMoKSk7XG4gIH1cblxuICBwcml2YXRlIG9uRnVsbFNjcmVlbkNoYW5nZSA9IChldmVudCkgPT4ge1xuICAgIGlmICh0aGlzLmN1cnJlbnRUYXJnZXQpIHtcbiAgICAgIGNvbnN0IHRhcmdldEVsZW1lbnQ6IEhUTUxFbGVtZW50ID0gdGhpcy5jdXJyZW50VGFyZ2V0O1xuICAgICAgaWYgKHRoaXMuZG9jLmZ1bGxzY3JlZW5FbGVtZW50IHx8IHRoaXMuZG9jLm1zRnVsbHNjcmVlbkVsZW1lbnQgfHwgdGhpcy5kb2Mud2Via2l0RnVsbHNjcmVlbkVsZW1lbnQpIHtcbiAgICAgICAgdGhpcy5hZGRGdWxsU2NyZWVuU3R5bGUoKTtcbiAgICAgICAgdGhpcy5sYXVuY2hOb3JtYWxGdWxsc2NyZWVuKHRhcmdldEVsZW1lbnQpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5yZW1vdmVGdWxsU2NyZWVuU3R5bGUoKTtcbiAgICAgICAgdGhpcy5jdXJyZW50VGFyZ2V0ID0gbnVsbDtcbiAgICAgICAgdGhpcy5leGl0Tm9ybWFsRnVsbHNjcmVlbih0YXJnZXRFbGVtZW50KTtcbiAgICAgIH1cbiAgICAgIC8vIEYxMemAgOWHuuWFqOWxj+aXtu+8jOmcgOimgeWwhuWFqOWxj+eKtuaAgeS8oOWHuuWOu1xuICAgICAgY29uc3QgaXNGdWxsc2NyZWVuID0gISEodGhpcy5kb2MuZnVsbHNjcmVlbkVsZW1lbnQgfHwgdGhpcy5kb2MubXNGdWxsc2NyZWVuRWxlbWVudCB8fCB0aGlzLmRvYy53ZWJraXRGdWxsc2NyZWVuRWxlbWVudCk7XG4gICAgICB0aGlzLmZ1bGxzY3JlZW5MYXVuY2guZW1pdCh7IGlzRnVsbHNjcmVlbiB9KTtcbiAgICAgIHRoaXMuaXNGdWxsc2NyZWVuID0gaXNGdWxsc2NyZWVuO1xuICAgIH1cbiAgfTtcblxuICBwdWJsaWMgaGFuZGxlRnVsbHNjcmVlbiA9ICgpID0+IHtcbiAgICBjb25zdCB0YXJnZXRFbGVtZW50ID0gdGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQucXVlcnlTZWxlY3RvcignW2Z1bGxzY3JlZW4tdGFyZ2V0XScpO1xuICAgIGNvbnN0IGZ1bGxzY3JlZW4gPVxuICAgICAgdGhpcy5tb2RlID09PSAnbm9ybWFsJ1xuICAgICAgICA/IHRhcmdldEVsZW1lbnQuY2xhc3NMaXN0LmNvbnRhaW5zKCdmdWxsc2NyZWVuJylcbiAgICAgICAgOiAhISh0aGlzLmRvYy5mdWxsc2NyZWVuRWxlbWVudCB8fCB0aGlzLmRvYy5tc0Z1bGxzY3JlZW5FbGVtZW50IHx8IHRoaXMuZG9jLndlYmtpdEZ1bGxzY3JlZW5FbGVtZW50KTtcbiAgICB0aGlzLmJlZm9yZUNoYW5nZUNoZWNrKGZ1bGxzY3JlZW4sICdjbGljaycsIGFzeW5jICgpID0+IHtcbiAgICAgIHRoaXMuaXNGdWxsc2NyZWVuID1cbiAgICAgICAgdGhpcy5tb2RlID09PSAnbm9ybWFsJ1xuICAgICAgICAgID8gdGhpcy5ub3JtYWxGdWxsc2NyZWVuQ2FsbGJhY2soZnVsbHNjcmVlbiwgdGFyZ2V0RWxlbWVudClcbiAgICAgICAgICA6IGF3YWl0IHRoaXMuaW1tZXJzaXZlRnVsbFNjcmVlbkNhbGxiYWNrKGZ1bGxzY3JlZW4sIHRhcmdldEVsZW1lbnQpO1xuICAgICAgdGhpcy5mdWxsc2NyZWVuTGF1bmNoLmVtaXQoeyBpc0Z1bGxzY3JlZW46IHRoaXMuaXNGdWxsc2NyZWVuIH0pO1xuICAgIH0pO1xuICB9O1xuXG4gIG5vcm1hbEZ1bGxzY3JlZW5DYWxsYmFjayhmdWxsc2NyZWVuOiBib29sZWFuLCB0YXJnZXRFbGVtZW50OiBIVE1MRWxlbWVudCkge1xuICAgIGlmIChmdWxsc2NyZWVuKSB7XG4gICAgICB0aGlzLnJlbW92ZUZ1bGxTY3JlZW5TdHlsZSgpO1xuICAgICAgdGhpcy5leGl0Tm9ybWFsRnVsbHNjcmVlbih0YXJnZXRFbGVtZW50KTtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5hZGRGdWxsU2NyZWVuU3R5bGUoKTtcbiAgICAgIHRoaXMubGF1bmNoTm9ybWFsRnVsbHNjcmVlbih0YXJnZXRFbGVtZW50KTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIGltbWVyc2l2ZUZ1bGxTY3JlZW5DYWxsYmFjayhmdWxsc2NyZWVuOiBib29sZWFuLCB0YXJnZXRFbGVtZW50OiBIVE1MRWxlbWVudCkge1xuICAgIHRoaXMuY3VycmVudFRhcmdldCA9IHRhcmdldEVsZW1lbnQ7XG4gICAgcmV0dXJuIGZ1bGxzY3JlZW4gPyBhd2FpdCB0aGlzLmV4aXRJbW1lcnNpdmVGdWxsU2NyZWVuKHRoaXMuZG9jKSA6IGF3YWl0IHRoaXMubGF1bmNoSW1tZXJzaXZlRnVsbFNjcmVlbih0aGlzLmRvYy5kb2N1bWVudEVsZW1lbnQpO1xuICB9XG5cbiAgcHJpdmF0ZSBoYW5kbGVLZXlEb3duID0gKGV2ZW50KSA9PiB7XG4gICAgLy8g5oyJRVND6ZSu6YCA5Ye65YWo5bGPXG4gICAgaWYgKGV2ZW50LmtleUNvZGUgPT09IEVTQ19LRVlDT0RFICYmIHRoaXMuaXNGdWxsc2NyZWVuKSB7XG4gICAgICB0aGlzLmJlZm9yZUNoYW5nZUNoZWNrKHRoaXMuaXNGdWxsc2NyZWVuLCAnZXNjJywgKCkgPT4ge1xuICAgICAgICBjb25zdCB0YXJnZXRFbGVtZW50ID0gdGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQucXVlcnlTZWxlY3RvcignW2Z1bGxzY3JlZW4tdGFyZ2V0XScpO1xuICAgICAgICBpZiAodGhpcy5tb2RlID09PSAnbm9ybWFsJykge1xuICAgICAgICAgIHRoaXMucmVtb3ZlRnVsbFNjcmVlblN0eWxlKCk7XG4gICAgICAgICAgdGhpcy5leGl0Tm9ybWFsRnVsbHNjcmVlbih0YXJnZXRFbGVtZW50KTtcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLmRvYy5mdWxsc2NyZWVuRWxlbWVudCkge1xuICAgICAgICAgIHRoaXMuZXhpdEltbWVyc2l2ZUZ1bGxTY3JlZW4odGhpcy5kb2MpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5pc0Z1bGxzY3JlZW4gPSBmYWxzZTtcbiAgICAgICAgdGhpcy5mdWxsc2NyZWVuTGF1bmNoLmVtaXQoeyBpc0Z1bGxzY3JlZW46IGZhbHNlIH0pO1xuICAgICAgfSk7XG4gICAgfVxuICB9O1xuXG4gIHByaXZhdGUgYWRkRnVsbFNjcmVlblN0eWxlKCkge1xuICAgIGlmICh0aGlzLmNvbnRhaW5lcikge1xuICAgICAgdGhpcy5yZW5kZXIuYWRkQ2xhc3ModGhpcy5jb250YWluZXIsICdkZXZ1aS1jb250YWluZXItZnVsbHNjcmVlbicpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnJlbmRlci5hZGRDbGFzcyh0aGlzLmRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCdodG1sJylbMF0sICdkZXZ1aS1mdWxsc2NyZWVuJyk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSByZW1vdmVGdWxsU2NyZWVuU3R5bGUoKSB7XG4gICAgaWYgKHRoaXMuY29udGFpbmVyKSB7XG4gICAgICB0aGlzLnJlbmRlci5yZW1vdmVDbGFzcyh0aGlzLmNvbnRhaW5lciwgJ2RldnVpLWNvbnRhaW5lci1mdWxsc2NyZWVuJyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMucmVuZGVyLnJlbW92ZUNsYXNzKHRoaXMuZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ2h0bWwnKVswXSwgJ2RldnVpLWZ1bGxzY3JlZW4nKTtcbiAgICB9XG4gIH1cbn1cbiIsIjxkaXYgY2xhc3M9XCJmdWxsc2NyZWVuLWNvbnRhaW5lclwiPlxuICA8bmctY29udGVudCBzZWxlY3Q9XCJbZnVsbHNjcmVlbi1sYXVuY2hdXCI+PC9uZy1jb250ZW50PlxuICA8bmctY29udGVudCBzZWxlY3Q9XCJbZnVsbHNjcmVlbi10YXJnZXRdXCI+PC9uZy1jb250ZW50PlxuPC9kaXY+XG4iXX0=