@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.
- package/README.md +294 -0
- package/dist/__tests__/full-test.d.ts +1 -0
- package/dist/__tests__/full-test.js +291 -0
- package/dist/builders/affiliate-transaction.d.ts +41 -0
- package/dist/builders/affiliate-transaction.js +123 -0
- package/dist/builders/bet-transaction.d.ts +70 -0
- package/dist/builders/bet-transaction.js +323 -0
- package/dist/builders/claim-transaction.d.ts +57 -0
- package/dist/builders/claim-transaction.js +196 -0
- package/dist/builders/creator-transaction.d.ts +49 -0
- package/dist/builders/creator-transaction.js +177 -0
- package/dist/builders/dispute-transaction.d.ts +81 -0
- package/dist/builders/dispute-transaction.js +215 -0
- package/dist/builders/index.d.ts +14 -0
- package/dist/builders/index.js +15 -0
- package/dist/builders/market-creation-tx.d.ts +65 -0
- package/dist/builders/market-creation-tx.js +362 -0
- package/dist/builders/market-management-transaction.d.ts +85 -0
- package/dist/builders/market-management-transaction.js +239 -0
- package/dist/builders/race-transaction.d.ts +67 -0
- package/dist/builders/race-transaction.js +242 -0
- package/dist/builders/resolution-transaction.d.ts +108 -0
- package/dist/builders/resolution-transaction.js +250 -0
- package/dist/builders/whitelist-transaction.d.ts +72 -0
- package/dist/builders/whitelist-transaction.js +179 -0
- package/dist/config.d.ts +138 -0
- package/dist/config.js +307 -0
- package/dist/handlers/agent-network.d.ts +81 -0
- package/dist/handlers/agent-network.js +332 -0
- package/dist/handlers/claims.d.ts +47 -0
- package/dist/handlers/claims.js +218 -0
- package/dist/handlers/market-creation.d.ts +154 -0
- package/dist/handlers/market-creation.js +290 -0
- package/dist/handlers/markets.d.ts +41 -0
- package/dist/handlers/markets.js +319 -0
- package/dist/handlers/positions.d.ts +40 -0
- package/dist/handlers/positions.js +244 -0
- package/dist/handlers/quote.d.ts +33 -0
- package/dist/handlers/quote.js +144 -0
- package/dist/handlers/race-markets.d.ts +54 -0
- package/dist/handlers/race-markets.js +308 -0
- package/dist/handlers/resolution.d.ts +43 -0
- package/dist/handlers/resolution.js +194 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.js +109 -0
- package/dist/resources.d.ts +13 -0
- package/dist/resources.js +336 -0
- package/dist/tools.d.ts +3109 -0
- package/dist/tools.js +1956 -0
- package/dist/validation/bet-rules.d.ts +82 -0
- package/dist/validation/bet-rules.js +276 -0
- package/dist/validation/creation-rules.d.ts +69 -0
- package/dist/validation/creation-rules.js +302 -0
- package/dist/validation/index.d.ts +6 -0
- package/dist/validation/index.js +7 -0
- package/dist/validation/market-rules.d.ts +60 -0
- package/dist/validation/market-rules.js +237 -0
- package/dist/validation/parimutuel-rules.d.ts +117 -0
- package/dist/validation/parimutuel-rules.js +270 -0
- package/package.json +52 -0
|
@@ -0,0 +1,270 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* BAOZI PARIMUTUEL MARKET RULES v6.2
|
|
3
|
+
*
|
|
4
|
+
* STRICT ENFORCEMENT - All Lab markets MUST comply with these rules.
|
|
5
|
+
* AI agents creating markets through MCP MUST validate against these rules.
|
|
6
|
+
* Markets that don't comply will be BLOCKED from creation.
|
|
7
|
+
*/
|
|
8
|
+
// =============================================================================
|
|
9
|
+
// MANDATORY RULES - MARKETS WILL BE BLOCKED IF VIOLATED
|
|
10
|
+
// =============================================================================
|
|
11
|
+
export const PARIMUTUEL_RULES = {
|
|
12
|
+
version: '6.2',
|
|
13
|
+
/**
|
|
14
|
+
* RULE A: Event-Based Markets
|
|
15
|
+
*
|
|
16
|
+
* For markets about specific events (sports, elections, announcements):
|
|
17
|
+
* - Betting must close AT LEAST 12 hours BEFORE the event
|
|
18
|
+
* - Recommended buffer: 18-24 hours
|
|
19
|
+
* - Event time must be explicitly specified
|
|
20
|
+
*
|
|
21
|
+
* RATIONALE: Prevents late-breaking information from giving unfair advantage
|
|
22
|
+
*
|
|
23
|
+
* Examples:
|
|
24
|
+
* ✅ "Will Team A win vs Team B?" + event_time = game_start
|
|
25
|
+
* ✅ "Will Company X announce earnings above $1B?" + event_time = announcement
|
|
26
|
+
* ❌ "Will it rain tomorrow?" (no clear event time)
|
|
27
|
+
*/
|
|
28
|
+
RULE_A: {
|
|
29
|
+
name: 'Event-Based Markets',
|
|
30
|
+
minBufferHours: 12,
|
|
31
|
+
recommendedBufferHours: 24,
|
|
32
|
+
requirement: 'Betting must close 12+ hours BEFORE the event',
|
|
33
|
+
rationale: 'Prevents information advantage from late-breaking news',
|
|
34
|
+
},
|
|
35
|
+
/**
|
|
36
|
+
* RULE B: Measurement-Period Markets
|
|
37
|
+
*
|
|
38
|
+
* For markets about measured values (prices, temperatures, metrics):
|
|
39
|
+
* - Betting must close BEFORE the measurement period starts
|
|
40
|
+
* - measurement_start must be explicitly specified
|
|
41
|
+
* - Recommended: betting closes 1-2 hours before measurement
|
|
42
|
+
*
|
|
43
|
+
* RATIONALE: Prevents anyone from betting with foreknowledge of measurements
|
|
44
|
+
*
|
|
45
|
+
* Examples:
|
|
46
|
+
* ✅ "Will BTC be above $100k at 00:00 UTC Feb 1?" + measurement_start = Feb 1 00:00
|
|
47
|
+
* ✅ "Will Tokyo have snowfall on Feb 4?" + measurement_start = Feb 4 00:00
|
|
48
|
+
* ❌ "Will BTC close above $100k on Feb 2?" + betting_closes = Feb 2 23:59 (VIOLATION!)
|
|
49
|
+
*/
|
|
50
|
+
RULE_B: {
|
|
51
|
+
name: 'Measurement-Period Markets',
|
|
52
|
+
requirement: 'Betting must close BEFORE measurement period starts',
|
|
53
|
+
rationale: 'Prevents betting with foreknowledge of measured values',
|
|
54
|
+
recommendedBufferHours: 2,
|
|
55
|
+
},
|
|
56
|
+
/**
|
|
57
|
+
* MANDATORY: Verifiable Data Source
|
|
58
|
+
*
|
|
59
|
+
* Every market question MUST specify or clearly imply a verifiable data source.
|
|
60
|
+
* This ensures objective resolution and prevents disputes.
|
|
61
|
+
*
|
|
62
|
+
* Examples:
|
|
63
|
+
* ✅ "Will BTC be above $100k? (Source: CoinGecko)"
|
|
64
|
+
* ✅ "Will it snow in Tokyo? (JMA official record)"
|
|
65
|
+
* ✅ "Will Real Madrid win?" (Implied: official UEFA result)
|
|
66
|
+
* ❌ "Will the economy improve?" (No verifiable source)
|
|
67
|
+
* ❌ "Will Claude be the best AI?" (Subjective, no source)
|
|
68
|
+
*/
|
|
69
|
+
DATA_SOURCE: {
|
|
70
|
+
name: 'Verifiable Data Source',
|
|
71
|
+
requirement: 'Question must specify or clearly imply a verifiable data source',
|
|
72
|
+
rationale: 'Ensures objective resolution and prevents disputes',
|
|
73
|
+
},
|
|
74
|
+
/**
|
|
75
|
+
* MANDATORY: Clear YES/NO Criteria
|
|
76
|
+
*
|
|
77
|
+
* The market question must have clear, unambiguous YES/NO criteria.
|
|
78
|
+
* There should be no room for interpretation in the resolution.
|
|
79
|
+
*
|
|
80
|
+
* Examples:
|
|
81
|
+
* ✅ "Will BTC be above $100,000 at 00:00 UTC Feb 1, 2026?"
|
|
82
|
+
* ✅ "Will Team A score 3+ goals?"
|
|
83
|
+
* ❌ "Will BTC perform well?" (Subjective)
|
|
84
|
+
* ❌ "Will the game be exciting?" (Subjective)
|
|
85
|
+
*/
|
|
86
|
+
CLEAR_CRITERIA: {
|
|
87
|
+
name: 'Clear Resolution Criteria',
|
|
88
|
+
requirement: 'Question must have unambiguous YES/NO criteria',
|
|
89
|
+
rationale: 'Prevents disputes and ensures fair resolution',
|
|
90
|
+
},
|
|
91
|
+
};
|
|
92
|
+
/**
|
|
93
|
+
* Validate market against parimutuel rules
|
|
94
|
+
* Returns BLOCKED=true if market violates mandatory rules
|
|
95
|
+
*/
|
|
96
|
+
export function validateParimutuelRules(params) {
|
|
97
|
+
const errors = [];
|
|
98
|
+
const warnings = [];
|
|
99
|
+
const ruleViolations = [];
|
|
100
|
+
const rulesChecked = [];
|
|
101
|
+
// Only strictly enforce for Lab markets
|
|
102
|
+
const isLabMarket = params.layer === 'lab';
|
|
103
|
+
// =========================================================================
|
|
104
|
+
// CHECK: Market Type Classification
|
|
105
|
+
// =========================================================================
|
|
106
|
+
rulesChecked.push('Market Type Classification');
|
|
107
|
+
const hasEventTime = !!params.eventTime;
|
|
108
|
+
const hasMeasurementStart = !!params.measurementStart;
|
|
109
|
+
const isEventBased = params.marketType === 'event' || hasEventTime;
|
|
110
|
+
const isMeasurementBased = params.marketType === 'measurement' || hasMeasurementStart;
|
|
111
|
+
if (isLabMarket && !isEventBased && !isMeasurementBased) {
|
|
112
|
+
ruleViolations.push({
|
|
113
|
+
rule: 'Market Classification',
|
|
114
|
+
description: 'Lab markets MUST specify either event_time (Rule A) or measurement_start (Rule B). ' +
|
|
115
|
+
'Without this, the market cannot be validated for fair betting windows.',
|
|
116
|
+
severity: 'CRITICAL',
|
|
117
|
+
});
|
|
118
|
+
errors.push('BLOCKED: Market must be classified as event-based (with event_time) or measurement-based (with measurement_start)');
|
|
119
|
+
}
|
|
120
|
+
// =========================================================================
|
|
121
|
+
// CHECK: Rule A - Event Buffer
|
|
122
|
+
// =========================================================================
|
|
123
|
+
if (isEventBased && params.eventTime) {
|
|
124
|
+
rulesChecked.push('Rule A: Event Buffer');
|
|
125
|
+
const bufferMs = params.eventTime.getTime() - params.closingTime.getTime();
|
|
126
|
+
const bufferHours = bufferMs / (1000 * 60 * 60);
|
|
127
|
+
if (bufferHours < PARIMUTUEL_RULES.RULE_A.minBufferHours) {
|
|
128
|
+
ruleViolations.push({
|
|
129
|
+
rule: 'Rule A',
|
|
130
|
+
description: `Event buffer is ${bufferHours.toFixed(1)}h but minimum is ${PARIMUTUEL_RULES.RULE_A.minBufferHours}h. ` +
|
|
131
|
+
`Betting must close at least 12 hours BEFORE the event to prevent information advantage.`,
|
|
132
|
+
severity: 'CRITICAL',
|
|
133
|
+
});
|
|
134
|
+
errors.push(`BLOCKED: Betting must close ${PARIMUTUEL_RULES.RULE_A.minBufferHours}+ hours before event (currently ${bufferHours.toFixed(1)}h)`);
|
|
135
|
+
}
|
|
136
|
+
else if (bufferHours < 18) {
|
|
137
|
+
warnings.push(`Event buffer is ${bufferHours.toFixed(1)}h. Recommend 18-24h for safety margin.`);
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
// =========================================================================
|
|
141
|
+
// CHECK: Rule B - Measurement Period
|
|
142
|
+
// =========================================================================
|
|
143
|
+
if (isMeasurementBased && params.measurementStart) {
|
|
144
|
+
rulesChecked.push('Rule B: Measurement Period');
|
|
145
|
+
if (params.closingTime >= params.measurementStart) {
|
|
146
|
+
const overlapMs = params.closingTime.getTime() - params.measurementStart.getTime();
|
|
147
|
+
const overlapHours = overlapMs / (1000 * 60 * 60);
|
|
148
|
+
ruleViolations.push({
|
|
149
|
+
rule: 'Rule B',
|
|
150
|
+
description: `CRITICAL VIOLATION: Betting closes ${overlapHours.toFixed(1)}h AFTER measurement starts! ` +
|
|
151
|
+
`This allows bettors to bet with foreknowledge of the outcome. ` +
|
|
152
|
+
`Betting MUST close BEFORE the measurement period begins.`,
|
|
153
|
+
severity: 'CRITICAL',
|
|
154
|
+
});
|
|
155
|
+
errors.push(`BLOCKED: Betting must close BEFORE measurement starts (currently closes ${overlapHours.toFixed(1)}h AFTER)`);
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
// =========================================================================
|
|
159
|
+
// CHECK: Data Source
|
|
160
|
+
// =========================================================================
|
|
161
|
+
rulesChecked.push('Verifiable Data Source');
|
|
162
|
+
const questionLower = params.question.toLowerCase();
|
|
163
|
+
const hasDataSource = questionLower.includes('source:') ||
|
|
164
|
+
questionLower.includes('coingecko') ||
|
|
165
|
+
questionLower.includes('coinmarketcap') ||
|
|
166
|
+
questionLower.includes('official') ||
|
|
167
|
+
questionLower.includes('nws') ||
|
|
168
|
+
questionLower.includes('jma') ||
|
|
169
|
+
questionLower.includes('ufc') ||
|
|
170
|
+
questionLower.includes('uefa') ||
|
|
171
|
+
questionLower.includes('fifa') ||
|
|
172
|
+
questionLower.includes('nba') ||
|
|
173
|
+
questionLower.includes('nfl') ||
|
|
174
|
+
questionLower.includes('mlb') ||
|
|
175
|
+
// Sports/events typically have implied official sources
|
|
176
|
+
questionLower.includes(' win ') ||
|
|
177
|
+
questionLower.includes(' defeat ') ||
|
|
178
|
+
questionLower.includes(' advance ') ||
|
|
179
|
+
questionLower.includes('championship') ||
|
|
180
|
+
questionLower.includes('election');
|
|
181
|
+
if (isLabMarket && !hasDataSource) {
|
|
182
|
+
warnings.push('Recommended: Include data source in question (e.g., "(Source: CoinGecko)" or "(Official: UEFA)"). ' +
|
|
183
|
+
'This ensures objective resolution.');
|
|
184
|
+
}
|
|
185
|
+
// =========================================================================
|
|
186
|
+
// CHECK: Clear Criteria
|
|
187
|
+
// =========================================================================
|
|
188
|
+
rulesChecked.push('Clear Resolution Criteria');
|
|
189
|
+
const hasNumericThreshold = /\$[\d,]+/.test(params.question) || // Dollar amounts
|
|
190
|
+
/\d+%/.test(params.question) || // Percentages
|
|
191
|
+
/above|below|over|under|at least|more than|less than/i.test(params.question);
|
|
192
|
+
const hasClearBinaryOutcome = /will .+ (win|lose|defeat|advance|qualify|score|achieve)/i.test(params.question) ||
|
|
193
|
+
/will .+ (snow|rain|happen|occur)/i.test(params.question);
|
|
194
|
+
if (isLabMarket && !hasNumericThreshold && !hasClearBinaryOutcome) {
|
|
195
|
+
warnings.push('Question should have clear numeric threshold or binary outcome. ' +
|
|
196
|
+
'Example: "above $X", "at least Y goals", "will Team A win"');
|
|
197
|
+
}
|
|
198
|
+
// =========================================================================
|
|
199
|
+
// RESULT
|
|
200
|
+
// =========================================================================
|
|
201
|
+
const hasCriticalViolation = ruleViolations.some(v => v.severity === 'CRITICAL');
|
|
202
|
+
return {
|
|
203
|
+
valid: errors.length === 0,
|
|
204
|
+
blocked: isLabMarket && hasCriticalViolation,
|
|
205
|
+
errors,
|
|
206
|
+
warnings,
|
|
207
|
+
ruleViolations,
|
|
208
|
+
rulesChecked,
|
|
209
|
+
};
|
|
210
|
+
}
|
|
211
|
+
// =============================================================================
|
|
212
|
+
// RULES DOCUMENTATION (for AI agents)
|
|
213
|
+
// =============================================================================
|
|
214
|
+
export const PARIMUTUEL_RULES_DOCUMENTATION = `
|
|
215
|
+
# BAOZI PARIMUTUEL MARKET RULES v6.2
|
|
216
|
+
|
|
217
|
+
## MANDATORY FOR ALL LAB MARKETS
|
|
218
|
+
|
|
219
|
+
### Rule A: Event-Based Markets
|
|
220
|
+
Markets about specific events (sports, elections, announcements):
|
|
221
|
+
- Betting MUST close AT LEAST 12 hours BEFORE the event
|
|
222
|
+
- You MUST specify event_time parameter
|
|
223
|
+
- Recommended buffer: 18-24 hours
|
|
224
|
+
|
|
225
|
+
Example:
|
|
226
|
+
- Question: "Will Team A win vs Team B?"
|
|
227
|
+
- Event time: Game start (e.g., 2026-02-15T20:00:00Z)
|
|
228
|
+
- Closing time: At least 12h before (e.g., 2026-02-15T08:00:00Z)
|
|
229
|
+
|
|
230
|
+
### Rule B: Measurement-Period Markets
|
|
231
|
+
Markets about measured values (prices, temperatures, metrics):
|
|
232
|
+
- Betting MUST close BEFORE the measurement period starts
|
|
233
|
+
- You MUST specify measurement_start parameter
|
|
234
|
+
- Recommended: betting closes 1-2 hours before measurement
|
|
235
|
+
|
|
236
|
+
Example:
|
|
237
|
+
- Question: "Will BTC be above $100k at 00:00 UTC Feb 1?"
|
|
238
|
+
- Measurement start: 2026-02-01T00:00:00Z
|
|
239
|
+
- Closing time: BEFORE measurement (e.g., 2026-01-31T22:00:00Z)
|
|
240
|
+
|
|
241
|
+
### Data Source Requirement
|
|
242
|
+
- Include verifiable data source in question
|
|
243
|
+
- Examples: "(Source: CoinGecko)", "(Official: UEFA)", "(NWS Los Angeles)"
|
|
244
|
+
|
|
245
|
+
### Clear Criteria
|
|
246
|
+
- Question must have unambiguous YES/NO resolution
|
|
247
|
+
- Include specific thresholds: "$100,000", "3+ goals", etc.
|
|
248
|
+
|
|
249
|
+
## VIOLATIONS WILL BLOCK MARKET CREATION
|
|
250
|
+
|
|
251
|
+
If you try to create a market that violates these rules, the MCP will:
|
|
252
|
+
1. Return blocked: true
|
|
253
|
+
2. List specific rule violations
|
|
254
|
+
3. Refuse to build the transaction
|
|
255
|
+
|
|
256
|
+
## CLASSIFICATION REQUIRED
|
|
257
|
+
|
|
258
|
+
Every Lab market MUST be classified as either:
|
|
259
|
+
1. Event-based (provide event_time) - Rule A applies
|
|
260
|
+
2. Measurement-based (provide measurement_start) - Rule B applies
|
|
261
|
+
|
|
262
|
+
Unclassified markets will be BLOCKED.
|
|
263
|
+
`;
|
|
264
|
+
/**
|
|
265
|
+
* Get rules summary for AI agents
|
|
266
|
+
*/
|
|
267
|
+
export function getParimutuelRulesSummary() {
|
|
268
|
+
return PARIMUTUEL_RULES_DOCUMENTATION;
|
|
269
|
+
}
|
|
270
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGFyaW11dHVlbC1ydWxlcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy92YWxpZGF0aW9uL3BhcmltdXR1ZWwtcnVsZXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7OztHQU1HO0FBRUgsZ0ZBQWdGO0FBQ2hGLHdEQUF3RDtBQUN4RCxnRkFBZ0Y7QUFFaEYsTUFBTSxDQUFDLE1BQU0sZ0JBQWdCLEdBQUc7SUFDOUIsT0FBTyxFQUFFLEtBQUs7SUFFZDs7Ozs7Ozs7Ozs7Ozs7T0FjRztJQUNILE1BQU0sRUFBRTtRQUNOLElBQUksRUFBRSxxQkFBcUI7UUFDM0IsY0FBYyxFQUFFLEVBQUU7UUFDbEIsc0JBQXNCLEVBQUUsRUFBRTtRQUMxQixXQUFXLEVBQUUsK0NBQStDO1FBQzVELFNBQVMsRUFBRSx3REFBd0Q7S0FDcEU7SUFFRDs7Ozs7Ozs7Ozs7Ozs7T0FjRztJQUNILE1BQU0sRUFBRTtRQUNOLElBQUksRUFBRSw0QkFBNEI7UUFDbEMsV0FBVyxFQUFFLHFEQUFxRDtRQUNsRSxTQUFTLEVBQUUsd0RBQXdEO1FBQ25FLHNCQUFzQixFQUFFLENBQUM7S0FDMUI7SUFFRDs7Ozs7Ozs7Ozs7O09BWUc7SUFDSCxXQUFXLEVBQUU7UUFDWCxJQUFJLEVBQUUsd0JBQXdCO1FBQzlCLFdBQVcsRUFBRSxpRUFBaUU7UUFDOUUsU0FBUyxFQUFFLG9EQUFvRDtLQUNoRTtJQUVEOzs7Ozs7Ozs7OztPQVdHO0lBQ0gsY0FBYyxFQUFFO1FBQ2QsSUFBSSxFQUFFLDJCQUEyQjtRQUNqQyxXQUFXLEVBQUUsZ0RBQWdEO1FBQzdELFNBQVMsRUFBRSwrQ0FBK0M7S0FDM0Q7Q0FDRixDQUFDO0FBbUJGOzs7R0FHRztBQUNILE1BQU0sVUFBVSx1QkFBdUIsQ0FBQyxNQU92QztJQUNDLE1BQU0sTUFBTSxHQUFhLEVBQUUsQ0FBQztJQUM1QixNQUFNLFFBQVEsR0FBYSxFQUFFLENBQUM7SUFDOUIsTUFBTSxjQUFjLEdBQWlELEVBQUUsQ0FB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QUM7SUFFakYsT0FBTztRQUNMLEtBQUssRUFBRSxNQUFNLENBQUMsTUFBTSxLQUFLLENBQUM7UUFDMUIsT0FBTyxFQUFFLFdBQVcsSUFBSSxvQkFBb0I7UUFDNUMsTUFBTTtRQUNOLFFBQVE7UUFDUixjQUFjO1FBQ2QsWUFBWTtLQUNiLENBQUM7QUFDSixDQUFDO0FBRUQsZ0ZBQWdGO0FBQ2hGLHNDQUFzQztBQUN0QyxnRkFBZ0Y7QUFFaEYsTUFBTSxDQUFDLE1BQU0sOEJBQThCLEdBQUc7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Q0FpRDdDLENBQUM7QUFFRjs7R0FFRztBQUNILE1BQU0sVUFBVSx5QkFBeUI7SUFDdkMsT0FBTyw4QkFBOEIsQ0FBQztBQUN4QyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBCQU9aSSBQQVJJTVVUVUVMIE1BUktFVCBSVUxFUyB2Ni4yXG4gKlxuICogU1RSSUNUIEVORk9SQ0VNRU5UIC0gQWxsIExhYiBtYXJrZXRzIE1VU1QgY29tcGx5IHdpdGggdGhlc2UgcnVsZXMuXG4gKiBBSSBhZ2VudHMgY3JlYXRpbmcgbWFya2V0cyB0aHJvdWdoIE1DUCBNVVNUIHZhbGlkYXRlIGFnYWluc3QgdGhlc2UgcnVsZXMuXG4gKiBNYXJrZXRzIHRoYXQgZG9uJ3QgY29tcGx5IHdpbGwgYmUgQkxPQ0tFRCBmcm9tIGNyZWF0aW9uLlxuICovXG5cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBNQU5EQVRPUlkgUlVMRVMgLSBNQVJLRVRTIFdJTEwgQkUgQkxPQ0tFRCBJRiBWSU9MQVRFRFxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuZXhwb3J0IGNvbnN0IFBBUklNVVRVRUxfUlVMRVMgPSB7XG4gIHZlcnNpb246ICc2LjInLFxuXG4gIC8qKlxuICAgKiBSVUxFIEE6IEV2ZW50LUJhc2VkIE1hcmtldHNcbiAgICpcbiAgICogRm9yIG1hcmtldHMgYWJvdXQgc3BlY2lmaWMgZXZlbnRzIChzcG9ydHMsIGVsZWN0aW9ucywgYW5ub3VuY2VtZW50cyk6XG4gICAqIC0gQmV0dGluZyBtdXN0IGNsb3NlIEFUIExFQVNUIDEyIGhvdXJzIEJFRk9SRSB0aGUgZXZlbnRcbiAgICogLSBSZWNvbW1lbmRlZCBidWZmZXI6IDE4LTI0IGhvdXJzXG4gICAqIC0gRXZlbnQgdGltZSBtdXN0IGJlIGV4cGxpY2l0bHkgc3BlY2lmaWVkXG4gICAqXG4gICAqIFJBVElPTkFMRTogUHJldmVudHMgbGF0ZS1icmVha2luZyBpbmZvcm1hdGlvbiBmcm9tIGdpdmluZyB1bmZhaXIgYWR2YW50YWdlXG4gICAqXG4gICAqIEV4YW1wbGVzOlxuICAgKiDinIUgXCJXaWxsIFRlYW0gQSB3aW4gdnMgVGVhbSBCP1wiICsgZXZlbnRfdGltZSA9IGdhbWVfc3RhcnRcbiAgICog4pyFIFwiV2lsbCBDb21wYW55IFggYW5ub3VuY2UgZWFybmluZ3MgYWJvdmUgJDFCP1wiICsgZXZlbnRfdGltZSA9IGFubm91bmNlbWVudFxuICAgKiDinYwgXCJXaWxsIGl0IHJhaW4gdG9tb3Jyb3c/XCIgKG5vIGNsZWFyIGV2ZW50IHRpbWUpXG4gICAqL1xuICBSVUxFX0E6IHtcbiAgICBuYW1lOiAnRXZlbnQtQmFzZWQgTWFya2V0cycsXG4gICAgbWluQnVmZmVySG91cnM6IDEyLFxuICAgIHJlY29tbWVuZGVkQnVmZmVySG91cnM6IDI0LFxuICAgIHJlcXVpcmVtZW50OiAnQmV0dGluZyBtdXN0IGNsb3NlIDEyKyBob3VycyBCRUZPUkUgdGhlIGV2ZW50JyxcbiAgICByYXRpb25hbGU6ICdQcmV2ZW50cyBpbmZvcm1hdGlvbiBhZHZhbnRhZ2UgZnJvbSBsYXRlLWJyZWFraW5nIG5ld3MnLFxuICB9LFxuXG4gIC8qKlxuICAgKiBSVUxFIEI6IE1lYXN1cmVtZW50LVBlcmlvZCBNYXJrZXRzXG4gICAqXG4gICAqIEZvciBtYXJrZXRzIGFib3V0IG1lYXN1cmVkIHZhbHVlcyAocHJpY2VzLCB0ZW1wZXJhdHVyZXMsIG1ldHJpY3MpOlxuICAgKiAtIEJldHRpbmcgbXVzdCBjbG9zZSBCRUZPUkUgdGhlIG1lYXN1cmVtZW50IHBlcmlvZCBzdGFydHNcbiAgICogLSBtZWFzdXJlbWVudF9zdGFydCBtdXN0IGJlIGV4cGxpY2l0bHkgc3BlY2lmaWVkXG4gICAqIC0gUmVjb21tZW5kZWQ6IGJldHRpbmcgY2xvc2VzIDEtMiBob3VycyBiZWZvcmUgbWVhc3VyZW1lbnRcbiAgICpcbiAgICogUkFUSU9OQUxFOiBQcmV2ZW50cyBhbnlvbmUgZnJvbSBiZXR0aW5nIHdpdGggZm9yZWtub3dsZWRnZSBvZiBtZWFzdXJlbWVudHNcbiAgICpcbiAgICogRXhhbXBsZXM6XG4gICAqIOKchSBcIldpbGwgQlRDIGJlIGFib3ZlICQxMDBrIGF0IDAwOjAwIFVUQyBGZWIgMT9cIiArIG1lYXN1cmVtZW50X3N0YXJ0ID0gRmViIDEgMDA6MDBcbiAgICog4pyFIFwiV2lsbCBUb2t5byBoYXZlIHNub3dmYWxsIG9uIEZlYiA0P1wiICsgbWVhc3VyZW1lbnRfc3RhcnQgPSBGZWIgNCAwMDowMFxuICAgKiDinYwgXCJXaWxsIEJUQyBjbG9zZSBhYm92ZSAkMTAwayBvbiBGZWIgMj9cIiArIGJldHRpbmdfY2xvc2VzID0gRmViIDIgMjM6NTkgKFZJT0xBVElPTiEpXG4gICAqL1xuICBSVUxFX0I6IHtcbiAgICBuYW1lOiAnTWVhc3VyZW1lbnQtUGVyaW9kIE1hcmtldHMnLFxuICAgIHJlcXVpcmVtZW50OiAnQmV0dGluZyBtdXN0IGNsb3NlIEJFRk9SRSBtZWFzdXJlbWVudCBwZXJpb2Qgc3RhcnRzJyxcbiAgICByYXRpb25hbGU6ICdQcmV2ZW50cyBiZXR0aW5nIHdpdGggZm9yZWtub3dsZWRnZSBvZiBtZWFzdXJlZCB2YWx1ZXMnLFxuICAgIHJlY29tbWVuZGVkQnVmZmVySG91cnM6IDIsXG4gIH0sXG5cbiAgLyoqXG4gICAqIE1BTkRBVE9SWTogVmVyaWZpYWJsZSBEYXRhIFNvdXJjZVxuICAgKlxuICAgKiBFdmVyeSBtYXJrZXQgcXVlc3Rpb24gTVVTVCBzcGVjaWZ5IG9yIGNsZWFybHkgaW1wbHkgYSB2ZXJpZmlhYmxlIGRhdGEgc291cmNlLlxuICAgKiBUaGlzIGVuc3VyZXMgb2JqZWN0aXZlIHJlc29sdXRpb24gYW5kIHByZXZlbnRzIGRpc3B1dGVzLlxuICAgKlxuICAgKiBFeGFtcGxlczpcbiAgICog4pyFIFwiV2lsbCBCVEMgYmUgYWJvdmUgJDEwMGs/IChTb3VyY2U6IENvaW5HZWNrbylcIlxuICAgKiDinIUgXCJXaWxsIGl0IHNub3cgaW4gVG9reW8/IChKTUEgb2ZmaWNpYWwgcmVjb3JkKVwiXG4gICAqIOKchSBcIldpbGwgUmVhbCBNYWRyaWQgd2luP1wiIChJbXBsaWVkOiBvZmZpY2lhbCBVRUZBIHJlc3VsdClcbiAgICog4p2MIFwiV2lsbCB0aGUgZWNvbm9teSBpbXByb3ZlP1wiIChObyB2ZXJpZmlhYmxlIHNvdXJjZSlcbiAgICog4p2MIFwiV2lsbCBDbGF1ZGUgYmUgdGhlIGJlc3QgQUk/XCIgKFN1YmplY3RpdmUsIG5vIHNvdXJjZSlcbiAgICovXG4gIERBVEFfU09VUkNFOiB7XG4gICAgbmFtZTogJ1ZlcmlmaWFibGUgRGF0YSBTb3VyY2UnLFxuICAgIHJlcXVpcmVtZW50OiAnUXVlc3Rpb24gbXVzdCBzcGVjaWZ5IG9yIGNsZWFybHkgaW1wbHkgYSB2ZXJpZmlhYmxlIGRhdGEgc291cmNlJyxcbiAgICByYXRpb25hbGU6ICdFbnN1cmVzIG9iamVjdGl2ZSByZXNvbHV0aW9uIGFuZCBwcmV2ZW50cyBkaXNwdXRlcycsXG4gIH0sXG5cbiAgLyoqXG4gICAqIE1BTkRBVE9SWTogQ2xlYXIgWUVTL05PIENyaXRlcmlhXG4gICAqXG4gICAqIFRoZSBtYXJrZXQgcXVlc3Rpb24gbXVzdCBoYXZlIGNsZWFyLCB1bmFtYmlndW91cyBZRVMvTk8gY3JpdGVyaWEuXG4gICAqIFRoZXJlIHNob3VsZCBiZSBubyByb29tIGZvciBpbnRlcnByZXRhdGlvbiBpbiB0aGUgcmVzb2x1dGlvbi5cbiAgICpcbiAgICogRXhhbXBsZXM6XG4gICAqIOKchSBcIldpbGwgQlRDIGJlIGFib3ZlICQxMDAsMDAwIGF0IDAwOjAwIFVUQyBGZWIgMSwgMjAyNj9cIlxuICAgKiDinIUgXCJXaWxsIFRlYW0gQSBzY29yZSAzKyBnb2Fscz9cIlxuICAgKiDinYwgXCJXaWxsIEJUQyBwZXJmb3JtIHdlbGw/XCIgKFN1YmplY3RpdmUpXG4gICAqIOKdjCBcIldpbGwgdGhlIGdhbWUgYmUgZXhjaXRpbmc/XCIgKFN1YmplY3RpdmUpXG4gICAqL1xuICBDTEVBUl9DUklURVJJQToge1xuICAgIG5hbWU6ICdDbGVhciBSZXNvbHV0aW9uIENyaXRlcmlhJyxcbiAgICByZXF1aXJlbWVudDogJ1F1ZXN0aW9uIG11c3QgaGF2ZSB1bmFtYmlndW91cyBZRVMvTk8gY3JpdGVyaWEnLFxuICAgIHJhdGlvbmFsZTogJ1ByZXZlbnRzIGRpc3B1dGVzIGFuZCBlbnN1cmVzIGZhaXIgcmVzb2x1dGlvbicsXG4gIH0sXG59O1xuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8gU1RSSUNUIFZBTElEQVRJT04gRk9SIExBQiBNQVJLRVRTXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG5leHBvcnQgaW50ZXJmYWNlIFBhcmltdXR1ZWxWYWxpZGF0aW9uUmVzdWx0IHtcbiAgdmFsaWQ6IGJvb2xlYW47XG4gIGJsb2NrZWQ6IGJvb2xlYW47ICAvLyBJZiB0cnVlLCBtYXJrZXQgY3JlYXRpb24gaXMgQkxPQ0tFRFxuICBlcnJvcnM6IHN0cmluZ1tdO1xuICB3YXJuaW5nczogc3RyaW5nW107XG4gIHJ1bGVWaW9sYXRpb25zOiB7XG4gICAgcnVsZTogc3RyaW5nO1xuICAgIGRlc2NyaXB0aW9uOiBzdHJpbmc7XG4gICAgc2V2ZXJpdHk6ICdDUklUSUNBTCcgfCAnRVJST1InIHwgJ1dBUk5JTkcnO1xuICB9W107XG4gIHJ1bGVzQ2hlY2tlZDogc3RyaW5nW107XG59XG5cbi8qKlxuICogVmFsaWRhdGUgbWFya2V0IGFnYWluc3QgcGFyaW11dHVlbCBydWxlc1xuICogUmV0dXJucyBCTE9DS0VEPXRydWUgaWYgbWFya2V0IHZpb2xhdGVzIG1hbmRhdG9yeSBydWxlc1xuICovXG5leHBvcnQgZnVuY3Rpb24gdmFsaWRhdGVQYXJpbXV0dWVsUnVsZXMocGFyYW1zOiB7XG4gIHF1ZXN0aW9uOiBzdHJpbmc7XG4gIGNsb3NpbmdUaW1lOiBEYXRlO1xuICBtYXJrZXRUeXBlPzogJ2V2ZW50JyB8ICdtZWFzdXJlbWVudCc7XG4gIGV2ZW50VGltZT86IERhdGU7XG4gIG1lYXN1cmVtZW50U3RhcnQ/OiBEYXRlO1xuICBsYXllcjogJ29mZmljaWFsJyB8ICdsYWInIHwgJ3ByaXZhdGUnO1xufSk6IFBhcmltdXR1ZWxWYWxpZGF0aW9uUmVzdWx0IHtcbiAgY29uc3QgZXJyb3JzOiBzdHJpbmdbXSA9IFtdO1xuICBjb25zdCB3YXJuaW5nczogc3RyaW5nW10gPSBbXTtcbiAgY29uc3QgcnVsZVZpb2xhdGlvbnM6IFBhcmltdXR1ZWxWYWxpZGF0aW9uUmVzdWx0WydydWxlVmlvbGF0aW9ucyddID0gW107XG4gIGNvbnN0IHJ1bGVzQ2hlY2tlZDogc3RyaW5nW10gPSBbXTtcblxuICAvLyBPbmx5IHN0cmljdGx5IGVuZm9yY2UgZm9yIExhYiBtYXJrZXRzXG4gIGNvbnN0IGlzTGFiTWFya2V0ID0gcGFyYW1zLmxheWVyID09PSAnbGFiJztcblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIENIRUNLOiBNYXJrZXQgVHlwZSBDbGFzc2lmaWNhdGlvblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIHJ1bGVzQ2hlY2tlZC5wdXNoKCdNYXJrZXQgVHlwZSBDbGFzc2lmaWNhdGlvbicpO1xuXG4gIGNvbnN0IGhhc0V2ZW50VGltZSA9ICEhcGFyYW1zLmV2ZW50VGltZTtcbiAgY29uc3QgaGFzTWVhc3VyZW1lbnRTdGFydCA9ICEhcGFyYW1zLm1lYXN1cmVtZW50U3RhcnQ7XG4gIGNvbnN0IGlzRXZlbnRCYXNlZCA9IHBhcmFtcy5tYXJrZXRUeXBlID09PSAnZXZlbnQnIHx8IGhhc0V2ZW50VGltZTtcbiAgY29uc3QgaXNNZWFzdXJlbWVudEJhc2VkID0gcGFyYW1zLm1hcmtldFR5cGUgPT09ICdtZWFzdXJlbWVudCcgfHwgaGFzTWVhc3VyZW1lbnRTdGFydDtcblxuICBpZiAoaXNMYWJNYXJrZXQgJiYgIWlzRXZlbnRCYXNlZCAmJiAhaXNNZWFzdXJlbWVudEJhc2VkKSB7XG4gICAgcnVsZVZpb2xhdGlvbnMucHVzaCh7XG4gICAgICBydWxlOiAnTWFya2V0IENsYXNzaWZpY2F0aW9uJyxcbiAgICAgIGRlc2NyaXB0aW9uOiAnTGFiIG1hcmtldHMgTVVTVCBzcGVjaWZ5IGVpdGhlciBldmVudF90aW1lIChSdWxlIEEpIG9yIG1lYXN1cmVtZW50X3N0YXJ0IChSdWxlIEIpLiAnICtcbiAgICAgICAgJ1dpdGhvdXQgdGhpcywgdGhlIG1hcmtldCBjYW5ub3QgYmUgdmFsaWRhdGVkIGZvciBmYWlyIGJldHRpbmcgd2luZG93cy4nLFxuICAgICAgc2V2ZXJpdHk6ICdDUklUSUNBTCcsXG4gICAgfSk7XG4gICAgZXJyb3JzLnB1c2goJ0JMT0NLRUQ6IE1hcmtldCBtdXN0IGJlIGNsYXNzaWZpZWQgYXMgZXZlbnQtYmFzZWQgKHdpdGggZXZlbnRfdGltZSkgb3IgbWVhc3VyZW1lbnQtYmFzZWQgKHdpdGggbWVhc3VyZW1lbnRfc3RhcnQpJyk7XG4gIH1cblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIENIRUNLOiBSdWxlIEEgLSBFdmVudCBCdWZmZXJcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICBpZiAoaXNFdmVudEJhc2VkICYmIHBhcmFtcy5ldmVudFRpbWUpIHtcbiAgICBydWxlc0NoZWNrZWQucHVzaCgnUnVsZSBBOiBFdmVudCBCdWZmZXInKTtcblxuICAgIGNvbnN0IGJ1ZmZlck1zID0gcGFyYW1zLmV2ZW50VGltZS5nZXRUaW1lKCkgLSBwYXJhbXMuY2xvc2luZ1RpbWUuZ2V0VGltZSgpO1xuICAgIGNvbnN0IGJ1ZmZlckhvdXJzID0gYnVmZmVyTXMgLyAoMTAwMCAqIDYwICogNjApO1xuXG4gICAgaWYgKGJ1ZmZlckhvdXJzIDwgUEFSSU1VVFVFTF9SVUxFUy5SVUxFX0EubWluQnVmZmVySG91cnMpIHtcbiAgICAgIHJ1bGVWaW9sYXRpb25zLnB1c2goe1xuICAgICAgICBydWxlOiAnUnVsZSBBJyxcbiAgICAgICAgZGVzY3JpcHRpb246IGBFdmVudCBidWZmZXIgaXMgJHtidWZmZXJIb3Vycy50b0ZpeGVkKDEpfWggYnV0IG1pbmltdW0gaXMgJHtQQVJJTVVUVUVMX1JVTEVTLlJVTEVfQS5taW5CdWZmZXJIb3Vyc31oLiBgICtcbiAgICAgICAgICBgQmV0dGluZyBtdXN0IGNsb3NlIGF0IGxlYXN0IDEyIGhvdXJzIEJFRk9SRSB0aGUgZXZlbnQgdG8gcHJldmVudCBpbmZvcm1hdGlvbiBhZHZhbnRhZ2UuYCxcbiAgICAgICAgc2V2ZXJpdHk6ICdDUklUSUNBTCcsXG4gICAgICB9KTtcbiAgICAgIGVycm9ycy5wdXNoKGBCTE9DS0VEOiBCZXR0aW5nIG11c3QgY2xvc2UgJHtQQVJJTVVUVUVMX1JVTEVTLlJVTEVfQS5taW5CdWZmZXJIb3Vyc30rIGhvdXJzIGJlZm9yZSBldmVudCAoY3VycmVudGx5ICR7YnVmZmVySG91cnMudG9GaXhlZCgxKX1oKWApO1xuICAgIH0gZWxzZSBpZiAoYnVmZmVySG91cnMgPCAxOCkge1xuICAgICAgd2FybmluZ3MucHVzaChgRXZlbnQgYnVmZmVyIGlzICR7YnVmZmVySG91cnMudG9GaXhlZCgxKX1oLiBSZWNvbW1lbmQgMTgtMjRoIGZvciBzYWZldHkgbWFyZ2luLmApO1xuICAgIH1cbiAgfVxuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gQ0hFQ0s6IFJ1bGUgQiAtIE1lYXN1cmVtZW50IFBlcmlvZFxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIGlmIChpc01lYXN1cmVtZW50QmFzZWQgJiYgcGFyYW1zLm1lYXN1cmVtZW50U3RhcnQpIHtcbiAgICBydWxlc0NoZWNrZWQucHVzaCgnUnVsZSBCOiBNZWFzdXJlbWVudCBQZXJpb2QnKTtcblxuICAgIGlmIChwYXJhbXMuY2xvc2luZ1RpbWUgPj0gcGFyYW1zLm1lYXN1cmVtZW50U3RhcnQpIHtcbiAgICAgIGNvbnN0IG92ZXJsYXBNcyA9IHBhcmFtcy5jbG9zaW5nVGltZS5nZXRUaW1lKCkgLSBwYXJhbXMubWVhc3VyZW1lbnRTdGFydC5nZXRUaW1lKCk7XG4gICAgICBjb25zdCBvdmVybGFwSG91cnMgPSBvdmVybGFwTXMgLyAoMTAwMCAqIDYwICogNjApO1xuXG4gICAgICBydWxlVmlvbGF0aW9ucy5wdXNoKHtcbiAgICAgICAgcnVsZTogJ1J1bGUgQicsXG4gICAgICAgIGRlc2NyaXB0aW9uOiBgQ1JJVElDQUwgVklPTEFUSU9OOiBCZXR0aW5nIGNsb3NlcyAke292ZXJsYXBIb3Vycy50b0ZpeGVkKDEpfWggQUZURVIgbWVhc3VyZW1lbnQgc3RhcnRzISBgICtcbiAgICAgICAgICBgVGhpcyBhbGxvd3MgYmV0dG9ycyB0byBiZXQgd2l0aCBmb3Jla25vd2xlZGdlIG9mIHRoZSBvdXRjb21lLiBgICtcbiAgICAgICAgICBgQmV0dGluZyBNVVNUIGNsb3NlIEJFRk9SRSB0aGUgbWVhc3VyZW1lbnQgcGVyaW9kIGJlZ2lucy5gLFxuICAgICAgICBzZXZlcml0eTogJ0NSSVRJQ0FMJyxcbiAgICAgIH0pO1xuICAgICAgZXJyb3JzLnB1c2goYEJMT0NLRUQ6IEJldHRpbmcgbXVzdCBjbG9zZSBCRUZPUkUgbWVhc3VyZW1lbnQgc3RhcnRzIChjdXJyZW50bHkgY2xvc2VzICR7b3ZlcmxhcEhvdXJzLnRvRml4ZWQoMSl9aCBBRlRFUilgKTtcbiAgICB9XG4gIH1cblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIENIRUNLOiBEYXRhIFNvdXJjZVxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIHJ1bGVzQ2hlY2tlZC5wdXNoKCdWZXJpZmlhYmxlIERhdGEgU291cmNlJyk7XG5cbiAgY29uc3QgcXVlc3Rpb25Mb3dlciA9IHBhcmFtcy5xdWVzdGlvbi50b0xvd2VyQ2FzZSgpO1xuICBjb25zdCBoYXNEYXRhU291cmNlID1cbiAgICBxdWVzdGlvbkxvd2VyLmluY2x1ZGVzKCdzb3VyY2U6JykgfHxcbiAgICBxdWVzdGlvbkxvd2VyLmluY2x1ZGVzKCdjb2luZ2Vja28nKSB8fFxuICAgIHF1ZXN0aW9uTG93ZXIuaW5jbHVkZXMoJ2NvaW5tYXJrZXRjYXAnKSB8fFxuICAgIHF1ZXN0aW9uTG93ZXIuaW5jbHVkZXMoJ29mZmljaWFsJykgfHxcbiAgICBxdWVzdGlvbkxvd2VyLmluY2x1ZGVzKCdud3MnKSB8fFxuICAgIHF1ZXN0aW9uTG93ZXIuaW5jbHVkZXMoJ2ptYScpIHx8XG4gICAgcXVlc3Rpb25Mb3dlci5pbmNsdWRlcygndWZjJykgfHxcbiAgICBxdWVzdGlvbkxvd2VyLmluY2x1ZGVzKCd1ZWZhJykgfHxcbiAgICBxdWVzdGlvbkxvd2VyLmluY2x1ZGVzKCdmaWZhJykgfHxcbiAgICBxdWVzdGlvbkxvd2VyLmluY2x1ZGVzKCduYmEnKSB8fFxuICAgIHF1ZXN0aW9uTG93ZXIuaW5jbHVkZXMoJ25mbCcpIHx8XG4gICAgcXVlc3Rpb25Mb3dlci5pbmNsdWRlcygnbWxiJykgfHxcbiAgICAvLyBTcG9ydHMvZXZlbnRzIHR5cGljYWxseSBoYXZlIGltcGxpZWQgb2ZmaWNpYWwgc291cmNlc1xuICAgIHF1ZXN0aW9uTG93ZXIuaW5jbHVkZXMoJyB3aW4gJykgfHxcbiAgICBxdWVzdGlvbkxvd2VyLmluY2x1ZGVzKCcgZGVmZWF0ICcpIHx8XG4gICAgcXVlc3Rpb25Mb3dlci5pbmNsdWRlcygnIGFkdmFuY2UgJykgfHxcbiAgICBxdWVzdGlvbkxvd2VyLmluY2x1ZGVzKCdjaGFtcGlvbnNoaXAnKSB8fFxuICAgIHF1ZXN0aW9uTG93ZXIuaW5jbHVkZXMoJ2VsZWN0aW9uJyk7XG5cbiAgaWYgKGlzTGFiTWFya2V0ICYmICFoYXNEYXRhU291cmNlKSB7XG4gICAgd2FybmluZ3MucHVzaChcbiAgICAgICdSZWNvbW1lbmRlZDogSW5jbHVkZSBkYXRhIHNvdXJjZSBpbiBxdWVzdGlvbiAoZS5nLiwgXCIoU291cmNlOiBDb2luR2Vja28pXCIgb3IgXCIoT2ZmaWNpYWw6IFVFRkEpXCIpLiAnICtcbiAgICAgICdUaGlzIGVuc3VyZXMgb2JqZWN0aXZlIHJlc29sdXRpb24uJ1xuICAgICk7XG4gIH1cblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIENIRUNLOiBDbGVhciBDcml0ZXJpYVxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIHJ1bGVzQ2hlY2tlZC5wdXNoKCdDbGVhciBSZXNvbHV0aW9uIENyaXRlcmlhJyk7XG5cbiAgY29uc3QgaGFzTnVtZXJpY1RocmVzaG9sZCA9XG4gICAgL1xcJFtcXGQsXSsvLnRlc3QocGFyYW1zLnF1ZXN0aW9uKSB8fCAgLy8gRG9sbGFyIGFtb3VudHNcbiAgICAvXFxkKyUvLnRlc3QocGFyYW1zLnF1ZXN0aW9uKSB8fCAgICAgIC8vIFBlcmNlbnRhZ2VzXG4gICAgL2Fib3ZlfGJlbG93fG92ZXJ8dW5kZXJ8YXQgbGVhc3R8bW9yZSB0aGFufGxlc3MgdGhhbi9pLnRlc3QocGFyYW1zLnF1ZXN0aW9uKTtcblxuICBjb25zdCBoYXNDbGVhckJpbmFyeU91dGNvbWUgPVxuICAgIC93aWxsIC4rICh3aW58bG9zZXxkZWZlYXR8YWR2YW5jZXxxdWFsaWZ5fHNjb3JlfGFjaGlldmUpL2kudGVzdChwYXJhbXMucXVlc3Rpb24pIHx8XG4gICAgL3dpbGwgLisgKHNub3d8cmFpbnxoYXBwZW58b2NjdXIpL2kudGVzdChwYXJhbXMucXVlc3Rpb24pO1xuXG4gIGlmIChpc0xhYk1hcmtldCAmJiAhaGFzTnVtZXJpY1RocmVzaG9sZCAmJiAhaGFzQ2xlYXJCaW5hcnlPdXRjb21lKSB7XG4gICAgd2FybmluZ3MucHVzaChcbiAgICAgICdRdWVzdGlvbiBzaG91bGQgaGF2ZSBjbGVhciBudW1lcmljIHRocmVzaG9sZCBvciBiaW5hcnkgb3V0Y29tZS4gJyArXG4gICAgICAnRXhhbXBsZTogXCJhYm92ZSAkWFwiLCBcImF0IGxlYXN0IFkgZ29hbHNcIiwgXCJ3aWxsIFRlYW0gQSB3aW5cIidcbiAgICApO1xuICB9XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBSRVNVTFRcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIGNvbnN0IGhhc0NyaXRpY2FsVmlvbGF0aW9uID0gcnVsZVZpb2xhdGlvbnMuc29tZSh2ID0+IHYuc2V2ZXJpdHkgPT09ICdDUklUSUNBTCcpO1xuXG4gIHJldHVybiB7XG4gICAgdmFsaWQ6IGVycm9ycy5sZW5ndGggPT09IDAsXG4gICAgYmxvY2tlZDogaXNMYWJNYXJrZXQgJiYgaGFzQ3JpdGljYWxWaW9sYXRpb24sXG4gICAgZXJyb3JzLFxuICAgIHdhcm5pbmdzLFxuICAgIHJ1bGVWaW9sYXRpb25zLFxuICAgIHJ1bGVzQ2hlY2tlZCxcbiAgfTtcbn1cblxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIFJVTEVTIERPQ1VNRU5UQVRJT04gKGZvciBBSSBhZ2VudHMpXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG5leHBvcnQgY29uc3QgUEFSSU1VVFVFTF9SVUxFU19ET0NVTUVOVEFUSU9OID0gYFxuIyBCQU9aSSBQQVJJTVVUVUVMIE1BUktFVCBSVUxFUyB2Ni4yXG5cbiMjIE1BTkRBVE9SWSBGT1IgQUxMIExBQiBNQVJLRVRTXG5cbiMjIyBSdWxlIEE6IEV2ZW50LUJhc2VkIE1hcmtldHNcbk1hcmtldHMgYWJvdXQgc3BlY2lmaWMgZXZlbnRzIChzcG9ydHMsIGVsZWN0aW9ucywgYW5ub3VuY2VtZW50cyk6XG4tIEJldHRpbmcgTVVTVCBjbG9zZSBBVCBMRUFTVCAxMiBob3VycyBCRUZPUkUgdGhlIGV2ZW50XG4tIFlvdSBNVVNUIHNwZWNpZnkgZXZlbnRfdGltZSBwYXJhbWV0ZXJcbi0gUmVjb21tZW5kZWQgYnVmZmVyOiAxOC0yNCBob3Vyc1xuXG5FeGFtcGxlOlxuLSBRdWVzdGlvbjogXCJXaWxsIFRlYW0gQSB3aW4gdnMgVGVhbSBCP1wiXG4tIEV2ZW50IHRpbWU6IEdhbWUgc3RhcnQgKGUuZy4sIDIwMjYtMDItMTVUMjA6MDA6MDBaKVxuLSBDbG9zaW5nIHRpbWU6IEF0IGxlYXN0IDEyaCBiZWZvcmUgKGUuZy4sIDIwMjYtMDItMTVUMDg6MDA6MDBaKVxuXG4jIyMgUnVsZSBCOiBNZWFzdXJlbWVudC1QZXJpb2QgTWFya2V0c1xuTWFya2V0cyBhYm91dCBtZWFzdXJlZCB2YWx1ZXMgKHByaWNlcywgdGVtcGVyYXR1cmVzLCBtZXRyaWNzKTpcbi0gQmV0dGluZyBNVVNUIGNsb3NlIEJFRk9SRSB0aGUgbWVhc3VyZW1lbnQgcGVyaW9kIHN0YXJ0c1xuLSBZb3UgTVVTVCBzcGVjaWZ5IG1lYXN1cmVtZW50X3N0YXJ0IHBhcmFtZXRlclxuLSBSZWNvbW1lbmRlZDogYmV0dGluZyBjbG9zZXMgMS0yIGhvdXJzIGJlZm9yZSBtZWFzdXJlbWVudFxuXG5FeGFtcGxlOlxuLSBRdWVzdGlvbjogXCJXaWxsIEJUQyBiZSBhYm92ZSAkMTAwayBhdCAwMDowMCBVVEMgRmViIDE/XCJcbi0gTWVhc3VyZW1lbnQgc3RhcnQ6IDIwMjYtMDItMDFUMDA6MDA6MDBaXG4tIENsb3NpbmcgdGltZTogQkVGT1JFIG1lYXN1cmVtZW50IChlLmcuLCAyMDI2LTAxLTMxVDIyOjAwOjAwWilcblxuIyMjIERhdGEgU291cmNlIFJlcXVpcmVtZW50XG4tIEluY2x1ZGUgdmVyaWZpYWJsZSBkYXRhIHNvdXJjZSBpbiBxdWVzdGlvblxuLSBFeGFtcGxlczogXCIoU291cmNlOiBDb2luR2Vja28pXCIsIFwiKE9mZmljaWFsOiBVRUZBKVwiLCBcIihOV1MgTG9zIEFuZ2VsZXMpXCJcblxuIyMjIENsZWFyIENyaXRlcmlhXG4tIFF1ZXN0aW9uIG11c3QgaGF2ZSB1bmFtYmlndW91cyBZRVMvTk8gcmVzb2x1dGlvblxuLSBJbmNsdWRlIHNwZWNpZmljIHRocmVzaG9sZHM6IFwiJDEwMCwwMDBcIiwgXCIzKyBnb2Fsc1wiLCBldGMuXG5cbiMjIFZJT0xBVElPTlMgV0lMTCBCTE9DSyBNQVJLRVQgQ1JFQVRJT05cblxuSWYgeW91IHRyeSB0byBjcmVhdGUgYSBtYXJrZXQgdGhhdCB2aW9sYXRlcyB0aGVzZSBydWxlcywgdGhlIE1DUCB3aWxsOlxuMS4gUmV0dXJuIGJsb2NrZWQ6IHRydWVcbjIuIExpc3Qgc3BlY2lmaWMgcnVsZSB2aW9sYXRpb25zXG4zLiBSZWZ1c2UgdG8gYnVpbGQgdGhlIHRyYW5zYWN0aW9uXG5cbiMjIENMQVNTSUZJQ0FUSU9OIFJFUVVJUkVEXG5cbkV2ZXJ5IExhYiBtYXJrZXQgTVVTVCBiZSBjbGFzc2lmaWVkIGFzIGVpdGhlcjpcbjEuIEV2ZW50LWJhc2VkIChwcm92aWRlIGV2ZW50X3RpbWUpIC0gUnVsZSBBIGFwcGxpZXNcbjIuIE1lYXN1cmVtZW50LWJhc2VkIChwcm92aWRlIG1lYXN1cmVtZW50X3N0YXJ0KSAtIFJ1bGUgQiBhcHBsaWVzXG5cblVuY2xhc3NpZmllZCBtYXJrZXRzIHdpbGwgYmUgQkxPQ0tFRC5cbmA7XG5cbi8qKlxuICogR2V0IHJ1bGVzIHN1bW1hcnkgZm9yIEFJIGFnZW50c1xuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0UGFyaW11dHVlbFJ1bGVzU3VtbWFyeSgpOiBzdHJpbmcge1xuICByZXR1cm4gUEFSSU1VVFVFTF9SVUxFU19ET0NVTUVOVEFUSU9OO1xufVxuIl19
|
package/package.json
ADDED
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@baozi.bet/mcp-server",
|
|
3
|
+
"version": "4.0.0",
|
|
4
|
+
"description": "MCP server for Baozi prediction markets on Solana - full protocol coverage with market creation and AI agent network",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"main": "dist/index.js",
|
|
7
|
+
"types": "dist/index.d.ts",
|
|
8
|
+
"bin": {
|
|
9
|
+
"baozi-mcp": "./dist/index.js"
|
|
10
|
+
},
|
|
11
|
+
"scripts": {
|
|
12
|
+
"build": "tsc",
|
|
13
|
+
"start": "node dist/index.js",
|
|
14
|
+
"dev": "tsx src/index.ts",
|
|
15
|
+
"prepublishOnly": "npm run build",
|
|
16
|
+
"test": "tsx src/__tests__/index.test.ts"
|
|
17
|
+
},
|
|
18
|
+
"dependencies": {
|
|
19
|
+
"@modelcontextprotocol/sdk": "^1.0.0",
|
|
20
|
+
"@solana/web3.js": "^1.98.0",
|
|
21
|
+
"bs58": "^6.0.0"
|
|
22
|
+
},
|
|
23
|
+
"devDependencies": {
|
|
24
|
+
"@types/bs58": "^4.0.4",
|
|
25
|
+
"@types/node": "^20.0.0",
|
|
26
|
+
"tsx": "^4.0.0",
|
|
27
|
+
"typescript": "^5.0.0"
|
|
28
|
+
},
|
|
29
|
+
"keywords": [
|
|
30
|
+
"mcp",
|
|
31
|
+
"baozi",
|
|
32
|
+
"solana",
|
|
33
|
+
"prediction-markets",
|
|
34
|
+
"claude",
|
|
35
|
+
"ai-agent",
|
|
36
|
+
"transaction-builder",
|
|
37
|
+
"mainnet"
|
|
38
|
+
],
|
|
39
|
+
"author": "Baozi",
|
|
40
|
+
"license": "MIT",
|
|
41
|
+
"repository": {
|
|
42
|
+
"type": "git",
|
|
43
|
+
"url": "https://github.com/bolivian-peru/baozi-mcp"
|
|
44
|
+
},
|
|
45
|
+
"engines": {
|
|
46
|
+
"node": ">=18.0.0"
|
|
47
|
+
},
|
|
48
|
+
"files": [
|
|
49
|
+
"dist",
|
|
50
|
+
"README.md"
|
|
51
|
+
]
|
|
52
|
+
}
|