@forestadmin/ai-proxy 1.12.3 → 1.12.4
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/errors.d.ts +3 -0
- package/dist/errors.js +9 -2
- package/dist/mcp-auth-error.js +5 -1
- package/dist/mcp-client.d.ts +1 -0
- package/dist/mcp-client.js +28 -2
- package/package.json +1 -1
package/dist/errors.d.ts
CHANGED
|
@@ -64,6 +64,9 @@ export declare class McpError extends UnprocessableError {
|
|
|
64
64
|
export declare class McpConnectionError extends McpError {
|
|
65
65
|
constructor(message: string);
|
|
66
66
|
}
|
|
67
|
+
export declare class McpLoadTimeoutError extends McpError {
|
|
68
|
+
constructor(serverName: string, timeoutMs: number);
|
|
69
|
+
}
|
|
67
70
|
export declare class McpConflictError extends McpError {
|
|
68
71
|
constructor(entityName: string);
|
|
69
72
|
}
|
package/dist/errors.js
CHANGED
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
* This allows the agent's error middleware to map them to their natural HTTP status codes.
|
|
5
5
|
*/
|
|
6
6
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
|
-
exports.McpConfigError = exports.McpConflictError = exports.McpConnectionError = exports.McpError = exports.AIToolNotFoundError = exports.AIToolUnprocessableError = exports.AINotConfiguredError = exports.AIForbiddenError = exports.AIUnauthorizedError = exports.AITooManyRequestsError = exports.AIProviderUnavailableError = exports.AIProviderError = exports.AINotFoundError = exports.AIModelNotSupportedError = exports.AIBadRequestError = void 0;
|
|
7
|
+
exports.McpConfigError = exports.McpConflictError = exports.McpLoadTimeoutError = exports.McpConnectionError = exports.McpError = exports.AIToolNotFoundError = exports.AIToolUnprocessableError = exports.AINotConfiguredError = exports.AIForbiddenError = exports.AIUnauthorizedError = exports.AITooManyRequestsError = exports.AIProviderUnavailableError = exports.AIProviderError = exports.AINotFoundError = exports.AIModelNotSupportedError = exports.AIBadRequestError = void 0;
|
|
8
8
|
// eslint-disable-next-line max-classes-per-file
|
|
9
9
|
const datasource_toolkit_1 = require("@forestadmin/datasource-toolkit");
|
|
10
10
|
class AIBadRequestError extends datasource_toolkit_1.BadRequestError {
|
|
@@ -115,6 +115,13 @@ class McpConnectionError extends McpError {
|
|
|
115
115
|
}
|
|
116
116
|
}
|
|
117
117
|
exports.McpConnectionError = McpConnectionError;
|
|
118
|
+
class McpLoadTimeoutError extends McpError {
|
|
119
|
+
constructor(serverName, timeoutMs) {
|
|
120
|
+
super(`Timeout: MCP server "${serverName}" did not return its tools within ${timeoutMs}ms`);
|
|
121
|
+
this.name = 'McpLoadTimeoutError';
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
exports.McpLoadTimeoutError = McpLoadTimeoutError;
|
|
118
125
|
class McpConflictError extends McpError {
|
|
119
126
|
constructor(entityName) {
|
|
120
127
|
super(`"${entityName}" already exists for your project`);
|
|
@@ -129,4 +136,4 @@ class McpConfigError extends McpError {
|
|
|
129
136
|
}
|
|
130
137
|
}
|
|
131
138
|
exports.McpConfigError = McpConfigError;
|
|
132
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
139
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXJyb3JzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL2Vycm9ycy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUE7OztHQUdHOzs7QUFFSCxnREFBZ0Q7QUFDaEQsd0VBUXlDO0FBRXpDLE1BQWEsaUJBQWtCLFNBQVEsb0NBQWU7SUFDcEQsWUFBWSxPQUFlO1FBQ3pCLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUNmLElBQUksQ0FBQyxJQUFJLEdBQUcsbUJBQW1CLENBQUM7SUFDbEMsQ0FBQztDQUNGO0FBTEQsOENBS0M7QUFFRCxNQUFhLHdCQUF5QixTQUFRLGlCQUFpQjtJQUM3RCxZQUFZLEtBQWE7UUFDdkIsS0FBSyxDQUNILFVBQVUsS0FBSyw4RUFBOEUsQ0FDOUYsQ0FBQztRQUNGLElBQUksQ0FBQyxJQUFJLEdBQUcsMEJBQTBCLENBQUM7SUFDekMsQ0FBQztDQUNGO0FBUEQsNERBT0M7QUFFRCxNQUFhLGVBQWdCLFNBQVEsa0NBQWE7SUFDaEQsWUFBWSxPQUFlO1FBQ3pCLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUNmLElBQUksQ0FBQyxJQUFJLEdBQUcsaUJBQWlCLENBQUM7SUFDaEMsQ0FBQztDQUNGO0FBTEQsMENBS0M7QUFFRCxNQUFhLGVBQWdCLFNBQVEsdUNBQWtCO0lBSXJELFlBQVksUUFBZ0IsRUFBRSxPQUEyQjtRQUN2RCxLQUFLLENBQUMsdUJBQXVCLFFBQVEsS0FBSyxPQUFPLEVBQUUsS0FBSyxFQUFFLE9BQU8sSUFBSSxTQUFTLEVBQUUsQ0FBQyxDQUFDO1FBQ2xGLElBQUksQ0FBQyxJQUFJLEdBQUcsaUJBQWlCLENBQUM7UUFDOUIsSUFBSSxDQUFDLFFBQVEsR0FBRyxRQUFRLENBQUM7UUFDekIsSUFBSSxPQUFPLEVBQUUsS0FBSztZQUFFLElBQUksQ0FBQyxLQUFLLEdBQUcsT0FBTyxDQUFDLEtBQUssQ0FBQztJQUNqRCxDQUFDO0NBQ0Y7QUFWRCwwQ0FVQztBQUVELE1BQWEsMEJBQTJC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
|
package/dist/mcp-auth-error.js
CHANGED
|
@@ -7,6 +7,7 @@ exports.classifyMcpLoadError = classifyMcpLoadError;
|
|
|
7
7
|
// re-consent cannot resolve, so it is left to surface as an ordinary failure. The MCP SDK / HTTP
|
|
8
8
|
// transport reports failures in several shapes (a numeric status field, or only a message string),
|
|
9
9
|
// so the checks walk the cause chain and inspect both structured status and the message text.
|
|
10
|
+
const errors_1 = require("./errors");
|
|
10
11
|
const AUTH_STATUSES = new Set([401]);
|
|
11
12
|
const AUTH_PATTERN = /\b401\b|unauthorized/i;
|
|
12
13
|
const CONNECTION_PATTERN = /econnrefused|econnreset|etimedout|enotfound|eai_again|fetch failed|network|socket|timeout|connect/i;
|
|
@@ -45,9 +46,12 @@ function isMcpAuthError(error) {
|
|
|
45
46
|
});
|
|
46
47
|
}
|
|
47
48
|
function classifyMcpLoadError(error) {
|
|
49
|
+
// Must run before the text patterns: the timeout message contains the user-controlled server name.
|
|
50
|
+
if (error instanceof errors_1.McpLoadTimeoutError)
|
|
51
|
+
return 'connection';
|
|
48
52
|
if (isMcpAuthError(error))
|
|
49
53
|
return 'auth';
|
|
50
54
|
const isConnectionFailure = errorChain(error).some(link => CONNECTION_PATTERN.test(messageOf(link)));
|
|
51
55
|
return isConnectionFailure ? 'connection' : 'unknown';
|
|
52
56
|
}
|
|
53
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
57
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWNwLWF1dGgtZXJyb3IuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvbWNwLWF1dGgtZXJyb3IudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUEyQ0Esd0NBU0M7QUFFRCxvREFXQztBQWpFRCxtR0FBbUc7QUFDbkcsZ0dBQWdHO0FBQ2hHLGlHQUFpRztBQUNqRyxtR0FBbUc7QUFDbkcsOEZBQThGO0FBQzlGLHFDQUErQztBQUUvQyxNQUFNLGFBQWEsR0FBRyxJQUFJLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7QUFDckMsTUFBTSxZQUFZLEdBQUcsdUJBQXVCLENBQUM7QUFDN0MsTUFBTSxrQkFBa0IsR0FDdEIsb0dBQW9HLENBQUM7QUFJdkcsU0FBUyxRQUFRLENBQUMsS0FBYztJQUM5QixNQUFNLFNBQVMsR0FBRyxLQUFtRSxDQUFDO0lBRXRGLEtBQUssTUFBTSxLQUFLLElBQUksQ0FBQyxTQUFTLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFFLFVBQVUsQ0FBQyxFQUFFLENBQUM7UUFDaEYsSUFBSSxPQUFPLEtBQUssS0FBSyxRQUFRO1lBQUUsT0FBTyxLQUFLLENBQUM7SUFDOUMsQ0FBQztJQUVELE9BQU8sU0FBUyxDQUFDO0FBQ25CLENBQUM7QUFFRCxTQUFTLFNBQVMsQ0FBQyxLQUFjO0lBQy9CLElBQUksS0FBSyxZQUFZLEtBQUs7UUFBRSxPQUFPLEtBQUssQ0FBQyxPQUFPLENBQUM7SUFDakQsSUFBSSxPQUFPLEtBQUssS0FBSyxRQUFRO1FBQUUsT0FBTyxLQUFLLENBQUM7SUFFNUMsT0FBTyxFQUFFLENBQUM7QUFDWixDQUFDO0FBRUQsU0FBUyxVQUFVLENBQUMsS0FBYztJQUNoQyxNQUFNLEtBQUssR0FBYyxFQUFFLENBQUM7SUFDNUIsSUFBSSxPQUFPLEdBQVksS0FBSyxDQUFDO0lBRTdCLE9BQU8sT0FBTyxJQUFJLEtBQUssQ0FBQyxNQUFNLEdBQUcsRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDO1FBQ2hFLEtBQUssQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDcEIsT0FBTyxHQUFJLE9BQStCLENBQUMsS0FBSyxDQUFDO0lBQ25ELENBQUM7SUFFRCxPQUFPLEtBQUssQ0FBQztBQUNmLENBQUM7QUFFRCxTQUFnQixjQUFjLENBQUMsS0FBYztJQUMzQyxPQUFPLFVBQVUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUU7UUFDbkMsTUFBTSxNQUFNLEdBQUcsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQzlCLCtGQUErRjtRQUMvRixrR0FBa0c7UUFDbEcsSUFBSSxNQUFNLEtBQUssU0FBUyxJQUFJLE1BQU0sSUFBSSxHQUFHLElBQUksTUFBTSxJQUFJLEdBQUc7WUFBRSxPQUFPLGFBQWEsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUM7UUFFN0YsT0FBTyxZQUFZLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO0lBQzVDLENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQztBQUVELFNBQWdCLG9CQUFvQixDQUFDLEtBQWM7SUFDakQsbUdBQW1HO0lBQ25HLElBQUksS0FBSyxZQUFZLDRCQUFtQjtRQUFFLE9BQU8sWUFBWSxDQUFDO0lBRTlELElBQUksY0FBYyxDQUFDLEtBQUssQ0FBQztRQUFFLE9BQU8sTUFBTSxDQUFDO0lBRXpDLE1BQU0sbUJBQW1CLEdBQUcsVUFBVSxDQUFDLEtBQUssQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUN4RCxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQ3pDLENBQUM7SUFFRixPQUFPLG1CQUFtQixDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQztBQUN4RCxDQUFDIn0=
|
package/dist/mcp-client.d.ts
CHANGED
|
@@ -3,6 +3,7 @@ import type { Logger } from '@forestadmin/datasource-toolkit';
|
|
|
3
3
|
import { MultiServerMCPClient } from '@langchain/mcp-adapters';
|
|
4
4
|
import { type McpLoadFailureKind } from './mcp-auth-error';
|
|
5
5
|
import McpServerRemoteTool from './mcp-server-remote-tool';
|
|
6
|
+
export declare const LOAD_TOOLS_TIMEOUT_MS = 15000;
|
|
6
7
|
export type McpServers = MultiServerMCPClient['config']['mcpServers'];
|
|
7
8
|
export type McpServerConfig = MultiServerMCPClient['config']['mcpServers'][string] & {
|
|
8
9
|
id?: string;
|
package/dist/mcp-client.js
CHANGED
|
@@ -3,10 +3,34 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
3
3
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
4
|
};
|
|
5
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.LOAD_TOOLS_TIMEOUT_MS = void 0;
|
|
6
7
|
const mcp_adapters_1 = require("@langchain/mcp-adapters");
|
|
7
8
|
const errors_1 = require("./errors");
|
|
8
9
|
const mcp_auth_error_1 = require("./mcp-auth-error");
|
|
9
10
|
const mcp_server_remote_tool_1 = __importDefault(require("./mcp-server-remote-tool"));
|
|
11
|
+
// A server that accepts the connection but never answers would otherwise keep getTools() pending
|
|
12
|
+
// forever and hang the whole load (and the caller's request) until the infrastructure cuts it.
|
|
13
|
+
exports.LOAD_TOOLS_TIMEOUT_MS = 15000;
|
|
14
|
+
function loadWithTimeout(loading, serverName, logger) {
|
|
15
|
+
let timer;
|
|
16
|
+
let hasTimedOut = false;
|
|
17
|
+
const timeout = new Promise((_, reject) => {
|
|
18
|
+
timer = setTimeout(() => {
|
|
19
|
+
hasTimedOut = true;
|
|
20
|
+
reject(new errors_1.McpLoadTimeoutError(serverName, exports.LOAD_TOOLS_TIMEOUT_MS));
|
|
21
|
+
}, exports.LOAD_TOOLS_TIMEOUT_MS);
|
|
22
|
+
});
|
|
23
|
+
loading.then(() => {
|
|
24
|
+
if (hasTimedOut) {
|
|
25
|
+
logger?.('Debug', `MCP server "${serverName}" returned its tools after the timeout`);
|
|
26
|
+
}
|
|
27
|
+
}, (error) => {
|
|
28
|
+
if (hasTimedOut) {
|
|
29
|
+
logger?.('Debug', `MCP server "${serverName}" failed after the timeout`, error);
|
|
30
|
+
}
|
|
31
|
+
});
|
|
32
|
+
return Promise.race([loading, timeout]).finally(() => clearTimeout(timer));
|
|
33
|
+
}
|
|
10
34
|
class McpClient {
|
|
11
35
|
constructor(config, logger) {
|
|
12
36
|
this.mcpClients = {};
|
|
@@ -31,7 +55,9 @@ class McpClient {
|
|
|
31
55
|
const failures = [];
|
|
32
56
|
await Promise.all(Object.entries(this.mcpClients).map(async ([name, client]) => {
|
|
33
57
|
try {
|
|
34
|
-
const
|
|
58
|
+
const startedAt = Date.now();
|
|
59
|
+
const loadedTools = (await loadWithTimeout(client.getTools(), name, this.logger)) ?? [];
|
|
60
|
+
this.logger?.('Debug', `Loaded ${loadedTools.length} tools from MCP server "${name}" in ${Date.now() - startedAt}ms`);
|
|
35
61
|
const extendedTools = loadedTools.map(tool => new mcp_server_remote_tool_1.default({
|
|
36
62
|
tool,
|
|
37
63
|
sourceId: name,
|
|
@@ -95,4 +121,4 @@ class McpClient {
|
|
|
95
121
|
}
|
|
96
122
|
}
|
|
97
123
|
exports.default = McpClient;
|
|
98
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
124
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWNwLWNsaWVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9tY3AtY2xpZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7OztBQUdBLDBEQUErRDtBQUUvRCxxQ0FBbUU7QUFDbkUscURBQWlGO0FBQ2pGLHNGQUEyRDtBQUUzRCxpR0FBaUc7QUFDakcsK0ZBQStGO0FBQ2xGLFFBQUEscUJBQXFCLEdBQUcsS0FBTSxDQUFDO0FBRTVDLFNBQVMsZUFBZSxDQUFJLE9BQW1CLEVBQUUsVUFBa0IsRUFBRSxNQUFlO0lBQ2xGLElBQUksS0FBaUMsQ0FBQztJQUN0QyxJQUFJLFdBQVcsR0FBRyxLQUFLLENBQUM7SUFDeEIsTUFBTSxPQUFPLEdBQUcsSUFBSSxPQUFPLENBQVEsQ0FBQyxDQUFDLEVBQUUsTUFBTSxFQUFFLEVBQUU7UUFDL0MsS0FBSyxHQUFHLFVBQVUsQ0FBQyxHQUFHLEVBQUU7WUFDdEIsV0FBVyxHQUFHLElBQUksQ0FBQztZQUNuQixNQUFNLENBQUMsSUFBSSw0QkFBbUIsQ0FBQyxVQUFVLEVBQUUsNkJBQXFCLENBQUMsQ0FBQyxDQUFDO1FBQ3JFLENBQUMsRUFBRSw2QkFBcUIsQ0FBQyxDQUFDO0lBQzVCLENBQUMsQ0FBQyxDQUFDO0lBRUgsT0FBTyxDQUFDLElBQUksQ0FDVixHQUFHLEVBQUU7UUFDSCxJQUFJLFdBQVcsRUFBRSxDQUFDO1lBQ2hCLE1BQU0sRUFBRSxDQUFDLE9BQU8sRUFBRSxlQUFlLFVBQVUsd0NBQXdDLENBQUMsQ0FBQztRQUN2RixDQUFDO0lBQ0gsQ0FBQyxFQUNELENBQUMsS0FBWSxFQUFFLEVBQUU7UUFDZixJQUFJLFdBQVcsRUFBRSxDQUFDO1lBQ2hCLE1BQU0sRUFBRSxDQUFDLE9BQU8sRUFBRSxlQUFlLFVBQVUsNEJBQTRCLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFDbEYsQ0FBQztJQUNILENBQUMsQ0FDRixDQUFDO0lBRUYsT0FBTyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsT0FBTyxFQUFFLE9BQU8sQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLEdBQUcsRUFBRSxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO0FBQzdFLENBQUM7QUFxQkQsTUFBcUIsU0FBUztJQUs1QixZQUFZLE1BQXdCLEVBQUUsTUFBZTtRQUpwQyxlQUFVLEdBQXlDLEVBQUUsQ0FBQztRQUN0RCx1QkFBa0IsR0FBdUMsRUFBRSxDQUFDO1FBSTNFLElBQUksQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFDO1FBQ3JCLDZEQUE2RDtRQUM3RCxzREFBc0Q7UUFDdEQsTUFBTSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsWUFBWSxDQUFDLEVBQUUsRUFBRTtZQUM5RCxNQUFNLEVBQ0osRUFBRSxFQUFFLFdBQVcsRUFDZixRQUFRLEVBQ1IsR0FBRyxJQUFJLEVBQ1IsR0FBRyxZQUF5RCxDQUFDO1lBQzlELElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsR0FBRyxXQUFXLENBQUM7WUFDNUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsR0FBRyxJQUFJLG1DQUFvQixDQUFDO2dCQUMvQyxVQUFVLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxFQUFFLElBQXVCLEVBQUU7Z0JBQy9DLEdBQUcsTUFBTTthQUNWLENBQUMsQ0FBQztRQUNMLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVELGdHQUFnRztJQUNoRyxnR0FBZ0c7SUFDaEcsMkZBQTJGO0lBQzNGLEtBQUssQ0FBQyxxQkFBcUI7UUFJekIsTUFBTSxLQUFLLEdBQTBCLEVBQUUsQ0FBQztRQUN4QyxNQUFNLFFBQVEsR0FBMkIsRUFBRSxDQUFDO1FBRTVDLE1BQU0sT0FBTyxDQUFDLEdBQUcsQ0FDZixNQUFNLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxHQUFHLENBQUMsS0FBSyxFQUFFLENBQUMsSUFBSSxFQUFFLE1BQU0sQ0FBQyxFQUFFLEVBQUU7WUFDM0QsSUFBSSxDQUFDO2dCQUNILE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQztnQkFDN0IsTUFBTSxXQUFXLEdBQUcsQ0FBQyxNQUFNLGVBQWUsQ0FBQyxNQUFNLENBQUMsUUFBUSxFQUFFLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQztnQkFDeEYsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUNYLE9BQU8sRUFDUCxVQUFVLFdBQVcsQ0FBQyxNQUFNLDJCQUEyQixJQUFJLFFBQ3pELElBQUksQ0FBQyxHQUFHLEVBQUUsR0FBRyxTQUNmLElBQUksQ0FDTCxDQUFDO2dCQUNGLE1BQU0sYUFBYSxHQUFHLFdBQVcsQ0FBQyxHQUFHLENBQ25DLElBQUksQ0FBQyxFQUFFLENBQ0wsSUFBSSxnQ0FBbUIsQ0FBQztvQkFDdEIsSUFBSTtvQkFDSixRQUFRLEVBQUUsSUFBSTtvQkFDZCxXQUFXLEVBQUUsSUFBSSxDQUFDLGtCQUFrQixDQUFDLElBQUksQ0FBQztpQkFDM0MsQ0FBQyxDQUNMLENBQUM7Z0JBQ0YsS0FBSyxDQUFDLElBQUksQ0FBQyxHQUFHLGFBQWEsQ0FBQyxDQUFDO1lBQy9CLENBQUM7WUFBQyxPQUFPLEtBQUssRUFBRSxDQUFDO2dCQUNmLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxPQUFPLEVBQUUsMkJBQTJCLElBQUksRUFBRSxFQUFFLEtBQWMsQ0FBQyxDQUFDO2dCQUMxRSxRQUFRLENBQUMsSUFBSSxDQUFDO29CQUNaLE1BQU0sRUFBRSxJQUFJO29CQUNaLFdBQVcsRUFBRSxJQUFJLENBQUMsa0JBQWtCLENBQUMsSUFBSSxDQUFDO29CQUMxQyxJQUFJLEVBQUUsSUFBQSxxQ0FBb0IsRUFBQyxLQUFLLENBQUM7b0JBQ2pDLEtBQUssRUFBRSxLQUFjO2lCQUN0QixDQUFDLENBQUM7WUFDTCxDQUFDO1FBQ0gsQ0FBQyxDQUFDLENBQ0gsQ0FBQztRQUVGLHNEQUFzRDtRQUN0RCxJQUFJLFFBQVEsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7WUFDeEIsTUFBTSxZQUFZLEdBQUcsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLE1BQU0sS0FBSyxDQUFDLENBQUMsS0FBSyxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQ3JGLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FDWCxPQUFPLEVBQ1AsNkJBQTZCLFFBQVEsQ0FBQyxNQUFNLElBQUksTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsTUFBTSxHQUFHO2dCQUNwRixrQkFBa0IsWUFBWSxFQUFFLENBQ25DLENBQUM7UUFDSixDQUFDO1FBRUQsT0FBTyxFQUFFLEtBQUssRUFBRSxRQUFRLEVBQUUsQ0FBQztJQUM3QixDQUFDO0lBRUQsS0FBSyxDQUFDLFNBQVM7UUFDYixPQUFPLENBQUMsTUFBTSxJQUFJLENBQUMscUJBQXFCLEVBQUUsQ0FBQyxDQUFDLEtBQUssQ0FBQztJQUNwRCxDQUFDO0lBRUQsS0FBSyxDQUFDLGVBQWU7UUFDbkIsSUFBSSxDQUFDO1lBQ0gsTUFBTSxPQUFPLENBQUMsR0FBRyxDQUNmLE1BQU0sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLE1BQU0sQ0FBQyxxQkFBcUIsRUFBRSxDQUFDLENBQzdFLENBQUM7WUFFRixPQUFPLElBQUksQ0FBQztRQUNkLENBQUM7UUFBQyxPQUFPLEtBQUssRUFBRSxDQUFDO1lBQ2YsTUFBTSxJQUFJLDJCQUFrQixDQUFFLEtBQWUsQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUN6RCxDQUFDO2dCQUFTLENBQUM7WUFDVCxJQUFJLENBQUM7Z0JBQ0gsTUFBTSxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7WUFDdkIsQ0FBQztZQUFDLE9BQU8sWUFBWSxFQUFFLENBQUM7Z0JBQ3RCLDRFQUE0RTtnQkFDNUUsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLE9BQU8sRUFBRSxzQ0FBc0MsRUFBRSxZQUFxQixDQUFDLENBQUM7WUFDeEYsQ0FBQztRQUNILENBQUM7SUFDSCxDQUFDO0lBRUQsS0FBSyxDQUFDLE9BQU87UUFDWCxNQUFNLE9BQU8sR0FBRyxNQUFNLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUNoRCxNQUFNLE9BQU8sR0FBRyxNQUFNLE9BQU8sQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxNQUFNLENBQUMsRUFBRSxFQUFFLENBQUMsTUFBTSxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQztRQUV0RixxRUFBcUU7UUFDckUsTUFBTSxRQUFRLEdBQUcsT0FBTzthQUNyQixHQUFHLENBQUMsQ0FBQyxNQUFNLEVBQUUsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO2FBQzdELE1BQU0sQ0FBQyxDQUFDLEVBQUUsTUFBTSxFQUFFLEVBQUUsRUFBRSxDQUFDLE1BQU0sQ0FBQyxNQUFNLEtBQUssVUFBVSxDQUFDLENBQUM7UUFFeEQsSUFBSSxRQUFRLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDO1lBQ3hCLFFBQVEsQ0FBQyxPQUFPLENBQUMsQ0FBQyxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsRUFBRSxFQUFFO2dCQUNwQyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQ1gsT0FBTyxFQUNQLHNDQUFzQyxJQUFJLEVBQUUsRUFDM0MsTUFBZ0MsQ0FBQyxNQUFNLENBQ3pDLENBQUM7WUFDSixDQUFDLENBQUMsQ0FBQztZQUNILElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FDWCxPQUFPLEVBQ1AsbUJBQW1CLFFBQVEsQ0FBQyxNQUFNLElBQUksT0FBTyxDQUFDLE1BQU0sb0JBQW9CO2dCQUN0RSxvQ0FBb0MsQ0FDdkMsQ0FBQztRQUNKLENBQUM7SUFDSCxDQUFDO0NBQ0Y7QUE3SEQsNEJBNkhDIn0=
|