@talrace/ngx-noder 0.0.2 → 0.0.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (47) hide show
  1. package/esm2022/lib/+shared/add-link-dialog/add-link-dialog.component.mjs +67 -0
  2. package/esm2022/lib/+shared/editor/core/edit.session.mjs +7 -10
  3. package/esm2022/lib/+shared/editor/core/editor.mjs +7 -5
  4. package/esm2022/lib/+shared/editor/core/helpers/paragraph.helper.mjs +53 -16
  5. package/esm2022/lib/+shared/editor/core/helpers/position.helper.mjs +4 -1
  6. package/esm2022/lib/+shared/editor/core/models/line-info.model.mjs +1 -1
  7. package/esm2022/lib/+shared/editor/core/paging/pages.wrap.mjs +19 -12
  8. package/esm2022/lib/+shared/editor/core/paging/paragraph.mjs +3 -3
  9. package/esm2022/lib/+shared/editor/core/paging/text-line-info.mjs +3 -3
  10. package/esm2022/lib/+shared/editor/custom-components/external-element/models/external-element.model.mjs +3 -2
  11. package/esm2022/lib/+shared/editor/custom-components/shared/services/custom-content/custom-content.service.mjs +4 -3
  12. package/esm2022/lib/+shared/editor/custom-components/table/cell-resizer/cell-resizer.mjs +4 -4
  13. package/esm2022/lib/+shared/editor/custom-components/table/components/table.component.mjs +116 -10
  14. package/esm2022/lib/+shared/editor/custom-components/table/selection/table-selection.mjs +7 -1
  15. package/esm2022/lib/+shared/editor/editor.component.mjs +6 -4
  16. package/esm2022/lib/+shared/editor/execution/regulator.service.mjs +3 -3
  17. package/esm2022/lib/+shared/editor/operations/helpers/table-operations.helper.mjs +6 -3
  18. package/esm2022/lib/+shared/helpers/revision.helper.mjs +91 -0
  19. package/esm2022/lib/+shared/helpers/validation.helper.mjs +7 -0
  20. package/esm2022/lib/models/generated/cell.model.mjs +1 -1
  21. package/esm2022/public-api.mjs +5 -2
  22. package/fesm2022/talrace-ngx-noder.mjs +384 -79
  23. package/fesm2022/talrace-ngx-noder.mjs.map +1 -1
  24. package/lib/+shared/add-link-dialog/add-link-dialog.component.d.ts +26 -0
  25. package/lib/+shared/editor/core/editor.d.ts +2 -1
  26. package/lib/+shared/editor/core/helpers/paragraph.helper.d.ts +5 -2
  27. package/lib/+shared/editor/core/models/line-info.model.d.ts +1 -0
  28. package/lib/+shared/editor/core/paging/pages.wrap.d.ts +6 -5
  29. package/lib/+shared/editor/core/paging/paragraph.d.ts +5 -2
  30. package/lib/+shared/editor/core/paging/text-line-info.d.ts +2 -0
  31. package/lib/+shared/editor/custom-components/external-element/models/external-element.model.d.ts +2 -1
  32. package/lib/+shared/editor/custom-components/shared/services/custom-content/custom-content.service.d.ts +2 -1
  33. package/lib/+shared/editor/custom-components/table/cell-resizer/cell-resizer.d.ts +1 -0
  34. package/lib/+shared/editor/custom-components/table/components/table.component.d.ts +18 -1
  35. package/lib/+shared/editor/editor.component.d.ts +2 -1
  36. package/lib/+shared/editor/execution/regulator.service.d.ts +1 -1
  37. package/lib/+shared/helpers/revision.helper.d.ts +15 -0
  38. package/lib/+shared/helpers/validation.helper.d.ts +5 -0
  39. package/lib/models/generated/cell.model.d.ts +1 -0
  40. package/package.json +1 -1
  41. package/public-api.d.ts +4 -1
  42. package/src/lib/+shared/confirm-dialog/_theme.scss +30 -0
  43. package/src/lib/+shared/editor/_theme.scss +7 -0
  44. package/src/lib/+shared/editor-toolbar/_theme.scss +7 -0
  45. package/src/scss/_fonts.scss +3 -0
  46. package/src/scss/_mixins.scss +49 -0
  47. package/src/scss/_variables.scss +1 -0
