ack-angular
Version:
Extra special directives, components, providers and pipes to aide in tackling everyday interface development needs in Angular2
71 lines • 19.6 kB
JavaScript
import { Output, EventEmitter, Input, ContentChildren, ContentChild, Directive, Component } from "@angular/core";
import * as i0 from "@angular/core";
import * as i1 from "@angular/common";
import * as i2 from "../../directives/VarDirective.directive";
import * as i3 from "../AbsoluteOverflowX.component";
export class DebugItem {
constructor() {
this.save = new EventEmitter();
}
}
DebugItem.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.2.4", ngImport: i0, type: DebugItem, deps: [], target: i0.ɵɵFactoryTarget.Directive });
DebugItem.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "14.2.4", type: DebugItem, selector: "debug-item", inputs: { name: "name", value: "value", type: "type" }, outputs: { save: "save" }, queries: [{ propertyName: "rowTitle", first: true, predicate: ["rowTitle"], descendants: true }], ngImport: i0 });
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.4", ngImport: i0, type: DebugItem, decorators: [{
type: Directive,
args: [{
selector: "debug-item"
}]
}], propDecorators: { name: [{
type: Input
}], value: [{
type: Input
}], type: [{
type: Input
}], rowTitle: [{
type: ContentChild,
args: ["rowTitle"]
}], save: [{
type: Output
}] } });
export class DebugArea {
constructor() {
this.editsMap = {}; //map of debug edits
}
ngAfterViewInit() {
if (this.DebugItems.length === 1) {
Promise.resolve().then(() => this.debugItem = this.DebugItems.first);
}
}
//update data from debug area
updateDataByJsonString(item, string, debugItem) {
try {
const json = JSON.parse(string);
for (let x in item)
delete item[x];
Object.assign(item, json);
//this.arrayChange.emit(this.array)
debugItem.save.emit(item);
}
catch (e) {
console.error('invalid json string');
}
}
apply(item, json, debugItem) {
const ob = JSON.parse(json);
Object.assign(item, ob);
debugItem.save.emit(item);
}
}
DebugArea.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.2.4", ngImport: i0, type: DebugArea, deps: [], target: i0.ɵɵFactoryTarget.Component });
DebugArea.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.2.4", type: DebugArea, selector: "debug-area", queries: [{ propertyName: "DebugItems", predicate: DebugItem }], ngImport: i0, template: "<div class=\"child-pad-h-xs flex-wrap text-center\" *ngIf=\"DebugItems.length > 1\">\n <a\n class=\"cursor-pointer border border-grey-3x radius-5 flex-1\"\n *ngFor=\"let item of DebugItems\"\n [ngClass]=\"item===debugItem ? 'bg-positive text-white' : ''\"\n (click)=\"debugItem = debugItem===item ? null : item\"\n >\n {{item.name}}\n <ng-container *ngIf=\"item.type==='array'\">\n ( {{ item.value?.length || 0 }} )\n </ng-container>\n </a>\n</div>\n<ng-container *ngIf=\"debugItem\">\n <h3 class=\"margin-bottom-0\">{{ debugItem.name }}</h3>\n <ng-container *ngIf=\"debugItem.type==='array';else regdebug\">\n <ng-container #loop=\"var\" [var]=\"{view:0}\"></ng-container>\n <pre\n class=\"bg-grey-3x margin-0 sample-code\"\n *ngFor=\"let data of debugItem.value;let ii=index\"\n >\n <ng-container *ngIf=\"loop.var.view==ii\">\n <div class=\"flex-valign-center child-pad-xs\" style=\"padding:.4em;float:right\">\n <a class=\"fas fa-caret-square-left hover-bg-energized\" (click)=\"loop.var.view=ii===0 ? debugItem.value.length-1 : ii-1\"\n ><</a>\n <a style=\"color:blue;\" (click)=\"editsMap[ii]=!editsMap[ii]\">edit</a>\n <a style=\"color:blue;\" (click)=\"debugItem.type=null\">all</a>\n <a class=\"fas fa-caret-square-right hover-bg-energized\"\n (click)=\"loop.var.view=ii===debugItem.value.length-1 ? 0 : ii+1\"\n >></a>\n </div>\n <p>\n <ng-container *ngIf=\"debugItem.rowTitle;else defaultRowLabel\">\n <ng-template *ngTemplateOutlet=\"debugItem.rowTitle;context:{index:ii}\"></ng-template>\n </ng-container>\n <ng-template #defaultRowLabel=\"\">\n <strong>Result {{ii}} of {{debugItem.value.length}} </strong>\n </ng-template>\n </p>\n <absolute-overflow-x *ngIf=\"!editsMap[ii]\" style=\"font-size:0.8em;\"\n ><pre>{{ data | json }}</pre></absolute-overflow-x>\n <ng-container *ngIf=\"editsMap[ii]\">\n <textarea [name]=\"'editsMap' + ii\" style=\"width:100%;height:300px\"\n (change)=\"dataString = $any($event.target).value\"\n >{{ data | json }}</textarea>\n <div style=\"text-align:center\">\n <a style=\"color:blue;padding-top:.4em;\"\n (click)=\"updateDataByJsonString(data, dataString, debugItem);editsMap[ii]=false\"\n >save</a>\n </div>\n </ng-container>\n </ng-container>\n </pre>\n </ng-container>\n <ng-template #regdebug=\"\">\n <div class=\"pos-rel\">\n <div class=\"pos-abs right-0 z-index-10\">\n <div class=\"pad-xxs\">\n <i class=\"fas fa-pencil-alt hover-text-energized\"\n (click)=\"edit=!edit\"\n [class.text-calm]=\"edit\"\n >edit</i>\n </div>\n </div>\n </div>\n <ng-container *ngIf=\"edit;else readMode\">\n <textarea\n class=\"width-full\"\n rows=\"30\"\n (change)=\"apply(debugItem.value, $any($event.target).value, debugItem)\"\n wrap=\"off\"\n >{{ debugItem.value | json }}</textarea>\n </ng-container>\n <ng-template #readMode=\"\">\n <absolute-overflow-x>\n <pre class=\"code-sample\">{{ debugItem.value | json }}</pre>\n </absolute-overflow-x>\n </ng-template>\n </ng-template>\n</ng-container>\n", dependencies: [{ kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i2.VarDirective, selector: "[var]", inputs: ["var"], outputs: ["changed"], exportAs: ["var"] }, { kind: "component", type: i3.AbsoluteOverflowX, selector: "absolute-overflow-x", inputs: ["scrollBars", "wrapClass", "active", "overflow"] }, { kind: "pipe", type: i1.JsonPipe, name: "json" }] });
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.4", ngImport: i0, type: DebugArea, decorators: [{
type: Component,
args: [{ selector: "debug-area", template: "<div class=\"child-pad-h-xs flex-wrap text-center\" *ngIf=\"DebugItems.length > 1\">\n <a\n class=\"cursor-pointer border border-grey-3x radius-5 flex-1\"\n *ngFor=\"let item of DebugItems\"\n [ngClass]=\"item===debugItem ? 'bg-positive text-white' : ''\"\n (click)=\"debugItem = debugItem===item ? null : item\"\n >\n {{item.name}}\n <ng-container *ngIf=\"item.type==='array'\">\n ( {{ item.value?.length || 0 }} )\n </ng-container>\n </a>\n</div>\n<ng-container *ngIf=\"debugItem\">\n <h3 class=\"margin-bottom-0\">{{ debugItem.name }}</h3>\n <ng-container *ngIf=\"debugItem.type==='array';else regdebug\">\n <ng-container #loop=\"var\" [var]=\"{view:0}\"></ng-container>\n <pre\n class=\"bg-grey-3x margin-0 sample-code\"\n *ngFor=\"let data of debugItem.value;let ii=index\"\n >\n <ng-container *ngIf=\"loop.var.view==ii\">\n <div class=\"flex-valign-center child-pad-xs\" style=\"padding:.4em;float:right\">\n <a class=\"fas fa-caret-square-left hover-bg-energized\" (click)=\"loop.var.view=ii===0 ? debugItem.value.length-1 : ii-1\"\n ><</a>\n <a style=\"color:blue;\" (click)=\"editsMap[ii]=!editsMap[ii]\">edit</a>\n <a style=\"color:blue;\" (click)=\"debugItem.type=null\">all</a>\n <a class=\"fas fa-caret-square-right hover-bg-energized\"\n (click)=\"loop.var.view=ii===debugItem.value.length-1 ? 0 : ii+1\"\n >></a>\n </div>\n <p>\n <ng-container *ngIf=\"debugItem.rowTitle;else defaultRowLabel\">\n <ng-template *ngTemplateOutlet=\"debugItem.rowTitle;context:{index:ii}\"></ng-template>\n </ng-container>\n <ng-template #defaultRowLabel=\"\">\n <strong>Result {{ii}} of {{debugItem.value.length}} </strong>\n </ng-template>\n </p>\n <absolute-overflow-x *ngIf=\"!editsMap[ii]\" style=\"font-size:0.8em;\"\n ><pre>{{ data | json }}</pre></absolute-overflow-x>\n <ng-container *ngIf=\"editsMap[ii]\">\n <textarea [name]=\"'editsMap' + ii\" style=\"width:100%;height:300px\"\n (change)=\"dataString = $any($event.target).value\"\n >{{ data | json }}</textarea>\n <div style=\"text-align:center\">\n <a style=\"color:blue;padding-top:.4em;\"\n (click)=\"updateDataByJsonString(data, dataString, debugItem);editsMap[ii]=false\"\n >save</a>\n </div>\n </ng-container>\n </ng-container>\n </pre>\n </ng-container>\n <ng-template #regdebug=\"\">\n <div class=\"pos-rel\">\n <div class=\"pos-abs right-0 z-index-10\">\n <div class=\"pad-xxs\">\n <i class=\"fas fa-pencil-alt hover-text-energized\"\n (click)=\"edit=!edit\"\n [class.text-calm]=\"edit\"\n >edit</i>\n </div>\n </div>\n </div>\n <ng-container *ngIf=\"edit;else readMode\">\n <textarea\n class=\"width-full\"\n rows=\"30\"\n (change)=\"apply(debugItem.value, $any($event.target).value, debugItem)\"\n wrap=\"off\"\n >{{ debugItem.value | json }}</textarea>\n </ng-container>\n <ng-template #readMode=\"\">\n <absolute-overflow-x>\n <pre class=\"code-sample\">{{ debugItem.value | json }}</pre>\n </absolute-overflow-x>\n </ng-template>\n </ng-template>\n</ng-container>\n" }]
}], propDecorators: { DebugItems: [{
type: ContentChildren,
args: [DebugItem]
}] } });
export const debugDeclarations = [
DebugItem, DebugArea
];
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRGVidWdBcmVhLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9jb21wb25lbnRzL2RlYnVnLWFyZWEvRGVidWdBcmVhLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uL3NyYy9jb21wb25lbnRzL2RlYnVnLWFyZWEvZGVidWctYXJlYS50ZW1wbGF0ZS5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCxNQUFNLEVBQUUsWUFBWSxFQUNwQixLQUFLLEVBQUUsZUFBZSxFQUFFLFlBQVksRUFDcEMsU0FBUyxFQUFFLFNBQVMsRUFDckIsTUFBTSxlQUFlLENBQUE7Ozs7O0FBSW5CLE1BQU0sT0FBTyxTQUFTO0lBRnpCO1FBT1ksU0FBSSxHQUFxQixJQUFJLFlBQVksRUFBRSxDQUFBO0tBQ3REOztzR0FOZSxTQUFTOzBGQUFULFNBQVM7MkZBQVQsU0FBUztrQkFGeEIsU0FBUzttQkFBQztvQkFDVCxRQUFRLEVBQUUsWUFBWTtpQkFDdkI7OEJBQ1UsSUFBSTtzQkFBWixLQUFLO2dCQUNHLEtBQUs7c0JBQWIsS0FBSztnQkFDRyxJQUFJO3NCQUFaLEtBQUs7Z0JBQ29CLFFBQVE7c0JBQWpDLFlBQVk7dUJBQUMsVUFBVTtnQkFDZCxJQUFJO3NCQUFiLE1BQU07O0FBTU4sTUFBTSxPQUFPLFNBQVM7SUFIekI7UUFNRSxhQUFRLEdBQVMsRUFBRSxDQUFBLENBQUEsb0JBQW9CO0tBNkJ4QztJQXhCQyxlQUFlO1FBQ2IsSUFBRyxJQUFJLENBQUMsVUFBVSxDQUFDLE1BQU0sS0FBRyxDQUFDLEVBQUM7WUFDNUIsT0FBTyxDQUFDLE9BQU8sRUFBRSxDQUFDLElBQUksQ0FBQyxHQUFFLEVBQUUsQ0FBQSxJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsS0FBSyxDQUFDLENBQUE7U0FDbkU7SUFDSCxDQUFDO0lBRUQsNkJBQTZCO0lBQzdCLHNCQUFzQixDQUFDLElBQVEsRUFBRSxNQUFhLEVBQUUsU0FBb0I7UUFDbEUsSUFBRztZQUNELE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUE7WUFDL0IsS0FBSSxJQUFJLENBQUMsSUFBSSxJQUFJO2dCQUFDLE9BQU8sSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFBO1lBQ2hDLE1BQU0sQ0FBQyxNQUFNLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFBO1lBQ3pCLG1DQUFtQztZQUNuQyxTQUFTLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztTQUMzQjtRQUFBLE9BQU0sQ0FBQyxFQUFDO1lBQ1AsT0FBTyxDQUFDLEtBQUssQ0FBQyxxQkFBcUIsQ0FBQyxDQUFBO1NBQ3JDO0lBQ0gsQ0FBQztJQUVELEtBQUssQ0FBQyxJQUFRLEVBQUUsSUFBVyxFQUFFLFNBQW9CO1FBQy9DLE1BQU0sRUFBRSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUE7UUFDM0IsTUFBTSxDQUFDLE1BQU0sQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLENBQUE7UUFDdkIsU0FBUyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDNUIsQ0FBQzs7c0dBL0JhLFNBQVM7MEZBQVQsU0FBUyw2RUFNTixTQUFTLDZCQ3pCNUIsdzFHQWdGQTsyRkQ3RGdCLFNBQVM7a0JBSHhCLFNBQVM7K0JBQ0MsWUFBWTs4QkFRTyxVQUFVO3NCQUFyQyxlQUFlO3VCQUFDLFNBQVM7O0FBNEI1QixNQUFNLENBQUMsTUFBTSxpQkFBaUIsR0FBRztJQUMvQixTQUFTLEVBQUUsU0FBUztDQUNyQixDQUFBIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgT3V0cHV0LCBFdmVudEVtaXR0ZXIsIFRlbXBsYXRlUmVmLCBFbGVtZW50UmVmLFxuICBJbnB1dCwgQ29udGVudENoaWxkcmVuLCBDb250ZW50Q2hpbGQsXG4gIERpcmVjdGl2ZSwgQ29tcG9uZW50LCBRdWVyeUxpc3Rcbn0gZnJvbSBcIkBhbmd1bGFyL2NvcmVcIlxuXG5ARGlyZWN0aXZlKHtcbiAgc2VsZWN0b3I6IFwiZGVidWctaXRlbVwiXG59KSBleHBvcnQgY2xhc3MgRGVidWdJdGVte1xuICBASW5wdXQoKSBuYW1lITogc3RyaW5nXG4gIEBJbnB1dCgpIHZhbHVlOiBhbnlcbiAgQElucHV0KCkgdHlwZSE6IFwiYXJyYXlcInxzdHJpbmdcbiAgQENvbnRlbnRDaGlsZChcInJvd1RpdGxlXCIpIHJvd1RpdGxlITogVGVtcGxhdGVSZWY8RWxlbWVudFJlZj5cbiAgQE91dHB1dCgpIHNhdmU6RXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyKClcbn1cblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOlwiZGVidWctYXJlYVwiLFxuICB0ZW1wbGF0ZVVybDogJy4vZGVidWctYXJlYS50ZW1wbGF0ZS5odG1sJyxcbn0pIGV4cG9ydCBjbGFzcyBEZWJ1Z0FyZWF7XG4gIGVkaXQhOmJvb2xlYW5cbiAgZGF0YVN0cmluZyE6IHN0cmluZ1xuICBlZGl0c01hcD86IGFueSA9IHt9Ly9tYXAgb2YgZGVidWcgZWRpdHNcbiAgZGVidWdJdGVtITpEZWJ1Z0l0ZW1cblxuICBAQ29udGVudENoaWxkcmVuKERlYnVnSXRlbSkgRGVidWdJdGVtcyE6IFF1ZXJ5TGlzdDxEZWJ1Z0l0ZW0+XG5cbiAgbmdBZnRlclZpZXdJbml0KCl7XG4gICAgaWYodGhpcy5EZWJ1Z0l0ZW1zLmxlbmd0aD09PTEpe1xuICAgICAgUHJvbWlzZS5yZXNvbHZlKCkudGhlbigoKT0+dGhpcy5kZWJ1Z0l0ZW0gPSB0aGlzLkRlYnVnSXRlbXMuZmlyc3QpXG4gICAgfVxuICB9XG5cbiAgLy91cGRhdGUgZGF0YSBmcm9tIGRlYnVnIGFyZWFcbiAgdXBkYXRlRGF0YUJ5SnNvblN0cmluZyhpdGVtOmFueSwgc3RyaW5nOnN0cmluZywgZGVidWdJdGVtOiBEZWJ1Z0l0ZW0pe1xuICAgIHRyeXtcbiAgICAgIGNvbnN0IGpzb24gPSBKU09OLnBhcnNlKHN0cmluZylcbiAgICAgIGZvcihsZXQgeCBpbiBpdGVtKWRlbGV0ZSBpdGVtW3hdXG4gICAgICBPYmplY3QuYXNzaWduKGl0ZW0sIGpzb24pXG4gICAgICAvL3RoaXMuYXJyYXlDaGFuZ2UuZW1pdCh0aGlzLmFycmF5KVxuICAgICAgZGVidWdJdGVtLnNhdmUuZW1pdChpdGVtKTtcbiAgICB9Y2F0Y2goZSl7XG4gICAgICBjb25zb2xlLmVycm9yKCdpbnZhbGlkIGpzb24gc3RyaW5nJylcbiAgICB9XG4gIH1cblxuICBhcHBseShpdGVtOmFueSwganNvbjpzdHJpbmcsIGRlYnVnSXRlbTogRGVidWdJdGVtKXtcbiAgICBjb25zdCBvYiA9IEpTT04ucGFyc2UoanNvbilcbiAgICBPYmplY3QuYXNzaWduKGl0ZW0sIG9iKVxuICAgIGRlYnVnSXRlbS5zYXZlLmVtaXQoaXRlbSk7XG4gIH1cbn1cblxuZXhwb3J0IGNvbnN0IGRlYnVnRGVjbGFyYXRpb25zID0gW1xuICBEZWJ1Z0l0ZW0sIERlYnVnQXJlYVxuXSIsIjxkaXYgY2xhc3M9XCJjaGlsZC1wYWQtaC14cyBmbGV4LXdyYXAgdGV4dC1jZW50ZXJcIiAqbmdJZj1cIkRlYnVnSXRlbXMubGVuZ3RoID4gMVwiPlxuICA8YVxuICAgIGNsYXNzPVwiY3Vyc29yLXBvaW50ZXIgYm9yZGVyIGJvcmRlci1ncmV5LTN4IHJhZGl1cy01IGZsZXgtMVwiXG4gICAgKm5nRm9yPVwibGV0IGl0ZW0gb2YgRGVidWdJdGVtc1wiXG4gICAgW25nQ2xhc3NdPVwiaXRlbT09PWRlYnVnSXRlbSA/ICdiZy1wb3NpdGl2ZSB0ZXh0LXdoaXRlJyA6ICcnXCJcbiAgICAoY2xpY2spPVwiZGVidWdJdGVtID0gZGVidWdJdGVtPT09aXRlbSA/IG51bGwgOiBpdGVtXCJcbiAgPlxuICAgIHt7aXRlbS5uYW1lfX1cbiAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiaXRlbS50eXBlPT09J2FycmF5J1wiPlxuICAgICAgJm5ic3A7KCB7eyBpdGVtLnZhbHVlPy5sZW5ndGggfHwgMCB9fSApXG4gICAgPC9uZy1jb250YWluZXI+XG4gIDwvYT5cbjwvZGl2PlxuPG5nLWNvbnRhaW5lciAqbmdJZj1cImRlYnVnSXRlbVwiPlxuICA8aDMgY2xhc3M9XCJtYXJnaW4tYm90dG9tLTBcIj57eyBkZWJ1Z0l0ZW0ubmFtZSB9fTwvaDM+XG4gIDxuZy1jb250YWluZXIgKm5nSWY9XCJkZWJ1Z0l0ZW0udHlwZT09PSdhcnJheSc7ZWxzZSByZWdkZWJ1Z1wiPlxuICAgIDxuZy1jb250YWluZXIgI2xvb3A9XCJ2YXJcIiBbdmFyXT1cInt2aWV3OjB9XCI+PC9uZy1jb250YWluZXI+XG4gICAgPHByZVxuICAgICAgY2xhc3M9XCJiZy1ncmV5LTN4IG1hcmdpbi0wIHNhbXBsZS1jb2RlXCJcbiAgICAgICpuZ0Zvcj1cImxldCBkYXRhIG9mIGRlYnVnSXRlbS52YWx1ZTtsZXQgaWk9aW5kZXhcIlxuICAgID5cbiAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJsb29wLnZhci52aWV3PT1paVwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleC12YWxpZ24tY2VudGVyIGNoaWxkLXBhZC14c1wiIHN0eWxlPVwicGFkZGluZzouNGVtO2Zsb2F0OnJpZ2h0XCI+XG4gICAgICAgICAgPGEgY2xhc3M9XCJmYXMgZmEtY2FyZXQtc3F1YXJlLWxlZnQgaG92ZXItYmctZW5lcmdpemVkXCIgKGNsaWNrKT1cImxvb3AudmFyLnZpZXc9aWk9PT0wID8gZGVidWdJdGVtLnZhbHVlLmxlbmd0aC0xIDogaWktMVwiXG4gICAgICAgICAgPiZsdDs8L2E+XG4gICAgICAgICAgPGEgc3R5bGU9XCJjb2xvcjpibHVlO1wiIChjbGljayk9XCJlZGl0c01hcFtpaV09IWVkaXRzTWFwW2lpXVwiPmVkaXQ8L2E+XG4gICAgICAgICAgPGEgc3R5bGU9XCJjb2xvcjpibHVlO1wiIChjbGljayk9XCJkZWJ1Z0l0ZW0udHlwZT1udWxsXCI+YWxsPC9hPlxuICAgICAgICAgIDxhIGNsYXNzPVwiZmFzIGZhLWNhcmV0LXNxdWFyZS1yaWdodCBob3Zlci1iZy1lbmVyZ2l6ZWRcIlxuICAgICAgICAgICAgKGNsaWNrKT1cImxvb3AudmFyLnZpZXc9aWk9PT1kZWJ1Z0l0ZW0udmFsdWUubGVuZ3RoLTEgPyAwIDogaWkrMVwiXG4gICAgICAgICAgPiZndDs8L2E+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8cD5cbiAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiZGVidWdJdGVtLnJvd1RpdGxlO2Vsc2UgZGVmYXVsdFJvd0xhYmVsXCI+XG4gICAgICAgICAgICA8bmctdGVtcGxhdGUgKm5nVGVtcGxhdGVPdXRsZXQ9XCJkZWJ1Z0l0ZW0ucm93VGl0bGU7Y29udGV4dDp7aW5kZXg6aWl9XCI+PC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICA8bmctdGVtcGxhdGUgI2RlZmF1bHRSb3dMYWJlbD1cIlwiPlxuICAgICAgICAgICAgPHN0cm9uZz5SZXN1bHQge3tpaX19IG9mIHt7ZGVidWdJdGVtLnZhbHVlLmxlbmd0aH19IDwvc3Ryb25nPlxuICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgIDwvcD5cbiAgICAgICAgPGFic29sdXRlLW92ZXJmbG93LXggKm5nSWY9XCIhZWRpdHNNYXBbaWldXCIgc3R5bGU9XCJmb250LXNpemU6MC44ZW07XCJcbiAgICAgICAgPjxwcmU+e3sgZGF0YSB8IGpzb24gfX08L3ByZT48L2Fic29sdXRlLW92ZXJmbG93LXg+XG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJlZGl0c01hcFtpaV1cIj5cbiAgICAgICAgICA8dGV4dGFyZWEgW25hbWVdPVwiJ2VkaXRzTWFwJyArIGlpXCIgc3R5bGU9XCJ3aWR0aDoxMDAlO2hlaWdodDozMDBweFwiXG4gICAgICAgICAgICAoY2hhbmdlKT1cImRhdGFTdHJpbmcgPSAkYW55KCRldmVudC50YXJnZXQpLnZhbHVlXCJcbiAgICAgICAgICA+e3sgZGF0YSB8IGpzb24gfX08L3RleHRhcmVhPlxuICAgICAgICAgIDxkaXYgc3R5bGU9XCJ0ZXh0LWFsaWduOmNlbnRlclwiPlxuICAgICAgICAgICAgPGEgc3R5bGU9XCJjb2xvcjpibHVlO3BhZGRpbmctdG9wOi40ZW07XCJcbiAgICAgICAgICAgICAgKGNsaWNrKT1cInVwZGF0ZURhdGFCeUpzb25TdHJpbmcoZGF0YSwgZGF0YVN0cmluZywgZGVidWdJdGVtKTtlZGl0c01hcFtpaV09ZmFsc2VcIlxuICAgICAgICAgICAgPnNhdmU8L2E+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgPC9wcmU+XG4gIDwvbmctY29udGFpbmVyPlxuICA8bmctdGVtcGxhdGUgI3JlZ2RlYnVnPVwiXCI+XG4gICAgPGRpdiBjbGFzcz1cInBvcy1yZWxcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJwb3MtYWJzIHJpZ2h0LTAgei1pbmRleC0xMFwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwicGFkLXh4c1wiPlxuICAgICAgICAgIDxpIGNsYXNzPVwiZmFzIGZhLXBlbmNpbC1hbHQgaG92ZXItdGV4dC1lbmVyZ2l6ZWRcIlxuICAgICAgICAgICAgKGNsaWNrKT1cImVkaXQ9IWVkaXRcIlxuICAgICAgICAgICAgW2NsYXNzLnRleHQtY2FsbV09XCJlZGl0XCJcbiAgICAgICAgICA+ZWRpdDwvaT5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiZWRpdDtlbHNlIHJlYWRNb2RlXCI+XG4gICAgICA8dGV4dGFyZWFcbiAgICAgICAgY2xhc3M9XCJ3aWR0aC1mdWxsXCJcbiAgICAgICAgcm93cz1cIjMwXCJcbiAgICAgICAgKGNoYW5nZSk9XCJhcHBseShkZWJ1Z0l0ZW0udmFsdWUsICRhbnkoJGV2ZW50LnRhcmdldCkudmFsdWUsIGRlYnVnSXRlbSlcIlxuICAgICAgICB3cmFwPVwib2ZmXCJcbiAgICAgID57eyBkZWJ1Z0l0ZW0udmFsdWUgfCBqc29uIH19PC90ZXh0YXJlYT5cbiAgICA8L25nLWNvbnRhaW5lcj5cbiAgICA8bmctdGVtcGxhdGUgI3JlYWRNb2RlPVwiXCI+XG4gICAgICA8YWJzb2x1dGUtb3ZlcmZsb3cteD5cbiAgICAgICAgPHByZSBjbGFzcz1cImNvZGUtc2FtcGxlXCI+e3sgZGVidWdJdGVtLnZhbHVlIHwganNvbiB9fTwvcHJlPlxuICAgICAgPC9hYnNvbHV0ZS1vdmVyZmxvdy14PlxuICAgIDwvbmctdGVtcGxhdGU+XG4gIDwvbmctdGVtcGxhdGU+XG48L25nLWNvbnRhaW5lcj5cbiJdfQ==