@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
@@ -0,0 +1,295 @@
1
+ import * as _ from 'lodash';
2
+ import { AXConfig } from '@acorex/core/config';
3
+ // @dynamic
4
+ export class AXDateTime {
5
+ static convert(value, calendar = AXConfig.get('dateTime.calendar')) {
6
+ let date;
7
+ if (typeof value === 'string' || value instanceof String) {
8
+ date = new AXDateTime(value, calendar);
9
+ }
10
+ else if (value instanceof Date) {
11
+ date = new AXDateTime(value, calendar);
12
+ }
13
+ else if (value instanceof AXDateTime) {
14
+ date = new AXDateTime(value.date, calendar);
15
+ }
16
+ return date;
17
+ }
18
+ static from(value = {
19
+ calendar: AXConfig.get('dateTime.calendar'),
20
+ year: 1,
21
+ month: 1,
22
+ date: 1,
23
+ hours: 0,
24
+ minutes: 0,
25
+ seconds: 0,
26
+ ms: 0
27
+ }) {
28
+ return AXDateTime.resolveCalendar(value.calendar).create(value);
29
+ }
30
+ static resolveCalendar(calendar) {
31
+ return typeof calendar == 'string'
32
+ ? AXConfig.get(`dateTime.calendars.${calendar}.class`)
33
+ : calendar;
34
+ }
35
+ _date;
36
+ get date() {
37
+ return this._date;
38
+ }
39
+ _calendar;
40
+ get calendar() {
41
+ return this._calendar;
42
+ }
43
+ constructor(value = new Date(), calendar = AXConfig.get(`dateTime.calendar`)) {
44
+ this._calendar = AXDateTime.resolveCalendar(calendar);
45
+ if (value instanceof Date) {
46
+ this._date = value;
47
+ }
48
+ else {
49
+ //TODO: parse jalali
50
+ this._date = new Date(value);
51
+ }
52
+ }
53
+ clone() {
54
+ return new AXDateTime(this.date, this.calendar);
55
+ }
56
+ get dayOfMonth() {
57
+ return this._calendar.dayOfMonth(this.date);
58
+ }
59
+ get dayOfYear() {
60
+ return this._calendar.dayOfYear(this.date);
61
+ }
62
+ get dayOfWeek() {
63
+ return this._calendar.dayOfWeek(this.date);
64
+ }
65
+ get hour() {
66
+ return this._date.getHours();
67
+ }
68
+ get minute() {
69
+ return this._date.getMinutes();
70
+ }
71
+ get second() {
72
+ return this._date.getSeconds();
73
+ }
74
+ get year() {
75
+ return this._calendar.year(this.date);
76
+ }
77
+ get monthOfYear() {
78
+ return this._calendar.monthOfYear(this.date);
79
+ }
80
+ get weekOfYear() {
81
+ return this._calendar.weekOfYear(this.date);
82
+ }
83
+ get month() {
84
+ return new AXCalendarMonth(this);
85
+ }
86
+ add(unit, amount) {
87
+ return this._calendar.add(this.date, unit, amount);
88
+ }
89
+ set(unit = 'day', value) {
90
+ return this._calendar.set(this.date, unit, value);
91
+ }
92
+ duration(end, unit = 'day') {
93
+ const range = new AXDateTimeRange(this, AXDateTime.convert(end, this.calendar.name()));
94
+ return range.duration();
95
+ }
96
+ startOf(unit = 'day') {
97
+ return this._calendar.startOf(this.date, unit);
98
+ }
99
+ endOf(unit = 'day') {
100
+ return this._calendar.endOf(this.date, unit);
101
+ }
102
+ _formatKeys = {
103
+ ss: () => this.pad(this.date.getSeconds(), 2),
104
+ s: () => this.date.getSeconds().toString(),
105
+ //
106
+ dd: () => this.pad(this.calendar.dayOfMonth(this.date), 2),
107
+ d: () => this.calendar.dayOfMonth(this.date).toString(),
108
+ //
109
+ mm: () => this.pad(this.date.getMinutes(), 2),
110
+ m: () => this.date.getMinutes().toString(),
111
+ //
112
+ MMMM: () => this.calendar.monthNames[this.calendar.monthOfYear(this.date) - 1],
113
+ MMM: () => this.calendar.monthShortNames[this.calendar.monthOfYear(this.date) - 1],
114
+ MM: () => this.pad(this.calendar.monthOfYear(this.date), 2),
115
+ //
116
+ DDDD: () => this.calendar.dayNames[this.calendar.dayOfWeek(this.date) - 1],
117
+ DDD: () => this.calendar.dayShortNames[this.calendar.dayOfWeek(this.date) - 1],
118
+ //
119
+ yyyy: () => this.calendar.year(this.date).toString(),
120
+ YYYY: () => this.calendar.year(this.date).toString(),
121
+ yy: () => this.calendar.year(this.date).toString().substring(2),
122
+ YY: () => this.calendar.year(this.date).toString().substring(2),
123
+ //
124
+ HH: () => this.pad(this.date.getHours(), 2),
125
+ H: () => this.date.getHours().toString(),
126
+ //
127
+ hh: () => this.pad((this.date.getHours() % 12 || 12), 2),
128
+ h: () => (this.date.getHours() % 12 || 12).toString(),
129
+ //
130
+ A: () => (this.date.getHours() < 12) ? 'am' : 'pm',
131
+ a: () => (this.date.getHours() < 12) ? 'am' : 'pm',
132
+ };
133
+ format(format = AXConfig.get('dateTime.shortDateFormat')) {
134
+ const re = new RegExp(_.orderBy(Object.keys(this._formatKeys), c => c.length, ['desc']).join("|"), "gi");
135
+ return format.replace(re, (matched) => {
136
+ return this._formatKeys[matched]();
137
+ });
138
+ }
139
+ pad(n, width, z = '0') {
140
+ n = n + '';
141
+ return n.length >= width ? n : new Array(width - n.length + 1).join(z) + n;
142
+ }
143
+ toString(format = AXConfig.get('dateTime.shortDateFormat')) {
144
+ return this.format(format);
145
+ }
146
+ equal(value, unit = 'day') {
147
+ return this.compare(value, unit) == 0;
148
+ }
149
+ compare(value, unit = 'day') {
150
+ const val = AXDateTime.convert(value, this.calendar.name());
151
+ const func = (v1, v2) => {
152
+ if (v1 == v2) {
153
+ return 0;
154
+ }
155
+ else if (v1 > v2) {
156
+ return 1;
157
+ }
158
+ else {
159
+ return -1;
160
+ }
161
+ };
162
+ let p = 0;
163
+ switch (unit) {
164
+ case 'year':
165
+ return func(this.year, val.year);
166
+ case 'week':
167
+ p = this.compare(val, 'year');
168
+ return p == 0 ? func(this.weekOfYear, val.weekOfYear) : p;
169
+ case 'month':
170
+ p = this.compare(val, 'year');
171
+ return p == 0 ? func(this.monthOfYear, val.monthOfYear) : p;
172
+ case 'day':
173
+ p = this.compare(val, 'year');
174
+ return p == 0 ? func(this.dayOfYear, val.dayOfYear) : p;
175
+ case 'hour':
176
+ p = this.compare(val, 'day');
177
+ return p == 0 ? func(this.hour, val.hour) : p;
178
+ case 'minute':
179
+ p = this.compare(val, 'hour');
180
+ return p == 0 ? func(this.minute, val.minute) : p;
181
+ case 'second':
182
+ p = this.compare(val, 'minute');
183
+ return p == 0 ? func(this.second, val.second) : p;
184
+ default:
185
+ return func(this.date.getTime(), val.date.getTime());
186
+ }
187
+ }
188
+ convert(calendar) {
189
+ return AXDateTime.convert(this, calendar);
190
+ }
191
+ }
192
+ export class AXCalendarMonth {
193
+ _range;
194
+ get range() {
195
+ return this._range;
196
+ }
197
+ set range(v) {
198
+ this._range = v;
199
+ }
200
+ constructor(date) {
201
+ this.index = date.date.getMonth();
202
+ this.name = date.format('MMMM');
203
+ this.range = new AXDateTimeRange(new AXDateTime(date.startOf('month').date, date.calendar), new AXDateTime(date.endOf('month').date, date.calendar));
204
+ }
205
+ index;
206
+ name;
207
+ }
208
+ export class AXDateTimeRange {
209
+ _startTime;
210
+ _endTime;
211
+ get startTime() {
212
+ return this._startTime;
213
+ }
214
+ get endTime() {
215
+ return this._endTime;
216
+ }
217
+ constructor(startTime, endTime) {
218
+ this._startTime = startTime;
219
+ this._endTime = endTime;
220
+ }
221
+ duration() {
222
+ const result = {
223
+ miliseconds: 0,
224
+ seconds: 0,
225
+ minutes: 0,
226
+ hours: 0,
227
+ days: 0,
228
+ months: 0,
229
+ years: 0,
230
+ total: {
231
+ miliseconds: 0,
232
+ seconds: 0,
233
+ minutes: 0,
234
+ hours: 0,
235
+ days: 0,
236
+ weeks: 0,
237
+ months: 0,
238
+ years: 0,
239
+ },
240
+ };
241
+ const one_second = 1000;
242
+ const one_min = one_second * 60;
243
+ const one_hour = one_min * 60;
244
+ const one_day = one_hour * 24;
245
+ const one_week = one_day * 7;
246
+ const one_year = 365.25 * one_day;
247
+ const one_month = one_year / 12;
248
+ const startTime = this._startTime.date.getTime();
249
+ const endTime = this._endTime.date.getTime();
250
+ const diff = Math.abs(endTime - startTime);
251
+ //
252
+ result.total.miliseconds = diff;
253
+ result.total.seconds = Number((diff / one_second).toFixed(2));
254
+ result.total.minutes = Number((diff / one_min).toFixed(2));
255
+ result.total.hours = Number((diff / one_hour).toFixed(2));
256
+ result.total.days = Number((diff / one_day).toFixed(2));
257
+ result.total.weeks = Number((diff / one_week).toFixed(2));
258
+ //
259
+ // let months = (this.endTime.year - this.startTime.year) * 12;
260
+ // months += this.endTime.monthOfYear - this.startTime.monthOfYear + 1;
261
+ // if (this.endTime.dayOfYear < this.startTime.dayOfYear) {
262
+ // months--;
263
+ // }
264
+ // result.total.months = Math.abs(months);
265
+ // TODO: review
266
+ result.total.months = Number((diff / one_month).toFixed(2));
267
+ result.total.years = Number((diff / one_year).toFixed(2));
268
+ //
269
+ result.miliseconds = result.total.miliseconds % 1000;
270
+ result.seconds = Number((result.total.seconds % 60).toFixed(0));
271
+ result.minutes = Number((result.total.minutes % 60).toFixed(0));
272
+ result.hours = Number((result.total.hours % 24).toFixed(0));
273
+ // TODO: review
274
+ result.days = Number((result.total.days % 30.4).toFixed(0));
275
+ result.months = Number((result.total.months % 12).toFixed(0));
276
+ result.years = Number(result.total.years.toFixed(0));
277
+ return result;
278
+ }
279
+ enumurate(unit = 'day', amount = 1) {
280
+ const result = [];
281
+ let item = this._startTime.clone();
282
+ while (item.compare(this._endTime, unit) < 1) {
283
+ if (!result.some(c => c.equal(item, unit))) {
284
+ result.push(item);
285
+ }
286
+ item = item.add(unit, amount);
287
+ }
288
+ return result;
289
+ }
290
+ includes(value, unit = 'day') {
291
+ // TODO: ??
292
+ return true;
293
+ }
294
+ }
295
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0ZXRpbWUuY2xhc3MuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9hY29yZXgvY29yZS9kYXRlVGltZS9zcmMvZGF0ZXRpbWUuY2xhc3MudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxLQUFLLENBQUMsTUFBTSxRQUFRLENBQUM7QUFDNUIsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBa0UvQyxXQUFXO0FBQ1gsTUFBTSxPQUFPLFVBQVU7SUFDckIsTUFBTSxDQUFDLE9BQU8sQ0FDWixLQUFpQyxFQUNqQyxXQUFtQixRQUFRLENBQUMsR0FBRyxDQUFDLG1CQUFtQixDQUFDO1FBRXBELElBQUksSUFBZ0IsQ0FBQztRQUNyQixJQUFJLE9BQU8sS0FBSyxLQUFLLFFBQVEsSUFBSSxLQUFLLFlBQVksTUFBTSxFQUFFO1lBQ3hELElBQUksR0FBRyxJQUFJLFVBQVUsQ0FBQyxLQUFlLEVBQUUsUUFBUSxDQUFDLENBQUM7U0FDbEQ7YUFBTSxJQUFJLEtBQUssWUFBWSxJQUFJLEVBQUU7WUFDaEMsSUFBSSxHQUFHLElBQUksVUFBVSxDQUFDLEtBQWEsRUFBRSxRQUFRLENBQUMsQ0FBQztTQUNoRDthQUFNLElBQUksS0FBSyxZQUFZLFVBQVUsRUFBRTtZQUN0QyxJQUFJLEdBQUcsSUFBSSxVQUFVLENBQUMsS0FBSyxDQUFDLElBQUksRUFBRSxRQUFRLENBQUMsQ0FBQztTQUM3QztRQUNELE9BQU8sSUFBSyxDQUFDO0lBQ2YsQ0FBQztJQUVELE1BQU0sQ0FBQyxJQUFJLENBQUMsUUFBcUI7UUFDL0IsUUFBUSxFQUFFLFFBQVEsQ0FBQyxHQUFHLENBQUMsbUJBQW1CLENBQUM7UUFDM0MsSUFBSSxFQUFFLENBQUM7UUFDUCxLQUFLLEVBQUUsQ0FBQztRQUNSLElBQUksRUFBRSxDQUFDO1FBQ1AsS0FBSyxFQUFFLENBQUM7UUFDUixPQUFPLEVBQUUsQ0FBQztRQUNWLE9B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VUFBVSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxRQUFRLEVBQUU7UUFDdkQsRUFBRTtRQUNGLEVBQUUsRUFBRSxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVSxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBQzdDLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDLFFBQVEsRUFBRTtRQUMxQyxFQUFFO1FBQ0YsSUFBSSxFQUFFLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDOUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDbEYsRUFBRSxFQUFFLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUMzRCxFQUFFO1FBQ0YsSUFBSSxFQUFFLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDMUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDOUUsRUFBRTtRQUNGLElBQUksRUFBRSxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsUUFBUSxFQUFFO1FBQ3BELElBQUksRUFBRSxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsUUFBUSxFQUFFO1FBQ3BELEVBQUUsRUFBRSxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsUUFBUSxFQUFFLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQztRQUMvRCxFQUFFLEVBQUUsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLFFBQVEsRUFBRSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUM7UUFDL0QsRUFBRTtRQUNGLEVBQUUsRUFBRSxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBQzNDLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDLFFBQVEsRUFBRTtRQUN4QyxFQUFFO1FBQ0YsRUFBRSxFQUFFLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxHQUFHLEVBQUUsSUFBSSxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDeEQsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUMsUUFBUSxFQUFFO1FBQ3JELEVBQUU7UUFDRixDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFD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LENBQUM7SUFDaEIsQ0FBQztJQUVELFNBQVMsQ0FBQyxPQUFpQixLQUFLLEVBQUUsU0FBaUIsQ0FBQztRQUNsRCxNQUFNLE1BQU0sR0FBaUIsRUFBRSxDQUFDO1FBQ2hDLElBQUksSUFBSSxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsS0FBSyxFQUFFLENBQUM7UUFDbkMsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFO1lBQzVDLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLENBQUMsRUFBRTtnQkFDMUMsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQzthQUNuQjtZQUNELElBQUksR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksRUFBRSxNQUFNLENBQUMsQ0FBQTtTQUM5QjtRQUNELE9BQU8sTUFBTSxDQUFDO0lBQ2hCLENBQUM7SUFFRCxRQUFRLENBQUMsS0FBaUIsRUFBRSxPQUFpQixLQUFLO1FBQ2hELFdBQVc7UUFDWCxPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7Q0FZRiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIF8gZnJvbSAnbG9kYXNoJztcclxuaW1wb3J0IHsgQVhDb25maWcgfSBmcm9tICdAYWNvcmV4L2NvcmUvY29uZmlnJztcclxuXHJcbmV4cG9ydCB0eXBlIFRpbWVVbml0ID1cclxuICB8ICdtcydcclxuICB8ICdzZWNvbmQnXHJcbiAgfCAnbWludXRlJ1xyXG4gIHwgJ2hvdXInXHJcbiAgfCAnZGF5J1xyXG4gIHwgJ21vbnRoJ1xyXG4gIHwgJ3llYXInXHJcbiAgfCAnd2Vlayc7XHJcblxyXG5cclxuXHJcblxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBBWERhdGVWYWx1ZSB7XHJcbiAgeWVhcjogbnVtYmVyLFxyXG4gIG1vbnRoOiBudW1iZXIsXHJcbiAgZGF0ZTogbnVtYmVyLFxyXG4gIGhvdXJzPzogbnVtYmVyLFxyXG4gIG1pbnV0ZXM/OiBudW1iZXIsXHJcbiAgc2Vjb25kcz86IG51bWJlcixcclxuICBtcz86IG51bWJlclxyXG4gIGNhbGVuZGFyOiBzdHJpbmc7XHJcbn1cclxuXHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIEFYQ2FsZW5kYXIge1xyXG4gIG1vbnRoTmFtZXM6IHN0cmluZ1tdO1xyXG5cclxuICBtb250aFNob3J0TmFtZXM6IHN0cmluZ1tdO1xyXG5cclxuICBkYXlOYW1lczogc3RyaW5nW107XHJcblxyXG4gIGRheVNob3J0TmFtZXM6IHN0cmluZ1tdO1xyXG5cclxuICBuYW1lKCk6IHN0cmluZztcclxuXHJcbiAgZGF5T2ZNb250aChkYXRlOiBEYXRlKTogbnVtYmVyO1xyXG5cclxuICBkYXlPZlllYXIoZGF0ZTogRGF0ZSk6IG51bWJlcjtcclxuXHJcbiAgZGF5T2ZXZWVrKGRhdGU6IERhdGUpOiBudW1iZXI7XHJcblxyXG4gIG1vbnRoT2ZZZWFyKGRhdGU6IERhdGUpOiBudW1iZXI7XHJcblxyXG4gIHdlZWtPZlllYXIoZGF0ZTogRGF0ZSk6IG51bWJlcjtcclxuXHJcbiAgeWVhcihkYXRlOiBEYXRlKTogbnVtYmVyO1xyXG5cclxuICBhZGQoZGF0ZTogRGF0ZSwgdW5pdDogVGltZVVuaXQsIGFtb3VudDogbnVtYmVyKTogQVhEYXRlVGltZTtcclxuXHJcbiAgc2V0KGRhdGU6IERhdGUsIHVuaXQ6IFRpbWVVbml0LCB2YWx1ZTogbnVtYmVyKTogQVhEYXRlVGltZTtcclxuXHJcbiAgc3RhcnRPZihkYXRlOiBEYXRlLCB1bml0OiBUaW1lVW5pdCk6IEFYRGF0ZVRpbWU7XHJcblxyXG4gIGVuZE9mKGRhdGU6IERhdGUsIHVuaXQ6IFRpbWVVbml0KTogQVhEYXRlVGltZTtcclxuXHJcbiAgY3JlYXRlKHZhbHVlOiBBWERhdGVWYWx1ZSk6IEFYRGF0ZVRpbWU7XHJcbiAgXHJcbn1cclxuXHJcblxyXG5cclxuXHJcbi8vIEBkeW5hbWljXHJcbmV4cG9ydCBjbGFzcyBBWERhdGVUaW1lIHtcclxuICBzdGF0aWMgY29udmVydChcclxuICAgIHZhbHVlOiBEYXRlIHwgQVhEYXRlVGltZSB8IHN0cmluZyxcclxuICAgIGNhbGVuZGFyOiBzdHJpbmcgPSBBWENvbmZpZy5nZXQoJ2RhdGVUaW1lLmNhbGVuZGFyJylcclxuICApOiBBWERhdGVUaW1lIHtcclxuICAgIGxldCBkYXRlOiBBWERhdGVUaW1lO1xyXG4gICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycgfHwgdmFsdWUgaW5zdGFuY2VvZiBTdHJpbmcpIHtcclxuICAgICAgZGF0ZSA9IG5ldyBBWERhdGVUaW1lKHZhbHVlIGFzIHN0cmluZywgY2FsZW5kYXIpO1xyXG4gICAgfSBlbHNlIGlmICh2YWx1ZSBpbnN0YW5jZW9mIERhdGUpIHtcclxuICAgICAgZGF0ZSA9IG5ldyBBWERhdGVUaW1lKHZhbHVlIGFzIERhdGUsIGNhbGVuZGFyKTtcclxuICAgIH0gZWxzZSBpZiAodmFsdWUgaW5zdGFuY2VvZiBBWERhdGVUaW1lKSB7XHJcbiAgICAgIGRhdGUgPSBuZXcgQVhEYXRlVGltZSh2YWx1ZS5kYXRlLCBjYWxlbmRhcik7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gZGF0ZSE7XHJcbiAgfVxyXG5cclxuICBzdGF0aWMgZnJvbSh2YWx1ZTogQVhEYXRlVmFsdWUgPSB7XHJcbiAgICBjYWxlbmRhcjogQVhDb25maWcuZ2V0KCdkYXRlVGltZS5jYWxlbmRhcicpLFxyXG4gICAgeWVhcjogMSxcclxuICAgIG1vbnRoOiAxLFxyXG4gICAgZGF0ZTogMSxcclxuICAgIGhvdXJzOiAwLFxyXG4gICAgbWludXRlczogMCxcclxuICAgIHNlY29uZHM6IDAsXHJcbiAgICBtczogMFxyXG4gIH0pOiBBWERhdGVUaW1lIHtcclxuICAgIHJldHVybiBBWERhdGVUaW1lLnJlc29sdmVDYWxlbmRhcih2YWx1ZS5jYWxlbmRhcikuY3JlYXRlKHZhbHVlKTtcclxuICB9XHJcblxyXG5cclxuICBzdGF0aWMgcmVzb2x2ZUNhbGVuZGFyKGNhbGVuZGFyOiBzdHJpbmcgfCBBWENhbGVuZGFyKTogQVhDYWxlbmRhciB7XHJcbiAgICByZXR1cm4gdHlwZW9mIGNhbGVuZGFyID09ICdzdHJpbmcnXHJcbiAgICAgID8gQVhDb25maWcuZ2V0KGBkYXRlVGltZS5jYWxlbmRhcnMuJHtjYWxlbmRhcn0uY2xhc3NgKVxyXG4gICAgICA6IGNhbGVuZGFyO1xyXG4gIH1cclxuXHJcblxyXG4gIHByaXZhdGUgX2RhdGU6IERhdGU7XHJcblxyXG4gIGdldCBkYXRlKCk6IERhdGUge1xyXG4gICAgcmV0dXJuIHRoaXMuX2RhdGU7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF9jYWxlbmRhcjogQVhDYWxlbmRhcjtcclxuICBnZXQgY2FsZW5kYXIoKTogQVhDYWxlbmRhciB7XHJcbiAgICByZXR1cm4gdGhpcy5fY2FsZW5kYXI7XHJcbiAgfVxyXG5cclxuXHJcblxyXG4gIGNvbnN0cnVjdG9yKFxyXG4gICAgdmFsdWU6IERhdGUgfCBzdHJpbmcgPSBuZXcgRGF0ZSgpLFxyXG4gICAgY2FsZW5kYXI6IHN0cmluZyB8IEFYQ2FsZW5kYXIgPSBBWENvbmZpZy5nZXQoYGRhdGVUaW1lLmNhbGVuZGFyYClcclxuICApIHtcclxuICAgIHRoaXMuX2NhbGVuZGFyID0gQVhEYXRlVGltZS5yZXNvbHZlQ2FsZW5kYXIoY2FsZW5kYXIpO1xyXG4gICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgRGF0ZSkge1xyXG4gICAgICB0aGlzLl9kYXRlID0gdmFsdWUgYXMgRGF0ZTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIC8vVE9ETzogcGFyc2UgamFsYWxpXHJcbiAgICAgIHRoaXMuX2RhdGUgPSBuZXcgRGF0ZSh2YWx1ZSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBjbG9uZSgpOiBBWERhdGVUaW1lIHtcclxuICAgIHJldHVybiBuZXcgQVhEYXRlVGltZSh0aGlzLmRhdGUsIHRoaXMuY2FsZW5kYXIpO1xyXG4gIH1cclxuXHJcbiAgZ2V0IGRheU9mTW9udGgoKTogbnVtYmVyIHtcclxuICAgIHJldHVybiB0aGlzLl9jYWxlbmRhci5kYXlPZk1vbnRoKHRoaXMuZGF0ZSk7XHJcbiAgfVxyXG5cclxuICBnZXQgZGF5T2ZZZWFyKCk6IG51bWJlciB7XHJcbiAgICByZXR1cm4gdGhpcy5fY2FsZW5kYXIuZGF5T2ZZZWFyKHRoaXMuZGF0ZSk7XHJcbiAgfVxyXG5cclxuICBnZXQgZGF5T2ZXZWVrKCk6IG51bWJlciB7XHJcbiAgICByZXR1cm4gdGhpcy5fY2FsZW5kYXIuZGF5T2ZXZWVrKHRoaXMuZGF0ZSk7XHJcbiAgfVxyXG5cclxuICBnZXQgaG91cigpOiBudW1iZXIge1xyXG4gICAgcmV0dXJuIHRoaXMuX2RhdGUuZ2V0SG91cnMoKTtcclxuICB9XHJcblxyXG4gIGdldCBtaW51dGUoKTogbnVtYmVyIHtcclxuICAgIHJldHVybiB0aGlzLl9kYXRlLmdldE1pbnV0ZXMoKTtcclxuICB9XHJcblxyXG4gIGdldCBzZWNvbmQoKTogbnVtYmVyIHtcclxuICAgIHJldHVybiB0aGlzLl9kYXRlLmdldFNlY29uZHMoKTtcclxuICB9XHJcblxyXG4gIGdldCB5ZWFyKCk6IG51bWJlciB7XHJcbiAgICByZXR1cm4gdGhpcy5fY2FsZW5kYXIueWVhcih0aGlzLmRhdGUpO1xyXG4gIH1cclxuXHJcbiAgZ2V0IG1vbnRoT2ZZZWFyKCk6IG51bWJlciB7XHJcbiAgICByZXR1cm4gdGhpcy5fY2FsZW5kYXIubW9udGhPZlllYXIodGhpcy5kYXRlKTtcclxuICB9XHJcblxyXG4gIGdldCB3ZWVrT2ZZZWFyKCk6IG51bWJlciB7XHJcbiAgICByZXR1cm4gdGhpcy5fY2FsZW5kYXIud2Vla09mWWVhcih0aGlzLmRhdGUpO1xyXG4gIH1cclxuXHJcbiAgZ2V0IG1vbnRoKCk6IEFYQ2FsZW5kYXJNb250aCB7XHJcbiAgICByZXR1cm4gbmV3IEFYQ2FsZW5kYXJNb250aCh0aGlzKTtcclxuICB9XHJcblxyXG4gIGFkZCh1bml0OiBUaW1lVW5pdCwgYW1vdW50OiBudW1iZXIpOiBBWERhdGVUaW1lIHtcclxuICAgIHJldHVybiB0aGlzLl9jYWxlbmRhci5hZGQodGhpcy5kYXRlLCB1bml0LCBhbW91bnQpO1xyXG4gIH1cclxuXHJcbiAgc2V0KHVuaXQ6IFRpbWVVbml0ID0gJ2RheScsIHZhbHVlOiBudW1iZXIpOiBBWERhdGVUaW1lIHtcclxuICAgIHJldHVybiB0aGlzLl9jYWxlbmRhci5zZXQodGhpcy5kYXRlLCB1bml0LCB2YWx1ZSk7XHJcbiAgfVxyXG5cclxuICBkdXJhdGlvbihcclxuICAgIGVuZDogRGF0ZSB8IEFYRGF0ZVRpbWUsXHJcbiAgICB1bml0OiBUaW1lVW5pdCA9ICdkYXknXHJcbiAgKTogQVhUaW1lU3BhbiB7XHJcbiAgICBjb25zdCByYW5nZSA9IG5ldyBBWERhdGVUaW1lUmFuZ2UoXHJcbiAgICAgIHRoaXMsXHJcbiAgICAgIEFYRGF0ZVRpbWUuY29udmVydChlbmQsIHRoaXMuY2FsZW5kYXIubmFtZSgpKVxyXG4gICAgKTtcclxuICAgIHJldHVybiByYW5nZS5kdXJhdGlvbigpO1xyXG4gIH1cclxuXHJcbiAgc3RhcnRPZih1bml0OiBUaW1lVW5pdCA9ICdkYXknKTogQVhEYXRlVGltZSB7XHJcbiAgICByZXR1cm4gdGhpcy5fY2FsZW5kYXIuc3RhcnRPZih0aGlzLmRhdGUsIHVuaXQpO1xyXG4gIH1cclxuXHJcbiAgZW5kT2YodW5pdDogVGltZVVuaXQgPSAnZGF5Jyk6IEFYRGF0ZVRpbWUge1xyXG4gICAgcmV0dXJuIHRoaXMuX2NhbGVuZGFyLmVuZE9mKHRoaXMuZGF0ZSwgdW5pdCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF9mb3JtYXRLZXlzID0ge1xyXG4gICAgc3M6ICgpID0+IHRoaXMucGFkKHRoaXMuZGF0ZS5nZXRTZWNvbmRzKCksIDIpLFxyXG4gICAgczogKCkgPT4gdGhpcy5kYXRlLmdldFNlY29uZHMoKS50b1N0cmluZygpLFxyXG4gICAgLy9cclxuICAgIGRkOiAoKSA9PiB0aGlzLnBhZCh0aGlzLmNhbGVuZGFyLmRheU9mTW9udGgodGhpcy5kYXRlKSwgMiksXHJcbiAgICBkOiAoKSA9PiB0aGlzLmNhbGVuZGFyLmRheU9mTW9udGgodGhpcy5kYXRlKS50b1N0cmluZygpLFxyXG4gICAgLy9cclxuICAgIG1tOiAoKSA9PiB0aGlzLnBhZCh0aGlzLmRhdGUuZ2V0TWludXRlcygpLCAyKSxcclxuICAgIG06ICgpID0+IHRoaXMuZGF0ZS5nZXRNaW51dGVzKCkudG9TdHJpbmcoKSxcclxuICAgIC8vXHJcbiAgICBNTU1NOiAoKSA9PiB0aGlzLmNhbGVuZGFyLm1vbnRoTmFtZXNbdGhpcy5jYWxlbmRhci5tb250aE9mWWVhcih0aGlzLmRhdGUpIC0gMV0sXHJcbiAgICBNTU06ICgpID0+IHRoaXMuY2FsZW5kYXIubW9udGhTaG9ydE5hbWVzW3RoaXMuY2FsZW5kYXIubW9udGhPZlllYXIodGhpcy5kYXRlKSAtIDFdLFxyXG4gICAgTU06ICgpID0+IHRoaXMucGFkKHRoaXMuY2FsZW5kYXIubW9udGhPZlllYXIodGhpcy5kYXRlKSwgMiksXHJcbiAgICAvL1xyXG4gICAgRERERDogKCkgPT4gdGhpcy5jYWxlbmRhci5kYXlOYW1lc1t0aGlzLmNhbGVuZGFyLmRheU9mV2Vlayh0aGlzLmRhdGUpIC0gMV0sXHJcbiAgICBEREQ6ICgpID0+IHRoaXMuY2FsZW5kYXIuZGF5U2hvcnROYW1lc1t0aGlzLmNhbGVuZGFyLmRheU9mV2Vlayh0aGlzLmRhdGUpIC0gMV0sXHJcbiAgICAvL1xyXG4gICAgeXl5eTogKCkgPT4gdGhpcy5jYWxlbmRhci55ZWFyKHRoaXMuZGF0ZSkudG9TdHJpbmcoKSxcclxuICAgIFlZWVk6ICgpID0+IHRoaXMuY2FsZW5kYXIueWVhcih0aGlzLmRhdGUpLnRvU3RyaW5nKCksXHJcbiAgICB5eTogKCkgPT4gdGhpcy5jYWxlbmRhci55ZWFyKHRoaXMuZGF0ZSkudG9TdHJpbmcoKS5zdWJzdHJpbmcoMiksXHJcbiAgICBZWTogKCkgPT4gdGhpcy5jYWxlbmRhci55ZWFyKHRoaXMuZGF0ZSkudG9TdHJpbmcoKS5zdWJzdHJpbmcoMiksXHJcbiAgICAvL1xyXG4gICAgSEg6ICgpID0+IHRoaXMucGFkKHRoaXMuZGF0ZS5nZXRIb3VycygpLCAyKSxcclxuICAgIEg6ICgpID0+IHRoaXMuZGF0ZS5nZXRIb3VycygpLnRvU3RyaW5nKCksXHJcbiAgICAvL1xyXG4gICAgaGg6ICgpID0+IHRoaXMucGFkKCh0aGlzLmRhdGUuZ2V0SG91cnMoKSAlIDEyIHx8IDEyKSwgMiksXHJcbiAgICBoOiAoKSA9PiAodGhpcy5kYXRlLmdldEhvdXJzKCkgJSAxMiB8fCAxMikudG9TdHJpbmcoKSxcclxuICAgIC8vXHJcbiAgICBBOiAoKSA9PiAodGhpcy5kYXRlLmdldEhvdXJzKCkgPCAxMikgPyAnYW0nIDogJ3BtJyxcclxuICAgIGE6ICgpID0+ICh0aGlzLmRhdGUuZ2V0SG91cnMoKSA8IDEyKSA/ICdhbScgOiAncG0nLFxyXG4gIH07XHJcblxyXG4gIGZvcm1hdChcclxuICAgIGZvcm1hdDogc3RyaW5nID0gQVhDb25maWcuZ2V0KCdkYXRlVGltZS5zaG9ydERhdGVGb3JtYXQnKVxyXG4gICk6IHN0cmluZyB7XHJcbiAgICBjb25zdCByZSA9IG5ldyBSZWdFeHAoXy5vcmRlckJ5KE9iamVjdC5rZXlzKHRoaXMuX2Zvcm1hdEtleXMpLCBjID0+IGMubGVuZ3RoLCBbJ2Rlc2MnXSkuam9pbihcInxcIiksIFwiZ2lcIik7XHJcbiAgICByZXR1cm4gZm9ybWF0LnJlcGxhY2UocmUsIChtYXRjaGVkKSA9PiB7XHJcbiAgICAgIHJldHVybiB0aGlzLl9mb3JtYXRLZXlzW21hdGNoZWRdKCk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgcGFkKG4sIHdpZHRoLCB6ID0gJzAnKSB7XHJcbiAgICBuID0gbiArICcnO1xyXG4gICAgcmV0dXJuIG4ubGVuZ3RoID49IHdpZHRoID8gbiA6IG5ldyBBcnJheSh3aWR0aCAtIG4ubGVuZ3RoICsgMSkuam9pbih6KSArIG47XHJcbiAgfVxyXG5cclxuICB0b1N0cmluZyhmb3JtYXQ6IHN0cmluZyA9IEFYQ29uZmlnLmdldCgnZGF0ZVRpbWUuc2hvcnREYXRlRm9ybWF0JykpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIHRoaXMuZm9ybWF0KGZvcm1hdCk7XHJcbiAgfVxyXG5cclxuICBlcXVhbCh2YWx1ZTogRGF0ZSB8IEFYRGF0ZVRpbWUsIHVuaXQ6IFRpbWVVbml0ID0gJ2RheScpIHtcclxuICAgIHJldHVybiB0aGlzLmNvbXBhcmUodmFsdWUsIHVuaXQpID09IDA7XHJcbiAgfVxyXG5cclxuICBjb21wYXJlKHZhbHVlOiBEYXRlIHwgQVhEYXRlVGltZSwgdW5pdDogVGltZVVuaXQgPSAnZGF5Jykge1xyXG4gICAgY29uc3QgdmFsID0gQVhEYXRlVGltZS5jb252ZXJ0KHZhbHVlLCB0aGlzLmNhbGVuZGFyLm5hbWUoKSk7XHJcbiAgICBjb25zdCBmdW5jID0gKHYxOiBudW1iZXIsIHYyOiBudW1iZXIpID0+IHtcclxuICAgICAgaWYgKHYxID09IHYyKSB7XHJcbiAgICAgICAgcmV0dXJuIDA7XHJcbiAgICAgIH0gZWxzZSBpZiAodjEgPiB2Mikge1xyXG4gICAgICAgIHJldHVybiAxO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHJldHVybiAtMTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgbGV0IHAgPSAwO1xyXG4gICAgc3dpdGNoICh1bml0KSB7XHJcbiAgICAgIGNhc2UgJ3llYXInOlxyXG4gICAgICAgIHJldHVybiBmdW5jKHRoaXMueWVhciwgdmFsLnllYXIpO1xyXG4gICAgICBjYXNlICd3ZWVrJzpcclxuICAgICAgICBwID0gdGhpcy5jb21wYXJlKHZhbCwgJ3llYXInKTtcclxuICAgICAgICByZXR1cm4gcCA9PSAwID8gZnVuYyh0aGlzLndlZWtPZlllYXIsIHZhbC53ZWVrT2ZZZWFyKSA6IHA7XHJcbiAgICAgIGNhc2UgJ21vbnRoJzpcclxuICAgICAgICBwID0gdGhpcy5jb21wYXJlKHZhbCwgJ3llYXInKTtcclxuICAgICAgICByZXR1cm4gcCA9PSAwID8gZnVuYyh0aGlzLm1vbnRoT2ZZZWFyLCB2YWwubW9udGhPZlllYXIpIDogcDtcclxuICAgICAgY2FzZSAnZGF5JzpcclxuICAgICAgICBwID0gdGhpcy5jb21wYXJlKHZhbCwgJ3llYXInKTtcclxuICAgICAgICByZXR1cm4gcCA9PSAwID8gZnVuYyh0aGlzLmRheU9mWWVhciwgdmFsLmRheU9mWWVhcikgOiBwO1xyXG4gICAgICBjYXNlICdob3VyJzpcclxuICAgICAgICBwID0gdGhpcy5jb21wYXJlKHZhbCwgJ2RheScpO1xyXG4gICAgICAgIHJldHVybiBwID09IDAgPyBmdW5jKHRoaXMuaG91ciwgdmFsLmhvdXIpIDogcDtcclxuICAgICAgY2FzZSAnbWludXRlJzpcclxuICAgICAgICBwID0gdGhpcy5jb21wYXJlKHZhbCwgJ2hvdXInKTtcclxuICAgICAgICByZXR1cm4gcCA9PSAwID8gZnVuYyh0aGlzLm1pbnV0ZSwgdmFsLm1pbnV0ZSkgOiBwO1xyXG4gICAgICBjYXNlICdzZWNvbmQnOlxyXG4gICAgICAgIHAgPSB0aGlzLmNvbXBhcmUodmFsLCAnbWludXRlJyk7XHJcbiAgICAgICAgcmV0dXJuIHAgPT0gMCA/IGZ1bmModGhpcy5zZWNvbmQsIHZhbC5zZWNvbmQpIDogcDtcclxuICAgICAgZGVmYXVsdDpcclxuICAgICAgICByZXR1cm4gZnVuYyh0aGlzLmRhdGUuZ2V0VGltZSgpLCB2YWwuZGF0ZS5nZXRUaW1lKCkpO1xyXG4gICAgfVxyXG5cclxuICB9XHJcblxyXG4gIGNvbnZlcnQoY2FsZW5kYXI6IHN0cmluZykge1xyXG4gICAgcmV0dXJuIEFYRGF0ZVRpbWUuY29udmVydCh0aGlzLCBjYWxlbmRhcik7XHJcbiAgfVxyXG59XHJcblxyXG5leHBvcnQgY2xhc3MgQVhDYWxlbmRhck1vbnRoIHtcclxuICBwcml2YXRlIF9yYW5nZTogQVhEYXRlVGltZVJhbmdlO1xyXG4gIHB1YmxpYyBnZXQgcmFuZ2UoKTogQVhEYXRlVGltZVJhbmdlIHtcclxuICAgIHJldHVybiB0aGlzLl9yYW5nZTtcclxuICB9XHJcbiAgcHVibGljIHNldCByYW5nZSh2OiBBWERhdGVUaW1lUmFuZ2UpIHtcclxuICAgIHRoaXMuX3JhbmdlID0gdjtcclxuICB9XHJcblxyXG4gIGNvbnN0cnVjdG9yKGRhdGU6IEFYRGF0ZVRpbWUpIHtcclxuICAgIHRoaXMuaW5kZXggPSBkYXRlLmRhdGUuZ2V0TW9udGgoKTtcclxuICAgIHRoaXMubmFtZSA9IGRhdGUuZm9ybWF0KCdNTU1NJyk7XHJcbiAgICB0aGlzLnJhbmdlID0gbmV3IEFYRGF0ZVRpbWVSYW5nZShcclxuICAgICAgbmV3IEFYRGF0ZVRpbWUoZGF0ZS5zdGFydE9mKCdtb250aCcpLmRhdGUsIGRhdGUuY2FsZW5kYXIpLFxyXG4gICAgICBuZXcgQVhEYXRlVGltZShkYXRlLmVuZE9mKCdtb250aCcpLmRhdGUsIGRhdGUuY2FsZW5kYXIpXHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSByZWFkb25seSBpbmRleDogbnVtYmVyO1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgbmFtZTogc3RyaW5nO1xyXG59XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIEFYVGltZVNwYW5Ub3RhbCB7XHJcbiAgbWlsaXNlY29uZHM6IG51bWJlcjtcclxuICBzZWNvbmRzOiBudW1iZXI7XHJcbiAgbWludXRlczogbnVtYmVyO1xyXG4gIGhvdXJzOiBudW1iZXI7XHJcbiAgZGF5czogbnVtYmVyO1xyXG4gIHdlZWtzOiBudW1iZXI7XHJcbiAgbW9udGhzOiBudW1iZXI7XHJcbiAgeWVhcnM6IG51bWJlcjtcclxufVxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBBWFRpbWVTcGFuIHtcclxuICBtaWxpc2Vjb25kczogbnVtYmVyO1xyXG4gIHNlY29uZHM6IG51bWJlcjtcclxuICBtaW51dGVzOiBudW1iZXI7XHJcbiAgaG91cnM6IG51bWJlcjtcclxuICBkYXlzOiBudW1iZXI7XHJcbiAgbW9udGhzOiBudW1iZXI7XHJcbiAgeWVhcnM6IG51bWJlcjtcclxuICB0b3RhbDogQVhUaW1lU3BhblRvdGFsO1xyXG59XHJcblxyXG5leHBvcnQgY2xhc3MgQVhEYXRlVGltZVJhbmdlIHtcclxuICBwcml2YXRlIF9zdGFydFRpbWU6IEFYRGF0ZVRpbWU7XHJcbiAgcHJpdmF0ZSBfZW5kVGltZTogQVhEYXRlVGltZTtcclxuXHJcbiAgcHVibGljIGdldCBzdGFydFRpbWUoKTogQVhEYXRlVGltZSB7XHJcbiAgICByZXR1cm4gdGhpcy5fc3RhcnRUaW1lO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGdldCBlbmRUaW1lKCk6IEFYRGF0ZVRpbWUge1xyXG4gICAgcmV0dXJuIHRoaXMuX2VuZFRpbWU7XHJcbiAgfVxyXG5cclxuICBjb25zdHJ1Y3RvcihzdGFydFRpbWU6IEFYRGF0ZVRpbWUsIGVuZFRpbWU6IEFYRGF0ZVRpbWUpIHtcclxuICAgIHRoaXMuX3N0YXJ0VGltZSA9IHN0YXJ0VGltZTtcclxuICAgIHRoaXMuX2VuZFRpbWUgPSBlbmRUaW1lO1xyXG4gIH1cclxuXHJcbiAgZHVyYXRpb24oKTogQVhUaW1lU3BhbiB7XHJcbiAgICBjb25zdCByZXN1bHQ6IEFYVGltZVNwYW4gPSB7XHJcbiAgICAgIG1pbGlzZWNvbmRzOiAwLFxyXG4gICAgICBzZWNvbmRzOiAwLFxyXG4gICAgICBtaW51dGVzOiAwLFxyXG4gICAgICBob3VyczogMCxcclxuICAgICAgZGF5czogMCxcclxuICAgICAgbW9udGhzOiAwLFxyXG4gICAgICB5ZWFyczogMCxcclxuICAgICAgdG90YWw6IHtcclxuICAgICAgICBtaWxpc2Vjb25kczogMCxcclxuICAgICAgICBzZWNvbmRzOiAwLFxyXG4gICAgICAgIG1pbnV0ZXM6IDAsXHJcbiAgICAgICAgaG91cnM6IDAsXHJcbiAgICAgICAgZGF5czogMCxcclxuICAgICAgICB3ZWVrczogMCxcclxuICAgICAgICBtb250aHM6IDAsXHJcbiAgICAgICAgeWVhcnM6IDAsXHJcbiAgICAgIH0sXHJcbiAgICB9O1xyXG5cclxuICAgIGNvbnN0IG9uZV9zZWNvbmQgPSAxMDAwO1xyXG4gICAgY29uc3Qgb25lX21pbiA9IG9uZV9zZWNvbmQgKiA2MDtcclxuICAgIGNvbnN0IG9uZV9ob3VyID0gb25lX21pbiAqIDYwO1xyXG4gICAgY29uc3Qgb25lX2RheSA9IG9uZV9ob3VyICogMjQ7XHJcbiAgICBjb25zdCBvbmVfd2VlayA9IG9uZV9kYXkgKiA3O1xyXG4gICAgY29uc3Qgb25lX3llYXIgPSAzNjUuMjUgKiBvbmVfZGF5O1xyXG4gICAgY29uc3Qgb25lX21vbnRoID0gb25lX3llYXIgLyAxMjtcclxuICAgIGNvbnN0IHN0YXJ0VGltZSA9IHRoaXMuX3N0YXJ0VGltZS5kYXRlLmdldFRpbWUoKTtcclxuICAgIGNvbnN0IGVuZFRpbWUgPSB0aGlzLl9lbmRUaW1lLmRhdGUuZ2V0VGltZSgpO1xyXG4gICAgY29uc3QgZGlmZiA9IE1hdGguYWJzKGVuZFRpbWUgLSBzdGFydFRpbWUpO1xyXG4gICAgLy9cclxuICAgIHJlc3VsdC50b3RhbC5taWxpc2Vjb25kcyA9IGRpZmY7XHJcbiAgICByZXN1bHQudG90YWwuc2Vjb25kcyA9IE51bWJlcigoZGlmZiAvIG9uZV9zZWNvbmQpLnRvRml4ZWQoMikpO1xyXG4gICAgcmVzdWx0LnRvdGFsLm1pbnV0ZXMgPSBOdW1iZXIoKGRpZmYgLyBvbmVfbWluKS50b0ZpeGVkKDIpKTtcclxuICAgIHJlc3VsdC50b3RhbC5ob3VycyA9IE51bWJlcigoZGlmZiAvIG9uZV9ob3VyKS50b0ZpeGVkKDIpKTtcclxuICAgIHJlc3VsdC50b3RhbC5kYXlzID0gTnVtYmVyKChkaWZmIC8gb25lX2RheSkudG9GaXhlZCgyKSk7XHJcbiAgICByZXN1bHQudG90YWwud2Vla3MgPSBOdW1iZXIoKGRpZmYgLyBvbmVfd2VlaykudG9GaXhlZCgyKSk7XHJcbiAgICAvL1xyXG4gICAgLy8gbGV0IG1vbnRocyA9ICh0aGlzLmVuZFRpbWUueWVhciAtIHRoaXMuc3RhcnRUaW1lLnllYXIpICogMTI7XHJcbiAgICAvLyBtb250aHMgKz0gdGhpcy5lbmRUaW1lLm1vbnRoT2ZZZWFyIC0gdGhpcy5zdGFydFRpbWUubW9udGhPZlllYXIgKyAxO1xyXG4gICAgLy8gaWYgKHRoaXMuZW5kVGltZS5kYXlPZlllYXIgPCB0aGlzLnN0YXJ0VGltZS5kYXlPZlllYXIpIHtcclxuICAgIC8vICAgICBtb250aHMtLTtcclxuICAgIC8vIH1cclxuICAgIC8vIHJlc3VsdC50b3RhbC5tb250aHMgPSBNYXRoLmFicyhtb250aHMpO1xyXG4gICAgLy8gVE9ETzogcmV2aWV3XHJcbiAgICByZXN1bHQudG90YWwubW9udGhzID0gTnVtYmVyKChkaWZmIC8gb25lX21vbnRoKS50b0ZpeGVkKDIpKTtcclxuICAgIHJlc3VsdC50b3RhbC55ZWFycyA9IE51bWJlcigoZGlmZiAvIG9uZV95ZWFyKS50b0ZpeGVkKDIpKTtcclxuICAgIC8vXHJcbiAgICByZXN1bHQubWlsaXNlY29uZHMgPSByZXN1bHQudG90YWwubWlsaXNlY29uZHMgJSAxMDAwO1xyXG4gICAgcmVzdWx0LnNlY29uZHMgPSBOdW1iZXIoKHJlc3VsdC50b3RhbC5zZWNvbmRzICUgNjApLnRvRml4ZWQoMCkpO1xyXG4gICAgcmVzdWx0Lm1pbnV0ZXMgPSBOdW1iZXIoKHJlc3VsdC50b3RhbC5taW51dGVzICUgNjApLnRvRml4ZWQoMCkpO1xyXG4gICAgcmVzdWx0LmhvdXJzID0gTnVtYmVyKChyZXN1bHQudG90YWwuaG91cnMgJSAyNCkudG9GaXhlZCgwKSk7XHJcbiAgICAvLyBUT0RPOiByZXZpZXdcclxuICAgIHJlc3VsdC5kYXlzID0gTnVtYmVyKChyZXN1bHQudG90YWwuZGF5cyAlIDMwLjQpLnRvRml4ZWQoMCkpO1xyXG4gICAgcmVzdWx0Lm1vbnRocyA9IE51bWJlcigocmVzdWx0LnRvdGFsLm1vbnRocyAlIDEyKS50b0ZpeGVkKDApKTtcclxuICAgIHJlc3VsdC55ZWFycyA9IE51bWJlcihyZXN1bHQudG90YWwueWVhcnMudG9GaXhlZCgwKSk7XHJcbiAgICByZXR1cm4gcmVzdWx0O1xyXG4gIH1cclxuXHJcbiAgZW51bXVyYXRlKHVuaXQ6IFRpbWVVbml0ID0gJ2RheScsIGFtb3VudDogbnVtYmVyID0gMSk6IEFYRGF0ZVRpbWVbXSB7XHJcbiAgICBjb25zdCByZXN1bHQ6IEFYRGF0ZVRpbWVbXSA9IFtdO1xyXG4gICAgbGV0IGl0ZW0gPSB0aGlzLl9zdGFydFRpbWUuY2xvbmUoKTtcclxuICAgIHdoaWxlIChpdGVtLmNvbXBhcmUodGhpcy5fZW5kVGltZSwgdW5pdCkgPCAxKSB7XHJcbiAgICAgIGlmICghcmVzdWx0LnNvbWUoYyA9PiBjLmVxdWFsKGl0ZW0sIHVuaXQpKSkge1xyXG4gICAgICAgIHJlc3VsdC5wdXNoKGl0ZW0pO1xyXG4gICAgICB9XHJcbiAgICAgIGl0ZW0gPSBpdGVtLmFkZCh1bml0LCBhbW91bnQpXHJcbiAgICB9XHJcbiAgICByZXR1cm4gcmVzdWx0O1xyXG4gIH1cclxuXHJcbiAgaW5jbHVkZXModmFsdWU6IEFYRGF0ZVRpbWUsIHVuaXQ6IFRpbWVVbml0ID0gJ2RheScpOiBib29sZWFuIHtcclxuICAgIC8vIFRPRE86ID8/XHJcbiAgICByZXR1cm4gdHJ1ZTtcclxuICB9XHJcblxyXG4gIC8vIGdldFZpZXdDb21wYWlyZSh2aWV3KSB7XHJcbiAgLy8gICAgIHN3aXRjaCAodmlldykge1xyXG4gIC8vICAgICAgICAgY2FzZSAnZGF5JzpcclxuICAvLyAgICAgICAgICAgICByZXR1cm4gJ1lNRCc7XHJcbiAgLy8gICAgICAgICBjYXNlICdtb250aCc6XHJcbiAgLy8gICAgICAgICAgICAgcmV0dXJuICdZTSc7XHJcbiAgLy8gICAgICAgICBjYXNlICd5ZWFyJzpcclxuICAvLyAgICAgICAgICAgICByZXR1cm4gJ1knO1xyXG4gIC8vICAgICB9XHJcbiAgLy8gfVxyXG59XHJcbiJdfQ==
@@ -0,0 +1,40 @@
1
+ import { NgModule } from '@angular/core';
2
+ import { AXConfig } from '@acorex/core/config';
3
+ import { AXDateTimePipe } from './datetime.pipe';
4
+ import { GeorgianCalendar } from './georgian.calendar';
5
+ import { JalaliCalendar } from './jalali.calendar';
6
+ import * as i0 from "@angular/core";
7
+ class AXDateTimeModule {
8
+ constructor() {
9
+ AXConfig.set({
10
+ dateTime: {
11
+ calendars: {
12
+ jalali: {
13
+ "class": new JalaliCalendar(),
14
+ weekend: [6, 7]
15
+ },
16
+ gregorian: {
17
+ "class": new GeorgianCalendar(),
18
+ weekend: [7, 1]
19
+ }
20
+ },
21
+ calendar: 'gregorian',
22
+ shortDateFormat: 'DDDD, d MMM yyyy'
23
+ }
24
+ });
25
+ }
26
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.0.0", ngImport: i0, type: AXDateTimeModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
27
+ static ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "16.0.0", ngImport: i0, type: AXDateTimeModule, declarations: [AXDateTimePipe], exports: [AXDateTimePipe] });
28
+ static ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "16.0.0", ngImport: i0, type: AXDateTimeModule });
29
+ }
30
+ export { AXDateTimeModule };
31
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.0.0", ngImport: i0, type: AXDateTimeModule, decorators: [{
32
+ type: NgModule,
33
+ args: [{
34
+ imports: [],
35
+ exports: [AXDateTimePipe],
36
+ declarations: [AXDateTimePipe],
37
+ providers: [],
38
+ }]
39
+ }], ctorParameters: function () { return []; } });
40
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0ZXRpbWUubW9kdWxlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvYWNvcmV4L2NvcmUvZGF0ZVRpbWUvc3JjL2RhdGV0aW1lLm1vZHVsZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3pDLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUMvQyxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDakQsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDdkQsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLG1CQUFtQixDQUFDOztBQUduRCxNQU1hLGdCQUFnQjtJQUV6QjtRQUNJLFFBQVEsQ0FBQyxHQUFHLENBQUM7WUFDVCxRQUFRLEVBQUU7Z0JBQ04sU0FBUyxFQUFFO29CQUNQLE1BQU0sRUFBRTt3QkFDSixPQUFPLEVBQUUsSUFBSSxjQUFjLEVBQUU7d0JBQzdCLE9BQU8sRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7cUJBQ2xCO29CQUNELFNBQVMsRUFBRTt3QkFDUCxPQUFPLEVBQUUsSUFBSSxnQkFBZ0IsRUFBRTt3QkFDL0IsT0FBTyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztxQkFDbEI7aUJBQ0o7Z0JBQ0QsUUFBUSxFQUFFLFdBQVc7Z0JBQ3JCLGVBQWUsRUFBRSxrQkFBa0I7YUFDdEM7U0FDSixDQUFDLENBQUM7SUFFUCxDQUFDO3VHQXBCUSxnQkFBZ0I7d0dBQWhCLGdCQUFnQixpQkFIVixjQUFjLGFBRG5CLGNBQWM7d0dBSWYsZ0JBQWdCOztTQUFoQixnQkFBZ0I7MkZBQWhCLGdCQUFnQjtrQkFONUIsUUFBUTttQkFBQztvQkFDTixPQUFPLEVBQUUsRUFBRTtvQkFDWCxPQUFPLEVBQUUsQ0FBQyxjQUFjLENBQUM7b0JBQ3pCLFlBQVksRUFBRSxDQUFDLGNBQWMsQ0FBQztvQkFDOUIsU0FBUyxFQUFFLEVBQUU7aUJBQ2hCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgTmdNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgQVhDb25maWcgfSBmcm9tICdAYWNvcmV4L2NvcmUvY29uZmlnJztcclxuaW1wb3J0IHsgQVhEYXRlVGltZVBpcGUgfSBmcm9tICcuL2RhdGV0aW1lLnBpcGUnO1xyXG5pbXBvcnQgeyBHZW9yZ2lhbkNhbGVuZGFyIH0gZnJvbSAnLi9nZW9yZ2lhbi5jYWxlbmRhcic7XHJcbmltcG9ydCB7IEphbGFsaUNhbGVuZGFyIH0gZnJvbSAnLi9qYWxhbGkuY2FsZW5kYXInO1xyXG5cclxuXHJcbkBOZ01vZHVsZSh7XHJcbiAgICBpbXBvcnRzOiBbXSxcclxuICAgIGV4cG9ydHM6IFtBWERhdGVUaW1lUGlwZV0sXHJcbiAgICBkZWNsYXJhdGlvbnM6IFtBWERhdGVUaW1lUGlwZV0sXHJcbiAgICBwcm92aWRlcnM6IFtdLFxyXG59KVxyXG5leHBvcnQgY2xhc3MgQVhEYXRlVGltZU1vZHVsZSB7XHJcblxyXG4gICAgY29uc3RydWN0b3IoKSB7XHJcbiAgICAgICAgQVhDb25maWcuc2V0KHtcclxuICAgICAgICAgICAgZGF0ZVRpbWU6IHtcclxuICAgICAgICAgICAgICAgIGNhbGVuZGFyczoge1xyXG4gICAgICAgICAgICAgICAgICAgIGphbGFsaToge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBcImNsYXNzXCI6IG5ldyBKYWxhbGlDYWxlbmRhcigpLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICB3ZWVrZW5kOiBbNiwgN11cclxuICAgICAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgICAgIGdyZWdvcmlhbjoge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBcImNsYXNzXCI6IG5ldyBHZW9yZ2lhbkNhbGVuZGFyKCksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHdlZWtlbmQ6IFs3LCAxXVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICBjYWxlbmRhcjogJ2dyZWdvcmlhbicsXHJcbiAgICAgICAgICAgICAgICBzaG9ydERhdGVGb3JtYXQ6ICdERERELCBkIE1NTSB5eXl5J1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgfVxyXG59XHJcbiJdfQ==
@@ -0,0 +1,27 @@
1
+ import { Pipe } from '@angular/core';
2
+ import { AXConfig } from '@acorex/core/config';
3
+ import { AXDateTime } from './datetime.class';
4
+ import * as i0 from "@angular/core";
5
+ class AXDateTimePipe {
6
+ constructor() { }
7
+ transform(value, format, calendar) {
8
+ if (value == null) {
9
+ return '';
10
+ }
11
+ const date = value instanceof AXDateTime ? value.clone() : AXDateTime.convert(value, calendar);
12
+ if (!format) {
13
+ return date.format(AXConfig.get('dateTime.shortDateFormat'));
14
+ }
15
+ else {
16
+ return date.format(format);
17
+ }
18
+ }
19
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.0.0", ngImport: i0, type: AXDateTimePipe, deps: [], target: i0.ɵɵFactoryTarget.Pipe });
20
+ static ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "16.0.0", ngImport: i0, type: AXDateTimePipe, name: "axDate" });
21
+ }
22
+ export { AXDateTimePipe };
23
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.0.0", ngImport: i0, type: AXDateTimePipe, decorators: [{
24
+ type: Pipe,
25
+ args: [{ name: 'axDate' }]
26
+ }], ctorParameters: function () { return []; } });
27
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0ZXRpbWUucGlwZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2Fjb3JleC9jb3JlL2RhdGVUaW1lL3NyYy9kYXRldGltZS5waXBlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBaUIsSUFBSSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3BELE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUMvQyxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sa0JBQWtCLENBQUM7O0FBRTlDLE1BQ2EsY0FBYztJQUN2QixnQkFBZ0IsQ0FBQztJQUVqQixTQUFTLENBQUMsS0FBVSxFQUFFLE1BQWUsRUFBRSxRQUFpQjtRQUNwRCxJQUFJLEtBQUssSUFBSSxJQUFJLEVBQUU7WUFDZixPQUFPLEVBQUUsQ0FBQztTQUNiO1FBQ0QsTUFBTSxJQUFJLEdBQWUsS0FBSyxZQUFZLFVBQVUsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLEtBQUssRUFBRSxRQUFRLENBQUMsQ0FBQztRQUMzRyxJQUFJLENBQUMsTUFBTSxFQUFFO1lBQ1QsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsMEJBQTBCLENBQUMsQ0FBQyxDQUFDO1NBQ2hFO2FBQ0k7WUFDRCxPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUM7U0FDOUI7SUFDTCxDQUFDO3VHQWRRLGNBQWM7cUdBQWQsY0FBYzs7U0FBZCxjQUFjOzJGQUFkLGNBQWM7a0JBRDFCLElBQUk7bUJBQUMsRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgUGlwZVRyYW5zZm9ybSwgUGlwZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBBWENvbmZpZyB9IGZyb20gJ0BhY29yZXgvY29yZS9jb25maWcnO1xyXG5pbXBvcnQgeyBBWERhdGVUaW1lIH0gZnJvbSAnLi9kYXRldGltZS5jbGFzcyc7XHJcblxyXG5AUGlwZSh7IG5hbWU6ICdheERhdGUnIH0pXHJcbmV4cG9ydCBjbGFzcyBBWERhdGVUaW1lUGlwZSBpbXBsZW1lbnRzIFBpcGVUcmFuc2Zvcm0ge1xyXG4gICAgY29uc3RydWN0b3IoKSB7IH1cclxuXHJcbiAgICB0cmFuc2Zvcm0odmFsdWU6IGFueSwgZm9ybWF0Pzogc3RyaW5nLCBjYWxlbmRhcj86IHN0cmluZyk6IHN0cmluZyB7XHJcbiAgICAgICAgaWYgKHZhbHVlID09IG51bGwpIHtcclxuICAgICAgICAgICAgcmV0dXJuICcnO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCBkYXRlOiBBWERhdGVUaW1lID0gdmFsdWUgaW5zdGFuY2VvZiBBWERhdGVUaW1lID8gdmFsdWUuY2xvbmUoKSA6IEFYRGF0ZVRpbWUuY29udmVydCh2YWx1ZSwgY2FsZW5kYXIpO1xyXG4gICAgICAgIGlmICghZm9ybWF0KSB7XHJcbiAgICAgICAgICAgIHJldHVybiBkYXRlLmZvcm1hdChBWENvbmZpZy5nZXQoJ2RhdGVUaW1lLnNob3J0RGF0ZUZvcm1hdCcpKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIHJldHVybiBkYXRlLmZvcm1hdChmb3JtYXQpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxufSJdfQ==