UNPKG

@antischematic/angular-state-library

Version:
136 lines 21.5 kB
import { ChangeDetectorRef, ErrorHandler, inject, Injectable, INJECTOR, } from "@angular/core"; import { BehaviorSubject, defer, distinctUntilChanged, filter, isObservable, map, NEVER, observable, Observable, ReplaySubject, startWith, Subject, Subscription, } from "rxjs"; import { addTeardown } from "./hooks"; import { EventType } from "./interfaces"; import { EVENTS, EventScheduler } from "./providers"; import { track } from "./proxy"; import { events } from "./utils"; import * as i0 from "@angular/core"; function pick(object, keys) { if (Array.isArray(keys)) { return keys.reduce((acc, key) => { acc[key] = object[key]; return acc; }, {}); } return object[keys]; } export function slice(token, keys, injector = inject(INJECTOR)) { return defer(() => { const context = injector.get(token); return store(token, injector).pipe(map((context) => pick(context, keys)), startWith(pick(context, keys)), distinctUntilChanged((a, b) => !Array.isArray(keys) ? Object.is(a, b) : keys.every(key => Object.is(a[key], b[key])))); }); } export function store(token, injector = inject(INJECTOR)) { return defer(() => { const context = injector.get(token); return injector.get(EVENTS).pipe(filter(event => event.changes.has(context)), map(() => context)); }); } export function inputs(token, injector = inject(INJECTOR)) { return defer(() => { return events(token, injector).pipe(filter((event) => event.name === "ngOnChanges"), map(event => event.value)); }); } export function withState(initial, options = {}) { const destination = new BehaviorSubject(initial); const source = options.from ?? NEVER; return { destination, source, }; } export const Selector = function Selector(name, select) { class Selector { constructor() { this.connected = false; this.subscription = new Subscription(); const subject = new Subject(); const selection = select(subject); if (isObservable(selection)) { this.source = selection; this.destination = new ReplaySubject(1); } else { this.source = selection.source; this.destination = selection.destination; } this.target = select.length > 0 ? subject : this.destination; this.subscription.add(this.destination.subscribe((value) => { this.value = value; })); } [observable]() { return this; } connect() { if (!this.connected) { this.connected = true; this.subscription.add(this.source.subscribe(this.destination)); } } next(value) { this.target.next(value); } pipe(...operators) { return new Observable(subscriber => { return this.subscribe(subscriber); }).pipe(...operators); } subscribe(observer) { try { return this.destination.subscribe(observer); } finally { this.connect(); } } ngOnDestroy() { this.subscription.unsubscribe(); } } Selector.overriddenName = name; Selector.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.0.0", ngImport: i0, type: Selector, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); Selector.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "15.0.0", ngImport: i0, type: Selector }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.0.0", ngImport: i0, type: Selector, decorators: [{ type: Injectable }], ctorParameters: function () { return []; } }); return Selector; }; class SelectObserver { constructor(target, key, event, cdr, errorHandler) { this.target = target; this.key = key; this.event = event; this.cdr = cdr; this.errorHandler = errorHandler; } next(value) { const previous = this.target[this.key]; this.target[this.key] = track(value); const changes = new Map([[this.target, new Map([[this.key, previous]])]]); this.event.schedule(EventType.Dispatch, this.key, value, changes); this.cdr.markForCheck(); } error(error) { console.error("Error thrown in Select"); console.error("Directive:", this.target); console.error("Key:", this.key); this.errorHandler.handleError(error); } complete() { } } export function subscribe(token, directive, key) { const instance = token ? inject(token) : directive[key]; const observer = new SelectObserver(directive, key, inject(EventScheduler), inject(ChangeDetectorRef), inject(ErrorHandler)); const subscription = instance.ngOnSelect?.(observer) ?? instance.subscribe?.(observer); if (!subscription) { console.error('Directive:', directive); console.error('Key:', key); console.error('Object:', instance); throw new Error(`Object does not implement OnSelect or Subscribable interfaces`); } directive[key] = track(directive[key]); addTeardown(subscription); } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VsZWN0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vcHJvamVjdHMvY29yZS9zcmMvc2VsZWN0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDSixpQkFBaUIsRUFDakIsWUFBWSxFQUNaLE1BQU0sRUFDTixVQUFVLEVBRVYsUUFBUSxHQUdWLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFDSixlQUFlLEVBQ2YsS0FBSyxFQUNMLG9CQUFvQixFQUNwQixNQUFNLEVBQ04sWUFBWSxFQUNaLEdBQUcsRUFDSCxLQUFLLEVBQ0wsVUFBVSxFQUNWLFVBQVUsRUFFVixhQUFhLEVBQ2IsU0FBUyxFQUNULE9BQU8sRUFDUCxZQUFZLEdBQ2QsTUFBTSxNQUFNLENBQUM7QUFDZCxPQUFPLEVBQUMsV0FBVyxFQUFDLE1BQU0sU0FBUyxDQUFDO0FBQ3BDLE9BQU8sRUFBZ0IsU0FBUyxFQUEyQixNQUFNLGNBQWMsQ0FBQztBQUNoRixPQUFPLEVBQUMsTUFBTSxFQUFFLGNBQWMsRUFBQyxNQUFNLGFBQWEsQ0FBQztBQUNuRCxPQUFPLEVBQUMsS0FBSyxFQUFDLE1BQU0sU0FBUyxDQUFDO0FBQzlCLE9BQU8sRUFBQyxNQUFNLEVBQUMsTUFBTSxTQUFTLENBQUM7O0FBSS9CLFNBQVMsSUFBSSxDQUFDLE1BQVcsRUFBRSxJQUFpQztJQUN6RCxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEVBQUU7UUFDdEIsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxFQUFFO1lBQzdCLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUE7WUFDdEIsT0FBTyxHQUFHLENBQUE7UUFDYixDQUFDLEVBQUUsRUFBUyxDQUFDLENBQUE7S0FDZjtJQUNELE9BQU8sTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFBO0FBQ3RCLENBQUM7QUFJRCxNQUFNLFVBQVUsS0FBSyxDQUFDLEtBQXlCLEVBQUUsSUFBUyxFQUFFLFFBQVEsR0FBRyxNQUFNLENBQUMsUUFBUSxDQUFDO0lBQ3BGLE9BQU8sS0FBSyxDQUFDLEdBQUcsRUFBRTtRQUNmLE1BQU0sT0FBTyxHQUFHLFFBQVEsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUE7UUFDbkMsT0FBTyxLQUFLLENBQUMsS0FBSyxFQUFFLFFBQVEsQ0FBQyxDQUFDLElBQUksQ0FDL0IsR0FBRyxDQUFDLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxDQUFDLEVBQ3JDLFNBQVMsQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxDQUFDLEVBQzlCLG9CQUFvQixDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FDdkgsQ0FBQTtJQUNKLENBQUMsQ0FBQyxDQUFBO0FBQ0wsQ0FBQztBQUVELE1BQU0sVUFBVSxLQUFLLENBQWUsS0FBdUIsRUFBRSxRQUFRLEdBQUcsTUFBTSxDQUFDLFFBQVEsQ0FBQztJQUNyRixPQUFPLEtBQUssQ0FBQyxHQUFHLEVBQUU7UUFDZixNQUFNLE9BQU8sR0FBRyxRQUFRLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFBO1FBQ25DLE9BQU8sUUFBUSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxJQUFJLENBQzdCLE1BQU0sQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxDQUFDLEVBQzNDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxPQUFPLENBQUMsQ0FDckIsQ0FBQTtJQUNILENBQUMsQ0FBQyxDQUFBO0FBQ0wsQ0FBQztBQUVELE1BQU0sVUFBVSxNQUFNLENBQUksS0FBdUIsRUFBRSxRQUFRLEdBQUcsTUFBTSxDQUFDLFFBQVEsQ0FBQztJQUMzRSxPQUFPLEtBQUssQ0FBQyxHQUFHLEVBQUU7UUFDZixPQUFPLE1BQU0sQ0FBQyxLQUFLLEVBQUUsUUFBUSxDQUFDLENBQUMsSUFBSSxDQUNoQyxNQUFNLENBQUMsQ0FBQyxLQUFpQixFQUEwQixFQUFFLENBQUMsS0FBSyxDQUFDLElBQUksS0FBSyxhQUFhLENBQUMsRUFDbkYsR0FBRyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLEtBQXdCLENBQUMsQ0FDOUMsQ0FBQTtJQUNKLENBQUMsQ0FBQyxDQUFBO0FBQ0wsQ0FBQztBQWdCRCxNQUFNLFVBQVUsU0FBUyxDQUFJLE9BQVUsRUFBRSxVQUErQixFQUFFO0lBQ3ZFLE1BQU0sV0FBVyxHQUFHLElBQUksZUFBZSxDQUFDLE9BQU8sQ0FBQyxDQUFBO0lBQ2hELE1BQU0sTUFBTSxHQUFHLE9BQU8sQ0FBQyxJQUFJLElBQUksS0FBSyxDQUFBO0lBRXBDLE9BQU87UUFDSixXQUFXO1FBQ1gsTUFBTTtLQUNSLENBQUE7QUFDSixDQUFDO0FBRUQsTUFBTSxDQUFDLE1BQU0sUUFBUSxHQUFhLFNBQVMsUUFBUSxDQUFDLElBQVksRUFBRSxNQUFnQjtJQUMvRSxNQUNNLFFBQVE7UUEwQ1g7WUF2Q0EsY0FBUyxHQUFHLEtBQUssQ0FBQTtZQUNqQixpQkFBWSxHQUFHLElBQUksWUFBWSxFQUFFLENBQUE7WUF1QzlCLE1BQU0sT0FBTyxHQUFHLElBQUksT0FBTyxFQUFFLENBQUE7WUFDN0IsTUFBTSxTQUFTLEdBQUcsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFBO1lBQ2pDLElBQUksWUFBWSxDQUFDLFNBQVMsQ0FBQyxFQUFFO2dCQUMxQixJQUFJLENBQUMsTUFBTSxHQUFHLFNBQVMsQ0FBQTtnQkFDdkIsSUFBSSxDQUFDLFdBQVcsR0FBRyxJQUFJLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQTthQUN6QztpQkFBTTtnQkFDSixJQUFJLENBQUMsTUFBTSxHQUFHLFNBQVMsQ0FBQyxNQUFNLENBQUE7Z0JBQzlCLElBQUksQ0FBQyxXQUFXLEdBQUcsU0FBUyxDQUFDLFdBQVcsQ0FBQTthQUMxQztZQUNELElBQUksQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQTtZQUM1RCxJQUFJLENBQUMsWUFBWSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLFNBQVMsQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFO2dCQUN4RCxJQUFJLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQTtZQUNyQixDQUFDLENBQUMsQ0FBQyxDQUFBO1FBQ04sQ0FBQztRQWpERCxDQUFDLFVBQVUsQ0FBQztZQUNULE9BQU8sSUFBSSxDQUFBO1FBQ2QsQ0FBQztRQUlELE9BQU87WUFDSixJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRTtnQkFDbEIsSUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUE7Z0JBQ3JCLElBQUksQ0FBQyxZQUFZLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFBO2FBQ2hFO1FBQ0osQ0FBQztRQUVELElBQUksQ0FBQyxLQUFVO1lBQ1osSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUE7UUFDMUIsQ0FBQztRQUVELElBQUksQ0FBQyxHQUFHLFNBQWdCO1lBQ3JCLE9BQU8sSUFBSSxVQUFVLENBQUMsVUFBVSxDQUFDLEVBQUU7Z0JBQ2hDLE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQyxVQUFVLENBQUMsQ0FBQTtZQUNwQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxTQUFlLENBQUMsQ0FBQTtRQUM5QixDQUFDO1FBRUQsU0FBUyxDQUFDLFFBQWE7WUFDcEIsSUFBSTtnQkFDRCxPQUFPLElBQUksQ0FBQyxXQUFXLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxDQUFBO2FBQzdDO29CQUFTO2dCQUNQLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQTthQUNoQjtRQUNKLENBQUM7UUFFRCxXQUFXO1lBQ1IsSUFBSSxDQUFDLFlBQVksQ0FBQyxXQUFXLEVBQUUsQ0FBQTtRQUNsQyxDQUFDOztJQWtCTSx1QkFBYyxHQUFHLElBQUksQ0FBQTt5R0ExRHpCLFFBQVE7NkdBQVIsUUFBUTsrRkFBUixRQUFRO3NCQURiLFVBQVU7O0lBNkRYLE9BQU8sUUFBUSxDQUFBO0NBQ1YsQ0FBQTtBQUVSLE1BQU0sY0FBYztJQWVqQixZQUFvQixNQUFXLEVBQVUsR0FBUSxFQUFVLEtBQXFCLEVBQVUsR0FBc0IsRUFBVSxZQUEwQjtRQUFoSSxXQUFNLEdBQU4sTUFBTSxDQUFLO1FBQVUsUUFBRyxHQUFILEdBQUcsQ0FBSztRQUFVLFVBQUssR0FBTCxLQUFLLENBQWdCO1FBQVUsUUFBRyxHQUFILEdBQUcsQ0FBbUI7UUFBVSxpQkFBWSxHQUFaLFlBQVksQ0FBYztJQUFHLENBQUM7SUFkeEosSUFBSSxDQUFDLEtBQVU7UUFDWixNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQTtRQUN0QyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUE7UUFDcEMsTUFBTSxPQUFPLEdBQUcsSUFBSSxHQUFHLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsSUFBSSxHQUFHLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFBO1FBQ3pFLElBQUksQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxRQUFRLEVBQUUsSUFBSSxDQUFDLEdBQUcsRUFBRSxLQUFLLEVBQUUsT0FBTyxDQUFDLENBQUE7UUFDakUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxZQUFZLEVBQUUsQ0FBQTtJQUMxQixDQUFDO0lBQ0QsS0FBSyxDQUFDLEtBQWM7UUFDakIsT0FBTyxDQUFDLEtBQUssQ0FBQyx3QkFBd0IsQ0FBQyxDQUFBO1FBQ3ZDLE9BQU8sQ0FBQyxLQUFLLENBQUMsWUFBWSxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQTtRQUN4QyxPQUFPLENBQUMsS0FBSyxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUE7UUFDL0IsSUFBSSxDQUFDLFlBQVksQ0FBQyxXQUFXLENBQUMsS0FBSyxDQUFDLENBQUE7SUFDdkMsQ0FBQztJQUNELFFBQVEsS0FBSSxDQUFDO0NBRWY7QUFFRCxNQUFNLFVBQVUsU0FBUyxDQUFlLEtBQW1DLEVBQUUsU0FBYyxFQUFFLEdBQVc7SUFDckcsTUFBTSxRQUFRLEdBQUksS0FBSyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsQ0FBQTtJQUN4RCxNQUFNLFFBQVEsR0FBRyxJQUFJLGNBQWMsQ0FBQyxTQUFTLEVBQUUsR0FBRyxFQUFFLE1BQU0sQ0FBQyxjQUFjLENBQUMsRUFBRSxNQUFNLENBQUMsaUJBQWlCLENBQUMsRUFBRSxNQUFNLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQTtJQUM1SCxNQUFNLFlBQVksR0FBRyxRQUFRLENBQUMsVUFBVSxFQUFFLENBQUMsUUFBUSxDQUFDLElBQUksUUFBUSxDQUFDLFNBQVMsRUFBRSxDQUFDLFFBQVEsQ0FBQyxDQUFBO0lBQ3RGLElBQUksQ0FBQyxZQUFZLEVBQUU7UUFDaEIsT0FBTyxDQUFDLEtBQUssQ0FBQyxZQUFZLEVBQUUsU0FBUyxDQUFDLENBQUE7UUFDdEMsT0FBTyxDQUFDLEtBQUssQ0FBQyxNQUFNLEVBQUUsR0FBRyxDQUFDLENBQUE7UUFDMUIsT0FBTyxDQUFDLEtBQUssQ0FBQyxTQUFTLEVBQUUsUUFBUSxDQUFDLENBQUE7UUFDbEMsTUFBTSxJQUFJLEtBQUssQ0FBQywrREFBK0QsQ0FBQyxDQUFBO0tBQ2xGO0lBQ0QsU0FBUyxDQUFDLEdBQUcsQ0FBQyxHQUFHLEtBQUssQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQTtJQUN0QyxXQUFXLENBQUMsWUFBWSxDQUFDLENBQUE7QUFDNUIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gICBDaGFuZ2VEZXRlY3RvclJlZixcbiAgIEVycm9ySGFuZGxlcixcbiAgIGluamVjdCxcbiAgIEluamVjdGFibGUsXG4gICBJbmplY3RvcixcbiAgIElOSkVDVE9SLFxuICAgUHJvdmlkZXJUb2tlbixcbiAgIFR5cGUsXG59IGZyb20gXCJAYW5ndWxhci9jb3JlXCI7XG5pbXBvcnQge1xuICAgQmVoYXZpb3JTdWJqZWN0LFxuICAgZGVmZXIsXG4gICBkaXN0aW5jdFVudGlsQ2hhbmdlZCxcbiAgIGZpbHRlcixcbiAgIGlzT2JzZXJ2YWJsZSxcbiAgIG1hcCxcbiAgIE5FVkVSLFxuICAgb2JzZXJ2YWJsZSxcbiAgIE9ic2VydmFibGUsXG4gICBPYnNlcnZlcixcbiAgIFJlcGxheVN1YmplY3QsXG4gICBzdGFydFdpdGgsXG4gICBTdWJqZWN0LFxuICAgU3Vic2NyaXB0aW9uLFxufSBmcm9tIFwicnhqc1wiO1xuaW1wb3J0IHthZGRUZWFyZG93bn0gZnJvbSBcIi4vaG9va3NcIjtcbmltcG9ydCB7RGlzcGF0Y2hFdmVudCwgRXZlbnRUeXBlLCBTdG9yZUV2ZW50LCBUeXBlZENoYW5nZXN9IGZyb20gXCIuL2ludGVyZmFjZXNcIjtcbmltcG9ydCB7RVZFTlRTLCBFdmVudFNjaGVkdWxlcn0gZnJvbSBcIi4vcHJvdmlkZXJzXCI7XG5pbXBvcnQge3RyYWNrfSBmcm9tIFwiLi9wcm94eVwiO1xuaW1wb3J0IHtldmVudHN9IGZyb20gXCIuL3V0aWxzXCI7XG5cbmZ1bmN0aW9uIHBpY2s8VCwgVSBleHRlbmRzIChrZXlvZiBUKVtdPihvYmplY3Q6IFQsIGtleXM6IFUpOiBQaWNrPFQsIFVbbnVtYmVyXT5cbmZ1bmN0aW9uIHBpY2s8VCwgVSBleHRlbmRzIGtleW9mIFQ+KG9iamVjdDogVCwga2V5czogVSk6IFRbVV1cbmZ1bmN0aW9uIHBpY2sob2JqZWN0OiBhbnksIGtleXM6IFByb3BlcnR5S2V5IHwgUHJvcGVydHlLZXlbXSk6IHVua25vd24ge1xuICAgaWYgKEFycmF5LmlzQXJyYXkoa2V5cykpIHtcbiAgICAgIHJldHVybiBrZXlzLnJlZHVjZSgoYWNjLCBrZXkpID0+IHtcbiAgICAgICAgIGFjY1trZXldID0gb2JqZWN0W2tleV1cbiAgICAgICAgIHJldHVybiBhY2NcbiAgICAgIH0sIHt9IGFzIGFueSlcbiAgIH1cbiAgIHJldHVybiBvYmplY3Rba2V5c11cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHNsaWNlPFQgZXh0ZW5kcyB7fSwgVSBleHRlbmRzIGtleW9mIFQ+KHRva2VuOiBQcm92aWRlclRva2VuPFQ+LCBrZXk6IFUsIGluamVjdG9yPzogSW5qZWN0b3IpOiBPYnNlcnZhYmxlPFRbVV0+XG5leHBvcnQgZnVuY3Rpb24gc2xpY2U8VCBleHRlbmRzIHt9LCBVIGV4dGVuZHMgKGtleW9mIFQpW10+KHRva2VuOiBQcm92aWRlclRva2VuPFQ+LCBrZXk6IFUsIGluamVjdG9yPzogSW5qZWN0b3IpOiBPYnNlcnZhYmxlPFBpY2s8VCwgVVtudW1iZXJdPj5cbmV4cG9ydCBmdW5jdGlvbiBzbGljZSh0b2tlbjogUHJvdmlkZXJUb2tlbjxhbnk+LCBrZXlzOiBhbnksIGluamVjdG9yID0gaW5qZWN0KElOSkVDVE9SKSk6IE9ic2VydmFibGU8dW5rbm93bj4ge1xuICAgcmV0dXJuIGRlZmVyKCgpID0+IHtcbiAgICAgIGNvbnN0IGNvbnRleHQgPSBpbmplY3Rvci5nZXQodG9rZW4pXG4gICAgICByZXR1cm4gc3RvcmUodG9rZW4sIGluamVjdG9yKS5waXBlKFxuICAgICAgICAgbWFwKChjb250ZXh0KSA9PiBwaWNrKGNvbnRleHQsIGtleXMpKSxcbiAgICAgICAgIHN0YXJ0V2l0aChwaWNrKGNvbnRleHQsIGtleXMpKSxcbiAgICAgICAgIGRpc3RpbmN0VW50aWxDaGFuZ2VkKChhLCBiKSA9PiAhQXJyYXkuaXNBcnJheShrZXlzKSA/IE9iamVjdC5pcyhhLCBiKSA6IGtleXMuZXZlcnkoa2V5ID0+IE9iamVjdC5pcyhhW2tleV0sIGJba2V5XSkpKVxuICAgICAgKVxuICAgfSlcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHN0b3JlPFQgZXh0ZW5kcyB7fT4odG9rZW46IFByb3ZpZGVyVG9rZW48VD4sIGluamVjdG9yID0gaW5qZWN0KElOSkVDVE9SKSk6IE9ic2VydmFibGU8VD4ge1xuICAgcmV0dXJuIGRlZmVyKCgpID0+IHtcbiAgICAgIGNvbnN0IGNvbnRleHQgPSBpbmplY3Rvci5nZXQodG9rZW4pXG4gICAgICByZXR1cm4gaW5qZWN0b3IuZ2V0KEVWRU5UUykucGlwZShcbiAgICAgICAgIGZpbHRlcihldmVudCA9PiBldmVudC5jaGFuZ2VzLmhhcyhjb250ZXh0KSksXG4gICAgICAgICBtYXAoKCkgPT4gY29udGV4dClcbiAgICAgKVxuICAgfSlcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlucHV0czxUPih0b2tlbjogUHJvdmlkZXJUb2tlbjxUPiwgaW5qZWN0b3IgPSBpbmplY3QoSU5KRUNUT1IpKTogT2JzZXJ2YWJsZTxUeXBlZENoYW5nZXM8VD4+IHtcbiAgIHJldHVybiBkZWZlcigoKSA9PiB7XG4gICAgICByZXR1cm4gZXZlbnRzKHRva2VuLCBpbmplY3RvcikucGlwZShcbiAgICAgICAgIGZpbHRlcigoZXZlbnQ6IFN0b3JlRXZlbnQpOiBldmVudCBpcyBEaXNwYXRjaEV2ZW50ID0+IGV2ZW50Lm5hbWUgPT09IFwibmdPbkNoYW5nZXNcIiksXG4gICAgICAgICBtYXAoZXZlbnQgPT4gZXZlbnQudmFsdWUgYXMgVHlwZWRDaGFuZ2VzPFQ+KVxuICAgICAgKVxuICAgfSlcbn1cblxuZXhwb3J0IGludGVyZmFjZSBXaXRoU3RhdGVPcHRpb25zPFQ+IHtcbiAgIGZyb20/OiBPYnNlcnZhYmxlPFQ+XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgV2l0aFN0YXRlPFQ+IHtcbiAgIHNvdXJjZTogT2JzZXJ2YWJsZTxUPlxuICAgZGVzdGluYXRpb246IEJlaGF2aW9yU3ViamVjdDxUPlxufVxuXG5leHBvcnQgaW50ZXJmYWNlIFNlbGVjdG9yIHtcbiAgIG5ldzxUPihuYW1lOiBzdHJpbmcsIGZhY3Rvcnk6IChzb3VyY2U6IE9ic2VydmFibGU8VD4pID0+IFdpdGhTdGF0ZTxUPik6IFR5cGU8QmVoYXZpb3JTdWJqZWN0PFQ+PlxuICAgbmV3PFQ+KG5hbWU6IHN0cmluZywgZmFjdG9yeTogKHNvdXJjZTogT2JzZXJ2YWJsZTxUPikgPT4gT2JzZXJ2YWJsZTxUPik6IFR5cGU8QmVoYXZpb3JTdWJqZWN0PFQ+ICYgeyB2YWx1ZTogVCB8IHVuZGVmaW5lZCB9PlxufVxuXG5leHBvcnQgZnVuY3Rpb24gd2l0aFN0YXRlPFQ+KGluaXRpYWw6IFQsIG9wdGlvbnM6IFdpdGhTdGF0ZU9wdGlvbnM8VD4gPSB7fSk6IFdpdGhTdGF0ZTxUPiB7XG4gICBjb25zdCBkZXN0aW5hdGlvbiA9IG5ldyBCZWhhdmlvclN1YmplY3QoaW5pdGlhbClcbiAgIGNvbnN0IHNvdXJjZSA9IG9wdGlvbnMuZnJvbSA/PyBORVZFUlxuXG4gICByZXR1cm4ge1xuICAgICAgZGVzdGluYXRpb24sXG4gICAgICBzb3VyY2UsXG4gICB9XG59XG5cbmV4cG9ydCBjb25zdCBTZWxlY3RvcjogU2VsZWN0b3IgPSBmdW5jdGlvbiBTZWxlY3RvcihuYW1lOiBzdHJpbmcsIHNlbGVjdDogRnVuY3Rpb24pIHtcbiAgIEBJbmplY3RhYmxlKClcbiAgIGNsYXNzIFNlbGVjdG9yIHtcbiAgICAgIHNvdXJjZTogT2JzZXJ2YWJsZTxhbnk+XG4gICAgICBkZXN0aW5hdGlvbjogU3ViamVjdDxhbnk+XG4gICAgICBjb25uZWN0ZWQgPSBmYWxzZVxuICAgICAgc3Vic2NyaXB0aW9uID0gbmV3IFN1YnNjcmlwdGlvbigpXG4gICAgICB0YXJnZXQ6IFN1YmplY3Q8YW55PlxuXG4gICAgICBbb2JzZXJ2YWJsZV0oKSB7XG4gICAgICAgICByZXR1cm4gdGhpc1xuICAgICAgfVxuXG4gICAgICB2YWx1ZTogYW55XG5cbiAgICAgIGNvbm5lY3QoKSB7XG4gICAgICAgICBpZiAoIXRoaXMuY29ubmVjdGVkKSB7XG4gICAgICAgICAgICB0aGlzLmNvbm5lY3RlZCA9IHRydWVcbiAgICAgICAgICAgIHRoaXMuc3Vic2NyaXB0aW9uLmFkZCh0aGlzLnNvdXJjZS5zdWJzY3JpYmUodGhpcy5kZXN0aW5hdGlvbikpXG4gICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIG5leHQodmFsdWU6IGFueSkge1xuICAgICAgICAgdGhpcy50YXJnZXQubmV4dCh2YWx1ZSlcbiAgICAgIH1cblxuICAgICAgcGlwZSguLi5vcGVyYXRvcnM6IGFueVtdKSB7XG4gICAgICAgICByZXR1cm4gbmV3IE9ic2VydmFibGUoc3Vic2NyaWJlciA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5zdWJzY3JpYmUoc3Vic2NyaWJlcilcbiAgICAgICAgIH0pLnBpcGUoLi4ub3BlcmF0b3JzIGFzIFtdKVxuICAgICAgfVxuXG4gICAgICBzdWJzY3JpYmUob2JzZXJ2ZXI6IGFueSkge1xuICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmRlc3RpbmF0aW9uLnN1YnNjcmliZShvYnNlcnZlcilcbiAgICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgICB0aGlzLmNvbm5lY3QoKVxuICAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBuZ09uRGVzdHJveSgpIHtcbiAgICAgICAgIHRoaXMuc3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKClcbiAgICAgIH1cblxuICAgICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgICBjb25zdCBzdWJqZWN0ID0gbmV3IFN1YmplY3QoKVxuICAgICAgICAgY29uc3Qgc2VsZWN0aW9uID0gc2VsZWN0KHN1YmplY3QpXG4gICAgICAgICBpZiAoaXNPYnNlcnZhYmxlKHNlbGVjdGlvbikpIHtcbiAgICAgICAgICAgIHRoaXMuc291cmNlID0gc2VsZWN0aW9uXG4gICAgICAgICAgICB0aGlzLmRlc3RpbmF0aW9uID0gbmV3IFJlcGxheVN1YmplY3QoMSlcbiAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnNvdXJjZSA9IHNlbGVjdGlvbi5zb3VyY2VcbiAgICAgICAgICAgIHRoaXMuZGVzdGluYXRpb24gPSBzZWxlY3Rpb24uZGVzdGluYXRpb25cbiAgICAgICAgIH1cbiAgICAgICAgIHRoaXMudGFyZ2V0ID0gc2VsZWN0Lmxlbmd0aCA+IDAgPyBzdWJqZWN0IDogdGhpcy5kZXN0aW5hdGlvblxuICAgICAgICAgdGhpcy5zdWJzY3JpcHRpb24uYWRkKHRoaXMuZGVzdGluYXRpb24uc3Vic2NyaWJlKCh2YWx1ZSkgPT4ge1xuICAgICAgICAgICAgdGhpcy52YWx1ZSA9IHZhbHVlXG4gICAgICAgICB9KSlcbiAgICAgIH1cblxuICAgICAgc3RhdGljIG92ZXJyaWRkZW5OYW1lID0gbmFtZVxuICAgfVxuICAgcmV0dXJuIFNlbGVjdG9yXG59IGFzIGFueVxuXG5jbGFzcyBTZWxlY3RPYnNlcnZlciB7XG4gICBuZXh0KHZhbHVlOiBhbnkpIHtcbiAgICAgIGNvbnN0IHByZXZpb3VzID0gdGhpcy50YXJnZXRbdGhpcy5rZXldXG4gICAgICB0aGlzLnRhcmdldFt0aGlzLmtleV0gPSB0cmFjayh2YWx1ZSlcbiAgICAgIGNvbnN0IGNoYW5nZXMgPSBuZXcgTWFwKFtbdGhpcy50YXJnZXQsIG5ldyBNYXAoW1t0aGlzLmtleSwgcHJldmlvdXNdXSldXSlcbiAgICAgIHRoaXMuZXZlbnQuc2NoZWR1bGUoRXZlbnRUeXBlLkRpc3BhdGNoLCB0aGlzLmtleSwgdmFsdWUsIGNoYW5nZXMpXG4gICAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKVxuICAgfVxuICAgZXJyb3IoZXJyb3I6IHVua25vd24pIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoXCJFcnJvciB0aHJvd24gaW4gU2VsZWN0XCIpXG4gICAgICBjb25zb2xlLmVycm9yKFwiRGlyZWN0aXZlOlwiLCB0aGlzLnRhcmdldClcbiAgICAgIGNvbnNvbGUuZXJyb3IoXCJLZXk6XCIsIHRoaXMua2V5KVxuICAgICAgdGhpcy5lcnJvckhhbmRsZXIuaGFuZGxlRXJyb3IoZXJyb3IpXG4gICB9XG4gICBjb21wbGV0ZSgpIHt9XG4gICBjb25zdHJ1Y3Rvcihwcml2YXRlIHRhcmdldDogYW55LCBwcml2YXRlIGtleTogYW55LCBwcml2YXRlIGV2ZW50OiBFdmVudFNjaGVkdWxlciwgcHJpdmF0ZSBjZHI6IENoYW5nZURldGVjdG9yUmVmLCBwcml2YXRlIGVycm9ySGFuZGxlcjogRXJyb3JIYW5kbGVyKSB7fVxufVxuXG5leHBvcnQgZnVuY3Rpb24gc3Vic2NyaWJlPFQgZXh0ZW5kcyB7fT4odG9rZW46IFByb3ZpZGVyVG9rZW48VD4gfCB1bmRlZmluZWQsIGRpcmVjdGl2ZTogYW55LCBrZXk6IHN0cmluZyk6IGFueSB7XG4gICBjb25zdCBpbnN0YW5jZSA9ICB0b2tlbiA/IGluamVjdCh0b2tlbikgOiBkaXJlY3RpdmVba2V5XVxuICAgY29uc3Qgb2JzZXJ2ZXIgPSBuZXcgU2VsZWN0T2JzZXJ2ZXIoZGlyZWN0aXZlLCBrZXksIGluamVjdChFdmVudFNjaGVkdWxlciksIGluamVjdChDaGFuZ2VEZXRlY3RvclJlZiksIGluamVjdChFcnJvckhhbmRsZXIpKVxuICAgY29uc3Qgc3Vic2NyaXB0aW9uID0gaW5zdGFuY2UubmdPblNlbGVjdD8uKG9ic2VydmVyKSA/PyBpbnN0YW5jZS5zdWJzY3JpYmU/LihvYnNlcnZlcilcbiAgIGlmICghc3Vic2NyaXB0aW9uKSB7XG4gICAgICBjb25zb2xlLmVycm9yKCdEaXJlY3RpdmU6JywgZGlyZWN0aXZlKVxuICAgICAgY29uc29sZS5lcnJvcignS2V5OicsIGtleSlcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ09iamVjdDonLCBpbnN0YW5jZSlcbiAgICAgIHRocm93IG5ldyBFcnJvcihgT2JqZWN0IGRvZXMgbm90IGltcGxlbWVudCBPblNlbGVjdCBvciBTdWJzY3JpYmFibGUgaW50ZXJmYWNlc2ApXG4gICB9XG4gICBkaXJlY3RpdmVba2V5XSA9IHRyYWNrKGRpcmVjdGl2ZVtrZXldKVxuICAgYWRkVGVhcmRvd24oc3Vic2NyaXB0aW9uKVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIE9uU2VsZWN0IHtcbiAgIG5nT25TZWxlY3Qob2JzZXJ2ZXI6IE9ic2VydmVyPGFueT4pOiBTdWJzY3JpcHRpb25cbn1cbiJdfQ==