@baozi.bet/mcp-server 4.0.0

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.
Files changed (60) hide show
  1. package/README.md +294 -0
  2. package/dist/__tests__/full-test.d.ts +1 -0
  3. package/dist/__tests__/full-test.js +291 -0
  4. package/dist/builders/affiliate-transaction.d.ts +41 -0
  5. package/dist/builders/affiliate-transaction.js +123 -0
  6. package/dist/builders/bet-transaction.d.ts +70 -0
  7. package/dist/builders/bet-transaction.js +323 -0
  8. package/dist/builders/claim-transaction.d.ts +57 -0
  9. package/dist/builders/claim-transaction.js +196 -0
  10. package/dist/builders/creator-transaction.d.ts +49 -0
  11. package/dist/builders/creator-transaction.js +177 -0
  12. package/dist/builders/dispute-transaction.d.ts +81 -0
  13. package/dist/builders/dispute-transaction.js +215 -0
  14. package/dist/builders/index.d.ts +14 -0
  15. package/dist/builders/index.js +15 -0
  16. package/dist/builders/market-creation-tx.d.ts +65 -0
  17. package/dist/builders/market-creation-tx.js +362 -0
  18. package/dist/builders/market-management-transaction.d.ts +85 -0
  19. package/dist/builders/market-management-transaction.js +239 -0
  20. package/dist/builders/race-transaction.d.ts +67 -0
  21. package/dist/builders/race-transaction.js +242 -0
  22. package/dist/builders/resolution-transaction.d.ts +108 -0
  23. package/dist/builders/resolution-transaction.js +250 -0
  24. package/dist/builders/whitelist-transaction.d.ts +72 -0
  25. package/dist/builders/whitelist-transaction.js +179 -0
  26. package/dist/config.d.ts +138 -0
  27. package/dist/config.js +307 -0
  28. package/dist/handlers/agent-network.d.ts +81 -0
  29. package/dist/handlers/agent-network.js +332 -0
  30. package/dist/handlers/claims.d.ts +47 -0
  31. package/dist/handlers/claims.js +218 -0
  32. package/dist/handlers/market-creation.d.ts +154 -0
  33. package/dist/handlers/market-creation.js +290 -0
  34. package/dist/handlers/markets.d.ts +41 -0
  35. package/dist/handlers/markets.js +319 -0
  36. package/dist/handlers/positions.d.ts +40 -0
  37. package/dist/handlers/positions.js +244 -0
  38. package/dist/handlers/quote.d.ts +33 -0
  39. package/dist/handlers/quote.js +144 -0
  40. package/dist/handlers/race-markets.d.ts +54 -0
  41. package/dist/handlers/race-markets.js +308 -0
  42. package/dist/handlers/resolution.d.ts +43 -0
  43. package/dist/handlers/resolution.js +194 -0
  44. package/dist/index.d.ts +2 -0
  45. package/dist/index.js +109 -0
  46. package/dist/resources.d.ts +13 -0
  47. package/dist/resources.js +336 -0
  48. package/dist/tools.d.ts +3109 -0
  49. package/dist/tools.js +1956 -0
  50. package/dist/validation/bet-rules.d.ts +82 -0
  51. package/dist/validation/bet-rules.js +276 -0
  52. package/dist/validation/creation-rules.d.ts +69 -0
  53. package/dist/validation/creation-rules.js +302 -0
  54. package/dist/validation/index.d.ts +6 -0
  55. package/dist/validation/index.js +7 -0
  56. package/dist/validation/market-rules.d.ts +60 -0
  57. package/dist/validation/market-rules.js +237 -0
  58. package/dist/validation/parimutuel-rules.d.ts +117 -0
  59. package/dist/validation/parimutuel-rules.js +270 -0
  60. package/package.json +52 -0
