@sedeh/into-pipes
Version:
Have you ever wanted to transform data in different parts of your application into interactive objects without writing a single line of code?
189 lines • 27.6 kB
JavaScript
import { Directive, Input } from '@angular/core';
import * as i0 from "@angular/core";
import * as i1 from "./component.pool";
export class IntoDirective {
set disabled(value) {
this.disabledComponents = value;
this.components.map((c) => c.disabled = value);
}
set active(value) {
this.activeComponents = value;
this.components.map((c) => c.active = value);
}
set validate(value) {
this.validatingMethod = value;
this.components.map((c) => c.validate = value);
}
constructor(viewRef, el, pool) {
this.viewRef = viewRef;
this.el = el;
this.pool = pool;
this.components = [];
this.disabledComponents = false;
this.activeComponents = true;
this.validatingMethod = (item, value) => true;
this.onComponentChange = (event) => { };
}
split(item) {
return item.trim().match(/(?=\S)[^"\:]*(?:"[^\\"]*(?:\\[\:\S][^\\"]*)*"[^"\:]*)*/g)?.filter((x) => x.length);
}
_transform(content, args, data) {
let result = content;
if (this.pool.registeredForComponentWithNamed(args[0])) {
const newArgs = args.splice(1, args.length);
result = this.transformComponent(args[0], content, this.intoId, this.intoName, data, ...newArgs);
}
else if (this.pool.registeredForPipeTransformationNamed(args[0])) {
result = this.pool.registeredPipeTransformation(args[0], content, args, this._transform.bind(this), data);
}
else {
// unknown formatter
try {
result = this.transformComponent(args[0], content, this.intoId, this.intoName, data, args.length > 1 ? args[1] : "", args.length > 2 ? args[2] : "", args.length > 3 ? args[3] : "", args.length > 4 ? args[4] : "", args.length > 5 ? args[5] : "");
}
catch (x) {
console.error(x);
}
}
return result;
}
transformComponent(type, content, id, name, data, ...args) {
let result = content;
if (content === undefined) {
return "";
}
if (content instanceof Date ||
typeof content === "string" ||
typeof content === "number" ||
typeof content === "boolean" ||
Object.keys(content).length) {
result = this.registeredComponentFor(type);
if (result === null || result === undefined) {
console.error("Custom component '" + type + "' is not defined.");
result = content;
}
else {
result.id = id;
result.name = name;
result.active = this.activeComponents;
result.disabled = this.disabledComponents;
result.validate = this.validatingMethod;
result.service = this.pool.registeredServiceForComponent(type);
result.transform(content.source ? content.source : content, data, args);
if (result.onIntoComponentChange && this.onComponentChange) {
result.onIntoComponentChange.subscribe(this.onComponentChange);
}
this.components.push(result);
}
}
else if (content instanceof Array) {
let counter = 0;
result = content;
content.map((source) => {
if (typeof source === "string" ||
typeof content === "number" ||
typeof content === "boolean" ||
Object.keys(content).length) {
const comp = this.registeredComponentFor(type);
if (comp === null || comp === undefined) {
console.error("Custom component '" + type + "' is not defined.");
}
else {
comp.id = id + '-' + (counter++);
comp.name = name;
comp.active = this.activeComponents;
comp.disabled = this.disabledComponents;
comp.validate = this.validatingMethod;
comp.service = this.pool.registeredServiceForComponent(type);
comp.transform(source.source ? source.source : source, data, args);
if (comp.onIntoComponentChange && this.onComponentChange) {
comp.onIntoComponentChange.subscribe(this.onComponentChange);
}
this.components.push(comp);
}
}
});
}
return result;
}
registeredComponentFor(name) {
return this.pool.registeredComponent(name, this.viewRef, this.el.nativeElement);
}
initInstance(into) {
let result = this.rawContent;
if (into) {
into.split("|").map((item) => {
result = this._transform(result, item.trim().split(/:(?=(?:(?:[^"]*"){2})*[^"]*$)/), this.intoData);
});
}
if (typeof result === "string") {
const comp = this.registeredComponentFor("span");
if (comp) {
comp.transform(result, [], this.intoData);
this.components.push(comp);
}
else {
console.error("Custom component 'span' is not defined.");
}
}
else if (result instanceof Array) {
result.map((source) => {
if (typeof source === "string") {
const comp = this.registeredComponentFor("span");
if (comp) {
comp.transform(source, [], this.intoData);
this.components.push(comp);
}
else {
console.error("Custom component 'span' is not defined.");
}
}
});
}
}
ngOnInit() {
const key = this.into ? this.into : 'span';
if (typeof key === 'string') {
this.initInstance(key);
}
else {
key.map((into) => this.initInstance(into));
}
}
}
IntoDirective.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: IntoDirective, deps: [{ token: i0.ViewContainerRef }, { token: i0.ElementRef }, { token: i1.ComponentPool }], target: i0.ɵɵFactoryTarget.Directive });
IntoDirective.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "15.2.10", type: IntoDirective, selector: "[into]", inputs: { rawContent: "rawContent", intoId: "intoId", intoName: "intoName", intoData: "intoData", disabled: "disabled", active: "active", validate: "validate", into: "into", onComponentChange: "onComponentChange" }, ngImport: i0 });
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: IntoDirective, decorators: [{
type: Directive,
args: [{
selector: '[into]'
}]
}], ctorParameters: function () { return [{ type: i0.ViewContainerRef }, { type: i0.ElementRef }, { type: i1.ComponentPool }]; }, propDecorators: { rawContent: [{
type: Input,
args: ["rawContent"]
}], intoId: [{
type: Input,
args: ["intoId"]
}], intoName: [{
type: Input,
args: ["intoName"]
}], intoData: [{
type: Input,
args: ["intoData"]
}], disabled: [{
type: Input,
args: ["disabled"]
}], active: [{
type: Input,
args: ["active"]
}], validate: [{
type: Input,
args: ["validate"]
}], into: [{
type: Input,
args: ["into"]
}], onComponentChange: [{
type: Input,
args: ["onComponentChange"]
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW50by5kaXJlY3RpdmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9pbnRvLXBpcGVzL3NyYy9saWIvY29tbW9uL2ludG8uZGlyZWN0aXZlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDSCxTQUFTLEVBR1QsS0FBSyxFQUVSLE1BQU0sZUFBZSxDQUFDOzs7QUFRdkIsTUFBTSxPQUFPLGFBQWE7SUFrQnRCLElBQ0ksUUFBUSxDQUFDLEtBQWM7UUFDdkIsSUFBSSxDQUFDLGtCQUFrQixHQUFHLEtBQUssQ0FBQztRQUNoQyxJQUFJLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQU0sRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLFFBQVEsR0FBRyxLQUFLLENBQUMsQ0FBQztJQUN4RCxDQUFDO0lBRUQsSUFDSSxNQUFNLENBQUMsS0FBYztRQUNyQixJQUFJLENBQUMsZ0JBQWdCLEdBQUcsS0FBSyxDQUFDO1FBQzlCLElBQUksQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBTSxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsTUFBTSxHQUFHLEtBQUssQ0FBQyxDQUFDO0lBQ3RELENBQUM7SUFFRCxJQUNJLFFBQVEsQ0FBQyxLQUFVO1FBQ25CLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxLQUFLLENBQUM7UUFDOUIsSUFBSSxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFNLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxRQUFRLEdBQUcsS0FBSyxDQUFDLENBQUM7SUFDeEQsQ0FBQztJQVFELFlBQ1ksT0FBeUIsRUFDMUIsRUFBYSxFQUNaLElBQW1CO1FBRm5CLFlBQU8sR0FBUCxPQUFPLENBQWtCO1FBQzFCLE9BQUUsR0FBRixFQUFFLENBQVc7UUFDWixTQUFJLEdBQUosSUFBSSxDQUFlO1FBNUN2QixlQUFVLEdBQVEsRUFBRSxDQUFDO1FBQ3JCLHVCQUFrQixHQUFHLEtBQUssQ0FBQztRQUMzQixxQkFBZ0IsR0FBRyxJQUFJLENBQUM7UUFDeEIscUJBQWdCLEdBQUcsQ0FBQyxJQUFTLEVBQUUsS0FBVSxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUM7UUFvQzNELHNCQUFpQixHQUFHLENBQUMsS0FBVSxFQUFFLEVBQUUsR0FBRSxDQUFDLENBQUM7SUFPdkMsQ0FBQztJQUVPLEtBQUssQ0FBQyxJQUFTO1FBQ25CLE9BQU8sSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDLEtBQUssQ0FBQyx5REFBeUQsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQU0sRUFBQyxFQUFFLENBQUEsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQ3BILENBQUM7SUFFTyxVQUFVLENBQUMsT0FBWSxFQUFFLElBQWMsRUFBRSxJQUFTO1FBQ3RELElBQUksTUFBTSxHQUFHLE9BQU8sQ0FBQztRQUVyQixJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsK0JBQStCLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUU7WUFDcEQsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBQzNDLE1BQU0sR0FBRyxJQUFJLENBQUMsa0JBQWtCLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLE9BQU8sRUFBRSxJQUFJLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxRQUFRLEVBQUUsSUFBSSxFQUFFLEdBQUcsT0FBTyxDQUFDLENBQUM7U0FDcEc7YUFBTSxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsb0NBQW9DLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUU7WUFDaEUsTUFBTSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsNEJBQTRCLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUM7U0FDN0c7YUFBTTtZQUNILG9CQUFvQjtZQUNwQixJQUFJO2dCQUNBLE1BQU0sR0FBRyxJQUFJLENBQUMsa0JBQWtCLENBQzVCLElBQUksQ0FBQyxDQUFDLENBQUMsRUFDUCxPQUFPLEVBQ1AsSUFBSSxDQUFDLE1BQU0sRUFDWCxJQUFJLENBQUMsUUFBUSxFQUNiLElBQUksRUFDSixJQUFJLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQzlCLElBQUksQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFDOUIsSUFBSSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUM5QixJQUFJLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQzlCLElBQUksQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO2FBQ3ZDO1lBQUEsT0FBTSxDQUFDLEVBQUU7Z0JBQ04sT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQzthQUNwQjtTQUNKO1FBQ0QsT0FBTyxNQUFNLENBQUM7SUFDbEIsQ0FBQztJQUVPLGtCQUFrQixDQUFDLElBQVMsRUFBRSxPQUFZLEVBQUUsRUFBVSxFQUFFLElBQVksRUFBRSxJQUFTLEVBQUMsR0FBRyxJQUFXO1FBQ2xHLElBQUksTUFBTSxHQUFHLE9BQU8sQ0FBQztRQUNyQixJQUFJLE9BQU8sS0FBSyxTQUFTLEVBQUU7WUFDdkIsT0FBTyxFQUFFLENBQUM7U0FDYjtRQUNELElBQUksT0FBTyxZQUFZLElBQUk7WUFDdkIsT0FBTyxPQUFPLEtBQUssUUFBUTtZQUMzQixPQUFPLE9BQU8sS0FBSyxRQUFRO1lBQzNCLE9BQU8sT0FBTyxLQUFLLFNBQVM7WUFDNUIsTUFBTSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxNQUFNLEVBQUU7WUFDN0IsTUFBTSxHQUFJLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUM1QyxJQUFJLE1BQU0sS0FBSyxJQUFJLElBQUksTUFBTSxLQUFLLFNBQVMsRUFBRTtnQkFDekMsT0FBTyxDQUFDLEtBQUssQ0FBQyxvQkFBb0IsR0FBRyxJQUFJLEdBQUUsbUJBQW1CLENBQUMsQ0FBQztnQkFDaEUsTUFBTSxHQUFHLE9BQU8sQ0FBQzthQUNwQjtpQkFBTTtnQkFDSCxNQUFNLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQztnQkFDZixNQUFNLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQztnQkFDbkIsTUFBTSxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUM7Z0JBQ3RDLE1BQU0sQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDLGtCQUFrQixDQUFDO2dCQUMxQyxNQUFNLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQztnQkFDeEMsTUFBTSxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLDZCQUE2QixDQUFDLElBQUksQ0FBQyxDQUFDO2dCQUMvRCxNQUFNLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLE9BQU8sRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDLENBQUM7Z0JBQ3hFLElBQUksTUFBTSxDQUFDLHFCQUFxQixJQUFJLElBQUksQ0FBQyxpQkFBaUIsRUFBRTtvQkFDeEQsTUFBTSxDQUFDLHFCQUFxQixDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsQ0FBQztpQkFDbEU7Z0JBQ0QsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7YUFDaEM7U0FDSjthQUFNLElBQUksT0FBTyxZQUFZLEtBQUssRUFBRTtZQUNqQyxJQUFJLE9BQU8sR0FBRyxDQUFDLENBQUM7WUFDaEIsTUFBTSxHQUFHLE9BQU8sQ0FBQztZQUNqQixPQUFPLENBQUMsR0FBRyxDQUFDLENBQUMsTUFBTSxFQUFFLEVBQUU7Z0JBQ25CLElBQUksT0FBTyxNQUFNLEtBQUssUUFBUTtvQkFDMUIsT0FBTyxPQUFPLEtBQUssUUFBUTtvQkFDM0IsT0FBTyxPQUFPLEtBQUssU0FBUztvQkFDNUIsTUFBTSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxNQUFNLEVBQUU7b0JBRTdCLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxJQUFJLENBQUMsQ0FBQztvQkFDL0MsSUFBSSxJQUFJLEtBQUssSUFBSSxJQUFJLElBQUksS0FBSyxTQUFTLEVBQUU7d0JBQ3JDLE9BQU8sQ0FBQyxLQUFLLENBQUMsb0JBQW9CLEdBQUcsSUFBSSxHQUFFLG1CQUFtQixDQUFDLENBQUM7cUJBQ25FO3lCQUFNO3dCQUNILElBQUksQ0FBQyxFQUFFLEdBQUcsRUFBRSxHQUFHLEdBQUcsR0FBRyxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUM7d0JBQ2pDLElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDO3dCQUNqQixJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQzt3QkFDcEMsSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUMsa0JBQWtCLENBQUM7d0JBQ3hDLElBQUksQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDO3dCQUN0QyxJQUFJLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsNkJBQTZCLENBQUMsSUFBSSxDQUFDLENBQUM7d0JBQzdELElBQUksQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsTUFBTSxFQUFFLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQzt3QkFDbkUsSUFBSSxJQUFJLENBQUMscUJBQXFCLElBQUksSUFBSSxDQUFDLGlCQUFpQixFQUFFOzRCQUN0RCxJQUFJLENBQUMscUJBQXFCLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO3lCQUNoRTt3QkFDRCxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztxQkFDOUI7aUJBQ0o7WUFDTCxDQUFDLENBQUMsQ0FBQztTQUNOO1FBQ0QsT0FBTyxNQUFNLENBQUM7SUFFbEIsQ0FBQztJQUVPLHNCQUFzQixDQUFDLElBQVk7UUFDdkMsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxFQUFFLENBQUMsYUFBYSxDQUFDLENBQUM7SUFDcEYsQ0FBQztJQUNPLFlBQVksQ0FBQyxJQUFZO1FBQzdCLElBQUksTUFBTSxHQUFTLElBQUksQ0FBQyxVQUFVLENBQUM7UUFDbkMsSUFBSSxJQUFJLEVBQUU7WUFDTixJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBRSxDQUFDLElBQUksRUFBRSxFQUFFO2dCQUMxQixNQUFNLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDLEtBQUssQ0FBQywrQkFBK0IsQ0FBQyxFQUFFLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztZQUN4RyxDQUFDLENBQUMsQ0FBQztTQUNOO1FBQ0QsSUFBSSxPQUFPLE1BQU0sS0FBSyxRQUFRLEVBQUU7WUFDNUIsTUFBTSxJQUFJLEdBQTJCLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUN6RSxJQUFJLElBQUksRUFBRztnQkFDUCxJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sRUFBRSxFQUFFLEVBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO2dCQUMxQyxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQzthQUM5QjtpQkFBTTtnQkFDSCxPQUFPLENBQUMsS0FBSyxDQUFDLHlDQUF5QyxDQUFDLENBQUM7YUFDNUQ7U0FDSjthQUFNLElBQUksTUFBTSxZQUFZLEtBQUssRUFBRTtZQUNoQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsTUFBTSxFQUFFLEVBQUU7Z0JBQ2xCLElBQUksT0FBTyxNQUFNLEtBQUssUUFBUSxFQUFFO29CQUM1QixNQUFNLElBQUksR0FBMkIsSUFBSSxDQUFDLHNCQUFzQixDQUFDLE1BQU0sQ0FBQyxDQUFDO29CQUN6RSxJQUFJLElBQUksRUFBRzt3QkFDUCxJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sRUFBRSxFQUFFLEVBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO3dCQUMxQyxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztxQkFDOUI7eUJBQU07d0JBQ0gsT0FBTyxDQUFDLEtBQUssQ0FBQyx5Q0FBeUMsQ0FBQyxDQUFDO3FCQUM1RDtpQkFDSjtZQUNMLENBQUMsQ0FBQyxDQUFDO1NBQ047SUFDTCxDQUFDO0lBRUosUUFBUTtRQUNELE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQztRQUMzQyxJQUFJLE9BQU8sR0FBRyxLQUFLLFFBQVEsRUFBRTtZQUN6QixJQUFJLENBQUMsWUFBWSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1NBQzFCO2FBQU07WUFDSCxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBWSxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7U0FDdEQ7SUFDTCxDQUFDOzsyR0FyTFEsYUFBYTsrRkFBYixhQUFhOzRGQUFiLGFBQWE7a0JBSHpCLFNBQVM7bUJBQUM7b0JBQ1AsUUFBUSxFQUFFLFFBQVE7aUJBQ3JCOzRKQVFHLFVBQVU7c0JBRFQsS0FBSzt1QkFBQyxZQUFZO2dCQUluQixNQUFNO3NCQURMLEtBQUs7dUJBQUMsUUFBUTtnQkFJZixRQUFRO3NCQURQLEtBQUs7dUJBQUMsVUFBVTtnQkFJakIsUUFBUTtzQkFEUCxLQUFLO3VCQUFDLFVBQVU7Z0JBSWIsUUFBUTtzQkFEWCxLQUFLO3VCQUFDLFVBQVU7Z0JBT2IsTUFBTTtzQkFEVCxLQUFLO3VCQUFDLFFBQVE7Z0JBT1gsUUFBUTtzQkFEWCxLQUFLO3VCQUFDLFVBQVU7Z0JBT2pCLElBQUk7c0JBREgsS0FBSzt1QkFBQyxNQUFNO2dCQUliLGlCQUFpQjtzQkFEaEIsS0FBSzt1QkFBQyxtQkFBbUIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xyXG4gICAgRGlyZWN0aXZlLFxyXG4gICAgVmlld0NvbnRhaW5lclJlZixcclxuICAgIEVsZW1lbnRSZWYsXHJcbiAgICBJbnB1dCxcclxuICAgIE9uSW5pdFxyXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5cclxuaW1wb3J0IHsgUGlwZUNvbXBvbmVudEludGVyZmFjZSB9IGZyb20gJy4vcGlwZS5jb21wb25lbnQuaW50ZXJmYWNlJztcclxuaW1wb3J0IHsgQ29tcG9uZW50UG9vbCB9IGZyb20gJy4vY29tcG9uZW50LnBvb2wnO1xyXG5cclxuQERpcmVjdGl2ZSh7XHJcbiAgICBzZWxlY3RvcjogJ1tpbnRvXSdcclxufSlcclxuZXhwb3J0IGNsYXNzIEludG9EaXJlY3RpdmUgaW1wbGVtZW50cyBPbkluaXQge1xyXG4gICAgcHJpdmF0ZSBjb21wb25lbnRzOiBhbnkgPSBbXTtcclxuICAgIHByaXZhdGUgZGlzYWJsZWRDb21wb25lbnRzID0gZmFsc2U7XHJcbiAgICBwcml2YXRlIGFjdGl2ZUNvbXBvbmVudHMgPSB0cnVlO1xyXG4gICAgcHJpdmF0ZSB2YWxpZGF0aW5nTWV0aG9kID0gKGl0ZW06IGFueSwgdmFsdWU6IGFueSkgPT4gdHJ1ZTtcclxuICAgIFxyXG4gICAgQElucHV0KFwicmF3Q29udGVudFwiKVxyXG4gICAgcmF3Q29udGVudCE6IGFueTtcclxuICAgIFxyXG4gICAgQElucHV0KFwiaW50b0lkXCIpXHJcbiAgICBpbnRvSWQhOiBhbnk7XHJcbiAgICBcclxuICAgIEBJbnB1dChcImludG9OYW1lXCIpXHJcbiAgICBpbnRvTmFtZSE6IGFueTtcclxuICAgIFxyXG4gICAgQElucHV0KFwiaW50b0RhdGFcIilcclxuICAgIGludG9EYXRhOiBhbnk7XHJcblxyXG4gICAgQElucHV0KFwiZGlzYWJsZWRcIilcclxuICAgIHNldCBkaXNhYmxlZCh2YWx1ZTogYm9vbGVhbil7XHJcbiAgICAgICAgdGhpcy5kaXNhYmxlZENvbXBvbmVudHMgPSB2YWx1ZTtcclxuICAgICAgICB0aGlzLmNvbXBvbmVudHMubWFwKChjOiBhbnkpID0+IGMuZGlzYWJsZWQgPSB2YWx1ZSk7XHJcbiAgICB9XHJcbiAgICBcclxuICAgIEBJbnB1dChcImFjdGl2ZVwiKVxyXG4gICAgc2V0IGFjdGl2ZSh2YWx1ZTogYm9vbGVhbil7XHJcbiAgICAgICAgdGhpcy5hY3RpdmVDb21wb25lbnRzID0gdmFsdWU7XHJcbiAgICAgICAgdGhpcy5jb21wb25lbnRzLm1hcCgoYzogYW55KSA9PiBjLmFjdGl2ZSA9IHZhbHVlKTtcclxuICAgIH1cclxuICAgIFxyXG4gICAgQElucHV0KFwidmFsaWRhdGVcIilcclxuICAgIHNldCB2YWxpZGF0ZSh2YWx1ZTogYW55KXtcclxuICAgICAgICB0aGlzLnZhbGlkYXRpbmdNZXRob2QgPSB2YWx1ZTtcclxuICAgICAgICB0aGlzLmNvbXBvbmVudHMubWFwKChjOiBhbnkpID0+IGMudmFsaWRhdGUgPSB2YWx1ZSk7XHJcbiAgICB9XHJcbiAgICBcclxuICAgIEBJbnB1dChcImludG9cIilcclxuICAgIGludG8hOiBzdHJpbmcgfCBzdHJpbmdbXSB8IHVuZGVmaW5lZDtcclxuXHJcbiAgICBASW5wdXQoXCJvbkNvbXBvbmVudENoYW5nZVwiKVxyXG4gICAgb25Db21wb25lbnRDaGFuZ2UgPSAoZXZlbnQ6IGFueSkgPT4ge307XHJcblxyXG4gICAgY29uc3RydWN0b3IoXHJcbiAgICAgICAgcHJpdmF0ZSB2aWV3UmVmOiBWaWV3Q29udGFpbmVyUmVmLFxyXG4gICAgICAgIHB1YmxpYyBlbDpFbGVtZW50UmVmLFxyXG4gICAgICAgIHByaXZhdGUgcG9vbDogQ29tcG9uZW50UG9vbFxyXG4gICAgKSB7XHJcbiAgICB9XHJcbiAgICBcclxuICAgIHByaXZhdGUgc3BsaXQoaXRlbTogYW55KSB7XHJcbiAgICAgICAgcmV0dXJuIGl0ZW0udHJpbSgpLm1hdGNoKC8oPz1cXFMpW15cIlxcOl0qKD86XCJbXlxcXFxcIl0qKD86XFxcXFtcXDpcXFNdW15cXFxcXCJdKikqXCJbXlwiXFw6XSopKi9nKT8uZmlsdGVyKCh4OiBhbnkpPT54Lmxlbmd0aCk7XHJcbiAgICB9XHJcbiAgICBcclxuICAgIHByaXZhdGUgX3RyYW5zZm9ybShjb250ZW50OiBhbnksIGFyZ3M6IHN0cmluZ1tdLCBkYXRhOiBhbnkpIHtcclxuICAgICAgICBsZXQgcmVzdWx0ID0gY29udGVudDtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMucG9vbC5yZWdpc3RlcmVkRm9yQ29tcG9uZW50V2l0aE5hbWVkKGFyZ3NbMF0pKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IG5ld0FyZ3MgPSBhcmdzLnNwbGljZSgxLGFyZ3MubGVuZ3RoKTtcclxuICAgICAgICAgICAgcmVzdWx0ID0gdGhpcy50cmFuc2Zvcm1Db21wb25lbnQoYXJnc1swXSwgY29udGVudCwgdGhpcy5pbnRvSWQsIHRoaXMuaW50b05hbWUsIGRhdGEsIC4uLm5ld0FyZ3MpOyBcclxuICAgICAgICB9IGVsc2UgaWYgKHRoaXMucG9vbC5yZWdpc3RlcmVkRm9yUGlwZVRyYW5zZm9ybWF0aW9uTmFtZWQoYXJnc1swXSkpIHtcclxuICAgICAgICAgICAgcmVzdWx0ID0gdGhpcy5wb29sLnJlZ2lzdGVyZWRQaXBlVHJhbnNmb3JtYXRpb24oYXJnc1swXSwgY29udGVudCwgYXJncywgdGhpcy5fdHJhbnNmb3JtLmJpbmQodGhpcyksIGRhdGEpOyBcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAvLyB1bmtub3duIGZvcm1hdHRlclxyXG4gICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgcmVzdWx0ID0gdGhpcy50cmFuc2Zvcm1Db21wb25lbnQoXHJcbiAgICAgICAgICAgICAgICAgICAgYXJnc1swXSwgXHJcbiAgICAgICAgICAgICAgICAgICAgY29udGVudCwgXHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5pbnRvSWQsIFxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaW50b05hbWUsIFxyXG4gICAgICAgICAgICAgICAgICAgIGRhdGEsIFxyXG4gICAgICAgICAgICAgICAgICAgIGFyZ3MubGVuZ3RoID4gMSA/IGFyZ3NbMV0gOiBcIlwiLCBcclxuICAgICAgICAgICAgICAgICAgICBhcmdzLmxlbmd0aCA+IDIgPyBhcmdzWzJdIDogXCJcIiwgXHJcbiAgICAgICAgICAgICAgICAgICAgYXJncy5sZW5ndGggPiAzID8gYXJnc1szXSA6IFwiXCIsIFxyXG4gICAgICAgICAgICAgICAgICAgIGFyZ3MubGVuZ3RoID4gNCA/IGFyZ3NbNF0gOiBcIlwiLCBcclxuICAgICAgICAgICAgICAgICAgICBhcmdzLmxlbmd0aCA+IDUgPyBhcmdzWzVdIDogXCJcIik7XHJcbiAgICAgICAgICAgIH1jYXRjaCh4KSB7XHJcbiAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKHgpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiByZXN1bHQ7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSB0cmFuc2Zvcm1Db21wb25lbnQodHlwZTogYW55LCBjb250ZW50OiBhbnksIGlkOiBzdHJpbmcsIG5hbWU6IHN0cmluZywgZGF0YTogYW55LC4uLmFyZ3M6IGFueVtdKTogYW55IHtcclxuICAgICAgICBsZXQgcmVzdWx0ID0gY29udGVudDtcclxuICAgICAgICBpZiAoY29udGVudCA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBcIlwiO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoY29udGVudCBpbnN0YW5jZW9mIERhdGUgfHwgXHJcbiAgICAgICAgICAgIHR5cGVvZiBjb250ZW50ID09PSBcInN0cmluZ1wiIHx8IFxyXG4gICAgICAgICAgICB0eXBlb2YgY29udGVudCA9PT0gXCJudW1iZXJcIiB8fCBcclxuICAgICAgICAgICAgdHlwZW9mIGNvbnRlbnQgPT09IFwiYm9vbGVhblwiIHx8IFxyXG4gICAgICAgICAgICBPYmplY3Qua2V5cyhjb250ZW50KS5sZW5ndGgpIHtcclxuICAgICAgICAgICAgcmVzdWx0ID0gIHRoaXMucmVnaXN0ZXJlZENvbXBvbmVudEZvcih0eXBlKTtcclxuICAgICAgICAgICAgaWYgKHJlc3VsdCA9PT0gbnVsbCB8fCByZXN1bHQgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihcIkN1c3RvbSBjb21wb25lbnQgJ1wiICsgdHlwZSsgXCInIGlzIG5vdCBkZWZpbmVkLlwiKTtcclxuICAgICAgICAgICAgICAgIHJlc3VsdCA9IGNvbnRlbnQ7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICByZXN1bHQuaWQgPSBpZDtcclxuICAgICAgICAgICAgICAgIHJlc3VsdC5uYW1lID0gbmFtZTtcclxuICAgICAgICAgICAgICAgIHJlc3VsdC5hY3RpdmUgPSB0aGlzLmFjdGl2ZUNvbXBvbmVudHM7XHJcbiAgICAgICAgICAgICAgICByZXN1bHQuZGlzYWJsZWQgPSB0aGlzLmRpc2FibGVkQ29tcG9uZW50cztcclxuICAgICAgICAgICAgICAgIHJlc3VsdC52YWxpZGF0ZSA9IHRoaXMudmFsaWRhdGluZ01ldGhvZDtcclxuICAgICAgICAgICAgICAgIHJlc3VsdC5zZXJ2aWNlID0gdGhpcy5wb29sLnJlZ2lzdGVyZWRTZXJ2aWNlRm9yQ29tcG9uZW50KHR5cGUpO1xyXG4gICAgICAgICAgICAgICAgcmVzdWx0LnRyYW5zZm9ybShjb250ZW50LnNvdXJjZSA/IGNvbnRlbnQuc291cmNlIDogY29udGVudCwgZGF0YSwgYXJncyk7XHJcbiAgICAgICAgICAgICAgICBpZiAocmVzdWx0Lm9uSW50b0NvbXBvbmVudENoYW5nZSAmJiB0aGlzLm9uQ29tcG9uZW50Q2hhbmdlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0Lm9uSW50b0NvbXBvbmVudENoYW5nZS5zdWJzY3JpYmUodGhpcy5vbkNvbXBvbmVudENoYW5nZSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB0aGlzLmNvbXBvbmVudHMucHVzaChyZXN1bHQpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSBlbHNlIGlmIChjb250ZW50IGluc3RhbmNlb2YgQXJyYXkpIHtcclxuICAgICAgICAgICAgbGV0IGNvdW50ZXIgPSAwO1xyXG4gICAgICAgICAgICByZXN1bHQgPSBjb250ZW50O1xyXG4gICAgICAgICAgICBjb250ZW50Lm1hcCgoc291cmNlKSA9PiB7XHJcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHNvdXJjZSA9PT0gXCJzdHJpbmdcIiB8fCBcclxuICAgICAgICAgICAgICAgICAgICB0eXBlb2YgY29udGVudCA9PT0gXCJudW1iZXJcIiB8fCBcclxuICAgICAgICAgICAgICAgICAgICB0eXBlb2YgY29udGVudCA9PT0gXCJib29sZWFuXCIgfHwgXHJcbiAgICAgICAgICAgICAgICAgICAgT2JqZWN0LmtleXMoY29udGVudCkubGVuZ3RoKSB7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGNvbXAgPSB0aGlzLnJlZ2lzdGVyZWRDb21wb25lbnRGb3IodHlwZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGNvbXAgPT09IG51bGwgfHwgY29tcCA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXCJDdXN0b20gY29tcG9uZW50ICdcIiArIHR5cGUrIFwiJyBpcyBub3QgZGVmaW5lZC5cIik7XHJcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29tcC5pZCA9IGlkICsgJy0nICsgKGNvdW50ZXIrKyk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbXAubmFtZSA9IG5hbWU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbXAuYWN0aXZlID0gdGhpcy5hY3RpdmVDb21wb25lbnRzO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb21wLmRpc2FibGVkID0gdGhpcy5kaXNhYmxlZENvbXBvbmVudHM7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbXAudmFsaWRhdGUgPSB0aGlzLnZhbGlkYXRpbmdNZXRob2Q7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbXAuc2VydmljZSA9IHRoaXMucG9vbC5yZWdpc3RlcmVkU2VydmljZUZvckNvbXBvbmVudCh0eXBlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29tcC50cmFuc2Zvcm0oc291cmNlLnNvdXJjZSA/IHNvdXJjZS5zb3VyY2UgOiBzb3VyY2UsIGRhdGEsIGFyZ3MpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29tcC5vbkludG9Db21wb25lbnRDaGFuZ2UgJiYgdGhpcy5vbkNvbXBvbmVudENoYW5nZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcC5vbkludG9Db21wb25lbnRDaGFuZ2Uuc3Vic2NyaWJlKHRoaXMub25Db21wb25lbnRDaGFuZ2UpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY29tcG9uZW50cy5wdXNoKGNvbXApO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSk7ICAgICAgICBcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcclxuXHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSByZWdpc3RlcmVkQ29tcG9uZW50Rm9yKG5hbWU6IHN0cmluZyk6IFBpcGVDb21wb25lbnRJbnRlcmZhY2Uge1xyXG4gICAgICAgIHJldHVybiB0aGlzLnBvb2wucmVnaXN0ZXJlZENvbXBvbmVudChuYW1lLCB0aGlzLnZpZXdSZWYsIHRoaXMuZWwubmF0aXZlRWxlbWVudCk7XHJcbiAgICB9XHJcbiAgICBwcml2YXRlIGluaXRJbnN0YW5jZShpbnRvOiBzdHJpbmcpIHtcclxuICAgICAgICBsZXQgcmVzdWx0OiBhbnkgPSAgdGhpcy5yYXdDb250ZW50O1xyXG4gICAgICAgIGlmIChpbnRvKSB7XHJcbiAgICAgICAgICAgIGludG8uc3BsaXQoXCJ8XCIpLm1hcCggKGl0ZW0pID0+IHtcclxuICAgICAgICAgICAgICAgIHJlc3VsdCA9IHRoaXMuX3RyYW5zZm9ybShyZXN1bHQsIGl0ZW0udHJpbSgpLnNwbGl0KC86KD89KD86KD86W15cIl0qXCIpezJ9KSpbXlwiXSokKS8pLCB0aGlzLmludG9EYXRhKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICh0eXBlb2YgcmVzdWx0ID09PSBcInN0cmluZ1wiKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGNvbXA6IFBpcGVDb21wb25lbnRJbnRlcmZhY2UgPSB0aGlzLnJlZ2lzdGVyZWRDb21wb25lbnRGb3IoXCJzcGFuXCIpO1xyXG4gICAgICAgICAgICBpZiAoY29tcCkgIHtcclxuICAgICAgICAgICAgICAgIGNvbXAudHJhbnNmb3JtKHJlc3VsdCwgW10sIHRoaXMuaW50b0RhdGEpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5jb21wb25lbnRzLnB1c2goY29tcCk7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKFwiQ3VzdG9tIGNvbXBvbmVudCAnc3BhbicgaXMgbm90IGRlZmluZWQuXCIpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSBlbHNlIGlmIChyZXN1bHQgaW5zdGFuY2VvZiBBcnJheSkge1xyXG4gICAgICAgICAgICByZXN1bHQubWFwKChzb3VyY2UpID0+IHtcclxuICAgICAgICAgICAgICAgIGlmICh0eXBlb2Ygc291cmNlID09PSBcInN0cmluZ1wiKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgY29tcDogUGlwZUNvbXBvbmVudEludGVyZmFjZSA9IHRoaXMucmVnaXN0ZXJlZENvbXBvbmVudEZvcihcInNwYW5cIik7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGNvbXApICB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbXAudHJhbnNmb3JtKHNvdXJjZSwgW10sIHRoaXMuaW50b0RhdGEpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbXBvbmVudHMucHVzaChjb21wKTtcclxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKFwiQ3VzdG9tIGNvbXBvbmVudCAnc3BhbicgaXMgbm90IGRlZmluZWQuXCIpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgXHJcblx0bmdPbkluaXQoKSB7XHJcbiAgICAgICAgY29uc3Qga2V5ID0gdGhpcy5pbnRvID8gdGhpcy5pbnRvIDogJ3NwYW4nO1xyXG4gICAgICAgIGlmICh0eXBlb2Yga2V5ID09PSAnc3RyaW5nJykge1xyXG4gICAgICAgICAgICB0aGlzLmluaXRJbnN0YW5jZShrZXkpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGtleS5tYXAoKGludG86IHN0cmluZykgPT4gdGhpcy5pbml0SW5zdGFuY2UoaW50bykpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxufVxyXG4iXX0=