@rlucan/ui 14.2.6 → 16.2.2

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 (79) hide show
  1. package/README.md +24 -24
  2. package/esm2022/lib/action-button/action-button.component.mjs +99 -99
  3. package/esm2022/lib/action-icon/action-icon.component.mjs +36 -36
  4. package/esm2022/lib/autocomplete/autocomplete.component.mjs +390 -390
  5. package/esm2022/lib/avatar/avatar.component.mjs +34 -34
  6. package/esm2022/lib/button/button.component.mjs +56 -56
  7. package/esm2022/lib/checkbox/checkbox.component.mjs +38 -38
  8. package/esm2022/lib/checkbox-group/checkbox-group.component.mjs +90 -90
  9. package/esm2022/lib/currency/currency.component.mjs +150 -150
  10. package/esm2022/lib/date/date.component.mjs +67 -67
  11. package/esm2022/lib/dialog/dialog.component.mjs +36 -36
  12. package/esm2022/lib/directives/force-visibility/force-visibility.directive.mjs +104 -104
  13. package/esm2022/lib/editor/editor.component.mjs +118 -118
  14. package/esm2022/lib/elements/burger/burger.component.mjs +20 -20
  15. package/esm2022/lib/elements/expander/expander.component.mjs +27 -27
  16. package/esm2022/lib/elements/validation-message/validation-message.component.mjs +46 -46
  17. package/esm2022/lib/file/file.component.mjs +144 -144
  18. package/esm2022/lib/file-uploader/ui-file-uploader.component.mjs +404 -404
  19. package/esm2022/lib/input/input.component.mjs +264 -264
  20. package/esm2022/lib/input-autocomplete/input-autocomplete.component.mjs +276 -276
  21. package/esm2022/lib/layouts/base/ui-base-layout.component.mjs +21 -21
  22. package/esm2022/lib/layouts/base/ui-base.component.mjs +73 -73
  23. package/esm2022/lib/layouts/simple/ui-simple-layout.component.mjs +17 -17
  24. package/esm2022/lib/layouts/simple/ui-simple.component.mjs +165 -165
  25. package/esm2022/lib/radio/radio.component.mjs +20 -20
  26. package/esm2022/lib/radio-group/radio-group.component.mjs +53 -53
  27. package/esm2022/lib/select/select.component.mjs +126 -115
  28. package/esm2022/lib/services/message-box.service.mjs +110 -110
  29. package/esm2022/lib/services/toast.service.mjs +23 -23
  30. package/esm2022/lib/services/ui-file.service.mjs +70 -70
  31. package/esm2022/lib/services/ui-translate.service.mjs +31 -31
  32. package/esm2022/lib/submit-button/submit-button.component.mjs +71 -71
  33. package/esm2022/lib/table/table.component.mjs +97 -97
  34. package/esm2022/lib/text-area/text-area.component.mjs +45 -45
  35. package/esm2022/lib/ui.model.mjs +1 -1
  36. package/esm2022/lib/ui.module.mjs +268 -268
  37. package/esm2022/public-api.mjs +34 -34
  38. package/esm2022/rlucan-ui.mjs +4 -4
  39. package/fesm2022/rlucan-ui.mjs +3285 -3274
  40. package/fesm2022/rlucan-ui.mjs.map +1 -1
  41. package/index.d.ts +5 -5
  42. package/lib/action-button/action-button.component.d.ts +28 -32
  43. package/lib/action-icon/action-icon.component.d.ts +15 -15
  44. package/lib/autocomplete/autocomplete.component.d.ts +57 -57
  45. package/lib/avatar/avatar.component.d.ts +14 -14
  46. package/lib/button/button.component.d.ts +18 -18
  47. package/lib/checkbox/checkbox.component.d.ts +15 -15
  48. package/lib/checkbox-group/checkbox-group.component.d.ts +18 -18
  49. package/lib/currency/currency.component.d.ts +31 -31
  50. package/lib/date/date.component.d.ts +24 -24
  51. package/lib/dialog/dialog.component.d.ts +13 -13
  52. package/lib/directives/force-visibility/force-visibility.directive.d.ts +22 -22
  53. package/lib/editor/editor.component.d.ts +24 -24
  54. package/lib/elements/burger/burger.component.d.ts +9 -9
  55. package/lib/elements/expander/expander.component.d.ts +10 -10
  56. package/lib/elements/validation-message/validation-message.component.d.ts +12 -12
  57. package/lib/file/file.component.d.ts +35 -35
  58. package/lib/file-uploader/ui-file-uploader.component.d.ts +102 -102
  59. package/lib/input/input.component.d.ts +42 -42
  60. package/lib/input-autocomplete/input-autocomplete.component.d.ts +44 -44
  61. package/lib/layouts/base/ui-base-layout.component.d.ts +8 -8
  62. package/lib/layouts/base/ui-base.component.d.ts +23 -23
  63. package/lib/layouts/simple/ui-simple-layout.component.d.ts +8 -8
  64. package/lib/layouts/simple/ui-simple.component.d.ts +40 -40
  65. package/lib/radio/radio.component.d.ts +8 -8
  66. package/lib/radio-group/radio-group.component.d.ts +18 -18
  67. package/lib/select/select.component.d.ts +37 -35
  68. package/lib/services/message-box.service.d.ts +58 -58
  69. package/lib/services/toast.service.d.ts +13 -13
  70. package/lib/services/ui-file.service.d.ts +33 -33
  71. package/lib/services/ui-translate.service.d.ts +11 -11
  72. package/lib/submit-button/submit-button.component.d.ts +21 -21
  73. package/lib/table/table.component.d.ts +36 -36
  74. package/lib/text-area/text-area.component.d.ts +18 -18
  75. package/lib/ui.model.d.ts +2 -2
  76. package/lib/ui.module.d.ts +59 -59
  77. package/package.json +1 -1
  78. package/public-api.d.ts +29 -29
  79. package/src/js/editorjs.mjs +9634 -9634