package/dist/index.js ADDED
@@ -0,0 +1,109 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * Baozi MCP Server V2.0.0
4
+ *
5
+ * Model Context Protocol server for Baozi prediction markets on Solana.
6
+ * Now with mainnet support and transaction building capabilities.
7
+ *
8
+ * Features:
9
+ * - Read markets, positions, quotes
10
+ * - Validate market timing (v6.2 rules)
11
+ * - Build unsigned bet transactions
12
+ * - Simulate transactions before signing
13
+ *
14
+ * Usage:
15
+ * npx @baozi/mcp-server
16
+ *
17
+ * Or add to Claude Desktop config:
18
+ * {
19
+ * "mcpServers": {
20
+ * "baozi": {
21
+ * "command": "npx",
22
+ * "args": ["@baozi/mcp-server"]
23
+ * }
24
+ * }
25
+ * }
26
+ *
27
+ * Environment Variables:
28
+ * HELIUS_RPC_URL - Helius RPC endpoint (recommended)
29
+ * SOLANA_RPC_URL - Alternative RPC endpoint
30
+ * SOLANA_NETWORK - Network: 'mainnet-beta' (default) or 'devnet'
31
+ * BAOZI_PROGRAM_ID - Override program ID (default: V4.7.6 mainnet)
32
+ */
33
+ import { Server } from '@modelcontextprotocol/sdk/server/index.js';
34
+ import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
35
+ import { CallToolRequestSchema, ListToolsRequestSchema, ListResourcesRequestSchema, ReadResourceRequestSchema, } from '@modelcontextprotocol/sdk/types.js';
36
+ import { TOOLS, handleTool } from './tools.js';
37
+ import { RESOURCES, handleResource } from './resources.js';
38
+ import { PROGRAM_ID, NETWORK, IS_MAINNET, RPC_ENDPOINT } from './config.js';
39
+ const VERSION = '2.0.0';
40
+ // Create MCP server
41
+ const server = new Server({
42
+ name: 'baozi-mcp',
43
+ version: VERSION,
44
+ }, {
45
+ capabilities: {
46
+ tools: {},
47
+ resources: {},
48
+ },
49
+ });
50
+ // List available tools
51
+ server.setRequestHandler(ListToolsRequestSchema, async () => {
52
+ return { tools: TOOLS };
53
+ });
54
+ // Handle tool calls
55
+ server.setRequestHandler(CallToolRequestSchema, async (request) => {
56
+ const { name, arguments: args } = request.params;
57
+ return handleTool(name, args || {});
58
+ });
59
+ // List available resources
60
+ server.setRequestHandler(ListResourcesRequestSchema, async () => {
61
+ return { resources: RESOURCES };
62
+ });
63
+ // Read resource content
64
+ server.setRequestHandler(ReadResourceRequestSchema, async (request) => {
65
+ const { uri } = request.params;
66
+ return handleResource(uri);
67
+ });
68
+ // Start server
69
+ async function main() {
70
+ const transport = new StdioServerTransport();
71
+ await server.connect(transport);
72
+ // Log startup info to stderr (stdout is for MCP protocol)
73
+ console.error('');
74
+ console.error('='.repeat(60));
75
+ console.error(`Baozi MCP Server v${VERSION}`);
76
+ console.error('='.repeat(60));
77
+ console.error('');
78
+ console.error(`Network: ${IS_MAINNET ? 'MAINNET' : 'Devnet'} (${NETWORK})`);
79
+ console.error(`Program ID: ${PROGRAM_ID.toBase58()}`);
80
+ console.error(`RPC: ${RPC_ENDPOINT.substring(0, 50)}...`);
81
+ console.error('');
82
+ console.error('Available Tools:');
83
+ console.error('-'.repeat(40));
84
+ TOOLS.forEach(tool => {
85
+ console.error(` ${tool.name}`);
86
+ console.error(` ${tool.description.substring(0, 70)}...`);
87
+ });
88
+ console.error('');
89
+ console.error('Available Resources:');
90
+ console.error('-'.repeat(40));
91
+ RESOURCES.forEach(resource => {
92
+ console.error(` ${resource.uri}`);
93
+ console.error(` ${resource.description}`);
94
+ });
95
+ console.error('');
96
+ console.error('Dynamic Resources:');
97
+ console.error('-'.repeat(40));
98
+ console.error(' baozi://portfolio/{wallet}');
99
+ console.error(' User portfolio with positions and statistics');
100
+ console.error('');
101
+ console.error('='.repeat(60));
102
+ console.error('Ready for connections...');
103
+ console.error('');
104
+ }
105
+ main().catch((error) => {
106
+ console.error('Fatal error:', error);
107
+ process.exit(1);
108
+ });
109
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUNBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0E4Qkc7QUFDSCxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sMkNBQTJDLENBQUM7QUFDbkUsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sMkNBQTJDLENBQUM7QUFDakYsT0FBTyxFQUNMLHFCQUFxQixFQUNyQixzQkFBc0IsRUFDdEIsMEJBQTBCLEVBQzFCLHlCQUF5QixHQUMxQixNQUFNLG9DQUFvQyxDQUFDO0FBRTVDLE9BQU8sRUFBRSxLQUFLLEVBQUUsVUFBVSxFQUFFLE1BQU0sWUFBWSxDQUFDO0FBQy9DLE9BQU8sRUFBRSxTQUFTLEVBQUUsY0FBYyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDM0QsT0FBTyxFQUFFLFVBQVUsRUFBRSxPQUFPLEVBQUUsVUFBVSxFQUFFLFlBQVksRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUU1RSxNQUFNLE9BQU8sR0FBRyxPQUFPLENBQUM7QUFFeEIsb0JBQW9CO0FBQ3BCLE1BQU0sTUFBTSxHQUFHLElBQUksTUFBTSxDQUN2QjtJQUNFLElBQUksRUFBRSxXQUFXO0lBQ2pCLE9BQU8sRUFBRSxPQUFPO0NBQ2pCLEVBQ0Q7SUFDRSxZQUFZLEVBQUU7UUFDWixLQUFLLEVBQUUsRUFBRTtRQUNULFNBQVMsRUFBRSxFQUFFO0tBQ2Q7Q0FDRixDQUNGLENBQUM7QUFFRix1QkFBdUI7QUFDdkIsTUFBTSxDQUFDLGlCQUFpQixDQUFDLHNCQUFzQixFQUFFLEtBQUssSUFBSSxFQUFFO0lBQzFELE9BQU8sRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLENBQUM7QUFDMUIsQ0FBQyxDQUFDLENBQUM7QUFFSCxvQkFBb0I7QUFDcEIsTUFBTSxDQUFDLGlCQUFpQixDQUFDLHFCQUFxQixFQUFFLEtBQUssRUFBRSxPQUFPLEVBQUUsRUFB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L0MsQ0FBQyxDQUFDLENBQUM7SUFDSCxPQUFPLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBQ2xCLE9BQU8sQ0FBQyxLQUFLLENBQUMsb0JBQW9CLENBQUMsQ0FBQztJQUNwQyxPQUFPLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztJQUM5QixPQUFPLENBQUMsS0FBSyxDQUFDLDhCQUE4QixDQUFDLENBQUM7SUFDOUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxrREFBa0QsQ0FBQyxDQUFDO0lBQ2xFLE9BQU8sQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUM7SUFDbEIsT0FBTyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDOUIsT0FBTyxDQUFDLEtBQUssQ0FBQywwQkFBMEIsQ0FBQyxDQUFDO0lBQzFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUM7QUFDcEIsQ0FBQztBQUVELElBQUksRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFO0lBQ3JCLE9BQU8sQ0FBQyxLQUFLLENBQUMsY0FBYyxFQUFFLEtBQUssQ0FBQyxDQUFDO0lBQ3JDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDbEIsQ0FBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIjIS91c3IvYmluL2VudiBub2RlXG4vKipcbiAqIEJhb3ppIE1DUCBTZXJ2ZXIgVjIuMC4wXG4gKlxuICogTW9kZWwgQ29udGV4dCBQcm90b2NvbCBzZXJ2ZXIgZm9yIEJhb3ppIHByZWRpY3Rpb24gbWFya2V0cyBvbiBTb2xhbmEuXG4gKiBOb3cgd2l0aCBtYWlubmV0IHN1cHBvcnQgYW5kIHRyYW5zYWN0aW9uIGJ1aWxkaW5nIGNhcGFiaWxpdGllcy5cbiAqXG4gKiBGZWF0dXJlczpcbiAqIC0gUmVhZCBtYXJrZXRzLCBwb3NpdGlvbnMsIHF1b3Rlc1xuICogLSBWYWxpZGF0ZSBtYXJrZXQgdGltaW5nICh2Ni4yIHJ1bGVzKVxuICogLSBCdWlsZCB1bnNpZ25lZCBiZXQgdHJhbnNhY3Rpb25zXG4gKiAtIFNpbXVsYXRlIHRyYW5zYWN0aW9ucyBiZWZvcmUgc2lnbmluZ1xuICpcbiAqIFVzYWdlOlxuICogICBucHggQGJhb3ppL21jcC1zZXJ2ZXJcbiAqXG4gKiBPciBhZGQgdG8gQ2xhdWRlIERlc2t0b3AgY29uZmlnOlxuICogICB7XG4gKiAgICAgXCJtY3BTZXJ2ZXJzXCI6IHtcbiAqICAgICAgIFwiYmFvemlcIjoge1xuICogICAgICAgICBcImNvbW1hbmRcIjogXCJucHhcIixcbiAqICAgICAgICAgXCJhcmdzXCI6IFtcIkBiYW96aS9tY3Atc2VydmVyXCJdXG4gKiAgICAgICB9XG4gKiAgICAgfVxuICogICB9XG4gKlxuICogRW52aXJvbm1lbnQgVmFyaWFibGVzOlxuICogICBIRUxJVVNfUlBDX1VSTCAgICAtIEhlbGl1cyBSUEMgZW5kcG9pbnQgKHJlY29tbWVuZGVkKVxuICogICBTT0xBTkFfUlBDX1VSTCAgICAtIEFsdGVybmF0aXZlIFJQQyBlbmRwb2ludFxuICogICBTT0xBTkFfTkVUV09SSyAgICAtIE5ldHdvcms6ICdtYWlubmV0LWJldGEnIChkZWZhdWx0KSBvciAnZGV2bmV0J1xuICogICBCQU9aSV9QUk9HUkFNX0lEICAtIE92ZXJyaWRlIHByb2dyYW0gSUQgKGRlZmF1bHQ6IFY0LjcuNiBtYWlubmV0KVxuICovXG5pbXBvcnQgeyBTZXJ2ZXIgfSBmcm9tICdAbW9kZWxjb250ZXh0cHJvdG9jb2wvc2RrL3NlcnZlci9pbmRleC5qcyc7XG5pbXBvcnQgeyBTdGRpb1NlcnZlclRyYW5zcG9ydCB9IGZyb20gJ0Btb2RlbGNvbnRleHRwcm90b2NvbC9zZGsvc2VydmVyL3N0ZGlvLmpzJztcbmltcG9ydCB7XG4gIENhbGxUb29sUmVxdWVzdFNjaGVtYSxcbiAgTGlzdFRvb2xzUmVxdWVzdFNjaGVtYSxcbiAgTGlzdFJlc291cmNlc1JlcXVlc3RTY2hlbWEsXG4gIFJlYWRSZXNvdXJjZVJlcXVlc3RTY2hlbWEsXG59IGZyb20gJ0Btb2RlbGNvbnRleHRwcm90b2NvbC9zZGsvdHlwZXMuanMnO1xuXG5pbXBvcnQgeyBUT09MUywgaGFuZGxlVG9vbCB9IGZyb20gJy4vdG9vbHMuanMnO1xuaW1wb3J0IHsgUkVTT1VSQ0VTLCBoYW5kbGVSZXNvdXJjZSB9IGZyb20gJy4vcmVzb3VyY2VzLmpzJztcbmltcG9ydCB7IFBST0dSQU1fSUQsIE5FVFdPUkssIElTX01BSU5ORVQsIFJQQ19FTkRQT0lOVCB9IGZyb20gJy4vY29uZmlnLmpzJztcblxuY29uc3QgVkVSU0lPTiA9ICcyLjAuMCc7XG5cbi8vIENyZWF0ZSBNQ1Agc2VydmVyXG5jb25zdCBzZXJ2ZXIgPSBuZXcgU2VydmVyKFxuICB7XG4gICAgbmFtZTogJ2Jhb3ppLW1jcCcsXG4gICAgdmVyc2lvbjogVkVSU0lPTixcbiAgfSxcbiAge1xuICAgIGNhcGFiaWxpdGllczoge1xuICAgICAgdG9vbHM6IHt9LFxuICAgICAgcmVzb3VyY2VzOiB7fSxcbiAgICB9LFxuICB9XG4pO1xuXG4vLyBMaXN0IGF2YWlsYWJsZSB0b29sc1xuc2VydmVyLnNldFJlcXVlc3RIYW5kbGVyKExpc3RUb29sc1JlcXVlc3RTY2hlbWEsIGFzeW5jICgpID0+IHtcbiAgcmV0dXJuIHsgdG9vbHM6IFRPT0xTIH07XG59KTtcblxuLy8gSGFuZGxlIHRvb2wgY2FsbHNcbnNlcnZlci5zZXRSZXF1ZXN0SGFuZGxlcihDYWxsVG9vbFJlcXVlc3RTY2hlbWEsIGFzeW5jIChyZXF1ZXN0KSA9PiB7XG4gIGNvbnN0IHsgbmFtZSwgYXJndW1lbnRzOiBhcmdzIH0gPSByZXF1ZXN0LnBhcmFtcztcbiAgcmV0dXJuIGhhbmRsZVRvb2wobmFtZSwgYXJncyB8fCB7fSk7XG59KTtcblxuLy8gTGlzdCBhdmFpbGFibGUgcmVzb3VyY2VzXG5zZXJ2ZXIuc2V0UmVxdWVzdEhhbmRsZXIoTGlzdFJlc291cmNlc1JlcXVlc3RTY2hlbWEsIGFzeW5jICgpID0+IHtcbiAgcmV0dXJuIHsgcmVzb3VyY2VzOiBSRVNPVVJDRVMgfTtcbn0pO1xuXG4vLyBSZWFkIHJlc291cmNlIGNvbnRlbnRcbnNlcnZlci5zZXRSZXF1ZXN0SGFuZGxlcihSZWFkUmVzb3VyY2VSZXF1ZXN0U2NoZW1hLCBhc3luYyAocmVxdWVzdCkgPT4ge1xuICBjb25zdCB7IHVyaSB9ID0gcmVxdWVzdC5wYXJhbXM7XG4gIHJldHVybiBoYW5kbGVSZXNvdXJjZSh1cmkpO1xufSk7XG5cbi8vIFN0YXJ0IHNlcnZlclxuYXN5bmMgZnVuY3Rpb24gbWFpbigpIHtcbiAgY29uc3QgdHJhbnNwb3J0ID0gbmV3IFN0ZGlvU2VydmVyVHJhbnNwb3J0KCk7XG4gIGF3YWl0IHNlcnZlci5jb25uZWN0KHRyYW5zcG9ydCk7XG5cbiAgLy8gTG9nIHN0YXJ0dXAgaW5mbyB0byBzdGRlcnIgKHN0ZG91dCBpcyBmb3IgTUNQIHByb3RvY29sKVxuICBjb25zb2xlLmVycm9yKCcnKTtcbiAgY29uc29sZS5lcnJvcignPScucmVwZWF0KDYwKSk7XG4gIGNvbnNvbGUuZXJyb3IoYEJhb3ppIE1DUCBTZXJ2ZXIgdiR7VkVSU0lPTn1gKTtcbiAgY29uc29sZS5lcnJvcignPScucmVwZWF0KDYwKSk7XG4gIGNvbnNvbGUuZXJyb3IoJycpO1xuICBjb25zb2xlLmVycm9yKGBOZXR3b3JrOiAke0lTX01BSU5ORVQgPyAnTUFJTk5FVCcgOiAnRGV2bmV0J30gKCR7TkVUV09SS30pYCk7XG4gIGNvbnNvbGUuZXJyb3IoYFByb2dyYW0gSUQ6ICR7UFJPR1JBTV9JRC50b0Jhc2U1OCgpfWApO1xuICBjb25zb2xlLmVycm9yKGBSUEM6ICR7UlBDX0VORFBPSU5ULnN1YnN0cmluZygwLCA1MCl9Li4uYCk7XG4gIGNvbnNvbGUuZXJyb3IoJycpO1xuICBjb25zb2xlLmVycm9yKCdBdmFpbGFibGUgVG9vbHM6Jyk7XG4gIGNvbnNvbGUuZXJyb3IoJy0nLnJlcGVhdCg0MCkpO1xuICBUT09MUy5mb3JFYWNoKHRvb2wgPT4ge1xuICAgIGNvbnNvbGUuZXJyb3IoYCAgJHt0b29sLm5hbWV9YCk7XG4gICAgY29uc29sZS5lcnJvcihgICAgICR7dG9vbC5kZXNjcmlwdGlvbi5zdWJzdHJpbmcoMCwgNzApfS4uLmApO1xuICB9KTtcbiAgY29uc29sZS5lcnJvcignJyk7XG4gIGNvbnNvbGUuZXJyb3IoJ0F2YWlsYWJsZSBSZXNvdXJjZXM6Jyk7XG4gIGNvbnNvbGUuZXJyb3IoJy0nLnJlcGVhdCg0MCkpO1xuICBSRVNPVVJDRVMuZm9yRWFjaChyZXNvdXJjZSA9PiB7XG4gICAgY29uc29sZS5lcnJvcihgICAke3Jlc291cmNlLnVyaX1gKTtcbiAgICBjb25zb2xlLmVycm9yKGAgICAgJHtyZXNvdXJjZS5kZXNjcmlwdGlvbn1gKTtcbiAgfSk7XG4gIGNvbnNvbGUuZXJyb3IoJycpO1xuICBjb25zb2xlLmVycm9yKCdEeW5hbWljIFJlc291cmNlczonKTtcbiAgY29uc29sZS5lcnJvcignLScucmVwZWF0KDQwKSk7XG4gIGNvbnNvbGUuZXJyb3IoJyAgYmFvemk6Ly9wb3J0Zm9saW8ve3dhbGxldH0nKTtcbiAgY29uc29sZS5lcnJvcignICAgIFVzZXIgcG9ydGZvbGlvIHdpdGggcG9zaXRpb25zIGFuZCBzdGF0aXN0aWNzJyk7XG4gIGNvbnNvbGUuZXJyb3IoJycpO1xuICBjb25zb2xlLmVycm9yKCc9Jy5yZXBlYXQoNjApKTtcbiAgY29uc29sZS5lcnJvcignUmVhZHkgZm9yIGNvbm5lY3Rpb25zLi4uJyk7XG4gIGNvbnNvbGUuZXJyb3IoJycpO1xufVxuXG5tYWluKCkuY2F0Y2goKGVycm9yKSA9PiB7XG4gIGNvbnNvbGUuZXJyb3IoJ0ZhdGFsIGVycm9yOicsIGVycm9yKTtcbiAgcHJvY2Vzcy5leGl0KDEpO1xufSk7XG4iXX0=
@@ -0,0 +1,13 @@
1
+ export declare const RESOURCES: {
2
+ uri: string;
3
+ name: string;
4
+ description: string;
5
+ mimeType: string;
6
+ }[];
7
+ export declare function handleResource(uri: string): Promise<{
8
+ contents: Array<{
9
+ uri: string;
10
+ mimeType: string;
11
+ text: string;
12
+ }>;
13
+ }>;
@@ -0,0 +1,336 @@
1
+ /**
2
+ * MCP Resource Definitions for Baozi Markets
3
+ * V2.0.0 - Mainnet + Extended Resources
4
+ *
5
+ * Resources provide read-only data that can be fetched by URI.
6
+ */
7
+ import { listMarkets } from './handlers/markets.js';
8
+ import { getPositionsSummary } from './handlers/positions.js';
9
+ import { PROGRAM_ID, FEES, BET_LIMITS, TIMING, MARKET_STATUS_NAMES, MARKET_LAYER_NAMES, IS_MAINNET, NETWORK, } from './config.js';
10
+ // =============================================================================
11
+ // V6.2 MARKET RULES DOCUMENT
12
+ // =============================================================================
13
+ const MARKET_RULES_V6_2 = `
14
+ # Baozi Market Creation Rules (v6.2)
15
+
16
+ ## Overview
17
+ Markets must follow timing rules to ensure fair betting and accurate resolution.
18
+
19
+ ## Rule A: Event-Based Markets
20
+ For markets based on a single point-in-time event (e.g., "Will X win the election?"):
21
+
22
+ 1. **Betting Close Buffer**: Betting must close AT LEAST 12 hours before the event
23
+ 2. **Recommended Buffer**: 18-24 hours provides safety margin for timezone issues
24
+ 3. **Resolution**: After event occurs, market is resolved based on outcome
25
+
26
+ ### Example (Rule A)
27
+ - Event: "Super Bowl kickoff at 2025-02-09 18:30:00 UTC"
28
+ - Question: "Will the Chiefs win Super Bowl LIX?"
29
+ - Recommended betting close: 2025-02-08 18:30:00 UTC (24h before)
30
+ - Latest acceptable close: 2025-02-09 06:30:00 UTC (12h before)
31
+
32
+ ## Rule B: Measurement-Period Markets
33
+ For markets based on outcomes over a time period (e.g., "Will BTC reach $100k in January?"):
34
+
35
+ 1. **CRITICAL**: Betting must close BEFORE measurement period starts
36
+ 2. **No Overlap**: Zero tolerance for betting during measurement period
37
+ 3. **Information Advantage**: Allowing bets during measurement enables unfair advantage
38
+ 4. **Period Length**: Prefer 2-7 days for optimal user experience
39
+
40
+ ### Example (Rule B)
41
+ - Question: "Will ETH be above $4000 on Feb 1st 2025?"
42
+ - Measurement period: Feb 1st 00:00 - 23:59 UTC
43
+ - Betting must close: Before Feb 1st 00:00 UTC
44
+ - Recommended close: Jan 31st 22:00 UTC (2h buffer)
45
+
46
+ ## Common Timing Mistakes
47
+
48
+ ### INVALID Configurations:
49
+ - Betting closes AFTER event starts (Rule A violation)
50
+ - Betting overlaps with measurement period (Rule B violation)
51
+ - Buffer < 12 hours for event markets (too risky)
52
+
53
+ ### WARNING Configurations:
54
+ - Buffer 12-18 hours (acceptable but tight)
55
+ - Measurement period > 7 days (poor UX)
56
+ - Very short buffer < 2 hours for measurement (risk of late bets)
57
+
58
+ ## Validation Endpoint
59
+ Use the \`validate_market_params\` tool to check your market parameters before creation.
60
+ `;
61
+ // =============================================================================
62
+ // MARKET TEMPLATES
63
+ // =============================================================================
64
+ const EVENT_MARKET_TEMPLATE = {
65
+ type: 'event',
66
+ description: 'Template for event-based prediction markets (single point in time)',
67
+ example: {
68
+ question: 'Will [Team A] win the [Event Name]?',
69
+ closing_time: 'YYYY-MM-DDTHH:MM:SSZ (24 hours before event)',
70
+ event_time: 'YYYY-MM-DDTHH:MM:SSZ (when event occurs)',
71
+ market_type: 'event',
72
+ layer: 'Lab',
73
+ },
74
+ rules: [
75
+ 'Question must be answerable with YES or NO',
76
+ 'Event time must be after closing time',
77
+ 'Minimum 12 hour buffer between close and event',
78
+ 'Question max 200 characters',
79
+ ],
80
+ examples: [
81
+ 'Will the Chiefs win Super Bowl LIX?',
82
+ 'Will Bitcoin reach $100,000 before March 2025?',
83
+ 'Will SpaceX successfully launch Starship on [date]?',
84
+ ],
85
+ };
86
+ const MEASUREMENT_MARKET_TEMPLATE = {
87
+ type: 'measurement',
88
+ description: 'Template for measurement-period prediction markets (outcome over time range)',
89
+ example: {
90
+ question: 'Will [Metric] be above [Value] on [Date]?',
91
+ closing_time: 'YYYY-MM-DDTHH:MM:SSZ (before measurement starts)',
92
+ measurement_start: 'YYYY-MM-DDTHH:MM:SSZ (when measurement period begins)',
93
+ measurement_end: 'YYYY-MM-DDTHH:MM:SSZ (when measurement period ends)',
94
+ market_type: 'measurement',
95
+ layer: 'Lab',
96
+ },
97
+ rules: [
98
+ 'Betting MUST close before measurement period starts',
99
+ 'Measurement period should be well-defined',
100
+ 'Prefer 2-7 day periods for optimal UX',
101
+ 'Data source for resolution must be clear',
102
+ ],
103
+ examples: [
104
+ 'Will ETH be above $4000 on Feb 1st 2025?',
105
+ 'Will US inflation be below 3% in January 2025?',
106
+ 'Will AAPL close above $200 on earnings day?',
107
+ ],
108
+ };
109
+ // =============================================================================
110
+ // RESOURCE DEFINITIONS
111
+ // =============================================================================
112
+ export const RESOURCES = [
113
+ {
114
+ uri: 'baozi://markets/open',
115
+ name: 'Open Markets',
116
+ description: 'List of currently open prediction markets accepting bets on Solana mainnet',
117
+ mimeType: 'application/json',
118
+ },
119
+ {
120
+ uri: 'baozi://markets/all',
121
+ name: 'All Markets',
122
+ description: 'List of all prediction markets (open, closed, resolved) on Solana mainnet',
123
+ mimeType: 'application/json',
124
+ },
125
+ {
126
+ uri: 'baozi://config',
127
+ name: 'Program Config',
128
+ description: 'Baozi V4.7.6 program configuration, fees, and limits',
129
+ mimeType: 'application/json',
130
+ },
131
+ {
132
+ uri: 'baozi://rules',
133
+ name: 'Market Rules v6.2',
134
+ description: 'Documentation of market timing rules and validation requirements',
135
+ mimeType: 'text/markdown',
136
+ },
137
+ {
138
+ uri: 'baozi://templates/event',
139
+ name: 'Event Market Template',
140
+ description: 'Template for creating event-based prediction markets',
141
+ mimeType: 'application/json',
142
+ },
143
+ {
144
+ uri: 'baozi://templates/measurement',
145
+ name: 'Measurement Market Template',
146
+ description: 'Template for creating measurement-period prediction markets',
147
+ mimeType: 'application/json',
148
+ },
149
+ ];
150
+ // =============================================================================
151
+ // RESOURCE HANDLERS
152
+ // =============================================================================
153
+ export async function handleResource(uri) {
154
+ try {
155
+ // Handle portfolio requests with wallet parameter
156
+ if (uri.startsWith('baozi://portfolio/')) {
157
+ const wallet = uri.replace('baozi://portfolio/', '');
158
+ const summary = await getPositionsSummary(wallet);
159
+ return {
160
+ contents: [
161
+ {
162
+ uri,
163
+ mimeType: 'application/json',
164
+ text: JSON.stringify({
165
+ type: 'portfolio',
166
+ network: NETWORK,
167
+ ...summary,
168
+ fetchedAt: new Date().toISOString(),
169
+ }, null, 2),
170
+ },
171
+ ],
172
+ };
173
+ }
174
+ switch (uri) {
175
+ case 'baozi://markets/open': {
176
+ const markets = await listMarkets('Active');
177
+ return {
178
+ contents: [
179
+ {
180
+ uri,
181
+ mimeType: 'application/json',
182
+ text: JSON.stringify({
183
+ type: 'open_markets',
184
+ network: NETWORK,
185
+ programId: PROGRAM_ID.toBase58(),
186
+ count: markets.length,
187
+ markets: markets.map(m => ({
188
+ publicKey: m.publicKey,
189
+ marketId: m.marketId,
190
+ question: m.question,
191
+ layer: m.layer,
192
+ yesPercent: m.yesPercent,
193
+ noPercent: m.noPercent,
194
+ totalPoolSol: m.totalPoolSol,
195
+ closingTime: m.closingTime,
196
+ isBettingOpen: m.isBettingOpen,
197
+ })),
198
+ fetchedAt: new Date().toISOString(),
199
+ }, null, 2),
200
+ },
201
+ ],
202
+ };
203
+ }
204
+ case 'baozi://markets/all': {
205
+ const markets = await listMarkets();
206
+ const byStatus = {};
207
+ const byLayer = {};
208
+ for (const m of markets) {
209
+ byStatus[m.status] = (byStatus[m.status] || 0) + 1;
210
+ byLayer[m.layer] = (byLayer[m.layer] || 0) + 1;
211
+ }
212
+ return {
213
+ contents: [
214
+ {
215
+ uri,
216
+ mimeType: 'application/json',
217
+ text: JSON.stringify({
218
+ type: 'all_markets',
219
+ network: NETWORK,
220
+ programId: PROGRAM_ID.toBase58(),
221
+ count: markets.length,
222
+ byStatus,
223
+ byLayer,
224
+ markets: markets.map(m => ({
225
+ publicKey: m.publicKey,
226
+ marketId: m.marketId,
227
+ question: m.question,
228
+ status: m.status,
229
+ layer: m.layer,
230
+ winningOutcome: m.winningOutcome,
231
+ totalPoolSol: m.totalPoolSol,
232
+ })),
233
+ fetchedAt: new Date().toISOString(),
234
+ }, null, 2),
235
+ },
236
+ ],
237
+ };
238
+ }
239
+ case 'baozi://config': {
240
+ return {
241
+ contents: [
242
+ {
243
+ uri,
244
+ mimeType: 'application/json',
245
+ text: JSON.stringify({
246
+ type: 'program_config',
247
+ program: {
248
+ id: PROGRAM_ID.toBase58(),
249
+ network: NETWORK,
250
+ version: '4.7.6',
251
+ isMainnet: IS_MAINNET,
252
+ },
253
+ fees: {
254
+ official: {
255
+ platformFeeBps: FEES.OFFICIAL_PLATFORM_FEE_BPS,
256
+ platformFeePercent: `${FEES.OFFICIAL_PLATFORM_FEE_BPS / 100}%`,
257
+ creationFeeSol: FEES.OFFICIAL_CREATION_FEE / 1e9,
258
+ },
259
+ lab: {
260
+ platformFeeBps: FEES.LAB_PLATFORM_FEE_BPS,
261
+ platformFeePercent: `${FEES.LAB_PLATFORM_FEE_BPS / 100}%`,
262
+ creationFeeSol: FEES.LAB_CREATION_FEE / 1e9,
263
+ },
264
+ private: {
265
+ platformFeeBps: FEES.PRIVATE_PLATFORM_FEE_BPS,
266
+ platformFeePercent: `${FEES.PRIVATE_PLATFORM_FEE_BPS / 100}%`,
267
+ creationFeeSol: FEES.PRIVATE_CREATION_FEE / 1e9,
268
+ },
269
+ affiliateFeeBps: FEES.AFFILIATE_FEE_BPS,
270
+ creatorFeeBps: FEES.CREATOR_FEE_BPS,
271
+ },
272
+ limits: {
273
+ minBetSol: BET_LIMITS.MIN_BET_SOL,
274
+ maxBetSol: BET_LIMITS.MAX_BET_SOL,
275
+ },
276
+ timing: {
277
+ bettingFreezeSeconds: TIMING.BETTING_FREEZE_SECONDS,
278
+ minEventBufferHours: TIMING.MIN_EVENT_BUFFER_HOURS,
279
+ recommendedEventBufferHours: TIMING.RECOMMENDED_EVENT_BUFFER_HOURS,
280
+ disputeWindowSeconds: TIMING.DISPUTE_WINDOW_SECONDS,
281
+ },
282
+ marketStatuses: MARKET_STATUS_NAMES,
283
+ marketLayers: MARKET_LAYER_NAMES,
284
+ links: {
285
+ website: 'https://baozi.bet',
286
+ api: 'https://baozi.ooo/api/v4',
287
+ explorer: `https://solscan.io/account/${PROGRAM_ID.toBase58()}${IS_MAINNET ? '' : '?cluster=devnet'}`,
288
+ },
289
+ fetchedAt: new Date().toISOString(),
290
+ }, null, 2),
291
+ },
292
+ ],
293
+ };
294
+ }
295
+ case 'baozi://rules': {
296
+ return {
297
+ contents: [
298
+ {
299
+ uri,
300
+ mimeType: 'text/markdown',
301
+ text: MARKET_RULES_V6_2,
302
+ },
303
+ ],
304
+ };
305
+ }
306
+ case 'baozi://templates/event': {
307
+ return {
308
+ contents: [
309
+ {
310
+ uri,
311
+ mimeType: 'application/json',
312
+ text: JSON.stringify(EVENT_MARKET_TEMPLATE, null, 2),
313
+ },
314
+ ],
315
+ };
316
+ }
317
+ case 'baozi://templates/measurement': {
318
+ return {
319
+ contents: [
320
+ {
321
+ uri,
322
+ mimeType: 'application/json',
323
+ text: JSON.stringify(MEASUREMENT_MARKET_TEMPLATE, null, 2),
324
+ },
325
+ ],
326
+ };
327
+ }
328
+ default:
329
+ throw new Error(`Unknown resource: ${uri}`);
330
+ }
331
+ }
332
+ catch (error) {
333
+ throw error;
334
+ }
335
+ }
336
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVzb3VyY2VzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL3Jlc291cmNlcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7R0FLRztBQUNILE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUNwRCxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUM5RCxPQUFPLEVBQ0wsVUFBVSxFQUNWLElBQUksRUFDSixVQUFVLEVBQ1YsTUFBTSxFQUNOLG1CQUFtQixFQUNuQixrQkFBa0IsRUFDbEIsVUFBVSxFQUNWLE9BQU8sR0FDUixNQUFNLGFBQWEsQ0FBQztBQUVyQixnRkFBZ0Y7QUFDaEYsNkJBQTZCO0FBQzdCLGdGQUFnRjtBQUVoRixNQUFNLGlCQUFpQixHQUFHOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztDQStDekIsQ0FBQztBQUVGLGdGQUFnRjtBQUNoRixtQkFBbUI7QUFDbkIsZ0ZBQWdGO0FBRWhGLE1BQU0scUJBQXFCLEdBQUc7SUFDNUIsSUFBSSxFQUFFLE9BQU87SUFDYixXQUFXLEVBQUUsb0VBQW9FO0lBQ2pGLE9BQU8sRUFBRTtRQUNQLFFBQVEsRUFBRSxxQ0FBcUM7UUFDL0MsWUFBWSxFQUFFLDhDQUE4QztRQUM1RCxVQUFVLEVBQUUsMENBQTBDO1FBQ3RELFdBQVcsRUFBRSxPQUFPO1FBQ3BCLEtBQUssRUFBRSxLQUFLO0tBQ2I7SUFDRCxLQUFLLEVBQUU7UUFDTCw0Q0FBNEM7UUFDNUMsdUNBQXVDO1FBQ3ZDLGdEQUFnRDtRQUNoRCw2QkFBNkI7S0FDOUI7SUFDRCxRQUFRLEVBQUU7UUFDUixxQ0FBcUM7UUFDckMsZ0RBQWdEO1FBQ2hELHFEQUFxRDtLQUN0RDtDQUNGLENBQUM7QUFFRixNQUFNLDJCQUEyQixHQUFHO0lBQ2xDLElBQUksRUFBRSxhQUFhO0lBQ25CLFdBQVcsRUFBRSw4RUFBOEU7SUFDM0YsT0FBTyxFQUFFO1FBQ1AsUUFBUSxFQUFFLDJDQUEyQztRQUNyRCxZQUFZLEVBQUUsa0RBQWtEO1FBQ2hFLGlCQUFpQixFQUFFLHVEQUF1RDtRQUMxRSxlQUFlLEVBQUUscURBQXFEO1FBQ3RFLFdBQVcsRUFBRSxhQUFhO1FBQzFCLEtBQUssRUFBRSxLQUFLO0tBQ2I7SUFDRCxLQUFLLEVBQUU7UUFDTCxxREFBcUQ7UUFDckQsMkNBQTJDO1FBQzNDLHVDQUF1QztRQUN2QywwQ0FBMEM7S0FDM0M7SUFDRCxRQUFRLEVBQUU7UUFDUiwwQ0FBMEM7UUFDMUMsZ0RBQWdEO1FBQ2hELDZDQUE2QztLQUM5QztDQUNGLENBQUM7QUFFRixnRkFBZ0Y7QUFDaEYsdUJBQXVCO0FBQ3ZCLGdGQUFnRjtBQUVoRixNQUFNLENBQUMsTUFBTSxTQUFTLEdBQUc7SUFDdkI7UUFDRSxHQUFHLEVBQUUsc0JBQXNCO1FBQzNCLElBQUksRUFBRSxjQUFjO1FBQ3BCLFdBQVcsRUFBRSw0RUFBNEU7UUFDekYsUUFBUSxFQUFFLGtCQUFrQjtLQUM3QjtJQUNEO1FBQ0UsR0FBRyxFQUFFLHFCQUFxQjtRQUMxQixJQUFJLEVBQUUsYUFBYTtRQUNuQixXQUFXLEVBQUUsMkVBQTJFO1FBQ3hGLFFBQVEsRUFBRSxrQkFBa0I7S0FDN0I7SUFDRDtRQUNFLEdBQUcsRUFBRSxnQkFBZ0I7UUFDckIsSUFBSSxFQUFFLGdCQUFnQjtRQUN0QixXQUFXLEVBQUUsc0RBQXNEO1FBQ25FLFFBQVEsRUFBRSxrQkFBa0I7S0FDN0I7SUFDRDtRQUNFLEdBQUcsRUFBRSxlQUFlO1FBQ3BCLElBQUksRUFBRSxtQkFBbUI7UUFDekIsV0FBVyxFQUFFLGtFQUFrRTtRQUMvRSxRQUFRLEVBQUUsZUFBZTtLQUMxQjtJQUNEO1FBQ0UsR0FBRyxFQUFFLHlCQUF5QjtRQUM5QixJQUFJLEVBQUUsdUJBQXVCO1FBQzdCLFdBQVcsRUFBRSxzREFBc0Q7UUFDbkUsUUFBUSxFQUFFLGtCQUFrQjtLQUM3QjtJQUNEO1FBQ0UsR0FBRyxFQUFFLCtCQUErQjtRQUNwQyxJQUFJLEVBQUUsNkJBQTZCO1FBQ25DLFdBQVcsRUFBRSw2REFBNkQ7UUFDMUUsUUFBUSxFQUFFLGtCQUFrQjtLQUM3QjtDQUNGLENBQUM7QUFFRixnRkFBZ0Y7QUFDaEYsb0JBQW9CO0FBQ3BCLGdGQUFnRjtBQUVoRixNQUFNLENBQUMsS0FBSyxVQUFVLGNBQWMsQ0FBQyxHQUFXO0lBRzlDLElBQUksQ0FBQztRQUNILGtEQUFrRDtRQUNsRCxJQUFJLEdBQUcsQ0FBQyxVQUFVLENBQUMsb0JBQW9CLENBQUMsRUFBRSxDQUFDO1lBQ3pDLE1BQU0sTUFBTSxHQUFHLEdBQUcsQ0FBQyxPQUFPLENBQUMsb0JBQW9CLEVBQUUsRUFBRSxDQUFDLENBQUM7WUFDckQsTUFBTSxPQUFPLEdBQUcsTUFBTSxtQkFBbUIsQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUNsRCxPQUFPO2dCQUNMLFFBQVEsRUFBRTtvQkFDUjt3QkFDRSxHQUFHO3dCQUNILFFBQVEsRUFBRSxrQkFBa0I7d0JBQzVCLElBQUksRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDOzRCQUNuQixJQUFJLEVBQUUsV0FBVzs0QkFDakIsT0FBTyxFQUFFLE9BQU87NEJBQ2hCLEdBQUcsT0FBTzs0QkFDVixTQUFTLEVBQUUsSUFBSSxJQUFJLEVBQUUsQ0FBQyxXQUFXLEVBQUU7eUJBQ3BDLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztxQkFDWjtpQkFDRjthQUNGLENBQUM7UUFDSixDQUFDO1FBRUQsUUFBUSxHQUFHLEVBQUUsQ0FBQztZQUNaLEtBQUssc0JBQXNCLENBQUMsQ0FBQyxDQUFDO2dCQUM1QixNQUFNLE9BQU8sR0FBRyxNQUFNLFdBQVcsQ0FBQyxRQUFRLENBQUMsQ0FBQztnQkFDNUMsT0FBTztvQkFDTCxRQUFRLEVBQUU7d0JBQ1I7NEJBQ0UsR0FBRzs0QkFDSCxRQUFRLEVBQUUsa0JBQWtCOzRCQUM1QixJQUFJLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQztnQ0FDbkIsSUFBSSxFQUFFLGNBQWM7Z0NBQ3BCLE9BQU8sRUFBRSxPQUFPO2dDQUNoQixTQUFTLEVBQUUsVUFBVSxDQUFDLFFBQVEsRUFBRTtnQ0FDaEMsS0FBSyxFQUFFLE9BQU8sQ0FBQyxNQUFNO2dDQUNyQixPQUFPLEVBQUUsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7b0NBQ3pCLFNBQVMsRUFBRSxDQUFDLENBQUMsU0FBUztvQ0FDdEIsUUFBUSxFQUFFLENBQUMsQ0FBQyxRQUFRO29DQUNwQixRQUFRLEVBQUUsQ0FBQyxDQUFDLFFBQVE7b0NBQ3BCLEtBQUssRUFBRSxDQUFDLENBQUMsS0FBSztvQ0FDZCxVQUFVLEVBQUUsQ0FBQyxDQUFDLFVBQVU7b0NBQ3hCLFNBQVMsRUFBRSxDQUFDLENBQUMsU0FBUztvQ0FDdEIsWUFBWSxFQUFFLENBQUMsQ0FBQyxZQUFZO29DQUM1QixXQUFXLEVBQUUsQ0FBQyxDQUFDLFdBQVc7b0NBQzFCLGFBQWEsRUFBRSxDQUFDLENBQUMsYUFBYTtpQ0FDL0IsQ0FBQyxDQUFDO2dDQUNILFNBQVMsRUFBRSxJQUFJLElBQUksRUFBRSxDQUFDLFdBQVcsRUFBRTs2QkFDcEMsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO3lCQUNaO3FCQUNGO2lCQUNGLENBQUM7WUFDSixDQUFDO1lBRUQsS0FBSyxxQkFBcUIsQ0FBQyxDQUFDLENBQUM7Z0JBQzNCLE1BQU0sT0FBTyxHQUFHLE1BQU0sV0FBVyxFQUFFLENBQUM7Z0JBQ3BDLE1BQU0sUUFBUSxHQUEyQixFQUFFLENBQUM7Z0JBQzVDLE1BQU0sT0FBTyxHQUEyQixFQUFFLENBQUM7Z0JBRTNDLEtBQUssTUFBTSxDQUFDLElBQUksT0FBTyxFQUFFLENBQUM7b0JBQ3hCLFFBQVEsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztvQkFDbkQsT0FBTyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO2dCQUNqRCxDQUFDO2dCQUVELE9BQU87b0JBQ0wsUUFBUSxFQUFFO3dCQUNSOzRCQUNFLEdBQUc7NEJBQ0gsUUFBUSxFQUFFLGtCQUFrQjs0QkFDNUIsSUFBSSxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUM7Z0NBQ25CLElBQUksRUFBRSxhQUFhO2dDQUNuQixPQUFPLEVBQUUsT0FBTztnQ0FDaEIsU0FBUyxFQUFFLFVBQVUsQ0FBQyxRQUFRLEVBQUU7Z0NBQ2hDLEtBQUssRUFBRSxPQUFPLENBQUMsTUFBTTtnQ0FDckIsUUFBUTtnQ0FDUixPQUFPO2dDQUNQLE9BQU8sRUFBRSxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztvQ0FDekIsU0FBUyxFQUFFLENBQUMsQ0FBQyxTQUFTO29DQUN0QixRQUFRLEVBQUUsQ0FBQyxDQUFDLFFBQVE7b0NBQ3BCLFFBQVEsRUFBRSxDQUFDLENBQUMsUUFBUTtvQ0FDcEIsTUFBTSxFQUFFLENBQUMsQ0FBQyxNQUFNO29DQUNoQixLQUFLLEVBQUUsQ0FBQyxDQUFDLEtBQUs7b0NBQ2QsY0FBYyxFQUFFLENBQUMsQ0FBQyxjQUFjO29DQUNoQyxZQUFZLEVBQUUsQ0FBQyxDQUFDLFlBQVk7aUNBQzdCLENBQUMsQ0FBQztnQ0FDSCxTQUFTLEVBQUUsSUFBSSxJQUFJLEVBQUUsQ0FBQyxXQUFXLEVBQUU7NkJBQ3BDLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQzt5QkFDWjtxQkFDRjtpQkFDRixDQUFDO1lBQ0osQ0FBQztZQUVELEtBQUssZ0JBQWdCLENBQUMsQ0FBQyxDQUFDO2dCQUN0QixPQUFPO29CQUNMLFFBQVEsRUFBRTt3QkFDUjs0QkFDRSxHQUFHOzRCQUNILFFBQVEsRUFBRSxrQkFBa0I7NEJBQzVCLElBQUksRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDO2dDQUNuQixJQUFJLEVBQUUsZ0JBQWdCO2dDQUN0QixPQUFPLEVBQUU7b0NBQ1AsRUFBRSxFQUFFLFVBQVUsQ0FBQyxRQUFRLEVBQUU7b0NBQ3pCLE9BQU8sRUFBRSxPQUFPO29DQUNoQixPQUFPLEVBQUUsT0FBTztvQ0FDaEIsU0FBUyxFQUFFLFVBQVU7aUNBQ3RCO2dDQUNELElBQUksRUFBRTtvQ0FDSixRQUFRLEVBQUU7d0NBQ1IsY0FBYyxFQUFFLElBQUksQ0FBQyx5QkFBeUI7d0NBQzlDLGtCQUFrQixFQUFFLEdBQUcsSUFBSSxDQUFDLHlCQUF5QixHQUFHLEdBQUcsR0FBRzt3Q0FDOUQsY0FBYyxFQUFFLElBQUksQ0FBQyxxQkFBcUIsR0FBRyxHQUFHO3FDQUNqRDtvQ0FDRCxHQUFHLEVBQUU7d0NBQ0gsY0FBYyxFQUFFLElBQUksQ0FBQyxvQkFBb0I7d0NBQ3pDLGtCQUFrQixFQUFFLEdBQUcsSUFBSSxDQUFDLG9CQUFvQixHQUFHLEdBQUcsR0FBRzt3Q0FDekQsY0FBYyxFQUFFLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxHQUFHO3FDQUM1QztvQ0FDRCxPQUFPLEVBQUU7d0NBQ1AsY0FBYyxFQUFFLElBQUksQ0FBQyx3QkFBd0I7d0NBQzdDLGtCQUFrQixFQUFFLEdBQUcsSUFBSSxDQUFDLHdCQUF3QixHQUFHLEdBQUcsR0FBRzt3Q0FDN0QsY0FBYyxFQUFFLElBQUksQ0FBQyxvQkFBb0IsR0FBRyxHQUFHO3FDQUNoRDtvQ0FDRCxlQUFlLEVBQUUsSUFBSSxDQUFDLGlCQUFpQjtvQ0FDdkMsYUFBYSxFQUFFLElBQUksQ0FBQyxlQUFlO2lDQUNwQztnQ0FDRCxNQUFNLEVBQUU7b0NBQ04sU0FBUyxFQUFFLFVBQVUsQ0FBQyxXQUFXO29DQUNqQyxTQUFTLEVBQUUsVUFBVSxDQUFDLFdBQVc7aUNBQ2xDO2dDQUNELE1BQU0sRUFBRTtvQ0FDTixvQkFBb0IsRUFBRSxNQUFNLENBQUMsc0JBQXNCO29DQUNuRCxtQkFBbUIsRUFBRSxNQUFNLENBQUMsc0JBQXNCO29DQUNsRCwyQkFBMkIsRUFBRSxNQUFNLENBQUMsOEJBQThCO29DQUNsRSxvQkFBb0IsRUFBRSxNQUFNLENBQUMsc0JBQXNCO2lDQUNwRDtnQ0FDRCxjQUFjLEVBQUUsbUJBQW1CO2dDQUNuQyxZQUFZLEVBQUUsa0JBQWtCO2dDQUNoQyxLQUFLLEVBQUU7b0NBQ0wsT0FBTyxFQUFFLG1CQUFtQjtvQ0FDNUIsR0FBRyxFQUFFLDBCQUEwQjtvQ0FDL0IsUUFBUSxFQUFFLDhCQUE4QixVQUFVLENBQUMsUUFBUSxFQUFFLEdBQUcsVUFBVSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLGlCQUFpQixFQUFFO2lDQUN0RztnQ0FDRCxTQUFTLEVBQUUsSUFBSSxJQUFJLEVBQUUsQ0FBQyxXQUFXLEVBQUU7NkJBQ3BDLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQzt5QkFDWjtxQkFDRjtpQkFDRixDQUFDO1lBQ0osQ0FBQztZQUVELEtBQUssZUFBZSxDQUFDLENBQUMsQ0FBQztnQkFDckIsT0FBTztvQkFDTCxRQUFRLEVBQUU7d0JBQ1I7NEJBQ0UsR0FBRzs0QkFDSCxRQUFRLEVBQUUsZUFBZTs0QkFDekIsSUFBSSxFQUFFLGlCQUFpQjt5QkFDeEI7cUJBQ0Y7aUJBQ0YsQ0FBQztZQUNKLENBQUM7WUFFRCxLQUFLLHlCQUF5QixDQUFDLENBQUMsQ0FBQztnQkFDL0IsT0FBTztvQkFDTCxRQUFRLEVBQUU7d0JBQ1I7NEJBQ0UsR0FBRzs0QkFDSCxRQUFRLEVBQUUsa0JBQWtCOzRCQUM1QixJQUFJLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxxQkFBcUIsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO3lCQUNyRDtxQkFDRjtpQkFDRixDQUFDO1lBQ0osQ0FBQztZQUVELEtBQUssK0JBQStCLENBQUMsQ0FBQyxDQUFDO2dCQUNyQyxPQUFPO29CQUNMLFFBQVEsRUFBRTt3QkFDUjs0QkFDRSxHQUFHOzRCQUNILFFBQVEsRUFBRSxrQkFBa0I7NEJBQzVCLElBQUksRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLDJCQUEyQixFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7eUJBQzNEO3FCQUNGO2lCQUNGLENBQUM7WUFDSixDQUFDO1lBRUQ7Z0JBQ0UsTUFBTSxJQUFJLEtBQUssQ0FBQyxxQkFBcUIsR0FBRyxFQUFFLENBQUMsQ0FBQztRQUNoRCxDQUFDO0lBQ0gsQ0FBQztJQUFDLE9BQU8sS0FBSyxFQUFFLENBQUM7UUFDZixNQUFNLEtBQUssQ0FBQztJQUNkLENBQUM7QUFDSCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBNQ1AgUmVzb3VyY2UgRGVmaW5pdGlvbnMgZm9yIEJhb3ppIE1hcmtldHNcbiAqIFYyLjAuMCAtIE1haW5uZXQgKyBFeHRlbmRlZCBSZXNvdXJjZXNcbiAqXG4gKiBSZXNvdXJjZXMgcHJvdmlkZSByZWFkLW9ubHkgZGF0YSB0aGF0IGNhbiBiZSBmZXRjaGVkIGJ5IFVSSS5cbiAqL1xuaW1wb3J0IHsgbGlzdE1hcmtldHMgfSBmcm9tICcuL2hhbmRsZXJzL21hcmtldHMuanMnO1xuaW1wb3J0IHsgZ2V0UG9zaXRpb25zU3VtbWFyeSB9IGZyb20gJy4vaGFuZGxlcnMvcG9zaXRpb25zLmpzJztcbmltcG9ydCB7XG4gIFBST0dSQU1fSUQsXG4gIEZFRVMsXG4gIEJFVF9MSU1JVFMsXG4gIFRJTUlORyxcbiAgTUFSS0VUX1NUQVRVU19OQU1FUyxcbiAgTUFSS0VUX0xBWUVSX05BTUVTLFxuICBJU19NQUlOTkVULFxuICBORVRXT1JLLFxufSBmcm9tICcuL2NvbmZpZy5qcyc7XG5cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBWNi4yIE1BUktFVCBSVUxFUyBET0NVTUVOVFxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuY29uc3QgTUFSS0VUX1JVTEVTX1Y2XzIgPSBgXG4jIEJhb3ppIE1hcmtldCBDcmVhdGlvbiBSdWxlcyAodjYuMilcblxuIyMgT3ZlcnZpZXdcbk1hcmtldHMgbXVzdCBmb2xsb3cgdGltaW5nIHJ1bGVzIHRvIGVuc3VyZSBmYWlyIGJldHRpbmcgYW5kIGFjY3VyYXRlIHJlc29sdXRpb24uXG5cbiMjIFJ1bGUgQTogRXZlbnQtQmFzZWQgTWFya2V0c1xuRm9yIG1hcmtldHMgYmFzZWQgb24gYSBzaW5nbGUgcG9pbnQtaW4tdGltZSBldmVudCAoZS5nLiwgXCJXaWxsIFggd2luIHRoZSBlbGVjdGlvbj9cIik6XG5cbjEuICoqQmV0dGluZyBDbG9zZSBCdWZmZXIqKjogQmV0dGluZyBtdXN0IGNsb3NlIEFUIExFQVNUIDEyIGhvdXJzIGJlZm9yZSB0aGUgZXZlbnRcbjIuICoqUmVjb21tZW5kZWQgQnVmZmVyKio6IDE4LTI0IGhvdXJzIHByb3ZpZGVzIHNhZmV0eSBtYXJnaW4gZm9yIHRpbWV6b25lIGlzc3Vlc1xuMy4gKipSZXNvbHV0aW9uKio6IEFmdGVyIGV2ZW50IG9jY3VycywgbWFya2V0IGlzIHJlc29sdmVkIGJhc2VkIG9uIG91dGNvbWVcblxuIyMjIEV4YW1wbGUgKFJ1bGUgQSlcbi0gRXZlbnQ6IFwiU3VwZXIgQm93bCBraWNrb2ZmIGF0IDIwMjUtMDItMDkgMTg6MzA6MDAgVVRDXCJcbi0gUXVlc3Rpb246IFwiV2lsbCB0aGUgQ2hpZWZzIHdpbiBTdXBlciBCb3dsIExJWD9cIlxuLSBSZWNvbW1lbmRlZCBiZXR0aW5nIGNsb3NlOiAyMDI1LTAyLTA4IDE4OjMwOjAwIFVUQyAoMjRoIGJlZm9yZSlcbi0gTGF0ZXN0IGFjY2VwdGFibGUgY2xvc2U6IDIwMjUtMDItMDkgMDY6MzA6MDAgVVRDICgxMmggYmVmb3JlKVxuXG4jIyBSdWxlIEI6IE1lYXN1cmVtZW50LVBlcmlvZCBNYXJrZXRzXG5Gb3IgbWFya2V0cyBiYXNlZCBvbiBvdXRjb21lcyBvdmVyIGEgdGltZSBwZXJpb2QgKGUuZy4sIFwiV2lsbCBCVEMgcmVhY2ggJDEwMGsgaW4gSmFudWFyeT9cIik6XG5cbjEuICoqQ1JJVElDQUwqKjogQmV0dGluZyBtdXN0IGNsb3NlIEJFRk9SRSBtZWFzdXJlbWVudCBwZXJpb2Qgc3RhcnRzXG4yLiAqKk5vIE92ZXJsYXAqKjogWmVybyB0b2xlcmFuY2UgZm9yIGJldHRpbmcgZHVyaW5nIG1lYXN1cmVtZW50IHBlcmlvZFxuMy4gKipJbmZvcm1hdGlvbiBBZHZhbnRhZ2UqKjogQWxsb3dpbmcgYmV0cyBkdXJpbmcgbWVhc3VyZW1lbnQgZW5hYmxlcyB1bmZhaXIgYWR2YW50YWdlXG40LiAqKlBlcmlvZCBMZW5ndGgqKjogUHJlZmVyIDItNyBkYXlzIGZvciBvcHRpbWFsIHVzZXIgZXhwZXJpZW5jZVxuXG4jIyMgRXhhbXBsZSAoUnVsZSBCKVxuLSBRdWVzdGlvbjogXCJXaWxsIEVUSCBiZSBhYm92ZSAkNDAwMCBvbiBGZWIgMXN0IDIwMjU/XCJcbi0gTWVhc3VyZW1lbnQgcGVyaW9kOiBGZWIgMXN0IDAwOjAwIC0gMjM6NTkgVVRDXG4tIEJldHRpbmcgbXVzdCBjbG9zZTogQmVmb3JlIEZlYiAxc3QgMDA6MDAgVVRDXG4tIFJlY29tbWVuZGVkIGNsb3NlOiBKYW4gMzFzdCAyMjowMCBVVEMgKDJoIGJ1ZmZlcilcblxuIyMgQ29tbW9uIFRpbWluZyBNaXN0YWtlc1xuXG4jIyMgSU5WQUxJRCBDb25maWd1cmF0aW9uczpcbi0gQmV0dGluZyBjbG9zZXMgQUZURVIgZXZlbnQgc3RhcnRzIChSdWxlIEEgdmlvbGF0aW9uKVxuLSBCZXR0aW5nIG92ZXJsYXBzIHdpdGggbWVhc3VyZW1lbnQgcGVyaW9kIChSdWxlIEIgdmlvbGF0aW9uKVxuLSBCdWZmZXIgPCAxMiBob3VycyBmb3IgZXZlbnQgbWFya2V0cyAodG9vIHJpc2t5KVxuXG4jIyMgV0FSTklORyBDb25maWd1cmF0aW9uczpcbi0gQnVmZmVyIDEyLTE4IGhvdXJzIChhY2NlcHRhYmxlIGJ1dCB0aWdodClcbi0gTWVhc3VyZW1lbnQgcGVyaW9kID4gNyBkYXlzIChwb29yIFVYKVxuLSBWZXJ5IHNob3J0IGJ1ZmZlciA8IDIgaG91cnMgZm9yIG1lYXN1cmVtZW50IChyaXNrIG9mIGxhdGUgYmV0cylcblxuIyMgVmFsaWRhdGlvbiBFbmRwb2ludFxuVXNlIHRoZSBcXGB2YWxpZGF0ZV9tYXJrZXRfcGFyYW1zXFxgIHRvb2wgdG8gY2hlY2sgeW91ciBtYXJrZXQgcGFyYW1ldGVycyBiZWZvcmUgY3JlYXRpb24uXG5gO1xuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8gTUFSS0VUIFRFTVBMQVRFU1xuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuY29uc3QgRVZFTlRfTUFSS0VUX1RFTVBMQVRFID0ge1xuICB0eXBlOiAnZXZlbnQnLFxuICBkZXNjcmlwdGlvbjogJ1RlbXBsYXRlIGZvciBldmVudC1iYXNlZCBwcmVkaWN0aW9uIG1hcmtldHMgKHNpbmdsZSBwb2ludCBpbiB0aW1lKScsXG4gIGV4YW1wbGU6IHtcbiAgICBxdWVzdGlvbjogJ1dpbGwgW1RlYW0gQV0gd2luIHRoZSBbRXZlbnQgTmFtZV0/JyxcbiAgICBjbG9zaW5nX3RpbWU6ICdZWVlZLU1NLUREVEhIOk1NOlNTWiAoMjQgaG91cnMgYmVmb3JlIGV2ZW50KScsXG4gICAgZXZlbnRfdGltZTogJ1lZWVktTU0tRERUSEg6TU06U1NaICh3aGVuIGV2ZW50IG9jY3VycyknLFxuICAgIG1hcmtldF90eXBlOiAnZXZlbnQnLFxuICAgIGxheWVyOiAnTGFiJyxcbiAgfSxcbiAgcnVsZXM6IFtcbiAgICAnUXVlc3Rpb24gbXVzdCBiZSBhbnN3ZXJhYmxlIHdpdGggWUVTIG9yIE5PJyxcbiAgICAnRXZlbnQgdGltZSBtdXN0IGJlIGFmdGVyIGNsb3NpbmcgdGltZScsXG4gICAgJ01pbmltdW0gMTIgaG91ciBidWZmZXIgYmV0d2VlbiBjbG9zZSBhbmQgZXZlbnQnLFxuICAgICdRdWVzdGlvbiBtYXggMjAwIGNoYXJhY3RlcnMnLFxuICBdLFxuICBleGFtcGxlczogW1xuICAgICdXaWxsIHRoZSBDaGllZnMgd2luIFN1cGVyIEJvd2wgTElYPycsXG4gICAgJ1dpbGwgQml0Y29pbiByZWFjaCAkMTAwLDAwMCBiZWZvcmUgTWFyY2ggMjAyNT8nLFxuICAgICdXaWxsIFNwYWNlWCBzdWNjZXNzZnVsbHkgbGF1bmNoIFN0YXJzaGlwIG9uIFtkYXRlXT8nLFxuICBdLFxufTtcblxuY29uc3QgTUVBU1VSRU1FTlRfTUFSS0VUX1RFTVBMQVRFID0ge1xuICB0eXBlOiAnbWVhc3VyZW1lbnQnLFxuICBkZXNjcmlwdGlvbjogJ1RlbXBsYXRlIGZvciBtZWFzdXJlbWVudC1wZXJpb2QgcHJlZGljdGlvbiBtYXJrZXRzIChvdXRjb21lIG92ZXIgdGltZSByYW5nZSknLFxuICBleGFtcGxlOiB7XG4gICAgcXVlc3Rpb246ICdXaWxsIFtNZXRyaWNdIGJlIGFib3ZlIFtWYWx1ZV0gb24gW0RhdGVdPycsXG4gICAgY2xvc2luZ190aW1lOiAnWVlZWS1NTS1ERFRISDpNTTpTU1ogKGJlZm9yZSBtZWFzdXJlbWVudCBzdGFydHMpJyxcbiAgICBtZWFzdXJlbWVudF9zdGFydDogJ1lZWVktTU0tRERUSEg6TU06U1NaICh3aGVuIG1lYXN1cmVtZW50IHBlcmlvZCBiZWdpbnMpJyxcbiAgICBtZWFzdXJlbWVudF9lbmQ6ICdZWVlZLU1NLUREVEhIOk1NOlNTWiAod2hlbiBtZWFzdXJlbWVudCBwZXJpb2QgZW5kcyknLFxuICAgIG1hcmtldF90eXBlOiAnbWVhc3VyZW1lbnQnLFxuICAgIGxheWVyOiAnTGFiJyxcbiAgfSxcbiAgcnVsZXM6IFtcbiAgICAnQmV0dGluZyBNVVNUIGNsb3NlIGJlZm9yZSBtZWFzdXJlbWVudCBwZXJpb2Qgc3RhcnRzJyxcbiAgICAnTWVhc3VyZW1lbnQgcGVyaW9kIHNob3VsZCBiZSB3ZWxsLWRlZmluZWQnLFxuICAgICdQcmVmZXIgMi03IGRheSBwZXJpb2RzIGZvciBvcHRpbWFsIFVYJyxcbiAgICAnRGF0YSBzb3VyY2UgZm9yIHJlc29sdXRpb24gbXVzdCBiZSBjbGVhcicsXG4gIF0sXG4gIGV4YW1wbGVzOiBbXG4gICAgJ1dpbGwgRVRIIGJlIGFib3ZlICQ0MDAwIG9uIEZlYiAxc3QgMjAyNT8nLFxuICAgICdXaWxsIFVTIGluZmxhdGlvbiBiZSBiZWxvdyAzJSBpbiBKYW51YXJ5IDIwMjU/JyxcbiAgICAnV2lsbCBBQVBMIGNsb3NlIGFib3ZlICQyMDAgb24gZWFybmluZ3MgZGF5PycsXG4gIF0sXG59O1xuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8gUkVTT1VSQ0UgREVGSU5JVElPTlNcbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbmV4cG9ydCBjb25zdCBSRVNPVVJDRVMgPSBbXG4gIHtcbiAgICB1cmk6ICdiYW96aTovL21hcmtldHMvb3BlbicsXG4gICAgbmFtZTogJ09wZW4gTWFya2V0cycsXG4gICAgZGVzY3JpcHRpb246ICdMaXN0IG9mIGN1cnJlbnRseSBvcGVuIHByZWRpY3Rpb24gbWFya2V0cyBhY2NlcHRpbmcgYmV0cyBvbiBTb2xhbmEgbWFpbm5ldCcsXG4gICAgbWltZVR5cGU6ICdhcHBsaWNhdGlvbi9qc29uJyxcbiAgfSxcbiAge1xuICAgIHVyaTogJ2Jhb3ppOi8vbWFya2V0cy9hbGwnLFxuICAgIG5hbWU6ICdBbGwgTWFya2V0cycsXG4gICAgZGVzY3JpcHRpb246ICdMaXN0IG9mIGFsbCBwcmVkaWN0aW9uIG1hcmtldHMgKG9wZW4sIGNsb3NlZCwgcmVzb2x2ZWQpIG9uIFNvbGFuYSBtYWlubmV0JyxcbiAgICBtaW1lVHlwZTogJ2FwcGxpY2F0aW9uL2pzb24nLFxuICB9LFxuICB7XG4gICAgdXJpOiAnYmFvemk6Ly9jb25maWcnLFxuICAgIG5hbWU6ICdQcm9ncmFtIENvbmZpZycsXG4gICAgZGVzY3JpcHRpb246ICdCYW96aSBWNC43LjYgcHJvZ3JhbSBjb25maWd1cmF0aW9uLCBmZWVzLCBhbmQgbGltaXRzJyxcbiAgICBtaW1lVHlwZTogJ2FwcGxpY2F0aW9uL2pzb24nLFxuICB9LFxuICB7XG4gICAgdXJpOiAnYmFvemk6Ly9ydWxlcycsXG4gICAgbmFtZTogJ01hcmtldCBSdWxlcyB2Ni4yJyxcbiAgICBkZXNjcmlwdGlvbjogJ0RvY3VtZW50YXRpb24gb2YgbWFya2V0IHRpbWluZyBydWxlcyBhbmQgdmFsaWRhdGlvbiByZXF1aXJlbWVudHMnLFxuICAgIG1pbWVUeXBlOiAndGV4dC9tYXJrZG93bicsXG4gIH0sXG4gIHtcbiAgICB1cmk6ICdiYW96aTovL3RlbXBsYXRlcy9ldmVudCcsXG4gICAgbmFtZTogJ0V2ZW50IE1hcmtldCBUZW1wbGF0ZScsXG4gICAgZGVzY3JpcHRpb246ICdUZW1wbGF0ZSBmb3IgY3JlYXRpbmcgZXZlbnQtYmFzZWQgcHJlZGljdGlvbiBtYXJrZXRzJyxcbiAgICBtaW1lVHlwZTogJ2FwcGxpY2F0aW9uL2pzb24nLFxuICB9LFxuICB7XG4gICAgdXJpOiAnYmFvemk6Ly90ZW1wbGF0ZXMvbWVhc3VyZW1lbnQnLFxuICAgIG5hbWU6ICdNZWFzdXJlbWVudCBNYXJrZXQgVGVtcGxhdGUnLFxuICAgIGRlc2NyaXB0aW9uOiAnVGVtcGxhdGUgZm9yIGNyZWF0aW5nIG1lYXN1cmVtZW50LXBlcmlvZCBwcmVkaWN0aW9uIG1hcmtldHMnLFxuICAgIG1pbWVUeXBlOiAnYXBwbGljYXRpb24vanNvbicsXG4gIH0sXG5dO1xuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8gUkVTT1VSQ0UgSEFORExFUlNcbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBoYW5kbGVSZXNvdXJjZSh1cmk6IHN0cmluZyk6IFByb21pc2U8e1xuICBjb250ZW50czogQXJyYXk8eyB1cmk6IHN0cmluZzsgbWltZVR5cGU6IHN0cmluZzsgdGV4dDogc3RyaW5nIH0+O1xufT4ge1xuICB0cnkge1xuICAgIC8vIEhhbmRsZSBwb3J0Zm9saW8gcmVxdWVzdHMgd2l0aCB3YWxsZXQgcGFyYW1ldGVyXG4gICAgaWYgKHVyaS5zdGFydHNXaXRoKCdiYW96aTovL3BvcnRmb2xpby8nKSkge1xuICAgICAgY29uc3Qgd2FsbGV0ID0gdXJpLnJlcGxhY2UoJ2Jhb3ppOi8vcG9ydGZvbGlvLycsICcnKTtcbiAgICAgIGNvbnN0IHN1bW1hcnkgPSBhd2FpdCBnZXRQb3NpdGlvbnNTdW1tYXJ5KHdhbGxldCk7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBjb250ZW50czogW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIHVyaSxcbiAgICAgICAgICAgIG1pbWVUeXBlOiAnYXBwbGljYXRpb24vanNvbicsXG4gICAgICAgICAgICB0ZXh0OiBKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgICAgICAgIHR5cGU6ICdwb3J0Zm9saW8nLFxuICAgICAgICAgICAgICBuZXR3b3JrOiBORVRXT1JLLFxuICAgICAgICAgICAgICAuLi5zdW1tYXJ5LFxuICAgICAgICAgICAgICBmZXRjaGVkQXQ6IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKSxcbiAgICAgICAgICAgIH0sIG51bGwsIDIpLFxuICAgICAgICAgIH0sXG4gICAgICAgIF0sXG4gICAgICB9O1xuICAgIH1cblxuICAgIHN3aXRjaCAodXJpKSB7XG4gICAgICBjYXNlICdiYW96aTovL21hcmtldHMvb3Blbic6IHtcbiAgICAgICAgY29uc3QgbWFya2V0cyA9IGF3YWl0IGxpc3RNYXJrZXRzKCdBY3RpdmUnKTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBjb250ZW50czogW1xuICAgICAgICAgICAge1xuICAgICAgICAgICAgICB1cmksXG4gICAgICAgICAgICAgIG1pbWVUeXBlOiAnYXBwbGljYXRpb24vanNvbicsXG4gICAgICAgICAgICAgIHRleHQ6IEpTT04uc3RyaW5naWZ5KHtcbiAgICAgICAgICAgICAgICB0eXBlOiAnb3Blbl9tYXJrZXRzJyxcbiAgICAgICAgICAgICAgICBuZXR3b3JrOiBORVRXT1JLLFxuICAgICAgICAgICAgICAgIHByb2dyYW1JZDogUFJPR1JBTV9JRC50b0Jhc2U1OCgpLFxuICAgICAgICAgICAgICAgIGNvdW50OiBtYXJrZXRzLmxlbmd0aCxcbiAgICAgICAgICAgICAgICBtYXJrZXRzOiBtYXJrZXRzLm1hcChtID0+ICh7XG4gICAgICAgICAgICAgICAgICBwdWJsaWNLZXk6IG0ucHVibGljS2V5LFxuICAgICAgICAgICAgICAgICAgbWFya2V0SWQ6IG0ubWFya2V0SWQsXG4gICAgICAgICAgICAgICAgICBxdWVzdGlvbjogbS5xdWVzdGlvbixcbiAgICAgICAgICAgICAgICAgIGxheWVyOiBtLmxheWVyLFxuICAgICAgICAgICAgICAgICAgeWVzUGVyY2VudDogbS55ZXNQZXJjZW50LFxuICAgICAgICAgICAgICAgICAgbm9QZXJjZW50OiBtLm5vUGVyY2VudCxcbiAgICAgICAgICAgICAgICAgIHRvdGFsUG9vbFNvbDogbS50b3RhbFBvb2xTb2wsXG4gICAgICAgICAgICAgICAgICBjbG9zaW5nVGltZTogbS5jbG9zaW5nVGltZSxcbiAgICAgICAgICAgICAgICAgIGlzQmV0dGluZ09wZW46IG0uaXNCZXR0aW5nT3BlbixcbiAgICAgICAgICAgICAgICB9KSksXG4gICAgICAgICAgICAgICAgZmV0Y2hlZEF0OiBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCksXG4gICAgICAgICAgICAgIH0sIG51bGwsIDIpLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICBdLFxuICAgICAgICB9O1xuICAgICAgfVxuXG4gICAgICBjYXNlICdiYW96aTovL21hcmtldHMvYWxsJzoge1xuICAgICAgICBjb25zdCBtYXJrZXRzID0gYXdhaXQgbGlzdE1hcmtldHMoKTtcbiAgICAgICAgY29uc3QgYnlTdGF0dXM6IFJlY29yZDxzdHJpbmcsIG51bWJlcj4gPSB7fTtcbiAgICAgICAgY29uc3QgYnlMYXllcjogUmVjb3JkPHN0cmluZywgbnVtYmVyPiA9IHt9O1xuXG4gICAgICAgIGZvciAoY29uc3QgbSBvZiBtYXJrZXRzKSB7XG4gICAgICAgICAgYnlTdGF0dXNbbS5zdGF0dXNdID0gKGJ5U3RhdHVzW20uc3RhdHVzXSB8fCAwKSArIDE7XG4gICAgICAgICAgYnlMYXllclttLmxheWVyXSA9IChieUxheWVyW20ubGF5ZXJdIHx8IDApICsgMTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgY29udGVudHM6IFtcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgdXJpLFxuICAgICAgICAgICAgICBtaW1lVHlwZTogJ2FwcGxpY2F0aW9uL2pzb24nLFxuICAgICAgICAgICAgICB0ZXh0OiBKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgICAgICAgICAgdHlwZTogJ2FsbF9tYXJrZXRzJyxcbiAgICAgICAgICAgICAgICBuZXR3b3JrOiBORVRXT1JLLFxuICAgICAgICAgICAgICAgIHByb2dyYW1JZDogUFJPR1JBTV9JRC50b0Jhc2U1OCgpLFxuICAgICAgICAgICAgICAgIGNvdW50OiBtYXJrZXRzLmxlbmd0aCxcbiAgICAgICAgICAgICAgICBieVN0YXR1cyxcbiAgICAgICAgICAgICAgICBieUxheWVyLFxuICAgICAgICAgICAgICAgIG1hcmtldHM6IG1hcmtldHMubWFwKG0gPT4gKHtcbiAgICAgICAgICAgICAgICAgIHB1YmxpY0tleTogbS5wdWJsaWNLZXksXG4gICAgICAgICAgICAgICAgICBtYXJrZXRJZDogbS5tYXJrZXRJZCxcbiAgICAgICAgICAgICAgICAgIHF1ZXN0aW9uOiBtLnF1ZXN0aW9uLFxuICAgICAgICAgICAgICAgICAgc3RhdHVzOiBtLnN0YXR1cyxcbiAgICAgICAgICAgICAgICAgIGxheWVyOiBtLmxheWVyLFxuICAgICAgICAgICAgICAgICAgd2lubmluZ091dGNvbWU6IG0ud2lubmluZ091dGNvbWUsXG4gICAgICAgICAgICAgICAgICB0b3RhbFBvb2xTb2w6IG0udG90YWxQb29sU29sLFxuICAgICAgICAgICAgICAgIH0pKSxcbiAgICAgICAgICAgICAgICBmZXRjaGVkQXQ6IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKSxcbiAgICAgICAgICAgICAgfSwgbnVsbCwgMiksXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIF0sXG4gICAgICAgIH07XG4gICAgICB9XG5cbiAgICAgIGNhc2UgJ2Jhb3ppOi8vY29uZmlnJzoge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGNvbnRlbnRzOiBbXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIHVyaSxcbiAgICAgICAgICAgICAgbWltZVR5cGU6ICdhcHBsaWNhdGlvbi9qc29uJyxcbiAgICAgICAgICAgICAgdGV4dDogSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgICAgICAgICAgIHR5cGU6ICdwcm9ncmFtX2NvbmZpZycsXG4gICAgICAgICAgICAgICAgcHJvZ3JhbToge1xuICAgICAgICAgICAgICAgICAgaWQ6IFBST0dSQU1fSUQudG9CYXNlNTgoKSxcbiAgICAgICAgICAgICAgICAgIG5ldHdvcms6IE5FVFdPUkssXG4gICAgICAgICAgICAgICAgICB2ZXJzaW9uOiAnNC43LjYnLFxuICAgICAgICAgICAgICAgICAgaXNNYWlubmV0OiBJU19NQUlOTkVULFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgZmVlczoge1xuICAgICAgICAgICAgICAgICAgb2ZmaWNpYWw6IHtcbiAgICAgICAgICAgICAgICAgICAgcGxhdGZvcm1GZWVCcHM6IEZFRVMuT0ZGSUNJQUxfUExBVEZPUk1fRkVFX0JQUyxcbiAgICAgICAgICAgICAgICAgICAgcGxhdGZvcm1GZWVQZXJjZW50OiBgJHtGRUVTLk9GRklDSUFMX1BMQVRGT1JNX0ZFRV9CUFMgLyAxMDB9JWAsXG4gICAgICAgICAgICAgICAgICAgIGNyZWF0aW9uRmVlU29sOiBGRUVTLk9GRklDSUFMX0NSRUFUSU9OX0ZFRSAvIDFlOSxcbiAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICBsYWI6IHtcbiAgICAgICAgICAgICAgICAgICAgcGxhdGZvcm1GZWVCcHM6IEZFRVMuTEFCX1BMQVRGT1JNX0ZFRV9CUFMsXG4gICAgICAgICAgICAgICAgICAgIHBsYXRmb3JtRmVlUGVyY2VudDogYCR7RkVFUy5MQUJfUExBVEZPUk1fRkVFX0JQUyAvIDEwMH0lYCxcbiAgICAgICAgICAgICAgICAgICAgY3JlYXRpb25GZWVTb2w6IEZFRVMuTEFCX0NSRUFUSU9OX0ZFRSAvIDFlOSxcbiAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICBwcml2YXRlOiB7XG4gICAgICAgICAgICAgICAgICAgIHBsYXRmb3JtRmVlQnBzOiBGRUVTLlBSSVZBVEVfUExBVEZPUk1fRkVFX0JQUyxcbiAgICAgICAgICAgICAgICAgICAgcGxhdGZvcm1GZWVQZXJjZW50OiBgJHtGRUVTLlBSSVZBVEVfUExBVEZPUk1fRkVFX0JQUyAvIDEwMH0lYCxcbiAgICAgICAgICAgICAgICAgICAgY3JlYXRpb25GZWVTb2w6IEZFRVMuUFJJVkFURV9DUkVBVElPTl9GRUUgLyAxZTksXG4gICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgYWZmaWxpYXRlRmVlQnBzOiBGRUVTLkFGRklMSUFURV9GRUVfQlBTLFxuICAgICAgICAgICAgICAgICAgY3JlYXRvckZlZUJwczogRkVFUy5DUkVBVE9SX0ZFRV9CUFMsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBsaW1pdHM6IHtcbiAgICAgICAgICAgICAgICAgIG1pbkJldFNvbDogQkVUX0xJTUlUUy5NSU5fQkVUX1NPTCxcbiAgICAgICAgICAgICAgICAgIG1heEJldFNvbDogQkVUX0xJTUlUUy5NQVhfQkVUX1NPTCxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHRpbWluZzoge1xuICAgICAgICAgICAgICAgICAgYmV0dGluZ0ZyZWV6ZVNlY29uZHM6IFRJTUlORy5CRVRUSU5HX0ZSRUVaRV9TRUNPTkRTLFxuICAgICAgICAgICAgICAgICAgbWluRXZlbnRCdWZmZXJIb3VyczogVElNSU5HLk1JTl9FVkVOVF9CVUZGRVJfSE9VUlMsXG4gICAgICAgICAgICAgICAgICByZWNvbW1lbmRlZEV2ZW50QnVmZmVySG91cnM6IFRJTUlORy5SRUNPTU1FTkRFRF9FVkVOVF9CVUZGRVJfSE9VUlMsXG4gICAgICAgICAgICAgICAgICBkaXNwdXRlV2luZG93U2Vjb25kczogVElNSU5HLkRJU1BVVEVfV0lORE9XX1NFQ09ORFMsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBtYXJrZXRTdGF0dXNlczogTUFSS0VUX1NUQVRVU19OQU1FUyxcbiAgICAgICAgICAgICAgICBtYXJrZXRMYXllcnM6IE1BUktFVF9MQVlFUl9OQU1FUyxcbiAgICAgICAgICAgICAgICBsaW5rczoge1xuICAgICAgICAgICAgICAgICAgd2Vic2l0ZTogJ2h0dHBzOi8vYmFvemkuYmV0JyxcbiAgICAgICAgICAgICAgICAgIGFwaTogJ2h0dHBzOi8vYmFvemkub29vL2FwaS92NCcsXG4gICAgICAgICAgICAgICAgICBleHBsb3JlcjogYGh0dHBzOi8vc29sc2Nhbi5pby9hY2NvdW50LyR7UFJPR1JBTV9JRC50b0Jhc2U1OCgpfSR7SVNfTUFJTk5FVCA/ICcnIDogJz9jbHVzdGVyPWRldm5ldCd9YCxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIGZldGNoZWRBdDogbmV3IERhdGUoKS50b0lTT1N0cmluZygpLFxuICAgICAgICAgICAgICB9LCBudWxsLCAyKSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgXSxcbiAgICAgICAgfTtcbiAgICAgIH1cblxuICAgICAgY2FzZSAnYmFvemk6Ly9ydWxlcyc6IHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBjb250ZW50czogW1xuICAgICAgICAgICAge1xuICAgICAgICAgICAgICB1cmksXG4gICAgICAgICAgICAgIG1pbWVUeXBlOiAndGV4dC9tYXJrZG93bicsXG4gICAgICAgICAgICAgIHRleHQ6IE1BUktFVF9SVUxFU19WNl8yLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICBdLFxuICAgICAgICB9O1xuICAgICAgfVxuXG4gICAgICBjYXNlICdiYW96aTovL3RlbXBsYXRlcy9ldmVudCc6IHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBjb250ZW50czogW1xuICAgICAgICAgICAge1xuICAgICAgICAgICAgICB1cmksXG4gICAgICAgICAgICAgIG1pbWVUeXBlOiAnYXBwbGljYXRpb24vanNvbicsXG4gICAgICAgICAgICAgIHRleHQ6IEpTT04uc3RyaW5naWZ5KEVWRU5UX01BUktFVF9URU1QTEFURSwgbnVsbCwgMiksXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIF0sXG4gICAgICAgIH07XG4gICAgICB9XG5cbiAgICAgIGNhc2UgJ2Jhb3ppOi8vdGVtcGxhdGVzL21lYXN1cmVtZW50Jzoge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGNvbnRlbnRzOiBbXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIHVyaSxcbiAgICAgICAgICAgICAgbWltZVR5cGU6ICdhcHBsaWNhdGlvbi9qc29uJyxcbiAgICAgICAgICAgICAgdGV4dDogSlNPTi5zdHJpbmdpZnkoTUVBU1VSRU1FTlRfTUFSS0VUX1RFTVBMQVRFLCBudWxsLCAyKSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgXSxcbiAgICAgICAgfTtcbiAgICAgIH1cblxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbmtub3duIHJlc291cmNlOiAke3VyaX1gKTtcbiAgICB9XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgdGhyb3cgZXJyb3I7XG4gIH1cbn1cbiJdfQ==