suanpan_node_sdk 2.0.0-beta.15 → 2.0.0-beta.16
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/common/bufferFlusher.d.ts +18 -0
- package/dist/common/bufferFlusher.js +73 -0
- package/dist/common/bufferFlusher.js.map +1 -0
- package/dist/latestStorage/storageFlusher.d.ts +9 -0
- package/dist/latestStorage/storageFlusher.js +66 -0
- package/dist/latestStorage/storageFlusher.js.map +1 -0
- package/dist/latestStorage/storageLogger.d.ts +21 -0
- package/dist/latestStorage/storageLogger.js +68 -0
- package/dist/latestStorage/storageLogger.js.map +1 -0
- package/package.json +1 -1
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/// <reference types="node" />
|
|
2
|
+
import * as events from 'events';
|
|
3
|
+
export declare type FlushOptions = {
|
|
4
|
+
flushInterval?: number;
|
|
5
|
+
maxItems?: number;
|
|
6
|
+
};
|
|
7
|
+
export declare class BufferFlusher extends events.EventEmitter {
|
|
8
|
+
private buffer;
|
|
9
|
+
private flushInterval;
|
|
10
|
+
private maxItems;
|
|
11
|
+
private flushTimeoutId;
|
|
12
|
+
constructor(options?: FlushOptions);
|
|
13
|
+
get(): string[];
|
|
14
|
+
clear(): void;
|
|
15
|
+
stop(): void;
|
|
16
|
+
add(data: string): void;
|
|
17
|
+
flush(): void;
|
|
18
|
+
}
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
|
|
5
|
+
}) : (function(o, m, k, k2) {
|
|
6
|
+
if (k2 === undefined) k2 = k;
|
|
7
|
+
o[k2] = m[k];
|
|
8
|
+
}));
|
|
9
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
10
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
11
|
+
}) : function(o, v) {
|
|
12
|
+
o["default"] = v;
|
|
13
|
+
});
|
|
14
|
+
var __importStar = (this && this.__importStar) || function (mod) {
|
|
15
|
+
if (mod && mod.__esModule) return mod;
|
|
16
|
+
var result = {};
|
|
17
|
+
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
|
|
18
|
+
__setModuleDefault(result, mod);
|
|
19
|
+
return result;
|
|
20
|
+
};
|
|
21
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
22
|
+
exports.BufferFlusher = void 0;
|
|
23
|
+
const events = __importStar(require("events"));
|
|
24
|
+
class BufferFlusher extends events.EventEmitter {
|
|
25
|
+
constructor(options = {}) {
|
|
26
|
+
super();
|
|
27
|
+
this.buffer = [];
|
|
28
|
+
this.flushInterval = options.flushInterval || 10000;
|
|
29
|
+
this.maxItems = options.maxItems || 5;
|
|
30
|
+
this.flush();
|
|
31
|
+
}
|
|
32
|
+
get() { return this.buffer; }
|
|
33
|
+
clear() { this.buffer = []; }
|
|
34
|
+
stop() { clearTimeout(this.flushTimeoutId); }
|
|
35
|
+
add(data) {
|
|
36
|
+
if (data) {
|
|
37
|
+
this.buffer.push(data);
|
|
38
|
+
if (this.buffer.length >= this.maxItems) {
|
|
39
|
+
this.flush();
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
flush() {
|
|
44
|
+
this.stop();
|
|
45
|
+
// The timer is the only action that would hold the node-process open.
|
|
46
|
+
// By unref-ing it, the process will exit prior to the timeout callback execution
|
|
47
|
+
this.flushTimeoutId = setTimeout(() => this.flush(), this.flushInterval).unref();
|
|
48
|
+
if (!this.buffer.length) {
|
|
49
|
+
return;
|
|
50
|
+
}
|
|
51
|
+
try {
|
|
52
|
+
this.emit('flush', this.buffer);
|
|
53
|
+
}
|
|
54
|
+
catch (err) {
|
|
55
|
+
// 当事件被触发时,如果没有与该事件绑定的函数的话,该事件会被静默忽略掉
|
|
56
|
+
// 但是如果事件的名称是 error 的话,没有与此相关的事件处理的话,程序就会 crash 退出
|
|
57
|
+
this.emit('error', err);
|
|
58
|
+
}
|
|
59
|
+
this.buffer = [];
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
exports.BufferFlusher = BufferFlusher;
|
|
63
|
+
// const buffer = new FlushBuffer({ flushInterval: 2000, maxItems: 1 });
|
|
64
|
+
// buffer.on('flush', (data) => {
|
|
65
|
+
// console.log(data); // bla
|
|
66
|
+
// console.log(data[0]); // bla
|
|
67
|
+
// // throw new Error('222');
|
|
68
|
+
// });
|
|
69
|
+
// buffer.add('woaini');
|
|
70
|
+
// setTimeout(() => {
|
|
71
|
+
// console.log('程序结束了...');
|
|
72
|
+
// }, 20000);
|
|
73
|
+
//# sourceMappingURL=bufferFlusher.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bufferFlusher.js","sourceRoot":"","sources":["../../src/common/bufferFlusher.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;AAAA,+CAAiC;AAMjC,MAAa,aAAc,SAAQ,MAAM,CAAC,YAAY;IAOpD,YAAY,UAAwB,EAAE;QACpC,KAAK,EAAE,CAAC;QANF,WAAM,GAAa,EAAE,CAAC;QAO5B,IAAI,CAAC,aAAa,GAAG,OAAO,CAAC,aAAa,IAAI,KAAK,CAAC;QACpD,IAAI,CAAC,QAAQ,GAAG,OAAO,CAAC,QAAQ,IAAI,CAAC,CAAC;QACtC,IAAI,CAAC,KAAK,EAAE,CAAC;IACf,CAAC;IAED,GAAG,KAAK,OAAO,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC;IAC7B,KAAK,KAAK,IAAI,CAAC,MAAM,GAAG,EAAE,CAAC,CAAC,CAAC;IAC7B,IAAI,KAAK,YAAY,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC;IAE7C,GAAG,CAAC,IAAY;QACd,IAAI,IAAI,EAAE;YACR,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACvB,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM,IAAI,IAAI,CAAC,QAAQ,EAAE;gBACvC,IAAI,CAAC,KAAK,EAAE,CAAC;aACd;SACF;IACH,CAAC;IAED,KAAK;QACH,IAAI,CAAC,IAAI,EAAE,CAAC;QACZ,uEAAuE;QACvE,iFAAiF;QACjF,IAAI,CAAC,cAAc,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,KAAK,EAAE,EAAE,IAAI,CAAC,aAAa,CAAC,CAAC,KAAK,EAAE,CAAC;QAEjF,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE;YAAE,OAAO;SAAE;QAEpC,IAAI;YACF,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;SACjC;QAAC,OAAO,GAAG,EAAE;YACZ,qCAAqC;YACrC,kDAAkD;YAClD,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;SACzB;QAED,IAAI,CAAC,MAAM,GAAG,EAAE,CAAC;IACnB,CAAC;CACF;AA7CD,sCA6CC;AAED,wEAAwE;AAExE,iCAAiC;AACjC,8BAA8B;AAC9B,iCAAiC;AACjC,+BAA+B;AAC/B,MAAM;AAEN,wBAAwB;AAExB,qBAAqB;AACrB,6BAA6B;AAC7B,aAAa"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { FlushOptions } from '../common/bufferFlusher';
|
|
2
|
+
export declare class StorageLogFlusher {
|
|
3
|
+
private storageFilePath;
|
|
4
|
+
private bFlusher;
|
|
5
|
+
constructor(storageFilePath: string, flushOptions?: FlushOptions);
|
|
6
|
+
onFlush: (logItems: string[]) => Promise<void>;
|
|
7
|
+
add(content: string): void;
|
|
8
|
+
flush(): void;
|
|
9
|
+
}
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
|
|
5
|
+
}) : (function(o, m, k, k2) {
|
|
6
|
+
if (k2 === undefined) k2 = k;
|
|
7
|
+
o[k2] = m[k];
|
|
8
|
+
}));
|
|
9
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
10
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
11
|
+
}) : function(o, v) {
|
|
12
|
+
o["default"] = v;
|
|
13
|
+
});
|
|
14
|
+
var __importStar = (this && this.__importStar) || function (mod) {
|
|
15
|
+
if (mod && mod.__esModule) return mod;
|
|
16
|
+
var result = {};
|
|
17
|
+
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
|
|
18
|
+
__setModuleDefault(result, mod);
|
|
19
|
+
return result;
|
|
20
|
+
};
|
|
21
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
22
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
23
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
24
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
25
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
26
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
27
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
28
|
+
});
|
|
29
|
+
};
|
|
30
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
31
|
+
exports.StorageLogFlusher = void 0;
|
|
32
|
+
const _ = __importStar(require("lodash"));
|
|
33
|
+
const logger = require("../common/log");
|
|
34
|
+
const wrapperStorage_1 = require("./wrapperStorage");
|
|
35
|
+
const bufferFlusher_1 = require("../common/bufferFlusher");
|
|
36
|
+
class StorageLogFlusher {
|
|
37
|
+
constructor(storageFilePath, flushOptions) {
|
|
38
|
+
this.storageFilePath = storageFilePath;
|
|
39
|
+
this.onFlush = (logItems) => __awaiter(this, void 0, void 0, function* () {
|
|
40
|
+
if (_.isEmpty(logItems)) {
|
|
41
|
+
return;
|
|
42
|
+
}
|
|
43
|
+
logger.debug(`⬇ StorageLogFlusher ==> append log to ${this.storageFilePath}`);
|
|
44
|
+
try {
|
|
45
|
+
const joinWithLineBreak = logItems.reduce((acc, cur) => {
|
|
46
|
+
acc += `${cur}\r\n`;
|
|
47
|
+
return acc;
|
|
48
|
+
}, '');
|
|
49
|
+
yield wrapperStorage_1.Storage.Instance.append(this.storageFilePath, joinWithLineBreak);
|
|
50
|
+
}
|
|
51
|
+
catch (e) {
|
|
52
|
+
logger.warn(`write log to storage failed ${e}`);
|
|
53
|
+
}
|
|
54
|
+
});
|
|
55
|
+
this.bFlusher = new bufferFlusher_1.BufferFlusher(flushOptions);
|
|
56
|
+
this.bFlusher.on('flush', this.onFlush);
|
|
57
|
+
}
|
|
58
|
+
add(content) {
|
|
59
|
+
this.bFlusher.add(content);
|
|
60
|
+
}
|
|
61
|
+
flush() {
|
|
62
|
+
this.bFlusher.flush();
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
exports.StorageLogFlusher = StorageLogFlusher;
|
|
66
|
+
//# sourceMappingURL=storageFlusher.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"storageFlusher.js","sourceRoot":"","sources":["../../src/latestStorage/storageFlusher.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,0CAA4B;AAE5B,wCAAyC;AAEzC,qDAA2C;AAC3C,2DAAsE;AAEtE,MAAa,iBAAiB;IAI5B,YAAoB,eAAuB,EAAE,YAA2B;QAApD,oBAAe,GAAf,eAAe,CAAQ;QAK3C,YAAO,GAAG,CAAO,QAAkB,EAAE,EAAE;YACrC,IAAI,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE;gBAAE,OAAO;aAAE;YAEpC,MAAM,CAAC,KAAK,CAAC,yCAAyC,IAAI,CAAC,eAAe,EAAE,CAAC,CAAC;YAE9E,IAAI;gBACF,MAAM,iBAAiB,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE;oBACrD,GAAG,IAAI,GAAG,GAAG,MAAM,CAAC;oBACpB,OAAO,GAAG,CAAC;gBACb,CAAC,EAAE,EAAE,CAAC,CAAC;gBAEP,MAAM,wBAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,eAAe,EAAE,iBAAiB,CAAC,CAAC;aACxE;YAAC,OAAO,CAAC,EAAE;gBACV,MAAM,CAAC,IAAI,CAAC,+BAA+B,CAAC,EAAE,CAAC,CAAC;aACjD;QACH,CAAC,CAAA,CAAC;QAnBA,IAAI,CAAC,QAAQ,GAAG,IAAI,6BAAa,CAAC,YAAY,CAAC,CAAC;QAChD,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,OAAO,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;IAC1C,CAAC;IAmBD,GAAG,CAAC,OAAe;QACjB,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;IAC7B,CAAC;IAED,KAAK;QACH,IAAI,CAAC,QAAQ,CAAC,KAAK,EAAE,CAAC;IACxB,CAAC;CACF;AAjCD,8CAiCC"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
export declare type StorageOptions = {
|
|
2
|
+
storagePath: string;
|
|
3
|
+
debug: boolean;
|
|
4
|
+
};
|
|
5
|
+
export declare enum LogLevel {
|
|
6
|
+
Debug = 0,
|
|
7
|
+
Info = 1,
|
|
8
|
+
Warn = 2,
|
|
9
|
+
Error = 3
|
|
10
|
+
}
|
|
11
|
+
export declare class ObjectStorageLogger {
|
|
12
|
+
private debugMode;
|
|
13
|
+
private flusher;
|
|
14
|
+
constructor(options: StorageOptions);
|
|
15
|
+
private isDebugMode;
|
|
16
|
+
private log;
|
|
17
|
+
info: (message: string, flush?: boolean) => void;
|
|
18
|
+
debug: (message: string, flush?: boolean) => void;
|
|
19
|
+
warn: (message: string, flush?: boolean) => void;
|
|
20
|
+
error: (message: string, flush?: boolean) => void;
|
|
21
|
+
}
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.ObjectStorageLogger = exports.LogLevel = void 0;
|
|
7
|
+
const log_1 = __importDefault(require("../common/log"));
|
|
8
|
+
const moment_1 = __importDefault(require("moment"));
|
|
9
|
+
const util_1 = require("../common/util");
|
|
10
|
+
const storageFlusher_1 = require("./storageFlusher");
|
|
11
|
+
var LogLevel;
|
|
12
|
+
(function (LogLevel) {
|
|
13
|
+
LogLevel[LogLevel["Debug"] = 0] = "Debug";
|
|
14
|
+
LogLevel[LogLevel["Info"] = 1] = "Info";
|
|
15
|
+
LogLevel[LogLevel["Warn"] = 2] = "Warn";
|
|
16
|
+
LogLevel[LogLevel["Error"] = 3] = "Error";
|
|
17
|
+
})(LogLevel = exports.LogLevel || (exports.LogLevel = {}));
|
|
18
|
+
class ObjectStorageLogger {
|
|
19
|
+
constructor(options) {
|
|
20
|
+
this.debugMode = true;
|
|
21
|
+
this.log = (level, message, flush = false) => {
|
|
22
|
+
switch (level) {
|
|
23
|
+
case LogLevel.Debug:
|
|
24
|
+
log_1.default.debug(message);
|
|
25
|
+
break;
|
|
26
|
+
case LogLevel.Info:
|
|
27
|
+
log_1.default.info(message);
|
|
28
|
+
break;
|
|
29
|
+
case LogLevel.Warn:
|
|
30
|
+
log_1.default.warn(message);
|
|
31
|
+
break;
|
|
32
|
+
case LogLevel.Error:
|
|
33
|
+
log_1.default.error(message);
|
|
34
|
+
break;
|
|
35
|
+
default: {
|
|
36
|
+
throw new Error(`unsupported log level: ${level}`);
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
if (this.isDebugMode()) {
|
|
40
|
+
this.flusher.add(`${moment_1.default().format('YYYY-MM-DD HH:mm:ss')} ==> ${message}`);
|
|
41
|
+
if (flush) {
|
|
42
|
+
this.flusher.flush();
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
};
|
|
46
|
+
this.info = (message, flush = false) => {
|
|
47
|
+
this.log(LogLevel.Info, message, flush);
|
|
48
|
+
};
|
|
49
|
+
this.debug = (message, flush = false) => {
|
|
50
|
+
this.log(LogLevel.Debug, message, flush);
|
|
51
|
+
};
|
|
52
|
+
this.warn = (message, flush = false) => {
|
|
53
|
+
this.log(LogLevel.Warn, message, flush);
|
|
54
|
+
};
|
|
55
|
+
this.error = (message, flush = false) => {
|
|
56
|
+
this.log(LogLevel.Error, message, flush);
|
|
57
|
+
};
|
|
58
|
+
if (options.debug !== undefined) {
|
|
59
|
+
this.debugMode = options.debug;
|
|
60
|
+
}
|
|
61
|
+
this.flusher = new storageFlusher_1.StorageLogFlusher(options.storagePath);
|
|
62
|
+
}
|
|
63
|
+
isDebugMode() {
|
|
64
|
+
return util_1.isTrue(this.debugMode);
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
exports.ObjectStorageLogger = ObjectStorageLogger;
|
|
68
|
+
//# sourceMappingURL=storageLogger.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"storageLogger.js","sourceRoot":"","sources":["../../src/latestStorage/storageLogger.ts"],"names":[],"mappings":";;;;;;AAAA,wDAAmC;AACnC,oDAA4B;AAE5B,yCAAwC;AACxC,qDAAqD;AAOrD,IAAY,QAKX;AALD,WAAY,QAAQ;IAClB,yCAAK,CAAA;IACL,uCAAI,CAAA;IACJ,uCAAI,CAAA;IACJ,yCAAK,CAAA;AACP,CAAC,EALW,QAAQ,GAAR,gBAAQ,KAAR,gBAAQ,QAKnB;AAED,MAAa,mBAAmB;IAK9B,YAAY,OAAuB;QAH3B,cAAS,GAAG,IAAI,CAAC;QAcjB,QAAG,GAAG,CAAC,KAAe,EAAE,OAAe,EAAE,KAAK,GAAG,KAAK,EAAE,EAAE;YAEhE,QAAQ,KAAK,EAAE;gBACb,KAAK,QAAQ,CAAC,KAAK;oBACjB,aAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;oBACtB,MAAM;gBACR,KAAK,QAAQ,CAAC,IAAI;oBAChB,aAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;oBACrB,MAAM;gBACR,KAAK,QAAQ,CAAC,IAAI;oBAChB,aAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;oBACrB,MAAM;gBACR,KAAK,QAAQ,CAAC,KAAK;oBACjB,aAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;oBACtB,MAAM;gBACR,OAAO,CAAC,CAAC;oBACP,MAAM,IAAI,KAAK,CAAC,0BAA0B,KAAK,EAAE,CAAC,CAAC;iBACpD;aACF;YAED,IAAI,IAAI,CAAC,WAAW,EAAE,EAAE;gBACtB,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,gBAAM,EAAE,CAAC,MAAM,CAAC,qBAAqB,CAAC,QAAQ,OAAO,EAAE,CAAC,CAAC;gBAC7E,IAAI,KAAK,EAAE;oBACT,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;iBACtB;aACF;QACH,CAAC,CAAA;QAED,SAAI,GAAG,CAAC,OAAe,EAAE,KAAK,GAAG,KAAK,EAAE,EAAE;YACxC,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,EAAE,OAAO,EAAE,KAAK,CAAC,CAAC;QAC1C,CAAC,CAAA;QAED,UAAK,GAAG,CAAC,OAAe,EAAE,KAAK,GAAG,KAAK,EAAE,EAAE;YACzC,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,KAAK,EAAE,OAAO,EAAE,KAAK,CAAC,CAAC;QAC3C,CAAC,CAAA;QAED,SAAI,GAAG,CAAC,OAAe,EAAE,KAAK,GAAG,KAAK,EAAE,EAAE;YACxC,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,EAAE,OAAO,EAAE,KAAK,CAAC,CAAC;QAC1C,CAAC,CAAA;QAED,UAAK,GAAG,CAAC,OAAe,EAAE,KAAK,GAAG,KAAK,EAAE,EAAE;YACzC,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,KAAK,EAAE,OAAO,EAAE,KAAK,CAAC,CAAC;QAC3C,CAAC,CAAA;QApDC,IAAI,OAAO,CAAC,KAAK,KAAK,SAAS,EAAE;YAC/B,IAAI,CAAC,SAAS,GAAG,OAAO,CAAC,KAAK,CAAC;SAChC;QACD,IAAI,CAAC,OAAO,GAAG,IAAI,kCAAiB,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC;IAC5D,CAAC;IAEO,WAAW;QACjB,OAAO,aAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IAChC,CAAC;CA6CF;AA3DD,kDA2DC"}
|