@taiga-ui/kit
Version:
Taiga UI Angular main components kit
160 lines • 27.7 kB
JavaScript
var TuiTextAreaComponent_1;
import { __decorate, __param } from "tslib";
import { ChangeDetectionStrategy, ChangeDetectorRef, Component, ElementRef, forwardRef, HostBinding, Inject, Input, Optional, Self, ViewChild, } from '@angular/core';
import { NgControl } from '@angular/forms';
import { AbstractTuiControl, isNativeFocused, setNativeFocused, TUI_FOCUSABLE_ITEM_ACCESSOR, TUI_IS_IOS, tuiDefaultProp, } from '@taiga-ui/cdk';
import { HINT_CONTROLLER_PROVIDER, TEXTFIELD_CONTROLLER_PROVIDER, TUI_HINT_WATCHED_CONTROLLER, TUI_TEXTFIELD_APPEARANCE, TUI_TEXTIFELD_WATCHED_CONTROLLER, TuiBrightness, TuiHintControllerDirective, TuiModeDirective, TuiSizeL, TuiSizeS, TuiTextfieldController, } from '@taiga-ui/core';
export const DEFAULT_ROWS = 20;
export const LINE_HEIGHT_M = 20;
export const LINE_HEIGHT_L = 24;
let TuiTextAreaComponent = TuiTextAreaComponent_1 = class TuiTextAreaComponent extends AbstractTuiControl {
constructor(control, changeDetectorRef, appearance, isIOS, modeDirective, controller, hintController) {
super(control, changeDetectorRef);
this.appearance = appearance;
this.modeDirective = modeDirective;
this.controller = controller;
this.hintController = hintController;
this.rows = DEFAULT_ROWS;
this.expandable = false;
this.isIOS = isIOS;
}
get labelOutside() {
return this.controller.labelOutside;
}
get nativeFocusableElement() {
return this.computedDisabled || !this.focusableElement
? null
: this.focusableElement.nativeElement;
}
get focused() {
return isNativeFocused(this.nativeFocusableElement);
}
get size() {
return this.controller.size;
}
get hasTooltip() {
return !!this.hintController.content && !this.disabled;
}
get hasValue() {
return this.value !== '';
}
get hasCounter() {
return !!this.controller.maxLength && !this.disabled && !this.readOnly;
}
get hasPlaceholder() {
return !this.controller.labelOutside || (!this.hasValue && !this.hasExampleText);
}
get hasExampleText() {
return (!!this.controller.exampleText &&
this.focused &&
!this.hasValue &&
!this.readOnly);
}
get computeMaxHeight() {
return this.expandable ? this.rows * this.lineHeight : null;
}
get hostMode() {
return this.modeDirective && this.modeDirective.mode;
}
get placeholderRaised() {
return (!this.controller.labelOutside &&
((this.computedFocused && !this.readOnly) || this.hasValue));
}
onFocused(focused) {
this.updateFocused(focused);
}
onHovered(hovered) {
this.updateHovered(hovered);
}
onPressed(pressed) {
this.updatePressed(pressed);
}
onValue(value) {
this.updateValue(value);
}
onMouseDown(event) {
if (event.target === this.nativeFocusableElement) {
return;
}
event.preventDefault();
if (this.nativeFocusableElement) {
setNativeFocused(this.nativeFocusableElement);
}
}
getFallbackValue() {
return '';
}
get lineHeight() {
return this.controller.size === 'm' ? LINE_HEIGHT_M : LINE_HEIGHT_L;
}
};
TuiTextAreaComponent.ctorParameters = () => [
{ type: NgControl, decorators: [{ type: Optional }, { type: Self }, { type: Inject, args: [NgControl,] }] },
{ type: ChangeDetectorRef, decorators: [{ type: Inject, args: [ChangeDetectorRef,] }] },
{ type: String, decorators: [{ type: Inject, args: [TUI_TEXTFIELD_APPEARANCE,] }] },
{ type: Boolean, decorators: [{ type: Inject, args: [TUI_IS_IOS,] }] },
{ type: TuiModeDirective, decorators: [{ type: Optional }, { type: Inject, args: [TuiModeDirective,] }] },
{ type: TuiTextfieldController, decorators: [{ type: Inject, args: [TUI_TEXTIFELD_WATCHED_CONTROLLER,] }] },
{ type: TuiHintControllerDirective, decorators: [{ type: Inject, args: [TUI_HINT_WATCHED_CONTROLLER,] }] }
];
__decorate([
Input(),
tuiDefaultProp()
], TuiTextAreaComponent.prototype, "rows", void 0);
__decorate([
Input(),
HostBinding('class._expandable'),
tuiDefaultProp()
], TuiTextAreaComponent.prototype, "expandable", void 0);
__decorate([
HostBinding('class._ios')
], TuiTextAreaComponent.prototype, "isIOS", void 0);
__decorate([
ViewChild('focusableElement')
], TuiTextAreaComponent.prototype, "focusableElement", void 0);
__decorate([
HostBinding('class._label-outside')
], TuiTextAreaComponent.prototype, "labelOutside", null);
__decorate([
HostBinding('attr.data-tui-host-size')
], TuiTextAreaComponent.prototype, "size", null);
__decorate([
HostBinding('class._has-tooltip')
], TuiTextAreaComponent.prototype, "hasTooltip", null);
__decorate([
HostBinding('class._has-value')
], TuiTextAreaComponent.prototype, "hasValue", null);
__decorate([
HostBinding('class._has-counter')
], TuiTextAreaComponent.prototype, "hasCounter", null);
__decorate([
HostBinding('attr.data-mode')
], TuiTextAreaComponent.prototype, "hostMode", null);
TuiTextAreaComponent = TuiTextAreaComponent_1 = __decorate([
Component({
selector: 'tui-text-area',
template: "<tui-wrapper\n automation-id=\"tui-text-area__wrapper\"\n class=\"outline\"\n [appearance]=\"appearance\"\n [disabled]=\"disabled\"\n [focused]=\"computedFocused\"\n [hovered]=\"computedHovered\"\n [readOnly]=\"readOnly\"\n [invalid]=\"computedInvalid\"\n>\n <div\n *ngIf=\"hasCounter\"\n automation-id=\"tui-text-area__counter\"\n class=\"counter\"\n >\n {{value.length}}/{{controller.maxLength}}\n </div>\n</tui-wrapper>\n\n<label\n class=\"content\"\n (tuiHoveredChange)=\"onHovered($event)\"\n (mousedown)=\"onMouseDown($event)\"\n>\n <div class=\"wrapper\">\n <div\n *ngIf=\"hasPlaceholder\"\n automation-id=\"tui-text-area__placeholder\"\n class=\"placeholder\"\n [class.placeholder_raised]=\"placeholderRaised\"\n >\n <ng-content></ng-content>\n </div>\n <div\n *ngIf=\"hasExampleText\"\n automation-id=\"tui-text-area__example-text\"\n class=\"example-text\"\n >\n <span class=\"example-text-inner\"> {{controller.exampleText}} </span>\n </div>\n <tui-scrollbar\n automation-id=\"tui-text-area__scrollbar\"\n class=\"box\"\n [style.maxHeight.px]=\"computeMaxHeight\"\n >\n <div class=\"input-wrapper\">\n <div class=\"relative\">\n <div class=\"pseudo-content\">{{value}} </div>\n <textarea\n #focusableElement\n automation-id=\"tui-text-area__native\"\n class=\"input\"\n [attr.maxLength]=\"controller.maxLength\"\n [id]=\"id\"\n [tuiFocusable]=\"focusable\"\n [disabled]=\"disabled\"\n [ngModel]=\"value\"\n [readOnly]=\"readOnly\"\n (tuiFocusedChange)=\"onFocused($event)\"\n (ngModelChange)=\"onValue($event)\"\n ></textarea>\n </div>\n </div>\n </tui-scrollbar>\n </div>\n <tui-tooltip\n *ngIf=\"hasTooltip\"\n automation-id=\"tui-text-area__tooltip\"\n class=\"tooltip\"\n describeId=\"placeholer_until_accesibility_is_added\"\n [direction]=\"hintController.direction\"\n [mode]=\"hintController.mode\"\n [content]=\"hintController.content\"\n ></tui-tooltip>\n</label>\n",
changeDetection: ChangeDetectionStrategy.OnPush,
providers: [
{
provide: TUI_FOCUSABLE_ITEM_ACCESSOR,
useExisting: forwardRef(() => TuiTextAreaComponent_1),
},
TEXTFIELD_CONTROLLER_PROVIDER,
HINT_CONTROLLER_PROVIDER,
],
styles: [":host{font:var(--tui-font-text-m);position:relative;z-index:0;display:flex;flex-direction:column;min-height:108px;border-radius:var(--tui-radius-m);color:var(--tui-text-01)}:host[data-mode=onDark]{color:var(--tui-base-01)}:host[data-tui-host-size='m']{font:var(--tui-font-text-s);min-height:88px}:host[data-tui-host-size='m']._has-counter{min-height:106px}:host[data-tui-host-size='l']._has-counter{min-height:126px}.outline{position:absolute;top:0;left:0;width:100%;height:100%;z-index:-1}.content{margin-top:0;margin-bottom:0;min-height:inherit;width:100%;box-sizing:border-box;overflow:hidden;cursor:text}@media all and (-webkit-min-device-pixel-ratio:0) and (min-resolution:0.001dpcm){.content::-webkit-scrollbar,.content::-webkit-scrollbar-thumb{width:16px;height:16px;border-radius:100px;background-clip:padding-box;border:6px solid transparent}.content::-webkit-scrollbar{background-color:transparent}.content::-webkit-scrollbar-thumb{background-color:var(--tui-clear-hover)}.content::-webkit-scrollbar-thumb:hover{background-color:var(--tui-clear-active)}.content::-webkit-scrollbar-thumb:active{background-color:var(--tui-text-03)}}:host._disabled .content{cursor:auto;opacity:var(--tui-disabled-opacity)}:host:not(._expandable) .content{position:absolute;top:0;left:0;bottom:1px;right:0;min-height:auto}:host._has-counter:not(._expandable) .content{bottom:27px}.wrapper{position:relative;width:100%;height:100%;min-height:inherit;padding-bottom:7px;box-sizing:border-box}:host[data-tui-host-size='m']._label-outside .wrapper{padding-top:12px}:host[data-tui-host-size='l']._label-outside .wrapper{padding-top:16px}:host[data-tui-host-size='m']:not(._label-outside) .wrapper{padding-top:22px}:host[data-tui-host-size='l']:not(._label-outside) .wrapper{padding-top:26px}.input-wrapper{min-height:inherit;width:100%;flex:1}.relative{position:relative;min-height:inherit}.box{display:flex;min-height:100%;width:100%}:host:not(._expandable) .box{height:100%}:host._has-counter._expandable .box{margin-bottom:20px}.pseudo-content{white-space:pre-wrap;word-wrap:break-word;pointer-events:none;visibility:hidden;overflow:hidden}:host[data-tui-host-size='m'] .pseudo-content{padding:0 12px}:host[data-tui-host-size='l'] .pseudo-content{padding:0 16px}:host._focused._has-tooltip .pseudo-content,:host._has-value._has-tooltip .pseudo-content{margin-right:40px}.input{padding:0;border:0;border-radius:inherit;background:0 0;font-size:inherit;line-height:inherit;font-weight:inherit;color:inherit;caret-color:currentColor;outline:0;-webkit-appearance:none;-moz-appearance:none;appearance:none;word-break:keep-all;-webkit-text-fill-color:currentColor;position:absolute;top:0;left:0;width:100%;box-sizing:border-box;height:100%;resize:none;overflow:hidden}.input:-webkit-autofill,.input:-webkit-autofill:focus,.input:-webkit-autofill:hover{border-radius:inherit;-webkit-text-fill-color:inherit!important;color:inherit!important;background-color:transparent!important;-webkit-box-shadow:0 0 0 1000px var(--tui-autofill) inset!important}.input:focus{outline:0}:host[data-tui-host-size='m'] .input{padding:0 12px}:host[data-tui-host-size='l'] .input{padding:0 16px}:host._focused._has-tooltip .input,:host._has-value._has-tooltip .input{padding-right:40px}:host._ios .input{padding-left:13px}:host[data-mode=onDark]._disabled .input{color:var(--tui-text-03-night)}.placeholder{transition-property:transform,min-width,color,letter-spacing;transition-duration:.3s;transition-timing-function:ease-in-out;font:var(--tui-font-text-s);color:var(--tui-text-01);white-space:nowrap;overflow:hidden;text-overflow:ellipsis;display:block;width:100%;height:20px;font-size:13px;box-sizing:border-box;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;pointer-events:none;color:var(--tui-text-02);transform-origin:left;letter-spacing:normal;text-transform:none;position:absolute;max-width:calc(100% - 24px)}.placeholder_raised{width:114%;transform:translateY(-10px) scale(.87);max-width:calc(113% - 32px)}:host[data-tui-host-size='m'] .placeholder_raised{width:118%;transform:translateY(-8px) scale(.85);letter-spacing:.4px}:host._invalid:not(._focused) .placeholder_raised,:host._invalid:not(._focused)._hovered .placeholder_raised{color:var(--tui-error-fill)}:host[data-mode=onDark]._invalid:not(._focused) .placeholder_raised,:host[data-mode=onDark]._invalid:not(._focused)._hovered .placeholder_raised{color:var(--tui-error-fill-night)}:host._focused .placeholder,:host[data-tui-host-size='l']._focused._label-outside .placeholder,:host[data-tui-host-size='m']._focused._label-outside .placeholder{color:var(--tui-text-03)}:host[data-tui-host-size='l']._focused:not(._label-outside) .placeholder,:host[data-tui-host-size='m']._focused:not(._label-outside) .placeholder{color:var(--tui-text-01)}:host[data-mode=onDark] .placeholder{color:var(--tui-text-02-night)}:host[data-tui-host-size='l'][data-mode=onDark]._focused:not(._label-outside) .placeholder,:host[data-tui-host-size='m'][data-mode=onDark]._focused:not(._label-outside) .placeholder{color:var(--tui-text-01-night)}:host[data-mode=onDark]._focused .placeholder,:host[data-tui-host-size='l'][data-mode=onDark]._focused._label-outside .placeholder,:host[data-tui-host-size='m'][data-mode=onDark]._focused._label-outside .placeholder{color:var(--tui-text-02-night)}:host[data-tui-host-size='m'] .placeholder{top:12px;left:12px}:host[data-tui-host-size='l'] .placeholder{font-size:15px;top:16px;left:16px}:host._has-tooltip .placeholder{max-width:calc(100% - 52px)}.example-text{position:absolute;max-width:calc(100% - 24px);color:var(--tui-text-03);-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}:host._has-tooltip._focused .example-text,:host._has-tooltip._has-value .example-text{max-width:calc(100% - 52px)}.tooltip{position:absolute;top:16px;right:12px}.counter{font:var(--tui-font-text-s);position:absolute;bottom:8px;right:12px;pointer-events:none;margin-top:auto;text-align:right;color:var(--tui-text-03)}:host[data-mode=onDark] .counter{color:var(--tui-text-03-night)}"]
}),
__param(0, Optional()),
__param(0, Self()),
__param(0, Inject(NgControl)),
__param(1, Inject(ChangeDetectorRef)),
__param(2, Inject(TUI_TEXTFIELD_APPEARANCE)),
__param(3, Inject(TUI_IS_IOS)),
__param(4, Optional()),
__param(4, Inject(TuiModeDirective)),
__param(5, Inject(TUI_TEXTIFELD_WATCHED_CONTROLLER)),
__param(6, Inject(TUI_HINT_WATCHED_CONTROLLER))
], TuiTextAreaComponent);
export { TuiTextAreaComponent };
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGV4dC1hcmVhLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiJuZzovL0B0YWlnYS11aS9raXQvY29tcG9uZW50cy90ZXh0LWFyZWEvIiwic291cmNlcyI6WyJ0ZXh0LWFyZWEuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBQUEsT0FBTyxFQUNILHVCQUF1QixFQUN2QixpQkFBaUIsRUFDakIsU0FBUyxFQUNULFVBQVUsRUFDVixVQUFVLEVBQ1YsV0FBVyxFQUNYLE1BQU0sRUFDTixLQUFLLEVBQ0wsUUFBUSxFQUNSLElBQUksRUFDSixTQUFTLEdBQ1osTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFDLFNBQVMsRUFBQyxNQUFNLGdCQUFnQixDQUFDO0FBQ3pDLE9BQU8sRUFDSCxrQkFBa0IsRUFDbEIsZUFBZSxFQUNmLGdCQUFnQixFQUNoQiwyQkFBMkIsRUFDM0IsVUFBVSxFQUNWLGNBQWMsR0FFakIsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUNILHdCQUF3QixFQUN4Qiw2QkFBNkIsRUFDN0IsMkJBQTJCLEVBQzNCLHdCQUF3QixFQUN4QixnQ0FBZ0MsRUFDaEMsYUFBYSxFQUNiLDBCQUEwQixFQUMxQixnQkFBZ0IsRUFDaEIsUUFBUSxFQUNSLFFBQVEsRUFDUixzQkFBc0IsR0FDekIsTUFBTSxnQkFBZ0IsQ0FBQztBQUV4QixNQUFNLENBQUMsTUFBTSxZQUFZLEdBQUcsRUFBRSxDQUFDO0FBQy9CLE1BQU0sQ0FBQyxNQUFNLGFBQWEsR0FBRyxFQUFFLENBQUM7QUFDaEMsTUFBTSxDQUFDLE1BQU0sYUFBYSxHQUFHLEVBQUUsQ0FBQztBQWdCaEMsSUFBYSxvQkFBb0IsNEJBQWpDLE1BQWEsb0JBQ1QsU0FBUSxrQkFBMEI7SUFpQmxDLFlBSUksT0FBeUIsRUFDRSxpQkFBb0MsRUFDcEIsVUFBa0IsRUFDekMsS0FBYyxFQUdqQixhQUFzQyxFQUU5QyxVQUFrQyxFQUVsQyxjQUEwQztRQUVuRCxLQUFLLENBQUMsT0FB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QUFzQixDQUFDO3dEQUduQztBQWFEO0lBREMsV0FBVyxDQUFDLHlCQUF5QixDQUFDO2dEQUd0QztBQUdEO0lBREMsV0FBVyxDQUFDLG9CQUFvQixDQUFDO3NEQUdqQztBQUdEO0lBREMsV0FBVyxDQUFDLGtCQUFrQixDQUFDO29EQUcvQjtBQUdEO0lBREMsV0FBVyxDQUFDLG9CQUFvQixDQUFDO3NEQUdqQztBQW9CRDtJQURDLFdBQVcsQ0FBQyxnQkFBZ0IsQ0FBQztvREFHN0I7QUE5RlEsb0JBQW9CO0lBZGhDLFNBQVMsQ0FBQztRQUNQLFFBQVEsRUFBRSxlQUFlO1FBQ3pCLDhoRkFBd0M7UUFFeEMsZUFBZSxFQUFFLHVCQUF1QixDQUFDLE1BQU07UUFDL0MsU0FBUyxFQUFFO1lBQ1A7Z0JBQ0ksT0FBTyxFQUFFLDJCQUEyQjtnQkFDcEMsV0FBVyxFQUFFLFVBQVUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxzQkFBb0IsQ0FBQzthQUN0RDtZQUNELDZCQUE2QjtZQUM3Qix3QkFBd0I7U0FDM0I7O0tBQ0osQ0FBQztJQW9CTyxXQUFBLFFBQVEsRUFBRSxDQUFBO0lBQ1YsV0FBQSxJQUFJLEVBQUUsQ0FBQTtJQUNOLFdBQUEsTUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFBO0lBRWpCLFdBQUEsTUFBTSxDQUFDLGlCQUFpQixDQUFDLENBQUE7SUFDekIsV0FBQSxNQUFNLENBQUMsd0JBQXdCLENBQUMsQ0FBQTtJQUNoQyxXQUFBLE1BQU0sQ0FBQyxVQUFVLENBQUMsQ0FBQTtJQUNsQixXQUFBLFFBQVEsRUFBRSxDQUFBO0lBQ1YsV0FBQSxNQUFNLENBQUMsZ0JBQWdCLENBQUMsQ0FBQTtJQUV4QixXQUFBLE1BQU0sQ0FBQyxnQ0FBZ0MsQ0FBQyxDQUFBO0lBRXhDLFdBQUEsTUFBTSxDQUFDLDJCQUEyQixDQUFDLENBQUE7R0EvQi9CLG9CQUFvQixDQTBJaEM7U0ExSVksb0JBQW9CIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcbiAgICBDaGFuZ2VEZXRlY3RvclJlZixcbiAgICBDb21wb25lbnQsXG4gICAgRWxlbWVudFJlZixcbiAgICBmb3J3YXJkUmVmLFxuICAgIEhvc3RCaW5kaW5nLFxuICAgIEluamVjdCxcbiAgICBJbnB1dCxcbiAgICBPcHRpb25hbCxcbiAgICBTZWxmLFxuICAgIFZpZXdDaGlsZCxcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge05nQ29udHJvbH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHtcbiAgICBBYnN0cmFjdFR1aUNvbnRyb2wsXG4gICAgaXNOYXRpdmVGb2N1c2VkLFxuICAgIHNldE5hdGl2ZUZvY3VzZWQsXG4gICAgVFVJX0ZPQ1VTQUJMRV9JVEVNX0FDQ0VTU09SLFxuICAgIFRVSV9JU19JT1MsXG4gICAgdHVpRGVmYXVsdFByb3AsXG4gICAgVHVpRm9jdXNhYmxlRWxlbWVudEFjY2Vzc29yLFxufSBmcm9tICdAdGFpZ2EtdWkvY2RrJztcbmltcG9ydCB7XG4gICAgSElOVF9DT05UUk9MTEVSX1BST1ZJREVSLFxuICAgIFRFWFRGSUVMRF9DT05UUk9MTEVSX1BST1ZJREVSLFxuICAgIFRVSV9ISU5UX1dBVENIRURfQ09OVFJPTExFUixcbiAgICBUVUlfVEVYVEZJRUxEX0FQUEVBUkFOQ0UsXG4gICAgVFVJX1RFWFRJRkVMRF9XQVRDSEVEX0NPTlRST0xMRVIsXG4gICAgVHVpQnJpZ2h0bmVzcyxcbiAgICBUdWlIaW50Q29udHJvbGxlckRpcmVjdGl2ZSxcbiAgICBUdWlNb2RlRGlyZWN0aXZlLFxuICAgIFR1aVNpemVMLFxuICAgIFR1aVNpemVTLFxuICAgIFR1aVRleHRmaWVsZENvbnRyb2xsZXIsXG59IGZyb20gJ0B0YWlnYS11aS9jb3JlJztcblxuZXhwb3J0IGNvbnN0IERFRkFVTFRfUk9XUyA9IDIwO1xuZXhwb3J0IGNvbnN0IExJTkVfSEVJR0hUX00gPSAyMDtcbmV4cG9ydCBjb25zdCBMSU5FX0hFSUdIVF9MID0gMjQ7XG5cbkBDb21wb25lbnQoe1xuICAgIHNlbGVjdG9yOiAndHVpLXRleHQtYXJlYScsXG4gICAgdGVtcGxhdGVVcmw6ICcuL3RleHQtYXJlYS50ZW1wbGF0ZS5odG1sJyxcbiAgICBzdHlsZVVybHM6IFsnLi90ZXh0LWFyZWEuc3R5bGUubGVzcyddLFxuICAgIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxuICAgIHByb3ZpZGVyczogW1xuICAgICAgICB7XG4gICAgICAgICAgICBwcm92aWRlOiBUVUlfRk9DVVNBQkxFX0lURU1fQUNDRVNTT1IsXG4gICAgICAgICAgICB1c2VFeGlzdGluZzogZm9yd2FyZFJlZigoKSA9PiBUdWlUZXh0QXJlYUNvbXBvbmVudCksXG4gICAgICAgIH0sXG4gICAgICAgIFRFWFRGSUVMRF9DT05UUk9MTEVSX1BST1ZJREVSLFxuICAgICAgICBISU5UX0NPTlRST0xMRVJfUFJPVklERVIsXG4gICAgXSxcbn0pXG5leHBvcnQgY2xhc3MgVHVpVGV4dEFyZWFDb21wb25lbnRcbiAgICBleHRlbmRzIEFic3RyYWN0VHVpQ29udHJvbDxzdHJpbmc+XG4gICAgaW1wbGVtZW50cyBUdWlGb2N1c2FibGVFbGVtZW50QWNjZXNzb3Ige1xuICAgIEBJbnB1dCgpXG4gICAgQHR1aURlZmF1bHRQcm9wKClcbiAgICByb3dzID0gREVGQVVMVF9ST1dTO1xuXG4gICAgQElucHV0KClcbiAgICBASG9zdEJpbmRpbmcoJ2NsYXNzLl9leHBhbmRhYmxlJylcbiAgICBAdHVpRGVmYXVsdFByb3AoKVxuICAgIGV4cGFuZGFibGUgPSBmYWxzZTtcblxuICAgIEBIb3N0QmluZGluZygnY2xhc3MuX2lvcycpXG4gICAgcmVhZG9ubHkgaXNJT1M6IGJvb2xlYW47XG5cbiAgICBAVmlld0NoaWxkKCdmb2N1c2FibGVFbGVtZW50JylcbiAgICBwcml2YXRlIHJlYWRvbmx5IGZvY3VzYWJsZUVsZW1lbnQ/OiBFbGVtZW50UmVmPEhUTUxUZXh0QXJlYUVsZW1lbnQ+O1xuXG4gICAgY29uc3RydWN0b3IoXG4gICAgICAgIEBPcHRpb25hbCgpXG4gICAgICAgIEBTZWxmKClcbiAgICAgICAgQEluamVjdChOZ0NvbnRyb2wpXG4gICAgICAgIGNvbnRyb2w6IE5nQ29udHJvbCB8IG51bGwsXG4gICAgICAgIEBJbmplY3QoQ2hhbmdlRGV0ZWN0b3JSZWYpIGNoYW5nZURldGVjdG9yUmVmOiBDaGFuZ2VEZXRlY3RvclJlZixcbiAgICAgICAgQEluamVjdChUVUlfVEVYVEZJRUxEX0FQUEVBUkFOQ0UpIHJlYWRvbmx5IGFwcGVhcmFuY2U6IHN0cmluZyxcbiAgICAgICAgQEluamVjdChUVUlfSVNfSU9TKSBpc0lPUzogYm9vbGVhbixcbiAgICAgICAgQE9wdGlvbmFsKClcbiAgICAgICAgQEluamVjdChUdWlNb2RlRGlyZWN0aXZlKVxuICAgICAgICBwcml2YXRlIHJlYWRvbmx5IG1vZGVEaXJlY3RpdmU6IFR1aU1vZGVEaXJlY3RpdmUgfCBudWxsLFxuICAgICAgICBASW5qZWN0KFRVSV9URVhUSUZFTERfV0FUQ0hFRF9DT05UUk9MTEVSKVxuICAgICAgICByZWFkb25seSBjb250cm9sbGVyOiBUdWlUZXh0ZmllbGRDb250cm9sbGVyLFxuICAgICAgICBASW5qZWN0KFRVSV9ISU5UX1dBVENIRURfQ09OVFJPTExFUilcbiAgICAgICAgcmVhZG9ubHkgaGludENvbnRyb2xsZXI6IFR1aUhpbnRDb250cm9sbGVyRGlyZWN0aXZlLFxuICAgICkge1xuICAgICAgICBzdXBlcihjb250cm9sLCBjaGFuZ2VEZXRlY3RvclJlZik7XG5cbiAgICAgICAgdGhpcy5pc0lPUyA9IGlzSU9TO1xuICAgIH1cblxuICAgIEBIb3N0QmluZGluZygnY2xhc3MuX2xhYmVsLW91dHNpZGUnKVxuICAgIGdldCBsYWJlbE91dHNpZGUoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLmNvbnRyb2xsZXIubGFiZWxPdXRzaWRlO1xuICAgIH1cblxuICAgIGdldCBuYXRpdmVGb2N1c2FibGVFbGVtZW50KCk6IEhUTUxUZXh0QXJlYUVsZW1lbnQgfCBudWxsIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY29tcHV0ZWREaXNhYmxlZCB8fCAhdGhpcy5mb2N1c2FibGVFbGVtZW50XG4gICAgICAgICAgICA/IG51bGxcbiAgICAgICAgICAgIDogdGhpcy5mb2N1c2FibGVFbGVtZW50Lm5hdGl2ZUVsZW1lbnQ7XG4gICAgfVxuXG4gICAgZ2V0IGZvY3VzZWQoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiBpc05hdGl2ZUZvY3VzZWQodGhpcy5uYXRpdmVGb2N1c2FibGVFbGVtZW50KTtcbiAgICB9XG5cbiAgICBASG9zdEJpbmRpbmcoJ2F0dHIuZGF0YS10dWktaG9zdC1zaXplJylcbiAgICBnZXQgc2l6ZSgpOiBUdWlTaXplTCB8IFR1aVNpemVTIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY29udHJvbGxlci5zaXplO1xuICAgIH1cblxuICAgIEBIb3N0QmluZGluZygnY2xhc3MuX2hhcy10b29sdGlwJylcbiAgICBnZXQgaGFzVG9vbHRpcCgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuICEhdGhpcy5oaW50Q29udHJvbGxlci5jb250ZW50ICYmICF0aGlzLmRpc2FibGVkO1xuICAgIH1cblxuICAgIEBIb3N0QmluZGluZygnY2xhc3MuX2hhcy12YWx1ZScpXG4gICAgZ2V0IGhhc1ZhbHVlKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy52YWx1ZSAhPT0gJyc7XG4gICAgfVxuXG4gICAgQEhvc3RCaW5kaW5nKCdjbGFzcy5faGFzLWNvdW50ZXInKVxuICAgIGdldCBoYXNDb3VudGVyKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gISF0aGlzLmNvbnRyb2xsZXIubWF4TGVuZ3RoICYmICF0aGlzLmRpc2FibGVkICYmICF0aGlzLnJlYWRPbmx5O1xuICAgIH1cblxuICAgIGdldCBoYXNQbGFjZWhvbGRlcigpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuICF0aGlzLmNvbnRyb2xsZXIubGFiZWxPdXRzaWRlIHx8ICghdGhpcy5oYXNWYWx1ZSAmJiAhdGhpcy5oYXNFeGFtcGxlVGV4dCk7XG4gICAgfVxuXG4gICAgZ2V0IGhhc0V4YW1wbGVUZXh0KCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgISF0aGlzLmNvbnRyb2xsZXIuZXhhbXBsZVRleHQgJiZcbiAgICAgICAgICAgIHRoaXMuZm9jdXNlZCAmJlxuICAgICAgICAgICAgIXRoaXMuaGFzVmFsdWUgJiZcbiAgICAgICAgICAgICF0aGlzLnJlYWRPbmx5XG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgZ2V0IGNvbXB1dGVNYXhIZWlnaHQoKTogbnVtYmVyIHwgbnVsbCB7XG4gICAgICAgIHJldHVybiB0aGlzLmV4cGFuZGFibGUgPyB0aGlzLnJvd3MgKiB0aGlzLmxpbmVIZWlnaHQgOiBudWxsO1xuICAgIH1cblxuICAgIEBIb3N0QmluZGluZygnYXR0ci5kYXRhLW1vZGUnKVxuICAgIGdldCBob3N0TW9kZSgpOiBUdWlCcmlnaHRuZXNzIHwgbnVsbCB7XG4gICAgICAgIHJldHVybiB0aGlzLm1vZGVEaXJlY3RpdmUgJiYgdGhpcy5tb2RlRGlyZWN0aXZlLm1vZGU7XG4gICAgfVxuXG4gICAgZ2V0IHBsYWNlaG9sZGVyUmFpc2VkKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgIXRoaXMuY29udHJvbGxlci5sYWJlbE91dHNpZGUgJiZcbiAgICAgICAgICAgICgodGhpcy5jb21wdXRlZEZvY3VzZWQgJiYgIXRoaXMucmVhZE9ubHkpIHx8IHRoaXMuaGFzVmFsdWUpXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgb25Gb2N1c2VkKGZvY3VzZWQ6IGJvb2xlYW4pIHtcbiAgICAgICAgdGhpcy51cGRhdGVGb2N1c2VkKGZvY3VzZWQpO1xuICAgIH1cblxuICAgIG9uSG92ZXJlZChob3ZlcmVkOiBib29sZWFuKSB7XG4gICAgICAgIHRoaXMudXBkYXRlSG92ZXJlZChob3ZlcmVkKTtcbiAgICB9XG5cbiAgICBvblByZXNzZWQocHJlc3NlZDogYm9vbGVhbikge1xuICAgICAgICB0aGlzLnVwZGF0ZVByZXNzZWQocHJlc3NlZCk7XG4gICAgfVxuXG4gICAgb25WYWx1ZSh2YWx1ZTogc3RyaW5nKSB7XG4gICAgICAgIHRoaXMudXBkYXRlVmFsdWUodmFsdWUpO1xuICAgIH1cblxuICAgIG9uTW91c2VEb3duKGV2ZW50OiBNb3VzZUV2ZW50KSB7XG4gICAgICAgIGlmIChldmVudC50YXJnZXQgPT09IHRoaXMubmF0aXZlRm9jdXNhYmxlRWxlbWVudCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcblxuICAgICAgICBpZiAodGhpcy5uYXRpdmVGb2N1c2FibGVFbGVtZW50KSB7XG4gICAgICAgICAgICBzZXROYXRpdmVGb2N1c2VkKHRoaXMubmF0aXZlRm9jdXNhYmxlRWxlbWVudCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgZ2V0RmFsbGJhY2tWYWx1ZSgpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gJyc7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBnZXQgbGluZUhlaWdodCgpOiBudW1iZXIge1xuICAgICAgICByZXR1cm4gdGhpcy5jb250cm9sbGVyLnNpemUgPT09ICdtJyA/IExJTkVfSEVJR0hUX00gOiBMSU5FX0hFSUdIVF9MO1xuICAgIH1cbn1cbiJdfQ==