@tangential/input-widgets
Version:
Input Widgets with persistable, dynamic configuration.
197 lines • 21.2 kB
JavaScript
import { ChangeDetectorRef, Component, EventEmitter, forwardRef, HostBinding, Input, Output, ViewEncapsulation } from '@angular/core';
import { NG_VALUE_ACCESSOR } from '@angular/forms';
import { Hacks } from '@tangential/core';
import moment from 'moment';
import * as i0 from "@angular/core";
import * as i1 from "@angular/common";
import * as i2 from "@angular/forms";
import * as i3 from "@angular/material/form-field";
import * as i4 from "@angular/material/input";
/**
* Provider Expression that allows this widget to register as a ControlValueAccessor.
* This allows it to support [(ngModel)].
* @docs-private
*/
export const TANJ_DATE_TIME_WIDGET_VIEW_CONTROL_VALUE_ACCESSOR = {
provide: NG_VALUE_ACCESSOR, useExisting: forwardRef(() => DateTimeWidgetComponent), multi: true
};
export class DateTimeWidgetChange {
constructor(source, value) {
this.source = source;
this.value = value;
}
}
export class DateTimeWidgetComponent {
constructor(changeDetectorRef) {
this.changeDetectorRef = changeDetectorRef;
// turn this into a class
this.flex = '';
this.flexLayout = 'column';
this.flexLayoutAlign = 'start';
this.value = Date.now();
this.valueChange = new EventEmitter(false);
this.labelPosition = 'before';
this.disabled = false;
this.hideLabel = false;
this.onlyLabel = false;
/**
* Configuration Fields
*/
this.label = '';
this.defaultToNow = false;
this.defaultValue = 0;
this.maxLength = 100;
this.minLength = 0;
/* end Configuration Fields */
this.change = new EventEmitter(false);
this.onTouched = () => {
};
this.controlValueAccessorChangeFn = (value) => {
};
}
ngOnInit() {
this.value = this.defaultToNow ? Date.now() : this.defaultValue;
Hacks.materialDesignPlaceholderText(this.changeDetectorRef);
}
get dateInputValue() {
return moment(this.value).format('YYYY-MM-DDTHH:mm:ss');
}
set dateInputValue(dateString) {
this.value = moment(dateString).valueOf();
}
ngOnChanges(changes) {
if (changes.defaultToNow && !this.value) {
this.value = this.defaultToNow ? Date.now() : this.defaultValue;
}
}
handleValueChange(value) {
if (!this.disabled) {
this.value = value;
this.valueChange.emit(this.value);
this.emitChangeEvent();
}
}
/**
* Boilerplate / required for Angular
*
*/
emitChangeEvent() {
const change = new DateTimeWidgetChange(this, this.value);
this.controlValueAccessorChangeFn(this.value);
this.change.emit(change);
}
writeValue(value) {
this.value = value;
}
registerOnChange(fn) {
this.controlValueAccessorChangeFn = fn;
}
registerOnTouched(fn) {
this.onTouched = fn;
}
/**
* Sets the input's disabled state. Implemented as a part of ControlValueAccessor.
* @param isDisabled Whether the input should be disabled.
*/
setDisabledState(isDisabled) {
this.disabled = isDisabled;
}
}
DateTimeWidgetComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.2.10", ngImport: i0, type: DateTimeWidgetComponent, deps: [{ token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component });
DateTimeWidgetComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.2.10", type: DateTimeWidgetComponent, selector: "tanj-date-time-widget", inputs: { value: "value", labelPosition: "labelPosition", disabled: "disabled", hideLabel: "hideLabel", onlyLabel: "onlyLabel", label: "label", defaultToNow: "defaultToNow", defaultValue: "defaultValue", maxLength: "maxLength", minLength: "minLength" }, outputs: { valueChange: "valueChange", change: "change" }, host: { properties: { "attr.flex": "this.flex", "attr.layout": "this.flexLayout", "attr.layout-align": "this.flexLayoutAlign" } }, providers: [TANJ_DATE_TIME_WIDGET_VIEW_CONTROL_VALUE_ACCESSOR], usesOnChanges: true, ngImport: i0, template: `<!-- -->
<div flex class="tanj-input-template tanj-mode-edit"
[ngClass]="{'tanj-disabled': disabled}"
layout="row"
layout-align="start center">
<span *ngIf="!hideLabel && labelPosition == 'before'" class="tanj-label tanj-before">{{label}}</span>
<div flex class="tanj-widget-input" layout="column" layout-align="center start">
<div flex *ngIf="!onlyLabel" class="tanj-widget-input" layout="row" layout-align="start">
<mat-form-field flex
class="tanj-date-time-input-field tanj-widget-input"
dividerColor="accent"
layout="row"
layout-align="start">
<input flex
matInput
class="tanj-input"
type="datetime-local"
minlength="{{minLength}}"
maxlength="{{maxLength}}"
[disabled]="disabled"
(change)="valueChange.emit(value)"
[(ngModel)]="dateInputValue"/>
</mat-form-field>
</div>
<span *ngIf="!hideLabel && labelPosition == 'below'" class="tanj-label tanj-below">{{label}}</span>
</div>
<span *ngIf="!hideLabel && labelPosition == 'after'" class="tanj-label tanj-after">{{label}}</span>
</div>
`, isInline: true, dependencies: [{ kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.MinLengthValidator, selector: "[minlength][formControlName],[minlength][formControl],[minlength][ngModel]", inputs: ["minlength"] }, { kind: "directive", type: i2.MaxLengthValidator, selector: "[maxlength][formControlName],[maxlength][formControl],[maxlength][ngModel]", inputs: ["maxlength"] }, { kind: "directive", type: i2.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: i3.MatFormField, selector: "mat-form-field", inputs: ["color", "appearance", "hideRequiredMarker", "hintLabel", "floatLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i4.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly"], exportAs: ["matInput"] }], encapsulation: i0.ViewEncapsulation.None });
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.10", ngImport: i0, type: DateTimeWidgetComponent, decorators: [{
type: Component,
args: [{
selector: 'tanj-date-time-widget', template: `<!-- -->
<div flex class="tanj-input-template tanj-mode-edit"
[ngClass]="{'tanj-disabled': disabled}"
layout="row"
layout-align="start center">
<span *ngIf="!hideLabel && labelPosition == 'before'" class="tanj-label tanj-before">{{label}}</span>
<div flex class="tanj-widget-input" layout="column" layout-align="center start">
<div flex *ngIf="!onlyLabel" class="tanj-widget-input" layout="row" layout-align="start">
<mat-form-field flex
class="tanj-date-time-input-field tanj-widget-input"
dividerColor="accent"
layout="row"
layout-align="start">
<input flex
matInput
class="tanj-input"
type="datetime-local"
minlength="{{minLength}}"
maxlength="{{maxLength}}"
[disabled]="disabled"
(change)="valueChange.emit(value)"
[(ngModel)]="dateInputValue"/>
</mat-form-field>
</div>
<span *ngIf="!hideLabel && labelPosition == 'below'" class="tanj-label tanj-below">{{label}}</span>
</div>
<span *ngIf="!hideLabel && labelPosition == 'after'" class="tanj-label tanj-after">{{label}}</span>
</div>
`, providers: [TANJ_DATE_TIME_WIDGET_VIEW_CONTROL_VALUE_ACCESSOR], encapsulation: ViewEncapsulation.None
}]
}], ctorParameters: function () { return [{ type: i0.ChangeDetectorRef }]; }, propDecorators: { flex: [{
type: HostBinding,
args: ['attr.flex']
}], flexLayout: [{
type: HostBinding,
args: ['attr.layout']
}], flexLayoutAlign: [{
type: HostBinding,
args: ['attr.layout-align']
}], value: [{
type: Input
}], valueChange: [{
type: Output
}], labelPosition: [{
type: Input
}], disabled: [{
type: Input
}], hideLabel: [{
type: Input
}], onlyLabel: [{
type: Input
}], label: [{
type: Input
}], defaultToNow: [{
type: Input
}], defaultValue: [{
type: Input
}], maxLength: [{
type: Input
}], minLength: [{
type: Input
}], change: [{
type: Output
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0ZS10aW1lLXdpZGdldC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy90YW5nZW50aWFsL2lucHV0LXdpZGdldHMvc3JjL2xpYi9kYXRlLXRpbWUtd2lkZ2V0L2RhdGUtdGltZS13aWRnZXQuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCxpQkFBaUIsRUFBRSxTQUFTLEVBQUUsWUFBWSxFQUFFLFVBQVUsRUFBRSxXQUFXLEVBQUUsS0FBSyxFQUFxQixNQUFNLEVBQWdCLGlCQUFpQixFQUN2SSxNQUFNLGVBQWUsQ0FBQTtBQUN0QixPQUFPLEVBQXVCLGlCQUFpQixFQUFDLE1BQU0sZ0JBQWdCLENBQUE7QUFDdEUsT0FBTyxFQUFDLEtBQUssRUFBQyxNQUFNLGtCQUFrQixDQUFBO0FBQ3RDLE9BQU8sTUFBTSxNQUFNLFFBQVEsQ0FBQTs7Ozs7O0FBRzNCOzs7O0dBSUc7QUFDSCxNQUFNLENBQUMsTUFBTSxpREFBaUQsR0FBUTtJQUNwRSxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsV0FBVyxFQUFFLFVBQVUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyx1QkFBdUIsQ0FBQyxFQUFFLEtBQUssRUFBRSxJQUFJO0NBQ2hHLENBQUM7QUFFRixNQUFNLE9BQU8sb0JBQW9CO0lBRS9CLFlBQW1CLE1BQStCLEVBQVMsS0FBYTtRQUFyRCxXQUFNLEdBQU4sTUFBTSxDQUF5QjtRQUFTLFVBQUssR0FBTCxLQUFLLENBQVE7SUFDeEUsQ0FBQztDQUNGO0FBa0NELE1BQU0sT0FBTyx1QkFBdUI7SUE2QmxDLFlBQW9CLGlCQUFvQztRQUFwQyxzQkFBaUIsR0FBakIsaUJBQWlCLENBQW1CO1FBM0J4RCx5QkFBeUI7UUFDQyxTQUFJLEdBQUcsRUFBRSxDQUFDO1FBQ1IsZUFBVSxHQUFHLFFBQVEsQ0FBQztRQUNoQixvQkFBZSxHQUFHLE9BQU8sQ0FBQztRQUVuRCxVQUFL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Qjt5R0FBdkIsdUJBQXVCLDRlQUZWLENBQUMsaURBQWlELENBQUMsK0NBNUI5Qjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OzthQTRCbEM7NEZBRUEsdUJBQXVCO2tCQS9CbkMsU0FBUzttQkFBQztvQkFDVCxRQUFRLEVBQUUsdUJBQXVCLEVBQUUsUUFBUSxFQUFFOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O2FBNEJsQyxFQUFFLFNBQVMsRUFBRSxDQUFDLGlEQUFpRCxDQUFDLEVBQUUsYUFBYSxFQUFFLGlCQUFpQixDQUFDLElBQUk7aUJBQ25IO3dHQUkyQixJQUFJO3NCQUE3QixXQUFXO3VCQUFDLFdBQVc7Z0JBQ0ksVUFBVTtzQkFBckMsV0FBVzt1QkFBQyxhQUFhO2dCQUNRLGVBQWU7c0JBQWhELFdBQVc7dUJBQUMsbUJBQW1CO2dCQUV2QixLQUFLO3NCQUFiLEtBQUs7Z0JBQ0ksV0FBVztzQkFBcEIsTUFBTTtnQkFFRSxhQUFhO3NCQUFyQixLQUFLO2dCQUNHLFFBQVE7c0JBQWhCLEtBQUs7Z0JBQ0csU0FBUztzQkFBakIsS0FBSztnQkFDRyxTQUFTO3NCQUFqQixLQUFLO2dCQUtHLEtBQUs7c0JBQWIsS0FBSztnQkFDRyxZQUFZO3NCQUFwQixLQUFLO2dCQUNHLFlBQVk7c0JBQXBCLEtBQUs7Z0JBQ0csU0FBUztzQkFBakIsS0FBSztnQkFDRyxTQUFTO3NCQUFqQixLQUFLO2dCQUdJLE1BQU07c0JBQWYsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIENoYW5nZURldGVjdG9yUmVmLCBDb21wb25lbnQsIEV2ZW50RW1pdHRlciwgZm9yd2FyZFJlZiwgSG9zdEJpbmRpbmcsIElucHV0LCBPbkNoYW5nZXMsIE9uSW5pdCwgT3V0cHV0LCBTaW1wbGVDaGFuZ2UsIFZpZXdFbmNhcHN1bGF0aW9uXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnXG5pbXBvcnQge0NvbnRyb2xWYWx1ZUFjY2Vzc29yLCBOR19WQUxVRV9BQ0NFU1NPUn0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnXG5pbXBvcnQge0hhY2tzfSBmcm9tICdAdGFuZ2VudGlhbC9jb3JlJ1xuaW1wb3J0IG1vbWVudCBmcm9tICdtb21lbnQnXG5cblxuLyoqXG4gKiBQcm92aWRlciBFeHByZXNzaW9uIHRoYXQgYWxsb3dzIHRoaXMgd2lkZ2V0IHRvIHJlZ2lzdGVyIGFzIGEgQ29udHJvbFZhbHVlQWNjZXNzb3IuXG4gKiBUaGlzIGFsbG93cyBpdCB0byBzdXBwb3J0IFsobmdNb2RlbCldLlxuICogQGRvY3MtcHJpdmF0ZVxuICovXG5leHBvcnQgY29uc3QgVEFOSl9EQVRFX1RJTUVfV0lER0VUX1ZJRVdfQ09OVFJPTF9WQUxVRV9BQ0NFU1NPUjogYW55ID0ge1xuICBwcm92aWRlOiBOR19WQUxVRV9BQ0NFU1NPUiwgdXNlRXhpc3Rpbmc6IGZvcndhcmRSZWYoKCkgPT4gRGF0ZVRpbWVXaWRnZXRDb21wb25lbnQpLCBtdWx0aTogdHJ1ZVxufTtcblxuZXhwb3J0IGNsYXNzIERhdGVUaW1lV2lkZ2V0Q2hhbmdlIHtcblxuICBjb25zdHJ1Y3RvcihwdWJsaWMgc291cmNlOiBEYXRlVGltZVdpZGdldENvbXBvbmVudCwgcHVibGljIHZhbHVlOiBudW1iZXIpIHtcbiAgfVxufVxuXG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ3RhbmotZGF0ZS10aW1lLXdpZGdldCcsIHRlbXBsYXRlOiBgPCEtLSAtLT5cbiAgPGRpdiBmbGV4IGNsYXNzPVwidGFuai1pbnB1dC10ZW1wbGF0ZSB0YW5qLW1vZGUtZWRpdFwiXG4gICAgICAgW25nQ2xhc3NdPVwieyd0YW5qLWRpc2FibGVkJzogZGlzYWJsZWR9XCJcbiAgICAgICBsYXlvdXQ9XCJyb3dcIlxuICAgICAgIGxheW91dC1hbGlnbj1cInN0YXJ0IGNlbnRlclwiPlxuICAgIDxzcGFuICpuZ0lmPVwiIWhpZGVMYWJlbCAmJiBsYWJlbFBvc2l0aW9uID09ICdiZWZvcmUnXCIgY2xhc3M9XCJ0YW5qLWxhYmVsIHRhbmotYmVmb3JlXCI+e3tsYWJlbH19PC9zcGFuPlxuICAgIDxkaXYgZmxleCBjbGFzcz1cInRhbmotd2lkZ2V0LWlucHV0XCIgbGF5b3V0PVwiY29sdW1uXCIgbGF5b3V0LWFsaWduPVwiY2VudGVyIHN0YXJ0XCI+XG4gICAgICA8ZGl2IGZsZXggKm5nSWY9XCIhb25seUxhYmVsXCIgY2xhc3M9XCJ0YW5qLXdpZGdldC1pbnB1dFwiIGxheW91dD1cInJvd1wiIGxheW91dC1hbGlnbj1cInN0YXJ0XCI+XG4gICAgICAgIDxtYXQtZm9ybS1maWVsZCBmbGV4XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJ0YW5qLWRhdGUtdGltZS1pbnB1dC1maWVsZCB0YW5qLXdpZGdldC1pbnB1dFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGl2aWRlckNvbG9yPVwiYWNjZW50XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXlvdXQ9XCJyb3dcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxheW91dC1hbGlnbj1cInN0YXJ0XCI+XG4gICAgICAgICAgPGlucHV0IGZsZXhcbiAgICAgICAgICAgICAgICAgbWF0SW5wdXRcbiAgICAgICAgICAgICAgICAgY2xhc3M9XCJ0YW5qLWlucHV0XCJcbiAgICAgICAgICAgICAgICAgdHlwZT1cImRhdGV0aW1lLWxvY2FsXCJcbiAgICAgICAgICAgICAgICAgbWlubGVuZ3RoPVwie3ttaW5MZW5ndGh9fVwiXG4gICAgICAgICAgICAgICAgIG1heGxlbmd0aD1cInt7bWF4TGVuZ3RofX1cIlxuICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiZGlzYWJsZWRcIlxuICAgICAgICAgICAgICAgICAoY2hhbmdlKT1cInZhbHVlQ2hhbmdlLmVtaXQodmFsdWUpXCJcbiAgICAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJkYXRlSW5wdXRWYWx1ZVwiLz5cbiAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cbiAgICAgIDwvZGl2PlxuICAgICAgPHNwYW4gKm5nSWY9XCIhaGlkZUxhYmVsICYmIGxhYmVsUG9zaXRpb24gPT0gJ2JlbG93J1wiIGNsYXNzPVwidGFuai1sYWJlbCB0YW5qLWJlbG93XCI+e3tsYWJlbH19PC9zcGFuPlxuICAgIDwvZGl2PlxuICAgIDxzcGFuICpuZ0lmPVwiIWhpZGVMYWJlbCAmJiBsYWJlbFBvc2l0aW9uID09ICdhZnRlcidcIiBjbGFzcz1cInRhbmotbGFiZWwgdGFuai1hZnRlclwiPnt7bGFiZWx9fTwvc3Bhbj5cbiAgPC9kaXY+XG4gICAgICAgICAgICBgLCBwcm92aWRlcnM6IFtUQU5KX0RBVEVfVElNRV9XSURHRVRfVklFV19DT05UUk9MX1ZBTFVFX0FDQ0VTU09SXSwgZW5jYXBzdWxhdGlvbjogVmlld0VuY2Fwc3VsYXRpb24uTm9uZVxufSlcbmV4cG9ydCBjbGFzcyBEYXRlVGltZVdpZGdldENvbXBvbmVudCBpbXBsZW1lbnRzIENvbnRyb2xWYWx1ZUFjY2Vzc29yLCBPbkNoYW5nZXMsIE9uSW5pdCB7XG5cbiAgLy8gdHVybiB0aGlzIGludG8gYSBjbGFzc1xuICBASG9zdEJpbmRpbmcoJ2F0dHIuZmxleCcpIGZsZXggPSAnJztcbiAgQEhvc3RCaW5kaW5nKCdhdHRyLmxheW91dCcpIGZsZXhMYXlvdXQgPSAnY29sdW1uJztcbiAgQEhvc3RCaW5kaW5nKCdhdHRyLmxheW91dC1hbGlnbicpIGZsZXhMYXlvdXRBbGlnbiA9ICdzdGFydCc7XG5cbiAgQElucHV0KCkgdmFsdWU6IG51bWJlciA9IERhdGUubm93KClcbiAgQE91dHB1dCgpIHZhbHVlQ2hhbmdlOiBFdmVudEVtaXR0ZXI8bnVtYmVyPiA9IG5ldyBFdmVudEVtaXR0ZXIoZmFsc2UpXG5cbiAgQElucHV0KCkgbGFiZWxQb3NpdGlvbjogJ2JlZm9yZScgfCAnYWZ0ZXInIHwgJ2JlbG93JyA9ICdiZWZvcmUnXG4gIEBJbnB1dCgpIGRpc2FibGVkOiBib29sZWFuID0gZmFsc2VcbiAgQElucHV0KCkgaGlkZUxhYmVsOiBib29sZWFuID0gZmFsc2VcbiAgQElucHV0KCkgb25seUxhYmVsOiBib29sZWFuID0gZmFsc2VcblxuICAvKipcbiAgICogQ29uZmlndXJhdGlvbiBGaWVsZHNcbiAgICovXG4gIEBJbnB1dCgpIGxhYmVsOiBzdHJpbmcgPSAnJ1xuICBASW5wdXQoKSBkZWZhdWx0VG9Ob3c6IGJvb2xlYW4gPSBmYWxzZVxuICBASW5wdXQoKSBkZWZhdWx0VmFsdWU6IG51bWJlciA9IDBcbiAgQElucHV0KCkgbWF4TGVuZ3RoOiBudW1iZXIgPSAxMDBcbiAgQElucHV0KCkgbWluTGVuZ3RoOiBudW1iZXIgPSAwXG4gIC8qIGVuZCBDb25maWd1cmF0aW9uIEZpZWxkcyAqL1xuXG4gIEBPdXRwdXQoKSBjaGFuZ2U6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcihmYWxzZSlcbiAgb25Ub3VjaGVkOiAoKSA9PiBhbnkgPSAoKSA9PiB7XG4gIH07XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSBjaGFuZ2VEZXRlY3RvclJlZjogQ2hhbmdlRGV0ZWN0b3JSZWYpIHtcbiAgfVxuXG4gIHByaXZhdGUgY29udHJvbFZhbHVlQWNjZXNzb3JDaGFuZ2VGbjogKHZhbHVlOiBhbnkpID0+IHZvaWQgPSAodmFsdWUpID0+IHtcbiAgfTtcblxuXG4gIG5nT25Jbml0KCkge1xuICAgIHRoaXMudmFsdWUgPSB0aGlzLmRlZmF1bHRUb05vdyA/IERhdGUubm93KCkgOiB0aGlzLmRlZmF1bHRWYWx1ZVxuICAgIEhhY2tzLm1hdGVyaWFsRGVzaWduUGxhY2Vob2xkZXJUZXh0KHRoaXMuY2hhbmdlRGV0ZWN0b3JSZWYpXG4gIH1cblxuICBnZXQgZGF0ZUlucHV0VmFsdWUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gbW9tZW50KHRoaXMudmFsdWUpLmZvcm1hdCgnWVlZWS1NTS1ERFRISDptbTpzcycpXG4gIH1cblxuICBzZXQgZGF0ZUlucHV0VmFsdWUoZGF0ZVN0cmluZzogc3RyaW5nKSB7XG4gICAgdGhpcy52YWx1ZSA9IG1vbWVudChkYXRlU3RyaW5nKS52YWx1ZU9mKClcbiAgfVxuXG4gIG5nT25DaGFuZ2VzKGNoYW5nZXM6IHsgZGVmYXVsdFRvTm93OiBTaW1wbGVDaGFuZ2UgfSkge1xuICAgIGlmIChjaGFuZ2VzLmRlZmF1bHRUb05vdyAmJiAhdGhpcy52YWx1ZSkge1xuICAgICAgdGhpcy52YWx1ZSA9IHRoaXMuZGVmYXVsdFRvTm93ID8gRGF0ZS5ub3coKSA6IHRoaXMuZGVmYXVsdFZhbHVlXG4gICAgfVxuICB9XG5cbiAgaGFuZGxlVmFsdWVDaGFuZ2UodmFsdWU6IG51bWJlcikge1xuICAgIGlmICghdGhpcy5kaXNhYmxlZCkge1xuICAgICAgdGhpcy52YWx1ZSA9IHZhbHVlXG4gICAgICB0aGlzLnZhbHVlQ2hhbmdlLmVtaXQodGhpcy52YWx1ZSlcbiAgICAgIHRoaXMuZW1pdENoYW5nZUV2ZW50KClcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQm9pbGVycGxhdGUgLyByZXF1aXJlZCBmb3IgQW5ndWxhclxuICAgKlxuICAgKi9cbiAgcHJpdmF0ZSBlbWl0Q2hhbmdlRXZlbnQoKSB7XG4gICAgY29uc3QgY2hhbmdlID0gbmV3IERhdGVUaW1lV2lkZ2V0Q2hhbmdlKHRoaXMsIHRoaXMudmFsdWUpXG4gICAgdGhpcy5jb250cm9sVmFsdWVBY2Nlc3NvckNoYW5nZUZuKHRoaXMudmFsdWUpO1xuICAgIHRoaXMuY2hhbmdlLmVtaXQoY2hhbmdlKVxuICB9XG5cbiAgcHVibGljIHdyaXRlVmFsdWUodmFsdWU6IG51bWJlcik6IHZvaWQge1xuICAgIHRoaXMudmFsdWUgPSB2YWx1ZVxuICB9XG5cbiAgcHVibGljIHJlZ2lzdGVyT25DaGFuZ2UoZm46IGFueSk6IHZvaWQge1xuICAgIHRoaXMuY29udHJvbFZhbHVlQWNjZXNzb3JDaGFuZ2VGbiA9IGZuO1xuICB9XG5cbiAgcHVibGljIHJlZ2lzdGVyT25Ub3VjaGVkKGZuOiBhbnkpOiB2b2lkIHtcbiAgICB0aGlzLm9uVG91Y2hlZCA9IGZuO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHMgdGhlIGlucHV0J3MgZGlzYWJsZWQgc3RhdGUuIEltcGxlbWVudGVkIGFzIGEgcGFydCBvZiBDb250cm9sVmFsdWVBY2Nlc3Nvci5cbiAgICogQHBhcmFtIGlzRGlzYWJsZWQgV2hldGhlciB0aGUgaW5wdXQgc2hvdWxkIGJlIGRpc2FibGVkLlxuICAgKi9cbiAgc2V0RGlzYWJsZWRTdGF0ZShpc0Rpc2FibGVkOiBib29sZWFuKSB7XG4gICAgdGhpcy5kaXNhYmxlZCA9IGlzRGlzYWJsZWQ7XG4gIH1cbn1cbiJdfQ==