@annalib/anna-core 22.3.5 → 22.3.7

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 (105) hide show
  1. package/{esm2022 → esm2020}/annalib-anna-core.mjs +4 -4
  2. package/{esm2022 → esm2020}/lib/anna-core-shared-lib/components/anna-buyer-approval-icon-template/anna-buyer-approval-icon-template.component.mjs +15 -15
  3. package/{esm2022 → esm2020}/lib/anna-core-shared-lib/components/anna-deleted-order-icon-template/anna-deleted-order-icon-template.component.mjs +14 -14
  4. package/{esm2022 → esm2020}/lib/anna-core-shared-lib/components/anna-est-icon-template/anna-est-icon-template.component.mjs +11 -11
  5. package/{esm2022 → esm2020}/lib/anna-core-shared-lib/components/anna-icon-column/anna-icon-column.component.mjs +36 -36
  6. package/{esm2022 → esm2020}/lib/anna-core-shared-lib/components/anna-live-icon-template/anna-live-icon-template.component.mjs +15 -15
  7. package/{esm2022 → esm2020}/lib/anna-core-shared-lib/components/anna-no-data/anna-no-data.component.mjs +22 -22
  8. package/{esm2022 → esm2020}/lib/anna-core-shared-lib/components/anna-notify-icon-template/anna-notify-icon-template.component.mjs +14 -14
  9. package/{esm2022 → esm2020}/lib/anna-core-shared-lib/components/anna-pay-for-performance-icon-template/anna-pay-for-performance-icon-template.component.mjs +23 -23
  10. package/{esm2022 → esm2020}/lib/anna-core-shared-lib/components/anna-rejected-icon-template/anna-rejected-icon-template.component.mjs +15 -15
  11. package/esm2020/lib/anna-core-shared-lib/constants/shared.constant.mjs +44 -0
  12. package/{esm2022 → esm2020}/lib/anna-core-shared-lib/directives/digits-only/digits-only.directive.mjs +284 -284
  13. package/{esm2022 → esm2020}/lib/anna-core-shared-lib/directives/fixed-rows-popup-table/fixed-rows-popup-table.directive.mjs +43 -43
  14. package/{esm2022 → esm2020}/lib/anna-core-shared-lib/directives/show-ellipsis-text/show-ellipsis-text.directive.mjs +38 -38
  15. package/{esm2022 → esm2020}/lib/anna-core-shared-lib/models/anna-generic-data-type.model.mjs +1 -1
  16. package/{esm2022 → esm2020}/lib/anna-core-shared-lib/models/anna-global-dropdown-config.model.mjs +1 -1
  17. package/{esm2022 → esm2020}/lib/anna-core-shared-lib/models/anna-non-editable-gt-models.mjs +10 -10
  18. package/{esm2022 → esm2020}/lib/anna-core-shared-lib/models/anna-sort.model.mjs +6 -6
  19. package/{esm2022 → esm2020}/lib/anna-core-shared-lib/models/anna-tooltip.model.mjs +29 -29
  20. package/{esm2022 → esm2020}/lib/anna-core-shared-lib/pipes/annaConvertArrayToCommaSeperatedValue.pipe.mjs +38 -38
  21. package/{esm2022 → esm2020}/lib/anna-core-shared-lib/pipes/annaConvertZeroOrNullOrUndefined.pipe.mjs +26 -26
  22. package/{esm2022 → esm2020}/lib/anna-core-shared-lib/pipes/annaDateFormatter.pipe.mjs +22 -22
  23. package/{esm2022 → esm2020}/lib/anna-core-shared-lib/pipes/annaFilterSearchedText.pipe.mjs +53 -53
  24. package/{esm2022 → esm2020}/lib/anna-core-shared-lib/pipes/annaReplaceChar.pipe.mjs +25 -25
  25. package/{esm2022 → esm2020}/lib/anna-core-shared-lib/pipes/annaTypeOfData.pipe.mjs +16 -16
  26. package/{esm2022 → esm2020}/lib/anna-core-shared-lib/services/anna-date-time-format.service.mjs +208 -208
  27. package/esm2020/lib/anna-core-shared-lib/services/anna-filter.service.mjs +1170 -0
  28. package/{esm2022 → esm2020}/lib/anna-core-shared-lib/services/anna-generic-table.service.mjs +151 -151
  29. package/{esm2022 → esm2020}/lib/anna-core-shared-lib/services/anna-global-config.service.mjs +132 -132
  30. package/{esm2022 → esm2020}/lib/anna-core-shared-lib/services/anna-number-format.service.mjs +53 -53
  31. package/{esm2022 → esm2020}/lib/anna-core-shared-lib/services/anna-persisting-filter.service.mjs +66 -66
  32. package/{esm2022 → esm2020}/lib/anna-core-shared-lib/services/anna-sort.service.mjs +176 -176
  33. package/esm2020/lib/anna-core.module.mjs +221 -0
  34. package/{esm2022 → esm2020}/lib/anna-dropdown-lib/components/anna-calendar-filter/anna-calendar-filter.component.mjs +151 -151
  35. package/esm2020/lib/anna-dropdown-lib/components/anna-week-calendar-filter/anna-week-calendar-filter.component.mjs +364 -0
  36. package/{esm2022 → esm2020}/lib/anna-generic-table-lib/components/anna-column-filters/anna-column-checkbox-filter/anna-column-checkbox-filter.component.mjs +237 -237
  37. package/{esm2022 → esm2020}/lib/anna-generic-table-lib/components/anna-column-filters/anna-column-date-range-filter/anna-column-date-range-filter.component.mjs +180 -180
  38. package/{esm2022 → esm2020}/lib/anna-generic-table-lib/components/anna-column-filters/anna-column-slider-filter/anna-column-slider-filter.component.mjs +306 -306
  39. package/{esm2022 → esm2020}/lib/anna-generic-table-lib/components/anna-column-filters/anna-column-time-filter/anna-column-time-filter.component.mjs +291 -291
  40. package/{esm2022 → esm2020}/lib/anna-generic-table-lib/components/anna-non-editable-generic-table/anna-non-editable-generic-table.component.mjs +806 -806
  41. package/{esm2022 → esm2020}/lib/anna-generic-table-lib/components/anna-sort/anna-sort.component.mjs +64 -64
  42. package/esm2020/lib/anna-generic-table-lib/components/anna-table-virtual-scroll-viewport/anna-table-virtual-scroll-viewport.component.mjs +357 -0
  43. package/{esm2022 → esm2020}/lib/anna-generic-table-lib/directives/anna-fixed-row-size-table-virtual-scroll-strategy/anna-fixed-row-size-table-virtual-scroll-strategy.directive.mjs +189 -189
  44. package/{esm2022 → esm2020}/lib/anna-generic-table-lib/directives/anna-fixed-row-size-table-virtual-scroll-strategy/index.mjs +1 -1
  45. package/esm2020/lib/anna-generic-table-lib/directives/anna-virtual-table/anna-virtual-table.directive.mjs +178 -0
  46. package/{esm2022 → esm2020}/lib/anna-generic-table-lib/directives/anna-virtual-table/index.mjs +1 -1
  47. package/{esm2022 → esm2020}/public-api.mjs +57 -57
  48. package/fesm2015/annalib-anna-core.mjs +5888 -0
  49. package/{fesm2022 → fesm2015}/annalib-anna-core.mjs.map +1 -1
  50. package/{fesm2022 → fesm2020}/annalib-anna-core.mjs +5752 -5752
  51. package/fesm2020/annalib-anna-core.mjs.map +1 -0
  52. package/index.d.ts +5 -5
  53. package/lib/anna-core-shared-lib/components/anna-buyer-approval-icon-template/anna-buyer-approval-icon-template.component.d.ts +8 -8
  54. package/lib/anna-core-shared-lib/components/anna-deleted-order-icon-template/anna-deleted-order-icon-template.component.d.ts +8 -8
  55. package/lib/anna-core-shared-lib/components/anna-est-icon-template/anna-est-icon-template.component.d.ts +5 -5
  56. package/lib/anna-core-shared-lib/components/anna-icon-column/anna-icon-column.component.d.ts +17 -17
  57. package/lib/anna-core-shared-lib/components/anna-live-icon-template/anna-live-icon-template.component.d.ts +8 -8
  58. package/lib/anna-core-shared-lib/components/anna-no-data/anna-no-data.component.d.ts +11 -11
  59. package/lib/anna-core-shared-lib/components/anna-notify-icon-template/anna-notify-icon-template.component.d.ts +8 -8
  60. package/lib/anna-core-shared-lib/components/anna-pay-for-performance-icon-template/anna-pay-for-performance-icon-template.component.d.ts +12 -12
  61. package/lib/anna-core-shared-lib/components/anna-rejected-icon-template/anna-rejected-icon-template.component.d.ts +8 -8
  62. package/lib/anna-core-shared-lib/constants/shared.constant.d.ts +42 -42
  63. package/lib/anna-core-shared-lib/directives/digits-only/digits-only.directive.d.ts +34 -34
  64. package/lib/anna-core-shared-lib/directives/fixed-rows-popup-table/fixed-rows-popup-table.directive.d.ts +16 -16
  65. package/lib/anna-core-shared-lib/directives/show-ellipsis-text/show-ellipsis-text.directive.d.ts +10 -10
  66. package/lib/anna-core-shared-lib/models/anna-generic-data-type.model.d.ts +16 -16
  67. package/lib/anna-core-shared-lib/models/anna-global-dropdown-config.model.d.ts +97 -97
  68. package/lib/anna-core-shared-lib/models/anna-non-editable-gt-models.d.ts +119 -119
  69. package/lib/anna-core-shared-lib/models/anna-sort.model.d.ts +11 -11
  70. package/lib/anna-core-shared-lib/models/anna-tooltip.model.d.ts +25 -25
  71. package/lib/anna-core-shared-lib/pipes/annaConvertArrayToCommaSeperatedValue.pipe.d.ts +9 -9
  72. package/lib/anna-core-shared-lib/pipes/annaConvertZeroOrNullOrUndefined.pipe.d.ts +9 -9
  73. package/lib/anna-core-shared-lib/pipes/annaDateFormatter.pipe.d.ts +8 -8
  74. package/lib/anna-core-shared-lib/pipes/annaFilterSearchedText.pipe.d.ts +9 -9
  75. package/lib/anna-core-shared-lib/pipes/annaReplaceChar.pipe.d.ts +9 -9
  76. package/lib/anna-core-shared-lib/pipes/annaTypeOfData.pipe.d.ts +7 -7
  77. package/lib/anna-core-shared-lib/services/anna-date-time-format.service.d.ts +28 -28
  78. package/lib/anna-core-shared-lib/services/anna-filter.service.d.ts +154 -154
  79. package/lib/anna-core-shared-lib/services/anna-generic-table.service.d.ts +27 -27
  80. package/lib/anna-core-shared-lib/services/anna-global-config.service.d.ts +21 -21
  81. package/lib/anna-core-shared-lib/services/anna-number-format.service.d.ts +8 -8
  82. package/lib/anna-core-shared-lib/services/anna-persisting-filter.service.d.ts +9 -9
  83. package/lib/anna-core-shared-lib/services/anna-sort.service.d.ts +18 -18
  84. package/lib/anna-core.module.d.ts +45 -45
  85. package/lib/anna-dropdown-lib/components/anna-calendar-filter/anna-calendar-filter.component.d.ts +45 -45
  86. package/lib/anna-dropdown-lib/components/anna-week-calendar-filter/anna-week-calendar-filter.component.d.ts +70 -70
  87. package/lib/anna-generic-table-lib/components/anna-column-filters/anna-column-checkbox-filter/anna-column-checkbox-filter.component.d.ts +60 -60
  88. package/lib/anna-generic-table-lib/components/anna-column-filters/anna-column-date-range-filter/anna-column-date-range-filter.component.d.ts +53 -53
  89. package/lib/anna-generic-table-lib/components/anna-column-filters/anna-column-slider-filter/anna-column-slider-filter.component.d.ts +65 -65
  90. package/lib/anna-generic-table-lib/components/anna-column-filters/anna-column-time-filter/anna-column-time-filter.component.d.ts +83 -83
  91. package/lib/anna-generic-table-lib/components/anna-non-editable-generic-table/anna-non-editable-generic-table.component.d.ts +175 -175
  92. package/lib/anna-generic-table-lib/components/anna-sort/anna-sort.component.d.ts +17 -17
  93. package/lib/anna-generic-table-lib/components/anna-table-virtual-scroll-viewport/anna-table-virtual-scroll-viewport.component.d.ts +141 -141
  94. package/lib/anna-generic-table-lib/directives/anna-fixed-row-size-table-virtual-scroll-strategy/anna-fixed-row-size-table-virtual-scroll-strategy.directive.d.ts +89 -89
  95. package/lib/anna-generic-table-lib/directives/anna-fixed-row-size-table-virtual-scroll-strategy/index.d.ts +1 -1
  96. package/lib/anna-generic-table-lib/directives/anna-virtual-table/anna-virtual-table.directive.d.ts +45 -45
  97. package/lib/anna-generic-table-lib/directives/anna-virtual-table/index.d.ts +1 -1
  98. package/package.json +11 -5
  99. package/public-api.d.ts +42 -42
  100. package/esm2022/lib/anna-core-shared-lib/constants/shared.constant.mjs +0 -44
  101. package/esm2022/lib/anna-core-shared-lib/services/anna-filter.service.mjs +0 -1170
  102. package/esm2022/lib/anna-core.module.mjs +0 -221
  103. package/esm2022/lib/anna-dropdown-lib/components/anna-week-calendar-filter/anna-week-calendar-filter.component.mjs +0 -364
  104. package/esm2022/lib/anna-generic-table-lib/components/anna-table-virtual-scroll-viewport/anna-table-virtual-scroll-viewport.component.mjs +0 -357
  105. package/esm2022/lib/anna-generic-table-lib/directives/anna-virtual-table/anna-virtual-table.directive.mjs +0 -178
