source dump of claude code
at main 398 lines 40 kB view raw
1import { c as _c } from "react/compiler-runtime"; 2import React, { useEffect, useMemo } from 'react'; 3import type { CommandResultDisplay } from '../../commands.js'; 4import { ClaudeAuthProvider } from '../../services/mcp/auth.js'; 5import type { McpClaudeAIProxyServerConfig, McpHTTPServerConfig, McpSSEServerConfig, McpStdioServerConfig } from '../../services/mcp/types.js'; 6import { extractAgentMcpServers, filterToolsByServer } from '../../services/mcp/utils.js'; 7import { useAppState } from '../../state/AppState.js'; 8import { getSessionIngressAuthToken } from '../../utils/sessionIngressAuth.js'; 9import { MCPAgentServerMenu } from './MCPAgentServerMenu.js'; 10import { MCPListPanel } from './MCPListPanel.js'; 11import { MCPRemoteServerMenu } from './MCPRemoteServerMenu.js'; 12import { MCPStdioServerMenu } from './MCPStdioServerMenu.js'; 13import { MCPToolDetailView } from './MCPToolDetailView.js'; 14import { MCPToolListView } from './MCPToolListView.js'; 15import type { AgentMcpServerInfo, MCPViewState, ServerInfo } from './types.js'; 16type Props = { 17 onComplete: (result?: string, options?: { 18 display?: CommandResultDisplay; 19 }) => void; 20}; 21export function MCPSettings(t0) { 22 const $ = _c(66); 23 const { 24 onComplete 25 } = t0; 26 const mcp = useAppState(_temp); 27 const agentDefinitions = useAppState(_temp2); 28 const mcpClients = mcp.clients; 29 let t1; 30 if ($[0] === Symbol.for("react.memo_cache_sentinel")) { 31 t1 = { 32 type: "list" 33 }; 34 $[0] = t1; 35 } else { 36 t1 = $[0]; 37 } 38 const [viewState, setViewState] = React.useState(t1); 39 let t2; 40 if ($[1] === Symbol.for("react.memo_cache_sentinel")) { 41 t2 = []; 42 $[1] = t2; 43 } else { 44 t2 = $[1]; 45 } 46 const [servers, setServers] = React.useState(t2); 47 let t3; 48 if ($[2] !== agentDefinitions.allAgents) { 49 t3 = extractAgentMcpServers(agentDefinitions.allAgents); 50 $[2] = agentDefinitions.allAgents; 51 $[3] = t3; 52 } else { 53 t3 = $[3]; 54 } 55 const agentMcpServers = t3; 56 let t4; 57 if ($[4] !== mcpClients) { 58 t4 = mcpClients.filter(_temp3).sort(_temp4); 59 $[4] = mcpClients; 60 $[5] = t4; 61 } else { 62 t4 = $[5]; 63 } 64 const filteredClients = t4; 65 let t5; 66 let t6; 67 if ($[6] !== filteredClients || $[7] !== mcp.tools) { 68 t5 = () => { 69 let cancelled = false; 70 const prepareServers = async function prepareServers() { 71 const serverInfos = await Promise.all(filteredClients.map(async client_0 => { 72 const scope = client_0.config.scope; 73 const isSSE = client_0.config.type === "sse"; 74 const isHTTP = client_0.config.type === "http"; 75 const isClaudeAIProxy = client_0.config.type === "claudeai-proxy"; 76 let isAuthenticated = undefined; 77 if (isSSE || isHTTP) { 78 const authProvider = new ClaudeAuthProvider(client_0.name, client_0.config as McpSSEServerConfig | McpHTTPServerConfig); 79 const tokens = await authProvider.tokens(); 80 const hasSessionAuth = getSessionIngressAuthToken() !== null && client_0.type === "connected"; 81 const hasToolsAndConnected = client_0.type === "connected" && filterToolsByServer(mcp.tools, client_0.name).length > 0; 82 isAuthenticated = Boolean(tokens) || hasSessionAuth || hasToolsAndConnected; 83 } 84 const baseInfo = { 85 name: client_0.name, 86 client: client_0, 87 scope 88 }; 89 if (isClaudeAIProxy) { 90 return { 91 ...baseInfo, 92 transport: "claudeai-proxy" as const, 93 isAuthenticated: false, 94 config: client_0.config as McpClaudeAIProxyServerConfig 95 }; 96 } else { 97 if (isSSE) { 98 return { 99 ...baseInfo, 100 transport: "sse" as const, 101 isAuthenticated, 102 config: client_0.config as McpSSEServerConfig 103 }; 104 } else { 105 if (isHTTP) { 106 return { 107 ...baseInfo, 108 transport: "http" as const, 109 isAuthenticated, 110 config: client_0.config as McpHTTPServerConfig 111 }; 112 } else { 113 return { 114 ...baseInfo, 115 transport: "stdio" as const, 116 config: client_0.config as McpStdioServerConfig 117 }; 118 } 119 } 120 } 121 })); 122 if (cancelled) { 123 return; 124 } 125 setServers(serverInfos); 126 }; 127 prepareServers(); 128 return () => { 129 cancelled = true; 130 }; 131 }; 132 t6 = [filteredClients, mcp.tools]; 133 $[6] = filteredClients; 134 $[7] = mcp.tools; 135 $[8] = t5; 136 $[9] = t6; 137 } else { 138 t5 = $[8]; 139 t6 = $[9]; 140 } 141 React.useEffect(t5, t6); 142 let t7; 143 let t8; 144 if ($[10] !== agentMcpServers.length || $[11] !== filteredClients.length || $[12] !== onComplete || $[13] !== servers.length) { 145 t7 = () => { 146 if (servers.length === 0 && filteredClients.length > 0) { 147 return; 148 } 149 if (servers.length === 0 && agentMcpServers.length === 0) { 150 onComplete("No MCP servers configured. Please run /doctor if this is unexpected. Otherwise, run `claude mcp --help` or visit https://code.claude.com/docs/en/mcp to learn more."); 151 } 152 }; 153 t8 = [servers.length, filteredClients.length, agentMcpServers.length, onComplete]; 154 $[10] = agentMcpServers.length; 155 $[11] = filteredClients.length; 156 $[12] = onComplete; 157 $[13] = servers.length; 158 $[14] = t7; 159 $[15] = t8; 160 } else { 161 t7 = $[14]; 162 t8 = $[15]; 163 } 164 useEffect(t7, t8); 165 switch (viewState.type) { 166 case "list": 167 { 168 let t10; 169 let t9; 170 if ($[16] === Symbol.for("react.memo_cache_sentinel")) { 171 t9 = server => setViewState({ 172 type: "server-menu", 173 server 174 }); 175 t10 = agentServer => setViewState({ 176 type: "agent-server-menu", 177 agentServer 178 }); 179 $[16] = t10; 180 $[17] = t9; 181 } else { 182 t10 = $[16]; 183 t9 = $[17]; 184 } 185 let t11; 186 if ($[18] !== agentMcpServers || $[19] !== onComplete || $[20] !== servers || $[21] !== viewState.defaultTab) { 187 t11 = <MCPListPanel servers={servers} agentServers={agentMcpServers} onSelectServer={t9} onSelectAgentServer={t10} onComplete={onComplete} defaultTab={viewState.defaultTab} />; 188 $[18] = agentMcpServers; 189 $[19] = onComplete; 190 $[20] = servers; 191 $[21] = viewState.defaultTab; 192 $[22] = t11; 193 } else { 194 t11 = $[22]; 195 } 196 return t11; 197 } 198 case "server-menu": 199 { 200 let t9; 201 if ($[23] !== mcp.tools || $[24] !== viewState.server.name) { 202 t9 = filterToolsByServer(mcp.tools, viewState.server.name); 203 $[23] = mcp.tools; 204 $[24] = viewState.server.name; 205 $[25] = t9; 206 } else { 207 t9 = $[25]; 208 } 209 const serverTools_0 = t9; 210 const defaultTab = viewState.server.transport === "claudeai-proxy" ? "claude.ai" : "Claude Code"; 211 if (viewState.server.transport === "stdio") { 212 let t10; 213 if ($[26] !== viewState.server) { 214 t10 = () => setViewState({ 215 type: "server-tools", 216 server: viewState.server 217 }); 218 $[26] = viewState.server; 219 $[27] = t10; 220 } else { 221 t10 = $[27]; 222 } 223 let t11; 224 if ($[28] !== defaultTab) { 225 t11 = () => setViewState({ 226 type: "list", 227 defaultTab 228 }); 229 $[28] = defaultTab; 230 $[29] = t11; 231 } else { 232 t11 = $[29]; 233 } 234 let t12; 235 if ($[30] !== onComplete || $[31] !== serverTools_0.length || $[32] !== t10 || $[33] !== t11 || $[34] !== viewState.server) { 236 t12 = <MCPStdioServerMenu server={viewState.server} serverToolsCount={serverTools_0.length} onViewTools={t10} onCancel={t11} onComplete={onComplete} />; 237 $[30] = onComplete; 238 $[31] = serverTools_0.length; 239 $[32] = t10; 240 $[33] = t11; 241 $[34] = viewState.server; 242 $[35] = t12; 243 } else { 244 t12 = $[35]; 245 } 246 return t12; 247 } else { 248 let t10; 249 if ($[36] !== viewState.server) { 250 t10 = () => setViewState({ 251 type: "server-tools", 252 server: viewState.server 253 }); 254 $[36] = viewState.server; 255 $[37] = t10; 256 } else { 257 t10 = $[37]; 258 } 259 let t11; 260 if ($[38] !== defaultTab) { 261 t11 = () => setViewState({ 262 type: "list", 263 defaultTab 264 }); 265 $[38] = defaultTab; 266 $[39] = t11; 267 } else { 268 t11 = $[39]; 269 } 270 let t12; 271 if ($[40] !== onComplete || $[41] !== serverTools_0.length || $[42] !== t10 || $[43] !== t11 || $[44] !== viewState.server) { 272 t12 = <MCPRemoteServerMenu server={viewState.server} serverToolsCount={serverTools_0.length} onViewTools={t10} onCancel={t11} onComplete={onComplete} />; 273 $[40] = onComplete; 274 $[41] = serverTools_0.length; 275 $[42] = t10; 276 $[43] = t11; 277 $[44] = viewState.server; 278 $[45] = t12; 279 } else { 280 t12 = $[45]; 281 } 282 return t12; 283 } 284 } 285 case "server-tools": 286 { 287 let t10; 288 let t9; 289 if ($[46] !== viewState.server) { 290 t9 = (_, index) => setViewState({ 291 type: "server-tool-detail", 292 server: viewState.server, 293 toolIndex: index 294 }); 295 t10 = () => setViewState({ 296 type: "server-menu", 297 server: viewState.server 298 }); 299 $[46] = viewState.server; 300 $[47] = t10; 301 $[48] = t9; 302 } else { 303 t10 = $[47]; 304 t9 = $[48]; 305 } 306 let t11; 307 if ($[49] !== t10 || $[50] !== t9 || $[51] !== viewState.server) { 308 t11 = <MCPToolListView server={viewState.server} onSelectTool={t9} onBack={t10} />; 309 $[49] = t10; 310 $[50] = t9; 311 $[51] = viewState.server; 312 $[52] = t11; 313 } else { 314 t11 = $[52]; 315 } 316 return t11; 317 } 318 case "server-tool-detail": 319 { 320 let t9; 321 if ($[53] !== mcp.tools || $[54] !== viewState.server.name) { 322 t9 = filterToolsByServer(mcp.tools, viewState.server.name); 323 $[53] = mcp.tools; 324 $[54] = viewState.server.name; 325 $[55] = t9; 326 } else { 327 t9 = $[55]; 328 } 329 const serverTools = t9; 330 const tool = serverTools[viewState.toolIndex]; 331 if (!tool) { 332 setViewState({ 333 type: "server-tools", 334 server: viewState.server 335 }); 336 return null; 337 } 338 let t10; 339 if ($[56] !== viewState.server) { 340 t10 = () => setViewState({ 341 type: "server-tools", 342 server: viewState.server 343 }); 344 $[56] = viewState.server; 345 $[57] = t10; 346 } else { 347 t10 = $[57]; 348 } 349 let t11; 350 if ($[58] !== t10 || $[59] !== tool || $[60] !== viewState.server) { 351 t11 = <MCPToolDetailView tool={tool} server={viewState.server} onBack={t10} />; 352 $[58] = t10; 353 $[59] = tool; 354 $[60] = viewState.server; 355 $[61] = t11; 356 } else { 357 t11 = $[61]; 358 } 359 return t11; 360 } 361 case "agent-server-menu": 362 { 363 let t9; 364 if ($[62] === Symbol.for("react.memo_cache_sentinel")) { 365 t9 = () => setViewState({ 366 type: "list", 367 defaultTab: "Agents" 368 }); 369 $[62] = t9; 370 } else { 371 t9 = $[62]; 372 } 373 let t10; 374 if ($[63] !== onComplete || $[64] !== viewState.agentServer) { 375 t10 = <MCPAgentServerMenu agentServer={viewState.agentServer} onCancel={t9} onComplete={onComplete} />; 376 $[63] = onComplete; 377 $[64] = viewState.agentServer; 378 $[65] = t10; 379 } else { 380 t10 = $[65]; 381 } 382 return t10; 383 } 384 } 385} 386function _temp4(a, b) { 387 return a.name.localeCompare(b.name); 388} 389function _temp3(client) { 390 return client.name !== "ide"; 391} 392function _temp2(s_0) { 393 return s_0.agentDefinitions; 394} 395function _temp(s) { 396 return s.mcp; 397} 398//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJSZWFjdCIsInVzZUVmZmVjdCIsInVzZU1lbW8iLCJDb21tYW5kUmVzdWx0RGlzcGxheSIsIkNsYXVkZUF1dGhQcm92aWRlciIsIk1jcENsYXVkZUFJUHJveHlTZXJ2ZXJDb25maWciLCJNY3BIVFRQU2VydmVyQ29uZmlnIiwiTWNwU1NFU2VydmVyQ29uZmlnIiwiTWNwU3RkaW9TZXJ2ZXJDb25maWciLCJleHRyYWN0QWdlbnRNY3BTZXJ2ZXJzIiwiZmlsdGVyVG9vbHNCeVNlcnZlciIsInVzZUFwcFN0YXRlIiwiZ2V0U2Vzc2lvbkluZ3Jlc3NBdXRoVG9rZW4iLCJNQ1BBZ2VudFNlcnZlck1lbnUiLCJNQ1BMaXN0UGFuZWwiLCJNQ1BSZW1vdGVTZXJ2ZXJNZW51IiwiTUNQU3RkaW9TZXJ2ZXJNZW51IiwiTUNQVG9vbERldGFpbFZpZXciLCJNQ1BUb29sTGlzdFZpZXciLCJBZ2VudE1jcFNlcnZlckluZm8iLCJNQ1BWaWV3U3RhdGUiLCJTZXJ2ZXJJbmZvIiwiUHJvcHMiLCJvbkNvbXBsZXRlIiwicmVzdWx0Iiwib3B0aW9ucyIsImRpc3BsYXkiLCJNQ1BTZXR0aW5ncyIsInQwIiwiJCIsIl9jIiwibWNwIiwiX3RlbXAiLCJhZ2VudERlZmluaXRpb25zIiwiX3RlbXAyIiwibWNwQ2xpZW50cyIsImNsaWVudHMiLCJ0MSIsIlN5bWJvbCIsImZvciIsInR5cGUiLCJ2aWV3U3RhdGUiLCJzZXRWaWV3U3RhdGUiLCJ1c2VTdGF0ZSIsInQyIiwic2VydmVycyIsInNldFNlcnZlcnMiLCJ0MyIsImFsbEFnZW50cyIsImFnZW50TWNwU2VydmVycyIsInQ0IiwiZmlsdGVyIiwiX3RlbXAzIiwic29ydCIsIl90ZW1wNCIsImZpbHRlcmVkQ2xpZW50cyIsInQ1IiwidDYiLCJ0b29scyIsImNhbmNlbGxlZCIsInByZXBhcmVTZXJ2ZXJzIiwic2VydmVySW5mb3MiLCJQcm9taXNlIiwiYWxsIiwibWFwIiwiY2xpZW50XzAiLCJzY29wZSIsImNsaWVudCIsImNvbmZpZyIsImlzU1NFIiwiaXNIVFRQIiwiaXNDbGF1ZGVBSVByb3h5IiwiaXNBdXRoZW50aWNhdGVkIiwidW5kZWZpbmVkIiwiYXV0aFByb3ZpZGVyIiwibmFtZSIsInRva2VucyIsImhhc1Nlc3Npb25BdXRoIiwiaGFzVG9vbHNBbmRDb25uZWN0ZWQiLCJsZW5ndGgiLCJCb29sZWFuIiwiYmFzZUluZm8iLCJ0cmFuc3BvcnQiLCJjb25zdCIsInQ3IiwidDgiLCJ0MTAiLCJ0OSIsInNlcnZlciIsImFnZW50U2VydmVyIiwidDExIiwiZGVmYXVsdFRhYiIsInNlcnZlclRvb2xzXzAiLCJ0MTIiLCJzZXJ2ZXJUb29scyIsIl8iLCJpbmRleCIsInRvb2xJbmRleCIsInRvb2wiLCJhIiwiYiIsImxvY2FsZUNvbXBhcmUiLCJzXzAiLCJzIl0sInNvdXJjZXMiOlsiTUNQU2V0dGluZ3MudHN4Il0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBSZWFjdCwgeyB1c2VFZmZlY3QsIHVzZU1lbW8gfSBmcm9tICdyZWFjdCdcbmltcG9ydCB0eXBlIHsgQ29tbWFuZFJlc3VsdERpc3BsYXkgfSBmcm9tICcuLi8uLi9jb21tYW5kcy5qcydcbmltcG9ydCB7IENsYXVkZUF1dGhQcm92aWRlciB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL21jcC9hdXRoLmpzJ1xuaW1wb3J0IHR5cGUge1xuICBNY3BDbGF1ZGVBSVByb3h5U2VydmVyQ29uZmlnLFxuICBNY3BIVFRQU2VydmVyQ29uZmlnLFxuICBNY3BTU0VTZXJ2ZXJDb25maWcsXG4gIE1jcFN0ZGlvU2VydmVyQ29uZmlnLFxufSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9tY3AvdHlwZXMuanMnXG5pbXBvcnQge1xuICBleHRyYWN0QWdlbnRNY3BTZXJ2ZXJzLFxuICBmaWx0ZXJUb29sc0J5U2VydmVyLFxufSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9tY3AvdXRpbHMuanMnXG5pbXBvcnQgeyB1c2VBcHBTdGF0ZSB9IGZyb20gJy4uLy4uL3N0YXRlL0FwcFN0YXRlLmpzJ1xuaW1wb3J0IHsgZ2V0U2Vzc2lvbkluZ3Jlc3NBdXRoVG9rZW4gfSBmcm9tICcuLi8uLi91dGlscy9zZXNzaW9uSW5ncmVzc0F1dGguanMnXG5pbXBvcnQgeyBNQ1BBZ2VudFNlcnZlck1lbnUgfSBmcm9tICcuL01DUEFnZW50U2VydmVyTWVudS5qcydcbmltcG9ydCB7IE1DUExpc3RQYW5lbCB9IGZyb20gJy4vTUNQTGlzdFBhbmVsLmpzJ1xuaW1wb3J0IHsgTUNQUmVtb3RlU2VydmVyTWVudSB9IGZyb20gJy4vTUNQUmVtb3RlU2VydmVyTWVudS5qcydcbmltcG9ydCB7IE1DUFN0ZGlvU2VydmVyTWVudSB9IGZyb20gJy4vTUNQU3RkaW9TZXJ2ZXJNZW51LmpzJ1xuaW1wb3J0IHsgTUNQVG9vbERldGFpbFZpZXcgfSBmcm9tICcuL01DUFRvb2xEZXRhaWxWaWV3LmpzJ1xuaW1wb3J0IHsgTUNQVG9vbExpc3RWaWV3IH0gZnJvbSAnLi9NQ1BUb29sTGlzdFZpZXcuanMnXG5pbXBvcnQgdHlwZSB7IEFnZW50TWNwU2VydmVySW5mbywgTUNQVmlld1N0YXRlLCBTZXJ2ZXJJbmZvIH0gZnJvbSAnLi90eXBlcy5qcydcblxudHlwZSBQcm9wcyA9IHtcbiAgb25Db21wbGV0ZTogKFxuICAgIHJlc3VsdD86IHN0cmluZyxcbiAgICBvcHRpb25zPzogeyBkaXNwbGF5PzogQ29tbWFuZFJlc3VsdERpc3BsYXkgfSxcbiAgKSA9PiB2b2lkXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBNQ1BTZXR0aW5ncyh7IG9uQ29tcGxldGUgfTogUHJvcHMpOiBSZWFjdC5SZWFjdE5vZGUge1xuICBjb25zdCBtY3AgPSB1c2VBcHBTdGF0ZShzID0+IHMubWNwKVxuICBjb25zdCBhZ2VudERlZmluaXRpb25zID0gdXNlQXBwU3RhdGUocyA9PiBzLmFnZW50RGVmaW5pdGlvbnMpXG4gIGNvbnN0IG1jcENsaWVudHMgPSBtY3AuY2xpZW50c1xuICBjb25zdCBbdmlld1N0YXRlLCBzZXRWaWV3U3RhdGVdID0gUmVhY3QudXNlU3RhdGU8TUNQVmlld1N0YXRlPih7XG4gICAgdHlwZTogJ2xpc3QnLFxuICB9KVxuICBjb25zdCBbc2VydmVycywgc2V0U2VydmVyc10gPSBSZWFjdC51c2VTdGF0ZTxTZXJ2ZXJJbmZvW10+KFtdKVxuXG4gIC8vIEV4dHJhY3QgYWdlbnQtc3BlY2lmaWMgTUNQIHNlcnZlcnMgZnJvbSBhZ2VudCBkZWZpbml0aW9uc1xuICBjb25zdCBhZ2VudE1jcFNlcnZlcnMgPSB1c2VNZW1vKFxuICAgICgpID0+IGV4dHJhY3RBZ2VudE1jcFNlcnZlcnMoYWdlbnREZWZpbml0aW9ucy5hbGxBZ2VudHMpLFxuICAgIFthZ2VudERlZmluaXRpb25zLmFsbEFnZW50c10sXG4gIClcblxuICBjb25zdCBmaWx0ZXJlZENsaWVudHMgPSBSZWFjdC51c2VNZW1vKFxuICAgICgpID0+XG4gICAgICBtY3BDbGllbnRzXG4gICAgICAgIC5maWx0ZXIoY2xpZW50ID0+IGNsaWVudC5uYW1lICE9PSAnaWRlJylcbiAgICAgICAgLnNvcnQoKGEsIGIpID0+IGEubmFtZS5sb2NhbGVDb21wYXJlKGIubmFtZSkpLFxuICAgIFttY3BDbGllbnRzXSxcbiAgKVxuXG4gIFJlYWN0LnVzZUVmZmVjdCgoKSA9PiB7XG4gICAgbGV0IGNhbmNlbGxlZCA9IGZhbHNlXG4gICAgYXN5bmMgZnVuY3Rpb24gcHJlcGFyZVNlcnZlcnMoKSB7XG4gICAgICBjb25zdCBzZXJ2ZXJJbmZvcyA9IGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgICBmaWx0ZXJlZENsaWVudHMubWFwKGFzeW5jIGNsaWVudCA9PiB7XG4gICAgICAgICAgY29uc3Qgc2NvcGUgPSBjbGllbnQuY29uZmlnLnNjb3BlXG4gICAgICAgICAgY29uc3QgaXNTU0UgPSBjbGllbnQuY29uZmlnLnR5cGUgPT09ICdzc2UnXG4gICAgICAgICAgY29uc3QgaXNIVFRQID0gY2xpZW50LmNvbmZpZy50eXBlID09PSAnaHR0cCdcbiAgICAgICAgICBjb25zdCBpc0NsYXVkZUFJUHJveHkgPSBjbGllbnQuY29uZmlnLnR5cGUgPT09ICdjbGF1ZGVhaS1wcm94eSdcbiAgICAgICAgICBsZXQgaXNBdXRoZW50aWNhdGVkOiBib29sZWFuIHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkXG5cbiAgICAgICAgICBpZiAoaXNTU0UgfHwgaXNIVFRQKSB7XG4gICAgICAgICAgICBjb25zdCBhdXRoUHJvdmlkZXIgPSBuZXcgQ2xhdWRlQXV0aFByb3ZpZGVyKFxuICAgICAgICAgICAgICBjbGllbnQubmFtZSxcbiAgICAgICAgICAgICAgY2xpZW50LmNvbmZpZyBhcyBNY3BTU0VTZXJ2ZXJDb25maWcgfCBNY3BIVFRQU2VydmVyQ29uZmlnLFxuICAgICAgICAgICAgKVxuICAgICAgICAgICAgY29uc3QgdG9rZW5zID0gYXdhaXQgYXV0aFByb3ZpZGVyLnRva2VucygpXG4gICAgICAgICAgICAvLyBTZXJ2ZXIgaXMgYXV0aGVudGljYXRlZCBpZjpcbiAgICAgICAgICAgIC8vIDEuIEl0IGhhcyBPQXV0aCB0b2tlbnMsIE9SXG4gICAgICAgICAgICAvLyAyLiBJdCdzIGNvbm5lY3RlZCB2aWEgc2Vzc2lvbiBhdXRoIChoYXMgc2Vzc2lvbiB0b2tlbiBhbmQgaXMgY29ubmVjdGVkKSwgT1JcbiAgICAgICAgICAgIC8vIDMuIEl0J3MgY29ubmVjdGVkIGFuZCBoYXMgdG9vbHMgKG1lYW5pbmcgaXQncyB3b3JraW5nLCByZWdhcmRsZXNzIG9mIGF1dGggbWV0aG9kKVxuICAgICAgICAgICAgY29uc3QgaGFzU2Vzc2lvbkF1dGggPVxuICAgICAgICAgICAgICBnZXRTZXNzaW9uSW5ncmVzc0F1dGhUb2tlbigpICE9PSBudWxsICYmXG4gICAgICAgICAgICAgIGNsaWVudC50eXBlID09PSAnY29ubmVjdGVkJ1xuICAgICAgICAgICAgY29uc3QgaGFzVG9vbHNBbmRDb25uZWN0ZWQgPVxuICAgICAgICAgICAgICBjbGllbnQudHlwZSA9PT0gJ2Nvbm5lY3RlZCcgJiZcbiAgICAgICAgICAgICAgZmlsdGVyVG9vbHNCeVNlcnZlcihtY3AudG9vbHMsIGNsaWVudC5uYW1lKS5sZW5ndGggPiAwXG4gICAgICAgICAgICBpc0F1dGhlbnRpY2F0ZWQgPVxuICAgICAgICAgICAgICBCb29sZWFuKHRva2VucykgfHwgaGFzU2Vzc2lvbkF1dGggfHwgaGFzVG9vbHNBbmRDb25uZWN0ZWRcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBjb25zdCBiYXNlSW5mbyA9IHtcbiAgICAgICAgICAgIG5hbWU6IGNsaWVudC5uYW1lLFxuICAgICAgICAgICAgY2xpZW50LFxuICAgICAgICAgICAgc2NvcGUsXG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKGlzQ2xhdWRlQUlQcm94eSkge1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgLi4uYmFzZUluZm8sXG4gICAgICAgICAgICAgIHRyYW5zcG9ydDogJ2NsYXVkZWFpLXByb3h5JyBhcyBjb25zdCxcbiAgICAgICAgICAgICAgaXNBdXRoZW50aWNhdGVkOiBmYWxzZSxcbiAgICAgICAgICAgICAgY29uZmlnOiBjbGllbnQuY29uZmlnIGFzIE1jcENsYXVkZUFJUHJveHlTZXJ2ZXJDb25maWcsXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIGlmIChpc1NTRSkge1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgLi4uYmFzZUluZm8sXG4gICAgICAgICAgICAgIHRyYW5zcG9ydDogJ3NzZScgYXMgY29uc3QsXG4gICAgICAgICAgICAgIGlzQXV0aGVudGljYXRlZCxcbiAgICAgICAgICAgICAgY29uZmlnOiBjbGllbnQuY29uZmlnIGFzIE1jcFNTRVNlcnZlckNvbmZpZyxcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2UgaWYgKGlzSFRUUCkge1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgLi4uYmFzZUluZm8sXG4gICAgICAgICAgICAgIHRyYW5zcG9ydDogJ2h0dHAnIGFzIGNvbnN0LFxuICAgICAgICAgICAgICBpc0F1dGhlbnRpY2F0ZWQsXG4gICAgICAgICAgICAgIGNvbmZpZzogY2xpZW50LmNvbmZpZyBhcyBNY3BIVFRQU2VydmVyQ29uZmlnLFxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAuLi5iYXNlSW5mbyxcbiAgICAgICAgICAgICAgdHJhbnNwb3J0OiAnc3RkaW8nIGFzIGNvbnN0LFxuICAgICAgICAgICAgICBjb25maWc6IGNsaWVudC5jb25maWcgYXMgTWNwU3RkaW9TZXJ2ZXJDb25maWcsXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9KSxcbiAgICAgIClcblxuICAgICAgaWYgKGNhbmNlbGxlZCkgcmV0dXJuXG4gICAgICBzZXRTZXJ2ZXJzKHNlcnZlckluZm9zKVxuICAgIH1cblxuICAgIHZvaWQgcHJlcGFyZVNlcnZlcnMoKVxuICAgIHJldHVybiAoKSA9PiB7XG4gICAgICBjYW5jZWxsZWQgPSB0cnVlXG4gICAgfVxuICB9LCBbZmlsdGVyZWRDbGllbnRzLCBtY3AudG9vbHNdKVxuXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgaWYgKHNlcnZlcnMubGVuZ3RoID09PSAwICYmIGZpbHRlcmVkQ2xpZW50cy5sZW5ndGggPiAwKSB7XG4gICAgICAvLyBTdGlsbCBsb2FkaW5nXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICAvLyBPbmx5IHNob3cgXCJubyBzZXJ2ZXJzXCIgbWVzc2FnZSBpZiBubyByZWd1bGFyIHNlcnZlcnMgQU5EIG5vIGFnZW50IHNlcnZlcnNcbiAgICBpZiAoc2VydmVycy5sZW5ndGggPT09IDAgJiYgYWdlbnRNY3BTZXJ2ZXJzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgb25Db21wbGV0ZShcbiAgICAgICAgJ05vIE1DUCBzZXJ2ZXJzIGNvbmZpZ3VyZWQuIFBsZWFzZSBydW4gL2RvY3RvciBpZiB0aGlzIGlzIHVuZXhwZWN0ZWQuIE90aGVyd2lzZSwgcnVuIGBjbGF1ZGUgbWNwIC0taGVscGAgb3IgdmlzaXQgaHR0cHM6Ly9jb2RlLmNsYXVkZS5jb20vZG9jcy9lbi9tY3AgdG8gbGVhcm4gbW9yZS4nLFxuICAgICAgKVxuICAgIH1cbiAgfSwgW1xuICAgIHNlcnZlcnMubGVuZ3RoLFxuICAgIGZpbHRlcmVkQ2xpZW50cy5sZW5ndGgsXG4gICAgYWdlbnRNY3BTZXJ2ZXJzLmxlbmd0aCxcbiAgICBvbkNvbXBsZXRlLFxuICBdKVxuXG4gIHN3aXRjaCAodmlld1N0YXRlLnR5cGUpIHtcbiAgICBjYXNlICdsaXN0JzpcbiAgICAgIHJldHVybiAoXG4gICAgICAgIDxNQ1BMaXN0UGFuZWxcbiAgICAgICAgICBzZXJ2ZXJzPXtzZXJ2ZXJzfVxuICAgICAgICAgIGFnZW50U2VydmVycz17YWdlbnRNY3BTZXJ2ZXJzfVxuICAgICAgICAgIG9uU2VsZWN0U2VydmVyPXtzZXJ2ZXIgPT5cbiAgICAgICAgICAgIHNldFZpZXdTdGF0ZSh7IHR5cGU6ICdzZXJ2ZXItbWVudScsIHNlcnZlciB9KVxuICAgICAgICAgIH1cbiAgICAgICAgICBvblNlbGVjdEFnZW50U2VydmVyPXsoYWdlbnRTZXJ2ZXI6IEFnZW50TWNwU2VydmVySW5mbykgPT5cbiAgICAgICAgICAgIHNldFZpZXdTdGF0ZSh7IHR5cGU6ICdhZ2VudC1zZXJ2ZXItbWVudScsIGFnZW50U2VydmVyIH0pXG4gICAgICAgICAgfVxuICAgICAgICAgIG9uQ29tcGxldGU9e29uQ29tcGxldGV9XG4gICAgICAgICAgZGVmYXVsdFRhYj17dmlld1N0YXRlLmRlZmF1bHRUYWJ9XG4gICAgICAgIC8+XG4gICAgICApXG5cbiAgICBjYXNlICdzZXJ2ZXItbWVudSc6IHtcbiAgICAgIGNvbnN0IHNlcnZlclRvb2xzID0gZmlsdGVyVG9vbHNCeVNlcnZlcihtY3AudG9vbHMsIHZpZXdTdGF0ZS5zZXJ2ZXIubmFtZSlcblxuICAgICAgY29uc3QgZGVmYXVsdFRhYiA9XG4gICAgICAgIHZpZXdTdGF0ZS5zZXJ2ZXIudHJhbnNwb3J0ID09PSAnY2xhdWRlYWktcHJveHknXG4gICAgICAgICAgPyAnY2xhdWRlLmFpJ1xuICAgICAgICAgIDogJ0NsYXVkZSBDb2RlJ1xuXG4gICAgICBpZiAodmlld1N0YXRlLnNlcnZlci50cmFuc3BvcnQgPT09ICdzdGRpbycpIHtcbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICA8TUNQU3RkaW9TZXJ2ZXJNZW51XG4gICAgICAgICAgICBzZXJ2ZXI9e3ZpZXdTdGF0ZS5zZXJ2ZXJ9XG4gICAgICAgICAgICBzZXJ2ZXJUb29sc0NvdW50PXtzZXJ2ZXJUb29scy5sZW5ndGh9XG4gICAgICAgICAgICBvblZpZXdUb29scz17KCkgPT5cbiAgICAgICAgICAgICAgc2V0Vmlld1N0YXRlKHsgdHlwZTogJ3NlcnZlci10b29scycsIHNlcnZlcjogdmlld1N0YXRlLnNlcnZlciB9KVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgb25DYW5jZWw9eygpID0+IHNldFZpZXdTdGF0ZSh7IHR5cGU6ICdsaXN0JywgZGVmYXVsdFRhYiB9KX1cbiAgICAgICAgICAgIG9uQ29tcGxldGU9e29uQ29tcGxldGV9XG4gICAgICAgICAgLz5cbiAgICAgICAgKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICA8TUNQUmVtb3RlU2VydmVyTWVudVxuICAgICAgICAgICAgc2VydmVyPXt2aWV3U3RhdGUuc2VydmVyfVxuICAgICAgICAgICAgc2VydmVyVG9vbHNDb3VudD17c2VydmVyVG9vbHMubGVuZ3RofVxuICAgICAgICAgICAgb25WaWV3VG9vbHM9eygpID0+XG4gICAgICAgICAgICAgIHNldFZpZXdTdGF0ZSh7IHR5cGU6ICdzZXJ2ZXItdG9vbHMnLCBzZXJ2ZXI6IHZpZXdTdGF0ZS5zZXJ2ZXIgfSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIG9uQ2FuY2VsPXsoKSA9PiBzZXRWaWV3U3RhdGUoeyB0eXBlOiAnbGlzdCcsIGRlZmF1bHRUYWIgfSl9XG4gICAgICAgICAgICBvbkNvbXBsZXRlPXtvbkNvbXBsZXRlfVxuICAgICAgICAgIC8+XG4gICAgICAgIClcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjYXNlICdzZXJ2ZXItdG9vbHMnOlxuICAgICAgcmV0dXJuIChcbiAgICAgICAgPE1DUFRvb2xMaXN0Vmlld1xuICAgICAgICAgIHNlcnZlcj17dmlld1N0YXRlLnNlcnZlcn1cbiAgICAgICAgICBvblNlbGVjdFRvb2w9eyhfLCBpbmRleCkgPT5cbiAgICAgICAgICAgIHNldFZpZXdTdGF0ZSh7XG4gICAgICAgICAgICAgIHR5cGU6ICdzZXJ2ZXItdG9vbC1kZXRhaWwnLFxuICAgICAgICAgICAgICBzZXJ2ZXI6IHZpZXdTdGF0ZS5zZXJ2ZXIsXG4gICAgICAgICAgICAgIHRvb2xJbmRleDogaW5kZXgsXG4gICAgICAgICAgICB9KVxuICAgICAgICAgIH1cbiAgICAgICAgICBvbkJhY2s9eygpID0+XG4gICAgICAgICAgICBzZXRWaWV3U3RhdGUoeyB0eXBlOiAnc2VydmVyLW1lbnUnLCBzZXJ2ZXI6IHZpZXdTdGF0ZS5zZXJ2ZXIgfSlcbiAgICAgICAgICB9XG4gICAgICAgIC8+XG4gICAgICApXG5cbiAgICBjYXNlICdzZXJ2ZXItdG9vbC1kZXRhaWwnOiB7XG4gICAgICBjb25zdCBzZXJ2ZXJUb29scyA9IGZpbHRlclRvb2xzQnlTZXJ2ZXIobWNwLnRvb2xzLCB2aWV3U3RhdGUuc2VydmVyLm5hbWUpXG4gICAgICBjb25zdCB0b29sID0gc2VydmVyVG9vbHNbdmlld1N0YXRlLnRvb2xJbmRleF1cbiAgICAgIGlmICghdG9vbCkge1xuICAgICAgICBzZXRWaWV3U3RhdGUoeyB0eXBlOiAnc2VydmVyLXRvb2xzJywgc2VydmVyOiB2aWV3U3RhdGUuc2VydmVyIH0pXG4gICAgICAgIHJldHVybiBudWxsXG4gICAgICB9XG4gICAgICByZXR1cm4gKFxuICAgICAgICA8TUNQVG9vbERldGFpbFZpZXdcbiAgICAgICAgICB0b29sPXt0b29sfVxuICAgICAgICAgIHNlcnZlcj17dmlld1N0YXRlLnNlcnZlcn1cbiAgICAgICAgICBvbkJhY2s9eygpID0+XG4gICAgICAgICAgICBzZXRWaWV3U3RhdGUoeyB0eXBlOiAnc2VydmVyLXRvb2xzJywgc2VydmVyOiB2aWV3U3RhdGUuc2VydmVyIH0pXG4gICAgICAgICAgfVxuICAgICAgICAvPlxuICAgICAgKVxuICAgIH1cblxuICAgIGNhc2UgJ2FnZW50LXNlcnZlci1tZW51JzpcbiAgICAgIHJldHVybiAoXG4gICAgICAgIDxNQ1BBZ2VudFNlcnZlck1lbnVcbiAgICAgICAgICBhZ2VudFNlcnZlcj17dmlld1N0YXRlLmFnZW50U2VydmVyfVxuICAgICAgICAgIG9uQ2FuY2VsPXsoKSA9PiBzZXRWaWV3U3RhdGUoeyB0eXBlOiAnbGlzdCcsIGRlZmF1bHRUYWI6ICdBZ2VudHMnIH0pfVxuICAgICAgICAgIG9uQ29tcGxldGU9e29uQ29tcGxldGV9XG4gICAgICAgIC8+XG4gICAgICApXG4gIH1cbn1cbiJdLCJtYXBwaW5ncyI6IjtBQUFBLE9BQU9BLEtBQUssSUFBSUMsU0FBUyxFQUFFQyxPQUFPLFFBQVEsT0FBTztBQUNqRCxjQUFjQyxvQkFBb0IsUUFBUSxtQkFBbUI7QUFDN0QsU0FBU0Msa0JBQWtCLFFBQVEsNEJBQTRCO0FBQy9ELGNBQ0VDLDRCQUE0QixFQUM1QkMsbUJBQW1CLEVBQ25CQyxrQkFBa0IsRUFDbEJDLG9CQUFvQixRQUNmLDZCQUE2QjtBQUNwQyxTQUNFQyxzQkFBc0IsRUFDdEJDLG1CQUFtQixRQUNkLDZCQUE2QjtBQUNwQyxTQUFTQyxXQUFXLFFBQVEseUJBQXlCO0FBQ3JELFNBQVNDLDBCQUEwQixRQUFRLG1DQUFtQztBQUM5RSxTQUFTQyxrQkFBa0IsUUFBUSx5QkFBeUI7QUFDNUQsU0FBU0MsWUFBWSxRQUFRLG1CQUFtQjtBQUNoRCxTQUFTQyxtQkFBbUIsUUFBUSwwQkFBMEI7QUFDOUQsU0FBU0Msa0JBQWtCLFFBQVEseUJBQXlCO0FBQzVELFNBQVNDLGlCQUFpQixRQUFRLHdCQUF3QjtBQUMxRCxTQUFTQyxlQUFlLFFB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