@@ -0,0 +1,67 @@
1
+ import { ChangeDetectionStrategy, Component, Inject } from '@angular/core';
2
+ import { CommonModule } from '@angular/common';
3
+ import { ReactiveFormsModule, Validators } from '@angular/forms';
4
+ import { MAT_DIALOG_DATA, MatDialogModule } from '@angular/material/dialog';
5
+ import { MatButtonModule } from '@angular/material/button';
6
+ import { MatFormFieldModule } from '@angular/material/form-field';
7
+ import { MatIconModule } from '@angular/material/icon';
8
+ import { MatInputModule } from '@angular/material/input';
9
+ import { TranslateModule } from '@ngx-translate/core';
10
+ import { ValidationHelper } from '../helpers/validation.helper';
11
+ import * as i0 from "@angular/core";
12
+ import * as i1 from "@angular/material/dialog";
13
+ import * as i2 from "@angular/forms";
14
+ import * as i3 from "@angular/material/button";
15
+ import * as i4 from "@angular/material/form-field";
16
+ import * as i5 from "@angular/material/icon";
17
+ import * as i6 from "@angular/material/input";
18
+ export class AddLinkDialogOptions {
19
+ constructor(fields) {
20
+ if (fields) {
21
+ Object.assign(this, fields);
22
+ }
23
+ }
24
+ }
25
+ export class AddLinkDialogComponent {
26
+ constructor(dialogRef, data, fb) {
27
+ this.dialogRef = dialogRef;
28
+ this.data = data;
29
+ this.fb = fb;
30
+ dialogRef.disableClose = true;
31
+ this.form = this.fb.group({
32
+ text: [data.text, Validators.required],
33
+ link: [data.link, [Validators.required, ValidationHelper.urlValidator]]
34
+ });
35
+ }
36
+ onClose() {
37
+ this.dialogRef.close();
38
+ }
39
+ onApply() {
40
+ this.dialogRef.close({ text: this.form.controls.text.value, link: this.form.controls.link.value });
41
+ }
42
+ onEnter() {
43
+ if (this.form.invalid) {
44
+ return;
45
+ }
46
+ this.onApply();
47
+ }
48
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.2.1", ngImport: i0, type: AddLinkDialogComponent, deps: [{ token: i1.MatDialogRef }, { token: MAT_DIALOG_DATA }, { token: i2.FormBuilder }], target: i0.ɵɵFactoryTarget.Component }); }
49
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.2.1", type: AddLinkDialogComponent, isStandalone: true, selector: "app-add-link-dialog", ngImport: i0, template: "<div mat-dialog-title>{{ data.title }}</div>\n<div\n mat-dialog-content\n [formGroup]=\"form\">\n <mat-form-field appearance=\"outline\">\n <mat-label>{{ data.textPlaceholder }}</mat-label>\n <input\n matInput\n [formControl]=\"form.controls.text\"\n (keydown.enter)=\"onEnter()\"\n required />\n <mat-error>The {{ data.textPlaceholder }} is required.</mat-error>\n </mat-form-field>\n <mat-form-field appearance=\"outline\">\n <mat-label>{{ data.linkPlaceholder }}</mat-label>\n <input\n matInput\n [formControl]=\"form.controls.link\"\n (keydown.enter)=\"onEnter()\"\n required />\n <mat-error>The {{ data.linkPlaceholder }} is required.</mat-error>\n </mat-form-field>\n</div>\n<div mat-dialog-actions>\n <button\n mat-button\n (click)=\"onClose()\">\n <mat-icon\n fontSet=\"nc-icon\"\n fontIcon=\"icon-cancel-thin\"></mat-icon>\n Cancel\n </button>\n <button\n mat-raised-button\n color=\"primary\"\n class=\"apply-btn\"\n [disabled]=\"form.invalid\"\n (click)=\"onApply()\">\n <mat-icon\n fontSet=\"nc-icon\"\n fontIcon=\"icon-done-thin\"></mat-icon>\n Apply\n </button>\n</div>\n", styles: [":host{height:300px;width:430px;display:block;overflow:hidden}:host ::ng-deep .mdc-text-field--outlined{--mdc-outlined-text-field-container-shape: 12px;height:48px}:host ::ng-deep .mat-mdc-text-field-wrapper.mdc-text-field--outlined .mat-mdc-form-field-infix{padding-top:12px}.mat-mdc-dialog-title{font-weight:600;padding-top:5px}mat-form-field{width:100%}.mat-mdc-dialog-content{padding-top:10px;padding-bottom:0}.mat-mdc-dialog-actions{display:flex;justify-content:center;align-items:center;padding-top:5px;height:25%}.mat-mdc-dialog-actions button{width:30%;height:100%;letter-spacing:1px;border-radius:8px}.mat-mdc-dialog-actions button .apply-btn{font-weight:400}.mat-mdc-dialog-actions button .mat-icon{font-size:24px;height:24px}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: MatButtonModule }, { kind: "component", type: i3.MatButton, selector: " button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button] ", exportAs: ["matButton"] }, { kind: "ngmodule", type: MatDialogModule }, { kind: "directive", type: i1.MatDialogTitle, selector: "[mat-dialog-title], [matDialogTitle]", inputs: ["id"], exportAs: ["matDialogTitle"] }, { kind: "directive", type: i1.MatDialogActions, selector: "[mat-dialog-actions], mat-dialog-actions, [matDialogActions]", inputs: ["align"] }, { kind: "directive", type: i1.MatDialogContent, selector: "[mat-dialog-content], mat-dialog-content, [matDialogContent]" }, { kind: "ngmodule", type: MatFormFieldModule }, { kind: "component", type: i4.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i4.MatLabel, selector: "mat-label" }, { kind: "directive", type: i4.MatError, selector: "mat-error, [matError]", inputs: ["id"] }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i5.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "ngmodule", type: MatInputModule }, { kind: "directive", type: i6.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly"], exportAs: ["matInput"] }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i2.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i2.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { kind: "directive", type: i2.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "directive", type: i2.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "ngmodule", type: TranslateModule }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
50
+ }
51
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.2.1", ngImport: i0, type: AddLinkDialogComponent, decorators: [{
52
+ type: Component,
53
+ args: [{ standalone: true, imports: [
54
+ CommonModule,
55
+ MatButtonModule,
56
+ MatDialogModule,
57
+ MatFormFieldModule,
58
+ MatIconModule,
59
+ MatInputModule,
60
+ ReactiveFormsModule,
61
+ TranslateModule
62
+ ], selector: 'app-add-link-dialog', changeDetection: ChangeDetectionStrategy.OnPush, template: "<div mat-dialog-title>{{ data.title }}</div>\n<div\n mat-dialog-content\n [formGroup]=\"form\">\n <mat-form-field appearance=\"outline\">\n <mat-label>{{ data.textPlaceholder }}</mat-label>\n <input\n matInput\n [formControl]=\"form.controls.text\"\n (keydown.enter)=\"onEnter()\"\n required />\n <mat-error>The {{ data.textPlaceholder }} is required.</mat-error>\n </mat-form-field>\n <mat-form-field appearance=\"outline\">\n <mat-label>{{ data.linkPlaceholder }}</mat-label>\n <input\n matInput\n [formControl]=\"form.controls.link\"\n (keydown.enter)=\"onEnter()\"\n required />\n <mat-error>The {{ data.linkPlaceholder }} is required.</mat-error>\n </mat-form-field>\n</div>\n<div mat-dialog-actions>\n <button\n mat-button\n (click)=\"onClose()\">\n <mat-icon\n fontSet=\"nc-icon\"\n fontIcon=\"icon-cancel-thin\"></mat-icon>\n Cancel\n </button>\n <button\n mat-raised-button\n color=\"primary\"\n class=\"apply-btn\"\n [disabled]=\"form.invalid\"\n (click)=\"onApply()\">\n <mat-icon\n fontSet=\"nc-icon\"\n fontIcon=\"icon-done-thin\"></mat-icon>\n Apply\n </button>\n</div>\n", styles: [":host{height:300px;width:430px;display:block;overflow:hidden}:host ::ng-deep .mdc-text-field--outlined{--mdc-outlined-text-field-container-shape: 12px;height:48px}:host ::ng-deep .mat-mdc-text-field-wrapper.mdc-text-field--outlined .mat-mdc-form-field-infix{padding-top:12px}.mat-mdc-dialog-title{font-weight:600;padding-top:5px}mat-form-field{width:100%}.mat-mdc-dialog-content{padding-top:10px;padding-bottom:0}.mat-mdc-dialog-actions{display:flex;justify-content:center;align-items:center;padding-top:5px;height:25%}.mat-mdc-dialog-actions button{width:30%;height:100%;letter-spacing:1px;border-radius:8px}.mat-mdc-dialog-actions button .apply-btn{font-weight:400}.mat-mdc-dialog-actions button .mat-icon{font-size:24px;height:24px}\n"] }]
63
+ }], ctorParameters: () => [{ type: i1.MatDialogRef }, { type: AddLinkDialogOptions, decorators: [{
64
+ type: Inject,
65
+ args: [MAT_DIALOG_DATA]
66
+ }] }, { type: i2.FormBuilder }] });
67
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWRkLWxpbmstZGlhbG9nLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25neC1ub2Rlci9zcmMvbGliLytzaGFyZWQvYWRkLWxpbmstZGlhbG9nL2FkZC1saW5rLWRpYWxvZy5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtbm9kZXIvc3JjL2xpYi8rc2hhcmVkL2FkZC1saW5rLWRpYWxvZy9hZGQtbGluay1kaWFsb2cuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLHVCQUF1QixFQUFFLFNBQVMsRUFBRSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDM0UsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQy9DLE9BQU8sRUFBdUMsbUJBQW1CLEVBQUUsVUFBVSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDdEcsT0FBTyxFQUFFLGVBQWUsRUFBRSxlQUFlLEVBQWdCLE1BQU0sMEJBQTBCLENBQUM7QUFDMUYsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQzNELE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBQ2xFLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUN2RCxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDekQsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBRXRELE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLDhCQUE4QixDQUFDOzs7Ozs7OztBQUVoRSxNQUFNLE9BQU8sb0JBQW9CO0lBTzdCLFlBQW1CLE1BQXNDO1FBQ3JELElBQUksTUFBTSxFQUFFO1lBQ1IsTUFBTSxDQUFDLE1BQU0sQ0FBQyxJQUFJLEVBQUUsTUFBTSxDQUFDLENBQUM7U0FDL0I7SUFDTCxDQUFDO0NBQ0o7QUFtQkQsTUFBTSxPQUFPLHNCQUFzQjtJQUcvQixZQUNXLFNBQStDLEVBQ3RCLElBQTBCLEVBQ2xELEVBQWU7UUFGaEIsY0FBUyxHQUFULFNBQVMsQ0FBc0M7UUFDdEIsU0FBSSxHQUFKLElBQUksQ0FBc0I7UUFDbEQsT0FBRSxHQUFGLEVBQUUsQ0FBYTtRQUV2QixTQUFTLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQztRQUM5QixJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDO1lBQ3RCLElBQUksRUFBRSxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsVUFBVSxDQUFDLFFBQVEsQ0FBQztZQUN0QyxJQUFJLEVBQUUsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUMsVUFBVSxDQUFDLFFBQVEsRUFBRSxnQkFBZ0IsQ0FBQyxZQUFZLENBQUMsQ0FBQztTQUMxRSxDQUFDLENBQUM7SUFDUCxDQUFDO0lBRUQsT0FBTztRQUNILElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxFQUFFLENBQUM7SUFDM0IsQ0FBQztJQUVELE9BQU87UUFDSCxJQUFJLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxFQUFFLElBQUksRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLElBQUksRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQztJQUN2RyxDQUFDO0lBRUQsT0FBTztRQUNILElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUU7WUFDbkIsT0FBTztTQUNWO1FBRUQsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO0lBQ25CLENBQUM7OEdBN0JRLHNCQUFzQiw4Q0FLbkIsZUFBZTtrR0FMbEIsc0JBQXNCLCtFQzNDbkMsdzFDQTRDQSwweEJEZlEsWUFBWSw4QkFDWixlQUFlLDJOQUNmLGVBQWUseWJBQ2Ysa0JBQWtCLHVZQUNsQixhQUFhLG1MQUNiLGNBQWMsMFdBQ2QsbUJBQW1CLG1sQ0FDbkIsZUFBZTs7MkZBT1Ysc0JBQXNCO2tCQWpCbEMsU0FBUztpQ0FDTSxJQUFJLFdBQ1A7d0JBQ0wsWUFBWTt3QkFDWixlQUFlO3dCQUNmLGVBQWU7d0JBQ2Ysa0JBQWtCO3dCQUNsQixhQUFhO3dCQUNiLGNBQWM7d0JBQ2QsbUJBQW1CO3dCQUNuQixlQUFlO3FCQUNsQixZQUNTLHFCQUFxQixtQkFHZCx1QkFBdUIsQ0FBQyxNQUFNOzswQkFPMUMsTUFBTTsyQkFBQyxlQUFlIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksIENvbXBvbmVudCwgSW5qZWN0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBDb21tb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgRm9ybUJ1aWxkZXIsIEZvcm1Db250cm9sLCBGb3JtR3JvdXAsIFJlYWN0aXZlRm9ybXNNb2R1bGUsIFZhbGlkYXRvcnMgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBNQVRfRElBTE9HX0RBVEEsIE1hdERpYWxvZ01vZHVsZSwgTWF0RGlhbG9nUmVmIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvZGlhbG9nJztcbmltcG9ydCB7IE1hdEJ1dHRvbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2J1dHRvbic7XG5pbXBvcnQgeyBNYXRGb3JtRmllbGRNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9mb3JtLWZpZWxkJztcbmltcG9ydCB7IE1hdEljb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9pY29uJztcbmltcG9ydCB7IE1hdElucHV0TW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvaW5wdXQnO1xuaW1wb3J0IHsgVHJhbnNsYXRlTW9kdWxlIH0gZnJvbSAnQG5neC10cmFuc2xhdGUvY29yZSc7XG5cbmltcG9ydCB7IFZhbGlkYXRpb25IZWxwZXIgfSBmcm9tICcuLi9oZWxwZXJzL3ZhbGlkYXRpb24uaGVscGVyJztcblxuZXhwb3J0IGNsYXNzIEFkZExpbmtEaWFsb2dPcHRpb25zIHtcbiAgICBwdWJsaWMgdGl0bGU6IHN0cmluZztcbiAgICBwdWJsaWMgdGV4dDogc3RyaW5nO1xuICAgIHB1YmxpYyB0ZXh0UGxhY2Vob2xkZXI6IHN0cmluZztcbiAgICBwdWJsaWMgbGluazogc3RyaW5nO1xuICAgIHB1YmxpYyBsaW5rUGxhY2Vob2xkZXI6IHN0cmluZztcblxuICAgIHB1YmxpYyBjb25zdHJ1Y3RvcihmaWVsZHM/OiBQYXJ0aWFsPEFkZExpbmtEaWFsb2dPcHRpb25zPikge1xuICAgICAgICBpZiAoZmllbGRzKSB7XG4gICAgICAgICAgICBPYmplY3QuYXNzaWduKHRoaXMsIGZpZWxkcyk7XG4gICAgICAgIH1cbiAgICB9XG59XG5cbkBDb21wb25lbnQoe1xuICAgIHN0YW5kYWxvbmU6IHRydWUsXG4gICAgaW1wb3J0czogW1xuICAgICAgICBDb21tb25Nb2R1bGUsXG4gICAgICAgIE1hdEJ1dHRvbk1vZHVsZSxcbiAgICAgICAgTWF0RGlhbG9nTW9kdWxlLFxuICAgICAgICBNYXRGb3JtRmllbGRNb2R1bGUsXG4gICAgICAgIE1hdEljb25Nb2R1bGUsXG4gICAgICAgIE1hdElucHV0TW9kdWxlLFxuICAgICAgICBSZWFjdGl2ZUZvcm1zTW9kdWxlLFxuICAgICAgICBUcmFuc2xhdGVNb2R1bGVcbiAgICBdLFxuICAgIHNlbGVjdG9yOiAnYXBwLWFkZC1saW5rLWRpYWxvZycsXG4gICAgdGVtcGxhdGVVcmw6ICdhZGQtbGluay1kaWFsb2cuY29tcG9uZW50Lmh0bWwnLFxuICAgIHN0eWxlVXJsczogWydhZGQtbGluay1kaWFsb2cuY29tcG9uZW50LnNjc3MnXSxcbiAgICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaFxufSlcbmV4cG9ydCBjbGFzcyBBZGRMaW5rRGlhbG9nQ29tcG9uZW50IHtcbiAgICBmb3JtOiBGb3JtR3JvdXA8eyB0ZXh0OiBGb3JtQ29udHJvbDxzdHJpbmc+OyBsaW5rOiBGb3JtQ29udHJvbDxzdHJpbmc+IH0+O1xuXG4gICAgY29uc3RydWN0b3IoXG4gICAgICAgIHB1YmxpYyBkaWFsb2dSZWY6IE1hdERpYWxvZ1JlZjxBZGRMaW5rRGlhbG9nQ29tcG9uZW50PixcbiAgICAgICAgQEluamVjdChNQVRfRElBTE9HX0RBVEEpIHB1YmxpYyBkYXRhOiBBZGRMaW5rRGlhbG9nT3B0aW9ucyxcbiAgICAgICAgcHJpdmF0ZSBmYjogRm9ybUJ1aWxkZXJcbiAgICApIHtcbiAgICAgICAgZGlhbG9nUmVmLmRpc2FibGVDbG9zZSA9IHRydWU7XG4gICAgICAgIHRoaXMuZm9ybSA9IHRoaXMuZmIuZ3JvdXAoe1xuICAgICAgICAgICAgdGV4dDogW2RhdGEudGV4dCwgVmFsaWRhdG9ycy5yZXF1aXJlZF0sXG4gICAgICAgICAgICBsaW5rOiBbZGF0YS5saW5rLCBbVmFsaWRhdG9ycy5yZXF1aXJlZCwgVmFsaWRhdGlvbkhlbHBlci51cmxWYWxpZGF0b3JdXVxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBvbkNsb3NlKCk6IHZvaWQge1xuICAgICAgICB0aGlzLmRpYWxvZ1JlZi5jbG9zZSgpO1xuICAgIH1cblxuICAgIG9uQXBwbHkoKTogdm9pZCB7XG4gICAgICAgIHRoaXMuZGlhbG9nUmVmLmNsb3NlKHsgdGV4dDogdGhpcy5mb3JtLmNvbnRyb2xzLnRleHQudmFsdWUsIGxpbms6IHRoaXMuZm9ybS5jb250cm9scy5saW5rLnZhbHVlIH0pO1xuICAgIH1cblxuICAgIG9uRW50ZXIoKTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLmZvcm0uaW52YWxpZCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5vbkFwcGx5KCk7XG4gICAgfVxufVxuIiwiPGRpdiBtYXQtZGlhbG9nLXRpdGxlPnt7IGRhdGEudGl0bGUgfX08L2Rpdj5cbjxkaXZcbiAgICBtYXQtZGlhbG9nLWNvbnRlbnRcbiAgICBbZm9ybUdyb3VwXT1cImZvcm1cIj5cbiAgICA8bWF0LWZvcm0tZmllbGQgYXBwZWFyYW5jZT1cIm91dGxpbmVcIj5cbiAgICAgICAgPG1hdC1sYWJlbD57eyBkYXRhLnRleHRQbGFjZWhvbGRlciB9fTwvbWF0LWxhYmVsPlxuICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgIG1hdElucHV0XG4gICAgICAgICAgICBbZm9ybUNvbnRyb2xdPVwiZm9ybS5jb250cm9scy50ZXh0XCJcbiAgICAgICAgICAgIChrZXlkb3duLmVudGVyKT1cIm9uRW50ZXIoKVwiXG4gICAgICAgICAgICByZXF1aXJlZCAvPlxuICAgICAgICA8bWF0LWVycm9yPlRoZSB7eyBkYXRhLnRleHRQbGFjZWhvbGRlciB9fSBpcyByZXF1aXJlZC48L21hdC1lcnJvcj5cbiAgICA8L21hdC1mb3JtLWZpZWxkPlxuICAgIDxtYXQtZm9ybS1maWVsZCBhcHBlYXJhbmNlPVwib3V0bGluZVwiPlxuICAgICAgICA8bWF0LWxhYmVsPnt7IGRhdGEubGlua1BsYWNlaG9sZGVyIH19PC9tYXQtbGFiZWw+XG4gICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgbWF0SW5wdXRcbiAgICAgICAgICAgIFtmb3JtQ29udHJvbF09XCJmb3JtLmNvbnRyb2xzLmxpbmtcIlxuICAgICAgICAgICAgKGtleWRvd24uZW50ZXIpPVwib25FbnRlcigpXCJcbiAgICAgICAgICAgIHJlcXVpcmVkIC8+XG4gICAgICAgIDxtYXQtZXJyb3I+VGhlIHt7IGRhdGEubGlua1BsYWNlaG9sZGVyIH19IGlzIHJlcXVpcmVkLjwvbWF0LWVycm9yPlxuICAgIDwvbWF0LWZvcm0tZmllbGQ+XG48L2Rpdj5cbjxkaXYgbWF0LWRpYWxvZy1hY3Rpb25zPlxuICAgIDxidXR0b25cbiAgICAgICAgbWF0LWJ1dHRvblxuICAgICAgICAoY2xpY2spPVwib25DbG9zZSgpXCI+XG4gICAgICAgIDxtYXQtaWNvblxuICAgICAgICAgICAgZm9udFNldD1cIm5jLWljb25cIlxuICAgICAgICAgICAgZm9udEljb249XCJpY29uLWNhbmNlbC10aGluXCI+PC9tYXQtaWNvbj5cbiAgICAgICAgQ2FuY2VsXG4gICAgPC9idXR0b24+XG4gICAgPGJ1dHRvblxuICAgICAgICBtYXQtcmFpc2VkLWJ1dHRvblxuICAgICAgICBjb2xvcj1cInByaW1hcnlcIlxuICAgICAgICBjbGFzcz1cImFwcGx5LWJ0blwiXG4gICAgICAgIFtkaXNhYmxlZF09XCJmb3JtLmludmFsaWRcIlxuICAgICAgICAoY2xpY2spPVwib25BcHBseSgpXCI+XG4gICAgICAgIDxtYXQtaWNvblxuICAgICAgICAgICAgZm9udFNldD1cIm5jLWljb25cIlxuICAgICAgICAgICAgZm9udEljb249XCJpY29uLWRvbmUtdGhpblwiPjwvbWF0LWljb24+XG4gICAgICAgIEFwcGx5XG4gICAgPC9idXR0b24+XG48L2Rpdj5cbiJdfQ==