@@ -1,284 +1,284 @@
1
- import { Directive, ElementRef, HostListener, Input, } from '@angular/core';
2
- import * as i0 from "@angular/core";
3
- export class DigitOnlyDirective {
4
- constructor(el) {
5
- this.el = el;
6
- this.hasDecimalPoint = false;
7
- this.hasNegativeSign = false;
8
- this.navigationKeys = [
9
- 'Backspace',
10
- 'Delete',
11
- 'Tab',
12
- 'Escape',
13
- 'Enter',
14
- 'Home',
15
- 'End',
16
- 'ArrowLeft',
17
- 'ArrowRight',
18
- 'Clear',
19
- 'Copy',
20
- 'Paste',
21
- ];
22
- this.decimal = false;
23
- this.decimalSeparator = '.';
24
- this.allowNegatives = false;
25
- this.allowPaste = true;
26
- this.negativeSign = '-';
27
- this.min = -Infinity;
28
- this.max = Infinity;
29
- this.regex = null;
30
- this.inputElement = el.nativeElement;
31
- }
32
- ngOnChanges(changes) {
33
- if (changes['pattern']) {
34
- this.regex = this.pattern ? RegExp(this.pattern) : null;
35
- }
36
- if (changes['min']) {
37
- const maybeMin = Number(this.min);
38
- this.min = isNaN(maybeMin) ? -Infinity : maybeMin;
39
- }
40
- if (changes['max']) {
41
- const maybeMax = Number(this.max);
42
- this.max = isNaN(maybeMax) ? Infinity : maybeMax;
43
- }
44
- }
45
- onBeforeInput(e) {
46
- if (isNaN(Number(e.data))) {
47
- if (e.data === this.decimalSeparator ||
48
- (e.data === this.negativeSign && this.allowNegatives)) {
49
- return; // go on
50
- }
51
- e.preventDefault();
52
- e.stopPropagation();
53
- }
54
- }
55
- onKeyDown(e) {
56
- if (this.navigationKeys.indexOf(e.key) > -1 || // Allow: navigation keys: backspace, delete, arrows etc.
57
- ((e.key === 'a' || e.code === 'KeyA') && e.ctrlKey === true) || // Allow: Ctrl+A
58
- ((e.key === 'c' || e.code === 'KeyC') && e.ctrlKey === true) || // Allow: Ctrl+C
59
- ((e.key === 'v' || e.code === 'KeyV') && e.ctrlKey === true) || // Allow: Ctrl+V
60
- ((e.key === 'x' || e.code === 'KeyX') && e.ctrlKey === true) || // Allow: Ctrl+X
61
- ((e.key === 'a' || e.code === 'KeyA') && e.metaKey === true) || // Allow: Cmd+A (Mac)
62
- ((e.key === 'c' || e.code === 'KeyC') && e.metaKey === true) || // Allow: Cmd+C (Mac)
63
- ((e.key === 'v' || e.code === 'KeyV') && e.metaKey === true) || // Allow: Cmd+V (Mac)
64
- ((e.key === 'x' || e.code === 'KeyX') && e.metaKey === true) // Allow: Cmd+X (Mac)
65
- ) {
66
- // let it happen, don't do anything
67
- return;
68
- }
69
- let newValue = '';
70
- if (this.decimal && e.key === this.decimalSeparator) {
71
- newValue = this.forecastValue(e.key);
72
- if (newValue.split(this.decimalSeparator).length > 2) {
73
- // has two or more decimal points
74
- e.preventDefault();
75
- return;
76
- }
77
- else {
78
- this.hasDecimalPoint = newValue.indexOf(this.decimalSeparator) > -1;
79
- return; // Allow: only one decimal point
80
- }
81
- }
82
- if (e.key === this.negativeSign && this.allowNegatives) {
83
- newValue = this.forecastValue(e.key);
84
- if (newValue.charAt(0) !== this.negativeSign ||
85
- newValue.split(this.negativeSign).length > 2) {
86
- e.preventDefault();
87
- return;
88
- }
89
- else {
90
- this.hasNegativeSign = newValue.split(this.negativeSign).length > -1;
91
- return;
92
- }
93
- }
94
- // Ensure that it is a number and stop the keypress
95
- if (e.key === ' ' || isNaN(Number(e.key))) {
96
- e.preventDefault();
97
- return;
98
- }
99
- newValue = newValue || this.forecastValue(e.key);
100
- // check the input pattern RegExp
101
- if (this.regex) {
102
- if (!this.regex.test(newValue)) {
103
- e.preventDefault();
104
- return;
105
- }
106
- }
107
- const newNumber = Number(newValue);
108
- if (newNumber > this.max || newNumber < this.min) {
109
- e.preventDefault();
110
- }
111
- }
112
- onPaste(event) {
113
- if (this.allowPaste === true) {
114
- let pastedInput = '';
115
- if (window['clipboardData']) {
116
- // Browser is IE
117
- pastedInput = window['clipboardData'].getData('text');
118
- }
119
- else if (event.clipboardData && event.clipboardData.getData) {
120
- // Other browsers
121
- pastedInput = event.clipboardData.getData('text/plain');
122
- }
123
- this.pasteData(pastedInput);
124
- event.preventDefault();
125
- }
126
- else {
127
- // this prevents the paste
128
- event.preventDefault();
129
- event.stopPropagation();
130
- }
131
- }
132
- onDrop(event) {
133
- const textData = event.dataTransfer?.getData('text') ?? '';
134
- this.inputElement.focus();
135
- this.pasteData(textData);
136
- event.preventDefault();
137
- }
138
- pasteData(pastedContent) {
139
- const sanitizedContent = this.sanitizeInput(pastedContent);
140
- if (sanitizedContent.includes(this.negativeSign) &&
141
- this.hasNegativeSign &&
142
- !this.getSelection().includes(this.negativeSign)) {
143
- return;
144
- }
145
- const pasted = document.execCommand('insertText', false, sanitizedContent);
146
- if (!pasted) {
147
- if (this.inputElement.setRangeText) {
148
- const { selectionStart: start, selectionEnd: end } = this.inputElement;
149
- this.inputElement.setRangeText(sanitizedContent, start ?? 0, end ?? 0, 'end');
150
- // Angular's Reactive Form relies on "input" event, but on Firefox, the setRangeText method doesn't trigger it
151
- // so we have to trigger it ourself.
152
- if (typeof window['InstallTrigger'] !==
153
- 'undefined') {
154
- this.inputElement.dispatchEvent(new Event('input', { cancelable: true }));
155
- }
156
- }
157
- else {
158
- // Browser does not support setRangeText, e.g. IE
159
- this.insertAtCursor(this.inputElement, sanitizedContent);
160
- }
161
- }
162
- if (this.decimal) {
163
- this.hasDecimalPoint =
164
- this.inputElement.value.indexOf(this.decimalSeparator) > -1;
165
- }
166
- this.hasNegativeSign =
167
- this.inputElement.value.indexOf(this.negativeSign) > -1;
168
- }
169
- // The following 2 methods were added from the below article for browsers that do not support setRangeText
170
- // https://stackoverflow.com/questions/11076975/how-to-insert-text-into-the-textarea-at-the-current-cursor-position
171
- insertAtCursor(myField, myValue) {
172
- const startPos = myField.selectionStart ?? 0;
173
- const endPos = myField.selectionEnd ?? 0;
174
- myField.value =
175
- myField.value.substring(0, startPos) +
176
- myValue +
177
- myField.value.substring(endPos, myField.value.length);
178
- const pos = startPos + myValue.length;
179
- myField.focus();
180
- myField.setSelectionRange(pos, pos);
181
- this.triggerEvent(myField, 'input');
182
- }
183
- triggerEvent(el, type) {
184
- if ('createEvent' in document) {
185
- // modern browsers, IE9+
186
- const e = document.createEvent('HTMLEvents');
187
- e.initEvent(type, false, true);
188
- el.dispatchEvent(e);
189
- }
190
- }
191
- // end stack overflow code
192
- sanitizeInput(input) {
193
- let result = '';
194
- let regex;
195
- if (this.decimal && this.isValidDecimal(input)) {
196
- regex = new RegExp(`${this.getNegativeSignRegExp()}[^0-9${this.decimalSeparator}]`, 'g');
197
- }
198
- else {
199
- regex = new RegExp(`${this.getNegativeSignRegExp()}[^0-9]`, 'g');
200
- }
201
- result = input.replace(regex, '');
202
- const maxLength = this.inputElement.maxLength;
203
- if (maxLength > 0) {
204
- // the input element has maxLength limit
205
- const allowedLength = maxLength -
206
- this.inputElement.value.length +
207
- (result.includes(`${this.negativeSign}`) ? 1 : 0);
208
- result = allowedLength > 0 ? result.substring(0, allowedLength) : '';
209
- }
210
- return result;
211
- }
212
- getNegativeSignRegExp() {
213
- return this.allowNegatives &&
214
- (!this.hasNegativeSign || this.getSelection().includes(this.negativeSign))
215
- ? `(?!^${this.negativeSign})`
216
- : '';
217
- }
218
- isValidDecimal(string) {
219
- if (!this.hasDecimalPoint) {
220
- return string.split(this.decimalSeparator).length <= 2;
221
- }
222
- else {
223
- // the input element already has a decimal separator
224
- const selectedText = this.getSelection();
225
- if (selectedText && selectedText.indexOf(this.decimalSeparator) > -1) {
226
- return string.split(this.decimalSeparator).length <= 2;
227
- }
228
- else {
229
- return string.indexOf(this.decimalSeparator) < 0;
230
- }
231
- }
232
- }
233
- getSelection() {
234
- return this.inputElement.value.substring(this.inputElement.selectionStart ?? 0, this.inputElement.selectionEnd ?? 0);
235
- }
236
- forecastValue(key) {
237
- const selectionStart = this.inputElement.selectionStart;
238
- const selectionEnd = this.inputElement.selectionEnd;
239
- const oldValue = this.inputElement.value;
240
- if (selectionStart == null && selectionEnd == null) {
241
- return (oldValue + key);
242
- }
243
- return (oldValue.substring(0, selectionStart) +
244
- key +
245
- oldValue.substring(selectionEnd));
246
- }
247
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: DigitOnlyDirective, deps: [{ token: i0.ElementRef }], target: i0.ɵɵFactoryTarget.Directive }); }
248
- static { thisdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "16.2.12", type: DigitOnlyDirective, selector: "[digitOnly]", inputs: { decimal: "decimal", decimalSeparator: "decimalSeparator", allowNegatives: "allowNegatives", allowPaste: "allowPaste", negativeSign: "negativeSign", min: "min", max: "max", pattern: "pattern" }, host: { listeners: { "beforeinput": "onBeforeInput($event)", "keydown": "onKeyDown($event)", "paste": "onPaste($event)", "drop": "onDrop($event)" } }, usesOnChanges: true, ngImport: i0 }); }
249
- }
250
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: DigitOnlyDirective, decorators: [{
251
- type: Directive,
252
- args: [{
253
- selector: '[digitOnly]',
254
- }]
255
- }], ctorParameters: function () { return [{ type: i0.ElementRef }]; }, propDecorators: { decimal: [{
256
- type: Input
257
- }], decimalSeparator: [{
258
- type: Input
259
- }], allowNegatives: [{
260
- type: Input
261
- }], allowPaste: [{
262
- type: Input
263
- }], negativeSign: [{
264
- type: Input
265
- }], min: [{
266
- type: Input
267
- }], max: [{
268
- type: Input
269
- }], pattern: [{
270
- type: Input
271
- }], onBeforeInput: [{
272
- type: HostListener,
273
- args: ['beforeinput', ['$event']]
274
- }], onKeyDown: [{
275
- type: HostListener,
276
- args: ['keydown', ['$event']]
277
- }], onPaste: [{
278
- type: HostListener,
279
- args: ['paste', ['$event']]
280
- }], onDrop: [{
281
- type: HostListener,
282
- args: ['drop', ['$event']]
283
- }] } });
284
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGlnaXRzLW9ubHkuZGlyZWN0aXZlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvYW5uYS1jb3JlL3NyYy9saWIvYW5uYS1jb3JlLXNoYXJlZC1saWIvZGlyZWN0aXZlcy9kaWdpdHMtb25seS9kaWdpdHMtb25seS5kaXJlY3RpdmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNILFNBQVMsRUFDVCxVQUFVLEVBQ1YsWUFBWSxFQUNaLEtBQUssR0FHTixNQUFNLGVBQWUsQ0FBQzs7QUFLdkIsTUFBTSxPQUFPLGtCQUFrQjtJQTZCN0IsWUFBbUIsRUFBYztRQUFkLE9BQUUsR0FBRixFQUFFLENBQVk7UUE1QnpCLG9CQUFlLEdBQUcsS0FBSyxDQUFDO1FBQ3hCLG9CQUFlLEdBQUcsS0FBSyxDQUFDO1FBQ3hCLG1CQUFjLEdBQUc7WUFDdkIsV0FBVztZQUNYLFFBQVE7WUFDUixLQUFLO1lBQ0wsUUFBUTtZQUNSLE9BQU87WUFDUCxNQUFNO1lBQ04sS0FBSztZQUNMLFdBQVc7WUFDWCxZQUFZO1lBQ1osT0FBTztZQUNQLE1BQU07WUFDTixPQUFPO1NBQ1IsQ0FBQztRQUVPLFlBQU8sR0FBRyxLQUFLLENBQUM7UUFDaEIscUJBQWdCLEdBQUcsR0FBRyxDQUFDO1FBQ3ZCLG1CQUFjLEdBQUcsS0FBSyxDQUFDO1FBQ3ZCLGVBQVUsR0FBRyxJQUFJLENBQUM7UUFDbEIsaUJBQVksR0FBRyxHQUFHLENBQUM7UUFDbkIsUUFBRyxHQUFHLENBQUMsUUFBUSxDQUFDO1FBQ2hCLFFBQUcsR0FBRyxRQUFRLENBQUM7UUFFaEIsVUFBSyxHQUFrQixJQUFJLENBQUM7UUFJbEMsSUFBSSxDQUFDLFlBQVksR0FBRyxFQUFFLENBQUMsYUFBYSxDQUFDO0lBQ3ZDLENBQUM7SUFFRCxXQUFXLENBQUMsT0FBc0I7UUFDaEMsSUFBSSxPQUFPLENBQUMsU0FBUyxDQUFDLEVBQUU7WUFDdEIsSUFBSSxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7U0FDekQ7UUFFRCxJQUFJLE9BQU8sQ0FBQyxLQUFLLENBQUMsRUFBRTtZQUNsQixNQUFNLFFBQVEsR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQ2xDLElBQUksQ0FBQyxHQUFHLEdBQUcsS0FBSyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDO1NBQ25EO1FBRUQsSUFBSSxPQUFPLENBQUMsS0FBSyxDQUFDLEVBQUU7WUFDbEIsTUFBTSxRQUFRLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUNsQyxJQUFJLENBQUMsR0FBRyxHQUFHLEtBQUssQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUM7U0FDbEQ7SUFDSCxDQUFDO0lBR0QsYUFBYSxDQUFDLENBQWE7UUFDekIsSUFBSSxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxFQUFFO1lBQ3pCLElBQ0UsQ0FBQyxDQUFDLElBQUksS0FBSyxJQUFJLENBQUMsZ0JBQWdCO2dCQUNoQyxDQUFDLENBQUMsQ0FBQyxJQUFJLEtBQUssSUFBSSxDQUFDLFlBQVksSUFBSSxJQUFJLENBQUMsY0FBYyxDQUFDLEVBQ3JEO2dCQUNBLE9BQU8sQ0FBQyxRQUFRO2FBQ2pCO1lBQ0QsQ0FBQyxDQUFDLGNBQWMsRUFBRSxDQUFDO1lBQ25CLENBQUMsQ0FBQyxlQUFlLEVBQUUsQ0FBQztTQUNyQjtJQUNILENBQUM7SUFHRCxTQUFTLENBQUMsQ0FBZ0I7UUFDeEIsSUFDRSxJQUFJLENBQUMsY0FBYyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUkseURBQXlEO1lBQ3BHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxLQUFLLEdBQUcsSUFBSSxDQUFDLENBQUMsSUFBSSxLQUFLLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxPQUFPLEtBQUssSUFBSSxDQUFDLElBQUksZ0JBQWdCO1lBQ2hGLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxLQUFLLEdBQUcsSUFBSSxDQUFDLENBQUMsSUFBSSxLQUFLLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxPQUFPLEtBQUssSUFBSSxDQUFDLElBQUksZ0JBQWdCO1lBQ2hGLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxLQUFLLEdBQUcsSUFBSSxDQUFDLENBQUMsSUFBSSxLQUFLLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxPQUFPLEtBQUssSUFBSSxDQUFDLElBQUksZ0JBQWdCO1lBQ2hGLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxLQUFLLEdBQUcsSUFBSSxDQUFDLENBQUMsSUFBSSxLQUFLLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxPQUFPLEtBQUssSUFBSSxDQUFDLElBQUksZ0JBQWdCO1lBQ2hGLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxLQUFLLEdBQUcsSUFBSSxDQUFDLENBQUMsSUFBSSxLQUFLLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxPQUFPLEtBQUssSUFBSSxDQUFDLElBQUkscUJBQXFCO1lBQ3JGLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxLQUFLLEdBQUcsSUFBSSxDQUFDLENBQUMsSUFBSSxLQUFLLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxPQUFPLEtBQUssSUFBSSxDQUFDLElBQUkscUJBQXFCO1lBQ3JGLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxLQUFLLEdBQUcsSUFBSSxDQUFDLENBQUMsSUFBSSxLQUFLLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxPQUFPLEtBQUssSUFBSSxDQUFDLElBQUkscUJBQXFCO1lBQ3JGLENBQUMsQ0FBQyxDQUFDLENB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QWxCLGtCQUFrQjtrQkFIOUIsU0FBUzttQkFBQztvQkFDVCxRQUFRLEVBQUUsYUFBYTtpQkFDeEI7aUdBbUJVLE9BQU87c0JBQWYsS0FBSztnQkFDRyxnQkFBZ0I7c0JBQXhCLEtBQUs7Z0JBQ0csY0FBYztzQkFBdEIsS0FBSztnQkFDRyxVQUFVO3NCQUFsQixLQUFLO2dCQUNHLFlBQVk7c0JBQXBCLEtBQUs7Z0JBQ0csR0FBRztzQkFBWCxLQUFLO2dCQUNHLEdBQUc7c0JBQVgsS0FBSztnQkFDRyxPQUFPO3NCQUFmLEtBQUs7Z0JBeUJOLGFBQWE7c0JBRFosWUFBWTt1QkFBQyxhQUFhLEVBQUUsQ0FBQyxRQUFRLENBQUM7Z0JBZXZDLFNBQVM7c0JBRFIsWUFBWTt1QkFBQyxTQUFTLEVBQUUsQ0FBQyxRQUFRLENBQUM7Z0JBbUVuQyxPQUFPO3NCQUROLFlBQVk7dUJBQUMsT0FBTyxFQUFFLENBQUMsUUFBUSxDQUFDO2dCQXdCakMsTUFBTTtzQkFETCxZQUFZO3VCQUFDLE1BQU0sRUFBRSxDQUFDLFFBQVEsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XHJcbiAgICBEaXJlY3RpdmUsXHJcbiAgICBFbGVtZW50UmVmLFxyXG4gICAgSG9zdExpc3RlbmVyLFxyXG4gICAgSW5wdXQsXHJcbiAgICBPbkNoYW5nZXMsXHJcbiAgICBTaW1wbGVDaGFuZ2VzLFxyXG4gIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbiAgXHJcbiAgQERpcmVjdGl2ZSh7XHJcbiAgICBzZWxlY3RvcjogJ1tkaWdpdE9ubHldJyxcclxuICB9KVxyXG4gIGV4cG9ydCBjbGFzcyBEaWdpdE9ubHlEaXJlY3RpdmUgaW1wbGVtZW50cyBPbkNoYW5nZXMge1xyXG4gICAgcHJpdmF0ZSBoYXNEZWNpbWFsUG9pbnQgPSBmYWxzZTtcclxuICAgIHByaXZhdGUgaGFzTmVnYXRpdmVTaWduID0gZmFsc2U7XHJcbiAgICBwcml2YXRlIG5hdmlnYXRpb25LZXlzID0gW1xyXG4gICAgICAnQmFja3NwYWNlJyxcclxuICAgICAgJ0RlbGV0ZScsXHJcbiAgICAgICdUYWInLFxyXG4gICAgICAnRXNjYXBlJyxcclxuICAgICAgJ0VudGVyJyxcclxuICAgICAgJ0hvbWUnLFxyXG4gICAgICAnRW5kJyxcclxuICAgICAgJ0Fycm93TGVmdCcsXHJcbiAgICAgICdBcnJvd1JpZ2h0JyxcclxuICAgICAgJ0NsZWFyJyxcclxuICAgICAgJ0NvcHknLFxyXG4gICAgICAnUGFzdGUnLFxyXG4gICAgXTtcclxuICBcclxuICAgIEBJbnB1dCgpIGRlY2ltYWwgPSBmYWxzZTtcclxuICAgIEBJbnB1dCgpIGRlY2ltYWxTZXBhcmF0b3IgPSAnLic7XHJcbiAgICBASW5wdXQoKSBhbGxvd05lZ2F0aXZlcyA9IGZhbHNlO1xyXG4gICAgQElucHV0KCkgYWxsb3dQYXN0ZSA9IHRydWU7XHJcbiAgICBASW5wdXQoKSBuZWdhdGl2ZVNpZ24gPSAnLSc7XHJcbiAgICBASW5wdXQoKSBtaW4gPSAtSW5maW5pdHk7XHJcbiAgICBASW5wdXQoKSBtYXggPSBJbmZpbml0eTtcclxuICAgIEBJbnB1dCgpIHBhdHRlcm4/OiBzdHJpbmcgfCBSZWdFeHA7XHJcbiAgICBwcml2YXRlIHJlZ2V4OiBSZWdFeHAgfCBudWxsID0gbnVsbDtcclxuICAgIGlucHV0RWxlbWVudDogSFRNTElucHV0RWxlbWVudDtcclxuICBcclxuICAgIGNvbnN0cnVjdG9yKHB1YmxpYyBlbDogRWxlbWVudFJlZikge1xyXG4gICAgICB0aGlzLmlucHV0RWxlbWVudCA9IGVsLm5hdGl2ZUVsZW1lbnQ7XHJcbiAgICB9XHJcbiAgXHJcbiAgICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKTogdm9pZCB7XHJcbiAgICAgIGlmIChjaGFuZ2VzWydwYXR0ZXJuJ10pIHtcclxuICAgICAgICB0aGlzLnJlZ2V4ID0gdGhpcy5wYXR0ZXJuID8gUmVnRXhwKHRoaXMucGF0dGVybikgOiBudWxsO1xyXG4gICAgICB9XHJcbiAgXHJcbiAgICAgIGlmIChjaGFuZ2VzWydtaW4nXSkge1xyXG4gICAgICAgIGNvbnN0IG1heWJlTWluID0gTnVtYmVyKHRoaXMubWluKTtcclxuICAgICAgICB0aGlzLm1pbiA9IGlzTmFOKG1heWJlTWluKSA/IC1JbmZpbml0eSA6IG1heWJlTWluO1xyXG4gICAgICB9XHJcbiAgXHJcbiAgICAgIGlmIChjaGFuZ2VzWydtYXgnXSkge1xyXG4gICAgICAgIGNvbnN0IG1heWJlTWF4ID0gTnVtYmVyKHRoaXMubWF4KTtcclxuICAgICAgICB0aGlzLm1heCA9IGlzTmFOKG1heWJlTWF4KSA/IEluZmluaXR5IDogbWF5YmVNYXg7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICBcclxuICAgIEBIb3N0TGlzdGVuZXIoJ2JlZm9yZWlucHV0JywgWyckZXZlbnQnXSlcclxuICAgIG9uQmVmb3JlSW5wdXQoZTogSW5wdXRFdmVudCk6IGFueSB7XHJcbiAgICAgIGlmIChpc05hTihOdW1iZXIoZS5kYXRhKSkpIHtcclxuICAgICAgICBpZiAoXHJcbiAgICAgICAgICBlLmRhdGEgPT09IHRoaXMuZGVjaW1hbFNlcGFyYXRvciB8fFxyXG4gICAgICAgICAgKGUuZGF0YSA9PT0gdGhpcy5uZWdhdGl2ZVNpZ24gJiYgdGhpcy5hbGxvd05lZ2F0aXZlcylcclxuICAgICAgICApIHtcclxuICAgICAgICAgIHJldHVybjsgLy8gZ28gb25cclxuICAgICAgICB9XHJcbiAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICBcclxuICAgIEBIb3N0TGlzdGVuZXIoJ2tleWRvd24nLCBbJyRldmVudCddKVxyXG4gICAgb25LZXlEb3duKGU6IEtleWJvYXJkRXZlbnQpOiBhbnkge1xyXG4gICAgICBpZiAoXHJcbiAgICAgICAgdGhpcy5uYXZpZ2F0aW9uS2V5cy5pbmRleE9mKGUua2V5KSA+IC0xIHx8IC8vIEFsbG93OiBuYXZpZ2F0aW9uIGtleXM6IGJhY2tzcGFjZSwgZGVsZXRlLCBhcnJvd3MgZXRjLlxyXG4gICAgICAgICgoZS5rZXkgPT09ICdhJyB8fCBlLmNvZGUgPT09ICdLZXlBJykgJiYgZS5jdHJsS2V5ID09PSB0cnVlKSB8fCAvLyBBbGxvdzogQ3RybCtBXHJcbiAgICAgICAgKChlLmtleSA9PT0gJ2MnIHx8IGUuY29kZSA9PT0gJ0tleUMnKSAmJiBlLmN0cmxLZXkgPT09IHRydWUpIHx8IC8vIEFsbG93OiBDdHJsK0NcclxuICAgICAgICAoKGUua2V5ID09PSAndicgfHwgZS5jb2RlID09PSAnS2V5VicpICYmIGUuY3RybEtleSA9PT0gdHJ1ZSkgfHwgLy8gQWxsb3c6IEN0cmwrVlxyXG4gICAgICAgICgoZS5rZXkgPT09ICd4JyB8fCBlLmNvZGUgPT09ICdLZXlYJykgJiYgZS5jdHJsS2V5ID09PSB0cnVlKSB8fCAvLyBBbGxvdzogQ3RybCtYXHJcbiAgICAgICAgKChlLmtleSA9PT0gJ2EnIHx8IGUuY29kZSA9PT0gJ0tleUEnKSAmJiBlLm1ldGFLZXkgPT09IHRydWUpIHx8IC8vIEFsbG93OiBDbWQrQSAoTWFjKVxyXG4gICAgICAgICgoZS5rZXkgPT09ICdjJyB8fCBlLmNvZGUgPT09ICdLZXlDJykgJiYgZS5tZXRhS2V5ID09PSB0cnVlKSB8fCAvLyBBbGxvdzogQ21kK0MgKE1hYylcclxuICAgICAgICAoKGUua2V5ID09PSAndicgfHwgZS5jb2RlID09PSAnS2V5VicpICYmIGUubWV0YUtleSA9PT0gdHJ1ZSkgfHwgLy8gQWxsb3c6IENtZCtWIChNYWMpXHJcbiAgICAgICAgKChlLmtleSA9PT0gJ3gnIHx8IGUuY29kZSA9PT0gJ0tleVgnKSAmJiBlLm1ldGFLZXkgPT09IHRydWUpIC8vIEFsbG93OiBDbWQrWCAoTWFjKVxyXG4gICAgICApIHtcclxuICAgICAgICAvLyBsZXQgaXQgaGFwcGVuLCBkb24ndCBkbyBhbnl0aGluZ1xyXG4gICAgICAgIHJldHVybjtcclxuICAgICAgfVxyXG4gIFxyXG4gICAgICBsZXQgbmV3VmFsdWUgPSAnJztcclxuICBcclxuICAgICAgaWYgKHRoaXMuZGVjaW1hbCAmJiBlLmtleSA9PT0gdGhpcy5kZWNpbWFsU2VwYXJhdG9yKSB7XHJcbiAgICAgICAgbmV3VmFsdWUgPSB0aGlzLmZvcmVjYXN0VmFsdWUoZS5rZXkpO1xyXG4gICAgICAgIGlmIChuZXdWYWx1ZS5zcGxpdCh0aGlzLmRlY2ltYWxTZXBhcmF0b3IpLmxlbmd0aCA+IDIpIHtcclxuICAgICAgICAgIC8vIGhhcyB0d28gb3IgbW9yZSBkZWNpbWFsIHBvaW50c1xyXG4gICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICB0aGlzLmhhc0RlY2ltYWxQb2ludCA9IG5ld1ZhbHVlLmluZGV4T2YodGhpcy5kZWNpbWFsU2VwYXJhdG9yKSA+IC0xO1xyXG4gICAgICAgICAgcmV0dXJuOyAvLyBBbGxvdzogb25seSBvbmUgZGVjaW1hbCBwb2ludFxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gIFxyXG4gICAgICBpZiAoZS5rZXkgPT09IHRoaXMubmVnYXRpdmVTaWduICYmIHRoaXMuYWxsb3dOZWdhdGl2ZXMpIHtcclxuICAgICAgICBuZXdWYWx1ZSA9IHRoaXMuZm9yZWNhc3RWYWx1ZShlLmtleSk7XHJcbiAgICAgICAgaWYgKFxyXG4gICAgICAgICAgbmV3VmFsdWUuY2hhckF0KDApICE9PSB0aGlzLm5lZ2F0aXZlU2lnbiB8fFxyXG4gICAgICAgICAgbmV3VmFsdWUuc3BsaXQodGhpcy5uZWdhdGl2ZVNpZ24pLmxlbmd0aCA+IDJcclxuICAgICAgICApIHtcclxuICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcclxuICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgdGhpcy5oYXNOZWdhdGl2ZVNpZ24gPSBuZXdWYWx1ZS5zcGxpdCh0aGlzLm5lZ2F0aXZlU2lnbikubGVuZ3RoID4gLTE7XHJcbiAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgXHJcbiAgICAgIC8vIEVuc3VyZSB0aGF0IGl0IGlzIGEgbnVtYmVyIGFuZCBzdG9wIHRoZSBrZXlwcmVzc1xyXG4gICAgICBpZiAoZS5rZXkgPT09ICcgJyB8fCBpc05hTihOdW1iZXIoZS5rZXkpKSkge1xyXG4gICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcclxuICAgICAgICByZXR1cm47XHJcbiAgICAgIH1cclxuICBcclxuICAgICAgbmV3VmFsdWUgPSBuZXdWYWx1ZSB8fCB0aGlzLmZvcmVjYXN0VmFsdWUoZS5rZXkpO1xyXG4gICAgICAvLyBjaGVjayB0aGUgaW5wdXQgcGF0dGVybiBSZWdFeHBcclxuICAgICAgaWYgKHRoaXMucmVnZXgpIHtcclxuICAgICAgICBpZiAoIXRoaXMucmVnZXgudGVzdChuZXdWYWx1ZSkpIHtcclxuICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcclxuICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICBcclxuICAgICAgY29uc3QgbmV3TnVtYmVyID0gTnVtYmVyKG5ld1ZhbHVlKTtcclxuICAgICAgaWYgKG5ld051bWJlciA+IHRoaXMubWF4IHx8IG5ld051bWJlciA8IHRoaXMubWluKSB7XHJcbiAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgXHJcbiAgICBASG9zdExpc3RlbmVyKCdwYXN0ZScsIFsnJGV2ZW50J10pXHJcbiAgICBvblBhc3RlKGV2ZW50OiBhbnkpOiB2b2lkIHtcclxuICAgICAgaWYgKHRoaXMuYWxsb3dQYXN0ZSA9PT0gdHJ1ZSkge1xyXG4gICAgICAgIGxldCBwYXN0ZWRJbnB1dDogc3RyaW5nID0gJyc7XHJcbiAgICAgICAgaWYgKCh3aW5kb3cgYXMgeyBba2V5OiBzdHJpbmddOiBhbnkgfSlbJ2NsaXBib2FyZERhdGEnXSkge1xyXG4gICAgICAgICAgLy8gQnJvd3NlciBpcyBJRVxyXG4gICAgICAgICAgcGFzdGVkSW5wdXQgPSAod2luZG93IGFzIHsgW2tleTogc3RyaW5nXTogYW55IH0pW1xyXG4gICAgICAgICAgICAnY2xpcGJvYXJkRGF0YSdcclxuICAgICAgICAgIF0uZ2V0RGF0YSgndGV4dCcpO1xyXG4gICAgICAgIH0gZWxzZSBpZiAoZXZlbnQuY2xpcGJvYXJkRGF0YSAmJiBldmVudC5jbGlwYm9hcmREYXRhLmdldERhdGEpIHtcclxuICAgICAgICAgIC8vIE90aGVyIGJyb3dzZXJzXHJcbiAgICAgICAgICBwYXN0ZWRJbnB1dCA9IGV2ZW50LmNsaXBib2FyZERhdGEuZ2V0RGF0YSgndGV4dC9wbGFpbicpO1xyXG4gICAgICAgIH1cclxuICBcclxuICAgICAgICB0aGlzLnBhc3RlRGF0YShwYXN0ZWRJbnB1dCk7XHJcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICAvLyB0aGlzIHByZXZlbnRzIHRoZSBwYXN0ZVxyXG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICBcclxuICAgIEBIb3N0TGlzdGVuZXIoJ2Ryb3AnLCBbJyRldmVudCddKVxyXG4gICAgb25Ecm9wKGV2ZW50OiBEcmFnRXZlbnQpOiB2b2lkIHtcclxuICAgICAgY29uc3QgdGV4dERhdGEgPSBldmVudC5kYXRhVHJhbnNmZXI/LmdldERhdGEoJ3RleHQnKSA/PyAnJztcclxuICAgICAgdGhpcy5pbnB1dEVsZW1lbnQuZm9jdXMoKTtcclxuICAgICAgdGhpcy5wYXN0ZURhdGEodGV4dERhdGEpO1xyXG4gICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgfVxyXG4gIFxyXG4gICAgcHJpdmF0ZSBwYXN0ZURhdGEocGFzdGVkQ29udGVudDogc3RyaW5nKTogdm9pZCB7XHJcbiAgICAgIGNvbnN0IHNhbml0aXplZENvbnRlbnQgPSB0aGlzLnNhbml0aXplSW5wdXQocGFzdGVkQ29udGVudCk7XHJcbiAgICAgIGlmIChcclxuICAgICAgICBzYW5pdGl6ZWRDb250ZW50LmluY2x1ZGVzKHRoaXMubmVnYXRpdmVTaWduKSAmJlxyXG4gICAgICAgIHRoaXMuaGFzTmVnYXRpdmVTaWduICYmXHJcbiAgICAgICAgIXRoaXMuZ2V0U2VsZWN0aW9uKCkuaW5jbHVkZXModGhpcy5uZWdhdGl2ZVNpZ24pXHJcbiAgICAgICkge1xyXG4gICAgICAgIHJldHVybjtcclxuICAgICAgfVxyXG4gICAgICBjb25zdCBwYXN0ZWQgPSBkb2N1bWVudC5leGVjQ29tbWFuZCgnaW5zZXJ0VGV4dCcsIGZhbHNlLCBzYW5pdGl6ZWRDb250ZW50KTtcclxuICAgICAgaWYgKCFwYXN0ZWQpIHtcclxuICAgICAgICBpZiAodGhpcy5pbnB1dEVsZW1lbnQuc2V0UmFuZ2VUZXh0KSB7XHJcbiAgICAgICAgICBjb25zdCB7IHNlbGVjdGlvblN0YXJ0OiBzdGFydCwgc2VsZWN0aW9uRW5kOiBlbmQgfSA9IHRoaXMuaW5wdXRFbGVtZW50O1xyXG4gICAgICAgICAgdGhpcy5pbnB1dEVsZW1lbnQuc2V0UmFuZ2VUZXh0KFxyXG4gICAgICAgICAgICBzYW5pdGl6ZWRDb250ZW50LFxyXG4gICAgICAgICAgICBzdGFydCA/PyAwLFxyXG4gICAgICAgICAgICBlbmQgPz8gMCxcclxuICAgICAgICAgICAgJ2VuZCdcclxuICAgICAgICAgICk7XHJcbiAgICAgICAgICAvLyBBbmd1bGFyJ3MgUmVhY3RpdmUgRm9ybSByZWxpZXMgb24gXCJpbnB1dFwiIGV2ZW50LCBidXQgb24gRmlyZWZveCwgdGhlIHNldFJhbmdlVGV4dCBtZXRob2QgZG9lc24ndCB0cmlnZ2VyIGl0XHJcbiAgICAgICAgICAvLyBzbyB3ZSBoYXZlIHRvIHRyaWdnZXIgaXQgb3Vyc2VsZi5cclxuICAgICAgICAgIGlmIChcclxuICAgICAgICAgICAgdHlwZW9mICh3aW5kb3cgYXMgeyBba2V5OiBzdHJpbmddOiBhbnkgfSlbJ0luc3RhbGxUcmlnZ2VyJ10gIT09XHJcbiAgICAgICAgICAgICd1bmRlZmluZWQnXHJcbiAgICAgICAgICApIHtcclxuICAgICAgICAgICAgdGhpcy5pbnB1dEVsZW1lbnQuZGlzcGF0Y2hFdmVudChcclxuICAgICAgICAgICAgICBuZXcgRXZlbnQoJ2lucHV0JywgeyBjYW5jZWxhYmxlOiB0cnVlIH0pXHJcbiAgICAgICAgICAgICk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIC8vIEJyb3dzZXIgZG9lcyBub3Qgc3VwcG9ydCBzZXRSYW5nZVRleHQsIGUuZy4gSUVcclxuICAgICAgICAgIHRoaXMuaW5zZXJ0QXRDdXJzb3IodGhpcy5pbnB1dEVsZW1lbnQsIHNhbml0aXplZENvbnRlbnQpO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgICBpZiAodGhpcy5kZWNpbWFsKSB7XHJcbiAgICAgICAgdGhpcy5oYXNEZWNpbWFsUG9pbnQgPVxyXG4gICAgICAgICAgdGhpcy5pbnB1dEVsZW1lbnQudmFsdWUuaW5kZXhPZih0aGlzLmRlY2ltYWxTZXBhcmF0b3IpID4gLTE7XHJcbiAgICAgIH1cclxuICAgICAgdGhpcy5oYXNOZWdhdGl2ZVNpZ24gPVxyXG4gICAgICAgIHRoaXMuaW5wdXRFbGVtZW50LnZhbHVlLmluZGV4T2YodGhpcy5uZWdhdGl2ZVNpZ24pID4gLTE7XHJcbiAgICB9XHJcbiAgXHJcbiAgICAvLyBUaGUgZm9sbG93aW5nIDIgbWV0aG9kcyB3ZXJlIGFkZGVkIGZyb20gdGhlIGJlbG93IGFydGljbGUgZm9yIGJyb3dzZXJzIHRoYXQgZG8gbm90IHN1cHBvcnQgc2V0UmFuZ2VUZXh0XHJcbiAgICAvLyBodHRwczovL3N0YWNrb3ZlcmZsb3cuY29tL3F1ZXN0aW9ucy8xMTA3Njk3NS9ob3ctdG8taW5zZXJ0LXRleHQtaW50by10aGUtdGV4dGFyZWEtYXQtdGhlLWN1cnJlbnQtY3Vyc29yLXBvc2l0aW9uXHJcbiAgICBwcml2YXRlIGluc2VydEF0Q3Vyc29yKG15RmllbGQ6IEhUTUxJbnB1dEVsZW1lbnQsIG15VmFsdWU6IHN0cmluZyk6IHZvaWQge1xyXG4gICAgICBjb25zdCBzdGFydFBvcyA9IG15RmllbGQuc2VsZWN0aW9uU3RhcnQgPz8gMDtcclxuICAgICAgY29uc3QgZW5kUG9zID0gbXlGaWVsZC5zZWxlY3Rpb25FbmQgPz8gMDtcclxuICBcclxuICAgICAgbXlGaWVsZC52YWx1ZSA9XHJcbiAgICAgICAgbXlGaWVsZC52YWx1ZS5zdWJzdHJpbmcoMCwgc3RhcnRQb3MpICtcclxuICAgICAgICBteVZhbHVlICtcclxuICAgICAgICBteUZpZWxkLnZhbHVlLnN1YnN0cmluZyhlbmRQb3MsIG15RmllbGQudmFsdWUubGVuZ3RoKTtcclxuICBcclxuICAgICAgY29uc3QgcG9zID0gc3RhcnRQb3MgKyBteVZhbHVlLmxlbmd0aDtcclxuICAgICAgbXlGaWVsZC5mb2N1cygpO1xyXG4gICAgICBteUZpZWxkLnNldFNlbGVjdGlvblJhbmdlKHBvcywgcG9zKTtcclxuICBcclxuICAgICAgdGhpcy50cmlnZ2VyRXZlbnQobXlGaWVsZCwgJ2lucHV0Jyk7XHJcbiAgICB9XHJcbiAgXHJcbiAgICBwcml2YXRlIHRyaWdnZXJFdmVudChlbDogSFRNTElucHV0RWxlbWVudCwgdHlwZTogc3RyaW5nKTogdm9pZCB7XHJcbiAgICAgIGlmICgnY3JlYXRlRXZlbnQnIGluIGRvY3VtZW50KSB7XHJcbiAgICAgICAgLy8gbW9kZXJuIGJyb3dzZXJzLCBJRTkrXHJcbiAgICAgICAgY29uc3QgZSA9IGRvY3VtZW50LmNyZWF0ZUV2ZW50KCdIVE1MRXZlbnRzJyk7XHJcbiAgICAgICAgZS5pbml0RXZlbnQodHlwZSwgZmFsc2UsIHRydWUpO1xyXG4gICAgICAgIGVsLmRpc3BhdGNoRXZlbnQoZSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIC8vIGVuZCBzdGFjayBvdmVyZmxvdyBjb2RlXHJcbiAgXHJcbiAgICBwcml2YXRlIHNhbml0aXplSW5wdXQoaW5wdXQ6IHN0cmluZyk6IHN0cmluZyB7XHJcbiAgICAgIGxldCByZXN1bHQgPSAnJztcclxuICAgICAgbGV0IHJlZ2V4O1xyXG4gICAgICBpZiAodGhpcy5kZWNpbWFsICYmIHRoaXMuaXNWYWxpZERlY2ltYWwoaW5wdXQpKSB7XHJcbiAgICAgICAgcmVnZXggPSBuZXcgUmVnRXhwKFxyXG4gICAgICAgICAgYCR7dGhpcy5nZXROZWdhdGl2ZVNpZ25SZWdFeHAoKX1bXjAtOSR7dGhpcy5kZWNpbWFsU2VwYXJhdG9yfV1gLFxyXG4gICAgICAgICAgJ2cnXHJcbiAgICAgICAgKTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICByZWdleCA9IG5ldyBSZWdFeHAoYCR7dGhpcy5nZXROZWdhdGl2ZVNpZ25SZWdFeHAoKX1bXjAtOV1gLCAnZycpO1xyXG4gICAgICB9XHJcbiAgICAgIHJlc3VsdCA9IGlucHV0LnJlcGxhY2UocmVnZXgsICcnKTtcclxuICBcclxuICAgICAgY29uc3QgbWF4TGVuZ3RoID0gdGhpcy5pbnB1dEVsZW1lbnQubWF4TGVuZ3RoO1xyXG4gICAgICBpZiAobWF4TGVuZ3RoID4gMCkge1xyXG4gICAgICAgIC8vIHRoZSBpbnB1dCBlbGVtZW50IGhhcyBtYXhMZW5ndGggbGltaXRcclxuICAgICAgICBjb25zdCBhbGxvd2VkTGVuZ3RoID1cclxuICAgICAgICAgIG1heExlbmd0aCAtXHJcbiAgICAgICAgICB0aGlzLmlucHV0RWxlbWVudC52YWx1ZS5sZW5ndGggK1xyXG4gICAgICAgICAgKHJlc3VsdC5pbmNsdWRlcyhgJHt0aGlzLm5lZ2F0aXZlU2lnbn1gKSA/IDEgOiAwKTtcclxuICAgICAgICByZXN1bHQgPSBhbGxvd2VkTGVuZ3RoID4gMCA/IHJlc3VsdC5zdWJzdHJpbmcoMCwgYWxsb3dlZExlbmd0aCkgOiAnJztcclxuICAgICAgfVxyXG4gICAgICByZXR1cm4gcmVzdWx0O1xyXG4gICAgfVxyXG4gIFxyXG4gICAgcHJpdmF0ZSBnZXROZWdhdGl2ZVNpZ25SZWdFeHAoKTogc3RyaW5nIHtcclxuICAgICAgcmV0dXJuIHRoaXMuYWxsb3dOZWdhdGl2ZXMgJiZcclxuICAgICAgICAoIXRoaXMuaGFzTmVnYXRpdmVTaWduIHx8IHRoaXMuZ2V0U2VsZWN0aW9uKCkuaW5jbHVkZXModGhpcy5uZWdhdGl2ZVNpZ24pKVxyXG4gICAgICAgID8gYCg/IV4ke3RoaXMubmVnYXRpdmVTaWdufSlgXHJcbiAgICAgICAgOiAnJztcclxuICAgIH1cclxuICBcclxuICAgIHByaXZhdGUgaXNWYWxpZERlY2ltYWwoc3RyaW5nOiBzdHJpbmcpOiBib29sZWFuIHtcclxuICAgICAgaWYgKCF0aGlzLmhhc0RlY2ltYWxQb2ludCkge1xyXG4gICAgICAgIHJldHVybiBzdHJpbmcuc3BsaXQodGhpcy5kZWNpbWFsU2VwYXJhdG9yKS5sZW5ndGggPD0gMjtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICAvLyB0aGUgaW5wdXQgZWxlbWVudCBhbHJlYWR5IGhhcyBhIGRlY2ltYWwgc2VwYXJhdG9yXHJcbiAgICAgICAgY29uc3Qgc2VsZWN0ZWRUZXh0ID0gdGhpcy5nZXRTZWxlY3Rpb24oKTtcclxuICAgICAgICBpZiAoc2VsZWN0ZWRUZXh0ICYmIHNlbGVjdGVkVGV4dC5pbmRleE9mKHRoaXMuZGVjaW1hbFNlcGFyYXRvcikgPiAtMSkge1xyXG4gICAgICAgICAgcmV0dXJuIHN0cmluZy5zcGxpdCh0aGlzLmRlY2ltYWxTZXBhcmF0b3IpLmxlbmd0aCA8PSAyO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICByZXR1cm4gc3RyaW5nLmluZGV4T2YodGhpcy5kZWNpbWFsU2VwYXJhdG9yKSA8IDA7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgXHJcbiAgICBwcml2YXRlIGdldFNlbGVjdGlvbigpOiBzdHJpbmcge1xyXG4gICAgICByZXR1cm4gdGhpcy5pbnB1dEVsZW1lbnQudmFsdWUuc3Vic3RyaW5nKFxyXG4gICAgICAgIHRoaXMuaW5wdXRFbGVtZW50LnNlbGVjdGlvblN0YXJ0ID8/IDAsXHJcbiAgICAgICAgdGhpcy5pbnB1dEVsZW1lbnQuc2VsZWN0aW9uRW5kID8/IDBcclxuICAgICAgKTtcclxuICAgIH1cclxuICBcclxuICAgIHByaXZhdGUgZm9yZWNhc3RWYWx1ZShrZXk6IHN0cmluZyk6IHN0cmluZyB7XHJcbiAgICAgIGNvbnN0IHNlbGVjdGlvblN0YXJ0ID0gdGhpcy5pbnB1dEVsZW1lbnQuc2VsZWN0aW9uU3RhcnQ7XHJcbiAgICAgIGNvbnN0IHNlbGVjdGlvbkVuZCA9IHRoaXMuaW5wdXRFbGVtZW50LnNlbGVjdGlvbkVuZDtcclxuICAgICAgY29uc3Qgb2xkVmFsdWUgPSB0aGlzLmlucHV0RWxlbWVudC52YWx1ZTtcclxuXHJcbiAgICAgIGlmKHNlbGVjdGlvblN0YXJ0ID09IG51bGwgJiYgc2VsZWN0aW9uRW5kID09IG51bGwpe1xyXG4gICAgICAgIHJldHVybiAob2xkVmFsdWUgKyBrZXkpO1xyXG4gICAgICB9XHJcblxyXG4gICAgICByZXR1cm4gKFxyXG4gICAgICAgIG9sZFZhbHVlLnN1YnN0cmluZygwLCBzZWxlY3Rpb25TdGFydCkgK1xyXG4gICAgICAgIGtleSArXHJcbiAgICAgICAgb2xkVmFsdWUuc3Vic3RyaW5nKHNlbGVjdGlvbkVuZClcclxuICAgICAgKTtcclxuICAgIH1cclxuICB9Il19
1
+ import { Directive, ElementRef, HostListener, Input, } from '@angular/core';
2
+ import * as i0 from "@angular/core";
3
+ export class DigitOnlyDirective {
4
+ constructor(el) {
5
+ this.el = el;
6
+ this.hasDecimalPoint = false;
7
+ this.hasNegativeSign = false;
8
+ this.navigationKeys = [
9
+ 'Backspace',
10
+ 'Delete',
11
+ 'Tab',
12
+ 'Escape',
13
+ 'Enter',
14
+ 'Home',
15
+ 'End',
16
+ 'ArrowLeft',
17
+ 'ArrowRight',
18
+ 'Clear',
19
+ 'Copy',
20
+ 'Paste',
21
+ ];
22
+ this.decimal = false;
23
+ this.decimalSeparator = '.';
24
+ this.allowNegatives = false;
25
+ this.allowPaste = true;
26
+ this.negativeSign = '-';
27
+ this.min = -Infinity;
28
+ this.max = Infinity;
29
+ this.regex = null;
30
+ this.inputElement = el.nativeElement;
31
+ }
32
+ ngOnChanges(changes) {
33
+ if (changes['pattern']) {
34
+ this.regex = this.pattern ? RegExp(this.pattern) : null;
35
+ }
36
+ if (changes['min']) {
37
+ const maybeMin = Number(this.min);
38
+ this.min = isNaN(maybeMin) ? -Infinity : maybeMin;
39
+ }
40
+ if (changes['max']) {
41
+ const maybeMax = Number(this.max);
42
+ this.max = isNaN(maybeMax) ? Infinity : maybeMax;
43
+ }
44
+ }
45
+ onBeforeInput(e) {
46
+ if (isNaN(Number(e.data))) {
47
+ if (e.data === this.decimalSeparator ||
48
+ (e.data === this.negativeSign && this.allowNegatives)) {
49
+ return; // go on
50
+ }
51
+ e.preventDefault();
52
+ e.stopPropagation();
53
+ }
54
+ }
55
+ onKeyDown(e) {
56
+ if (this.navigationKeys.indexOf(e.key) > -1 || // Allow: navigation keys: backspace, delete, arrows etc.
57
+ ((e.key === 'a' || e.code === 'KeyA') && e.ctrlKey === true) || // Allow: Ctrl+A
58
+ ((e.key === 'c' || e.code === 'KeyC') && e.ctrlKey === true) || // Allow: Ctrl+C
59
+ ((e.key === 'v' || e.code === 'KeyV') && e.ctrlKey === true) || // Allow: Ctrl+V
60
+ ((e.key === 'x' || e.code === 'KeyX') && e.ctrlKey === true) || // Allow: Ctrl+X
61
+ ((e.key === 'a' || e.code === 'KeyA') && e.metaKey === true) || // Allow: Cmd+A (Mac)
62
+ ((e.key === 'c' || e.code === 'KeyC') && e.metaKey === true) || // Allow: Cmd+C (Mac)
63
+ ((e.key === 'v' || e.code === 'KeyV') && e.metaKey === true) || // Allow: Cmd+V (Mac)
64
+ ((e.key === 'x' || e.code === 'KeyX') && e.metaKey === true) // Allow: Cmd+X (Mac)
65
+ ) {
66
+ // let it happen, don't do anything
67
+ return;
68
+ }
69
+ let newValue = '';
70
+ if (this.decimal && e.key === this.decimalSeparator) {
71
+ newValue = this.forecastValue(e.key);
72
+ if (newValue.split(this.decimalSeparator).length > 2) {
73
+ // has two or more decimal points
74
+ e.preventDefault();
75
+ return;
76
+ }
77
+ else {
78
+ this.hasDecimalPoint = newValue.indexOf(this.decimalSeparator) > -1;
79
+ return; // Allow: only one decimal point
80
+ }
81
+ }
82
+ if (e.key === this.negativeSign && this.allowNegatives) {
83
+ newValue = this.forecastValue(e.key);
84
+ if (newValue.charAt(0) !== this.negativeSign ||
85
+ newValue.split(this.negativeSign).length > 2) {
86
+ e.preventDefault();
87
+ return;
88
+ }
89
+ else {
90
+ this.hasNegativeSign = newValue.split(this.negativeSign).length > -1;
91
+ return;
92
+ }
93
+ }
94
+ // Ensure that it is a number and stop the keypress
95
+ if (e.key === ' ' || isNaN(Number(e.key))) {
96
+ e.preventDefault();
97
+ return;
98
+ }
99
+ newValue = newValue || this.forecastValue(e.key);
100
+ // check the input pattern RegExp
101
+ if (this.regex) {
102
+ if (!this.regex.test(newValue)) {
103
+ e.preventDefault();
104
+ return;
105
+ }
106
+ }
107
+ const newNumber = Number(newValue);
108
+ if (newNumber > this.max || newNumber < this.min) {
109
+ e.preventDefault();
110
+ }
111
+ }
112
+ onPaste(event) {
113
+ if (this.allowPaste === true) {
114
+ let pastedInput = '';
115
+ if (window['clipboardData']) {
116
+ // Browser is IE
117
+ pastedInput = window['clipboardData'].getData('text');
118
+ }
119
+ else if (event.clipboardData && event.clipboardData.getData) {
120
+ // Other browsers
121
+ pastedInput = event.clipboardData.getData('text/plain');
122
+ }
123
+ this.pasteData(pastedInput);
124
+ event.preventDefault();
125
+ }
126
+ else {
127
+ // this prevents the paste
128
+ event.preventDefault();
129
+ event.stopPropagation();
130
+ }
131
+ }
132
+ onDrop(event) {
133
+ const textData = event.dataTransfer?.getData('text') ?? '';
134
+ this.inputElement.focus();
135
+ this.pasteData(textData);
136
+ event.preventDefault();
137
+ }
138
+ pasteData(pastedContent) {
139
+ const sanitizedContent = this.sanitizeInput(pastedContent);
140
+ if (sanitizedContent.includes(this.negativeSign) &&
141
+ this.hasNegativeSign &&
142
+ !this.getSelection().includes(this.negativeSign)) {
143
+ return;
144
+ }
145
+ const pasted = document.execCommand('insertText', false, sanitizedContent);
146
+ if (!pasted) {
147
+ if (this.inputElement.setRangeText) {
148
+ const { selectionStart: start, selectionEnd: end } = this.inputElement;
149
+ this.inputElement.setRangeText(sanitizedContent, start ?? 0, end ?? 0, 'end');
150
+ // Angular's Reactive Form relies on "input" event, but on Firefox, the setRangeText method doesn't trigger it
151
+ // so we have to trigger it ourself.
152
+ if (typeof window['InstallTrigger'] !==
153
+ 'undefined') {
154
+ this.inputElement.dispatchEvent(new Event('input', { cancelable: true }));
155
+ }
156
+ }
157
+ else {
158
+ // Browser does not support setRangeText, e.g. IE
159
+ this.insertAtCursor(this.inputElement, sanitizedContent);
160
+ }
161
+ }
162
+ if (this.decimal) {
163
+ this.hasDecimalPoint =
164
+ this.inputElement.value.indexOf(this.decimalSeparator) > -1;
165
+ }
166
+ this.hasNegativeSign =
167
+ this.inputElement.value.indexOf(this.negativeSign) > -1;
168
+ }
169
+ // The following 2 methods were added from the below article for browsers that do not support setRangeText
170
+ // https://stackoverflow.com/questions/11076975/how-to-insert-text-into-the-textarea-at-the-current-cursor-position
171
+ insertAtCursor(myField, myValue) {
172
+ const startPos = myField.selectionStart ?? 0;
173
+ const endPos = myField.selectionEnd ?? 0;
174
+ myField.value =
175
+ myField.value.substring(0, startPos) +
176
+ myValue +
177
+ myField.value.substring(endPos, myField.value.length);
178
+ const pos = startPos + myValue.length;
179
+ myField.focus();
180
+ myField.setSelectionRange(pos, pos);
181
+ this.triggerEvent(myField, 'input');
182
+ }
183
+ triggerEvent(el, type) {
184
+ if ('createEvent' in document) {
185
+ // modern browsers, IE9+
186
+ const e = document.createEvent('HTMLEvents');
187
+ e.initEvent(type, false, true);
188
+ el.dispatchEvent(e);
189
+ }
190
+ }
191
+ // end stack overflow code
192
+ sanitizeInput(input) {
193
+ let result = '';
194
+ let regex;
195
+ if (this.decimal && this.isValidDecimal(input)) {
196
+ regex = new RegExp(`${this.getNegativeSignRegExp()}[^0-9${this.decimalSeparator}]`, 'g');
197
+ }
198
+ else {
199
+ regex = new RegExp(`${this.getNegativeSignRegExp()}[^0-9]`, 'g');
200
+ }
201
+ result = input.replace(regex, '');
202
+ const maxLength = this.inputElement.maxLength;
203
+ if (maxLength > 0) {
204
+ // the input element has maxLength limit
205
+ const allowedLength = maxLength -
206
+ this.inputElement.value.length +
207
+ (result.includes(`${this.negativeSign}`) ? 1 : 0);
208
+ result = allowedLength > 0 ? result.substring(0, allowedLength) : '';
209
+ }
210
+ return result;
211
+ }
212
+ getNegativeSignRegExp() {
213
+ return this.allowNegatives &&
214
+ (!this.hasNegativeSign || this.getSelection().includes(this.negativeSign))
215
+ ? `(?!^${this.negativeSign})`
216
+ : '';
217
+ }
218
+ isValidDecimal(string) {
219
+ if (!this.hasDecimalPoint) {
220
+ return string.split(this.decimalSeparator).length <= 2;
221
+ }
222
+ else {
223
+ // the input element already has a decimal separator
224
+ const selectedText = this.getSelection();
225
+ if (selectedText && selectedText.indexOf(this.decimalSeparator) > -1) {
226
+ return string.split(this.decimalSeparator).length <= 2;
227
+ }
228
+ else {
229
+ return string.indexOf(this.decimalSeparator) < 0;
230
+ }
231
+ }
232
+ }
233
+ getSelection() {
234
+ return this.inputElement.value.substring(this.inputElement.selectionStart ?? 0, this.inputElement.selectionEnd ?? 0);
235
+ }
236
+ forecastValue(key) {
237
+ const selectionStart = this.inputElement.selectionStart;
238
+ const selectionEnd = this.inputElement.selectionEnd;
239
+ const oldValue = this.inputElement.value;
240
+ if (selectionStart == null && selectionEnd == null) {
241
+ return (oldValue + key);
242
+ }
243
+ return (oldValue.substring(0, selectionStart) +
244
+ key +
245
+ oldValue.substring(selectionEnd));
246
+ }
247
+ }
248
+ DigitOnlyDirectivefac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: DigitOnlyDirective, deps: [{ token: i0.ElementRef }], target: i0.ɵɵFactoryTarget.Directive });
249
+ DigitOnlyDirective.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "15.2.10", type: DigitOnlyDirective, selector: "[digitOnly]", inputs: { decimal: "decimal", decimalSeparator: "decimalSeparator", allowNegatives: "allowNegatives", allowPaste: "allowPaste", negativeSign: "negativeSign", min: "min", max: "max", pattern: "pattern" }, host: { listeners: { "beforeinput": "onBeforeInput($event)", "keydown": "onKeyDown($event)", "paste": "onPaste($event)", "drop": "onDrop($event)" } }, usesOnChanges: true, ngImport: i0 });
250
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: DigitOnlyDirective, decorators: [{
251
+ type: Directive,
252
+ args: [{
253
+ selector: '[digitOnly]',
254
+ }]
255
+ }], ctorParameters: function () { return [{ type: i0.ElementRef }]; }, propDecorators: { decimal: [{
256
+ type: Input
257
+ }], decimalSeparator: [{
258
+ type: Input
259
+ }], allowNegatives: [{
260
+ type: Input
261
+ }], allowPaste: [{
262
+ type: Input
263
+ }], negativeSign: [{
264
+ type: Input
265
+ }], min: [{
266
+ type: Input
267
+ }], max: [{
268
+ type: Input
269
+ }], pattern: [{
270
+ type: Input
271
+ }], onBeforeInput: [{
272
+ type: HostListener,
273
+ args: ['beforeinput', ['$event']]
274
+ }], onKeyDown: [{
275
+ type: HostListener,
276
+ args: ['keydown', ['$event']]
277
+ }], onPaste: [{
278
+ type: HostListener,
279
+ args: ['paste', ['$event']]
280
+ }], onDrop: [{
281
+ type: HostListener,
282
+ args: ['drop', ['$event']]
283
+ }] } });
284
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGlnaXRzLW9ubHkuZGlyZWN0aXZlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvYW5uYS1jb3JlL3NyYy9saWIvYW5uYS1jb3JlLXNoYXJlZC1saWIvZGlyZWN0aXZlcy9kaWdpdHMtb25seS9kaWdpdHMtb25seS5kaXJlY3RpdmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNILFNBQVMsRUFDVCxVQUFVLEVBQ1YsWUFBWSxFQUNaLEtBQUssR0FHTixNQUFNLGVBQWUsQ0FBQzs7QUFLdkIsTUFBTSxPQUFPLGtCQUFrQjtJQTZCN0IsWUFBbUIsRUFBYztRQUFkLE9BQUUsR0FBRixFQUFFLENBQVk7UUE1QnpCLG9CQUFlLEdBQUcsS0FBSyxDQUFDO1FBQ3hCLG9CQUFlLEdBQUcsS0FBSyxDQUFDO1FBQ3hCLG1CQUFjLEdBQUc7WUFDdkIsV0FBVztZQUNYLFFBQVE7WUFDUixLQUFLO1lBQ0wsUUFBUTtZQUNSLE9BQU87WUFDUCxNQUFNO1lBQ04sS0FBSztZQUNMLFdBQVc7WUFDWCxZQUFZO1lBQ1osT0FBTztZQUNQLE1BQU07WUFDTixPQUFPO1NBQ1IsQ0FBQztRQUVPLFlBQU8sR0FBRyxLQUFLLENBQUM7UUFDaEIscUJBQWdCLEdBQUcsR0FBRyxDQUFDO1FBQ3ZCLG1CQUFjLEdBQUcsS0FBSyxDQUFDO1FBQ3ZCLGVBQVUsR0FBRyxJQUFJLENBQUM7UUFDbEIsaUJBQVksR0FBRyxHQUFHLENBQUM7UUFDbkIsUUFBRyxHQUFHLENBQUMsUUFBUSxDQUFDO1FBQ2hCLFFBQUcsR0FBRyxRQUFRLENBQUM7UUFFaEIsVUFBSyxHQUFrQixJQUFJLENBQUM7UUFJbEMsSUFBSSxDQUFDLFlBQVksR0FBRyxFQUFFLENBQUMsYUFBYSxDQUFDO0lBQ3ZDLENBQUM7SUFFRCxXQUFXLENBQUMsT0FBc0I7UUFDaEMsSUFBSSxPQUFPLENBQUMsU0FBUyxDQUFDLEVBQUU7WUFDdEIsSUFBSSxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7U0FDekQ7UUFFRCxJQUFJLE9BQU8sQ0FBQyxLQUFLLENBQUMsRUFBRTtZQUNsQixNQUFNLFFBQVEsR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQ2xDLElBQUksQ0FBQyxHQUFHLEdBQUcsS0FBSyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDO1NBQ25EO1FBRUQsSUFBSSxPQUFPLENBQUMsS0FBSyxDQUFDLEVBQUU7WUFDbEIsTUFBTSxRQUFRLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUNsQyxJQUFJLENBQUMsR0FBRyxHQUFHLEtBQUssQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUM7U0FDbEQ7SUFDSCxDQUFDO0lBR0QsYUFBYSxDQUFDLENBQWE7UUFDekIsSUFBSSxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxFQUFFO1lBQ3pCLElBQ0UsQ0FBQyxDQUFDLElBQUksS0FBSyxJQUFJLENBQUMsZ0JBQWdCO2dCQUNoQyxDQUFDLENBQUMsQ0FBQyxJQUFJLEtBQUssSUFBSSxDQUFDLFlBQVksSUFBSSxJQUFJLENBQUMsY0FBYyxDQUFDLEVBQ3JEO2dCQUNBLE9BQU8sQ0FBQyxRQUFRO2FBQ2pCO1lBQ0QsQ0FBQyxDQUFDLGNBQWMsRUFBRSxDQUFDO1lBQ25CLENBQUMsQ0FBQyxlQUFlLEVBQUUsQ0FBQztTQUNyQjtJQUNILENBQUM7SUFHRCxTQUFTLENBQUMsQ0FBZ0I7UUFDeEIsSUFDRSxJQUFJLENBQUMsY0FBYyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUkseURBQXlEO1lBQ3BHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxLQUFLLEdBQUcsSUFBSSxDQUFDLENBQUMsSUFBSSxLQUFLLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxPQUFPLEtBQUssSUFBSSxDQUFDLElBQUksZ0JBQWdCO1lBQ2hGLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxLQUFLLEdBQUcsSUFBSSxDQUFDLENBQUMsSUFBSSxLQUFLLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxPQUFPLEtBQUssSUFBSSxDQUFDLElBQUksZ0JBQWdCO1lBQ2hGLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxLQUFLLEdBQUcsSUFBSSxDQUFDLENBQUMsSUFBSSxLQUFLLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxPQUFPLEtBQUssSUFBSSxDQUFDLElBQUksZ0JBQWdCO1lBQ2hGLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxLQUFLLEdBQUcsSUFBSSxDQUFDLENBQUMsSUFBSSxLQUFLLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxPQUFPLEtBQUssSUFBSSxDQUFDLElBQUksZ0JBQWdCO1lBQ2hGLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxLQUFLLEdBQUcsSUFBSSxDQUFDLENBQUMsSUFBSSxLQUFLLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxPQUFPLEtBQUssSUFBSSxDQUFDLElBQUkscUJBQXFCO1lBQ3JGLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxLQUFLLEdBQUcsSUFBSSxDQUFDLENBQUMsSUFBSSxLQUFLLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxPQUFPLEtBQUssSUFBSSxDQUFDLElBQUkscUJBQXFCO1lBQ3JGLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxLQUFLLEdBQUcsSUFBSSxDQUFDLENBQUMsSUFBSSxLQUFLLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxPQUFPLEtBQUssSUFBSSxDQUFDLElBQUkscUJBQXFCO1lBQ3JGLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxLQUFLLEdBQUcsSUFBSSxDQUFDLENBQUMsSUFBSSxLQUFLLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxPQUFPLEtBQUssSUFBSSxDQUFDLENBQUMscUJBQXFCO1VBQ2xGO1lBQ0EsbUNBQW1DO1lBQ25DLE9BQU87U0FDUjtRQUVELElBQUksUUFBUSxHQUFHLEVBQUUsQ0FBQztRQUVsQixJQUFJLElBQUksQ0FBQyxPQUFPLElBQUksQ0FBQyxDQUFDLEdBQUcsS0FBSyxJQUFJLENBQUMsZ0JBQWdCLEVBQUU7WUFDbkQsUUFBUSxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQ3JDLElBQUksUUFBUSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFO2dCQUNwRCxpQ0FBaUM7Z0JBQ2pDLENBQUMsQ0FBQyxjQUFjLEVBQUUsQ0FBQztnQkFDbkIsT0FBTzthQUNSO2lCQUFNO2dCQUNMLElBQUksQ0FBQyxlQUFlLEdBQUcsUUFBUSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztnQkFDcEUsT0FBTyxDQUFDLGdDQUFnQzthQUN6QztTQUNGO1FBRUQsSUFBSSxDQUFDLENBQUMsR0FBRyxLQUFLLElBQUksQ0FBQyxZQUFZLElBQUksSUFBSSxDQUFDLGNBQWMsRUFBRTtZQUN0RCxRQUFRLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDckMsSUFDRSxRQUFRLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxLQUFLLElBQUksQ0FBQyxZQUFZO2dCQUN4QyxRQUFRLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUM1QztnQkFDQSxDQUFDLENBQUMsY0FBYyxFQUFFLENBQUM7Z0JBQ25CLE9BQU87YUFDUjtpQkFBTTtnQkFDTCxJQUFJLENBQUMsZUFBZSxHQUFHLFFBQVEsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQztnQkFDckUsT0FBTzthQUNSO1NBQ0Y7UUFFRCxtREFBbUQ7UUFDbkQsSUFBSSxDQUFDLENBQUMsR0FBRyxLQUFLLEdBQUcsSUFBSSxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFO1lBQ3pDLENBQUMsQ0FBQyxjQUFjLEVBQUUsQ0FBQztZQUNuQixPQUFPO1NBQ1I7UUFFRCxRQUFRLEdBQUcsUUFBUSxJQUFJLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ2pELGlDQUFpQztRQUNqQyxJQUFJLElBQUksQ0FBQyxLQUFLLEVBQUU7WUFDZCxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLEVBQUU7Z0JBQzlCLENBQUMsQ0FBQyxjQUFjLEVBQUUsQ0FBQztnQkFDbkIsT0FBTzthQUNSO1NBQ0Y7UUFFRCxNQUFNLFNBQVMsR0FBRyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDbkMsSUFBSSxTQUFTLEdBQUcsSUFBSSxDQUFDLEdBQUcsSUFBSSxTQUFTLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRTtZQUNoRCxDQUFDLENBQUMsY0FBYyxFQUFFLENBQUM7U0FDcEI7SUFDSCxDQUFDO0lBR0QsT0FBTyxDQUFDLEtBQVU7UUFDaEIsSUFBSSxJQUFJLENBQUMsVUFBVSxLQUFLLElBQUksRUFBRTtZQUM1QixJQUFJLFdBQVcsR0FBVyxFQUFFLENBQUM7WUFDN0IsSUFBSyxNQUFpQyxDQUFDLGVBQWUsQ0FBQyxFQUFFO2dCQUN2RCxnQkFBZ0I7Z0JBQ2hCLFdBQVcsR0FBSSxNQUFpQyxDQUM5QyxlQUFlLENBQ2hCLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDO2FBQ25CO2lCQUFNLElBQUksS0FBSyxDQUFDLGFBQWEsSUFBSSxLQUFLLENBQUMsYUFBYSxDQUFDLE9BQU8sRUFBRTtnQkFDN0QsaUJBQWlCO2dCQUNqQixXQUFXLEdBQUcsS0FBSyxDQUFDLGFBQWEsQ0FBQyxPQUFPLENBQUMsWUFBWSxDQUFDLENBQUM7YUFDekQ7WUFFRCxJQUFJLENBQUMsU0FBUyxDQUFDLFdBQVcsQ0FBQyxDQUFDO1lBQzVCLEtBQUssQ0FBQyxjQUFjLEVBQUUsQ0FBQztTQUN4QjthQUFNO1lBQ0wsMEJBQTBCO1lBQzFCLEtBQUssQ0FBQyxjQUFjLEVBQUUsQ0FBQztZQUN2QixLQUFLLENBQUMsZUFBZSxFQUFFLENBQUM7U0FDekI7SUFDSCxDQUFDO0lBR0QsTUFBTSxDQUFDLEtBQWdCO1FBQ3JCLE1BQU0sUUFBUSxHQUFHLEtBQUssQ0FBQyxZQUFZLEVBQUUsT0FBTyxDQUFDLE1BQU0sQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUMzRCxJQUFJLENBQUMsWUFBWSxDQUFDLEtBQUssRUFBRSxDQUFDO1FBQzFCLElBQUksQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDekIsS0FBSyxDQUFDLGNBQWMsRUFBRSxDQUFDO0lBQ3pCLENBQUM7SUFFTyxTQUFTLENBQUMsYUFBcUI7UUFDckMsTUFBTSxnQkFBZ0IsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLGFBQWEsQ0FBQyxDQUFDO1FBQzNELElBQ0UsZ0JBQWdCLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUM7WUFDNUMsSUFBSSxDQUFDLGVBQWU7WUFDcEIsQ0FBQyxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsRUFDaEQ7WUFDQSxPQUFPO1NBQ1I7UUFDRCxNQUFNLE1BQU0sR0FBRyxRQUFRLENBQUMsV0FBVyxDQUFDLFlBQVksRUFBRSxLQUFLLEVBQUUsZ0JBQWdCLENBQUMsQ0FBQztRQUMzRSxJQUFJLENBQUMsTUFBTSxFQUFFO1lBQ1gsSUFBSSxJQUFJLENBQUMsWUFBWSxDQUFDLFlBQVksRUFBRTtnQkFDbEMsTUFBTSxFQUFFLGNBQWMsRUFBRSxLQUFLLEVBQUUsWUFBWSxFQUFFLEdBQUcsRUFBRSxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUM7Z0JBQ3ZFLElBQUksQ0FBQyxZQUFZLENBQUMsWUFBWSxDQUM1QixnQkFBZ0IsRUFDaEIsS0FBSyxJQUFJLENBQUMsRUFDVixHQUFHLElBQUksQ0FBQyxFQUNSLEtBQUssQ0FDTixDQUFDO2dCQUNGLDhHQUE4RztnQkFDOUcsb0NBQW9DO2dCQUNwQyxJQUNFLE9BQVEsTUFBaUMsQ0FBQyxnQkFBZ0IsQ0FBQztvQkFDM0QsV0FBVyxFQUNYO29CQUNBLElBQUksQ0FBQyxZQUFZLENBQUMsYUFBYSxDQUM3QixJQUFJLEtBQUssQ0FBQyxPQUFPLEVBQUUsRUFBRSxVQUFVLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FDekMsQ0FBQztpQkFDSDthQUNGO2lCQUFNO2dCQUNMLGlEQUFpRDtnQkFDakQsSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsWUFBWSxFQUFFLGdCQUFnQixDQUFDLENBQUM7YUFDMUQ7U0FDRjtRQUNELElBQUksSUFBSSxDQUFDLE9BQU8sRUFBRTtZQUNoQixJQUFJLENBQUMsZUFBZTtnQkFDbEIsSUFBSSxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO1NBQy9EO1FBQ0QsSUFBSSxDQUFDLGVBQWU7WUFDbEIsSUFBSSxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztJQUM1RCxDQUFDO0lBRUQsMEdBQTBHO0lBQzFHLG1IQUFtSDtJQUMzRyxjQUFjLENBQUMsT0FBeUIsRUFBRSxPQUFlO1FBQy9ELE1BQU0sUUFBUSxHQUFHLE9BQU8sQ0FBQyxjQUFjLElBQUksQ0FBQyxDQUFDO1FBQzdDLE1BQU0sTUFBTSxHQUFHLE9BQU8sQ0FBQyxZQUFZLElBQUksQ0FBQyxDQUFDO1FBRXpDLE9BQU8sQ0FBQyxLQUFLO1lBQ1gsT0FBTyxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsQ0FBQyxFQUFFLFFBQVEsQ0FBQztnQkFDcEMsT0FBTztnQkFDUCxPQUFPLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxNQUFNLEVBQUUsT0FBTyxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUV4RCxNQUFNLEdBQUcsR0FBRyxRQUFRLEdBQUcsT0FBTyxDQUFDLE1BQU0sQ0FBQztRQUN0QyxPQUFPLENBQUMsS0FBSyxFQUFFLENBQUM7UUFDaEIsT0FBTyxDQUFDLGlCQUFpQixDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQztRQUVwQyxJQUFJLENBQUMsWUFBWSxDQUFDLE9BQU8sRUFBRSxPQUFPLENBQUMsQ0FBQztJQUN0QyxDQUFDO0lBRU8sWUFBWSxDQUFDLEVBQW9CLEVBQUUsSUFBWTtRQUNyRCxJQUFJLGFBQWEsSUFBSSxRQUFRLEVBQUU7WUFDN0Isd0JBQXdCO1lBQ3hCLE1BQU0sQ0FBQyxHQUFHLFFBQVEsQ0FBQyxXQUFXLENBQUMsWUFBWSxDQUFDLENBQUM7WUFDN0MsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxJQUFJLEVBQUUsS0FBSyxFQUFFLElBQUksQ0FBQyxDQUFDO1lBQy9CLEVBQUUsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLENBQUM7U0FDckI7SUFDSCxDQUFDO0lBQ0QsMEJBQTBCO0lBRWxCLGFBQWEsQ0FBQyxLQUFhO1FBQ2pDLElBQUksTUFBTSxHQUFHLEVBQUUsQ0FBQztRQUNoQixJQUFJLEtBQUssQ0FBQztRQUNWLElBQUksSUFBSSxDQUFDLE9BQU8sSUFBSSxJQUFJLENBQUMsY0FBYyxDQUFDLEtBQUssQ0FBQyxFQUFFO1lBQzlDLEtBQUssR0FBRyxJQUFJLE1BQU0sQ0FDaEIsR0FBRyxJQUFJLENBQUMscUJBQXFCLEVBQUUsUUFBUSxJQUFJLENBQUMsZ0JBQWdCLEdBQUcsRUFDL0QsR0FBRyxDQUNKLENBQUM7U0FDSDthQUFNO1lBQ0wsS0FBSyxHQUFHLElBQUksTUFBTSxDQUFDLEdBQUcsSUFBSSxDQUFDLHFCQUFxQixFQUFFLFFBQVEsRUFBRSxHQUFHLENBQUMsQ0FBQztTQUNsRTtRQUNELE1BQU0sR0FBRyxLQUFLLENBQUMsT0FBTyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsQ0FBQztRQUVsQyxNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLFNBQVMsQ0FBQztRQUM5QyxJQUFJLFNBQVMsR0FBRyxDQUFDLEVBQUU7WUFDakIsd0NBQXdDO1lBQ3hDLE1BQU0sYUFBYSxHQUNqQixTQUFTO2dCQUNULElBQUksQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUFDLE1BQU07Z0JBQzlCLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxHQUFHLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ3BELE1BQU0sR0FBRyxhQUFhLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLENBQUMsRUFBRSxhQUFhLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1NBQ3RFO1FBQ0QsT0FBTyxNQUFNLENBQUM7SUFDaEIsQ0FBQztJQUVPLHFCQUFxQjtRQUMzQixPQUFPLElBQUksQ0FBQyxjQUFjO1lBQ3hCLENBQUMsQ0FBQyxJQUFJLENBQUMsZUFBZSxJQUFJLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDO1lBQzFFLENBQUMsQ0FBQyxPQUFPLElBQUksQ0FBQyxZQUFZLEdBQUc7WUFDN0IsQ0FBQyxDQUFDLEVBQUUsQ0FBQztJQUNULENBQUM7SUFFTyxjQUFjLENBQUMsTUFBYztRQUNuQyxJQUFJLENBQUMsSUFBSSxDQUFDLGVBQWUsRUFBRTtZQUN6QixPQUFPLE1BQU0sQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUMsTUFBTSxJQUFJLENBQUMsQ0FBQztTQUN4RDthQUFNO1lBQ0wsb0RBQW9EO1lBQ3BELE1BQU0sWUFBWSxHQUFHLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQztZQUN6QyxJQUFJLFlBQVksSUFBSSxZQUFZLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFO2dCQUNwRSxPQUFPLE1BQU0sQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUMsTUFBTSxJQUFJLENBQUMsQ0FBQzthQUN4RDtpQkFBTTtnQkFDTCxPQUFPLE1BQU0sQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLEdBQUcsQ0FBQyxDQUFDO2FBQ2xEO1NBQ0Y7SUFDSCxDQUFDO0lBRU8sWUFBWTtRQUNsQixPQUFPLElBQUksQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FDdEMsSUFBSSxDQUFDLFlBQVksQ0FBQyxjQUFjLElBQUksQ0FBQyxFQUNyQyxJQUFJLENBQUMsWUFBWSxDQUFDLFlBQVksSUFBSSxDQUFDLENBQ3BDLENBQUM7SUFDSixDQUFDO0lBRU8sYUFBYSxDQUFDLEdBQVc7UUFDL0IsTUFBTSxjQUFjLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxjQUFjLENBQUM7UUFDeEQsTUFBTSxZQUFZLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxZQUFZLENBQUM7UUFDcEQsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUM7UUFFekMsSUFBRyxjQUFjLElBQUksSUFBSSxJQUFJLFlBQVksSUFBSSxJQUFJLEVBQUM7WUFDaEQsT0FBTyxDQUFDLFFBQVEsR0FBRyxHQUFHLENBQUMsQ0FBQztTQUN6QjtRQUVELE9BQU8sQ0FDTCxRQUFRLENBQUMsU0FBUyxDQUFDLENBQUMsRUFBRSxjQUFjLENBQUM7WUFDckMsR0FBRztZQUNILFFBQVEsQ0FBQyxTQUFTLENBQUMsWUFBWSxDQUFDLENBQ2pDLENBQUM7SUFDSixDQUFDOztnSEF6U1Usa0JBQWtCO29HQUFsQixrQkFBa0I7NEZBQWxCLGtCQUFrQjtrQkFIOUIsU0FBUzttQkFBQztvQkFDVCxRQUFRLEVBQUUsYUFBYTtpQkFDeEI7aUdBbUJVLE9BQU87c0JBQWYsS0FBSztnQkFDRyxnQkFBZ0I7c0JBQXhCLEtBQUs7Z0JBQ0csY0FBYztzQkFBdEIsS0FBSztnQkFDRyxVQUFVO3NCQUFsQixLQUFLO2dCQUNHLFlBQVk7c0JBQXBCLEtBQUs7Z0JBQ0csR0FBRztzQkFBWCxLQUFLO2dCQUNHLEdBQUc7c0JBQVgsS0FBSztnQkFDRyxPQUFPO3NCQUFmLEtBQUs7Z0JBeUJOLGFBQWE7c0JBRFosWUFBWTt1QkFBQyxhQUFhLEVBQUUsQ0FBQyxRQUFRLENBQUM7Z0JBZXZDLFNBQVM7c0JBRFIsWUFBWTt1QkFBQyxTQUFTLEVBQUUsQ0FBQyxRQUFRLENBQUM7Z0JBbUVuQyxPQUFPO3NCQUROLFlBQVk7dUJBQUMsT0FBTyxFQUFFLENBQUMsUUFBUSxDQUFDO2dCQXdCakMsTUFBTTtzQkFETCxZQUFZO3VCQUFDLE1BQU0sRUFBRSxDQUFDLFFBQVEsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XHJcbiAgICBEaXJlY3RpdmUsXHJcbiAgICBFbGVtZW50UmVmLFxyXG4gICAgSG9zdExpc3RlbmVyLFxyXG4gICAgSW5wdXQsXHJcbiAgICBPbkNoYW5nZXMsXHJcbiAgICBTaW1wbGVDaGFuZ2VzLFxyXG4gIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbiAgXHJcbiAgQERpcmVjdGl2ZSh7XHJcbiAgICBzZWxlY3RvcjogJ1tkaWdpdE9ubHldJyxcclxuICB9KVxyXG4gIGV4cG9ydCBjbGFzcyBEaWdpdE9ubHlEaXJlY3RpdmUgaW1wbGVtZW50cyBPbkNoYW5nZXMge1xyXG4gICAgcHJpdmF0ZSBoYXNEZWNpbWFsUG9pbnQgPSBmYWxzZTtcclxuICAgIHByaXZhdGUgaGFzTmVnYXRpdmVTaWduID0gZmFsc2U7XHJcbiAgICBwcml2YXRlIG5hdmlnYXRpb25LZXlzID0gW1xyXG4gICAgICAnQmFja3NwYWNlJyxcclxuICAgICAgJ0RlbGV0ZScsXHJcbiAgICAgICdUYWInLFxyXG4gICAgICAnRXNjYXBlJyxcclxuICAgICAgJ0VudGVyJyxcclxuICAgICAgJ0hvbWUnLFxyXG4gICAgICAnRW5kJyxcclxuICAgICAgJ0Fycm93TGVmdCcsXHJcbiAgICAgICdBcnJvd1JpZ2h0JyxcclxuICAgICAgJ0NsZWFyJyxcclxuICAgICAgJ0NvcHknLFxyXG4gICAgICAnUGFzdGUnLFxyXG4gICAgXTtcclxuICBcclxuICAgIEBJbnB1dCgpIGRlY2ltYWwgPSBmYWxzZTtcclxuICAgIEBJbnB1dCgpIGRlY2ltYWxTZXBhcmF0b3IgPSAnLic7XHJcbiAgICBASW5wdXQoKSBhbGxvd05lZ2F0aXZlcyA9IGZhbHNlO1xyXG4gICAgQElucHV0KCkgYWxsb3dQYXN0ZSA9IHRydWU7XHJcbiAgICBASW5wdXQoKSBuZWdhdGl2ZVNpZ24gPSAnLSc7XHJcbiAgICBASW5wdXQoKSBtaW4gPSAtSW5maW5pdHk7XHJcbiAgICBASW5wdXQoKSBtYXggPSBJbmZpbml0eTtcclxuICAgIEBJbnB1dCgpIHBhdHRlcm4/OiBzdHJpbmcgfCBSZWdFeHA7XHJcbiAgICBwcml2YXRlIHJlZ2V4OiBSZWdFeHAgfCBudWxsID0gbnVsbDtcclxuICAgIGlucHV0RWxlbWVudDogSFRNTElucHV0RWxlbWVudDtcclxuICBcclxuICAgIGNvbnN0cnVjdG9yKHB1YmxpYyBlbDogRWxlbWVudFJlZikge1xyXG4gICAgICB0aGlzLmlucHV0RWxlbWVudCA9IGVsLm5hdGl2ZUVsZW1lbnQ7XHJcbiAgICB9XHJcbiAgXHJcbiAgICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKTogdm9pZCB7XHJcbiAgICAgIGlmIChjaGFuZ2VzWydwYXR0ZXJuJ10pIHtcclxuICAgICAgICB0aGlzLnJlZ2V4ID0gdGhpcy5wYXR0ZXJuID8gUmVnRXhwKHRoaXMucGF0dGVybikgOiBudWxsO1xyXG4gICAgICB9XHJcbiAgXHJcbiAgICAgIGlmIChjaGFuZ2VzWydtaW4nXSkge1xyXG4gICAgICAgIGNvbnN0IG1heWJlTWluID0gTnVtYmVyKHRoaXMubWluKTtcclxuICAgICAgICB0aGlzLm1pbiA9IGlzTmFOKG1heWJlTWluKSA/IC1JbmZpbml0eSA6IG1heWJlTWluO1xyXG4gICAgICB9XHJcbiAgXHJcbiAgICAgIGlmIChjaGFuZ2VzWydtYXgnXSkge1xyXG4gICAgICAgIGNvbnN0IG1heWJlTWF4ID0gTnVtYmVyKHRoaXMubWF4KTtcclxuICAgICAgICB0aGlzLm1heCA9IGlzTmFOKG1heWJlTWF4KSA/IEluZmluaXR5IDogbWF5YmVNYXg7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICBcclxuICAgIEBIb3N0TGlzdGVuZXIoJ2JlZm9yZWlucHV0JywgWyckZXZlbnQnXSlcclxuICAgIG9uQmVmb3JlSW5wdXQoZTogSW5wdXRFdmVudCk6IGFueSB7XHJcbiAgICAgIGlmIChpc05hTihOdW1iZXIoZS5kYXRhKSkpIHtcclxuICAgICAgICBpZiAoXHJcbiAgICAgICAgICBlLmRhdGEgPT09IHRoaXMuZGVjaW1hbFNlcGFyYXRvciB8fFxyXG4gICAgICAgICAgKGUuZGF0YSA9PT0gdGhpcy5uZWdhdGl2ZVNpZ24gJiYgdGhpcy5hbGxvd05lZ2F0aXZlcylcclxuICAgICAgICApIHtcclxuICAgICAgICAgIHJldHVybjsgLy8gZ28gb25cclxuICAgICAgICB9XHJcbiAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICBcclxuICAgIEBIb3N0TGlzdGVuZXIoJ2tleWRvd24nLCBbJyRldmVudCddKVxyXG4gICAgb25LZXlEb3duKGU6IEtleWJvYXJkRXZlbnQpOiBhbnkge1xyXG4gICAgICBpZiAoXHJcbiAgICAgICAgdGhpcy5uYXZpZ2F0aW9uS2V5cy5pbmRleE9mKGUua2V5KSA+IC0xIHx8IC8vIEFsbG93OiBuYXZpZ2F0aW9uIGtleXM6IGJhY2tzcGFjZSwgZGVsZXRlLCBhcnJvd3MgZXRjLlxyXG4gICAgICAgICgoZS5rZXkgPT09ICdhJyB8fCBlLmNvZGUgPT09ICdLZXlBJykgJiYgZS5jdHJsS2V5ID09PSB0cnVlKSB8fCAvLyBBbGxvdzogQ3RybCtBXHJcbiAgICAgICAgKChlLmtleSA9PT0gJ2MnIHx8IGUuY29kZSA9PT0gJ0tleUMnKSAmJiBlLmN0cmxLZXkgPT09IHRydWUpIHx8IC8vIEFsbG93OiBDdHJsK0NcclxuICAgICAgICAoKGUua2V5ID09PSAndicgfHwgZS5jb2RlID09PSAnS2V5VicpICYmIGUuY3RybEtleSA9PT0gdHJ1ZSkgfHwgLy8gQWxsb3c6IEN0cmwrVlxyXG4gICAgICAgICgoZS5rZXkgPT09ICd4JyB8fCBlLmNvZGUgPT09ICdLZXlYJykgJiYgZS5jdHJsS2V5ID09PSB0cnVlKSB8fCAvLyBBbGxvdzogQ3RybCtYXHJcbiAgICAgICAgKChlLmtleSA9PT0gJ2EnIHx8IGUuY29kZSA9PT0gJ0tleUEnKSAmJiBlLm1ldGFLZXkgPT09IHRydWUpIHx8IC8vIEFsbG93OiBDbWQrQSAoTWFjKVxyXG4gICAgICAgICgoZS5rZXkgPT09ICdjJyB8fCBlLmNvZGUgPT09ICdLZXlDJykgJiYgZS5tZXRhS2V5ID09PSB0cnVlKSB8fCAvLyBBbGxvdzogQ21kK0MgKE1hYylcclxuICAgICAgICAoKGUua2V5ID09PSAndicgfHwgZS5jb2RlID09PSAnS2V5VicpICYmIGUubWV0YUtleSA9PT0gdHJ1ZSkgfHwgLy8gQWxsb3c6IENtZCtWIChNYWMpXHJcbiAgICAgICAgKChlLmtleSA9PT0gJ3gnIHx8IGUuY29kZSA9PT0gJ0tleVgnKSAmJiBlLm1ldGFLZXkgPT09IHRydWUpIC8vIEFsbG93OiBDbWQrWCAoTWFjKVxyXG4gICAgICApIHtcclxuICAgICAgICAvLyBsZXQgaXQgaGFwcGVuLCBkb24ndCBkbyBhbnl0aGluZ1xyXG4gICAgICAgIHJldHVybjtcclxuICAgICAgfVxyXG4gIFxyXG4gICAgICBsZXQgbmV3VmFsdWUgPSAnJztcclxuICBcclxuICAgICAgaWYgKHRoaXMuZGVjaW1hbCAmJiBlLmtleSA9PT0gdGhpcy5kZWNpbWFsU2VwYXJhdG9yKSB7XHJcbiAgICAgICAgbmV3VmFsdWUgPSB0aGlzLmZvcmVjYXN0VmFsdWUoZS5rZXkpO1xyXG4gICAgICAgIGlmIChuZXdWYWx1ZS5zcGxpdCh0aGlzLmRlY2ltYWxTZXBhcmF0b3IpLmxlbmd0aCA+IDIpIHtcclxuICAgICAgICAgIC8vIGhhcyB0d28gb3IgbW9yZSBkZWNpbWFsIHBvaW50c1xyXG4gICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICB0aGlzLmhhc0RlY2ltYWxQb2ludCA9IG5ld1ZhbHVlLmluZGV4T2YodGhpcy5kZWNpbWFsU2VwYXJhdG9yKSA+IC0xO1xyXG4gICAgICAgICAgcmV0dXJuOyAvLyBBbGxvdzogb25seSBvbmUgZGVjaW1hbCBwb2ludFxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gIFxyXG4gICAgICBpZiAoZS5rZXkgPT09IHRoaXMubmVnYXRpdmVTaWduICYmIHRoaXMuYWxsb3dOZWdhdGl2ZXMpIHtcclxuICAgICAgICBuZXdWYWx1ZSA9IHRoaXMuZm9yZWNhc3RWYWx1ZShlLmtleSk7XHJcbiAgICAgICAgaWYgKFxyXG4gICAgICAgICAgbmV3VmFsdWUuY2hhckF0KDApICE9PSB0aGlzLm5lZ2F0aXZlU2lnbiB8fFxyXG4gICAgICAgICAgbmV3VmFsdWUuc3BsaXQodGhpcy5uZWdhdGl2ZVNpZ24pLmxlbmd0aCA+IDJcclxuICAgICAgICApIHtcclxuICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcclxuICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgdGhpcy5oYXNOZWdhdGl2ZVNpZ24gPSBuZXdWYWx1ZS5zcGxpdCh0aGlzLm5lZ2F0aXZlU2lnbikubGVuZ3RoID4gLTE7XHJcbiAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgXHJcbiAgICAgIC8vIEVuc3VyZSB0aGF0IGl0IGlzIGEgbnVtYmVyIGFuZCBzdG9wIHRoZSBrZXlwcmVzc1xyXG4gICAgICBpZiAoZS5rZXkgPT09ICcgJyB8fCBpc05hTihOdW1iZXIoZS5rZXkpKSkge1xyXG4gICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcclxuICAgICAgICByZXR1cm47XHJcbiAgICAgIH1cclxuICBcclxuICAgICAgbmV3VmFsdWUgPSBuZXdWYWx1ZSB8fCB0aGlzLmZvcmVjYXN0VmFsdWUoZS5rZXkpO1xyXG4gICAgICAvLyBjaGVjayB0aGUgaW5wdXQgcGF0dGVybiBSZWdFeHBcclxuICAgICAgaWYgKHRoaXMucmVnZXgpIHtcclxuICAgICAgICBpZiAoIXRoaXMucmVnZXgudGVzdChuZXdWYWx1ZSkpIHtcclxuICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcclxuICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICBcclxuICAgICAgY29uc3QgbmV3TnVtYmVyID0gTnVtYmVyKG5ld1ZhbHVlKTtcclxuICAgICAgaWYgKG5ld051bWJlciA+IHRoaXMubWF4IHx8IG5ld051bWJlciA8IHRoaXMubWluKSB7XHJcbiAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgXHJcbiAgICBASG9zdExpc3RlbmVyKCdwYXN0ZScsIFsnJGV2ZW50J10pXHJcbiAgICBvblBhc3RlKGV2ZW50OiBhbnkpOiB2b2lkIHtcclxuICAgICAgaWYgKHRoaXMuYWxsb3dQYXN0ZSA9PT0gdHJ1ZSkge1xyXG4gICAgICAgIGxldCBwYXN0ZWRJbnB1dDogc3RyaW5nID0gJyc7XHJcbiAgICAgICAgaWYgKCh3aW5kb3cgYXMgeyBba2V5OiBzdHJpbmddOiBhbnkgfSlbJ2NsaXBib2FyZERhdGEnXSkge1xyXG4gICAgICAgICAgLy8gQnJvd3NlciBpcyBJRVxyXG4gICAgICAgICAgcGFzdGVkSW5wdXQgPSAod2luZG93IGFzIHsgW2tleTogc3RyaW5nXTogYW55IH0pW1xyXG4gICAgICAgICAgICAnY2xpcGJvYXJkRGF0YSdcclxuICAgICAgICAgIF0uZ2V0RGF0YSgndGV4dCcpO1xyXG4gICAgICAgIH0gZWxzZSBpZiAoZXZlbnQuY2xpcGJvYXJkRGF0YSAmJiBldmVudC5jbGlwYm9hcmREYXRhLmdldERhdGEpIHtcclxuICAgICAgICAgIC8vIE90aGVyIGJyb3dzZXJzXHJcbiAgICAgICAgICBwYXN0ZWRJbnB1dCA9IGV2ZW50LmNsaXBib2FyZERhdGEuZ2V0RGF0YSgndGV4dC9wbGFpbicpO1xyXG4gICAgICAgIH1cclxuICBcclxuICAgICAgICB0aGlzLnBhc3RlRGF0YShwYXN0ZWRJbnB1dCk7XHJcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICAvLyB0aGlzIHByZXZlbnRzIHRoZSBwYXN0ZVxyXG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICBcclxuICAgIEBIb3N0TGlzdGVuZXIoJ2Ryb3AnLCBbJyRldmVudCddKVxyXG4gICAgb25Ecm9wKGV2ZW50OiBEcmFnRXZlbnQpOiB2b2lkIHtcclxuICAgICAgY29uc3QgdGV4dERhdGEgPSBldmVudC5kYXRhVHJhbnNmZXI/LmdldERhdGEoJ3RleHQnKSA/PyAnJztcclxuICAgICAgdGhpcy5pbnB1dEVsZW1lbnQuZm9jdXMoKTtcclxuICAgICAgdGhpcy5wYXN0ZURhdGEodGV4dERhdGEpO1xyXG4gICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgfVxyXG4gIFxyXG4gICAgcHJpdmF0ZSBwYXN0ZURhdGEocGFzdGVkQ29udGVudDogc3RyaW5nKTogdm9pZCB7XHJcbiAgICAgIGNvbnN0IHNhbml0aXplZENvbnRlbnQgPSB0aGlzLnNhbml0aXplSW5wdXQocGFzdGVkQ29udGVudCk7XHJcbiAgICAgIGlmIChcclxuICAgICAgICBzYW5pdGl6ZWRDb250ZW50LmluY2x1ZGVzKHRoaXMubmVnYXRpdmVTaWduKSAmJlxyXG4gICAgICAgIHRoaXMuaGFzTmVnYXRpdmVTaWduICYmXHJcbiAgICAgICAgIXRoaXMuZ2V0U2VsZWN0aW9uKCkuaW5jbHVkZXModGhpcy5uZWdhdGl2ZVNpZ24pXHJcbiAgICAgICkge1xyXG4gICAgICAgIHJldHVybjtcclxuICAgICAgfVxyXG4gICAgICBjb25zdCBwYXN0ZWQgPSBkb2N1bWVudC5leGVjQ29tbWFuZCgnaW5zZXJ0VGV4dCcsIGZhbHNlLCBzYW5pdGl6ZWRDb250ZW50KTtcclxuICAgICAgaWYgKCFwYXN0ZWQpIHtcclxuICAgICAgICBpZiAodGhpcy5pbnB1dEVsZW1lbnQuc2V0UmFuZ2VUZXh0KSB7XHJcbiAgICAgICAgICBjb25zdCB7IHNlbGVjdGlvblN0YXJ0OiBzdGFydCwgc2VsZWN0aW9uRW5kOiBlbmQgfSA9IHRoaXMuaW5wdXRFbGVtZW50O1xyXG4gICAgICAgICAgdGhpcy5pbnB1dEVsZW1lbnQuc2V0UmFuZ2VUZXh0KFxyXG4gICAgICAgICAgICBzYW5pdGl6ZWRDb250ZW50LFxyXG4gICAgICAgICAgICBzdGFydCA/PyAwLFxyXG4gICAgICAgICAgICBlbmQgPz8gMCxcclxuICAgICAgICAgICAgJ2VuZCdcclxuICAgICAgICAgICk7XHJcbiAgICAgICAgICAvLyBBbmd1bGFyJ3MgUmVhY3RpdmUgRm9ybSByZWxpZXMgb24gXCJpbnB1dFwiIGV2ZW50LCBidXQgb24gRmlyZWZveCwgdGhlIHNldFJhbmdlVGV4dCBtZXRob2QgZG9lc24ndCB0cmlnZ2VyIGl0XHJcbiAgICAgICAgICAvLyBzbyB3ZSBoYXZlIHRvIHRyaWdnZXIgaXQgb3Vyc2VsZi5cclxuICAgICAgICAgIGlmIChcclxuICAgICAgICAgICAgdHlwZW9mICh3aW5kb3cgYXMgeyBba2V5OiBzdHJpbmddOiBhbnkgfSlbJ0luc3RhbGxUcmlnZ2VyJ10gIT09XHJcbiAgICAgICAgICAgICd1bmRlZmluZWQnXHJcbiAgICAgICAgICApIHtcclxuICAgICAgICAgICAgdGhpcy5pbnB1dEVsZW1lbnQuZGlzcGF0Y2hFdmVudChcclxuICAgICAgICAgICAgICBuZXcgRXZlbnQoJ2lucHV0JywgeyBjYW5jZWxhYmxlOiB0cnVlIH0pXHJcbiAgICAgICAgICAgICk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIC8vIEJyb3dzZXIgZG9lcyBub3Qgc3VwcG9ydCBzZXRSYW5nZVRleHQsIGUuZy4gSUVcclxuICAgICAgICAgIHRoaXMuaW5zZXJ0QXRDdXJzb3IodGhpcy5pbnB1dEVsZW1lbnQsIHNhbml0aXplZENvbnRlbnQpO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgICBpZiAodGhpcy5kZWNpbWFsKSB7XHJcbiAgICAgICAgdGhpcy5oYXNEZWNpbWFsUG9pbnQgPVxyXG4gICAgICAgICAgdGhpcy5pbnB1dEVsZW1lbnQudmFsdWUuaW5kZXhPZih0aGlzLmRlY2ltYWxTZXBhcmF0b3IpID4gLTE7XHJcbiAgICAgIH1cclxuICAgICAgdGhpcy5oYXNOZWdhdGl2ZVNpZ24gPVxyXG4gICAgICAgIHRoaXMuaW5wdXRFbGVtZW50LnZhbHVlLmluZGV4T2YodGhpcy5uZWdhdGl2ZVNpZ24pID4gLTE7XHJcbiAgICB9XHJcbiAgXHJcbiAgICAvLyBUaGUgZm9sbG93aW5nIDIgbWV0aG9kcyB3ZXJlIGFkZGVkIGZyb20gdGhlIGJlbG93IGFydGljbGUgZm9yIGJyb3dzZXJzIHRoYXQgZG8gbm90IHN1cHBvcnQgc2V0UmFuZ2VUZXh0XHJcbiAgICAvLyBodHRwczovL3N0YWNrb3ZlcmZsb3cuY29tL3F1ZXN0aW9ucy8xMTA3Njk3NS9ob3ctdG8taW5zZXJ0LXRleHQtaW50by10aGUtdGV4dGFyZWEtYXQtdGhlLWN1cnJlbnQtY3Vyc29yLXBvc2l0aW9uXHJcbiAgICBwcml2YXRlIGluc2VydEF0Q3Vyc29yKG15RmllbGQ6IEhUTUxJbnB1dEVsZW1lbnQsIG15VmFsdWU6IHN0cmluZyk6IHZvaWQge1xyXG4gICAgICBjb25zdCBzdGFydFBvcyA9IG15RmllbGQuc2VsZWN0aW9uU3RhcnQgPz8gMDtcclxuICAgICAgY29uc3QgZW5kUG9zID0gbXlGaWVsZC5zZWxlY3Rpb25FbmQgPz8gMDtcclxuICBcclxuICAgICAgbXlGaWVsZC52YWx1ZSA9XHJcbiAgICAgICAgbXlGaWVsZC52YWx1ZS5zdWJzdHJpbmcoMCwgc3RhcnRQb3MpICtcclxuICAgICAgICBteVZhbHVlICtcclxuICAgICAgICBteUZpZWxkLnZhbHVlLnN1YnN0cmluZyhlbmRQb3MsIG15RmllbGQudmFsdWUubGVuZ3RoKTtcclxuICBcclxuICAgICAgY29uc3QgcG9zID0gc3RhcnRQb3MgKyBteVZhbHVlLmxlbmd0aDtcclxuICAgICAgbXlGaWVsZC5mb2N1cygpO1xyXG4gICAgICBteUZpZWxkLnNldFNlbGVjdGlvblJhbmdlKHBvcywgcG9zKTtcclxuICBcclxuICAgICAgdGhpcy50cmlnZ2VyRXZlbnQobXlGaWVsZCwgJ2lucHV0Jyk7XHJcbiAgICB9XHJcbiAgXHJcbiAgICBwcml2YXRlIHRyaWdnZXJFdmVudChlbDogSFRNTElucHV0RWxlbWVudCwgdHlwZTogc3RyaW5nKTogdm9pZCB7XHJcbiAgICAgIGlmICgnY3JlYXRlRXZlbnQnIGluIGRvY3VtZW50KSB7XHJcbiAgICAgICAgLy8gbW9kZXJuIGJyb3dzZXJzLCBJRTkrXHJcbiAgICAgICAgY29uc3QgZSA9IGRvY3VtZW50LmNyZWF0ZUV2ZW50KCdIVE1MRXZlbnRzJyk7XHJcbiAgICAgICAgZS5pbml0RXZlbnQodHlwZSwgZmFsc2UsIHRydWUpO1xyXG4gICAgICAgIGVsLmRpc3BhdGNoRXZlbnQoZSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIC8vIGVuZCBzdGFjayBvdmVyZmxvdyBjb2RlXHJcbiAgXHJcbiAgICBwcml2YXRlIHNhbml0aXplSW5wdXQoaW5wdXQ6IHN0cmluZyk6IHN0cmluZyB7XHJcbiAgICAgIGxldCByZXN1bHQgPSAnJztcclxuICAgICAgbGV0IHJlZ2V4O1xyXG4gICAgICBpZiAodGhpcy5kZWNpbWFsICYmIHRoaXMuaXNWYWxpZERlY2ltYWwoaW5wdXQpKSB7XHJcbiAgICAgICAgcmVnZXggPSBuZXcgUmVnRXhwKFxyXG4gICAgICAgICAgYCR7dGhpcy5nZXROZWdhdGl2ZVNpZ25SZWdFeHAoKX1bXjAtOSR7dGhpcy5kZWNpbWFsU2VwYXJhdG9yfV1gLFxyXG4gICAgICAgICAgJ2cnXHJcbiAgICAgICAgKTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICByZWdleCA9IG5ldyBSZWdFeHAoYCR7dGhpcy5nZXROZWdhdGl2ZVNpZ25SZWdFeHAoKX1bXjAtOV1gLCAnZycpO1xyXG4gICAgICB9XHJcbiAgICAgIHJlc3VsdCA9IGlucHV0LnJlcGxhY2UocmVnZXgsICcnKTtcclxuICBcclxuICAgICAgY29uc3QgbWF4TGVuZ3RoID0gdGhpcy5pbnB1dEVsZW1lbnQubWF4TGVuZ3RoO1xyXG4gICAgICBpZiAobWF4TGVuZ3RoID4gMCkge1xyXG4gICAgICAgIC8vIHRoZSBpbnB1dCBlbGVtZW50IGhhcyBtYXhMZW5ndGggbGltaXRcclxuICAgICAgICBjb25zdCBhbGxvd2VkTGVuZ3RoID1cclxuICAgICAgICAgIG1heExlbmd0aCAtXHJcbiAgICAgICAgICB0aGlzLmlucHV0RWxlbWVudC52YWx1ZS5sZW5ndGggK1xyXG4gICAgICAgICAgKHJlc3VsdC5pbmNsdWRlcyhgJHt0aGlzLm5lZ2F0aXZlU2lnbn1gKSA/IDEgOiAwKTtcclxuICAgICAgICByZXN1bHQgPSBhbGxvd2VkTGVuZ3RoID4gMCA/IHJlc3VsdC5zdWJzdHJpbmcoMCwgYWxsb3dlZExlbmd0aCkgOiAnJztcclxuICAgICAgfVxyXG4gICAgICByZXR1cm4gcmVzdWx0O1xyXG4gICAgfVxyXG4gIFxyXG4gICAgcHJpdmF0ZSBnZXROZWdhdGl2ZVNpZ25SZWdFeHAoKTogc3RyaW5nIHtcclxuICAgICAgcmV0dXJuIHRoaXMuYWxsb3dOZWdhdGl2ZXMgJiZcclxuICAgICAgICAoIXRoaXMuaGFzTmVnYXRpdmVTaWduIHx8IHRoaXMuZ2V0U2VsZWN0aW9uKCkuaW5jbHVkZXModGhpcy5uZWdhdGl2ZVNpZ24pKVxyXG4gICAgICAgID8gYCg/IV4ke3RoaXMubmVnYXRpdmVTaWdufSlgXHJcbiAgICAgICAgOiAnJztcclxuICAgIH1cclxuICBcclxuICAgIHByaXZhdGUgaXNWYWxpZERlY2ltYWwoc3RyaW5nOiBzdHJpbmcpOiBib29sZWFuIHtcclxuICAgICAgaWYgKCF0aGlzLmhhc0RlY2ltYWxQb2ludCkge1xyXG4gICAgICAgIHJldHVybiBzdHJpbmcuc3BsaXQodGhpcy5kZWNpbWFsU2VwYXJhdG9yKS5sZW5ndGggPD0gMjtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICAvLyB0aGUgaW5wdXQgZWxlbWVudCBhbHJlYWR5IGhhcyBhIGRlY2ltYWwgc2VwYXJhdG9yXHJcbiAgICAgICAgY29uc3Qgc2VsZWN0ZWRUZXh0ID0gdGhpcy5nZXRTZWxlY3Rpb24oKTtcclxuICAgICAgICBpZiAoc2VsZWN0ZWRUZXh0ICYmIHNlbGVjdGVkVGV4dC5pbmRleE9mKHRoaXMuZGVjaW1hbFNlcGFyYXRvcikgPiAtMSkge1xyXG4gICAgICAgICAgcmV0dXJuIHN0cmluZy5zcGxpdCh0aGlzLmRlY2ltYWxTZXBhcmF0b3IpLmxlbmd0aCA8PSAyO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICByZXR1cm4gc3RyaW5nLmluZGV4T2YodGhpcy5kZWNpbWFsU2VwYXJhdG9yKSA8IDA7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgXHJcbiAgICBwcml2YXRlIGdldFNlbGVjdGlvbigpOiBzdHJpbmcge1xyXG4gICAgICByZXR1cm4gdGhpcy5pbnB1dEVsZW1lbnQudmFsdWUuc3Vic3RyaW5nKFxyXG4gICAgICAgIHRoaXMuaW5wdXRFbGVtZW50LnNlbGVjdGlvblN0YXJ0ID8/IDAsXHJcbiAgICAgICAgdGhpcy5pbnB1dEVsZW1lbnQuc2VsZWN0aW9uRW5kID8/IDBcclxuICAgICAgKTtcclxuICAgIH1cclxuICBcclxuICAgIHByaXZhdGUgZm9yZWNhc3RWYWx1ZShrZXk6IHN0cmluZyk6IHN0cmluZyB7XHJcbiAgICAgIGNvbnN0IHNlbGVjdGlvblN0YXJ0ID0gdGhpcy5pbnB1dEVsZW1lbnQuc2VsZWN0aW9uU3RhcnQ7XHJcbiAgICAgIGNvbnN0IHNlbGVjdGlvbkVuZCA9IHRoaXMuaW5wdXRFbGVtZW50LnNlbGVjdGlvbkVuZDtcclxuICAgICAgY29uc3Qgb2xkVmFsdWUgPSB0aGlzLmlucHV0RWxlbWVudC52YWx1ZTtcclxuXHJcbiAgICAgIGlmKHNlbGVjdGlvblN0YXJ0ID09IG51bGwgJiYgc2VsZWN0aW9uRW5kID09IG51bGwpe1xyXG4gICAgICAgIHJldHVybiAob2xkVmFsdWUgKyBrZXkpO1xyXG4gICAgICB9XHJcblxyXG4gICAgICByZXR1cm4gKFxyXG4gICAgICAgIG9sZFZhbHVlLnN1YnN0cmluZygwLCBzZWxlY3Rpb25TdGFydCkgK1xyXG4gICAgICAgIGtleSArXHJcbiAgICAgICAgb2xkVmFsdWUuc3Vic3RyaW5nKHNlbGVjdGlvbkVuZClcclxuICAgICAgKTtcclxuICAgIH1cclxuICB9Il19