@wertzui/ngx-restworld-client 2.0.0 → 3.1.1

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 (39) hide show
  1. package/{esm2015/lib/constants/link-names.js → esm2020/lib/constants/link-names.mjs} +0 -0
  2. package/{esm2015/lib/models/api-url.js → esm2020/lib/models/api-url.mjs} +0 -0
  3. package/{esm2015/lib/models/client-settings.js → esm2020/lib/models/client-settings.mjs} +1 -1
  4. package/{esm2015/lib/models/problem-details.js → esm2020/lib/models/problem-details.mjs} +0 -0
  5. package/{esm2015/lib/models/restworld-options.js → esm2020/lib/models/restworld-options.mjs} +0 -0
  6. package/{esm2015/lib/pipes/as.pipe.js → esm2020/lib/pipes/as.pipe.mjs} +4 -4
  7. package/{esm2015/lib/pipes/safe-url.pipe.js → esm2020/lib/pipes/safe-url.pipe.mjs} +4 -4
  8. package/esm2020/lib/restworld-client.module.mjs +200 -0
  9. package/{esm2015/lib/services/avatar-generator.js → esm2020/lib/services/avatar-generator.mjs} +4 -4
  10. package/{esm2015/lib/services/form.service.js → esm2020/lib/services/form.service.mjs} +4 -4
  11. package/esm2020/lib/services/restworld-client-collection.mjs +39 -0
  12. package/esm2020/lib/services/restworld-client.mjs +165 -0
  13. package/esm2020/lib/services/settings.service.mjs +39 -0
  14. package/esm2020/lib/views/restworld-edit-form/restworld-edit-form.component.mjs +230 -0
  15. package/esm2020/lib/views/restworld-edit-view/restworld-edit-view.component.mjs +313 -0
  16. package/esm2020/lib/views/restworld-file-view/restworld-file-view.component.mjs +57 -0
  17. package/esm2020/lib/views/restworld-image-view/restworld-image-view.component.mjs +100 -0
  18. package/esm2020/lib/views/restworld-list-view/restworld-list-view.component.mjs +341 -0
  19. package/{esm2015/public-api.js → esm2020/public-api.mjs} +0 -0
  20. package/{esm2015/wertzui-ngx-restworld-client.js → esm2020/wertzui-ngx-restworld-client.mjs} +0 -0
  21. package/fesm2015/wertzui-ngx-restworld-client.mjs +1709 -0
  22. package/fesm2015/wertzui-ngx-restworld-client.mjs.map +1 -0
  23. package/fesm2020/wertzui-ngx-restworld-client.mjs +1649 -0
  24. package/fesm2020/wertzui-ngx-restworld-client.mjs.map +1 -0
  25. package/lib/models/client-settings.d.ts +4 -1
  26. package/package.json +42 -31
  27. package/bundles/wertzui-ngx-restworld-client.umd.js +0 -2477
  28. package/bundles/wertzui-ngx-restworld-client.umd.js.map +0 -1
  29. package/esm2015/lib/restworld-client.module.js +0 -201
  30. package/esm2015/lib/services/restworld-client-collection.js +0 -42
  31. package/esm2015/lib/services/restworld-client.js +0 -183
  32. package/esm2015/lib/services/settings.service.js +0 -47
  33. package/esm2015/lib/views/restworld-edit-form/restworld-edit-form.component.js +0 -238
  34. package/esm2015/lib/views/restworld-edit-view/restworld-edit-view.component.js +0 -335
  35. package/esm2015/lib/views/restworld-file-view/restworld-file-view.component.js +0 -63
  36. package/esm2015/lib/views/restworld-image-view/restworld-image-view.component.js +0 -107
  37. package/esm2015/lib/views/restworld-list-view/restworld-list-view.component.js +0 -353
  38. package/fesm2015/wertzui-ngx-restworld-client.js +0 -1728
  39. package/fesm2015/wertzui-ngx-restworld-client.js.map +0 -1
