@metadev/lux 0.27.0 → 0.28.0

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 (83) hide show
  1. package/LICENSE +1 -1
  2. package/README.md +1 -1
  3. package/esm2022/lib/autocomplete/autocomplete.component.mjs +488 -488
  4. package/esm2022/lib/autocomplete-list/autocomplete-list.component.mjs +258 -258
  5. package/esm2022/lib/breadcrumb/breadcrumb.component.mjs +77 -77
  6. package/esm2022/lib/checkbox/checkbox.component.mjs +156 -156
  7. package/esm2022/lib/datasource.mjs +1 -1
  8. package/esm2022/lib/datetime/datetime.component.mjs +312 -312
  9. package/esm2022/lib/filter/filter.component.mjs +158 -158
  10. package/esm2022/lib/geolocation/geolocation.component.mjs +423 -423
  11. package/esm2022/lib/geolocation/geolocation.service.mjs +122 -122
  12. package/esm2022/lib/geolocation/openlayer-loader.service.mjs +61 -61
  13. package/esm2022/lib/helperFns.mjs +117 -117
  14. package/esm2022/lib/input/input.component.mjs +469 -469
  15. package/esm2022/lib/input/regexp.service.mjs +194 -194
  16. package/esm2022/lib/lang.mjs +8 -8
  17. package/esm2022/lib/lux.module.mjs +118 -118
  18. package/esm2022/lib/map/geopoint.mjs +1 -1
  19. package/esm2022/lib/map/map.component.mjs +275 -275
  20. package/esm2022/lib/modal/modal-backdrop.mjs +24 -24
  21. package/esm2022/lib/modal/modal-config.mjs +11 -11
  22. package/esm2022/lib/modal/modal-dismiss-reasons.mjs +5 -5
  23. package/esm2022/lib/modal/modal-ref.mjs +100 -100
  24. package/esm2022/lib/modal/modal-stack.mjs +181 -181
  25. package/esm2022/lib/modal/modal-window.mjs +118 -118
  26. package/esm2022/lib/modal/modal.service.mjs +27 -27
  27. package/esm2022/lib/modal/util.mjs +81 -81
  28. package/esm2022/lib/pagination/pagination.component.mjs +144 -144
  29. package/esm2022/lib/pagination/pagination.mjs +1 -1
  30. package/esm2022/lib/radiogroup/radiogroup.component.mjs +129 -129
  31. package/esm2022/lib/select/select.component.mjs +148 -148
  32. package/esm2022/lib/tooltip/placement.mjs +7 -7
  33. package/esm2022/lib/tooltip/tooltip-context.mjs +1 -1
  34. package/esm2022/lib/tooltip/tooltip.component.mjs +21 -21
  35. package/esm2022/lib/tooltip/tooltip.directive.mjs +69 -69
  36. package/esm2022/lib/tooltip/tooltip.service.mjs +136 -136
  37. package/esm2022/lib/tooltip/tooltop-content.mjs +8 -8
  38. package/esm2022/lib/voice-recognition/voice-recognition.directive.mjs +79 -79
  39. package/esm2022/lib/window/window.service.mjs +45 -45
  40. package/esm2022/metadev-lux.mjs +4 -4
  41. package/esm2022/public-api.mjs +20 -20
  42. package/fesm2022/metadev-lux.mjs +4372 -4372
  43. package/fesm2022/metadev-lux.mjs.map +1 -1
  44. package/index.d.ts +5 -5
  45. package/lib/autocomplete/autocomplete.component.d.ts +81 -81
  46. package/lib/autocomplete-list/autocomplete-list.component.d.ts +65 -65
  47. package/lib/breadcrumb/breadcrumb.component.d.ts +22 -22
  48. package/lib/checkbox/checkbox.component.d.ts +47 -47
  49. package/lib/datasource.d.ts +13 -13
  50. package/lib/datetime/datetime.component.d.ts +69 -69
  51. package/lib/filter/filter.component.d.ts +51 -51
  52. package/lib/geolocation/geolocation.component.d.ts +123 -123
  53. package/lib/geolocation/geolocation.service.d.ts +32 -32
  54. package/lib/geolocation/openlayer-loader.service.d.ts +7 -7
  55. package/lib/helperFns.d.ts +15 -15
  56. package/lib/input/input.component.d.ts +108 -108
  57. package/lib/input/regexp.service.d.ts +15 -15
  58. package/lib/lang.d.ts +2 -2
  59. package/lib/lux.module.d.ts +27 -27
  60. package/lib/map/geopoint.d.ts +7 -7
  61. package/lib/map/map.component.d.ts +39 -39
  62. package/lib/modal/modal-backdrop.d.ts +8 -8
  63. package/lib/modal/modal-config.d.ts +14 -14
  64. package/lib/modal/modal-dismiss-reasons.d.ts +4 -4
  65. package/lib/modal/modal-ref.d.ts +41 -41
  66. package/lib/modal/modal-stack.d.ts +31 -31
  67. package/lib/modal/modal-window.d.ts +28 -28
  68. package/lib/modal/modal.service.d.ts +19 -19
  69. package/lib/modal/util.d.ts +40 -40
  70. package/lib/pagination/pagination.component.d.ts +52 -52
  71. package/lib/pagination/pagination.d.ts +10 -10
  72. package/lib/radiogroup/radiogroup.component.d.ts +37 -37
  73. package/lib/select/select.component.d.ts +38 -38
  74. package/lib/tooltip/placement.d.ts +7 -7
  75. package/lib/tooltip/tooltip-context.d.ts +3 -3
  76. package/lib/tooltip/tooltip.component.d.ts +11 -11
  77. package/lib/tooltip/tooltip.directive.d.ts +27 -27
  78. package/lib/tooltip/tooltip.service.d.ts +20 -20
  79. package/lib/tooltip/tooltop-content.d.ts +6 -6
  80. package/lib/voice-recognition/voice-recognition.directive.d.ts +16 -16
  81. package/lib/window/window.service.d.ts +11 -11
  82. package/package.json +3 -4
  83. package/public-api.d.ts +18 -18