@@ -1,145 +1,145 @@
1
- import { Component, HostBinding, Inject, Input, Optional } from '@angular/core';
2
- import { UI_FILESERVICE } from '../services/ui-file.service';
3
- import * as i0 from "@angular/core";
4
- import * as i1 from "@angular/platform-browser";
5
- import * as i2 from "../services/ui-file.service";
6
- import * as i3 from "@angular/common";
7
- import * as i4 from "@angular/material/progress-spinner";
8
- export class FileComponent {
9
- get fitImageFileSize() {
10
- if (!this.fileServiceConfig.imageSizes[this.fileSize]) {
11
- console.error('Missing filesize for ' + this.fileSize);
12
- }
13
- return this.fileServiceConfig.imageSizes[this.fileSize][0] < 0 || this.fileServiceConfig.imageSizes[this.fileSize][1] < 0;
14
- }
15
- get width() {
16
- if (this.fitImageFileSize) {
17
- if (this.nativeFileSizeRatio === -1) {
18
- return '100%';
19
- }
20
- else {
21
- return this.nativeFileWidth + 'px';
22
- }
23
- }
24
- else {
25
- return this.fileServiceConfig.imageSizes[this.fileSize] ? this.fileServiceConfig.imageSizes[this.fileSize][0] + 'px' : undefined;
26
- }
27
- }
28
- get maxWidth() {
29
- if (this.fileServiceConfig.imageSizes[this.fileSize][0] < 0) {
30
- return this.width;
31
- }
32
- return this.fileServiceConfig.imageSizes[this.fileSize] ? this.fileServiceConfig.imageSizes[this.fileSize][0] + 'px' : undefined;
33
- }
34
- get height() {
35
- if (this.fitImageFileSize) {
36
- if (this.nativeFileSizeRatio === -1) {
37
- return '100%';
38
- }
39
- else {
40
- return this.nativeFileHeight + 'px';
41
- }
42
- }
43
- else {
44
- return this.fileServiceConfig.imageSizes[this.fileSize] ? this.fileServiceConfig.imageSizes[this.fileSize][1] + 'px' : undefined;
45
- }
46
- }
47
- get maxHeight() {
48
- if (this.fileServiceConfig.imageSizes[this.fileSize][1] < 0) {
49
- return this.height;
50
- }
51
- return this.fileServiceConfig.imageSizes[this.fileSize] ? this.fileServiceConfig.imageSizes[this.fileSize][1] + 'px' : undefined;
52
- }
53
- get isVideo() {
54
- return this.mime.startsWith('video/');
55
- }
56
- get mime() {
57
- if (this.srcUrlMimeType) {
58
- return this.srcUrlMimeType;
59
- }
60
- else {
61
- if (this.srcData.nativeFile) {
62
- return this.srcData.nativeFile.type;
63
- }
64
- return this.fileServiceConfig.getMimeType(this.srcData);
65
- }
66
- }
67
- get useRetinaSrc() {
68
- return this.fileServiceConfig.useRetinaSrc;
69
- }
70
- constructor(fileServiceConfig, domSanitizer, fileService) {
71
- this.fileServiceConfig = fileServiceConfig;
72
- this.domSanitizer = domSanitizer;
73
- this.fileService = fileService;
74
- this.fileSize = 'default';
75
- this.visible = false;
76
- this.nativeFileSizeRatio = -1;
77
- }
78
- ngOnInit() {
79
- }
80
- ngOnChanges(changes) {
81
- if (changes.srcData) {
82
- this.nativeFileSizeRatio = -1;
83
- if (changes.srcData.currentValue.nativeFile) {
84
- this.src = this.domSanitizer.bypassSecurityTrustUrl(URL.createObjectURL(changes.srcData.currentValue.nativeFile));
85
- const img = new Image();
86
- img.onload = () => {
87
- if (this.fitImageFileSize) {
88
- this.nativeFileSizeRatio = Math.max(img.width / this.fileServiceConfig.imageSizes[this.fileSize][0], img.height / this.fileServiceConfig.imageSizes[this.fileSize][1], 1);
89
- }
90
- else {
91
- this.nativeFileSizeRatio = 1;
92
- }
93
- this.nativeFileWidth = img.width / this.nativeFileSizeRatio;
94
- this.nativeFileHeight = img.height / this.nativeFileSizeRatio;
95
- URL.revokeObjectURL(img.src);
96
- };
97
- img.src = URL.createObjectURL(changes.srcData.currentValue.nativeFile);
98
- }
99
- else {
100
- this.src = this.fileServiceConfig.getMediaSrc(this.fileSize, changes.srcData.currentValue, this.srcOptions);
101
- }
102
- }
103
- if (changes.srcUrl) {
104
- this.src = changes.srcUrl.currentValue?.src;
105
- if (this.src) {
106
- this.srcUrlMimeType = changes.srcUrl.currentValue?.mimeType || 'image/png';
107
- }
108
- else {
109
- this.srcUrlMimeType = undefined;
110
- }
111
- }
112
- }
113
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.11", ngImport: i0, type: FileComponent, deps: [{ token: UI_FILESERVICE, optional: true }, { token: i1.DomSanitizer }, { token: i2.UiFileService }], target: i0.ɵɵFactoryTarget.Component }); }
114
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.11", type: FileComponent, selector: "ui-file", inputs: { fileSize: "fileSize", srcOptions: "srcOptions", srcData: "srcData", srcUrl: "srcUrl" }, host: { properties: { "style.width": "this.width", "style.maxWidth": "this.maxWidth", "style.height": "this.height", "style.maxHeight": "this.maxHeight" } }, usesOnChanges: true, ngImport: i0, template: "<mat-spinner *ngIf=\"visible\"></mat-spinner>\r\n<img *ngIf=\"!isVideo && useRetinaSrc\" [src]=\"src\" [srcset]=\"src + ' 2x'\"/>\r\n<img *ngIf=\"!isVideo && !useRetinaSrc\" [src]=\"src\"/>\r\n<video *ngIf=\"isVideo\" muted controls [src]=\"src\"></video>\r\n\r\n", styles: [":host{display:flex;align-items:center;justify-content:center;position:relative}:host img,:host video{max-width:100%;max-height:100%}\n"], dependencies: [{ kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i4.MatProgressSpinner, selector: "mat-progress-spinner, mat-spinner", inputs: ["color", "mode", "value", "diameter", "strokeWidth"], exportAs: ["matProgressSpinner"] }] }); }
115
- }
116
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.11", ngImport: i0, type: FileComponent, decorators: [{
117
- type: Component,
118
- args: [{ selector: 'ui-file', template: "<mat-spinner *ngIf=\"visible\"></mat-spinner>\r\n<img *ngIf=\"!isVideo && useRetinaSrc\" [src]=\"src\" [srcset]=\"src + ' 2x'\"/>\r\n<img *ngIf=\"!isVideo && !useRetinaSrc\" [src]=\"src\"/>\r\n<video *ngIf=\"isVideo\" muted controls [src]=\"src\"></video>\r\n\r\n", styles: [":host{display:flex;align-items:center;justify-content:center;position:relative}:host img,:host video{max-width:100%;max-height:100%}\n"] }]
119
- }], ctorParameters: function () { return [{ type: undefined, decorators: [{
120
- type: Optional
121
- }, {
122
- type: Inject,
123
- args: [UI_FILESERVICE]
124
- }] }, { type: i1.DomSanitizer }, { type: i2.UiFileService }]; }, propDecorators: { fileSize: [{
125
- type: Input
126
- }], srcOptions: [{
127
- type: Input
128
- }], srcData: [{
129
- type: Input
130
- }], srcUrl: [{
131
- type: Input
132
- }], width: [{
133
- type: HostBinding,
134
- args: ['style.width']
135
- }], maxWidth: [{
136
- type: HostBinding,
137
- args: ['style.maxWidth']
138
- }], height: [{
139
- type: HostBinding,
140
- args: ['style.height']
141
- }], maxHeight: [{
142
- type: HostBinding,
143
- args: ['style.maxHeight']
144
- }] } });
1
+ import { Component, HostBinding, Inject, Input, Optional } from '@angular/core';
2
+ import { UI_FILESERVICE } from '../services/ui-file.service';
3
+ import * as i0 from "@angular/core";
4
+ import * as i1 from "@angular/platform-browser";
5
+ import * as i2 from "../services/ui-file.service";
6
+ import * as i3 from "@angular/common";
7
+ import * as i4 from "@angular/material/progress-spinner";
8
+ export class FileComponent {
9
+ get fitImageFileSize() {
10
+ if (!this.fileServiceConfig.imageSizes[this.fileSize]) {
11
+ console.error('Missing filesize for ' + this.fileSize);
12
+ }
13
+ return this.fileServiceConfig.imageSizes[this.fileSize][0] < 0 || this.fileServiceConfig.imageSizes[this.fileSize][1] < 0;
14
+ }
15
+ get width() {
16
+ if (this.fitImageFileSize) {
17
+ if (this.nativeFileSizeRatio === -1) {
18
+ return '100%';
19
+ }
20
+ else {
21
+ return this.nativeFileWidth + 'px';
22
+ }
23
+ }
24
+ else {
25
+ return this.fileServiceConfig.imageSizes[this.fileSize] ? this.fileServiceConfig.imageSizes[this.fileSize][0] + 'px' : undefined;
26
+ }
27
+ }
28
+ get maxWidth() {
29
+ if (this.fileServiceConfig.imageSizes[this.fileSize][0] < 0) {
30
+ return this.width;
31
+ }
32
+ return this.fileServiceConfig.imageSizes[this.fileSize] ? this.fileServiceConfig.imageSizes[this.fileSize][0] + 'px' : undefined;
33
+ }
34
+ get height() {
35
+ if (this.fitImageFileSize) {
36
+ if (this.nativeFileSizeRatio === -1) {
37
+ return '100%';
38
+ }
39
+ else {
40
+ return this.nativeFileHeight + 'px';
41
+ }
42
+ }
43
+ else {
44
+ return this.fileServiceConfig.imageSizes[this.fileSize] ? this.fileServiceConfig.imageSizes[this.fileSize][1] + 'px' : undefined;
45
+ }
46
+ }
47
+ get maxHeight() {
48
+ if (this.fileServiceConfig.imageSizes[this.fileSize][1] < 0) {
49
+ return this.height;
50
+ }
51
+ return this.fileServiceConfig.imageSizes[this.fileSize] ? this.fileServiceConfig.imageSizes[this.fileSize][1] + 'px' : undefined;
52
+ }
53
+ get isVideo() {
54
+ return this.mime.startsWith('video/');
55
+ }
56
+ get mime() {
57
+ if (this.srcUrlMimeType) {
58
+ return this.srcUrlMimeType;
59
+ }
60
+ else {
61
+ if (this.srcData.nativeFile) {
62
+ return this.srcData.nativeFile.type;
63
+ }
64
+ return this.fileServiceConfig.getMimeType(this.srcData);
65
+ }
66
+ }
67
+ get useRetinaSrc() {
68
+ return this.fileServiceConfig.useRetinaSrc;
69
+ }
70
+ constructor(fileServiceConfig, domSanitizer, fileService) {
71
+ this.fileServiceConfig = fileServiceConfig;
72
+ this.domSanitizer = domSanitizer;
73
+ this.fileService = fileService;
74
+ this.fileSize = 'default';
75
+ this.visible = false;
76
+ this.nativeFileSizeRatio = -1;
77
+ }
78
+ ngOnInit() {
79
+ }
80
+ ngOnChanges(changes) {
81
+ if (changes.srcData) {
82
+ this.nativeFileSizeRatio = -1;
83
+ if (changes.srcData.currentValue.nativeFile) {
84
+ this.src = this.domSanitizer.bypassSecurityTrustUrl(URL.createObjectURL(changes.srcData.currentValue.nativeFile));
85
+ const img = new Image();
86
+ img.onload = () => {
87
+ if (this.fitImageFileSize) {
88
+ this.nativeFileSizeRatio = Math.max(img.width / this.fileServiceConfig.imageSizes[this.fileSize][0], img.height / this.fileServiceConfig.imageSizes[this.fileSize][1], 1);
89
+ }
90
+ else {
91
+ this.nativeFileSizeRatio = 1;
92
+ }
93
+ this.nativeFileWidth = img.width / this.nativeFileSizeRatio;
94
+ this.nativeFileHeight = img.height / this.nativeFileSizeRatio;
95
+ URL.revokeObjectURL(img.src);
96
+ };
97
+ img.src = URL.createObjectURL(changes.srcData.currentValue.nativeFile);
98
+ }
99
+ else {
100
+ this.src = this.fileServiceConfig.getMediaSrc(this.fileSize, changes.srcData.currentValue, this.srcOptions);
101
+ }
102
+ }
103
+ if (changes.srcUrl) {
104
+ this.src = changes.srcUrl.currentValue?.src;
105
+ if (this.src) {
106
+ this.srcUrlMimeType = changes.srcUrl.currentValue?.mimeType || 'image/png';
107
+ }
108
+ else {
109
+ this.srcUrlMimeType = undefined;
110
+ }
111
+ }
112
+ }
113
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.11", ngImport: i0, type: FileComponent, deps: [{ token: UI_FILESERVICE, optional: true }, { token: i1.DomSanitizer }, { token: i2.UiFileService }], target: i0.ɵɵFactoryTarget.Component }); }
114
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.11", type: FileComponent, selector: "ui-file", inputs: { fileSize: "fileSize", srcOptions: "srcOptions", srcData: "srcData", srcUrl: "srcUrl" }, host: { properties: { "style.width": "this.width", "style.maxWidth": "this.maxWidth", "style.height": "this.height", "style.maxHeight": "this.maxHeight" } }, usesOnChanges: true, ngImport: i0, template: "<mat-spinner *ngIf=\"visible\"></mat-spinner>\r\n<img *ngIf=\"!isVideo && useRetinaSrc\" [src]=\"src\" [srcset]=\"src + ' 2x'\"/>\r\n<img *ngIf=\"!isVideo && !useRetinaSrc\" [src]=\"src\"/>\r\n<video *ngIf=\"isVideo\" muted controls [src]=\"src\"></video>\r\n\r\n", styles: [":host{display:flex;align-items:center;justify-content:center;position:relative}:host img,:host video{max-width:100%;max-height:100%}\n"], dependencies: [{ kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i4.MatProgressSpinner, selector: "mat-progress-spinner, mat-spinner", inputs: ["color", "mode", "value", "diameter", "strokeWidth"], exportAs: ["matProgressSpinner"] }] }); }
115
+ }
116
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.11", ngImport: i0, type: FileComponent, decorators: [{
117
+ type: Component,
118
+ args: [{ selector: 'ui-file', template: "<mat-spinner *ngIf=\"visible\"></mat-spinner>\r\n<img *ngIf=\"!isVideo && useRetinaSrc\" [src]=\"src\" [srcset]=\"src + ' 2x'\"/>\r\n<img *ngIf=\"!isVideo && !useRetinaSrc\" [src]=\"src\"/>\r\n<video *ngIf=\"isVideo\" muted controls [src]=\"src\"></video>\r\n\r\n", styles: [":host{display:flex;align-items:center;justify-content:center;position:relative}:host img,:host video{max-width:100%;max-height:100%}\n"] }]
119
+ }], ctorParameters: function () { return [{ type: undefined, decorators: [{
120
+ type: Optional
121
+ }, {
122
+ type: Inject,
123
+ args: [UI_FILESERVICE]
124
+ }] }, { type: i1.DomSanitizer }, { type: i2.UiFileService }]; }, propDecorators: { fileSize: [{
125
+ type: Input
126
+ }], srcOptions: [{
127
+ type: Input
128
+ }], srcData: [{
129
+ type: Input
130
+ }], srcUrl: [{
131
+ type: Input
132
+ }], width: [{
133
+ type: HostBinding,
134
+ args: ['style.width']
135
+ }], maxWidth: [{
136
+ type: HostBinding,
137
+ args: ['style.maxWidth']
138
+ }], height: [{
139
+ type: HostBinding,
140
+ args: ['style.height']
141
+ }], maxHeight: [{
142
+ type: HostBinding,
143
+ args: ['style.maxHeight']
144
+ }] } });
145
145
  //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmlsZS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy91aS9zcmMvbGliL2ZpbGUvZmlsZS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy91aS9zcmMvbGliL2ZpbGUvZmlsZS5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLFdBQVcsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFxQixRQUFRLEVBQWlCLE1BQU0sZUFBZSxDQUFDO0FBQ2xILE9BQU8sRUFBa0IsY0FBYyxFQUFpQixNQUFNLDZCQUE2QixDQUFDOzs7Ozs7QUFRNUYsTUFBTSxPQUFPLGFBQWE7SUFNeEIsSUFBSSxnQkFBZ0I7UUFDbEIsSUFBSSxDQUFDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxFQUFFO1lBQ3JELE9BQU8sQ0FBQyxLQUFLLENBQUMsdUJBQXVCLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1NBQ3hEO1FBQ0QsT0FBTyxJQUFJLENBQUMsaUJBQWlCLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksSUFBSSxDQUFDLGlCQUFpQixDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFBO0lBQzNILENBQUM7SUFTRCxJQUNJLEtBQUs7UUFDUCxJQUFJLElBQUksQ0FBQyxnQkFBZ0IsRUFBRTtZQUN6QixJQUFJLElBQUksQ0FBQyxtQkFBbUIsS0FBSyxDQUFDLENBQUMsRUFBRTtnQkFDbkMsT0FBTyxNQUFNLENBQUM7YUFDZjtpQkFBTTtnQkFDTCxPQUFPLElBQUksQ0FBQyxlQUFlLEdBQUcsSUFBSSxDQUFBO2FBQ25DO1NBQ0Y7YUFBTTtZQUNM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QyxnQkFBZ0I7Z0JBU3pCLE1BQU07c0JBRFQsV0FBVzt1QkFBQyxjQUFjO2dCQWN2QixTQUFTO3NCQURaLFdBQVc7dUJBQUMsaUJBQWlCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBIb3N0QmluZGluZywgSW5qZWN0LCBJbnB1dCwgT25DaGFuZ2VzLCBPbkluaXQsIE9wdGlvbmFsLCBTaW1wbGVDaGFuZ2VzIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IElVaUZpbGVTZXJ2aWNlLCBVSV9GSUxFU0VSVklDRSwgVWlGaWxlU2VydmljZSB9IGZyb20gJy4uL3NlcnZpY2VzL3VpLWZpbGUuc2VydmljZSc7XHJcbmltcG9ydCB7IERvbVNhbml0aXplciB9IGZyb20gJ0Bhbmd1bGFyL3BsYXRmb3JtLWJyb3dzZXInO1xyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICd1aS1maWxlJyxcclxuICB0ZW1wbGF0ZVVybDogJy4vZmlsZS5jb21wb25lbnQuaHRtbCcsXHJcbiAgc3R5bGVVcmxzOiBbJy4vZmlsZS5jb21wb25lbnQuc2NzcyddXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBGaWxlQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkNoYW5nZXMge1xyXG5cclxuICBASW5wdXQoKSBmaWxlU2l6ZSA9ICdkZWZhdWx0JztcclxuICBASW5wdXQoKSBzcmNPcHRpb25zO1xyXG4gIEBJbnB1dCgpIHNyY0RhdGE6IGFueTtcclxuICBASW5wdXQoKSBzcmNVcmw6IHsgc3JjOiBzdHJpbmcsIG1pbWVUeXBlPzogc3RyaW5nIH07XHJcbiAgZ2V0IGZpdEltYWdlRmlsZVNpemUoKSB7XHJcbiAgICBpZiAoIXRoaXMuZmlsZVNlcnZpY2VDb25maWcuaW1hZ2VTaXplc1t0aGlzLmZpbGVTaXplXSkge1xyXG4gICAgICBjb25zb2xlLmVycm9yKCdNaXNzaW5nIGZpbGVzaXplIGZvciAnICsgdGhpcy5maWxlU2l6ZSk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdGhpcy5maWxlU2VydmljZUNvbmZpZy5pbWFnZVNpemVzW3RoaXMuZmlsZVNpemVdWzBdIDwgMCB8fCB0aGlzLmZpbGVTZXJ2aWNlQ29uZmlnLmltYWdlU2l6ZXNbdGhpcy5maWxlU2l6ZV1bMV0gPCAwXHJcbiAgfVxyXG5cclxuICB2aXNpYmxlID0gZmFsc2U7XHJcbiAgc3JjO1xyXG4gIHNyY1VybE1pbWVUeXBlO1xyXG4gIG5hdGl2ZUZpbGVTaXplUmF0aW8gPSAtMTtcclxuICBuYXRpdmVGaWxlV2lkdGg7XHJcbiAgbmF0aXZlRmlsZUhlaWdodDtcclxuXHJcbiAgQEhvc3RCaW5kaW5nKCdzdHlsZS53aWR0aCcpXHJcbiAgZ2V0IHdpZHRoKCk6IHN0cmluZyB7XHJcbiAgICBpZiAodGhpcy5maXRJbWFnZUZpbGVTaXplKSB7XHJcbiAgICAgIGlmICh0aGlzLm5hdGl2ZUZpbGVTaXplUmF0aW8gPT09IC0xKSB7XHJcbiAgICAgICAgcmV0dXJuICcxMDAlJztcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5uYXRpdmVGaWxlV2lkdGggKyAncHgnXHJcbiAgICAgIH1cclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHJldHVybiB0aGlzLmZpbGVTZXJ2aWNlQ29uZmlnLmltYWdlU2l6ZXNbdGhpcy5maWxlU2l6ZV0gPyB0aGlzLmZpbGVTZXJ2aWNlQ29uZmlnLmltYWdlU2l6ZXNbdGhpcy5maWxlU2l6ZV1bMF0gKyAncHgnIDogdW5kZWZpbmVkO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgQEhvc3RCaW5kaW5nKCdzdHlsZS5tYXhXaWR0aCcpXHJcbiAgZ2V0IG1heFdpZHRoKCk6IHN0cmluZyB7XHJcbiAgICBpZiAodGhpcy5maWxlU2VydmljZUNvbmZpZy5pbWFnZVNpemVzW3RoaXMuZmlsZVNpemVdWzBdIDwgMCkge1xyXG4gICAgICByZXR1cm4gdGhpcy53aWR0aDtcclxuICAgIH1cclxuICAgIHJldHVybiB0aGlzLmZpbGVTZXJ2aWNlQ29uZmlnLmltYWdlU2l6ZXNbdGhpcy5maWxlU2l6ZV0gPyB0aGlzLmZpbGVTZXJ2aWNlQ29uZmlnLmltYWdlU2l6ZXNbdGhpcy5maWxlU2l6ZV1bMF0gKyAncHgnIDogdW5kZWZpbmVkO1xyXG4gIH1cclxuXHJcbiAgQEhvc3RCaW5kaW5nKCdzdHlsZS5oZWlnaHQnKVxyXG4gIGdldCBoZWlnaHQoKTogc3RyaW5nIHtcclxuICAgIGlmICh0aGlzLmZpdEltYWdlRmlsZVNpemUpIHtcclxuICAgICAgaWYgKHRoaXMubmF0aXZlRmlsZVNpemVSYXRpbyA9PT0gLTEpIHtcclxuICAgICAgICByZXR1cm4gJzEwMCUnO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHJldHVybiB0aGlzLm5hdGl2ZUZpbGVIZWlnaHQgKyAncHgnO1xyXG4gICAgICB9XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICByZXR1cm4gdGhpcy5maWxlU2VydmljZUNvbmZpZy5pbWFnZVNpemVzW3RoaXMuZmlsZVNpemVdID8gdGhpcy5maWxlU2VydmljZUNvbmZpZy5pbWFnZVNpemVzW3RoaXMuZmlsZVNpemVdWzFdICsgJ3B4JyA6IHVuZGVmaW5lZDtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIEBIb3N0QmluZGluZygnc3R5bGUubWF4SGVpZ2h0JylcclxuICBnZXQgbWF4SGVpZ2h0KCk6IHN0cmluZyB7XHJcbiAgICBpZiAodGhpcy5maWxlU2VydmljZUNvbmZpZy5pbWFnZVNpemVzW3RoaXMuZmlsZVNpemVdWzFdIDwgMCkge1xyXG4gICAgICByZXR1cm4gdGhpcy5oZWlnaHQ7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdGhpcy5maWxlU2VydmljZUNvbmZpZy5pbWFnZVNpemVzW3RoaXMuZmlsZVNpemVdID8gdGhpcy5maWxlU2VydmljZUNvbmZpZy5pbWFnZVNpemVzW3RoaXMuZmlsZVNpemVdWzFdICsgJ3B4JyA6IHVuZGVmaW5lZDtcclxuICB9XHJcblxyXG4gIGdldCBpc1ZpZGVvKCkge1xyXG4gICAgcmV0dXJuIHRoaXMubWltZS5zdGFydHNXaXRoKCd2aWRlby8nKTtcclxuICB9XHJcblxyXG4gIGdldCBtaW1lKCkge1xyXG4gICAgaWYgKHRoaXMuc3JjVXJsTWltZVR5cGUpIHtcclxuICAgICAgcmV0dXJuIHRoaXMuc3JjVXJsTWltZVR5cGVcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGlmICh0aGlzLnNyY0RhdGEubmF0aXZlRmlsZSkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLnNyY0RhdGEubmF0aXZlRmlsZS50eXBlO1xyXG4gICAgICB9XHJcbiAgICAgIHJldHVybiB0aGlzLmZpbGVTZXJ2aWNlQ29uZmlnLmdldE1pbWVUeXBlKHRoaXMuc3JjRGF0YSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBnZXQgdXNlUmV0aW5hU3JjKCkge1xyXG4gICAgcmV0dXJuIHRoaXMuZmlsZVNlcnZpY2VDb25maWcudXNlUmV0aW5hU3JjXHJcbiAgfVxyXG5cclxuICBjb25zdHJ1Y3RvcihAT3B0aW9uYWwoKSBASW5qZWN0KFVJX0ZJTEVTRVJWSUNFKSBwcml2YXRlIGZpbGVTZXJ2aWNlQ29uZmlnOiBJVWlGaWxlU2VydmljZSxcclxuICAgICAgICAgICAgICBwcml2YXRlIGRvbVNhbml0aXplcjogRG9tU2FuaXRpemVyLFxyXG4gICAgICAgICAgICAgIHByaXZhdGUgZmlsZVNlcnZpY2U6IFVpRmlsZVNlcnZpY2UpIHsgfVxyXG5cclxuICBuZ09uSW5pdCgpOiB2b2lkIHtcclxuICB9XHJcblxyXG4gIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpOiB2b2lkIHtcclxuICAgIGlmIChjaGFuZ2VzLnNyY0RhdGEpIHtcclxuICAgICAgdGhpcy5uYXRpdmVGaWxlU2l6ZVJhdGlvID0gLTE7XHJcbiAgICAgIGlmIChjaGFuZ2VzLnNyY0RhdGEuY3VycmVudFZhbHVlLm5hdGl2ZUZpbGUpIHtcclxuICAgICAgICB0aGlzLnNyYyA9IHRoaXMuZG9tU2FuaXRpemVyLmJ5cGFzc1NlY3VyaXR5VHJ1c3RVcmwoVVJMLmNyZWF0ZU9iamVjdFVSTChjaGFuZ2VzLnNyY0RhdGEuY3VycmVudFZhbHVlLm5hdGl2ZUZpbGUpKTtcclxuXHJcbiAgICAgICAgY29uc3QgaW1nID0gbmV3IEltYWdlKCk7XHJcblxyXG4gICAgICAgIGltZy5vbmxvYWQgPSAoKSA9PiB7XHJcbiAgICAgICAgICBpZiAodGhpcy5maXRJbWFnZUZpbGVTaXplKSB7XHJcbiAgICAgICAgICAgIHRoaXMubmF0aXZlRmlsZVNpemVSYXRpbyA9IE1hdGgubWF4KGltZy53aWR0aCAvIHRoaXMuZmlsZVNlcnZpY2VDb25maWcuaW1hZ2VTaXplc1t0aGlzLmZpbGVTaXplXVswXSxcclxuICAgICAgICAgICAgICAgIGltZy5oZWlnaHQgLyB0aGlzLmZpbGVTZXJ2aWNlQ29uZmlnLmltYWdlU2l6ZXNbdGhpcy5maWxlU2l6ZV1bMV0sIDEpO1xyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5uYXRpdmVGaWxlU2l6ZVJhdGlvID0gMTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIHRoaXMubmF0aXZlRmlsZVdpZHRoID0gaW1nLndpZHRoIC8gdGhpcy5uYXRpdmVGaWxlU2l6ZVJhdGlvO1xyXG4gICAgICAgICAgdGhpcy5uYXRpdmVGaWxlSGVpZ2h0ID0gaW1nLmhlaWdodCAvIHRoaXMubmF0aXZlRmlsZVNpemVSYXRpbztcclxuICAgICAgICAgIFVSTC5yZXZva2VPYmplY3RVUkwoaW1nLnNyYyk7XHJcbiAgICAgICAgfTtcclxuXHJcbiAgICAgICAgaW1nLnNyYyA9IFVSTC5jcmVhdGVPYmplY3RVUkwoY2hhbmdlcy5zcmNEYXRhLmN1cnJlbnRWYWx1ZS5uYXRpdmVGaWxlKTtcclxuXHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgdGhpcy5zcmMgPSB0aGlzLmZpbGVTZXJ2aWNlQ29uZmlnLmdldE1lZGlhU3JjKHRoaXMuZmlsZVNpemUsIGNoYW5nZXMuc3JjRGF0YS5jdXJyZW50VmFsdWUsIHRoaXMuc3JjT3B0aW9ucyk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIGlmIChjaGFuZ2VzLnNyY1VybCkge1xyXG4gICAgICB0aGlzLnNyYyA9IGNoYW5nZXMuc3JjVXJsLmN1cnJlbnRWYWx1ZT8uc3JjO1xyXG4gICAgICBpZiAodGhpcy5zcmMpIHtcclxuICAgICAgICB0aGlzLnNyY1VybE1pbWVUeXBlID0gY2hhbmdlcy5zcmNVcmwuY3VycmVudFZhbHVlPy5taW1lVHlwZSB8fCAnaW1hZ2UvcG5nJztcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICB0aGlzLnNyY1VybE1pbWVUeXBlID0gdW5kZWZpbmVkO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG59XHJcbiIsIjxtYXQtc3Bpbm5lciAqbmdJZj1cInZpc2libGVcIj48L21hdC1zcGlubmVyPlxyXG48aW1nICpuZ0lmPVwiIWlzVmlkZW8gJiYgdXNlUmV0aW5hU3JjXCIgW3NyY109XCJzcmNcIiBbc3Jjc2V0XT1cInNyYyArICcgMngnXCIvPlxyXG48aW1nICpuZ0lmPVwiIWlzVmlkZW8gJiYgIXVzZVJldGluYVNyY1wiIFtzcmNdPVwic3JjXCIvPlxyXG48dmlkZW8gKm5nSWY9XCJpc1ZpZGVvXCIgbXV0ZWQgY29udHJvbHMgW3NyY109XCJzcmNcIj48L3ZpZGVvPlxyXG5cclxuIl19