@@ -0,0 +1,313 @@
1
+ import { Component, Input } from '@angular/core';
2
+ import { PropertyType } from '@wertzui/ngx-hal-client';
3
+ import { FormGroup } from '@angular/forms';
4
+ import { ProblemDetails } from '../../models/problem-details';
5
+ import { ContentChild } from '@angular/core';
6
+ import * as i0 from "@angular/core";
7
+ import * as i1 from "../../services/restworld-client-collection";
8
+ import * as i2 from "primeng/api";
9
+ import * as i3 from "@angular/common";
10
+ import * as i4 from "@angular/router";
11
+ import * as i5 from "../../services/form.service";
12
+ import * as i6 from "ngx-valdemort";
13
+ import * as i7 from "primeng/tabview";
14
+ import * as i8 from "primeng/skeleton";
15
+ import * as i9 from "../restworld-edit-form/restworld-edit-form.component";
16
+ import * as i10 from "primeng/progressspinner";
17
+ import * as i11 from "primeng/toast";
18
+ import * as i12 from "primeng/confirmdialog";
19
+ import * as i13 from "@angular/forms";
20
+ import * as i14 from "primeng/button";
21
+ import * as i15 from "primeng/ripple";
22
+ export class RESTworldEditViewComponent {
23
+ constructor(_clients, _confirmationService, _messageService, _location, _router, _formService, valdemortConfig) {
24
+ this._clients = _clients;
25
+ this._confirmationService = _confirmationService;
26
+ this._messageService = _messageService;
27
+ this._location = _location;
28
+ this._router = _router;
29
+ this._formService = _formService;
30
+ this._templates = {};
31
+ this._formTabs = {};
32
+ this.isLoading = false;
33
+ valdemortConfig.errorClasses = 'p-error text-sm';
34
+ }
35
+ get PropertyType() {
36
+ return PropertyType;
37
+ }
38
+ get templates() {
39
+ return this._templates;
40
+ }
41
+ get isLoadingForTheFirstTime() {
42
+ return Object.keys(this.templates).length === 0 && this.isLoading;
43
+ }
44
+ get formTabs() {
45
+ return this._formTabs;
46
+ }
47
+ set apiName(value) {
48
+ this._apiName = value;
49
+ this.load();
50
+ }
51
+ get apiName() {
52
+ return this._apiName;
53
+ }
54
+ //@Input()
55
+ //public set rel(value: string | undefined) {
56
+ // this._rel = value;
57
+ //}
58
+ //public get rel(): string | undefined {
59
+ // return this._rel;
60
+ //}
61
+ //private _rel?: string;
62
+ set uri(value) {
63
+ this._uri = value;
64
+ this.load();
65
+ }
66
+ get uri() {
67
+ return this._uri;
68
+ }
69
+ get resource() {
70
+ return this._resource;
71
+ }
72
+ get canSave() {
73
+ const length = this.resource?._links["save"]?.length;
74
+ return length !== undefined && length > 0;
75
+ }
76
+ get canDelete() {
77
+ const length = this.resource?._links["delete"]?.length;
78
+ return length !== undefined && length > 0;
79
+ }
80
+ canSubmit(templateName) {
81
+ const form = this.formTabs[templateName];
82
+ return form && form.valid;
83
+ }
84
+ getTooltip(resource, keysToExclude) {
85
+ const tooltip = Object.entries(resource)
86
+ .filter(([key]) => !(key.startsWith('_') || ['createdAt', 'createdBy', 'lastChangedAt', 'lastChangedBy', 'timestamp'].includes(key) || keysToExclude?.includes(key)))
87
+ .reduce((prev, [key, value], index) => `${prev}${index === 0 ? '' : '\n'}${key}: ${RESTworldEditViewComponent.jsonStringifyWithElipsis(value)}`, '');
88
+ return tooltip;
89
+ }
90
+ static jsonStringifyWithElipsis(value) {
91
+ const maxLength = 200;
92
+ const end = 10;
93
+ const start = maxLength - end - 2;
94
+ const json = JSON.stringify(value);
95
+ const shortened = json.length > maxLength ? json.substring(0, start) + '…' + json.substring(json.length - end) : json;
96
+ return shortened;
97
+ }
98
+ getClient() {
99
+ if (!this.apiName)
100
+ throw new Error('Cannot get a client, because the apiName is not set.');
101
+ return this._clients.getClient(this.apiName);
102
+ }
103
+ async submit(templateName, template, formValue) {
104
+ this.isLoading = true;
105
+ try {
106
+ const targetBeforeSave = template.target;
107
+ const response = await this.getClient().submit(template, formValue);
108
+ if (!response.ok) {
109
+ let summary = 'Error';
110
+ let detail = 'Error while saving the resource.';
111
+ if (ProblemDetails.isProblemDetails(response.body)) {
112
+ const problemDetails = response.body;
113
+ summary = problemDetails.title || summary;
114
+ detail = problemDetails.detail || detail;
115
+ // display validation errors
116
+ if (problemDetails['errors']) {
117
+ const form = this.formTabs[templateName];
118
+ for (const [key, errorsForKey] of Object.entries(problemDetails['errors'])) {
119
+ const path = key.split(/\.|\[/).map(e => e.replace("]", ""));
120
+ const formControl = path.reduce((control, pathElement) => (control instanceof FormGroup ? control.controls[pathElement] : control) || control, form);
121
+ formControl.setErrors({ remote: errorsForKey });
122
+ }
123
+ }
124
+ }
125
+ this._messageService.add({ severity: 'error', summary: summary, detail: detail, data: response, life: 10000 });
126
+ }
127
+ else {
128
+ const responseResource = response.body;
129
+ const targetAfterSave = responseResource._templates[templateName].target;
130
+ setTimeout(() => this._messageService.add({ severity: 'success', summary: 'Saved', detail: 'The resource has been saved.' }), 100);
131
+ if (targetBeforeSave !== targetAfterSave) {
132
+ this._router.navigate(['/edit', this.apiName, responseResource._links.self[0].href]);
133
+ }
134
+ }
135
+ }
136
+ catch (e) {
137
+ this._messageService.add({ severity: 'error', summary: 'Error', detail: `An unknown error occurred. ${JSON.stringify(e)}`, life: 10000 });
138
+ console.log(e);
139
+ }
140
+ this.isLoading = false;
141
+ }
142
+ showDeleteConfirmatioModal() {
143
+ this._confirmationService.confirm({
144
+ message: 'Do you really want to delete this resource?',
145
+ header: 'Confirm delete',
146
+ icon: 'far fa-trash-alt',
147
+ accept: () => this.delete()
148
+ });
149
+ }
150
+ async delete() {
151
+ if (!this.apiName || !this.uri || !this.resource)
152
+ return;
153
+ Object.assign(this.resource, this.formTabs.value);
154
+ await this.getClient().delete(this.resource);
155
+ setTimeout(() => this._messageService.add({ severity: 'success', summary: 'Deleted', detail: 'The resource has been deleted.' }), 100);
156
+ this._location.back();
157
+ }
158
+ async load() {
159
+ if (!this.apiName || !this.uri)
160
+ return;
161
+ this.isLoading = true;
162
+ const response = await this.getClient().getSingle(this.uri);
163
+ if (!response.ok || ProblemDetails.isProblemDetails(response.body) || !response.body) {
164
+ this._messageService.add({ severity: 'error', summary: 'Error', detail: 'Error while loading the resource from the API.', data: response });
165
+ }
166
+ else {
167
+ this._resource = response.body;
168
+ this._templates = await this.getAllTemplates(this._resource);
169
+ this._formTabs = this._formService.createFormGroupsFromTemplates(this._templates);
170
+ }
171
+ this.isLoading = false;
172
+ }
173
+ async setInitialSelectedOptionsElementsForTemplates(templates) {
174
+ return Promise.all(Object.values(templates)
175
+ .map(template => this.setInitialSelectedOptionsElementsForTemplate(template)));
176
+ }
177
+ imageChanged(formControl, event) {
178
+ const file = event.files[0];
179
+ console.log(file);
180
+ const reader = new FileReader();
181
+ reader.onload = () => {
182
+ const uri = reader.result;
183
+ console.log(uri);
184
+ formControl.setValue(uri);
185
+ };
186
+ reader.readAsDataURL(file);
187
+ }
188
+ async setInitialSelectedOptionsElementsForTemplate(template) {
189
+ return Promise.all(template.properties
190
+ .filter(property => property?.options?.link?.href)
191
+ .map(property => this.setInitialSelectedOptionsElementForProperty(property)));
192
+ }
193
+ async setInitialSelectedOptionsElementForProperty(property) {
194
+ const options = property?.options;
195
+ if (!options?.link?.href)
196
+ return;
197
+ const templatedUri = options.link.href;
198
+ const filter = `${options.valueField} eq ${property.value}`;
199
+ const response = await this.getClient().getListByUri(templatedUri, { $filter: filter, $top: 10 });
200
+ if (!response.ok || ProblemDetails.isProblemDetails(response.body) || !response.body) {
201
+ const message = `An error occurred while getting the filtered items.`;
202
+ this._messageService.add({ severity: 'error', summary: 'Error', detail: message, data: response });
203
+ return;
204
+ }
205
+ const items = response.body._embedded.items;
206
+ options.inline = items;
207
+ }
208
+ async getAllTemplates(resource) {
209
+ const formResponses = await this.getClient().getAllForms(resource);
210
+ const failedResponses = formResponses.filter(response => !response.ok || ProblemDetails.isProblemDetails(response.body) || !response.body);
211
+ if (failedResponses.length !== 0) {
212
+ for (const response of failedResponses) {
213
+ this._messageService.add({ severity: 'error', summary: 'Error', detail: 'Error while loading the resource from the API.', data: response });
214
+ }
215
+ return Promise.resolve({});
216
+ }
217
+ const formTemplates = Object.assign({}, ...formResponses.map(response => response.body._templates));
218
+ await this.setInitialSelectedOptionsElementsForTemplates(formTemplates);
219
+ return formTemplates;
220
+ }
221
+ }
222
+ RESTworldEditViewComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.2.5", ngImport: i0, type: RESTworldEditViewComponent, deps: [{ token: i1.RESTworldClientCollection }, { token: i2.ConfirmationService }, { token: i2.MessageService }, { token: i3.Location }, { token: i4.Router }, { token: i5.FormService }, { token: i6.ValdemortConfig }], target: i0.ɵɵFactoryTarget.Component });
223
+ RESTworldEditViewComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.2.5", type: RESTworldEditViewComponent, selector: "rw-edit", inputs: { apiName: "apiName", uri: "uri" }, queries: [{ propertyName: "extraTabsRef", first: true, predicate: ["extraTabs"], descendants: true }, { propertyName: "buttonsRef", first: true, predicate: ["buttons"], descendants: true }, { propertyName: "inputOptionsSingleRef", first: true, predicate: ["inputOptionsSingle"], descendants: true }, { propertyName: "inputOptionsMultipleRef", first: true, predicate: ["inputOptionsMultiple"], descendants: true }, { propertyName: "inputOptionsRef", first: true, predicate: ["inputOptions"], descendants: true }, { propertyName: "inputHiddenRef", first: true, predicate: ["inputHidden"], descendants: true }, { propertyName: "inputTextRef", first: true, predicate: ["inputText"], descendants: true }, { propertyName: "inputTextareaRef", first: true, predicate: ["inputTextarea"], descendants: true }, { propertyName: "inputSearchRef", first: true, predicate: ["inputSearch"], descendants: true }, { propertyName: "inputTelRef", first: true, predicate: ["inputTel"], descendants: true }, { propertyName: "inputUrlRef", first: true, predicate: ["inputUrl"], descendants: true }, { propertyName: "inputEmailRef", first: true, predicate: ["inputEmail"], descendants: true }, { propertyName: "inputPasswordRef", first: true, predicate: ["inputPassword"], descendants: true }, { propertyName: "inputDateRef", first: true, predicate: ["inputDate"], descendants: true }, { propertyName: "inputMonthRef", first: true, predicate: ["inputMonth"], descendants: true }, { propertyName: "inputWeekRef", first: true, predicate: ["inputWeek"], descendants: true }, { propertyName: "inputTimeRef", first: true, predicate: ["inputTime"], descendants: true }, { propertyName: "inputDatetimeLocalRef", first: true, predicate: ["inputDatetimeLocal"], descendants: true }, { propertyName: "inputNumberRef", first: true, predicate: ["inputNumber"], descendants: true }, { propertyName: "inputRangeRef", first: true, predicate: ["inputRange"], descendants: true }, { propertyName: "inputColorRef", first: true, predicate: ["inputColor"], descendants: true }, { propertyName: "inputBoolRef", first: true, predicate: ["inputBool"], descendants: true }, { propertyName: "inputDatetimeOffsetRef", first: true, predicate: ["inputDatetimeOffset"], descendants: true }, { propertyName: "inputDurationRef", first: true, predicate: ["inputDuration"], descendants: true }, { propertyName: "inputImageRef", first: true, predicate: ["inputImage"], descendants: true }, { propertyName: "inputFileRef", first: true, predicate: ["inputFile"], descendants: true }, { propertyName: "inputDefaultRef", first: true, predicate: ["inputDefault"], descendants: true }], ngImport: i0, template: "<div class=\"grid\">\r\n <div class=\"col\">\r\n <h1>Edit resource</h1>\r\n </div>\r\n</div>\r\n\r\n<p-tabView>\r\n\r\n <p-tabPanel *ngIf=\"isLoadingForTheFirstTime\" header=\"Loading\">\r\n <div *ngFor=\"let i of [1, 2, 3, 4, 5]\" class=\"grid field\">\r\n <p-skeleton class=\"col-12 mb-2 md:col-2 md:mb-0\" height=\"39px\"></p-skeleton>\r\n <div class=\"col-12 md:col-10\">\r\n <p-skeleton class=\"w-full\" height=\"39px\"></p-skeleton>\r\n </div>\r\n </div>\r\n <div class=\"grid\">\r\n <div class=\"col\">\r\n <div class=\"flex justify-content-end w-full\">\r\n <p-skeleton width=\"120px\" height=\"39px\" class=\"mx-2\"></p-skeleton>\r\n <p-skeleton width=\"120px\" height=\"39px\" class=\"mx-2\"></p-skeleton>\r\n <p-skeleton width=\"120px\" height=\"39px\" class=\"mx-2\"></p-skeleton>\r\n </div>\r\n </div>\r\n </div>\r\n </p-tabPanel>\r\n\r\n <p-tabPanel *ngFor=\"let item of templates | keyvalue\" [header]=\"item.value.title || item.key\" [disabled]=\"isLoading\">\r\n <form [formGroup]=\"formTabs[item.key]\" (ngSubmit)=\"submit(item.key, item.value, formTabs[item.key].value)\">\r\n <div class=\"blockable-container\">\r\n <div class=\"blockable-element\">\r\n <rw-form [formGroup]=\"formTabs[item.key]\" [template]=\"item.value\" [apiName]=\"apiName\"></rw-form>\r\n </div>\r\n <div class=\"blockable-overlay\" *ngIf=\"isLoading\">\r\n <p-progressSpinner></p-progressSpinner>\r\n </div>\r\n </div>\r\n\r\n <div class=\"grid\">\r\n <div class=\"col\">\r\n <div class=\"flex justify-content-end w-full\">\r\n <ng-template #defaultButtons>\r\n <button pButton pRipple type=\"submit\" label=\"Save\" icon=\"far fa-save\" class=\"mx-2 p-button-success\" [disabled]=\"isLoading || !canSubmit(item.key)\"></button>\r\n <button pButton pRipple type=\"button\" label=\"Reload\" icon=\"fas fa-redo\" class=\"mx-2 p-button-info\" (click)=\"load()\" [disabled]=\"isLoading\"></button>\r\n <button pButton pRipple type=\"button\" label=\"Delete\" icon=\"far fa-trash-alt\" class=\"ml-2 p-button-danger\" (click)=\"showDeleteConfirmatioModal()\" [disabled]=\"!resource || isLoading || !canDelete\"></button>\r\n </ng-template>\r\n <ng-container *ngTemplateOutlet=\"buttonsRef || defaultButtons\"></ng-container>\r\n </div>\r\n </div>\r\n </div>\r\n </form>\r\n </p-tabPanel>\r\n\r\n <ng-template #defaultExtraTabs>\r\n </ng-template>\r\n <ng-container *ngTemplateOutlet=\"extraTabsRef || defaultExtraTabs\"></ng-container>\r\n\r\n</p-tabView>\r\n\r\n<p-toast></p-toast>\r\n<p-confirmDialog></p-confirmDialog>\r\n", styles: ["::ng-deep .p-tooltip{max-width:-moz-fit-content!important;max-width:fit-content!important}.blockable-container{display:grid;place-items:center;grid-template-areas:\"inner\"}.blockable-element{grid-area:inner;width:100%}.blockable-overlay{grid-area:inner;height:100%;width:100%;background-color:#0006;display:flex;align-items:center;justify-content:center;z-index:1}.field.grid>label.hasChildren{border-right:1px solid rgba(0,0,0,.1)}\n"], components: [{ type: i7.TabView, selector: "p-tabView", inputs: ["orientation", "style", "styleClass", "controlClose", "scrollable", "activeIndex"], outputs: ["onChange", "onClose", "activeIndexChange"] }, { type: i7.TabPanel, selector: "p-tabPanel", inputs: ["closable", "headerStyle", "headerStyleClass", "cache", "tooltip", "tooltipPosition", "tooltipPositionStyle", "tooltipStyleClass", "selected", "disabled", "header", "leftIcon", "rightIcon"] }, { type: i8.Skeleton, selector: "p-skeleton", inputs: ["styleClass", "style", "shape", "animation", "borderRadius", "size", "width", "height"] }, { type: i9.RestworldEditFormComponent, selector: "rw-form", inputs: ["formGroup", "template", "apiName"] }, { type: i10.ProgressSpinner, selector: "p-progressSpinner", inputs: ["style", "styleClass", "strokeWidth", "fill", "animationDuration"] }, { type: i11.Toast, selector: "p-toast", inputs: ["key", "autoZIndex", "baseZIndex", "style", "styleClass", "position", "preventOpenDuplicates", "preventDuplicates", "showTransformOptions", "hideTransformOptions", "showTransitionOptions", "hideTransitionOptions", "breakpoints"], outputs: ["onClose"] }, { type: i12.ConfirmDialog, selector: "p-confirmDialog", inputs: ["header", "icon", "message", "style", "styleClass", "maskStyleClass", "acceptIcon", "acceptLabel", "acceptAriaLabel", "acceptVisible", "rejectIcon", "rejectLabel", "rejectAriaLabel", "rejectVisible", "acceptButtonStyleClass", "rejectButtonStyleClass", "closeOnEscape", "dismissableMask", "blockScroll", "rtl", "closable", "appendTo", "key", "autoZIndex", "baseZIndex", "transitionOptions", "focusTrap", "defaultFocus", "breakpoints", "visible", "position"], outputs: ["onHide"] }], directives: [{ type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i3.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i13.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { type: i13.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { type: i13.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { type: i14.ButtonDirective, selector: "[pButton]", inputs: ["iconPos", "loadingIcon", "label", "icon", "loading"] }, { type: i15.Ripple, selector: "[pRipple]" }, { type: i3.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet"] }], pipes: { "keyvalue": i3.KeyValuePipe } });
224
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.2.5", ngImport: i0, type: RESTworldEditViewComponent, decorators: [{
225
+ type: Component,
226
+ args: [{ selector: 'rw-edit', template: "<div class=\"grid\">\r\n <div class=\"col\">\r\n <h1>Edit resource</h1>\r\n </div>\r\n</div>\r\n\r\n<p-tabView>\r\n\r\n <p-tabPanel *ngIf=\"isLoadingForTheFirstTime\" header=\"Loading\">\r\n <div *ngFor=\"let i of [1, 2, 3, 4, 5]\" class=\"grid field\">\r\n <p-skeleton class=\"col-12 mb-2 md:col-2 md:mb-0\" height=\"39px\"></p-skeleton>\r\n <div class=\"col-12 md:col-10\">\r\n <p-skeleton class=\"w-full\" height=\"39px\"></p-skeleton>\r\n </div>\r\n </div>\r\n <div class=\"grid\">\r\n <div class=\"col\">\r\n <div class=\"flex justify-content-end w-full\">\r\n <p-skeleton width=\"120px\" height=\"39px\" class=\"mx-2\"></p-skeleton>\r\n <p-skeleton width=\"120px\" height=\"39px\" class=\"mx-2\"></p-skeleton>\r\n <p-skeleton width=\"120px\" height=\"39px\" class=\"mx-2\"></p-skeleton>\r\n </div>\r\n </div>\r\n </div>\r\n </p-tabPanel>\r\n\r\n <p-tabPanel *ngFor=\"let item of templates | keyvalue\" [header]=\"item.value.title || item.key\" [disabled]=\"isLoading\">\r\n <form [formGroup]=\"formTabs[item.key]\" (ngSubmit)=\"submit(item.key, item.value, formTabs[item.key].value)\">\r\n <div class=\"blockable-container\">\r\n <div class=\"blockable-element\">\r\n <rw-form [formGroup]=\"formTabs[item.key]\" [template]=\"item.value\" [apiName]=\"apiName\"></rw-form>\r\n </div>\r\n <div class=\"blockable-overlay\" *ngIf=\"isLoading\">\r\n <p-progressSpinner></p-progressSpinner>\r\n </div>\r\n </div>\r\n\r\n <div class=\"grid\">\r\n <div class=\"col\">\r\n <div class=\"flex justify-content-end w-full\">\r\n <ng-template #defaultButtons>\r\n <button pButton pRipple type=\"submit\" label=\"Save\" icon=\"far fa-save\" class=\"mx-2 p-button-success\" [disabled]=\"isLoading || !canSubmit(item.key)\"></button>\r\n <button pButton pRipple type=\"button\" label=\"Reload\" icon=\"fas fa-redo\" class=\"mx-2 p-button-info\" (click)=\"load()\" [disabled]=\"isLoading\"></button>\r\n <button pButton pRipple type=\"button\" label=\"Delete\" icon=\"far fa-trash-alt\" class=\"ml-2 p-button-danger\" (click)=\"showDeleteConfirmatioModal()\" [disabled]=\"!resource || isLoading || !canDelete\"></button>\r\n </ng-template>\r\n <ng-container *ngTemplateOutlet=\"buttonsRef || defaultButtons\"></ng-container>\r\n </div>\r\n </div>\r\n </div>\r\n </form>\r\n </p-tabPanel>\r\n\r\n <ng-template #defaultExtraTabs>\r\n </ng-template>\r\n <ng-container *ngTemplateOutlet=\"extraTabsRef || defaultExtraTabs\"></ng-container>\r\n\r\n</p-tabView>\r\n\r\n<p-toast></p-toast>\r\n<p-confirmDialog></p-confirmDialog>\r\n", styles: ["::ng-deep .p-tooltip{max-width:-moz-fit-content!important;max-width:fit-content!important}.blockable-container{display:grid;place-items:center;grid-template-areas:\"inner\"}.blockable-element{grid-area:inner;width:100%}.blockable-overlay{grid-area:inner;height:100%;width:100%;background-color:#0006;display:flex;align-items:center;justify-content:center;z-index:1}.field.grid>label.hasChildren{border-right:1px solid rgba(0,0,0,.1)}\n"] }]
227
+ }], ctorParameters: function () { return [{ type: i1.RESTworldClientCollection }, { type: i2.ConfirmationService }, { type: i2.MessageService }, { type: i3.Location }, { type: i4.Router }, { type: i5.FormService }, { type: i6.ValdemortConfig }]; }, propDecorators: { apiName: [{
228
+ type: Input
229
+ }], uri: [{
230
+ type: Input
231
+ }], extraTabsRef: [{
232
+ type: ContentChild,
233
+ args: ['extraTabs', { static: false }]
234
+ }], buttonsRef: [{
235
+ type: ContentChild,
236
+ args: ['buttons', { static: false }]
237
+ }], inputOptionsSingleRef: [{
238
+ type: ContentChild,
239
+ args: ['inputOptionsSingle', { static: false }]
240
+ }], inputOptionsMultipleRef: [{
241
+ type: ContentChild,
242
+ args: ['inputOptionsMultiple', { static: false }]
243
+ }], inputOptionsRef: [{
244
+ type: ContentChild,
245
+ args: ['inputOptions', { static: false }]
246
+ }], inputHiddenRef: [{
247
+ type: ContentChild,
248
+ args: ['inputHidden', { static: false }]
249
+ }], inputTextRef: [{
250
+ type: ContentChild,
251
+ args: ['inputText', { static: false }]
252
+ }], inputTextareaRef: [{
253
+ type: ContentChild,
254
+ args: ['inputTextarea', { static: false }]
255
+ }], inputSearchRef: [{
256
+ type: ContentChild,
257
+ args: ['inputSearch', { static: false }]
258
+ }], inputTelRef: [{
259
+ type: ContentChild,
260
+ args: ['inputTel', { static: false }]
261
+ }], inputUrlRef: [{
262
+ type: ContentChild,
263
+ args: ['inputUrl', { static: false }]
264
+ }], inputEmailRef: [{
265
+ type: ContentChild,
266
+ args: ['inputEmail', { static: false }]
267
+ }], inputPasswordRef: [{
268
+ type: ContentChild,
269
+ args: ['inputPassword', { static: false }]
270
+ }], inputDateRef: [{
271
+ type: ContentChild,
272
+ args: ['inputDate', { static: false }]
273
+ }], inputMonthRef: [{
274
+ type: ContentChild,
275
+ args: ['inputMonth', { static: false }]
276
+ }], inputWeekRef: [{
277
+ type: ContentChild,
278
+ args: ['inputWeek', { static: false }]
279
+ }], inputTimeRef: [{
280
+ type: ContentChild,
281
+ args: ['inputTime', { static: false }]
282
+ }], inputDatetimeLocalRef: [{
283
+ type: ContentChild,
284
+ args: ['inputDatetimeLocal', { static: false }]
285
+ }], inputNumberRef: [{
286
+ type: ContentChild,
287
+ args: ['inputNumber', { static: false }]
288
+ }], inputRangeRef: [{
289
+ type: ContentChild,
290
+ args: ['inputRange', { static: false }]
291
+ }], inputColorRef: [{
292
+ type: ContentChild,
293
+ args: ['inputColor', { static: false }]
294
+ }], inputBoolRef: [{
295
+ type: ContentChild,
296
+ args: ['inputBool', { static: false }]
297
+ }], inputDatetimeOffsetRef: [{
298
+ type: ContentChild,
299
+ args: ['inputDatetimeOffset', { static: false }]
300
+ }], inputDurationRef: [{
301
+ type: ContentChild,
302
+ args: ['inputDuration', { static: false }]
303
+ }], inputImageRef: [{
304
+ type: ContentChild,
305
+ args: ['inputImage', { static: false }]
306
+ }], inputFileRef: [{
307
+ type: ContentChild,
308
+ args: ['inputFile', { static: false }]
309
+ }], inputDefaultRef: [{
310
+ type: ContentChild,
311
+ args: ['inputDefault', { static: false }]
312
+ }] } });
313
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVzdHdvcmxkLWVkaXQtdmlldy5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtcmVzdHdvcmxkLWNsaWVudC9zcmMvbGliL3ZpZXdzL3Jlc3R3b3JsZC1lZGl0LXZpZXcvcmVzdHdvcmxkLWVkaXQtdmlldy5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtcmVzdHdvcmxkLWNsaWVudC9zcmMvbGliL3ZpZXdzL3Jlc3R3b3JsZC1lZGl0LXZpZXcvcmVzdHdvcmxkLWVkaXQtdmlldy5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNqRCxPQUFPLEVBQUUsWUFBWSxFQUEwRCxNQUFNLHlCQUF5QixDQUFDO0FBRy9HLE9BQU8sRUFBZ0MsU0FBUyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFJekUsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBQzlELE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxlQUFlLENBQUM7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBVTdDLE1BQU0sT0FBTywwQkFBMEI7SUFnSnJDLFlBQ1UsUUFBbUMsRUFDbkMsb0JBQXlDLEVBQ3pDLGVBQStCLEVBQy9CLFNBQW1CLEVBQ25CLE9BQWUsRUFDZixZQUF5QixFQUNqQyxlQUFnQztRQU54QixhQUFRLEdBQVIsUUFBUSxDQUEyQjtRQUNuQyx5QkFBb0IsR0FBcEIsb0JBQW9CLENBQXFCO1FBQ3pDLG9CQUFlLEdBQWYsZUFBZSxDQUFnQjtRQUMvQixjQUFTLEdBQVQsU0FBUyxDQUFVO1FBQ25CLFlBQU8sR0FBUCxPQUFPLENBQVE7UUFDZixpQkFBWSxHQUFaLFlBQVksQ0FBYTtRQS9JM0IsZUFBVSxHQUFjLEVBQUUsQ0FBQztRQVMzQixjQUFTLEdBQWtD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SWhELGFBQWE7c0JBRFosWUFBWTt1QkFBQyxZQUFZLEVBQUUsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFO2dCQUk3QyxZQUFZO3NCQURYLFlBQVk7dUJBQUMsV0FBVyxFQUFFLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRTtnQkFJNUMsZUFBZTtzQkFEZCxZQUFZO3VCQUFDLGNBQWMsRUFBRSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIElucHV0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IFByb3BlcnR5VHlwZSwgUmVzb3VyY2UsIFRlbXBsYXRlLCBUZW1wbGF0ZXMsIEZvcm1zUmVzb3VyY2UsIFByb3BlcnR5IH0gZnJvbSAnQHdlcnR6dWkvbmd4LWhhbC1jbGllbnQnO1xyXG5pbXBvcnQgeyBSRVNUd29ybGRDbGllbnQgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9yZXN0d29ybGQtY2xpZW50JztcclxuaW1wb3J0IHsgUkVTVHdvcmxkQ2xpZW50Q29sbGVjdGlvbiB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL3Jlc3R3b3JsZC1jbGllbnQtY29sbGVjdGlvbic7XHJcbmltcG9ydCB7IEFic3RyYWN0Q29udHJvbCwgRm9ybUNvbnRyb2wsIEZvcm1Hcm91cCB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcclxuaW1wb3J0IHsgQ29uZmlybWF0aW9uU2VydmljZSwgTWVzc2FnZVNlcnZpY2UgfSBmcm9tICdwcmltZW5nL2FwaSc7XHJcbmltcG9ydCB7IExvY2F0aW9uIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcclxuaW1wb3J0IHsgUm91dGVyIH0gZnJvbSAnQGFuZ3VsYXIvcm91dGVyJztcclxuaW1wb3J0IHsgUHJvYmxlbURldGFpbHMgfSBmcm9tICcuLi8uLi9tb2RlbHMvcHJvYmxlbS1kZXRhaWxzJztcclxuaW1wb3J0IHsgQ29udGVudENoaWxkIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IFRlbXBsYXRlUmVmIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IFZhbGRlbW9ydENvbmZpZyB9IGZyb20gJ25neC12YWxkZW1vcnQnO1xyXG5pbXBvcnQgeyBGb3JtU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL2Zvcm0uc2VydmljZSc7XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogJ3J3LWVkaXQnLFxyXG4gIHRlbXBsYXRlVXJsOiAnLi9yZXN0d29ybGQtZWRpdC12aWV3LmNvbXBvbmVudC5odG1sJyxcclxuICBzdHlsZVVybHM6IFsnLi9yZXN0d29ybGQtZWRpdC12aWV3LmNvbXBvbmVudC5jc3MnXVxyXG59KVxyXG5leHBvcnQgY2xhc3MgUkVTVHdvcmxkRWRpdFZpZXdDb21wb25lbnQge1xyXG4gIHB1YmxpYyBnZXQgUHJvcGVydHlUeXBlKCkge1xyXG4gICAgcmV0dXJuIFByb3BlcnR5VHlwZTtcclxuICB9XHJcbiAgcHVibGljIGdldCB0ZW1wbGF0ZXMoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5fdGVtcGxhdGVzO1xyXG4gIH1cclxuICBwcml2YXRlIF90ZW1wbGF0ZXM6IFRlbXBsYXRlcyA9IHt9O1xyXG5cclxuICBwdWJsaWMgZ2V0IGlzTG9hZGluZ0ZvclRoZUZpcnN0VGltZSgpIHtcclxuICAgIHJldHVybiBPYmplY3Qua2V5cyh0aGlzLnRlbXBsYXRlcykubGVuZ3RoID09PSAwICYmIHRoaXMuaXNMb2FkaW5nO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGdldCBmb3JtVGFicygpIHtcclxuICAgIHJldHVybiB0aGlzLl9mb3JtVGFicztcclxuICB9XHJcbiAgcHJpdmF0ZSBfZm9ybVRhYnM6IHsgW25hbWU6IHN0cmluZ106IEZvcm1Hcm91cCB9ID0ge307XHJcblxyXG4gIEBJbnB1dCgpXHJcbiAgcHVibGljIHNldCBhcGlOYW1lKHZhbHVlOiBzdHJpbmcgfCB1bmRlZmluZWQpIHtcclxuICAgIHRoaXMuX2FwaU5hbWUgPSB2YWx1ZTtcclxuICAgIHRoaXMubG9hZCgpO1xyXG4gIH1cclxuICBwdWJsaWMgZ2V0IGFwaU5hbWUoKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcclxuICAgIHJldHVybiB0aGlzLl9hcGlOYW1lO1xyXG4gIH1cclxuICBwcml2YXRlIF9hcGlOYW1lPzogc3RyaW5nO1xyXG4gIC8vQElucHV0KClcclxuICAvL3B1YmxpYyBzZXQgcmVsKHZhbHVlOiBzdHJpbmcgfCB1bmRlZmluZWQpIHtcclxuICAvLyAgdGhpcy5fcmVsID0gdmFsdWU7XHJcbiAgLy99XHJcbiAgLy9wdWJsaWMgZ2V0IHJlbCgpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xyXG4gIC8vICByZXR1cm4gdGhpcy5fcmVsO1xyXG4gIC8vfVxyXG4gIC8vcHJpdmF0ZSBfcmVsPzogc3RyaW5nO1xyXG4gIEBJbnB1dCgpXHJcbiAgcHVibGljIHNldCB1cmkodmFsdWU6IHN0cmluZyB8IHVuZGVmaW5lZCkge1xyXG4gICAgdGhpcy5fdXJpID0gdmFsdWU7XHJcbiAgICB0aGlzLmxvYWQoKTtcclxuICB9XHJcbiAgcHVibGljIGdldCB1cmkoKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcclxuICAgIHJldHVybiB0aGlzLl91cmk7XHJcbiAgfVxyXG4gIHByaXZhdGUgX3VyaT86IHN0cmluZztcclxuXHJcbiAgcHVibGljIGdldCByZXNvdXJjZSgpIHtcclxuICAgIHJldHVybiB0aGlzLl9yZXNvdXJjZTtcclxuICB9XHJcbiAgcHJpdmF0ZSBfcmVzb3VyY2U/OiBSZXNvdXJjZTtcclxuICBwdWJsaWMgaXNMb2FkaW5nID0gZmFsc2U7XHJcbiAgcHVibGljIGdldCBjYW5TYXZlKCkge1xyXG4gICAgY29uc3QgbGVuZ3RoID0gdGhpcy5yZXNvdXJjZT8uX2xpbmtzW1wic2F2ZVwiXT8ubGVuZ3RoO1xyXG4gICAgcmV0dXJuIGxlbmd0aCAhPT0gdW5kZWZpbmVkICYmIGxlbmd0aCA+IDA7XHJcbiAgfVxyXG4gIHB1YmxpYyBnZXQgY2FuRGVsZXRlKCkge1xyXG4gICAgY29uc3QgbGVuZ3RoID0gdGhpcy5yZXNvdXJjZT8uX2xpbmtzW1wiZGVsZXRlXCJdPy5sZW5ndGg7XHJcbiAgICByZXR1cm4gbGVuZ3RoICE9PSB1bmRlZmluZWQgJiYgbGVuZ3RoID4gMDtcclxuICB9XHJcbiAgcHVibGljIGNhblN1Ym1pdCh0ZW1wbGF0ZU5hbWU6IHN0cmluZykge1xyXG4gICAgY29uc3QgZm9ybSA9IHRoaXMuZm9ybVRhYnNbdGVtcGxhdGVOYW1lXTtcclxuICAgIHJldHVybiBmb3JtICYmIGZvcm0udmFsaWQ7XHJcbiAgfVxyXG5cclxuICBAQ29udGVudENoaWxkKCdleHRyYVRhYnMnLCB7IHN0YXRpYzogZmFsc2UgfSlcclxuICBleHRyYVRhYnNSZWY/OiBUZW1wbGF0ZVJlZjx1bmtub3duPjtcclxuXHJcbiAgQENvbnRlbnRDaGlsZCgnYnV0dG9ucycsIHsgc3RhdGljOiBmYWxzZSB9KVxyXG4gIGJ1dHRvbnNSZWY/OiBUZW1wbGF0ZVJlZjx1bmtub3duPjtcclxuXHJcbiAgQENvbnRlbnRDaGlsZCgnaW5wdXRPcHRpb25zU2luZ2xlJywgeyBzdGF0aWM6IGZhbHNlIH0pXHJcbiAgaW5wdXRPcHRpb25zU2luZ2xlUmVmPzogVGVtcGxhdGVSZWY8dW5rbm93bj47XHJcblxyXG4gIEBDb250ZW50Q2hpbGQoJ2lucHV0T3B0aW9uc011bHRpcGxlJywgeyBzdGF0aWM6IGZhbHNlIH0pXHJcbiAgaW5wdXRPcHRpb25zTXVsdGlwbGVSZWY/OiBUZW1wbGF0ZVJlZjx1bmtub3duPjtcclxuXHJcbiAgQENvbnRlbnRDaGlsZCgnaW5wdXRPcHRpb25zJywgeyBzdGF0aWM6IGZhbHNlIH0pXHJcbiAgaW5wdXRPcHRpb25zUmVmPzogVGVtcGxhdGVSZWY8dW5rbm93bj47XHJcblxyXG4gIEBDb250ZW50Q2hpbGQoJ2lucHV0SGlkZGVuJywgeyBzdGF0aWM6IGZhbHNlIH0pXHJcbiAgaW5wdXRIaWRkZW5SZWY/OiBUZW1wbGF0ZVJlZjx1bmtub3duPjtcclxuXHJcbiAgQENvbnRlbnRDaGlsZCgnaW5wdXRUZXh0JywgeyBzdGF0aWM6IGZhbHNlIH0pXHJcbiAgaW5wdXRUZXh0UmVmPzogVGVtcGxhdGVSZWY8dW5rbm93bj47XHJcblxyXG4gIEBDb250ZW50Q2hpbGQoJ2lucHV0VGV4dGFyZWEnLCB7IHN0YXRpYzogZmFsc2UgfSlcclxuICBpbnB1dFRleHRhcmVhUmVmPzogVGVtcGxhdGVSZWY8dW5rbm93bj47XHJcblxyXG4gIEBDb250ZW50Q2hpbGQoJ2lucHV0U2VhcmNoJywgeyBzdGF0aWM6IGZhbHNlIH0pXHJcbiAgaW5wdXRTZWFyY2hSZWY/OiBUZW1wbGF0ZVJlZjx1bmtub3duPjtcclxuXHJcbiAgQENvbnRlbnRDaGlsZCgnaW5wdXRUZWwnLCB7IHN0YXRpYzogZmFsc2UgfSlcclxuICBpbnB1dFRlbFJlZj86IFRlbXBsYXRlUmVmPHVua25vd24+O1xyXG5cclxuICBAQ29udGVudENoaWxkKCdpbnB1dFVybCcsIHsgc3RhdGljOiBmYWxzZSB9KVxyXG4gIGlucHV0VXJsUmVmPzogVGVtcGxhdGVSZWY8dW5rbm93bj47XHJcblxyXG4gIEBDb250ZW50Q2hpbGQoJ2lucHV0RW1haWwnLCB7IHN0YXRpYzogZmFsc2UgfSlcclxuICBpbnB1dEVtYWlsUmVmPzogVGVtcGxhdGVSZWY8dW5rbm93bj47XHJcblxyXG4gIEBDb250ZW50Q2hpbGQoJ2lucHV0UGFzc3dvcmQnLCB7IHN0YXRpYzogZmFsc2UgfSlcclxuICBpbnB1dFBhc3N3b3JkUmVmPzogVGVtcGxhdGVSZWY8dW5rbm93bj47XHJcblxyXG4gIEBDb250ZW50Q2hpbGQoJ2lucHV0RGF0ZScsIHsgc3RhdGljOiBmYWxzZSB9KVxyXG4gIGlucHV0RGF0ZVJlZj86IFRlbXBsYXRlUmVmPHVua25vd24+O1xyXG5cclxuICBAQ29udGVudENoaWxkKCdpbnB1dE1vbnRoJywgeyBzdGF0aWM6IGZhbHNlIH0pXHJcbiAgaW5wdXRNb250aFJlZj86IFRlbXBsYXRlUmVmPHVua25vd24+O1xyXG5cclxuICBAQ29udGVudENoaWxkKCdpbnB1dFdlZWsnLCB7IHN0YXRpYzogZmFsc2UgfSlcclxuICBpbnB1dFdlZWtSZWY/OiBUZW1wbGF0ZVJlZjx1bmtub3duPjtcclxuXHJcbiAgQENvbnRlbnRDaGlsZCgnaW5wdXRUaW1lJywgeyBzdGF0aWM6IGZhbHNlIH0pXHJcbiAgaW5wdXRUaW1lUmVmPzogVGVtcGxhdGVSZWY8dW5rbm93bj47XHJcblxyXG4gIEBDb250ZW50Q2hpbGQoJ2lucHV0RGF0ZXRpbWVMb2NhbCcsIHsgc3RhdGljOiBmYWxzZSB9KVxyXG4gIGlucHV0RGF0ZXRpbWVMb2NhbFJlZj86IFRlbXBsYXRlUmVmPHVua25vd24+O1xyXG5cclxuICBAQ29udGVudENoaWxkKCdpbnB1dE51bWJlcicsIHsgc3RhdGljOiBmYWxzZSB9KVxyXG4gIGlucHV0TnVtYmVyUmVmPzogVGVtcGxhdGVSZWY8dW5rbm93bj47XHJcblxyXG4gIEBDb250ZW50Q2hpbGQoJ2lucHV0UmFuZ2UnLCB7IHN0YXRpYzogZmFsc2UgfSlcclxuICBpbnB1dFJhbmdlUmVmPzogVGVtcGxhdGVSZWY8dW5rbm93bj47XHJcblxyXG4gIEBDb250ZW50Q2hpbGQoJ2lucHV0Q29sb3InLCB7IHN0YXRpYzogZmFsc2UgfSlcclxuICBpbnB1dENvbG9yUmVmPzogVGVtcGxhdGVSZWY8dW5rbm93bj47XHJcblxyXG4gIEBDb250ZW50Q2hpbGQoJ2lucHV0Qm9vbCcsIHsgc3RhdGljOiBmYWxzZSB9KVxyXG4gIGlucHV0Qm9vbFJlZj86IFRlbXBsYXRlUmVmPHVua25vd24+O1xyXG5cclxuICBAQ29udGVudENoaWxkKCdpbnB1dERhdGV0aW1lT2Zmc2V0JywgeyBzdGF0aWM6IGZhbHNlIH0pXHJcbiAgaW5wdXREYXRldGltZU9mZnNldFJlZj86IFRlbXBsYXRlUmVmPHVua25vd24+O1xyXG5cclxuICBAQ29udGVudENoaWxkKCdpbnB1dER1cmF0aW9uJywgeyBzdGF0aWM6IGZhbHNlIH0pXHJcbiAgaW5wdXREdXJhdGlvblJlZj86IFRlbXBsYXRlUmVmPHVua25vd24+O1xyXG5cclxuICBAQ29udGVudENoaWxkKCdpbnB1dEltYWdlJywgeyBzdGF0aWM6IGZhbHNlIH0pXHJcbiAgaW5wdXRJbWFnZVJlZj86IFRlbXBsYXRlUmVmPHVua25vd24+O1xyXG5cclxuICBAQ29udGVudENoaWxkKCdpbnB1dEZpbGUnLCB7IHN0YXRpYzogZmFsc2UgfSlcclxuICBpbnB1dEZpbGVSZWY/OiBUZW1wbGF0ZVJlZjx1bmtub3duPjtcclxuXHJcbiAgQENvbnRlbnRDaGlsZCgnaW5wdXREZWZhdWx0JywgeyBzdGF0aWM6IGZhbHNlIH0pXHJcbiAgaW5wdXREZWZhdWx0UmVmPzogVGVtcGxhdGVSZWY8dW5rbm93bj47XHJcblxyXG4gIGNvbnN0cnVjdG9yKFxyXG4gICAgcHJpdmF0ZSBfY2xpZW50czogUkVTVHdvcmxkQ2xpZW50Q29sbGVjdGlvbixcclxuICAgIHByaXZhdGUgX2NvbmZpcm1hdGlvblNlcnZpY2U6IENvbmZpcm1hdGlvblNlcnZpY2UsXHJcbiAgICBwcml2YXRlIF9tZXNzYWdlU2VydmljZTogTWVzc2FnZVNlcnZpY2UsXHJcbiAgICBwcml2YXRlIF9sb2NhdGlvbjogTG9jYXRpb24sXHJcbiAgICBwcml2YXRlIF9yb3V0ZXI6IFJvdXRlcixcclxuICAgIHByaXZhdGUgX2Zvcm1TZXJ2aWNlOiBGb3JtU2VydmljZSxcclxuICAgIHZhbGRlbW9ydENvbmZpZzogVmFsZGVtb3J0Q29uZmlnKSB7XHJcbiAgICB2YWxkZW1vcnRDb25maWcuZXJyb3JDbGFzc2VzID0gJ3AtZXJyb3IgdGV4dC1zbSc7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZ2V0VG9vbHRpcChyZXNvdXJjZTogUmVzb3VyY2UsIGtleXNUb0V4Y2x1ZGU/OiBzdHJpbmdbXSk6IHN0cmluZyB7XHJcbiAgICBjb25zdCB0b29sdGlwID0gT2JqZWN0LmVudHJpZXMocmVzb3VyY2UpXHJcbiAgICAgIC5maWx0ZXIoKFtrZXldKSA9PiAhKGtleS5zdGFydHNXaXRoKCdfJykgfHwgWydjcmVhdGVkQXQnLCAnY3JlYXRlZEJ5JywgJ2xhc3RDaGFuZ2VkQXQnLCAnbGFzdENoYW5nZWRCeScsICd0aW1lc3RhbXAnXS5pbmNsdWRlcyhrZXkpIHx8IGtleXNUb0V4Y2x1ZGU/LmluY2x1ZGVzKGtleSkpKVxyXG4gICAgICAucmVkdWNlKChwcmV2LCBba2V5LCB2YWx1ZV0sIGluZGV4KSA9PiBgJHtwcmV2fSR7aW5kZXggPT09IDAgPyAnJyA6ICdcXG4nfSR7a2V5fTogJHtSRVNUd29ybGRFZGl0Vmlld0NvbXBvbmVudC5qc29uU3RyaW5naWZ5V2l0aEVsaXBzaXModmFsdWUpfWAsICcnKTtcclxuXHJcbiAgICByZXR1cm4gdG9vbHRpcDtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgc3RhdGljIGpzb25TdHJpbmdpZnlXaXRoRWxpcHNpcyh2YWx1ZTogdW5rbm93bikge1xyXG4gICAgY29uc3QgbWF4TGVuZ3RoID0gMjAwO1xyXG4gICAgY29uc3QgZW5kID0gMTA7XHJcbiAgICBjb25zdCBzdGFydCA9IG1heExlbmd0aCAtIGVuZCAtIDI7XHJcbiAgICBjb25zdCBqc29uID0gSlNPTi5zdHJpbmdpZnkodmFsdWUpO1xyXG4gICAgY29uc3Qgc2hvcnRlbmVkID0ganNvbi5sZW5ndGggPiBtYXhMZW5ndGggPyBqc29uLnN1YnN0cmluZygwLCBzdGFydCkgKyAn4oCmJyArIGpzb24uc3Vic3RyaW5nKGpzb24ubGVuZ3RoIC0gZW5kKSA6IGpzb247XHJcblxyXG4gICAgcmV0dXJuIHNob3J0ZW5lZDtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgZ2V0Q2xpZW50KCk6IFJFU1R3b3JsZENsaWVudCB7XHJcbiAgICBpZiAoIXRoaXMuYXBpTmFtZSlcclxuICAgICAgdGhyb3cgbmV3IEVycm9yKCdDYW5ub3QgZ2V0IGEgY2xpZW50LCBiZWNhdXNlIHRoZSBhcGlOYW1lIGlzIG5vdCBzZXQuJyk7XHJcblxyXG4gICAgcmV0dXJuIHRoaXMuX2NsaWVudHMuZ2V0Q2xpZW50KHRoaXMuYXBpTmFtZSk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgYXN5bmMgc3VibWl0KHRlbXBsYXRlTmFtZTogc3RyaW5nLCB0ZW1wbGF0ZTogVGVtcGxhdGUsIGZvcm1WYWx1ZToge30pIHtcclxuICAgIHRoaXMuaXNMb2FkaW5nID0gdHJ1ZTtcclxuXHJcbiAgICB0cnkge1xyXG4gICAgICBjb25zdCB0YXJnZXRCZWZvcmVTYXZlID0gdGVtcGxhdGUudGFyZ2V0O1xyXG4gICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHRoaXMuZ2V0Q2xpZW50KCkuc3VibWl0KHRlbXBsYXRlLCBmb3JtVmFsdWUpO1xyXG5cclxuICAgICAgaWYgKCFyZXNwb25zZS5vaykge1xyXG4gICAgICAgIGxldCBzdW1tYXJ5ID0gJ0Vycm9yJztcclxuICAgICAgICBsZXQgZGV0YWlsID0gJ0Vycm9yIHdoaWxlIHNhdmluZyB0aGUgcmVzb3VyY2UuJztcclxuICAgICAgICBpZiAoUHJvYmxlbURldGFpbHMuaXNQcm9ibGVtRGV0YWlscyhyZXNwb25zZS5ib2R5KSkge1xyXG4gICAgICAgICAgY29uc3QgcHJvYmxlbURldGFpbHMgPSByZXNwb25zZS5ib2R5IGFzIFByb2JsZW1EZXRhaWxzO1xyXG4gICAgICAgICAgc3VtbWFyeSA9IHByb2JsZW1EZXRhaWxzLnRpdGxlIHx8IHN1bW1hcnk7XHJcbiAgICAgICAgICBkZXRhaWwgPSBwcm9ibGVtRGV0YWlscy5kZXRhaWwgfHwgZGV0YWlsO1xyXG4gICAgICAgICAgLy8gZGlzcGxheSB2YWxpZGF0aW9uIGVycm9yc1xyXG4gICAgICAgICAgaWYgKHByb2JsZW1EZXRhaWxzWydlcnJvcnMnXSBhcyB7fSkge1xyXG4gICAgICAgICAgICBjb25zdCBmb3JtID0gdGhpcy5mb3JtVGFic1t0ZW1wbGF0ZU5hbWVdO1xyXG4gICAgICAgICAgICBmb3IgKGNvbnN0IFtrZXksIGVycm9yc0ZvcktleV0gb2YgT2JqZWN0LmVudHJpZXMocHJvYmxlbURldGFpbHNbJ2Vycm9ycyddIGFzIHt9KSkge1xyXG4gICAgICAgICAgICAgIGNvbnN0IHBhdGggPSBrZXkuc3BsaXQoL1xcLnxcXFsvKS5tYXAoZSA9PiBlLnJlcGxhY2UoXCJdXCIsIFwiXCIpKTtcclxuICAgICAgICAgICAgICBjb25zdCBmb3JtQ29udHJvbCA9IHBhdGgucmVkdWNlPEFic3RyYWN0Q29udHJvbD4oKGNvbnRyb2wsIHBhdGhFbGVtZW50KSA9PiAoY29udHJvbCBpbnN0YW5jZW9mIEZvcm1Hcm91cCA/IGNvbnRyb2wuY29udHJvbHNbcGF0aEVsZW1lbnRdIDogY29udHJvbCkgfHwgY29udHJvbCwgZm9ybSk7XHJcbiAgICAgICAgICAgICAgZm9ybUNvbnRyb2wuc2V0RXJyb3JzKHsgcmVtb3RlOiBlcnJvcnNGb3JLZXkgfSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMuX21lc3NhZ2VTZXJ2aWNlLmFkZCh7IHNldmVyaXR5OiAnZXJyb3InLCBzdW1tYXJ5OiBzdW1tYXJ5LCBkZXRhaWw6IGRldGFpbCwgZGF0YTogcmVzcG9uc2UsIGxpZmU6IDEwMDAwIH0pO1xyXG4gICAgICB9XHJcbiAgICAgIGVsc2Uge1xyXG4gICAgICAgIGNvbnN0IHJlc3BvbnNlUmVzb3VyY2UgPSAocmVzcG9uc2UuYm9keSBhcyBGb3Jtc1Jlc291cmNlKTtcclxuICAgICAgICBjb25zdCB0YXJnZXRBZnRlclNhdmUgPSByZXNwb25zZVJlc291cmNlLl90ZW1wbGF0ZXNbdGVtcGxhdGVOYW1lXS50YXJnZXQ7XHJcblxyXG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT5cclxuICAgICAgICAgIHRoaXMuX21lc3NhZ2VTZXJ2aWNlLmFkZCh7IHNldmVyaXR5OiAnc3VjY2VzcycsIHN1bW1hcnk6ICdTYXZlZCcsIGRldGFpbDogJ1RoZSByZXNvdXJjZSBoYXMgYmVlbiBzYXZlZC4nIH0pLFxyXG4gICAgICAgICAgMTAwKTtcclxuXHJcbiAgICAgICAgaWYgKHRhcmdldEJlZm9yZVNhdmUgIT09IHRhcmdldEFmdGVyU2F2ZSkge1xyXG4gICAgICAgICAgdGhpcy5fcm91dGVyLm5hdmlnYXRlKFsnL2VkaXQnLCB0aGlzLmFwaU5hbWUsIHJlc3BvbnNlUmVzb3VyY2UuX2xpbmtzLnNlbGZbMF0uaHJlZl0pO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG5cclxuICAgIH1cclxuICAgIGNhdGNoIChlOiB1bmtub3duKSB7XHJcbiAgICAgIHRoaXMuX21lc3NhZ2VTZXJ2aWNlLmFkZCh7IHNldmVyaXR5OiAnZXJyb3InLCBzdW1tYXJ5OiAnRXJyb3InLCBkZXRhaWw6IGBBbiB1bmtub3duIGVycm9yIG9jY3VycmVkLiAke0pTT04uc3RyaW5naWZ5KGUpfWAsIGxpZmU6IDEwMDAwIH0pO1xyXG4gICAgICBjb25zb2xlLmxvZyhlKTtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLmlzTG9hZGluZyA9IGZhbHNlO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHNob3dEZWxldGVDb25maXJtYXRpb01vZGFsKCkge1xyXG4gICAgdGhpcy5fY29uZmlybWF0aW9uU2VydmljZS5jb25maXJtKHtcclxuICAgICAgbWVzc2FnZTogJ0RvIHlvdSByZWFsbHkgd2FudCB0byBkZWxldGUgdGhpcyByZXNvdXJjZT8nLFxyXG4gICAgICBoZWFkZXI6ICdDb25maXJtIGRlbGV0ZScsXHJcbiAgICAgIGljb246ICdmYXIgZmEtdHJhc2gtYWx0JyxcclxuICAgICAgYWNjZXB0OiAoKSA9PiB0aGlzLmRlbGV0ZSgpXHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBhc3luYyBkZWxldGUoKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBpZiAoIXRoaXMuYXBpTmFtZSB8fCAhdGhpcy51cmkgfHwgIXRoaXMucmVzb3VyY2UpXHJcbiAgICAgIHJldHVybjtcclxuXHJcbiAgICBPYmplY3QuYXNzaWduKHRoaXMucmVzb3VyY2UsIHRoaXMuZm9ybVRhYnMudmFsdWUpO1xyXG5cclxuICAgIGF3YWl0IHRoaXMuZ2V0Q2xpZW50KCkuZGVsZXRlKHRoaXMucmVzb3VyY2UpO1xyXG4gICAgc2V0VGltZW91dCgoKSA9PlxyXG4gICAgICB0aGlzLl9tZXNzYWdlU2VydmljZS5hZGQoeyBzZXZlcml0eTogJ3N1Y2Nlc3MnLCBzdW1tYXJ5OiAnRGVsZXRlZCcsIGRldGFpbDogJ1RoZSByZXNvdXJjZSBoYXMgYmVlbiBkZWxldGVkLicgfSksXHJcbiAgICAgIDEwMCk7XHJcblxyXG4gICAgdGhpcy5fbG9jYXRpb24uYmFjaygpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGFzeW5jIGxvYWQoKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBpZiAoIXRoaXMuYXBpTmFtZSB8fCAhdGhpcy51cmkpXHJcbiAgICAgIHJldHVybjtcclxuXHJcbiAgICB0aGlzLmlzTG9hZGluZyA9IHRydWU7XHJcblxyXG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCB0aGlzLmdldENsaWVudCgpLmdldFNpbmdsZSh0aGlzLnVyaSk7XHJcbiAgICBpZiAoIXJlc3BvbnNlLm9rIHx8IFByb2JsZW1EZXRhaWxzLmlzUHJvYmxlbURldGFpbHMocmVzcG9uc2UuYm9keSkgfHwgIXJlc3BvbnNlLmJvZHkpIHtcclxuICAgICAgdGhpcy5fbWVzc2FnZVNlcnZpY2UuYWRkKHsgc2V2ZXJpdHk6ICdlcnJvcicsIHN1bW1hcnk6ICdFcnJvcicsIGRldGFpbDogJ0Vycm9yIHdoaWxlIGxvYWRpbmcgdGhlIHJlc291cmNlIGZyb20gdGhlIEFQSS4nLCBkYXRhOiByZXNwb25zZSB9KTtcclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICB0aGlzLl9yZXNvdXJjZSA9IHJlc3BvbnNlLmJvZHk7XHJcbiAgICAgIHRoaXMuX3RlbXBsYXRlcyA9IGF3YWl0IHRoaXMuZ2V0QWxsVGVtcGxhdGVzKHRoaXMuX3Jlc291cmNlKTtcclxuICAgICAgdGhpcy5fZm9ybVRhYnMgPSB0aGlzLl9mb3JtU2VydmljZS5jcmVhdGVGb3JtR3JvdXBzRnJvbVRlbXBsYXRlcyh0aGlzLl90ZW1wbGF0ZXMpO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuaXNMb2FkaW5nID0gZmFsc2U7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGFzeW5jIHNldEluaXRpYWxTZWxlY3RlZE9wdGlvbnNFbGVtZW50c0ZvclRlbXBsYXRlcyh0ZW1wbGF0ZXM6IFRlbXBsYXRlcykge1xyXG4gICAgcmV0dXJuIFByb21pc2UuYWxsKE9iamVjdC52YWx1ZXModGVtcGxhdGVzKVxyXG4gICAgICAubWFwKHRlbXBsYXRlID0+IHRoaXMuc2V0SW5pdGlhbFNlbGVjdGVkT3B0aW9uc0VsZW1lbnRzRm9yVGVtcGxhdGUodGVtcGxhdGUpKSk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgaW1hZ2VDaGFuZ2VkKGZvcm1Db250cm9sOiBGb3JtQ29udHJvbCwgZXZlbnQ6IHsgZmlsZXM6IEZpbGVbXSB9KTogdm9pZCB7XHJcbiAgICBjb25zdCBmaWxlID0gZXZlbnQuZmlsZXNbMF07XHJcbiAgICBjb25zb2xlLmxvZyhmaWxlKTtcclxuICAgIGNvbnN0IHJlYWRlciA9IG5ldyBGaWxlUmVhZGVyKCk7XHJcbiAgICByZWFkZXIub25sb2FkID0gKCkgPT4ge1xyXG4gICAgICBjb25zdCB1cmkgPSByZWFkZXIucmVzdWx0O1xyXG4gICAgICBjb25zb2xlLmxvZyh1cmkpO1xyXG4gICAgICBmb3JtQ29udHJvbC5zZXRWYWx1ZSh1cmkpO1xyXG4gICAgfTtcclxuICAgIHJlYWRlci5yZWFkQXNEYXRhVVJMKGZpbGUpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBhc3luYyBzZXRJbml0aWFsU2VsZWN0ZWRPcHRpb25zRWxlbWVudHNGb3JUZW1wbGF0ZSh0ZW1wbGF0ZTogVGVtcGxhdGUpIHtcclxuICAgIHJldHVybiBQcm9taXNlLmFsbCh0ZW1wbGF0ZS5wcm9wZXJ0aWVzXHJcbiAgICAgIC5maWx0ZXIocHJvcGVydHkgPT4gcHJvcGVydHk/Lm9wdGlvbnM/Lmxpbms/LmhyZWYpXHJcbiAgICAgIC5tYXAocHJvcGVydHkgPT4gdGhpcy5zZXRJbml0aWFsU2VsZWN0ZWRPcHRpb25zRWxlbWVudEZvclByb3BlcnR5KHByb3BlcnR5KSkpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBhc3luYyBzZXRJbml0aWFsU2VsZWN0ZWRPcHRpb25zRWxlbWVudEZvclByb3BlcnR5KHByb3BlcnR5OiBQcm9wZXJ0eSkge1xyXG4gICAgY29uc3Qgb3B0aW9ucyA9IHByb3BlcnR5Py5vcHRpb25zO1xyXG5cclxuICAgIGlmICghb3B0aW9ucz8ubGluaz8uaHJlZilcclxuICAgICAgcmV0dXJuO1xyXG5cclxuICAgIGNvbnN0IHRlbXBsYXRlZFVyaSA9IG9wdGlvbnMubGluay5ocmVmO1xyXG4gICAgY29uc3QgZmlsdGVyID0gYCR7b3B0aW9ucy52YWx1ZUZpZWxkfSBlcSAke3Byb3BlcnR5LnZhbHVlfWA7XHJcbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHRoaXMuZ2V0Q2xpZW50KCkuZ2V0TGlzdEJ5VXJpKHRlbXBsYXRlZFVyaSwgeyAkZmlsdGVyOiBmaWx0ZXIsICR0b3A6IDEwIH0pO1xyXG4gICAgaWYgKCFyZXNwb25zZS5vayB8fCBQcm9ibGVtRGV0YWlscy5pc1Byb2JsZW1EZXRhaWxzKHJlc3BvbnNlLmJvZHkpIHx8ICFyZXNwb25zZS5ib2R5KSB7XHJcbiAgICAgIGNvbnN0IG1lc3NhZ2UgPSBgQW4gZXJyb3Igb2NjdXJyZWQgd2hpbGUgZ2V0dGluZyB0aGUgZmlsdGVyZWQgaXRlbXMuYDtcclxuICAgICAgdGhpcy5fbWVzc2FnZVNlcnZpY2UuYWRkKHsgc2V2ZXJpdHk6ICdlcnJvcicsIHN1bW1hcnk6ICdFcnJvcicsIGRldGFpbDogbWVzc2FnZSwgZGF0YTogcmVzcG9uc2UgfSk7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCBpdGVtcyA9IHJlc3BvbnNlLmJvZHkuX2VtYmVkZGVkLml0ZW1zO1xyXG4gICAgb3B0aW9ucy5pbmxpbmUgPSBpdGVtcztcclxuICB9XHJcblxyXG4gIHByaXZhdGUgYXN5bmMgZ2V0QWxsVGVtcGxhdGVzKHJlc291cmNlOiBSZXNvdXJjZSk6IFByb21pc2U8VGVtcGxhdGVzPiB7XHJcbiAgICBjb25zdCBmb3JtUmVzcG9uc2VzID0gYXdhaXQgdGhpcy5nZXRDbGllbnQoKS5nZXRBbGxGb3JtcyhyZXNvdXJjZSk7XHJcblxyXG4gICAgY29uc3QgZmFpbGVkUmVzcG9uc2VzID0gZm9ybVJlc3BvbnNlcy5maWx0ZXIocmVzcG9uc2UgPT4gIXJlc3BvbnNlLm9rIHx8IFByb2JsZW1EZXRhaWxzLmlzUHJvYmxlbURldGFpbHMocmVzcG9uc2UuYm9keSkgfHwgIXJlc3BvbnNlLmJvZHkpO1xyXG4gICAgaWYgKGZhaWxlZFJlc3BvbnNlcy5sZW5ndGggIT09IDApIHtcclxuICAgICAgZm9yIChjb25zdCByZXNwb25zZSBvZiBmYWlsZWRSZXNwb25zZXMpIHtcclxuICAgICAgICB0aGlzLl9tZXNzYWdlU2VydmljZS5hZGQoeyBzZXZlcml0eTogJ2Vycm9yJywgc3VtbWFyeTogJ0Vycm9yJywgZGV0YWlsOiAnRXJyb3Igd2hpbGUgbG9hZGluZyB0aGUgcmVzb3VyY2UgZnJvbSB0aGUgQVBJLicsIGRhdGE6IHJlc3BvbnNlIH0pO1xyXG4gICAgICB9XHJcbiAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoe30pO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IGZvcm1UZW1wbGF0ZXMgPSBPYmplY3QuYXNzaWduKHt9LCAuLi5mb3JtUmVzcG9uc2VzLm1hcChyZXNwb25zZSA9PiAocmVzcG9uc2UuYm9keSBhcyBGb3Jtc1Jlc291cmNlKS5fdGVtcGxhdGVzKSkgYXMgVGVtcGxhdGVzO1xyXG5cclxuICAgIGF3YWl0IHRoaXMuc2V0SW5pdGlhbFNlbGVjdGVkT3B0aW9uc0VsZW1lbnRzRm9yVGVtcGxhdGVzKGZvcm1UZW1wbGF0ZXMpO1xyXG5cclxuICAgIHJldHVybiBmb3JtVGVtcGxhdGVzO1xyXG4gIH1cclxufVxyXG4iLCI8ZGl2IGNsYXNzPVwiZ3JpZFwiPlxyXG4gIDxkaXYgY2xhc3M9XCJjb2xcIj5cclxuICAgIDxoMT5FZGl0IHJlc291cmNlPC9oMT5cclxuICA8L2Rpdj5cclxuPC9kaXY+XHJcblxyXG48cC10YWJWaWV3PlxyXG5cclxuICA8cC10YWJQYW5lbCAqbmdJZj1cImlzTG9hZGluZ0ZvclRoZUZpcnN0VGltZVwiIGhlYWRlcj1cIkxvYWRpbmdcIj5cclxuICAgIDxkaXYgKm5nRm9yPVwibGV0IGkgb2YgWzEsIDIsIDMsIDQsIDVdXCIgY2xhc3M9XCJncmlkIGZpZWxkXCI+XHJcbiAgICAgIDxwLXNrZWxldG9uIGNsYXNzPVwiY29sLTEyIG1iLTIgbWQ6Y29sLTIgbWQ6bWItMFwiIGhlaWdodD1cIjM5cHhcIj48L3Atc2tlbGV0b24+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJjb2wtMTIgbWQ6Y29sLTEwXCI+XHJcbiAgICAgICAgPHAtc2tlbGV0b24gY2xhc3M9XCJ3LWZ1bGxcIiBoZWlnaHQ9XCIzOXB4XCI+PC9wLXNrZWxldG9uPlxyXG4gICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG4gICAgPGRpdiBjbGFzcz1cImdyaWRcIj5cclxuICAgICAgPGRpdiBjbGFzcz1cImNvbFwiPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGp1c3RpZnktY29udGVudC1lbmQgdy1mdWxsXCI+XHJcbiAgICAgICAgICA8cC1za2VsZXRvbiB3aWR0aD1cIjEyMHB4XCIgaGVpZ2h0PVwiMzlweFwiIGNsYXNzPVwibXgtMlwiPjwvcC1za2VsZXRvbj5cclxuICAgICAgICAgIDxwLXNrZWxldG9uIHdpZHRoPVwiMTIwcHhcIiBoZWlnaHQ9XCIzOXB4XCIgY2xhc3M9XCJteC0yXCI+PC9wLXNrZWxldG9uPlxyXG4gICAgICAgICAgPHAtc2tlbGV0b24gd2lkdGg9XCIxMjBweFwiIGhlaWdodD1cIjM5cHhcIiBjbGFzcz1cIm14LTJcIj48L3Atc2tlbGV0b24+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcbiAgPC9wLXRhYlBhbmVsPlxyXG5cclxuICA8cC10YWJQYW5lbCAqbmdGb3I9XCJsZXQgaXRlbSBvZiB0ZW1wbGF0ZXMgfCBrZXl2YWx1ZVwiIFtoZWFkZXJdPVwiaXRlbS52YWx1ZS50aXRsZSB8fCBpdGVtLmtleVwiIFtkaXNhYmxlZF09XCJpc0xvYWRpbmdcIj5cclxuICAgIDxmb3JtIFtmb3JtR3JvdXBdPVwiZm9ybVRhYnNbaXRlbS5rZXldXCIgKG5nU3VibWl0KT1cInN1Ym1pdChpdGVtLmtleSwgaXRlbS52YWx1ZSwgZm9ybVRhYnNbaXRlbS5rZXldLnZhbHVlKVwiPlxyXG4gICAgICA8ZGl2IGNsYXNzPVwiYmxvY2thYmxlLWNvbnRhaW5lclwiPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJibG9ja2FibGUtZWxlbWVudFwiPlxyXG4gICAgICAgICAgPHJ3LWZvcm0gW2Zvcm1Hcm91cF09XCJmb3JtVGFic1tpdGVtLmtleV1cIiBbdGVtcGxhdGVdPVwiaXRlbS52YWx1ZVwiIFthcGlOYW1lXT1cImFwaU5hbWVcIj48L3J3LWZvcm0+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImJsb2NrYWJsZS1vdmVybGF5XCIgKm5nSWY9XCJpc0xvYWRpbmdcIj5cclxuICAgICAgICAgIDxwLXByb2dyZXNzU3Bpbm5lcj48L3AtcHJvZ3Jlc3NTcGlubmVyPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICA8L2Rpdj5cclxuXHJcbiAgICAgIDxkaXYgY2xhc3M9XCJncmlkXCI+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImNvbFwiPlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXgganVzdGlmeS1jb250ZW50LWVuZCB3LWZ1bGxcIj5cclxuICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNkZWZhdWx0QnV0dG9ucz5cclxuICAgICAgICAgICAgICA8YnV0dG9uIHBCdXR0b24gcFJpcHBsZSB0eXBlPVwic3VibWl0XCIgbGFiZWw9XCJTYXZlXCIgaWNvbj1cImZhciBmYS1zYXZlXCIgY2xhc3M9XCJteC0yIHAtYnV0dG9uLXN1Y2Nlc3NcIiBbZGlzYWJsZWRdPVwiaXNMb2FkaW5nIHx8ICFjYW5TdWJtaXQoaXRlbS5rZXkpXCI+PC9idXR0b24+XHJcbiAgICAgICAgICAgICAgPGJ1dHRvbiBwQnV0dG9uIHBSaXBwbGUgdHlwZT1cImJ1dHRvblwiIGxhYmVsPVwiUmVsb2FkXCIgaWNvbj1cImZhcyBmYS1yZWRvXCIgY2xhc3M9XCJteC0yIHAtYnV0dG9uLWluZm9cIiAoY2xpY2spPVwibG9hZCgpXCIgW2Rpc2FibGVkXT1cImlzTG9hZGluZ1wiPjwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgIDxidXR0b24gcEJ1dHRvbiBwUmlwcGxlIHR5cGU9XCJidXR0b25cIiBsYWJlbD1cIkRlbGV0ZVwiIGljb249XCJmYXIgZmEtdHJhc2gtYWx0XCIgY2xhc3M9XCJtbC0yIHAtYnV0dG9uLWRhbmdlclwiIChjbGljayk9XCJzaG93RGVsZXRlQ29uZmlybWF0aW9Nb2RhbCgpXCIgW2Rpc2FibGVkXT1cIiFyZXNvdXJjZSB8fCBpc0xvYWRpbmcgfHwgIWNhbkRlbGV0ZVwiPjwvYnV0dG9uPlxyXG4gICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiYnV0dG9uc1JlZiB8fCBkZWZhdWx0QnV0dG9uc1wiPjwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgPC9mb3JtPlxyXG4gIDwvcC10YWJQYW5lbD5cclxuXHJcbiAgPG5nLXRlbXBsYXRlICNkZWZhdWx0RXh0cmFUYWJzPlxyXG4gIDwvbmctdGVtcGxhdGU+XHJcbiAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImV4dHJhVGFic1JlZiB8fCBkZWZhdWx0RXh0cmFUYWJzXCI+PC9uZy1jb250YWluZXI+XHJcblxyXG48L3AtdGFiVmlldz5cclxuXHJcbjxwLXRvYXN0PjwvcC10b2FzdD5cclxuPHAtY29uZmlybURpYWxvZz48L3AtY29uZmlybURpYWxvZz5cclxuIl19
@@ -0,0 +1,57 @@
1
+ import { Component, forwardRef, Input, ViewChildren } from '@angular/core';
2
+ import { NG_VALUE_ACCESSOR } from '@angular/forms';
3
+ import { FileUpload } from 'primeng/fileupload';
4
+ import * as i0 from "@angular/core";
5
+ import * as i1 from "primeng/button";
6
+ import * as i2 from "primeng/fileupload";
7
+ import * as i3 from "@angular/common";
8
+ import * as i4 from "primeng/tooltip";
9
+ import * as i5 from "../../pipes/safe-url.pipe";
10
+ export class RESTWorldFileViewComponent {
11
+ constructor() {
12
+ this.disabled = false;
13
+ }
14
+ writeValue(obj) {
15
+ this.uri = obj;
16
+ }
17
+ registerOnChange(fn) {
18
+ this.onChange = fn;
19
+ }
20
+ registerOnTouched() {
21
+ // not needed for this component, but needed to implement the interface
22
+ }
23
+ setDisabledState(isDisabled) {
24
+ this.disabled = isDisabled;
25
+ }
26
+ fileChanged(event) {
27
+ const file = event.files[0];
28
+ const reader = new FileReader();
29
+ reader.onload = () => {
30
+ this.uri = reader.result;
31
+ this.onChange?.(this.uri);
32
+ };
33
+ reader.readAsDataURL(file);
34
+ }
35
+ }
36
+ RESTWorldFileViewComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.2.5", ngImport: i0, type: RESTWorldFileViewComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
37
+ RESTWorldFileViewComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.2.5", type: RESTWorldFileViewComponent, selector: "rw-file", inputs: { accept: "accept", fileName: "fileName" }, providers: [{
38
+ provide: NG_VALUE_ACCESSOR,
39
+ useExisting: forwardRef(() => RESTWorldFileViewComponent),
40
+ multi: true
41
+ }], viewQueries: [{ propertyName: "fileUploads", predicate: FileUpload, descendants: true }], ngImport: i0, template: "<div class=\"flex align-items-center\">\r\n <p-button *ngIf=\"!uri\" [disabled]=\"true\" icon=\"pi pi-download\" class=\"mr-1\" pTooltip=\"No file present\"></p-button>\r\n <a *ngIf=\"uri\" [href]=\"uri | safeUrl\" [download]=\"fileName || 'download'\" class=\"mr-1\" pButton pTooltip=\"Download file\" icon=\"pi pi-download\"></a>\r\n <p-fileUpload chooseIcon=\"pi-upload fas fa-upload\" pTooltip=\"Upload new file\" mode=\"basic\" [auto]=\"true\" [accept]=\"accept || 'false'\" [customUpload]=\"true\" (uploadHandler)=\"fileChanged($event)\"></p-fileUpload>\r\n</div>\r\n", styles: ["a{text-decoration:none;height:calc(1rem + 18px)}a.p-button-icon-only span.p-button-label{height:1rem!important}\n"], components: [{ type: i1.Button, selector: "p-button", inputs: ["type", "iconPos", "icon", "badge", "label", "disabled", "loading", "loadingIcon", "style", "styleClass", "badgeClass", "ariaLabel"], outputs: ["onClick", "onFocus", "onBlur"] }, { type: i2.FileUpload, selector: "p-fileUpload", inputs: ["name", "url", "method", "multiple", "accept", "disabled", "auto", "withCredentials", "maxFileSize", "invalidFileSizeMessageSummary", "invalidFileSizeMessageDetail", "invalidFileTypeMessageSummary", "invalidFileTypeMessageDetail", "invalidFileLimitMessageDetail", "invalidFileLimitMessageSummary", "style", "styleClass", "previewWidth", "chooseLabel", "uploadLabel", "cancelLabel", "chooseIcon", "uploadIcon", "cancelIcon", "showUploadButton", "showCancelButton", "mode", "headers", "customUpload", "fileLimit", "files"], outputs: ["onBeforeUpload", "onSend", "onUpload", "onError", "onClear", "onRemove", "onSelect", "onProgress", "uploadHandler"] }], directives: [{ type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i4.Tooltip, selector: "[pTooltip]", inputs: ["tooltipPosition", "tooltipEvent", "appendTo", "positionStyle", "tooltipStyleClass", "tooltipZIndex", "escape", "showDelay", "hideDelay", "life", "positionTop", "positionLeft", "pTooltip", "tooltipDisabled", "tooltipOptions"] }, { type: i1.ButtonDirective, selector: "[pButton]", inputs: ["iconPos", "loadingIcon", "label", "icon", "loading"] }], pipes: { "safeUrl": i5.SafeUrlPipe } });
42
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.2.5", ngImport: i0, type: RESTWorldFileViewComponent, decorators: [{
43
+ type: Component,
44
+ args: [{ selector: 'rw-file', providers: [{
45
+ provide: NG_VALUE_ACCESSOR,
46
+ useExisting: forwardRef(() => RESTWorldFileViewComponent),
47
+ multi: true
48
+ }], template: "<div class=\"flex align-items-center\">\r\n <p-button *ngIf=\"!uri\" [disabled]=\"true\" icon=\"pi pi-download\" class=\"mr-1\" pTooltip=\"No file present\"></p-button>\r\n <a *ngIf=\"uri\" [href]=\"uri | safeUrl\" [download]=\"fileName || 'download'\" class=\"mr-1\" pButton pTooltip=\"Download file\" icon=\"pi pi-download\"></a>\r\n <p-fileUpload chooseIcon=\"pi-upload fas fa-upload\" pTooltip=\"Upload new file\" mode=\"basic\" [auto]=\"true\" [accept]=\"accept || 'false'\" [customUpload]=\"true\" (uploadHandler)=\"fileChanged($event)\"></p-fileUpload>\r\n</div>\r\n", styles: ["a{text-decoration:none;height:calc(1rem + 18px)}a.p-button-icon-only span.p-button-label{height:1rem!important}\n"] }]
49
+ }], propDecorators: { accept: [{
50
+ type: Input
51
+ }], fileName: [{
52
+ type: Input
53
+ }], fileUploads: [{
54
+ type: ViewChildren,
55
+ args: [FileUpload]
56
+ }] } });
57
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVzdHdvcmxkLWZpbGUtdmlldy5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtcmVzdHdvcmxkLWNsaWVudC9zcmMvbGliL3ZpZXdzL3Jlc3R3b3JsZC1maWxlLXZpZXcvcmVzdHdvcmxkLWZpbGUtdmlldy5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtcmVzdHdvcmxkLWNsaWVudC9zcmMvbGliL3ZpZXdzL3Jlc3R3b3JsZC1maWxlLXZpZXcvcmVzdHdvcmxkLWZpbGUtdmlldy5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLFVBQVUsRUFBRSxLQUFLLEVBQWEsWUFBWSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3RGLE9BQU8sRUFBd0IsaUJBQWlCLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUN6RSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sb0JBQW9CLENBQUM7Ozs7Ozs7QUFZaEQsTUFBTSxPQUFPLDBCQUEwQjtJQVZ2QztRQXFCUyxhQUFRLEdBQUcsS0FBSyxDQUFDO0tBMEJ6QjtJQXZCQyxVQUFVLENBQUMsR0FBWTtRQUNyQixJQUFJLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQztJQUNqQixDQUFDO0lBQ0QsZ0JBQWdCLENBQUMsRUFBYTtRQUM1QixJQUFJLENBQUMsUUFBUSxHQUFHLEVBQUUsQ0FBQztJQUNyQixDQUFDO0lBQ0QsaUJBQWlCO1FBQ2YsdUVBQXVFO0lBQ3pFLENBQUM7SUFDRCxnQkFBZ0IsQ0FBRSxVQUFtQjtRQUNuQyxJQUFJLENBQUMsUUFBUSxHQUFHLFVBQVUsQ0FBQztJQUM3QixDQUFDO0lBRU0sV0FBVyxDQUFDLEtBQXdCO1FBQ3pDLE1BQU0sSUFBSSxHQUFHLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDNUIsTUFBTSxNQUFNLEdBQUcsSUFBSSxVQUFVLEVBQUUsQ0FBQztRQUNoQyxNQUFNLENBQUMsTUFBTSxHQUFHLEdBQUcsRUFBRTtZQUNuQixJQUFJLENBQUMsR0FBRyxHQUFHLE1BQU0sQ0FBQyxNQUFnQixDQUFDO1lBQ25DLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDNUIsQ0FBQyxDQUFDO1FBRUYsTUFBTSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUM3QixDQUFDOzt1SEFwQ1UsMEJBQTBCOzJHQUExQiwwQkFBMEIsc0ZBTjFCLENBQUM7WUFDVixPQUFPLEVBQUUsaUJBQWlCO1lBQzFCLFdBQVcsRUFBRSxVQUFVLENBQUMsR0FBRyxFQUFFLENBQUMsMEJBQTBCLENBQUM7WUFDekQsS0FBSyxFQUFFLElBQUk7U0FDWixDQUFDLDBEQVVZLFVBQVUsZ0RDdEIxQixra0JBS0E7MkZEU2EsMEJBQTBCO2tCQVZ0QyxTQUFTOytCQUNFLFNBQVMsYUFHUixDQUFDOzRCQUNWLE9BQU8sRUFBRSxpQkFBaUI7NEJBQzFCLFdBQVcsRUFBRSxVQUFVLENBQUMsR0FBRyxFQUFFLDJCQUEyQixDQUFDOzRCQUN6RCxLQUFLLEVBQUUsSUFBSTt5QkFDWixDQUFDOzhCQUtLLE1BQU07c0JBRFosS0FBSztnQkFJQyxRQUFRO3NCQURkLEtBQUs7Z0JBSU4sV0FBVztzQkFEVixZQUFZO3VCQUFDLFVBQVUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIGZvcndhcmRSZWYsIElucHV0LCBRdWVyeUxpc3QsIFZpZXdDaGlsZHJlbiB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQ29udHJvbFZhbHVlQWNjZXNzb3IsIE5HX1ZBTFVFX0FDQ0VTU09SIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xyXG5pbXBvcnQgeyBGaWxlVXBsb2FkIH0gZnJvbSAncHJpbWVuZy9maWxldXBsb2FkJztcclxuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdydy1maWxlJyxcbiAgdGVtcGxhdGVVcmw6ICcuL3Jlc3R3b3JsZC1maWxlLXZpZXcuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9yZXN0d29ybGQtZmlsZS12aWV3LmNvbXBvbmVudC5jc3MnXSxcbiAgcHJvdmlkZXJzOiBbe1xyXG4gICAgcHJvdmlkZTogTkdfVkFMVUVfQUNDRVNTT1IsXHJcbiAgICB1c2VFeGlzdGluZzogZm9yd2FyZFJlZigoKSA9PiBSRVNUV29ybGRGaWxlVmlld0NvbXBvbmVudCksXHJcbiAgICBtdWx0aTogdHJ1ZVxyXG4gIH1dXG59KVxuZXhwb3J0IGNsYXNzIFJFU1RXb3JsZEZpbGVWaWV3Q29tcG9uZW50IGltcGxlbWVudHMgQ29udHJvbFZhbHVlQWNjZXNzb3Ige1xuICBwcml2YXRlIG9uQ2hhbmdlPzogRnVuY3Rpb247XG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBhY2NlcHQ/OiBzdHJpbmc7XG5cbiAgQElucHV0KClcbiAgcHVibGljIGZpbGVOYW1lPzogc3RyaW5nO1xuXHJcbiAgQFZpZXdDaGlsZHJlbihGaWxlVXBsb2FkKVxyXG4gIGZpbGVVcGxvYWRzPzogUXVlcnlMaXN0PEZpbGVVcGxvYWQ+O1xuXG4gIHB1YmxpYyBkaXNhYmxlZCA9IGZhbHNlO1xuICBwdWJsaWMgdXJpPzogc3RyaW5nO1xyXG5cbiAgd3JpdGVWYWx1ZShvYmo/OiBzdHJpbmcpOiB2b2lkIHtcclxuICAgIHRoaXMudXJpID0gb2JqO1xyXG4gIH1cclxuICByZWdpc3Rlck9uQ2hhbmdlKGZuPzogRnVuY3Rpb24pOiB2b2lkIHtcclxuICAgIHRoaXMub25DaGFuZ2UgPSBmbjtcclxuICB9XHJcbiAgcmVnaXN0ZXJPblRvdWNoZWQoKTogdm9pZCB7XHJcbiAgICAvLyBub3QgbmVlZGVkIGZvciB0aGlzIGNvbXBvbmVudCwgYnV0IG5lZWRlZCB0byBpbXBsZW1lbnQgdGhlIGludGVyZmFjZVxyXG4gIH1cclxuICBzZXREaXNhYmxlZFN0YXRlPyhpc0Rpc2FibGVkOiBib29sZWFuKTogdm9pZCB7XHJcbiAgICB0aGlzLmRpc2FibGVkID0gaXNEaXNhYmxlZDtcclxuICB9XG5cbiAgcHVibGljIGZpbGVDaGFuZ2VkKGV2ZW50OiB7IGZpbGVzOiBGaWxlW10gfSk6IHZvaWQge1xyXG4gICAgY29uc3QgZmlsZSA9IGV2ZW50LmZpbGVzWzBdO1xyXG4gICAgY29uc3QgcmVhZGVyID0gbmV3IEZpbGVSZWFkZXIoKTtcclxuICAgIHJlYWRlci5vbmxvYWQgPSAoKSA9PiB7XHJcbiAgICAgIHRoaXMudXJpID0gcmVhZGVyLnJlc3VsdCBhcyBzdHJpbmc7XHJcbiAgICAgIHRoaXMub25DaGFuZ2U/Lih0aGlzLnVyaSk7XHJcbiAgICB9O1xyXG5cclxuICAgIHJlYWRlci5yZWFkQXNEYXRhVVJMKGZpbGUpO1xyXG4gIH1cbn1cbiIsIjxkaXYgY2xhc3M9XCJmbGV4IGFsaWduLWl0ZW1zLWNlbnRlclwiPlxyXG4gIDxwLWJ1dHRvbiAqbmdJZj1cIiF1cmlcIiBbZGlzYWJsZWRdPVwidHJ1ZVwiIGljb249XCJwaSBwaS1kb3dubG9hZFwiIGNsYXNzPVwibXItMVwiIHBUb29sdGlwPVwiTm8gZmlsZSBwcmVzZW50XCI+PC9wLWJ1dHRvbj5cclxuICA8YSAqbmdJZj1cInVyaVwiIFtocmVmXT1cInVyaSB8IHNhZmVVcmxcIiBbZG93bmxvYWRdPVwiZmlsZU5hbWUgfHwgJ2Rvd25sb2FkJ1wiIGNsYXNzPVwibXItMVwiIHBCdXR0b24gcFRvb2x0aXA9XCJEb3dubG9hZCBmaWxlXCIgaWNvbj1cInBpIHBpLWRvd25sb2FkXCI+PC9hPlxyXG4gIDxwLWZpbGVVcGxvYWQgY2hvb3NlSWNvbj1cInBpLXVwbG9hZCBmYXMgZmEtdXBsb2FkXCIgcFRvb2x0aXA9XCJVcGxvYWQgbmV3IGZpbGVcIiBtb2RlPVwiYmFzaWNcIiBbYXV0b109XCJ0cnVlXCIgW2FjY2VwdF09XCJhY2NlcHQgfHwgJ2ZhbHNlJ1wiIFtjdXN0b21VcGxvYWRdPVwidHJ1ZVwiICh1cGxvYWRIYW5kbGVyKT1cImZpbGVDaGFuZ2VkKCRldmVudClcIj48L3AtZmlsZVVwbG9hZD5cclxuPC9kaXY+XHJcbiJdfQ==
@@ -0,0 +1,100 @@
1
+ import { Component, forwardRef, Input, ViewChildren } from '@angular/core';
2
+ import { NG_VALUE_ACCESSOR } from '@angular/forms';
3
+ import { FileUpload } from 'primeng/fileupload';
4
+ import * as i0 from "@angular/core";
5
+ import * as i1 from "primeng/button";
6
+ import * as i2 from "primeng/fileupload";
7
+ import * as i3 from "primeng/dialog";
8
+ import * as i4 from "ngx-image-cropper";
9
+ import * as i5 from "primeng/colorpicker";
10
+ import * as i6 from "@angular/common";
11
+ import * as i7 from "primeng/tooltip";
12
+ import * as i8 from "@angular/forms";
13
+ import * as i9 from "primeng/inputtext";
14
+ import * as i10 from "primeng/ripple";
15
+ import * as i11 from "../../pipes/safe-url.pipe";
16
+ export class RESTWorldImageViewComponent {
17
+ constructor() {
18
+ this.maintainAspectRatio = true;
19
+ this.aspectRatio = 1;
20
+ this.resizeToWidth = 0;
21
+ this.resizeToHeight = 0;
22
+ this.onlyScaleDown = false;
23
+ this.containWithinAspectRatio = false;
24
+ this.backgroundColor = "#ffffff";
25
+ this.format = 'png';
26
+ this.disabled = false;
27
+ this.displayCropDialog = false;
28
+ }
29
+ writeValue(obj) {
30
+ this.uri = obj;
31
+ }
32
+ registerOnChange(fn) {
33
+ this.onChange = fn;
34
+ }
35
+ registerOnTouched() {
36
+ // not needed for this component, but needed to implement the interface
37
+ }
38
+ setDisabledState(isDisabled) {
39
+ this.disabled = isDisabled;
40
+ }
41
+ showCropDialog() {
42
+ this.displayCropDialog = true;
43
+ }
44
+ imageChanged(event) {
45
+ this.tempImageFile = event.files[0];
46
+ this.showCropDialog();
47
+ }
48
+ croppedImageChanged(event) {
49
+ this.tempCroppedUri = event.base64;
50
+ }
51
+ acceptCroppedImage() {
52
+ this.uri = this.tempCroppedUri;
53
+ this.onChange?.(this.uri);
54
+ this.closeCropDialog();
55
+ }
56
+ closeCropDialog() {
57
+ this.fileUploads?.forEach(f => f.clear());
58
+ this.displayCropDialog = false;
59
+ }
60
+ }
61
+ RESTWorldImageViewComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.2.5", ngImport: i0, type: RESTWorldImageViewComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
62
+ RESTWorldImageViewComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.2.5", type: RESTWorldImageViewComponent, selector: "rw-image", inputs: { alt: "alt", accept: "accept", fileName: "fileName", maintainAspectRatio: "maintainAspectRatio", aspectRatio: "aspectRatio", resizeToWidth: "resizeToWidth", resizeToHeight: "resizeToHeight", onlyScaleDown: "onlyScaleDown", containWithinAspectRatio: "containWithinAspectRatio", backgroundColor: "backgroundColor", format: "format" }, providers: [{
63
+ provide: NG_VALUE_ACCESSOR,
64
+ useExisting: forwardRef(() => RESTWorldImageViewComponent),
65
+ multi: true
66
+ }], viewQueries: [{ propertyName: "fileUploads", predicate: FileUpload, descendants: true }], ngImport: i0, template: "<div class=\"flex align-items-center\">\r\n <p-button *ngIf=\"!uri\" [disabled]=\"true\" icon=\"pi pi-download\" class=\"mr-1\" pTooltip=\"No image present\"></p-button>\r\n <a *ngIf=\"uri\" [href]=\"uri | safeUrl\" [download]=\"fileName || 'download'\" class=\"mr-1\" pButton pTooltip=\"Download image\" icon=\"pi pi-download\"></a>\r\n <p-fileUpload class=\"mr-1\" chooseIcon=\"pi-upload fas fa-upload\" mode=\"basic\" [auto]=\"true\" [accept]=\"accept || 'false'\" [customUpload]=\"true\" (uploadHandler)=\"imageChanged($event)\" pTooltip=\"Upload new image\"></p-fileUpload>\r\n <img *ngIf=\"uri\" [src]=\"uri\" [alt]=\"alt\" (click)=\"showCropDialog()\" pTooltip=\"Zoom and crop\" />\r\n</div>\r\n\r\n<p-dialog header=\"alt\" [(visible)]=\"displayCropDialog\">\r\n <image-cropper #cropper\r\n [imageFile]=\"tempImageFile!\"\r\n [imageURL]=\"uri!\"\r\n [maintainAspectRatio]=\"maintainAspectRatio\"\r\n [aspectRatio]=\"aspectRatio\"\r\n [resizeToWidth]=\"resizeToWidth\"\r\n [resizeToHeight]=\"resizeToHeight\"\r\n [onlyScaleDown]=\"onlyScaleDown\"\r\n [autoCrop]=\"true\"\r\n [containWithinAspectRatio]=\"containWithinAspectRatio\"\r\n [backgroundColor]=\"backgroundColor\"\r\n [format]=\"format\"\r\n (imageCropped)=\"croppedImageChanged($event)\"></image-cropper>\r\n <div class=\"flex justify-content-end\">\r\n <div class=\"flex-auto align-items-center\">\r\n <span>Background color:&nbsp;</span>\r\n <p-colorPicker [(ngModel)]=\"cropper.backgroundColor\" appendTo=\"body\" class=\"ml-1 mr-1\"></p-colorPicker>\r\n <input pInputText [(ngModel)]=\"cropper.backgroundColor\" />\r\n </div>\r\n <button type=\"button\" pButton pRipple (click)=\"acceptCroppedImage()\" class=\"mr-2\">Ok</button>\r\n <button type=\"button\" pButton pRipple (click)=\"closeCropDialog()\">Cancel</button>\r\n </div>\r\n</p-dialog>\r\n", styles: ["img{height:calc(1rem + 18px);cursor:zoom-in;border-radius:3px}a{text-decoration:none;height:calc(1rem + 18px)}a.p-button-icon-only span.p-button-label{height:1rem!important}\n"], components: [{ type: i1.Button, selector: "p-button", inputs: ["type", "iconPos", "icon", "badge", "label", "disabled", "loading", "loadingIcon", "style", "styleClass", "badgeClass", "ariaLabel"], outputs: ["onClick", "onFocus", "onBlur"] }, { type: i2.FileUpload, selector: "p-fileUpload", inputs: ["name", "url", "method", "multiple", "accept", "disabled", "auto", "withCredentials", "maxFileSize", "invalidFileSizeMessageSummary", "invalidFileSizeMessageDetail", "invalidFileTypeMessageSummary", "invalidFileTypeMessageDetail", "invalidFileLimitMessageDetail", "invalidFileLimitMessageSummary", "style", "styleClass", "previewWidth", "chooseLabel", "uploadLabel", "cancelLabel", "chooseIcon", "uploadIcon", "cancelIcon", "showUploadButton", "showCancelButton", "mode", "headers", "customUpload", "fileLimit", "files"], outputs: ["onBeforeUpload", "onSend", "onUpload", "onError", "onClear", "onRemove", "onSelect", "onProgress", "uploadHandler"] }, { type: i3.Dialog, selector: "p-dialog", inputs: ["header", "draggable", "resizable", "positionLeft", "positionTop", "contentStyle", "contentStyleClass", "modal", "closeOnEscape", "dismissableMask", "rtl", "closable", "responsive", "appendTo", "breakpoints", "styleClass", "maskStyleClass", "showHeader", "breakpoint", "blockScroll", "autoZIndex", "baseZIndex", "minX", "minY", "focusOnShow", "maximizable", "keepInViewport", "focusTrap", "transitionOptions", "closeIcon", "closeAriaLabel", "closeTabindex", "minimizeIcon", "maximizeIcon", "visible", "style", "position"], outputs: ["onShow", "onHide", "visibleChange", "onResizeInit", "onResizeEnd", "onDragEnd", "onMaximize"] }, { type: i4.ImageCropperComponent, selector: "image-cropper", inputs: ["imageChangedEvent", "imageURL", "imageBase64", "imageFile", "format", "transform", "maintainAspectRatio", "aspectRatio", "resizeToWidth", "resizeToHeight", "cropperMinWidth", "cropperMinHeight", "cropperMaxHeight", "cropperMaxWidth", "cropperStaticWidth", "cropperStaticHeight", "canvasRotation", "initialStepSize", "roundCropper", "onlyScaleDown", "imageQuality", "autoCrop", "backgroundColor", "containWithinAspectRatio", "hideResizeSquares", "cropper", "alignImage", "disabled"], outputs: ["imageCropped", "startCropImage", "imageLoaded", "cropperReady", "loadImageFailed"] }, { type: i5.ColorPicker, selector: "p-colorPicker", inputs: ["style", "styleClass", "inline", "format", "appendTo", "disabled", "tabindex", "inputId", "autoZIndex", "baseZIndex", "showTransitionOptions", "hideTransitionOptions"], outputs: ["onChange", "onShow", "onHide"] }], directives: [{ type: i6.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i7.Tooltip, selector: "[pTooltip]", inputs: ["tooltipPosition", "tooltipEvent", "appendTo", "positionStyle", "tooltipStyleClass", "tooltipZIndex", "escape", "showDelay", "hideDelay", "life", "positionTop", "positionLeft", "pTooltip", "tooltipDisabled", "tooltipOptions"] }, { type: i1.ButtonDirective, selector: "[pButton]", inputs: ["iconPos", "loadingIcon", "label", "icon", "loading"] }, { type: i8.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { type: i8.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { type: i8.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { type: i9.InputText, selector: "[pInputText]" }, { type: i10.Ripple, selector: "[pRipple]" }], pipes: { "safeUrl": i11.SafeUrlPipe } });
67
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.2.5", ngImport: i0, type: RESTWorldImageViewComponent, decorators: [{
68
+ type: Component,
69
+ args: [{ selector: 'rw-image', providers: [{
70
+ provide: NG_VALUE_ACCESSOR,
71
+ useExisting: forwardRef(() => RESTWorldImageViewComponent),
72
+ multi: true
73
+ }], template: "<div class=\"flex align-items-center\">\r\n <p-button *ngIf=\"!uri\" [disabled]=\"true\" icon=\"pi pi-download\" class=\"mr-1\" pTooltip=\"No image present\"></p-button>\r\n <a *ngIf=\"uri\" [href]=\"uri | safeUrl\" [download]=\"fileName || 'download'\" class=\"mr-1\" pButton pTooltip=\"Download image\" icon=\"pi pi-download\"></a>\r\n <p-fileUpload class=\"mr-1\" chooseIcon=\"pi-upload fas fa-upload\" mode=\"basic\" [auto]=\"true\" [accept]=\"accept || 'false'\" [customUpload]=\"true\" (uploadHandler)=\"imageChanged($event)\" pTooltip=\"Upload new image\"></p-fileUpload>\r\n <img *ngIf=\"uri\" [src]=\"uri\" [alt]=\"alt\" (click)=\"showCropDialog()\" pTooltip=\"Zoom and crop\" />\r\n</div>\r\n\r\n<p-dialog header=\"alt\" [(visible)]=\"displayCropDialog\">\r\n <image-cropper #cropper\r\n [imageFile]=\"tempImageFile!\"\r\n [imageURL]=\"uri!\"\r\n [maintainAspectRatio]=\"maintainAspectRatio\"\r\n [aspectRatio]=\"aspectRatio\"\r\n [resizeToWidth]=\"resizeToWidth\"\r\n [resizeToHeight]=\"resizeToHeight\"\r\n [onlyScaleDown]=\"onlyScaleDown\"\r\n [autoCrop]=\"true\"\r\n [containWithinAspectRatio]=\"containWithinAspectRatio\"\r\n [backgroundColor]=\"backgroundColor\"\r\n [format]=\"format\"\r\n (imageCropped)=\"croppedImageChanged($event)\"></image-cropper>\r\n <div class=\"flex justify-content-end\">\r\n <div class=\"flex-auto align-items-center\">\r\n <span>Background color:&nbsp;</span>\r\n <p-colorPicker [(ngModel)]=\"cropper.backgroundColor\" appendTo=\"body\" class=\"ml-1 mr-1\"></p-colorPicker>\r\n <input pInputText [(ngModel)]=\"cropper.backgroundColor\" />\r\n </div>\r\n <button type=\"button\" pButton pRipple (click)=\"acceptCroppedImage()\" class=\"mr-2\">Ok</button>\r\n <button type=\"button\" pButton pRipple (click)=\"closeCropDialog()\">Cancel</button>\r\n </div>\r\n</p-dialog>\r\n", styles: ["img{height:calc(1rem + 18px);cursor:zoom-in;border-radius:3px}a{text-decoration:none;height:calc(1rem + 18px)}a.p-button-icon-only span.p-button-label{height:1rem!important}\n"] }]
74
+ }], propDecorators: { alt: [{
75
+ type: Input
76
+ }], accept: [{
77
+ type: Input
78
+ }], fileName: [{
79
+ type: Input
80
+ }], maintainAspectRatio: [{
81
+ type: Input
82
+ }], aspectRatio: [{
83
+ type: Input
84
+ }], resizeToWidth: [{
85
+ type: Input
86
+ }], resizeToHeight: [{
87
+ type: Input
88
+ }], onlyScaleDown: [{
89
+ type: Input
90
+ }], containWithinAspectRatio: [{
91
+ type: Input
92
+ }], backgroundColor: [{
93
+ type: Input
94
+ }], format: [{
95
+ type: Input
96
+ }], fileUploads: [{
97
+ type: ViewChildren,
98
+ args: [FileUpload]
99
+ }] } });
100
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVzdHdvcmxkLWltYWdlLXZpZXcuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LXJlc3R3b3JsZC1jbGllbnQvc3JjL2xpYi92aWV3cy9yZXN0d29ybGQtaW1hZ2Utdmlldy9yZXN0d29ybGQtaW1hZ2Utdmlldy5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtcmVzdHdvcmxkLWNsaWVudC9zcmMvbGliL3ZpZXdzL3Jlc3R3b3JsZC1pbWFnZS12aWV3L3Jlc3R3b3JsZC1pbWFnZS12aWV3LmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsVUFBVSxFQUFFLEtBQUssRUFBYSxZQUFZLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDdEYsT0FBTyxFQUF3QixpQkFBaUIsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRXpFLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQzs7Ozs7Ozs7Ozs7OztBQVloRCxNQUFNLE9BQU8sMkJBQTJCO0lBVnhDO1FBcUJFLHdCQUFtQixHQUFHLElBQUksQ0FBQztRQUUzQixnQkFBVyxHQUFHLENBQUMsQ0FBQztRQUVoQixrQkFBYSxHQUFHLENBQUMsQ0FBQztRQUVsQixtQkFBYyxHQUFHLENBQUMsQ0FBQztRQUVuQixrQkFBYSxHQUFHLEtBQUssQ0FBQztRQUV0Qiw2QkFBd0IsR0FBRyxLQUFLLENBQUM7UUFFakMsb0JBQWUsR0FBRyxTQUFTLENBQUM7UUFFckIsV0FBTSxHQUFpQixLQUFLLENBQUM7UUFPN0IsYUFBUSxHQUFHLEtBQUssQ0FBQztRQUdqQixzQkFBaUIsR0FBRyxLQUFLLENBQUM7S0F3Q2xDO0lBckNDLFVBQVUsQ0FBQyxHQUFtQjtRQUM1QixJQUFJLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQztJQUNqQixDQUFDO0lBQ0QsZ0JBQWdCLENBQUMsRUFBYTtRQUM1QixJQUFJLENBQUMsUUFBUSxHQUFHLEVBQUUsQ0FBQztJQUNyQixDQUFDO0lBQ0QsaUJBQWlCO1FBQ2YsdUVBQXVFO0lBQ3pFLENBQUM7SUFFRCxnQkFBZ0IsQ0FBRSxVQUFtQjtRQUNuQyxJQUFJLENBQUMsUUFBUSxHQUFHLFVBQVUsQ0FBQztJQUM3QixDQUFDO0lBRU0sY0FBYztRQUNuQixJQUFJLENBQUMsaUJBQWlCLEdBQUcsSUFBSSxDQUFDO0lBQ2hDLENBQUM7SUFFTSxZQUFZLENBQUMsS0FBd0I7UUFDMUMsSUFBSSxDQUFDLGFBQWEsR0FBRyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3BDLElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQztJQUN4QixDQUFDO0lBRU0sbUJBQW1CLENBQUMsS0FBd0I7UUFDakQsSUFBSSxDQUFDLGNBQWMsR0FBRyxLQUFLLENBQUMsTUFBTSxDQUFDO0lBQ3JDLENBQUM7SUFFTSxrQkFBa0I7UUFDdkIsSUFBSSxDQUFDLEdBQUcsR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDO1FBQy9CLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDMUIsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO0lBQ3pCLENBQUM7SUFFTSxlQUFlO1FBQ3BCLElBQUksQ0FBQyxXQUFXLEVBQUUsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUM7UUFDMUMsSUFBSSxDQUFDLGlCQUFpQixHQUFHLEtBQUssQ0FBQztJQUNqQyxDQUFDOzt3SEExRVUsMkJBQTJCOzRHQUEzQiwyQkFBMkIseVhBTjNCLENBQUM7WUFDVixPQUFPLEVBQUUsaUJBQWlCO1lBQzFCLFdBQVcsRUFBRSxVQUFVLENBQUMsR0FBRyxFQUFFLENBQUMsMkJBQTJCLENBQUM7WUFDMUQsS0FBSyxFQUFFLElBQUk7U0FDWixDQUFDLDBEQThCWSxVQUFVLGdEQzNDMUIsKy9EQStCQTsyRkRoQmEsMkJBQTJCO2tCQVZ2QyxTQUFTOytCQUNFLFVBQVUsYUFHVCxDQUFDOzRCQUNWLE9BQU8sRUFBRSxpQkFBaUI7NEJBQzFCLFdBQVcsRUFBRSxVQUFVLENBQUMsR0FBRyxFQUFFLDRCQUE0QixDQUFDOzRCQUMxRCxLQUFLLEVBQUUsSUFBSTt5QkFDWixDQUFDOzhCQU9LLEdBQUc7c0JBRFQsS0FBSztnQkFHQyxNQUFNO3NCQURaLEtBQUs7Z0JBR0MsUUFBUTtzQkFEZCxLQUFLO2dCQUdOLG1CQUFtQjtzQkFEbEIsS0FBSztnQkFHTixXQUFXO3NCQURWLEtBQUs7Z0JBR04sYUFBYTtzQkFEWixLQUFLO2dCQUdOLGNBQWM7c0JBRGIsS0FBSztnQkFHTixhQUFhO3NCQURaLEtBQUs7Z0JBR04sd0JBQXdCO3NCQUR2QixLQUFLO2dCQUdOLGVBQWU7c0JBRGQsS0FBSztnQkFHQyxNQUFNO3NCQURaLEtBQUs7Z0JBS04sV0FBVztzQkFEVixZQUFZO3VCQUFDLFVBQVUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIGZvcndhcmRSZWYsIElucHV0LCBRdWVyeUxpc3QsIFZpZXdDaGlsZHJlbiB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQ29udHJvbFZhbHVlQWNjZXNzb3IsIE5HX1ZBTFVFX0FDQ0VTU09SIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xyXG5pbXBvcnQgeyBJbWFnZUNyb3BwZWRFdmVudCwgT3V0cHV0Rm9ybWF0IH0gZnJvbSAnbmd4LWltYWdlLWNyb3BwZXInO1xyXG5pbXBvcnQgeyBGaWxlVXBsb2FkIH0gZnJvbSAncHJpbWVuZy9maWxldXBsb2FkJztcclxuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdydy1pbWFnZScsXG4gIHRlbXBsYXRlVXJsOiAnLi9yZXN0d29ybGQtaW1hZ2Utdmlldy5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL3Jlc3R3b3JsZC1pbWFnZS12aWV3LmNvbXBvbmVudC5jc3MnXSxcbiAgcHJvdmlkZXJzOiBbe1xyXG4gICAgcHJvdmlkZTogTkdfVkFMVUVfQUNDRVNTT1IsXHJcbiAgICB1c2VFeGlzdGluZzogZm9yd2FyZFJlZigoKSA9PiBSRVNUV29ybGRJbWFnZVZpZXdDb21wb25lbnQpLFxyXG4gICAgbXVsdGk6IHRydWVcclxuICB9XVxufSlcbmV4cG9ydCBjbGFzcyBSRVNUV29ybGRJbWFnZVZpZXdDb21wb25lbnQgaW1wbGVtZW50cyBDb250cm9sVmFsdWVBY2Nlc3NvciB7XG5cclxuICBwcml2YXRlIG9uQ2hhbmdlPzogRnVuY3Rpb247XG5cbiAgQElucHV0KClcbiAgcHVibGljIGFsdD86IHN0cmluZztcbiAgQElucHV0KClcbiAgcHVibGljIGFjY2VwdD86IHN0cmluZztcbiAgQElucHV0KClcbiAgcHVibGljIGZpbGVOYW1lPzogc3RyaW5nO1xuICBASW5wdXQoKVxuICBtYWludGFpbkFzcGVjdFJhdGlvID0gdHJ1ZTtcbiAgQElucHV0KClcbiAgYXNwZWN0UmF0aW8gPSAxO1xuICBASW5wdXQoKVxuICByZXNpemVUb1dpZHRoID0gMDtcbiAgQElucHV0KClcbiAgcmVzaXplVG9IZWlnaHQgPSAwO1xuICBASW5wdXQoKVxuICBvbmx5U2NhbGVEb3duID0gZmFsc2U7XG4gIEBJbnB1dCgpXG4gIGNvbnRhaW5XaXRoaW5Bc3BlY3RSYXRpbyA9IGZhbHNlO1xuICBASW5wdXQoKVxuICBiYWNrZ3JvdW5kQ29sb3IgPSBcIiNmZmZmZmZcIjtcbiAgQElucHV0KClcbiAgcHVibGljIGZvcm1hdDogT3V0cHV0Rm9ybWF0ID0gJ3BuZyc7XG5cblxyXG4gIEBWaWV3Q2hpbGRyZW4oRmlsZVVwbG9hZClcclxuICBmaWxlVXBsb2Fkcz86IFF1ZXJ5TGlzdDxGaWxlVXBsb2FkPjtcblxuXG4gIHB1YmxpYyBkaXNhYmxlZCA9IGZhbHNlO1xuICBwdWJsaWMgdXJpPzogc3RyaW5nIHwgbnVsbDtcclxuICBwdWJsaWMgdGVtcEltYWdlRmlsZT86IEZpbGU7XHJcbiAgcHVibGljIGRpc3BsYXlDcm9wRGlhbG9nID0gZmFsc2U7XG4gIHB1YmxpYyB0ZW1wQ3JvcHBlZFVyaT86IHN0cmluZyB8IG51bGw7XG5cbiAgd3JpdGVWYWx1ZShvYmo/OiBzdHJpbmcgfCBudWxsKTogdm9pZCB7XHJcbiAgICB0aGlzLnVyaSA9IG9iajtcclxuICB9XHJcbiAgcmVnaXN0ZXJPbkNoYW5nZShmbj86IEZ1bmN0aW9uKTogdm9pZCB7XHJcbiAgICB0aGlzLm9uQ2hhbmdlID0gZm47XHJcbiAgfVxyXG4gIHJlZ2lzdGVyT25Ub3VjaGVkKCk6IHZvaWQge1xyXG4gICAgLy8gbm90IG5lZWRlZCBmb3IgdGhpcyBjb21wb25lbnQsIGJ1dCBuZWVkZWQgdG8gaW1wbGVtZW50IHRoZSBpbnRlcmZhY2VcclxuICB9XHJcblxyXG4gIHNldERpc2FibGVkU3RhdGU/KGlzRGlzYWJsZWQ6IGJvb2xlYW4pOiB2b2lkIHtcclxuICAgIHRoaXMuZGlzYWJsZWQgPSBpc0Rpc2FibGVkO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHNob3dDcm9wRGlhbG9nKCk6IHZvaWQge1xyXG4gICAgdGhpcy5kaXNwbGF5Q3JvcERpYWxvZyA9IHRydWU7XHJcbiAgfVxyXG5cbiAgcHVibGljIGltYWdlQ2hhbmdlZChldmVudDogeyBmaWxlczogRmlsZVtdIH0pOiB2b2lkIHtcclxuICAgIHRoaXMudGVtcEltYWdlRmlsZSA9IGV2ZW50LmZpbGVzWzBdO1xyXG4gICAgdGhpcy5zaG93Q3JvcERpYWxvZygpO1xyXG4gIH1cblxuICBwdWJsaWMgY3JvcHBlZEltYWdlQ2hhbmdlZChldmVudDogSW1hZ2VDcm9wcGVkRXZlbnQpOiB2b2lkIHtcclxuICAgIHRoaXMudGVtcENyb3BwZWRVcmkgPSBldmVudC5iYXNlNjQ7XHJcbiAgfVxuXHJcbiAgcHVibGljIGFjY2VwdENyb3BwZWRJbWFnZSgpOiB2b2lkIHtcclxuICAgIHRoaXMudXJpID0gdGhpcy50ZW1wQ3JvcHBlZFVyaTtcclxuICAgIHRoaXMub25DaGFuZ2U/Lih0aGlzLnVyaSk7XHJcbiAgICB0aGlzLmNsb3NlQ3JvcERpYWxvZygpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGNsb3NlQ3JvcERpYWxvZygpOiB2b2lkIHtcclxuICAgIHRoaXMuZmlsZVVwbG9hZHM/LmZvckVhY2goZiA9PiBmLmNsZWFyKCkpO1xyXG4gICAgdGhpcy5kaXNwbGF5Q3JvcERpYWxvZyA9IGZhbHNlO1xyXG4gIH1cbn1cbiIsIjxkaXYgY2xhc3M9XCJmbGV4IGFsaWduLWl0ZW1zLWNlbnRlclwiPlxyXG4gIDxwLWJ1dHRvbiAqbmdJZj1cIiF1cmlcIiBbZGlzYWJsZWRdPVwidHJ1ZVwiIGljb249XCJwaSBwaS1kb3dubG9hZFwiIGNsYXNzPVwibXItMVwiIHBUb29sdGlwPVwiTm8gaW1hZ2UgcHJlc2VudFwiPjwvcC1idXR0b24+XHJcbiAgPGEgKm5nSWY9XCJ1cmlcIiBbaHJlZl09XCJ1cmkgfCBzYWZlVXJsXCIgW2Rvd25sb2FkXT1cImZpbGVOYW1lIHx8ICdkb3dubG9hZCdcIiBjbGFzcz1cIm1yLTFcIiBwQnV0dG9uIHBUb29sdGlwPVwiRG93bmxvYWQgaW1hZ2VcIiBpY29uPVwicGkgcGktZG93bmxvYWRcIj48L2E+XHJcbiAgPHAtZmlsZVVwbG9hZCBjbGFzcz1cIm1yLTFcIiBjaG9vc2VJY29uPVwicGktdXBsb2FkIGZhcyBmYS11cGxvYWRcIiBtb2RlPVwiYmFzaWNcIiBbYXV0b109XCJ0cnVlXCIgW2FjY2VwdF09XCJhY2NlcHQgfHwgJ2ZhbHNlJ1wiIFtjdXN0b21VcGxvYWRdPVwidHJ1ZVwiICh1cGxvYWRIYW5kbGVyKT1cImltYWdlQ2hhbmdlZCgkZXZlbnQpXCIgcFRvb2x0aXA9XCJVcGxvYWQgbmV3IGltYWdlXCI+PC9wLWZpbGVVcGxvYWQ+XHJcbiAgPGltZyAqbmdJZj1cInVyaVwiIFtzcmNdPVwidXJpXCIgW2FsdF09XCJhbHRcIiAoY2xpY2spPVwic2hvd0Nyb3BEaWFsb2coKVwiIHBUb29sdGlwPVwiWm9vbSBhbmQgY3JvcFwiIC8+XHJcbjwvZGl2PlxyXG5cclxuPHAtZGlhbG9nIGhlYWRlcj1cImFsdFwiIFsodmlzaWJsZSldPVwiZGlzcGxheUNyb3BEaWFsb2dcIj5cclxuICA8aW1hZ2UtY3JvcHBlciAjY3JvcHBlclxyXG4gICAgICAgICAgICAgICAgIFtpbWFnZUZpbGVdPVwidGVtcEltYWdlRmlsZSFcIlxyXG4gICAgICAgICAgICAgICAgIFtpbWFnZVVSTF09XCJ1cmkhXCJcclxuICAgICAgICAgICAgICAgICBbbWFpbnRhaW5Bc3BlY3RSYXRpb109XCJtYWludGFpbkFzcGVjdFJhdGlvXCJcclxuICAgICAgICAgICAgICAgICBbYXNwZWN0UmF0aW9dPVwiYXNwZWN0UmF0aW9cIlxyXG4gICAgICAgICAgICAgICAgIFtyZXNpemVUb1dpZHRoXT1cInJlc2l6ZVRvV2lkdGhcIlxyXG4gICAgICAgICAgICAgICAgIFtyZXNpemVUb0hlaWdodF09XCJyZXNpemVUb0hlaWdodFwiXHJcbiAgICAgICAgICAgICAgICAgW29ubHlTY2FsZURvd25dPVwib25seVNjYWxlRG93blwiXHJcbiAgICAgICAgICAgICAgICAgW2F1dG9Dcm9wXT1cInRydWVcIlxyXG4gICAgICAgICAgICAgICAgIFtjb250YWluV2l0aGluQXNwZWN0UmF0aW9dPVwiY29udGFpbldpdGhpbkFzcGVjdFJhdGlvXCJcclxuICAgICAgICAgICAgICAgICBbYmFja2dyb3VuZENvbG9yXT1cImJhY2tncm91bmRDb2xvclwiXHJcbiAgICAgICAgICAgICAgICAgW2Zvcm1hdF09XCJmb3JtYXRcIlxyXG4gICAgICAgICAgICAgICAgIChpbWFnZUNyb3BwZWQpPVwiY3JvcHBlZEltYWdlQ2hhbmdlZCgkZXZlbnQpXCI+PC9pbWFnZS1jcm9wcGVyPlxyXG4gIDxkaXYgY2xhc3M9XCJmbGV4IGp1c3RpZnktY29udGVudC1lbmRcIj5cclxuICAgIDxkaXYgY2xhc3M9XCJmbGV4LWF1dG8gYWxpZ24taXRlbXMtY2VudGVyXCI+XHJcbiAgICAgIDxzcGFuPkJhY2tncm91bmQgY29sb3I6Jm5ic3A7PC9zcGFuPlxyXG4gICAgICA8cC1jb2xvclBpY2tlciBbKG5nTW9kZWwpXT1cImNyb3BwZXIuYmFja2dyb3VuZENvbG9yXCIgYXBwZW5kVG89XCJib2R5XCIgY2xhc3M9XCJtbC0xIG1yLTFcIj48L3AtY29sb3JQaWNrZXI+XHJcbiAgICAgIDxpbnB1dCBwSW5wdXRUZXh0IFsobmdNb2RlbCldPVwiY3JvcHBlci5iYWNrZ3JvdW5kQ29sb3JcIiAvPlxyXG4gICAgPC9kaXY+XHJcbiAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBwQnV0dG9uIHBSaXBwbGUgKGNsaWNrKT1cImFjY2VwdENyb3BwZWRJbWFnZSgpXCIgY2xhc3M9XCJtci0yXCI+T2s8L2J1dHRvbj5cclxuICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIHBCdXR0b24gcFJpcHBsZSAoY2xpY2spPVwiY2xvc2VDcm9wRGlhbG9nKClcIj5DYW5jZWw8L2J1dHRvbj5cclxuICA8L2Rpdj5cclxuPC9wLWRpYWxvZz5cclxuIl19