@acorex/core 7.0.41 → 7.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (170) hide show
  1. package/config/index.d.ts +5 -5
  2. package/config/public-api.d.ts +1 -1
  3. package/config/src/configs.d.ts +9 -9
  4. package/dateTime/index.d.ts +5 -5
  5. package/dateTime/public-api.d.ts +5 -5
  6. package/dateTime/src/datetime.class.d.ts +100 -100
  7. package/dateTime/src/datetime.module.d.ts +8 -8
  8. package/dateTime/src/datetime.pipe.d.ts +8 -8
  9. package/dateTime/src/georgian.calendar.d.ts +20 -20
  10. package/dateTime/src/jalali.calendar.d.ts +35 -35
  11. package/{esm2020 → esm2022}/acorex-core.mjs +4 -4
  12. package/{esm2020 → esm2022}/config/acorex-core-config.mjs +4 -4
  13. package/{esm2020 → esm2022}/config/public-api.mjs +1 -1
  14. package/esm2022/config/src/configs.mjs +25 -0
  15. package/{esm2020 → esm2022}/dateTime/acorex-core-dateTime.mjs +4 -4
  16. package/{esm2020 → esm2022}/dateTime/public-api.mjs +5 -5
  17. package/esm2022/dateTime/src/datetime.class.mjs +295 -0
  18. package/esm2022/dateTime/src/datetime.module.mjs +40 -0
  19. package/esm2022/dateTime/src/datetime.pipe.mjs +27 -0
  20. package/esm2022/dateTime/src/georgian.calendar.mjs +187 -0
  21. package/esm2022/dateTime/src/jalali.calendar.mjs +357 -0
  22. package/{esm2020 → esm2022}/events/acorex-core-events.mjs +4 -4
  23. package/{esm2020 → esm2022}/events/public-api.mjs +1 -1
  24. package/esm2022/events/src/event.service.mjs +35 -0
  25. package/{esm2020 → esm2022}/file/acorex-core-file.mjs +4 -4
  26. package/{esm2020 → esm2022}/file/public-api.mjs +4 -4
  27. package/esm2022/file/src/file-download-ref.class.mjs +13 -0
  28. package/esm2022/file/src/file-download-result.class.mjs +47 -0
  29. package/esm2022/file/src/file-upload-ref.class.mjs +13 -0
  30. package/esm2022/file/src/file.service.mjs +103 -0
  31. package/{esm2020 → esm2022}/http/acorex-core-http.mjs +4 -4
  32. package/{esm2020 → esm2022}/http/public-api.mjs +5 -5
  33. package/{esm2020 → esm2022}/http/src/http-error.class.mjs +1 -1
  34. package/{esm2020 → esm2022}/http/src/http-events.interceptor.mjs +2 -2
  35. package/{esm2020 → esm2022}/http/src/http-request.class.mjs +1 -1
  36. package/esm2022/http/src/http-result.class.mjs +25 -0
  37. package/esm2022/http/src/http.module.mjs +30 -0
  38. package/esm2022/http/src/http.service.mjs +152 -0
  39. package/{esm2020 → esm2022}/image/acorex-core-image.mjs +4 -4
  40. package/{esm2020 → esm2022}/image/public-api.mjs +1 -1
  41. package/esm2022/image/src/image.service.mjs +44 -0
  42. package/{esm2020 → esm2022}/pipes/acorex-core-pipes.mjs +4 -4
  43. package/{esm2020 → esm2022}/pipes/public-api.mjs +2 -2
  44. package/esm2022/pipes/src/pipes.module.mjs +20 -0
  45. package/{esm2020 → esm2022}/pipes/src/safe.pipe.mjs +32 -30
  46. package/{esm2020 → esm2022}/platform/acorex-core-platform.mjs +4 -4
  47. package/{esm2020 → esm2022}/platform/public-api.mjs +1 -1
  48. package/esm2022/platform/src/platform.service.mjs +152 -0
  49. package/{esm2020 → esm2022}/public-api.mjs +4 -4
  50. package/{esm2020 → esm2022}/translation/acorex-core-translation.mjs +4 -4
  51. package/{esm2020 → esm2022}/translation/public-api.mjs +3 -3
  52. package/esm2022/translation/src/translation.module.mjs +19 -0
  53. package/esm2022/translation/src/translator.mjs +44 -0
  54. package/esm2022/translation/src/translator.pipe.mjs +16 -0
  55. package/{esm2020 → esm2022}/utils/acorex-core-utils.mjs +4 -4
  56. package/{esm2020 → esm2022}/utils/public-api.mjs +5 -5
  57. package/{esm2020 → esm2022}/utils/src/color-util.mjs +114 -114
  58. package/{esm2020 → esm2022}/utils/src/drawing-util.mjs +29 -29
  59. package/{esm2020 → esm2022}/utils/src/html-util.mjs +15 -15
  60. package/{esm2020 → esm2022}/utils/src/object-util.mjs +38 -38
  61. package/{esm2020 → esm2022}/utils/src/string-util.mjs +18 -18
  62. package/events/index.d.ts +5 -5
  63. package/events/public-api.d.ts +1 -1
  64. package/events/src/event.service.d.ts +9 -9
  65. package/{fesm2015 → fesm2022}/acorex-core-config.mjs +23 -24
  66. package/{fesm2015 → fesm2022}/acorex-core-config.mjs.map +1 -1
  67. package/{fesm2015 → fesm2022}/acorex-core-dateTime.mjs +882 -880
  68. package/{fesm2020 → fesm2022}/acorex-core-dateTime.mjs.map +1 -1
  69. package/{fesm2020 → fesm2022}/acorex-core-events.mjs +32 -35
  70. package/fesm2022/acorex-core-events.mjs.map +1 -0
  71. package/{fesm2020 → fesm2022}/acorex-core-file.mjs +162 -159
  72. package/{fesm2020 → fesm2022}/acorex-core-file.mjs.map +1 -1
  73. package/{fesm2020 → fesm2022}/acorex-core-http.mjs +190 -184
  74. package/{fesm2020 → fesm2022}/acorex-core-http.mjs.map +1 -1
  75. package/{fesm2020 → fesm2022}/acorex-core-image.mjs +41 -42
  76. package/{fesm2020 → fesm2022}/acorex-core-image.mjs.map +1 -1
  77. package/{fesm2015 → fesm2022}/acorex-core-pipes.mjs +41 -41
  78. package/fesm2022/acorex-core-pipes.mjs.map +1 -0
  79. package/{fesm2020 → fesm2022}/acorex-core-platform.mjs +147 -154
  80. package/fesm2022/acorex-core-platform.mjs.map +1 -0
  81. package/{fesm2020 → fesm2022}/acorex-core-translation.mjs +64 -65
  82. package/{fesm2020 → fesm2022}/acorex-core-translation.mjs.map +1 -1
  83. package/{fesm2020 → fesm2022}/acorex-core-utils.mjs +209 -210
  84. package/{fesm2015 → fesm2022}/acorex-core.mjs +5 -6
  85. package/file/index.d.ts +5 -5
  86. package/file/public-api.d.ts +4 -4
  87. package/file/src/file-download-ref.class.d.ts +6 -6
  88. package/file/src/file-download-result.class.d.ts +8 -8
  89. package/file/src/file-upload-ref.class.d.ts +5 -5
  90. package/file/src/file.service.d.ts +18 -18
  91. package/http/index.d.ts +5 -5
  92. package/http/public-api.d.ts +5 -5
  93. package/http/src/http-error.class.d.ts +7 -7
  94. package/http/src/http-events.interceptor.d.ts +10 -10
  95. package/http/src/http-request.class.d.ts +14 -14
  96. package/http/src/http-result.class.d.ts +11 -11
  97. package/http/src/http.module.d.ts +8 -8
  98. package/http/src/http.service.d.ts +23 -23
  99. package/image/index.d.ts +5 -5
  100. package/image/public-api.d.ts +1 -1
  101. package/image/src/image.service.d.ts +12 -12
  102. package/index.d.ts +5 -5
  103. package/package.json +39 -65
  104. package/pipes/index.d.ts +5 -5
  105. package/pipes/public-api.d.ts +2 -2
  106. package/pipes/src/pipes.module.d.ts +8 -8
  107. package/pipes/src/safe.pipe.d.ts +10 -10
  108. package/platform/index.d.ts +5 -5
  109. package/platform/public-api.d.ts +1 -1
  110. package/platform/src/platform.service.d.ts +26 -26
  111. package/public-api.d.ts +1 -1
  112. package/translation/index.d.ts +5 -5
  113. package/translation/public-api.d.ts +3 -3
  114. package/translation/src/translation.module.d.ts +7 -7
  115. package/translation/src/translator.d.ts +11 -11
  116. package/translation/src/translator.pipe.d.ts +7 -7
  117. package/utils/index.d.ts +5 -5
  118. package/utils/public-api.d.ts +5 -5
  119. package/utils/src/color-util.d.ts +23 -23
  120. package/utils/src/drawing-util.d.ts +18 -18
  121. package/utils/src/html-util.d.ts +4 -4
  122. package/utils/src/object-util.d.ts +4 -4
  123. package/utils/src/string-util.d.ts +6 -6
  124. package/esm2020/config/src/configs.mjs +0 -24
  125. package/esm2020/dateTime/src/datetime.class.mjs +0 -288
  126. package/esm2020/dateTime/src/datetime.module.mjs +0 -39
  127. package/esm2020/dateTime/src/datetime.pipe.mjs +0 -26
  128. package/esm2020/dateTime/src/georgian.calendar.mjs +0 -189
  129. package/esm2020/dateTime/src/jalali.calendar.mjs +0 -359
  130. package/esm2020/events/src/event.service.mjs +0 -36
  131. package/esm2020/file/src/file-download-ref.class.mjs +0 -12
  132. package/esm2020/file/src/file-download-result.class.mjs +0 -46
  133. package/esm2020/file/src/file-upload-ref.class.mjs +0 -12
  134. package/esm2020/file/src/file.service.mjs +0 -101
  135. package/esm2020/http/src/http-result.class.mjs +0 -21
  136. package/esm2020/http/src/http.module.mjs +0 -29
  137. package/esm2020/http/src/http.service.mjs +0 -148
  138. package/esm2020/image/src/image.service.mjs +0 -43
  139. package/esm2020/pipes/src/pipes.module.mjs +0 -19
  140. package/esm2020/platform/src/platform.service.mjs +0 -157
  141. package/esm2020/translation/src/translation.module.mjs +0 -18
  142. package/esm2020/translation/src/translator.mjs +0 -43
  143. package/esm2020/translation/src/translator.pipe.mjs +0 -15
  144. package/fesm2015/acorex-core-dateTime.mjs.map +0 -1
  145. package/fesm2015/acorex-core-events.mjs +0 -44
  146. package/fesm2015/acorex-core-events.mjs.map +0 -1
  147. package/fesm2015/acorex-core-file.mjs +0 -176
  148. package/fesm2015/acorex-core-file.mjs.map +0 -1
  149. package/fesm2015/acorex-core-http.mjs +0 -203
  150. package/fesm2015/acorex-core-http.mjs.map +0 -1
  151. package/fesm2015/acorex-core-image.mjs +0 -54
  152. package/fesm2015/acorex-core-image.mjs.map +0 -1
  153. package/fesm2015/acorex-core-pipes.mjs.map +0 -1
  154. package/fesm2015/acorex-core-platform.mjs +0 -165
  155. package/fesm2015/acorex-core-platform.mjs.map +0 -1
  156. package/fesm2015/acorex-core-translation.mjs +0 -81
  157. package/fesm2015/acorex-core-translation.mjs.map +0 -1
  158. package/fesm2015/acorex-core-utils.mjs +0 -227
  159. package/fesm2020/acorex-core-config.mjs +0 -32
  160. package/fesm2020/acorex-core-config.mjs.map +0 -1
  161. package/fesm2020/acorex-core-dateTime.mjs +0 -899
  162. package/fesm2020/acorex-core-events.mjs.map +0 -1
  163. package/fesm2020/acorex-core-pipes.mjs +0 -54
  164. package/fesm2020/acorex-core-pipes.mjs.map +0 -1
  165. package/fesm2020/acorex-core-platform.mjs.map +0 -1
  166. package/fesm2020/acorex-core-utils.mjs.map +0 -1
  167. package/fesm2020/acorex-core.mjs +0 -12
  168. package/fesm2020/acorex-core.mjs.map +0 -1
  169. /package/{fesm2015 → fesm2022}/acorex-core-utils.mjs.map +0 -0
  170. /package/{fesm2015 → fesm2022}/acorex-core.mjs.map +0 -0
