@alauda-fe/common
Version:
Alauda frontend team common codes.
286 lines • 34.5 kB
JavaScript
import { coerceAttrBoolean, FormItemWidth, FormModule, IconComponent, INPUT_GROUP_MODULE, InputComponent, isTemplateRef, } from '@alauda/ui';
import { NgIf, NgTemplateOutlet } from '@angular/common';
import { ChangeDetectionStrategy, Component, Input, forwardRef, } from '@angular/core';
import { FormsModule, NG_VALIDATORS, NG_VALUE_ACCESSOR, } from '@angular/forms';
import { decode, encode } from 'ab64';
import { assocPath } from 'ramda';
import { BaseNestedFormControlPure, PurePipe } from '../../core/public-api';
import { ERRORS_MAPPER_MODULE } from '../../form/errors-mapper/public-api';
import { STRONG_PASSWORD_SPECIAL_CHARS, ValidatorsModule, } from '../../form/validators/public-api';
import { TranslatePipe } from '../../translate/public-api';
import * as i0 from "@angular/core";
import * as i1 from "@alauda/ui";
import * as i2 from "@angular/forms";
import * as i3 from "../../form/errors-mapper/errors-mapper-component/component";
import * as i4 from "../../form/errors-mapper/errors-mapper.directive";
import * as i5 from "../../form/validators/strong-password/strong-password-validator.directive";
import * as i6 from "../../form/validators/function-validator.directive";
const _c0 = a0 => ({ chars: a0 });
const _c1 = a0 => ({ pattern: a0 });
const _c2 = a0 => ({ notMatch: a0 });
function PasswordInputComponent_aui_input_group_4_aui_icon_5_Template(rf, ctx) { if (rf & 1) {
const _r3 = i0.ɵɵgetCurrentView();
i0.ɵɵelementStart(0, "aui-icon", 14);
i0.ɵɵlistener("click", function PasswordInputComponent_aui_input_group_4_aui_icon_5_Template_aui_icon_click_0_listener() { i0.ɵɵrestoreView(_r3); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.showPassword = !ctx_r1.showPassword); });
i0.ɵɵelementEnd();
} if (rf & 2) {
const ctx_r1 = i0.ɵɵnextContext(2);
i0.ɵɵproperty("icon", ctx_r1.showPassword ? "eye_s" : "eye_slash_s");
} }
function PasswordInputComponent_aui_input_group_4_Template(rf, ctx) { if (rf & 1) {
const _r1 = i0.ɵɵgetCurrentView();
i0.ɵɵelementStart(0, "aui-input-group", 11)(1, "input", 12, 1);
i0.ɵɵpipe(3, "translate");
i0.ɵɵpipe(4, "translate");
i0.ɵɵlistener("ngModelChange", function PasswordInputComponent_aui_input_group_4_Template_input_ngModelChange_1_listener($event) { i0.ɵɵrestoreView(_r1); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.emitModel($event)); });
i0.ɵɵelementEnd();
i0.ɵɵtemplate(5, PasswordInputComponent_aui_input_group_4_aui_icon_5_Template, 1, 1, "aui-icon", 13);
i0.ɵɵelementEnd();
} if (rf & 2) {
const ctx_r1 = i0.ɵɵnextContext();
const passwordError_r4 = i0.ɵɵreference(7);
i0.ɵɵproperty("required", ctx_r1.required);
i0.ɵɵadvance();
i0.ɵɵproperty("type", ctx_r1.showPassword ? "text" : "password")("ngModel", ctx_r1.model)("required", ctx_r1.required)("aclStrongPassword", ctx_r1.strongPassword)("specialChars", ctx_r1.specialChars)("pattern", ctx_r1.strongPassword ? null : ctx_r1.pattern)("placeholder", ctx_r1.placeholder)("aclErrorsMapperOutlet", passwordError_r4)("aclErrorsMapper", i0.ɵɵpureFunction1(18, _c1, ctx_r1.strongPassword ? i0.ɵɵpipeBind2(3, 11, "strong_password_pattern_tip", i0.ɵɵpureFunction1(16, _c0, ctx_r1.specialChars.split("").join(", "))) : i0.ɵɵpipeBind1(4, 14, "invalid_pattern")));
i0.ɵɵadvance(4);
i0.ɵɵproperty("ngIf", ctx_r1.toggleable);
} }
function PasswordInputComponent_div_5_ng_container_1_ng_container_1_Template(rf, ctx) { if (rf & 1) {
i0.ɵɵelementContainer(0);
} }
function PasswordInputComponent_div_5_ng_container_1_Template(rf, ctx) { if (rf & 1) {
i0.ɵɵelementContainerStart(0);
i0.ɵɵtemplate(1, PasswordInputComponent_div_5_ng_container_1_ng_container_1_Template, 1, 0, "ng-container", 17);
i0.ɵɵelementContainerEnd();
} if (rf & 2) {
const ctx_r1 = i0.ɵɵnextContext(2);
i0.ɵɵadvance();
i0.ɵɵproperty("ngTemplateOutlet", ctx_r1.hint);
} }
function PasswordInputComponent_div_5_ng_template_2_Template(rf, ctx) { if (rf & 1) {
i0.ɵɵtext(0);
} if (rf & 2) {
const ctx_r1 = i0.ɵɵnextContext(2);
i0.ɵɵtextInterpolate1(" ", ctx_r1.hint, " ");
} }
function PasswordInputComponent_div_5_Template(rf, ctx) { if (rf & 1) {
i0.ɵɵelementStart(0, "div", 15);
i0.ɵɵtemplate(1, PasswordInputComponent_div_5_ng_container_1_Template, 2, 1, "ng-container", 16)(2, PasswordInputComponent_div_5_ng_template_2_Template, 1, 1, "ng-template", null, 2, i0.ɵɵtemplateRefExtractor);
i0.ɵɵelementEnd();
} if (rf & 2) {
const defaultDescription_r5 = i0.ɵɵreference(3);
const ctx_r1 = i0.ɵɵnextContext();
i0.ɵɵadvance();
i0.ɵɵproperty("ngIf", ctx_r1.isTemplateRef(ctx_r1.hint))("ngIfElse", defaultDescription_r5);
} }
function PasswordInputComponent_ng_container_8_button_3_Template(rf, ctx) { if (rf & 1) {
const _r6 = i0.ɵɵgetCurrentView();
i0.ɵɵelementStart(0, "button", 19);
i0.ɵɵlistener("click", function PasswordInputComponent_ng_container_8_button_3_Template_button_click_0_listener() { i0.ɵɵrestoreView(_r6); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.updatePasswd()); });
i0.ɵɵelement(1, "aui-icon", 20);
i0.ɵɵelementEnd();
} }
function PasswordInputComponent_ng_container_8_Template(rf, ctx) { if (rf & 1) {
i0.ɵɵelementContainerStart(0);
i0.ɵɵelementStart(1, "span");
i0.ɵɵtext(2, "******");
i0.ɵɵelementEnd();
i0.ɵɵtemplate(3, PasswordInputComponent_ng_container_8_button_3_Template, 2, 0, "button", 18);
i0.ɵɵelementContainerEnd();
} if (rf & 2) {
const ctx_r1 = i0.ɵɵnextContext();
i0.ɵɵadvance(3);
i0.ɵɵproperty("ngIf", !ctx_r1.readonly);
} }
function PasswordInputComponent_aui_form_item_9_aui_icon_8_Template(rf, ctx) { if (rf & 1) {
const _r8 = i0.ɵɵgetCurrentView();
i0.ɵɵelementStart(0, "aui-icon", 14);
i0.ɵɵlistener("click", function PasswordInputComponent_aui_form_item_9_aui_icon_8_Template_aui_icon_click_0_listener() { i0.ɵɵrestoreView(_r8); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.showPassword = !ctx_r1.showPassword); });
i0.ɵɵelementEnd();
} if (rf & 2) {
const ctx_r1 = i0.ɵɵnextContext(2);
i0.ɵɵproperty("icon", ctx_r1.showPassword ? "eye_s" : "eye_slash_s");
} }
function PasswordInputComponent_aui_form_item_9_Template(rf, ctx) { if (rf & 1) {
const _r7 = i0.ɵɵgetCurrentView();
i0.ɵɵelementStart(0, "aui-form-item", 4)(1, "label", 5);
i0.ɵɵtext(2);
i0.ɵɵpipe(3, "translate");
i0.ɵɵelementEnd();
i0.ɵɵelementStart(4, "aui-input-group", 11)(5, "input", 21, 3);
i0.ɵɵpipe(7, "pure");
i0.ɵɵtwoWayListener("ngModelChange", function PasswordInputComponent_aui_form_item_9_Template_input_ngModelChange_5_listener($event) { i0.ɵɵrestoreView(_r7); const ctx_r1 = i0.ɵɵnextContext(); i0.ɵɵtwoWayBindingSet(ctx_r1.confirmPassword, $event) || (ctx_r1.confirmPassword = $event); return i0.ɵɵresetView($event); });
i0.ɵɵelementEnd();
i0.ɵɵtemplate(8, PasswordInputComponent_aui_form_item_9_aui_icon_8_Template, 1, 1, "aui-icon", 13);
i0.ɵɵelementEnd();
i0.ɵɵelement(9, "acl-errors-mapper", 22);
i0.ɵɵpipe(10, "translate");
i0.ɵɵelementEnd();
} if (rf & 2) {
const confirm_r9 = i0.ɵɵreference(6);
const ctx_r1 = i0.ɵɵnextContext();
i0.ɵɵproperty("width", ctx_r1.width);
i0.ɵɵadvance(2);
i0.ɵɵtextInterpolate(i0.ɵɵpipeBind1(3, 10, "confirm_password"));
i0.ɵɵadvance(2);
i0.ɵɵproperty("required", ctx_r1.required);
i0.ɵɵadvance();
i0.ɵɵproperty("type", ctx_r1.showPassword ? "text" : "password");
i0.ɵɵtwoWayProperty("ngModel", ctx_r1.confirmPassword);
i0.ɵɵproperty("required", ctx_r1.required)("aclValidateFn", i0.ɵɵpipeBind2(7, 12, ctx_r1.model, ctx_r1.validateConfirmPassword));
i0.ɵɵadvance(3);
i0.ɵɵproperty("ngIf", ctx_r1.toggleable);
i0.ɵɵadvance();
i0.ɵɵproperty("errors", confirm_r9 == null ? null : confirm_r9.errors)("errorsMapper", i0.ɵɵpureFunction1(17, _c2, i0.ɵɵpipeBind1(10, 15, "confirm_password_not_match")));
} }
export class PasswordInputComponent extends BaseNestedFormControlPure {
constructor() {
super(...arguments);
this.specialChars = STRONG_PASSWORD_SPECIAL_CHARS;
this.strongPassword = true;
this.enableConfirm = true;
this.width = 'medium';
this.toggleable = true;
this.encoding = {
encode,
decode,
};
this.placeholder = '';
this.showPassword = false;
this.showInput = true;
this.confirmPassword = '';
this.isTemplateRef = isTemplateRef;
this._required = true;
}
set required(required) {
this._required = coerceAttrBoolean(required);
}
get required() {
return this._required;
}
ngOnInit() {
this.confirmPassword = this.encoding.decode(this.initPassword ?? '');
this.showInput = !this.isUpdate;
}
valueIn(v) {
return this.encoding.decode(v ?? '');
}
modelOut(v) {
return this.encoding.encode(v);
}
validate() {
let errors = super.validate();
if (coerceAttrBoolean(this.enableConfirm) &&
this.confirmPassword !== this.model) {
errors = assocPath(['confirmPassword', 'notMatch'], true, errors);
}
return errors;
}
validateConfirmPassword(password) {
return (control) => {
if (!password) {
return null;
}
return password === control.value ? null : { notMatch: true };
};
}
updatePasswd() {
this.emitModel('');
this.showInput = true;
}
static { this.ɵfac = /*@__PURE__*/ (() => { let ɵPasswordInputComponent_BaseFactory; return function PasswordInputComponent_Factory(t) { return (ɵPasswordInputComponent_BaseFactory || (ɵPasswordInputComponent_BaseFactory = i0.ɵɵgetInheritedFactory(PasswordInputComponent)))(t || PasswordInputComponent); }; })(); }
static { this.ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: PasswordInputComponent, selectors: [["acl-password-input"]], inputs: { initPassword: "initPassword", label: "label", hint: "hint", specialChars: "specialChars", strongPassword: "strongPassword", enableConfirm: "enableConfirm", width: "width", toggleable: "toggleable", pattern: "pattern", encoding: "encoding", placeholder: "placeholder", readonly: "readonly", isUpdate: "isUpdate", required: "required" }, standalone: true, features: [i0.ɵɵProvidersFeature([
{
provide: NG_VALUE_ACCESSOR,
useExisting: forwardRef(() => PasswordInputComponent),
multi: true,
},
{
provide: NG_VALIDATORS,
useExisting: forwardRef(() => PasswordInputComponent),
multi: true,
},
]), i0.ɵɵInheritDefinitionFeature, i0.ɵɵStandaloneFeature], decls: 10, vars: 8, consts: [["passwordError", ""], ["password", "ngModel"], ["defaultDescription", ""], ["confirm", "ngModel"], [3, "width"], ["auiFormItemLabel", ""], ["class", "tw-flex-1", "auiFormItemControl", "", 3, "required", 4, "ngIf"], ["auiFormItemHint", "", 4, "ngIf"], ["auiFormItemError", ""], [4, "ngIf"], [3, "width", 4, "ngIf"], ["auiFormItemControl", "", 1, "tw-flex-1", 3, "required"], ["aui-input", "", "name", "password", "autocomplete", "new-password", 3, "ngModelChange", "type", "ngModel", "required", "aclStrongPassword", "specialChars", "pattern", "placeholder", "aclErrorsMapperOutlet", "aclErrorsMapper"], ["auiInputSuffix", "", "class", "tw-icon-m tw-cursor-pointer hover:tw-text-primary", 3, "icon", "click", 4, "ngIf"], ["auiInputSuffix", "", 1, "tw-icon-m", "tw-cursor-pointer", "hover:tw-text-primary", 3, "click", "icon"], ["auiFormItemHint", ""], [4, "ngIf", "ngIfElse"], [4, "ngTemplateOutlet"], ["aui-button", "text", 3, "click", 4, "ngIf"], ["aui-button", "text", 3, "click"], ["icon", "pencil"], ["aui-input", "", "name", "confirmPassword", "autocomplete", "new-password", 3, "ngModelChange", "type", "ngModel", "required", "aclValidateFn"], ["auiFormItemError", "", 3, "errors", "errorsMapper"]], template: function PasswordInputComponent_Template(rf, ctx) { if (rf & 1) {
i0.ɵɵelementStart(0, "aui-form-item", 4)(1, "label", 5);
i0.ɵɵtext(2);
i0.ɵɵpipe(3, "translate");
i0.ɵɵelementEnd();
i0.ɵɵtemplate(4, PasswordInputComponent_aui_input_group_4_Template, 6, 20, "aui-input-group", 6)(5, PasswordInputComponent_div_5_Template, 4, 2, "div", 7);
i0.ɵɵelement(6, "div", 8, 0);
i0.ɵɵtemplate(8, PasswordInputComponent_ng_container_8_Template, 4, 1, "ng-container", 9);
i0.ɵɵelementEnd();
i0.ɵɵtemplate(9, PasswordInputComponent_aui_form_item_9_Template, 11, 19, "aui-form-item", 10);
} if (rf & 2) {
i0.ɵɵproperty("width", ctx.width);
i0.ɵɵadvance(2);
i0.ɵɵtextInterpolate(ctx.label || i0.ɵɵpipeBind1(3, 6, "password"));
i0.ɵɵadvance(2);
i0.ɵɵproperty("ngIf", ctx.showInput);
i0.ɵɵadvance();
i0.ɵɵproperty("ngIf", ctx.hint);
i0.ɵɵadvance(3);
i0.ɵɵproperty("ngIf", !ctx.showInput);
i0.ɵɵadvance();
i0.ɵɵproperty("ngIf", ctx.showInput && ctx.enableConfirm);
} }, dependencies: [FormModule, i1.FormItemComponent, i1.FormItemErrorDirective, i1.FormItemHintDirective, i1.FormItemLabelDirective, i1.FormItemControlDirective, NgIf,
InputComponent, i1.InputGroupComponent, i1.InputSuffixDirective, FormsModule, i2.DefaultValueAccessor, i2.NgControlStatus, i2.RequiredValidator, i2.PatternValidator, i2.NgModel, IconComponent, i3.ErrorsMapperComponent, i4.ErrorsMapperDirective, ValidatorsModule, i5.StrongPasswordDirective, i6.FunctionValidatorDirective, TranslatePipe,
PurePipe,
NgTemplateOutlet], encapsulation: 2, changeDetection: 0 }); }
}
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(PasswordInputComponent, [{
type: Component,
args: [{ selector: 'acl-password-input', changeDetection: ChangeDetectionStrategy.OnPush, standalone: true, imports: [
FormModule,
NgIf,
InputComponent,
INPUT_GROUP_MODULE,
FormsModule,
IconComponent,
ERRORS_MAPPER_MODULE,
ValidatorsModule,
TranslatePipe,
PurePipe,
NgTemplateOutlet,
], providers: [
{
provide: NG_VALUE_ACCESSOR,
useExisting: forwardRef(() => PasswordInputComponent),
multi: true,
},
{
provide: NG_VALIDATORS,
useExisting: forwardRef(() => PasswordInputComponent),
multi: true,
},
], template: "<aui-form-item [width]=\"width\">\n <label auiFormItemLabel>{{ label || ('password' | translate) }}</label>\n <aui-input-group\n *ngIf=\"showInput\"\n class=\"tw-flex-1\"\n auiFormItemControl\n [required]=\"required\"\n >\n <input\n aui-input\n [type]=\"showPassword ? 'text' : 'password'\"\n name=\"password\"\n #password=\"ngModel\"\n [ngModel]=\"model\"\n (ngModelChange)=\"emitModel($event)\"\n autocomplete=\"new-password\"\n [required]=\"required\"\n [aclStrongPassword]=\"strongPassword\"\n [specialChars]=\"specialChars\"\n [pattern]=\"strongPassword ? null : pattern\"\n [placeholder]=\"placeholder\"\n [aclErrorsMapperOutlet]=\"passwordError\"\n [aclErrorsMapper]=\"{\n pattern: strongPassword\n ? ('strong_password_pattern_tip'\n | translate\n : {\n chars: specialChars.split('').join(', ')\n })\n : ('invalid_pattern' | translate)\n }\"\n />\n <aui-icon\n *ngIf=\"toggleable\"\n auiInputSuffix\n class=\"tw-icon-m tw-cursor-pointer hover:tw-text-primary\"\n [icon]=\"showPassword ? 'eye_s' : 'eye_slash_s'\"\n (click)=\"showPassword = !showPassword\"\n ></aui-icon>\n </aui-input-group>\n <div\n *ngIf=\"hint\"\n auiFormItemHint\n >\n <ng-container *ngIf=\"isTemplateRef(hint); else defaultDescription\">\n <ng-container *ngTemplateOutlet=\"hint\"></ng-container>\n </ng-container>\n <ng-template #defaultDescription>\n {{ hint }}\n </ng-template>\n </div>\n <div\n #passwordError\n auiFormItemError\n ></div>\n <ng-container *ngIf=\"!showInput\">\n <span>******</span>\n <button\n *ngIf=\"!readonly\"\n aui-button=\"text\"\n (click)=\"updatePasswd()\"\n >\n <aui-icon icon=\"pencil\"></aui-icon>\n </button>\n </ng-container>\n</aui-form-item>\n<aui-form-item\n *ngIf=\"showInput && enableConfirm\"\n [width]=\"width\"\n>\n <label auiFormItemLabel>{{ 'confirm_password' | translate }}</label>\n <aui-input-group\n class=\"tw-flex-1\"\n auiFormItemControl\n [required]=\"required\"\n >\n <input\n aui-input\n [type]=\"showPassword ? 'text' : 'password'\"\n name=\"confirmPassword\"\n #confirm=\"ngModel\"\n [(ngModel)]=\"confirmPassword\"\n autocomplete=\"new-password\"\n [required]=\"required\"\n [aclValidateFn]=\"model | pure: validateConfirmPassword\"\n />\n <aui-icon\n *ngIf=\"toggleable\"\n auiInputSuffix\n class=\"tw-icon-m tw-cursor-pointer hover:tw-text-primary\"\n [icon]=\"showPassword ? 'eye_s' : 'eye_slash_s'\"\n (click)=\"showPassword = !showPassword\"\n ></aui-icon>\n </aui-input-group>\n <acl-errors-mapper\n auiFormItemError\n [errors]=\"confirm?.errors\"\n [errorsMapper]=\"{\n notMatch: 'confirm_password_not_match' | translate\n }\"\n ></acl-errors-mapper>\n</aui-form-item>\n" }]
}], null, { initPassword: [{
type: Input
}], label: [{
type: Input
}], hint: [{
type: Input
}], specialChars: [{
type: Input
}], strongPassword: [{
type: Input
}], enableConfirm: [{
type: Input
}], width: [{
type: Input
}], toggleable: [{
type: Input
}], pattern: [{
type: Input
}], encoding: [{
type: Input
}], placeholder: [{
type: Input
}], readonly: [{
type: Input
}], isUpdate: [{
type: Input
}], required: [{
type: Input
}] }); })();
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(PasswordInputComponent, { className: "PasswordInputComponent" }); })();
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9jb21tb24vc3JjL3dpZGdldC9wYXNzd29yZC1pbnB1dC9jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9saWJzL2NvbW1vbi9zcmMvd2lkZ2V0L3Bhc3N3b3JkLWlucHV0L3RlbXBsYXRlLmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLGlCQUFpQixFQUNqQixhQUFhLEVBQ2IsVUFBVSxFQUNWLGFBQWEsRUFDYixrQkFBa0IsRUFDbEIsY0FBYyxFQUNkLGFBQWEsR0FDZCxNQUFNLFlBQVksQ0FBQztBQUNwQixPQUFPLEVBQUUsSUFBSSxFQUFFLGdCQUFnQixFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDekQsT0FBTyxFQUNMLHVCQUF1QixFQUN2QixTQUFTLEVBQ1QsS0FBSyxFQUVMLFVBQVUsR0FFWCxNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBRUwsV0FBVyxFQUNYLGFBQWEsRUFDYixpQkFBaUIsR0FFbEIsTUFBTSxnQkFBZ0IsQ0FBQztBQUN4QixPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUN0QyxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sT0FBTyxDQUFDO0FBRWxDLE9BQU8sRUFBRSx5QkFBeUIsRUFBRSxRQUFRLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUM1RSxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxxQ0FBcUMsQ0FBQztBQUMzRSxPQUFPLEVBQ0wsNkJBQTZCLEVBQzdCLGdCQUFnQixHQUNqQixNQUFNLGtDQUFrQyxDQUFDO0FBQzFDLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQzs7Ozs7Ozs7Ozs7OztJQ0Z2RCxvQ0FNQztJQURDLDJQQUFzQztJQUN2QyxpQkFBVzs7O0lBRlYsb0VBQStDOzs7O0lBNUJqRCxBQU5G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RFgsS0FBSztZQUlOLGNBQWM7a0JBRGIsS0FBSztZQUlOLGFBQWE7a0JBRFosS0FBSztZQUlOLEtBQUs7a0JBREosS0FBSztZQUlOLFVBQVU7a0JBRFQsS0FBSztZQUlOLE9BQU87a0JBRE4sS0FBSztZQUlOLFFBQVE7a0JBRFAsS0FBSztZQU9OLFdBQVc7a0JBRFYsS0FBSztZQUlOLFFBQVE7a0JBRFAsS0FBSztZQUlOLFFBQVE7a0JBRFAsS0FBSztZQUlGLFFBQVE7a0JBRFgsS0FBSzs7a0ZBOUNLLHNCQUFzQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIGNvZXJjZUF0dHJCb29sZWFuLFxuICBGb3JtSXRlbVdpZHRoLFxuICBGb3JtTW9kdWxlLFxuICBJY29uQ29tcG9uZW50LFxuICBJTlBVVF9HUk9VUF9NT0RVTEUsXG4gIElucHV0Q29tcG9uZW50LFxuICBpc1RlbXBsYXRlUmVmLFxufSBmcm9tICdAYWxhdWRhL3VpJztcbmltcG9ydCB7IE5nSWYsIE5nVGVtcGxhdGVPdXRsZXQgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHtcbiAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG4gIENvbXBvbmVudCxcbiAgSW5wdXQsXG4gIE9uSW5pdCxcbiAgZm9yd2FyZFJlZixcbiAgVGVtcGxhdGVSZWYsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtcbiAgQWJzdHJhY3RDb250cm9sLFxuICBGb3Jtc01vZHVsZSxcbiAgTkdfVkFMSURBVE9SUyxcbiAgTkdfVkFMVUVfQUNDRVNTT1IsXG4gIFZhbGlkYXRpb25FcnJvcnMsXG59IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IGRlY29kZSwgZW5jb2RlIH0gZnJvbSAnYWI2NCc7XG5pbXBvcnQgeyBhc3NvY1BhdGggfSBmcm9tICdyYW1kYSc7XG5cbmltcG9ydCB7IEJhc2VOZXN0ZWRGb3JtQ29udHJvbFB1cmUsIFB1cmVQaXBlIH0gZnJvbSAnLi4vLi4vY29yZS9wdWJsaWMtYXBpJztcbmltcG9ydCB7IEVSUk9SU19NQVBQRVJfTU9EVUxFIH0gZnJvbSAnLi4vLi4vZm9ybS9lcnJvcnMtbWFwcGVyL3B1YmxpYy1hcGknO1xuaW1wb3J0IHtcbiAgU1RST05HX1BBU1NXT1JEX1NQRUNJQUxfQ0hBUlMsXG4gIFZhbGlkYXRvcnNNb2R1bGUsXG59IGZyb20gJy4uLy4uL2Zvcm0vdmFsaWRhdG9ycy9wdWJsaWMtYXBpJztcbmltcG9ydCB7IFRyYW5zbGF0ZVBpcGUgfSBmcm9tICcuLi8uLi90cmFuc2xhdGUvcHVibGljLWFwaSc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgRW5jb2Rpbmcge1xuICBkZWNvZGU6ICh2OiBzdHJpbmcpID0+IHN0cmluZztcbiAgZW5jb2RlOiAodjogc3RyaW5nKSA9PiBzdHJpbmc7XG59XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2FjbC1wYXNzd29yZC1pbnB1dCcsXG4gIHRlbXBsYXRlVXJsOiAndGVtcGxhdGUuaHRtbCcsXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBpbXBvcnRzOiBbXG4gICAgRm9ybU1vZHVsZSxcbiAgICBOZ0lmLFxuICAgIElucHV0Q29tcG9uZW50LFxuICAgIElOUFVUX0dST1VQX01PRFVMRSxcbiAgICBGb3Jtc01vZHVsZSxcbiAgICBJY29uQ29tcG9uZW50LFxuICAgIEVSUk9SU19NQVBQRVJfTU9EVUxFLFxuICAgIFZhbGlkYXRvcnNNb2R1bGUsXG4gICAgVHJhbnNsYXRlUGlwZSxcbiAgICBQdXJlUGlwZSxcbiAgICBOZ1RlbXBsYXRlT3V0bGV0LFxuICBdLFxuICBwcm92aWRlcnM6IFtcbiAgICB7XG4gICAgICBwcm92aWRlOiBOR19WQUxVRV9BQ0NFU1NPUixcbiAgICAgIHVzZUV4aXN0aW5nOiBmb3J3YXJkUmVmKCgpID0+IFBhc3N3b3JkSW5wdXRDb21wb25lbnQpLFxuICAgICAgbXVsdGk6IHRydWUsXG4gICAgfSxcbiAgICB7XG4gICAgICBwcm92aWRlOiBOR19WQUxJREFUT1JTLFxuICAgICAgdXNlRXhpc3Rpbmc6IGZvcndhcmRSZWYoKCkgPT4gUGFzc3dvcmRJbnB1dENvbXBvbmVudCksXG4gICAgICBtdWx0aTogdHJ1ZSxcbiAgICB9LFxuICBdLFxufSlcbmV4cG9ydCBjbGFzcyBQYXNzd29yZElucHV0Q29tcG9uZW50XG4gIGV4dGVuZHMgQmFzZU5lc3RlZEZvcm1Db250cm9sUHVyZTxzdHJpbmc+XG4gIGltcGxlbWVudHMgT25Jbml0XG57XG4gIEBJbnB1dCgpXG4gIGluaXRQYXNzd29yZDogc3RyaW5nO1xuXG4gIEBJbnB1dCgpXG4gIGxhYmVsOiBzdHJpbmc7XG5cbiAgQElucHV0KClcbiAgaGludDogc3RyaW5nIHwgVGVtcGxhdGVSZWY8YW55PjtcblxuICBASW5wdXQoKVxuICBzcGVjaWFsQ2hhcnMgPSBTVFJPTkdfUEFTU1dPUkRfU1BFQ0lBTF9DSEFSUztcblxuICBASW5wdXQoKVxuICBzdHJvbmdQYXNzd29yZDogYm9vbGVhbiB8ICcnID0gdHJ1ZTtcblxuICBASW5wdXQoKVxuICBlbmFibGVDb25maXJtOiBib29sZWFuIHwgJycgPSB0cnVlO1xuXG4gIEBJbnB1dCgpXG4gIHdpZHRoOiBGb3JtSXRlbVdpZHRoID0gJ21lZGl1bSc7XG5cbiAgQElucHV0KClcbiAgdG9nZ2xlYWJsZSA9IHRydWU7XG5cbiAgQElucHV0KClcbiAgcGF0dGVybjogc3RyaW5nO1xuXG4gIEBJbnB1dCgpXG4gIGVuY29kaW5nOiBFbmNvZGluZyA9IHtcbiAgICBlbmNvZGUsXG4gICAgZGVjb2RlLFxuICB9O1xuXG4gIEBJbnB1dCgpXG4gIHBsYWNlaG9sZGVyID0gJyc7XG5cbiAgQElucHV0KClcbiAgcmVhZG9ubHk6IGJvb2xlYW47XG5cbiAgQElucHV0KClcbiAgaXNVcGRhdGU6IGJvb2xlYW47XG5cbiAgQElucHV0KClcbiAgc2V0IHJlcXVpcmVkKHJlcXVpcmVkOiBib29sZWFuIHwgJycpIHtcbiAgICB0aGlzLl9yZXF1aXJlZCA9IGNvZXJjZUF0dHJCb29sZWFuKHJlcXVpcmVkKTtcbiAgfVxuXG4gIGdldCByZXF1aXJlZCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5fcmVxdWlyZWQ7XG4gIH1cblxuICBzaG93UGFzc3dvcmQgPSBmYWxzZTtcbiAgc2hvd0lucHV0ID0gdHJ1ZTtcbiAgY29uZmlybVBhc3N3b3JkID0gJyc7XG4gIGlzVGVtcGxhdGVSZWYgPSBpc1RlbXBsYXRlUmVmO1xuXG4gIHByaXZhdGUgX3JlcXVpcmVkID0gdHJ1ZTtcblxuICBuZ09uSW5pdCgpIHtcbiAgICB0aGlzLmNvbmZpcm1QYXNzd29yZCA9IHRoaXMuZW5jb2RpbmcuZGVjb2RlKHRoaXMuaW5pdFBhc3N3b3JkID8/ICcnKTtcbiAgICB0aGlzLnNob3dJbnB1dCA9ICF0aGlzLmlzVXBkYXRlO1xuICB9XG5cbiAgb3ZlcnJpZGUgdmFsdWVJbih2OiBzdHJpbmcpIHtcbiAgICByZXR1cm4gdGhpcy5lbmNvZGluZy5kZWNvZGUodiA/PyAnJyk7XG4gIH1cblxuICBvdmVycmlkZSBtb2RlbE91dCh2OiBzdHJpbmcpIHtcbiAgICByZXR1cm4gdGhpcy5lbmNvZGluZy5lbmNvZGUodik7XG4gIH1cblxuICBvdmVycmlkZSB2YWxpZGF0ZSgpOiBWYWxpZGF0aW9uRXJyb3JzIHtcbiAgICBsZXQgZXJyb3JzID0gc3VwZXIudmFsaWRhdGUoKTtcbiAgICBpZiAoXG4gICAgICBjb2VyY2VBdHRyQm9vbGVhbih0aGlzLmVuYWJsZUNvbmZpcm0pICYmXG4gICAgICB0aGlzLmNvbmZpcm1QYXNzd29yZCAhPT0gdGhpcy5tb2RlbFxuICAgICkge1xuICAgICAgZXJyb3JzID0gYXNzb2NQYXRoKFsnY29uZmlybVBhc3N3b3JkJywgJ25vdE1hdGNoJ10sIHRydWUsIGVycm9ycyk7XG4gICAgfVxuICAgIHJldHVybiBlcnJvcnM7XG4gIH1cblxuICB2YWxpZGF0ZUNvbmZpcm1QYXNzd29yZChwYXNzd29yZDogc3RyaW5nKSB7XG4gICAgcmV0dXJuIChjb250cm9sOiBBYnN0cmFjdENvbnRyb2wpOiBWYWxpZGF0aW9uRXJyb3JzID0+IHtcbiAgICAgIGlmICghcGFzc3dvcmQpIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBwYXNzd29yZCA9PT0gY29udHJvbC52YWx1ZSA/IG51bGwgOiB7IG5vdE1hdGNoOiB0cnVlIH07XG4gICAgfTtcbiAgfVxuXG4gIHVwZGF0ZVBhc3N3ZCgpIHtcbiAgICB0aGlzLmVtaXRNb2RlbCgnJyk7XG4gICAgdGhpcy5zaG93SW5wdXQgPSB0cnVlO1xuICB9XG59XG4iLCI8YXVpLWZvcm0taXRlbSBbd2lkdGhdPVwid2lkdGhcIj5cbiAgPGxhYmVsIGF1aUZvcm1JdGVtTGFiZWw+e3sgbGFiZWwgfHwgKCdwYXNzd29yZCcgfCB0cmFuc2xhdGUpIH19PC9sYWJlbD5cbiAgPGF1aS1pbnB1dC1ncm91cFxuICAgICpuZ0lmPVwic2hvd0lucHV0XCJcbiAgICBjbGFzcz1cInR3LWZsZXgtMVwiXG4gICAgYXVpRm9ybUl0ZW1Db250cm9sXG4gICAgW3JlcXVpcmVkXT1cInJlcXVpcmVkXCJcbiAgPlxuICAgIDxpbnB1dFxuICAgICAgYXVpLWlucHV0XG4gICAgICBbdHlwZV09XCJzaG93UGFzc3dvcmQgPyAndGV4dCcgOiAncGFzc3dvcmQnXCJcbiAgICAgIG5hbWU9XCJwYXNzd29yZFwiXG4gICAgICAjcGFzc3dvcmQ9XCJuZ01vZGVsXCJcbiAgICAgIFtuZ01vZGVsXT1cIm1vZGVsXCJcbiAgICAgIChuZ01vZGVsQ2hhbmdlKT1cImVtaXRNb2RlbCgkZXZlbnQpXCJcbiAgICAgIGF1dG9jb21wbGV0ZT1cIm5ldy1wYXNzd29yZFwiXG4gICAgICBbcmVxdWlyZWRdPVwicmVxdWlyZWRcIlxuICAgICAgW2FjbFN0cm9uZ1Bhc3N3b3JkXT1cInN0cm9uZ1Bhc3N3b3JkXCJcbiAgICAgIFtzcGVjaWFsQ2hhcnNdPVwic3BlY2lhbENoYXJzXCJcbiAgICAgIFtwYXR0ZXJuXT1cInN0cm9uZ1Bhc3N3b3JkID8gbnVsbCA6IHBhdHRlcm5cIlxuICAgICAgW3BsYWNlaG9sZGVyXT1cInBsYWNlaG9sZGVyXCJcbiAgICAgIFthY2xFcnJvcnNNYXBwZXJPdXRsZXRdPVwicGFzc3dvcmRFcnJvclwiXG4gICAgICBbYWNsRXJyb3JzTWFwcGVyXT1cIntcbiAgICAgICAgcGF0dGVybjogc3Ryb25nUGFzc3dvcmRcbiAgICAgICAgICA/ICgnc3Ryb25nX3Bhc3N3b3JkX3BhdHRlcm5fdGlwJ1xuICAgICAgICAgICAgfCB0cmFuc2xhdGVcbiAgICAgICAgICAgICAgOiB7XG4gICAgICAgICAgICAgICAgICBjaGFyczogc3BlY2lhbENoYXJzLnNwbGl0KCcnKS5qb2luKCcsICcpXG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICA6ICgnaW52YWxpZF9wYXR0ZXJuJyB8IHRyYW5zbGF0ZSlcbiAgICAgIH1cIlxuICAgIC8+XG4gICAgPGF1aS1pY29uXG4gICAgICAqbmdJZj1cInRvZ2dsZWFibGVcIlxuICAgICAgYXVpSW5wdXRTdWZmaXhcbiAgICAgIGNsYXNzPVwidHctaWNvbi1tIHR3LWN1cnNvci1wb2ludGVyIGhvdmVyOnR3LXRleHQtcHJpbWFyeVwiXG4gICAgICBbaWNvbl09XCJzaG93UGFzc3dvcmQgPyAnZXllX3MnIDogJ2V5ZV9zbGFzaF9zJ1wiXG4gICAgICAoY2xpY2spPVwic2hvd1Bhc3N3b3JkID0gIXNob3dQYXNzd29yZFwiXG4gICAgPjwvYXVpLWljb24+XG4gIDwvYXVpLWlucHV0LWdyb3VwPlxuICA8ZGl2XG4gICAgKm5nSWY9XCJoaW50XCJcbiAgICBhdWlGb3JtSXRlbUhpbnRcbiAgPlxuICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJpc1RlbXBsYXRlUmVmKGhpbnQpOyBlbHNlIGRlZmF1bHREZXNjcmlwdGlvblwiPlxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImhpbnRcIj48L25nLWNvbnRhaW5lcj5cbiAgICA8L25nLWNvbnRhaW5lcj5cbiAgICA8bmctdGVtcGxhdGUgI2RlZmF1bHREZXNjcmlwdGlvbj5cbiAgICAgIHt7IGhpbnQgfX1cbiAgICA8L25nLXRlbXBsYXRlPlxuICA8L2Rpdj5cbiAgPGRpdlxuICAgICNwYXNzd29yZEVycm9yXG4gICAgYXVpRm9ybUl0ZW1FcnJvclxuICA+PC9kaXY+XG4gIDxuZy1jb250YWluZXIgKm5nSWY9XCIhc2hvd0lucHV0XCI+XG4gICAgPHNwYW4+KioqKioqPC9zcGFuPlxuICAgIDxidXR0b25cbiAgICAgICpuZ0lmPVwiIXJlYWRvbmx5XCJcbiAgICAgIGF1aS1idXR0b249XCJ0ZXh0XCJcbiAgICAgIChjbGljayk9XCJ1cGRhdGVQYXNzd2QoKVwiXG4gICAgPlxuICAgICAgPGF1aS1pY29uIGljb249XCJwZW5jaWxcIj48L2F1aS1pY29uPlxuICAgIDwvYnV0dG9uPlxuICA8L25nLWNvbnRhaW5lcj5cbjwvYXVpLWZvcm0taXRlbT5cbjxhdWktZm9ybS1pdGVtXG4gICpuZ0lmPVwic2hvd0lucHV0ICYmIGVuYWJsZUNvbmZpcm1cIlxuICBbd2lkdGhdPVwid2lkdGhcIlxuPlxuICA8bGFiZWwgYXVpRm9ybUl0ZW1MYWJlbD57eyAnY29uZmlybV9wYXNzd29yZCcgfCB0cmFuc2xhdGUgfX08L2xhYmVsPlxuICA8YXVpLWlucHV0LWdyb3VwXG4gICAgY2xhc3M9XCJ0dy1mbGV4LTFcIlxuICAgIGF1aUZvcm1JdGVtQ29udHJvbFxuICAgIFtyZXF1aXJlZF09XCJyZXF1aXJlZFwiXG4gID5cbiAgICA8aW5wdXRcbiAgICAgIGF1aS1pbnB1dFxuICAgICAgW3R5cGVdPVwic2hvd1Bhc3N3b3JkID8gJ3RleHQnIDogJ3Bhc3N3b3JkJ1wiXG4gICAgICBuYW1lPVwiY29uZmlybVBhc3N3b3JkXCJcbiAgICAgICNjb25maXJtPVwibmdNb2RlbFwiXG4gICAgICBbKG5nTW9kZWwpXT1cImNvbmZpcm1QYXNzd29yZFwiXG4gICAgICBhdXRvY29tcGxldGU9XCJuZXctcGFzc3dvcmRcIlxuICAgICAgW3JlcXVpcmVkXT1cInJlcXVpcmVkXCJcbiAgICAgIFthY2xWYWxpZGF0ZUZuXT1cIm1vZGVsIHwgcHVyZTogdmFsaWRhdGVDb25maXJtUGFzc3dvcmRcIlxuICAgIC8+XG4gICAgPGF1aS1pY29uXG4gICAgICAqbmdJZj1cInRvZ2dsZWFibGVcIlxuICAgICAgYXVpSW5wdXRTdWZmaXhcbiAgICAgIGNsYXNzPVwidHctaWNvbi1tIHR3LWN1cnNvci1wb2ludGVyIGhvdmVyOnR3LXRleHQtcHJpbWFyeVwiXG4gICAgICBbaWNvbl09XCJzaG93UGFzc3dvcmQgPyAnZXllX3MnIDogJ2V5ZV9zbGFzaF9zJ1wiXG4gICAgICAoY2xpY2spPVwic2hvd1Bhc3N3b3JkID0gIXNob3dQYXNzd29yZFwiXG4gICAgPjwvYXVpLWljb24+XG4gIDwvYXVpLWlucHV0LWdyb3VwPlxuICA8YWNsLWVycm9ycy1tYXBwZXJcbiAgICBhdWlGb3JtSXRlbUVycm9yXG4gICAgW2Vycm9yc109XCJjb25maXJtPy5lcnJvcnNcIlxuICAgIFtlcnJvcnNNYXBwZXJdPVwie1xuICAgICAgbm90TWF0Y2g6ICdjb25maXJtX3Bhc3N3b3JkX25vdF9tYXRjaCcgfCB0cmFuc2xhdGVcbiAgICB9XCJcbiAgPjwvYWNsLWVycm9ycy1tYXBwZXI+XG48L2F1aS1mb3JtLWl0ZW0+XG4iXX0=