@alauda-fe/common
Version:
Alauda frontend team common codes.
195 lines • 26.8 kB
JavaScript
import { coerceAttrBoolean } from '@alauda/ui';
import { ChangeDetectorRef, Directive, inject, Input, QueryList, ViewChildren, } from '@angular/core';
import { FormGroupDirective, NgControl, NgForm, } from '@angular/forms';
import { assocPath, identity, mergeDeepRight, path } from 'ramda';
import { ReplaySubject, startWith, switchMap, Subject, takeUntil, debounceTime, merge, combineLatest, filter, map, tap, take, of, } from 'rxjs';
import * as i0 from "@angular/core";
export function createNestedFormControl({ autoEmitChange = false, asyncValidator = false, } = {}) {
return class NestedFormControl extends BaseNestedFormControl {
constructor() {
super(...arguments);
this.autoEmitChange = autoEmitChange;
this.asyncValidator = asyncValidator;
}
};
}
export class BaseNestedFormControl {
get disabled() {
return this._disabled;
}
set disabled(val) {
this._disabled = coerceAttrBoolean(val);
}
constructor() {
this._disabled = false;
this.model = null;
this.submitted = false;
this.autoEmitChange = false;
this.asyncValidator = false;
this.cdr = inject(ChangeDetectorRef);
this.destroy$$ = new Subject();
this.hostForm = inject(NgForm, { optional: true }) ??
inject(FormGroupDirective, { optional: true });
if (this.hostForm) {
this.hostForm.ngSubmit.pipe(takeUntil(this.destroy$$)).subscribe(() => {
this.submitted = this.hostForm.submitted;
this.onSubmitted?.();
this.cdr.markForCheck();
});
}
}
ngAfterViewInit() {
this.controls.changes
.pipe(startWith(this.controls), switchMap((controls) => controls.length
? merge(...controls.toArray().map(control => control.statusChanges)).pipe(startWith(null))
: of(null)), debounceTime(0))
.subscribe(() => {
this.onValidatorChange?.();
});
if (this.autoEmitChange) {
this.controls.changes
.pipe(startWith(this.controls), switchMap((controls) => merge(...controls.toArray().map(control => control.valueChanges))))
.pipe(debounceTime(0))
.subscribe(() => {
this.emitModel(this.model);
});
}
}
ngOnDestroy() {
this.destroy$$.next();
this.destroy$$.complete();
}
registerOnValidatorChange(fn) {
this.onValidatorChange = fn;
}
registerOnChange(fn) {
this.onChange = fn;
}
registerOnTouched(fn) {
this.onTouched = fn;
}
setDisabledState(isDisabled) {
this.disabled = isDisabled;
this.cdr.markForCheck();
}
writeValue(value) {
this.model = this.valueIn(value);
this.cdr.markForCheck();
}
validate(_control) {
const getErrors = () => this.controls?.reduce((acc, control) => {
if (control.errors) {
return mergeDeepRight(acc, control.name ? { [control.name]: control.errors } : control.errors);
}
return acc;
}, {});
return this.asyncValidator
? combineLatest((this.controls?.toArray() ?? []).map(control => control.statusChanges.pipe(startWith(control.status)))).pipe(debounceTime(0), filter(statuses => statuses.includes('INVALID') || !statuses.includes('PENDING')), take(1), map(() => getErrors()), tap(() => {
this.cdr.markForCheck();
}))
: getErrors();
}
emitModel(model = this.model) {
this.model = model;
this.emitValue(this.modelOut(this.model));
}
emitValue(value) {
if (this.onChange) {
this.onChange(value);
}
}
valueIn(value) {
return value;
}
modelOut(model) {
return model;
}
static { this.ɵfac = function BaseNestedFormControl_Factory(t) { return new (t || BaseNestedFormControl)(); }; }
static { this.ɵdir = /*@__PURE__*/ i0.ɵɵdefineDirective({ type: BaseNestedFormControl, viewQuery: function BaseNestedFormControl_Query(rf, ctx) { if (rf & 1) {
i0.ɵɵviewQuery(NgControl, 5);
} if (rf & 2) {
let _t;
i0.ɵɵqueryRefresh(_t = i0.ɵɵloadQuery()) && (ctx.controls = _t);
} }, inputs: { disabled: "disabled" } }); }
}
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(BaseNestedFormControl, [{
type: Directive
}], () => [], { controls: [{
type: ViewChildren,
args: [NgControl]
}], disabled: [{
type: Input
}] }); })();
/**
* @deprecated use {@link BaseNestedFormControl} instead.
*/
export class BaseNestedFormControlPure extends BaseNestedFormControl {
constructor() {
super();
this.model$ = new ReplaySubject(1);
this.model$.subscribe(model => {
this.model = model;
this.cdr.markForCheck();
});
}
writeValue(value) {
this.model$.next(this.valueIn(value));
}
emitValue(value) {
if (this.onChange) {
this.onChange(value);
this.writeValue(value);
}
}
static { this.ɵfac = function BaseNestedFormControlPure_Factory(t) { return new (t || BaseNestedFormControlPure)(); }; }
static { this.ɵdir = /*@__PURE__*/ i0.ɵɵdefineDirective({ type: BaseNestedFormControlPure, features: [i0.ɵɵInheritDefinitionFeature] }); }
}
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(BaseNestedFormControlPure, [{
type: Directive
}], () => [], null); })();
function collectPaths(mapper, parent) {
return Object.entries(mapper).reduce((acc, [key, value]) => {
const path = typeof value === 'string' ? value.split('.') : value;
if (Array.isArray(path)) {
acc.push([parent.concat(key), path]);
return acc;
}
return acc.concat(collectPaths(path, parent.concat(key)));
}, []);
}
export function dataTransfer(mapper) {
const tuples = collectPaths(mapper, []);
let _source;
let _target = {};
return [
source => {
_source = source;
return tuples.reduce((acc, [left, right]) => {
const newValue = path(right, source);
if (path(left, acc) === newValue) {
return acc;
}
return (_target = assocPath(left, newValue, acc));
}, _target);
},
target => {
_target = target;
return tuples.reduce((acc, [left, right]) => {
const newValue = path(left, target);
if (path(right, acc) === newValue) {
return acc;
}
return (_source = assocPath(right, newValue, acc));
}, _source);
},
];
}
function parsePath(path) {
return typeof path === 'string' ? path.split('.') : path;
}
export function copyValue(from, to, mapper = identity) {
const fromPath = parsePath(from);
const toPath = parsePath(to);
return (object) => assocPath(toPath, mapper(path(fromPath, object)), object);
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFzZS1uZXN0ZWQtZm9ybS1jb250cm9sLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9jb21tb24vc3JjL2NvcmUvYWJzdHJhY3QvYmFzZS1uZXN0ZWQtZm9ybS1jb250cm9sLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLFlBQVksQ0FBQztBQUMvQyxPQUFPLEVBRUwsaUJBQWlCLEVBQ2pCLFNBQVMsRUFDVCxNQUFNLEVBQ04sS0FBSyxFQUVMLFNBQVMsRUFDVCxZQUFZLEdBQ2IsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUdMLGtCQUFrQixFQUNsQixTQUFTLEVBQ1QsTUFBTSxHQUVQLE1BQU0sZ0JBQWdCLENBQUM7QUFDeEIsT0FBTyxFQUFFLFNBQVMsRUFBRSxRQUFRLEVBQUUsY0FBYyxFQUFFLElBQUksRUFBRSxNQUFNLE9BQU8sQ0FBQztBQUNsRSxPQUFPLEVBQ0wsYUFBYSxFQUNiLFNBQVMsRUFDVCxTQUFTLEVBQ1QsT0FBTyxFQUNQLFNBQVMsRUFDVCxZQUFZLEVBQ1osS0FBSyxFQUVMLGFBQWEsRUFDYixNQUFNLEVBQ04sR0FBRyxFQUNILEdBQUcsRUFDSCxJQUFJLEVBQ0osRUFBRSxHQUNILE1BQU0sTUFBTSxDQUFDOztBQUVkLE1BQU0sVUFBVSx1QkFBdUIsQ0FBVyxFQUNoRCxjQUFjLEdBQUcsS0FBSyxFQUN0QixjQUFjLEdBQUcsS0FBSyxNQUlwQixFQUFFO0lBRUosT0FBTyxNQUFNLGlCQUFrQixTQUFRLHFCQUEyQjtRQUEzRDs7WUFDYyxtQkFBYyxHQUFHLGNBQWMsQ0FBQztZQUNoQyxtQkFBYyxHQUFHLGNBQWMsQ0FBQztRQUNyRCxDQUFDO0tBQUEsQ0FBQztBQUNKLENBQUM7QUFHRCxNQUFNLE9BQU8scUJBQXFCO0lBTWhDLElBQ0ksUUFBUTtRQUNWLE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQztJQUN4QixDQUFDO0lB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QUcsRUFBRSxDQUFDLElBQUksRUFBRSxLQUFLLENBQUMsRUFBRSxFQUFFO2dCQUMxQyxNQUFNLFFBQVEsR0FBRyxJQUFJLENBQVUsSUFBSSxFQUFFLE1BQU0sQ0FBQyxDQUFDO2dCQUU3QyxJQUFJLElBQUksQ0FBQyxLQUFLLEVBQUUsR0FBRyxDQUFDLEtBQUssUUFBUSxFQUFFLENBQUM7b0JBQ2xDLE9BQU8sR0FBRyxDQUFDO2dCQUNiLENBQUM7Z0JBRUQsT0FBTyxDQUFDLE9BQU8sR0FBRyxTQUFTLENBQWEsS0FBSyxFQUFFLFFBQVEsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDO1lBQ2pFLENBQUMsRUFBRSxPQUFPLENBQUMsQ0FBQztRQUNkLENBQUM7S0FDRixDQUFDO0FBQ0osQ0FBQztBQUVELFNBQVMsU0FBUyxDQUFDLElBQVU7SUFDM0IsT0FBTyxPQUFPLElBQUksS0FBSyxRQUFRLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztBQUMzRCxDQUFDO0FBRUQsTUFBTSxVQUFVLFNBQVMsQ0FDdkIsSUFBVSxFQUNWLEVBQVEsRUFDUixTQUEwQixRQUFRO0lBRWxDLE1BQU0sUUFBUSxHQUFHLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUNqQyxNQUFNLE1BQU0sR0FBRyxTQUFTLENBQUMsRUFBRSxDQUFDLENBQUM7SUFDN0IsT0FBTyxDQUFDLE1BQVMsRUFBRSxFQUFFLENBQ25CLFNBQVMsQ0FBQyxNQUFNLEVBQUUsTUFBTSxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsTUFBTSxDQUFDLENBQUMsRUFBRSxNQUFNLENBQUMsQ0FBQztBQUM5RCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgY29lcmNlQXR0ckJvb2xlYW4gfSBmcm9tICdAYWxhdWRhL3VpJztcbmltcG9ydCB7XG4gIEFmdGVyVmlld0luaXQsXG4gIENoYW5nZURldGVjdG9yUmVmLFxuICBEaXJlY3RpdmUsXG4gIGluamVjdCxcbiAgSW5wdXQsXG4gIE9uRGVzdHJveSxcbiAgUXVlcnlMaXN0LFxuICBWaWV3Q2hpbGRyZW4sXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtcbiAgQWJzdHJhY3RDb250cm9sLFxuICBDb250cm9sVmFsdWVBY2Nlc3NvcixcbiAgRm9ybUdyb3VwRGlyZWN0aXZlLFxuICBOZ0NvbnRyb2wsXG4gIE5nRm9ybSxcbiAgVmFsaWRhdGlvbkVycm9ycyxcbn0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgYXNzb2NQYXRoLCBpZGVudGl0eSwgbWVyZ2VEZWVwUmlnaHQsIHBhdGggfSBmcm9tICdyYW1kYSc7XG5pbXBvcnQge1xuICBSZXBsYXlTdWJqZWN0LFxuICBzdGFydFdpdGgsXG4gIHN3aXRjaE1hcCxcbiAgU3ViamVjdCxcbiAgdGFrZVVudGlsLFxuICBkZWJvdW5jZVRpbWUsXG4gIG1lcmdlLFxuICBPYnNlcnZhYmxlLFxuICBjb21iaW5lTGF0ZXN0LFxuICBmaWx0ZXIsXG4gIG1hcCxcbiAgdGFwLFxuICB0YWtlLFxuICBvZixcbn0gZnJvbSAncnhqcyc7XG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVOZXN0ZWRGb3JtQ29udHJvbDxWLCBNID0gVj4oe1xuICBhdXRvRW1pdENoYW5nZSA9IGZhbHNlLFxuICBhc3luY1ZhbGlkYXRvciA9IGZhbHNlLFxufToge1xuICBhdXRvRW1pdENoYW5nZT86IGJvb2xlYW47XG4gIGFzeW5jVmFsaWRhdG9yPzogYm9vbGVhbjtcbn0gPSB7fSk6IC8vIHdvcmthcm91bmQ6IGh0dHBzOi8vZ2l0aHViLmNvbS9taWNyb3NvZnQvVHlwZVNjcmlwdC9pc3N1ZXMvMzAzNTVcbm5ldyAoKSA9PiBCYXNlTmVzdGVkRm9ybUNvbnRyb2w8ViwgTT4ge1xuICByZXR1cm4gY2xhc3MgTmVzdGVkRm9ybUNvbnRyb2wgZXh0ZW5kcyBCYXNlTmVzdGVkRm9ybUNvbnRyb2w8ViwgTT4ge1xuICAgIHByb3RlY3RlZCBvdmVycmlkZSBhdXRvRW1pdENoYW5nZSA9IGF1dG9FbWl0Q2hhbmdlO1xuICAgIHByb3RlY3RlZCBvdmVycmlkZSBhc3luY1ZhbGlkYXRvciA9IGFzeW5jVmFsaWRhdG9yO1xuICB9O1xufVxuXG5ARGlyZWN0aXZlKClcbmV4cG9ydCBjbGFzcyBCYXNlTmVzdGVkRm9ybUNvbnRyb2w8ViwgTSA9IFY+XG4gIGltcGxlbWVudHMgQWZ0ZXJWaWV3SW5pdCwgT25EZXN0cm95LCBDb250cm9sVmFsdWVBY2Nlc3Nvclxue1xuICBAVmlld0NoaWxkcmVuKE5nQ29udHJvbClcbiAgcHJvdGVjdGVkIGNvbnRyb2xzOiBRdWVyeUxpc3Q8TmdDb250cm9sPjtcblxuICBASW5wdXQoKVxuICBnZXQgZGlzYWJsZWQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2Rpc2FibGVkO1xuICB9XG5cbiAgc2V0IGRpc2FibGVkKHZhbDogYm9vbGVhbiB8ICcnKSB7XG4gICAgdGhpcy5fZGlzYWJsZWQgPSBjb2VyY2VBdHRyQm9vbGVhbih2YWwpO1xuICB9XG5cbiAgcHJpdmF0ZSBfZGlzYWJsZWQgPSBmYWxzZTtcblxuICBvblZhbGlkYXRvckNoYW5nZTogKCkgPT4gdm9pZDtcbiAgb25DaGFuZ2U6IChfOiBWKSA9PiB2b2lkO1xuICBvblRvdWNoZWQ6ICgpID0+IHZvaWQ7XG4gIG9uU3VibWl0dGVkOiAoKSA9PiB2b2lkO1xuXG4gIG1vZGVsOiBNID0gbnVsbDtcbiAgc3VibWl0dGVkID0gZmFsc2U7XG5cbiAgcHJvdGVjdGVkIGF1dG9FbWl0Q2hhbmdlID0gZmFsc2U7XG4gIHByb3RlY3RlZCBhc3luY1ZhbGlkYXRvciA9IGZhbHNlO1xuICBwcm90ZWN0ZWQgY2RyID0gaW5qZWN0KENoYW5nZURldGVjdG9yUmVmKTtcbiAgcHJvdGVjdGVkIGRlc3Ryb3kkJCA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XG4gIHByb3RlY3RlZCBob3N0Rm9ybSA9XG4gICAgaW5qZWN0KE5nRm9ybSwgeyBvcHRpb25hbDogdHJ1ZSB9KSA/P1xuICAgIGluamVjdChGb3JtR3JvdXBEaXJlY3RpdmUsIHsgb3B0aW9uYWw6IHRydWUgfSk7XG5cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgaWYgKHRoaXMuaG9zdEZvcm0pIHtcbiAgICAgIHRoaXMuaG9zdEZvcm0ubmdTdWJtaXQucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95JCQpKS5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICB0aGlzLnN1Ym1pdHRlZCA9IHRoaXMuaG9zdEZvcm0uc3VibWl0dGVkO1xuICAgICAgICB0aGlzLm9uU3VibWl0dGVkPy4oKTtcbiAgICAgICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBuZ0FmdGVyVmlld0luaXQoKSB7XG4gICAgdGhpcy5jb250cm9scy5jaGFuZ2VzXG4gICAgICAucGlwZShcbiAgICAgICAgc3RhcnRXaXRoKHRoaXMuY29udHJvbHMpLFxuICAgICAgICBzd2l0Y2hNYXAoKGNvbnRyb2xzOiBRdWVyeUxpc3Q8TmdDb250cm9sPikgPT5cbiAgICAgICAgICBjb250cm9scy5sZW5ndGhcbiAgICAgICAgICAgID8gbWVyZ2UoXG4gICAgICAgICAgICAgICAgLi4uY29udHJvbHMudG9BcnJheSgpLm1hcChjb250cm9sID0+IGNvbnRyb2wuc3RhdHVzQ2hhbmdlcyksXG4gICAgICAgICAgICAgICkucGlwZShzdGFydFdpdGgobnVsbCkpXG4gICAgICAgICAgICA6IG9mKG51bGwpLFxuICAgICAgICApLFxuICAgICAgICBkZWJvdW5jZVRpbWUoMCksXG4gICAgICApXG4gICAgICAuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgdGhpcy5vblZhbGlkYXRvckNoYW5nZT8uKCk7XG4gICAgICB9KTtcblxuICAgIGlmICh0aGlzLmF1dG9FbWl0Q2hhbmdlKSB7XG4gICAgICB0aGlzLmNvbnRyb2xzLmNoYW5nZXNcbiAgICAgICAgLnBpcGUoXG4gICAgICAgICAgc3RhcnRXaXRoKHRoaXMuY29udHJvbHMpLFxuICAgICAgICAgIHN3aXRjaE1hcCgoY29udHJvbHM6IFF1ZXJ5TGlzdDxOZ0NvbnRyb2w+KSA9PlxuICAgICAgICAgICAgbWVyZ2UoLi4uY29udHJvbHMudG9BcnJheSgpLm1hcChjb250cm9sID0+IGNvbnRyb2wudmFsdWVDaGFuZ2VzKSksXG4gICAgICAgICAgKSxcbiAgICAgICAgKVxuICAgICAgICAucGlwZShkZWJvdW5jZVRpbWUoMCkpXG4gICAgICAgIC5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICAgIHRoaXMuZW1pdE1vZGVsKHRoaXMubW9kZWwpO1xuICAgICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBuZ09uRGVzdHJveSgpIHtcbiAgICB0aGlzLmRlc3Ryb3kkJC5uZXh0KCk7XG4gICAgdGhpcy5kZXN0cm95JCQuY29tcGxldGUoKTtcbiAgfVxuXG4gIHJlZ2lzdGVyT25WYWxpZGF0b3JDaGFuZ2UoZm46ICgpID0+IHZvaWQpIHtcbiAgICB0aGlzLm9uVmFsaWRhdG9yQ2hhbmdlID0gZm47XG4gIH1cblxuICByZWdpc3Rlck9uQ2hhbmdlKGZuOiAoXzogVikgPT4gdm9pZCkge1xuICAgIHRoaXMub25DaGFuZ2UgPSBmbjtcbiAgfVxuXG4gIHJlZ2lzdGVyT25Ub3VjaGVkKGZuOiAoKSA9PiB2b2lkKSB7XG4gICAgdGhpcy5vblRvdWNoZWQgPSBmbjtcbiAgfVxuXG4gIHNldERpc2FibGVkU3RhdGUoaXNEaXNhYmxlZDogYm9vbGVhbikge1xuICAgIHRoaXMuZGlzYWJsZWQgPSBpc0Rpc2FibGVkO1xuICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICB9XG5cbiAgd3JpdGVWYWx1ZSh2YWx1ZTogVikge1xuICAgIHRoaXMubW9kZWwgPSB0aGlzLnZhbHVlSW4odmFsdWUpO1xuICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICB9XG5cbiAgdmFsaWRhdGUoXG4gICAgX2NvbnRyb2w/OiBBYnN0cmFjdENvbnRyb2wsXG4gICk6IFZhbGlkYXRpb25FcnJvcnMgfCBudWxsIHwgT2JzZXJ2YWJsZTxWYWxpZGF0aW9uRXJyb3JzIHwgbnVsbD4ge1xuICAgIGNvbnN0IGdldEVycm9ycyA9ICgpID0+XG4gICAgICB0aGlzLmNvbnRyb2xzPy5yZWR1Y2UoKGFjYywgY29udHJvbCkgPT4ge1xuICAgICAgICBpZiAoY29udHJvbC5lcnJvcnMpIHtcbiAgICAgICAgICByZXR1cm4gbWVyZ2VEZWVwUmlnaHQoXG4gICAgICAgICAgICBhY2MsXG4gICAgICAgICAgICBjb250cm9sLm5hbWUgPyB7IFtjb250cm9sLm5hbWVdOiBjb250cm9sLmVycm9ycyB9IDogY29udHJvbC5lcnJvcnMsXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYWNjO1xuICAgICAgfSwge30gYXMgVmFsaWRhdGlvbkVycm9ycyk7XG5cbiAgICByZXR1cm4gdGhpcy5hc3luY1ZhbGlkYXRvclxuICAgICAgPyBjb21iaW5lTGF0ZXN0KFxuICAgICAgICAgICh0aGlzLmNvbnRyb2xzPy50b0FycmF5KCkgPz8gW10pLm1hcChjb250cm9sID0+XG4gICAgICAgICAgICBjb250cm9sLnN0YXR1c0NoYW5nZXMucGlwZShzdGFydFdpdGgoY29udHJvbC5zdGF0dXMpKSxcbiAgICAgICAgICApLFxuICAgICAgICApLnBpcGUoXG4gICAgICAgICAgZGVib3VuY2VUaW1lKDApLFxuICAgICAgICAgIGZpbHRlcihcbiAgICAgICAgICAgIHN0YXR1c2VzID0+XG4gICAgICAgICAgICAgIHN0YXR1c2VzLmluY2x1ZGVzKCdJTlZBTElEJykgfHwgIXN0YXR1c2VzLmluY2x1ZGVzKCdQRU5ESU5HJyksXG4gICAgICAgICAgKSxcbiAgICAgICAgICB0YWtlKDEpLFxuICAgICAgICAgIG1hcCgoKSA9PiBnZXRFcnJvcnMoKSksXG4gICAgICAgICAgdGFwKCgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICAgICAgICAgIH0pLFxuICAgICAgICApXG4gICAgICA6IGdldEVycm9ycygpO1xuICB9XG5cbiAgZW1pdE1vZGVsKG1vZGVsOiBNID0gdGhpcy5tb2RlbCkge1xuICAgIHRoaXMubW9kZWwgPSBtb2RlbDtcbiAgICB0aGlzLmVtaXRWYWx1ZSh0aGlzLm1vZGVsT3V0KHRoaXMubW9kZWwpKTtcbiAgfVxuXG4gIGVtaXRWYWx1ZSh2YWx1ZTogVikge1xuICAgIGlmICh0aGlzLm9uQ2hhbmdlKSB7XG4gICAgICB0aGlzLm9uQ2hhbmdlKHZhbHVlKTtcbiAgICB9XG4gIH1cblxuICBwcm90ZWN0ZWQgdmFsdWVJbih2YWx1ZTogVik6IE0ge1xuICAgIHJldHVybiB2YWx1ZSBhcyBhbnk7XG4gIH1cblxuICBwcm90ZWN0ZWQgbW9kZWxPdXQobW9kZWw6IE0pOiBWIHtcbiAgICByZXR1cm4gbW9kZWwgYXMgYW55O1xuICB9XG59XG5cbi8qKlxuICogQGRlcHJlY2F0ZWQgdXNlIHtAbGluayBCYXNlTmVzdGVkRm9ybUNvbnRyb2x9IGluc3RlYWQuXG4gKi9cbkBEaXJlY3RpdmUoKVxuZXhwb3J0IGNsYXNzIEJhc2VOZXN0ZWRGb3JtQ29udHJvbFB1cmU8ViwgTSA9IFY+IGV4dGVuZHMgQmFzZU5lc3RlZEZvcm1Db250cm9sPFxuICBWLFxuICBNXG4+IHtcbiAgbW9kZWwkID0gbmV3IFJlcGxheVN1YmplY3Q8TT4oMSk7XG5cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoKTtcblxuICAgIHRoaXMubW9kZWwkLnN1YnNjcmliZShtb2RlbCA9PiB7XG4gICAgICB0aGlzLm1vZGVsID0gbW9kZWw7XG4gICAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgICB9KTtcbiAgfVxuXG4gIG92ZXJyaWRlIHdyaXRlVmFsdWUodmFsdWU6IFYpIHtcbiAgICB0aGlzLm1vZGVsJC5uZXh0KHRoaXMudmFsdWVJbih2YWx1ZSkpO1xuICB9XG5cbiAgb3ZlcnJpZGUgZW1pdFZhbHVlKHZhbHVlOiBWKSB7XG4gICAgaWYgKHRoaXMub25DaGFuZ2UpIHtcbiAgICAgIHRoaXMub25DaGFuZ2UodmFsdWUpO1xuICAgICAgdGhpcy53cml0ZVZhbHVlKHZhbHVlKTtcbiAgICB9XG4gIH1cbn1cblxudHlwZSBQYXRoID0gc3RyaW5nIHwgQXJyYXk8c3RyaW5nIHwgbnVtYmVyPjtcblxuaW50ZXJmYWNlIE1hcHBlciB7XG4gIFt4OiBzdHJpbmddOiBNYXBwZXIgfCBQYXRoO1xufVxuXG50eXBlIFBhdGhUdXBsZSA9IFtzdHJpbmdbXSwgc3RyaW5nW11dO1xuXG5mdW5jdGlvbiBjb2xsZWN0UGF0aHMobWFwcGVyOiBNYXBwZXIsIHBhcmVudDogc3RyaW5nW10pOiBQYXRoVHVwbGVbXSB7XG4gIHJldHVybiBPYmplY3QuZW50cmllcyhtYXBwZXIpLnJlZHVjZSgoYWNjLCBba2V5LCB2YWx1ZV0pID0+IHtcbiAgICBjb25zdCBwYXRoID0gdHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJyA/IHZhbHVlLnNwbGl0KCcuJykgOiB2YWx1ZTtcbiAgICBpZiAoQXJyYXkuaXNBcnJheShwYXRoKSkge1xuICAgICAgYWNjLnB1c2goW3BhcmVudC5jb25jYXQoa2V5KSwgcGF0aF0pO1xuICAgICAgcmV0dXJuIGFjYztcbiAgICB9XG4gICAgcmV0dXJuIGFjYy5jb25jYXQoY29sbGVjdFBhdGhzKHBhdGgsIHBhcmVudC5jb25jYXQoa2V5KSkpO1xuICB9LCBbXSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBkYXRhVHJhbnNmZXI8XG4gIFMgZXh0ZW5kcyBvYmplY3QsXG4gIFQgZXh0ZW5kcyBvYmplY3QsXG4gIE0gZXh0ZW5kcyBSZWNvcmQ8a2V5b2YgVCwgUGF0aCB8IE1hcHBlcj4gPSBSZWNvcmQ8a2V5b2YgVCwgUGF0aCB8IE1hcHBlcj4sXG4+KG1hcHBlcjogTSk6IFsoc291cmNlOiBTKSA9PiBULCAodGFyZ2V0OiBUKSA9PiBTXSB7XG4gIGNvbnN0IHR1cGxlcyA9IGNvbGxlY3RQYXRocyhtYXBwZXIsIFtdKTtcbiAgbGV0IF9zb3VyY2U6IFM7XG4gIGxldCBfdGFyZ2V0OiBUID0ge30gYXMgVDtcbiAgcmV0dXJuIFtcbiAgICBzb3VyY2UgPT4ge1xuICAgICAgX3NvdXJjZSA9IHNvdXJjZTtcbiAgICAgIHJldHVybiB0dXBsZXMucmVkdWNlKChhY2MsIFtsZWZ0LCByaWdodF0pID0+IHtcbiAgICAgICAgY29uc3QgbmV3VmFsdWUgPSBwYXRoPHVua25vd24+KHJpZ2h0LCBzb3VyY2UpO1xuXG4gICAgICAgIGlmIChwYXRoKGxlZnQsIGFjYykgPT09IG5ld1ZhbHVlKSB7XG4gICAgICAgICAgcmV0dXJuIGFjYztcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiAoX3RhcmdldCA9IGFzc29jUGF0aDx1bmtub3duLCBUPihsZWZ0LCBuZXdWYWx1ZSwgYWNjKSk7XG4gICAgICB9LCBfdGFyZ2V0KTtcbiAgICB9LFxuICAgIHRhcmdldCA9PiB7XG4gICAgICBfdGFyZ2V0ID0gdGFyZ2V0O1xuICAgICAgcmV0dXJuIHR1cGxlcy5yZWR1Y2UoKGFjYywgW2xlZnQsIHJpZ2h0XSkgPT4ge1xuICAgICAgICBjb25zdCBuZXdWYWx1ZSA9IHBhdGg8dW5rbm93bj4obGVmdCwgdGFyZ2V0KTtcblxuICAgICAgICBpZiAocGF0aChyaWdodCwgYWNjKSA9PT0gbmV3VmFsdWUpIHtcbiAgICAgICAgICByZXR1cm4gYWNjO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIChfc291cmNlID0gYXNzb2NQYXRoPHVua25vd24sIFM+KHJpZ2h0LCBuZXdWYWx1ZSwgYWNjKSk7XG4gICAgICB9LCBfc291cmNlKTtcbiAgICB9LFxuICBdO1xufVxuXG5mdW5jdGlvbiBwYXJzZVBhdGgocGF0aDogUGF0aCk6IEFycmF5PHN0cmluZyB8IG51bWJlcj4ge1xuICByZXR1cm4gdHlwZW9mIHBhdGggPT09ICdzdHJpbmcnID8gcGF0aC5zcGxpdCgnLicpIDogcGF0aDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNvcHlWYWx1ZTxUIGV4dGVuZHMgb2JqZWN0PihcbiAgZnJvbTogUGF0aCxcbiAgdG86IFBhdGgsXG4gIG1hcHBlcjogKHY6IGFueSkgPT4gYW55ID0gaWRlbnRpdHksXG4pIHtcbiAgY29uc3QgZnJvbVBhdGggPSBwYXJzZVBhdGgoZnJvbSk7XG4gIGNvbnN0IHRvUGF0aCA9IHBhcnNlUGF0aCh0byk7XG4gIHJldHVybiAob2JqZWN0OiBUKSA9PlxuICAgIGFzc29jUGF0aCh0b1BhdGgsIG1hcHBlcihwYXRoKGZyb21QYXRoLCBvYmplY3QpKSwgb2JqZWN0KTtcbn1cbiJdfQ==