@@ -1,189 +0,0 @@
1
- import { AXDateTime } from "./datetime.class";
2
- export class GeorgianCalendar {
3
- constructor() {
4
- this.monthNames = [
5
- "January", "February", "March",
6
- "April", "May", "June", "July",
7
- "August", "September", "October",
8
- "November", "December"
9
- ];
10
- this.monthShortNames = [
11
- "Jan", "Feb", "Mar",
12
- "Apr", "May", "Jun", "Jul",
13
- "Aug", "Sep", "Oct",
14
- "Nov", "Dec"
15
- ];
16
- this.dayNames = [
17
- "Sunday", "Monday", "Tuesday", "Wednesday",
18
- "Thursday", "Friday", "Saturday"
19
- ];
20
- this.dayShortNames = [
21
- "Sun", "Mon", "Tue", "Wed",
22
- "Thu", "Fri", "Sat"
23
- ];
24
- }
25
- create(value) {
26
- return new AXDateTime(new Date(value.year, value.month - 1, value.date, value.hours || 0, value.minutes || 0, value.seconds || 0, value.ms || 0), this.name());
27
- }
28
- name() {
29
- return 'gregorian';
30
- }
31
- dayOfMonth(date) {
32
- return date.getDate();
33
- }
34
- dayOfYear(date) {
35
- let result = 0;
36
- let m = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];
37
- if (this.isLeap(date)) {
38
- m[1] = 29;
39
- }
40
- for (let i = 0; i < date.getMonth(); i++) {
41
- result = result + m[i];
42
- }
43
- result += date.getDate();
44
- return result;
45
- }
46
- dayOfWeek(date) {
47
- return date.getDay() + 1;
48
- }
49
- weekOfYear(date) {
50
- const firstDay = new AXDateTime(date).startOf('year');
51
- return Math.ceil((((date.getTime() - firstDay.date.getTime()) / 86400000) + firstDay.date.getDay() + 1) / 7);
52
- }
53
- year(date) {
54
- return date.getFullYear();
55
- }
56
- monthOfYear(date) {
57
- return date.getMonth() + 1;
58
- }
59
- add(date, unit, amount) {
60
- let value = date.valueOf();
61
- switch (unit) {
62
- case 'second':
63
- value += 1000 * amount;
64
- break;
65
- case 'minute':
66
- value += 60000 * amount;
67
- break;
68
- case 'hour':
69
- value += 3600000 * amount;
70
- break;
71
- case 'month':
72
- const v = new Date(value);
73
- var mo = date.getMonth();
74
- var yr = date.getFullYear();
75
- mo = (mo + amount) % 12;
76
- if (0 > mo) {
77
- yr += (date.getMonth() + amount - mo - 12) / 12;
78
- mo += 12;
79
- }
80
- else
81
- yr += ((date.getMonth() + amount - mo) / 12);
82
- v.setMonth(mo);
83
- v.setFullYear(yr);
84
- value = v.valueOf();
85
- break;
86
- case 'week':
87
- value += 7 * 86400000 * amount;
88
- break;
89
- case 'year':
90
- const yv = new Date(value);
91
- yv.setFullYear(yv.getFullYear() + amount);
92
- value = yv.valueOf();
93
- break;
94
- case 'day':
95
- default:
96
- value += 86400000 * amount;
97
- }
98
- return new AXDateTime(new Date(value), this.name());
99
- }
100
- set(date, unit, value) {
101
- const clone = new Date(date.valueOf());
102
- switch (unit) {
103
- case 'second':
104
- clone.setHours(clone.getHours(), clone.getMinutes(), value, clone.getMilliseconds());
105
- break;
106
- case 'minute':
107
- clone.setHours(clone.getHours(), value, clone.getSeconds(), clone.getMilliseconds());
108
- break;
109
- case 'hour':
110
- clone.setHours(value, clone.getMinutes(), clone.getSeconds(), clone.getMilliseconds());
111
- break;
112
- default:
113
- case 'day':
114
- clone.setDate(value);
115
- break;
116
- case "week":
117
- break;
118
- case "month":
119
- clone.setMonth(Math.max(0, value - 1));
120
- break;
121
- case "year":
122
- clone.setFullYear(value);
123
- break;
124
- }
125
- return new AXDateTime(clone, this.name());
126
- }
127
- startOf(date, unit) {
128
- const clone = new Date(date.valueOf());
129
- switch (unit) {
130
- case 'second':
131
- clone.setHours(clone.getHours(), clone.getMinutes(), clone.getSeconds(), 0);
132
- return new AXDateTime(clone, this.name());
133
- case 'minute':
134
- clone.setHours(clone.getHours(), clone.getMinutes(), 0, 0);
135
- return new AXDateTime(clone, this.name());
136
- case 'hour':
137
- clone.setHours(clone.getHours(), 0, 0, 0);
138
- return new AXDateTime(clone, this.name());
139
- default:
140
- case 'day':
141
- clone.setHours(0, 0, 0, 0);
142
- return new AXDateTime(clone, this.name());
143
- case "week":
144
- const index = 0;
145
- const start = index >= 0 ? index : 0;
146
- const day = clone.getDay();
147
- const diff = clone.getDate() - day + (start > day ? start - 7 : start);
148
- clone.setDate(diff);
149
- return new AXDateTime(clone, this.name()).startOf('day');
150
- case "month":
151
- clone.setDate(1);
152
- return new AXDateTime(clone, this.name()).startOf('day');
153
- case "year":
154
- clone.setMonth(0);
155
- clone.setDate(1);
156
- return new AXDateTime(clone, this.name()).startOf('day');
157
- }
158
- }
159
- endOf(date, unit) {
160
- const clone = new Date(date.valueOf());
161
- switch (unit) {
162
- case 'second':
163
- clone.setHours(clone.getHours(), clone.getMinutes(), clone.getSeconds(), 999);
164
- return new AXDateTime(clone, this.name());
165
- case 'minute':
166
- clone.setHours(clone.getHours(), clone.getMinutes(), 59, 999);
167
- return new AXDateTime(clone, this.name());
168
- case 'hour':
169
- clone.setHours(clone.getHours(), 59, 59, 999);
170
- return new AXDateTime(clone, this.name());
171
- default:
172
- case 'day':
173
- clone.setHours(23, 59, 59, 999);
174
- return new AXDateTime(clone, this.name());
175
- case 'week':
176
- return this.startOf(date, 'week').add('day', 6).endOf('day');
177
- case 'month':
178
- return new AXDateTime(new Date(date.getFullYear(), date.getMonth() + 1, 0), this.name()).endOf('day');
179
- case "year":
180
- clone.setMonth(11);
181
- return new AXDateTime(clone, this.name()).endOf('month');
182
- }
183
- }
184
- isLeap(date) {
185
- let leapYear = new Date(date.getFullYear(), 1, 29);
186
- return leapYear.getDate() == 29;
187
- }
188
- }
189
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2VvcmdpYW4uY2FsZW5kYXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9hY29yZXgvY29yZS9kYXRlVGltZS9zcmMvZ2VvcmdpYW4uY2FsZW5kYXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFjLFVBQVUsRUFBeUIsTUFBTSxrQkFBa0IsQ0FBQztBQUVqRixNQUFNLE9BQU8sZ0JBQWdCO0lBQTdCO1FBRUksZUFBVSxHQUFHO1lBQ1QsU0FBUyxFQUFFLFVBQVUsRUFBRSxPQUFPO1lBQzlCLE9BQU8sRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLE1BQU07WUFDOUIsUUFBUSxFQUFFLFdBQVcsRUFBRSxTQUFTO1lBQ2hDLFVBQVUsRUFBRSxVQUFVO1NBQ3pCLENBQUM7UUFFRixvQkFBZSxHQUFHO1lBQ2QsS0FBSyxFQUFFLEtBQUssRUFBRSxLQUFLO1lBQ25CLEtBQUssRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLEtBQUs7WUFDMUIsS0FBSyxFQUFFLEtBQUssRUFBRSxLQUFLO1lBQ25CLEtBQUssRUFBRSxLQUFLO1NBQ2YsQ0FBQztRQUVGLGFBQVEsR0FBRztZQUNQLFFBQVEsRUFBRSxRQUFRLEVBQUUsU0FBUyxFQUFFLFdBQVc7WUFDMUMsVUFBVSxFQUFFLFFBQVEsRUFBRSxVQUFVO1NBQ25DLENBQUM7UUFFRixrQkFBYSxHQUFHO1lBQ1osS0FBSyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsS0FBSztZQUMxQixLQUFLLEVBQUUsS0FBSyxFQUFFLEtBQUs7U0FDdEIsQ0FBQztJQWtMTixDQUFDO0lBL0tHLE1BQU0sQ0FBQyxLQUFrQjtRQUNyQixPQUFPLElBQUksVUFBVSxDQUFDLElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLEVBQUUsS0FBSyxDQUFDLEtBQUssR0FBRyxDQUFDLEVBQUUsS0FBSyxDQUFDLElBQUksRUFBRSxLQUFLLENBQUMsS0FBSyxJQUFJLENB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LENBQUM7WUFDMUcsS0FBSyxNQUFNO2dCQUNQLEtBQUssQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDLENBQUM7Z0JBQ25CLE9BQU8sSUFBSSxVQUFVLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQztTQUNoRTtJQUNMLENBQUM7SUFFRCxNQUFNLENBQUMsSUFBVTtRQUNiLElBQUksUUFBUSxHQUFHLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFDbkQsT0FBTyxRQUFRLENBQUMsT0FBTyxFQUFFLElBQUksRUFBRSxDQUFDO0lBQ3BDLENBQUM7Q0FDSiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEFYQ2FsZW5kYXIsIEFYRGF0ZVRpbWUsIEFYRGF0ZVZhbHVlLCBUaW1lVW5pdCB9IGZyb20gXCIuL2RhdGV0aW1lLmNsYXNzXCI7XHJcblxyXG5leHBvcnQgY2xhc3MgR2VvcmdpYW5DYWxlbmRhciBpbXBsZW1lbnRzIEFYQ2FsZW5kYXIge1xyXG5cclxuICAgIG1vbnRoTmFtZXMgPSBbXHJcbiAgICAgICAgXCJKYW51YXJ5XCIsIFwiRmVicnVhcnlcIiwgXCJNYXJjaFwiLFxyXG4gICAgICAgIFwiQXByaWxcIiwgXCJNYXlcIiwgXCJKdW5lXCIsIFwiSnVseVwiLFxyXG4gICAgICAgIFwiQXVndXN0XCIsIFwiU2VwdGVtYmVyXCIsIFwiT2N0b2JlclwiLFxyXG4gICAgICAgIFwiTm92ZW1iZXJcIiwgXCJEZWNlbWJlclwiXHJcbiAgICBdO1xyXG5cclxuICAgIG1vbnRoU2hvcnROYW1lcyA9IFtcclxuICAgICAgICBcIkphblwiLCBcIkZlYlwiLCBcIk1hclwiLFxyXG4gICAgICAgIFwiQXByXCIsIFwiTWF5XCIsIFwiSnVuXCIsIFwiSnVsXCIsXHJcbiAgICAgICAgXCJBdWdcIiwgXCJTZXBcIiwgXCJPY3RcIixcclxuICAgICAgICBcIk5vdlwiLCBcIkRlY1wiXHJcbiAgICBdO1xyXG5cclxuICAgIGRheU5hbWVzID0gW1xyXG4gICAgICAgIFwiU3VuZGF5XCIsIFwiTW9uZGF5XCIsIFwiVHVlc2RheVwiLCBcIldlZG5lc2RheVwiLFxyXG4gICAgICAgIFwiVGh1cnNkYXlcIiwgXCJGcmlkYXlcIiwgXCJTYXR1cmRheVwiXHJcbiAgICBdO1xyXG5cclxuICAgIGRheVNob3J0TmFtZXMgPSBbXHJcbiAgICAgICAgXCJTdW5cIiwgXCJNb25cIiwgXCJUdWVcIiwgXCJXZWRcIixcclxuICAgICAgICBcIlRodVwiLCBcIkZyaVwiLCBcIlNhdFwiXHJcbiAgICBdO1xyXG5cclxuXHJcbiAgICBjcmVhdGUodmFsdWU6IEFYRGF0ZVZhbHVlKTogQVhEYXRlVGltZSB7XHJcbiAgICAgICAgcmV0dXJuIG5ldyBBWERhdGVUaW1lKG5ldyBEYXRlKHZhbHVlLnllYXIsIHZhbHVlLm1vbnRoIC0gMSwgdmFsdWUuZGF0ZSwgdmFsdWUuaG91cnMgfHwgMCwgdmFsdWUubWludXRlcyB8fCAwLCB2YWx1ZS5zZWNvbmRzIHx8IDAsIHZhbHVlLm1zIHx8IDApLCB0aGlzLm5hbWUoKSk7XHJcbiAgICB9XHJcblxyXG4gICAgbmFtZSgpOiBzdHJpbmcge1xyXG4gICAgICAgIHJldHVybiAnZ3JlZ29yaWFuJ1xyXG4gICAgfVxyXG5cclxuICAgIGRheU9mTW9udGgoZGF0ZTogRGF0ZSk6IG51bWJlciB7XHJcbiAgICAgICAgcmV0dXJuIGRhdGUuZ2V0RGF0ZSgpO1xyXG4gICAgfVxyXG5cclxuICAgIGRheU9mWWVhcihkYXRlOiBEYXRlKTogbnVtYmVyIHtcclxuICAgICAgICBsZXQgcmVzdWx0ID0gMDtcclxuICAgICAgICBsZXQgbSA9IFszMSwgMjgsIDMxLCAzMCwgMzEsIDMwLCAzMSwgMzEsIDMwLCAzMSwgMzAsIDMxXTtcclxuICAgICAgICBpZiAodGhpcy5pc0xlYXAoZGF0ZSkpIHtcclxuICAgICAgICAgICAgbVsxXSA9IDI5O1xyXG4gICAgICAgIH1cclxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGRhdGUuZ2V0TW9udGgoKTsgaSsrKSB7XHJcbiAgICAgICAgICAgIHJlc3VsdCA9IHJlc3VsdCArIG1baV07XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJlc3VsdCArPSBkYXRlLmdldERhdGUoKTtcclxuICAgICAgICByZXR1cm4gcmVzdWx0O1xyXG4gICAgfVxyXG5cclxuICAgIGRheU9mV2VlayhkYXRlOiBEYXRlKTogbnVtYmVyIHtcclxuICAgICAgICByZXR1cm4gZGF0ZS5nZXREYXkoKSArIDE7XHJcbiAgICB9XHJcblxyXG4gICAgd2Vla09mWWVhcihkYXRlOiBEYXRlKTogbnVtYmVyIHtcclxuICAgICAgICBjb25zdCBmaXJzdERheSA9IG5ldyBBWERhdGVUaW1lKGRhdGUpLnN0YXJ0T2YoJ3llYXInKTtcclxuICAgICAgICByZXR1cm4gTWF0aC5jZWlsKCgoKGRhdGUuZ2V0VGltZSgpIC0gZmlyc3REYXkuZGF0ZS5nZXRUaW1lKCkpIC8gODY0MDAwMDApICsgZmlyc3REYXkuZGF0ZS5nZXREYXkoKSArIDEpIC8gNyk7XHJcbiAgICB9XHJcblxyXG4gICAgeWVhcihkYXRlOiBEYXRlKTogbnVtYmVyIHtcclxuICAgICAgICByZXR1cm4gZGF0ZS5nZXRGdWxsWWVhcigpO1xyXG4gICAgfVxyXG5cclxuICAgIG1vbnRoT2ZZZWFyKGRhdGU6IERhdGUpOiBudW1iZXIge1xyXG4gICAgICAgIHJldHVybiBkYXRlLmdldE1vbnRoKCkgKyAxO1xyXG4gICAgfVxyXG5cclxuICAgIGFkZChkYXRlOiBEYXRlLCB1bml0OiBUaW1lVW5pdCwgYW1vdW50OiBudW1iZXIpOiBBWERhdGVUaW1lIHtcclxuICAgICAgICBsZXQgdmFsdWUgPSBkYXRlLnZhbHVlT2YoKTtcclxuICAgICAgICBzd2l0Y2ggKHVuaXQpIHtcclxuICAgICAgICAgICAgY2FzZSAnc2Vjb25kJzpcclxuICAgICAgICAgICAgICAgIHZhbHVlICs9IDEwMDAgKiBhbW91bnQ7XHJcbiAgICAgICAgICAgICAgICBicmVha1xyXG4gICAgICAgICAgICBjYXNlICdtaW51dGUnOlxyXG4gICAgICAgICAgICAgICAgdmFsdWUgKz0gNjAwMDAgKiBhbW91bnQ7XHJcbiAgICAgICAgICAgICAgICBicmVha1xyXG4gICAgICAgICAgICBjYXNlICdob3VyJzpcclxuICAgICAgICAgICAgICAgIHZhbHVlICs9IDM2MDAwMDAgKiBhbW91bnQ7XHJcbiAgICAgICAgICAgICAgICBicmVha1xyXG4gICAgICAgICAgICBjYXNlICdtb250aCc6XHJcbiAgICAgICAgICAgICAgICBjb25zdCB2ID0gbmV3IERhdGUodmFsdWUpO1xyXG4gICAgICAgICAgICAgICAgdmFyIG1vID0gZGF0ZS5nZXRNb250aCgpO1xyXG4gICAgICAgICAgICAgICAgdmFyIHlyID0gZGF0ZS5nZXRGdWxsWWVhcigpO1xyXG4gICAgICAgICAgICAgICAgbW8gPSAobW8gKyBhbW91bnQpICUgMTI7XHJcbiAgICAgICAgICAgICAgICBpZiAoMCA+IG1vKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgeXIgKz0gKGRhdGUuZ2V0TW9udGgoKSArIGFtb3VudCAtIG1vIC0gMTIpIC8gMTI7XHJcbiAgICAgICAgICAgICAgICAgICAgbW8gKz0gMTI7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgICAgICAgICAgeXIgKz0gKChkYXRlLmdldE1vbnRoKCkgKyBhbW91bnQgLSBtbykgLyAxMik7XHJcbiAgICAgICAgICAgICAgICB2LnNldE1vbnRoKG1vKTtcclxuICAgICAgICAgICAgICAgIHYuc2V0RnVsbFllYXIoeXIpO1xyXG4gICAgICAgICAgICAgICAgdmFsdWUgPSB2LnZhbHVlT2YoKTtcclxuICAgICAgICAgICAgICAgIGJyZWFrXHJcbiAgICAgICAgICAgIGNhc2UgJ3dlZWsnOlxyXG4gICAgICAgICAgICAgICAgdmFsdWUgKz0gNyAqIDg2NDAwMDAwICogYW1vdW50O1xyXG4gICAgICAgICAgICAgICAgYnJlYWtcclxuICAgICAgICAgICAgY2FzZSAneWVhcic6XHJcbiAgICAgICAgICAgICAgICBjb25zdCB5diA9IG5ldyBEYXRlKHZhbHVlKTtcclxuICAgICAgICAgICAgICAgIHl2LnNldEZ1bGxZZWFyKHl2LmdldEZ1bGxZZWFyKCkgKyBhbW91bnQpO1xyXG4gICAgICAgICAgICAgICAgdmFsdWUgPSB5di52YWx1ZU9mKCk7XHJcbiAgICAgICAgICAgICAgICBicmVha1xyXG4gICAgICAgICAgICBjYXNlICdkYXknOlxyXG4gICAgICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgICAgICAgdmFsdWUgKz0gODY0MDAwMDAgKiBhbW91bnQ7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBuZXcgQVhEYXRlVGltZShuZXcgRGF0ZSh2YWx1ZSksIHRoaXMubmFtZSgpKTtcclxuICAgIH1cclxuXHJcbiAgICBzZXQoZGF0ZTogRGF0ZSwgdW5pdDogVGltZVVuaXQsIHZhbHVlOiBudW1iZXIpOiBBWERhdGVUaW1lIHtcclxuICAgICAgICBjb25zdCBjbG9uZSA9IG5ldyBEYXRlKGRhdGUudmFsdWVPZigpKTtcclxuICAgICAgICBzd2l0Y2ggKHVuaXQpIHtcclxuICAgICAgICAgICAgY2FzZSAnc2Vjb25kJzpcclxuICAgICAgICAgICAgICAgIGNsb25lLnNldEhvdXJzKGNsb25lLmdldEhvdXJzKCksIGNsb25lLmdldE1pbnV0ZXMoKSwgdmFsdWUsIGNsb25lLmdldE1pbGxpc2Vjb25kcygpKTtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICBjYXNlICdtaW51dGUnOlxyXG4gICAgICAgICAgICAgICAgY2xvbmUuc2V0SG91cnMoY2xvbmUuZ2V0SG91cnMoKSwgdmFsdWUsIGNsb25lLmdldFNlY29uZHMoKSwgY2xvbmUuZ2V0TWlsbGlzZWNvbmRzKCkpO1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIGNhc2UgJ2hvdXInOlxyXG4gICAgICAgICAgICAgICAgY2xvbmUuc2V0SG91cnModmFsdWUsIGNsb25lLmdldE1pbnV0ZXMoKSwgY2xvbmUuZ2V0U2Vjb25kcygpLCBjbG9uZS5nZXRNaWxsaXNlY29uZHMoKSk7XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgICAgY2FzZSAnZGF5JzpcclxuICAgICAgICAgICAgICAgIGNsb25lLnNldERhdGUodmFsdWUpO1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIGNhc2UgXCJ3ZWVrXCI6XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgY2FzZSBcIm1vbnRoXCI6XHJcbiAgICAgICAgICAgICAgICBjbG9uZS5zZXRNb250aChNYXRoLm1heCgwLCB2YWx1ZSAtIDEpKTtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICBjYXNlIFwieWVhclwiOlxyXG4gICAgICAgICAgICAgICAgY2xvbmUuc2V0RnVsbFllYXIodmFsdWUpO1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBuZXcgQVhEYXRlVGltZShjbG9uZSwgdGhpcy5uYW1lKCkpO1xyXG4gICAgfVxyXG5cclxuICAgIHN0YXJ0T2YoZGF0ZTogRGF0ZSwgdW5pdDogVGltZVVuaXQpOiBBWERhdGVUaW1lIHtcclxuICAgICAgICBjb25zdCBjbG9uZSA9IG5ldyBEYXRlKGRhdGUudmFsdWVPZigpKTtcclxuICAgICAgICBzd2l0Y2ggKHVuaXQpIHtcclxuICAgICAgICAgICAgY2FzZSAnc2Vjb25kJzpcclxuICAgICAgICAgICAgICAgIGNsb25lLnNldEhvdXJzKGNsb25lLmdldEhvdXJzKCksIGNsb25lLmdldE1pbnV0ZXMoKSwgY2xvbmUuZ2V0U2Vjb25kcygpLCAwKTtcclxuICAgICAgICAgICAgICAgIHJldHVybiBuZXcgQVhEYXRlVGltZShjbG9uZSwgdGhpcy5uYW1lKCkpO1xyXG4gICAgICAgICAgICBjYXNlICdtaW51dGUnOlxyXG4gICAgICAgICAgICAgICAgY2xvbmUuc2V0SG91cnMoY2xvbmUuZ2V0SG91cnMoKSwgY2xvbmUuZ2V0TWludXRlcygpLCAwLCAwKTtcclxuICAgICAgICAgICAgICAgIHJldHVybiBuZXcgQVhEYXRlVGltZShjbG9uZSwgdGhpcy5uYW1lKCkpO1xyXG4gICAgICAgICAgICBjYXNlICdob3VyJzpcclxuICAgICAgICAgICAgICAgIGNsb25lLnNldEhvdXJzKGNsb25lLmdldEhvdXJzKCksIDAsIDAsIDApO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBBWERhdGVUaW1lKGNsb25lLCB0aGlzLm5hbWUoKSk7XHJcbiAgICAgICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICAgIGNhc2UgJ2RheSc6XHJcbiAgICAgICAgICAgICAgICBjbG9uZS5zZXRIb3VycygwLCAwLCAwLCAwKTtcclxuICAgICAgICAgICAgICAgIHJldHVybiBuZXcgQVhEYXRlVGltZShjbG9uZSwgdGhpcy5uYW1lKCkpO1xyXG4gICAgICAgICAgICBjYXNlIFwid2Vla1wiOlxyXG4gICAgICAgICAgICAgICAgY29uc3QgaW5kZXggPSAwO1xyXG4gICAgICAgICAgICAgICAgY29uc3Qgc3RhcnQgPSBpbmRleCA+PSAwID8gaW5kZXggOiAwO1xyXG4gICAgICAgICAgICAgICAgY29uc3QgZGF5ID0gY2xvbmUuZ2V0RGF5KCk7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBkaWZmID0gY2xvbmUuZ2V0RGF0ZSgpIC0gZGF5ICsgKHN0YXJ0ID4gZGF5ID8gc3RhcnQgLSA3IDogc3RhcnQpO1xyXG4gICAgICAgICAgICAgICAgY2xvbmUuc2V0RGF0ZShkaWZmKTtcclxuICAgICAgICAgICAgICAgIHJldHVybiBuZXcgQVhEYXRlVGltZShjbG9uZSwgdGhpcy5uYW1lKCkpLnN0YXJ0T2YoJ2RheScpO1xyXG4gICAgICAgICAgICBjYXNlIFwibW9udGhcIjpcclxuICAgICAgICAgICAgICAgIGNsb25lLnNldERhdGUoMSlcclxuICAgICAgICAgICAgICAgIHJldHVybiBuZXcgQVhEYXRlVGltZShjbG9uZSwgdGhpcy5uYW1lKCkpLnN0YXJ0T2YoJ2RheScpO1xyXG4gICAgICAgICAgICBjYXNlIFwieWVhclwiOlxyXG4gICAgICAgICAgICAgICAgY2xvbmUuc2V0TW9udGgoMCk7XHJcbiAgICAgICAgICAgICAgICBjbG9uZS5zZXREYXRlKDEpO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBBWERhdGVUaW1lKGNsb25lLCB0aGlzLm5hbWUoKSkuc3RhcnRPZignZGF5Jyk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGVuZE9mKGRhdGU6IERhdGUsIHVuaXQ6IFRpbWVVbml0KTogQVhEYXRlVGltZSB7XHJcbiAgICAgICAgY29uc3QgY2xvbmUgPSBuZXcgRGF0ZShkYXRlLnZhbHVlT2YoKSk7XHJcbiAgICAgICAgc3dpdGNoICh1bml0KSB7XHJcbiAgICAgICAgICAgIGNhc2UgJ3NlY29uZCc6XHJcbiAgICAgICAgICAgICAgICBjbG9uZS5zZXRIb3VycyhjbG9uZS5nZXRIb3VycygpLCBjbG9uZS5nZXRNaW51dGVzKCksIGNsb25lLmdldFNlY29uZHMoKSwgOTk5KTtcclxuICAgICAgICAgICAgICAgIHJldHVybiBuZXcgQVhEYXRlVGltZShjbG9uZSwgdGhpcy5uYW1lKCkpO1xyXG4gICAgICAgICAgICBjYXNlICdtaW51dGUnOlxyXG4gICAgICAgICAgICAgICAgY2xvbmUuc2V0SG91cnMoY2xvbmUuZ2V0SG91cnMoKSwgY2xvbmUuZ2V0TWludXRlcygpLCA1OSwgOTk5KTtcclxuICAgICAgICAgICAgICAgIHJldHVybiBuZXcgQVhEYXRlVGltZShjbG9uZSwgdGhpcy5uYW1lKCkpO1xyXG4gICAgICAgICAgICBjYXNlICdob3VyJzpcclxuICAgICAgICAgICAgICAgIGNsb25lLnNldEhvdXJzKGNsb25lLmdldEhvdXJzKCksIDU5LCA1OSwgOTk5KTtcclxuICAgICAgICAgICAgICAgIHJldHVybiBuZXcgQVhEYXRlVGltZShjbG9uZSwgdGhpcy5uYW1lKCkpO1xyXG4gICAgICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgICBjYXNlICdkYXknOlxyXG4gICAgICAgICAgICAgICAgY2xvbmUuc2V0SG91cnMoMjMsIDU5LCA1OSwgOTk5KTtcclxuICAgICAgICAgICAgICAgIHJldHVybiBuZXcgQVhEYXRlVGltZShjbG9uZSwgdGhpcy5uYW1lKCkpO1xyXG4gICAgICAgICAgICBjYXNlICd3ZWVrJzpcclxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnN0YXJ0T2YoZGF0ZSwgJ3dlZWsnKS5hZGQoJ2RheScsIDYpLmVuZE9mKCdkYXknKTtcclxuICAgICAgICAgICAgY2FzZSAnbW9udGgnOlxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBBWERhdGVUaW1lKG5ldyBEYXRlKGRhdGUuZ2V0RnVsbFllYXIoKSwgZGF0ZS5nZXRNb250aCgpICsgMSwgMCksIHRoaXMubmFtZSgpKS5lbmRPZignZGF5Jyk7XHJcbiAgICAgICAgICAgIGNhc2UgXCJ5ZWFyXCI6XHJcbiAgICAgICAgICAgICAgICBjbG9uZS5zZXRNb250aCgxMSk7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEFYRGF0ZVRpbWUoY2xvbmUsIHRoaXMubmFtZSgpKS5lbmRPZignbW9udGgnKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgaXNMZWFwKGRhdGU6IERhdGUpIHtcclxuICAgICAgICBsZXQgbGVhcFllYXIgPSBuZXcgRGF0ZShkYXRlLmdldEZ1bGxZZWFyKCksIDEsIDI5KTtcclxuICAgICAgICByZXR1cm4gbGVhcFllYXIuZ2V0RGF0ZSgpID09IDI5O1xyXG4gICAgfVxyXG59Il19