@jsonforms/angular-material
Version:
Material Renderer Set for Angular module of JSON Forms
261 lines (257 loc) • 27 kB
JavaScript
/*
The MIT License
Copyright (c) 2017-2020 EclipseSource Munich
https://github.com/eclipsesource/jsonforms
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.
*/
import { ChangeDetectionStrategy, Component } from '@angular/core';
import { JsonFormsAngularService, JsonFormsAbstractControl, } from '@jsonforms/angular';
import { arrayDefaultTranslations, createDefaultValue, defaultJsonFormsI18nState, findUISchema, getArrayTranslations, isObjectArrayWithNesting, mapDispatchToArrayControlProps, mapStateToArrayLayoutProps, Paths, rankWith, setReadonly, unsetReadonly, } from '@jsonforms/core';
import * as i0 from "@angular/core";
import * as i1 from "@jsonforms/angular";
import * as i2 from "@angular/common";
import * as i3 from "@angular/material/card";
import * as i4 from "@angular/material/button";
import * as i5 from "@angular/material/icon";
import * as i6 from "@angular/material/tooltip";
import * as i7 from "@angular/material/badge";
export class ArrayLayoutRenderer extends JsonFormsAbstractControl {
noData;
translations = {};
addItem;
moveItemUp;
moveItemDown;
removeItems;
uischemas;
constructor(jsonFormsService) {
super(jsonFormsService);
}
mapToProps(state) {
const props = mapStateToArrayLayoutProps(state, this.getOwnProps());
const t = state.jsonforms.i18n?.translate ?? defaultJsonFormsI18nState.translate;
const translations = getArrayTranslations(t, arrayDefaultTranslations, props.i18nKeyPrefix, props.label);
return { ...props, translations };
}
remove(index) {
this.removeItems(this.propsPath, [index])();
}
add() {
this.addItem(this.propsPath, createDefaultValue(this.scopedSchema, this.rootSchema))();
}
up(index) {
this.moveItemUp(this.propsPath, index)();
}
down(index) {
this.moveItemDown(this.propsPath, index)();
}
ngOnInit() {
super.ngOnInit();
const { addItem, removeItems, moveUp, moveDown } = mapDispatchToArrayControlProps(this.jsonFormsService.updateCore.bind(this.jsonFormsService));
this.addItem = addItem;
this.moveItemUp = moveUp;
this.moveItemDown = moveDown;
this.removeItems = removeItems;
}
mapAdditionalProps(props) {
this.noData = !props.data || props.data === 0;
this.uischemas = props.uischemas;
this.translations = props.translations;
}
getProps(index) {
const uischema = findUISchema(this.uischemas, this.scopedSchema, this.uischema.scope, this.propsPath, undefined, this.uischema, this.rootSchema);
if (this.isEnabled()) {
unsetReadonly(uischema);
}
else {
setReadonly(uischema);
}
return {
schema: this.scopedSchema,
path: Paths.compose(this.propsPath, `${index}`),
uischema,
};
}
trackByFn(index) {
return index;
}
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.10", ngImport: i0, type: ArrayLayoutRenderer, deps: [{ token: i1.JsonFormsAngularService }], target: i0.ɵɵFactoryTarget.Component });
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.10", type: ArrayLayoutRenderer, selector: "app-array-layout-renderer", usesInheritance: true, ngImport: i0, template: `
<div [ngStyle]="{ display: hidden ? 'none' : '' }" class="array-layout">
<div class="array-layout-toolbar">
<h2 class="mat-h2 array-layout-title">{{ label }}</h2>
<span></span>
<mat-icon
*ngIf="this.error?.length"
color="warn"
matBadge="{{ this.error.split('').length }}"
matBadgeColor="warn"
matTooltip="{{ this.error }}"
matTooltipClass="error-message-tooltip"
>
error_outline
</mat-icon>
<span></span>
<button
mat-button
matTooltip="{{ translations.addTooltip }}"
[disabled]="!isEnabled()"
(click)="add()"
attr.aria-label="{{ translations.addAriaLabel }}"
>
<mat-icon>add</mat-icon>
</button>
</div>
<p *ngIf="noData">{{ translations.noDataMessage }}</p>
<div
*ngFor="
let item of [].constructor(data);
let idx = index;
trackBy: trackByFn;
last as last;
first as first
"
>
<mat-card class="array-item" appearance="outlined">
<mat-card-content>
<jsonforms-outlet [renderProps]="getProps(idx)"></jsonforms-outlet>
</mat-card-content>
<mat-card-actions *ngIf="isEnabled()">
<button
*ngIf="uischema?.options?.showSortButtons"
class="item-up"
mat-button
[disabled]="first"
(click)="up(idx)"
attr.aria-label="{{ translations.upAriaLabel }}"
matTooltip="{{ translations.up }}"
matTooltipPosition="right"
>
<mat-icon>arrow_upward</mat-icon>
</button>
<button
*ngIf="uischema?.options?.showSortButtons"
class="item-down"
mat-button
[disabled]="last"
(click)="down(idx)"
attr.aria-label="{{ translations.downAriaLabel }}"
matTooltip="{{ translations.down }}"
matTooltipPosition="right"
>
<mat-icon>arrow_downward</mat-icon>
</button>
<button
mat-button
color="warn"
(click)="remove(idx)"
attr.aria-label="{{ translations.removeAriaLabel }}"
matTooltip="{{ translations.removeTooltip }}"
matTooltipPosition="right"
>
<mat-icon>delete</mat-icon>
</button>
</mat-card-actions>
</mat-card>
</div>
</div>
`, isInline: true, styles: [".array-layout{display:flex;flex-direction:column;gap:16px}.array-layout>*{flex:1 1 auto}.array-layout-toolbar{display:flex;align-items:center}.array-layout-title{margin:0}.array-layout-toolbar>span{flex:1 1 auto}.array-item{padding:16px}::ng-deep .error-message-tooltip{white-space:pre-line}\n"], dependencies: [{ kind: "directive", type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "directive", type: i1.JsonFormsOutlet, selector: "jsonforms-outlet", inputs: ["renderProps"] }, { kind: "component", type: i3.MatCard, selector: "mat-card", inputs: ["appearance"], exportAs: ["matCard"] }, { kind: "directive", type: i3.MatCardActions, selector: "mat-card-actions", inputs: ["align"], exportAs: ["matCardActions"] }, { kind: "directive", type: i3.MatCardContent, selector: "mat-card-content" }, { kind: "component", type: i4.MatButton, selector: " button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button] ", exportAs: ["matButton"] }, { kind: "component", type: i5.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "directive", type: i6.MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }, { kind: "directive", type: i7.MatBadge, selector: "[matBadge]", inputs: ["matBadgeColor", "matBadgeOverlap", "matBadgeDisabled", "matBadgePosition", "matBadge", "matBadgeDescription", "matBadgeSize", "matBadgeHidden"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.10", ngImport: i0, type: ArrayLayoutRenderer, decorators: [{
type: Component,
args: [{ selector: 'app-array-layout-renderer', template: `
<div [ngStyle]="{ display: hidden ? 'none' : '' }" class="array-layout">
<div class="array-layout-toolbar">
<h2 class="mat-h2 array-layout-title">{{ label }}</h2>
<span></span>
<mat-icon
*ngIf="this.error?.length"
color="warn"
matBadge="{{ this.error.split('').length }}"
matBadgeColor="warn"
matTooltip="{{ this.error }}"
matTooltipClass="error-message-tooltip"
>
error_outline
</mat-icon>
<span></span>
<button
mat-button
matTooltip="{{ translations.addTooltip }}"
[disabled]="!isEnabled()"
(click)="add()"
attr.aria-label="{{ translations.addAriaLabel }}"
>
<mat-icon>add</mat-icon>
</button>
</div>
<p *ngIf="noData">{{ translations.noDataMessage }}</p>
<div
*ngFor="
let item of [].constructor(data);
let idx = index;
trackBy: trackByFn;
last as last;
first as first
"
>
<mat-card class="array-item" appearance="outlined">
<mat-card-content>
<jsonforms-outlet [renderProps]="getProps(idx)"></jsonforms-outlet>
</mat-card-content>
<mat-card-actions *ngIf="isEnabled()">
<button
*ngIf="uischema?.options?.showSortButtons"
class="item-up"
mat-button
[disabled]="first"
(click)="up(idx)"
attr.aria-label="{{ translations.upAriaLabel }}"
matTooltip="{{ translations.up }}"
matTooltipPosition="right"
>
<mat-icon>arrow_upward</mat-icon>
</button>
<button
*ngIf="uischema?.options?.showSortButtons"
class="item-down"
mat-button
[disabled]="last"
(click)="down(idx)"
attr.aria-label="{{ translations.downAriaLabel }}"
matTooltip="{{ translations.down }}"
matTooltipPosition="right"
>
<mat-icon>arrow_downward</mat-icon>
</button>
<button
mat-button
color="warn"
(click)="remove(idx)"
attr.aria-label="{{ translations.removeAriaLabel }}"
matTooltip="{{ translations.removeTooltip }}"
matTooltipPosition="right"
>
<mat-icon>delete</mat-icon>
</button>
</mat-card-actions>
</mat-card>
</div>
</div>
`, changeDetection: ChangeDetectionStrategy.OnPush, styles: [".array-layout{display:flex;flex-direction:column;gap:16px}.array-layout>*{flex:1 1 auto}.array-layout-toolbar{display:flex;align-items:center}.array-layout-title{margin:0}.array-layout-toolbar>span{flex:1 1 auto}.array-item{padding:16px}::ng-deep .error-message-tooltip{white-space:pre-line}\n"] }]
}], ctorParameters: () => [{ type: i1.JsonFormsAngularService }] });
export const ArrayLayoutRendererTester = rankWith(4, isObjectArrayWithNesting);
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXJyYXktbGF5b3V0LnJlbmRlcmVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2xpYnJhcnkvbGF5b3V0cy9hcnJheS1sYXlvdXQucmVuZGVyZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0VBdUJFO0FBQ0YsT0FBTyxFQUFFLHVCQUF1QixFQUFFLFNBQVMsRUFBVSxNQUFNLGVBQWUsQ0FBQztBQUMzRSxPQUFPLEVBQ0wsdUJBQXVCLEVBQ3ZCLHdCQUF3QixHQUN6QixNQUFNLG9CQUFvQixDQUFDO0FBQzVCLE9BQU8sRUFDTCx3QkFBd0IsRUFHeEIsa0JBQWtCLEVBQ2xCLHlCQUF5QixFQUN6QixZQUFZLEVBQ1osb0JBQW9CLEVBQ3BCLHdCQUF3QixFQUV4Qiw4QkFBOEIsRUFDOUIsMEJBQTBCLEVBRTFCLEtBQUssRUFFTCxRQUFRLEVBQ1IsV0FBVyxFQUlYLGFBQWEsR0FDZCxNQUFNLGlCQUFpQixDQUFDOzs7Ozs7Ozs7QUFrSHpCLE1BQU0sT0FBTyxtQkFDWCxTQUFRLHdCQUFpRDtJQUd6RCxNQUFNLENBQVU7SUFDaEIsWUFBWSxHQUFzQixFQUFFLENBQUM7SUFDckMsT0FBTyxDQUEyQztJQUNsRCxVQUFVLENBQThDO0lBQ3hELFlBQVksQ0FBOEM7SUFDMUQsV0FBVyxDQUFtRDtJQUM5RCxTQUFTLENBR0w7SUFDSixZQUFZLGdCQUF5QztRQUNuRCxLQUFLLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztJQUMxQixDQUFDO0lBQ0QsVUFBVSxDQUNSLEtBQXFCO1FBRXJCLE1BQU0sS0FBSyxHQUFHLDBCQUEwQixDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUMsQ0FBQztRQUNwRSxNQUFNLENBQUMsR0FDTCxLQUFLLENBQUMsU0FBUyxDQUFDLElBQUksRUFBRSxTQUFTLElBQUkseUJBQXlCLENBQUMsU0FBUyxDQUFDO1FBQ3pFLE1BQU0sWUFBWSxH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QUMzQjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQStFVCxtQkE2QmdCLHVCQUF1QixDQUFDLE1BQU07O0FBNEZqRCxNQUFNLENBQUMsTUFBTSx5QkFBeUIsR0FBaUIsUUFBUSxDQUM3RCxDQUFDLEVBQ0Qsd0JBQXdCLENBQ3pCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKlxuICBUaGUgTUlUIExpY2Vuc2VcblxuICBDb3B5cmlnaHQgKGMpIDIwMTctMjAyMCBFY2xpcHNlU291cmNlIE11bmljaFxuICBodHRwczovL2dpdGh1Yi5jb20vZWNsaXBzZXNvdXJjZS9qc29uZm9ybXNcblxuICBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5XG4gIG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlIFwiU29mdHdhcmVcIiksIHRvIGRlYWxcbiAgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0c1xuICB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsXG4gIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpc1xuICBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOlxuXG4gIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluXG4gIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLlxuXG4gIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1JcbiAgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksXG4gIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRVxuICBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSXG4gIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sXG4gIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU5cbiAgVEhFIFNPRlRXQVJFLlxuKi9cbmltcG9ydCB7IENoYW5nZURldGVjdGlvblN0cmF0ZWd5LCBDb21wb25lbnQsIE9uSW5pdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtcbiAgSnNvbkZvcm1zQW5ndWxhclNlcnZpY2UsXG4gIEpzb25Gb3Jtc0Fic3RyYWN0Q29udHJvbCxcbn0gZnJvbSAnQGpzb25mb3Jtcy9hbmd1bGFyJztcbmltcG9ydCB7XG4gIGFycmF5RGVmYXVsdFRyYW5zbGF0aW9ucyxcbiAgQXJyYXlMYXlvdXRQcm9wcyxcbiAgQXJyYXlUcmFuc2xhdGlvbnMsXG4gIGNyZWF0ZURlZmF1bHRWYWx1ZSxcbiAgZGVmYXVsdEpzb25Gb3Jtc0kxOG5TdGF0ZSxcbiAgZmluZFVJU2NoZW1hLFxuICBnZXRBcnJheVRyYW5zbGF0aW9ucyxcbiAgaXNPYmplY3RBcnJheVdpdGhOZXN0aW5nLFxuICBKc29uRm9ybXNTdGF0ZSxcbiAgbWFwRGlzcGF0Y2hUb0FycmF5Q29udHJvbFByb3BzLFxuICBtYXBTdGF0ZVRvQXJyYXlMYXlvdXRQcm9wcyxcbiAgT3duUHJvcHNPZlJlbmRlcmVyLFxuICBQYXRocyxcbiAgUmFua2VkVGVzdGVyLFxuICByYW5rV2l0aCxcbiAgc2V0UmVhZG9ubHksXG4gIFN0YXRlUHJvcHNPZkFycmF5TGF5b3V0LFxuICBVSVNjaGVtYUVsZW1lbnQsXG4gIFVJU2NoZW1hVGVzdGVyLFxuICB1bnNldFJlYWRvbmx5LFxufSBmcm9tICdAanNvbmZvcm1zL2NvcmUnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdhcHAtYXJyYXktbGF5b3V0LXJlbmRlcmVyJyxcbiAgdGVtcGxhdGU6IGBcbiAgICA8ZGl2IFtuZ1N0eWxlXT1cInsgZGlzcGxheTogaGlkZGVuID8gJ25vbmUnIDogJycgfVwiIGNsYXNzPVwiYXJyYXktbGF5b3V0XCI+XG4gICAgICA8ZGl2IGNsYXNzPVwiYXJyYXktbGF5b3V0LXRvb2xiYXJcIj5cbiAgICAgICAgPGgyIGNsYXNzPVwibWF0LWgyIGFycmF5LWxheW91dC10aXRsZVwiPnt7IGxhYmVsIH19PC9oMj5cbiAgICAgICAgPHNwYW4+PC9zcGFuPlxuICAgICAgICA8bWF0LWljb25cbiAgICAgICAgICAqbmdJZj1cInRoaXMuZXJyb3I/Lmxlbmd0aFwiXG4gICAgICAgICAgY29sb3I9XCJ3YXJuXCJcbiAgICAgICAgICBtYXRCYWRnZT1cInt7IHRoaXMuZXJyb3Iuc3BsaXQoJycpLmxlbmd0aCB9fVwiXG4gICAgICAgICAgbWF0QmFkZ2VDb2xvcj1cIndhcm5cIlxuICAgICAgICAgIG1hdFRvb2x0aXA9XCJ7eyB0aGlzLmVycm9yIH19XCJcbiAgICAgICAgICBtYXRUb29sdGlwQ2xhc3M9XCJlcnJvci1tZXNzYWdlLXRvb2x0aXBcIlxuICAgICAgICA+XG4gICAgICAgICAgZXJyb3Jfb3V0bGluZVxuICAgICAgICA8L21hdC1pY29uPlxuICAgICAgICA8c3Bhbj48L3NwYW4+XG4gICAgICAgIDxidXR0b25cbiAgICAgICAgICBtYXQtYnV0dG9uXG4gICAgICAgICAgbWF0VG9vbHRpcD1cInt7IHRyYW5zbGF0aW9ucy5hZGRUb29sdGlwIH19XCJcbiAgICAgICAgICBbZGlzYWJsZWRdPVwiIWlzRW5hYmxlZCgpXCJcbiAgICAgICAgICAoY2xpY2spPVwiYWRkKClcIlxuICAgICAgICAgIGF0dHIuYXJpYS1sYWJlbD1cInt7IHRyYW5zbGF0aW9ucy5hZGRBcmlhTGFiZWwgfX1cIlxuICAgICAgICA+XG4gICAgICAgICAgPG1hdC1pY29uPmFkZDwvbWF0LWljb24+XG4gICAgICAgIDwvYnV0dG9uPlxuICAgICAgPC9kaXY+XG4gICAgICA8cCAqbmdJZj1cIm5vRGF0YVwiPnt7IHRyYW5zbGF0aW9ucy5ub0RhdGFNZXNzYWdlIH19PC9wPlxuICAgICAgPGRpdlxuICAgICAgICAqbmdGb3I9XCJcbiAgICAgICAgICBsZXQgaXRlbSBvZiBbXS5jb25zdHJ1Y3RvcihkYXRhKTtcbiAgICAgICAgICBsZXQgaWR4ID0gaW5kZXg7XG4gICAgICAgICAgdHJhY2tCeTogdHJhY2tCeUZuO1xuICAgICAgICAgIGxhc3QgYXMgbGFzdDtcbiAgICAgICAgICBmaXJzdCBhcyBmaXJzdFxuICAgICAgICBcIlxuICAgICAgPlxuICAgICAgICA8bWF0LWNhcmQgY2xhc3M9XCJhcnJheS1pdGVtXCIgYXBwZWFyYW5jZT1cIm91dGxpbmVkXCI+XG4gICAgICAgICAgPG1hdC1jYXJkLWNvbnRlbnQ+XG4gICAgICAgICAgICA8anNvbmZvcm1zLW91dGxldCBbcmVuZGVyUHJvcHNdPVwiZ2V0UHJvcHMoaWR4KVwiPjwvanNvbmZvcm1zLW91dGxldD5cbiAgICAgICAgICA8L21hdC1jYXJkLWNvbnRlbnQ+XG4gICAgICAgICAgPG1hdC1jYXJkLWFjdGlvbnMgKm5nSWY9XCJpc0VuYWJsZWQoKVwiPlxuICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAqbmdJZj1cInVpc2NoZW1hPy5vcHRpb25zPy5zaG93U29ydEJ1dHRvbnNcIlxuICAgICAgICAgICAgICBjbGFzcz1cIml0ZW0tdXBcIlxuICAgICAgICAgICAgICBtYXQtYnV0dG9uXG4gICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJmaXJzdFwiXG4gICAgICAgICAgICAgIChjbGljayk9XCJ1cChpZHgpXCJcbiAgICAgICAgICAgICAgYXR0ci5hcmlhLWxhYmVsPVwie3sgdHJhbnNsYXRpb25zLnVwQXJpYUxhYmVsIH19XCJcbiAgICAgICAgICAgICAgbWF0VG9vbHRpcD1cInt7IHRyYW5zbGF0aW9ucy51cCB9fVwiXG4gICAgICAgICAgICAgIG1hdFRvb2x0aXBQb3NpdGlvbj1cInJpZ2h0XCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgPG1hdC1pY29uPmFycm93X3Vwd2FyZDwvbWF0LWljb24+XG4gICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgKm5nSWY9XCJ1aXNjaGVtYT8ub3B0aW9ucz8uc2hvd1NvcnRCdXR0b25zXCJcbiAgICAgICAgICAgICAgY2xhc3M9XCJpdGVtLWRvd25cIlxuICAgICAgICAgICAgICBtYXQtYnV0dG9uXG4gICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJsYXN0XCJcbiAgICAgICAgICAgICAgKGNsaWNrKT1cImRvd24oaWR4KVwiXG4gICAgICAgICAgICAgIGF0dHIuYXJpYS1sYWJlbD1cInt7IHRyYW5zbGF0aW9ucy5kb3duQXJpYUxhYmVsIH19XCJcbiAgICAgICAgICAgICAgbWF0VG9vbHRpcD1cInt7IHRyYW5zbGF0aW9ucy5kb3duIH19XCJcbiAgICAgICAgICAgICAgbWF0VG9vbHRpcFBvc2l0aW9uPVwicmlnaHRcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICA8bWF0LWljb24+YXJyb3dfZG93bndhcmQ8L21hdC1pY29uPlxuICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgIG1hdC1idXR0b25cbiAgICAgICAgICAgICAgY29sb3I9XCJ3YXJuXCJcbiAgICAgICAgICAgICAgKGNsaWNrKT1cInJlbW92ZShpZHgpXCJcbiAgICAgICAgICAgICAgYXR0ci5hcmlhLWxhYmVsPVwie3sgdHJhbnNsYXRpb25zLnJlbW92ZUFyaWFMYWJlbCB9fVwiXG4gICAgICAgICAgICAgIG1hdFRvb2x0aXA9XCJ7eyB0cmFuc2xhdGlvbnMucmVtb3ZlVG9vbHRpcCB9fVwiXG4gICAgICAgICAgICAgIG1hdFRvb2x0aXBQb3NpdGlvbj1cInJpZ2h0XCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgPG1hdC1pY29uPmRlbGV0ZTwvbWF0LWljb24+XG4gICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICA8L21hdC1jYXJkLWFjdGlvbnM+XG4gICAgICAgIDwvbWF0LWNhcmQ+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgYCxcbiAgc3R5bGVzOiBbXG4gICAgYFxuICAgICAgLmFycmF5LWxheW91dCB7XG4gICAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG4gICAgICAgIGdhcDogMTZweDtcbiAgICAgIH1cbiAgICAgIC5hcnJheS1sYXlvdXQgPiAqIHtcbiAgICAgICAgZmxleDogMSAxIGF1dG87XG4gICAgICB9XG4gICAgICAuYXJyYXktbGF5b3V0LXRvb2xiYXIge1xuICAgICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgICBhbGlnbi1pdGVtczogY2VudGVyO1xuICAgICAgfVxuICAgICAgLmFycmF5LWxheW91dC10aXRsZSB7XG4gICAgICAgIG1hcmdpbjogMDtcbiAgICAgIH1cbiAgICAgIC5hcnJheS1sYXlvdXQtdG9vbGJhciA+IHNwYW4ge1xuICAgICAgICBmbGV4OiAxIDEgYXV0bztcbiAgICAgIH1cbiAgICAgIC5hcnJheS1pdGVtIHtcbiAgICAgICAgcGFkZGluZzogMTZweDtcbiAgICAgIH1cbiAgICAgIDo6bmctZGVlcCAuZXJyb3ItbWVzc2FnZS10b29sdGlwIHtcbiAgICAgICAgd2hpdGUtc3BhY2U6IHByZS1saW5lO1xuICAgICAgfVxuICAgIGAsXG4gIF0sXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxufSlcbmV4cG9ydCBjbGFzcyBBcnJheUxheW91dFJlbmRlcmVyXG4gIGV4dGVuZHMgSnNvbkZvcm1zQWJzdHJhY3RDb250cm9sPFN0YXRlUHJvcHNPZkFycmF5TGF5b3V0PlxuICBpbXBsZW1lbnRzIE9uSW5pdFxue1xuICBub0RhdGE6IGJvb2xlYW47XG4gIHRyYW5zbGF0aW9uczogQXJyYXlUcmFuc2xhdGlvbnMgPSB7fTtcbiAgYWRkSXRlbTogKHBhdGg6IHN0cmluZywgdmFsdWU6IGFueSkgPT4gKCkgPT4gdm9pZDtcbiAgbW92ZUl0ZW1VcDogKHBhdGg6IHN0cmluZywgaW5kZXg6IG51bWJlcikgPT4gKCkgPT4gdm9pZDtcbiAgbW92ZUl0ZW1Eb3duOiAocGF0aDogc3RyaW5nLCBpbmRleDogbnVtYmVyKSA9PiAoKSA9PiB2b2lkO1xuICByZW1vdmVJdGVtczogKHBhdGg6IHN0cmluZywgdG9EZWxldGU6IG51bWJlcltdKSA9PiAoKSA9PiB2b2lkO1xuICB1aXNjaGVtYXM6IHtcbiAgICB0ZXN0ZXI6IFVJU2NoZW1hVGVzdGVyO1xuICAgIHVpc2NoZW1hOiBVSVNjaGVtYUVsZW1lbnQ7XG4gIH1bXTtcbiAgY29uc3RydWN0b3IoanNvbkZvcm1zU2VydmljZTogSnNvbkZvcm1zQW5ndWxhclNlcnZpY2UpIHtcbiAgICBzdXBlcihqc29uRm9ybXNTZXJ2aWNlKTtcbiAgfVxuICBtYXBUb1Byb3BzKFxuICAgIHN0YXRlOiBKc29uRm9ybXNTdGF0ZVxuICApOiBTdGF0ZVByb3BzT2ZBcnJheUxheW91dCAmIHsgdHJhbnNsYXRpb25zOiBBcnJheVRyYW5zbGF0aW9ucyB9IHtcbiAgICBjb25zdCBwcm9wcyA9IG1hcFN0YXRlVG9BcnJheUxheW91dFByb3BzKHN0YXRlLCB0aGlzLmdldE93blByb3BzKCkpO1xuICAgIGNvbnN0IHQgPVxuICAgICAgc3RhdGUuanNvbmZvcm1zLmkxOG4/LnRyYW5zbGF0ZSA/PyBkZWZhdWx0SnNvbkZvcm1zSTE4blN0YXRlLnRyYW5zbGF0ZTtcbiAgICBjb25zdCB0cmFuc2xhdGlvbnMgPSBnZXRBcnJheVRyYW5zbGF0aW9ucyhcbiAgICAgIHQsXG4gICAgICBhcnJheURlZmF1bHRUcmFuc2xhdGlvbnMsXG4gICAgICBwcm9wcy5pMThuS2V5UHJlZml4LFxuICAgICAgcHJvcHMubGFiZWxcbiAgICApO1xuICAgIHJldHVybiB7IC4uLnByb3BzLCB0cmFuc2xhdGlvbnMgfTtcbiAgfVxuICByZW1vdmUoaW5kZXg6IG51bWJlcik6IHZvaWQge1xuICAgIHRoaXMucmVtb3ZlSXRlbXModGhpcy5wcm9wc1BhdGgsIFtpbmRleF0pKCk7XG4gIH1cbiAgYWRkKCk6IHZvaWQge1xuICAgIHRoaXMuYWRkSXRlbShcbiAgICAgIHRoaXMucHJvcHNQYXRoLFxuICAgICAgY3JlYXRlRGVmYXVsdFZhbHVlKHRoaXMuc2NvcGVkU2NoZW1hLCB0aGlzLnJvb3RTY2hlbWEpXG4gICAgKSgpO1xuICB9XG4gIHVwKGluZGV4OiBudW1iZXIpOiB2b2lkIHtcbiAgICB0aGlzLm1vdmVJdGVtVXAodGhpcy5wcm9wc1BhdGgsIGluZGV4KSgpO1xuICB9XG4gIGRvd24oaW5kZXg6IG51bWJlcik6IHZvaWQge1xuICAgIHRoaXMubW92ZUl0ZW1Eb3duKHRoaXMucHJvcHNQYXRoLCBpbmRleCkoKTtcbiAgfVxuICBuZ09uSW5pdCgpIHtcbiAgICBzdXBlci5uZ09uSW5pdCgpO1xuICAgIGNvbnN0IHsgYWRkSXRlbSwgcmVtb3ZlSXRlbXMsIG1vdmVVcCwgbW92ZURvd24gfSA9XG4gICAgICBtYXBEaXNwYXRjaFRvQXJyYXlDb250cm9sUHJvcHMoXG4gICAgICAgIHRoaXMuanNvbkZvcm1zU2VydmljZS51cGRhdGVDb3JlLmJpbmQodGhpcy5qc29uRm9ybXNTZXJ2aWNlKVxuICAgICAgKTtcbiAgICB0aGlzLmFkZEl0ZW0gPSBhZGRJdGVtO1xuICAgIHRoaXMubW92ZUl0ZW1VcCA9IG1vdmVVcDtcbiAgICB0aGlzLm1vdmVJdGVtRG93biA9IG1vdmVEb3duO1xuICAgIHRoaXMucmVtb3ZlSXRlbXMgPSByZW1vdmVJdGVtcztcbiAgfVxuICBtYXBBZGRpdGlvbmFsUHJvcHMoXG4gICAgcHJvcHM6IEFycmF5TGF5b3V0UHJvcHMgJiB7IHRyYW5zbGF0aW9uczogQXJyYXlUcmFuc2xhdGlvbnMgfVxuICApIHtcbiAgICB0aGlzLm5vRGF0YSA9ICFwcm9wcy5kYXRhIHx8IHByb3BzLmRhdGEgPT09IDA7XG4gICAgdGhpcy51aXNjaGVtYXMgPSBwcm9wcy51aXNjaGVtYXM7XG4gICAgdGhpcy50cmFuc2xhdGlvbnMgPSBwcm9wcy50cmFuc2xhdGlvbnM7XG4gIH1cbiAgZ2V0UHJvcHMoaW5kZXg6IG51bWJlcik6IE93blByb3BzT2ZSZW5kZXJlciB7XG4gICAgY29uc3QgdWlzY2hlbWEgPSBmaW5kVUlTY2hlbWEoXG4gICAgICB0aGlzLnVpc2NoZW1hcyxcbiAgICAgIHRoaXMuc2NvcGVkU2NoZW1hLFxuICAgICAgdGhpcy51aXNjaGVtYS5zY29wZSxcbiAgICAgIHRoaXMucHJvcHNQYXRoLFxuICAgICAgdW5kZWZpbmVkLFxuICAgICAgdGhpcy51aXNjaGVtYSxcbiAgICAgIHRoaXMucm9vdFNjaGVtYVxuICAgICk7XG4gICAgaWYgKHRoaXMuaXNFbmFibGVkKCkpIHtcbiAgICAgIHVuc2V0UmVhZG9ubHkodWlzY2hlbWEpO1xuICAgIH0gZWxzZSB7XG4gICAgICBzZXRSZWFkb25seSh1aXNjaGVtYSk7XG4gICAgfVxuICAgIHJldHVybiB7XG4gICAgICBzY2hlbWE6IHRoaXMuc2NvcGVkU2NoZW1hLFxuICAgICAgcGF0aDogUGF0aHMuY29tcG9zZSh0aGlzLnByb3BzUGF0aCwgYCR7aW5kZXh9YCksXG4gICAgICB1aXNjaGVtYSxcbiAgICB9O1xuICB9XG4gIHRyYWNrQnlGbihpbmRleDogbnVtYmVyKSB7XG4gICAgcmV0dXJuIGluZGV4O1xuICB9XG59XG5cbmV4cG9ydCBjb25zdCBBcnJheUxheW91dFJlbmRlcmVyVGVzdGVyOiBSYW5rZWRUZXN0ZXIgPSByYW5rV2l0aChcbiAgNCxcbiAgaXNPYmplY3RBcnJheVdpdGhOZXN0aW5nXG4pO1xuIl19