n8n-nodes-simple 2.4.2 → 2.4.3
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/nodes/shared/config/properties/messages.js +2 -2
- package/dist/nodes/shared/config/properties/messages.js.map +1 -1
- package/dist/nodes/shared/core/messages/chatHistory.js +7 -15
- package/dist/nodes/shared/core/messages/chatHistory.js.map +1 -1
- package/dist/nodes/shared/core/messages/types.d.ts +5 -1
- package/dist/nodes/shared/core/messages/types.js +45 -8
- package/dist/nodes/shared/core/messages/types.js.map +1 -1
- package/dist/nodes/shared/core/request/body.js +1 -3
- package/dist/nodes/shared/core/request/body.js.map +1 -1
- package/dist/package.json +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +1 -1
|
@@ -66,8 +66,8 @@ exports.messagesProperties = [
|
|
|
66
66
|
displayName: 'JSON Messages',
|
|
67
67
|
name: 'chatHistoryJson',
|
|
68
68
|
type: 'json',
|
|
69
|
-
default: '',
|
|
70
|
-
description: "A JSON array of objects with 'role' and 'content' keys. Invalid syntax
|
|
69
|
+
default: '[]',
|
|
70
|
+
description: "A JSON array of objects with 'role' and 'content' keys. Invalid syntax raises an error, while an empty array is ignored. You may send image or audio messages, if supported by the model (learn more in <a href='https://platform.openai.com/docs/api-reference/chat/create' target='_blank'>OpenAI</a> and <a href='https://openrouter.ai/docs/api-reference/overview' target='_blank'>OpenRouter</a> docs). Access chat history with ={{ $json.chat_history || [] }}",
|
|
71
71
|
typeOptions: {
|
|
72
72
|
rows: 2,
|
|
73
73
|
},
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"messages.js","sourceRoot":"","sources":["../../../../../nodes/shared/config/properties/messages.ts"],"names":[],"mappings":";;;AAEa,QAAA,kBAAkB,GAAsB;IACpD;QACC,WAAW,EAAE,UAAU;QACvB,IAAI,EAAE,gBAAgB;QACtB,IAAI,EAAE,iBAAiB;QACvB,WAAW,EAAE;YACZ,QAAQ,EAAE,IAAI;YACd,cAAc,EAAE,IAAI;SACpB;QACD,WAAW,EAAE,aAAa;QAC1B,OAAO,EAAE,EAAE,MAAM,EAAE,CAAC,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC,EAAE;QACtC,OAAO,EAAE;YACR;gBACC,WAAW,EAAE,QAAQ;gBACrB,IAAI,EAAE,QAAQ;gBACd,MAAM,EAAE;oBACP;wBACC,WAAW,EAAE,MAAM;wBACnB,IAAI,EAAE,MAAM;wBACZ,IAAI,EAAE,SAAS;wBAEf,OAAO,EAAE;4BACR;gCACC,IAAI,EAAE,cAAc;gCACpB,KAAK,EAAE,WAAW;6BAElB;4BACD;gCACC,IAAI,EAAE,YAAY;gCAClB,KAAK,EAAE,QAAQ;6BACf;4BACD;gCACC,IAAI,EAAE,YAAY;gCAClB,KAAK,EAAE,MAAM;6BACb;4BACD;gCACC,IAAI,EAAE,iBAAiB;gCACvB,KAAK,EAAE,iBAAiB;gCACxB,WAAW,EAAE,yCAAyC;6BACtD;4BACD;gCACC,IAAI,EAAE,gBAAgB;gCACtB,KAAK,EAAE,gBAAgB;gCACvB,WAAW,EAAE,0CAA0C;6BACvD;yBACD;wBACD,OAAO,EAAE,MAAM;qBACf;oBACD;wBACC,WAAW,EAAE,SAAS;wBACtB,IAAI,EAAE,SAAS;wBACf,IAAI,EAAE,QAAQ;wBACd,OAAO,EAAE,EAAE;wBAEX,WAAW,EACV,oFAAoF;wBACrF,WAAW,EAAE;4BACZ,IAAI,EAAE,CAAC;yBACP;wBACD,cAAc,EAAE;4BACf,IAAI,EAAE;gCACL,IAAI,EAAE,CAAC,iBAAiB,EAAE,gBAAgB,CAAC;6BAC3C;yBACD;qBACD;oBACD;wBACC,WAAW,EAAE,eAAe;wBAC5B,IAAI,EAAE,iBAAiB;wBACvB,IAAI,EAAE,MAAM;wBACZ,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"messages.js","sourceRoot":"","sources":["../../../../../nodes/shared/config/properties/messages.ts"],"names":[],"mappings":";;;AAEa,QAAA,kBAAkB,GAAsB;IACpD;QACC,WAAW,EAAE,UAAU;QACvB,IAAI,EAAE,gBAAgB;QACtB,IAAI,EAAE,iBAAiB;QACvB,WAAW,EAAE;YACZ,QAAQ,EAAE,IAAI;YACd,cAAc,EAAE,IAAI;SACpB;QACD,WAAW,EAAE,aAAa;QAC1B,OAAO,EAAE,EAAE,MAAM,EAAE,CAAC,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC,EAAE;QACtC,OAAO,EAAE;YACR;gBACC,WAAW,EAAE,QAAQ;gBACrB,IAAI,EAAE,QAAQ;gBACd,MAAM,EAAE;oBACP;wBACC,WAAW,EAAE,MAAM;wBACnB,IAAI,EAAE,MAAM;wBACZ,IAAI,EAAE,SAAS;wBAEf,OAAO,EAAE;4BACR;gCACC,IAAI,EAAE,cAAc;gCACpB,KAAK,EAAE,WAAW;6BAElB;4BACD;gCACC,IAAI,EAAE,YAAY;gCAClB,KAAK,EAAE,QAAQ;6BACf;4BACD;gCACC,IAAI,EAAE,YAAY;gCAClB,KAAK,EAAE,MAAM;6BACb;4BACD;gCACC,IAAI,EAAE,iBAAiB;gCACvB,KAAK,EAAE,iBAAiB;gCACxB,WAAW,EAAE,yCAAyC;6BACtD;4BACD;gCACC,IAAI,EAAE,gBAAgB;gCACtB,KAAK,EAAE,gBAAgB;gCACvB,WAAW,EAAE,0CAA0C;6BACvD;yBACD;wBACD,OAAO,EAAE,MAAM;qBACf;oBACD;wBACC,WAAW,EAAE,SAAS;wBACtB,IAAI,EAAE,SAAS;wBACf,IAAI,EAAE,QAAQ;wBACd,OAAO,EAAE,EAAE;wBAEX,WAAW,EACV,oFAAoF;wBACrF,WAAW,EAAE;4BACZ,IAAI,EAAE,CAAC;yBACP;wBACD,cAAc,EAAE;4BACf,IAAI,EAAE;gCACL,IAAI,EAAE,CAAC,iBAAiB,EAAE,gBAAgB,CAAC;6BAC3C;yBACD;qBACD;oBACD;wBACC,WAAW,EAAE,eAAe;wBAC5B,IAAI,EAAE,iBAAiB;wBACvB,IAAI,EAAE,MAAM;wBACZ,OAAO,EAAE,IAAI;wBAEb,WAAW,EACV,wcAAwc;wBACzc,WAAW,EAAE;4BACZ,IAAI,EAAE,CAAC;yBACP;wBACD,cAAc,EAAE;4BACf,IAAI,EAAE;gCACL,IAAI,EAAE,CAAC,iBAAiB,CAAC;6BACzB;yBACD;qBACD;oBACD;wBACC,WAAW,EAAE,iBAAiB;wBAC9B,IAAI,EAAE,2BAA2B;wBACjC,IAAI,EAAE,SAAS;wBACf,OAAO,EAAE,IAAI;wBAEb,WAAW,EAAE,2CAA2C;wBACxD,cAAc,EAAE;4BACf,IAAI,EAAE;gCACL,IAAI,EAAE,CAAC,gBAAgB,CAAC;6BACxB;yBACD;qBACD;oBACD;wBACC,WAAW,EAAE,iBAAiB;wBAC9B,IAAI,EAAE,6BAA6B;wBACnC,IAAI,EAAE,SAAS;wBACf,OAAO,EAAE,IAAI;wBAEb,WAAW,EAAE,6CAA6C;wBAC1D,cAAc,EAAE;4BACf,IAAI,EAAE;gCACL,IAAI,EAAE,CAAC,gBAAgB,CAAC;6BACxB;yBACD;qBACD;iBACD;aACD;SACD;KACD;CACD,CAAC"}
|
|
@@ -9,22 +9,14 @@ async function unpackChatHistoryAndMemory(rawMessagesToSend, loadToolCallsFromCh
|
|
|
9
9
|
const processedMessages = [];
|
|
10
10
|
for (const rawMessage of rawMessagesToSend) {
|
|
11
11
|
if (rawMessage.role === 'chatHistoryRole') {
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
}
|
|
19
|
-
if (Array.isArray(chatHistory)) {
|
|
20
|
-
processedMessages.push(...chatHistory);
|
|
21
|
-
}
|
|
22
|
-
else {
|
|
23
|
-
processedMessages.push({
|
|
24
|
-
role: 'user',
|
|
25
|
-
content: JSON.stringify(rawMessage.chatHistoryJson),
|
|
26
|
-
});
|
|
12
|
+
const chatHistoryJson = rawMessage.chatHistoryJson;
|
|
13
|
+
const chatHistory = typeof chatHistoryJson === 'string'
|
|
14
|
+
? JSON.parse(chatHistoryJson)
|
|
15
|
+
: chatHistoryJson;
|
|
16
|
+
if (!Array.isArray(chatHistory)) {
|
|
17
|
+
throw new Error('Chat History must be an array');
|
|
27
18
|
}
|
|
19
|
+
processedMessages.push(...chatHistory);
|
|
28
20
|
}
|
|
29
21
|
else if (rawMessage.role === 'chatMemoryRole' && memory) {
|
|
30
22
|
const rawMemoryMessages = await getChatMessages(memory);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"chatHistory.js","sourceRoot":"","sources":["../../../../../nodes/shared/core/messages/chatHistory.ts"],"names":[],"mappings":";;AAgBA,
|
|
1
|
+
{"version":3,"file":"chatHistory.js","sourceRoot":"","sources":["../../../../../nodes/shared/core/messages/chatHistory.ts"],"names":[],"mappings":";;AAgBA,gEA4CC;AAzDD,2CAA8C;AAE9C,KAAK,UAAU,eAAe,CAAC,MAA0B;IACxD,OAAO,CAAC,MAAM,MAAM,CAAC,mBAAmB,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,SAAS,CAAkB,CAAC;AAClF,CAAC;AASM,KAAK,UAAU,0BAA0B,CAC/C,iBAA+B,EAC/B,8BAAuC,IAAI,EAC3C,MAA2B;IAE3B,MAAM,iBAAiB,GAAc,EAAE,CAAC;IAExC,KAAK,MAAM,UAAU,IAAI,iBAAiB,EAAE,CAAC;QAC5C,IAAI,UAAU,CAAC,IAAI,KAAK,iBAAiB,EAAE,CAAC;YAE3C,MAAM,eAAe,GAAG,UAAU,CAAC,eAAe,CAAC;YAGnD,MAAM,WAAW,GAAG,OAAO,eAAe,KAAK,QAAQ;gBACtD,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,eAAe,CAAC;gBAC7B,CAAC,CAAC,eAAe,CAAC;YAGnB,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,WAAW,CAAC,EAAE,CAAC;gBACjC,MAAM,IAAI,KAAK,CAAC,+BAA+B,CAAC,CAAC;YAClD,CAAC;YAED,iBAAiB,CAAC,IAAI,CAAC,GAAG,WAAW,CAAC,CAAC;QAExC,CAAC;aAAM,IAAI,UAAU,CAAC,IAAI,KAAK,gBAAgB,IAAI,MAAM,EAAE,CAAC;YAG3D,MAAM,iBAAiB,GAAkB,MAAM,eAAe,CAAC,MAAM,CAAC,CAAA;YAEtE,IAAI,iBAAiB,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAElC,MAAM,cAAc,GAAc,IAAA,2BAAe,EAChD,iBAAiB,EACjB,2BAA2B,CAC3B,CAAC;gBACF,iBAAiB,CAAC,IAAI,CAAC,GAAG,cAAc,CAAC,CAAC;YAC3C,CAAC;QACF,CAAC;aAAM,CAAC;YAEP,iBAAiB,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QACpC,CAAC;IACF,CAAC;IAED,OAAO,iBAAiB,CAAC;AAC1B,CAAC"}
|
|
@@ -44,5 +44,9 @@ export type Response = {
|
|
|
44
44
|
choices: Choice[];
|
|
45
45
|
usage: Usage;
|
|
46
46
|
};
|
|
47
|
-
export declare function
|
|
47
|
+
export declare function validateMessage(item: any, index?: number): {
|
|
48
|
+
isValid: boolean;
|
|
49
|
+
error?: string;
|
|
50
|
+
};
|
|
51
|
+
export declare function validateMessages(messages: unknown): asserts messages is Message[];
|
|
48
52
|
export {};
|
|
@@ -1,12 +1,49 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
3
|
+
exports.validateMessage = validateMessage;
|
|
4
|
+
exports.validateMessages = validateMessages;
|
|
5
|
+
function validateMessage(item, index) {
|
|
6
|
+
const indexStr = index !== undefined ? ` at index ${index}` : '';
|
|
7
|
+
if (typeof item !== 'object' || item === null) {
|
|
8
|
+
return {
|
|
9
|
+
isValid: false,
|
|
10
|
+
error: `Expected object${indexStr}, got ${item === null ? 'null' : typeof item}`
|
|
11
|
+
};
|
|
12
|
+
}
|
|
13
|
+
if (!('role' in item)) {
|
|
14
|
+
return {
|
|
15
|
+
isValid: false,
|
|
16
|
+
error: `Missing required 'role' property${indexStr}`
|
|
17
|
+
};
|
|
18
|
+
}
|
|
19
|
+
if (!('content' in item)) {
|
|
20
|
+
return {
|
|
21
|
+
isValid: false,
|
|
22
|
+
error: `Missing required 'content' property${indexStr}`
|
|
23
|
+
};
|
|
24
|
+
}
|
|
25
|
+
return { isValid: true };
|
|
26
|
+
}
|
|
27
|
+
function validateMessages(messages) {
|
|
28
|
+
if (!messages) {
|
|
29
|
+
throw new Error("Missing 'messages' property in the request body.");
|
|
30
|
+
}
|
|
31
|
+
if (!Array.isArray(messages)) {
|
|
32
|
+
throw new Error(`Expected 'messages' to be an array, got ${typeof messages}.`);
|
|
33
|
+
}
|
|
34
|
+
if (messages.length === 0) {
|
|
35
|
+
throw new Error("The 'messages' array cannot be empty.");
|
|
36
|
+
}
|
|
37
|
+
const errors = messages
|
|
38
|
+
.map((message, index) => {
|
|
39
|
+
const { isValid, error } = validateMessage(message, index);
|
|
40
|
+
return isValid ? null : error;
|
|
41
|
+
})
|
|
42
|
+
.filter(Boolean);
|
|
43
|
+
if (errors.length > 0) {
|
|
44
|
+
throw new Error(errors.length === 1
|
|
45
|
+
? `Invalid message: ${errors[0]}`
|
|
46
|
+
: `Invalid messages found:\n${errors.map(e => ` • ${e}`).join('\n')}`);
|
|
47
|
+
}
|
|
11
48
|
}
|
|
12
49
|
//# sourceMappingURL=types.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../../../nodes/shared/core/messages/types.ts"],"names":[],"mappings":";;
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../../../nodes/shared/core/messages/types.ts"],"names":[],"mappings":";;AA2DA,0CAyBC;AAKD,4CA4BC;AA1DD,SAAgB,eAAe,CAAC,IAAS,EAAE,KAAc;IACxD,MAAM,QAAQ,GAAG,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,aAAa,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;IAEjE,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,IAAI,KAAK,IAAI,EAAE,CAAC;QAC/C,OAAO;YACN,OAAO,EAAE,KAAK;YACd,KAAK,EAAE,kBAAkB,QAAQ,SAAS,IAAI,KAAK,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,IAAI,EAAE;SAChF,CAAC;IACH,CAAC;IAED,IAAI,CAAC,CAAC,MAAM,IAAI,IAAI,CAAC,EAAE,CAAC;QACvB,OAAO;YACN,OAAO,EAAE,KAAK;YACd,KAAK,EAAE,mCAAmC,QAAQ,EAAE;SACpD,CAAC;IACH,CAAC;IAED,IAAI,CAAC,CAAC,SAAS,IAAI,IAAI,CAAC,EAAE,CAAC;QAC1B,OAAO;YACN,OAAO,EAAE,KAAK;YACd,KAAK,EAAE,sCAAsC,QAAQ,EAAE;SACvD,CAAC;IACH,CAAC;IAED,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;AAC1B,CAAC;AAKD,SAAgB,gBAAgB,CAAC,QAAiB;IAChD,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,MAAM,IAAI,KAAK,CAAC,kDAAkD,CAAC,CAAC;IACtE,CAAC;IAED,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC7B,MAAM,IAAI,KAAK,CAAC,2CAA2C,OAAO,QAAQ,GAAG,CAAC,CAAC;IACjF,CAAC;IAED,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC1B,MAAM,IAAI,KAAK,CAAC,uCAAuC,CAAC,CAAC;IAC3D,CAAC;IAGD,MAAM,MAAM,GAAG,QAAQ;SACpB,GAAG,CAAC,CAAC,OAAO,EAAE,KAAK,EAAE,EAAE;QACtB,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,GAAG,eAAe,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;QAC3D,OAAO,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC;IAChC,CAAC,CAAC;SACD,MAAM,CAAC,OAAO,CAAa,CAAC;IAE/B,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACtB,MAAM,IAAI,KAAK,CACb,MAAM,CAAC,MAAM,KAAK,CAAC;YACjB,CAAC,CAAC,oBAAoB,MAAM,CAAC,CAAC,CAAC,EAAE;YACjC,CAAC,CAAC,4BAA4B,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CACzE,CAAC;IACJ,CAAC;AACH,CAAC"}
|
|
@@ -7,6 +7,7 @@ exports.prepareRequestBody = prepareRequestBody;
|
|
|
7
7
|
const omit_1 = __importDefault(require("lodash/omit"));
|
|
8
8
|
const types_1 = require("../messages/types");
|
|
9
9
|
function prepareRequestBody(model, messages, tools, tool_choice, response_format, options, customParameters) {
|
|
10
|
+
(0, types_1.validateMessages)(messages);
|
|
10
11
|
let customParamsObj = {};
|
|
11
12
|
if (customParameters) {
|
|
12
13
|
if (typeof customParameters === 'string' && customParameters.trim()) {
|
|
@@ -35,9 +36,6 @@ function prepareRequestBody(model, messages, tools, tool_choice, response_format
|
|
|
35
36
|
...cleanOptions,
|
|
36
37
|
...customParamsObj,
|
|
37
38
|
};
|
|
38
|
-
if (!Array.isArray(messages) || !messages.every(types_1.isValidMessage)) {
|
|
39
|
-
throw new Error("Invalid or missing 'messages' in the request body.");
|
|
40
|
-
}
|
|
41
39
|
return body;
|
|
42
40
|
}
|
|
43
41
|
//# sourceMappingURL=body.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"body.js","sourceRoot":"","sources":["../../../../../nodes/shared/core/request/body.ts"],"names":[],"mappings":";;;;;AAOA,
|
|
1
|
+
{"version":3,"file":"body.js","sourceRoot":"","sources":["../../../../../nodes/shared/core/request/body.ts"],"names":[],"mappings":";;;;;AAOA,gDA2CC;AAjDD,uDAAgC;AAChC,6CAAqD;AAKrD,SAAgB,kBAAkB,CACjC,KAAa,EACb,QAAuB,EACvB,KAAY,EACZ,WAA+B,EAC/B,eAAwC,EACxC,OAAoB,EACpB,gBAAsC;IAGtC,IAAA,wBAAgB,EAAC,QAAQ,CAAC,CAAC;IAE3B,IAAI,eAAe,GAAgB,EAAE,CAAC;IACtC,IAAI,gBAAgB,EAAE,CAAC;QACtB,IAAI,OAAO,gBAAgB,KAAK,QAAQ,IAAI,gBAAgB,CAAC,IAAI,EAAE,EAAE,CAAC;YACrE,IAAI,CAAC;gBACJ,eAAe,GAAG,IAAI,CAAC,KAAK,CAAC,gBAAgB,CAAC,CAAC;YAChD,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBAChB,MAAM,IAAI,KAAK,CAAC,kCAAkC,CAAC,CAAC;YACrD,CAAC;QACF,CAAC;aAAM,IAAI,OAAO,gBAAgB,KAAK,QAAQ,EAAE,CAAC;YACjD,eAAe,GAAG,gBAAgB,CAAC;QACpC,CAAC;IACF,CAAC;IAGD,MAAM,YAAY,GAAG,IAAA,cAAK,EAAC,OAAO,EAAE;QACnC,kBAAkB;QAClB,iBAAiB;QACjB,oBAAoB;KACpB,CAAC,CAAC;IAEH,MAAM,IAAI,GAAgB;QACzB,KAAK;QACL,QAAQ;QACR,GAAG,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACtC,WAAW;QACX,eAAe;QACf,GAAG,YAAY;QACf,GAAG,eAAe;KAClB,CAAC;IAEF,OAAO,IAAI,CAAC;AACb,CAAC"}
|