ngx-touch-keyboard-pn
Version:
Virtual Keyboard for Angular applications
231 lines • 25.1 kB
JavaScript
import { booleanAttribute, Directive, effect, ElementRef, inject, input, model, } from '@angular/core';
import { ComponentPortal } from '@angular/cdk/portal';
import { Overlay } from '@angular/cdk/overlay';
import { NgxTouchKeyboardComponent } from './ngx-touch-keyboard.component';
import * as i0 from "@angular/core";
/**
* Directive applied to an element to make it usable as an origin for an keyboard using a
* ConnectedPositionStrategy.
*/
export class NgxTouchKeyboardOrigin {
constructor() {
this.elementRef = inject(ElementRef);
}
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.0", ngImport: i0, type: NgxTouchKeyboardOrigin, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "18.2.0", type: NgxTouchKeyboardOrigin, selector: "[ngxTouchKeyboardOrigin]", exportAs: ["ngxTouchKeyboardOrigin"], ngImport: i0 }); }
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.0", ngImport: i0, type: NgxTouchKeyboardOrigin, decorators: [{
type: Directive,
args: [{
selector: '[ngxTouchKeyboardOrigin]',
exportAs: 'ngxTouchKeyboardOrigin',
}]
}] });
/**
* This directive provides methods to open, close, and toggle the touch keyboard panel.
* It also handles the creation and configuration of the overlay used to display the keyboard.
*/
export class NgxTouchKeyboardDirective {
/**
* constructor
*/
constructor() {
this._overlay = inject(Overlay);
this._elementRef = inject((ElementRef));
this.open = model(false, {
alias: 'ngxTouchKeyboardOpen',
});
this.locale = input(undefined, {
alias: 'ngxTouchKeyboardLocale',
});
this.debugMode = input(false, {
alias: 'ngxTouchKeyboardDebug',
transform: booleanAttribute,
});
this.fullScreenMode = input(false, {
alias: 'ngxTouchKeyboardFullScreen',
transform: booleanAttribute,
});
this.origin = input(null, {
alias: 'ngxConnectedTouchKeyboardOrigin',
});
effect(() => {
this.open() ? this.openPanel() : this.closePanel();
});
}
// -----------------------------------------------------------------------------------------------------
// @ Lifecycle hooks
// -----------------------------------------------------------------------------------------------------
/**
* On destroy
*/
ngOnDestroy() {
// Dispose the overlay
if (this._overlayRef) {
this._overlayRef.dispose();
}
}
// -----------------------------------------------------------------------------------------------------
// @ Public methods
// -----------------------------------------------------------------------------------------------------
/**
* Open keyboard panel
*/
openPanel() {
// return if panel is attached
if (this._overlayRef?.hasAttached()) {
return;
}
// Create the overlay if it doesn't exist
if (!this._overlayRef) {
this._createOverlay();
}
// Set overlay class
if (this.fullScreenMode()) {
this._overlayRef.addPanelClass('ngx-touch-keyboard-fullScreen');
}
else {
this._overlayRef.removePanelClass('ngx-touch-keyboard-fullScreen');
}
// Update position the overlay
this._overlayRef.updatePositionStrategy(this._getPositionStrategy(this.fullScreenMode()));
// Update size the overlay
this._overlayRef.updateSize(this._getOverlaySize(this.fullScreenMode()));
// Attach the portal to the overlay
this._panelRef = this._overlayRef.attach(new ComponentPortal(NgxTouchKeyboardComponent));
this._panelRef.instance.debug = this.debugMode();
this._panelRef.instance.setLocale(this.locale());
this._panelRef.instance.setActiveInput(this._elementRef.nativeElement);
this._panelRef.instance.closePanel.subscribe(() => this.closePanel());
this.open.set(true);
}
/**
* Close keyboard panel
*/
closePanel() {
this._overlayRef?.detach();
this.open.set(false);
}
/**
* Toggle keyboard panel
*/
togglePanel() {
if (this.open()) {
this.closePanel();
}
else {
this.openPanel();
}
}
// -----------------------------------------------------------------------------------------------------
// @ Private methods
// -----------------------------------------------------------------------------------------------------
/**
* Create the overlay
*
* @private
*/
_createOverlay() {
this._overlayRef = this._overlay.create({
direction: 'ltr',
hasBackdrop: false,
panelClass: 'ngx-touch-keyboard-overlay-pane',
scrollStrategy: this._overlay.scrollStrategies.noop(),
});
}
/**
* Get position strategy
*
* @param fullscreen
* @private
*/
_getPositionStrategy(fullscreen) {
if (fullscreen) {
return this._overlay.position().global().centerHorizontally().bottom('0');
}
return this._overlay
.position()
.flexibleConnectedTo(this._getOriginElement())
.withLockedPosition()
.withPush()
.withPositions([
{
originX: 'start',
originY: 'bottom',
overlayX: 'start',
overlayY: 'top',
},
{
originX: 'start',
originY: 'top',
overlayX: 'start',
overlayY: 'bottom',
},
{
originX: 'end',
originY: 'bottom',
overlayX: 'end',
overlayY: 'top',
},
{
originX: 'end',
originY: 'top',
overlayX: 'end',
overlayY: 'bottom',
},
]);
}
/**
* Get overlay size
*
* @param fullscreen
* @private
*/
_getOverlaySize(fullscreen) {
if (fullscreen) {
return {
width: '100%',
maxWidth: '100%',
minWidth: '100%',
};
}
return {
width: this._getOriginElement().getBoundingClientRect().width,
maxWidth: this._getOriginElement().getBoundingClientRect().width,
minWidth: '260px',
};
}
/**
* Gets the origin element for the keyboard panel.
*
* @private
*/
_getOriginElement() {
if (this.origin()) {
return this.origin()?.elementRef.nativeElement;
}
const element = this._elementRef.nativeElement;
// Material form field <= v14
if (element.classList.contains('mat-input-element')) {
// Return [mat-form-field-flex] element
return element.parentNode?.parentNode;
}
// Material form field > v14
if (element.classList.contains('mat-mdc-input-element')) {
// Return [mat-mdc-text-field-wrapper] element
return element.parentNode?.parentNode?.parentNode;
}
// Return input
return element;
}
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.0", ngImport: i0, type: NgxTouchKeyboardDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "18.2.0", type: NgxTouchKeyboardDirective, selector: "input[ngxTouchKeyboard], textarea[ngxTouchKeyboard]", inputs: { open: { classPropertyName: "open", publicName: "ngxTouchKeyboardOpen", isSignal: true, isRequired: false, transformFunction: null }, locale: { classPropertyName: "locale", publicName: "ngxTouchKeyboardLocale", isSignal: true, isRequired: false, transformFunction: null }, debugMode: { classPropertyName: "debugMode", publicName: "ngxTouchKeyboardDebug", isSignal: true, isRequired: false, transformFunction: null }, fullScreenMode: { classPropertyName: "fullScreenMode", publicName: "ngxTouchKeyboardFullScreen", isSignal: true, isRequired: false, transformFunction: null }, origin: { classPropertyName: "origin", publicName: "ngxConnectedTouchKeyboardOrigin", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { open: "ngxTouchKeyboardOpenChange" }, exportAs: ["ngxTouchKeyboard"], ngImport: i0 }); }
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.0", ngImport: i0, type: NgxTouchKeyboardDirective, decorators: [{
type: Directive,
args: [{
selector: 'input[ngxTouchKeyboard], textarea[ngxTouchKeyboard]',
exportAs: 'ngxTouchKeyboard',
}]
}], ctorParameters: () => [] });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmd4LXRvdWNoLWtleWJvYXJkLmRpcmVjdGl2ZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL25neC10b3VjaC1rZXlib2FyZC9zcmMvbGliL25neC10b3VjaC1rZXlib2FyZC5kaXJlY3RpdmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLGdCQUFnQixFQUVoQixTQUFTLEVBQ1QsTUFBTSxFQUNOLFVBQVUsRUFDVixNQUFNLEVBQ04sS0FBSyxFQUNMLEtBQUssR0FFTixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDdEQsT0FBTyxFQUFFLE9BQU8sRUFBbUQsTUFBTSxzQkFBc0IsQ0FBQztBQUNoRyxPQUFPLEVBQUUseUJBQXlCLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQzs7QUFHM0U7OztHQUdHO0FBS0gsTUFBTSxPQUFPLHNCQUFzQjtJQUpuQztRQUtFLGVBQVUsR0FBRyxNQUFNLENBQUMsVUFBVSxDQUFDLENBQUM7S0FDakM7OEdBRlksc0JBQXNCO2tHQUF0QixzQkFBc0I7OzJGQUF0QixzQkFBc0I7a0JBSmxDLFNBQVM7bUJBQUM7b0JBQ1QsUUFBUSxFQUFFLDBCQUEwQjtvQkFDcEMsUUFBUSxFQUFFLHdCQUF3QjtpQkFDbkM7O0FBS0Q7OztHQUdHO0FBS0gsTUFBTSxPQUFPLHlCQUF5QjtJQTZCcEM7O09BRUc7SUFDSDtRQS9CUSxhQUFRLEdBQUcsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQzNCLGdCQUFXLEdBQUcsTUFBTSxDQUFDLENBQUEsVUFBNEIsQ0FBQSxDQUFDLENBQUM7UUFFM0QsU0FBSSxHQUFHLEtBQUssQ0FBQyxLQUFLLEVBQUU7WUFDbEIsS0FBSyxFQUFFLHNCQUFzQjtTQUM5QixDQUFDLENBQUM7UUFFSCxXQUFNLEdBQUcsS0FBSyxDQUFxQixTQUFTLEVBQUU7WUFDNUMsS0FBSyxFQUFFLHdC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Q0FBQyxtQkFBbUIsQ0FBQyxFQUFFLENBQUM7WUFDcEQsdUNBQXVDO1lBQ3ZDLE9BQU8sT0FBTyxDQUFDLFVBQVUsRUFBRSxVQUFVLENBQUM7UUFDeEMsQ0FBQztRQUVELDRCQUE0QjtRQUM1QixJQUFJLE9BQU8sQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLHVCQUF1QixDQUFDLEVBQUUsQ0FBQztZQUN4RCw4Q0FBOEM7WUFDOUMsT0FBTyxPQUFPLENBQUMsVUFBVSxFQUFFLFVBQVUsRUFBRSxVQUFVLENBQUM7UUFDcEQsQ0FBQztRQUVELGVBQWU7UUFDZixPQUFPLE9BQU8sQ0FBQztJQUNqQixDQUFDOzhHQTdOVSx5QkFBeUI7a0dBQXpCLHlCQUF5Qjs7MkZBQXpCLHlCQUF5QjtrQkFKckMsU0FBUzttQkFBQztvQkFDVCxRQUFRLEVBQUUscURBQXFEO29CQUMvRCxRQUFRLEVBQUUsa0JBQWtCO2lCQUM3QiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIGJvb2xlYW5BdHRyaWJ1dGUsXG4gIENvbXBvbmVudFJlZixcbiAgRGlyZWN0aXZlLFxuICBlZmZlY3QsXG4gIEVsZW1lbnRSZWYsXG4gIGluamVjdCxcbiAgaW5wdXQsXG4gIG1vZGVsLFxuICBPbkRlc3Ryb3ksXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQ29tcG9uZW50UG9ydGFsIH0gZnJvbSAnQGFuZ3VsYXIvY2RrL3BvcnRhbCc7XG5pbXBvcnQgeyBPdmVybGF5LCBPdmVybGF5UmVmLCBPdmVybGF5U2l6ZUNvbmZpZywgUG9zaXRpb25TdHJhdGVneSB9IGZyb20gJ0Bhbmd1bGFyL2Nkay9vdmVybGF5JztcbmltcG9ydCB7IE5neFRvdWNoS2V5Ym9hcmRDb21wb25lbnQgfSBmcm9tICcuL25neC10b3VjaC1rZXlib2FyZC5jb21wb25lbnQnO1xuaW1wb3J0IHsgTG9jYWxlIH0gZnJvbSAnLi9Mb2NhbGUvdHlwZSc7XG5cbi8qKlxuICogRGlyZWN0aXZlIGFwcGxpZWQgdG8gYW4gZWxlbWVudCB0byBtYWtlIGl0IHVzYWJsZSBhcyBhbiBvcmlnaW4gZm9yIGFuIGtleWJvYXJkIHVzaW5nIGFcbiAqIENvbm5lY3RlZFBvc2l0aW9uU3RyYXRlZ3kuXG4gKi9cbkBEaXJlY3RpdmUoe1xuICBzZWxlY3RvcjogJ1tuZ3hUb3VjaEtleWJvYXJkT3JpZ2luXScsXG4gIGV4cG9ydEFzOiAnbmd4VG91Y2hLZXlib2FyZE9yaWdpbicsXG59KVxuZXhwb3J0IGNsYXNzIE5neFRvdWNoS2V5Ym9hcmRPcmlnaW4ge1xuICBlbGVtZW50UmVmID0gaW5qZWN0KEVsZW1lbnRSZWYpO1xufVxuXG4vKipcbiAqIFRoaXMgZGlyZWN0aXZlIHByb3ZpZGVzIG1ldGhvZHMgdG8gb3BlbiwgY2xvc2UsIGFuZCB0b2dnbGUgdGhlIHRvdWNoIGtleWJvYXJkIHBhbmVsLlxuICogSXQgYWxzbyBoYW5kbGVzIHRoZSBjcmVhdGlvbiBhbmQgY29uZmlndXJhdGlvbiBvZiB0aGUgb3ZlcmxheSB1c2VkIHRvIGRpc3BsYXkgdGhlIGtleWJvYXJkLlxuICovXG5ARGlyZWN0aXZlKHtcbiAgc2VsZWN0b3I6ICdpbnB1dFtuZ3hUb3VjaEtleWJvYXJkXSwgdGV4dGFyZWFbbmd4VG91Y2hLZXlib2FyZF0nLFxuICBleHBvcnRBczogJ25neFRvdWNoS2V5Ym9hcmQnLFxufSlcbmV4cG9ydCBjbGFzcyBOZ3hUb3VjaEtleWJvYXJkRGlyZWN0aXZlIGltcGxlbWVudHMgT25EZXN0cm95IHtcbiAgcHJpdmF0ZSBfb3ZlcmxheSA9IGluamVjdChPdmVybGF5KTtcbiAgcHJpdmF0ZSBfZWxlbWVudFJlZiA9IGluamVjdChFbGVtZW50UmVmPEhUTUxJbnB1dEVsZW1lbnQ+KTtcblxuICBvcGVuID0gbW9kZWwoZmFsc2UsIHtcbiAgICBhbGlhczogJ25neFRvdWNoS2V5Ym9hcmRPcGVuJyxcbiAgfSk7XG5cbiAgbG9jYWxlID0gaW5wdXQ8TG9jYWxlIHwgdW5kZWZpbmVkPih1bmRlZmluZWQsIHtcbiAgICBhbGlhczogJ25neFRvdWNoS2V5Ym9hcmRMb2NhbGUnLFxuICB9KTtcblxuICBkZWJ1Z01vZGUgPSBpbnB1dChmYWxzZSwge1xuICAgIGFsaWFzOiAnbmd4VG91Y2hLZXlib2FyZERlYnVnJyxcbiAgICB0cmFuc2Zvcm06IGJvb2xlYW5BdHRyaWJ1dGUsXG4gIH0pO1xuXG4gIGZ1bGxTY3JlZW5Nb2RlID0gaW5wdXQoZmFsc2UsIHtcbiAgICBhbGlhczogJ25neFRvdWNoS2V5Ym9hcmRGdWxsU2NyZWVuJyxcbiAgICB0cmFuc2Zvcm06IGJvb2xlYW5BdHRyaWJ1dGUsXG4gIH0pO1xuXG4gIG9yaWdpbiA9IGlucHV0PE5neFRvdWNoS2V5Ym9hcmRPcmlnaW4gfCBudWxsPihudWxsLCB7XG4gICAgYWxpYXM6ICduZ3hDb25uZWN0ZWRUb3VjaEtleWJvYXJkT3JpZ2luJyxcbiAgfSk7XG5cbiAgcHJpdmF0ZSBfb3ZlcmxheVJlZiE6IE92ZXJsYXlSZWY7XG4gIHByaXZhdGUgX3BhbmVsUmVmITogQ29tcG9uZW50UmVmPE5neFRvdWNoS2V5Ym9hcmRDb21wb25lbnQ+O1xuXG4gIC8qKlxuICAgKiBjb25zdHJ1Y3RvclxuICAgKi9cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgZWZmZWN0KCgpID0+IHtcbiAgICAgIHRoaXMub3BlbigpID8gdGhpcy5vcGVuUGFuZWwoKSA6IHRoaXMuY2xvc2VQYW5lbCgpO1xuICAgIH0pO1xuICB9XG5cbiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgLy8gQCBMaWZlY3ljbGUgaG9va3NcbiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuICAvKipcbiAgICogT24gZGVzdHJveVxuICAgKi9cbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgLy8gRGlzcG9zZSB0aGUgb3ZlcmxheVxuICAgIGlmICh0aGlzLl9vdmVybGF5UmVmKSB7XG4gICAgICB0aGlzLl9vdmVybGF5UmVmLmRpc3Bvc2UoKTtcbiAgICB9XG4gIH1cblxuICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAvLyBAIFB1YmxpYyBtZXRob2RzXG4gIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbiAgLyoqXG4gICAqIE9wZW4ga2V5Ym9hcmQgcGFuZWxcbiAgICovXG4gIG9wZW5QYW5lbCgpOiB2b2lkIHtcbiAgICAvLyByZXR1cm4gaWYgcGFuZWwgaXMgYXR0YWNoZWRcbiAgICBpZiAodGhpcy5fb3ZlcmxheVJlZj8uaGFzQXR0YWNoZWQoKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIENyZWF0ZSB0aGUgb3ZlcmxheSBpZiBpdCBkb2Vzbid0IGV4aXN0XG4gICAgaWYgKCF0aGlzLl9vdmVybGF5UmVmKSB7XG4gICAgICB0aGlzLl9jcmVhdGVPdmVybGF5KCk7XG4gICAgfVxuXG4gICAgLy8gU2V0IG92ZXJsYXkgY2xhc3NcbiAgICBpZiAodGhpcy5mdWxsU2NyZWVuTW9kZSgpKSB7XG4gICAgICB0aGlzLl9vdmVybGF5UmVmLmFkZFBhbmVsQ2xhc3MoJ25neC10b3VjaC1rZXlib2FyZC1mdWxsU2NyZWVuJyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuX292ZXJsYXlSZWYucmVtb3ZlUGFuZWxDbGFzcygnbmd4LXRvdWNoLWtleWJvYXJkLWZ1bGxTY3JlZW4nKTtcbiAgICB9XG5cbiAgICAvLyBVcGRhdGUgcG9zaXRpb24gdGhlIG92ZXJsYXlcbiAgICB0aGlzLl9vdmVybGF5UmVmLnVwZGF0ZVBvc2l0aW9uU3RyYXRlZ3kodGhpcy5fZ2V0UG9zaXRpb25TdHJhdGVneSh0aGlzLmZ1bGxTY3JlZW5Nb2RlKCkpKTtcblxuICAgIC8vIFVwZGF0ZSBzaXplIHRoZSBvdmVybGF5XG4gICAgdGhpcy5fb3ZlcmxheVJlZi51cGRhdGVTaXplKHRoaXMuX2dldE92ZXJsYXlTaXplKHRoaXMuZnVsbFNjcmVlbk1vZGUoKSkpO1xuXG4gICAgLy8gQXR0YWNoIHRoZSBwb3J0YWwgdG8gdGhlIG92ZXJsYXlcbiAgICB0aGlzLl9wYW5lbFJlZiA9IHRoaXMuX292ZXJsYXlSZWYuYXR0YWNoKG5ldyBDb21wb25lbnRQb3J0YWwoTmd4VG91Y2hLZXlib2FyZENvbXBvbmVudCkpO1xuICAgIHRoaXMuX3BhbmVsUmVmLmluc3RhbmNlLmRlYnVnID0gdGhpcy5kZWJ1Z01vZGUoKTtcbiAgICB0aGlzLl9wYW5lbFJlZi5pbnN0YW5jZS5zZXRMb2NhbGUodGhpcy5sb2NhbGUoKSk7XG4gICAgdGhpcy5fcGFuZWxSZWYuaW5zdGFuY2Uuc2V0QWN0aXZlSW5wdXQodGhpcy5fZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50KTtcbiAgICB0aGlzLl9wYW5lbFJlZi5pbnN0YW5jZS5jbG9zZVBhbmVsLnN1YnNjcmliZSgoKSA9PiB0aGlzLmNsb3NlUGFuZWwoKSk7XG4gICAgdGhpcy5vcGVuLnNldCh0cnVlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDbG9zZSBrZXlib2FyZCBwYW5lbFxuICAgKi9cbiAgY2xvc2VQYW5lbCgpOiB2b2lkIHtcbiAgICB0aGlzLl9vdmVybGF5UmVmPy5kZXRhY2goKTtcbiAgICB0aGlzLm9wZW4uc2V0KGZhbHNlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUb2dnbGUga2V5Ym9hcmQgcGFuZWxcbiAgICovXG4gIHRvZ2dsZVBhbmVsKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLm9wZW4oKSkge1xuICAgICAgdGhpcy5jbG9zZVBhbmVsKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMub3BlblBhbmVsKCk7XG4gICAgfVxuICB9XG5cbiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgLy8gQCBQcml2YXRlIG1ldGhvZHNcbiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuICAvKipcbiAgICogQ3JlYXRlIHRoZSBvdmVybGF5XG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBwcml2YXRlIF9jcmVhdGVPdmVybGF5KCk6IHZvaWQge1xuICAgIHRoaXMuX292ZXJsYXlSZWYgPSB0aGlzLl9vdmVybGF5LmNyZWF0ZSh7XG4gICAgICBkaXJlY3Rpb246ICdsdHInLFxuICAgICAgaGFzQmFja2Ryb3A6IGZhbHNlLFxuICAgICAgcGFuZWxDbGFzczogJ25neC10b3VjaC1rZXlib2FyZC1vdmVybGF5LXBhbmUnLFxuICAgICAgc2Nyb2xsU3RyYXRlZ3k6IHRoaXMuX292ZXJsYXkuc2Nyb2xsU3RyYXRlZ2llcy5ub29wKCksXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHBvc2l0aW9uIHN0cmF0ZWd5XG4gICAqXG4gICAqIEBwYXJhbSBmdWxsc2NyZWVuXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBwcml2YXRlIF9nZXRQb3NpdGlvblN0cmF0ZWd5KGZ1bGxzY3JlZW46IGJvb2xlYW4pOiBQb3NpdGlvblN0cmF0ZWd5IHtcbiAgICBpZiAoZnVsbHNjcmVlbikge1xuICAgICAgcmV0dXJuIHRoaXMuX292ZXJsYXkucG9zaXRpb24oKS5nbG9iYWwoKS5jZW50ZXJIb3Jpem9udGFsbHkoKS5ib3R0b20oJzAnKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5fb3ZlcmxheVxuICAgICAgLnBvc2l0aW9uKClcbiAgICAgIC5mbGV4aWJsZUNvbm5lY3RlZFRvKHRoaXMuX2dldE9yaWdpbkVsZW1lbnQoKSlcbiAgICAgIC53aXRoTG9ja2VkUG9zaXRpb24oKVxuICAgICAgLndpdGhQdXNoKClcbiAgICAgIC53aXRoUG9zaXRpb25zKFtcbiAgICAgICAge1xuICAgICAgICAgIG9yaWdpblg6ICdzdGFydCcsXG4gICAgICAgICAgb3JpZ2luWTogJ2JvdHRvbScsXG4gICAgICAgICAgb3ZlcmxheVg6ICdzdGFydCcsXG4gICAgICAgICAgb3ZlcmxheVk6ICd0b3AnLFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgb3JpZ2luWDogJ3N0YXJ0JyxcbiAgICAgICAgICBvcmlnaW5ZOiAndG9wJyxcbiAgICAgICAgICBvdmVybGF5WDogJ3N0YXJ0JyxcbiAgICAgICAgICBvdmVybGF5WTogJ2JvdHRvbScsXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBvcmlnaW5YOiAnZW5kJyxcbiAgICAgICAgICBvcmlnaW5ZOiAnYm90dG9tJyxcbiAgICAgICAgICBvdmVybGF5WDogJ2VuZCcsXG4gICAgICAgICAgb3ZlcmxheVk6ICd0b3AnLFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgb3JpZ2luWDogJ2VuZCcsXG4gICAgICAgICAgb3JpZ2luWTogJ3RvcCcsXG4gICAgICAgICAgb3ZlcmxheVg6ICdlbmQnLFxuICAgICAgICAgIG92ZXJsYXlZOiAnYm90dG9tJyxcbiAgICAgICAgfSxcbiAgICAgIF0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBvdmVybGF5IHNpemVcbiAgICpcbiAgICogQHBhcmFtIGZ1bGxzY3JlZW5cbiAgICogQHByaXZhdGVcbiAgICovXG4gIHByaXZhdGUgX2dldE92ZXJsYXlTaXplKGZ1bGxzY3JlZW46IGJvb2xlYW4pOiBPdmVybGF5U2l6ZUNvbmZpZyB7XG4gICAgaWYgKGZ1bGxzY3JlZW4pIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHdpZHRoOiAnMTAwJScsXG4gICAgICAgIG1heFdpZHRoOiAnMTAwJScsXG4gICAgICAgIG1pbldpZHRoOiAnMTAwJScsXG4gICAgICB9O1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICB3aWR0aDogdGhpcy5fZ2V0T3JpZ2luRWxlbWVudCgpLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLndpZHRoLFxuICAgICAgbWF4V2lkdGg6IHRoaXMuX2dldE9yaWdpbkVsZW1lbnQoKS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS53aWR0aCxcbiAgICAgIG1pbldpZHRoOiAnMjYwcHgnLFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogR2V0cyB0aGUgb3JpZ2luIGVsZW1lbnQgZm9yIHRoZSBrZXlib2FyZCBwYW5lbC5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICovXG4gIHByaXZhdGUgX2dldE9yaWdpbkVsZW1lbnQoKTogYW55IHtcbiAgICBpZiAodGhpcy5vcmlnaW4oKSkge1xuICAgICAgcmV0dXJuIHRoaXMub3JpZ2luKCk/LmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudDtcbiAgICB9XG5cbiAgICBjb25zdCBlbGVtZW50ID0gdGhpcy5fZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50O1xuXG4gICAgLy8gTWF0ZXJpYWwgZm9ybSBmaWVsZCA8PSB2MTRcbiAgICBpZiAoZWxlbWVudC5jbGFzc0xpc3QuY29udGFpbnMoJ21hdC1pbnB1dC1lbGVtZW50JykpIHtcbiAgICAgIC8vIFJldHVybiBbbWF0LWZvcm0tZmllbGQtZmxleF0gZWxlbWVudFxuICAgICAgcmV0dXJuIGVsZW1lbnQucGFyZW50Tm9kZT8ucGFyZW50Tm9kZTtcbiAgICB9XG5cbiAgICAvLyBNYXRlcmlhbCBmb3JtIGZpZWxkID4gdjE0XG4gICAgaWYgKGVsZW1lbnQuY2xhc3NMaXN0LmNvbnRhaW5zKCdtYXQtbWRjLWlucHV0LWVsZW1lbnQnKSkge1xuICAgICAgLy8gUmV0dXJuIFttYXQtbWRjLXRleHQtZmllbGQtd3JhcHBlcl0gZWxlbWVudFxuICAgICAgcmV0dXJuIGVsZW1lbnQucGFyZW50Tm9kZT8ucGFyZW50Tm9kZT8ucGFyZW50Tm9kZTtcbiAgICB9XG5cbiAgICAvLyBSZXR1cm4gaW5wdXRcbiAgICByZXR1cm4gZWxlbWVudDtcbiAgfVxufVxuIl19