@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
@@ -1,107 +0,0 @@
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
- var _a;
53
- this.uri = this.tempCroppedUri;
54
- (_a = this.onChange) === null || _a === void 0 ? void 0 : _a.call(this, this.uri);
55
- this.closeCropDialog();
56
- }
57
- closeCropDialog() {
58
- var _a;
59
- (_a = this.fileUploads) === null || _a === void 0 ? void 0 : _a.forEach(f => f.clear());
60
- this.displayCropDialog = false;
61
- }
62
- }
63
- RESTWorldImageViewComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.11", ngImport: i0, type: RESTWorldImageViewComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
64
- RESTWorldImageViewComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.2.11", 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: [{
65
- provide: NG_VALUE_ACCESSOR,
66
- useExisting: forwardRef(() => RESTWorldImageViewComponent),
67
- multi: true
68
- }], 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 + 2*8px + 2*1px);cursor:zoom-in;border-radius:3px}a{text-decoration:none;height:calc(1rem + 2*8px + 2px)}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"], 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: ["format", "transform", "maintainAspectRatio", "aspectRatio", "resizeToWidth", "resizeToHeight", "cropperMinWidth", "cropperMinHeight", "cropperMaxHeight", "cropperMaxWidth", "cropperStaticWidth", "cropperStaticHeight", "canvasRotation", "initialStepSize", "roundCropper", "onlyScaleDown", "imageQuality", "autoCrop", "backgroundColor", "containWithinAspectRatio", "hideResizeSquares", "cropper", "alignImage", "disabled", "imageChangedEvent", "imageURL", "imageBase64", "imageFile"], 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 } });
69
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.11", ngImport: i0, type: RESTWorldImageViewComponent, decorators: [{
70
- type: Component,
71
- args: [{
72
- selector: 'rw-image',
73
- templateUrl: './restworld-image-view.component.html',
74
- styleUrls: ['./restworld-image-view.component.css'],
75
- providers: [{
76
- provide: NG_VALUE_ACCESSOR,
77
- useExisting: forwardRef(() => RESTWorldImageViewComponent),
78
- multi: true
79
- }]
80
- }]
81
- }], propDecorators: { alt: [{
82
- type: Input
83
- }], accept: [{
84
- type: Input
85
- }], fileName: [{
86
- type: Input
87
- }], maintainAspectRatio: [{
88
- type: Input
89
- }], aspectRatio: [{
90
- type: Input
91
- }], resizeToWidth: [{
92
- type: Input
93
- }], resizeToHeight: [{
94
- type: Input
95
- }], onlyScaleDown: [{
96
- type: Input
97
- }], containWithinAspectRatio: [{
98
- type: Input
99
- }], backgroundColor: [{
100
- type: Input
101
- }], format: [{
102
- type: Input
103
- }], fileUploads: [{
104
- type: ViewChildren,
105
- args: [FileUpload]
106
- }] } });
107
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVzdHdvcmxkLWltYWdlLXZpZXcuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LXJlc3R3b3JsZC1jbGllbnQvc3JjL2xpYi92aWV3cy9yZXN0d29ybGQtaW1hZ2Utdmlldy9yZXN0d29ybGQtaW1hZ2Utdmlldy5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtcmVzdHdvcmxkLWNsaWVudC9zcmMvbGliL3ZpZXdzL3Jlc3R3b3JsZC1pbWFnZS12aWV3L3Jlc3R3b3JsZC1pbWFnZS12aWV3LmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsVUFBVSxFQUFFLEtBQUssRUFBYSxZQUFZLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDdEYsT0FBTyxFQUF3QixpQkFBaUIsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRXpFLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQzs7Ozs7Ozs7Ozs7OztBQVloRCxNQUFNLE9BQU8sMkJBQTJCO0lBVnhDO1FBcUJFLHdCQUFtQixHQUFHLElBQUksQ0FBQztRQUUzQixnQkFBVyxHQUFHLENBQUMsQ0FBQztRQUVoQixrQkFBYSxHQUFHLENBQUMsQ0FBQztRQUVsQixtQkFBYyxHQUFHLENBQUMsQ0FBQztRQUVuQixrQkFBYSxHQUFHLEtBQUssQ0FBQztRQUV0Qiw2QkFBd0IsR0FBRyxLQUFLLENBQUM7UUFFakMsb0JBQWUsR0FBRyxTQUFTLENBQUM7UUFFckIsV0FBTSxHQUFpQixLQUFLLENBQUM7UUFPN0IsYUFBUSxHQUFHLEtBQUssQ0FBQztRQUdqQixzQkFBaUIsR0FBRyxLQUFLLENBQUM7S0F3Q2xDO0lBckNDLFVBQVUsQ0FBQyxHQUFtQjtRQUM1QixJQUFJLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQztJQUNqQixDQUFDO0lBQ0QsZ0JBQWdCLENBQUMsRUFBYTtRQUM1QixJQUFJLENBQUMsUUFBUSxHQUFHLEVBQUUsQ0FBQztJQUNyQixDQUFDO0lBQ0QsaUJBQWlCO1FBQ2YsdUVBQXVFO0lBQ3pFLENBQUM7SUFFRCxnQkFBZ0IsQ0FBRSxVQUFtQjtRQUNuQyxJQUFJLENBQUMsUUFBUSxHQUFHLFVBQVUsQ0FBQztJQUM3QixDQUFDO0lBRU0sY0FBYztRQUNuQixJQUFJLENBQUMsaUJBQWlCLEdBQUcsSUFBSSxDQUFDO0lBQ2hDLENBQUM7SUFFTSxZQUFZLENBQUMsS0FBd0I7UUFDMUMsSUFBSSxDQUFDLGFBQWEsR0FBRyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3BDLElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQztJQUN4QixDQUFDO0lBRU0sbUJBQW1CLENBQUMsS0FBd0I7UUFDakQsSUFBSSxDQUFDLGNBQWMsR0FBRyxLQUFLLENBQUMsTUFBTSxDQUFDO0lBQ3JDLENBQUM7SUFFTSxrQkFBa0I7O1FBQ3ZCLElBQUksQ0FBQyxHQUFHLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQztRQUMvQixNQUFBLElBQUksQ0FBQyxRQUFRLCtDQUFiLElBQUksRUFBWSxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDMUIsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO0lBQ3pCLENBQUM7SUFFTSxlQUFlOztRQUNwQixNQUFBLElBQUksQ0FBQyxXQUFXLDBDQUFFLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDO1FBQzFDLElBQUksQ0FBQyxpQkFBaUIsR0FBRyxLQUFLLENBQUM7SUFDakMsQ0FBQzs7eUhBMUVVLDJCQUEyQjs2R0FBM0IsMkJBQTJCLHlYQU4zQixDQUFDO1lBQ1YsT0FBTyxFQUFFLGlCQUFpQjtZQUMxQixXQUFXLEVBQUUsVUFBVSxDQUFDLEdBQUcsRUFBRSxDQUFDLDJCQUEyQixDQUFDO1lBQzFELEtBQUssRUFBRSxJQUFJO1NBQ1osQ0FBQywwREE4QlksVUFBVSxnREMzQzFCLCsvREErQkE7NEZEaEJhLDJCQUEyQjtrQkFWdkMsU0FBUzttQkFBQztvQkFDVCxRQUFRLEVBQUUsVUFBVTtvQkFDcEIsV0FBVyxFQUFFLHVDQUF1QztvQkFDcEQsU0FBUyxFQUFFLENBQUMsc0NBQXNDLENBQUM7b0JBQ25ELFNBQVMsRUFBRSxDQUFDOzRCQUNWLE9BQU8sRUFBRSxpQkFBaUI7NEJBQzFCLFdBQVcsRUFBRSxVQUFVLENBQUMsR0FBRyxFQUFFLDRCQUE0QixDQUFDOzRCQUMxRCxLQUFLLEVBQUUsSUFBSTt5QkFDWixDQUFDO2lCQUNIOzhCQU1RLEdBQUc7c0JBRFQsS0FBSztnQkFHQyxNQUFNO3NCQURaLEtBQUs7Z0JBR0MsUUFBUTtzQkFEZCxLQUFLO2dCQUdOLG1CQUFtQjtzQkFEbEIsS0FBSztnQkFHTixXQUFXO3NCQURWLEtBQUs7Z0JBR04sYUFBYTtzQkFEWixLQUFLO2dCQUdOLGNBQWM7c0JBRGIsS0FBSztnQkFHTixhQUFhO3NCQURaLEtBQUs7Z0JBR04sd0JBQXdCO3NCQUR2QixLQUFLO2dCQUdOLGVBQWU7c0JBRGQsS0FBSztnQkFHQyxNQUFNO3NCQURaLEtBQUs7Z0JBS04sV0FBVztzQkFEVixZQUFZO3VCQUFDLFVBQVUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIGZvcndhcmRSZWYsIElucHV0LCBRdWVyeUxpc3QsIFZpZXdDaGlsZHJlbiB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQ29udHJvbFZhbHVlQWNjZXNzb3IsIE5HX1ZBTFVFX0FDQ0VTU09SIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xyXG5pbXBvcnQgeyBJbWFnZUNyb3BwZWRFdmVudCwgT3V0cHV0Rm9ybWF0IH0gZnJvbSAnbmd4LWltYWdlLWNyb3BwZXInO1xyXG5pbXBvcnQgeyBGaWxlVXBsb2FkIH0gZnJvbSAncHJpbWVuZy9maWxldXBsb2FkJztcclxuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdydy1pbWFnZScsXG4gIHRlbXBsYXRlVXJsOiAnLi9yZXN0d29ybGQtaW1hZ2Utdmlldy5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL3Jlc3R3b3JsZC1pbWFnZS12aWV3LmNvbXBvbmVudC5jc3MnXSxcbiAgcHJvdmlkZXJzOiBbe1xyXG4gICAgcHJvdmlkZTogTkdfVkFMVUVfQUNDRVNTT1IsXHJcbiAgICB1c2VFeGlzdGluZzogZm9yd2FyZFJlZigoKSA9PiBSRVNUV29ybGRJbWFnZVZpZXdDb21wb25lbnQpLFxyXG4gICAgbXVsdGk6IHRydWVcclxuICB9XVxufSlcbmV4cG9ydCBjbGFzcyBSRVNUV29ybGRJbWFnZVZpZXdDb21wb25lbnQgaW1wbGVtZW50cyBDb250cm9sVmFsdWVBY2Nlc3NvciB7XG5cclxuICBwcml2YXRlIG9uQ2hhbmdlPzogRnVuY3Rpb247XG5cbiAgQElucHV0KClcbiAgcHVibGljIGFsdD86IHN0cmluZztcbiAgQElucHV0KClcbiAgcHVibGljIGFjY2VwdD86IHN0cmluZztcbiAgQElucHV0KClcbiAgcHVibGljIGZpbGVOYW1lPzogc3RyaW5nO1xuICBASW5wdXQoKVxuICBtYWludGFpbkFzcGVjdFJhdGlvID0gdHJ1ZTtcbiAgQElucHV0KClcbiAgYXNwZWN0UmF0aW8gPSAxO1xuICBASW5wdXQoKVxuICByZXNpemVUb1dpZHRoID0gMDtcbiAgQElucHV0KClcbiAgcmVzaXplVG9IZWlnaHQgPSAwO1xuICBASW5wdXQoKVxuICBvbmx5U2NhbGVEb3duID0gZmFsc2U7XG4gIEBJbnB1dCgpXG4gIGNvbnRhaW5XaXRoaW5Bc3BlY3RSYXRpbyA9IGZhbHNlO1xuICBASW5wdXQoKVxuICBiYWNrZ3JvdW5kQ29sb3IgPSBcIiNmZmZmZmZcIjtcbiAgQElucHV0KClcbiAgcHVibGljIGZvcm1hdDogT3V0cHV0Rm9ybWF0ID0gJ3BuZyc7XG5cblxyXG4gIEBWaWV3Q2hpbGRyZW4oRmlsZVVwbG9hZClcclxuICBmaWxlVXBsb2Fkcz86IFF1ZXJ5TGlzdDxGaWxlVXBsb2FkPjtcblxuXG4gIHB1YmxpYyBkaXNhYmxlZCA9IGZhbHNlO1xuICBwdWJsaWMgdXJpPzogc3RyaW5nIHwgbnVsbDtcclxuICBwdWJsaWMgdGVtcEltYWdlRmlsZT86IEZpbGU7XHJcbiAgcHVibGljIGRpc3BsYXlDcm9wRGlhbG9nID0gZmFsc2U7XG4gIHB1YmxpYyB0ZW1wQ3JvcHBlZFVyaT86IHN0cmluZyB8IG51bGw7XG5cbiAgd3JpdGVWYWx1ZShvYmo/OiBzdHJpbmcgfCBudWxsKTogdm9pZCB7XHJcbiAgICB0aGlzLnVyaSA9IG9iajtcclxuICB9XHJcbiAgcmVnaXN0ZXJPbkNoYW5nZShmbj86IEZ1bmN0aW9uKTogdm9pZCB7XHJcbiAgICB0aGlzLm9uQ2hhbmdlID0gZm47XHJcbiAgfVxyXG4gIHJlZ2lzdGVyT25Ub3VjaGVkKCk6IHZvaWQge1xyXG4gICAgLy8gbm90IG5lZWRlZCBmb3IgdGhpcyBjb21wb25lbnQsIGJ1dCBuZWVkZWQgdG8gaW1wbGVtZW50IHRoZSBpbnRlcmZhY2VcclxuICB9XHJcblxyXG4gIHNldERpc2FibGVkU3RhdGU/KGlzRGlzYWJsZWQ6IGJvb2xlYW4pOiB2b2lkIHtcclxuICAgIHRoaXMuZGlzYWJsZWQgPSBpc0Rpc2FibGVkO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHNob3dDcm9wRGlhbG9nKCk6IHZvaWQge1xyXG4gICAgdGhpcy5kaXNwbGF5Q3JvcERpYWxvZyA9IHRydWU7XHJcbiAgfVxyXG5cbiAgcHVibGljIGltYWdlQ2hhbmdlZChldmVudDogeyBmaWxlczogRmlsZVtdIH0pOiB2b2lkIHtcclxuICAgIHRoaXMudGVtcEltYWdlRmlsZSA9IGV2ZW50LmZpbGVzWzBdO1xyXG4gICAgdGhpcy5zaG93Q3JvcERpYWxvZygpO1xyXG4gIH1cblxuICBwdWJsaWMgY3JvcHBlZEltYWdlQ2hhbmdlZChldmVudDogSW1hZ2VDcm9wcGVkRXZlbnQpOiB2b2lkIHtcclxuICAgIHRoaXMudGVtcENyb3BwZWRVcmkgPSBldmVudC5iYXNlNjQ7XHJcbiAgfVxuXHJcbiAgcHVibGljIGFjY2VwdENyb3BwZWRJbWFnZSgpOiB2b2lkIHtcclxuICAgIHRoaXMudXJpID0gdGhpcy50ZW1wQ3JvcHBlZFVyaTtcclxuICAgIHRoaXMub25DaGFuZ2U/Lih0aGlzLnVyaSk7XHJcbiAgICB0aGlzLmNsb3NlQ3JvcERpYWxvZygpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGNsb3NlQ3JvcERpYWxvZygpOiB2b2lkIHtcclxuICAgIHRoaXMuZmlsZVVwbG9hZHM/LmZvckVhY2goZiA9PiBmLmNsZWFyKCkpO1xyXG4gICAgdGhpcy5kaXNwbGF5Q3JvcERpYWxvZyA9IGZhbHNlO1xyXG4gIH1cbn1cbiIsIjxkaXYgY2xhc3M9XCJmbGV4IGFsaWduLWl0ZW1zLWNlbnRlclwiPlxyXG4gIDxwLWJ1dHRvbiAqbmdJZj1cIiF1cmlcIiBbZGlzYWJsZWRdPVwidHJ1ZVwiIGljb249XCJwaSBwaS1kb3dubG9hZFwiIGNsYXNzPVwibXItMVwiIHBUb29sdGlwPVwiTm8gaW1hZ2UgcHJlc2VudFwiPjwvcC1idXR0b24+XHJcbiAgPGEgKm5nSWY9XCJ1cmlcIiBbaHJlZl09XCJ1cmkgfCBzYWZlVXJsXCIgW2Rvd25sb2FkXT1cImZpbGVOYW1lIHx8ICdkb3dubG9hZCdcIiBjbGFzcz1cIm1yLTFcIiBwQnV0dG9uIHBUb29sdGlwPVwiRG93bmxvYWQgaW1hZ2VcIiBpY29uPVwicGkgcGktZG93bmxvYWRcIj48L2E+XHJcbiAgPHAtZmlsZVVwbG9hZCBjbGFzcz1cIm1yLTFcIiBjaG9vc2VJY29uPVwicGktdXBsb2FkIGZhcyBmYS11cGxvYWRcIiBtb2RlPVwiYmFzaWNcIiBbYXV0b109XCJ0cnVlXCIgW2FjY2VwdF09XCJhY2NlcHQgfHwgJ2ZhbHNlJ1wiIFtjdXN0b21VcGxvYWRdPVwidHJ1ZVwiICh1cGxvYWRIYW5kbGVyKT1cImltYWdlQ2hhbmdlZCgkZXZlbnQpXCIgcFRvb2x0aXA9XCJVcGxvYWQgbmV3IGltYWdlXCI+PC9wLWZpbGVVcGxvYWQ+XHJcbiAgPGltZyAqbmdJZj1cInVyaVwiIFtzcmNdPVwidXJpXCIgW2FsdF09XCJhbHRcIiAoY2xpY2spPVwic2hvd0Nyb3BEaWFsb2coKVwiIHBUb29sdGlwPVwiWm9vbSBhbmQgY3JvcFwiIC8+XHJcbjwvZGl2PlxyXG5cclxuPHAtZGlhbG9nIGhlYWRlcj1cImFsdFwiIFsodmlzaWJsZSldPVwiZGlzcGxheUNyb3BEaWFsb2dcIj5cclxuICA8aW1hZ2UtY3JvcHBlciAjY3JvcHBlclxyXG4gICAgICAgICAgICAgICAgIFtpbWFnZUZpbGVdPVwidGVtcEltYWdlRmlsZSFcIlxyXG4gICAgICAgICAgICAgICAgIFtpbWFnZVVSTF09XCJ1cmkhXCJcclxuICAgICAgICAgICAgICAgICBbbWFpbnRhaW5Bc3BlY3RSYXRpb109XCJtYWludGFpbkFzcGVjdFJhdGlvXCJcclxuICAgICAgICAgICAgICAgICBbYXNwZWN0UmF0aW9dPVwiYXNwZWN0UmF0aW9cIlxyXG4gICAgICAgICAgICAgICAgIFtyZXNpemVUb1dpZHRoXT1cInJlc2l6ZVRvV2lkdGhcIlxyXG4gICAgICAgICAgICAgICAgIFtyZXNpemVUb0hlaWdodF09XCJyZXNpemVUb0hlaWdodFwiXHJcbiAgICAgICAgICAgICAgICAgW29ubHlTY2FsZURvd25dPVwib25seVNjYWxlRG93blwiXHJcbiAgICAgICAgICAgICAgICAgW2F1dG9Dcm9wXT1cInRydWVcIlxyXG4gICAgICAgICAgICAgICAgIFtjb250YWluV2l0aGluQXNwZWN0UmF0aW9dPVwiY29udGFpbldpdGhpbkFzcGVjdFJhdGlvXCJcclxuICAgICAgICAgICAgICAgICBbYmFja2dyb3VuZENvbG9yXT1cImJhY2tncm91bmRDb2xvclwiXHJcbiAgICAgICAgICAgICAgICAgW2Zvcm1hdF09XCJmb3JtYXRcIlxyXG4gICAgICAgICAgICAgICAgIChpbWFnZUNyb3BwZWQpPVwiY3JvcHBlZEltYWdlQ2hhbmdlZCgkZXZlbnQpXCI+PC9pbWFnZS1jcm9wcGVyPlxyXG4gIDxkaXYgY2xhc3M9XCJmbGV4IGp1c3RpZnktY29udGVudC1lbmRcIj5cclxuICAgIDxkaXYgY2xhc3M9XCJmbGV4LWF1dG8gYWxpZ24taXRlbXMtY2VudGVyXCI+XHJcbiAgICAgIDxzcGFuPkJhY2tncm91bmQgY29sb3I6Jm5ic3A7PC9zcGFuPlxyXG4gICAgICA8cC1jb2xvclBpY2tlciBbKG5nTW9kZWwpXT1cImNyb3BwZXIuYmFja2dyb3VuZENvbG9yXCIgYXBwZW5kVG89XCJib2R5XCIgY2xhc3M9XCJtbC0xIG1yLTFcIj48L3AtY29sb3JQaWNrZXI+XHJcbiAgICAgIDxpbnB1dCBwSW5wdXRUZXh0IFsobmdNb2RlbCldPVwiY3JvcHBlci5iYWNrZ3JvdW5kQ29sb3JcIiAvPlxyXG4gICAgPC9kaXY+XHJcbiAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBwQnV0dG9uIHBSaXBwbGUgKGNsaWNrKT1cImFjY2VwdENyb3BwZWRJbWFnZSgpXCIgY2xhc3M9XCJtci0yXCI+T2s8L2J1dHRvbj5cclxuICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIHBCdXR0b24gcFJpcHBsZSAoY2xpY2spPVwiY2xvc2VDcm9wRGlhbG9nKClcIj5DYW5jZWw8L2J1dHRvbj5cclxuICA8L2Rpdj5cclxuPC9wLWRpYWxvZz5cclxuIl19
@@ -1,353 +0,0 @@
1
- import { __awaiter } from "tslib";
2
- import { Component, Input } from '@angular/core';
3
- import * as _ from 'lodash';
4
- import { FilterMatchMode } from 'primeng/api';
5
- import { ProblemDetails } from '../../models/problem-details';
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 "../../services/avatar-generator";
10
- import * as i4 from "primeng/table";
11
- import * as i5 from "primeng/avatar";
12
- import * as i6 from "primeng/tristatecheckbox";
13
- import * as i7 from "primeng/toast";
14
- import * as i8 from "primeng/confirmdialog";
15
- import * as i9 from "@angular/common";
16
- import * as i10 from "primeng/tooltip";
17
- import * as i11 from "@angular/router";
18
- import * as i12 from "primeng/button";
19
- import * as i13 from "@angular/forms";
20
- export var ColumnType;
21
- (function (ColumnType) {
22
- ColumnType["text"] = "text";
23
- ColumnType["numeric"] = "numeric";
24
- ColumnType["boolean"] = "boolean";
25
- ColumnType["date"] = "date";
26
- })(ColumnType || (ColumnType = {}));
27
- export class RESTworldListViewComponent {
28
- constructor(_clients, _confirmationService, _messageService, avatarGenerator) {
29
- this._clients = _clients;
30
- this._confirmationService = _confirmationService;
31
- this._messageService = _messageService;
32
- this.avatarGenerator = avatarGenerator;
33
- this._columns = [];
34
- this._editLink = '/edit';
35
- this.isLoading = false;
36
- this._totalRecords = 0;
37
- this.rowsPerPage = [10, 25, 50];
38
- this._lastEvent = {
39
- rows: this.rowsPerPage[0]
40
- };
41
- }
42
- get columns() {
43
- return this._columns;
44
- }
45
- set editLink(value) {
46
- if (value)
47
- this._editLink = value;
48
- }
49
- get editLink() {
50
- return this._editLink;
51
- }
52
- set apiName(value) {
53
- this._apiName = value;
54
- if (this.apiName && this.rel && this._lastEvent)
55
- this.load(this._lastEvent);
56
- }
57
- get apiName() {
58
- return this._apiName;
59
- }
60
- set rel(value) {
61
- this._rel = value;
62
- if (this.apiName && this.rel && this._lastEvent)
63
- this.load(this._lastEvent);
64
- }
65
- get rel() {
66
- return this._rel;
67
- }
68
- get value() {
69
- var _a, _b;
70
- return ((_b = (_a = this.resource) === null || _a === void 0 ? void 0 : _a._embedded) === null || _b === void 0 ? void 0 : _b.items) || [];
71
- }
72
- get rows() {
73
- var _a;
74
- return ((_a = this._lastEvent) === null || _a === void 0 ? void 0 : _a.rows) || 0;
75
- }
76
- get totalRecords() {
77
- return this._totalRecords;
78
- }
79
- set totalRecords(value) {
80
- this._totalRecords = value || 0;
81
- }
82
- get sortOrder() {
83
- return this._lastEvent.sortOrder || 0;
84
- }
85
- get newHref() {
86
- var _a, _b;
87
- return (_b = (_a = this.resource) === null || _a === void 0 ? void 0 : _a.findLink('new')) === null || _b === void 0 ? void 0 : _b.href;
88
- }
89
- get dateFormat() {
90
- return RESTworldListViewComponent._dateFormat;
91
- }
92
- getClient() {
93
- if (!this.apiName)
94
- throw new Error('Cannot get a client, because the apiName is not set.');
95
- return this._clients.getClient(this.apiName);
96
- }
97
- load(event) {
98
- return __awaiter(this, void 0, void 0, function* () {
99
- if (!this.apiName || !this.rel)
100
- return;
101
- this.isLoading = true;
102
- this._lastEvent = event;
103
- const parameters = this.createParametersFromEvent(event);
104
- const response = yield this.getClient().getList(this.rel, parameters);
105
- if (!response.ok || ProblemDetails.isProblemDetails(response.body) || !response.body) {
106
- this._messageService.add({ severity: 'error', summary: 'Error', detail: 'Error while loading the resources from the API.', data: response });
107
- }
108
- else if (response.body) {
109
- this.resource = response.body;
110
- this.totalRecords = this.resource.totalPages && parameters.$top ? this.resource.totalPages * parameters.$top : undefined;
111
- this._columns = this.createColumns();
112
- }
113
- this.isLoading = false;
114
- });
115
- }
116
- showDeleteConfirmatioModal(resource) {
117
- this._confirmationService.confirm({
118
- message: 'Do you really want to delete this resource?',
119
- header: 'Confirm delete',
120
- icon: 'far fa-trash-alt',
121
- accept: () => this.delete(resource)
122
- });
123
- }
124
- delete(resource) {
125
- return __awaiter(this, void 0, void 0, function* () {
126
- if (!this.apiName || !this.rel)
127
- return;
128
- yield this.getClient().delete(resource);
129
- this._messageService.add({ severity: 'success', summary: 'Deleted', detail: 'The resource has been deleted.' });
130
- this.load(this._lastEvent);
131
- });
132
- }
133
- createColumns() {
134
- if (this.value.length === 0)
135
- return this.columns;
136
- // Get all distinct properties from all rows
137
- // We look at all rows to eliminate possible undefined values
138
- const rowsWithProperties = this.value
139
- .map(resource => Object.entries(resource)
140
- .filter(p => p[0] !== '_links' &&
141
- p[0] !== '_embedded' &&
142
- p[0] !== 'id' &&
143
- p[0] !== 'timestamp'));
144
- const distinctProperties = rowsWithProperties[0];
145
- for (const propertiesOfRow of rowsWithProperties) {
146
- for (const property of propertiesOfRow) {
147
- const propertyName = property[0];
148
- const propertyValue = property[1];
149
- const alreadyFoundPropertyWithSameName = distinctProperties.find(p => p[0] === propertyName);
150
- if (!alreadyFoundPropertyWithSameName) // Add new property
151
- distinctProperties.push(property);
152
- else if (!alreadyFoundPropertyWithSameName[1] && propertyValue) // Use defined value instead of existing undefined value
153
- alreadyFoundPropertyWithSameName[1] = propertyValue;
154
- }
155
- }
156
- // Check if the rows are entities with change tracking
157
- const withoutChangeTrackingProperties = distinctProperties.filter(p => p[0] !== 'createdAt' &&
158
- p[0] !== 'createdBy' &&
159
- p[0] !== 'lastChangedAt' &&
160
- p[0] !== 'lastChangedBy');
161
- const hasChangeTrackingProperties = withoutChangeTrackingProperties.length < distinctProperties.length;
162
- // First the id, then all other properties
163
- const sortedProperties = [
164
- ['id', 0],
165
- ...withoutChangeTrackingProperties
166
- ];
167
- // And change tracking properties at the end
168
- if (hasChangeTrackingProperties) {
169
- sortedProperties.push(['createdAt', new Date()]);
170
- sortedProperties.push(['createdBy', '']);
171
- sortedProperties.push(['lastChangedAt', new Date()]);
172
- sortedProperties.push(['lastChangedBy', '']);
173
- }
174
- const columns = sortedProperties
175
- .map(p => ({
176
- header: RESTworldListViewComponent.toTitleCase(p[0]),
177
- field: p[0],
178
- type: RESTworldListViewComponent.getColumnType(p[1]),
179
- }));
180
- return columns;
181
- }
182
- static getColumnType(value) {
183
- if (value === null || value === undefined)
184
- return ColumnType.text;
185
- if (_.isNumber(value))
186
- return ColumnType.numeric;
187
- if (_.isDate(value))
188
- return ColumnType.date;
189
- if (_.isString(value))
190
- return ColumnType.text;
191
- if (_.isBoolean(value))
192
- return ColumnType.boolean;
193
- return ColumnType.text;
194
- }
195
- static toTitleCase(anyCase) {
196
- return anyCase
197
- .replace(/(_)+/g, ' ') // underscore to whitespace
198
- .replace(/([a-z])([A-Z][a-z])/g, "$1 $2") // insert space before each new word if there is none
199
- .replace(/([A-Z][a-z])([A-Z])/g, "$1 $2") // insert space after each word if there is none
200
- .replace(/([a-z])([A-Z]+[a-z])/g, "$1 $2") // insert space after single letter word if there is none
201
- .replace(/([A-Z]+)([A-Z][a-z][a-z])/g, "$1 $2") // insert space before single letter word if there is none
202
- .replace(/([a-z]+)([A-Z0-9]+)/g, "$1 $2") // insert space after numbers
203
- .replace(/^./, (match) => match.toUpperCase()); // change first letter to be upper case
204
- }
205
- createParametersFromEvent(event) {
206
- const oDataParameters = {
207
- $filter: this.createFilterFromEvent(event),
208
- $orderby: RESTworldListViewComponent.createOrderByFromEvent(event),
209
- $top: RESTworldListViewComponent.createTopFromEvent(event),
210
- $skip: RESTworldListViewComponent.createSkipFromEvent(event)
211
- };
212
- return oDataParameters;
213
- }
214
- static createSkipFromEvent(event) {
215
- return event.first;
216
- }
217
- static createTopFromEvent(event) {
218
- return event.rows;
219
- }
220
- static createOrderByFromEvent(event) {
221
- if (event.sortField) {
222
- const order = !event.sortOrder || event.sortOrder > 0 ? 'asc' : 'desc';
223
- return `${event.sortField} ${order}`;
224
- }
225
- return undefined;
226
- }
227
- createFilterFromEvent(event) {
228
- if (!event.filters)
229
- return undefined;
230
- const filter = Object.entries(event.filters)
231
- // The type definition is wrong, event.filters has values of type FilterMetadata[] and not FilterMetadata.
232
- .map(([property, filter]) => ({ property: property, filters: filter }))
233
- .map(f => this.createFilterForPropertyArray(f.property, f.filters))
234
- .filter(f => !!f)
235
- .join(' and ');
236
- if (filter === '')
237
- return undefined;
238
- return `(${filter})`;
239
- }
240
- createFilterForPropertyArray(property, filters) {
241
- const filter = filters
242
- .map(f => this.createFilterForProperty(property, f))
243
- .filter(f => !!f)
244
- .join(` ${filters[0].operator} `);
245
- if (filter === '')
246
- return undefined;
247
- return `(${filter})`;
248
- }
249
- createFilterForProperty(property, filter) {
250
- if (!filter.value)
251
- return undefined;
252
- const oDataOperator = RESTworldListViewComponent.createODataOperator(filter.matchMode);
253
- const comparisonValue = this.createComparisonValue(property, filter.value);
254
- switch (oDataOperator) {
255
- case 'contains':
256
- case 'not contains':
257
- case 'startswith':
258
- case 'endswith':
259
- return `${oDataOperator}(${property}, ${comparisonValue})`;
260
- default:
261
- return `${property} ${oDataOperator} ${comparisonValue}`;
262
- }
263
- }
264
- static createODataOperator(matchMode) {
265
- switch (matchMode) {
266
- case FilterMatchMode.STARTS_WITH:
267
- return 'startswith';
268
- case FilterMatchMode.CONTAINS:
269
- return 'contains';
270
- case FilterMatchMode.NOT_CONTAINS:
271
- return 'not contains';
272
- case FilterMatchMode.ENDS_WITH:
273
- return 'endswith';
274
- case FilterMatchMode.EQUALS:
275
- return 'eq';
276
- case FilterMatchMode.NOT_EQUALS:
277
- return 'ne';
278
- case FilterMatchMode.IN:
279
- return 'in';
280
- case FilterMatchMode.LESS_THAN:
281
- return 'lt';
282
- case FilterMatchMode.LESS_THAN_OR_EQUAL_TO:
283
- return 'le';
284
- case FilterMatchMode.GREATER_THAN:
285
- return 'gt';
286
- case FilterMatchMode.GREATER_THAN_OR_EQUAL_TO:
287
- return 'ge';
288
- case FilterMatchMode.IS:
289
- return 'eq';
290
- case FilterMatchMode.IS_NOT:
291
- return 'ne';
292
- case FilterMatchMode.BEFORE:
293
- return 'lt';
294
- case FilterMatchMode.AFTER:
295
- return 'gt';
296
- case FilterMatchMode.DATE_AFTER:
297
- return 'ge';
298
- case FilterMatchMode.DATE_BEFORE:
299
- return 'lt';
300
- case FilterMatchMode.DATE_IS:
301
- return 'eq';
302
- case FilterMatchMode.DATE_IS_NOT:
303
- return 'ne';
304
- default:
305
- throw Error(`Unknown matchMode ${matchMode}`);
306
- }
307
- }
308
- createComparisonValue(property, value) {
309
- if (value === null || value === undefined)
310
- return 'null';
311
- const columns = this.columns.filter(c => c.field === property);
312
- if (columns.length !== 1)
313
- throw new Error(`Cannot find the column for the property ${property} which is specified in the filter.`);
314
- const type = columns[0].type;
315
- switch (type) {
316
- case ColumnType.boolean:
317
- return `${value}`;
318
- case ColumnType.date:
319
- return `cast(${value.toISOString()}, Edm.DateTimeOffset)`;
320
- case ColumnType.numeric:
321
- return `${value}`;
322
- case ColumnType.text:
323
- return `'${value}'`;
324
- default:
325
- throw new Error(`Unknown column type '${type}'`);
326
- }
327
- }
328
- }
329
- RESTworldListViewComponent._dateFormat = new Date(3333, 10, 22)
330
- .toLocaleDateString()
331
- .replace("22", "dd")
332
- .replace("11", "MM")
333
- .replace("3333", "y")
334
- .replace("33", "yy");
335
- RESTworldListViewComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.11", ngImport: i0, type: RESTworldListViewComponent, deps: [{ token: i1.RESTworldClientCollection }, { token: i2.ConfirmationService }, { token: i2.MessageService }, { token: i3.AvatarGenerator }], target: i0.ɵɵFactoryTarget.Component });
336
- RESTworldListViewComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.2.11", type: RESTworldListViewComponent, selector: "rw-list", inputs: { editLink: "editLink", apiName: "apiName", rel: "rel", rowsPerPage: "rowsPerPage" }, ngImport: i0, template: "<p-table [value]=\"value\"\r\n [lazy]=\"true\"\r\n [lazyLoadOnInit]=\"false\"\r\n (onLazyLoad)=\"load($event)\"\r\n responsiveLayout=\"scroll\"\r\n [paginator]=\"true\"\r\n [rows]=\"rows\"\r\n [rowsPerPageOptions]=\"rowsPerPage\"\r\n [totalRecords]=\"totalRecords\"\r\n [loading]=\"isLoading\"\r\n [showInitialSortBadge]=\"true\"\r\n [columns]=\"columns\">\r\n\r\n <ng-template pTemplate=\"header\" let-columns>\r\n <tr>\r\n <th *ngFor=\"let col of columns\" [pSortableColumn]=\"col.field\">\r\n <div class=\"p-d-flex p-jc-between p-ai-center\">\r\n {{col.header}}\r\n <p-sortIcon [field]=\"col.field\"></p-sortIcon>\r\n <p-columnFilter [type]=\"col.type\" [field]=\"col.field\" display=\"menu\"></p-columnFilter>\r\n </div>\r\n </th>\r\n <th>\r\n <div class=\"flex justify-content-end\">\r\n <div class=\"mx-2\" pTooltip=\"Create new\" tooltipPosition=\"left\">\r\n <a class=\"p-button-success\" icon=\"fas fa-plus\" pButton [routerLink]=\"['/edit', apiName, newHref]\"></a>\r\n </div>\r\n </div>\r\n </th>\r\n </tr>\r\n </ng-template>\r\n\r\n <ng-template pTemplate=\"body\" let-entity let-columns=\"columns\">\r\n <tr>\r\n <td [ngSwitch]=\"col.type\" *ngFor=\"let col of columns\">\r\n <ng-container *ngSwitchCase=\"'text'\">\r\n <p-avatar *ngIf=\"col.field === 'createdBy' || col.field === 'lastChangedBy'\" [pTooltip]=\"entity[col.field]\" tooltipPosition=\"top\" [image]=\"avatarGenerator.getImage(entity[col.field])\" [label]=\"avatarGenerator.getLabel(entity[col.field])\" [style]=\"avatarGenerator.getStyle(entity[col.field])\" shape=\"circle\"></p-avatar>\r\n <span *ngIf=\"col.field !== 'createdBy' && col.field !== 'lastChangedBy'\">{{entity[col.field]}}</span>\r\n </ng-container>\r\n <span *ngSwitchCase=\"'numeric'\" class=\"flex justify-content-end\">{{entity[col.field]}}</span>\r\n <span *ngSwitchCase=\"'boolean'\" class=\"flex justify-content-center\"><p-triStateCheckbox [(ngModel)]=\"entity[col.field]\" [readonly]=\"true\"></p-triStateCheckbox></span>\r\n <span *ngSwitchCase=\"'date'\" [pTooltip]=\"entity[col.field]\">{{entity[col.field] | date:dateFormat}}</span>\r\n </td>\r\n <td>\r\n <div class=\"flex justify-content-end\">\r\n <a pButton pTooltip=\"View/Edit\" tooltipPosition=\"left\" [routerLink]=\"[editLink, apiName, entity._links?.self[0].href]\" icon=\"fas fa-edit\"></a>\r\n <button pTooltip=\"Delete\" tooltipPosition=\"left\" pButton *ngIf=\"entity._links.delete\" (click)=\"showDeleteConfirmatioModal(entity)\" icon=\"fas fa-trash-alt\" type=\"button\" class=\"mx-2 p-button-danger\"></button>\r\n </div>\r\n </td>\r\n </tr>\r\n </ng-template>\r\n\r\n <ng-template pTemplate=\"emptymessage\">\r\n <tr>\r\n <td colspan=\"8\">No entries found.</td>\r\n </tr>\r\n </ng-template>\r\n\r\n</p-table>\r\n\r\n<p-toast></p-toast>\r\n<p-confirmDialog></p-confirmDialog>\r\n", styles: [".p-tooltip{max-width:-webkit-fit-content;max-width:-moz-fit-content;max-width:fit-content}a.p-button{text-decoration:none}\n"], components: [{ type: i4.Table, selector: "p-table", inputs: ["frozenColumns", "frozenValue", "style", "styleClass", "tableStyle", "tableStyleClass", "paginator", "pageLinks", "rowsPerPageOptions", "alwaysShowPaginator", "paginatorPosition", "paginatorDropdownAppendTo", "paginatorDropdownScrollHeight", "currentPageReportTemplate", "showCurrentPageReport", "showJumpToPageDropdown", "showJumpToPageInput", "showFirstLastIcon", "showPageLinks", "defaultSortOrder", "sortMode", "resetPageOnSort", "selectionMode", "contextMenuSelection", "contextMenuSelectionMode", "dataKey", "metaKeySelection", "rowTrackBy", "lazy", "lazyLoadOnInit", "compareSelectionBy", "csvSeparator", "exportFilename", "filters", "globalFilterFields", "filterDelay", "filterLocale", "expandedRowKeys", "editingRowKeys", "rowExpandMode", "scrollable", "scrollDirection", "rowGroupMode", "scrollHeight", "virtualScroll", "virtualScrollDelay", "virtualRowHeight", "frozenWidth", "responsive", "contextMenu", "resizableColumns", "columnResizeMode", "reorderableColumns", "loading", "loadingIcon", "showLoader", "rowHover", "customSort", "showInitialSortBadge", "autoLayout", "exportFunction", "stateKey", "stateStorage", "editMode", "groupRowsBy", "groupRowsByOrder", "minBufferPx", "maxBufferPx", "responsiveLayout", "breakpoint", "value", "columns", "first", "rows", "totalRecords", "sortField", "sortOrder", "multiSortMeta", "selection"], outputs: ["selectionChange", "contextMenuSelectionChange", "onRowSelect", "onRowUnselect", "onPage", "onSort", "onFilter", "onLazyLoad", "onRowExpand", "onRowCollapse", "onContextMenuSelect", "onColResize", "onColReorder", "onRowReorder", "onEditInit", "onEditComplete", "onEditCancel", "onHeaderCheckboxToggle", "sortFunction", "firstChange", "rowsChange", "onStateSave", "onStateRestore"] }, { type: i4.SortIcon, selector: "p-sortIcon", inputs: ["field"] }, { type: i4.ColumnFilter, selector: "p-columnFilter", inputs: ["field", "type", "display", "showMenu", "matchMode", "operator", "showOperator", "showClearButton", "showApplyButton", "showMatchModes", "showAddButton", "hideOnClear", "placeholder", "matchModeOptions", "maxConstraints", "minFractionDigits", "maxFractionDigits", "prefix", "suffix", "locale", "localeMatcher", "currency", "currencyDisplay", "useGrouping"] }, { type: i5.Avatar, selector: "p-avatar", inputs: ["label", "icon", "image", "size", "shape", "style", "styleClass"] }, { type: i6.TriStateCheckbox, selector: "p-triStateCheckbox", inputs: ["disabled", "name", "ariaLabelledBy", "tabindex", "inputId", "style", "styleClass", "label", "readonly", "checkboxTrueIcon", "checkboxFalseIcon"], outputs: ["onChange"] }, { type: i7.Toast, selector: "p-toast", inputs: ["key", "autoZIndex", "baseZIndex", "style", "styleClass", "position", "preventOpenDuplicates", "preventDuplicates", "showTransformOptions", "hideTransformOptions", "showTransitionOptions", "hideTransitionOptions", "breakpoints"], outputs: ["onClose"] }, { type: i8.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: i2.PrimeTemplate, selector: "[pTemplate]", inputs: ["type", "pTemplate"] }, { type: i9.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i4.SortableColumn, selector: "[pSortableColumn]", inputs: ["pSortableColumn", "pSortableColumnDisabled"] }, { type: i10.Tooltip, selector: "[pTooltip]", inputs: ["tooltipPosition", "tooltipEvent", "appendTo", "positionStyle", "tooltipStyleClass", "tooltipZIndex", "escape", "showDelay", "hideDelay", "life", "positionTop", "positionLeft", "pTooltip", "tooltipDisabled", "tooltipOptions"] }, { type: i11.RouterLinkWithHref, selector: "a[routerLink],area[routerLink]", inputs: ["routerLink", "target", "queryParams", "fragment", "queryParamsHandling", "preserveFragment", "skipLocationChange", "replaceUrl", "state", "relativeTo"] }, { type: i12.ButtonDirective, selector: "[pButton]", inputs: ["iconPos", "loadingIcon", "label", "icon", "loading"] }, { type: i9.NgSwitch, selector: "[ngSwitch]", inputs: ["ngSwitch"] }, { type: i9.NgSwitchCase, selector: "[ngSwitchCase]", inputs: ["ngSwitchCase"] }, { type: i9.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i13.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { type: i13.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }], pipes: { "date": i9.DatePipe } });
337
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.11", ngImport: i0, type: RESTworldListViewComponent, decorators: [{
338
- type: Component,
339
- args: [{
340
- selector: 'rw-list',
341
- templateUrl: './restworld-list-view.component.html',
342
- styleUrls: ['./restworld-list-view.component.css']
343
- }]
344
- }], ctorParameters: function () { return [{ type: i1.RESTworldClientCollection }, { type: i2.ConfirmationService }, { type: i2.MessageService }, { type: i3.AvatarGenerator }]; }, propDecorators: { editLink: [{
345
- type: Input
346
- }], apiName: [{
347
- type: Input
348
- }], rel: [{
349
- type: Input
350
- }], rowsPerPage: [{
351
- type: Input
352
- }] } });
353
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVzdHdvcmxkLWxpc3Qtdmlldy5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtcmVzdHdvcmxkLWNsaWVudC9zcmMvbGliL3ZpZXdzL3Jlc3R3b3JsZC1saXN0LXZpZXcvcmVzdHdvcmxkLWxpc3Qtdmlldy5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtcmVzdHdvcmxkLWNsaWVudC9zcmMvbGliL3ZpZXdzL3Jlc3R3b3JsZC1saXN0LXZpZXcvcmVzdHdvcmxkLWxpc3Qtdmlldy5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFFakQsT0FBTyxLQUFLLENBQUMsTUFBTSxRQUFRLENBQUM7QUFDNUIsT0FBTyxFQUF1QixlQUFlLEVBQWlELE1BQU0sYUFBYSxDQUFDO0FBR2xILE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQzs7Ozs7Ozs7Ozs7Ozs7O0FBRzlELE1BQU0sQ0FBTixJQUFZLFVBS1g7QUFMRCxXQUFZLFVBQVU7SUFDcEIsMkJBQWEsQ0FBQTtJQUNiLGlDQUFtQixDQUFBO0lBQ25CLGlDQUFtQixDQUFBO0lBQ25CLDJCQUFhLENBQUE7QUFDZixDQUFDLEVBTFcsVUFBVSxLQUFWLFVBQVUsUUFLckI7QUFhRCxNQUFNLE9BQU8sMEJBQTBCO0lBd0VyQyxZQUNVLFFBQW1DLEVBQ25DLG9CQUF5QyxFQUN6QyxlQUErQixFQUNoQyxlQUFnQztRQUgvQixhQUFRLEdBQVIsUUFBUSxDQUEyQjtRQUNuQyx5QkFBb0IsR0FBcEIsb0JBQW9CLENBQXFCO1FBQ3pDLG9CQUFlLEdBQWYsZUFBZSxDQUFnQjtRQUNoQyxvQkFBZSxHQUFmLGVBQWUsQ0FBaUI7UUF2RWpDLGFBQVEsR0FBYSxFQUFFLENBQUM7UUFTeEIs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LEVBQUUsSUFBSSxDQUFDLENBQUM7d0hBbEVaLDBCQUEwQjs0R0FBMUIsMEJBQTBCLDZJQzNCdkMsNGpHQThEQTs0RkRuQ2EsMEJBQTBCO2tCQUx0QyxTQUFTO21CQUFDO29CQUNULFFBQVEsRUFBRSxTQUFTO29CQUNuQixXQUFXLEVBQUUsc0NBQXNDO29CQUNuRCxTQUFTLEVBQUUsQ0FBQyxxQ0FBcUMsQ0FBQztpQkFDbkQ7Nk1BUVksUUFBUTtzQkFEbEIsS0FBSztnQkFVSyxPQUFPO3NCQURqQixLQUFLO2dCQVdLLEdBQUc7c0JBRGIsS0FBSztnQkFXQyxXQUFXO3NCQURqQixLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBJbnB1dCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBQYWdlZExpc3RSZXNvdXJjZSwgUmVzb3VyY2UgfSBmcm9tICdAd2VydHp1aS9uZ3gtaGFsLWNsaWVudCc7XHJcbmltcG9ydCAqIGFzIF8gZnJvbSAnbG9kYXNoJztcclxuaW1wb3J0IHsgQ29uZmlybWF0aW9uU2VydmljZSwgRmlsdGVyTWF0Y2hNb2RlLCBGaWx0ZXJNZXRhZGF0YSwgTGF6eUxvYWRFdmVudCwgTWVzc2FnZVNlcnZpY2UgfSBmcm9tICdwcmltZW5nL2FwaSc7XHJcbmltcG9ydCB7IFJFU1R3b3JsZENsaWVudCB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL3Jlc3R3b3JsZC1jbGllbnQnO1xyXG5pbXBvcnQgeyBSRVNUd29ybGRDbGllbnRDb2xsZWN0aW9uIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvcmVzdHdvcmxkLWNsaWVudC1jb2xsZWN0aW9uJztcclxuaW1wb3J0IHsgUHJvYmxlbURldGFpbHMgfSBmcm9tICcuLi8uLi9tb2RlbHMvcHJvYmxlbS1kZXRhaWxzJztcclxuaW1wb3J0IHsgQXZhdGFyR2VuZXJhdG9yIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvYXZhdGFyLWdlbmVyYXRvcic7XHJcblxyXG5leHBvcnQgZW51bSBDb2x1bW5UeXBlIHtcclxuICB0ZXh0ID0gJ3RleHQnLFxyXG4gIG51bWVyaWMgPSAnbnVtZXJpYycsXHJcbiAgYm9vbGVhbiA9ICdib29sZWFuJyxcclxuICBkYXRlID0gJ2RhdGUnXHJcbn1cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgQ29sdW1uIHtcclxuICBoZWFkZXI6IHN0cmluZztcclxuICBmaWVsZDogc3RyaW5nO1xyXG4gIHR5cGU6IENvbHVtblR5cGU7XHJcbn1cclxuXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiAncnctbGlzdCcsXHJcbiAgdGVtcGxhdGVVcmw6ICcuL3Jlc3R3b3JsZC1saXN0LXZpZXcuY29tcG9uZW50Lmh0bWwnLFxyXG4gIHN0eWxlVXJsczogWycuL3Jlc3R3b3JsZC1saXN0LXZpZXcuY29tcG9uZW50LmNzcyddXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBSRVNUd29ybGRMaXN0Vmlld0NvbXBvbmVudCB7XHJcblxyXG4gIHB1YmxpYyBnZXQgY29sdW1ucygpOiBDb2x1bW5bXSB7XHJcbiAgICByZXR1cm4gdGhpcy5fY29sdW1ucztcclxuICB9XHJcbiAgcHJpdmF0ZSBfY29sdW1uczogQ29sdW1uW10gPSBbXTtcclxuICBASW5wdXQoKVxyXG4gIHB1YmxpYyBzZXQgZWRpdExpbmsodmFsdWU6IHN0cmluZykge1xyXG4gICAgaWYgKHZhbHVlKVxyXG4gICAgICB0aGlzLl9lZGl0TGluayA9IHZhbHVlO1xyXG4gIH1cclxuICBwdWJsaWMgZ2V0IGVkaXRMaW5rKCkge1xyXG4gICAgcmV0dXJuIHRoaXMuX2VkaXRMaW5rO1xyXG4gIH1cclxuICBwcml2YXRlIF9lZGl0TGluayA9ICcvZWRpdCc7XHJcbiAgQElucHV0KClcclxuICBwdWJsaWMgc2V0IGFwaU5hbWUodmFsdWU6IHN0cmluZyB8IHVuZGVmaW5lZCkge1xyXG4gICAgdGhpcy5fYXBpTmFtZSA9IHZhbHVlO1xyXG4gICAgaWYgKHRoaXMuYXBpTmFtZSAmJiB0aGlzLnJlbCAmJiB0aGlzLl9sYXN0RXZlbnQpXHJcbiAgICAgIHRoaXMubG9hZCh0aGlzLl9sYXN0RXZlbnQpO1xyXG4gIH1cclxuICBwdWJsaWMgZ2V0IGFwaU5hbWUoKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcclxuICAgIHJldHVybiB0aGlzLl9hcGlOYW1lO1xyXG4gIH1cclxuICBwcml2YXRlIF9hcGlOYW1lPzogc3RyaW5nO1xyXG4gIEBJbnB1dCgpXHJcbiAgcHVibGljIHNldCByZWwodmFsdWU6IHN0cmluZyB8IHVuZGVmaW5lZCkge1xyXG4gICAgdGhpcy5fcmVsID0gdmFsdWU7XHJcbiAgICBpZiAodGhpcy5hcGlOYW1lICYmIHRoaXMucmVsICYmIHRoaXMuX2xhc3RFdmVudClcclxuICAgICAgdGhpcy5sb2FkKHRoaXMuX2xhc3RFdmVudCk7XHJcbiAgfVxyXG4gIHB1YmxpYyBnZXQgcmVsKCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XHJcbiAgICByZXR1cm4gdGhpcy5fcmVsO1xyXG4gIH1cclxuICBwcml2YXRlIF9yZWw/OiBzdHJpbmc7XHJcbiAgQElucHV0KClcclxuICBwdWJsaWMgcm93c1BlclBhZ2U6IG51bWJlcltdO1xyXG4gIHB1YmxpYyByZXNvdXJjZT86IFBhZ2VkTGlzdFJlc291cmNlO1xyXG4gIHB1YmxpYyBpc0xvYWRpbmcgPSBmYWxzZTtcclxuICBwcml2YXRlIF90b3RhbFJlY29yZHMgPSAwO1xyXG4gIHByaXZhdGUgX2xhc3RFdmVudDogTGF6eUxvYWRFdmVudDtcclxuICBwdWJsaWMgZ2V0IHZhbHVlKCk6IFJlc291cmNlW10ge1xyXG4gICAgcmV0dXJuIHRoaXMucmVzb3VyY2U/Ll9lbWJlZGRlZD8uaXRlbXMgfHwgW107XHJcbiAgfVxyXG4gIHB1YmxpYyBnZXQgcm93cygpOiBudW1iZXIge1xyXG4gICAgcmV0dXJuIHRoaXMuX2xhc3RFdmVudD8ucm93cyB8fCAwO1xyXG4gIH1cclxuICBwdWJsaWMgZ2V0IHRvdGFsUmVjb3JkcygpOiBudW1iZXIge1xyXG4gICAgcmV0dXJuIHRoaXMuX3RvdGFsUmVjb3JkcztcclxuICB9XHJcbiAgcHJpdmF0ZSBzZXQgdG90YWxSZWNvcmRzKHZhbHVlOiBudW1iZXIgfCB1bmRlZmluZWQpIHtcclxuICAgIHRoaXMuX3RvdGFsUmVjb3JkcyA9IHZhbHVlIHx8IDA7XHJcbiAgfVxyXG4gIHB1YmxpYyBnZXQgc29ydE9yZGVyKCkge1xyXG4gICAgcmV0dXJuIHRoaXMuX2xhc3RFdmVudC5zb3J0T3JkZXIgfHwgMDtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBnZXQgbmV3SHJlZigpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xyXG4gICAgcmV0dXJuIHRoaXMucmVzb3VyY2U/LmZpbmRMaW5rKCduZXcnKT8uaHJlZjtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgc3RhdGljIF9kYXRlRm9ybWF0ID0gbmV3IERhdGUoMzMzMywgMTAsIDIyKVxyXG4gICAgLnRvTG9jYWxlRGF0ZVN0cmluZygpXHJcbiAgICAucmVwbGFjZShcIjIyXCIsIFwiZGRcIilcclxuICAgIC5yZXBsYWNlKFwiMTFcIiwgXCJNTVwiKVxyXG4gICAgLnJlcGxhY2UoXCIzMzMzXCIsIFwieVwiKVxyXG4gICAgLnJlcGxhY2UoXCIzM1wiLCBcInl5XCIpO1xyXG5cclxuICBwdWJsaWMgZ2V0IGRhdGVGb3JtYXQoKTogc3RyaW5nIHtcclxuICAgIHJldHVybiBSRVNUd29ybGRMaXN0Vmlld0NvbXBvbmVudC5fZGF0ZUZvcm1hdDtcclxuICB9XHJcblxyXG4gIGNvbnN0cnVjdG9yKFxyXG4gICAgcHJpdmF0ZSBfY2xpZW50czogUkVTVHdvcmxkQ2xpZW50Q29sbGVjdGlvbixcclxuICAgIHByaXZhdGUgX2NvbmZpcm1hdGlvblNlcnZpY2U6IENvbmZpcm1hdGlvblNlcnZpY2UsXHJcbiAgICBwcml2YXRlIF9tZXNzYWdlU2VydmljZTogTWVzc2FnZVNlcnZpY2UsXHJcbiAgICBwdWJsaWMgYXZhdGFyR2VuZXJhdG9yOiBBdmF0YXJHZW5lcmF0b3IpIHtcclxuICAgIHRoaXMucm93c1BlclBhZ2UgPSBbMTAsIDI1LCA1MF07XHJcblxyXG4gICAgdGhpcy5fbGFzdEV2ZW50ID0ge1xyXG4gICAgICByb3dzOiB0aGlzLnJvd3NQZXJQYWdlWzBdXHJcbiAgICB9O1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBnZXRDbGllbnQoKTogUkVTVHdvcmxkQ2xpZW50IHtcclxuICAgIGlmICghdGhpcy5hcGlOYW1lKVxyXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0Nhbm5vdCBnZXQgYSBjbGllbnQsIGJlY2F1c2UgdGhlIGFwaU5hbWUgaXMgbm90IHNldC4nKTtcclxuXHJcbiAgICByZXR1cm4gdGhpcy5fY2xpZW50cy5nZXRDbGllbnQodGhpcy5hcGlOYW1lKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBhc3luYyBsb2FkKGV2ZW50OiBMYXp5TG9hZEV2ZW50KTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBpZiAoIXRoaXMuYXBpTmFtZSB8fCAhdGhpcy5yZWwpXHJcbiAgICAgIHJldHVybjtcclxuXHJcbiAgICB0aGlzLmlzTG9hZGluZyA9IHRydWU7XHJcbiAgICB0aGlzLl9sYXN0RXZlbnQgPSBldmVudDtcclxuXHJcbiAgICBjb25zdCBwYXJhbWV0ZXJzID0gdGhpcy5jcmVhdGVQYXJhbWV0ZXJzRnJvbUV2ZW50KGV2ZW50KTtcclxuICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgdGhpcy5nZXRDbGllbnQoKS5nZXRMaXN0KHRoaXMucmVsLCBwYXJhbWV0ZXJzKTtcclxuICAgIGlmICghcmVzcG9uc2Uub2sgfHwgUHJvYmxlbURldGFpbHMuaXNQcm9ibGVtRGV0YWlscyhyZXNwb25zZS5ib2R5KSB8fCAhcmVzcG9uc2UuYm9keSkge1xyXG4gICAgICB0aGlzLl9tZXNzYWdlU2VydmljZS5hZGQoeyBzZXZlcml0eTogJ2Vycm9yJywgc3VtbWFyeTogJ0Vycm9yJywgZGV0YWlsOiAnRXJyb3Igd2hpbGUgbG9hZGluZyB0aGUgcmVzb3VyY2VzIGZyb20gdGhlIEFQSS4nLCBkYXRhOiByZXNwb25zZSB9KTtcclxuICAgIH1cclxuICAgIGVsc2UgaWYgKHJlc3BvbnNlLmJvZHkpIHtcclxuICAgICAgdGhpcy5yZXNvdXJjZSA9IHJlc3BvbnNlLmJvZHk7XHJcbiAgICAgIHRoaXMudG90YWxSZWNvcmRzID0gdGhpcy5yZXNvdXJjZS50b3RhbFBhZ2VzICYmIHBhcmFtZXRlcnMuJHRvcCA/IHRoaXMucmVzb3VyY2UudG90YWxQYWdlcyAqIHBhcmFtZXRlcnMuJHRvcCA6IHVuZGVmaW5lZDtcclxuICAgICAgdGhpcy5fY29sdW1ucyA9IHRoaXMuY3JlYXRlQ29sdW1ucygpO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuaXNMb2FkaW5nID0gZmFsc2U7XHJcbiAgfVxyXG5cclxuXHJcbiAgcHVibGljIHNob3dEZWxldGVDb25maXJtYXRpb01vZGFsKHJlc291cmNlOiBSZXNvdXJjZSkge1xyXG4gICAgdGhpcy5fY29uZmlybWF0aW9uU2VydmljZS5jb25maXJtKHtcclxuICAgICAgbWVzc2FnZTogJ0RvIHlvdSByZWFsbHkgd2FudCB0byBkZWxldGUgdGhpcyByZXNvdXJjZT8nLFxyXG4gICAgICBoZWFkZXI6ICdDb25maXJtIGRlbGV0ZScsXHJcbiAgICAgIGljb246ICdmYXIgZmEtdHJhc2gtYWx0JyxcclxuICAgICAgYWNjZXB0OiAoKSA9PiB0aGlzLmRlbGV0ZShyZXNvdXJjZSlcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGFzeW5jIGRlbGV0ZShyZXNvdXJjZTogUmVzb3VyY2UpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGlmICghdGhpcy5hcGlOYW1lIHx8ICF0aGlzLnJlbClcclxuICAgICAgcmV0dXJuO1xyXG5cclxuICAgIGF3YWl0IHRoaXMuZ2V0Q2xpZW50KCkuZGVsZXRlKHJlc291cmNlKTtcclxuXHJcbiAgICB0aGlzLl9tZXNzYWdlU2VydmljZS5hZGQoeyBzZXZlcml0eTogJ3N1Y2Nlc3MnLCBzdW1tYXJ5OiAnRGVsZXRlZCcsIGRldGFpbDogJ1RoZSByZXNvdXJjZSBoYXMgYmVlbiBkZWxldGVkLicgfSk7XHJcblxyXG4gICAgdGhpcy5sb2FkKHRoaXMuX2xhc3RFdmVudCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGNyZWF0ZUNvbHVtbnMoKTogQ29sdW1uW10ge1xyXG4gICAgaWYgKHRoaXMudmFsdWUubGVuZ3RoID09PSAwKVxyXG4gICAgICByZXR1cm4gdGhpcy5jb2x1bW5zO1xyXG5cclxuICAgIC8vIEdldCBhbGwgZGlzdGluY3QgcHJvcGVydGllcyBmcm9tIGFsbCByb3dzXHJcbiAgICAvLyBXZSBsb29rIGF0IGFsbCByb3dzIHRvIGVsaW1pbmF0ZSBwb3NzaWJsZSB1bmRlZmluZWQgdmFsdWVzXHJcbiAgICBjb25zdCByb3dzV2l0aFByb3BlcnRpZXMgPSB0aGlzLnZhbHVlXHJcbiAgICAgIC5tYXAocmVzb3VyY2UgPT5cclxuICAgICAgICBPYmplY3QuZW50cmllcyhyZXNvdXJjZSlcclxuICAgICAgICAgIC5maWx0ZXIocCA9PlxyXG4gICAgICAgICAgICBwWzBdICE9PSAnX2xpbmtzJyAmJlxyXG4gICAgICAgICAgICBwWzBdICE9PSAnX2VtYmVkZGVkJyAmJlxyXG4gICAgICAgICAgICBwWzBdICE9PSAnaWQnICYmXHJcbiAgICAgICAgICAgIHBbMF0gIT09ICd0aW1lc3RhbXAnKSk7XHJcblxyXG4gICAgY29uc3QgZGlzdGluY3RQcm9wZXJ0aWVzID0gcm93c1dpdGhQcm9wZXJ0aWVzWzBdO1xyXG4gICAgZm9yIChjb25zdCBwcm9wZXJ0aWVzT2ZSb3cgb2Ygcm93c1dpdGhQcm9wZXJ0aWVzKSB7XHJcbiAgICAgIGZvciAoY29uc3QgcHJvcGVydHkgb2YgcHJvcGVydGllc09mUm93KSB7XHJcbiAgICAgICAgY29uc3QgcHJvcGVydHlOYW1lID0gcHJvcGVydHlbMF07XHJcbiAgICAgICAgY29uc3QgcHJvcGVydHlWYWx1ZSA9IHByb3BlcnR5WzFdO1xyXG4gICAgICAgIGNvbnN0IGFscmVhZHlGb3VuZFByb3BlcnR5V2l0aFNhbWVOYW1lID0gZGlzdGluY3RQcm9wZXJ0aWVzLmZpbmQocCA9PiBwWzBdID09PSBwcm9wZXJ0eU5hbWUpO1xyXG4gICAgICAgIGlmICghYWxyZWFkeUZvdW5kUHJvcGVydHlXaXRoU2FtZU5hbWUpIC8vIEFkZCBuZXcgcHJvcGVydHlcclxuICAgICAgICAgIGRpc3RpbmN0UHJvcGVydGllcy5wdXNoKHByb3BlcnR5KTtcclxuICAgICAgICBlbHNlIGlmICghYWxyZWFkeUZvdW5kUHJvcGVydHlXaXRoU2FtZU5hbWVbMV0gJiYgcHJvcGVydHlWYWx1ZSkgLy8gVXNlIGRlZmluZWQgdmFsdWUgaW5zdGVhZCBvZiBleGlzdGluZyB1bmRlZmluZWQgdmFsdWVcclxuICAgICAgICAgIGFscmVhZHlGb3VuZFByb3BlcnR5V2l0aFNhbWVOYW1lWzFdID0gcHJvcGVydHlWYWx1ZTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8vIENoZWNrIGlmIHRoZSByb3dzIGFyZSBlbnRpdGllcyB3aXRoIGNoYW5nZSB0cmFja2luZ1xyXG4gICAgY29uc3Qgd2l0aG91dENoYW5nZVRyYWNraW5nUHJvcGVydGllcyA9IGRpc3RpbmN0UHJvcGVydGllcy5maWx0ZXIocCA9PlxyXG4gICAgICBwWzBdICE9PSAnY3JlYXRlZEF0JyAmJlxyXG4gICAgICBwWzBdICE9PSAnY3JlYXRlZEJ5JyAmJlxyXG4gICAgICBwWzBdICE9PSAnbGFzdENoYW5nZWRBdCcgJiZcclxuICAgICAgcFswXSAhPT0gJ2xhc3RDaGFuZ2VkQnknKTtcclxuICAgIGNvbnN0IGhhc0NoYW5nZVRyYWNraW5nUHJvcGVydGllcyA9IHdpdGhvdXRDaGFuZ2VUcmFja2luZ1Byb3BlcnRpZXMubGVuZ3RoIDwgZGlzdGluY3RQcm9wZXJ0aWVzLmxlbmd0aDtcclxuXHJcbiAgICAvLyBGaXJzdCB0aGUgaWQsIHRoZW4gYWxsIG90aGVyIHByb3BlcnRpZXNcclxuICAgIGNvbnN0IHNvcnRlZFByb3BlcnRpZXM6IFtzdHJpbmcsIHVua25vd25dW10gPSBbXHJcbiAgICAgIFsnaWQnLCAwXSxcclxuICAgICAgLi4ud2l0aG91dENoYW5nZVRyYWNraW5nUHJvcGVydGllc1xyXG4gICAgXTtcclxuXHJcbiAgICAvLyBBbmQgY2hhbmdlIHRyYWNraW5nIHByb3BlcnRpZXMgYXQgdGhlIGVuZFxyXG4gICAgaWYgKGhhc0NoYW5nZVRyYWNraW5nUHJvcGVydGllcykge1xyXG4gICAgICBzb3J0ZWRQcm9wZXJ0aWVzLnB1c2goWydjcmVhdGVkQXQnLCBuZXcgRGF0ZSgpXSk7XHJcbiAgICAgIHNvcnRlZFByb3BlcnRpZXMucHVzaChbJ2NyZWF0ZWRCeScsICcnXSk7XHJcbiAgICAgIHNvcnRlZFByb3BlcnRpZXMucHVzaChbJ2xhc3RDaGFuZ2VkQXQnLCBuZXcgRGF0ZSgpXSk7XHJcbiAgICAgIHNvcnRlZFByb3BlcnRpZXMucHVzaChbJ2xhc3RDaGFuZ2VkQnknLCAnJ10pO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IGNvbHVtbnMgPSBzb3J0ZWRQcm9wZXJ0aWVzXHJcbiAgICAgIC5tYXAocCA9PiAoe1xyXG4gICAgICAgIGhlYWRlcjogUkVTVHdvcmxkTGlzdFZpZXdDb21wb25lbnQudG9UaXRsZUNhc2UocFswXSksXHJcbiAgICAgICAgZmllbGQ6IHBbMF0sXHJcbiAgICAgICAgdHlwZTogUkVTVHdvcmxkTGlzdFZpZXdDb21wb25lbnQuZ2V0Q29sdW1uVHlwZShwWzFdKSxcclxuICAgICAgfSkpO1xyXG5cclxuICAgIHJldHVybiBjb2x1bW5zO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBzdGF0aWMgZ2V0Q29sdW1uVHlwZSh2YWx1ZTogdW5rbm93bik6IENvbHVtblR5cGUge1xyXG4gICAgaWYgKHZhbHVlID09PSBudWxsIHx8IHZhbHVlID09PSB1bmRlZmluZWQpXHJcbiAgICAgIHJldHVybiBDb2x1bW5UeXBlLnRleHQ7XHJcblxyXG4gICAgaWYgKF8uaXNOdW1iZXIodmFsdWUpKVxyXG4gICAgICByZXR1cm4gQ29sdW1uVHlwZS5udW1lcmljO1xyXG5cclxuICAgIGlmIChfLmlzRGF0ZSh2YWx1ZSkpXHJcbiAgICAgIHJldHVybiBDb2x1bW5UeXBlLmRhdGU7XHJcblxyXG4gICAgaWYgKF8uaXNTdHJpbmcodmFsdWUpKVxyXG4gICAgICByZXR1cm4gQ29sdW1uVHlwZS50ZXh0O1xyXG5cclxuICAgIGlmIChfLmlzQm9vbGVhbih2YWx1ZSkpXHJcbiAgICAgIHJldHVybiBDb2x1bW5UeXBlLmJvb2xlYW47XHJcblxyXG4gICAgcmV0dXJuIENvbHVtblR5cGUudGV4dDtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgc3RhdGljIHRvVGl0bGVDYXNlKGFueUNhc2U6IHN0cmluZykge1xyXG4gICAgcmV0dXJuIGFueUNhc2VcclxuICAgICAgLnJlcGxhY2UoLyhfKSsvZywgJyAnKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHVuZGVyc2NvcmUgdG8gd2hpdGVzcGFjZVxyXG4gICAgICAucmVwbGFjZSgvKFthLXpdKShbQS1aXVthLXpdKS9nLCBcIiQxICQyXCIpICAgICAgICAgICAvLyBpbnNlcnQgc3BhY2UgYmVmb3JlIGVhY2ggbmV3IHdvcmQgaWYgdGhlcmUgaXMgbm9uZVxyXG4gICAgICAucmVwbGFjZSgvKFtBLVpdW2Etel0pKFtBLVpdKS9nLCBcIiQxICQyXCIpICAgICAgICAgICAvLyBpbnNlcnQgc3BhY2UgYWZ0ZXIgZWFjaCB3b3JkIGlmIHRoZXJlIGlzIG5vbmVcclxuICAgICAgLnJlcGxhY2UoLyhbYS16XSkoW0EtWl0rW2Etel0pL2csIFwiJDEgJDJcIikgICAgICAgICAgLy8gaW5zZXJ0IHNwYWNlIGFmdGVyIHNpbmdsZSBsZXR0ZXIgd29yZCBpZiB0aGVyZSBpcyBub25lXHJcbiAgICAgIC5yZXBsYWNlKC8oW0EtWl0rKShbQS1aXVthLXpdW2Etel0pL2csIFwiJDEgJDJcIikgICAgIC8vIGluc2VydCBzcGFjZSBiZWZvcmUgc2luZ2xlIGxldHRlciB3b3JkIGlmIHRoZXJlIGlzIG5vbmVcclxuICAgICAgLnJlcGxhY2UoLyhbYS16XSspKFtBLVowLTldKykvZywgXCIkMSAkMlwiKSAgICAgICAgICAgLy8gaW5zZXJ0IHNwYWNlIGFmdGVyIG51bWJlcnNcclxuICAgICAgLnJlcGxhY2UoL14uLywgKG1hdGNoKSA9PiBtYXRjaC50b1VwcGVyQ2FzZSgpKTsgICAgIC8vIGNoYW5nZSBmaXJzdCBsZXR0ZXIgdG8gYmUgdXBwZXIgY2FzZVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBjcmVhdGVQYXJhbWV0ZXJzRnJvbUV2ZW50KGV2ZW50OiBMYXp5TG9hZEV2ZW50KSB7XHJcbiAgICBjb25zdCBvRGF0YVBhcmFtZXRlcnMgPSB7XHJcbiAgICAgICRmaWx0ZXI6IHRoaXMuY3JlYXRlRmlsdGVyRnJvbUV2ZW50KGV2ZW50KSxcclxuICAgICAgJG9yZGVyYnk6IFJFU1R3b3JsZExpc3RWaWV3Q29tcG9uZW50LmNyZWF0ZU9yZGVyQnlGcm9tRXZlbnQoZXZlbnQpLFxyXG4gICAgICAkdG9wOiBSRVNUd29ybGRMaXN0Vmlld0NvbXBvbmVudC5jcmVhdGVUb3BGcm9tRXZlbnQoZXZlbnQpLFxyXG4gICAgICAkc2tpcDogUkVTVHdvcmxkTGlzdFZpZXdDb21wb25lbnQuY3JlYXRlU2tpcEZyb21FdmVudChldmVudClcclxuICAgIH07XHJcblxyXG4gICAgcmV0dXJuIG9EYXRhUGFyYW1ldGVycztcclxuICB9XHJcblxyXG4gIHN0YXRpYyBjcmVhdGVTa2lwRnJvbUV2ZW50KGV2ZW50OiBMYXp5TG9hZEV2ZW50KTogbnVtYmVyIHwgdW5kZWZpbmVkIHtcclxuICAgIHJldHVybiBldmVudC5maXJzdDtcclxuICB9XHJcblxyXG4gIHN0YXRpYyBjcmVhdGVUb3BGcm9tRXZlbnQoZXZlbnQ6IExhenlMb2FkRXZlbnQpOiBudW1iZXIgfCB1bmRlZmluZWQge1xyXG4gICAgcmV0dXJuIGV2ZW50LnJvd3M7XHJcbiAgfVxyXG5cclxuICBzdGF0aWMgY3JlYXRlT3JkZXJCeUZyb21FdmVudChldmVudDogTGF6eUxvYWRFdmVudCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XHJcbiAgICBpZiAoZXZlbnQuc29ydEZpZWxkKSB7XHJcbiAgICAgIGNvbnN0IG9yZGVyID0gIWV2ZW50LnNvcnRPcmRlciB8fCBldmVudC5zb3J0T3JkZXIgPiAwID8gJ2FzYycgOiAnZGVzYyc7XHJcbiAgICAgIHJldHVybiBgJHtldmVudC5zb3J0RmllbGR9ICR7b3JkZXJ9YDtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBjcmVhdGVGaWx0ZXJGcm9tRXZlbnQoZXZlbnQ6IExhenlMb2FkRXZlbnQpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xyXG4gICAgaWYgKCFldmVudC5maWx0ZXJzKVxyXG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xyXG5cclxuICAgIGNvbnN0IGZpbHRlciA9IE9iamVjdC5lbnRyaWVzKGV2ZW50LmZpbHRlcnMpXHJcbiAgICAgIC8vIFRoZSB0eXBlIGRlZmluaXRpb24gaXMgd3JvbmcsIGV2ZW50LmZpbHRlcnMgaGFzIHZhbHVlcyBvZiB0eXBlIEZpbHRlck1ldGFkYXRhW10gYW5kIG5vdCBGaWx0ZXJNZXRhZGF0YS5cclxuICAgICAgLm1hcCgoW3Byb3BlcnR5LCBmaWx0ZXJdKSA9PiAoeyBwcm9wZXJ0eTogcHJvcGVydHksIGZpbHRlcnM6IGZpbHRlciBhcyBGaWx0ZXJNZXRhZGF0YVtdIH0pKVxyXG4gICAgICAubWFwKGYgPT4gdGhpcy5jcmVhdGVGaWx0ZXJGb3JQcm9wZXJ0eUFycmF5KGYucHJvcGVydHksIGYuZmlsdGVycykpXHJcbiAgICAgIC5maWx0ZXIoZiA9PiAhIWYpXHJcbiAgICAgIC5qb2luKCcgYW5kICcpO1xyXG5cclxuICAgIGlmIChmaWx0ZXIgPT09ICcnKVxyXG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xyXG5cclxuICAgIHJldHVybiBgKCR7ZmlsdGVyfSlgO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBjcmVhdGVGaWx0ZXJGb3JQcm9wZXJ0eUFycmF5KHByb3BlcnR5OiBzdHJpbmcsIGZpbHRlcnM6IEZpbHRlck1ldGFkYXRhW10pOiBzdHJpbmcgfCB1bmRlZmluZWQge1xyXG4gICAgY29uc3QgZmlsdGVyID0gZmlsdGVyc1xyXG4gICAgICAubWFwKGYgPT4gdGhpcy5jcmVhdGVGaWx0ZXJGb3JQcm9wZXJ0eShwcm9wZXJ0eSwgZikpXHJcbiAgICAgIC5maWx0ZXIoZiA9PiAhIWYpXHJcbiAgICAgIC5qb2luKGAgJHtmaWx0ZXJzWzBdLm9wZXJhdG9yfSBgKTtcclxuXHJcbiAgICBpZiAoZmlsdGVyID09PSAnJylcclxuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcclxuXHJcbiAgICByZXR1cm4gYCgke2ZpbHRlcn0pYDtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgY3JlYXRlRmlsdGVyRm9yUHJvcGVydHkocHJvcGVydHk6IHN0cmluZywgZmlsdGVyOiBGaWx0ZXJNZXRhZGF0YSk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XHJcbiAgICBpZiAoIWZpbHRlci52YWx1ZSlcclxuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcclxuXHJcbiAgICBjb25zdCBvRGF0YU9wZXJhdG9yID0gUkVTVHdvcmxkTGlzdFZpZXdDb21wb25lbnQuY3JlYXRlT0RhdGFPcGVyYXRvcihcclxuICAgICAgZmlsdGVyLm1hdGNoTW9kZSxcclxuICAgICk7XHJcbiAgICBjb25zdCBjb21wYXJpc29uVmFsdWUgPSB0aGlzLmNyZWF0ZUNvbXBhcmlzb25WYWx1ZShwcm9wZXJ0eSwgZmlsdGVyLnZhbHVlKTtcclxuXHJcbiAgICBzd2l0Y2ggKG9EYXRhT3BlcmF0b3IpIHtcclxuICAgICAgY2FzZSAnY29udGFpbnMnOlxyXG4gICAgICBjYXNlICdub3QgY29udGFpbnMnOlxyXG4gICAgICBjYXNlICdzdGFydHN3aXRoJzpcclxuICAgICAgY2FzZSAnZW5kc3dpdGgnOlxyXG4gICAgICAgIHJldHVybiBgJHtvRGF0YU9wZXJhdG9yfSgke3Byb3BlcnR5fSwgJHtjb21wYXJpc29uVmFsdWV9KWA7XHJcbiAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgcmV0dXJuIGAke3Byb3BlcnR5fSAke29EYXRhT3BlcmF0b3J9ICR7Y29tcGFyaXNvblZhbHVlfWA7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHN0YXRpYyBjcmVhdGVPRGF0YU9wZXJhdG9yKG1hdGNoTW9kZT86IHN0cmluZyk6IHN0cmluZyB7XHJcbiAgICBzd2l0Y2ggKG1hdGNoTW9kZSkge1xyXG4gICAgICBjYXNlIEZpbHRlck1hdGNoTW9kZS5TVEFSVFNfV0lUSDpcclxuICAgICAgICByZXR1cm4gJ3N0YXJ0c3dpdGgnO1xyXG4gICAgICBjYXNlIEZpbHRlck1hdGNoTW9kZS5DT05UQUlOUzpcclxuICAgICAgICByZXR1cm4gJ2NvbnRhaW5zJztcclxuICAgICAgY2FzZSBGaWx0ZXJNYXRjaE1vZGUuTk9UX0NPTlRBSU5TOlxyXG4gICAgICAgIHJldHVybiAnbm90IGNvbnRhaW5zJztcclxuICAgICAgY2FzZSBGaWx0ZXJNYXRjaE1vZGUuRU5EU19XSVRIOlxyXG4gICAgICAgIHJldHVybiAnZW5kc3dpdGgnO1xyXG4gICAgICBjYXNlIEZpbHRlck1hdGNoTW9kZS5FUVVBTFM6XHJcbiAgICAgICAgcmV0dXJuICdlcSc7XHJcbiAgICAgIGNhc2UgRmlsdGVyTWF0Y2hNb2RlLk5PVF9FUVVBTFM6XHJcbiAgICAgICAgcmV0dXJuICduZSc7XHJcbiAgICAgIGNhc2UgRmlsdGVyTWF0Y2hNb2RlLklOOlxyXG4gICAgICAgIHJldHVybiAnaW4nO1xyXG4gICAgICBjYXNlIEZpbHRlck1hdGNoTW9kZS5MRVNTX1RIQU46XHJcbiAgICAgICAgcmV0dXJuICdsdCc7XHJcbiAgICAgIGNhc2UgRmlsdGVyTWF0Y2hNb2RlLkxFU1NfVEhBTl9PUl9FUVVBTF9UTzpcclxuICAgICAgICByZXR1cm4gJ2xlJztcclxuICAgICAgY2FzZSBGaWx0ZXJNYXRjaE1vZGUuR1JFQVRFUl9USEFOOlxyXG4gICAgICAgIHJldHVybiAnZ3QnO1xyXG4gICAgICBjYXNlIEZpbHRlck1hdGNoTW9kZS5HUkVBVEVSX1RIQU5fT1JfRVFVQUxfVE86XHJcbiAgICAgICAgcmV0dXJuICdnZSc7XHJcbiAgICAgIGNhc2UgRmlsdGVyTWF0Y2hNb2RlLklTOlxyXG4gICAgICAgIHJldHVybiAnZXEnO1xyXG4gICAgICBjYXNlIEZpbHRlck1hdGNoTW9kZS5JU19OT1Q6XHJcbiAgICAgICAgcmV0dXJuICduZSc7XHJcbiAgICAgIGNhc2UgRmlsdGVyTWF0Y2hNb2RlLkJFRk9SRTpcclxuICAgICAgICByZXR1cm4gJ2x0JztcclxuICAgICAgY2FzZSBGaWx0ZXJNYXRjaE1vZGUuQUZURVI6XHJcbiAgICAgICAgcmV0dXJuICdndCc7XHJcbiAgICAgIGNhc2UgRmlsdGVyTWF0Y2hNb2RlLkRBVEVfQUZURVI6XHJcbiAgICAgICAgcmV0dXJuICdnZSc7XHJcbiAgICAgIGNhc2UgRmlsdGVyTWF0Y2hNb2RlLkRBVEVfQkVGT1JFOlxyXG4gICAgICAgIHJldHVybiAnbHQnO1xyXG4gICAgICBjYXNlIEZpbHRlck1hdGNoTW9kZS5EQVRFX0lTOlxyXG4gICAgICAgIHJldHVybiAnZXEnO1xyXG4gICAgICBjYXNlIEZpbHRlck1hdGNoTW9kZS5EQVRFX0lTX05PVDpcclxuICAgICAgICByZXR1cm4gJ25lJztcclxuICAgICAgZGVmYXVsdDpcclxuICAgICAgICB0aHJvdyBFcnJvcihgVW5rbm93biBtYXRjaE1vZGUgJHttYXRjaE1vZGV9YCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGNyZWF0ZUNvbXBhcmlzb25WYWx1ZShwcm9wZXJ0eTogc3RyaW5nLCB2YWx1ZTogdW5rbm93bik6IHN0cmluZyB7XHJcbiAgICBpZiAodmFsdWUgPT09IG51bGwgfHwgdmFsdWUgPT09IHVuZGVmaW5lZClcclxuICAgICAgcmV0dXJuICdudWxsJztcclxuXHJcbiAgICBjb25zdCBjb2x1bW5zID0gdGhpcy5jb2x1bW5zLmZpbHRlcihjID0+IGMuZmllbGQgPT09IHByb3BlcnR5KTtcclxuICAgIGlmIChjb2x1bW5zLmxlbmd0aCAhPT0gMSlcclxuICAgICAgdGhyb3cgbmV3IEVycm9yKGBDYW5ub3QgZmluZCB0aGUgY29sdW1uIGZvciB0aGUgcHJvcGVydHkgJHtwcm9wZXJ0eX0gd2hpY2ggaXMgc3BlY2lmaWVkIGluIHRoZSBmaWx0ZXIuYCk7XHJcblxyXG4gICAgY29uc3QgdHlwZSA9IGNvbHVtbnNbMF0udHlwZTtcclxuXHJcbiAgICBzd2l0Y2ggKHR5cGUpIHtcclxuICAgICAgY2FzZSBDb2x1bW5UeXBlLmJvb2xlYW46XHJcbiAgICAgICAgcmV0dXJuIGAke3ZhbHVlfWA7XHJcbiAgICAgIGNhc2UgQ29sdW1uVHlwZS5kYXRlOlxyXG4gICAgICAgIHJldHVybiBgY2FzdCgkeyh2YWx1ZSBhcyBEYXRlKS50b0lTT1N0cmluZygpfSwgRWRtLkRhdGVUaW1lT2Zmc2V0KWA7XHJcbiAgICAgIGNhc2UgQ29sdW1uVHlwZS5udW1lcmljOlxyXG4gICAgICAgIHJldHVybiBgJHt2YWx1ZX1gO1xyXG4gICAgICBjYXNlIENvbHVtblR5cGUudGV4dDpcclxuICAgICAgICByZXR1cm4gYCcke3ZhbHVlfSdgO1xyXG4gICAgICBkZWZhdWx0OlxyXG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgVW5rbm93biBjb2x1bW4gdHlwZSAnJHt0eXBlfSdgKTtcclxuICAgIH1cclxuICB9XHJcbn1cclxuIiwiPHAtdGFibGUgW3ZhbHVlXT1cInZhbHVlXCJcclxuICAgICAgICAgW2xhenldPVwidHJ1ZVwiXHJcbiAgICAgICAgIFtsYXp5TG9hZE9uSW5pdF09XCJmYWxzZVwiXHJcbiAgICAgICAgIChvbkxhenlMb2FkKT1cImxvYWQoJGV2ZW50KVwiXHJcbiAgICAgICAgIHJlc3BvbnNpdmVMYXlvdXQ9XCJzY3JvbGxcIlxyXG4gICAgICAgICBbcGFnaW5hdG9yXT1cInRydWVcIlxyXG4gICAgICAgICBbcm93c109XCJyb3dzXCJcclxuICAgICAgICAgW3Jvd3NQZXJQYWdlT3B0aW9uc109XCJyb3dzUGVyUGFnZVwiXHJcbiAgICAgICAgIFt0b3RhbFJlY29yZHNdPVwidG90YWxSZWNvcmRzXCJcclxuICAgICAgICAgW2xvYWRpbmddPVwiaXNMb2FkaW5nXCJcclxuICAgICAgICAgW3Nob3dJbml0aWFsU29ydEJhZGdlXT1cInRydWVcIlxyXG4gICAgICAgICBbY29sdW1uc109XCJjb2x1bW5zXCI+XHJcblxyXG4gIDxuZy10ZW1wbGF0ZSBwVGVtcGxhdGU9XCJoZWFkZXJcIiBsZXQtY29sdW1ucz5cclxuICAgIDx0cj5cclxuICAgICAgPHRoICpuZ0Zvcj1cImxldCBjb2wgb2YgY29sdW1uc1wiIFtwU29ydGFibGVDb2x1bW5dPVwiY29sLmZpZWxkXCI+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cInAtZC1mbGV4IHAtamMtYmV0d2VlbiBwLWFpLWNlbnRlclwiPlxyXG4gICAgICAgICAge3tjb2wuaGVhZGVyfX1cclxuICAgICAgICAgIDxwLXNvcnRJY29uIFtmaWVsZF09XCJjb2wuZmllbGRcIj48L3Atc29ydEljb24+XHJcbiAgICAgICAgICA8cC1jb2x1bW5GaWx0ZXIgW3R5cGVdPVwiY29sLnR5cGVcIiBbZmllbGRdPVwiY29sLmZpZWxkXCIgZGlzcGxheT1cIm1lbnVcIj48L3AtY29sdW1uRmlsdGVyPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICA8L3RoPlxyXG4gICAgICA8dGg+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImZsZXgganVzdGlmeS1jb250ZW50LWVuZFwiPlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cIm14LTJcIiBwVG9vbHRpcD1cIkNyZWF0ZSBuZXdcIiB0b29sdGlwUG9zaXRpb249XCJsZWZ0XCI+XHJcbiAgICAgICAgICAgIDxhIGNsYXNzPVwicC1idXR0b24tc3VjY2Vzc1wiIGljb249XCJmYXMgZmEtcGx1c1wiIHBCdXR0b24gW3JvdXRlckxpbmtdPVwiWycvZWRpdCcsIGFwaU5hbWUsIG5ld0hyZWZdXCI+PC9hPlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgIDwvdGg+XHJcbiAgICA8L3RyPlxyXG4gIDwvbmctdGVtcGxhdGU+XHJcblxyXG4gIDxuZy10ZW1wbGF0ZSBwVGVtcGxhdGU9XCJib2R5XCIgbGV0LWVudGl0eSBsZXQtY29sdW1ucz1cImNvbHVtbnNcIj5cclxuICAgIDx0cj5cclxuICAgICAgPHRkIFtuZ1N3aXRjaF09XCJjb2wudHlwZVwiICpuZ0Zvcj1cImxldCBjb2wgb2YgY29sdW1uc1wiPlxyXG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nU3dpdGNoQ2FzZT1cIid0ZXh0J1wiPlxyXG4gICAgICAgICAgPHAtYXZhdGFyICpuZ0lmPVwiY29sLmZpZWxkID09PSAnY3JlYXRlZEJ5JyB8fCBjb2wuZmllbGQgPT09ICdsYXN0Q2hhbmdlZEJ5J1wiIFtwVG9vbHRpcF09XCJlbnRpdHlbY29sLmZpZWxkXVwiIHRvb2x0aXBQb3NpdGlvbj1cInRvcFwiIFtpbWFnZV09XCJhdmF0YXJHZW5lcmF0b3IuZ2V0SW1hZ2UoZW50aXR5W2NvbC5maWVsZF0pXCIgW2xhYmVsXT1cImF2YXRhckdlbmVyYXRvci5nZXRMYWJlbChlbnRpdHlbY29sLmZpZWxkXSlcIiBbc3R5bGVdPVwiYXZhdGFyR2VuZXJhdG9yLmdldFN0eWxlKGVudGl0eVtjb2wuZmllbGRdKVwiIHNoYXBlPVwiY2lyY2xlXCI+PC9wLWF2YXRhcj5cclxuICAgICAgICAgIDxzcGFuICpuZ0lmPVwiY29sLmZpZWxkICE9PSAnY3JlYXRlZEJ5JyAmJiBjb2wuZmllbGQgIT09ICdsYXN0Q2hhbmdlZEJ5J1wiPnt7ZW50aXR5W2NvbC5maWVsZF19fTwvc3Bhbj5cclxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICA8c3BhbiAqbmdTd2l0Y2hDYXNlPVwiJ251bWVyaWMnXCIgY2xhc3M9XCJmbGV4IGp1c3RpZnktY29udGVudC1lbmRcIj57e2VudGl0eVtjb2wuZmllbGRdfX08L3NwYW4+XHJcbiAgICAgICAgPHNwYW4gKm5nU3dpdGNoQ2FzZT1cIidib29sZWFuJ1wiIGNsYXNzPVwiZmxleCBqdXN0aWZ5LWNvbnRlbnQtY2VudGVyXCI+PHAtdHJpU3RhdGVDaGVja2JveCBbKG5nTW9kZWwpXT1cImVudGl0eVtjb2wuZmllbGRdXCIgW3JlYWRvbmx5XT1cInRydWVcIj48L3AtdHJpU3RhdGVDaGVja2JveD48L3NwYW4+XHJcbiAgICAgICAgPHNwYW4gKm5nU3dpdGNoQ2FzZT1cIidkYXRlJ1wiIFtwVG9vbHRpcF09XCJlbnRpdHlbY29sLmZpZWxkXVwiPnt7ZW50aXR5W2NvbC5maWVsZF0gfCBkYXRlOmRhdGVGb3JtYXR9fTwvc3Bhbj5cclxuICAgICAgPC90ZD5cclxuICAgICAgPHRkPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGp1c3RpZnktY29udGVudC1lbmRcIj5cclxuICAgICAgICAgIDxhIHBCdXR0b24gcFRvb2x0aXA9XCJWaWV3L0VkaXRcIiB0b29sdGlwUG9zaXRpb249XCJsZWZ0XCIgW3JvdXRlckxpbmtdPVwiW2VkaXRMaW5rLCBhcGlOYW1lLCBlbnRpdHkuX2xpbmtzPy5zZWxmWzBdLmhyZWZdXCIgaWNvbj1cImZhcyBmYS1lZGl0XCI+PC9hPlxyXG4gICAgICAgICAgPGJ1dHRvbiBwVG9vbHRpcD1cIkRlbGV0ZVwiIHRvb2x0aXBQb3NpdGlvbj1cImxlZnRcIiBwQnV0dG9uICpuZ0lmPVwiZW50aXR5Ll9saW5rcy5kZWxldGVcIiAoY2xpY2spPVwic2hvd0RlbGV0ZUNvbmZpcm1hdGlvTW9kYWwoZW50aXR5KVwiIGljb249XCJmYXMgZmEtdHJhc2gtYWx0XCIgdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwibXgtMiBwLWJ1dHRvbi1kYW5nZXJcIj48L2J1dHRvbj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgPC90ZD5cclxuICAgIDwvdHI+XHJcbiAgPC9uZy10ZW1wbGF0ZT5cclxuXHJcbiAgPG5nLXRlbXBsYXRlIHBUZW1wbGF0ZT1cImVtcHR5bWVzc2FnZVwiPlxyXG4gICAgPHRyPlxyXG4gICAgICA8dGQgY29sc3Bhbj1cIjhcIj5ObyBlbnRyaWVzIGZvdW5kLjwvdGQ+XHJcbiAgICA8L3RyPlxyXG4gIDwvbmctdGVtcGxhdGU+XHJcblxyXG48L3AtdGFibGU+XHJcblxyXG48cC10b2FzdD48L3AtdG9hc3Q+XHJcbjxwLWNvbmZpcm1EaWFsb2c+PC9wLWNvbmZpcm1EaWFsb2c+XHJcbiJdfQ==