@@ -1,118 +1,118 @@
1
- /* eslint-disable no-useless-escape */
2
- // undefined and null functions
3
- export const exists = (value) => value !== null && value !== undefined;
4
- export const hasValue = (value) => exists(value) && (typeof value === 'string' ? !isEmptyString(value) : true);
5
- // string functions
6
- export const isEmptyString = (value) => value.trim() === '';
7
- export const isValidEmail = (value) => {
8
- const re = /^[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?$/;
9
- return re.test(String(value).toLowerCase().trim());
10
- };
11
- export const isValidUrl = (value) => {
12
- const pattern =
13
- // eslint-disable-next-line max-len
14
- /^((([a-z]+?:\/\/)?(((([a-z0-9]([a-z0-9-]*[a-z0-9])*)\.)+[a-z]{2,})|((([0-9]{1,3}\.){3}[0-9]{1,3}))|(localhost))(\:[0-9]+)?))?((\/[a-zA-Z0-9\-_+=~.,:;%]+)*\/?)((\?|;)[a-zA-Z0-9\-_+~.,:;%]+=[a-zA-Z0-9\-_+~.,:;%]+(((&|;)[a-zA-Z0-9\-_+~.,:;%]+=[a-zA-Z0-9\-_+~.,:;%]+)*))?(#[a-zA-Z0-9\-_+~.,:;%]+(=[a-zA-Z0-9\*\-_+~.,:;%]+)?)?$/;
15
- return pattern.test(value);
16
- };
17
- export const isValidRelativeUrl = (value) => {
18
- const pattern =
19
- // eslint-disable-next-line max-len
20
- /^((([a-z]+?:\/\/)?(((([a-z0-9]([a-z0-9-]*[a-z0-9])*)\.)+[a-z]{2,})|((([0-9]{1,3}\.){3}[0-9]{1,3}))|(localhost))(\:[0-9]+)?)|([a-zA-Z0-9\-_+=~.,:;%]+))?((\/[a-zA-Z0-9\-_+=~.,:;%]+)*\/?)((\?|;)[a-zA-Z0-9\-_+~.,:;%]+=[a-zA-Z0-9\-_+~.,:;%]+(((&|;)[a-zA-Z0-9\-_+~.,:;%]+=[a-zA-Z0-9\-_+~.,:;%]+)*))?(#[a-zA-Z0-9\-_+~.,:;%]+(=[a-zA-Z0-9\*\-_+~.,:;%]+)?)?$/;
21
- return pattern.test(value);
22
- };
23
- export const isValidColor = (value) => {
24
- value = String(value).toLowerCase();
25
- // valid values for CSS color property, yet not valid colors by themselves
26
- if (value === 'currentcolor' ||
27
- value === 'inherit' ||
28
- value === 'initial' ||
29
- value === 'revert' ||
30
- value === 'unset') {
31
- return false;
32
- }
33
- return CSS.supports('color', value);
34
- };
35
- // date functions
36
- export const isValidDate = (date) => exists(date) ? !isNaN(date.getTime()) : false;
37
- export const normalizeDate = (value) => {
38
- if (typeof value === 'string' && value.length > 10) {
39
- return value.substr(0, 10);
40
- }
41
- return value ? value.toString() : null;
42
- };
43
- export const addTimezoneOffset = (date) => {
44
- if (!isValidDate(date)) {
45
- return date;
46
- }
47
- else {
48
- return new Date(date.getTime() - date.getTimezoneOffset() * 60000);
49
- }
50
- };
51
- // number functions
52
- export const isValidNumber = (value) => (hasValue(value) ? !Number.isNaN(Number(value)) : false);
53
- export const numberOfDecimalDigits = (x) => {
54
- if (isValidNumber(x)) {
55
- const xString = String(Number(x));
56
- if (xString === 'Infinity') {
57
- return 0;
58
- }
59
- const indexOfE = xString.indexOf('e');
60
- if (indexOfE >= 0) {
61
- return 0;
62
- }
63
- const indexOfDecimalPoint = xString.indexOf('.');
64
- if (indexOfDecimalPoint < 0) {
65
- return 0;
66
- }
67
- else {
68
- return xString.length - indexOfDecimalPoint - 1;
69
- }
70
- }
71
- return undefined;
72
- };
73
- export const numberOfWholeDigits = (x) => {
74
- if (isValidNumber(x)) {
75
- let xString = String(Number(x));
76
- if (xString.indexOf('-') === 0) {
77
- xString = xString.slice(1, xString.length);
78
- }
79
- if (xString === 'Infinity') {
80
- return Infinity;
81
- }
82
- if (xString.indexOf('0') === 0) {
83
- xString = xString.slice(1, xString.length);
84
- }
85
- const indexOfE = xString.indexOf('e');
86
- if (indexOfE >= 0) {
87
- return Number(xString.slice(indexOfE + 1, xString.length)) + 1;
88
- }
89
- const indexOfDecimalPoint = xString.indexOf('.');
90
- if (indexOfDecimalPoint < 0) {
91
- return xString.length;
92
- }
93
- else {
94
- return indexOfDecimalPoint;
95
- }
96
- }
97
- return undefined;
98
- };
99
- export const roundToMultipleOf = (x, modulo) => {
100
- const moduloString = String(modulo);
101
- // approximates the result
102
- // prone to inexactitude because of floating point arithmetic
103
- const approximation = Math.round(x / modulo) * modulo;
104
- const approximationString = String(approximation);
105
- // remove useless decimals
106
- const uselessDecimalsInApproximation = numberOfDecimalDigits(approximationString) -
107
- numberOfDecimalDigits(moduloString);
108
- const resultString = approximationString.slice(0, approximationString.length - uselessDecimalsInApproximation);
109
- return Number(resultString);
110
- };
111
- // other functions
112
- export const isInitialAndEmpty = (previousValue, newValue) => {
113
- const isPrevArray = Array.isArray(previousValue);
114
- const isNewArray = Array.isArray(newValue);
115
- return !((isPrevArray ? previousValue.length !== 0 : Boolean(previousValue)) ||
116
- (isNewArray ? newValue.length !== 0 : Boolean(newValue)));
117
- };
1
+ /* eslint-disable no-useless-escape */
2
+ // undefined and null functions
3
+ export const exists = (value) => value !== null && value !== undefined;
4
+ export const hasValue = (value) => exists(value) && (typeof value === 'string' ? !isEmptyString(value) : true);
5
+ // string functions
6
+ export const isEmptyString = (value) => value.trim() === '';
7
+ export const isValidEmail = (value) => {
8
+ const re = /^[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?$/;
9
+ return re.test(String(value).toLowerCase().trim());
10
+ };
11
+ export const isValidUrl = (value) => {
12
+ const pattern =
13
+ // eslint-disable-next-line max-len
14
+ /^((([a-z]+?:\/\/)?(((([a-z0-9]([a-z0-9-]*[a-z0-9])*)\.)+[a-z]{2,})|((([0-9]{1,3}\.){3}[0-9]{1,3}))|(localhost))(\:[0-9]+)?))?((\/[a-zA-Z0-9\-_+=~.,:;%]+)*\/?)((\?|;)[a-zA-Z0-9\-_+~.,:;%]+=[a-zA-Z0-9\-_+~.,:;%]+(((&|;)[a-zA-Z0-9\-_+~.,:;%]+=[a-zA-Z0-9\-_+~.,:;%]+)*))?(#[a-zA-Z0-9\-_+~.,:;%]+(=[a-zA-Z0-9\*\-_+~.,:;%]+)?)?$/;
15
+ return pattern.test(value);
16
+ };
17
+ export const isValidRelativeUrl = (value) => {
18
+ const pattern =
19
+ // eslint-disable-next-line max-len
20
+ /^((([a-z]+?:\/\/)?(((([a-z0-9]([a-z0-9-]*[a-z0-9])*)\.)+[a-z]{2,})|((([0-9]{1,3}\.){3}[0-9]{1,3}))|(localhost))(\:[0-9]+)?)|([a-zA-Z0-9\-_+=~.,:;%]+))?((\/[a-zA-Z0-9\-_+=~.,:;%]+)*\/?)((\?|;)[a-zA-Z0-9\-_+~.,:;%]+=[a-zA-Z0-9\-_+~.,:;%]+(((&|;)[a-zA-Z0-9\-_+~.,:;%]+=[a-zA-Z0-9\-_+~.,:;%]+)*))?(#[a-zA-Z0-9\-_+~.,:;%]+(=[a-zA-Z0-9\*\-_+~.,:;%]+)?)?$/;
21
+ return pattern.test(value);
22
+ };
23
+ export const isValidColor = (value) => {
24
+ value = String(value).toLowerCase();
25
+ // valid values for CSS color property, yet not valid colors by themselves
26
+ if (value === 'currentcolor' ||
27
+ value === 'inherit' ||
28
+ value === 'initial' ||
29
+ value === 'revert' ||
30
+ value === 'unset') {
31
+ return false;
32
+ }
33
+ return CSS.supports('color', value);
34
+ };
35
+ // date functions
36
+ export const isValidDate = (date) => exists(date) ? !isNaN(date.getTime()) : false;
37
+ export const normalizeDate = (value) => {
38
+ if (typeof value === 'string' && value.length > 10) {
39
+ return value.substr(0, 10);
40
+ }
41
+ return value ? value.toString() : null;
42
+ };
43
+ export const addTimezoneOffset = (date) => {
44
+ if (!isValidDate(date)) {
45
+ return date;
46
+ }
47
+ else {
48
+ return new Date(date.getTime() - date.getTimezoneOffset() * 60000);
49
+ }
50
+ };
51
+ // number functions
52
+ export const isValidNumber = (value) => (hasValue(value) ? !Number.isNaN(Number(value)) : false);
53
+ export const numberOfDecimalDigits = (x) => {
54
+ if (isValidNumber(x)) {
55
+ const xString = String(Number(x));
56
+ if (xString === 'Infinity') {
57
+ return 0;
58
+ }
59
+ const indexOfE = xString.indexOf('e');
60
+ if (indexOfE >= 0) {
61
+ return 0;
62
+ }
63
+ const indexOfDecimalPoint = xString.indexOf('.');
64
+ if (indexOfDecimalPoint < 0) {
65
+ return 0;
66
+ }
67
+ else {
68
+ return xString.length - indexOfDecimalPoint - 1;
69
+ }
70
+ }
71
+ return undefined;
72
+ };
73
+ export const numberOfWholeDigits = (x) => {
74
+ if (isValidNumber(x)) {
75
+ let xString = String(Number(x));
76
+ if (xString.indexOf('-') === 0) {
77
+ xString = xString.slice(1, xString.length);
78
+ }
79
+ if (xString === 'Infinity') {
80
+ return Infinity;
81
+ }
82
+ if (xString.indexOf('0') === 0) {
83
+ xString = xString.slice(1, xString.length);
84
+ }
85
+ const indexOfE = xString.indexOf('e');
86
+ if (indexOfE >= 0) {
87
+ return Number(xString.slice(indexOfE + 1, xString.length)) + 1;
88
+ }
89
+ const indexOfDecimalPoint = xString.indexOf('.');
90
+ if (indexOfDecimalPoint < 0) {
91
+ return xString.length;
92
+ }
93
+ else {
94
+ return indexOfDecimalPoint;
95
+ }
96
+ }
97
+ return undefined;
98
+ };
99
+ export const roundToMultipleOf = (x, modulo) => {
100
+ const moduloString = String(modulo);
101
+ // approximates the result
102
+ // prone to inexactitude because of floating point arithmetic
103
+ const approximation = Math.round(x / modulo) * modulo;
104
+ const approximationString = String(approximation);
105
+ // remove useless decimals
106
+ const uselessDecimalsInApproximation = numberOfDecimalDigits(approximationString) -
107
+ numberOfDecimalDigits(moduloString);
108
+ const resultString = approximationString.slice(0, approximationString.length - uselessDecimalsInApproximation);
109
+ return Number(resultString);
110
+ };
111
+ // other functions
112
+ export const isInitialAndEmpty = (previousValue, newValue) => {
113
+ const isPrevArray = Array.isArray(previousValue);
114
+ const isNewArray = Array.isArray(newValue);
115
+ return !((isPrevArray ? previousValue.length !== 0 : Boolean(previousValue)) ||
116
+ (isNewArray ? newValue.length !== 0 : Boolean(newValue)));
117
+ };
118
118
  //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaGVscGVyRm5zLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcHJvamVjdHMvbHV4L3NyYy9saWIvaGVscGVyRm5zLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLHNDQUFzQztBQUN0QywrQkFBK0I7QUFFL0IsTUFBTSxDQUFDLE1BQU0sTUFBTSxHQUFHLENBQUMsS0FBVSxFQUFXLEVBQUUsQ0FDNUMsS0FBSyxLQUFLLElBQUksSUFBSSxLQUFLLEtBQUssU0FBUyxDQUFDO0FBRXhDLE1BQU0sQ0FBQyxNQUFNLFFBQVEsR0FBRyxDQUFDLEtBQVUsRUFBVyxFQUFFLENBQzlDLE1BQU0sQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLE9BQU8sS0FBSyxLQUFLLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDO0FBRTlFLG1CQUFtQjtBQUVuQixNQUFNLENBQUMsTUFBTSxhQUFhLEdBQUcsQ0FBQyxLQUFhLEVBQVcsRUFBRSxDQUFDLEtBQUssQ0FBQyxJQUFJLEVBQUUsS0FBSyxFQUFFLENBQUM7QUFFN0UsTUFBTSxDQUFDLE1BQU0sWUFBWSxHQUFHLENBQUMsS0FBYSxFQUFXLEVBQUU7SUFDckQsTUFBTSxFQUFFLEdBQ04seUlBQXlJLENBQUM7SUFDNUksT0FBTyxFQUFFLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDO0FBQ3JELENBQUMsQ0FBQztBQUVGLE1BQU0sQ0FBQyxNQUFNLFVBQVUsR0FBRyxDQUFDLEtBQWEsRUFBVyxFQUFFO0lBQ25ELE1BQU0sT0FBTztJQUNYLG1DQUFtQztJQUNuQyxvVUFBb1UsQ0FBQztJQUN2VSxPQUFPLE9BQU8sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7QUFDN0IsQ0FBQyxDQUFDO0FBRUYsTUFBTSxDQUFD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Q0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FDekQsQ0FBQztBQUNKLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qIGVzbGludC1kaXNhYmxlIG5vLXVzZWxlc3MtZXNjYXBlICovXHJcbi8vIHVuZGVmaW5lZCBhbmQgbnVsbCBmdW5jdGlvbnNcclxuXHJcbmV4cG9ydCBjb25zdCBleGlzdHMgPSAodmFsdWU6IGFueSk6IGJvb2xlYW4gPT5cclxuICB2YWx1ZSAhPT0gbnVsbCAmJiB2YWx1ZSAhPT0gdW5kZWZpbmVkO1xyXG5cclxuZXhwb3J0IGNvbnN0IGhhc1ZhbHVlID0gKHZhbHVlOiBhbnkpOiBib29sZWFuID0+XHJcbiAgZXhpc3RzKHZhbHVlKSAmJiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJyA/ICFpc0VtcHR5U3RyaW5nKHZhbHVlKSA6IHRydWUpO1xyXG5cclxuLy8gc3RyaW5nIGZ1bmN0aW9uc1xyXG5cclxuZXhwb3J0IGNvbnN0IGlzRW1wdHlTdHJpbmcgPSAodmFsdWU6IHN0cmluZyk6IGJvb2xlYW4gPT4gdmFsdWUudHJpbSgpID09PSAnJztcclxuXHJcbmV4cG9ydCBjb25zdCBpc1ZhbGlkRW1haWwgPSAodmFsdWU6IHN0cmluZyk6IGJvb2xlYW4gPT4ge1xyXG4gIGNvbnN0IHJlID1cclxuICAgIC9eW2EtejAtOSEjJCUmJyorLz0/Xl9ge3x9fi1dKyg/OlxcLlthLXowLTkhIyQlJicqKy89P15fYHt8fX4tXSspKkAoPzpbYS16MC05XSg/OlthLXowLTktXSpbYS16MC05XSk/XFwuKStbYS16MC05XSg/OlthLXowLTktXSpbYS16MC05XSk/JC87XHJcbiAgcmV0dXJuIHJlLnRlc3QoU3RyaW5nKHZhbHVlKS50b0xvd2VyQ2FzZSgpLnRyaW0oKSk7XHJcbn07XHJcblxyXG5leHBvcnQgY29uc3QgaXNWYWxpZFVybCA9ICh2YWx1ZTogc3RyaW5nKTogYm9vbGVhbiA9PiB7XHJcbiAgY29uc3QgcGF0dGVybiA9XHJcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbWF4LWxlblxyXG4gICAgL14oKChbYS16XSs/OlxcL1xcLyk/KCgoKFthLXowLTldKFthLXowLTktXSpbYS16MC05XSkqKVxcLikrW2Etel17Mix9KXwoKChbMC05XXsxLDN9XFwuKXszfVswLTldezEsM30pKXwobG9jYWxob3N0KSkoXFw6WzAtOV0rKT8pKT8oKFxcL1thLXpBLVowLTlcXC1fKz1+Liw6OyVdKykqXFwvPykoKFxcP3w7KVthLXpBLVowLTlcXC1fK34uLDo7JV0rPVthLXpBLVowLTlcXC1fK34uLDo7JV0rKCgoJnw7KVthLXpBLVowLTlcXC1fK34uLDo7JV0rPVthLXpBLVowLTlcXC1fK34uLDo7JV0rKSopKT8oI1thLXpBLVowLTlcXC1fK34uLDo7JV0rKD1bYS16QS1aMC05XFwqXFwtXyt+Liw6OyVdKyk/KT8kLztcclxuICByZXR1cm4gcGF0dGVybi50ZXN0KHZhbHVlKTtcclxufTtcclxuXHJcbmV4cG9ydCBjb25zdCBpc1ZhbGlkUmVsYXRpdmVVcmwgPSAodmFsdWU6IHN0cmluZyk6IGJvb2xlYW4gPT4ge1xyXG4gIGNvbnN0IHBhdHRlcm4gPVxyXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG1heC1sZW5cclxuICAgIC9eKCgoW2Etel0rPzpcXC9cXC8pPygoKChbYS16MC05XShbYS16MC05LV0qW2EtejAtOV0pKilcXC4pK1thLXpdezIsfSl8KCgoWzAtOV17MSwzfVxcLil7M31bMC05XXsxLDN9KSl8KGxvY2FsaG9zdCkpKFxcOlswLTldKyk/KXwoW2EtekEtWjAtOVxcLV8rPX4uLDo7JV0rKSk/KChcXC9bYS16QS1aMC05XFwtXys9fi4sOjslXSspKlxcLz8pKChcXD98OylbYS16QS1aMC05XFwtXyt+Liw6OyVdKz1bYS16QS1aMC05XFwtXyt+Liw6OyVdKygoKCZ8OylbYS16QS1aMC05XFwtXyt+Liw6OyVdKz1bYS16QS1aMC05XFwtXyt+Liw6OyVdKykqKSk/KCNbYS16QS1aMC05XFwtXyt+Liw6OyVdKyg9W2EtekEtWjAtOVxcKlxcLV8rfi4sOjslXSspPyk/JC87XHJcbiAgcmV0dXJuIHBhdHRlcm4udGVzdCh2YWx1ZSk7XHJcbn07XHJcblxyXG5leHBvcnQgY29uc3QgaXNWYWxpZENvbG9yID0gKHZhbHVlOiBzdHJpbmcpOiBib29sZWFuID0+IHtcclxuICB2YWx1ZSA9IFN0cmluZyh2YWx1ZSkudG9Mb3dlckNhc2UoKTtcclxuICAvLyB2YWxpZCB2YWx1ZXMgZm9yIENTUyBjb2xvciBwcm9wZXJ0eSwgeWV0IG5vdCB2YWxpZCBjb2xvcnMgYnkgdGhlbXNlbHZlc1xyXG4gIGlmIChcclxuICAgIHZhbHVlID09PSAnY3VycmVudGNvbG9yJyB8fFxyXG4gICAgdmFsdWUgPT09ICdpbmhlcml0JyB8fFxyXG4gICAgdmFsdWUgPT09ICdpbml0aWFsJyB8fFxyXG4gICAgdmFsdWUgPT09ICdyZXZlcnQnIHx8XHJcbiAgICB2YWx1ZSA9PT0gJ3Vuc2V0J1xyXG4gICkge1xyXG4gICAgcmV0dXJuIGZhbHNlO1xyXG4gIH1cclxuICByZXR1cm4gQ1NTLnN1cHBvcnRzKCdjb2xvcicsIHZhbHVlKTtcclxufTtcclxuXHJcbi8vIGRhdGUgZnVuY3Rpb25zXHJcblxyXG5leHBvcnQgY29uc3QgaXNWYWxpZERhdGUgPSAoZGF0ZTogRGF0ZSk6IGJvb2xlYW4gPT5cclxuICBleGlzdHMoZGF0ZSkgPyAhaXNOYU4oZGF0ZS5nZXRUaW1lKCkpIDogZmFsc2U7XHJcblxyXG5leHBvcnQgY29uc3Qgbm9ybWFsaXplRGF0ZSA9ICh2YWx1ZTogYW55KTogc3RyaW5nID0+IHtcclxuICBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJyAmJiB2YWx1ZS5sZW5ndGggPiAxMCkge1xyXG4gICAgcmV0dXJuIHZhbHVlLnN1YnN0cigwLCAxMCk7XHJcbiAgfVxyXG4gIHJldHVybiB2YWx1ZSA/IHZhbHVlLnRvU3RyaW5nKCkgOiBudWxsO1xyXG59O1xyXG5cclxuZXhwb3J0IGNvbnN0IGFkZFRpbWV6b25lT2Zmc2V0ID0gKGRhdGU6IERhdGUpOiBEYXRlID0+IHtcclxuICBpZiAoIWlzVmFsaWREYXRlKGRhdGUpKSB7XHJcbiAgICByZXR1cm4gZGF0ZTtcclxuICB9IGVsc2Uge1xyXG4gICAgcmV0dXJuIG5ldyBEYXRlKGRhdGUuZ2V0VGltZSgpIC0gZGF0ZS5nZXRUaW1lem9uZU9mZnNldCgpICogNjAwMDApO1xyXG4gIH1cclxufTtcclxuXHJcbi8vIG51bWJlciBmdW5jdGlvbnNcclxuXHJcbmV4cG9ydCBjb25zdCBpc1ZhbGlkTnVtYmVyID0gKFxyXG4gIHZhbHVlOiBzdHJpbmcgfCBudW1iZXIgfCB1bmRlZmluZWQgfCBudWxsXHJcbik6IGJvb2xlYW4gPT4gKGhhc1ZhbHVlKHZhbHVlKSA/ICFOdW1iZXIuaXNOYU4oTnVtYmVyKHZhbHVlKSkgOiBmYWxzZSk7XHJcblxyXG5leHBvcnQgY29uc3QgbnVtYmVyT2ZEZWNpbWFsRGlnaXRzID0gKFxyXG4gIHg6IG51bWJlciB8IHN0cmluZ1xyXG4pOiBudW1iZXIgfCB1bmRlZmluZWQgPT4ge1xyXG4gIGlmIChpc1ZhbGlkTnVtYmVyKHgpKSB7XHJcbiAgICBjb25zdCB4U3RyaW5nID0gU3RyaW5nKE51bWJlcih4KSk7XHJcbiAgICBpZiAoeFN0cmluZyA9PT0gJ0luZmluaXR5Jykge1xyXG4gICAgICByZXR1cm4gMDtcclxuICAgIH1cclxuICAgIGNvbnN0IGluZGV4T2ZFID0geFN0cmluZy5pbmRleE9mKCdlJyk7XHJcbiAgICBpZiAoaW5kZXhPZkUgPj0gMCkge1xyXG4gICAgICByZXR1cm4gMDtcclxuICAgIH1cclxuICAgIGNvbnN0IGluZGV4T2ZEZWNpbWFsUG9pbnQgPSB4U3RyaW5nLmluZGV4T2YoJy4nKTtcclxuICAgIGlmIChpbmRleE9mRGVjaW1hbFBvaW50IDwgMCkge1xyXG4gICAgICByZXR1cm4gMDtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHJldHVybiB4U3RyaW5nLmxlbmd0aCAtIGluZGV4T2ZEZWNpbWFsUG9pbnQgLSAxO1xyXG4gICAgfVxyXG4gIH1cclxuICByZXR1cm4gdW5kZWZpbmVkO1xyXG59O1xyXG5cclxuZXhwb3J0IGNvbnN0IG51bWJlck9mV2hvbGVEaWdpdHMgPSAoeDogbnVtYmVyIHwgc3RyaW5nKTogbnVtYmVyIHwgdW5kZWZpbmVkID0+IHtcclxuICBpZiAoaXNWYWxpZE51bWJlcih4KSkge1xyXG4gICAgbGV0IHhTdHJpbmcgPSBTdHJpbmcoTnVtYmVyKHgpKTtcclxuICAgIGlmICh4U3RyaW5nLmluZGV4T2YoJy0nKSA9PT0gMCkge1xyXG4gICAgICB4U3RyaW5nID0geFN0cmluZy5zbGljZSgxLCB4U3RyaW5nLmxlbmd0aCk7XHJcbiAgICB9XHJcbiAgICBpZiAoeFN0cmluZyA9PT0gJ0luZmluaXR5Jykge1xyXG4gICAgICByZXR1cm4gSW5maW5pdHk7XHJcbiAgICB9XHJcbiAgICBpZiAoeFN0cmluZy5pbmRleE9mKCcwJykgPT09IDApIHtcclxuICAgICAgeFN0cmluZyA9IHhTdHJpbmcuc2xpY2UoMSwgeFN0cmluZy5sZW5ndGgpO1xyXG4gICAgfVxyXG4gICAgY29uc3QgaW5kZXhPZkUgPSB4U3RyaW5nLmluZGV4T2YoJ2UnKTtcclxuICAgIGlmIChpbmRleE9mRSA+PSAwKSB7XHJcbiAgICAgIHJldHVybiBOdW1iZXIoeFN0cmluZy5zbGljZShpbmRleE9mRSArIDEsIHhTdHJpbmcubGVuZ3RoKSkgKyAxO1xyXG4gICAgfVxyXG4gICAgY29uc3QgaW5kZXhPZkRlY2ltYWxQb2ludCA9IHhTdHJpbmcuaW5kZXhPZignLicpO1xyXG4gICAgaWYgKGluZGV4T2ZEZWNpbWFsUG9pbnQgPCAwKSB7XHJcbiAgICAgIHJldHVybiB4U3RyaW5nLmxlbmd0aDtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHJldHVybiBpbmRleE9mRGVjaW1hbFBvaW50O1xyXG4gICAgfVxyXG4gIH1cclxuICByZXR1cm4gdW5kZWZpbmVkO1xyXG59O1xyXG5cclxuZXhwb3J0IGNvbnN0IHJvdW5kVG9NdWx0aXBsZU9mID0gKHg6IG51bWJlciwgbW9kdWxvOiBudW1iZXIpOiBudW1iZXIgPT4ge1xyXG4gIGNvbnN0IG1vZHVsb1N0cmluZyA9IFN0cmluZyhtb2R1bG8pO1xyXG4gIC8vIGFwcHJveGltYXRlcyB0aGUgcmVzdWx0XHJcbiAgLy8gcHJvbmUgdG8gaW5leGFjdGl0dWRlIGJlY2F1c2Ugb2YgZmxvYXRpbmcgcG9pbnQgYXJpdGhtZXRpY1xyXG4gIGNvbnN0IGFwcHJveGltYXRpb24gPSBNYXRoLnJvdW5kKHggLyBtb2R1bG8pICogbW9kdWxvO1xyXG4gIGNvbnN0IGFwcHJveGltYXRpb25TdHJpbmcgPSBTdHJpbmcoYXBwcm94aW1hdGlvbik7XHJcbiAgLy8gcmVtb3ZlIHVzZWxlc3MgZGVjaW1hbHNcclxuICBjb25zdCB1c2VsZXNzRGVjaW1hbHNJbkFwcHJveGltYXRpb24gPVxyXG4gICAgbnVtYmVyT2ZEZWNpbWFsRGlnaXRzKGFwcHJveGltYXRpb25TdHJpbmcpIC1cclxuICAgIG51bWJlck9mRGVjaW1hbERpZ2l0cyhtb2R1bG9TdHJpbmcpO1xyXG4gIGNvbnN0IHJlc3VsdFN0cmluZyA9IGFwcHJveGltYXRpb25TdHJpbmcuc2xpY2UoXHJcbiAgICAwLFxyXG4gICAgYXBwcm94aW1hdGlvblN0cmluZy5sZW5ndGggLSB1c2VsZXNzRGVjaW1hbHNJbkFwcHJveGltYXRpb25cclxuICApO1xyXG4gIHJldHVybiBOdW1iZXIocmVzdWx0U3RyaW5nKTtcclxufTtcclxuXHJcbi8vIG90aGVyIGZ1bmN0aW9uc1xyXG5cclxuZXhwb3J0IGNvbnN0IGlzSW5pdGlhbEFuZEVtcHR5ID0gKFxyXG4gIHByZXZpb3VzVmFsdWU6IGFueSxcclxuICBuZXdWYWx1ZTogYW55XHJcbik6IGJvb2xlYW4gPT4ge1xyXG4gIGNvbnN0IGlzUHJldkFycmF5ID0gQXJyYXkuaXNBcnJheShwcmV2aW91c1ZhbHVlKTtcclxuICBjb25zdCBpc05ld0FycmF5ID0gQXJyYXkuaXNBcnJheShuZXdWYWx1ZSk7XHJcbiAgcmV0dXJuICEoXHJcbiAgICAoaXNQcmV2QXJyYXkgPyBwcmV2aW91c1ZhbHVlLmxlbmd0aCAhPT0gMCA6IEJvb2xlYW4ocHJldmlvdXNWYWx1ZSkpIHx8XHJcbiAgICAoaXNOZXdBcnJheSA/IG5ld1ZhbHVlLmxlbmd0aCAhPT0gMCA6IEJvb2xlYW4obmV3VmFsdWUpKVxyXG4gICk7XHJcbn07XHJcbiJdfQ==