@chinchillaenterprises/mcp-slack 3.1.1 → 4.0.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.
- package/README.md +107 -76
- package/dist/index.d.ts +154 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1597 -1067
- package/package.json +7 -8
package/dist/index.js
CHANGED
|
@@ -5,331 +5,275 @@ import { ListToolsRequestSchema, CallToolRequestSchema, } from "@modelcontextpro
|
|
|
5
5
|
import { WebClient } from "@slack/web-api";
|
|
6
6
|
import { z } from "zod";
|
|
7
7
|
import { promises as fs } from "fs";
|
|
8
|
+
import { realpathSync } from "fs";
|
|
8
9
|
import path from "path";
|
|
9
10
|
import os from "os";
|
|
10
11
|
import crypto from "crypto";
|
|
11
12
|
import { tmpdir } from "os";
|
|
12
13
|
import { execFile } from "child_process";
|
|
13
14
|
import { promisify } from "util";
|
|
15
|
+
import { fileURLToPath } from "url";
|
|
14
16
|
import Fuse from "fuse.js";
|
|
15
17
|
const execFileAsync = promisify(execFile);
|
|
16
18
|
// =====================================================================================
|
|
17
|
-
//
|
|
19
|
+
// OUTPUT FORMATTING HELPERS (Bundle 0)
|
|
20
|
+
// -------------------------------------------------------------------------------------
|
|
21
|
+
// These are the shared, framework-free building blocks the later UX bundles reuse.
|
|
22
|
+
//
|
|
23
|
+
// WHY THIS EXISTS: this server's single biggest token cost is that verbose tool
|
|
24
|
+
// RESULTS linger in the session context window and get re-sent every turn (measured
|
|
25
|
+
// at ~21% of a user's usage). Pretty-printed JSON (JSON.stringify(x, null, 2)) is the
|
|
26
|
+
// main offender. leanResult() establishes the convention: compact by default, fuller
|
|
27
|
+
// only when the caller explicitly asks for verbose. Keep these together.
|
|
18
28
|
// =====================================================================================
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
}
|
|
70
|
-
}
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
if (
|
|
82
|
-
|
|
83
|
-
try {
|
|
84
|
-
const [ivHex, encrypted] = encryptedText.split(':');
|
|
85
|
-
const iv = Buffer.from(ivHex, 'hex');
|
|
86
|
-
const decipher = crypto.createDecipheriv('aes-256-cbc', this.encryptionKey, iv);
|
|
87
|
-
let decrypted = decipher.update(encrypted, 'hex', 'utf8');
|
|
88
|
-
decrypted += decipher.final('utf8');
|
|
89
|
-
return decrypted;
|
|
90
|
-
}
|
|
91
|
-
catch (error) {
|
|
92
|
-
console.error('[CredentialManager] Failed to decrypt:', error);
|
|
93
|
-
return encryptedText; // Return as-is if decryption fails
|
|
94
|
-
}
|
|
95
|
-
}
|
|
96
|
-
async ensureInitialized() {
|
|
97
|
-
await this.initPromise;
|
|
98
|
-
}
|
|
99
|
-
async saveAccount(account) {
|
|
100
|
-
await this.ensureInitialized();
|
|
101
|
-
const persistedAccount = {
|
|
102
|
-
...account,
|
|
103
|
-
addedAt: new Date().toISOString(),
|
|
104
|
-
lastUsed: new Date().toISOString()
|
|
105
|
-
};
|
|
106
|
-
// Try keytar first
|
|
107
|
-
if (this.isKeytarAvailable && this.keytar) {
|
|
108
|
-
try {
|
|
109
|
-
await this.keytar.setPassword(this.SERVICE_NAME, `slack-${account.id}`, JSON.stringify(persistedAccount));
|
|
110
|
-
console.error(`[CredentialManager] Account ${account.id} saved to keychain`);
|
|
111
|
-
return; // Success with keytar
|
|
112
|
-
}
|
|
113
|
-
catch (error) {
|
|
114
|
-
console.error('[CredentialManager] Keytar save failed, falling back to file:', error);
|
|
115
|
-
}
|
|
116
|
-
}
|
|
117
|
-
// Fallback to file-based storage
|
|
118
|
-
await this.saveToFile(persistedAccount);
|
|
119
|
-
}
|
|
120
|
-
async saveToFile(account) {
|
|
121
|
-
try {
|
|
122
|
-
// Read existing accounts
|
|
123
|
-
const accounts = await this.loadFromFile();
|
|
124
|
-
// Encrypt sensitive data
|
|
125
|
-
const encryptedAccount = {
|
|
126
|
-
...account,
|
|
127
|
-
botToken: this.encrypt(account.botToken),
|
|
128
|
-
userToken: account.userToken ? this.encrypt(account.userToken) : undefined
|
|
129
|
-
};
|
|
130
|
-
// Update or add account
|
|
131
|
-
accounts[account.id] = encryptedAccount;
|
|
132
|
-
// Save back to file
|
|
133
|
-
await fs.writeFile(this.CONFIG_FILE, JSON.stringify(accounts, null, 2), 'utf8');
|
|
134
|
-
await fs.chmod(this.CONFIG_FILE, 0o600); // Read/write for owner only
|
|
135
|
-
console.error(`[CredentialManager] Account ${account.id} saved to file`);
|
|
136
|
-
}
|
|
137
|
-
catch (error) {
|
|
138
|
-
console.error('[CredentialManager] Failed to save account to file:', error);
|
|
139
|
-
throw error;
|
|
140
|
-
}
|
|
141
|
-
}
|
|
142
|
-
async loadFromFile() {
|
|
143
|
-
try {
|
|
144
|
-
const data = await fs.readFile(this.CONFIG_FILE, 'utf8');
|
|
145
|
-
return JSON.parse(data);
|
|
146
|
-
}
|
|
147
|
-
catch (error) {
|
|
148
|
-
// File doesn't exist or is invalid
|
|
149
|
-
return {};
|
|
150
|
-
}
|
|
151
|
-
}
|
|
152
|
-
async updateAccount(account) {
|
|
153
|
-
await this.ensureInitialized();
|
|
154
|
-
// Get existing to preserve addedAt
|
|
155
|
-
const existing = await this.getAccount(account.id);
|
|
156
|
-
const persistedAccount = {
|
|
157
|
-
...account,
|
|
158
|
-
addedAt: existing?.addedAt || new Date().toISOString(),
|
|
159
|
-
lastUsed: new Date().toISOString()
|
|
160
|
-
};
|
|
161
|
-
// Try keytar first
|
|
162
|
-
if (this.isKeytarAvailable && this.keytar) {
|
|
163
|
-
try {
|
|
164
|
-
await this.keytar.setPassword(this.SERVICE_NAME, `slack-${account.id}`, JSON.stringify(persistedAccount));
|
|
165
|
-
console.error(`[CredentialManager] Account ${account.id} updated in keychain`);
|
|
166
|
-
return; // Success with keytar
|
|
167
|
-
}
|
|
168
|
-
catch (error) {
|
|
169
|
-
console.error('[CredentialManager] Keytar update failed, falling back to file:', error);
|
|
170
|
-
}
|
|
171
|
-
}
|
|
172
|
-
// Fallback to file-based storage
|
|
173
|
-
await this.saveToFile(persistedAccount);
|
|
174
|
-
}
|
|
175
|
-
async loadAllAccounts() {
|
|
176
|
-
await this.ensureInitialized();
|
|
177
|
-
const accounts = [];
|
|
178
|
-
// Try keytar first
|
|
179
|
-
if (this.isKeytarAvailable && this.keytar) {
|
|
180
|
-
try {
|
|
181
|
-
const credentials = await this.keytar.findCredentials(this.SERVICE_NAME);
|
|
182
|
-
for (const cred of credentials) {
|
|
183
|
-
try {
|
|
184
|
-
const account = JSON.parse(cred.password);
|
|
185
|
-
accounts.push(account);
|
|
186
|
-
}
|
|
187
|
-
catch (error) {
|
|
188
|
-
console.error(`[CredentialManager] Failed to parse keytar account ${cred.account}:`, error);
|
|
189
|
-
}
|
|
190
|
-
}
|
|
191
|
-
if (accounts.length > 0) {
|
|
192
|
-
console.error(`[CredentialManager] Loaded ${accounts.length} accounts from keychain`);
|
|
193
|
-
return accounts;
|
|
194
|
-
}
|
|
195
|
-
}
|
|
196
|
-
catch (error) {
|
|
197
|
-
console.error('[CredentialManager] Failed to load from keychain:', error);
|
|
198
|
-
}
|
|
199
|
-
}
|
|
200
|
-
// Fallback to file-based storage
|
|
201
|
-
try {
|
|
202
|
-
const fileAccounts = await this.loadFromFile();
|
|
203
|
-
for (const [id, encryptedAccount] of Object.entries(fileAccounts)) {
|
|
204
|
-
try {
|
|
205
|
-
// Decrypt sensitive data
|
|
206
|
-
const account = {
|
|
207
|
-
...encryptedAccount,
|
|
208
|
-
botToken: this.decrypt(encryptedAccount.botToken),
|
|
209
|
-
userToken: encryptedAccount.userToken ? this.decrypt(encryptedAccount.userToken) : undefined
|
|
210
|
-
};
|
|
211
|
-
accounts.push(account);
|
|
212
|
-
}
|
|
213
|
-
catch (error) {
|
|
214
|
-
console.error(`[CredentialManager] Failed to process file account ${id}:`, error);
|
|
215
|
-
}
|
|
216
|
-
}
|
|
217
|
-
console.error(`[CredentialManager] Loaded ${accounts.length} accounts from file`);
|
|
218
|
-
}
|
|
219
|
-
catch (error) {
|
|
220
|
-
console.error('[CredentialManager] Failed to load from file:', error);
|
|
221
|
-
}
|
|
222
|
-
return accounts;
|
|
223
|
-
}
|
|
224
|
-
async getAccount(accountId) {
|
|
225
|
-
await this.ensureInitialized();
|
|
226
|
-
// Try keytar first
|
|
227
|
-
if (this.isKeytarAvailable && this.keytar) {
|
|
228
|
-
try {
|
|
229
|
-
const password = await this.keytar.getPassword(this.SERVICE_NAME, `slack-${accountId}`);
|
|
230
|
-
if (password) {
|
|
231
|
-
return JSON.parse(password);
|
|
232
|
-
}
|
|
233
|
-
}
|
|
234
|
-
catch (error) {
|
|
235
|
-
console.error(`[CredentialManager] Failed to get account ${accountId} from keychain:`, error);
|
|
236
|
-
}
|
|
237
|
-
}
|
|
238
|
-
// Fallback to file-based storage
|
|
239
|
-
try {
|
|
240
|
-
const accounts = await this.loadFromFile();
|
|
241
|
-
const encryptedAccount = accounts[accountId];
|
|
242
|
-
if (encryptedAccount) {
|
|
243
|
-
// Decrypt sensitive data
|
|
244
|
-
const account = {
|
|
245
|
-
...encryptedAccount,
|
|
246
|
-
botToken: this.decrypt(encryptedAccount.botToken),
|
|
247
|
-
userToken: encryptedAccount.userToken ? this.decrypt(encryptedAccount.userToken) : undefined
|
|
248
|
-
};
|
|
249
|
-
return account;
|
|
250
|
-
}
|
|
251
|
-
}
|
|
252
|
-
catch (error) {
|
|
253
|
-
console.error(`[CredentialManager] Failed to get account ${accountId} from file:`, error);
|
|
254
|
-
}
|
|
255
|
-
return null;
|
|
256
|
-
}
|
|
257
|
-
async deleteAccount(accountId) {
|
|
258
|
-
await this.ensureInitialized();
|
|
259
|
-
// Try keytar first
|
|
260
|
-
if (this.isKeytarAvailable && this.keytar) {
|
|
261
|
-
try {
|
|
262
|
-
await this.keytar.deletePassword(this.SERVICE_NAME, `slack-${accountId}`);
|
|
263
|
-
console.error(`[CredentialManager] Account ${accountId} deleted from keychain`);
|
|
264
|
-
}
|
|
265
|
-
catch (error) {
|
|
266
|
-
console.error('[CredentialManager] Failed to delete from keychain:', error);
|
|
267
|
-
}
|
|
268
|
-
}
|
|
269
|
-
// Also delete from file-based storage
|
|
270
|
-
try {
|
|
271
|
-
const accounts = await this.loadFromFile();
|
|
272
|
-
delete accounts[accountId];
|
|
273
|
-
await fs.writeFile(this.CONFIG_FILE, JSON.stringify(accounts, null, 2), 'utf8');
|
|
274
|
-
console.error(`[CredentialManager] Account ${accountId} deleted from file`);
|
|
29
|
+
/**
|
|
30
|
+
* Compact result formatter. Default (lean) form is single-line / minimal — NO
|
|
31
|
+
* pretty-print — so it doesn't bloat the context window. Pass { verbose: true } for
|
|
32
|
+
* the fuller, indented form when a human actually needs to read every field.
|
|
33
|
+
*
|
|
34
|
+
* Accepts an already-prepared `data` value. Callers are expected to have already
|
|
35
|
+
* trimmed to the fields that matter for the lean case (see the READ tools), but this
|
|
36
|
+
* function is also safe to hand a full object for the verbose path.
|
|
37
|
+
*/
|
|
38
|
+
export function leanResult(data, opts = {}) {
|
|
39
|
+
if (opts.verbose) {
|
|
40
|
+
return JSON.stringify(data, null, 2);
|
|
41
|
+
}
|
|
42
|
+
// Lean: single-line JSON. For arrays of flat objects we additionally collapse to
|
|
43
|
+
// a compact NDJSON-ish form which reads better and tokenizes smaller than one
|
|
44
|
+
// giant single-line array for long lists.
|
|
45
|
+
if (Array.isArray(data) && data.length > 0 && data.every(isFlatObject)) {
|
|
46
|
+
return data.map((row) => JSON.stringify(row)).join("\n");
|
|
47
|
+
}
|
|
48
|
+
return JSON.stringify(data);
|
|
49
|
+
}
|
|
50
|
+
// A "flat" object has only primitive / null values (no nested objects or arrays).
|
|
51
|
+
export function isFlatObject(v) {
|
|
52
|
+
if (typeof v !== "object" || v === null || Array.isArray(v))
|
|
53
|
+
return false;
|
|
54
|
+
return Object.values(v).every((val) => val === null || typeof val !== "object");
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Render tabular data as a clean, column-aligned monospace ASCII table using
|
|
58
|
+
* box-drawing characters. The output is meant to be dropped inside a Slack code
|
|
59
|
+
* block (```) so it renders with a fixed-width font and column alignment survives.
|
|
60
|
+
*
|
|
61
|
+
* Accepts any of:
|
|
62
|
+
* - array of flat objects → columns inferred from keys (or pass `columns`)
|
|
63
|
+
* - 2D array (string[][]) → first row treated as header
|
|
64
|
+
* - a markdown table string (| a | b |\n|---|---|\n| 1 | 2 |)
|
|
65
|
+
*
|
|
66
|
+
* Long cells are truncated with an ellipsis past a per-column max width (default 40).
|
|
67
|
+
* Numeric-looking columns are right-aligned automatically unless overridden.
|
|
68
|
+
*/
|
|
69
|
+
export function renderTable(rows, columns) {
|
|
70
|
+
const DEFAULT_MAX = 40;
|
|
71
|
+
let headers = [];
|
|
72
|
+
let body = [];
|
|
73
|
+
let colMeta = [];
|
|
74
|
+
if (typeof rows === "string") {
|
|
75
|
+
// Parse a markdown table string.
|
|
76
|
+
const parsed = parseMarkdownTable(rows);
|
|
77
|
+
headers = parsed.headers;
|
|
78
|
+
body = parsed.body;
|
|
79
|
+
colMeta = headers.map((h) => ({ key: h, label: h }));
|
|
80
|
+
}
|
|
81
|
+
else if (Array.isArray(rows) && rows.length > 0 && Array.isArray(rows[0])) {
|
|
82
|
+
// 2D array: first row is the header.
|
|
83
|
+
const grid = rows;
|
|
84
|
+
headers = (grid[0] || []).map((c) => String(c ?? ""));
|
|
85
|
+
body = grid.slice(1).map((r) => r.map((c) => cellToString(c)));
|
|
86
|
+
colMeta = headers.map((h) => ({ key: h, label: h }));
|
|
87
|
+
}
|
|
88
|
+
else {
|
|
89
|
+
// Array of objects.
|
|
90
|
+
const objRows = rows;
|
|
91
|
+
if (columns && columns.length > 0) {
|
|
92
|
+
colMeta = columns;
|
|
275
93
|
}
|
|
276
|
-
|
|
277
|
-
|
|
94
|
+
else {
|
|
95
|
+
const keys = new Set();
|
|
96
|
+
for (const r of objRows)
|
|
97
|
+
Object.keys(r || {}).forEach((k) => keys.add(k));
|
|
98
|
+
colMeta = Array.from(keys).map((k) => ({ key: k, label: k }));
|
|
99
|
+
}
|
|
100
|
+
headers = colMeta.map((c) => c.label ?? c.key);
|
|
101
|
+
body = objRows.map((r) => colMeta.map((c) => cellToString(r?.[c.key])));
|
|
102
|
+
}
|
|
103
|
+
if (headers.length === 0)
|
|
104
|
+
return "(empty table)";
|
|
105
|
+
const colCount = headers.length;
|
|
106
|
+
// Decide alignment: explicit override wins; otherwise right-align columns whose
|
|
107
|
+
// every body cell looks numeric.
|
|
108
|
+
const aligns = colMeta.map((c, i) => {
|
|
109
|
+
if (c?.align)
|
|
110
|
+
return c.align;
|
|
111
|
+
const allNumeric = body.length > 0 &&
|
|
112
|
+
body.every((r) => {
|
|
113
|
+
const v = (r[i] ?? "").trim();
|
|
114
|
+
return v === "" || /^-?[\d,]+(\.\d+)?%?$/.test(v);
|
|
115
|
+
});
|
|
116
|
+
return allNumeric ? "right" : "left";
|
|
117
|
+
});
|
|
118
|
+
const maxWidths = colMeta.map((c) => c?.maxWidth ?? DEFAULT_MAX);
|
|
119
|
+
// Truncate then compute column widths.
|
|
120
|
+
const trunc = (s, max) => s.length > max ? s.slice(0, Math.max(0, max - 1)) + "…" : s;
|
|
121
|
+
const hdr = headers.map((h, i) => trunc(h, maxWidths[i]));
|
|
122
|
+
const cells = body.map((r) => Array.from({ length: colCount }, (_, i) => trunc(r[i] ?? "", maxWidths[i])));
|
|
123
|
+
const widths = Array.from({ length: colCount }, (_, i) => Math.max(hdr[i].length, ...cells.map((r) => r[i].length), 1));
|
|
124
|
+
const pad = (s, w, align) => align === "right" ? s.padStart(w) : s.padEnd(w);
|
|
125
|
+
const top = "┌" + widths.map((w) => "─".repeat(w + 2)).join("┬") + "┐";
|
|
126
|
+
const sep = "├" + widths.map((w) => "─".repeat(w + 2)).join("┼") + "┤";
|
|
127
|
+
const bottom = "└" + widths.map((w) => "─".repeat(w + 2)).join("┴") + "┘";
|
|
128
|
+
const fmtRow = (r) => "│ " + r.map((c, i) => pad(c, widths[i], aligns[i])).join(" │ ") + " │";
|
|
129
|
+
const lines = [top, fmtRow(hdr), sep, ...cells.map(fmtRow), bottom];
|
|
130
|
+
return lines.join("\n");
|
|
131
|
+
}
|
|
132
|
+
export function cellToString(v) {
|
|
133
|
+
if (v === null || v === undefined)
|
|
134
|
+
return "";
|
|
135
|
+
if (typeof v === "object")
|
|
136
|
+
return JSON.stringify(v);
|
|
137
|
+
return String(v);
|
|
138
|
+
}
|
|
139
|
+
// Parse a markdown pipe-table string into { headers, body }.
|
|
140
|
+
export function parseMarkdownTable(md) {
|
|
141
|
+
const lines = md
|
|
142
|
+
.split("\n")
|
|
143
|
+
.map((l) => l.trim())
|
|
144
|
+
.filter((l) => l.includes("|"));
|
|
145
|
+
if (lines.length === 0)
|
|
146
|
+
return { headers: [], body: [] };
|
|
147
|
+
const splitRow = (line) => line
|
|
148
|
+
.replace(/^\|/, "")
|
|
149
|
+
.replace(/\|$/, "")
|
|
150
|
+
.split("|")
|
|
151
|
+
.map((c) => c.trim());
|
|
152
|
+
const headers = splitRow(lines[0]);
|
|
153
|
+
// Drop the separator row (e.g. |---|---|) if present.
|
|
154
|
+
const bodyLines = lines.slice(1).filter((l) => !/^\|?[\s:|-]+\|?$/.test(l));
|
|
155
|
+
const body = bodyLines.map(splitRow);
|
|
156
|
+
return { headers, body };
|
|
157
|
+
}
|
|
158
|
+
/**
|
|
159
|
+
* Render a unicode progress bar, e.g. renderProgressBar(40) => "▰▰▰▰▱▱▱▱▱▱ 40%".
|
|
160
|
+
*/
|
|
161
|
+
export function renderProgressBar(pct, width = 20) {
|
|
162
|
+
const clamped = Math.max(0, Math.min(100, Math.round(pct)));
|
|
163
|
+
const filled = Math.round((clamped / 100) * width);
|
|
164
|
+
const empty = width - filled;
|
|
165
|
+
return "▰".repeat(filled) + "▱".repeat(empty) + ` ${clamped}%`;
|
|
166
|
+
}
|
|
167
|
+
/**
|
|
168
|
+
* Build a Slack Block Kit blocks[] array: a header block, section blocks (each with
|
|
169
|
+
* optional two-column fields), dividers between sections, and an optional context
|
|
170
|
+
* footer. Used by slack_send_card and the task-lifecycle summary cards.
|
|
171
|
+
*
|
|
172
|
+
* Returns { blocks } always, plus { attachments } when a color bar is requested
|
|
173
|
+
* (Slack only supports the colored left-bar via the legacy attachments wrapper).
|
|
174
|
+
*/
|
|
175
|
+
export function buildCard(opts) {
|
|
176
|
+
const blocks = [];
|
|
177
|
+
blocks.push({
|
|
178
|
+
type: "header",
|
|
179
|
+
text: { type: "plain_text", text: truncatePlain(opts.header, 150), emoji: true },
|
|
180
|
+
});
|
|
181
|
+
const sections = opts.sections ?? [];
|
|
182
|
+
sections.forEach((section, idx) => {
|
|
183
|
+
const block = { type: "section" };
|
|
184
|
+
if (section.text) {
|
|
185
|
+
block.text = { type: "mrkdwn", text: section.text };
|
|
186
|
+
}
|
|
187
|
+
if (section.fields && section.fields.length > 0) {
|
|
188
|
+
block.fields = section.fields.slice(0, 10).map((f) => ({
|
|
189
|
+
type: "mrkdwn",
|
|
190
|
+
text: f.label ? `*${f.label}*\n${f.value}` : f.value,
|
|
191
|
+
}));
|
|
278
192
|
}
|
|
193
|
+
// A section block must carry either text or fields.
|
|
194
|
+
if (block.text || block.fields)
|
|
195
|
+
blocks.push(block);
|
|
196
|
+
if (idx < sections.length - 1)
|
|
197
|
+
blocks.push({ type: "divider" });
|
|
198
|
+
});
|
|
199
|
+
if (opts.context) {
|
|
200
|
+
blocks.push({
|
|
201
|
+
type: "context",
|
|
202
|
+
elements: [{ type: "mrkdwn", text: opts.context }],
|
|
203
|
+
});
|
|
279
204
|
}
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
return
|
|
205
|
+
if (opts.color) {
|
|
206
|
+
// Colored cards must be wrapped in an attachment to get the left color bar.
|
|
207
|
+
return { blocks: [], attachments: [{ color: opts.color, blocks }] };
|
|
283
208
|
}
|
|
209
|
+
return { blocks };
|
|
210
|
+
}
|
|
211
|
+
export function truncatePlain(s, max) {
|
|
212
|
+
return s.length > max ? s.slice(0, max - 1) + "…" : s;
|
|
284
213
|
}
|
|
285
214
|
// =====================================================================================
|
|
286
|
-
// VALIDATION SCHEMAS - Account Management Tools
|
|
215
|
+
// VALIDATION SCHEMAS - Account Management Tools (read-only)
|
|
287
216
|
// =====================================================================================
|
|
288
217
|
const ListAccountsArgsSchema = z.object({});
|
|
289
|
-
const SwitchAccountArgsSchema = z.object({
|
|
290
|
-
account_id: z.string().describe("Account ID to switch to")
|
|
291
|
-
});
|
|
292
|
-
const AddAccountArgsSchema = z.object({
|
|
293
|
-
name: z.string().describe("Human-friendly name for this account"),
|
|
294
|
-
bot_token: z.string().describe("Bot User OAuth Token (starts with xoxb-)"),
|
|
295
|
-
user_token: z.string().optional().describe("User OAuth Token (starts with xoxp-) - optional"),
|
|
296
|
-
team_id: z.string().describe("Slack team ID")
|
|
297
|
-
});
|
|
298
|
-
const RemoveAccountArgsSchema = z.object({
|
|
299
|
-
account_id: z.string().describe("Account ID to remove")
|
|
300
|
-
});
|
|
301
218
|
const GetActiveAccountArgsSchema = z.object({});
|
|
302
|
-
const SetDefaultAccountArgsSchema = z.object({
|
|
303
|
-
account_id: z.string().describe("Account ID to set as default")
|
|
304
|
-
});
|
|
305
|
-
const UpdateAccountArgsSchema = z.object({
|
|
306
|
-
account_id: z.string().describe("Account ID to update"),
|
|
307
|
-
bot_token: z.string().optional().describe("New Bot User OAuth Token (starts with xoxb-)"),
|
|
308
|
-
user_token: z.string().optional().describe("New User OAuth Token (starts with xoxp-)")
|
|
309
|
-
});
|
|
310
219
|
// =====================================================================================
|
|
311
220
|
// EXISTING TOOL SCHEMAS (from original mcp-slacker)
|
|
312
221
|
// =====================================================================================
|
|
313
222
|
const ListChannelsArgsSchema = z.object({
|
|
314
223
|
types: z.string().optional().describe("Comma-separated list of channel types: public_channel, private_channel, mpim, im"),
|
|
315
|
-
limit: z.number().optional().describe("Maximum number of channels to return (default: 100)")
|
|
224
|
+
limit: z.number().optional().describe("Maximum number of channels to return (default: 100)"),
|
|
225
|
+
verbose: z.boolean().optional().describe("Return the full raw channel objects. Default false returns lean output: id + name + is_private + num_members.")
|
|
316
226
|
});
|
|
227
|
+
// Shared session-identity fields (Bundle 4). Requires the chat:write.customize bot
|
|
228
|
+
// scope; Slack ignores them gracefully otherwise. Defaults can be set once via the
|
|
229
|
+
// SLACK_SESSION_USERNAME / SLACK_SESSION_ICON env vars.
|
|
230
|
+
const IdentityFields = {
|
|
231
|
+
username: z.string().optional().describe("Post under this display name (e.g. 'Claude · ChillMCP'). Requires chat:write.customize scope. Falls back to SLACK_SESSION_USERNAME env var."),
|
|
232
|
+
icon_emoji: z.string().optional().describe("Icon emoji like ':robot_face:'. Requires chat:write.customize. Falls back to SLACK_SESSION_ICON env var."),
|
|
233
|
+
icon_url: z.string().optional().describe("Icon image URL (overrides icon_emoji). Requires chat:write.customize.")
|
|
234
|
+
};
|
|
317
235
|
const SendMessageArgsSchema = z.object({
|
|
318
236
|
channel: z.string().describe("Channel ID or name (e.g., C1234567890 or #general)"),
|
|
319
237
|
text: z.string().describe("Text content of the message"),
|
|
320
|
-
thread_ts: z.string().optional().describe("Timestamp of the parent message to reply in thread")
|
|
238
|
+
thread_ts: z.string().optional().describe("Timestamp of the parent message to reply in thread"),
|
|
239
|
+
...IdentityFields
|
|
321
240
|
});
|
|
322
241
|
const GetChannelHistoryArgsSchema = z.object({
|
|
323
242
|
channel: z.string().describe("Channel ID to fetch history from"),
|
|
324
|
-
limit: z.number().optional().describe("Number of messages to return (default: 100)")
|
|
243
|
+
limit: z.number().optional().describe("Number of messages to return (default: 100)"),
|
|
244
|
+
verbose: z.boolean().optional().describe("Return the full raw API payload. Default false returns lean output: verbatim message text + user + ts, with metadata exhaust stripped.")
|
|
325
245
|
});
|
|
326
246
|
const AddReactionArgsSchema = z.object({
|
|
327
247
|
channel: z.string().describe("Channel ID where the message is"),
|
|
328
248
|
timestamp: z.string().describe("Timestamp of the message to react to"),
|
|
329
249
|
name: z.string().describe("Reaction emoji name (without colons)")
|
|
330
250
|
});
|
|
251
|
+
// ----- Legate pull/polling tools (multi-session shared-bot coordination) --------------
|
|
252
|
+
const PollArgsSchema = z.object({
|
|
253
|
+
channel: z.string().describe("Channel ID or name (e.g., C1234567890 or #echelon)"),
|
|
254
|
+
call_sign: z.string().describe("This Legate's NATO call-sign (e.g., Alpha, Bravo)"),
|
|
255
|
+
limit: z.number().optional().describe("Max messages to scan/return (default: 15)"),
|
|
256
|
+
since: z.string().optional().describe("Slack ts to poll from; overrides the stored cursor"),
|
|
257
|
+
include_chatter: z.boolean().optional().describe("Include messages not addressed to anyone (default: false)")
|
|
258
|
+
});
|
|
259
|
+
const ClaimLaneArgsSchema = z.object({
|
|
260
|
+
channel: z.string().describe("Channel ID or name (e.g., C1234567890 or #echelon)"),
|
|
261
|
+
call_sign: z.string().describe("This Legate's NATO call-sign"),
|
|
262
|
+
task: z.string().describe("The work being claimed (free text; normalized to a lane key)"),
|
|
263
|
+
ttl_minutes: z.number().optional().describe("How long a claim stays valid (default: 20)"),
|
|
264
|
+
lookback: z.number().optional().describe("How many recent messages to scan for prior claims (default: 30)"),
|
|
265
|
+
release: z.boolean().optional().describe("If true, post a LANE RELEASE for this task instead of claiming (default: false)")
|
|
266
|
+
});
|
|
267
|
+
const CheckinArgsSchema = z.object({
|
|
268
|
+
channel: z.string().describe("Channel ID or name (e.g., C1234567890 or #echelon)"),
|
|
269
|
+
call_sign: z.string().describe("This Legate's NATO call-sign"),
|
|
270
|
+
status: z.string().describe("One-line status to post"),
|
|
271
|
+
force: z.boolean().optional().describe("Post even if the status is unchanged (default: false)"),
|
|
272
|
+
heartbeat_minutes: z.number().optional().describe("If >0, re-post an unchanged status once this many minutes have elapsed (default: 0)")
|
|
273
|
+
});
|
|
331
274
|
const ListUsersArgsSchema = z.object({
|
|
332
|
-
limit: z.number().optional().describe("Maximum number of users to return (default: 100)")
|
|
275
|
+
limit: z.number().optional().describe("Maximum number of users to return (default: 100)"),
|
|
276
|
+
verbose: z.boolean().optional().describe("Return the full raw user objects. Default false returns lean output: id + name + real_name only.")
|
|
333
277
|
});
|
|
334
278
|
const GetUserByNameArgsSchema = z.object({
|
|
335
279
|
name: z.string().describe("Name or display name to search for")
|
|
@@ -345,18 +289,21 @@ const SearchFilesArgsSchema = z.object({
|
|
|
345
289
|
const SearchMessagesArgsSchema = z.object({
|
|
346
290
|
query: z.string().describe("Search query for messages"),
|
|
347
291
|
count: z.number().optional().describe("Number of results to return (default: 20)"),
|
|
348
|
-
page: z.number().optional().describe("Page number of results (default: 1)")
|
|
292
|
+
page: z.number().optional().describe("Page number of results (default: 1)"),
|
|
293
|
+
verbose: z.boolean().optional().describe("Return the full raw search payload. Default false returns lean output: verbatim text + user + channel + ts + permalink.")
|
|
349
294
|
});
|
|
350
295
|
const SearchByUserArgsSchema = z.object({
|
|
351
296
|
user_id: z.string().describe("User ID to search messages from"),
|
|
352
297
|
query: z.string().optional().describe("Additional search query"),
|
|
353
|
-
count: z.number().optional().describe("Number of results to return (default: 20)")
|
|
298
|
+
count: z.number().optional().describe("Number of results to return (default: 20)"),
|
|
299
|
+
verbose: z.boolean().optional().describe("Return the full raw search payload. Default false returns lean output: verbatim text + channel + ts + permalink.")
|
|
354
300
|
});
|
|
355
301
|
const SearchByDateRangeArgsSchema = z.object({
|
|
356
302
|
from_date: z.string().describe("Start date (YYYY-MM-DD)"),
|
|
357
303
|
to_date: z.string().describe("End date (YYYY-MM-DD)"),
|
|
358
304
|
query: z.string().optional().describe("Additional search query"),
|
|
359
|
-
count: z.number().optional().describe("Number of results to return (default: 20)")
|
|
305
|
+
count: z.number().optional().describe("Number of results to return (default: 20)"),
|
|
306
|
+
verbose: z.boolean().optional().describe("Return the full raw search payload. Default false returns lean output: verbatim text + user + channel + ts + permalink.")
|
|
360
307
|
});
|
|
361
308
|
const PinMessageArgsSchema = z.object({
|
|
362
309
|
channel: z.string().describe("Channel ID where the message is"),
|
|
@@ -392,11 +339,62 @@ const CreateReminderArgsSchema = z.object({
|
|
|
392
339
|
});
|
|
393
340
|
const ListRemindersArgsSchema = z.object({});
|
|
394
341
|
const GetCustomEmojiArgsSchema = z.object({});
|
|
395
|
-
const GetWorkspaceStatsArgsSchema = z.object({
|
|
342
|
+
const GetWorkspaceStatsArgsSchema = z.object({
|
|
343
|
+
verbose: z.boolean().optional().describe("Return the fuller stats payload (indented). Default false returns a lean one-line summary.")
|
|
344
|
+
});
|
|
345
|
+
const SendTableArgsSchema = z.object({
|
|
346
|
+
channel: z.string().describe("Channel ID or name to post the table to"),
|
|
347
|
+
title: z.string().optional().describe("Optional bold title rendered above the table"),
|
|
348
|
+
rows: z.union([
|
|
349
|
+
z.array(z.record(z.any())), // array of objects
|
|
350
|
+
z.array(z.array(z.any())), // 2D array (first row = header)
|
|
351
|
+
z.string() // markdown table string
|
|
352
|
+
]).describe("Table data: array of objects, a 2D array (first row = header), OR a markdown pipe-table string"),
|
|
353
|
+
as_code_block: z.boolean().optional().describe("Wrap the ASCII table in a ``` code block so columns stay aligned (default true)")
|
|
354
|
+
});
|
|
355
|
+
// ---- Block Kit cards + threaded task lifecycle (Bundle 2) ----
|
|
356
|
+
const SendCardArgsSchema = z.object({
|
|
357
|
+
channel: z.string().describe("Channel ID or name to post the card to"),
|
|
358
|
+
header: z.string().describe("Card header text (plain text)"),
|
|
359
|
+
sections: z.array(z.object({
|
|
360
|
+
text: z.string().optional().describe("mrkdwn body text for this section"),
|
|
361
|
+
fields: z.array(z.object({
|
|
362
|
+
label: z.string().optional(),
|
|
363
|
+
value: z.string()
|
|
364
|
+
})).optional().describe("Up to 10 two-column key/value fields")
|
|
365
|
+
})).optional().describe("Section blocks rendered in order, separated by dividers"),
|
|
366
|
+
context: z.string().optional().describe("Small footer context line (mrkdwn)"),
|
|
367
|
+
color: z.string().optional().describe("Hex color for the left bar, e.g. #3D8C62"),
|
|
368
|
+
...IdentityFields
|
|
369
|
+
});
|
|
370
|
+
const StartTaskArgsSchema = z.object({
|
|
371
|
+
channel: z.string().describe("Channel ID or name to post the task card to"),
|
|
372
|
+
title: z.string().describe("Task title"),
|
|
373
|
+
total_steps: z.number().optional().describe("Total number of steps (enables a progress bar on updates)"),
|
|
374
|
+
...IdentityFields
|
|
375
|
+
});
|
|
376
|
+
const UpdateTaskArgsSchema = z.object({
|
|
377
|
+
channel: z.string().describe("Channel ID where the task card lives"),
|
|
378
|
+
task_ts: z.string().describe("Timestamp of the parent task card (from slack_start_task)"),
|
|
379
|
+
message: z.string().describe("Progress update — posted as a THREADED reply. Do NOT @-mention here; routine updates must stay quiet."),
|
|
380
|
+
step: z.number().optional().describe("Current step number (with total_steps, updates the parent's progress bar)"),
|
|
381
|
+
total_steps: z.number().optional().describe("Total steps (defaults to the value from start_task if known)"),
|
|
382
|
+
...IdentityFields
|
|
383
|
+
});
|
|
384
|
+
const CompleteTaskArgsSchema = z.object({
|
|
385
|
+
channel: z.string().describe("Channel ID where the task card lives"),
|
|
386
|
+
task_ts: z.string().describe("Timestamp of the parent task card (from slack_start_task)"),
|
|
387
|
+
summary: z.string().describe("Final summary of the task outcome"),
|
|
388
|
+
status: z.enum(["done", "failed"]).describe("Final status"),
|
|
389
|
+
details: z.string().optional().describe("Optional details — commits, links, duration, etc. (mrkdwn)"),
|
|
390
|
+
notify_user: z.string().optional().describe("Optional Slack user ID to @-mention on completion. This is the ONLY task tool permitted to mention."),
|
|
391
|
+
...IdentityFields
|
|
392
|
+
});
|
|
396
393
|
const SendFormattedMessageArgsSchema = z.object({
|
|
397
394
|
channel: z.string().describe("Channel ID or name"),
|
|
398
|
-
blocks: z.array(z.
|
|
399
|
-
text: z.string().optional().describe("Fallback text")
|
|
395
|
+
blocks: z.array(z.object({ type: z.string() }).passthrough()).describe("Slack Block Kit blocks for rich formatting"),
|
|
396
|
+
text: z.string().optional().describe("Fallback text"),
|
|
397
|
+
...IdentityFields
|
|
400
398
|
});
|
|
401
399
|
const BulkReactMessagesArgsSchema = z.object({
|
|
402
400
|
channel: z.string().describe("Channel ID"),
|
|
@@ -437,536 +435,207 @@ const SendDiagramArgsSchema = z.object({
|
|
|
437
435
|
title: z.string().optional().describe("Title for the diagram"),
|
|
438
436
|
initial_comment: z.string().optional().describe("Message posted with the diagram")
|
|
439
437
|
});
|
|
440
|
-
|
|
441
|
-
// MAIN SERVER CLASS
|
|
442
|
-
// =====================================================================================
|
|
443
|
-
class SlackerV3Server {
|
|
438
|
+
export class SlackerV3Server {
|
|
444
439
|
server;
|
|
445
440
|
accountState;
|
|
446
|
-
|
|
441
|
+
// Per-account TTL caches for users.list / conversations.list (120s).
|
|
442
|
+
CACHE_TTL_MS = 120_000;
|
|
443
|
+
usersCache = new Map();
|
|
444
|
+
channelsCache = new Map();
|
|
445
|
+
// In-memory registry of active task cards keyed by `${channel}:${task_ts}`.
|
|
446
|
+
// Lets slack_update_task/slack_complete_task recall the title, total_steps, and
|
|
447
|
+
// current status reaction so they can re-render the parent and swap the reaction.
|
|
448
|
+
taskRegistry = new Map();
|
|
449
|
+
// Singleton Puppeteer browser, launched lazily and kept warm.
|
|
450
|
+
browser = null;
|
|
451
|
+
browserIdleTimer = null;
|
|
452
|
+
BROWSER_IDLE_MS = 5 * 60 * 1000; // close after 5 min idle
|
|
453
|
+
// Friendly message returned (never thrown on boot) when no bot token is configured.
|
|
454
|
+
static NO_TOKEN_MESSAGE = "No Slack bot token. Set SLACK_BOT_TOKEN in this MCP server's env block in your " +
|
|
455
|
+
"Claude config (~/.claude.json or .mcp.json).";
|
|
447
456
|
constructor() {
|
|
448
457
|
this.server = new Server({
|
|
449
458
|
name: "mcp-slack",
|
|
450
|
-
version: "
|
|
459
|
+
version: "4.0.1",
|
|
451
460
|
}, {
|
|
452
461
|
capabilities: {
|
|
453
462
|
tools: {},
|
|
454
463
|
},
|
|
455
464
|
});
|
|
456
|
-
//
|
|
465
|
+
// Load the single account from the environment. Never throws — if no token is
|
|
466
|
+
// present the server still boots and tool calls return NO_TOKEN_MESSAGE.
|
|
457
467
|
this.accountState = {
|
|
458
|
-
|
|
459
|
-
|
|
460
|
-
|
|
461
|
-
|
|
468
|
+
account: null,
|
|
469
|
+
client: null,
|
|
470
|
+
userClient: null,
|
|
471
|
+
workspaceFetched: false
|
|
462
472
|
};
|
|
463
|
-
|
|
464
|
-
this.credentialManager = new CredentialManager();
|
|
465
|
-
// Initialize with default account if environment variables are provided
|
|
466
|
-
this.initializeDefaultAccount();
|
|
473
|
+
this.loadAccountFromEnv();
|
|
467
474
|
// Setup handlers immediately so the server can start
|
|
468
475
|
this.setupHandlers();
|
|
469
476
|
}
|
|
470
477
|
// =====================================================================================
|
|
471
|
-
// ACCOUNT
|
|
478
|
+
// ACCOUNT (env-first, single account)
|
|
472
479
|
// =====================================================================================
|
|
473
|
-
|
|
474
|
-
|
|
475
|
-
|
|
476
|
-
|
|
477
|
-
|
|
478
|
-
|
|
479
|
-
|
|
480
|
-
|
|
481
|
-
|
|
482
|
-
|
|
483
|
-
|
|
484
|
-
|
|
485
|
-
if (!this.accountState.activeAccountId) {
|
|
486
|
-
this.accountState.activeAccountId = account.id;
|
|
487
|
-
console.error(`[SlackServer] Set ${account.id} as active account`);
|
|
488
|
-
}
|
|
489
|
-
}
|
|
490
|
-
}
|
|
491
|
-
const loadTime = Date.now() - startTime;
|
|
492
|
-
console.error(`[SlackServer] Account loading completed in ${loadTime}ms`);
|
|
493
|
-
console.error(`[SlackServer] Active accounts: ${Array.from(this.accountState.accounts.keys()).join(', ')}`);
|
|
494
|
-
}
|
|
495
|
-
catch (error) {
|
|
496
|
-
console.error('[SlackServer] Failed to load persisted accounts:', error);
|
|
497
|
-
}
|
|
498
|
-
}
|
|
499
|
-
initializeDefaultAccount() {
|
|
500
|
-
const defaultBotToken = process.env.DEFAULT_BOT_TOKEN;
|
|
501
|
-
const defaultUserToken = process.env.DEFAULT_USER_TOKEN;
|
|
502
|
-
const defaultTeamId = process.env.DEFAULT_TEAM_ID;
|
|
503
|
-
const defaultAccountName = process.env.DEFAULT_ACCOUNT_NAME;
|
|
504
|
-
console.error("[SlackServer] Environment variables:", {
|
|
505
|
-
DEFAULT_BOT_TOKEN: defaultBotToken ? "Set" : "Not set",
|
|
506
|
-
DEFAULT_USER_TOKEN: defaultUserToken ? "Set" : "Not set",
|
|
507
|
-
DEFAULT_TEAM_ID: defaultTeamId,
|
|
508
|
-
DEFAULT_ACCOUNT_NAME: defaultAccountName
|
|
480
|
+
// Load exactly one account from env vars. SLACK_* is preferred; DEFAULT_* is a
|
|
481
|
+
// back-compat fallback. Multi-workspace = run a second MCP server entry with its own
|
|
482
|
+
// env block. No disk persistence — workspace/teamId hydrate lazily via auth.test.
|
|
483
|
+
loadAccountFromEnv() {
|
|
484
|
+
const botToken = process.env.SLACK_BOT_TOKEN || process.env.DEFAULT_BOT_TOKEN;
|
|
485
|
+
const userToken = process.env.SLACK_USER_TOKEN || process.env.DEFAULT_USER_TOKEN;
|
|
486
|
+
const teamId = process.env.SLACK_TEAM_ID || process.env.DEFAULT_TEAM_ID;
|
|
487
|
+
const name = process.env.SLACK_WORKSPACE || process.env.DEFAULT_ACCOUNT_NAME || 'Slack Workspace';
|
|
488
|
+
console.error("[SlackServer] Environment:", {
|
|
489
|
+
SLACK_BOT_TOKEN: botToken ? "Set" : "Not set",
|
|
490
|
+
SLACK_USER_TOKEN: userToken ? "Set" : "Not set",
|
|
491
|
+
SLACK_TEAM_ID: teamId || "(lazy)",
|
|
509
492
|
});
|
|
510
|
-
if (
|
|
511
|
-
|
|
512
|
-
|
|
513
|
-
name: defaultAccountName || 'Default Workspace',
|
|
514
|
-
workspace: 'Unknown', // Will be fetched on first use
|
|
515
|
-
teamId: defaultTeamId,
|
|
516
|
-
botToken: defaultBotToken,
|
|
517
|
-
userToken: defaultUserToken,
|
|
518
|
-
isDefault: true
|
|
519
|
-
};
|
|
520
|
-
this.accountState.accounts.set(defaultAccount.id, defaultAccount);
|
|
521
|
-
this.accountState.activeAccountId = defaultAccount.id;
|
|
522
|
-
this.initializeClient(defaultAccount);
|
|
523
|
-
// Save env-based account to keychain for next time
|
|
524
|
-
this.credentialManager.saveAccount(defaultAccount).catch(error => {
|
|
525
|
-
console.error('Failed to persist env-based account:', error);
|
|
526
|
-
});
|
|
527
|
-
}
|
|
528
|
-
}
|
|
529
|
-
initializeClient(account) {
|
|
530
|
-
// Initialize bot client
|
|
531
|
-
const botClient = new WebClient(account.botToken);
|
|
532
|
-
this.accountState.clients.set(account.id, botClient);
|
|
533
|
-
// Initialize user client if user token is provided
|
|
534
|
-
if (account.userToken) {
|
|
535
|
-
const userClient = new WebClient(account.userToken);
|
|
536
|
-
this.accountState.userClients.set(account.id, userClient);
|
|
537
|
-
}
|
|
538
|
-
}
|
|
539
|
-
validateTokenFormat(token, type) {
|
|
540
|
-
if (type === 'bot') {
|
|
541
|
-
return token.startsWith('xoxb-');
|
|
542
|
-
}
|
|
543
|
-
else {
|
|
544
|
-
return token.startsWith('xoxp-');
|
|
545
|
-
}
|
|
546
|
-
}
|
|
547
|
-
generateAccountId(name) {
|
|
548
|
-
// Generate a safe account ID from the name
|
|
549
|
-
const baseId = name.toLowerCase()
|
|
550
|
-
.replace(/[^a-z0-9]/g, '-')
|
|
551
|
-
.replace(/-+/g, '-')
|
|
552
|
-
.replace(/^-|-$/g, '');
|
|
553
|
-
let id = baseId;
|
|
554
|
-
let counter = 1;
|
|
555
|
-
// Ensure uniqueness
|
|
556
|
-
while (this.accountState.accounts.has(id)) {
|
|
557
|
-
id = `${baseId}-${counter}`;
|
|
558
|
-
counter++;
|
|
493
|
+
if (!botToken) {
|
|
494
|
+
console.error("[SlackServer] No bot token configured — server will boot but tool calls will error until SLACK_BOT_TOKEN is set.");
|
|
495
|
+
return;
|
|
559
496
|
}
|
|
560
|
-
|
|
497
|
+
this.accountState.account = {
|
|
498
|
+
id: 'default',
|
|
499
|
+
name,
|
|
500
|
+
workspace: name && name !== 'Slack Workspace' ? name : 'Unknown',
|
|
501
|
+
teamId: teamId || '',
|
|
502
|
+
botToken,
|
|
503
|
+
userToken: userToken || undefined,
|
|
504
|
+
};
|
|
505
|
+
this.accountState.client = new WebClient(botToken);
|
|
506
|
+
this.accountState.userClient = userToken ? new WebClient(userToken) : null;
|
|
561
507
|
}
|
|
562
508
|
async getActiveClient() {
|
|
563
|
-
if (!this.accountState.
|
|
564
|
-
throw new Error(
|
|
509
|
+
if (!this.accountState.client) {
|
|
510
|
+
throw new Error(SlackerV3Server.NO_TOKEN_MESSAGE);
|
|
565
511
|
}
|
|
566
|
-
|
|
512
|
+
return this.accountState.client;
|
|
513
|
+
}
|
|
514
|
+
async getActiveUserClient() {
|
|
515
|
+
// Prefer the user client; fall back to the bot client.
|
|
516
|
+
const client = this.accountState.userClient || this.accountState.client;
|
|
567
517
|
if (!client) {
|
|
568
|
-
throw new Error(
|
|
518
|
+
throw new Error(SlackerV3Server.NO_TOKEN_MESSAGE);
|
|
569
519
|
}
|
|
570
|
-
// Debug: Log token being used
|
|
571
|
-
const activeAccount = this.accountState.accounts.get(this.accountState.activeAccountId);
|
|
572
|
-
console.error("Using bot token:", activeAccount?.botToken);
|
|
573
520
|
return client;
|
|
574
521
|
}
|
|
575
|
-
|
|
576
|
-
|
|
577
|
-
|
|
522
|
+
// Lazily hydrate workspace name + teamId via auth.test on first use, cached in memory.
|
|
523
|
+
async ensureWorkspaceInfo() {
|
|
524
|
+
if (this.accountState.workspaceFetched || !this.accountState.account || !this.accountState.client) {
|
|
525
|
+
return;
|
|
578
526
|
}
|
|
579
|
-
|
|
580
|
-
|
|
581
|
-
|
|
582
|
-
|
|
527
|
+
try {
|
|
528
|
+
const info = await this.accountState.client.auth.test();
|
|
529
|
+
if (info?.team)
|
|
530
|
+
this.accountState.account.workspace = info.team;
|
|
531
|
+
if (info?.team_id)
|
|
532
|
+
this.accountState.account.teamId = info.team_id;
|
|
583
533
|
}
|
|
584
|
-
|
|
585
|
-
|
|
534
|
+
catch (error) {
|
|
535
|
+
console.error("[SlackServer] auth.test failed (workspace stays 'Unknown'):", error);
|
|
536
|
+
}
|
|
537
|
+
finally {
|
|
538
|
+
this.accountState.workspaceFetched = true;
|
|
586
539
|
}
|
|
587
|
-
return client;
|
|
588
540
|
}
|
|
589
|
-
|
|
590
|
-
|
|
591
|
-
|
|
592
|
-
|
|
541
|
+
// =====================================================================================
|
|
542
|
+
// TTL CACHE HELPERS (users.list / conversations.list)
|
|
543
|
+
// =====================================================================================
|
|
544
|
+
currentAccountKey() {
|
|
545
|
+
return this.accountState.account?.id || '__none__';
|
|
546
|
+
}
|
|
547
|
+
// Fetch ALL active (non-deleted, non-bot) users for the active account, paginated, cached 120s.
|
|
548
|
+
async getAllUsersCached(client) {
|
|
549
|
+
const key = this.currentAccountKey();
|
|
550
|
+
const cached = this.usersCache.get(key);
|
|
551
|
+
if (cached && cached.expires > Date.now()) {
|
|
552
|
+
return cached.value;
|
|
553
|
+
}
|
|
554
|
+
const members = [];
|
|
555
|
+
let cursor = undefined;
|
|
556
|
+
do {
|
|
557
|
+
const result = await client.users.list({ limit: 200, cursor });
|
|
558
|
+
if (result.members)
|
|
559
|
+
members.push(...result.members);
|
|
560
|
+
cursor = result.response_metadata?.next_cursor || undefined;
|
|
561
|
+
} while (cursor);
|
|
562
|
+
const active = members.filter((u) => !u.deleted && !u.is_bot);
|
|
563
|
+
this.usersCache.set(key, { value: active, expires: Date.now() + this.CACHE_TTL_MS });
|
|
564
|
+
return active;
|
|
565
|
+
}
|
|
566
|
+
// Fetch ALL public+private channels for the active account, paginated, cached 120s.
|
|
567
|
+
async getAllChannelsCached(client) {
|
|
568
|
+
const key = this.currentAccountKey();
|
|
569
|
+
const cached = this.channelsCache.get(key);
|
|
570
|
+
if (cached && cached.expires > Date.now()) {
|
|
571
|
+
return cached.value;
|
|
572
|
+
}
|
|
573
|
+
const channels = [];
|
|
574
|
+
let cursor = undefined;
|
|
575
|
+
do {
|
|
576
|
+
const result = await client.conversations.list({
|
|
577
|
+
types: 'public_channel,private_channel',
|
|
578
|
+
limit: 1000,
|
|
579
|
+
cursor
|
|
580
|
+
});
|
|
581
|
+
if (result.channels)
|
|
582
|
+
channels.push(...result.channels);
|
|
583
|
+
cursor = result.response_metadata?.next_cursor || undefined;
|
|
584
|
+
} while (cursor);
|
|
585
|
+
this.channelsCache.set(key, { value: channels, expires: Date.now() + this.CACHE_TTL_MS });
|
|
586
|
+
return channels;
|
|
593
587
|
}
|
|
594
588
|
// =====================================================================================
|
|
595
|
-
// ACCOUNT
|
|
589
|
+
// ACCOUNT TOOL IMPLEMENTATIONS (read-only — single env-loaded account)
|
|
596
590
|
// =====================================================================================
|
|
597
|
-
|
|
598
|
-
|
|
599
|
-
|
|
591
|
+
// Build the public (no-secrets) view of the active account, hydrating workspace/teamId
|
|
592
|
+
// lazily via auth.test on first use.
|
|
593
|
+
async describeActiveAccount() {
|
|
594
|
+
const account = this.accountState.account;
|
|
595
|
+
if (!account)
|
|
596
|
+
return null;
|
|
597
|
+
await this.ensureWorkspaceInfo();
|
|
598
|
+
return {
|
|
600
599
|
id: account.id,
|
|
601
600
|
name: account.name,
|
|
602
601
|
workspace: account.workspace,
|
|
603
602
|
team_id: account.teamId,
|
|
604
|
-
is_default: account.isDefault || false,
|
|
605
|
-
is_active: account.id === this.accountState.activeAccountId,
|
|
606
603
|
has_user_token: !!account.userToken,
|
|
607
|
-
bot_token: this.maskToken(account.botToken),
|
|
608
|
-
user_token: account.userToken ? this.maskToken(account.userToken) : null
|
|
609
|
-
}));
|
|
610
|
-
return {
|
|
611
|
-
content: [
|
|
612
|
-
{
|
|
613
|
-
type: "text",
|
|
614
|
-
text: JSON.stringify({
|
|
615
|
-
total_accounts: accounts.length,
|
|
616
|
-
active_account_id: this.accountState.activeAccountId,
|
|
617
|
-
accounts: accounts
|
|
618
|
-
}, null, 2)
|
|
619
|
-
}
|
|
620
|
-
]
|
|
621
|
-
};
|
|
622
|
-
}
|
|
623
|
-
async switchAccount(args) {
|
|
624
|
-
const validatedArgs = SwitchAccountArgsSchema.parse(args);
|
|
625
|
-
const account = this.accountState.accounts.get(validatedArgs.account_id);
|
|
626
|
-
if (!account) {
|
|
627
|
-
throw new Error(`Account '${validatedArgs.account_id}' not found. Use 'list_accounts' to see available accounts.`);
|
|
628
|
-
}
|
|
629
|
-
// Initialize client if not exists
|
|
630
|
-
if (!this.accountState.clients.has(account.id)) {
|
|
631
|
-
this.initializeClient(account);
|
|
632
|
-
}
|
|
633
|
-
// Switch active account
|
|
634
|
-
this.accountState.activeAccountId = account.id;
|
|
635
|
-
// Fetch workspace info if not cached
|
|
636
|
-
if (account.workspace === 'Unknown') {
|
|
637
|
-
try {
|
|
638
|
-
const client = this.accountState.clients.get(account.id);
|
|
639
|
-
const teamInfo = await client.team.info();
|
|
640
|
-
account.workspace = teamInfo.team?.name || 'Unknown';
|
|
641
|
-
}
|
|
642
|
-
catch (error) {
|
|
643
|
-
// If we can't fetch workspace info, that's ok - we'll use 'Unknown'
|
|
644
|
-
console.error(`Could not fetch workspace info for ${account.id}:`, error);
|
|
645
|
-
}
|
|
646
|
-
}
|
|
647
|
-
return {
|
|
648
|
-
content: [
|
|
649
|
-
{
|
|
650
|
-
type: "text",
|
|
651
|
-
text: JSON.stringify({
|
|
652
|
-
success: true,
|
|
653
|
-
message: `Switched to ${account.name} (${account.workspace})`,
|
|
654
|
-
account: {
|
|
655
|
-
id: account.id,
|
|
656
|
-
name: account.name,
|
|
657
|
-
workspace: account.workspace,
|
|
658
|
-
team_id: account.teamId
|
|
659
|
-
}
|
|
660
|
-
}, null, 2)
|
|
661
|
-
}
|
|
662
|
-
]
|
|
663
604
|
};
|
|
664
605
|
}
|
|
665
|
-
|
|
666
|
-
|
|
667
|
-
// Validate token formats
|
|
668
|
-
if (!this.validateTokenFormat(validatedArgs.bot_token, 'bot')) {
|
|
669
|
-
throw new Error("Invalid bot token format. Bot tokens must start with 'xoxb-'");
|
|
670
|
-
}
|
|
671
|
-
if (validatedArgs.user_token && !this.validateTokenFormat(validatedArgs.user_token, 'user')) {
|
|
672
|
-
throw new Error("Invalid user token format. User tokens must start with 'xoxp-'");
|
|
673
|
-
}
|
|
674
|
-
// Generate unique account ID
|
|
675
|
-
const accountId = this.generateAccountId(validatedArgs.name);
|
|
676
|
-
// Create new account
|
|
677
|
-
const newAccount = {
|
|
678
|
-
id: accountId,
|
|
679
|
-
name: validatedArgs.name,
|
|
680
|
-
workspace: 'Unknown', // Will be fetched on first use
|
|
681
|
-
teamId: validatedArgs.team_id,
|
|
682
|
-
botToken: validatedArgs.bot_token,
|
|
683
|
-
userToken: validatedArgs.user_token,
|
|
684
|
-
isDefault: false
|
|
685
|
-
};
|
|
686
|
-
// Test the bot token by trying to get team info
|
|
687
|
-
try {
|
|
688
|
-
const testClient = new WebClient(validatedArgs.bot_token);
|
|
689
|
-
const teamInfo = await testClient.team.info();
|
|
690
|
-
newAccount.workspace = teamInfo.team?.name || 'Unknown';
|
|
691
|
-
// Verify team ID matches
|
|
692
|
-
if (teamInfo.team?.id && teamInfo.team.id !== validatedArgs.team_id) {
|
|
693
|
-
throw new Error(`Team ID mismatch. Token belongs to team ${teamInfo.team.id}, but ${validatedArgs.team_id} was provided.`);
|
|
694
|
-
}
|
|
695
|
-
}
|
|
696
|
-
catch (error) {
|
|
697
|
-
throw new Error(`Failed to verify bot token: ${error instanceof Error ? error.message : String(error)}`);
|
|
698
|
-
}
|
|
699
|
-
// Add to accounts
|
|
700
|
-
this.accountState.accounts.set(accountId, newAccount);
|
|
701
|
-
this.initializeClient(newAccount);
|
|
702
|
-
// If this is the first account, make it active
|
|
703
|
-
if (!this.accountState.activeAccountId) {
|
|
704
|
-
this.accountState.activeAccountId = accountId;
|
|
705
|
-
}
|
|
706
|
-
// Persist to keychain
|
|
707
|
-
try {
|
|
708
|
-
await this.credentialManager.saveAccount(newAccount);
|
|
709
|
-
return {
|
|
710
|
-
content: [
|
|
711
|
-
{
|
|
712
|
-
type: "text",
|
|
713
|
-
text: JSON.stringify({
|
|
714
|
-
success: true,
|
|
715
|
-
message: `Account '${validatedArgs.name}' added and saved to secure storage`,
|
|
716
|
-
account: {
|
|
717
|
-
id: accountId,
|
|
718
|
-
name: newAccount.name,
|
|
719
|
-
workspace: newAccount.workspace,
|
|
720
|
-
team_id: newAccount.teamId,
|
|
721
|
-
is_active: accountId === this.accountState.activeAccountId
|
|
722
|
-
}
|
|
723
|
-
}, null, 2)
|
|
724
|
-
}
|
|
725
|
-
]
|
|
726
|
-
};
|
|
727
|
-
}
|
|
728
|
-
catch (error) {
|
|
729
|
-
// Still works, just not persisted
|
|
730
|
-
return {
|
|
731
|
-
content: [
|
|
732
|
-
{
|
|
733
|
-
type: "text",
|
|
734
|
-
text: JSON.stringify({
|
|
735
|
-
success: true,
|
|
736
|
-
message: `Account '${validatedArgs.name}' added (temporary - secure storage unavailable)`,
|
|
737
|
-
account: {
|
|
738
|
-
id: accountId,
|
|
739
|
-
name: newAccount.name,
|
|
740
|
-
workspace: newAccount.workspace,
|
|
741
|
-
team_id: newAccount.teamId,
|
|
742
|
-
is_active: accountId === this.accountState.activeAccountId
|
|
743
|
-
}
|
|
744
|
-
}, null, 2)
|
|
745
|
-
}
|
|
746
|
-
]
|
|
747
|
-
};
|
|
748
|
-
}
|
|
749
|
-
}
|
|
750
|
-
async removeAccount(args) {
|
|
751
|
-
const validatedArgs = RemoveAccountArgsSchema.parse(args);
|
|
752
|
-
const account = this.accountState.accounts.get(validatedArgs.account_id);
|
|
753
|
-
if (!account) {
|
|
754
|
-
throw new Error(`Account '${validatedArgs.account_id}' not found.`);
|
|
755
|
-
}
|
|
756
|
-
// Check if this is the active account
|
|
757
|
-
const wasActive = this.accountState.activeAccountId === validatedArgs.account_id;
|
|
758
|
-
// Remove from all maps
|
|
759
|
-
this.accountState.accounts.delete(validatedArgs.account_id);
|
|
760
|
-
this.accountState.clients.delete(validatedArgs.account_id);
|
|
761
|
-
this.accountState.userClients.delete(validatedArgs.account_id);
|
|
762
|
-
// If this was the active account, switch to another one or clear active
|
|
763
|
-
if (wasActive) {
|
|
764
|
-
const remainingAccounts = Array.from(this.accountState.accounts.keys());
|
|
765
|
-
this.accountState.activeAccountId = remainingAccounts.length > 0 ? remainingAccounts[0] : null;
|
|
766
|
-
}
|
|
767
|
-
// Remove from keychain
|
|
768
|
-
try {
|
|
769
|
-
await this.credentialManager.deleteAccount(validatedArgs.account_id);
|
|
770
|
-
return {
|
|
771
|
-
content: [
|
|
772
|
-
{
|
|
773
|
-
type: "text",
|
|
774
|
-
text: JSON.stringify({
|
|
775
|
-
success: true,
|
|
776
|
-
message: `Account '${account.name}' removed from memory and secure storage`,
|
|
777
|
-
new_active_account: this.accountState.activeAccountId,
|
|
778
|
-
remaining_accounts: this.accountState.accounts.size
|
|
779
|
-
}, null, 2)
|
|
780
|
-
}
|
|
781
|
-
]
|
|
782
|
-
};
|
|
783
|
-
}
|
|
784
|
-
catch (error) {
|
|
785
|
-
return {
|
|
786
|
-
content: [
|
|
787
|
-
{
|
|
788
|
-
type: "text",
|
|
789
|
-
text: JSON.stringify({
|
|
790
|
-
success: true,
|
|
791
|
-
message: `Account '${account.name}' removed from memory (secure storage removal failed)`,
|
|
792
|
-
new_active_account: this.accountState.activeAccountId,
|
|
793
|
-
remaining_accounts: this.accountState.accounts.size
|
|
794
|
-
}, null, 2)
|
|
795
|
-
}
|
|
796
|
-
]
|
|
797
|
-
};
|
|
798
|
-
}
|
|
799
|
-
}
|
|
606
|
+
// get_active_account — returns the wired workspace/team/name (no secrets) so the user
|
|
607
|
+
// can confirm which workspace this server is talking to.
|
|
800
608
|
async getActiveAccount(args) {
|
|
801
609
|
GetActiveAccountArgsSchema.parse(args);
|
|
802
|
-
|
|
803
|
-
|
|
804
|
-
content: [
|
|
805
|
-
{
|
|
806
|
-
type: "text",
|
|
807
|
-
text: JSON.stringify({
|
|
808
|
-
active_account: null,
|
|
809
|
-
message: "No active account. Use 'list_accounts' to see available accounts, or 'add_account' to add one."
|
|
810
|
-
}, null, 2)
|
|
811
|
-
}
|
|
812
|
-
]
|
|
813
|
-
};
|
|
814
|
-
}
|
|
815
|
-
const account = this.accountState.accounts.get(this.accountState.activeAccountId);
|
|
816
|
-
if (!account) {
|
|
610
|
+
const active = await this.describeActiveAccount();
|
|
611
|
+
if (!active) {
|
|
817
612
|
return {
|
|
818
|
-
content: [
|
|
819
|
-
{
|
|
820
|
-
type: "text",
|
|
821
|
-
text: JSON.stringify({
|
|
613
|
+
content: [{ type: "text", text: JSON.stringify({
|
|
822
614
|
active_account: null,
|
|
823
|
-
|
|
824
|
-
}, null, 2)
|
|
825
|
-
}
|
|
826
|
-
]
|
|
615
|
+
message: SlackerV3Server.NO_TOKEN_MESSAGE,
|
|
616
|
+
}, null, 2) }]
|
|
827
617
|
};
|
|
828
618
|
}
|
|
829
619
|
return {
|
|
830
|
-
content: [
|
|
831
|
-
{
|
|
832
|
-
type: "text",
|
|
833
|
-
text: JSON.stringify({
|
|
834
|
-
active_account: {
|
|
835
|
-
id: account.id,
|
|
836
|
-
name: account.name,
|
|
837
|
-
workspace: account.workspace,
|
|
838
|
-
team_id: account.teamId,
|
|
839
|
-
is_default: account.isDefault || false,
|
|
840
|
-
has_user_token: !!account.userToken
|
|
841
|
-
}
|
|
842
|
-
}, null, 2)
|
|
843
|
-
}
|
|
844
|
-
]
|
|
620
|
+
content: [{ type: "text", text: JSON.stringify({ active_account: active }, null, 2) }]
|
|
845
621
|
};
|
|
846
622
|
}
|
|
847
|
-
|
|
848
|
-
|
|
849
|
-
|
|
850
|
-
|
|
851
|
-
|
|
852
|
-
}
|
|
853
|
-
// Clear default flag from all accounts
|
|
854
|
-
for (const acc of this.accountState.accounts.values()) {
|
|
855
|
-
acc.isDefault = false;
|
|
856
|
-
}
|
|
857
|
-
// Set new default
|
|
858
|
-
account.isDefault = true;
|
|
623
|
+
// list_accounts — kept for back-compat; this server is single-account, so it simply
|
|
624
|
+
// returns the one active account (or none).
|
|
625
|
+
async listAccounts(args) {
|
|
626
|
+
ListAccountsArgsSchema.parse(args);
|
|
627
|
+
const active = await this.describeActiveAccount();
|
|
628
|
+
const accounts = active ? [{ ...active, is_active: true }] : [];
|
|
859
629
|
return {
|
|
860
|
-
content: [
|
|
861
|
-
|
|
862
|
-
|
|
863
|
-
|
|
864
|
-
|
|
865
|
-
message: `Account '${account.name}' set as default`,
|
|
866
|
-
default_account: {
|
|
867
|
-
id: account.id,
|
|
868
|
-
name: account.name,
|
|
869
|
-
workspace: account.workspace
|
|
870
|
-
}
|
|
871
|
-
}, null, 2)
|
|
872
|
-
}
|
|
873
|
-
]
|
|
630
|
+
content: [{ type: "text", text: JSON.stringify({
|
|
631
|
+
total_accounts: accounts.length,
|
|
632
|
+
active_account_id: this.accountState.account?.id ?? null,
|
|
633
|
+
accounts,
|
|
634
|
+
}, null, 2) }]
|
|
874
635
|
};
|
|
875
636
|
}
|
|
876
|
-
async updateAccount(args) {
|
|
877
|
-
const validatedArgs = UpdateAccountArgsSchema.parse(args);
|
|
878
|
-
const account = this.accountState.accounts.get(validatedArgs.account_id);
|
|
879
|
-
if (!account) {
|
|
880
|
-
throw new Error(`Account '${validatedArgs.account_id}' not found.`);
|
|
881
|
-
}
|
|
882
|
-
// Validate new tokens if provided
|
|
883
|
-
if (validatedArgs.bot_token && !this.validateTokenFormat(validatedArgs.bot_token, 'bot')) {
|
|
884
|
-
throw new Error("Invalid bot token format. Bot tokens must start with 'xoxb-'");
|
|
885
|
-
}
|
|
886
|
-
if (validatedArgs.user_token && !this.validateTokenFormat(validatedArgs.user_token, 'user')) {
|
|
887
|
-
throw new Error("Invalid user token format. User tokens must start with 'xoxp-'");
|
|
888
|
-
}
|
|
889
|
-
// Update tokens in memory
|
|
890
|
-
let tokensUpdated = false;
|
|
891
|
-
if (validatedArgs.bot_token && validatedArgs.bot_token !== account.botToken) {
|
|
892
|
-
account.botToken = validatedArgs.bot_token;
|
|
893
|
-
tokensUpdated = true;
|
|
894
|
-
}
|
|
895
|
-
if (validatedArgs.user_token !== undefined && validatedArgs.user_token !== account.userToken) {
|
|
896
|
-
account.userToken = validatedArgs.user_token;
|
|
897
|
-
tokensUpdated = true;
|
|
898
|
-
}
|
|
899
|
-
if (!tokensUpdated) {
|
|
900
|
-
return {
|
|
901
|
-
content: [
|
|
902
|
-
{
|
|
903
|
-
type: "text",
|
|
904
|
-
text: JSON.stringify({
|
|
905
|
-
success: false,
|
|
906
|
-
message: "No token changes provided"
|
|
907
|
-
}, null, 2)
|
|
908
|
-
}
|
|
909
|
-
]
|
|
910
|
-
};
|
|
911
|
-
}
|
|
912
|
-
// Re-initialize clients with new tokens
|
|
913
|
-
this.initializeClient(account);
|
|
914
|
-
// Update workspace info if bot token changed
|
|
915
|
-
if (validatedArgs.bot_token) {
|
|
916
|
-
try {
|
|
917
|
-
const client = this.accountState.clients.get(account.id);
|
|
918
|
-
const teamInfo = await client.team.info();
|
|
919
|
-
account.workspace = teamInfo.team?.name || account.workspace;
|
|
920
|
-
}
|
|
921
|
-
catch (error) {
|
|
922
|
-
console.error('Failed to update workspace info:', error);
|
|
923
|
-
}
|
|
924
|
-
}
|
|
925
|
-
// Persist updated account
|
|
926
|
-
try {
|
|
927
|
-
await this.credentialManager.updateAccount(account);
|
|
928
|
-
return {
|
|
929
|
-
content: [
|
|
930
|
-
{
|
|
931
|
-
type: "text",
|
|
932
|
-
text: JSON.stringify({
|
|
933
|
-
success: true,
|
|
934
|
-
message: `Updated tokens for '${account.name}' and saved to secure storage`,
|
|
935
|
-
account: {
|
|
936
|
-
id: account.id,
|
|
937
|
-
name: account.name,
|
|
938
|
-
workspace: account.workspace,
|
|
939
|
-
team_id: account.teamId,
|
|
940
|
-
has_user_token: !!account.userToken
|
|
941
|
-
}
|
|
942
|
-
}, null, 2)
|
|
943
|
-
}
|
|
944
|
-
]
|
|
945
|
-
};
|
|
946
|
-
}
|
|
947
|
-
catch (error) {
|
|
948
|
-
return {
|
|
949
|
-
content: [
|
|
950
|
-
{
|
|
951
|
-
type: "text",
|
|
952
|
-
text: JSON.stringify({
|
|
953
|
-
success: true,
|
|
954
|
-
message: `Updated tokens for '${account.name}' (temporary - secure storage unavailable)`,
|
|
955
|
-
account: {
|
|
956
|
-
id: account.id,
|
|
957
|
-
name: account.name,
|
|
958
|
-
workspace: account.workspace,
|
|
959
|
-
team_id: account.teamId,
|
|
960
|
-
has_user_token: !!account.userToken
|
|
961
|
-
}
|
|
962
|
-
}, null, 2)
|
|
963
|
-
}
|
|
964
|
-
]
|
|
965
|
-
};
|
|
966
|
-
}
|
|
967
|
-
}
|
|
968
637
|
// =====================================================================================
|
|
969
|
-
// EXISTING SLACK TOOL IMPLEMENTATIONS
|
|
638
|
+
// EXISTING SLACK TOOL IMPLEMENTATIONS
|
|
970
639
|
// =====================================================================================
|
|
971
640
|
async slackListChannels(args) {
|
|
972
641
|
const validatedArgs = ListChannelsArgsSchema.parse(args);
|
|
@@ -988,20 +657,33 @@ class SlackerV3Server {
|
|
|
988
657
|
// Get next cursor for pagination
|
|
989
658
|
cursor = result.response_metadata?.next_cursor;
|
|
990
659
|
} while (cursor);
|
|
660
|
+
// VERBOSE: full channel objects including topic/purpose.
|
|
661
|
+
if (validatedArgs.verbose) {
|
|
662
|
+
const channels = allChannels.map(channel => ({
|
|
663
|
+
id: channel.id,
|
|
664
|
+
name: channel.name,
|
|
665
|
+
is_private: channel.is_private,
|
|
666
|
+
is_member: channel.is_member,
|
|
667
|
+
topic: channel.topic?.value,
|
|
668
|
+
purpose: channel.purpose?.value,
|
|
669
|
+
num_members: channel.num_members
|
|
670
|
+
}));
|
|
671
|
+
return {
|
|
672
|
+
content: [{ type: "text", text: JSON.stringify(channels, null, 2) }]
|
|
673
|
+
};
|
|
674
|
+
}
|
|
675
|
+
// LEAN: just id + name + privacy + member count.
|
|
991
676
|
const channels = allChannels.map(channel => ({
|
|
992
677
|
id: channel.id,
|
|
993
678
|
name: channel.name,
|
|
994
|
-
is_private: channel.is_private,
|
|
995
|
-
is_member: channel.is_member,
|
|
996
|
-
topic: channel.topic?.value,
|
|
997
|
-
purpose: channel.purpose?.value,
|
|
679
|
+
is_private: !!channel.is_private,
|
|
998
680
|
num_members: channel.num_members
|
|
999
681
|
}));
|
|
1000
682
|
return {
|
|
1001
683
|
content: [
|
|
1002
684
|
{
|
|
1003
685
|
type: "text",
|
|
1004
|
-
text:
|
|
686
|
+
text: leanResult(channels)
|
|
1005
687
|
}
|
|
1006
688
|
]
|
|
1007
689
|
};
|
|
@@ -1016,7 +698,7 @@ class SlackerV3Server {
|
|
|
1016
698
|
statusCode: error.statusCode
|
|
1017
699
|
});
|
|
1018
700
|
// Get current account info for debugging
|
|
1019
|
-
const activeAccount = this.accountState.
|
|
701
|
+
const activeAccount = this.accountState.account;
|
|
1020
702
|
console.error("Active account:", {
|
|
1021
703
|
id: activeAccount?.id,
|
|
1022
704
|
name: activeAccount?.name,
|
|
@@ -1042,9 +724,11 @@ class SlackerV3Server {
|
|
|
1042
724
|
return converted;
|
|
1043
725
|
}
|
|
1044
726
|
async processExplicitMentions(text, client) {
|
|
1045
|
-
//
|
|
1046
|
-
|
|
1047
|
-
|
|
727
|
+
// Fast path: no @mentions present, skip the (cached) users.list entirely.
|
|
728
|
+
if (!/@\w+/.test(text))
|
|
729
|
+
return text;
|
|
730
|
+
// ONLY process @mentions - nothing else (cached, paginated)
|
|
731
|
+
const activeUsers = await this.getAllUsersCached(client);
|
|
1048
732
|
return text.replace(/@(\w+)/g, (match, username) => {
|
|
1049
733
|
// Try exact match first
|
|
1050
734
|
let user = activeUsers.find(u => u.name?.toLowerCase() === username.toLowerCase() ||
|
|
@@ -1072,34 +756,55 @@ class SlackerV3Server {
|
|
|
1072
756
|
}
|
|
1073
757
|
// Handle #channel-name format
|
|
1074
758
|
const cleanName = channelOrUser.replace(/^#/, '');
|
|
1075
|
-
// Try to find a channel first
|
|
1076
|
-
const
|
|
1077
|
-
|
|
1078
|
-
limit: 1000
|
|
1079
|
-
});
|
|
1080
|
-
const channel = channelsResult.channels?.find(ch => ch.name?.toLowerCase() === cleanName.toLowerCase());
|
|
759
|
+
// Try to find a channel first (cached, fully paginated so we don't miss page 2+)
|
|
760
|
+
const channels = await this.getAllChannelsCached(client);
|
|
761
|
+
const channel = channels.find(ch => ch.name?.toLowerCase() === cleanName.toLowerCase());
|
|
1081
762
|
if (channel?.id)
|
|
1082
763
|
return channel.id;
|
|
1083
|
-
// Try to find a user for DM
|
|
1084
|
-
|
|
1085
|
-
|
|
1086
|
-
|
|
764
|
+
// No exact channel match. Try to find a user for DM — but ONLY with high
|
|
765
|
+
// confidence. A loose fuzzy match here can silently DM the WRONG human on a
|
|
766
|
+
// channel-name typo, so we require a strong match and otherwise throw.
|
|
767
|
+
const activeUsers = await this.getAllUsersCached(client);
|
|
768
|
+
// Exact (case-insensitive) match on a user handle/name takes priority.
|
|
769
|
+
const exactUser = activeUsers.find(u => u.name?.toLowerCase() === cleanName.toLowerCase() ||
|
|
770
|
+
u.real_name?.toLowerCase() === cleanName.toLowerCase() ||
|
|
771
|
+
u.profile?.display_name?.toLowerCase() === cleanName.toLowerCase());
|
|
772
|
+
if (exactUser?.id) {
|
|
773
|
+
const dmResult = await client.conversations.open({ users: exactUser.id });
|
|
774
|
+
if (dmResult.channel?.id)
|
|
775
|
+
return dmResult.channel.id;
|
|
776
|
+
}
|
|
777
|
+
// Fuzzy match with a STRICT confidence floor. Fuse score is 0 (perfect) → 1 (worst);
|
|
778
|
+
// require score <= 0.2 (>=80% similarity) before we DM a human.
|
|
1087
779
|
const fuse = new Fuse(activeUsers, {
|
|
1088
780
|
keys: ['name', 'real_name', 'profile.display_name'],
|
|
1089
|
-
threshold: 0.
|
|
781
|
+
threshold: 0.2,
|
|
1090
782
|
includeScore: true
|
|
1091
783
|
});
|
|
1092
784
|
const fuzzyResults = fuse.search(cleanName);
|
|
1093
|
-
|
|
785
|
+
const STRICT = 0.2;
|
|
786
|
+
if (fuzzyResults.length > 0 && fuzzyResults[0].score <= STRICT) {
|
|
1094
787
|
const user = fuzzyResults[0].item;
|
|
1095
788
|
if (user.id) {
|
|
1096
789
|
// Open a DM channel with the user
|
|
1097
790
|
const dmResult = await client.conversations.open({ users: user.id });
|
|
1098
|
-
|
|
791
|
+
if (dmResult.channel?.id)
|
|
792
|
+
return dmResult.channel.id;
|
|
1099
793
|
}
|
|
1100
794
|
}
|
|
1101
|
-
//
|
|
1102
|
-
|
|
795
|
+
// No high-confidence match. Do NOT silently send to the wrong place.
|
|
796
|
+
const channelCandidates = channels
|
|
797
|
+
.map(ch => ch.name)
|
|
798
|
+
.filter((n) => !!n && n.toLowerCase().includes(cleanName.toLowerCase().slice(0, 3)))
|
|
799
|
+
.slice(0, 5);
|
|
800
|
+
const userCandidates = fuzzyResults.slice(0, 5).map(r => r.item.name).filter(Boolean);
|
|
801
|
+
const candidates = [...channelCandidates, ...userCandidates];
|
|
802
|
+
throw new Error(`Could not confidently resolve recipient "${channelOrUser}". ` +
|
|
803
|
+
`No matching channel and no high-confidence user match. ` +
|
|
804
|
+
(candidates.length
|
|
805
|
+
? `Did you mean one of: ${candidates.join(', ')}? `
|
|
806
|
+
: '') +
|
|
807
|
+
`Pass an exact channel ID (C...), user ID (U...), or exact #channel-name.`);
|
|
1103
808
|
}
|
|
1104
809
|
async slackSendMessage(args) {
|
|
1105
810
|
const validatedArgs = SendMessageArgsSchema.parse(args);
|
|
@@ -1110,12 +815,13 @@ class SlackerV3Server {
|
|
|
1110
815
|
let formattedText = this.convertMarkdownToSlackMrkdwn(validatedArgs.text);
|
|
1111
816
|
// Step 3: ONLY process explicit @mentions (not context patterns)
|
|
1112
817
|
formattedText = await this.processExplicitMentions(formattedText, client);
|
|
1113
|
-
// Step 4: Send the message
|
|
818
|
+
// Step 4: Send the message (with optional session identity override)
|
|
1114
819
|
const result = await client.chat.postMessage({
|
|
1115
820
|
channel: channelId,
|
|
1116
821
|
text: formattedText,
|
|
1117
822
|
thread_ts: validatedArgs.thread_ts,
|
|
1118
|
-
mrkdwn: true
|
|
823
|
+
mrkdwn: true,
|
|
824
|
+
...this.identityOverrides(args)
|
|
1119
825
|
});
|
|
1120
826
|
return {
|
|
1121
827
|
content: [
|
|
@@ -1126,34 +832,580 @@ class SlackerV3Server {
|
|
|
1126
832
|
]
|
|
1127
833
|
};
|
|
1128
834
|
}
|
|
835
|
+
// Lightweight text-table alternative to the PNG slack_send_diagram path. Renders
|
|
836
|
+
// an aligned ASCII table inside a code block so it stays cheap (text, not an image)
|
|
837
|
+
// and readable. Use this for status/comparison grids that don't need to be pretty.
|
|
838
|
+
async slackSendTable(args) {
|
|
839
|
+
const validatedArgs = SendTableArgsSchema.parse(args);
|
|
840
|
+
const client = await this.getActiveClient();
|
|
841
|
+
const channelId = await this.resolveRecipient(validatedArgs.channel, client);
|
|
842
|
+
const asCodeBlock = validatedArgs.as_code_block !== false;
|
|
843
|
+
const table = renderTable(validatedArgs.rows);
|
|
844
|
+
let text = "";
|
|
845
|
+
if (validatedArgs.title)
|
|
846
|
+
text += `*${validatedArgs.title}*\n`;
|
|
847
|
+
text += asCodeBlock ? "```\n" + table + "\n```" : table;
|
|
848
|
+
const result = await client.chat.postMessage({
|
|
849
|
+
channel: channelId,
|
|
850
|
+
text,
|
|
851
|
+
mrkdwn: true
|
|
852
|
+
});
|
|
853
|
+
return {
|
|
854
|
+
content: [
|
|
855
|
+
{
|
|
856
|
+
type: "text",
|
|
857
|
+
text: `Table posted. Channel: ${result.channel}, Timestamp: ${result.ts}`
|
|
858
|
+
}
|
|
859
|
+
]
|
|
860
|
+
};
|
|
861
|
+
}
|
|
862
|
+
// =====================================================================================
|
|
863
|
+
// BLOCK KIT CARDS + THREADED TASK LIFECYCLE (Bundle 2 / 3 / 4)
|
|
864
|
+
// =====================================================================================
|
|
865
|
+
taskKey(channel, ts) {
|
|
866
|
+
return `${channel}:${ts}`;
|
|
867
|
+
}
|
|
868
|
+
// Build chat.postMessage identity overrides (Bundle 4). Per-call username/icon args
|
|
869
|
+
// win, otherwise fall back to SLACK_SESSION_USERNAME / SLACK_SESSION_ICON env vars.
|
|
870
|
+
// Requires the chat:write.customize bot scope; Slack ignores/errors gracefully if
|
|
871
|
+
// absent. icon_emoji (e.g. ":robot_face:") and icon_url are both supported.
|
|
872
|
+
identityOverrides(args) {
|
|
873
|
+
const a = (args ?? {});
|
|
874
|
+
const username = a.username || process.env.SLACK_SESSION_USERNAME;
|
|
875
|
+
const icon = a.icon_emoji || process.env.SLACK_SESSION_ICON;
|
|
876
|
+
const iconUrl = a.icon_url;
|
|
877
|
+
const out = {};
|
|
878
|
+
if (username)
|
|
879
|
+
out.username = username;
|
|
880
|
+
if (iconUrl)
|
|
881
|
+
out.icon_url = iconUrl;
|
|
882
|
+
else if (icon) {
|
|
883
|
+
// Accept either ":emoji:" or a full URL in the icon var.
|
|
884
|
+
if (/^https?:\/\//.test(icon))
|
|
885
|
+
out.icon_url = icon;
|
|
886
|
+
else
|
|
887
|
+
out.icon_emoji = icon.startsWith(":") ? icon : `:${icon}:`;
|
|
888
|
+
}
|
|
889
|
+
return out;
|
|
890
|
+
}
|
|
891
|
+
// Live reaction-status indicator (Bundle 3). Swap a status reaction on a message:
|
|
892
|
+
// remove the previously-applied one (if any) and add the new one. Reuses the same
|
|
893
|
+
// reactions API as slack_add_reaction. Slack errors (already_reacted / no_reaction)
|
|
894
|
+
// are swallowed so a status flip never fails the whole task call.
|
|
895
|
+
async swapReaction(client, channel, ts, prev, next) {
|
|
896
|
+
if (prev && prev !== next) {
|
|
897
|
+
try {
|
|
898
|
+
await client.reactions.remove({ channel, timestamp: ts, name: prev });
|
|
899
|
+
}
|
|
900
|
+
catch { /* no_reaction / not_reactable — ignore */ }
|
|
901
|
+
}
|
|
902
|
+
try {
|
|
903
|
+
await client.reactions.add({ channel, timestamp: ts, name: next });
|
|
904
|
+
}
|
|
905
|
+
catch { /* already_reacted — ignore */ }
|
|
906
|
+
}
|
|
907
|
+
async slackSendCard(args) {
|
|
908
|
+
const validatedArgs = SendCardArgsSchema.parse(args);
|
|
909
|
+
const client = await this.getActiveClient();
|
|
910
|
+
const channelId = await this.resolveRecipient(validatedArgs.channel, client);
|
|
911
|
+
const card = buildCard({
|
|
912
|
+
header: validatedArgs.header,
|
|
913
|
+
sections: validatedArgs.sections,
|
|
914
|
+
context: validatedArgs.context,
|
|
915
|
+
color: validatedArgs.color
|
|
916
|
+
});
|
|
917
|
+
const result = await client.chat.postMessage({
|
|
918
|
+
channel: channelId,
|
|
919
|
+
text: validatedArgs.header, // fallback / notification text
|
|
920
|
+
blocks: card.blocks.length ? card.blocks : undefined,
|
|
921
|
+
attachments: card.attachments,
|
|
922
|
+
...this.identityOverrides(args)
|
|
923
|
+
});
|
|
924
|
+
return {
|
|
925
|
+
content: [
|
|
926
|
+
{ type: "text", text: `Card posted. Channel: ${result.channel}, Timestamp: ${result.ts}` }
|
|
927
|
+
]
|
|
928
|
+
};
|
|
929
|
+
}
|
|
930
|
+
async slackStartTask(args) {
|
|
931
|
+
const validatedArgs = StartTaskArgsSchema.parse(args);
|
|
932
|
+
const client = await this.getActiveClient();
|
|
933
|
+
const channelId = await this.resolveRecipient(validatedArgs.channel, client);
|
|
934
|
+
const sections = [{ text: ":hourglass_flowing_sand: *In progress*" }];
|
|
935
|
+
if (validatedArgs.total_steps) {
|
|
936
|
+
sections.push({ text: renderProgressBar(0) + ` (0/${validatedArgs.total_steps})` });
|
|
937
|
+
}
|
|
938
|
+
const card = buildCard({
|
|
939
|
+
header: `⏳ ${validatedArgs.title}`,
|
|
940
|
+
sections,
|
|
941
|
+
context: `Started ${new Date().toISOString()}`
|
|
942
|
+
});
|
|
943
|
+
const result = await client.chat.postMessage({
|
|
944
|
+
channel: channelId,
|
|
945
|
+
text: `⏳ ${validatedArgs.title}`,
|
|
946
|
+
blocks: card.blocks,
|
|
947
|
+
...this.identityOverrides(args)
|
|
948
|
+
});
|
|
949
|
+
const ts = result.ts;
|
|
950
|
+
const resolvedChannel = result.channel || channelId;
|
|
951
|
+
// Add the hourglass status reaction to the parent (Bundle 3).
|
|
952
|
+
await this.swapReaction(client, resolvedChannel, ts, undefined, "hourglass_flowing_sand");
|
|
953
|
+
this.taskRegistry.set(this.taskKey(resolvedChannel, ts), {
|
|
954
|
+
channel: resolvedChannel,
|
|
955
|
+
title: validatedArgs.title,
|
|
956
|
+
totalSteps: validatedArgs.total_steps,
|
|
957
|
+
reaction: "hourglass_flowing_sand"
|
|
958
|
+
});
|
|
959
|
+
return {
|
|
960
|
+
content: [
|
|
961
|
+
{ type: "text", text: JSON.stringify({ task_ts: ts, channel: resolvedChannel }) }
|
|
962
|
+
]
|
|
963
|
+
};
|
|
964
|
+
}
|
|
965
|
+
async slackUpdateTask(args) {
|
|
966
|
+
const validatedArgs = UpdateTaskArgsSchema.parse(args);
|
|
967
|
+
const client = await this.getActiveClient();
|
|
968
|
+
const channelId = await this.resolveRecipient(validatedArgs.channel, client);
|
|
969
|
+
const entry = this.taskRegistry.get(this.taskKey(channelId, validatedArgs.task_ts));
|
|
970
|
+
const totalSteps = validatedArgs.total_steps ?? entry?.totalSteps;
|
|
971
|
+
// Threaded reply with the progress message. NEVER @-mentions (routine update).
|
|
972
|
+
await client.chat.postMessage({
|
|
973
|
+
channel: channelId,
|
|
974
|
+
thread_ts: validatedArgs.task_ts,
|
|
975
|
+
text: validatedArgs.message,
|
|
976
|
+
...this.identityOverrides(args)
|
|
977
|
+
});
|
|
978
|
+
// If we have step/total, re-render the parent card with a progress bar.
|
|
979
|
+
if (validatedArgs.step != null && totalSteps) {
|
|
980
|
+
const pct = Math.round((validatedArgs.step / totalSteps) * 100);
|
|
981
|
+
const title = entry?.title ?? "Task";
|
|
982
|
+
const card = buildCard({
|
|
983
|
+
header: `⏳ ${title}`,
|
|
984
|
+
sections: [
|
|
985
|
+
{ text: ":hourglass_flowing_sand: *In progress*" },
|
|
986
|
+
{ text: renderProgressBar(pct) + ` (${validatedArgs.step}/${totalSteps})` },
|
|
987
|
+
{ text: `Latest: ${validatedArgs.message}` }
|
|
988
|
+
],
|
|
989
|
+
context: `Updated ${new Date().toISOString()}`
|
|
990
|
+
});
|
|
991
|
+
try {
|
|
992
|
+
await client.chat.update({
|
|
993
|
+
channel: channelId,
|
|
994
|
+
ts: validatedArgs.task_ts,
|
|
995
|
+
text: `⏳ ${title}`,
|
|
996
|
+
blocks: card.blocks
|
|
997
|
+
});
|
|
998
|
+
}
|
|
999
|
+
catch { /* update may fail if posted under a different identity — non-fatal */ }
|
|
1000
|
+
}
|
|
1001
|
+
return {
|
|
1002
|
+
content: [{ type: "text", text: `Task update posted (threaded). task_ts: ${validatedArgs.task_ts}` }]
|
|
1003
|
+
};
|
|
1004
|
+
}
|
|
1005
|
+
async slackCompleteTask(args) {
|
|
1006
|
+
const validatedArgs = CompleteTaskArgsSchema.parse(args);
|
|
1007
|
+
const client = await this.getActiveClient();
|
|
1008
|
+
const channelId = await this.resolveRecipient(validatedArgs.channel, client);
|
|
1009
|
+
const entry = this.taskRegistry.get(this.taskKey(channelId, validatedArgs.task_ts));
|
|
1010
|
+
const title = entry?.title ?? "Task";
|
|
1011
|
+
const ok = validatedArgs.status === "done";
|
|
1012
|
+
const icon = ok ? "✅" : "❌";
|
|
1013
|
+
// Build the final threaded reply. This is the ONLY task tool that may @-mention.
|
|
1014
|
+
let replyText = `${icon} ${validatedArgs.summary}`;
|
|
1015
|
+
if (validatedArgs.notify_user) {
|
|
1016
|
+
replyText = `<@${validatedArgs.notify_user}> ${replyText}`;
|
|
1017
|
+
}
|
|
1018
|
+
await client.chat.postMessage({
|
|
1019
|
+
channel: channelId,
|
|
1020
|
+
thread_ts: validatedArgs.task_ts,
|
|
1021
|
+
text: replyText,
|
|
1022
|
+
...this.identityOverrides(args)
|
|
1023
|
+
});
|
|
1024
|
+
// Edit the parent into a completion summary card.
|
|
1025
|
+
const sections = [
|
|
1026
|
+
{ text: ok ? ":white_check_mark: *Complete*" : ":x: *Failed*" },
|
|
1027
|
+
{ text: validatedArgs.summary }
|
|
1028
|
+
];
|
|
1029
|
+
if (validatedArgs.details) {
|
|
1030
|
+
sections.push({ fields: [{ label: "Details", value: validatedArgs.details }] });
|
|
1031
|
+
}
|
|
1032
|
+
const card = buildCard({
|
|
1033
|
+
header: `${icon} ${title}`,
|
|
1034
|
+
sections,
|
|
1035
|
+
context: `Completed ${new Date().toISOString()}`,
|
|
1036
|
+
color: ok ? "#3D8C62" : "#E8821A"
|
|
1037
|
+
});
|
|
1038
|
+
try {
|
|
1039
|
+
await client.chat.update({
|
|
1040
|
+
channel: channelId,
|
|
1041
|
+
ts: validatedArgs.task_ts,
|
|
1042
|
+
text: `${icon} ${title}`,
|
|
1043
|
+
blocks: card.blocks.length ? card.blocks : undefined,
|
|
1044
|
+
attachments: card.attachments
|
|
1045
|
+
});
|
|
1046
|
+
}
|
|
1047
|
+
catch { /* non-fatal */ }
|
|
1048
|
+
// Swap the hourglass reaction → ✅ / ❌ (Bundle 3).
|
|
1049
|
+
await this.swapReaction(client, channelId, validatedArgs.task_ts, entry?.reaction ?? "hourglass_flowing_sand", ok ? "white_check_mark" : "x");
|
|
1050
|
+
this.taskRegistry.delete(this.taskKey(channelId, validatedArgs.task_ts));
|
|
1051
|
+
return {
|
|
1052
|
+
content: [{ type: "text", text: `Task ${validatedArgs.status}. Parent card updated. task_ts: ${validatedArgs.task_ts}` }]
|
|
1053
|
+
};
|
|
1054
|
+
}
|
|
1055
|
+
// =====================================================================================
|
|
1056
|
+
// LEGATE PULL/POLLING TOOLS (multi-session shared-bot coordination)
|
|
1057
|
+
// -------------------------------------------------------------------------------------
|
|
1058
|
+
// Several Claude Code sessions ("Legates") share ONE Slack bot identity and each runs
|
|
1059
|
+
// a ~3-min poll loop on a shared channel (e.g. #echelon). To stay coordinated without a
|
|
1060
|
+
// server, each Legate persists its own little state file keyed by NATO call-sign:
|
|
1061
|
+
// ~/.mcp-slack/legate-state/<callSign>.json (dir 0700, file 0600)
|
|
1062
|
+
// { cursors: { [channelId]: lastSeenTs }, checkins: { [channelId]: { status, ts } } }
|
|
1063
|
+
// Keying by call-sign means 5 sessions sharing one $HOME never clobber each other.
|
|
1064
|
+
// =====================================================================================
|
|
1065
|
+
// Full NATO phonetic alphabet — the universe of known call-signs.
|
|
1066
|
+
static NATO_CALL_SIGNS = [
|
|
1067
|
+
"Alpha", "Bravo", "Charlie", "Delta", "Echo", "Foxtrot", "Golf", "Hotel",
|
|
1068
|
+
"India", "Juliett", "Kilo", "Lima", "Mike", "November", "Oscar", "Papa",
|
|
1069
|
+
"Quebec", "Romeo", "Sierra", "Tango", "Uniform", "Victor", "Whiskey",
|
|
1070
|
+
"Xray", "Yankee", "Zulu"
|
|
1071
|
+
];
|
|
1072
|
+
legateStateDir() {
|
|
1073
|
+
return path.join(os.homedir(), ".mcp-slack", "legate-state");
|
|
1074
|
+
}
|
|
1075
|
+
// Sanitize a call-sign down to a safe filename stem ([A-Za-z0-9_-]).
|
|
1076
|
+
sanitizeCallSign(callSign) {
|
|
1077
|
+
const clean = String(callSign).replace(/[^A-Za-z0-9_-]/g, "");
|
|
1078
|
+
if (!clean)
|
|
1079
|
+
throw new Error(`Invalid call_sign "${callSign}" — must contain [A-Za-z0-9_-] characters.`);
|
|
1080
|
+
return clean;
|
|
1081
|
+
}
|
|
1082
|
+
// Read this Legate's state. A missing file is normal (first run) → empty state.
|
|
1083
|
+
async loadLegateState(callSign) {
|
|
1084
|
+
const file = path.join(this.legateStateDir(), `${this.sanitizeCallSign(callSign)}.json`);
|
|
1085
|
+
try {
|
|
1086
|
+
const raw = await fs.readFile(file, "utf8");
|
|
1087
|
+
const parsed = JSON.parse(raw);
|
|
1088
|
+
return {
|
|
1089
|
+
cursors: (parsed && typeof parsed.cursors === "object" && parsed.cursors) || {},
|
|
1090
|
+
checkins: (parsed && typeof parsed.checkins === "object" && parsed.checkins) || {}
|
|
1091
|
+
};
|
|
1092
|
+
}
|
|
1093
|
+
catch {
|
|
1094
|
+
return { cursors: {}, checkins: {} };
|
|
1095
|
+
}
|
|
1096
|
+
}
|
|
1097
|
+
async saveLegateState(callSign, state) {
|
|
1098
|
+
const dir = this.legateStateDir();
|
|
1099
|
+
await fs.mkdir(dir, { recursive: true });
|
|
1100
|
+
try {
|
|
1101
|
+
await fs.chmod(dir, 0o700);
|
|
1102
|
+
}
|
|
1103
|
+
catch { /* best-effort */ }
|
|
1104
|
+
const file = path.join(dir, `${this.sanitizeCallSign(callSign)}.json`);
|
|
1105
|
+
await fs.writeFile(file, JSON.stringify(state), { mode: 0o600 });
|
|
1106
|
+
try {
|
|
1107
|
+
await fs.chmod(file, 0o600);
|
|
1108
|
+
}
|
|
1109
|
+
catch { /* best-effort */ }
|
|
1110
|
+
}
|
|
1111
|
+
// Compare two Slack ts strings (e.g. "1700000000.000100") numerically.
|
|
1112
|
+
tsGreater(a, b) {
|
|
1113
|
+
return parseFloat(a) > parseFloat(b);
|
|
1114
|
+
}
|
|
1115
|
+
// Build a case-insensitive word-boundary matcher for a single token. Slack ts are
|
|
1116
|
+
// dotted decimals so we hand-roll the boundary to treat letters/digits as word chars.
|
|
1117
|
+
mentionsToken(text, token) {
|
|
1118
|
+
const esc = token.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
|
|
1119
|
+
// boundary: start/non-word before, and ":"/","/"."/whitespace/non-word/end after.
|
|
1120
|
+
const re = new RegExp(`(^|[^A-Za-z0-9])(?:legate\\s+|@)?${esc}(?=$|[^A-Za-z0-9])`, "i");
|
|
1121
|
+
return re.test(text);
|
|
1122
|
+
}
|
|
1123
|
+
// Classify a message's addressing relative to `self`. First match wins.
|
|
1124
|
+
classifyAddressing(text, self) {
|
|
1125
|
+
const t = text || "";
|
|
1126
|
+
const selfNorm = self.toLowerCase();
|
|
1127
|
+
// to_me: self call-sign as a word (optionally "Legate "/"@" prefixed, ":"/"," suffix OK).
|
|
1128
|
+
if (this.mentionsToken(t, self))
|
|
1129
|
+
return "to_me";
|
|
1130
|
+
// to_all: broadcast phrases / Slack here|channel.
|
|
1131
|
+
const lower = t.toLowerCase();
|
|
1132
|
+
if (/all\s+legates/.test(lower) ||
|
|
1133
|
+
/all\s+agents/.test(lower) ||
|
|
1134
|
+
/\beveryone\b/.test(lower) ||
|
|
1135
|
+
/<!here>/.test(t) ||
|
|
1136
|
+
/<!channel>/.test(t)) {
|
|
1137
|
+
return "to_all";
|
|
1138
|
+
}
|
|
1139
|
+
// whoever_first: open call for any available Legate.
|
|
1140
|
+
if (/\bwhoever\b/.test(lower) ||
|
|
1141
|
+
/\banyone\b/.test(lower) ||
|
|
1142
|
+
/first\s+come/.test(lower)) {
|
|
1143
|
+
return "whoever_first";
|
|
1144
|
+
}
|
|
1145
|
+
// to_other:<Name>: another known call-sign addressed (not self).
|
|
1146
|
+
for (const cs of SlackerV3Server.NATO_CALL_SIGNS) {
|
|
1147
|
+
if (cs.toLowerCase() === selfNorm)
|
|
1148
|
+
continue;
|
|
1149
|
+
if (this.mentionsToken(t, cs))
|
|
1150
|
+
return `to_other:${cs}`;
|
|
1151
|
+
}
|
|
1152
|
+
return "chatter";
|
|
1153
|
+
}
|
|
1154
|
+
// Heuristic: does this message look self-authored by `self`? Used to EXCLUDE a Legate's
|
|
1155
|
+
// own posts from its actionable set (it must not re-process what it just said).
|
|
1156
|
+
looksSelfAuthored(text, self) {
|
|
1157
|
+
const t = (text || "").trim();
|
|
1158
|
+
if (!t)
|
|
1159
|
+
return false;
|
|
1160
|
+
const esc = self.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
|
|
1161
|
+
// Sign-off near the end: "— Legate <self>" (em or double-dash), tolerant of trailing punctuation.
|
|
1162
|
+
if (new RegExp(`(—|--)\\s*legate\\s+${esc}\\b`, "i").test(t))
|
|
1163
|
+
return true;
|
|
1164
|
+
// Leads with the call-sign as a speaker label: "<self> " / "<self>:" / "<self> ·".
|
|
1165
|
+
if (new RegExp(`^${esc}(:|\\s+·|\\s)`, "i").test(t))
|
|
1166
|
+
return true;
|
|
1167
|
+
// Check-in pattern this server emits: ":repeat: <self>:".
|
|
1168
|
+
if (new RegExp(`:repeat:\\s*${esc}:`, "i").test(t))
|
|
1169
|
+
return true;
|
|
1170
|
+
return false;
|
|
1171
|
+
}
|
|
1172
|
+
async slackPoll(args) {
|
|
1173
|
+
const validatedArgs = PollArgsSchema.parse(args);
|
|
1174
|
+
const client = await this.getActiveClient();
|
|
1175
|
+
const channelId = await this.resolveRecipient(validatedArgs.channel, client);
|
|
1176
|
+
const callSign = validatedArgs.call_sign;
|
|
1177
|
+
const limit = validatedArgs.limit ?? 15;
|
|
1178
|
+
const includeChatter = validatedArgs.include_chatter ?? false;
|
|
1179
|
+
const state = await this.loadLegateState(callSign);
|
|
1180
|
+
const storedCursor = state.cursors[channelId];
|
|
1181
|
+
// First poll anchors to "now": with no stored cursor and no explicit `since`,
|
|
1182
|
+
// don't surface stale backlog. Anchor the cursor to now and start watching forward.
|
|
1183
|
+
if (!storedCursor && !validatedArgs.since) {
|
|
1184
|
+
const anchoredTs = (Date.now() / 1000).toFixed(6);
|
|
1185
|
+
state.cursors[channelId] = anchoredTs;
|
|
1186
|
+
await this.saveLegateState(callSign, state);
|
|
1187
|
+
return {
|
|
1188
|
+
content: [{
|
|
1189
|
+
type: "text",
|
|
1190
|
+
text: leanResult({
|
|
1191
|
+
new_count: 0,
|
|
1192
|
+
actionable_count: 0,
|
|
1193
|
+
skipped_count: 0,
|
|
1194
|
+
first_poll: true,
|
|
1195
|
+
anchored_ts: anchoredTs,
|
|
1196
|
+
latest_ts: anchoredTs,
|
|
1197
|
+
messages: []
|
|
1198
|
+
})
|
|
1199
|
+
}]
|
|
1200
|
+
};
|
|
1201
|
+
}
|
|
1202
|
+
// Cursor precedence: explicit `since` arg overrides the stored cursor.
|
|
1203
|
+
const cursor = validatedArgs.since ?? storedCursor;
|
|
1204
|
+
const histArgs = { channel: channelId, limit };
|
|
1205
|
+
if (cursor)
|
|
1206
|
+
histArgs.oldest = cursor;
|
|
1207
|
+
const result = await client.conversations.history(histArgs);
|
|
1208
|
+
const all = result.messages || [];
|
|
1209
|
+
// Only messages STRICTLY newer than the cursor (oldest= is inclusive of the cursor ts).
|
|
1210
|
+
const fresh = cursor ? all.filter((m) => m.ts && this.tsGreater(m.ts, cursor)) : all;
|
|
1211
|
+
let newestTs = cursor;
|
|
1212
|
+
for (const m of fresh) {
|
|
1213
|
+
if (m.ts && (!newestTs || this.tsGreater(m.ts, newestTs)))
|
|
1214
|
+
newestTs = m.ts;
|
|
1215
|
+
}
|
|
1216
|
+
const actionable = [];
|
|
1217
|
+
let skipped = 0;
|
|
1218
|
+
for (const m of fresh) {
|
|
1219
|
+
const text = m.text || "";
|
|
1220
|
+
// A Legate must never re-process its own posts.
|
|
1221
|
+
if (this.looksSelfAuthored(text, callSign)) {
|
|
1222
|
+
skipped++;
|
|
1223
|
+
continue;
|
|
1224
|
+
}
|
|
1225
|
+
const addressed = this.classifyAddressing(text, callSign);
|
|
1226
|
+
if (!includeChatter && addressed === "chatter") {
|
|
1227
|
+
skipped++;
|
|
1228
|
+
continue;
|
|
1229
|
+
}
|
|
1230
|
+
actionable.push({ ts: m.ts ?? "", user: m.user ?? "", text, addressed });
|
|
1231
|
+
}
|
|
1232
|
+
// Advance the cursor past EVERYTHING seen this poll (including skipped/chatter) so we
|
|
1233
|
+
// never re-scan them. Save even when nothing was actionable.
|
|
1234
|
+
if (newestTs) {
|
|
1235
|
+
state.cursors[channelId] = newestTs;
|
|
1236
|
+
await this.saveLegateState(callSign, state);
|
|
1237
|
+
}
|
|
1238
|
+
return {
|
|
1239
|
+
content: [{
|
|
1240
|
+
type: "text",
|
|
1241
|
+
text: leanResult({
|
|
1242
|
+
new_count: fresh.length,
|
|
1243
|
+
actionable_count: actionable.length,
|
|
1244
|
+
skipped_count: skipped,
|
|
1245
|
+
latest_ts: newestTs ?? null,
|
|
1246
|
+
messages: actionable
|
|
1247
|
+
})
|
|
1248
|
+
}]
|
|
1249
|
+
};
|
|
1250
|
+
}
|
|
1251
|
+
// Normalize free-text task → a stable lane key: lowercase, trimmed, non-alphanumeric
|
|
1252
|
+
// runs collapsed to a single "-", no leading/trailing "-".
|
|
1253
|
+
laneKey(task) {
|
|
1254
|
+
return String(task)
|
|
1255
|
+
.toLowerCase()
|
|
1256
|
+
.trim()
|
|
1257
|
+
.replace(/[^a-z0-9]+/g, "-")
|
|
1258
|
+
.replace(/^-+|-+$/g, "");
|
|
1259
|
+
}
|
|
1260
|
+
// Parse a standardized LANE CLAIM line. Returns the claiming call-sign + lane key, or null.
|
|
1261
|
+
parseLaneClaim(text) {
|
|
1262
|
+
const m = (text || "").match(/LANE CLAIM — Legate\s+([A-Za-z0-9_-]+)\s+taking:.*\[lane:([a-z0-9-]+)\]/);
|
|
1263
|
+
if (!m)
|
|
1264
|
+
return null;
|
|
1265
|
+
return { callSign: m[1], laneKey: m[2] };
|
|
1266
|
+
}
|
|
1267
|
+
async slackClaimLane(args) {
|
|
1268
|
+
const validatedArgs = ClaimLaneArgsSchema.parse(args);
|
|
1269
|
+
const client = await this.getActiveClient();
|
|
1270
|
+
const channelId = await this.resolveRecipient(validatedArgs.channel, client);
|
|
1271
|
+
const callSign = validatedArgs.call_sign;
|
|
1272
|
+
const task = validatedArgs.task;
|
|
1273
|
+
const ttlMinutes = validatedArgs.ttl_minutes ?? 20;
|
|
1274
|
+
const lookback = validatedArgs.lookback ?? 30;
|
|
1275
|
+
const laneKey = this.laneKey(task);
|
|
1276
|
+
if (validatedArgs.release === true) {
|
|
1277
|
+
await client.chat.postMessage({
|
|
1278
|
+
channel: channelId,
|
|
1279
|
+
text: `:checkered_flag: LANE RELEASE — Legate ${callSign} released: ${task} [lane:${laneKey}]`,
|
|
1280
|
+
mrkdwn: true,
|
|
1281
|
+
...this.identityOverrides(args)
|
|
1282
|
+
});
|
|
1283
|
+
return { content: [{ type: "text", text: leanResult({ released: true, lane_key: laneKey }) }] };
|
|
1284
|
+
}
|
|
1285
|
+
const ttlSeconds = ttlMinutes * 60;
|
|
1286
|
+
const nowSec = Date.now() / 1000;
|
|
1287
|
+
// Find the most-recent UNEXPIRED claim on this lane by ANOTHER call-sign.
|
|
1288
|
+
const findActiveOther = (messages, beforeTs) => {
|
|
1289
|
+
let hit = null;
|
|
1290
|
+
for (const m of messages) {
|
|
1291
|
+
const parsed = this.parseLaneClaim(m.text || "");
|
|
1292
|
+
if (!parsed || parsed.laneKey !== laneKey)
|
|
1293
|
+
continue;
|
|
1294
|
+
if (parsed.callSign === callSign)
|
|
1295
|
+
continue;
|
|
1296
|
+
const claimTs = m.ts;
|
|
1297
|
+
if (nowSec - parseFloat(claimTs) >= ttlSeconds)
|
|
1298
|
+
continue; // expired
|
|
1299
|
+
if (beforeTs && !this.tsGreater(beforeTs, claimTs))
|
|
1300
|
+
continue; // only earlier-than-mine
|
|
1301
|
+
if (!hit || this.tsGreater(claimTs, hit.claim_ts)) {
|
|
1302
|
+
hit = { claimed_by: parsed.callSign, claim_ts: claimTs };
|
|
1303
|
+
}
|
|
1304
|
+
}
|
|
1305
|
+
return hit;
|
|
1306
|
+
};
|
|
1307
|
+
const pre = await client.conversations.history({ channel: channelId, limit: lookback });
|
|
1308
|
+
const preMsgs = pre.messages || [];
|
|
1309
|
+
const existing = findActiveOther(preMsgs);
|
|
1310
|
+
if (existing) {
|
|
1311
|
+
// Someone else already holds this lane — don't pile on.
|
|
1312
|
+
return {
|
|
1313
|
+
content: [{
|
|
1314
|
+
type: "text",
|
|
1315
|
+
text: leanResult({ granted: false, claimed_by: existing.claimed_by, claim_ts: existing.claim_ts, lane_key: laneKey })
|
|
1316
|
+
}]
|
|
1317
|
+
};
|
|
1318
|
+
}
|
|
1319
|
+
// Post our claim and capture its ts.
|
|
1320
|
+
const posted = await client.chat.postMessage({
|
|
1321
|
+
channel: channelId,
|
|
1322
|
+
text: `:triangular_flag_on_post: LANE CLAIM — Legate ${callSign} taking: ${task} [lane:${laneKey}]`,
|
|
1323
|
+
mrkdwn: true,
|
|
1324
|
+
...this.identityOverrides(args)
|
|
1325
|
+
});
|
|
1326
|
+
const myClaimTs = posted.ts;
|
|
1327
|
+
// Re-read once and check for any OTHER unexpired claim with ts < ours (we lost the race).
|
|
1328
|
+
const post = await client.conversations.history({ channel: channelId, limit: lookback });
|
|
1329
|
+
const earlier = findActiveOther(post.messages || [], myClaimTs);
|
|
1330
|
+
if (earlier) {
|
|
1331
|
+
return {
|
|
1332
|
+
content: [{
|
|
1333
|
+
type: "text",
|
|
1334
|
+
text: leanResult({ granted: false, yielded: true, claimed_by: earlier.claimed_by, claim_ts: earlier.claim_ts, my_claim_ts: myClaimTs, lane_key: laneKey })
|
|
1335
|
+
}]
|
|
1336
|
+
};
|
|
1337
|
+
}
|
|
1338
|
+
return { content: [{ type: "text", text: leanResult({ granted: true, claim_ts: myClaimTs, lane_key: laneKey }) }] };
|
|
1339
|
+
}
|
|
1340
|
+
async slackCheckin(args) {
|
|
1341
|
+
const validatedArgs = CheckinArgsSchema.parse(args);
|
|
1342
|
+
const client = await this.getActiveClient();
|
|
1343
|
+
const channelId = await this.resolveRecipient(validatedArgs.channel, client);
|
|
1344
|
+
const callSign = validatedArgs.call_sign;
|
|
1345
|
+
const status = validatedArgs.status;
|
|
1346
|
+
const force = validatedArgs.force ?? false;
|
|
1347
|
+
const heartbeatMinutes = validatedArgs.heartbeat_minutes ?? 0;
|
|
1348
|
+
const state = await this.loadLegateState(callSign);
|
|
1349
|
+
const prev = state.checkins[channelId];
|
|
1350
|
+
if (!force && prev && prev.status === status) {
|
|
1351
|
+
const heartbeatDue = heartbeatMinutes > 0 && (Date.now() / 1000 - parseFloat(prev.ts)) >= heartbeatMinutes * 60;
|
|
1352
|
+
if (!heartbeatDue) {
|
|
1353
|
+
return { content: [{ type: "text", text: leanResult({ posted: false, suppressed: true, reason: "unchanged" }) }] };
|
|
1354
|
+
}
|
|
1355
|
+
}
|
|
1356
|
+
const posted = await client.chat.postMessage({
|
|
1357
|
+
channel: channelId,
|
|
1358
|
+
text: `:repeat: ${callSign}: ${status}`,
|
|
1359
|
+
mrkdwn: true,
|
|
1360
|
+
...this.identityOverrides(args)
|
|
1361
|
+
});
|
|
1362
|
+
const ts = posted.ts;
|
|
1363
|
+
state.checkins[channelId] = { status, ts };
|
|
1364
|
+
await this.saveLegateState(callSign, state);
|
|
1365
|
+
return { content: [{ type: "text", text: leanResult({ posted: true, ts }) }] };
|
|
1366
|
+
}
|
|
1129
1367
|
async slackGetChannelHistory(args) {
|
|
1130
1368
|
const validatedArgs = GetChannelHistoryArgsSchema.parse(args);
|
|
1131
1369
|
const client = await this.getActiveClient();
|
|
1370
|
+
const limit = validatedArgs.limit || 100;
|
|
1132
1371
|
const result = await client.conversations.history({
|
|
1133
1372
|
channel: validatedArgs.channel,
|
|
1134
|
-
limit
|
|
1373
|
+
limit
|
|
1135
1374
|
});
|
|
1136
|
-
const
|
|
1137
|
-
|
|
1138
|
-
|
|
1139
|
-
|
|
1140
|
-
|
|
1141
|
-
|
|
1142
|
-
|
|
1143
|
-
|
|
1144
|
-
|
|
1145
|
-
|
|
1146
|
-
|
|
1147
|
-
|
|
1375
|
+
const allMessages = result.messages || [];
|
|
1376
|
+
// VERBOSE: hand back the raw API payload verbatim — the firehose is one call away.
|
|
1377
|
+
if (validatedArgs.verbose) {
|
|
1378
|
+
return {
|
|
1379
|
+
content: [{ type: "text", text: JSON.stringify(allMessages, null, 2) }]
|
|
1380
|
+
};
|
|
1381
|
+
}
|
|
1382
|
+
// LEAN: keep message TEXT verbatim (never clipped), strip only the metadata
|
|
1383
|
+
// exhaust (reactions blobs, edited markers, block JSON, etc.). The only count
|
|
1384
|
+
// reduction is the item cap, which is surfaced in a footer so nothing is silently lost.
|
|
1385
|
+
const lean = allMessages.map(msg => ({
|
|
1386
|
+
user: msg.user,
|
|
1387
|
+
text: msg.text, // verbatim, character-for-character
|
|
1388
|
+
ts: msg.ts,
|
|
1389
|
+
...(msg.reply_count ? { reply_count: msg.reply_count } : {})
|
|
1390
|
+
}));
|
|
1148
1391
|
return {
|
|
1149
1392
|
content: [
|
|
1150
1393
|
{
|
|
1151
1394
|
type: "text",
|
|
1152
|
-
text:
|
|
1395
|
+
text: leanResult(lean) + this.moreFooter(lean.length, allMessages.length, limit)
|
|
1153
1396
|
}
|
|
1154
1397
|
]
|
|
1155
1398
|
};
|
|
1156
1399
|
}
|
|
1400
|
+
// Trailing footer surfaced whenever a lean result capped the item count, so the
|
|
1401
|
+
// caller knows more data is available and how to get it. Returns "" when nothing
|
|
1402
|
+
// was capped.
|
|
1403
|
+
moreFooter(shown, total, limit) {
|
|
1404
|
+
if (total > shown || shown >= limit) {
|
|
1405
|
+
return `\n(showing ${shown}${total > shown ? ` of ${total}` : ""} — pass verbose:true or a higher limit/cursor for the rest)`;
|
|
1406
|
+
}
|
|
1407
|
+
return "";
|
|
1408
|
+
}
|
|
1157
1409
|
async slackAddReaction(args) {
|
|
1158
1410
|
const validatedArgs = AddReactionArgsSchema.parse(args);
|
|
1159
1411
|
const client = await this.getActiveClient();
|
|
@@ -1174,25 +1426,38 @@ class SlackerV3Server {
|
|
|
1174
1426
|
async slackListUsers(args) {
|
|
1175
1427
|
const validatedArgs = ListUsersArgsSchema.parse(args);
|
|
1176
1428
|
const client = await this.getActiveClient();
|
|
1177
|
-
|
|
1178
|
-
|
|
1179
|
-
|
|
1180
|
-
const
|
|
1429
|
+
// Fully paginated + cached so we don't under-report past page 1.
|
|
1430
|
+
const allUsers = await this.getAllUsersCached(client);
|
|
1431
|
+
const limit = validatedArgs.limit || 100;
|
|
1432
|
+
const slice = allUsers.slice(0, limit);
|
|
1433
|
+
// VERBOSE: full raw user objects for the capped slice.
|
|
1434
|
+
if (validatedArgs.verbose) {
|
|
1435
|
+
const full = slice.map(user => ({
|
|
1436
|
+
id: user.id,
|
|
1437
|
+
name: user.name,
|
|
1438
|
+
real_name: user.real_name,
|
|
1439
|
+
display_name: user.profile?.display_name,
|
|
1440
|
+
email: user.profile?.email,
|
|
1441
|
+
is_admin: user.is_admin,
|
|
1442
|
+
is_owner: user.is_owner,
|
|
1443
|
+
status_text: user.profile?.status_text,
|
|
1444
|
+
status_emoji: user.profile?.status_emoji
|
|
1445
|
+
}));
|
|
1446
|
+
return {
|
|
1447
|
+
content: [{ type: "text", text: JSON.stringify(full, null, 2) + this.moreFooter(slice.length, allUsers.length, limit) }]
|
|
1448
|
+
};
|
|
1449
|
+
}
|
|
1450
|
+
// LEAN: just the essential identity fields.
|
|
1451
|
+
const users = slice.map(user => ({
|
|
1181
1452
|
id: user.id,
|
|
1182
1453
|
name: user.name,
|
|
1183
|
-
real_name: user.real_name
|
|
1184
|
-
|
|
1185
|
-
email: user.profile?.email,
|
|
1186
|
-
is_admin: user.is_admin,
|
|
1187
|
-
is_owner: user.is_owner,
|
|
1188
|
-
status_text: user.profile?.status_text,
|
|
1189
|
-
status_emoji: user.profile?.status_emoji
|
|
1190
|
-
})) || [];
|
|
1454
|
+
real_name: user.real_name
|
|
1455
|
+
}));
|
|
1191
1456
|
return {
|
|
1192
1457
|
content: [
|
|
1193
1458
|
{
|
|
1194
1459
|
type: "text",
|
|
1195
|
-
text:
|
|
1460
|
+
text: leanResult(users) + this.moreFooter(slice.length, allUsers.length, limit)
|
|
1196
1461
|
}
|
|
1197
1462
|
]
|
|
1198
1463
|
};
|
|
@@ -1200,15 +1465,16 @@ class SlackerV3Server {
|
|
|
1200
1465
|
async slackGetUserByName(args) {
|
|
1201
1466
|
const validatedArgs = GetUserByNameArgsSchema.parse(args);
|
|
1202
1467
|
const client = await this.getActiveClient();
|
|
1203
|
-
|
|
1468
|
+
// Cached + fully paginated so we don't miss users past page 1.
|
|
1469
|
+
const activeMembers = await this.getAllUsersCached(client);
|
|
1204
1470
|
const searchTerm = validatedArgs.name.toLowerCase();
|
|
1205
|
-
// First try
|
|
1206
|
-
let user =
|
|
1471
|
+
// First try (substring) match
|
|
1472
|
+
let user = activeMembers.find(u => u.name?.toLowerCase().includes(searchTerm) ||
|
|
1207
1473
|
u.real_name?.toLowerCase().includes(searchTerm) ||
|
|
1208
|
-
u.profile?.display_name?.toLowerCase().includes(searchTerm))
|
|
1209
|
-
// If no
|
|
1474
|
+
u.profile?.display_name?.toLowerCase().includes(searchTerm));
|
|
1475
|
+
// If no match, use fuzzy matching
|
|
1210
1476
|
if (!user) {
|
|
1211
|
-
const activeUsers =
|
|
1477
|
+
const activeUsers = activeMembers;
|
|
1212
1478
|
// Prepare data for fuzzy search
|
|
1213
1479
|
const searchableUsers = activeUsers.map(u => ({
|
|
1214
1480
|
...u,
|
|
@@ -1325,27 +1591,39 @@ class SlackerV3Server {
|
|
|
1325
1591
|
count: validatedArgs.count || 20,
|
|
1326
1592
|
page: validatedArgs.page || 1
|
|
1327
1593
|
});
|
|
1328
|
-
|
|
1594
|
+
// VERBOSE: raw search payload.
|
|
1595
|
+
if (validatedArgs.verbose) {
|
|
1596
|
+
return {
|
|
1597
|
+
content: [{ type: "text", text: JSON.stringify(result.messages, null, 2) }]
|
|
1598
|
+
};
|
|
1599
|
+
}
|
|
1600
|
+
// LEAN: verbatim text + essential locator fields. Text is never clipped.
|
|
1601
|
+
const matches = result.messages?.matches || [];
|
|
1602
|
+
const messages = matches.map(msg => ({
|
|
1329
1603
|
text: msg.text,
|
|
1330
1604
|
user: msg.user,
|
|
1331
1605
|
channel: msg.channel?.name,
|
|
1332
1606
|
channel_id: msg.channel?.id,
|
|
1333
|
-
|
|
1607
|
+
ts: msg.ts,
|
|
1334
1608
|
permalink: msg.permalink
|
|
1335
|
-
}))
|
|
1609
|
+
}));
|
|
1610
|
+
const total = result.messages?.total || matches.length;
|
|
1336
1611
|
return {
|
|
1337
1612
|
content: [
|
|
1338
1613
|
{
|
|
1339
1614
|
type: "text",
|
|
1340
|
-
text:
|
|
1341
|
-
total: result.messages?.total || 0,
|
|
1342
|
-
pagination: result.messages?.pagination,
|
|
1343
|
-
messages: messages
|
|
1344
|
-
}, null, 2)
|
|
1615
|
+
text: leanResult(messages) + this.searchFooter(messages.length, total)
|
|
1345
1616
|
}
|
|
1346
1617
|
]
|
|
1347
1618
|
};
|
|
1348
1619
|
}
|
|
1620
|
+
// Footer for search tools where `total` is Slack's reported match total.
|
|
1621
|
+
searchFooter(shown, total) {
|
|
1622
|
+
if (total > shown) {
|
|
1623
|
+
return `\n(showing ${shown} of ${total} — pass verbose:true or a higher count/page for more)`;
|
|
1624
|
+
}
|
|
1625
|
+
return "";
|
|
1626
|
+
}
|
|
1349
1627
|
async slackSearchByUser(args) {
|
|
1350
1628
|
const validatedArgs = SearchByUserArgsSchema.parse(args);
|
|
1351
1629
|
const client = await this.getActiveUserClient();
|
|
@@ -1357,21 +1635,25 @@ class SlackerV3Server {
|
|
|
1357
1635
|
query: query,
|
|
1358
1636
|
count: validatedArgs.count || 20
|
|
1359
1637
|
});
|
|
1360
|
-
|
|
1638
|
+
if (validatedArgs.verbose) {
|
|
1639
|
+
return {
|
|
1640
|
+
content: [{ type: "text", text: JSON.stringify(result.messages, null, 2) }]
|
|
1641
|
+
};
|
|
1642
|
+
}
|
|
1643
|
+
const matches = result.messages?.matches || [];
|
|
1644
|
+
const messages = matches.map(msg => ({
|
|
1361
1645
|
text: msg.text,
|
|
1362
1646
|
channel: msg.channel?.name,
|
|
1363
1647
|
channel_id: msg.channel?.id,
|
|
1364
|
-
|
|
1648
|
+
ts: msg.ts,
|
|
1365
1649
|
permalink: msg.permalink
|
|
1366
|
-
}))
|
|
1650
|
+
}));
|
|
1651
|
+
const total = result.messages?.total || matches.length;
|
|
1367
1652
|
return {
|
|
1368
1653
|
content: [
|
|
1369
1654
|
{
|
|
1370
1655
|
type: "text",
|
|
1371
|
-
text:
|
|
1372
|
-
total: result.messages?.total || 0,
|
|
1373
|
-
messages: messages
|
|
1374
|
-
}, null, 2)
|
|
1656
|
+
text: leanResult(messages) + this.searchFooter(messages.length, total)
|
|
1375
1657
|
}
|
|
1376
1658
|
]
|
|
1377
1659
|
};
|
|
@@ -1387,26 +1669,27 @@ class SlackerV3Server {
|
|
|
1387
1669
|
query: query,
|
|
1388
1670
|
count: validatedArgs.count || 20
|
|
1389
1671
|
});
|
|
1390
|
-
|
|
1672
|
+
if (validatedArgs.verbose) {
|
|
1673
|
+
return {
|
|
1674
|
+
content: [{ type: "text", text: JSON.stringify(result.messages, null, 2) }]
|
|
1675
|
+
};
|
|
1676
|
+
}
|
|
1677
|
+
const matches = result.messages?.matches || [];
|
|
1678
|
+
const messages = matches.map(msg => ({
|
|
1391
1679
|
text: msg.text,
|
|
1392
1680
|
user: msg.user,
|
|
1393
1681
|
channel: msg.channel?.name,
|
|
1394
1682
|
channel_id: msg.channel?.id,
|
|
1395
|
-
|
|
1683
|
+
ts: msg.ts,
|
|
1396
1684
|
permalink: msg.permalink
|
|
1397
|
-
}))
|
|
1685
|
+
}));
|
|
1686
|
+
const total = result.messages?.total || matches.length;
|
|
1398
1687
|
return {
|
|
1399
1688
|
content: [
|
|
1400
1689
|
{
|
|
1401
1690
|
type: "text",
|
|
1402
|
-
text:
|
|
1403
|
-
|
|
1404
|
-
date_range: {
|
|
1405
|
-
from: validatedArgs.from_date,
|
|
1406
|
-
to: validatedArgs.to_date
|
|
1407
|
-
},
|
|
1408
|
-
messages: messages
|
|
1409
|
-
}, null, 2)
|
|
1691
|
+
text: `${validatedArgs.from_date}..${validatedArgs.to_date}\n` +
|
|
1692
|
+
leanResult(messages) + this.searchFooter(messages.length, total)
|
|
1410
1693
|
}
|
|
1411
1694
|
]
|
|
1412
1695
|
};
|
|
@@ -1589,7 +1872,8 @@ class SlackerV3Server {
|
|
|
1589
1872
|
const result = await client.chat.postMessage({
|
|
1590
1873
|
channel: validatedArgs.channel,
|
|
1591
1874
|
blocks: validatedArgs.blocks,
|
|
1592
|
-
text: validatedArgs.text || "Formatted message"
|
|
1875
|
+
text: validatedArgs.text || "Formatted message",
|
|
1876
|
+
...this.identityOverrides(args)
|
|
1593
1877
|
});
|
|
1594
1878
|
return {
|
|
1595
1879
|
content: [
|
|
@@ -1707,23 +1991,43 @@ class SlackerV3Server {
|
|
|
1707
1991
|
async slackBulkForwardMessages(args) {
|
|
1708
1992
|
const validatedArgs = BulkForwardMessagesArgsSchema.parse(args);
|
|
1709
1993
|
const client = await this.getActiveClient();
|
|
1710
|
-
//
|
|
1711
|
-
const
|
|
1712
|
-
|
|
1713
|
-
|
|
1714
|
-
|
|
1715
|
-
|
|
1716
|
-
|
|
1717
|
-
|
|
1718
|
-
});
|
|
1719
|
-
if (history.messages?.[0]) {
|
|
1720
|
-
messages.push(history.messages[0]);
|
|
1721
|
-
}
|
|
1722
|
-
}
|
|
1994
|
+
// Fetch all source messages in parallel (was a serial N+1 loop).
|
|
1995
|
+
const histories = await Promise.all(validatedArgs.timestamps.map(timestamp => client.conversations.history({
|
|
1996
|
+
channel: validatedArgs.source_channel,
|
|
1997
|
+
latest: timestamp,
|
|
1998
|
+
limit: 1,
|
|
1999
|
+
inclusive: true
|
|
2000
|
+
}).then(h => h.messages?.[0]).catch(() => undefined)));
|
|
2001
|
+
const messages = histories.filter((m) => !!m);
|
|
1723
2002
|
if (messages.length === 0) {
|
|
1724
2003
|
throw new Error("No messages found to forward");
|
|
1725
2004
|
}
|
|
1726
|
-
//
|
|
2005
|
+
// Resolve each distinct user ID exactly once (was resolved per-message-per-target).
|
|
2006
|
+
const userIds = new Set();
|
|
2007
|
+
for (const msg of messages) {
|
|
2008
|
+
if (msg.user)
|
|
2009
|
+
userIds.add(msg.user);
|
|
2010
|
+
}
|
|
2011
|
+
const userNames = new Map();
|
|
2012
|
+
await Promise.all(Array.from(userIds).map(async (uid) => {
|
|
2013
|
+
try {
|
|
2014
|
+
const userInfo = await client.users.info({ user: uid });
|
|
2015
|
+
userNames.set(uid, userInfo.user?.real_name || userInfo.user?.name || "Unknown User");
|
|
2016
|
+
}
|
|
2017
|
+
catch {
|
|
2018
|
+
userNames.set(uid, "Unknown User");
|
|
2019
|
+
}
|
|
2020
|
+
}));
|
|
2021
|
+
// Build the combined message body once from the resolved name map.
|
|
2022
|
+
let body = `Forwarded ${messages.length} messages from <#${validatedArgs.source_channel}>:\n\n`;
|
|
2023
|
+
if (validatedArgs.comment) {
|
|
2024
|
+
body = `${validatedArgs.comment}\n\n${body}`;
|
|
2025
|
+
}
|
|
2026
|
+
for (const msg of messages) {
|
|
2027
|
+
const userName = (msg.user && userNames.get(msg.user)) || "Unknown User";
|
|
2028
|
+
body += `>>> *${userName}*: ${msg.text}\n\n`;
|
|
2029
|
+
}
|
|
2030
|
+
// Forward to each target channel.
|
|
1727
2031
|
const results = {
|
|
1728
2032
|
successful: 0,
|
|
1729
2033
|
failed: 0,
|
|
@@ -1731,27 +2035,9 @@ class SlackerV3Server {
|
|
|
1731
2035
|
};
|
|
1732
2036
|
for (const targetChannel of validatedArgs.target_channels) {
|
|
1733
2037
|
try {
|
|
1734
|
-
// Combine all messages into one
|
|
1735
|
-
let combinedText = `Forwarded ${messages.length} messages from <#${validatedArgs.source_channel}>:\n\n`;
|
|
1736
|
-
if (validatedArgs.comment) {
|
|
1737
|
-
combinedText = `${validatedArgs.comment}\n\n${combinedText}`;
|
|
1738
|
-
}
|
|
1739
|
-
for (const msg of messages) {
|
|
1740
|
-
let userName = "Unknown User";
|
|
1741
|
-
if (msg.user) {
|
|
1742
|
-
try {
|
|
1743
|
-
const userInfo = await client.users.info({ user: msg.user });
|
|
1744
|
-
userName = userInfo.user?.real_name || userInfo.user?.name || "Unknown User";
|
|
1745
|
-
}
|
|
1746
|
-
catch {
|
|
1747
|
-
// Ignore user lookup errors
|
|
1748
|
-
}
|
|
1749
|
-
}
|
|
1750
|
-
combinedText += `>>> *${userName}*: ${msg.text}\n\n`;
|
|
1751
|
-
}
|
|
1752
2038
|
await client.chat.postMessage({
|
|
1753
2039
|
channel: targetChannel,
|
|
1754
|
-
text:
|
|
2040
|
+
text: body
|
|
1755
2041
|
});
|
|
1756
2042
|
results.successful++;
|
|
1757
2043
|
}
|
|
@@ -1802,37 +2088,36 @@ class SlackerV3Server {
|
|
|
1802
2088
|
]
|
|
1803
2089
|
};
|
|
1804
2090
|
}
|
|
1805
|
-
async slackGetWorkspaceStats() {
|
|
2091
|
+
async slackGetWorkspaceStats(args) {
|
|
2092
|
+
const validatedArgs = GetWorkspaceStatsArgsSchema.parse(args ?? {});
|
|
1806
2093
|
const client = await this.getActiveClient();
|
|
1807
2094
|
// Get team info
|
|
1808
2095
|
const teamInfo = await client.team.info();
|
|
1809
|
-
// Get user count
|
|
1810
|
-
const
|
|
1811
|
-
|
|
1812
|
-
|
|
1813
|
-
const
|
|
1814
|
-
|
|
1815
|
-
|
|
1816
|
-
|
|
1817
|
-
|
|
1818
|
-
|
|
1819
|
-
|
|
1820
|
-
|
|
1821
|
-
|
|
1822
|
-
|
|
1823
|
-
|
|
1824
|
-
|
|
1825
|
-
},
|
|
1826
|
-
stats: {
|
|
1827
|
-
total_users: activeUsers.length,
|
|
1828
|
-
total_channels: channels.channels?.length || 0,
|
|
1829
|
-
admins: activeUsers.filter(u => u.is_admin).length,
|
|
1830
|
-
owners: activeUsers.filter(u => u.is_owner).length
|
|
1831
|
-
}
|
|
1832
|
-
}, null, 2)
|
|
1833
|
-
}
|
|
1834
|
-
]
|
|
2096
|
+
// Get user count (fully paginated + cached so we don't under-report)
|
|
2097
|
+
const activeUsers = await this.getAllUsersCached(client);
|
|
2098
|
+
// Get channel count (fully paginated + cached)
|
|
2099
|
+
const channels = await this.getAllChannelsCached(client);
|
|
2100
|
+
const stats = {
|
|
2101
|
+
team: {
|
|
2102
|
+
name: teamInfo.team?.name,
|
|
2103
|
+
domain: teamInfo.team?.domain,
|
|
2104
|
+
email_domain: teamInfo.team?.email_domain
|
|
2105
|
+
},
|
|
2106
|
+
stats: {
|
|
2107
|
+
total_users: activeUsers.length,
|
|
2108
|
+
total_channels: channels.length || 0,
|
|
2109
|
+
admins: activeUsers.filter(u => u.is_admin).length,
|
|
2110
|
+
owners: activeUsers.filter(u => u.is_owner).length
|
|
2111
|
+
}
|
|
1835
2112
|
};
|
|
2113
|
+
if (validatedArgs.verbose) {
|
|
2114
|
+
return { content: [{ type: "text", text: JSON.stringify(stats, null, 2) }] };
|
|
2115
|
+
}
|
|
2116
|
+
// LEAN: one-line human-readable summary.
|
|
2117
|
+
const text = `${stats.team.name} (${stats.team.domain}) — ` +
|
|
2118
|
+
`${stats.stats.total_users} users, ${stats.stats.total_channels} channels, ` +
|
|
2119
|
+
`${stats.stats.admins} admins, ${stats.stats.owners} owners`;
|
|
2120
|
+
return { content: [{ type: "text", text }] };
|
|
1836
2121
|
}
|
|
1837
2122
|
// =====================================================================================
|
|
1838
2123
|
// FILE UPLOAD AND DIAGRAM TOOLS
|
|
@@ -1890,12 +2175,21 @@ class SlackerV3Server {
|
|
|
1890
2175
|
// Build the HTML to render
|
|
1891
2176
|
let htmlContent;
|
|
1892
2177
|
if (diagramType === "mermaid") {
|
|
2178
|
+
// HTML-escape the diagram source so it cannot break out of the <pre> and
|
|
2179
|
+
// inject arbitrary markup/scripts (prompt-injection hardening).
|
|
2180
|
+
const escaped = validatedArgs.diagram_content
|
|
2181
|
+
.replace(/&/g, "&")
|
|
2182
|
+
.replace(/</g, "<")
|
|
2183
|
+
.replace(/>/g, ">");
|
|
2184
|
+
// Prefer a locally-bundled mermaid copy if one is installed; otherwise fall
|
|
2185
|
+
// back to the single allow-listed CDN URL (see renderHtmlToPng request
|
|
2186
|
+
// interception, which blocks every other network request).
|
|
1893
2187
|
htmlContent = `<!DOCTYPE html>
|
|
1894
2188
|
<html><head>
|
|
1895
2189
|
<script src="https://cdn.jsdelivr.net/npm/mermaid@10/dist/mermaid.min.js"></script>
|
|
1896
2190
|
<style>body { margin: 0; padding: 20px; background: white; }</style>
|
|
1897
2191
|
</head><body>
|
|
1898
|
-
<pre class="mermaid">${
|
|
2192
|
+
<pre class="mermaid">${escaped}</pre>
|
|
1899
2193
|
<script>mermaid.initialize({ startOnLoad: true, theme: 'default' });</script>
|
|
1900
2194
|
</body></html>`;
|
|
1901
2195
|
}
|
|
@@ -1914,14 +2208,13 @@ ${validatedArgs.diagram_content}
|
|
|
1914
2208
|
</body></html>`;
|
|
1915
2209
|
}
|
|
1916
2210
|
}
|
|
1917
|
-
// Create temp
|
|
2211
|
+
// Create temp output path with an unpredictable name to avoid collision /
|
|
2212
|
+
// symlink races (was `slack-diagram-${Date.now()}`).
|
|
1918
2213
|
const tempDir = tmpdir();
|
|
1919
|
-
const
|
|
1920
|
-
const tempPngPath = path.join(tempDir, `slack-diagram-${Date.now()}.png`);
|
|
2214
|
+
const tempPngPath = path.join(tempDir, `slack-diagram-${crypto.randomUUID()}.png`);
|
|
1921
2215
|
try {
|
|
1922
|
-
|
|
1923
|
-
|
|
1924
|
-
await this.renderHtmlToPng(tempHtmlPath, tempPngPath);
|
|
2216
|
+
// Render directly from the HTML string (no file:// navigation, no temp HTML file).
|
|
2217
|
+
await this.renderHtmlToPng(htmlContent, tempPngPath);
|
|
1925
2218
|
// Upload the rendered PNG using slackUploadFile
|
|
1926
2219
|
const uploadResult = await this.slackUploadFile({
|
|
1927
2220
|
channel: validatedArgs.channel,
|
|
@@ -1932,24 +2225,81 @@ ${validatedArgs.diagram_content}
|
|
|
1932
2225
|
return uploadResult;
|
|
1933
2226
|
}
|
|
1934
2227
|
finally {
|
|
1935
|
-
// Cleanup temp
|
|
1936
|
-
await fs.unlink(tempHtmlPath).catch(() => { });
|
|
2228
|
+
// Cleanup temp file
|
|
1937
2229
|
await fs.unlink(tempPngPath).catch(() => { });
|
|
1938
2230
|
}
|
|
1939
2231
|
}
|
|
1940
|
-
|
|
1941
|
-
|
|
2232
|
+
// Lazily launch (and keep warm) a singleton Puppeteer browser.
|
|
2233
|
+
async getBrowser() {
|
|
2234
|
+
if (this.browser) {
|
|
2235
|
+
// Bump the idle timer on each use.
|
|
2236
|
+
this.scheduleBrowserIdleClose();
|
|
2237
|
+
return this.browser;
|
|
2238
|
+
}
|
|
2239
|
+
const puppeteerModule = "puppeteer";
|
|
2240
|
+
const puppeteer = await import(/* webpackIgnore: true */ puppeteerModule);
|
|
2241
|
+
// NOTE on sandbox flags: a true browser sandbox is preferred for security.
|
|
2242
|
+
// We intentionally do NOT pass --no-sandbox / --disable-setuid-sandbox here.
|
|
2243
|
+
// Combined with full request interception (below), the renderer cannot reach
|
|
2244
|
+
// the network or local filesystem regardless. If a specific CI/container env
|
|
2245
|
+
// truly requires --no-sandbox to launch Chromium, add it here with a comment.
|
|
2246
|
+
this.browser = await puppeteer.default.launch({ headless: true });
|
|
2247
|
+
this.scheduleBrowserIdleClose();
|
|
2248
|
+
return this.browser;
|
|
2249
|
+
}
|
|
2250
|
+
scheduleBrowserIdleClose() {
|
|
2251
|
+
if (this.browserIdleTimer)
|
|
2252
|
+
clearTimeout(this.browserIdleTimer);
|
|
2253
|
+
this.browserIdleTimer = setTimeout(() => {
|
|
2254
|
+
this.closeBrowser().catch(() => { });
|
|
2255
|
+
}, this.BROWSER_IDLE_MS);
|
|
2256
|
+
// Don't keep the process alive just for the idle timer.
|
|
2257
|
+
if (typeof this.browserIdleTimer.unref === "function")
|
|
2258
|
+
this.browserIdleTimer.unref();
|
|
2259
|
+
}
|
|
2260
|
+
async closeBrowser() {
|
|
2261
|
+
if (this.browserIdleTimer) {
|
|
2262
|
+
clearTimeout(this.browserIdleTimer);
|
|
2263
|
+
this.browserIdleTimer = null;
|
|
2264
|
+
}
|
|
2265
|
+
if (this.browser) {
|
|
2266
|
+
const b = this.browser;
|
|
2267
|
+
this.browser = null;
|
|
2268
|
+
try {
|
|
2269
|
+
await b.close();
|
|
2270
|
+
}
|
|
2271
|
+
catch {
|
|
2272
|
+
// ignore
|
|
2273
|
+
}
|
|
2274
|
+
}
|
|
2275
|
+
}
|
|
2276
|
+
async renderHtmlToPng(htmlContent, pngPath) {
|
|
2277
|
+
// Strategy 1: Puppeteer singleton with a locked-down sandbox.
|
|
1942
2278
|
try {
|
|
1943
|
-
const
|
|
1944
|
-
const
|
|
1945
|
-
const browser = await puppeteer.default.launch({
|
|
1946
|
-
headless: true,
|
|
1947
|
-
args: ["--no-sandbox", "--disable-setuid-sandbox"]
|
|
1948
|
-
});
|
|
2279
|
+
const browser = await this.getBrowser();
|
|
2280
|
+
const page = await browser.newPage();
|
|
1949
2281
|
try {
|
|
1950
|
-
const page = await browser.newPage();
|
|
1951
2282
|
await page.setViewport({ width: 1200, height: 800 });
|
|
1952
|
-
|
|
2283
|
+
// SECURITY: block ALL network + filesystem fetches during render. The only
|
|
2284
|
+
// exception is the allow-listed Mermaid CDN script (mermaid is not bundled
|
|
2285
|
+
// in node_modules). data: and about:blank are always allowed. Everything
|
|
2286
|
+
// else — file://, arbitrary http(s), etc. — is aborted. This neutralises
|
|
2287
|
+
// local-file exfiltration via prompt-injected diagram_content.
|
|
2288
|
+
await page.setRequestInterception(true);
|
|
2289
|
+
page.on("request", (req) => {
|
|
2290
|
+
const url = req.url();
|
|
2291
|
+
const allowed = url.startsWith("data:") ||
|
|
2292
|
+
url === "about:blank" ||
|
|
2293
|
+
url.startsWith("https://cdn.jsdelivr.net/npm/mermaid@");
|
|
2294
|
+
if (allowed) {
|
|
2295
|
+
req.continue();
|
|
2296
|
+
}
|
|
2297
|
+
else {
|
|
2298
|
+
req.abort();
|
|
2299
|
+
}
|
|
2300
|
+
});
|
|
2301
|
+
// Render from setContent (about:blank origin) — no same-origin file access.
|
|
2302
|
+
await page.setContent(htmlContent, { waitUntil: "networkidle0", timeout: 30000 });
|
|
1953
2303
|
// Auto-size: get the actual content dimensions
|
|
1954
2304
|
const dimensions = await page.evaluate(() => {
|
|
1955
2305
|
const body = document.body;
|
|
@@ -1962,21 +2312,35 @@ ${validatedArgs.diagram_content}
|
|
|
1962
2312
|
await page.screenshot({ path: pngPath, fullPage: true });
|
|
1963
2313
|
}
|
|
1964
2314
|
finally {
|
|
1965
|
-
|
|
2315
|
+
// Only close the page — keep the browser warm for reuse.
|
|
2316
|
+
await page.close().catch(() => { });
|
|
1966
2317
|
}
|
|
2318
|
+
this.scheduleBrowserIdleClose();
|
|
1967
2319
|
return;
|
|
1968
2320
|
}
|
|
1969
|
-
catch {
|
|
1970
|
-
//
|
|
2321
|
+
catch (err) {
|
|
2322
|
+
// If the singleton browser is in a bad state, drop it so the next call relaunches.
|
|
2323
|
+
await this.closeBrowser().catch(() => { });
|
|
2324
|
+
// Fall through to other strategies.
|
|
1971
2325
|
}
|
|
1972
|
-
// Strategy 2: Try Playwright (if installed)
|
|
2326
|
+
// Strategy 2: Try Playwright (if installed). Same sandboxing: route blocking + setContent.
|
|
1973
2327
|
try {
|
|
1974
2328
|
const playwrightModule = "playwright";
|
|
1975
2329
|
const playwright = await import(/* webpackIgnore: true */ playwrightModule);
|
|
1976
2330
|
const browser = await playwright.chromium.launch({ headless: true });
|
|
1977
2331
|
try {
|
|
1978
2332
|
const page = await browser.newPage({ viewport: { width: 1200, height: 800 } });
|
|
1979
|
-
await page.
|
|
2333
|
+
await page.route("**/*", (route) => {
|
|
2334
|
+
const url = route.request().url();
|
|
2335
|
+
const allowed = url.startsWith("data:") ||
|
|
2336
|
+
url === "about:blank" ||
|
|
2337
|
+
url.startsWith("https://cdn.jsdelivr.net/npm/mermaid@");
|
|
2338
|
+
if (allowed)
|
|
2339
|
+
route.continue();
|
|
2340
|
+
else
|
|
2341
|
+
route.abort();
|
|
2342
|
+
});
|
|
2343
|
+
await page.setContent(htmlContent, { waitUntil: "networkidle", timeout: 30000 });
|
|
1980
2344
|
await page.screenshot({ path: pngPath, fullPage: true });
|
|
1981
2345
|
}
|
|
1982
2346
|
finally {
|
|
@@ -1987,12 +2351,16 @@ ${validatedArgs.diagram_content}
|
|
|
1987
2351
|
catch {
|
|
1988
2352
|
// Playwright not available, try next strategy
|
|
1989
2353
|
}
|
|
1990
|
-
// Strategy 3: Try wkhtmltoimage (CLI tool)
|
|
2354
|
+
// Strategy 3: Try wkhtmltoimage (CLI tool). Needs a file path, so write a
|
|
2355
|
+
// temp HTML file with an unpredictable name and clean it up afterward.
|
|
2356
|
+
const tempHtmlPath = path.join(tmpdir(), `slack-diagram-${crypto.randomUUID()}.html`);
|
|
1991
2357
|
try {
|
|
2358
|
+
await fs.writeFile(tempHtmlPath, htmlContent);
|
|
2359
|
+
await fs.chmod(tempHtmlPath, 0o600).catch(() => { });
|
|
1992
2360
|
await execFileAsync("wkhtmltoimage", [
|
|
1993
2361
|
"--width", "1200",
|
|
1994
2362
|
"--quality", "90",
|
|
1995
|
-
|
|
2363
|
+
tempHtmlPath,
|
|
1996
2364
|
pngPath
|
|
1997
2365
|
]);
|
|
1998
2366
|
return;
|
|
@@ -2000,6 +2368,9 @@ ${validatedArgs.diagram_content}
|
|
|
2000
2368
|
catch {
|
|
2001
2369
|
// wkhtmltoimage not available
|
|
2002
2370
|
}
|
|
2371
|
+
finally {
|
|
2372
|
+
await fs.unlink(tempHtmlPath).catch(() => { });
|
|
2373
|
+
}
|
|
2003
2374
|
throw new Error("No rendering engine available. Install one of: puppeteer (npm i puppeteer), playwright (npm i playwright), or wkhtmltoimage (brew install wkhtmltopdf). " +
|
|
2004
2375
|
"Puppeteer is recommended: run 'npm install puppeteer' in the mcp-slack directory.");
|
|
2005
2376
|
}
|
|
@@ -2009,117 +2380,27 @@ ${validatedArgs.diagram_content}
|
|
|
2009
2380
|
setupHandlers() {
|
|
2010
2381
|
this.server.setRequestHandler(ListToolsRequestSchema, async () => {
|
|
2011
2382
|
const tools = [
|
|
2012
|
-
// Account
|
|
2013
|
-
{
|
|
2014
|
-
name: "list_accounts",
|
|
2015
|
-
description: "List all configured Slack accounts with their status",
|
|
2016
|
-
inputSchema: {
|
|
2017
|
-
type: "object",
|
|
2018
|
-
properties: {}
|
|
2019
|
-
}
|
|
2020
|
-
},
|
|
2021
|
-
{
|
|
2022
|
-
name: "switch_account",
|
|
2023
|
-
description: "Switch to a different Slack workspace",
|
|
2024
|
-
inputSchema: {
|
|
2025
|
-
type: "object",
|
|
2026
|
-
properties: {
|
|
2027
|
-
account_id: {
|
|
2028
|
-
type: "string",
|
|
2029
|
-
description: "Account ID to switch to"
|
|
2030
|
-
}
|
|
2031
|
-
},
|
|
2032
|
-
required: ["account_id"]
|
|
2033
|
-
}
|
|
2034
|
-
},
|
|
2035
|
-
{
|
|
2036
|
-
name: "add_account",
|
|
2037
|
-
description: "Add a new Slack workspace configuration",
|
|
2038
|
-
inputSchema: {
|
|
2039
|
-
type: "object",
|
|
2040
|
-
properties: {
|
|
2041
|
-
name: {
|
|
2042
|
-
type: "string",
|
|
2043
|
-
description: "Human-friendly name for this account"
|
|
2044
|
-
},
|
|
2045
|
-
bot_token: {
|
|
2046
|
-
type: "string",
|
|
2047
|
-
description: "Bot User OAuth Token (starts with xoxb-)"
|
|
2048
|
-
},
|
|
2049
|
-
user_token: {
|
|
2050
|
-
type: "string",
|
|
2051
|
-
description: "User OAuth Token (starts with xoxp-) - optional"
|
|
2052
|
-
},
|
|
2053
|
-
team_id: {
|
|
2054
|
-
type: "string",
|
|
2055
|
-
description: "Slack team ID"
|
|
2056
|
-
}
|
|
2057
|
-
},
|
|
2058
|
-
required: ["name", "bot_token", "team_id"]
|
|
2059
|
-
}
|
|
2060
|
-
},
|
|
2061
|
-
{
|
|
2062
|
-
name: "remove_account",
|
|
2063
|
-
description: "Remove a Slack workspace configuration",
|
|
2064
|
-
inputSchema: {
|
|
2065
|
-
type: "object",
|
|
2066
|
-
properties: {
|
|
2067
|
-
account_id: {
|
|
2068
|
-
type: "string",
|
|
2069
|
-
description: "Account ID to remove"
|
|
2070
|
-
}
|
|
2071
|
-
},
|
|
2072
|
-
required: ["account_id"]
|
|
2073
|
-
}
|
|
2074
|
-
},
|
|
2383
|
+
// Account Tools (read-only — single account loaded from env)
|
|
2075
2384
|
{
|
|
2076
2385
|
name: "get_active_account",
|
|
2077
|
-
description: "
|
|
2386
|
+
description: "Show which Slack workspace this server is wired to (workspace name, team ID, display name). No secrets. Tokens are configured via the SLACK_BOT_TOKEN env var in this server's MCP config entry.",
|
|
2078
2387
|
inputSchema: {
|
|
2079
2388
|
type: "object",
|
|
2080
2389
|
properties: {}
|
|
2081
2390
|
}
|
|
2082
2391
|
},
|
|
2083
2392
|
{
|
|
2084
|
-
name: "
|
|
2085
|
-
description: "
|
|
2086
|
-
inputSchema: {
|
|
2087
|
-
type: "object",
|
|
2088
|
-
properties: {
|
|
2089
|
-
account_id: {
|
|
2090
|
-
type: "string",
|
|
2091
|
-
description: "Account ID to set as default"
|
|
2092
|
-
}
|
|
2093
|
-
},
|
|
2094
|
-
required: ["account_id"]
|
|
2095
|
-
}
|
|
2096
|
-
},
|
|
2097
|
-
{
|
|
2098
|
-
name: "update_account",
|
|
2099
|
-
description: "Update account credentials (e.g. for token rotation)",
|
|
2393
|
+
name: "list_accounts",
|
|
2394
|
+
description: "List the active Slack account (single-account server). For a second workspace, add a second MCP server entry with its own SLACK_BOT_TOKEN env block.",
|
|
2100
2395
|
inputSchema: {
|
|
2101
2396
|
type: "object",
|
|
2102
|
-
properties: {
|
|
2103
|
-
account_id: {
|
|
2104
|
-
type: "string",
|
|
2105
|
-
description: "Account ID to update"
|
|
2106
|
-
},
|
|
2107
|
-
bot_token: {
|
|
2108
|
-
type: "string",
|
|
2109
|
-
description: "New Bot User OAuth Token (starts with xoxb-)"
|
|
2110
|
-
},
|
|
2111
|
-
user_token: {
|
|
2112
|
-
type: "string",
|
|
2113
|
-
description: "New User OAuth Token (starts with xoxp-)"
|
|
2114
|
-
}
|
|
2115
|
-
},
|
|
2116
|
-
required: ["account_id"]
|
|
2397
|
+
properties: {}
|
|
2117
2398
|
}
|
|
2118
2399
|
},
|
|
2119
|
-
// Original Slack Tools
|
|
2400
|
+
// Original Slack Tools
|
|
2120
2401
|
{
|
|
2121
2402
|
name: "slack_list_channels",
|
|
2122
|
-
description: "List
|
|
2403
|
+
description: "List accessible Slack channels. Returns LEAN output by default (id + name + is_private + num_members). Pass verbose:true for topic/purpose/membership detail.",
|
|
2123
2404
|
inputSchema: {
|
|
2124
2405
|
type: "object",
|
|
2125
2406
|
properties: {
|
|
@@ -2130,6 +2411,10 @@ ${validatedArgs.diagram_content}
|
|
|
2130
2411
|
limit: {
|
|
2131
2412
|
type: "number",
|
|
2132
2413
|
description: "Maximum number of channels to return (default: 100)"
|
|
2414
|
+
},
|
|
2415
|
+
verbose: {
|
|
2416
|
+
type: "boolean",
|
|
2417
|
+
description: "Return full channel objects instead of lean output (default false)"
|
|
2133
2418
|
}
|
|
2134
2419
|
}
|
|
2135
2420
|
}
|
|
@@ -2151,6 +2436,18 @@ ${validatedArgs.diagram_content}
|
|
|
2151
2436
|
thread_ts: {
|
|
2152
2437
|
type: "string",
|
|
2153
2438
|
description: "Timestamp of the parent message to reply in thread"
|
|
2439
|
+
},
|
|
2440
|
+
username: {
|
|
2441
|
+
type: "string",
|
|
2442
|
+
description: "Post under this display name (requires chat:write.customize scope; falls back to SLACK_SESSION_USERNAME)"
|
|
2443
|
+
},
|
|
2444
|
+
icon_emoji: {
|
|
2445
|
+
type: "string",
|
|
2446
|
+
description: "Icon emoji like ':robot_face:' (requires chat:write.customize; falls back to SLACK_SESSION_ICON)"
|
|
2447
|
+
},
|
|
2448
|
+
icon_url: {
|
|
2449
|
+
type: "string",
|
|
2450
|
+
description: "Icon image URL (overrides icon_emoji; requires chat:write.customize)"
|
|
2154
2451
|
}
|
|
2155
2452
|
},
|
|
2156
2453
|
required: ["channel", "text"]
|
|
@@ -2158,7 +2455,7 @@ ${validatedArgs.diagram_content}
|
|
|
2158
2455
|
},
|
|
2159
2456
|
{
|
|
2160
2457
|
name: "slack_get_channel_history",
|
|
2161
|
-
description: "Get recent messages from a Slack channel",
|
|
2458
|
+
description: "Get recent messages from a Slack channel. Returns LEAN output by default (verbatim message text + user + ts, with metadata exhaust stripped) to keep context cost low. Pass verbose:true for the full raw API payload.",
|
|
2162
2459
|
inputSchema: {
|
|
2163
2460
|
type: "object",
|
|
2164
2461
|
properties: {
|
|
@@ -2169,6 +2466,10 @@ ${validatedArgs.diagram_content}
|
|
|
2169
2466
|
limit: {
|
|
2170
2467
|
type: "number",
|
|
2171
2468
|
description: "Number of messages to return (default: 100)"
|
|
2469
|
+
},
|
|
2470
|
+
verbose: {
|
|
2471
|
+
type: "boolean",
|
|
2472
|
+
description: "Return the full raw API payload instead of lean output (default false)"
|
|
2172
2473
|
}
|
|
2173
2474
|
},
|
|
2174
2475
|
required: ["channel"]
|
|
@@ -2198,13 +2499,17 @@ ${validatedArgs.diagram_content}
|
|
|
2198
2499
|
},
|
|
2199
2500
|
{
|
|
2200
2501
|
name: "slack_list_users",
|
|
2201
|
-
description: "List
|
|
2502
|
+
description: "List users in the workspace. Returns LEAN output by default (id + name + real_name). Pass verbose:true for full user objects (email, admin flags, status).",
|
|
2202
2503
|
inputSchema: {
|
|
2203
2504
|
type: "object",
|
|
2204
2505
|
properties: {
|
|
2205
2506
|
limit: {
|
|
2206
2507
|
type: "number",
|
|
2207
2508
|
description: "Maximum number of users to return (default: 100)"
|
|
2509
|
+
},
|
|
2510
|
+
verbose: {
|
|
2511
|
+
type: "boolean",
|
|
2512
|
+
description: "Return full user objects instead of lean output (default false)"
|
|
2208
2513
|
}
|
|
2209
2514
|
}
|
|
2210
2515
|
}
|
|
@@ -2261,7 +2566,7 @@ ${validatedArgs.diagram_content}
|
|
|
2261
2566
|
},
|
|
2262
2567
|
{
|
|
2263
2568
|
name: "slack_search_messages",
|
|
2264
|
-
description: "Search for messages across the workspace",
|
|
2569
|
+
description: "Search for messages across the workspace. Returns LEAN output by default (verbatim text + user + channel + ts + permalink). Pass verbose:true for the raw search payload.",
|
|
2265
2570
|
inputSchema: {
|
|
2266
2571
|
type: "object",
|
|
2267
2572
|
properties: {
|
|
@@ -2276,6 +2581,10 @@ ${validatedArgs.diagram_content}
|
|
|
2276
2581
|
page: {
|
|
2277
2582
|
type: "number",
|
|
2278
2583
|
description: "Page number of results (default: 1)"
|
|
2584
|
+
},
|
|
2585
|
+
verbose: {
|
|
2586
|
+
type: "boolean",
|
|
2587
|
+
description: "Return the raw search payload instead of lean output (default false)"
|
|
2279
2588
|
}
|
|
2280
2589
|
},
|
|
2281
2590
|
required: ["query"]
|
|
@@ -2283,7 +2592,7 @@ ${validatedArgs.diagram_content}
|
|
|
2283
2592
|
},
|
|
2284
2593
|
{
|
|
2285
2594
|
name: "slack_search_by_user",
|
|
2286
|
-
description: "Search for messages from a specific user",
|
|
2595
|
+
description: "Search for messages from a specific user. Returns LEAN output by default (verbatim text + channel + ts + permalink). Pass verbose:true for the raw search payload.",
|
|
2287
2596
|
inputSchema: {
|
|
2288
2597
|
type: "object",
|
|
2289
2598
|
properties: {
|
|
@@ -2298,6 +2607,10 @@ ${validatedArgs.diagram_content}
|
|
|
2298
2607
|
count: {
|
|
2299
2608
|
type: "number",
|
|
2300
2609
|
description: "Number of results to return (default: 20)"
|
|
2610
|
+
},
|
|
2611
|
+
verbose: {
|
|
2612
|
+
type: "boolean",
|
|
2613
|
+
description: "Return the raw search payload instead of lean output (default false)"
|
|
2301
2614
|
}
|
|
2302
2615
|
},
|
|
2303
2616
|
required: ["user_id"]
|
|
@@ -2305,7 +2618,7 @@ ${validatedArgs.diagram_content}
|
|
|
2305
2618
|
},
|
|
2306
2619
|
{
|
|
2307
2620
|
name: "slack_search_by_date_range",
|
|
2308
|
-
description: "Search for messages within a date range",
|
|
2621
|
+
description: "Search for messages within a date range. Returns LEAN output by default (verbatim text + user + channel + ts + permalink). Pass verbose:true for the raw search payload.",
|
|
2309
2622
|
inputSchema: {
|
|
2310
2623
|
type: "object",
|
|
2311
2624
|
properties: {
|
|
@@ -2324,6 +2637,10 @@ ${validatedArgs.diagram_content}
|
|
|
2324
2637
|
count: {
|
|
2325
2638
|
type: "number",
|
|
2326
2639
|
description: "Number of results to return (default: 20)"
|
|
2640
|
+
},
|
|
2641
|
+
verbose: {
|
|
2642
|
+
type: "boolean",
|
|
2643
|
+
description: "Return the raw search payload instead of lean output (default false)"
|
|
2327
2644
|
}
|
|
2328
2645
|
},
|
|
2329
2646
|
required: ["from_date", "to_date"]
|
|
@@ -2331,10 +2648,15 @@ ${validatedArgs.diagram_content}
|
|
|
2331
2648
|
},
|
|
2332
2649
|
{
|
|
2333
2650
|
name: "slack_get_workspace_stats",
|
|
2334
|
-
description: "Get workspace analytics and statistics",
|
|
2651
|
+
description: "Get workspace analytics and statistics. Returns a LEAN one-line summary by default; pass verbose:true for the structured payload.",
|
|
2335
2652
|
inputSchema: {
|
|
2336
2653
|
type: "object",
|
|
2337
|
-
properties: {
|
|
2654
|
+
properties: {
|
|
2655
|
+
verbose: {
|
|
2656
|
+
type: "boolean",
|
|
2657
|
+
description: "Return the structured stats payload instead of the lean summary (default false)"
|
|
2658
|
+
}
|
|
2659
|
+
}
|
|
2338
2660
|
}
|
|
2339
2661
|
},
|
|
2340
2662
|
{
|
|
@@ -2514,6 +2836,18 @@ ${validatedArgs.diagram_content}
|
|
|
2514
2836
|
text: {
|
|
2515
2837
|
type: "string",
|
|
2516
2838
|
description: "Fallback text"
|
|
2839
|
+
},
|
|
2840
|
+
username: {
|
|
2841
|
+
type: "string",
|
|
2842
|
+
description: "Post under this display name (requires chat:write.customize; falls back to SLACK_SESSION_USERNAME)"
|
|
2843
|
+
},
|
|
2844
|
+
icon_emoji: {
|
|
2845
|
+
type: "string",
|
|
2846
|
+
description: "Icon emoji (requires chat:write.customize; falls back to SLACK_SESSION_ICON)"
|
|
2847
|
+
},
|
|
2848
|
+
icon_url: {
|
|
2849
|
+
type: "string",
|
|
2850
|
+
description: "Icon image URL (requires chat:write.customize)"
|
|
2517
2851
|
}
|
|
2518
2852
|
},
|
|
2519
2853
|
required: ["channel", "blocks"]
|
|
@@ -2698,7 +3032,170 @@ ${validatedArgs.diagram_content}
|
|
|
2698
3032
|
},
|
|
2699
3033
|
required: ["channel", "diagram_content"]
|
|
2700
3034
|
}
|
|
2701
|
-
}
|
|
3035
|
+
},
|
|
3036
|
+
{
|
|
3037
|
+
name: "slack_send_table",
|
|
3038
|
+
description: "Post a column-aligned ASCII table to a channel inside a code block. Lightweight TEXT alternative to slack_send_diagram's PNG path — use it for status grids, comparison matrices, and metrics that don't need to be a polished image. Accepts an array of objects, a 2D array (first row = header), or a markdown pipe-table string. Long cells are truncated with an ellipsis; numeric columns auto right-align.",
|
|
3039
|
+
inputSchema: {
|
|
3040
|
+
type: "object",
|
|
3041
|
+
properties: {
|
|
3042
|
+
channel: {
|
|
3043
|
+
type: "string",
|
|
3044
|
+
description: "Channel ID or name to post the table to"
|
|
3045
|
+
},
|
|
3046
|
+
title: {
|
|
3047
|
+
type: "string",
|
|
3048
|
+
description: "Optional bold title rendered above the table"
|
|
3049
|
+
},
|
|
3050
|
+
rows: {
|
|
3051
|
+
description: "Table data: array of objects, a 2D array (first row = header), OR a markdown pipe-table string"
|
|
3052
|
+
},
|
|
3053
|
+
as_code_block: {
|
|
3054
|
+
type: "boolean",
|
|
3055
|
+
description: "Wrap the table in a ``` code block so columns stay aligned (default true)"
|
|
3056
|
+
}
|
|
3057
|
+
},
|
|
3058
|
+
required: ["channel", "rows"]
|
|
3059
|
+
}
|
|
3060
|
+
},
|
|
3061
|
+
{
|
|
3062
|
+
name: "slack_send_card",
|
|
3063
|
+
description: "Post a polished Slack Block Kit card: a header, one or more section blocks (each with optional two-column fields), an optional context footer, and an optional colored left bar. Use for structured summaries and status reports that benefit from native Block Kit layout (vs the ASCII table or PNG paths).",
|
|
3064
|
+
inputSchema: {
|
|
3065
|
+
type: "object",
|
|
3066
|
+
properties: {
|
|
3067
|
+
channel: { type: "string", description: "Channel ID or name" },
|
|
3068
|
+
header: { type: "string", description: "Card header (plain text)" },
|
|
3069
|
+
sections: {
|
|
3070
|
+
type: "array",
|
|
3071
|
+
description: "Section blocks rendered in order, separated by dividers",
|
|
3072
|
+
items: {
|
|
3073
|
+
type: "object",
|
|
3074
|
+
properties: {
|
|
3075
|
+
text: { type: "string", description: "mrkdwn body text" },
|
|
3076
|
+
fields: {
|
|
3077
|
+
type: "array",
|
|
3078
|
+
description: "Up to 10 two-column key/value fields",
|
|
3079
|
+
items: {
|
|
3080
|
+
type: "object",
|
|
3081
|
+
properties: {
|
|
3082
|
+
label: { type: "string" },
|
|
3083
|
+
value: { type: "string" }
|
|
3084
|
+
},
|
|
3085
|
+
required: ["value"]
|
|
3086
|
+
}
|
|
3087
|
+
}
|
|
3088
|
+
}
|
|
3089
|
+
}
|
|
3090
|
+
},
|
|
3091
|
+
context: { type: "string", description: "Small footer context line (mrkdwn)" },
|
|
3092
|
+
color: { type: "string", description: "Hex color for the left bar, e.g. #3D8C62" },
|
|
3093
|
+
username: { type: "string", description: "Post under this display name (requires chat:write.customize; falls back to SLACK_SESSION_USERNAME)" },
|
|
3094
|
+
icon_emoji: { type: "string", description: "Icon emoji (requires chat:write.customize; falls back to SLACK_SESSION_ICON)" },
|
|
3095
|
+
icon_url: { type: "string", description: "Icon image URL (requires chat:write.customize)" }
|
|
3096
|
+
},
|
|
3097
|
+
required: ["channel", "header"]
|
|
3098
|
+
}
|
|
3099
|
+
},
|
|
3100
|
+
{
|
|
3101
|
+
name: "slack_start_task",
|
|
3102
|
+
description: "Begin a long-running task in ONE thread instead of spamming a channel. Posts a parent Block Kit card ('⏳ <title>') and adds a live ⏳ status reaction. Returns { task_ts, channel } — pass these back to slack_update_task and slack_complete_task. Pass total_steps to enable a progress bar.",
|
|
3103
|
+
inputSchema: {
|
|
3104
|
+
type: "object",
|
|
3105
|
+
properties: {
|
|
3106
|
+
channel: { type: "string", description: "Channel ID or name" },
|
|
3107
|
+
title: { type: "string", description: "Task title" },
|
|
3108
|
+
total_steps: { type: "number", description: "Total number of steps (enables a progress bar)" },
|
|
3109
|
+
username: { type: "string", description: "Post under this display name (requires chat:write.customize; falls back to SLACK_SESSION_USERNAME)" },
|
|
3110
|
+
icon_emoji: { type: "string", description: "Icon emoji (requires chat:write.customize; falls back to SLACK_SESSION_ICON)" },
|
|
3111
|
+
icon_url: { type: "string", description: "Icon image URL (requires chat:write.customize)" }
|
|
3112
|
+
},
|
|
3113
|
+
required: ["channel", "title"]
|
|
3114
|
+
}
|
|
3115
|
+
},
|
|
3116
|
+
{
|
|
3117
|
+
name: "slack_update_task",
|
|
3118
|
+
description: "Post a progress update as a THREADED reply under the task's parent card. Do NOT @-mention anyone here — routine updates must stay quiet (only slack_complete_task may notify). If you pass step (and total_steps), the parent card's progress bar is also updated.",
|
|
3119
|
+
inputSchema: {
|
|
3120
|
+
type: "object",
|
|
3121
|
+
properties: {
|
|
3122
|
+
channel: { type: "string", description: "Channel ID where the task card lives" },
|
|
3123
|
+
task_ts: { type: "string", description: "Timestamp of the parent task card (from slack_start_task)" },
|
|
3124
|
+
message: { type: "string", description: "Progress update (threaded reply). No @-mentions." },
|
|
3125
|
+
step: { type: "number", description: "Current step number" },
|
|
3126
|
+
total_steps: { type: "number", description: "Total steps (defaults to start_task value)" },
|
|
3127
|
+
username: { type: "string", description: "Post under this display name (requires chat:write.customize; falls back to SLACK_SESSION_USERNAME)" },
|
|
3128
|
+
icon_emoji: { type: "string", description: "Icon emoji (requires chat:write.customize; falls back to SLACK_SESSION_ICON)" },
|
|
3129
|
+
icon_url: { type: "string", description: "Icon image URL (requires chat:write.customize)" }
|
|
3130
|
+
},
|
|
3131
|
+
required: ["channel", "task_ts", "message"]
|
|
3132
|
+
}
|
|
3133
|
+
},
|
|
3134
|
+
{
|
|
3135
|
+
name: "slack_complete_task",
|
|
3136
|
+
description: "Finish a task: posts a final threaded reply AND edits the parent card into a ✅/❌ completion summary, swapping the live ⏳ status reaction to ✅ or ❌. This is the ONLY task tool permitted to @-mention — set notify_user (a Slack user ID) to ping the owner on completion or failure.",
|
|
3137
|
+
inputSchema: {
|
|
3138
|
+
type: "object",
|
|
3139
|
+
properties: {
|
|
3140
|
+
channel: { type: "string", description: "Channel ID where the task card lives" },
|
|
3141
|
+
task_ts: { type: "string", description: "Timestamp of the parent task card (from slack_start_task)" },
|
|
3142
|
+
summary: { type: "string", description: "Final summary of the outcome" },
|
|
3143
|
+
status: { type: "string", enum: ["done", "failed"], description: "Final status" },
|
|
3144
|
+
details: { type: "string", description: "Optional details — commits, links, duration (mrkdwn)" },
|
|
3145
|
+
notify_user: { type: "string", description: "Optional Slack user ID to @-mention on completion" },
|
|
3146
|
+
username: { type: "string", description: "Post under this display name (requires chat:write.customize; falls back to SLACK_SESSION_USERNAME)" },
|
|
3147
|
+
icon_emoji: { type: "string", description: "Icon emoji (requires chat:write.customize; falls back to SLACK_SESSION_ICON)" },
|
|
3148
|
+
icon_url: { type: "string", description: "Icon image URL (requires chat:write.customize)" }
|
|
3149
|
+
},
|
|
3150
|
+
required: ["channel", "task_ts", "summary", "status"]
|
|
3151
|
+
}
|
|
3152
|
+
},
|
|
3153
|
+
{
|
|
3154
|
+
name: "slack_poll",
|
|
3155
|
+
description: "Poll a shared channel for NEW messages addressed to this Legate (multi-session coordination). Tracks a per-call-sign cursor so each poll returns only messages newer than the last. Tags each message's addressing relative to your call_sign (to_me / to_all / whoever_first / to_other:<Name> / chatter), excludes your own posts, and by default drops chatter. ACT ONLY on messages tagged to_me, to_all, or whoever_first — ignore to_other and chatter. The FIRST poll (no stored cursor and no `since` arg) anchors the cursor to 'now' and returns nothing (first_poll:true) so a freshly-booted session never acts on stale backlog; pass `since` explicitly if you actually want history. Advances the cursor every poll.",
|
|
3156
|
+
inputSchema: {
|
|
3157
|
+
type: "object",
|
|
3158
|
+
properties: {
|
|
3159
|
+
channel: { type: "string", description: "Channel ID or name (e.g., C1234567890 or #echelon)" },
|
|
3160
|
+
call_sign: { type: "string", description: "This Legate's NATO call-sign (e.g., Alpha, Bravo)" },
|
|
3161
|
+
limit: { type: "number", description: "Max messages to scan/return (default: 15)" },
|
|
3162
|
+
since: { type: "string", description: "Slack ts to poll from; overrides the stored cursor" },
|
|
3163
|
+
include_chatter: { type: "boolean", description: "Include messages not addressed to anyone (default: false)" }
|
|
3164
|
+
},
|
|
3165
|
+
required: ["channel", "call_sign"]
|
|
3166
|
+
}
|
|
3167
|
+
},
|
|
3168
|
+
{
|
|
3169
|
+
name: "slack_claim_lane",
|
|
3170
|
+
description: "Claim a unit of work ('lane') on a shared channel so sibling Legates don't double-up. Posts a machine-parseable LANE CLAIM, then re-reads to detect a lost race (yields to an earlier claimant). Returns granted:false WITHOUT posting if another Legate already holds an unexpired claim on the same lane. Pass release:true to post a LANE RELEASE for a finished lane.",
|
|
3171
|
+
inputSchema: {
|
|
3172
|
+
type: "object",
|
|
3173
|
+
properties: {
|
|
3174
|
+
channel: { type: "string", description: "Channel ID or name (e.g., C1234567890 or #echelon)" },
|
|
3175
|
+
call_sign: { type: "string", description: "This Legate's NATO call-sign" },
|
|
3176
|
+
task: { type: "string", description: "The work being claimed (free text; normalized to a lane key)" },
|
|
3177
|
+
ttl_minutes: { type: "number", description: "How long a claim stays valid (default: 20)" },
|
|
3178
|
+
lookback: { type: "number", description: "How many recent messages to scan for prior claims (default: 30)" },
|
|
3179
|
+
release: { type: "boolean", description: "If true, post a LANE RELEASE for this task instead of claiming (default: false)" }
|
|
3180
|
+
},
|
|
3181
|
+
required: ["channel", "call_sign", "task"]
|
|
3182
|
+
}
|
|
3183
|
+
},
|
|
3184
|
+
{
|
|
3185
|
+
name: "slack_checkin",
|
|
3186
|
+
description: "Post a one-line status check-in to the shared channel, de-duplicated per call-sign + channel. Suppresses the post when the status is unchanged since the last check-in (unless force:true or a heartbeat_minutes interval has elapsed).",
|
|
3187
|
+
inputSchema: {
|
|
3188
|
+
type: "object",
|
|
3189
|
+
properties: {
|
|
3190
|
+
channel: { type: "string", description: "Channel ID or name (e.g., C1234567890 or #echelon)" },
|
|
3191
|
+
call_sign: { type: "string", description: "This Legate's NATO call-sign" },
|
|
3192
|
+
status: { type: "string", description: "One-line status to post" },
|
|
3193
|
+
force: { type: "boolean", description: "Post even if the status is unchanged (default: false)" },
|
|
3194
|
+
heartbeat_minutes: { type: "number", description: "If >0, re-post an unchanged status once this many minutes have elapsed (default: 0)" }
|
|
3195
|
+
},
|
|
3196
|
+
required: ["channel", "call_sign", "status"]
|
|
3197
|
+
}
|
|
3198
|
+
},
|
|
2702
3199
|
];
|
|
2703
3200
|
return { tools };
|
|
2704
3201
|
});
|
|
@@ -2706,21 +3203,11 @@ ${validatedArgs.diagram_content}
|
|
|
2706
3203
|
try {
|
|
2707
3204
|
const { name, arguments: args } = request.params;
|
|
2708
3205
|
switch (name) {
|
|
2709
|
-
// Account
|
|
2710
|
-
case "list_accounts":
|
|
2711
|
-
return await this.listAccounts(args);
|
|
2712
|
-
case "switch_account":
|
|
2713
|
-
return await this.switchAccount(args);
|
|
2714
|
-
case "add_account":
|
|
2715
|
-
return await this.addAccount(args);
|
|
2716
|
-
case "remove_account":
|
|
2717
|
-
return await this.removeAccount(args);
|
|
3206
|
+
// Account Tools (read-only)
|
|
2718
3207
|
case "get_active_account":
|
|
2719
3208
|
return await this.getActiveAccount(args);
|
|
2720
|
-
case "
|
|
2721
|
-
return await this.
|
|
2722
|
-
case "update_account":
|
|
2723
|
-
return await this.updateAccount(args);
|
|
3209
|
+
case "list_accounts":
|
|
3210
|
+
return await this.listAccounts(args);
|
|
2724
3211
|
// Original Slack Tools
|
|
2725
3212
|
case "slack_list_channels":
|
|
2726
3213
|
return await this.slackListChannels(args);
|
|
@@ -2745,7 +3232,7 @@ ${validatedArgs.diagram_content}
|
|
|
2745
3232
|
case "slack_search_by_date_range":
|
|
2746
3233
|
return await this.slackSearchByDateRange(args);
|
|
2747
3234
|
case "slack_get_workspace_stats":
|
|
2748
|
-
return await this.slackGetWorkspaceStats();
|
|
3235
|
+
return await this.slackGetWorkspaceStats(args);
|
|
2749
3236
|
case "slack_pin_message":
|
|
2750
3237
|
return await this.slackPinMessage(args);
|
|
2751
3238
|
case "slack_unpin_message":
|
|
@@ -2782,6 +3269,23 @@ ${validatedArgs.diagram_content}
|
|
|
2782
3269
|
return await this.slackUploadFile(args);
|
|
2783
3270
|
case "slack_send_diagram":
|
|
2784
3271
|
return await this.slackSendDiagram(args);
|
|
3272
|
+
case "slack_send_table":
|
|
3273
|
+
return await this.slackSendTable(args);
|
|
3274
|
+
case "slack_send_card":
|
|
3275
|
+
return await this.slackSendCard(args);
|
|
3276
|
+
case "slack_start_task":
|
|
3277
|
+
return await this.slackStartTask(args);
|
|
3278
|
+
case "slack_update_task":
|
|
3279
|
+
return await this.slackUpdateTask(args);
|
|
3280
|
+
case "slack_complete_task":
|
|
3281
|
+
return await this.slackCompleteTask(args);
|
|
3282
|
+
// Legate pull/polling tools (multi-session coordination)
|
|
3283
|
+
case "slack_poll":
|
|
3284
|
+
return await this.slackPoll(args);
|
|
3285
|
+
case "slack_claim_lane":
|
|
3286
|
+
return await this.slackClaimLane(args);
|
|
3287
|
+
case "slack_checkin":
|
|
3288
|
+
return await this.slackCheckin(args);
|
|
2785
3289
|
default:
|
|
2786
3290
|
throw new Error(`Unknown tool: ${name}`);
|
|
2787
3291
|
}
|
|
@@ -2803,11 +3307,37 @@ ${validatedArgs.diagram_content}
|
|
|
2803
3307
|
async run() {
|
|
2804
3308
|
const transport = new StdioServerTransport();
|
|
2805
3309
|
await this.server.connect(transport);
|
|
2806
|
-
console.error("[SlackServer] Slack MCP server
|
|
2807
|
-
//
|
|
2808
|
-
|
|
3310
|
+
console.error("[SlackServer] Slack MCP server v4.0.0 running on stdio");
|
|
3311
|
+
// Ensure the warm Puppeteer browser is shut down cleanly on exit.
|
|
3312
|
+
const shutdown = () => {
|
|
3313
|
+
Promise.resolve()
|
|
3314
|
+
.then(() => this.closeBrowser())
|
|
3315
|
+
.finally(() => process.exit(0));
|
|
3316
|
+
};
|
|
3317
|
+
process.once("SIGINT", shutdown);
|
|
3318
|
+
process.once("SIGTERM", shutdown);
|
|
2809
3319
|
}
|
|
2810
3320
|
}
|
|
2811
|
-
|
|
2812
|
-
server
|
|
2813
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUVBLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSwyQ0FBMkMsQ0FBQztBQUNuRSxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSwyQ0FBMkMsQ0FBQztBQUNqRixPQUFPLEVBQ0wsc0JBQXNCLEVBQ3RCLHFCQUFxQixHQUV0QixNQUFNLG9DQUFvQyxDQUFDO0FBQzVDLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUMzQyxPQUFPLEVBQUUsQ0FBQyxFQUFFLE1BQU0sS0FBSyxDQUFDO0FBQ3hCLE9BQU8sRUFBRSxRQUFRLElBQUksRUFBRSxFQUFFLE1BQU0sSUFBSSxDQUFDO0FBRXBDLE9BQU8sSUFBSSxNQUFNLE1BQU0sQ0FBQztBQUN4QixPQUFPLEVBQUUsTUFBTSxJQUFJLENBQUM7QUFDcEIsT0FBTyxNQUFNLE1BQU0sUUFBUSxDQUFDO0FBQzVCLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxJQUFJLENBQUM7QUFDNUIsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUN6QyxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQ2pDLE9BQU8sSUFBSSxNQUFNLFNBQVMsQ0FBQztBQUUzQixNQUFNLGFBQWEsR0FBRyxTQUFTLENBQUMsUUFBUSxDQUFDLENBQUM7QUE0QjFDLHdGQUF3RjtBQUN4RiwyQkFBMkI7QUFDM0Isd0ZBQXdGO0FBRXhGLE1BQU0saUJBQWlCO0lBQ0osWUFBWSxHQUFHLFdBQVcsQ0FBQztJQUMzQixVQUFVLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsT0FBTyxFQUFFLEVBQUUsWUFBWSxDQUFDLENBQUM7SUFDbkQsV0FBVyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxlQUFlLENBQUMsQ0FBQztJQUMxRCxtQkFBbUIsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsTUFBTSxDQUFDLENBQUM7SUFDbEUsTUFBTSxHQUFRLElBQUksQ0FBQztJQUNuQixpQkFBaUIsR0FBRyxLQUFLLENBQUM7SUFDMUIsV0FBVyxDQUFnQjtJQUMzQixhQUFhLEdBQWtCLElBQUksQ0FBQztJQUU1QztRQUNFLElBQUksQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO0lBQ3ZDLENBQUM7SUFFTyxLQUFLLENBQUMsVUFBVTtRQUN0QixvQkFBb0I7UUFDcEIsSUFBSSxDQUFDO1lBQ0gsSUFBSSxDQUFDLE1BQU0sR0FBRyxNQUFNLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQztZQUNyQyxJQUFJLENBQUMsaUJBQWlCLEdBQUcsSUFBSSxDQUFDO1lBQzlCLE9BQU8sQ0FBQyxLQUFLLENBQUMscURBQXFELENBQUMsQ0FBQztRQUN2RSxDQUFDO1FBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQztZQUNmLE9BQU8sQ0FBQyxLQUFLLENBQUMscUVBQXFFLEVBQUUsS0FBSyxDQUFDLENBQUM7WUFDNUYsSUFBSSxDQUFDLGlCQUFpQixHQUFHLEtBQUssQ0FBQztRQUNqQyxDQUFDO1FBRUQsaUNBQWlDO1FBQ2pDLElBQUksQ0FBQztZQUNILE1BQU0sRUFBRSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsVUFBVSxFQUFFLEVBQUUsU0FBUyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7WUFDckQsNERBQTREO1lBQzVELE1BQU0sRUFBRSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsVUFBVSxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBQ3pDLENBQUM7UUFBQyxPQUFPLEtBQUssRUFBRSxDQUFDO1lBQ2YsT0FBTyxDQUFDLEtBQUssQ0FBQyx3REFBd0QsRUFBRSxLQUFLLENBQUMsQ0FBQztRQUNqRixDQUFDO1FBRUQsMkRBQTJEO1FBQzNELE1BQU0sSUFBSSxDQUFDLHVCQUF1QixFQUFFLENBQUM7SUFDdkMsQ0FBQztJQUVPLEtBQUssQ0FBQyx1QkFBdUI7UUFDbkMsSUFBSSxDQUFDO1lBQ0gsMkJBQTJCO1lBQzNCLElBQUksQ0FBQyxhQUFhLEdBQUcsTUFBTSxFQUFFLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDO1FBQ25FLENBQUM7UUFBQyxPQUFPLEtBQUssRUFBRSxDQUFDO1lBQ2Ysb0NBQW9DO1lBQ3BDLElBQUksQ0FBQyxhQUFhLEdBQUcsTUFBTSxDQUFDLFdBQVcsQ0FBQyxFQUFFLENBQUMsQ0FBQztZQUM1QyxJQUFJLENBQUM7Z0JBQ0gsTUFBTSxFQUFFLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxtQkFBbUIsRUFBRSxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUM7Z0JBQ2pFLE1BQU0sRUFBRSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsbUJBQW1CLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQyw0QkFBNEI7WUFDL0UsQ0FBQztZQUFDLE9BQU8sVUFBVSxFQUFFLENBQUM7Z0JBQ3BCLE9BQU8sQ0FBQyxLQUFLLENBQUMsb0RBQW9ELEVBQUUsVUFBVSxDQUFDLENBQUM7WUFDbEYsQ0FBQztRQUNILENBQUM7SUFDSCxDQUFDO0lBRU8sT0FBTyxDQUFDLElBQVk7UUFDMUIsSUFBSSxDQUFDLElBQUksQ0FBQyxhQUFhO1lBQUUsT0FBTyxJQUFJLENBQUMsQ0FBQyxtQ0FBbUM7UUFFekUsTUFBTSxFQUFFLEdBQUcsTUFBTSxDQUFDLFdBQVcsQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUNsQyxNQUFNLE1BQU0sR0FBRyxNQUFNLENBQUMsY0FBYyxDQUFDLGFBQWEsRUFBRSxJQUFJLENBQUMsYUFBYSxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBQzVFLElBQUksU0FBUyxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsSUFBSSxFQUFFLE1BQU0sRUFBRSxLQUFLLENBQUMsQ0FBQztRQUNuRCxTQUFTLElBQUksTUFBTSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUNqQyxPQUFPLEVBQUUsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLEdBQUcsR0FBRyxHQUFHLFNBQVMsQ0FBQztJQUM5QyxDQUFDO0lBRU8sT0FBTyxDQUFDLGFBQXFCO1FBQ25DLElBQUksQ0FBQyxJQUFJLENBQUMsYUFBYSxJQUFJLENBQUMsYUFBYSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUM7WUFBRSxPQUFPLGFBQWEsQ0FBQztRQUU5RSxJQUFJLENBQUM7WUFDSCxNQUFNLENBQUMsS0FBSyxFQUFFLFNBQVMsQ0FBQyxHQUFHLGFBQWEsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDcEQsTUFBTSxFQUFFLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsS0FBSyxDQUFDLENBQUM7WUFDckMsTUFBTSxRQUFRLEdBQUcsTUFBTSxDQUFDLGdCQUFnQixDQUFDLGFBQWEsRUFBRSxJQUFJLENBQUMsYUFBYSxFQUFFLEVBQUUsQ0FBQyxDQUFDO1lBQ2hGLElBQUksU0FBUyxHQUFHLFFBQVEsQ0FBQyxNQUFNLENBQUMsU0FBUyxFQUFFLEtBQUssRUFBRSxNQUFNLENBQUMsQ0FBQztZQUMxRCxTQUFTLElBQUksUUFBUSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUNwQyxPQUFPLFNBQVMsQ0FBQztRQUNuQixDQUFDO1FBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQztZQUNmLE9BQU8sQ0FBQyxLQUFLLENBQUMsd0NBQXdDLEVBQUUsS0FBSyxDQUFDLENBQUM7WUFDL0QsT0FBTyxhQUFhLENBQUMsQ0FBQyxtQ0FBbUM7UUFDM0QsQ0FBQztJQUNILENBQUM7SUFFTyxLQUFLLENBQUMsaUJBQWlCO1FBQzdCLE1BQU0sSUFBSSxDQUFDLFdBQVcsQ0FBQztJQUN6QixDQUFDO0lBRUQsS0FBSyxDQUFDLFdBQVcsQ0FBQyxPQUFxQjtRQUNyQyxNQUFNLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO1FBRS9CLE1BQU0sZ0JBQWdCLEdBQXFCO1lBQ3pDLEdBQUcsT0FBTztZQUNWLE9BQU8sRUFBRSxJQUFJLElBQUksRUFBRSxDQUFDLFdBQVcsRUFBRTtZQUNqQyxRQUFRLEVBQUUsSUFBSSxJQUFJLEVBQUUsQ0FBQyxXQUFXLEVBQUU7U0FDbkMsQ0FBQztRQUVGLG1CQUFtQjtRQUNuQixJQUFJLElBQUksQ0FBQyxpQkFBaUIsSUFBSSxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDMUMsSUFBSSxDQUFDO2dCQUNILE1BQU0sSUFBSSxDQUFDLE1BQU0sQ0FBQyxXQUFXLENBQzNCLElBQUksQ0FBQyxZQUFZLEVBQ2pCLFNBQVMsT0FBTyxDQUFDLEVBQUUsRUFBRSxFQUNyQixJQUFJLENBQUMsU0FBUyxDQUFDLGdCQUFnQixDQUFDLENBQ2pDLENBQUM7Z0JBQ0YsT0FBTyxDQUFDLEtBQUssQ0FBQywrQkFBK0IsT0FBTyxDQUFDLEVBQUUsb0JBQW9CLENBQUMsQ0FBQztnQkFDN0UsT0FBTyxDQUFDLHNCQUFzQjtZQUNoQyxDQUFDO1lBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQztnQkFDZixPQUFPLENBQUMsS0FBSyxDQUFDLCtEQUErRCxFQUFFLEtBQUssQ0FBQyxDQUFDO1lBQ3hGLENBQUM7UUFDSCxDQUFDO1FBRUQsaUNBQWlDO1FBQ2pDLE1BQU0sSUFBSSxDQUFDLFVBQVUsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO0lBQzFDLENBQUM7SUFFTyxLQUFLLENBQUMsVUFBVSxDQUFDLE9BQXlCO1FBQ2hELElBQUksQ0FBQztZQUNILHlCQUF5QjtZQUN6QixNQUFNLFFBQVEsR0FBRyxNQUFNLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQztZQUUzQyx5QkFBeUI7WUFDekIsTUFBTSxnQkFBZ0IsR0FBRztnQkFDdkIsR0FBRyxPQUFPO2dCQUNWLFFBQVEsRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUM7Z0JBQ3hDLFNBQVMsRUFBRSxPQUFPLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUzthQUMzRSxDQUFDO1lBRUYsd0JBQXdCO1lBQ3hCLFFBQVEsQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLEdBQUcsZ0JBQWdCLENBQUM7WUFFeEMsb0JBQW9CO1lBQ3BCLE1BQU0sRUFBRSxDQUFDLFNBQVMsQ0FDaEIsSUFBSSxDQUFDLFdBQVcsRUFDaEIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxRQUFRLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQyxFQUNqQyxNQUFNLENBQ1AsQ0FBQztZQUNGLE1BQU0sRUFBRSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUMsNEJBQTRCO1lBRXJFLE9BQU8sQ0FBQyxLQUFLLENBQUMsK0JBQStCLE9BQU8sQ0FBQyxFQUFFLGdCQUFnQixDQUFDLENBQUM7UUFDM0UsQ0FBQztRQUFDLE9BQU8sS0FBSyxFQUFFLENBQUM7WUFDZixPQUFPLENBQUMsS0FBSyxDQUFDLHFEQUFxRCxFQUFFLEtBQUssQ0FBQyxDQUFDO1lBQzVFLE1BQU0sS0FBSyxDQUFDO1FBQ2QsQ0FBQztJQUNILENBQUM7SUFFTyxLQUFLLENBQUMsWUFBWTtRQUN4QixJQUFJLENBQUM7WUFDSCxNQUFNLElBQUksR0FBRyxNQUFNLEVBQUUsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRSxNQUFNLENBQUMsQ0FBQztZQUN6RCxPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDMUIsQ0FBQztRQUFDLE9BQU8sS0FBSyxFQUFFLENBQUM7WUFDZixtQ0FBbUM7WUFDbkMsT0FBTyxFQUFFLENBQUM7UUFDWixDQUFDO0lBQ0gsQ0FBQztJQUVELEtBQUssQ0FBQyxhQUFhLENBQUMsT0FBcUI7UUFDdkMsTUFBTSxJQUFJLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztRQUUvQixtQ0FBbUM7UUFDbkMsTUFBTSxRQUFRLEdBQUcsTUFBTSxJQUFJLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUNuRCxNQUFNLGdCQUFnQixHQUFxQjtZQUN6QyxHQUFHLE9BQU87WUFDVixPQUFPLEVBQUUsUUFBUSxFQUFFLE9BQU8sSUFBSSxJQUFJLElBQUksRUFBRSxDQUFDLFdBQVcsRUFBRTtZQUN0RCxRQUFRLEVBQUUsSUFBSSxJQUFJLEVBQUUsQ0FBQyxXQUFXLEVBQUU7U0FDbkMsQ0FBQztRQUVGLG1CQUFtQjtRQUNuQixJQUFJLElBQUksQ0FBQyxpQkFBaUIsSUFBSSxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDMUMsSUFBSSxDQUFDO2dCQUNILE1BQU0sSUFBSSxDQUFDLE1BQU0sQ0FBQyxXQUFXLENBQzNCLElBQUksQ0FBQyxZQUFZLEVBQ2pCLFNBQVMsT0FBTyxDQUFDLEVBQUUsRUFBRSxFQUNyQixJQUFJLENBQUMsU0FBUyxDQUFDLGdCQUFnQixDQUFDLENBQ2pDLENBQUM7Z0JBQ0YsT0FBTyxDQUFDLEtBQUssQ0FBQywrQkFBK0IsT0FBTyxDQUFDLEVBQUUsc0JBQXNCLENBQUMsQ0FBQztnQkFDL0UsT0FBTyxDQUFDLHNCQUFzQjtZQUNoQyxDQUFDO1lBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQztnQkFDZixPQUFPLENBQUMsS0FBSyxDQUFDLGlFQUFpRSxFQUFFLEtBQUssQ0FBQyxDQUFDO1lBQzFGLENBQUM7UUFDSCxDQUFDO1FBRUQsaUNBQWlDO1FBQ2pDLE1BQU0sSUFBSSxDQUFDLFVBQVUsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO0lBQzFDLENBQUM7SUFFRCxLQUFLLENBQUMsZUFBZTtRQUNuQixNQUFNLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO1FBRS9CLE1BQU0sUUFBUSxHQUF1QixFQUFFLENBQUM7UUFFeEMsbUJBQW1CO1FBQ25CLElBQUksSUFBSSxDQUFDLGlCQUFpQixJQUFJLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUMxQyxJQUFJLENBQUM7Z0JBQ0gsTUFBTSxXQUFXLEdBQUcsTUFBTSxJQUFJLENBQUMsTUFBTSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUM7Z0JBRXpFLEtBQUssTUFBTSxJQUFJLElBQUksV0FBVyxFQUFFLENBQUM7b0JBQy9CLElBQUksQ0FBQzt3QkFDSCxNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQXFCLENBQUM7d0JBQzlELFFBQVEsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7b0JBQ3pCLENBQUM7b0JBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQzt3QkFDZixPQUFPLENBQUMsS0FBSyxDQUFDLHNEQUFzRCxJQUFJLENBQUMsT0FBTyxHQUFHLEVBQUUsS0FBSyxDQUFDLENBQUM7b0JBQzlGLENBQUM7Z0JBQ0gsQ0FBQztnQkFFRCxJQUFJLFFBQVEsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7b0JBQ3hCLE9BQU8sQ0FBQyxLQUFLLENBQUMsOEJBQThCLFFBQVEsQ0FBQyxNQUFNLHlCQUF5QixDQUFDLENBQUM7b0JBQ3RGLE9BQU8sUUFBUSxDQUFDO2dCQUNsQixDQUFDO1lBQ0gsQ0FBQztZQUFDLE9BQU8sS0FBSyxFQUFFLENBQUM7Z0JBQ2YsT0FBTyxDQUFDLEtBQUssQ0FBQyxtREFBbUQsRUFBRSxLQUFLLENBQUMsQ0FBQztZQUM1RSxDQUFDO1FBQ0gsQ0FBQztRQUVELGlDQUFpQztRQUNqQyxJQUFJLENBQUM7WUFDSCxNQUFNLFlBQVksR0FBRyxNQUFNLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQztZQUUvQyxLQUFLLE1BQU0sQ0FBQyxFQUFFLEVBQUUsZ0JBQWdCLENBQUMsSUFBSSxNQUFNLENBQUMsT0FBTyxDQUFDLFlBQVksQ0FBQyxFQUFFLENBQUM7Z0JBQ2xFLElBQUksQ0FBQztvQkFDSCx5QkFBeUI7b0JBQ3pCLE1BQU0sT0FBTyxHQUFxQjt3QkFDaEMsR0FBRyxnQkFBZ0I7d0JBQ25CLFFBQVEsRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLGdCQUFnQixDQUFDLFFBQVEsQ0FBQzt3QkFDakQsU0FBUyxFQUFFLGdCQUFnQixDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxnQkFBZ0IsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUztxQkFDN0YsQ0FBQztvQkFDRixRQUFRLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO2dCQUN6QixDQUFDO2dCQUFDLE9BQU8sS0FBSyxFQUFFLENBQUM7b0JBQ2YsT0FBTyxDQUFDLEtBQUssQ0FBQyxzREFBc0QsRUFBRSxHQUFHLEVBQUUsS0FBSyxDQUFDLENBQUM7Z0JBQ3BGLENBQUM7WUFDSCxDQUFDO1lBRUQsT0FBTyxDQUFDLEtBQUssQ0FBQyw4QkFBOEIsUUFBUSxDQUFDLE1BQU0scUJBQXFCLENBQUMsQ0FBQztRQUNwRixDQUFDO1FBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQztZQUNmLE9BQU8sQ0FBQyxLQUFLLENBQUMsK0NBQStDLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFDeEUsQ0FBQztRQUVELE9BQU8sUUFBUSxDQUFDO0lBQ2xCLENBQUM7SUFFRCxLQUFLLENBQUMsVUFBVSxDQUFDLFNBQWlCO1FBQ2hDLE1BQU0sSUFBSSxDQUFDLGlCQUFpQixFQUFFLENBQUM7UUFFL0IsbUJBQW1CO1FBQ25CLElBQUksSUFBSSxDQUFDLGlCQUFpQixJQUFJLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUMxQyxJQUFJLENBQUM7Z0JBQ0gsTUFBTSxRQUFRLEdBQUcsTUFBTSxJQUFJLENBQUMsTUFBTSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsWUFBWSxFQUFFLFNBQVMsU0FBUyxFQUFFLENBQUMsQ0FBQztnQkFDeEYsSUFBSSxRQUFRLEVBQUUsQ0FBQztvQkFDYixPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFxQixDQUFDO2dCQUNsRCxDQUFDO1lBQ0gsQ0FBQztZQUFDLE9BQU8sS0FBSyxFQUFFLENBQUM7Z0JBQ2YsT0FBTyxDQUFDLEtBQUssQ0FBQyw2Q0FBNkMsU0FBUyxpQkFBaUIsRUFBRSxLQUFLLENBQUMsQ0FBQztZQUNoRyxDQUFDO1FBQ0gsQ0FBQztRQUVELGlDQUFpQztRQUNqQyxJQUFJLENBQUM7WUFDSCxNQUFNLFFBQVEsR0FBRyxNQUFNLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQztZQUMzQyxNQUFNLGdCQUFnQixHQUFHLFFBQVEsQ0FBQyxTQUFTLENBQUMsQ0FBQztZQUM3QyxJQUFJLGdCQUFnQixFQUFFLENBQUM7Z0JBQ3JCLHlCQUF5QjtnQkFDekIsTUFBTSxPQUFPLEdBQXFCO29CQUNoQyxHQUFHLGdCQUFnQjtvQkFDbkIsUUFBUSxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsZ0JBQWdCLENBQUMsUUFBUSxDQUFDO29CQUNqRCxTQUFTLEVBQUUsZ0JBQWdCLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLGdCQUFnQixDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTO2lCQUM3RixDQUFDO2dCQUNGLE9BQU8sT0FBTyxDQUFDO1lBQ2pCLENBQUM7UUFDSCxDQUFDO1FBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQztZQUNmLE9BQU8sQ0FBQyxLQUFLLENBQUMsNkNBQTZDLFNBQVMsYUFBYSxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBQzVGLENBQUM7UUFFRCxPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFFRCxLQUFLLENBQUMsYUFBYSxDQUFDLFNBQWlCO1FBQ25DLE1BQU0sSUFBSSxDQUFDLGlCQUFpQixFQUFFLENBQUM7UUFFL0IsbUJBQW1CO1FBQ25CLElBQUksSUFBSSxDQUFDLGlCQUFpQixJQUFJLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUMxQyxJQUFJLENBQUM7Z0JBQ0gsTUFBTSxJQUFJLENBQUMsTUFBTSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsWUFBWSxFQUFFLFNBQVMsU0FBUyxFQUFFLENBQUMsQ0FBQztnQkFDMUUsT0FBTyxDQUFDLEtBQUssQ0FBQywrQkFBK0IsU0FBUyx3QkFBd0IsQ0FBQyxDQUFDO1lBQ2xGLENBQUM7WUFBQyxPQUFPLEtBQUssRUFBRSxDQUFDO2dCQUNmLE9BQU8sQ0FBQyxLQUFLLENBQUMscURBQXFELEVBQUUsS0FBSyxDQUFDLENBQUM7WUFDOUUsQ0FBQztRQUNILENBQUM7UUFFRCxzQ0FBc0M7UUFDdEMsSUFBSSxDQUFDO1lBQ0gsTUFBTSxRQUFRLEdBQUcsTUFBTSxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7WUFDM0MsT0FBTyxRQUFRLENBQUMsU0FBUyxDQUFDLENBQUM7WUFFM0IsTUFBTSxFQUFFLENBQUMsU0FBUyxDQUNoQixJQUFJLENBQUMsV0FBVyxFQUNoQixJQUFJLENBQUMsU0FBUyxDQUFDLFFBQVEsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDLEVBQ2pDLE1BQU0sQ0FDUCxDQUFDO1lBRUYsT0FBTyxDQUFDLEtBQUssQ0FBQywrQkFBK0IsU0FBUyxvQkFBb0IsQ0FBQyxDQUFDO1FBQzlFLENBQUM7UUFBQyxPQUFPLEtBQUssRUFBRSxDQUFDO1lBQ2YsT0FBTyxDQUFDLEtBQUssQ0FBQyxpREFBaUQsRUFBRSxLQUFLLENBQUMsQ0FBQztRQUMxRSxDQUFDO0lBQ0gsQ0FBQztJQUVELEtBQUssQ0FBQyxXQUFXO1FBQ2YsTUFBTSxJQUFJLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztRQUMvQixPQUFPLElBQUksQ0FBQyxpQkFBaUIsQ0FBQztJQUNoQyxDQUFDO0NBQ0Y7QUFFRCx3RkFBd0Y7QUFDeEYsZ0RBQWdEO0FBQ2hELHdGQUF3RjtBQUV4RixNQUFNLHNCQUFzQixHQUFHLENBQUMsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLENBQUM7QUFFNUMsTUFBTSx1QkFBdUIsR0FBRyxDQUFDLENBQUMsTUFBTSxDQUFDO0lBQ3ZDLFVBQVUsRUFBRSxDQUFDLENBQUMsTUFBTSxFQUFFLENBQUMsUUFBUSxDQUFDLHlCQUF5QixDQUFDO0NBQzNELENBQUMsQ0FBQztBQUVILE1BQU0sb0JBQW9CLEdBQUcsQ0FBQyxDQUFDLE1BQU0sQ0FBQztJQUNwQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDLFFBQVEsQ0FBQyxzQ0FBc0MsQ0FBQztJQUNqRSxTQUFTLEVBQUUsQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDLFFBQVEsQ0FBQywwQ0FBMEMsQ0FBQztJQUMxRSxVQUFVLEVBQUUsQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDLFFBQVEsRUFBRSxDQUFDLFFBQVEsQ0FBQyxpREFBaUQsQ0FBQztJQUM3RixPQUFPLEVBQUUsQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDLFFBQVEsQ0FBQyxlQUFlLENBQUM7Q0FDOUMsQ0FBQyxDQUFDO0FBRUgsTUFBTSx1QkFBdUIsR0FBRyxDQUFDLENBQUMsTUFBTSxDQUFDO0lBQ3ZDLFVBQVUsRUFBRSxDQUFDLENBQUMsTUFBTSxFQUFFLENBQUMsUUFBUSxDQUFDLHNCQUFzQixDQUFDO0NBQ3hELENBQUMsQ0FBQztBQUVILE1BQU0sMEJBQTBCLEdBQUcsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsQ0FBQztBQUVoRCxNQUFNLDJCQUEyQixHQUFHLENBQUMsQ0FBQyxNQUFNLENBQUM7SUFDM0MsVUFBVSxFQUFFLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxRQUFRLENBQUMsOEJBQThCLENBQUM7Q0FDaEUsQ0FBQyxDQUFDO0FBRUgsTUFBTSx1QkFBdUIsR0FBRyxDQUFDLENBQUMsTUFBTSxDQUFDO0lBQ3ZDLFVBQVUsRUFBRSxDQUFDLENBQUMsTUFBTSxFQUFFLENBQUMsUUFBUSxDQUFDLHNCQUFzQixDQUFDO0lBQ3ZELFNBQVMsRUFBRSxDQUFDLENBQUMsTUFBTSxFQUFFLENBQUMsUUFBUSxFQUFFLENBQUMsUUFBUSxDQUFDLDhDQUE4QyxDQUFDO0lBQ3pGLFVBQVUsRUFBRSxDQUFDLENBQUMsTUFBTSxFQUFFLENBQUMsUUFBUSxFQUFFLENBQUMsUUFBUSxDQUFDLDBDQUEwQyxDQUFDO0NBQ3ZGLENBQUMsQ0FBQztBQUVILHdGQUF3RjtBQUN4RixvREFBb0Q7QUFDcEQsd0ZBQXdGO0FBRXhGLE1BQU0sc0JBQXNCLEdBQUcsQ0FBQyxDQUFDLE1BQU0sQ0FBQztJQUN0QyxLQUFLLEVBQUUsQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDLFFBQVEsRUFBRSxDQUFDLFFBQVEsQ0FBQyxrRkFBa0YsQ0FBQztJQUN6SCxLQUFLLEVBQUUsQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDLFFBQVEsRUFBRSxDQUFDLFFBQVEsQ0FBQyxxREFBcUQsQ0FBQztDQUM3RixDQUFDLENBQUM7QUFFSCxNQUFNLHFCQUFxQixHQUFHLENBQUMsQ0FBQyxNQUFNLENBQUM7SUFDckMsT0FBTyxFQUFFLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxRQUFRLENBQUMsb0RBQW9ELENBQUM7SUFDbEYsSUFBSSxFQUFFLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxRQUFRLENBQUMsNkJBQTZCLENBQUM7SUFDeEQsU0FBUyxFQUFFLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxRQUFRLENBQUMsb0RBQW9ELENBQUM7Q0FDaEcsQ0FBQyxDQUFDO0FBRUgsTUFBTSwyQkFBMkIsR0FBRyxDQUFDLENBQUMsTUFBTSxDQUFDO0lBQzNDLE9BQU8sRUFBRSxDQUFDLENBQUMsTUFBTSxFQUFFLENBQUMsUUFBUSxDQUFDLGtDQUFrQyxDQUFDO0lBQ2hFLEtBQUssRUFBRSxDQUFDLENBQUMsTUFBTSxFQUFFLENBQUMsUUFBUSxFQUFFLENBQUMsUUFBUSxDQUFDLDZDQUE2QyxDQUFDO0NBQ3JGLENBQUMsQ0FBQztBQUVILE1BQU0scUJBQXFCLEdBQUcsQ0FBQyxDQUFDLE1BQU0sQ0FBQztJQUNyQyxPQUFPLEVBQUUsQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDLFFBQVEsQ0FBQyxpQ0FBaUMsQ0FBQztJQUMvRCxTQUFTLEVBQUUsQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDLFFBQVEsQ0FBQyxzQ0FBc0MsQ0FBQztJQUN0RSxJQUFJLEVBQUUsQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDLFFBQVEsQ0FBQyxzQ0FBc0MsQ0FBQztDQUNsRSxDQUFDLENBQUM7QUFFSCxNQUFNLG1CQUFtQixHQUFHLENBQUMsQ0FBQyxNQUFNLENBQUM7SUFDbkMsS0FBSyxFQUFFLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxRQUFRLENBQUMsa0RBQWtELENBQUM7Q0FDMUYsQ0FBQyxDQUFDO0FBRUgsTUFBTSx1QkFBdUIsR0FBRyxDQUFDLENBQUMsTUFBTSxDQUFDO0lBQ3ZDLElBQUksRUFBRSxDQUFDLENBQUMsTUFBTSxFQUFFLENBQUMsUUFBUSxDQUFDLG9DQUFvQyxDQUFDO0NBQ2hFLENBQUMsQ0FBQztBQUVILE1BQU0scUJBQXFCLEdBQUcsQ0FBQyxDQUFDLE1BQU0sQ0FBQztJQUNyQyxPQUFPLEVBQUUsQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDLFFBQVEsQ0FBQyxrQ0FBa0MsQ0FBQztDQUNqRSxDQUFDLENBQUM7QUFFSCxNQUFNLHFCQUFxQixHQUFHLENBQUMsQ0FBQyxNQUFNLENBQUM7SUFDckMsS0FBSyxFQUFFLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxRQUFRLENBQUMsd0JBQXdCLENBQUM7SUFDcEQsS0FBSyxFQUFFLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxRQUFRLENBQUMsMkNBQTJDLENBQUM7SUFDbEYsSUFBSSxFQUFFLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxRQUFRLENBQUMscUNBQXFDLENBQUM7Q0FDNUUsQ0FBQyxDQUFDO0FBRUgsTUFBTSx3QkFBd0IsR0FBRyxDQUFDLENBQUMsTUFBTSxDQUFDO0lBQ3hDLEtBQUssRUFBRSxDQUFDLENBQUMsTUFBTSxFQUFFLENBQUMsUUFBUSxDQUFDLDJCQUEyQixDQUFDO0lBQ3ZELEtBQUssRUFBRSxDQUFDLENBQUMsTUFBTSxFQUFFLENBQUMsUUFBUSxFQUFFLENBQUMsUUFBUSxDQUFDLDJDQUEyQyxDQUFDO0lBQ2xGLElBQUksRUFBRSxDQUFDLENBQUMsTUFBTSxFQUFFLENBQUMsUUFBUSxFQUFFLENBQUMsUUFBUSxDQUFDLHFDQUFxQyxDQUFDO0NBQzVFLENBQUMsQ0FBQztBQUVILE1BQU0sc0JBQXNCLEdBQUcsQ0FBQyxDQUFDLE1BQU0sQ0FBQztJQUN0QyxPQUFPLEVBQUUsQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDLFFBQVEsQ0FBQyxpQ0FBaUMsQ0FBQztJQUMvRCxLQUFLLEVBQUUsQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDLFFBQVEsRUFBRSxDQUFDLFFBQVEsQ0FBQyx5QkFBeUIsQ0FBQztJQUNoRSxLQUFLLEVBQUUsQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDLFFBQVEsRUFBRSxDQUFDLFFBQVEsQ0FBQywyQ0FBMkMsQ0FBQztDQUNuRixDQUFDLENBQUM7QUFFSCxNQUFNLDJCQUEyQixHQUFHLENBQUMsQ0FBQyxNQUFNLENBQUM7SUFDM0MsU0FBUyxFQUFFLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxRQUFRLENBQUMseUJBQXlCLENBQUM7SUFDekQsT0FBTyxFQUFFLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxRQUFRLENBQUMsdUJBQXVCLENBQUM7SUFDckQsS0FBSyxFQUFFLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxRQUFRLENBQUMseUJBQXlCLENBQUM7SUFDaEUsS0FBSyxFQUFFLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxRQUFRLENBQUMsMkNBQTJDLENBQUM7Q0FDbkYsQ0FBQyxDQUFDO0FBRUgsTUFBTSxvQkFBb0IsR0FBRyxDQUFDLENBQUMsTUFBTSxDQUFDO0lBQ3BDLE9BQU8sRUFBRSxDQUFDLENBQUMsTUFBTSxFQUFFLENBQUMsUUFBUSxDQUFDLGlDQUFpQyxDQUFDO0lBQy9ELFNBQVMsRUFBRSxDQUFDLENBQUMsTUFBTSxFQUFFLENBQUMsUUFBUSxDQUFDLGlDQUFpQyxDQUFDO0NBQ2xFLENBQUMsQ0FBQztBQUVILE1BQU0sc0JBQXNCLEdBQUcsQ0FBQyxDQUFDLE1BQU0sQ0FBQztJQUN0QyxPQUFPLEVBQUUsQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDLFFBQVEsQ0FBQyxpQ0FBaUMsQ0FBQztJQUMvRCxTQUFTLEVBQUUsQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDLFFBQVEsQ0FBQyxtQ0FBbUMsQ0FBQztDQUNwRSxDQUFDLENBQUM7QUFFSCxNQUFNLHVCQUF1QixHQUFHLENBQUMsQ0FBQyxNQUFNLENBQUM7SUFDdkMsT0FBTyxFQUFFLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxRQUFRLENBQUMsaUNBQWlDLENBQUM7SUFDL0QsU0FBUyxFQUFFLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxRQUFRLENBQUMsb0NBQW9DLENBQUM7Q0FDckUsQ0FBQyxDQUFDO0FBRUgsTUFBTSxxQkFBcUIsR0FBRyxDQUFDLENBQUMsTUFBTSxDQUFDO0lBQ3JDLE9BQU8sRUFBRSxDQUFDLENBQUMsTUFBTSxFQUFFLENBQUMsUUFBUSxDQUFDLGlDQUFpQyxDQUFDO0lBQy9ELFNBQVMsRUFBRSxDQUFDLENBQUMsTUFBTSxFQUFFLENBQUMsUUFBUSxDQUFDLGtDQUFrQyxDQUFDO0lBQ2xFLElBQUksRUFBRSxDQUFDLENBQUMsTUFBTSxFQUFFLENBQUMsUUFBUSxDQUFDLDBCQUEwQixDQUFDO0NBQ3RELENBQUMsQ0FBQztBQUVILE1BQU0seUJBQXlCLEdBQUcsQ0FBQyxDQUFDLE1BQU0sQ0FBQztJQUN6QyxPQUFPLEVBQUUsQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDLFFBQVEsQ0FBQyx1QkFBdUIsQ0FBQztJQUNyRCxJQUFJLEVBQUUsQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDLFFBQVEsQ0FBQyxjQUFjLENBQUM7SUFDekMsT0FBTyxFQUFFLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxRQUFRLENBQUMsNENBQTRDLENBQUM7Q0FDM0UsQ0FBQyxDQUFDO0FBRUgsTUFBTSx1QkFBdUIsR0FBRyxDQUFDLENBQUMsTUFBTSxDQUFDO0lBQ3ZDLE9BQU8sRUFBRSxDQUFDLENBQUMsTUFBTSxFQUFFLENBQUMsUUFBUSxDQUFDLDJCQUEyQixDQUFDO0NBQzFELENBQUMsQ0FBQztBQUVILE1BQU0sd0JBQXdCLEdBQUcsQ0FBQyxDQUFDLE1BQU0sQ0FBQztJQUN4QyxPQUFPLEVBQUUsQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDLFFBQVEsQ0FBQyw0QkFBNEIsQ0FBQztDQUMzRCxDQUFDLENBQUM7QUFFSCxNQUFNLHdCQUF3QixHQUFHLENBQUMsQ0FBQyxNQUFNLENBQUM7SUFDeEMsSUFBSSxFQUFFLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxRQUFRLENBQUMsZUFBZSxDQUFDO0lBQzFDLElBQUksRUFBRSxDQUFDLENBQUMsTUFBTSxFQUFFLENBQUMsUUFBUSxDQUFDLG1FQUFtRSxDQUFDO0NBQy9GLENBQUMsQ0FBQztBQUVILE1BQU0sdUJBQXVCLEdBQUcsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsQ0FBQztBQUU3QyxNQUFNLHdCQUF3QixHQUFHLENBQUMsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLENBQUM7QUFFOUMsTUFBTSwyQkFBMkIsR0FBRyxDQUFDLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxDQUFDO0FBRWpELE1BQU0sOEJBQThCLEdBQUcsQ0FBQyxDQUFDLE1BQU0sQ0FBQztJQUM5QyxPQUFPLEVBQUUsQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDLFFBQVEsQ0FBQyxvQkFBb0IsQ0FBQztJQUNsRCxNQUFNLEVBQUUsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxRQUFRLENBQUMsNENBQTRDLENBQUM7SUFDL0UsSUFBSSxFQUFFLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxRQUFRLENBQUMsZUFBZSxDQUFDO0NBQ3RELENBQUMsQ0FBQztBQUVILE1BQU0sMkJBQTJCLEdBQUcsQ0FBQyxDQUFDLE1BQU0sQ0FBQztJQUMzQyxPQUFPLEVBQUUsQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDLFFBQVEsQ0FBQyxZQUFZLENBQUM7SUFDMUMsVUFBVSxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUMsUUFBUSxDQUFDLDZCQUE2QixDQUFDO0lBQ3ZFLFFBQVEsRUFBRSxDQUFDLENBQUMsTUFBTSxFQUFFLENBQUMsUUFBUSxDQUFDLDBCQUEwQixDQUFDO0NBQzFELENBQUMsQ0FBQztBQUVILE1BQU0sd0JBQXdCLEdBQUcsQ0FBQyxDQUFDLE1BQU0sQ0FBQztJQUN4QyxjQUFjLEVBQUUsQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDLFFBQVEsQ0FBQyxtQkFBbUIsQ0FBQztJQUN4RCxTQUFTLEVBQUUsQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDLFFBQVEsQ0FBQyw4QkFBOEIsQ0FBQztJQUM5RCxjQUFjLEVBQUUsQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDLFFBQVEsQ0FBQyxpQ0FBaUMsQ0FBQztJQUN0RSxPQUFPLEVBQUUsQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDLFFBQVEsRUFBRSxDQUFDLFFBQVEsQ0FBQyxrQ0FBa0MsQ0FBQztDQUM1RSxDQUFDLENBQUM7QUFFSCxNQUFNLDZCQUE2QixHQUFHLENBQUMsQ0FBQyxNQUFNLENBQUM7SUFDN0MsY0FBYyxFQUFFLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxRQUFRLENBQUMsbUJBQW1CLENBQUM7SUFDeEQsVUFBVSxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUMsUUFBUSxDQUFDLDZCQUE2QixDQUFDO0lBQ3ZFLGVBQWUsRUFBRSxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDLFFBQVEsQ0FBQyw2QkFBNkIsQ0FBQztJQUM1RSxPQUFPLEVBQUUsQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDLFFBQVEsRUFBRSxDQUFDLFFBQVEsQ0FBQyxrQ0FBa0MsQ0FBQztDQUM1RSxDQUFDLENBQUM7QUFFSCxNQUFNLDJCQUEyQixHQUFHLENBQUMsQ0FBQyxNQUFNLENBQUM7SUFDM0MsT0FBTyxFQUFFLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxRQUFRLENBQUMsa0JBQWtCLENBQUM7SUFDaEQsS0FBSyxFQUFFLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxRQUFRLENBQUMsbUNBQW1DLENBQUM7Q0FDM0UsQ0FBQyxDQUFDO0FBRUgsTUFBTSwwQkFBMEIsR0FBRyxDQUFDLENBQUMsTUFBTSxDQUFDO0lBQzFDLE9BQU8sRUFBRSxDQUFDLENBQUMsTUFBTSxFQUFFLENBQUMsUUFBUSxDQUFDLGdDQUFnQyxDQUFDO0lBQzlELFNBQVMsRUFBRSxDQUFDLENBQUMsTUFBTSxFQUFFLENBQUMsUUFBUSxDQUFDLGtEQUFrRCxDQUFDO0lBQ2xGLEtBQUssRUFBRSxDQUFDLENBQUMsTUFBTSxFQUFFLENBQUMsUUFBUSxFQUFFLENBQUMsUUFBUSxDQUFDLDRDQUE0QyxDQUFDO0NBQ3BGLENBQUMsQ0FBQztBQUVILE1BQU0sb0JBQW9CLEdBQUcsQ0FBQyxDQUFDLE1BQU0sQ0FBQztJQUNwQyxPQUFPLEVBQUUsQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDLFFBQVEsQ0FBQyx5QkFBeUIsQ0FBQztJQUN2RCxTQUFTLEVBQUUsQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDLFFBQVEsQ0FBQywyQkFBMkIsQ0FBQztJQUMzRCxLQUFLLEVBQUUsQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDLFFBQVEsRUFBRSxDQUFDLFFBQVEsQ0FBQyxxQkFBcUIsQ0FBQztJQUM1RCxlQUFlLEVBQUUsQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDLFFBQVEsRUFBRSxDQUFDLFFBQVEsQ0FBQyw4QkFBOEIsQ0FBQztDQUNoRixDQUFDLENBQUM7QUFFSCxNQUFNLHFCQUFxQixHQUFHLENBQUMsQ0FBQyxNQUFNLENBQUM7SUFDckMsT0FBTyxFQUFFLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxRQUFRLENBQUMsdUJBQXVCLENBQUM7SUFDckQsZUFBZSxFQUFFLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxRQUFRLENBQUMscUNBQXFDLENBQUM7SUFDM0UsWUFBWSxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxNQUFNLEVBQUUsU0FBUyxDQUFDLENBQUMsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUMsUUFBUSxDQUFDLG1DQUFtQyxDQUFDO0lBQ2xILEtBQUssRUFBRSxDQUFDLENBQUMsTUFBTSxFQUFFLENBQUMsUUFBUSxFQUFFLENBQUMsUUFBUSxDQUFDLHVCQUF1QixDQUFDO0lBQzlELGVBQWUsRUFBRSxDQUFDLENBQUMsTUFBTSxFQUFFLENBQUMsUUFBUSxFQUFFLENBQUMsUUFBUSxDQUFDLGlDQUFpQyxDQUFDO0NBQ25GLENBQUMsQ0FBQztBQUVILHdGQUF3RjtBQUN4RixvQkFBb0I7QUFDcEIsd0ZBQXdGO0FBRXhGLE1BQU0sZUFBZTtJQUNYLE1BQU0sQ0FBUztJQUNmLFlBQVksQ0FBZTtJQUMzQixpQkFBaUIsQ0FBb0I7SUFFN0M7UUFDRSxJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksTUFBTSxDQUN0QjtZQUNFLElBQUksRUFBRSxXQUFXO1lBQ2pCLE9BQU8sRUFBRSxPQUFPO1NBQ2pCLEVBQ0Q7WUFDRSxZQUFZLEVBQUU7Z0JBQ1osS0FBSyxFQUFFLEVBQUU7YUFDVjtTQUNGLENBQ0YsQ0FBQztRQUVGLDJCQUEyQjtRQUMzQixJQUFJLENBQUMsWUFBWSxHQUFHO1lBQ2xCLFFBQVEsRUFBRSxJQUFJLEdBQUcsRUFBRTtZQUNuQixlQUFlLEVBQUUsSUFBSTtZQUNyQixPQUFPLEVBQUUsSUFBSSxHQUFHLEVBQUU7WUFDbEIsV0FBVyxFQUFFLElBQUksR0FBRyxFQUFFO1NBQ3ZCLENBQUM7UUFFRixnQ0FBZ0M7UUFDaEMsSUFBSSxDQUFDLGlCQUFpQixHQUFHLElBQUksaUJBQWlCLEVBQUUsQ0FBQztRQUVqRCx3RUFBd0U7UUFDeEUsSUFBSSxDQUFDLHdCQUF3QixFQUFFLENBQUM7UUFFaEMscURBQXFEO1FBQ3JELElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQztJQUN2QixDQUFDO0lBRUQsd0ZBQXdGO0lBQ3hGLDZCQUE2QjtJQUM3Qix3RkFBd0Y7SUFFaEYsS0FBSyxDQUFDLHFCQUFxQjtRQUNqQyxJQUFJLENBQUM7WUFDSCxNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUM7WUFDN0IsT0FBTyxDQUFDLEtBQUssQ0FBQyw2Q0FBNkMsQ0FBQyxDQUFDO1lBRTdELE1BQU0saUJBQWlCLEdBQUcsTUFBTSxJQUFJLENBQUMsaUJBQWlCLENBQUMsZUFBZSxFQUFFLENBQUM7WUFFekUsT0FBTyxDQUFDLEtBQUssQ0FBQyx1QkFBdUIsaUJBQWlCLENBQUMsTUFBTSxxQkFBcUIsQ0FBQyxDQUFDO1lBRXBGLEtBQUssTUFBTSxPQUFPLElBQUksaUJBQWlCLEVBQUUsQ0FBQztnQkFDeEMsNkNBQTZDO2dCQUM3QyxJQUFJLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDO29CQUNoRCxJQUFJLENBQUMsWUFBWSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLEVBQUUsRUFBRSxPQUFPLENBQUMsQ0FBQztvQkFDcEQsSUFBSSxDQUFDLGdCQUFnQixDQUFDLE9BQU8sQ0FBQyxDQUFDO29CQUUvQixpREFBaUQ7b0JBQ2pELElBQUksQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLGVBQWUsRUFBRSxDQUFDO3dCQUN2QyxJQUFJLENBQUMsWUFBWSxDQUFDLGVBQWUsR0FBRyxPQUFPLENBQUMsRUFBRSxDQUFDO3dCQUMvQyxPQUFPLENBQUMsS0FBSyxDQUFDLHFCQUFxQixPQUFPLENBQUMsRUFBRSxvQkFBb0IsQ0FBQyxDQUFDO29CQUNyRSxDQUFDO2dCQUNILENBQUM7WUFDSCxDQUFDO1lBRUQsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRSxHQUFHLFNBQVMsQ0FBQztZQUN4QyxPQUFPLENBQUMsS0FBSyxDQUFDLDhDQUE4QyxRQUFRLElBQUksQ0FBQyxDQUFDO1lBQzFFLE9BQU8sQ0FBQyxLQUFLLENBQUMsa0NBQWtDLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxRQUFRLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQzlHLENBQUM7UUFBQyxPQUFPLEtBQUssRUFBRSxDQUFDO1lBQ2YsT0FBTyxDQUFDLEtBQUssQ0FBQyxrREFBa0QsRUFBRSxLQUFLLENBQUMsQ0FBQztRQUMzRSxDQUFDO0lBQ0gsQ0FBQztJQUVPLHdCQUF3QjtRQUM5QixNQUFNLGVBQWUsR0FBRyxPQUFPLENBQUMsR0FBRyxDQUFDLGlCQUFpQixDQUFDO1FBQ3RELE1BQU0sZ0JBQWdCLEdBQUcsT0FBTyxDQUFDLEdBQUcsQ0FBQyxrQkFBa0IsQ0FBQztRQUN4RCxNQUFNLGFBQWEsR0FBRyxPQUFPLENBQUMsR0FBRyxDQUFDLGVBQWUsQ0FBQztRQUNsRCxNQUFNLGtCQUFrQixHQUFHLE9BQU8sQ0FBQyxHQUFHLENBQUMsb0JBQW9CLENBQUM7UUFFNUQsT0FBTyxDQUFDLEtBQUssQ0FBQyxzQ0FBc0MsRUFBRTtZQUNwRCxpQkFBaUIsRUFBRSxlQUFlLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsU0FBUztZQUN0RCxrQkFBa0IsRUFBRSxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxTQUFTO1lBQ3hELGVBQWUsRUFBRSxhQUFhO1lBQzlCLG9CQUFvQixFQUFFLGtCQUFrQjtTQUN6QyxDQUFDLENBQUM7UUFFSCxJQUFJLGVBQWUsSUFBSSxhQUFhLEVBQUUsQ0FBQztZQUNyQyxNQUFNLGNBQWMsR0FBaUI7Z0JBQ25DLEVBQUUsRUFBRSxTQUFTO2dCQUNiLElBQUksRUFBRSxrQkFBa0IsSUFBSSxtQkFBbUI7Z0JBQy9DLFNBQVMsRUFBRSxTQUFTLEVBQUUsK0JBQStCO2dCQUNyRCxNQUFNLEVBQUUsYUFBYTtnQkFDckIsUUFBUSxFQUFFLGVBQWU7Z0JBQ3pCLFNBQVMsRUFBRSxnQkFBZ0I7Z0JBQzNCLFNBQVMsRUFBRSxJQUFJO2FBQ2hCLENBQUM7WUFFRixJQUFJLENBQUMsWUFBWSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsY0FBYyxDQUFDLEVBQUUsRUFBRSxjQUFjLENBQUMsQ0FBQztZQUNsRSxJQUFJLENBQUMsWUFBWSxDQUFDLGVBQWUsR0FBRyxjQUFjLENBQUMsRUFBRSxDQUFDO1lBQ3RELElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxjQUFjLENBQUMsQ0FBQztZQUV0QyxtREFBbUQ7WUFDbkQsSUFBSSxDQUFDLGlCQUFpQixDQUFDLFdBQVcsQ0FBQyxjQUFjLENBQUMsQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLEVBQUU7Z0JBQy9ELE9BQU8sQ0FBQyxLQUFLLENBQUMsc0NBQXNDLEVBQUUsS0FBSyxDQUFDLENBQUM7WUFDL0QsQ0FBQyxDQUFDLENBQUM7UUFDTCxDQUFDO0lBQ0gsQ0FBQztJQUVPLGdCQUFnQixDQUFDLE9BQXFCO1FBQzVDLHdCQUF3QjtRQUN4QixNQUFNLFNBQVMsR0FBRyxJQUFJLFNBQVMsQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDbEQsSUFBSSxDQUFDLFlBQVksQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxFQUFFLEVBQUUsU0FBUyxDQUFDLENBQUM7UUFFckQsbURBQW1EO1FBQ25ELElBQUksT0FBTyxDQUFDLFNBQVMsRUFBRSxDQUFDO1lBQ3RCLE1BQU0sVUFBVSxHQUFHLElBQUksU0FBUyxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQztZQUNwRCxJQUFJLENBQUMsWUFBWSxDQUFDLFdBQVcsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLEVBQUUsRUFBRSxVQUFVLENBQUMsQ0FBQztRQUM1RCxDQUFDO0lBQ0gsQ0FBQztJQUVPLG1CQUFtQixDQUFDLEtBQWEsRUFBRSxJQUFvQjtRQUM3RCxJQUFJLElBQUksS0FBSyxLQUFLLEVBQUUsQ0FBQztZQUNuQixPQUFPLEtBQUssQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDbkMsQ0FBQzthQUFNLENBQUM7WUFDTixPQUFPLEtBQUssQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDbkMsQ0FBQztJQUNILENBQUM7SUFFTyxpQkFBaUIsQ0FBQyxJQUFZO1FBQ3BDLDJDQUEyQztRQUMzQyxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsV0FBVyxFQUFFO2FBQzlCLE9BQU8sQ0FBQyxZQUFZLEVBQUUsR0FBRyxDQUFDO2FBQzFCLE9BQU8sQ0FBQyxLQUFLLEVBQUUsR0FBRyxDQUFDO2FBQ25CLE9BQU8sQ0FBQyxRQUFRLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFFekIsSUFBSSxFQUFFLEdBQUcsTUFBTSxDQUFDO1FBQ2hCLElBQUksT0FBTyxHQUFHLENBQUMsQ0FBQztRQUVoQixvQkFBb0I7UUFDcEIsT0FBTyxJQUFJLENBQUMsWUFBWSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQztZQUMxQyxFQUFFLEdBQUcsR0FBRyxNQUFNLElBQUksT0FBTyxFQUFFLENBQUM7WUFDNUIsT0FBTyxFQUFFLENBQUM7UUFDWixDQUFDO1FBRUQsT0FBTyxFQUFFLENBQUM7SUFDWixDQUFDO0lBRU8sS0FBSyxDQUFDLGVBQWU7UUFDM0IsSUFBSSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsZUFBZSxFQUFFLENBQUM7WUFDdkMsTUFBTSxJQUFJLEtBQUssQ0FBQyxzR0FBc0csQ0FBQyxDQUFDO1FBQzFILENBQUM7UUFFRCxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxlQUFlLENBQUMsQ0FBQztRQUNoRixJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDWixNQUFNLElBQUksS0FBSyxDQUFDLHlGQUF5RixDQUFDLENBQUM7UUFDN0csQ0FBQztRQUVELDhCQUE4QjtRQUM5QixNQUFNLGFBQWEsR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxlQUFlLENBQUMsQ0FBQztRQUN4RixPQUFPLENBQUMsS0FBSyxDQUFDLGtCQUFrQixFQUFFLGFBQWEsRUFBRSxRQUFRLENBQUMsQ0FBQztRQUUzRCxPQUFPLE1BQU0sQ0FBQztJQUNoQixDQUFDO0lBRU8sS0FBSyxDQUFDLG1CQUFtQjtRQUMvQixJQUFJLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxlQUFlLEVBQUUsQ0FBQztZQUN2QyxNQUFNLElBQUksS0FBSyxDQUFDLHNEQUFzRCxDQUFDLENBQUM7UUFDMUUsQ0FBQztRQUVELHdEQUF3RDtRQUN4RCxJQUFJLE1BQU0sR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLFdBQVcsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxlQUFlLENBQUMsQ0FBQztRQUNsRixJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDWixNQUFNLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsZUFBZSxDQUFDLENBQUM7UUFDNUUsQ0FBQztRQUVELElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUNaLE1BQU0sSUFBSSxLQUFLLENBQUMsa0NBQWtDLENBQUMsQ0FBQztRQUN0RCxDQUFDO1FBRUQsT0FBTyxNQUFNLENBQUM7SUFDaEIsQ0FBQztJQUVPLFNBQVMsQ0FBQyxLQUFhO1FBQzdCLElBQUksS0FBSyxDQUFDLE1BQU0sSUFBSSxDQUFDO1lBQUUsT0FBTyxLQUFLLENBQUM7UUFDcEMsT0FBTyxLQUFLLENBQUMsU0FBUyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsR0FBRyxLQUFLLEdBQUcsS0FBSyxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDO0lBQzNFLENBQUM7SUFFRCx3RkFBd0Y7SUFDeEYsMENBQTBDO0lBQzFDLHdGQUF3RjtJQUVoRixLQUFLLENBQUMsWUFBWSxDQUFDLElBQWE7UUFDdEMsc0JBQXNCLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBRW5DLE1BQU0sUUFBUSxHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxRQUFRLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1lBQy9FLEVBQUUsRUFBRSxPQUFPLENBQUMsRUFBRTtZQUNkLElBQUksRUFBRSxPQUFPLENBQUMsSUFBSTtZQUNsQixTQUFTLEVBQUUsT0FBTyxDQUFDLFNBQVM7WUFDNUIsT0FBTyxFQUFFLE9BQU8sQ0FBQyxNQUFNO1lBQ3ZCLFVBQVUsRUFBRSxPQUFPLENBQUMsU0FBUyxJQUFJLEtBQUs7WUFDdEMsU0FBUyxFQUFFLE9BQU8sQ0FBQyxFQUFFLEtBQUssSUFBSSxDQUFDLFlBQVksQ0FBQyxlQUFlO1lBQzNELGNBQWMsRUFBRSxDQUFDLENBQUMsT0FBTyxDQUFDLFNBQVM7WUFDbkMsU0FBUyxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQztZQUMzQyxVQUFVLEVBQUUsT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUk7U0FDekUsQ0FBQyxDQUFDLENBQUM7UUFFSixPQUFPO1lBQ0wsT0FBTyxFQUFFO2dCQUNQO29CQUNFLElBQUksRUFBRSxNQUFNO29CQUNaLElBQUksRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDO3dCQUNuQixjQUFjLEVBQUUsUUFBUSxDQUFDLE1BQU07d0JBQy9CLGlCQUFpQixFQUFFLElBQUksQ0FBQyxZQUFZLENBQUMsZUFBZTt3QkFDcEQsUUFBUSxFQUFFLFFBQVE7cUJBQ25CLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztpQkFDWjthQUNGO1NBQ0YsQ0FBQztJQUNKLENBQUM7SUFFTyxLQUFLLENBQUMsYUFBYSxDQUFDLElBQWE7UUFDdkMsTUFBTSxhQUFhLEdBQUcsdUJBQXVCLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQzFELE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxhQUFhLENBQUMsVUFBVSxDQUFDLENBQUM7UUFFekUsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO1lBQ2IsTUFBTSxJQUFJLEtBQUssQ0FBQyxZQUFZLGFBQWEsQ0FBQyxVQUFVLDZEQUE2RCxDQUFDLENBQUM7UUFDckgsQ0FBQztRQUVELGtDQUFrQztRQUNsQyxJQUFJLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDO1lBQy9DLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUNqQyxDQUFDO1FBRUQsd0JBQXdCO1FBQ3hCLElBQUksQ0FBQyxZQUFZLENBQUMsZUFBZSxHQUFHLE9BQU8sQ0FBQyxFQUFFLENBQUM7UUFFL0MscUNBQXFDO1FBQ3JDLElBQUksT0FBTyxDQUFDLFNBQVMsS0FBSyxTQUFTLEVBQUUsQ0FBQztZQUNwQyxJQUFJLENBQUM7Z0JBQ0gsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUUsQ0FBQztnQkFDMUQsTUFBTSxRQUFRLEdBQUcsTUFBTSxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDO2dCQUMxQyxPQUFPLENBQUMsU0FBUyxHQUFHLFFBQVEsQ0FBQyxJQUFJLEVBQUUsSUFBSSxJQUFJLFNBQVMsQ0FBQztZQUN2RCxDQUFDO1lBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQztnQkFDZixvRUFBb0U7Z0JBQ3BFLE9BQU8sQ0FBQyxLQUFLLENBQUMsc0NBQXNDLE9BQU8sQ0FBQyxFQUFFLEdBQUcsRUFBRSxLQUFLLENBQUMsQ0FBQztZQUM1RSxDQUFDO1FBQ0gsQ0FBQztRQUVELE9BQU87WUFDTCxPQUFPLEVBQUU7Z0JBQ1A7b0JBQ0UsSUFBSSxFQUFFLE1BQU07b0JBQ1osSUFBSSxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUM7d0JBQ25CLE9BQU8sRUFBRSxJQUFJO3dCQUNiLE9BQU8sRUFBRSxlQUFlLE9BQU8sQ0FBQyxJQUFJLEtBQUssT0FBTyxDQUFDLFNBQVMsR0FBRzt3QkFDN0QsT0FBTyxFQUFFOzRCQUNQLEVBQUUsRUFBRSxPQUFPLENBQUMsRUFBRTs0QkFDZCxJQUFJLEVBQUUsT0FBTyxDQUFDLElBQUk7NEJBQ2xCLFNBQVMsRUFBRSxPQUFPLENBQUMsU0FBUzs0QkFDNUIsT0FBTyxFQUFFLE9BQU8sQ0FBQyxNQUFNO3lCQUN4QjtxQkFDRixFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7aUJBQ1o7YUFDRjtTQUNGLENBQUM7SUFDSixDQUFDO0lBRU8sS0FBSyxDQUFDLFVBQVUsQ0FBQyxJQUFhO1FBQ3BDLE1BQU0sYUFBYSxHQUFHLG9CQUFvQixDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUV2RCx5QkFBeUI7UUFDekIsSUFBSSxDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxhQUFhLENBQUMsU0FBUyxFQUFFLEtBQUssQ0FBQyxFQUFFLENBQUM7WUFDOUQsTUFBTSxJQUFJLEtBQUssQ0FBQyw4REFBOEQsQ0FBQyxDQUFDO1FBQ2xGLENBQUM7UUFFRCxJQUFJLGFBQWEsQ0FBQyxVQUFVLElBQUksQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsYUFBYSxDQUFDLFVBQVUsRUFBRSxNQUFNLENBQUMsRUFBRSxDQUFDO1lBQzVGLE1BQU0sSUFBSSxLQUFLLENBQUMsZ0VBQWdFLENBQUMsQ0FBQztRQUNwRixDQUFDO1FBRUQsNkJBQTZCO1FBQzdCLE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLENBQUM7UUFFN0QscUJBQXFCO1FBQ3JCLE1BQU0sVUFBVSxHQUFpQjtZQUMvQixFQUFFLEVBQUUsU0FBUztZQUNiLElBQUksRUFBRSxhQUFhLENBQUMsSUFBSTtZQUN4QixTQUFTLEVBQUUsU0FBUyxFQUFFLCtCQUErQjtZQUNyRCxNQUFNLEVBQUUsYUFBYSxDQUFDLE9BQU87WUFDN0IsUUFBUSxFQUFFLGFBQWEsQ0FBQyxTQUFTO1lBQ2pDLFNBQVMsRUFBRSxhQUFhLENBQUMsVUFBVTtZQUNuQyxTQUFTLEVBQUUsS0FBSztTQUNqQixDQUFDO1FBRUYsZ0RBQWdEO1FBQ2hELElBQUksQ0FBQztZQUNILE1BQU0sVUFBVSxHQUFHLElBQUksU0FBUyxDQUFDLGFBQWEsQ0FBQyxTQUFTLENBQUMsQ0FBQztZQUMxRCxNQUFNLFFBQVEsR0FBRyxNQUFNLFVBQVUsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7WUFDOUMsVUFBVSxDQUFDLFNBQVMsR0FBRyxRQUFRLENBQUMsSUFBSSxFQUFFLElBQUksSUFBSSxTQUFTLENBQUM7WUFFeEQseUJBQXlCO1lBQ3pCLElBQUksUUFBUSxDQUFDLElBQUksRUFBRSxFQUFFLElBQUksUUFBUSxDQUFDLElBQUksQ0FBQyxFQUFFLEtBQUssYUFBYSxDQUFDLE9BQU8sRUFBRSxDQUFDO2dCQUNwRSxNQUFNLElBQUksS0FBSyxDQUFDLDJDQUEyQyxRQUFRLENBQUMsSUFBSSxDQUFDLEVBQUUsU0FBUyxhQUFhLENBQUMsT0FBTyxnQkFBZ0IsQ0FBQyxDQUFDO1lBQzdILENBQUM7UUFDSCxDQUFDO1FBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQztZQUNmLE1BQU0sSUFBSSxLQUFLLENBQUMsK0JBQStCLEtBQUssWUFBWSxLQUFLLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDM0csQ0FBQztRQUVELGtCQUFrQjtRQUNsQixJQUFJLENBQUMsWUFBWSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsU0FBUyxFQUFFLFVBQVUsQ0FBQyxDQUFDO1FBQ3RELElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUVsQywrQ0FBK0M7UUFDL0MsSUFBSSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsZUFBZSxFQUFFLENBQUM7WUFDdkMsSUFBSSxDQUFDLFlBQVksQ0FBQyxlQUFlLEdBQUcsU0FBUyxDQUFDO1FBQ2hELENBQUM7UUFFRCxzQkFBc0I7UUFDdEIsSUFBSSxDQUFDO1lBQ0gsTUFBTSxJQUFJLENBQUMsaUJBQWlCLENBQUMsV0FBVyxDQUFDLFVBQVUsQ0FBQyxDQUFDO1lBQ3JELE9BQU87Z0JBQ0wsT0FBTyxFQUFFO29CQUNQO3dCQUNFLElBQUksRUFBRSxNQUFNO3dCQUNaLElBQUksRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDOzRCQUNuQixPQUFPLEVBQUUsSUFBSTs0QkFDYixPQUFPLEVBQUUsWUFBWSxhQUFhLENBQUMsSUFBSSxxQ0FBcUM7NEJBQzVFLE9BQU8sRUFBRTtnQ0FDUCxFQUFFLEVBQUUsU0FBUztnQ0FDYixJQUFJLEVBQUUsVUFBVSxDQUFDLElBQUk7Z0NBQ3JCLFNBQVMsRUFBRSxVQUFVLENBQUMsU0FBUztnQ0FDakMsT0FBTyxFQUFFLFVBQVUsQ0FBQyxNQUFNO2dDQUMxQixTQUFTLEVBQUUsU0FBUyxLQUFLLElBQUksQ0FBQyxZQUFZLENBQUMsZUFBZTs2QkFDM0Q7eUJBQ0YsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO3FCQUNaO2lCQUNGO2FBQ0YsQ0FBQztRQUNGLENBQUM7UUFBQyxPQUFPLEtBQUssRUFBRSxDQUFDO1lBQ2Ysa0NBQWtDO1lBQ2xDLE9BQU87Z0JBQ0wsT0FBTyxFQUFFO29CQUNQO3dCQUNFLElBQUksRUFBRSxNQUFNO3dCQUNaLElBQUksRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDOzRCQUNuQixPQUFPLEVBQUUsSUFBSTs0QkFDYixPQUFPLEVBQUUsWUFBWSxhQUFhLENBQUMsSUFBSSxrREFBa0Q7NEJBQ3pGLE9BQU8sRUFBRTtnQ0FDUCxFQUFFLEVBQUUsU0FBUztnQ0FDYixJQUFJLEVBQUUsVUFBVSxDQUFDLElBQUk7Z0NBQ3JCLFNBQVMsRUFBRSxVQUFVLENBQUMsU0FBUztnQ0FDL0IsT0FBTyxFQUFFLFVBQVUsQ0FBQyxNQUFNO2dDQUMxQixTQUFTLEVBQUUsU0FBUyxLQUFLLElBQUksQ0FBQyxZQUFZLENBQUMsZUFBZTs2QkFDM0Q7eUJBQ0YsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO3FCQUNaO2lCQUNGO2FBQ0YsQ0FBQztRQUNKLENBQUM7SUFDSCxDQUFDO0lBRU8sS0FBSyxDQUFDLGFBQWEsQ0FBQyxJQUFhO1FBQ3ZDLE1BQU0sYUFBYSxHQUFHLHVCQUF1QixDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUMxRCxNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsYUFBYSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBRXpFLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztZQUNiLE1BQU0sSUFBSSxLQUFLLENBQUMsWUFBWSxhQUFhLENBQUMsVUFBVSxjQUFjLENBQUMsQ0FBQztRQUN0RSxDQUFDO1FBRUQsc0NBQXNDO1FBQ3RDLE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsZUFBZSxLQUFLLGFBQWEsQ0FBQyxVQUFVLENBQUM7UUFFakYsdUJBQXVCO1FBQ3ZCLElBQUksQ0FBQyxZQUFZLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxhQUFhLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDNUQsSUFBSSxDQUFDLFlBQVksQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLGFBQWEsQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUMzRCxJQUFJLENBQUMsWUFBWSxDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQUMsYUFBYSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBRS9ELHdFQUF3RTtRQUN4RSxJQUFJLFNBQVMsRUFBRSxDQUFDO1lBQ2QsTUFBTSxpQkFBaUIsR0FBRyxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsUUFBUSxDQUFDLElBQUksRUFBRSxDQUFDLENBQUM7WUFDeEUsSUFBSSxDQUFDLFlBQVksQ0FBQyxlQUFlLEdBQUcsaUJBQWlCLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztRQUNqRyxDQUFDO1FBRUQsdUJBQXVCO1FBQ3ZCLElBQUksQ0FBQztZQUNILE1BQU0sSUFBSSxDQUFDLGlCQUFpQixDQUFDLGFBQWEsQ0FBQyxhQUFhLENBQUMsVUFBVSxDQUFDLENBQUM7WUFDckUsT0FBTztnQkFDTCxPQUFPLEVBQUU7b0JBQ1A7d0JBQ0UsSUFBSSxFQUFFLE1BQU07d0JBQ1osSUFBSSxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUM7NEJBQ25CLE9BQU8sRUFBRSxJQUFJOzRCQUNiLE9BQU8sRUFBRSxZQUFZLE9BQU8sQ0FBQyxJQUFJLDBDQUEwQzs0QkFDM0Usa0JBQWtCLEVBQUUsSUFBSSxDQUFDLFlBQVksQ0FBQyxlQUFlOzRCQUNyRCxrQkFBa0IsRUFBRSxJQUFJLENBQUMsWUFBWSxDQUFDLFFBQVEsQ0FBQyxJQUFJO3lCQUNwRCxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7cUJBQ1o7aUJBQ0Y7YUFDRixDQUFDO1FBQ0osQ0FBQztRQUFDLE9BQU8sS0FBSyxFQUFFLENBQUM7WUFDZixPQUFPO2dCQUNMLE9BQU8sRUFBRTtvQkFDUDt3QkFDRSxJQUFJLEVBQUUsTUFBTTt3QkFDWixJQUFJLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQzs0QkFDbkIsT0FBTyxFQUFFLElBQUk7NEJBQ2IsT0FBTyxFQUFFLFlBQVksT0FBTyxDQUFDLElBQUksdURBQXVEOzRCQUN4RixrQkFBa0IsRUFBRSxJQUFJLENBQUMsWUFBWSxDQUFDLGVBQWU7NEJBQ3JELGtCQUFrQixFQUFFLElBQUksQ0FBQyxZQUFZLENBQUMsUUFBUSxDQUFDLElBQUk7eUJBQ3BELEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztxQkFDWjtpQkFDRjthQUNGLENBQUM7UUFDSixDQUFDO0lBQ0gsQ0FBQztJQUVPLEtBQUssQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFhO1FBQzFDLDBCQUEwQixDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUV2QyxJQUFJLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxlQUFlLEVBQUUsQ0FBQztZQUN2QyxPQUFPO2dCQUNMLE9BQU8sRUFBRTtvQkFDUDt3QkFDRSxJQUFJLEVBQUUsTUFBTTt3QkFDWixJQUFJLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQzs0QkFDbkIsY0FBYyxFQUFFLElBQUk7NEJBQ3BCLE9BQU8sRUFBRSxnR0FBZ0c7eUJBQzFHLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztxQkFDWjtpQkFDRjthQUNGLENBQUM7UUFDSixDQUFDO1FBRUQsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsZUFBZSxDQUFDLENBQUM7UUFDbEYsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO1lBQ2IsT0FBTztnQkFDTCxPQUFPLEVBQUU7b0JBQ1A7d0JBQ0UsSUFBSSxFQUFFLE1BQU07d0JBQ1osSUFBSSxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUM7NEJBQ25CLGNBQWMsRUFBRSxJQUFJOzRCQUNwQixLQUFLLEVBQUUsc0NBQXNDO3lCQUM5QyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7cUJBQ1o7aUJBQ0Y7YUFDRixDQUFDO1FBQ0osQ0FBQztRQUVELE9BQU87WUFDTCxPQUFPLEVBQUU7Z0JBQ1A7b0JBQ0UsSUFBSSxFQUFFLE1BQU07b0JBQ1osSUFBSSxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUM7d0JBQ25CLGNBQWMsRUFBRTs0QkFDZCxFQUFFLEVBQUUsT0FBTyxDQUFDLEVBQUU7NEJBQ2QsSUFBSSxFQUFFLE9BQU8sQ0FBQyxJQUFJOzRCQUNsQixTQUFTLEVBQUUsT0FBTyxDQUFDLFNBQVM7NEJBQzVCLE9BQU8sRUFBRSxPQUFPLENBQUMsTUFBTTs0QkFDdkIsVUFBVSxFQUFFLE9BQU8sQ0FBQyxTQUFTLElBQUksS0FBSzs0QkFDdEMsY0FBYyxFQUFFLENBQUMsQ0FBQyxPQUFPLENBQUMsU0FBUzt5QkFDcEM7cUJBQ0YsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO2lCQUNaO2FBQ0Y7U0FDRixDQUFDO0lBQ0osQ0FBQztJQUVPLEtBQUssQ0FBQyxpQkFBaUIsQ0FBQyxJQUFhO1FBQzNDLE1BQU0sYUFBYSxHQUFHLDJCQUEyQixDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUM5RCxNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsYUFBYSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBRXpFLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztZQUNiLE1BQU0sSUFBSSxLQUFLLENBQUMsWUFBWSxhQUFhLENBQUMsVUFBVSxjQUFjLENBQUMsQ0FBQztRQUN0RSxDQUFDO1FBRUQsdUNBQXVDO1FBQ3ZDLEtBQUssTUFBTSxHQUFHLElBQUksSUFBSSxDQUFDLFlBQVksQ0FBQyxRQUFRLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQztZQUN0RCxHQUFHLENBQUMsU0FBUyxHQUFHLEtBQUssQ0FBQztRQUN4QixDQUFDO1FBRUQsa0JBQWtCO1FBQ2xCLE9BQU8sQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDO1FBRXpCLE9BQU87WUFDTCxPQUFPLEVBQUU7Z0JBQ1A7b0JBQ0UsSUFBSSxFQUFFLE1BQU07b0JBQ1osSUFBSSxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUM7d0JBQ25CLE9BQU8sRUFBRSxJQUFJO3dCQUNiLE9BQU8sRUFBRSxZQUFZLE9BQU8sQ0FBQyxJQUFJLGtCQUFrQjt3QkFDbkQsZUFBZSxFQUFFOzRCQUNmLEVBQUUsRUFBRSxPQUFPLENBQUMsRUFBRTs0QkFDZCxJQUFJLEVBQUUsT0FBTyxDQUFDLElBQUk7NEJBQ2xCLFNBQVMsRUFBRSxPQUFPLENBQUMsU0FBUzt5QkFDN0I7cUJBQ0YsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO2lCQUNaO2FBQ0Y7U0FDRixDQUFDO0lBQ0osQ0FBQztJQUVPLEtBQUssQ0FBQyxhQUFhLENBQUMsSUFBYTtRQUN2QyxNQUFNLGFBQWEsR0FBRyx1QkFBdUIsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDMUQsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLGFBQWEsQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUV6RSxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7WUFDYixNQUFNLElBQUksS0FBSyxDQUFDLFlBQVksYUFBYSxDQUFDLFVBQVUsY0FBYyxDQUFDLENBQUM7UUFDdEUsQ0FBQztRQUVELGtDQUFrQztRQUNsQyxJQUFJLGFBQWEsQ0FBQyxTQUFTLElBQUksQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsYUFBYSxDQUFDLFNBQVMsRUFBRSxLQUFLLENBQUMsRUFBRSxDQUFDO1lBQ3pGLE1BQU0sSUFBSSxLQUFLLENBQUMsOERBQThELENBQUMsQ0FBQztRQUNsRixDQUFDO1FBRUQsSUFBSSxhQUFhLENBQUMsVUFBVSxJQUFJLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLGFBQWEsQ0FBQyxVQUFVLEVBQUUsTUFBTSxDQUFDLEVBQUUsQ0FBQztZQUM1RixNQUFNLElBQUksS0FBSyxDQUFDLGdFQUFnRSxDQUFDLENBQUM7UUFDcEYsQ0FBQztRQUVELDBCQUEwQjtRQUMxQixJQUFJLGFBQWEsR0FBRyxLQUFLLENBQUM7UUFDMUIsSUFBSSxhQUFhLENBQUMsU0FBUyxJQUFJLGFBQWEsQ0FBQyxTQUFTLEtBQUssT0FBTyxDQUFDLFFBQVEsRUFBRSxDQUFDO1lBQzVFLE9BQU8sQ0FBQyxRQUFRLEdBQUcsYUFBYSxDQUFDLFNBQVMsQ0FBQztZQUMzQyxhQUFhLEdBQUcsSUFBSSxDQUFDO1FBQ3ZCLENBQUM7UUFFRCxJQUFJLGFBQWEsQ0FBQyxVQUFVLEtBQUssU0FBUyxJQUFJLGFBQWEsQ0FBQyxVQUFVLEtBQUssT0FBTyxDQUFDLFNBQVMsRUFBRSxDQUFDO1lBQzdGLE9BQU8sQ0FBQyxTQUFTLEdBQUcsYUFBYSxDQUFDLFVBQVUsQ0FBQztZQUM3QyxhQUFhLEdBQUcsSUFBSSxDQUFDO1FBQ3ZCLENBQUM7UUFFRCxJQUFJLENBQUMsYUFBYSxFQUFFLENBQUM7WUFDbkIsT0FBTztnQkFDTCxPQUFPLEVBQUU7b0JBQ1A7d0JBQ0UsSUFBSSxFQUFFLE1BQU07d0JBQ1osSUFBSSxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUM7NEJBQ25CLE9BQU8sRUFBRSxLQUFLOzRCQUNkLE9BQU8sRUFBRSwyQkFBMkI7eUJBQ3JDLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztxQkFDWjtpQkFDRjthQUNGLENBQUM7UUFDSixDQUFDO1FBRUQsd0NBQXdDO1FBQ3hDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUUvQiw2Q0FBNkM7UUFDN0MsSUFBSSxhQUFhLENBQUMsU0FBUyxFQUFFLENBQUM7WUFDNUIsSUFBSSxDQUFDO2dCQUNILE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFFLENBQUM7Z0JBQzFELE1BQU0sUUFBUSxHQUFHLE1BQU0sTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQztnQkFDMUMsT0FBTyxDQUFDLFNBQVMsR0FBRyxRQUFRLENBQUMsSUFBSSxFQUFFLElBQUksSUFBSSxPQUFPLENBQUMsU0FBUyxDQUFDO1lBQy9ELENBQUM7WUFBQyxPQUFPLEtBQUssRUFBRSxDQUFDO2dCQUNmLE9BQU8sQ0FBQyxLQUFLLENBQUMsa0NBQWtDLEVBQUUsS0FBSyxDQUFDLENBQUM7WUFDM0QsQ0FBQztRQUNILENBQUM7UUFFRCwwQkFBMEI7UUFDMUIsSUFBSSxDQUFDO1lBQ0gsTUFBTSxJQUFJLENBQUMsaUJBQWlCLENBQUMsYUFBYSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBQ3BELE9BQU87Z0JBQ0wsT0FBTyxFQUFFO29CQUNQO3dCQUNFLElBQUksRUFBRSxNQUFNO3dCQUNaLElBQUksRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDOzRCQUNuQixPQUFPLEVBQUUsSUFBSTs0QkFDYixPQUFPLEVBQUUsdUJBQXVCLE9BQU8sQ0FBQyxJQUFJLCtCQUErQjs0QkFDM0UsT0FBTyxFQUFFO2dDQUNQLEVBQUUsRUFBRSxPQUFPLENBQUMsRUFBRTtnQ0FDZCxJQUFJLEVBQUUsT0FBTyxDQUFDLElBQUk7Z0NBQ2xCLFNBQVMsRUFBRSxPQUFPLENBQUMsU0FBUztnQ0FDNUIsT0FBTyxFQUFFLE9BQU8sQ0FBQyxNQUFNO2dDQUN2QixjQUFjLEVBQUUsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxTQUFTOzZCQUNwQzt5QkFDRixFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7cUJBQ1o7aUJBQ0Y7YUFDRixDQUFDO1FBQ0osQ0FBQztRQUFDLE9BQU8sS0FBSyxFQUFFLENBQUM7WUFDZixPQUFPO2dCQUNMLE9BQU8sRUFBRTtvQkFDUDt3QkFDRSxJQUFJLEVBQUUsTUFBTTt3QkFDWixJQUFJLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQzs0QkFDbkIsT0FBTyxFQUFFLElBQUk7NEJBQ2IsT0FBTyxFQUFFLHVCQUF1QixPQUFPLENBQUMsSUFBSSw0Q0FBNEM7NEJBQ3hGLE9BQU8sRUFBRTtnQ0FDUCxFQUFFLEVBQUUsT0FBTyxDQUFDLEVBQUU7Z0NBQ2QsSUFBSSxFQUFFLE9BQU8sQ0FBQyxJQUFJO2dDQUNsQixTQUFTLEVBQUUsT0FBTyxDQUFDLFNBQVM7Z0NBQzVCLE9BQU8sRUFBRSxPQUFPLENBQUMsTUFBTTtnQ0FDdkIsY0FBYyxFQUFFLENBQUMsQ0FBQyxPQUFPLENBQUMsU0FBUzs2QkFDcEM7eUJBQ0YsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO3FCQUNaO2lCQUNGO2FBQ0YsQ0FBQztRQUNKLENBQUM7SUFDSCxDQUFDO0lBRUQsd0ZBQXdGO0lBQ3hGLG1FQUFtRTtJQUNuRSx3RkFBd0Y7SUFFaEYsS0FBSyxDQUFDLGlCQUFpQixDQUFDLElBQWE7UUFDM0MsTUFBTSxhQUFhLEdBQUcsc0JBQXNCLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3pELE1BQU0sTUFBTSxHQUFHLE1BQU0sSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO1FBRTVDLHVDQUF1QztRQUN2QyxNQUFNLFdBQVcsR0FBRyxFQUFFLENBQUM7UUFDdkIsSUFBSSxNQUEwQixDQUFDO1FBRS9CLElBQUksQ0FBQztZQUNILEdBQUcsQ0FBQztnQkFDRixNQUFNLE1BQU0sR0FBRyxNQUFNLE1BQU0sQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDO29CQUM3QyxLQUFLLEVBQUUsYUFBYSxDQUFDLEtBQUssSUFBSSxnQ0FBZ0M7b0JBQzlELEtBQUssRUFBRSxhQUFhLENBQUMsS0FBSyxJQUFJLEdBQUc7b0JBQ2pDLGdCQUFnQixFQUFFLElBQUk7b0JBQ3RCLE1BQU0sRUFBRSxNQUFNO2lCQUNmLENBQUMsQ0FBQztnQkFFSCxJQUFJLE1BQU0sQ0FBQyxRQUFRLEVBQUUsQ0FBQztvQkFDcEIsV0FBVyxDQUFDLElBQUksQ0FBQyxHQUFHLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQztnQkFDdkMsQ0FBQztnQkFFRCxpQ0FBaUM7Z0JBQ2pDLE1BQU0sR0FBRyxNQUFNLENBQUMsaUJBQWlCLEVBQUUsV0FBVyxDQUFDO1lBQ2pELENBQUMsUUFBUSxNQUFNLEVBQUU7WUFFakIsTUFBTSxRQUFRLEdBQUcsV0FBVyxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLENBQUM7Z0JBQzNDLEVBQUUsRUFBRSxPQUFPLENBQUMsRUFBRTtnQkFDZCxJQUFJLEVBQUUsT0FBTyxDQUFDLElBQUk7Z0JBQ2xCLFVBQVUsRUFBRSxPQUFPLENBQUMsVUFBVTtnQkFDOUIsU0FBUyxFQUFFLE9BQU8sQ0FBQyxTQUFTO2dCQUM1QixLQUFLLEVBQUUsT0FBTyxDQUFDLEtBQUssRUFBRSxLQUFLO2dCQUMzQixPQUFPLEVBQUUsT0FBTyxDQUFDLE9BQU8sRUFBRSxLQUFLO2dCQUMvQixXQUFXLEVBQUUsT0FBTyxDQUFDLFdBQVc7YUFDakMsQ0FBQyxDQUFDLENBQUM7WUFFSixPQUFPO2dCQUNMLE9BQU8sRUFBRTtvQkFDUDt3QkFDRSxJQUFJLEVBQUUsTUFBTTt3QkFDWixJQUFJLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxRQUFRLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztxQkFDeEM7aUJBQ0Y7YUFDRixDQUFDO1FBQ0osQ0FBQztRQUFDLE9BQU8sS0FBVSxFQUFFLENBQUM7WUFDcEIsd0JBQXdCO1lBQ3hCLE9BQU8sQ0FBQyxLQUFLLENBQUMsa0JBQWtCLEVBQUUsS0FBSyxDQUFDLENBQUM7WUFDekMsT0FBTyxDQUFDLEtBQUssQ0FBQyxnQkFBZ0IsRUFBRTtnQkFDOUIsT0FBTyxFQUFFLEtBQUssQ0FBQyxPQUFPO2dCQUN0QixJQUFJLEVBQUUsS0FBSyxDQUFDLElBQUk7Z0JBQ2hCLElBQUksRUFBRSxLQUFLLENBQUMsSUFBSTtnQkFDaEIsVUFBVSxFQUFFLEtBQUssQ0FBQyxVQUFVO2FBQzdCLENBQUMsQ0FBQztZQUVILHlDQUF5QztZQUN6QyxNQUFNLGFBQWEsR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxlQUFnQixDQUFDLENBQUM7WUFDekYsT0FBTyxDQUFDLEtBQUssQ0FBQyxpQkFBaUIsRUFBRTtnQkFDL0IsRUFBRSxFQUFFLGFBQWEsRUFBRSxFQUFFO2dCQUNyQixJQUFJLEVBQUUsYUFBYSxFQUFFLElBQUk7Z0JBQ3pCLE1BQU0sRUFBRSxhQUFhLEVBQUUsTUFBTTtnQkFDN0IsUUFBUSxFQUFFLGFBQWEsRUFBRSxRQUFRLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsU0FBUzthQUN0RCxDQUFDLENBQUM7WUFFSCxNQUFNLEtBQUssQ0FBQztRQUNkLENBQUM7SUFDSCxDQUFDO0lBRU8sNEJBQTRCLENBQUMsSUFBWTtRQUMvQyxnRUFBZ0U7UUFDaEUsSUFBSSxTQUFTLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQywwQkFBMEIsRUFBRSxTQUFTLENBQUMsQ0FBQztRQUVwRSxtRUFBbUU7UUFDbkUsU0FBUyxHQUFHLFNBQVMsQ0FBQyxPQUFPLENBQUMsa0JBQWtCLEVBQUUsTUFBTSxDQUFDLENBQUM7UUFFMUQsK0NBQStDO1FBQy9DLFNBQVMsR0FBRyxTQUFTLENBQUMsT0FBTyxDQUFDLGNBQWMsRUFBRSxNQUFNLENBQUMsQ0FBQztRQUV0RCxnRkFBZ0Y7UUFDaEYsU0FBUyxHQUFHLFNBQVMsQ0FBQyxPQUFPLENBQUMsbUJBQW1CLEVBQUUsTUFBTSxDQUFDLENBQUM7UUFFM0QseUNBQXlDO1FBQ3pDLFNBQVMsR0FBRyxTQUFTLENBQUMsT0FBTyxDQUFDLGNBQWMsRUFBRSxJQUFJLENBQUMsQ0FBQztRQUVwRCxvREFBb0Q7UUFDcEQsU0FBUyxHQUFHLFNBQVMsQ0FBQyxPQUFPLENBQUMsYUFBYSxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBRWpELE9BQU8sU0FBUyxDQUFDO0lBQ25CLENBQUM7SUFFTyxLQUFLLENBQUMsdUJBQXVCLENBQUMsSUFBWSxFQUFFLE1BQWlCO1FBQ25FLHdDQUF3QztRQUN4QyxNQUFNLE1BQU0sR0FBRyxNQUFNLE1BQU0sQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQzNDLE1BQU0sV0FBVyxHQUFHLE1BQU0sQ0FBQyxPQUFPLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxJQUFJLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUUvRSxPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsU0FBUyxFQUFFLENBQUMsS0FBSyxFQUFFLFFBQVEsRUFBRSxFQUFFO1lBQ2pELHdCQUF3QjtZQUN4QixJQUFJLElBQUksR0FBRyxXQUFXLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQzlCLENBQUMsQ0FBQyxJQUFJLEVBQUUsV0FBVyxFQUFFLEtBQUssUUFBUSxDQUFDLFdBQVcsRUFBRTtnQkFDaEQsQ0FBQyxDQUFDLFNBQVMsRUFBRSxXQUFXLEVBQUUsS0FBSyxRQUFRLENBQUMsV0FBVyxFQUFFO2dCQUNyRCxDQUFDLENBQUMsT0FBTyxFQUFFLFlBQVksRUFBRSxXQUFXLEVBQUUsS0FBSyxRQUFRLENBQUMsV0FBVyxFQUFFLENBQ2xFLENBQUM7WUFFRixnRUFBZ0U7WUFDaEUsSUFBSSxDQUFDLElBQUksSUFBSSxRQUFRLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDO2dCQUNqQyxNQUFNLElBQUksR0FBRyxJQUFJLElBQUksQ0FBQyxXQUFXLEVBQUU7b0JBQ2pDLElBQUksRUFBRSxDQUFDLE1BQU0sRUFBRSxXQUFXLEVBQUUsc0JBQXNCLENBQUM7b0JBQ25ELFNBQVMsRUFBRSxHQUFHLEVBQUUsMENBQTBDO29CQUMxRCxZQUFZLEVBQUUsSUFBSTtpQkFDbkIsQ0FBQyxDQUFDO2dCQUVILE1BQU0sWUFBWSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUM7Z0JBQzNDLElBQUksWUFBWSxDQUFDLE1BQU0sR0FBRyxDQUFDLElBQUksWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQU0sR0FBRyxHQUFHLEVBQUUsQ0FBQztvQkFDNUQsSUFBSSxHQUFHLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7Z0JBQzlCLENBQUM7WUFDSCxDQUFDO1lBRUQsT0FBTyxJQUFJLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxLQUFLLElBQUksQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDO1FBQzVDLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVPLEtBQUssQ0FBQyxnQkFBZ0IsQ0FBQyxhQUFxQixFQUFFLE1BQWlCO1FBQ3JFLHNFQUFzRTtRQUN0RSxJQUFJLGlCQUFpQixDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsRUFBRSxDQUFDO1lBQzFDLE9BQU8sYUFBYSxDQUFDO1FBQ3ZCLENBQUM7UUFFRCw4QkFBOEI7UUFDOUIsTUFBTSxTQUFTLEdBQUcsYUFBYSxDQUFDLE9BQU8sQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFFbEQsOEJBQThCO1FBQzlCLE1BQU0sY0FBYyxHQUFHLE1BQU0sTUFBTSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUM7WUFDckQsS0FBSyxFQUFFLGdDQUFnQztZQUN2QyxLQUFLLEVBQUUsSUFBSTtTQUNaLENBQUMsQ0FBQztRQUVILE1BQU0sT0FBTyxHQUFHLGNBQWMsQ0FBQyxRQUFRLEVBQUUsSUFBSSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQ2pELEVBQUUsQ0FBQyxJQUFJLEVBQUUsV0FBVyxFQUFFLEtBQUssU0FBUyxDQUFDLFdBQVcsRUFBRSxDQUNuRCxDQUFDO1FBRUYsSUFBSSxPQUFPLEVBQUUsRUFBRTtZQUFFLE9BQU8sT0FBTyxDQUFDLEVBQUUsQ0FBQztRQUVuQyw0QkFBNEI7UUFDNUIsTUFBTSxXQUFXLEdBQUcsTUFBTSxNQUFNLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUNoRCxNQUFNLFdBQVcsR0FBRyxXQUFXLENBQUMsT0FBTyxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sSUFBSSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsSUFBSSxFQUFFLENBQUM7UUFFcEYsbURBQW1EO1FBQ25ELE1BQU0sSUFBSSxHQUFHLElBQUksSUFBSSxDQUFDLFdBQVcsRUFBRTtZQUNqQyxJQUFJLEVBQUUsQ0FBQyxNQUFNLEVBQUUsV0FBVyxFQUFFLHNCQUFzQixDQUFDO1lBQ25ELFNBQVMsRUFBRSxHQUFHLEVBQUUsd0NBQXdDO1lBQ3hELFlBQVksRUFBRSxJQUFJO1NBQ25CLENBQUMsQ0FBQztRQUVILE1BQU0sWUFBWSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDNUMsSUFBSSxZQUFZLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDO1lBQzVCLE1BQU0sSUFBSSxHQUFHLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7WUFDbEMsSUFBSSxJQUFJLENBQUMsRUFBRSxFQUFFLENBQUM7Z0JBQ1osa0NBQWtDO2dCQUNsQyxNQUFNLFFBQVEsR0FBRyxNQUFNLE1BQU0sQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLEVBQUUsS0FBSyxFQUFFLElBQUksQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO2dCQUNyRSxPQUFPLFFBQVEsQ0FBQyxPQUFPLEVBQUUsRUFBRSxJQUFJLGFBQWEsQ0FBQztZQUMvQyxDQUFDO1FBQ0gsQ0FBQztRQUVELDZCQUE2QjtRQUM3QixPQUFPLGFBQWEsQ0FBQztJQUN2QixDQUFDO0lBR08sS0FBSyxDQUFDLGdCQUFnQixDQUFDLElBQWE7UUFDMUMsTUFBTSxhQUFhLEdBQUcscUJBQXFCLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3hELE1BQU0sTUFBTSxHQUFHLE1BQU0sSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO1FBRTVDLHNFQUFzRTtRQUN0RSxNQUFNLFNBQVMsR0FBRyxNQUFNLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxhQUFhLENBQUMsT0FBTyxFQUFFLE1BQU0sQ0FBQyxDQUFDO1FBRTdFLG1EQUFtRDtRQUNuRCxJQUFJLGFBQWEsR0FBRyxJQUFJLENBQUMsNEJBQTRCLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBRTFFLGlFQUFpRTtRQUNqRSxhQUFhLEdBQUcsTUFBTSxJQUFJLENBQUMsdUJBQXVCLENBQUMsYUFBYSxFQUFFLE1BQU0sQ0FBQyxDQUFDO1FBRTFFLDJCQUEyQjtRQUMzQixNQUFNLE1BQU0sR0FBRyxNQUFNLE1BQU0sQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDO1lBQzNDLE9BQU8sRUFBRSxTQUFTO1lBQ2xCLElBQUksRUFBRSxhQUFhO1lBQ25CLFNBQVMsRUFBRSxhQUFhLENBQUMsU0FBUztZQUNsQyxNQUFNLEVBQUUsSUFBSTtTQUNiLENBQUMsQ0FBQztRQUVILE9BQU87WUFDTCxPQUFPLEVBQUU7Z0JBQ1A7b0JBQ0UsSUFBSSxFQUFFLE1BQU07b0JBQ1osSUFBSSxFQUFFLHVDQUF1QyxNQUFNLENBQUMsT0FBTyxnQkFBZ0IsTUFBTSxDQUFDLEVBQUUsRUFBRTtpQkFDdkY7YUFDRjtTQUNGLENBQUM7SUFDSixDQUFDO0lBRU8sS0FBSyxDQUFDLHNCQUFzQixDQUFDLElBQWE7UUFDaEQsTUFBTSxhQUFhLEdBQUcsMkJBQTJCLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQzlELE1BQU0sTUFBTSxHQUFHLE1BQU0sSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO1FBRTVDLE1BQU0sTUFBTSxHQUFHLE1BQU0sTUFBTSxDQUFDLGFBQWEsQ0FBQyxPQUFPLENBQUM7WUFDaEQsT0FBTyxFQUFFLGFBQWEsQ0FBQyxPQUFPO1lBQzlCLEtBQUssRUFBRSxhQUFhLENBQUMsS0FBSyxJQUFJLEdBQUc7U0FDbEMsQ0FBQyxDQUFDO1FBRUgsTUFBTSxRQUFRLEdBQUcsTUFBTSxDQUFDLFFBQVEsRUFBRSxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1lBQzVDLElBQUksRUFBRSxHQUFHLENBQUMsSUFBSTtZQUNkLElBQUksRUFBRSxHQUFHLENBQUMsSUFBSTtZQUNkLEVBQUUsRUFBRSxHQUFHLENBQUMsRUFBRTtZQUNWLFNBQVMsRUFBRSxHQUFHLENBQUMsU0FBUztZQUN4QixXQUFXLEVBQUUsR0FBRyxDQUFDLFdBQVc7WUFDNUIsU0FBUyxFQUFFLEdBQUcsQ0FBQyxTQUFTLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztnQkFDbEMsSUFBSSxFQUFFLENBQUMsQ0FBQyxJQUFJO2dCQUNaLEtBQUssRUFBRSxDQUFDLENBQUMsS0FBSztnQkFDZCxLQUFLLEVBQUUsQ0FBQyxDQUFDLEtBQUs7YUFDZixDQUFDLENBQUM7U0FDSixDQUFDLENBQUMsSUFBSSxFQUFFLENBQUM7UUFFVixPQUFPO1lBQ0wsT0FBTyxFQUFFO2dCQUNQO29CQUNFLElBQUksRUFBRSxNQUFNO29CQUNaLElBQUksRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLFFBQVEsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO2lCQUN4QzthQUNGO1NBQ0YsQ0FBQztJQUNKLENBQUM7SUFFTyxLQUFLLENBQUMsZ0JBQWdCLENBQUMsSUFBYTtRQUMxQyxNQUFNLGFBQWEsR0FBRyxxQkFBcUIsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDeEQsTUFBTSxNQUFNLEdBQUcsTUFBTSxJQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7UUFFNUMsTUFBTSxNQUFNLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQztZQUN6QixPQUFPLEVBQUUsYUFBYSxDQUFDLE9BQU87WUFDOUIsU0FBUyxFQUFFLGFBQWEsQ0FBQyxTQUFTO1lBQ2xDLElBQUksRUFBRSxhQUFhLENBQUMsSUFBSTtTQUN6QixDQUFDLENBQUM7UUFFSCxPQUFPO1lBQ0wsT0FBTyxFQUFFO2dCQUNQO29CQUNFLElBQUksRUFBRSxNQUFNO29CQUNaLElBQUksRUFBRSxhQUFhLGFBQWEsQ0FBQyxJQUFJLHNCQUFzQjtpQkFDNUQ7YUFDRjtTQUNGLENBQUM7SUFDSixDQUFDO0lBRU8sS0FBSyxDQUFDLGNBQWMsQ0FBQyxJQUFhO1FBQ3hDLE1BQU0sYUFBYSxHQUFHLG1CQUFtQixDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUN0RCxNQUFNLE1BQU0sR0FBRyxNQUFNLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQztRQUU1QyxNQUFNLE1BQU0sR0FBRyxNQUFNLE1BQU0sQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDO1lBQ3JDLEtBQUssRUFBRSxhQUFhLENBQUMsS0FBSyxJQUFJLEdBQUc7U0FDbEMsQ0FBQyxDQUFDO1FBRUgsTUFBTSxLQUFLLEdBQUcsTUFBTSxDQUFDLE9BQU8sRUFBRSxNQUFNLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQztZQUN2RixFQUFFLEVBQUUsSUFBSSxDQUFDLEVBQUU7WUFDWCxJQUFJLEVBQUUsSUFBSSxDQUFDLElBQUk7WUFDZixTQUFTLEVBQUUsSUFBSSxDQUFDLFNBQVM7WUFDekIsWUFBWSxFQUFFLElBQUksQ0FBQyxPQUFPLEVBQUUsWUFBWTtZQUN4QyxLQUFLLEVBQUUsSUFBSSxDQUFDLE9BQU8sRUFBRSxLQUFLO1lBQzFCLFFBQVEsRUFBRSxJQUFJLENBQUMsUUFBUTtZQUN2QixRQUFRLEVBQUUsSUFBSSxDQUFDLFFBQVE7WUFDdkIsV0FBVyxFQUFFLElBQUksQ0FBQyxPQUFPLEVBQUUsV0FBVztZQUN0QyxZQUFZLEVBQUUsSUFBSSxDQUFDLE9BQU8sRUFBRSxZQUFZO1NBQ3pDLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUVWLE9BQU87WUFDTCxPQUFPLEVBQUU7Z0JBQ1A7b0JBQ0UsSUFBSSxFQUFFLE1BQU07b0JBQ1osSUFBSSxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7aUJBQ3JDO2FBQ0Y7U0FDRixDQUFDO0lBQ0osQ0FBQztJQUVPLEtBQUssQ0FBQyxrQkFBa0IsQ0FBQyxJQUFhO1FBQzVDLE1BQU0sYUFBYSxHQUFHLHVCQUF1QixDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUMxRCxNQUFNLE1BQU0sR0FBRyxNQUFNLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQztRQUU1QyxNQUFNLE1BQU0sR0FBRyxNQUFNLE1BQU0sQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQzNDLE1BQU0sVUFBVSxHQUFHLGFBQWEsQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7UUFFcEQsd0JBQXdCO1FBQ3hCLElBQUksSUFBSSxHQUFHLE1BQU0sQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQ2xDLENBQUMsQ0FBQyxDQUFDLE9BQU8sSUFBSSxDQUNaLENBQUMsQ0FBQyxJQUFJLEVBQUUsV0FBVyxFQUFFLENBQUMsUUFBUSxDQUFDLFVBQVUsQ0FBQztZQUMxQyxDQUFDLENBQUMsU0FBUyxFQUFFLFdBQVcsRUFBRSxDQUFDLFFBQVEsQ0FBQyxVQUFVLENBQUM7WUFDL0MsQ0FBQyxDQUFDLE9BQU8sRUFBRSxZQUFZLEVBQUUsV0FBVyxFQUFFLENBQUMsUUFBUSxDQUFDLFVBQVUsQ0FBQyxDQUM1RCxDQUNGLENBQUM7UUFFRix3Q0FBd0M7UUFDeEMsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDO1lBQ1YsTUFBTSxXQUFXLEdBQUcsTUFBTSxDQUFDLE9BQU8sRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLElBQUksQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLElBQUksRUFBRSxDQUFDO1lBRS9FLGdDQUFnQztZQUNoQyxNQUFNLGVBQWUsR0FBRyxXQUFXLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztnQkFDNUMsR0FBRyxDQUFDO2dCQUNKLGVBQWUsRUFBRTtvQkFDZixDQUFDLENBQUMsSUFBSTtvQkFDTixDQUFDLENBQUMsU0FBUztvQkFDWCxDQUFDLENBQUMsT0FBTyxFQUFFLFlBQVk7b0JBQ3ZCLENBQUMsQ0FBQyxPQUFPLEVBQUUsVUFBVTtvQkFDckIsQ0FBQyxDQUFDLE9BQU8sRUFBRSxTQUFTO2lCQUNyQixDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDO2FBQzVCLENBQUMsQ0FBQyxDQUFDO1lBRUosa0NBQWtDO1lBQ2xDLE1BQU0sSUFBSSxHQUFHLElBQUksSUFBSSxDQUFDLGVBQWUsRUFBRTtnQkFDckMsSUFBSSxFQUFFLENBQUMsaUJBQWlCLENBQUM7Z0JBQ3pCLFNBQVMsRUFBRSxHQUFHLEVBQUUsa0VBQWtFO2dCQUNsRixZQUFZLEVBQUUsSUFBSTthQUNuQixDQUFDLENBQUM7WUFFSCxNQUFNLFlBQVksR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUVyRCxJQUFJLFlBQVksQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7Z0JBQzVCLElBQUksR0FBRyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO1lBQzlCLENBQUM7UUFDSCxDQUFDO1FBRUQsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDO1lBQ1YsTUFBTSxJQUFJLEtBQUssQ0FBQyw2QkFBNkIsYUFBYSxDQUFDLElBQUksRUFBRSxDQUFDLENBQUM7UUFDckUsQ0FBQztRQUVELE9BQU87WUFDTCxPQUFPLEVBQUU7Z0JBQ1A7b0JBQ0UsSUFBSSxFQUFFLE1BQU07b0JBQ1osSUFBSSxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUM7d0JBQ25CLEVBQUUsRUFBRSxJQUFJLENBQUMsRUFBRTt3QkFDWCxJQUFJLEVBQUUsSUFBSSxDQUFDLElBQUk7d0JBQ2YsU0FBUyxFQUFFLElBQUksQ0FBQyxTQUFTO3dCQUN6QixZQUFZLEVBQUUsSUFBSSxDQUFDLE9BQU8sRUFBRSxZQUFZO3dCQUN4QyxLQUFLLEVBQUUsSUFBSSxDQUFDLE9BQU8sRUFBRSxLQUFLO3dCQUMxQixRQUFRLEVBQUUsSUFBSSxDQUFDLFFBQVE7d0JBQ3ZCLFFBQVEsRUFBRSxJQUFJLENBQUMsUUFBUTtxQkFDeEIsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO2lCQUNaO2FBQ0Y7U0FDRixDQUFDO0lBQ0osQ0FBQztJQUVPLEtBQUssQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFhO1FBQzFDLE1BQU0sYUFBYSxHQUFHLHFCQUFxQixDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUN4RCxNQUFNLE1BQU0sR0FBRyxNQUFNLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQztRQUU1QyxNQUFNLE1BQU0sR0FBRyxNQUFNLE1BQU0sQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDO1lBQ3JDLElBQUksRUFBRSxhQUFhLENBQUMsT0FBTztTQUM1QixDQUFDLENBQUM7UUFFSCxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksRUFBRSxDQUFDO1lBQ2pCLE1BQU0sSUFBSSxLQUFLLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztRQUNwQyxDQUFDO1FBRUQsT0FBTztZQUNMLE9BQU8sRUFBRTtnQkFDUDtvQkFDRSxJQUFJLEVBQUUsTUFBTTtvQkFDWixJQUFJLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQzt3QkFDbkIsRUFBRSxFQUFFLE1BQU0sQ0FBQyxJQUFJLENBQUMsRUFBRTt3QkFDbEIsSUFBSSxFQUFFLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSTt3QkFDdEIsU0FBUyxFQUFFLE1BQU0sQ0FBQyxJQUFJLENBQUMsU0FBUzt3QkFDaEMsWUFBWSxFQUFFLE1BQU0sQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLFlBQVk7d0JBQy9DLEtBQUssRUFBRSxNQUFNLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxLQUFLO3dCQUNqQyxLQUFLLEVBQUUsTUFBTSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsS0FBSzt3QkFDakMsS0FBSyxFQUFFLE1BQU0sQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLEtBQUs7d0JBQ2pDLFdBQVcsRUFBRSxNQUFNLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxXQUFXO3dCQUM3QyxZQUFZLEVBQUUsTUFBTSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsWUFBWTt3QkFDL0MsUUFBUSxFQUFFLE1BQU0sQ0FBQyxJQUFJLENBQUMsUUFBUTt3QkFDOUIsUUFBUSxFQUFFLE1BQU0sQ0FBQyxJQUFJLENBQUMsUUFBUTt3QkFDOUIsTUFBTSxFQUFFLE1BQU0sQ0FBQyxJQUFJLENBQUMsTUFBTTt3QkFDMUIsUUFBUSxFQUFFLE1BQU0sQ0FBQyxJQUFJLENBQUMsRUFBRTt3QkFDeEIsTUFBTSxFQUFFLE1BQU0sQ0FBQyxJQUFJLENBQUMsTUFBTTtxQkFDM0IsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO2lCQUNaO2FBQ0Y7U0FDRixDQUFDO0lBQ0osQ0FBQztJQUVPLEtBQUssQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFhO1FBQzFDLE1BQU0sYUFBYSxHQUFHLHFCQUFxQixDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUN4RCxNQUFNLE1BQU0sR0FBRyxNQUFNLElBQUksQ0FBQyxtQkFBbUIsRUFBRSxDQUFDO1FBRWhELE1BQU0sTUFBTSxHQUFHLE1BQU0sTUFBTSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUM7WUFDdkMsS0FBSyxFQUFFLGFBQWEsQ0FBQyxLQUFLO1lBQzFCLEtBQUssRUFBRSxhQUFhLENBQUMsS0FBSyxJQUFJLEVBQUU7WUFDaEMsSUFBSSxFQUFFLGFBQWEsQ0FBQyxJQUFJLElBQUksQ0FBQztTQUM5QixDQUFDLENBQUM7UUFFSCxNQUFNLEtBQUssR0FBRyxNQUFNLENBQUMsS0FBSyxFQUFFLE9BQU8sRUFBRSxHQUFHLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1lBQ2hELEVBQUUsRUFBRSxJQUFJLENBQUMsRUFBRTtZQUNYLElBQUksRUFBRSxJQUFJLENBQUMsSUFBSTtZQUNmLEtBQUssRUFBRSxJQUFJLENBQUMsS0FBSztZQUNqQixRQUFRLEVBQUUsSUFBSSxDQUFDLFFBQVE7WUFDdkIsSUFBSSxFQUFFLElBQUksQ0FBQyxJQUFJO1lBQ2YsR0FBRyxFQUFFLElBQUksQ0FBQyxXQUFXO1lBQ3JCLElBQUksRUFBRSxJQUFJLENBQUMsSUFBSTtZQUNmLE9BQU8sRUFBRSxJQUFJLENBQUMsT0FBTztZQUNyQixRQUFRLEVBQUUsSUFBSSxDQUFDLFFBQVE7WUFDdkIsT0FBTyxFQUFFLElBQUksQ0FBQyxPQUFPLEVBQUUsU0FBUyxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUM7U0FDekMsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDO1FBRVYsT0FBTztZQUNMLE9BQU8sRUFBRTtnQkFDUDtvQkFDRSxJQUFJLEVBQUUsTUFBTTtvQkFDWixJQUFJLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQzt3QkFDbkIsS0FBSyxFQUFFLE1BQU0sQ0FBQyxLQUFLLEVBQUUsS0FBSyxJQUFJLENBQUM7d0JBQy9CLFVBQVUsRUFBRSxNQUFNLENBQUMsS0FBSyxFQUFFLFVBQVU7d0JBQ3BDLEtBQUssRUFBRSxLQUFLO3FCQUNiLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztpQkFDWjthQUNGO1NBQ0YsQ0FBQztJQUNKLENBQUM7SUFFTyxLQUFLLENBQUMsbUJBQW1CLENBQUMsSUFBYTtRQUM3QyxNQUFNLGFBQWEsR0FBRyx3QkFBd0IsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDM0QsTUFBTSxNQUFNLEdBQUcsTUFBTSxJQUFJLENBQUMsbUJBQW1CLEVBQUUsQ0FBQztRQUVoRCxNQUFNLE1BQU0sR0FBRyxNQUFNLE1BQU0sQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDO1lBQzFDLEtBQUssRUFBRSxhQUFhLENBQUMsS0FBSztZQUMxQixLQUFLLEVBQUUsYUFBYSxDQUFDLEtBQUssSUFBSSxFQUFFO1lBQ2hDLElBQUksRUFBRSxhQUFhLENBQUMsSUFBSSxJQUFJLENBQUM7U0FDOUIsQ0FBQyxDQUFDO1FBRUgsTUFBTSxRQUFRLEdBQUcsTUFBTSxDQUFDLFFBQVEsRUFBRSxPQUFPLEVBQUUsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQztZQUNyRCxJQUFJLEVBQUUsR0FBRyxDQUFDLElBQUk7WUFDZCxJQUFJLEVBQUUsR0FBRyxDQUFDLElBQUk7WUFDZCxPQUFPLEVBQUUsR0FBRyxDQUFDLE9BQU8sRUFBRSxJQUFJO1lBQzFCLFVBQVUsRUFBRSxHQUFHLENBQUMsT0FBTyxFQUFFLEVBQUU7WUFDM0IsU0FBUyxFQUFFLEdBQUcsQ0FBQyxFQUFFO1lBQ2pCLFNBQVMsRUFBRSxHQUFHLENBQUMsU0FBUztTQUN6QixDQUFDLENBQUMsSUFBSSxFQUFFLENBQUM7UUFFVixPQUFPO1lBQ0wsT0FBTyxFQUFFO2dCQUNQO29CQUNFLElBQUksRUFBRSxNQUFNO29CQUNaLElBQUksRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDO3dCQUNuQixLQUFLLEVBQUUsTUFBTSxDQUFDLFFBQVEsRUFBRSxLQUFLLElBQUksQ0FBQzt3QkFDbEMsVUFBVSxFQUFFLE1BQU0sQ0FBQyxRQUFRLEVBQUUsVUFBVTt3QkFDdkMsUUFBUSxFQUFFLFFBQVE7cUJBQ25CLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztpQkFDWjthQUNGO1NBQ0YsQ0FBQztJQUNKLENBQUM7SUFFTyxLQUFLLENBQUMsaUJBQWlCLENBQUMsSUFBYTtRQUMzQyxNQUFNLGFBQWEsR0FBRyxzQkFBc0IsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDekQsTUFBTSxNQUFNLEdBQUcsTUFBTSxJQUFJLENBQUMsbUJBQW1CLEVBQUUsQ0FBQztRQUVoRCxJQUFJLEtBQUssR0FBRyxVQUFVLGFBQWEsQ0FBQyxPQUFPLEdBQUcsQ0FBQztRQUMvQyxJQUFJLGFBQWEsQ0FBQyxLQUFLLEVBQUUsQ0FBQztZQUN4QixLQUFLLElBQUksSUFBSSxhQUFhLENBQUMsS0FBSyxFQUFFLENBQUM7UUFDckMsQ0FBQztRQUVELE1BQU0sTUFBTSxHQUFHLE1BQU0sTUFBTSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUM7WUFDMUMsS0FBSyxFQUFFLEtBQUs7WUFDWixLQUFLLEVBQUUsYUFBYSxDQUFDLEtBQUssSUFBSSxFQUFFO1NBQ2pDLENBQUMsQ0FBQztRQUVILE1BQU0sUUFBUSxHQUFHLE1BQU0sQ0FBQyxRQUFRLEVBQUUsT0FBTyxFQUFFLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUM7WUFDckQsSUFBSSxFQUFFLEdBQUcsQ0FBQyxJQUFJO1lBQ2QsT0FBTyxFQUFFLEdBQUcsQ0FBQyxPQUFPLEVBQUUsSUFBSTtZQUMxQixVQUFVLEVBQUUsR0FBRyxDQUFDLE9BQU8sRUFBRSxFQUFFO1lBQzNCLFNBQVMsRUFBRSxHQUFHLENBQUMsRUFBRTtZQUNqQixTQUFTLEVBQUUsR0FBRyxDQUFDLFNBQVM7U0FDekIsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDO1FBRVYsT0FBTztZQUNMLE9BQU8sRUFBRTtnQkFDUDtvQkFDRSxJQUFJLEVBQUUsTUFBTTtvQkFDWixJQUFJLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQzt3QkFDbkIsS0FBSyxFQUFFLE1BQU0sQ0FBQyxRQUFRLEVBQUUsS0FBSyxJQUFJLENBQUM7d0JBQ2xDLFFBQVEsRUFBRSxRQUFRO3FCQUNuQixFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7aUJBQ1o7YUFDRjtTQUNGLENBQUM7SUFDSixDQUFDO0lBRU8sS0FBSyxDQUFDLHNCQUFzQixDQUFDLElBQWE7UUFDaEQsTUFBTSxhQUFhLEdBQUcsMkJBQTJCLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQzlELE1BQU0sTUFBTSxHQUFHLE1BQU0sSUFBSSxDQUFDLG1CQUFtQixFQUFFLENBQUM7UUFFaEQsSUFBSSxLQUFLLEdBQUcsU0FBUyxhQUFhLENBQUMsU0FBUyxXQUFXLGFBQWEsQ0FBQyxPQUFPLEVBQUUsQ0FBQztRQUMvRSxJQUFJLGFBQWEsQ0FBQyxLQUFLLEVBQUUsQ0FBQztZQUN4QixLQUFLLElBQUksSUFBSSxhQUFhLENBQUMsS0FBSyxFQUFFLENBQUM7UUFDckMsQ0FBQztRQUVELE1BQU0sTUFBTSxHQUFHLE1BQU0sTUFBTSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUM7WUFDMUMsS0FBSyxFQUFFLEtBQUs7WUFDWixLQUFLLEVBQUUsYUFBYSxDQUFDLEtBQUssSUFBSSxFQUFFO1NBQ2pDLENBQUMsQ0FBQztRQUVILE1BQU0sUUFBUSxHQUFHLE1BQU0sQ0FBQyxRQUFRLEVBQUUsT0FBTyxFQUFFLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUM7WUFDckQsSUFBSSxFQUFFLEdBQUcsQ0FBQyxJQUFJO1lBQ2QsSUFBSSxFQUFFLEdBQUcsQ0FBQyxJQUFJO1lBQ2QsT0FBTyxFQUFFLEdBQUcsQ0FBQyxPQUFPLEVBQUUsSUFBSTtZQUMxQixVQUFVLEVBQUUsR0FBRyxDQUFDLE9BQU8sRUFBRSxFQUFFO1lBQzNCLFNBQVMsRUFBRSxHQUFHLENBQUMsRUFBRTtZQUNqQixTQUFTLEVBQUUsR0FBRyxDQUFDLFNBQVM7U0FDekIsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDO1FBRVYsT0FBTztZQUNMLE9BQU8sRUFBRTtnQkFDUDtvQkFDRSxJQUFJLEVBQUUsTUFBTTtvQkFDWixJQUFJLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQzt3QkFDbkIsS0FBSyxFQUFFLE1BQU0sQ0FBQyxRQUFRLEVBQUUsS0FBSyxJQUFJLENBQUM7d0JBQ2xDLFVBQVUsRUFBRTs0QkFDVixJQUFJLEVBQUUsYUFBYSxDQUFDLFNBQVM7NEJBQzdCLEVBQUUsRUFBRSxhQUFhLENBQUMsT0FBTzt5QkFDMUI7d0JBQ0QsUUFBUSxFQUFFLFFBQVE7cUJBQ25CLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztpQkFDWjthQUNGO1NBQ0YsQ0FBQztJQUNKLENBQUM7SUFFTyxLQUFLLENBQUMsZUFBZSxDQUFDLElBQWE7UUFDekMsTUFBTSxhQUFhLEdBQUcsb0JBQW9CLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3ZELE1BQU0sTUFBTSxHQUFHLE1BQU0sSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO1FBRTVDLE1BQU0sTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUM7WUFDcEIsT0FBTyxFQUFFLGFBQWEsQ0FBQyxPQUFPO1lBQzlCLFNBQVMsRUFBRSxhQUFhLENBQUMsU0FBUztTQUNuQyxDQUFDLENBQUM7UUFFSCxPQUFPO1lBQ0wsT0FBTyxFQUFFO2dCQUNQO29CQUNFLElBQUksRUFBRSxNQUFNO29CQUNaLElBQUksRUFBRSw2QkFBNkI7aUJBQ3BDO2FBQ0Y7U0FDRixDQUFDO0lBQ0osQ0FBQztJQUVPLEtBQUssQ0FBQyxpQkFBaUIsQ0FBQyxJQUFhO1FBQzNDLE1BQU0sYUFBYSxHQUFHLHNCQUFzQixDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUN6RCxNQUFNLE1BQU0sR0FBRyxNQUFNLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQztRQUU1QyxNQUFNLE1BQU0sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDO1lBQ3ZCLE9BQU8sRUFBRSxhQUFhLENBQUMsT0FBTztZQUM5QixTQUFTLEVBQUUsYUFBYSxDQUFDLFNBQVM7U0FDbkMsQ0FBQyxDQUFDO1FBRUgsT0FBTztZQUNMLE9BQU8sRUFBRTtnQkFDUDtvQkFDRSxJQUFJLEVBQUUsTUFBTTtvQkFDWixJQUFJLEVBQUUsK0JBQStCO2lCQUN0QzthQUNGO1NBQ0YsQ0FBQztJQUNKLENBQUM7SUFFTyxLQUFLLENBQUMsa0JBQWtCLENBQUMsSUFBYTtRQUM1QyxNQUFNLGFBQWEsR0FBRyx1QkFBdUIsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDMUQsTUFBTSxNQUFNLEdBQUcsTUFBTSxJQUFJLENBQUMsbUJBQW1CLEVBQUUsQ0FBQztRQUVoRCxNQUFNLE1BQU0sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDO1lBQ3ZCLE9BQU8sRUFBRSxhQUFhLENBQUMsT0FBTztZQUM5QixFQUFFLEVBQUUsYUFBYSxDQUFDLFNBQVM7U0FDNUIsQ0FBQyxDQUFDO1FBRUgsT0FBTztZQUNMLE9BQU8sRUFBRTtnQkFDUDtvQkFDRSxJQUFJLEVBQUUsTUFBTTtvQkFDWixJQUFJLEVBQUUsOEJBQThCO2lCQUNyQzthQUNGO1NBQ0YsQ0FBQztJQUNKLENBQUM7SUFFTyxLQUFLLENBQUMsZ0JBQWdCLENBQUMsSUFBYTtRQUMxQyxNQUFNLGFBQWEsR0FBRyxxQkFBcUIsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDeEQsTUFBTSxNQUFNLEdBQUcsTUFBTSxJQUFJLENBQUMsbUJBQW1CLEVBQUUsQ0FBQztRQUVoRCxNQUFNLE1BQU0sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDO1lBQ3ZCLE9BQU8sRUFBRSxhQUFhLENBQUMsT0FBTztZQUM5QixFQUFFLEVBQUUsYUFBYSxDQUFDLFNBQVM7WUFDM0IsSUFBSSxFQUFFLGFBQWEsQ0FBQyxJQUFJO1NBQ3pCLENBQUMsQ0FBQztRQUVILE9BQU87WUFDTCxPQUFPLEVBQUU7Z0JBQ1A7b0JBQ0UsSUFBSSxFQUFFLE1BQU07b0JBQ1osSUFBSSxFQUFFLDZCQUE2QjtpQkFDcEM7YUFDRjtTQUNGLENBQUM7SUFDSixDQUFDO0lBRU8sS0FBSyxDQUFDLG9CQUFvQixDQUFDLElBQWE7UUFDOUMsTUFBTSxhQUFhLEdBQUcseUJBQXlCLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQzVELE1BQU0sTUFBTSxHQUFHLE1BQU0sSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO1FBRTVDLE1BQU0sTUFBTSxHQUFHLE1BQU0sTUFBTSxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUM7WUFDL0MsT0FBTyxFQUFFLGFBQWEsQ0FBQyxPQUFPO1lBQzlCLElBQUksRUFBRSxhQUFhLENBQUMsSUFBSTtZQUN4QixPQUFPLEVBQUUsYUFBYSxDQUFDLE9BQU87U0FDL0IsQ0FBQyxDQUFDO1FBRUgsT0FBTztZQUNMLE9BQU8sRUFBRTtnQkFDUDtvQkFDRSxJQUFJLEVBQUUsTUFBTTtvQkFDWixJQUFJLEVBQUUseURBQXlELE1BQU0sQ0FBQyxvQkFBb0IsRUFBRTtpQkFDN0Y7YUFDRjtTQUNGLENBQUM7SUFDSixDQUFDO0lBRU8sS0FBSyxDQUFDLGtCQUFrQixDQUFDLElBQWE7UUFDNUMsTUFBTSxhQUFhLEdBQUcsdUJBQXVCLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQzFELE1BQU0sTUFBTSxHQUFHLE1BQU0sSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO1FBRTVDLE1BQU0sTUFBTSxHQUFHLE1BQU0sTUFBTSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUM7WUFDckMsSUFBSSxFQUFFLGFBQWEsQ0FBQyxPQUFPO1NBQzVCLENBQUMsQ0FBQztRQUVILElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxFQUFFLENBQUM7WUFDakIsTUFBTSxJQUFJLEtBQUssQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO1FBQ3BDLENBQUM7UUFFRCxPQUFPO1lBQ0wsT0FBTyxFQUFFO2dCQUNQO29CQUNFLElBQUksRUFBRSxNQUFNO29CQUNaLElBQUksRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDO3dCQUNuQixPQUFPLEVBQUUsTUFBTSxDQUFDLElBQUksQ0FBQyxFQUFFO3dCQUN2QixXQUFXLEVBQUUsTUFBTSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsV0FBVyxJQUFJLEVBQUU7d0JBQ25ELFlBQVksRUFBRSxNQUFNLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxZQUFZLElBQUksRUFBRTt3QkFDckQsaUJBQWlCLEVBQUUsTUFBTSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsaUJBQWlCLElBQUksQ0FBQztxQkFDL0QsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO2lCQUNaO2FBQ0Y7U0FDRixDQUFDO0lBQ0osQ0FBQztJQUVPLEtBQUssQ0FBQyxtQkFBbUIsQ0FBQyxJQUFhO1FBQzdDLE1BQU0sYUFBYSxHQUFHLHdCQUF3QixDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUMzRCxNQUFNLE1BQU0sR0FBRyxNQUFNLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQztRQUU1QyxNQUFNLE1BQU0sR0FBRyxNQUFNLE1BQU0sQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQztZQUM1QyxJQUFJLEVBQUUsYUFBYSxDQUFDLE9BQU87U0FDNUIsQ0FBQyxDQUFDO1FBRUgsT0FBTztZQUNMLE9BQU8sRUFBRTtnQkFDUDtvQkFDRSxJQUFJLEVBQUUsTUFBTTtvQkFDWixJQUFJLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsT0FBTyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7aUJBQzlDO2FBQ0Y7U0FDRixDQUFDO0lBQ0osQ0FBQztJQUVPLEtBQUssQ0FBQyxtQkFBbUIsQ0FBQyxJQUFhO1FBQzdDLE1BQU0sYUFBYSxHQUFHLHdCQUF3QixDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUMzRCxNQUFNLE1BQU0sR0FBRyxNQUFNLElBQUksQ0FBQyxtQkFBbUIsRUFBRSxDQUFDO1FBRWhELE1BQU0sTUFBTSxHQUFHLE1BQU0sTUFBTSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUM7WUFDeEMsSUFBSSxFQUFFLGFBQWEsQ0FBQyxJQUFJO1lBQ3hCLElBQUksRUFBRSxhQUFhLENBQUMsSUFBSTtTQUN6QixDQUFDLENBQUM7UUFFSCxPQUFPO1lBQ0wsT0FBTyxFQUFFO2dCQUNQO29CQUNFLElBQUksRUFBRSxNQUFNO29CQUNaLElBQUksRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDO3dCQUNuQixXQUFXLEVBQUUsTUFBTSxDQUFDLFFBQVEsRUFBRSxFQUFFO3dCQUNoQyxJQUFJLEVBQUUsTUFBTSxDQUFDLFFBQVEsRUFBRSxJQUFJO3dCQUMzQixJQUFJLEVBQUUsTUFBTSxDQUFDLFFBQVEsRUFBRSxJQUFJO3dCQUMzQixXQUFXLEVBQUUsTUFBTSxDQUFDLFFBQVEsRUFBRSxXQUFXO3FCQUMxQyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7aUJBQ1o7YUFDRjtTQUNGLENBQUM7SUFDSixDQUFDO0lBRU8sS0FBSyxDQUFDLGtCQUFrQjtRQUM5QixNQUFNLE1BQU0sR0FBRyxNQUFNLElBQUksQ0FBQyxtQkFBbUIsRUFBRSxDQUFDO1FBRWhELE1BQU0sTUFBTSxHQUFHLE1BQU0sTUFBTSxDQUFDLFNBQVMsQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUU3QyxNQUFNLFNBQVMsR0FBRyxNQUFNLENBQUMsU0FBUyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7WUFDNUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFO1lBQ1IsSUFBSSxFQUFFLENBQUMsQ0FBQyxJQUFJO1lBQ1osSUFBSSxFQUFFLENBQUMsQ0FBQyxJQUFJO1lBQ1osV0FBVyxFQUFFLENBQUMsQ0FBQyxXQUFXO1lBQzFCLFNBQVMsRUFBRSxDQUFDLENBQUMsU0FBUztTQUN2QixDQUFDLENBQUMsSUFBSSxFQUFFLENBQUM7UUFFVixPQUFPO1lBQ0wsT0FBTyxFQUFFO2dCQUNQO29CQUNFLElBQUksRUFBRSxNQUFNO29CQUNaLElBQUksRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLFNBQVMsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO2lCQUN6QzthQUNGO1NBQ0YsQ0FBQztJQUNKLENBQUM7SUFFTyxLQUFLLENBQUMsbUJBQW1CO1FBQy9CLE1BQU0sTUFBTSxHQUFHLE1BQU0sSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO1FBRTVDLE1BQU0sTUFBTSxHQUFHLE1BQU0sTUFBTSxDQUFDLEtBQUssQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUV6QyxPQUFPO1lBQ0wsT0FBTyxFQUFFO2dCQUNQO29CQUNFLElBQUksRUFBRSxNQUFNO29CQUNaLElBQUksRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxLQUFLLElBQUksRUFBRSxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7aUJBQ2xEO2FBQ0Y7U0FDRixDQUFDO0lBQ0osQ0FBQztJQUVPLEtBQUssQ0FBQyx5QkFBeUIsQ0FBQyxJQUFhO1FBQ25ELE1BQU0sYUFBYSxHQUFHLDhCQUE4QixDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNqRSxNQUFNLE1BQU0sR0FBRyxNQUFNLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQztRQUU1QyxNQUFNLE1BQU0sR0FBRyxNQUFNLE1BQU0sQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDO1lBQzNDLE9BQU8sRUFBRSxhQUFhLENBQUMsT0FBTztZQUM5QixNQUFNLEVBQUUsYUFBYSxDQUFDLE1BQU07WUFDNUIsSUFBSSxFQUFFLGFBQWEsQ0FBQyxJQUFJLElBQUksbUJBQW1CO1NBQ2hELENBQUMsQ0FBQztRQUVILE9BQU87WUFDTCxPQUFPLEVBQUU7Z0JBQ1A7b0JBQ0UsSUFBSSxFQUFFLE1BQU07b0JBQ1osSUFBSSxFQUFFLGlEQUFpRCxNQUFNLENBQUMsT0FBTyxnQkFBZ0IsTUFBTSxDQUFDLEVBQUUsRUFBRTtpQkFDakc7YUFDRjtTQUNGLENBQUM7SUFDSixDQUFDO0lBRU8sS0FBSyxDQUFDLHNCQUFzQixDQUFDLElBQWE7UUFDaEQsTUFBTSxhQUFhLEdBQUcsMkJBQTJCLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQzlELE1BQU0sTUFBTSxHQUFHLE1BQU0sSUFBSSxDQUFDLG1CQUFtQixFQUFFLENBQUM7UUFFaEQsMkNBQTJDO1FBQzNDLE1BQU0sTUFBTSxHQUFHLE1BQU0sTUFBTSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUM7WUFDMUMsS0FBSyxFQUFFLFVBQVUsYUFBYSxDQUFDLE9BQU8sR0FBRztZQUN6QyxLQUFLLEVBQUUsYUFBYSxDQUFDLEtBQUssSUFBSSxFQUFFO1lBQ2hDLElBQUksRUFBRSxXQUFXO1lBQ2pCLFFBQVEsRUFBRSxNQUFNO1NBQ2pCLENBQUMsQ0FBQztRQUVILE1BQU0sUUFBUSxHQUFHLE1BQU0sQ0FBQyxRQUFRLEVBQUUsT0FBTyxFQUFFLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUM7WUFDckQsSUFBSSxFQUFFLEdBQUcsQ0FBQyxJQUFJLEVBQUUsU0FBUyxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxJQUFJLElBQUksR0FBRyxDQUFDLElBQUksQ0FBQyxNQUFNLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztZQUNwRixPQUFPLEVBQUUsR0FBRyxDQUFDLE9BQU8sRUFBRSxJQUFJO1lBQzFCLFNBQVMsRUFBRSxHQUFHLENBQUMsRUFBRTtZQUNqQixTQUFTLEVBQUUsR0FBRyxDQUFDLFNBQVM7U0FDekIsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDO1FBRVYsT0FBTztZQUNMLE9BQU8sRUFBRTtnQkFDUDtvQkFDRSxJQUFJLEVBQUUsTUFBTTtvQkFDWixJQUFJLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQzt3QkFDbkIsT0FBTyxFQUFFLGFBQWEsQ0FBQyxPQUFPO3dCQUM5QixvQkFBb0IsRUFBRSxNQUFNLENBQUMsUUFBUSxFQUFFLEtBQUssSUFBSSxDQUFDO3dCQUNqRCxlQUFlLEVBQUUsUUFBUTtxQkFDMUIsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO2lCQUNaO2FBQ0Y7U0FDRixDQUFDO0lBQ0osQ0FBQztJQUVPLEtBQUssQ0FBQyxzQkFBc0IsQ0FBQyxJQUFhO1FBQ2hELE1BQU0sYUFBYSxHQUFHLDJCQUEyQixDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUM5RCxNQUFNLE1BQU0sR0FBRyxNQUFNLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQztRQUU1QyxNQUFNLE9BQU8sR0FBRztZQUNkLFVBQVUsRUFBRSxDQUFDO1lBQ2IsTUFBTSxFQUFFLENBQUM7WUFDVCxNQUFNLEVBQUUsRUFBYztTQUN2QixDQUFDO1FBRUYsS0FBSyxNQUFNLFNBQVMsSUFBSSxhQUFhLENBQUMsVUFBVSxFQUFFLENBQUM7WUFDakQsSUFBSSxDQUFDO2dCQUNILE1BQU0sTUFBTSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUM7b0JBQ3pCLE9BQU8sRUFBRSxhQUFhLENBQUMsT0FBTztvQkFDOUIsU0FBUyxFQUFFLFNBQVM7b0JBQ3BCLElBQUksRUFBRSxhQUFhLENBQUMsUUFBUTtpQkFDN0IsQ0FBQyxDQUFDO2dCQUNILE9BQU8sQ0FBQyxVQUFVLEVBQUUsQ0FBQztZQUN2QixDQUFDO1lBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQztnQkFDZixPQUFPLENBQUMsTUFBTSxFQUFFLENBQUM7Z0JBQ2pCLE9BQU8sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsU0FBUyxLQUFLLEtBQUssWUFBWSxLQUFLLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUM7WUFDakcsQ0FBQztRQUNILENBQUM7UUFFRCxPQUFPO1lBQ0wsT0FBTyxFQUFFO2dCQUNQO29CQUNFLElBQUksRUFBRSxNQUFNO29CQUNaLElBQUksRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLE9BQU8sRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO2lCQUN2QzthQUNGO1NBQ0YsQ0FBQztJQUNKLENBQUM7SUFFTyxLQUFLLENBQUMsbUJBQW1CLENBQUMsSUFBYTtRQUM3QyxNQUFNLGFBQWEsR0FBRyx3QkFBd0IsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDM0QsTUFBTSxNQUFNLEdBQUcsTUFBTSxJQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7UUFFNUMsMkJBQTJCO1FBQzNCLE1BQU0sT0FBTyxHQUFHLE1BQU0sTUFBTSxDQUFDLGFBQWEsQ0FBQyxPQUFPLENBQUM7WUFDakQsT0FBTyxFQUFFLGFBQWEsQ0FBQyxjQUFjO1lBQ3JDLE1BQU0sRUFBRSxhQUFhLENBQUMsU0FBUztZQUMvQixLQUFLLEVBQUUsQ0FBQztZQUNSLFNBQVMsRUFBRSxJQUFJO1NBQ2hCLENBQUMsQ0FBQztRQUVILE1BQU0sZUFBZSxHQUFHLE9BQU8sQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUM5QyxJQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7WUFDckIsTUFBTSxJQUFJLEtBQUssQ0FBQyw0QkFBNEIsQ0FBQyxDQUFDO1FBQ2hELENBQUM7UUFFRCxnQkFBZ0I7UUFDaEIsSUFBSSxRQUFRLEdBQUcsY0FBYyxDQUFDO1FBQzlCLElBQUksZUFBZSxDQUFDLElBQUksRUFBRSxDQUFDO1lBQ3pCLElBQUksQ0FBQztnQkFDSCxNQUFNLFFBQVEsR0FBRyxNQUFNLE1BQU0sQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEVBQUUsSUFBSSxFQUFFLGVBQWUsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDO2dCQUN6RSxRQUFRLEdBQUcsUUFBUSxDQUFDLElBQUksRUFBRSxTQUFTLElBQUksUUFBUSxDQUFDLElBQUksRUFBRSxJQUFJLElBQUksY0FBYyxDQUFDO1lBQy9FLENBQUM7WUFBQyxNQUFNLENBQUM7Z0JBQ1AsNEJBQTRCO1lBQzlCLENBQUM7UUFDSCxDQUFDO1FBRUQsK0JBQStCO1FBQy9CLElBQUksYUFBYSxHQUFHLG9CQUFvQixhQUFhLENBQUMsY0FBYyxvQkFBb0IsUUFBUSxXQUFXLGVBQWUsQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUNsSSxJQUFJLGFBQWEsQ0FBQyxPQUFPLEVBQUUsQ0FBQztZQUMxQixhQUFhLEdBQUcsR0FBRyxhQUFhLENBQUMsT0FBTyxPQUFPLGFBQWEsRUFBRSxDQUFDO1FBQ2pFLENBQUM7UUFFRCx5QkFBeUI7UUFDekIsTUFBTSxNQUFNLEdBQUcsTUFBTSxNQUFNLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQztZQUMzQyxPQUFPLEVBQUUsYUFBYSxDQUFDLGNBQWM7WUFDckMsSUFBSSxFQUFFLGFBQWE7U0FDcEIsQ0FBQyxDQUFDO1FBRUgsT0FBTztZQUNMLE9BQU8sRUFBRTtnQkFDUDtvQkFDRSxJQUFJLEVBQUUsTUFBTTtvQkFDWixJQUFJLEVBQUUsdUNBQXVDLGFBQWEsQ0FBQyxjQUFjLGlCQUFpQixNQUFNLENBQUMsRUFBRSxFQUFFO2lCQUN0RzthQUNGO1NBQ0YsQ0FBQztJQUNKLENBQUM7SUFFTyxLQUFLLENBQUMsd0JBQXdCLENBQUMsSUFBYTtRQUNsRCxNQUFNLGFBQWEsR0FBRyw2QkFBNkIsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDaEUsTUFBTSxNQUFNLEdBQUcsTUFBTSxJQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7UUFFNUMsbUJBQW1CO1FBQ25CLE1BQU0sUUFBUSxHQUFHLEVBQUUsQ0FBQztRQUNwQixLQUFLLE1BQU0sU0FBUyxJQUFJLGFBQWEsQ0FBQyxVQUFVLEVBQUUsQ0FBQztZQUNqRCxNQUFNLE9BQU8sR0FBRyxNQUFNLE1BQU0sQ0FBQyxhQUFhLENBQUMsT0FBTyxDQUFDO2dCQUNqRCxPQUFPLEVBQUUsYUFBYSxDQUFDLGNBQWM7Z0JBQ3JDLE1BQU0sRUFBRSxTQUFTO2dCQUNqQixLQUFLLEVBQUUsQ0FBQztnQkFDUixTQUFTLEVBQUUsSUFBSTthQUNoQixDQUFDLENBQUM7WUFFSCxJQUFJLE9BQU8sQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO2dCQUMxQixRQUFRLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUNyQyxDQUFDO1FBQ0gsQ0FBQztRQUVELElBQUksUUFBUSxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUUsQ0FBQztZQUMxQixNQUFNLElBQUksS0FBSyxDQUFDLDhCQUE4QixDQUFDLENBQUM7UUFDbEQsQ0FBQztRQUVELGlDQUFpQztRQUNqQyxNQUFNLE9BQU8sR0FBRztZQUNkLFVBQVUsRUFBRSxDQUFDO1lBQ2IsTUFBTSxFQUFFLENBQUM7WUFDVCxNQUFNLEVBQUUsRUFBYztTQUN2QixDQUFDO1FBRUYsS0FBSyxNQUFNLGFBQWEsSUFBSSxhQUFhLENBQUMsZUFBZSxFQUFFLENBQUM7WUFDMUQsSUFBSSxDQUFDO2dCQUNILGdDQUFnQztnQkFDaEMsSUFBSSxZQUFZLEdBQUcsYUFBYSxRQUFRLENBQUMsTUFBTSxvQkFBb0IsYUFBYSxDQUFDLGNBQWMsUUFBUSxDQUFDO2dCQUN4RyxJQUFJLGFBQWEsQ0FBQyxPQUFPLEVBQUUsQ0FBQztvQkFDMUIsWUFBWSxHQUFHLEdBQUcsYUFBYSxDQUFDLE9BQU8sT0FBTyxZQUFZLEVBQUUsQ0FBQztnQkFDL0QsQ0FBQztnQkFFRCxLQUFLLE1BQU0sR0FBRyxJQUFJLFFBQVEsRUFBRSxDQUFDO29CQUMzQixJQUFJLFFBQVEsR0FBRyxjQUFjLENBQUM7b0JBQzlCLElBQUksR0FBRyxDQUFDLElBQUksRUFBRSxDQUFDO3dCQUNiLElBQUksQ0FBQzs0QkFDSCxNQUFNLFFBQVEsR0FBRyxNQUFNLE1BQU0sQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEVBQUUsSUFBSSxFQUFFLEdBQUcsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDOzRCQUM3RCxRQUFRLEdBQUcsUUFBUSxDQUFDLElBQUksRUFBRSxTQUFTLElBQUksUUFBUSxDQUFDLElBQUksRUFBRSxJQUFJLElBQUksY0FBYyxDQUFDO3dCQUMvRSxDQUFDO3dCQUFDLE1BQU0sQ0FBQzs0QkFDUCw0QkFBNEI7d0JBQzlCLENBQUM7b0JBQ0gsQ0FBQztvQkFDRCxZQUFZLElBQUksUUFBUSxRQUFRLE1BQU0sR0FBRyxDQUFDLElBQUksTUFBTSxDQUFDO2dCQUN2RCxDQUFDO2dCQUVELE1BQU0sTUFBTSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUM7b0JBQzVCLE9BQU8sRUFBRSxhQUFhO29CQUN0QixJQUFJLEVBQUUsWUFBWTtpQkFDbkIsQ0FBQyxDQUFDO2dCQUNILE9BQU8sQ0FBQyxVQUFVLEVBQUUsQ0FBQztZQUN2QixDQUFDO1lBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQztnQkFDZixPQUFPLENBQUMsTUFBTSxFQUFFLENBQUM7Z0JBQ2pCLE9BQU8sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsYUFBYSxLQUFLLEtBQUssWUFBWSxLQUFLLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUM7WUFDckcsQ0FBQztRQUNILENBQUM7UUFFRCxPQUFPO1lBQ0wsT0FBTyxFQUFFO2dCQUNQO29CQUNFLElBQUksRUFBRSxNQUFNO29CQUNaLElBQUksRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLE9BQU8sRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO2lCQUN2QzthQUNGO1NBQ0YsQ0FBQztJQUNKLENBQUM7SUFFTyxLQUFLLENBQUMscUJBQXFCLENBQUMsSUFBYTtRQUMvQyxNQUFNLGFBQWEsR0FBRywwQkFBMEIsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDN0QsTUFBTSxNQUFNLEdBQUcsTUFBTSxJQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7UUFFNUMsTUFBTSxNQUFNLEdBQUcsTUFBTSxNQUFNLENBQUMsYUFBYSxDQUFDLE9BQU8sQ0FBQztZQUNoRCxPQUFPLEVBQUUsYUFBYSxDQUFDLE9BQU87WUFDOUIsRUFBRSxFQUFFLGFBQWEsQ0FBQyxTQUFTO1lBQzNCLEtBQUssRUFBRSxhQUFhLENBQUMsS0FBSyxJQUFJLEdBQUc7U0FDbEMsQ0FBQyxDQUFDO1FBRUgsTUFBTSxPQUFPLEdBQUcsTUFBTSxDQUFDLFFBQVEsRUFBRSxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1lBQzNDLElBQUksRUFBRSxHQUFHLENBQUMsSUFBSTtZQUNkLElBQUksRUFBRSxHQUFHLENBQUMsSUFBSTtZQUNkLEVBQUUsRUFBRSxHQUFHLENBQUMsRUFBRTtZQUNWLFNBQVMsRUFBRSxHQUFHLENBQUMsU0FBUztZQUN4QixjQUFjLEVBQUUsR0FBRyxDQUFDLGNBQWM7WUFDbEMsU0FBUyxFQUFFLEdBQUcsQ0FBQyxTQUFTLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztnQkFDbEMsSUFBSSxFQUFFLENBQUMsQ0FBQyxJQUFJO2dCQUNaLEtBQUssRUFBRSxDQUFDLENBQUMsS0FBSztnQkFDZCxLQUFLLEVBQUUsQ0FBQyxDQUFDLEtBQUs7YUFDZixDQUFDLENBQUM7U0FDSixDQUFDLENBQUMsSUFBSSxFQUFFLENBQUM7UUFFVixPQUFPO1lBQ0wsT0FBTyxFQUFFO2dCQUNQO29CQUNFLElBQUksRUFBRSxNQUFNO29CQUNaLElBQUksRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDO3dCQUNuQixTQUFTLEVBQUUsYUFBYSxDQUFDLFNBQVM7d0JBQ2xDLFdBQVcsRUFBRSxPQUFPLENBQUMsTUFBTTt3QkFDM0IsT0FBTyxFQUFFLE9BQU87cUJBQ2pCLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztpQkFDWjthQUNGO1NBQ0YsQ0FBQztJQUNKLENBQUM7SUFFTyxLQUFLLENBQUMsc0JBQXNCO1FBQ2xDLE1BQU0sTUFBTSxHQUFHLE1BQU0sSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO1FBRTVDLGdCQUFnQjtRQUNoQixNQUFNLFFBQVEsR0FBRyxNQUFNLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7UUFFMUMsaUJBQWlCO1FBQ2pCLE1BQU0sS0FBSyxHQUFHLE1BQU0sTUFBTSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDMUMsTUFBTSxXQUFXLEdBQUcsS0FBSyxDQUFDLE9BQU8sRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLElBQUksQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLElBQUksRUFBRSxDQUFDO1FBRTlFLG9CQUFvQjtRQUNwQixNQUFNLFFBQVEsR0FBRyxNQUFNLE1BQU0sQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDO1lBQy9DLEtBQUssRUFBRSxnQ0FBZ0M7U0FDeEMsQ0FBQyxDQUFDO1FBRUgsT0FBTztZQUNMLE9BQU8sRUFBRTtnQkFDUDtvQkFDRSxJQUFJLEVBQUUsTUFBTTtvQkFDWixJQUFJLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQzt3QkFDbkIsSUFBSSxFQUFFOzRCQUNKLElBQUksRUFBRSxRQUFRLENBQUMsSUFBSSxFQUFFLElBQUk7NEJBQ3pCLE1BQU0sRUFBRSxRQUFRLENBQUMsSUFBSSxFQUFFLE1BQU07NEJBQzdCLFlBQVksRUFBRSxRQUFRLENBQUMsSUFBSSxFQUFFLFlBQVk7eUJBQzFDO3dCQUNELEtBQUssRUFBRTs0QkFDTCxXQUFXLEVBQUUsV0FBVyxDQUFDLE1BQU07NEJBQy9CLGNBQWMsRUFBRSxRQUFRLENBQUMsUUFBUSxFQUFFLE1BQU0sSUFBSSxDQUFDOzRCQUM5QyxNQUFNLEVBQUUsV0FBVyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxNQUFNOzRCQUNsRCxNQUFNLEVBQUUsV0FBVyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxNQUFNO3lCQUNuRDtxQkFDRixFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7aUJBQ1o7YUFDRjtTQUNGLENBQUM7SUFDSixDQUFDO0lBRUQsd0ZBQXdGO0lBQ3hGLGdDQUFnQztJQUNoQyx3RkFBd0Y7SUFFaEYsS0FBSyxDQUFDLGVBQWUsQ0FBQyxJQUFhO1FBQ3pDLE1BQU0sYUFBYSxHQUFHLG9CQUFvQixDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUN2RCxNQUFNLE1BQU0sR0FBRyxNQUFNLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQztRQUU1Qyx5QkFBeUI7UUFDekIsSUFBSSxDQUFDO1lBQ0gsTUFBTSxFQUFFLENBQUMsTUFBTSxDQUFDLGFBQWEsQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUMzQyxDQUFDO1FBQUMsTUFBTSxDQUFDO1lBQ1AsTUFBTSxJQUFJLEtBQUssQ0FBQyxtQkFBbUIsYUFBYSxDQUFDLFNBQVMsRUFBRSxDQUFDLENBQUM7UUFDaEUsQ0FBQztRQUVELE1BQU0sU0FBUyxHQUFHLE1BQU0sRUFBRSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDekQsSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDO1lBQ3hCLE1BQU0sSUFBSSxLQUFLLENBQUMsdUJBQXVCLGFBQWEsQ0FBQyxTQUFTLEVBQUUsQ0FBQyxDQUFDO1FBQ3BFLENBQUM7UUFFRCxNQUFNLFdBQVcsR0FBRyxNQUFNLEVBQUUsQ0FBQyxRQUFRLENBQUMsYUFBYSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQy9ELE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsYUFBYSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBRXhELE1BQU0sTUFBTSxHQUFHLE1BQU0sTUFBTSxDQUFDLGFBQWEsQ0FBQztZQUN4QyxVQUFVLEVBQUUsYUFBYSxDQUFDLE9BQU87WUFDakMsSUFBSSxFQUFFLFdBQVc7WUFDakIsUUFBUSxFQUFFLFFBQVE7WUFDbEIsS0FBSyxFQUFFLGFBQWEsQ0FBQyxLQUFLLElBQUksUUFBUTtZQUN0QyxlQUFlLEVBQUUsYUFBYSxDQUFDLGVBQWU7U0FDL0MsQ0FBQyxDQUFDO1FBRUgsc0ZBQXNGO1FBQ3RGLE1BQU0sYUFBYSxHQUFJLE1BQWMsQ0FBQyxLQUFLLElBQUksRUFBRSxDQUFDO1FBQ2xELE1BQU0sV0FBVyxHQUFHLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNyQyxNQUFNLFFBQVEsR0FBRyxXQUFXLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksV0FBVyxJQUFJLEVBQUUsQ0FBQztRQUU5RCxPQUFPO1lBQ0wsT0FBTyxFQUFFO2dCQUNQO29CQUNFLElBQUksRUFBRSxNQUFNO29CQUNaLElBQUksRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDO3dCQUNuQixPQUFPLEVBQUUsSUFBSTt3QkFDYixJQUFJLEVBQUU7NEJBQ0osRUFBRSxFQUFFLFFBQVEsQ0FBQyxFQUFFLElBQUksSUFBSTs0QkFDdkIsS0FBSyxFQUFFLFFBQVEsQ0FBQyxLQUFLLElBQUksUUFBUTs0QkFDakMsV0FBVyxFQUFFLFFBQVEsQ0FBQyxXQUFXLElBQUksSUFBSTs0QkFDekMsU0FBUyxFQUFFLFFBQVEsQ0FBQyxTQUFTLElBQUksSUFBSTs0QkFDckMsUUFBUSxFQUFFLFFBQVEsQ0FBQyxRQUFRLElBQUksSUFBSTs0QkFDbkMsSUFBSSxFQUFFLFNBQVMsQ0FBQyxJQUFJOzRCQUNwQixRQUFRLEVBQUUsUUFBUTt5QkFDbkI7cUJBQ0YsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO2lCQUNaO2FBQ0Y7U0FDRixDQUFDO0lBQ0osQ0FBQztJQUVPLEtBQUssQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFhO1FBQzFDLE1BQU0sYUFBYSxHQUFHLHFCQUFxQixDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUN4RCxNQUFNLFdBQVcsR0FBRyxhQUFhLENBQUMsWUFBWSxJQUFJLE1BQU0sQ0FBQztRQUV6RCwyQkFBMkI7UUFDM0IsSUFBSSxXQUFtQixDQUFDO1FBQ3hCLElBQUksV0FBVyxLQUFLLFNBQVMsRUFBRSxDQUFDO1lBQzlCLFdBQVcsR0FBRzs7Ozs7dUJBS0csYUFBYSxDQUFDLGVBQWU7O2VBRXJDLENBQUM7UUFDWixDQUFDO2FBQU0sQ0FBQztZQUNOLHFEQUFxRDtZQUNyRCxJQUFJLGFBQWEsQ0FBQyxlQUFlLENBQUMsSUFBSSxFQUFFLENBQUMsV0FBVyxFQUFFLENBQUMsVUFBVSxDQUFDLFdBQVcsQ0FBQztnQkFDMUUsYUFBYSxDQUFDLGVBQWUsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQztnQkFDM0UsV0FBVyxHQUFHLGFBQWEsQ0FBQyxlQUFlLENBQUM7WUFDOUMsQ0FBQztpQkFBTSxDQUFDO2dCQUNOLFdBQVcsR0FBRzs7OztFQUlwQixhQUFhLENBQUMsZUFBZTtlQUNoQixDQUFDO1lBQ1YsQ0FBQztRQUNILENBQUM7UUFFRCxvQkFBb0I7UUFDcEIsTUFBTSxPQUFPLEdBQUcsTUFBTSxFQUFFLENBQUM7UUFDekIsTUFBTSxZQUFZLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsaUJBQWlCLElBQUksQ0FBQyxHQUFHLEVBQUUsT0FBTyxDQUFDLENBQUM7UUFDNUUsTUFBTSxXQUFXLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsaUJBQWlCLElBQUksQ0FBQyxHQUFHLEVBQUUsTUFBTSxDQUFDLENBQUM7UUFFMUUsSUFBSSxDQUFDO1lBQ0gsTUFBTSxFQUFFLENBQUMsU0FBUyxDQUFDLFlBQVksRUFBRSxXQUFXLENBQUMsQ0FBQztZQUU5QyxpREFBaUQ7WUFDakQsTUFBTSxJQUFJLENBQUMsZUFBZSxDQUFDLFlBQVksRUFBRSxXQUFXLENBQUMsQ0FBQztZQUV0RCxnREFBZ0Q7WUFDaEQsTUFBTSxZQUFZLEdBQUcsTUFBTSxJQUFJLENBQUMsZUFBZSxDQUFDO2dCQUM5QyxPQUFPLEVBQUUsYUFBYSxDQUFDLE9BQU87Z0JBQzlCLFNBQVMsRUFBRSxXQUFXO2dCQUN0QixLQUFLLEVBQUUsYUFBYSxDQUFDLEtBQUssSUFBSSxTQUFTO2dCQUN2QyxlQUFlLEVBQUUsYUFBYSxDQUFDLGVBQWU7YUFDL0MsQ0FBQyxDQUFDO1lBRUgsT0FBTyxZQUFZLENBQUM7UUFDdEIsQ0FBQztnQkFBUyxDQUFDO1lBQ1QscUJBQXFCO1lBQ3JCLE1BQU0sRUFBRSxDQUFDLE1BQU0sQ0FBQyxZQUFZLENBQUMsQ0FBQyxLQUFLLENBQUMsR0FBRyxFQUFFLEdBQUUsQ0FBQyxDQUFDLENBQUM7WUFDOUMsTUFBTSxFQUFFLENBQUMsTUFBTSxDQUFDLFdBQVcsQ0FBQyxDQUFDLEtBQUssQ0FBQyxHQUFHLEVBQUUsR0FBRSxDQUFDLENBQUMsQ0FBQztRQUMvQyxDQUFDO0lBQ0gsQ0FBQztJQUVPLEtBQUssQ0FBQyxlQUFlLENBQUMsUUFBZ0IsRUFBRSxPQUFlO1FBQzdELDJDQUEyQztRQUMzQyxJQUFJLENBQUM7WUFDSCxNQUFNLGVBQWUsR0FBRyxXQUFXLENBQUM7WUFDcEMsTUFBTSxTQUFTLEdBQVEsTUFBTSxNQUFNLENBQUMseUJBQXlCLENBQUMsZUFBZSxDQUFDLENBQUM7WUFDL0UsTUFBTSxPQUFPLEdBQUcsTUFBTSxTQUFTLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQztnQkFDN0MsUUFBUSxFQUFFLElBQUk7Z0JBQ2QsSUFBSSxFQUFFLENBQUMsY0FBYyxFQUFFLDBCQUEwQixDQUFDO2FBQ25ELENBQUMsQ0FBQztZQUNILElBQUksQ0FBQztnQkFDSCxNQUFNLElBQUksR0FBRyxNQUFNLE9BQU8sQ0FBQyxPQUFPLEVBQUUsQ0FBQztnQkFDckMsTUFBTSxJQUFJLENBQUMsV0FBVyxDQUFDLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQztnQkFDckQsTUFBTSxJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsUUFBUSxFQUFFLEVBQUUsRUFBRSxTQUFTLEVBQUUsY0FBYyxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDO2dCQUVyRiwrQ0FBK0M7Z0JBQy9DLE1BQU0sVUFBVSxHQUFHLE1BQU0sSUFBSSxDQUFDLFFBQVEsQ0FBQyxHQUFHLEVBQUU7b0JBQzFDLE1BQU0sSUFBSSxHQUFHLFFBQVEsQ0FBQyxJQUFJLENBQUM7b0JBQzNCLE9BQU87d0JBQ0wsS0FBSyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRSxJQUFJLENBQUM7d0JBQ3ZDLE1BQU0sRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxZQUFZLEVBQUUsR0FBRyxDQUFDO3FCQUN6QyxDQUFDO2dCQUNKLENBQUMsQ0FBQyxDQUFDO2dCQUNILE1BQU0sSUFBSSxDQUFDLFdBQVcsQ0FBQyxFQUFFLEtBQUssRUFBRSxVQUFVLENBQUMsS0FBSyxFQUFFLE1BQU0sRUFBRSxVQUFVLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQztnQkFDL0UsTUFBTSxJQUFJLENBQUMsVUFBVSxDQUFDLEVBQUUsSUFBSSxFQUFFLE9BQU8sRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztZQUMzRCxDQUFDO29CQUFTLENBQUM7Z0JBQ1QsTUFBTSxPQUFPLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDeEIsQ0FBQztZQUNELE9BQU87UUFDVCxDQUFDO1FBQUMsTUFBTSxDQUFDO1lBQ1AsNkNBQTZDO1FBQy9DLENBQUM7UUFFRCw0Q0FBNEM7UUFDNUMsSUFBSSxDQUFDO1lBQ0gsTUFBTSxnQkFBZ0IsR0FBRyxZQUFZLENBQUM7WUFDdEMsTUFBTSxVQUFVLEdBQVEsTUFBTSxNQUFNLENBQUMseUJBQXlCLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztZQUNqRixNQUFNLE9BQU8sR0FBRyxNQUFNLFVBQVUsQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7WUFDckUsSUFBSSxDQUFDO2dCQUNILE1BQU0sSUFBSSxHQUFHLE1BQU0sT0FBTyxDQUFDLE9BQU8sQ0FBQyxFQUFFLFFBQVEsRUFBRSxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFLEdBQUcsRUFBRSxFQUFFLENBQUMsQ0FBQztnQkFDL0UsTUFBTSxJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsUUFBUSxFQUFFLEVBQUUsRUFBRSxTQUFTLEVBQUUsYUFBYSxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDO2dCQUNwRixNQUFNLElBQUksQ0FBQyxVQUFVLENBQUMsRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO1lBQzNELENBQUM7b0JBQVMsQ0FBQztnQkFDVCxNQUFNLE9BQU8sQ0FBQyxLQUFLLEVBQUUsQ0FBQztZQUN4QixDQUFDO1lBQ0QsT0FBTztRQUNULENBQUM7UUFBQyxNQUFNLENBQUM7WUFDUCw4Q0FBOEM7UUFDaEQsQ0FBQztRQUVELDJDQUEyQztRQUMzQyxJQUFJLENBQUM7WUFDSCxNQUFNLGFBQWEsQ0FBQyxlQUFlLEVBQUU7Z0JBQ25DLFNBQVMsRUFBRSxNQUFNO2dCQUNqQixXQUFXLEVBQUUsSUFBSTtnQkFDakIsUUFBUTtnQkFDUixPQUFPO2FBQ1IsQ0FBQyxDQUFDO1lBQ0gsT0FBTztRQUNULENBQUM7UUFBQyxNQUFNLENBQUM7WUFDUCw4QkFBOEI7UUFDaEMsQ0FBQztRQUVELE1BQU0sSUFBSSxLQUFLLENBQ2IsMEpBQTBKO1lBQzFKLG1GQUFtRixDQUNwRixDQUFDO0lBQ0osQ0FBQztJQUVELHdGQUF3RjtJQUN4RixzQ0FBc0M7SUFDdEMsd0ZBQXdGO0lBRWhGLGFBQWE7UUFDbkIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxpQkFBaUIsQ0FBQyxzQkFBc0IsRUFBRSxLQUFLLElBQUksRUFBRTtZQUMvRCxNQUFNLEtBQUssR0FBVztnQkFDcEIsMkJBQTJCO2dCQUMzQjtvQkFDRSxJQUFJLEVBQUUsZUFBZTtvQkFDckIsV0FBVyxFQUFFLHNEQUFzRDtvQkFDbkUsV0FBVyxFQUFFO3dCQUNYLElBQUksRUFBRSxRQUFRO3dCQUNkLFVBQVUsRUFBRSxFQUFFO3FCQUNmO2lCQUNGO2dCQUNEO29CQUNFLElBQUksRUFBRSxnQkFBZ0I7b0JBQ3RCLFdBQVcsRUFBRSx1Q0FBdUM7b0JBQ3BELFdBQVcsRUFBRTt3QkFDWCxJQUFJLEVBQUUsUUFBUTt3QkFDZCxVQUFVLEVBQUU7NEJBQ1YsVUFBVSxFQUFFO2dDQUNWLElBQUksRUFBRSxRQUFRO2dDQUNkLFdBQVcsRUFBRSx5QkFBeUI7NkJBQ3ZDO3lCQUNGO3dCQUNELFFBQVEsRUFBRSxDQUFDLFlBQVksQ0FBQztxQkFDekI7aUJBQ0Y7Z0JBQ0Q7b0JBQ0UsSUFBSSxFQUFFLGFBQWE7b0JBQ25CLFdBQVcsRUFBRSx5Q0FBeUM7b0JBQ3RELFdBQVcsRUFBRTt3QkFDWCxJQUFJLEVBQUUsUUFBUTt3QkFDZCxVQUFVLEVBQUU7NEJBQ1YsSUFBSSxFQUFFO2dDQUNKLElBQUksRUFBRSxRQUFRO2dDQUNkLFdBQVcsRUFBRSxzQ0FBc0M7NkJBQ3BEOzRCQUNELFNBQVMsRUFBRTtnQ0FDVCxJQUFJLEVBQUUsUUFBUTtnQ0FDZCxXQUFXLEVBQUUsMENBQTBDOzZCQUN4RDs0QkFDRCxVQUFVLEVBQUU7Z0NBQ1YsSUFBSSxFQUFFLFFBQVE7Z0NBQ2QsV0FBVyxFQUFFLGlEQUFpRDs2QkFDL0Q7NEJBQ0QsT0FBTyxFQUFFO2dDQUNQLElBQUksRUFBRSxRQUFRO2dDQUNkLFdBQVcsRUFBRSxlQUFlOzZCQUM3Qjt5QkFDRjt3QkFDRCxRQUFRLEVBQUUsQ0FBQyxNQUFNLEVBQUUsV0FBVyxFQUFFLFNBQVMsQ0FBQztxQkFDM0M7aUJBQ0Y7Z0JBQ0Q7b0JBQ0UsSUFBSSxFQUFFLGdCQUFnQjtvQkFDdEIsV0FBVyxFQUFFLHdDQUF3QztvQkFDckQsV0FBVyxFQUFFO3dCQUNYLElBQUksRUFBRSxRQUFRO3dCQUNkLFVBQVUsRUFBRTs0QkFDVixVQUFVLEVBQUU7Z0NBQ1YsSUFBSSxFQUFFLFFBQVE7Z0NBQ2QsV0FBVyxFQUFFLHNCQUFzQjs2QkFDcEM7eUJBQ0Y7d0JBQ0QsUUFBUSxFQUFFLENBQUMsWUFBWSxDQUFDO3FCQUN6QjtpQkFDRjtnQkFDRDtvQkFDRSxJQUFJLEVBQUUsb0JBQW9CO29CQUMxQixXQUFXLEVBQUUsNkNBQTZDO29CQUMxRCxXQUFXLEVBQUU7d0JBQ1gsSUFBSSxFQUFFLFFBQVE7d0JBQ2QsVUFBVSxFQUFFLEVBQUU7cUJBQ2Y7aUJBQ0Y7Z0JBQ0Q7b0JBQ0UsSUFBSSxFQUFFLHFCQUFxQjtvQkFDM0IsV0FBVyxFQUFFLGdEQUFnRDtvQkFDN0QsV0FBVyxFQUFFO3dCQUNYLElBQUksRUFBRSxRQUFRO3dCQUNkLFVBQVUsRUFBRTs0QkFDVixVQUFVLEVBQUU7Z0NBQ1YsSUFBSSxFQUFFLFFBQVE7Z0NBQ2QsV0FBVyxFQUFFLDhCQUE4Qjs2QkFDNUM7eUJBQ0Y7d0JBQ0QsUUFBUSxFQUFFLENBQUMsWUFBWSxDQUFDO3FCQUN6QjtpQkFDRjtnQkFDRDtvQkFDRSxJQUFJLEVBQUUsZ0JBQWdCO29CQUN0QixXQUFXLEVBQUUsc0RBQXNEO29CQUNuRSxXQUFXLEVBQUU7d0JBQ1gsSUFBSSxFQUFFLFFBQVE7d0JBQ2QsVUFBVSxFQUFFOzRCQUNWLFVBQVUsRUFBRTtnQ0FDVixJQUFJLEVBQUUsUUFBUTtnQ0FDZCxXQUFXLEVBQUUsc0JBQXNCOzZCQUNwQzs0QkFDRCxTQUFTLEVBQUU7Z0NBQ1QsSUFBSSxFQUFFLFFBQVE7Z0NBQ2QsV0FBVyxFQUFFLDhDQUE4Qzs2QkFDNUQ7NEJBQ0QsVUFBVSxFQUFFO2dDQUNWLElBQUksRUFBRSxRQUFRO2dDQUNkLFdBQVcsRUFBRSwwQ0FBMEM7NkJBQ3hEO3lCQUNGO3dCQUNELFFBQVEsRUFBRSxDQUFDLFlBQVksQ0FBQztxQkFDekI7aUJBQ0Y7Z0JBRUQsMkRBQTJEO2dCQUMzRDtvQkFDRSxJQUFJLEVBQUUscUJBQXFCO29CQUMzQixXQUFXLEVBQUUsb0NBQW9DO29CQUNqRCxXQUFXLEVBQUU7d0JBQ1gsSUFBSSxFQUFFLFFBQVE7d0JBQ2QsVUFBVSxFQUFFOzRCQUNWLEtBQUssRUFBRTtnQ0FDTCxJQUFJLEVBQUUsUUFBUTtnQ0FDZCxXQUFXLEVBQUUsa0ZBQWtGOzZCQUNoRzs0QkFDRCxLQUFLLEVBQUU7Z0NBQ0wsSUFBSSxFQUFFLFFBQVE7Z0NBQ2QsV0FBVyxFQUFFLHFEQUFxRDs2QkFDbkU7eUJBQ0Y7cUJBQ0Y7aUJBQ0Y7Z0JBQ0Q7b0JBQ0UsSUFBSSxFQUFFLG9CQUFvQjtvQkFDMUIsV0FBVyxFQUFFLHNuQkFBc25CO29CQUNub0IsV0FBVyxFQUFFO3dCQUNYLElBQUksRUFBRSxRQUFRO3dCQUNkLFVBQVUsRUFBRTs0QkFDVixPQUFPLEVBQUU7Z0NBQ1AsSUFBSSxFQUFFLFFBQVE7Z0NBQ2QsV0FBVyxFQUFFLG9EQUFvRDs2QkFDbEU7NEJBQ0QsSUFBSSxFQUFFO2dDQUNKLElBQUksRUFBRSxRQUFRO2dDQUNkLFdBQVcsRUFBRSwwR0FBMEc7NkJBQ3hIOzRCQUNELFNBQVMsRUFBRTtnQ0FDVCxJQUFJLEVBQUUsUUFBUTtnQ0FDZCxXQUFXLEVBQUUsb0RBQW9EOzZCQUNsRTt5QkFDRjt3QkFDRCxRQUFRLEVBQUUsQ0FBQyxTQUFTLEVBQUUsTUFBTSxDQUFDO3FCQUM5QjtpQkFDRjtnQkFFRDtvQkFDRSxJQUFJLEVBQUUsMkJBQTJCO29CQUNqQyxXQUFXLEVBQUUsMENBQTBDO29CQUN2RCxXQUFXLEVBQUU7d0JBQ1gsSUFBSSxFQUFFLFFBQVE7d0JBQ2QsVUFBVSxFQUFFOzRCQUNWLE9BQU8sRUFBRTtnQ0FDUCxJQUFJLEVBQUUsUUFBUTtnQ0FDZCxXQUFXLEVBQUUsa0NBQWtDOzZCQUNoRDs0QkFDRCxLQUFLLEVBQUU7Z0NBQ0wsSUFBSSxFQUFFLFFBQVE7Z0NBQ2QsV0FBVyxFQUFFLDZDQUE2Qzs2QkFDM0Q7eUJBQ0Y7d0JBQ0QsUUFBUSxFQUFFLENBQUMsU0FBUyxDQUFDO3FCQUN0QjtpQkFDRjtnQkFDRDtvQkFDRSxJQUFJLEVBQUUsb0JBQW9CO29CQUMxQixXQUFXLEVBQUUsbUNBQW1DO29CQUNoRCxXQUFXLEVBQUU7d0JBQ1gsSUFBSSxFQUFFLFFBQVE7d0JBQ2QsVUFBVSxFQUFFOzRCQUNWLE9BQU8sRUFBRTtnQ0FDUCxJQUFJLEVBQUUsUUFBUTtnQ0FDZCxXQUFXLEVBQUUsaUNBQWlDOzZCQUMvQzs0QkFDRCxTQUFTLEVBQUU7Z0NBQ1QsSUFBSSxFQUFFLFFBQVE7Z0NBQ2QsV0FBVyxFQUFFLHNDQUFzQzs2QkFDcEQ7NEJBQ0QsSUFBSSxFQUFFO2dDQUNKLElBQUksRUFBRSxRQUFRO2dDQUNkLFdBQVcsRUFBRSxzQ0FBc0M7NkJBQ3BEO3lCQUNGO3dCQUNELFFBQVEsRUFBRSxDQUFDLFNBQVMsRUFBRSxXQUFXLEVBQUUsTUFBTSxDQUFDO3FCQUMzQztpQkFDRjtnQkFDRDtvQkFDRSxJQUFJLEVBQUUsa0JBQWtCO29CQUN4QixXQUFXLEVBQUUsaUNBQWlDO29CQUM5QyxXQUFXLEVBQUU7d0JBQ1gsSUFBSSxFQUFFLFFBQVE7d0JBQ2QsVUFBVSxFQUFFOzRCQUNWLEtBQUssRUFBRTtnQ0FDTCxJQUFJLEVBQUUsUUFBUTtnQ0FDZCxXQUFXLEVBQUUsa0RBQWtEOzZCQUNoRTt5QkFDRjtxQkFDRjtpQkFDRjtnQkFDRDtvQkFDRSxJQUFJLEVBQUUsd0JBQXdCO29CQUM5QixXQUFXLEVBQUUsMkhBQTJIO29CQUN4SSxXQUFXLEVBQUU7d0JBQ1gsSUFBSSxFQUFFLFFBQVE7d0JBQ2QsVUFBVSxFQUFFOzRCQUNWLElBQUksRUFBRTtnQ0FDSixJQUFJLEVBQUUsUUFBUTtnQ0FDZCxXQUFXLEVBQUUsb0NBQW9DOzZCQUNsRDt5QkFDRjt3QkFDRCxRQUFRLEVBQUUsQ0FBQyxNQUFNLENBQUM7cUJBQ25CO2lCQUNGO2dCQUNEO29CQUNFLElBQUksRUFBRSxxQkFBcUI7b0JBQzNCLFdBQVcsRUFBRSx3Q0FBd0M7b0JBQ3JELFdBQVcsRUFBRTt3QkFDWCxJQUFJLEVBQUUsUUFBUTt3QkFDZCxVQUFVLEVBQUU7NEJBQ1YsT0FBTyxFQUFFO2dDQUNQLElBQUksRUFBRSxRQUFRO2dDQUNkLFdBQVcsRUFBRSxrQ0FBa0M7NkJBQ2hEO3lCQUNGO3dCQUNELFFBQVEsRUFBRSxDQUFDLFNBQVMsQ0FBQztxQkFDdEI7aUJBQ0Y7Z0JBQ0Q7b0JBQ0UsSUFBSSxFQUFFLG9CQUFvQjtvQkFDMUIsV0FBVyxFQUFFLG1DQUFtQztvQkFDaEQsV0FBVyxFQUFFO3dCQUNYLElBQUksRUFBRSxRQUFRO3dCQUNkLFVBQVUsRUFBRTs0QkFDVixLQUFLLEVBQUU7Z0NBQ0wsSUFBSSxFQUFFLFFBQVE7Z0NBQ2QsV0FBVyxFQUFFLHdCQUF3Qjs2QkFDdEM7NEJBQ0QsS0FBSyxFQUFFO2dDQUNMLElBQUksRUFBRSxRQUFRO2dDQUNkLFdBQVcsRUFBRSwyQ0FBMkM7NkJBQ3pEOzRCQUNELElBQUksRUFBRTtnQ0FDSixJQUFJLEVBQUUsUUFBUTtnQ0FDZCxXQUFXLEVBQUUscUNBQXFDOzZCQUNuRDt5QkFDRjt3QkFDRCxRQUFRLEVBQUUsQ0FBQyxPQUFPLENBQUM7cUJBQ3BCO2lCQUNGO2dCQUNEO29CQUNFLElBQUksRUFBRSx1QkFBdUI7b0JBQzdCLFdBQVcsRUFBRSwwQ0FBMEM7b0JBQ3ZELFdBQVcsRUFBRTt3QkFDWCxJQUFJLEVBQUUsUUFBUTt3QkFDZCxVQUFVLEVBQUU7NEJBQ1YsS0FBSyxFQUFFO2dDQUNMLElBQUksRUFBRSxRQUFRO2dDQUNkLFdBQVcsRUFBRSwyQkFBMkI7NkJBQ3pDOzRCQUNELEtBQUssRUFBRTtnQ0FDTCxJQUFJLEVBQUUsUUFBUTtnQ0FDZCxXQUFXLEVBQUUsMkNBQTJDOzZCQUN6RDs0QkFDRCxJQUFJLEVBQUU7Z0NBQ0osSUFBSSxFQUFFLFFBQVE7Z0NBQ2QsV0FBVyxFQUFFLHFDQUFxQzs2QkFDbkQ7eUJBQ0Y7d0JBQ0QsUUFBUSxFQUFFLENBQUMsT0FBTyxDQUFDO3FCQUNwQjtpQkFDRjtnQkFDRDtvQkFDRSxJQUFJLEVBQUUsc0JBQXNCO29CQUM1QixXQUFXLEVBQUUsMENBQTBDO29CQUN2RCxXQUFXLEVBQUU7d0JBQ1gsSUFBSSxFQUFFLFFBQVE7d0JBQ2QsVUFBVSxFQUFFOzRCQUNWLE9BQU8sRUFBRTtnQ0FDUCxJQUFJLEVBQUUsUUFBUTtnQ0FDZCxXQUFXLEVBQUUsaUNBQWlDOzZCQUMvQzs0QkFDRCxLQUFLLEVBQUU7Z0NBQ0wsSUFBSSxFQUFFLFFBQVE7Z0NBQ2QsV0FBVyxFQUFFLHlCQUF5Qjs2QkFDdkM7NEJBQ0QsS0FBSyxFQUFFO2dDQUNMLElBQUksRUFBRSxRQUFRO2dDQUNkLFdBQVcsRUFBRSwyQ0FBMkM7NkJBQ3pEO3lCQUNGO3dCQUNELFFBQVEsRUFBRSxDQUFDLFNBQVMsQ0FBQztxQkFDdEI7aUJBQ0Y7Z0JBQ0Q7b0JBQ0UsSUFBSSxFQUFFLDRCQUE0QjtvQkFDbEMsV0FBVyxFQUFFLHlDQUF5QztvQkFDdEQsV0FBVyxFQUFFO3dCQUNYLElBQUksRUFBRSxRQUFRO3dCQUNkLFVBQVUsRUFBRTs0QkFDVixTQUFTLEVBQUU7Z0NBQ1QsSUFBSSxFQUFFLFFBQVE7Z0NBQ2QsV0FBVyxFQUFFLHlCQUF5Qjs2QkFDdkM7NEJBQ0QsT0FBTyxFQUFFO2dDQUNQLElBQUksRUFBRSxRQUFRO2dDQUNkLFdBQVcsRUFBRSx1QkFBdUI7NkJBQ3JDOzRCQUNELEtBQUssRUFBRTtnQ0FDTCxJQUFJLEVBQUUsUUFBUTtnQ0FDZCxXQUFXLEVBQUUseUJBQXlCOzZCQUN2Qzs0QkFDRCxLQUFLLEVBQUU7Z0NBQ0wsSUFBSSxFQUFFLFFBQVE7Z0NBQ2QsV0FBVyxFQUFFLDJDQUEyQzs2QkFDekQ7eUJBQ0Y7d0JBQ0QsUUFBUSxFQUFFLENBQUMsV0FBVyxFQUFFLFNBQVMsQ0FBQztxQkFDbkM7aUJBQ0Y7Z0JBQ0Q7b0JBQ0UsSUFBSSxFQUFFLDJCQUEyQjtvQkFDakMsV0FBVyxFQUFFLHdDQUF3QztvQkFDckQsV0FBVyxFQUFFO3dCQUNYLElBQUksRUFBRSxRQUFRO3dCQUNkLFVBQVUsRUFBRSxFQUFFO3FCQUNmO2lCQUNGO2dCQUNEO29CQUNFLElBQUksRUFBRSxtQkFBbUI7b0JBQ3pCLFdBQVcsRUFBRSw0QkFBNEI7b0JBQ3pDLFdBQVcsRUFBRTt3QkFDWCxJQUFJLEVBQUUsUUFBUTt3QkFDZCxVQUFVLEVBQUU7NEJBQ1YsT0FBTyxFQUFFO2dDQUNQLElBQUksRUFBRSxRQUFRO2dDQUNkLFdBQVcsRUFBRSxpQ0FBaUM7NkJBQy9DOzRCQUNELFNBQVMsRUFBRTtnQ0FDVCxJQUFJLEVBQUUsUUFBUTtnQ0FDZCxXQUFXLEVBQUUsaUNBQWlDOzZCQUMvQzt5QkFDRjt3QkFDRCxRQUFRLEVBQUUsQ0FBQyxTQUFTLEVBQUUsV0FBVyxDQUFDO3FCQUNuQztpQkFDRjtnQkFDRDtvQkFDRSxJQUFJLEVBQUUscUJBQXFCO29CQUMzQixXQUFXLEVBQUUsZ0NBQWdDO29CQUM3QyxXQUFXLEVBQUU7d0JBQ1gsSUFBSSxFQUFFLFFBQVE7d0JBQ2QsVUFBVSxFQUFFOzRCQUNWLE9BQU8sRUFBRTtnQ0FDUCxJQUFJLEVBQUUsUUFBUTtnQ0FDZCxXQUFXLEVBQUUsaUNBQWlDOzZCQUMvQzs0QkFDRCxTQUFTLEVBQUU7Z0NBQ1QsSUFBSSxFQUFFLFFBQVE7Z0NBQ2QsV0FBVyxFQUFFLG1DQUFtQzs2QkFDakQ7eUJBQ0Y7d0JBQ0QsUUFBUSxFQUFFLENBQUMsU0FBUyxFQUFFLFdBQVcsQ0FBQztxQkFDbkM7aUJBQ0Y7Z0JBQ0Q7b0JBQ0UsSUFBSSxFQUFFLHNCQUFzQjtvQkFDNUIsV0FBVyxFQUFFLGtCQUFrQjtvQkFDL0IsV0FBVyxFQUFFO3dCQUNYLElBQUksRUFBRSxRQUFRO3dCQUNkLFVBQVUsRUFBRTs0QkFDVixPQUFPLEVBQUU7Z0NBQ1AsSUFBSSxFQUFFLFFBQVE7Z0NBQ2QsV0FBVyxFQUFFLGlDQUFpQzs2QkFDL0M7NEJBQ0QsU0FBUyxFQUFFO2dDQUNULElBQUksRUFBRSxRQUFRO2dDQUNkLFdBQVcsRUFBRSxvQ0FBb0M7NkJBQ2xEO3lCQUNGO3dCQUNELFFBQVEsRUFBRSxDQUFDLFNBQVMsRUFBRSxXQUFXLENBQUM7cUJBQ25DO2lCQUNGO2dCQUNEO29CQUNFLElBQUksRUFBRSxvQkFBb0I7b0JBQzFCLFdBQVcsRUFBRSwwQkFBMEI7b0JBQ3ZDLFdBQVcsRUFBRTt3QkFDWCxJQUFJLEVBQUUsUUFBUTt3QkFDZCxVQUFVLEVBQUU7NEJBQ1YsT0FBTyxFQUFFO2dDQUNQLElBQUksRUFBRSxRQUFRO2dDQUNkLFdBQVcsRUFBRSxpQ0FBaUM7NkJBQy9DOzRCQUNELFNBQVMsRUFBRTtnQ0FDVCxJQUFJLEVBQUUsUUFBUTtnQ0FDZCxXQUFXLEVBQUUsa0NBQWtDOzZCQUNoRDs0QkFDRCxJQUFJLEVBQUU7Z0NBQ0osSUFBSSxFQUFFLFFBQVE7Z0NBQ2QsV0FBVyxFQUFFLDBCQUEwQjs2QkFDeEM7eUJBQ0Y7d0JBQ0QsUUFBUSxFQUFFLENBQUMsU0FBUyxFQUFFLFdBQVcsRUFBRSxNQUFNLENBQUM7cUJBQzNDO2lCQUNGO2dCQUNEO29CQUNFLElBQUksRUFBRSx3QkFBd0I7b0JBQzlCLFdBQVcsRUFBRSxxQ0FBcUM7b0JBQ2xELFdBQVcsRUFBRTt3QkFDWCxJQUFJLEVBQUUsUUFBUTt3QkFDZCxVQUFVLEVBQUU7NEJBQ1YsT0FBTyxFQUFFO2dDQUNQLElBQUksRUFBRSxRQUFRO2dDQUNkLFdBQVcsRUFBRSx1QkFBdUI7NkJBQ3JDOzRCQUNELElBQUksRUFBRTtnQ0FDSixJQUFJLEVBQUUsUUFBUTtnQ0FDZCxXQUFXLEVBQUUsY0FBYzs2QkFDNUI7NEJBQ0QsT0FBTyxFQUFFO2dDQUNQLElBQUksRUFBRSxRQUFRO2dDQUNkLFdBQVcsRUFBRSw0Q0FBNEM7NkJBQzFEO3lCQUNGO3dCQUNELFFBQVEsRUFBRSxDQUFDLFNBQVMsRUFBRSxNQUFNLEVBQUUsU0FBUyxDQUFDO3FCQUN6QztpQkFDRjtnQkFDRDtvQkFDRSxJQUFJLEVBQUUsdUJBQXVCO29CQUM3QixXQUFXLEVBQUUsNkJBQTZCO29CQUMxQyxXQUFXLEVBQUU7d0JBQ1gsSUFBSSxFQUFFLFFBQVE7d0JBQ2QsVUFBVSxFQUFFOzRCQUNWLE9BQU8sRUFBRTtnQ0FDUCxJQUFJLEVBQUUsUUFBUTtnQ0FDZCxXQUFXLEVBQUUsMkJBQTJCOzZCQUN6Qzt5QkFDRjt3QkFDRCxRQUFRLEVBQUUsQ0FBQyxTQUFTLENBQUM7cUJBQ3RCO2lCQUNGO2dCQUNEO29CQUNFLElBQUksRUFBRSx3QkFBd0I7b0JBQzlCLFdBQVcsRUFBRSx1Q0FBdUM7b0JBQ3BELFdBQVcsRUFBRTt3QkFDWCxJQUFJLEVBQUUsUUFBUTt3QkFDZCxVQUFVLEVBQUU7NEJBQ1YsT0FBTyxFQUFFO2dDQUNQLElBQUksRUFBRSxRQUFRO2dDQUNkLFdBQVcsRUFBRSw0QkFBNEI7NkJBQzFDO3lCQUNGO3dCQUNELFFBQVEsRUFBRSxDQUFDLFNBQVMsQ0FBQztxQkFDdEI7aUJBQ0Y7Z0JBQ0Q7b0JBQ0UsSUFBSSxFQUFFLHVCQUF1QjtvQkFDN0IsV0FBVyxFQUFFLG1CQUFtQjtvQkFDaEMsV0FBVyxFQUFFO3dCQUNYLElBQUksRUFBRSxRQUFRO3dCQUNkLFVBQVUsRUFBRTs0QkFDVixJQUFJLEVBQUU7Z0NBQ0osSUFBSSxFQUFFLFFBQVE7Z0NBQ2QsV0FBVyxFQUFFLGVBQWU7NkJBQzdCOzRCQUNELElBQUksRUFBRTtnQ0FDSixJQUFJLEVBQUUsUUFBUTtnQ0FDZCxXQUFXLEVBQUUsbUVBQW1FOzZCQUNqRjt5QkFDRjt3QkFDRCxRQUFRLEVBQUUsQ0FBQyxNQUFNLEVBQUUsTUFBTSxDQUFDO3FCQUMzQjtpQkFDRjtnQkFDRDtvQkFDRSxJQUFJLEVBQUUsc0JBQXNCO29CQUM1QixXQUFXLEVBQUUsMkJBQTJCO29CQUN4QyxXQUFXLEVBQUU7d0JBQ1gsSUFBSSxFQUFFLFFBQVE7d0JBQ2QsVUFBVSxFQUFFLEVBQUU7cUJBQ2Y7aUJBQ0Y7Z0JBQ0Q7b0JBQ0UsSUFBSSxFQUFFLHdCQUF3QjtvQkFDOUIsV0FBVyxFQUFFLDJDQUEyQztvQkFDeEQsV0FBVyxFQUFFO3dCQUNYLElBQUksRUFBRSxRQUFRO3dCQUNkLFVBQVUsRUFBRSxFQUFFO3FCQUNmO2lCQUNGO2dCQUNEO29CQUNFLElBQUksRUFBRSw4QkFBOEI7b0JBQ3BDLFdBQVcsRUFBRSxxREFBcUQ7b0JBQ2xFLFdBQVcsRUFBRTt3QkFDWCxJQUFJLEVBQUUsUUFBUTt3QkFDZCxVQUFVLEVBQUU7NEJBQ1YsT0FBTyxFQUFFO2dDQUNQLElBQUksRUFBRSxRQUFRO2dDQUNkLFdBQVcsRUFBRSxvQkFBb0I7NkJBQ2xDOzRCQUNELE1BQU0sRUFBRTtnQ0FDTixJQUFJLEVBQUUsT0FBTztnQ0FDYixXQUFXLEVBQUUsNENBQTRDOzZCQUMxRDs0QkFDRCxJQUFJLEVBQUU7Z0NBQ0osSUFBSSxFQUFFLFFBQVE7Z0NBQ2QsV0FBVyxFQUFFLGVBQWU7NkJBQzdCO3lCQUNGO3dCQUNELFFBQVEsRUFBRSxDQUFDLFNBQVMsRUFBRSxRQUFRLENBQUM7cUJBQ2hDO2lCQUNGO2dCQUNEO29CQUNFLElBQUksRUFBRSwyQkFBMkI7b0JBQ2pDLFdBQVcsRUFBRSxrQ0FBa0M7b0JBQy9DLFdBQVcsRUFBRTt3QkFDWCxJQUFJLEVBQUUsUUFBUTt3QkFDZCxVQUFVLEVBQUU7NEJBQ1YsT0FBTyxFQUFFO2dDQUNQLElBQUksRUFBRSxRQUFRO2dDQUNkLFdBQVcsRUFBRSxrQkFBa0I7NkJBQ2hDOzRCQUNELEtBQUssRUFBRTtnQ0FDTCxJQUFJLEVBQUUsUUFBUTtnQ0FDZCxXQUFXLEVBQUUsbUNBQW1DOzZCQUNqRDt5QkFDRjt3QkFDRCxRQUFRLEVBQUUsQ0FBQyxTQUFTLENBQUM7cUJBQ3RCO2lCQUNGO2dCQUNEO29CQUNFLElBQUksRUFBRSwyQkFBMkI7b0JBQ2pDLFdBQVcsRUFBRSw0Q0FBNEM7b0JBQ3pELFdBQVcsRUFBRTt3QkFDWCxJQUFJLEVBQUUsUUFBUTt3QkFDZCxVQUFVLEVBQUU7NEJBQ1YsT0FBTyxFQUFFO2dDQUNQLElBQUksRUFBRSxRQUFRO2dDQUNkLFdBQVcsRUFBRSxZQUFZOzZCQUMxQjs0QkFDRCxVQUFVLEVBQUU7Z0NBQ1YsSUFBSSxFQUFFLE9BQU87Z0NBQ2IsS0FBSyxFQUFFO29DQUNMLElBQUksRUFBRSxRQUFRO2lDQUNmO2dDQUNELFdBQVcsRUFBRSw2QkFBNkI7NkJBQzNDOzRCQUNELFFBQVEsRUFBRTtnQ0FDUixJQUFJLEVBQUUsUUFBUTtnQ0FDZCxXQUFXLEVBQUUsMEJBQTBCOzZCQUN4Qzt5QkFDRjt3QkFDRCxRQUFRLEVBQUUsQ0FBQyxTQUFTLEVBQUUsWUFBWSxFQUFFLFVBQVUsQ0FBQztxQkFDaEQ7aUJBQ0Y7Z0JBQ0Q7b0JBQ0UsSUFBSSxFQUFFLHVCQUF1QjtvQkFDN0IsV0FBVyxFQUFFLDZDQUE2QztvQkFDMUQsV0FBVyxFQUFFO3dCQUNYLElBQUksRUFBRSxRQUFRO3dCQUNkLFVBQVUsRUFBRTs0QkFDVixjQUFjLEVBQUU7Z0NBQ2QsSUFBSSxFQUFFLFFBQVE7Z0NBQ2QsV0FBVyxFQUFFLG1CQUFtQjs2QkFDakM7NEJBQ0QsU0FBUyxFQUFFO2dDQUNULElBQUksRUFBRSxRQUFRO2dDQUNkLFdBQVcsRUFBRSw4QkFBOEI7NkJBQzVDOzRCQUNELGNBQWMsRUFBRTtnQ0FDZCxJQUFJLEVBQUUsUUFBUTtnQ0FDZCxXQUFXLEVBQUUsaUNBQWlDOzZCQUMvQzs0QkFDRCxPQUFPLEVBQUU7Z0NBQ1AsSUFBSSxFQUFFLFFBQVE7Z0NBQ2QsV0FBVyxFQUFFLGtDQUFrQzs2QkFDaEQ7eUJBQ0Y7d0JBQ0QsUUFBUSxFQUFFLENBQUMsZ0JBQWdCLEVBQUUsV0FBVyxFQUFFLGdCQUFnQixDQUFDO3FCQUM1RDtpQkFDRjtnQkFDRDtvQkFDRSxJQUFJLEVBQUUsNkJBQTZCO29CQUNuQyxXQUFXLEVBQUUsZ0RBQWdEO29CQUM3RCxXQUFXLEVBQUU7d0JBQ1gsSUFBSSxFQUFFLFFBQVE7d0JBQ2QsVUFBVSxFQUFFOzRCQUNWLGNBQWMsRUFBRTtnQ0FDZCxJQUFJLEVBQUUsUUFBUTtnQ0FDZCxXQUFXLEVBQUUsbUJBQW1COzZCQUNqQzs0QkFDRCxVQUFVLEVBQUU7Z0NBQ1YsSUFBSSxFQUFFLE9BQU87Z0NBQ2IsS0FBSyxFQUFFO29DQUNMLElBQUksRUFBRSxRQUFRO2lDQUNmO2dDQUNELFdBQVcsRUFBRSw2QkFBNkI7NkJBQzNDOzRCQUNELGVBQWUsRUFBRTtnQ0FDZixJQUFJLEVBQUUsT0FBTztnQ0FDYixLQUFLLEVBQUU7b0NBQ0wsSUFBSSxFQUFFLFFBQVE7aUNBQ2Y7Z0NBQ0QsV0FBVyxFQUFFLDZCQUE2Qjs2QkFDM0M7NEJBQ0QsT0FBTyxFQUFFO2dDQUNQLElBQUksRUFBRSxRQUFRO2dDQUNkLFdBQVcsRUFBRSxrQ0FBa0M7NkJBQ2hEO3lCQUNGO3dCQUNELFFBQVEsRUFBRSxDQUFDLGdCQUFnQixFQUFFLFlBQVksRUFBRSxpQkFBaUIsQ0FBQztxQkFDOUQ7aUJBQ0Y7Z0JBQ0Q7b0JBQ0UsSUFBSSxFQUFFLDBCQUEwQjtvQkFDaEMsV0FBVyxFQUFFLHFDQUFxQztvQkFDbEQsV0FBVyxFQUFFO3dCQUNYLElBQUksRUFBRSxRQUFRO3dCQUNkLFVBQVUsRUFBRTs0QkFDVixPQUFPLEVBQUU7Z0NBQ1AsSUFBSSxFQUFFLFFBQVE7Z0NBQ2QsV0FBVyxFQUFFLGdDQUFnQzs2QkFDOUM7NEJBQ0QsU0FBUyxFQUFFO2dDQUNULElBQUksRUFBRSxRQUFRO2dDQUNkLFdBQVcsRUFBRSxrREFBa0Q7NkJBQ2hFOzRCQUNELEtBQUssRUFBRTtnQ0FDTCxJQUFJLEVBQUUsUUFBUTtnQ0FDZCxXQUFXLEVBQUUsNENBQTRDOzZCQUMxRDt5QkFDRjt3QkFDRCxRQUFRLEVBQUUsQ0FBQyxTQUFTLEVBQUUsV0FBVyxDQUFDO3FCQUNuQztpQkFDRjtnQkFDRDtvQkFDRSxJQUFJLEVBQUUsbUJBQW1CO29CQUN6QixXQUFXLEVBQUUsNEpBQTRKO29CQUN6SyxXQUFXLEVBQUU7d0JBQ1gsSUFBSSxFQUFFLFFBQVE7d0JBQ2QsVUFBVSxFQUFFOzRCQUNWLE9BQU8sRUFBRTtnQ0FDUCxJQUFJLEVBQUUsUUFBUTtnQ0FDZCxXQUFXLEVBQUUseUJBQXlCOzZCQUN2Qzs0QkFDRCxTQUFTLEVBQUU7Z0NBQ1QsSUFBSSxFQUFFLFFBQVE7Z0NBQ2QsV0FBVyxFQUFFLDJCQUEyQjs2QkFDekM7NEJBQ0QsS0FBSyxFQUFFO2dDQUNMLElBQUksRUFBRSxRQUFRO2dDQUNkLFdBQVcsRUFBRSxxQkFBcUI7NkJBQ25DOzRCQUNELGVBQWUsRUFBRTtnQ0FDZixJQUFJLEVBQUUsUUFBUTtnQ0FDZCxXQUFXLEVBQUUsOEJBQThCOzZCQUM1Qzt5QkFDRjt3QkFDRCxRQUFRLEVBQUUsQ0FBQyxTQUFTLEVBQUUsV0FBVyxDQUFDO3FCQUNuQztpQkFDRjtnQkFDRDtvQkFDRSxJQUFJLEVBQUUsb0JBQW9CO29CQUMxQixXQUFXLEVBQUUsOFpBQThaO29CQUMzYSxXQUFXLEVBQUU7d0JBQ1gsSUFBSSxFQUFFLFFBQVE7d0JBQ2QsVUFBVSxFQUFFOzRCQUNWLE9BQU8sRUFBRTtnQ0FDUCxJQUFJLEVBQUUsUUFBUTtnQ0FDZCxXQUFXLEVBQUUsdUJBQXVCOzZCQUNyQzs0QkFDRCxlQUFlLEVBQUU7Z0NBQ2YsSUFBSSxFQUFFLFFBQVE7Z0NBQ2QsV0FBVyxFQUFFLHFDQUFxQzs2QkFDbkQ7NEJBQ0QsWUFBWSxFQUFFO2dDQUNaLElBQUksRUFBRSxRQUFRO2dDQUNkLElBQUksRUFBRSxDQUFDLE1BQU0sRUFBRSxTQUFTLENBQUM7Z0NBQ3pCLFdBQVcsRUFBRSxxREFBcUQ7NkJBQ25FOzRCQUNELEtBQUssRUFBRTtnQ0FDTCxJQUFJLEVBQUUsUUFBUTtnQ0FDZCxXQUFXLEVBQUUsdUJBQXVCOzZCQUNyQzs0QkFDRCxlQUFlLEVBQUU7Z0NBQ2YsSUFBSSxFQUFFLFFBQVE7Z0NBQ2QsV0FBVyxFQUFFLGlDQUFpQzs2QkFDL0M7eUJBQ0Y7d0JBQ0QsUUFBUSxFQUFFLENBQUMsU0FBUyxFQUFFLGlCQUFpQixDQUFDO3FCQUN6QztpQkFDRjthQUNGLENBQUM7WUFFRixPQUFPLEVBQUUsS0FBSyxFQUFFLENBQUM7UUFDbkIsQ0FBQyxDQUFDLENBQUM7UUFFSCxJQUFJLENBQUMsTUFBTSxDQUFDLGlCQUFpQixDQUFDLHFCQUFxQixFQUFFLEtBQUssRUFBRSxPQUFPLEVBQUUsRUFBRTtZQUNyRSxJQUFJLENBQUM7Z0JBQ0gsTUFBTSxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsSUFBSSxFQUFFLEdBQUcsT0FBTyxDQUFDLE1BQU0sQ0FBQztnQkFFakQsUUFBUSxJQUFJLEVBQUUsQ0FBQztvQkFDYiwyQkFBMkI7b0JBQzNCLEtBQUssZUFBZTt3QkFDbEIsT0FBTyxNQUFNLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLENBQUM7b0JBQ3ZDLEtBQUssZ0JBQWdCO3dCQUNuQixPQUFPLE1BQU0sSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsQ0FBQztvQkFDeEMsS0FBSyxhQUFhO3dCQUNoQixPQUFPLE1BQU0sSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQztvQkFDckMsS0FBSyxnQkFBZ0I7d0JBQ25CLE9BQU8sTUFBTSxJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxDQUFDO29CQUN4QyxLQUFLLG9CQUFvQjt3QkFDdkIsT0FBTyxNQUFNLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsQ0FBQztvQkFDM0MsS0FBSyxxQkFBcUI7d0JBQ3hCLE9BQU8sTUFBTSxJQUFJLENBQUMsaUJBQWlCLENBQUMsSUFBSSxDQUFDLENBQUM7b0JBQzVDLEtBQUssZ0JBQWdCO3dCQUNuQixPQUFPLE1BQU0sSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsQ0FBQztvQkFFeEMsdUJBQXVCO29CQUN2QixLQUFLLHFCQUFxQjt3QkFDeEIsT0FBTyxNQUFNLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsQ0FBQztvQkFDNUMsS0FBSyxvQkFBb0I7d0JBQ3ZCLE9BQU8sTUFBTSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLENBQUM7b0JBQzNDLEtBQUssMkJBQTJCO3dCQUM5QixPQUFPLE1BQU0sSUFBSSxDQUFDLHNCQUFzQixDQUFDLElBQUksQ0FBQyxDQUFDO29CQUNqRCxLQUFLLG9CQUFvQjt3QkFDdkIsT0FBTyxNQUFNLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsQ0FBQztvQkFDM0MsS0FBSyxrQkFBa0I7d0JBQ3JCLE9BQU8sTUFBTSxJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxDQUFDO29CQUN6QyxLQUFLLHdCQUF3Qjt3QkFDM0IsT0FBTyxNQUFNLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsQ0FBQztvQkFDN0MsS0FBSyxxQkFBcUI7d0JBQ3hCLE9BQU8sTUFBTSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLENBQUM7b0JBQzNDLEtBQUssb0JBQW9CO3dCQUN2QixPQUFPLE1BQU0sSUFBSSxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxDQUFDO29CQUMzQyxLQUFLLHVCQUF1Qjt3QkFDMUIsT0FBTyxNQUFNLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxJQUFJLENBQUMsQ0FBQztvQkFDOUMsS0FBSyxzQkFBc0I7d0JBQ3pCLE9BQU8sTUFBTSxJQUFJLENBQUMsaUJBQWlCLENBQUMsSUFBSSxDQUFDLENBQUM7b0JBQzVDLEtBQUssNEJBQTRCO3dCQUMvQixPQUFPLE1BQU0sSUFBSSxDQUFDLHNCQUFzQixDQUFDLElBQUksQ0FBQyxDQUFDO29CQUNqRCxLQUFLLDJCQUEyQjt3QkFDOUIsT0FBTyxNQUFNLElBQUksQ0FBQyxzQkFBc0IsRUFBRSxDQUFDO29CQUM3QyxLQUFLLG1CQUFtQjt3QkFDdEIsT0FBTyxNQUFNLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLENBQUM7b0JBQzFDLEtBQUsscUJBQXFCO3dCQUN4QixPQUFPLE1BQU0sSUFBSSxDQUFDLGlCQUFpQixDQUFDLElBQUksQ0FBQyxDQUFDO29CQUM1QyxLQUFLLHNCQUFzQjt3QkFDekIsT0FBTyxNQUFNLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsQ0FBQztvQkFDN0MsS0FBSyxvQkFBb0I7d0JBQ3ZCLE9BQU8sTUFBTSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLENBQUM7b0JBQzNDLEtBQUssd0JBQXdCO3dCQUMzQixPQUFPLE1BQU0sSUFBSSxDQUFDLG9CQUFvQixDQUFDLElBQUksQ0FBQyxDQUFDO29CQUMvQyxLQUFLLHVCQUF1Qjt3QkFDMUIsT0FBTyxNQUFNLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsQ0FBQztvQkFDN0MsS0FBSyx3QkFBd0I7d0JBQzNCLE9BQU8sTUFBTSxJQUFJLENBQUMsbUJBQW1CLENBQUMsSUFBSSxDQUFDLENBQUM7b0JBQzlDLEtBQUssdUJBQXVCO3dCQUMxQixPQUFPLE1BQU0sSUFBSSxDQUFDLG1CQUFtQixDQUFDLElBQUksQ0FBQyxDQUFDO29CQUM5QyxLQUFLLHNCQUFzQjt3QkFDekIsT0FBTyxNQUFNLElBQUksQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO29CQUN6QyxLQUFLLHdCQUF3Qjt3QkFDM0IsT0FBTyxNQUFNLElBQUksQ0FBQyxtQkFBbUIsRUFBRSxDQUFDO29CQUMxQyxLQUFLLDhCQUE4Qjt3QkFDakMsT0FBTyxNQUFNLElBQUksQ0FBQyx5QkFBeUIsQ0FBQyxJQUFJLENBQUMsQ0FBQztvQkFDcEQsS0FBSywyQkFBMkI7d0JBQzlCLE9BQU8sTUFBTSxJQUFJLENBQUMsc0JBQXNCLENBQUMsSUFBSSxDQUFDLENBQUM7b0JBQ2pELEtBQUssMkJBQTJCO3dCQUM5QixPQUFPLE1BQU0sSUFBSSxDQUFDLHNCQUFzQixDQUFDLElBQUksQ0FBQyxDQUFDO29CQUNqRCxLQUFLLHVCQUF1Qjt3QkFDMUIsT0FBTyxNQUFNLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxJQUFJLENBQUMsQ0FBQztvQkFDOUMsS0FBSyw2QkFBNkI7d0JBQ2hDLE9BQU8sTUFBTSxJQUFJLENBQUMsd0JBQXdCLENBQUMsSUFBSSxDQUFDLENBQUM7b0JBQ25ELEtBQUssMEJBQTBCO3dCQUM3QixPQUFPLE1BQU0sSUFBSSxDQUFDLHFCQUFxQixDQUFDLElBQUksQ0FBQyxDQUFDO29CQUNoRCxLQUFLLG1CQUFtQjt3QkFDdEIsT0FBTyxNQUFNLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLENBQUM7b0JBQzFDLEtBQUssb0JBQW9CO3dCQUN2QixPQUFPLE1BQU0sSUFBSSxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxDQUFDO29CQUUzQzt3QkFDRSxNQUFNLElBQUksS0FBSyxDQUFDLGlCQUFpQixJQUFJLEVBQUUsQ0FBQyxDQUFDO2dCQUM3QyxDQUFDO1lBQ0gsQ0FBQztZQUFDLE9BQU8sS0FBSyxFQUFFLENBQUM7Z0JBQ2YsTUFBTSxZQUFZLEdBQUcsS0FBSyxZQUFZLEtBQUssQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO2dCQUM1RSxPQUFPO29CQUNMLE9BQU8sRUFBRTt3QkFDUDs0QkFDRSxJQUFJLEVBQUUsTUFBTTs0QkFDWixJQUFJLEVBQUUsVUFBVSxZQUFZLEVBQUU7eUJBQy9CO3FCQUNGO29CQUNELE9BQU8sRUFBRSxJQUFJO2lCQUNkLENBQUM7WUFDSixDQUFDO1FBQ0gsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQsS0FBSyxDQUFDLEdBQUc7UUFDUCxNQUFNLFNBQVMsR0FBRyxJQUFJLG9CQUFvQixFQUFFLENBQUM7UUFDN0MsTUFBTSxJQUFJLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUNyQyxPQUFPLENBQUMsS0FBSyxDQUFDLHdEQUF3RCxDQUFDLENBQUM7UUFFeEUsb0RBQW9EO1FBQ3BELE1BQU0sSUFBSSxDQUFDLHFCQUFxQixFQUFFLENBQUM7SUFDckMsQ0FBQztDQUNGO0FBRUQsTUFBTSxNQUFNLEdBQUcsSUFBSSxlQUFlLEVBQUUsQ0FBQztBQUNyQyxNQUFNLENBQUMsR0FBRyxFQUFFLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQyJ9
|
|
3321
|
+
// Only start the stdio server when run directly as a CLI. Guarding this lets the
|
|
3322
|
+
// module be imported by the test suite without spawning the server / connecting a
|
|
3323
|
+
// transport. We resolve symlinks on both sides so this matches whether launched as
|
|
3324
|
+
// `node dist/index.js` OR via a bin symlink (`npx @chinchillaenterprises/mcp-slack`,
|
|
3325
|
+
// global install) — the latter sets argv[1] to `.bin/mcp-slack`, which a plain
|
|
3326
|
+
// equality check against the real module path would miss, silently skipping startup.
|
|
3327
|
+
const isMain = (() => {
|
|
3328
|
+
const entry = process.argv[1];
|
|
3329
|
+
if (!entry)
|
|
3330
|
+
return false;
|
|
3331
|
+
const self = fileURLToPath(import.meta.url);
|
|
3332
|
+
try {
|
|
3333
|
+
return realpathSync(entry) === realpathSync(self);
|
|
3334
|
+
}
|
|
3335
|
+
catch {
|
|
3336
|
+
return entry === self;
|
|
3337
|
+
}
|
|
3338
|
+
})();
|
|
3339
|
+
if (isMain) {
|
|
3340
|
+
const server = new SlackerV3Server();
|
|
3341
|
+
server.run().catch(console.error);
|
|
3342
|
+
}
|
|
3343
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUVBLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSwyQ0FBMkMsQ0FBQztBQUNuRSxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSwyQ0FBMkMsQ0FBQztBQUNqRixPQUFPLEVBQ0wsc0JBQXNCLEVBQ3RCLHFCQUFxQixHQUV0QixNQUFNLG9DQUFvQyxDQUFDO0FBQzVDLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUMzQyxPQUFPLEVBQUUsQ0FBQyxFQUFFLE1BQU0sS0FBSyxDQUFDO0FBQ3hCLE9BQU8sRUFBRSxRQUFRLElBQUksRUFBRSxFQUFFLE1BQU0sSUFBSSxDQUFDO0FBQ3BDLE9BQU8sRUFBb0IsWUFBWSxFQUFFLE1BQU0sSUFBSSxDQUFDO0FBQ3BELE9BQU8sSUFBSSxNQUFNLE1BQU0sQ0FBQztBQUN4QixPQUFPLEVBQUUsTUFBTSxJQUFJLENBQUM7QUFDcEIsT0FBTyxNQUFNLE1BQU0sUUFBUSxDQUFDO0FBQzVCLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxJQUFJLENBQUM7QUFDNUIsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUN6QyxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQ2pDLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxLQUFLLENBQUM7QUFDcEMsT0FBTyxJQUFJLE1BQU0sU0FBUyxDQUFDO0FBRTNCLE1BQU0sYUFBYSxHQUFHLFNBQVMsQ0FBQyxRQUFRLENBQUMsQ0FBQztBQUUxQyx3RkFBd0Y7QUFDeEYsdUNBQXVDO0FBQ3ZDLHdGQUF3RjtBQUN4RixtRkFBbUY7QUFDbkYsRUFBRTtBQUNGLGdGQUFnRjtBQUNoRixvRkFBb0Y7QUFDcEYsc0ZBQXNGO0FBQ3RGLHFGQUFxRjtBQUNyRix5RUFBeUU7QUFDekUsd0ZBQXdGO0FB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LENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFFOUQsTUFBTSxHQUFHLEdBQUcsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUMxRCxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FDM0IsS0FBSyxDQUFDLElBQUksQ0FBQyxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQzVFLENBQUM7SUFFRixNQUFNLE1BQU0sR0FBRyxLQUFLLENBQUMsSUFBSSxDQUFDLEVBQUUsTUFBTSxFQUFFLFFBQVEsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQ3ZELElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sRUFBRSxHQUFHLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FDN0QsQ0FBQztJQUVGLE1BQU0sR0FBRyxHQUFHLENBQUMsQ0FBUyxFQUFFLENBQVMsRUFBRSxLQUF1QixFQUFFLEVBQUUsQ0FDNUQsS0FBSyxLQUFLLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUVsRCxNQUFNLEdBQUcsR0FBTSxHQUFHLEdBQUcsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsR0FBRyxDQUFDO0lBQzFFLE1BQU0sR0FBRyxHQUFNLEdBQUcsR0FBRyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxHQUFHLENBQUM7SUFDMUUsTUFBTSxNQUFNLEdBQUcsR0FBRyxHQUFHLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEdBQUcsQ0FBQztJQUUxRSxNQUFNLE1BQU0sR0FBRyxDQUFDLENBQVcsRUFBRSxFQUFFLENBQzdCLElBQUksR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsSUFBSSxDQUFDO0lBRTFFLE1BQU0sS0FBSyxHQUFHLENBQUMsR0FBRyxFQUFFLE1BQU0sQ0FBQyxHQUFHLENBQUMsRUFBRSxHQUFHLEVBQUUsR0FBRyxLQUFLLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxFQUFFLE1BQU0sQ0FBQyxDQUFDO0lBQ3BFLE9BQU8sS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztBQUMxQixDQUFDO0FBRUQsTUFBTSxVQUFVLFlBQVksQ0FBQyxDQUFVO0lBQ3JDLElB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
|