@zwa73/utils 1.0.224 → 1.0.226
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.
- package/dist/{types/QuickExport.d.ts → QuickExport.d.ts} +1 -1
- package/dist/{cjs/QuickExport.js → QuickExport.js} +2 -2
- package/dist/UtilClass/index.d.ts +3 -0
- package/dist/{cjs/UtilClass → UtilClass}/index.js +7 -6
- package/dist/{cjs/UtilCodecs.js → UtilCodecs.js} +1 -5
- package/dist/{cjs/UtilFileTools.js → UtilFileTools.js} +2 -2
- package/dist/{types/UtilFunctions.d.ts → UtilFunctions.d.ts} +1 -19
- package/dist/{cjs/UtilFunctions.js → UtilFunctions.js} +2 -26
- package/dist/{types/UtilInterfaces.d.ts → UtilInterfaces.d.ts} +1 -1
- package/package.json +2 -8
- package/dist/mjs/QuickExport.mjs +0 -35
- package/dist/mjs/UtilClass/Hbs.mjs +0 -51
- package/dist/mjs/UtilClass/index.mjs +0 -3
- package/dist/mjs/UtilCodecs.mjs +0 -109
- package/dist/mjs/UtilDecorators.mjs +0 -2
- package/dist/mjs/UtilFP.mjs +0 -2
- package/dist/mjs/UtilFileTools.mjs +0 -407
- package/dist/mjs/UtilFunctions.mjs +0 -138
- package/dist/mjs/UtilHttp.mjs +0 -475
- package/dist/mjs/UtilI18n.mjs +0 -206
- package/dist/mjs/UtilInterfaces.mjs +0 -2
- package/dist/mjs/UtilLogger.mjs +0 -361
- package/dist/mjs/UtilSymbol.mjs +0 -2
- package/dist/mjs/index.mjs +0 -17
- package/dist/types/UtilClass/index.d.ts +0 -3
- package/index.d.ts +0 -1
- package/index.js +0 -1
- /package/dist/{types/UtilClass → UtilClass}/Hbs.d.ts +0 -0
- /package/dist/{cjs/UtilClass → UtilClass}/Hbs.js +0 -0
- /package/dist/{types/UtilCodecs.d.ts → UtilCodecs.d.ts} +0 -0
- /package/dist/{types/UtilDecorators.d.ts → UtilDecorators.d.ts} +0 -0
- /package/dist/{cjs/UtilDecorators.js → UtilDecorators.js} +0 -0
- /package/dist/{types/UtilFP.d.ts → UtilFP.d.ts} +0 -0
- /package/dist/{cjs/UtilFP.js → UtilFP.js} +0 -0
- /package/dist/{types/UtilFileTools.d.ts → UtilFileTools.d.ts} +0 -0
- /package/dist/{types/UtilHttp.d.ts → UtilHttp.d.ts} +0 -0
- /package/dist/{cjs/UtilHttp.js → UtilHttp.js} +0 -0
- /package/dist/{types/UtilI18n.d.ts → UtilI18n.d.ts} +0 -0
- /package/dist/{cjs/UtilI18n.js → UtilI18n.js} +0 -0
- /package/dist/{cjs/UtilInterfaces.js → UtilInterfaces.js} +0 -0
- /package/dist/{types/UtilLogger.d.ts → UtilLogger.d.ts} +0 -0
- /package/dist/{cjs/UtilLogger.js → UtilLogger.js} +0 -0
- /package/dist/{types/UtilSymbol.d.ts → UtilSymbol.d.ts} +0 -0
- /package/dist/{cjs/UtilSymbol.js → UtilSymbol.js} +0 -0
- /package/dist/{types/index.d.ts → index.d.ts} +0 -0
- /package/dist/{cjs/index.js → index.js} +0 -0
package/dist/mjs/UtilLogger.mjs
DELETED
|
@@ -1,361 +0,0 @@
|
|
|
1
|
-
import path from 'pathe';
|
|
2
|
-
import * as winston from 'winston';
|
|
3
|
-
import DailyRotateFile from 'winston-daily-rotate-file';
|
|
4
|
-
import { inspect } from 'util';
|
|
5
|
-
const logLevels = {
|
|
6
|
-
fatal: 0,
|
|
7
|
-
error: 1,
|
|
8
|
-
warn: 2,
|
|
9
|
-
info: 3,
|
|
10
|
-
http: 4,
|
|
11
|
-
verbose: 5,
|
|
12
|
-
debug: 6,
|
|
13
|
-
silly: 7
|
|
14
|
-
};
|
|
15
|
-
const colorizer = winston.format.colorize();
|
|
16
|
-
colorizer.addColors({
|
|
17
|
-
fatal: 'bold yellow redBG',
|
|
18
|
-
error: 'bold yellow',
|
|
19
|
-
warn: 'yellow',
|
|
20
|
-
info: 'white',
|
|
21
|
-
debug: 'bold cyan',
|
|
22
|
-
silly: 'bold magenta'
|
|
23
|
-
});
|
|
24
|
-
export class SLogger {
|
|
25
|
-
/**获取一个Logger,如不存在则用默认参数创建
|
|
26
|
-
* @param name - logger的名称 默认default
|
|
27
|
-
* @returns 获取的logger
|
|
28
|
-
*/
|
|
29
|
-
static getLogger(name = "default") {
|
|
30
|
-
let out = SLogger.loggerTable[name];
|
|
31
|
-
if (out == null) {
|
|
32
|
-
SLogger.createLogger(name);
|
|
33
|
-
out = SLogger.loggerTable[name];
|
|
34
|
-
}
|
|
35
|
-
return out;
|
|
36
|
-
}
|
|
37
|
-
/**创建Logger
|
|
38
|
-
* @param name - logger的名称 默认default
|
|
39
|
-
* @param consoleLevel - 输出到控制台的最低等级 默认info
|
|
40
|
-
* @param outFloder - log的输出文件夹路径 如./log/
|
|
41
|
-
* @param fileLevel - 输出到文件的最低等级 默认info
|
|
42
|
-
* @returns 创建完成的logger
|
|
43
|
-
*/
|
|
44
|
-
static createLogger(name = "default", consoleLevel = "info", outFloder, fileLevel = "info") {
|
|
45
|
-
const transports = [];
|
|
46
|
-
if (outFloder != null) {
|
|
47
|
-
const fileFormat = winston.format.combine(winston.format.timestamp({ format: 'HH:mm:ss' }), winston.format.printf((info) => {
|
|
48
|
-
const level = info.level.toUpperCase();
|
|
49
|
-
const message = info.message;
|
|
50
|
-
//格式化
|
|
51
|
-
//let format = `[${info.timestamp}] [${level}]: `
|
|
52
|
-
//let space = " ".repeat(format.length);
|
|
53
|
-
const messageList = message.split("\n");
|
|
54
|
-
return `[${info.timestamp}] [${level.toUpperCase()}]: ${messageList.join("\n")}`;
|
|
55
|
-
}));
|
|
56
|
-
transports.push(new DailyRotateFile({
|
|
57
|
-
filename: path.join(outFloder, 'log-%DATE%.txt'),
|
|
58
|
-
datePattern: 'YYYY-MM-DD',
|
|
59
|
-
level: fileLevel,
|
|
60
|
-
format: fileFormat,
|
|
61
|
-
}));
|
|
62
|
-
}
|
|
63
|
-
const consoleFormat = winston.format.combine(winston.format.timestamp({ format: 'HH:mm:ss' }), winston.format.printf((info) => {
|
|
64
|
-
const level = info.level.toUpperCase();
|
|
65
|
-
const message = info.message;
|
|
66
|
-
const colorizedLevel = colorizer.colorize(info.level, level);
|
|
67
|
-
//格式化
|
|
68
|
-
//let format = `[${info.timestamp}] [${level}]: `
|
|
69
|
-
//let space = " ".repeat(format.length);
|
|
70
|
-
let messageList = message.split("\n");
|
|
71
|
-
messageList[0] = colorizer.colorize(info.level, messageList[0]);
|
|
72
|
-
for (let i = 1; i < messageList.length; i++)
|
|
73
|
-
messageList[i] = colorizer.colorize(info.level, messageList[i]);
|
|
74
|
-
let formattedMessage = messageList.join("\n");
|
|
75
|
-
const prefix = `[${info.timestamp}] [${colorizedLevel}]: `;
|
|
76
|
-
if (formattedMessage.startsWith(prefix))
|
|
77
|
-
formattedMessage = formattedMessage.slice(prefix.length);
|
|
78
|
-
return `${prefix}${formattedMessage}`;
|
|
79
|
-
//return `[${info.timestamp}] [${colorizedLevel}]: ${messageList.join("\n")}`;
|
|
80
|
-
}));
|
|
81
|
-
transports.push(new winston.transports.Console({
|
|
82
|
-
level: consoleLevel,
|
|
83
|
-
format: consoleFormat,
|
|
84
|
-
}));
|
|
85
|
-
const logger = winston.createLogger({
|
|
86
|
-
levels: logLevels,
|
|
87
|
-
transports: transports,
|
|
88
|
-
});
|
|
89
|
-
const out = new SLogger();
|
|
90
|
-
out._logger = logger;
|
|
91
|
-
if (SLogger.loggerTable[name] != null) {
|
|
92
|
-
let old = SLogger.loggerTable[name];
|
|
93
|
-
old._logger.transports.forEach(tp => {
|
|
94
|
-
if (tp.close != null)
|
|
95
|
-
tp.close();
|
|
96
|
-
});
|
|
97
|
-
}
|
|
98
|
-
SLogger.loggerTable[name] = out;
|
|
99
|
-
return out;
|
|
100
|
-
}
|
|
101
|
-
constructor() { }
|
|
102
|
-
_logger = null;
|
|
103
|
-
/**记录Logger的表 */
|
|
104
|
-
static loggerTable = {};
|
|
105
|
-
/**记录Logger的表 */
|
|
106
|
-
static timeTable = {};
|
|
107
|
-
//———————————————————— function ——————————————————————//
|
|
108
|
-
/**产生一条对应等级的log 返回自身
|
|
109
|
-
* @param level - log等级
|
|
110
|
-
* @param messages - log消息
|
|
111
|
-
* @returns 自身
|
|
112
|
-
*/
|
|
113
|
-
log(level, ...messages) {
|
|
114
|
-
level ??= "silly";
|
|
115
|
-
const strMessages = [];
|
|
116
|
-
//上一条是字符串字符串
|
|
117
|
-
let preIsString = true;
|
|
118
|
-
for (let message of messages) {
|
|
119
|
-
let out;
|
|
120
|
-
//非string类型
|
|
121
|
-
if (typeof message !== "string") {
|
|
122
|
-
out = `<${typeof message}> ${inspect(message)}`;
|
|
123
|
-
preIsString = false;
|
|
124
|
-
}
|
|
125
|
-
else if (!preIsString) {
|
|
126
|
-
//如果上一条不是字符串则需要添加<string>类型标记
|
|
127
|
-
out = `<${typeof message}> ${inspect(message)}`;
|
|
128
|
-
preIsString = true;
|
|
129
|
-
}
|
|
130
|
-
else {
|
|
131
|
-
out = message;
|
|
132
|
-
}
|
|
133
|
-
strMessages.push(out);
|
|
134
|
-
}
|
|
135
|
-
const outMessage = strMessages.join("\n");
|
|
136
|
-
this._logger.log(level, outMessage);
|
|
137
|
-
return this;
|
|
138
|
-
}
|
|
139
|
-
/**产生一条fatal等级的log 返回自身
|
|
140
|
-
* @param messages - log消息
|
|
141
|
-
* @returns 自身
|
|
142
|
-
*/
|
|
143
|
-
fatal(...messages) {
|
|
144
|
-
return this.log("fatal", ...messages);
|
|
145
|
-
;
|
|
146
|
-
}
|
|
147
|
-
/**产生一条error等级的log 返回自身
|
|
148
|
-
* @param messages - log消息
|
|
149
|
-
* @returns 自身
|
|
150
|
-
*/
|
|
151
|
-
error(...messages) {
|
|
152
|
-
return this.log("error", ...messages);
|
|
153
|
-
;
|
|
154
|
-
}
|
|
155
|
-
/**产生一条warn等级的log 返回自身
|
|
156
|
-
* @param messages - log消息
|
|
157
|
-
* @returns 自身
|
|
158
|
-
*/
|
|
159
|
-
warn(...messages) {
|
|
160
|
-
return this.log("warn", ...messages);
|
|
161
|
-
;
|
|
162
|
-
}
|
|
163
|
-
/**产生一条info等级的log 返回自身
|
|
164
|
-
* @param messages - log消息
|
|
165
|
-
* @returns 自身
|
|
166
|
-
*/
|
|
167
|
-
info(...messages) {
|
|
168
|
-
return this.log("info", ...messages);
|
|
169
|
-
}
|
|
170
|
-
/**产生一条http等级的log 返回自身
|
|
171
|
-
* @param messages - log消息
|
|
172
|
-
* @returns 自身
|
|
173
|
-
*/
|
|
174
|
-
http(...messages) {
|
|
175
|
-
return this.log("http", ...messages);
|
|
176
|
-
}
|
|
177
|
-
/**产生一条verbose等级的log 返回自身
|
|
178
|
-
* @param messages - log消息
|
|
179
|
-
* @returns 自身
|
|
180
|
-
*/
|
|
181
|
-
verbose(...messages) {
|
|
182
|
-
return this.log("verbose", ...messages);
|
|
183
|
-
}
|
|
184
|
-
/**产生一条debug等级的log 返回自身
|
|
185
|
-
* @param messages - log消息
|
|
186
|
-
* @returns 自身
|
|
187
|
-
*/
|
|
188
|
-
debug(...messages) {
|
|
189
|
-
return this.log("debug", ...messages);
|
|
190
|
-
}
|
|
191
|
-
/**产生一条silly等级的log 返回自身
|
|
192
|
-
* @param messages - log消息
|
|
193
|
-
* @returns 自身
|
|
194
|
-
*/
|
|
195
|
-
silly(...messages) {
|
|
196
|
-
return this.log("silly", ...messages);
|
|
197
|
-
}
|
|
198
|
-
/**记录当前时间戳并存入表
|
|
199
|
-
* @param flag - 记录的命名
|
|
200
|
-
* @returns 记录的时间
|
|
201
|
-
*/
|
|
202
|
-
time(flag) {
|
|
203
|
-
let hrtime = process.hrtime();
|
|
204
|
-
SLogger.timeTable[flag] = hrtime;
|
|
205
|
-
return hrtime;
|
|
206
|
-
}
|
|
207
|
-
/**根据之前记录的时间戳计算经过的时间 并输出log
|
|
208
|
-
* @param flag - 记录的命名
|
|
209
|
-
* @param level - log等级 === null时不产生log
|
|
210
|
-
* @returns 格式化的时间字符串
|
|
211
|
-
*/
|
|
212
|
-
timeEnd(flag, level = "info") {
|
|
213
|
-
const start = SLogger.timeTable[flag];
|
|
214
|
-
if (start == null) {
|
|
215
|
-
this.warn("SLogger.timeEnd 错误 flag:" + flag + " 不存在");
|
|
216
|
-
return;
|
|
217
|
-
}
|
|
218
|
-
const timelen = process.hrtime(start);
|
|
219
|
-
const totalMicroseconds = (timelen[0] * 1e9 + timelen[1]) / 1000;
|
|
220
|
-
const microseconds = totalMicroseconds % 1000;
|
|
221
|
-
const totalMilliseconds = totalMicroseconds / 1000;
|
|
222
|
-
const milliseconds = Math.floor(totalMilliseconds % 1000);
|
|
223
|
-
const totalSeconds = totalMilliseconds / 1000;
|
|
224
|
-
const seconds = Math.floor(totalSeconds % 60);
|
|
225
|
-
const totalMinutes = totalSeconds / 60;
|
|
226
|
-
const minutes = Math.floor(totalMinutes % 60);
|
|
227
|
-
const totalHours = totalMinutes / 60;
|
|
228
|
-
const hours = Math.floor(totalHours % 24);
|
|
229
|
-
const totalDay = totalHours / 24;
|
|
230
|
-
const Days = Math.floor(totalDay);
|
|
231
|
-
let out = '';
|
|
232
|
-
if (totalSeconds > 60) {
|
|
233
|
-
let result = '';
|
|
234
|
-
let format = '';
|
|
235
|
-
let acc = 0;
|
|
236
|
-
const maxAcc = 3;
|
|
237
|
-
const concat = (num, sep, formatText, resultText) => {
|
|
238
|
-
const hasResult = result.length > 0;
|
|
239
|
-
const need = (hasResult || num > 0) && (acc < maxAcc);
|
|
240
|
-
if (!need)
|
|
241
|
-
return;
|
|
242
|
-
if (result.length > 0)
|
|
243
|
-
result += sep;
|
|
244
|
-
if (format.length > 0)
|
|
245
|
-
format += sep;
|
|
246
|
-
result += resultText;
|
|
247
|
-
format += formatText;
|
|
248
|
-
acc++;
|
|
249
|
-
};
|
|
250
|
-
concat(Days, ':', 'dd', `${Days.toString()}`);
|
|
251
|
-
concat(hours, ':', 'HH', `${hours.toString().padStart(2, '0')}`);
|
|
252
|
-
concat(minutes, ':', 'mm', `${minutes.toString().padStart(2, '0')}`);
|
|
253
|
-
concat(seconds, ':', 'ss', `${seconds.toString().padStart(2, '0')}`);
|
|
254
|
-
concat(milliseconds, '.', 'mmm', `${milliseconds.toString().padStart(3, '0')}`);
|
|
255
|
-
//result = result.replace(/^(0(?![^0-9]))+/, '');
|
|
256
|
-
result = result.replace(/^0+([0-9])/, "$1");
|
|
257
|
-
out = `${result} (${format})`;
|
|
258
|
-
}
|
|
259
|
-
else if (totalMilliseconds > 1000) {
|
|
260
|
-
out = `${totalSeconds.toFixed(3)}s`;
|
|
261
|
-
}
|
|
262
|
-
else {
|
|
263
|
-
out = `${totalMilliseconds.toFixed(3)}ms`;
|
|
264
|
-
}
|
|
265
|
-
if (level !== null)
|
|
266
|
-
this.log(level, `${flag}: ${out}`);
|
|
267
|
-
delete SLogger.timeTable[flag];
|
|
268
|
-
return out;
|
|
269
|
-
}
|
|
270
|
-
//———————————————————— static ——————————————————————//
|
|
271
|
-
/**名称为default的slogger实例 */
|
|
272
|
-
static get defaultInstance() {
|
|
273
|
-
if (SLogger.loggerTable.default == null)
|
|
274
|
-
SLogger.createLogger();
|
|
275
|
-
return SLogger.loggerTable.default;
|
|
276
|
-
}
|
|
277
|
-
/**让名称为default的logger 产生一条对应等级的log 返回自身
|
|
278
|
-
* @param level - log等级
|
|
279
|
-
* @param messages - log消息
|
|
280
|
-
* @returns 自身
|
|
281
|
-
*/
|
|
282
|
-
static log(level, ...messages) {
|
|
283
|
-
level = level ?? "silly";
|
|
284
|
-
this.defaultInstance.log(level, ...messages);
|
|
285
|
-
return this.defaultInstance;
|
|
286
|
-
}
|
|
287
|
-
/**让名称为default的logger 产生一条fatal等级的log 返回自身
|
|
288
|
-
* @param messages - log消息
|
|
289
|
-
* @returns 自身
|
|
290
|
-
*/
|
|
291
|
-
static fatal(...messages) {
|
|
292
|
-
return this.log("fatal", ...messages);
|
|
293
|
-
;
|
|
294
|
-
}
|
|
295
|
-
/**让名称为default的logger 产生一条error等级的log 返回自身
|
|
296
|
-
* @param messages - log消息
|
|
297
|
-
* @returns 自身
|
|
298
|
-
*/
|
|
299
|
-
static error(...messages) {
|
|
300
|
-
return this.log("error", ...messages);
|
|
301
|
-
;
|
|
302
|
-
}
|
|
303
|
-
/**让名称为default的logger 产生一条warn等级的log 返回自身
|
|
304
|
-
* @param messages - log消息
|
|
305
|
-
* @returns 自身
|
|
306
|
-
*/
|
|
307
|
-
static warn(...messages) {
|
|
308
|
-
return this.log("warn", ...messages);
|
|
309
|
-
;
|
|
310
|
-
}
|
|
311
|
-
/**让名称为default的logger 产生一条info等级的log 返回自身
|
|
312
|
-
* @param messages - log消息
|
|
313
|
-
* @returns 自身
|
|
314
|
-
*/
|
|
315
|
-
static info(...messages) {
|
|
316
|
-
return this.log("info", ...messages);
|
|
317
|
-
}
|
|
318
|
-
/**让名称为default的logger 产生一条http等级的log 返回自身
|
|
319
|
-
* @param messages - log消息
|
|
320
|
-
* @returns 自身
|
|
321
|
-
*/
|
|
322
|
-
static http(...messages) {
|
|
323
|
-
return this.log("http", ...messages);
|
|
324
|
-
}
|
|
325
|
-
/**让名称为default的logger 产生一条verbose等级的log 返回自身
|
|
326
|
-
* @param messages - log消息
|
|
327
|
-
* @returns 自身
|
|
328
|
-
*/
|
|
329
|
-
static verbose(...messages) {
|
|
330
|
-
return this.log("verbose", ...messages);
|
|
331
|
-
}
|
|
332
|
-
/**让名称为default的logger 产生一条debug等级的log 返回自身
|
|
333
|
-
* @param messages - log消息
|
|
334
|
-
* @returns 自身
|
|
335
|
-
*/
|
|
336
|
-
static debug(...messages) {
|
|
337
|
-
return this.log("debug", ...messages);
|
|
338
|
-
}
|
|
339
|
-
/**让名称为default的logger 产生一条silly等级的log 返回自身
|
|
340
|
-
* @param messages - log消息
|
|
341
|
-
* @returns 自身
|
|
342
|
-
*/
|
|
343
|
-
static silly(...messages) {
|
|
344
|
-
return this.log("silly", ...messages);
|
|
345
|
-
}
|
|
346
|
-
/**让名称为default的logger 记录当前时间戳并存入表
|
|
347
|
-
* @param flag - 记录的命名
|
|
348
|
-
* @returns 记录的时间
|
|
349
|
-
*/
|
|
350
|
-
static time(flag) {
|
|
351
|
-
return this.defaultInstance.time(flag);
|
|
352
|
-
}
|
|
353
|
-
/**让名称为default的logger 根据之前记录的时间戳计算经过的时间 并输出log
|
|
354
|
-
* @param flag - 记录的命名
|
|
355
|
-
* @param level - log等级
|
|
356
|
-
* @returns
|
|
357
|
-
*/
|
|
358
|
-
static timeEnd(flag, level = "info") {
|
|
359
|
-
this.defaultInstance.timeEnd(flag, level);
|
|
360
|
-
}
|
|
361
|
-
}
|
package/dist/mjs/UtilSymbol.mjs
DELETED
package/dist/mjs/index.mjs
DELETED
|
@@ -1,17 +0,0 @@
|
|
|
1
|
-
import { SLogger } from './UtilLogger.mjs';
|
|
2
|
-
import { JsDepInjector } from '@zwa73/js-utils';
|
|
3
|
-
import * as crypto from "crypto";
|
|
4
|
-
JsDepInjector.inject('logger', SLogger);
|
|
5
|
-
JsDepInjector.inject('genUUID', () => crypto.randomBytes(16).toString("hex"));
|
|
6
|
-
export * from './UtilFunctions.mjs';
|
|
7
|
-
export * from './UtilInterfaces.mjs';
|
|
8
|
-
export * from './UtilSymbol.mjs';
|
|
9
|
-
export * from './UtilClass/index.mjs';
|
|
10
|
-
export * from './UtilHttp.mjs';
|
|
11
|
-
export * from './UtilCodecs.mjs';
|
|
12
|
-
export * from './UtilDecorators.mjs';
|
|
13
|
-
export * from './UtilFileTools.mjs';
|
|
14
|
-
export * from './UtilLogger.mjs';
|
|
15
|
-
export * from './UtilFP.mjs';
|
|
16
|
-
export * from './QuickExport.mjs';
|
|
17
|
-
export * from './UtilI18n.mjs';
|
package/index.d.ts
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export * from './dist';
|
package/index.js
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
module.exports = require("./dist");
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|