@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
@@ -0,0 +1,308 @@
1
+ /**
2
+ * Race Markets Handler - Multi-Outcome Prediction Markets
3
+ */
4
+ import { Connection, PublicKey } from '@solana/web3.js';
5
+ import bs58 from 'bs58';
6
+ import { PROGRAM_ID, RPC_ENDPOINT, DISCRIMINATORS, MARKET_STATUS_NAMES, MARKET_LAYER_NAMES, lamportsToSol, } from '../config.js';
7
+ // =============================================================================
8
+ // RACE MARKET DECODER
9
+ // =============================================================================
10
+ /**
11
+ * Decode RaceMarket account data
12
+ *
13
+ * RaceMarket struct layout (from IDL v4.7.6):
14
+ * - discriminator (8)
15
+ * - market_id (u64, 8)
16
+ * - question (String: 4 + len)
17
+ * - closing_time (i64, 8)
18
+ * - resolution_time (i64, 8)
19
+ * - auto_stop_buffer (i64, 8)
20
+ * - outcome_count (u8, 1)
21
+ * - outcome_labels ([[u8; 32]; 10], 320 bytes FIXED)
22
+ * - outcome_pools ([u64; 10], 80 bytes FIXED)
23
+ * - total_pool (u64, 8)
24
+ * - snapshot_pools ([u64; 10], 80 bytes)
25
+ * - snapshot_total (u64, 8)
26
+ * - status (enum, 1)
27
+ * - winning_outcome (Option<u8>: 1 + 0/1)
28
+ * - currency_type (enum, 1)
29
+ * - platform_fee_collected (u64, 8)
30
+ * - creator_fee_collected (u64, 8)
31
+ * - total_claimed (u64, 8)
32
+ * - last_bet_time (i64, 8)
33
+ * - bump (u8, 1)
34
+ * - layer (enum, 1)
35
+ * - resolution_mode (enum, 1)
36
+ * - access_gate (enum, 1)
37
+ * - creator (Pubkey, 32)
38
+ * - platform_fee_bps_at_creation (u16, 2)
39
+ * - affiliate_fee_bps_at_creation (u16, 2)
40
+ * - betting_freeze_seconds_at_creation (i64, 8)
41
+ * - dust_swept (bool, 1)
42
+ * - reserved ([u8; 19], 19)
43
+ */
44
+ function decodeRaceMarket(data, pubkey) {
45
+ try {
46
+ // Minimum expected size for a RaceMarket account
47
+ // 8 (disc) + 8 (id) + 4 (qlen) + 8*3 (times) + 1 (count) + 320 (labels) + 80 (pools) + ...
48
+ if (data.length < 500) {
49
+ return null; // Account too small to be a RaceMarket
50
+ }
51
+ let offset = 8; // Skip discriminator
52
+ // market_id (u64)
53
+ const marketId = data.readBigUInt64LE(offset);
54
+ offset += 8;
55
+ // question (String: 4 bytes length + UTF-8 bytes)
56
+ const questionLen = data.readUInt32LE(offset);
57
+ offset += 4;
58
+ // Sanity check: question length should be reasonable (max 200 chars)
59
+ if (questionLen > 500 || questionLen + offset > data.length) {
60
+ return null; // Invalid question length - not a valid RaceMarket
61
+ }
62
+ const question = data.slice(offset, offset + questionLen).toString('utf8');
63
+ offset += questionLen;
64
+ // closing_time (i64)
65
+ const closingTime = data.readBigInt64LE(offset);
66
+ offset += 8;
67
+ // resolution_time (i64)
68
+ const resolutionTime = data.readBigInt64LE(offset);
69
+ offset += 8;
70
+ // auto_stop_buffer (i64)
71
+ offset += 8; // Skip for now
72
+ // outcome_count (u8)
73
+ const outcomeCount = data.readUInt8(offset);
74
+ offset += 1;
75
+ // outcome_labels: [[u8; 32]; 10] = 320 bytes FIXED
76
+ // Each label is 32 bytes, padded with zeros
77
+ const outcomeLabels = [];
78
+ for (let i = 0; i < 10; i++) {
79
+ const labelBytes = data.slice(offset, offset + 32);
80
+ // Find null terminator or end of string
81
+ let labelEnd = 32;
82
+ for (let j = 0; j < 32; j++) {
83
+ if (labelBytes[j] === 0) {
84
+ labelEnd = j;
85
+ break;
86
+ }
87
+ }
88
+ if (i < outcomeCount) {
89
+ outcomeLabels.push(labelBytes.slice(0, labelEnd).toString('utf8'));
90
+ }
91
+ offset += 32;
92
+ }
93
+ // outcome_pools: [u64; 10] = 80 bytes FIXED
94
+ const outcomePools = [];
95
+ for (let i = 0; i < 10; i++) {
96
+ const pool = data.readBigUInt64LE(offset);
97
+ if (i < outcomeCount) {
98
+ outcomePools.push(pool);
99
+ }
100
+ offset += 8;
101
+ }
102
+ // total_pool (u64)
103
+ const totalPoolLamports = data.readBigUInt64LE(offset);
104
+ offset += 8;
105
+ // snapshot_pools: [u64; 10] = 80 bytes - skip
106
+ offset += 80;
107
+ // snapshot_total (u64) - skip
108
+ offset += 8;
109
+ // status (enum, 1 byte)
110
+ const statusCode = data.readUInt8(offset);
111
+ offset += 1;
112
+ // winning_outcome (Option<u8>: 1 byte discriminant + optional 1 byte value)
113
+ const hasWinningOutcome = data.readUInt8(offset);
114
+ offset += 1;
115
+ let winningOutcomeIndex = null;
116
+ if (hasWinningOutcome === 1) {
117
+ winningOutcomeIndex = data.readUInt8(offset);
118
+ offset += 1;
119
+ }
120
+ // currency_type (enum, 1 byte)
121
+ offset += 1;
122
+ // platform_fee_collected (u64)
123
+ offset += 8;
124
+ // creator_fee_collected (u64)
125
+ offset += 8;
126
+ // total_claimed (u64)
127
+ offset += 8;
128
+ // last_bet_time (i64)
129
+ offset += 8;
130
+ // bump (u8)
131
+ offset += 1;
132
+ // layer (enum, 1 byte)
133
+ const layerCode = data.readUInt8(offset);
134
+ offset += 1;
135
+ // resolution_mode (enum, 1 byte)
136
+ offset += 1;
137
+ // access_gate (enum, 1 byte)
138
+ const accessGateCode = data.readUInt8(offset);
139
+ offset += 1;
140
+ // creator (Pubkey, 32 bytes)
141
+ const creator = new PublicKey(data.slice(offset, offset + 32));
142
+ offset += 32;
143
+ // oracle_host (Option<Pubkey>: 1 + 0/32)
144
+ const hasOracleHost = data.readUInt8(offset);
145
+ offset += 1;
146
+ if (hasOracleHost === 1) {
147
+ offset += 32;
148
+ }
149
+ // council: [Pubkey; 5] = 160 bytes - skip
150
+ offset += 160;
151
+ // council_size (u8)
152
+ offset += 1;
153
+ // council_votes: [u8; 10] = 10 bytes - skip
154
+ offset += 10;
155
+ // council_threshold (u8)
156
+ offset += 1;
157
+ // creator_fee_bps (u16)
158
+ offset += 2;
159
+ // creator_profile (Option<Pubkey>: 1 + 0/32)
160
+ const hasCreatorProfile = data.readUInt8(offset);
161
+ offset += 1;
162
+ if (hasCreatorProfile === 1) {
163
+ offset += 32;
164
+ }
165
+ // platform_fee_bps_at_creation (u16)
166
+ const platformFeeBps = data.readUInt16LE(offset);
167
+ offset += 2;
168
+ // Calculate derived fields
169
+ const totalPoolSol = lamportsToSol(totalPoolLamports);
170
+ const outcomes = outcomeLabels.map((label, i) => {
171
+ const poolSol = lamportsToSol(outcomePools[i] || 0n);
172
+ const percent = totalPoolSol > 0 ? (poolSol / totalPoolSol) * 100 : 100 / outcomeLabels.length;
173
+ return {
174
+ index: i,
175
+ label,
176
+ poolSol: round4(poolSol),
177
+ percent: round2(percent),
178
+ };
179
+ });
180
+ // Betting open check
181
+ const now = BigInt(Math.floor(Date.now() / 1000));
182
+ const freezeTime = closingTime - 300n; // 5 min freeze
183
+ const isBettingOpen = statusCode === 0 && now < freezeTime;
184
+ return {
185
+ publicKey: pubkey.toBase58(),
186
+ marketId: marketId.toString(),
187
+ question,
188
+ outcomes,
189
+ closingTime: new Date(Number(closingTime) * 1000).toISOString(),
190
+ resolutionTime: new Date(Number(resolutionTime) * 1000).toISOString(),
191
+ status: MARKET_STATUS_NAMES[statusCode] || 'Unknown',
192
+ statusCode,
193
+ winningOutcomeIndex,
194
+ totalPoolSol: round4(totalPoolSol),
195
+ layer: MARKET_LAYER_NAMES[layerCode] || 'Unknown',
196
+ layerCode,
197
+ accessGate: accessGateCode === 0 ? 'Public' : 'Whitelist',
198
+ creator: creator.toBase58(),
199
+ platformFeeBps,
200
+ isBettingOpen,
201
+ };
202
+ }
203
+ catch (err) {
204
+ console.error('Error decoding race market:', err);
205
+ return null;
206
+ }
207
+ }
208
+ // =============================================================================
209
+ // PUBLIC API
210
+ // =============================================================================
211
+ /**
212
+ * List all race markets
213
+ */
214
+ export async function listRaceMarkets(status) {
215
+ const connection = new Connection(RPC_ENDPOINT, 'confirmed');
216
+ const accounts = await connection.getProgramAccounts(PROGRAM_ID, {
217
+ filters: [
218
+ {
219
+ memcmp: {
220
+ offset: 0,
221
+ bytes: bs58.encode(DISCRIMINATORS.RACE_MARKET),
222
+ },
223
+ },
224
+ ],
225
+ });
226
+ const markets = [];
227
+ for (const { account, pubkey } of accounts) {
228
+ const market = decodeRaceMarket(account.data, pubkey);
229
+ if (market) {
230
+ if (!status || market.status.toLowerCase() === status.toLowerCase()) {
231
+ markets.push(market);
232
+ }
233
+ }
234
+ }
235
+ // Sort by closing time
236
+ markets.sort((a, b) => {
237
+ if (a.status === 'Active' && b.status !== 'Active')
238
+ return -1;
239
+ if (a.status !== 'Active' && b.status === 'Active')
240
+ return 1;
241
+ return new Date(a.closingTime).getTime() - new Date(b.closingTime).getTime();
242
+ });
243
+ return markets;
244
+ }
245
+ /**
246
+ * Get a specific race market
247
+ */
248
+ export async function getRaceMarket(publicKey) {
249
+ const connection = new Connection(RPC_ENDPOINT, 'confirmed');
250
+ try {
251
+ const pubkey = new PublicKey(publicKey);
252
+ const account = await connection.getAccountInfo(pubkey);
253
+ if (!account)
254
+ return null;
255
+ return decodeRaceMarket(account.data, pubkey);
256
+ }
257
+ catch {
258
+ return null;
259
+ }
260
+ }
261
+ /**
262
+ * Get race quote for a potential bet
263
+ */
264
+ export function getRaceQuote(market, outcomeIndex, betAmountSol) {
265
+ if (outcomeIndex < 0 || outcomeIndex >= market.outcomes.length) {
266
+ return {
267
+ valid: false,
268
+ error: `Invalid outcome index. Must be 0-${market.outcomes.length - 1}`,
269
+ outcomeLabel: '',
270
+ betAmountSol,
271
+ expectedPayoutSol: 0,
272
+ impliedOdds: 0,
273
+ newOutcomePercent: 0,
274
+ };
275
+ }
276
+ const outcome = market.outcomes[outcomeIndex];
277
+ const currentPool = outcome.poolSol;
278
+ const totalPool = market.totalPoolSol;
279
+ // New pools after bet
280
+ const newOutcomePool = currentPool + betAmountSol;
281
+ const newTotalPool = totalPool + betAmountSol;
282
+ // Share of outcome pool
283
+ const share = betAmountSol / newOutcomePool;
284
+ const grossPayout = share * newTotalPool;
285
+ const profit = grossPayout - betAmountSol;
286
+ const fee = profit > 0 ? (profit * market.platformFeeBps) / 10000 : 0;
287
+ const expectedPayout = grossPayout - fee;
288
+ // Implied odds
289
+ const impliedOdds = newOutcomePool / newTotalPool * 100;
290
+ return {
291
+ valid: true,
292
+ outcomeLabel: outcome.label,
293
+ betAmountSol,
294
+ expectedPayoutSol: round4(expectedPayout),
295
+ impliedOdds: round2(impliedOdds),
296
+ newOutcomePercent: round2((newOutcomePool / newTotalPool) * 100),
297
+ };
298
+ }
299
+ // =============================================================================
300
+ // HELPERS
301
+ // =============================================================================
302
+ function round2(n) {
303
+ return Math.round(n * 100) / 100;
304
+ }
305
+ function round4(n) {
306
+ return Math.round(n * 10000) / 10000;
307
+ }
308
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmFjZS1tYXJrZXRzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2hhbmRsZXJzL3JhY2UtbWFya2V0cy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7R0FFRztBQUNILE9BQU8sRUFBRSxVQUFVLEVBQUUsU0FBUyxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDeEQsT0FBTyxJQUFJLE1BQU0sTUFBTSxDQUFDO0FBQ3hCLE9BQU8sRUFDTCxVQUFVLEVBQ1YsWUFBWSxFQUNaLGNBQWMsRUFDZCxtQkFBbUIsRUFDbkIsa0JBQWtCLEVBQ2xCLGFBQWEsR0FDZCxNQUFNLGNBQWMsQ0FBQztBQTJDdEIsZ0ZBQWdGO0FBQ2hGLHNCQUFzQjtBQUN0QixnRkFBZ0Y7QUFFaEY7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQWlDRztBQUNILFNBQVMsZ0JBQWdCLENBQUMsSUFBWSxFQUFFLE1BQWlCO0lBQ3ZELElBQUksQ0FBQztRQUNILGlEQUFpRDtRQUNqRCwyRkFBMkY7UUFDM0YsSUFBSSxJQUFJLENBQUMsTUFBTSxHQUFHLEdBQUcsRUFBRSxDQUFDO1lBQ3RCLE9BQU8sSUFBSSxDQUFDLENBQUMsdUNBQXVDO1FBQ3RELENBQUM7UUFFRCxJQUFJLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQyxxQkFBcUI7UUFFckMsa0JBQWtCO1FBQ2xCLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxlQUFlLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDOUMsTUFBTSxJQUFJLENBQUMsQ0FBQztRQUVaLGtEQUFrRDtRQUNsRCxNQUFNLFdBQVcsR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQzlDLE1BQU0sSUFBSSxDQUFDLENBQUM7UUFFWixxRUFBcUU7UUFDckUsSUFBSSxXQUFXLEdBQUcsR0FBRyxJQUFJLFdBQVcsR0FBRyxNQUFNLEdBQUcsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQzVELE9BQU8s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R0FBRyxHQUFHLENBQUM7S0FDakUsQ0FBQztBQUNKLENBQUM7QUFFRCxnRkFBZ0Y7QUFDaEYsVUFBVTtBQUNWLGdGQUFnRjtBQUVoRixTQUFTLE1BQU0sQ0FBQyxDQUFTO0lBQ3ZCLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDLEdBQUcsR0FBRyxDQUFDO0FBQ25DLENBQUM7QUFFRCxTQUFTLE1BQU0sQ0FBQyxDQUFTO0lBQ3ZCLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDLEdBQUcsS0FBSyxDQUFDO0FBQ3ZDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIFJhY2UgTWFya2V0cyBIYW5kbGVyIC0gTXVsdGktT3V0Y29tZSBQcmVkaWN0aW9uIE1hcmtldHNcbiAqL1xuaW1wb3J0IHsgQ29ubmVjdGlvbiwgUHVibGljS2V5IH0gZnJvbSAnQHNvbGFuYS93ZWIzLmpzJztcbmltcG9ydCBiczU4IGZyb20gJ2JzNTgnO1xuaW1wb3J0IHtcbiAgUFJPR1JBTV9JRCxcbiAgUlBDX0VORFBPSU5ULFxuICBESVNDUklNSU5BVE9SUyxcbiAgTUFSS0VUX1NUQVRVU19OQU1FUyxcbiAgTUFSS0VUX0xBWUVSX05BTUVTLFxuICBsYW1wb3J0c1RvU29sLFxufSBmcm9tICcuLi9jb25maWcuanMnO1xuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8gVFlQRVNcbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbmV4cG9ydCBpbnRlcmZhY2UgUmFjZU91dGNvbWUge1xuICBpbmRleDogbnVtYmVyO1xuICBsYWJlbDogc3RyaW5nO1xuICBwb29sU29sOiBudW1iZXI7XG4gIHBlcmNlbnQ6IG51bWJlcjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBSYWNlTWFya2V0IHtcbiAgcHVibGljS2V5OiBzdHJpbmc7XG4gIG1hcmtldElkOiBzdHJpbmc7XG4gIHF1ZXN0aW9uOiBzdHJpbmc7XG4gIG91dGNvbWVzOiBSYWNlT3V0Y29tZVtdO1xuICBjbG9zaW5nVGltZTogc3RyaW5nO1xuICByZXNvbHV0aW9uVGltZTogc3RyaW5nO1xuICBzdGF0dXM6IHN0cmluZztcbiAgc3RhdHVzQ29kZTogbnVtYmVyO1xuICB3aW5uaW5nT3V0Y29tZUluZGV4OiBudW1iZXIgfCBudWxsO1xuICB0b3RhbFBvb2xTb2w6IG51bWJlcjtcbiAgbGF5ZXI6IHN0cmluZztcbiAgbGF5ZXJDb2RlOiBudW1iZXI7XG4gIGFjY2Vzc0dhdGU6IHN0cmluZztcbiAgY3JlYXRvcjogc3RyaW5nO1xuICBwbGF0Zm9ybUZlZUJwczogbnVtYmVyO1xuICBpc0JldHRpbmdPcGVuOiBib29sZWFuO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFJhY2VQb3NpdGlvbiB7XG4gIHB1YmxpY0tleTogc3RyaW5nO1xuICB1c2VyOiBzdHJpbmc7XG4gIHJhY2VNYXJrZXRQZGE6IHN0cmluZztcbiAgbWFya2V0SWQ6IHN0cmluZztcbiAgb3V0Y29tZUluZGV4OiBudW1iZXI7XG4gIGFtb3VudFNvbDogbnVtYmVyO1xuICBjbGFpbWVkOiBib29sZWFuO1xuICBjcmVhdGVkQXQ6IHN0cmluZztcbn1cblxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIFJBQ0UgTUFSS0VUIERFQ09ERVJcbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbi8qKlxuICogRGVjb2RlIFJhY2VNYXJrZXQgYWNjb3VudCBkYXRhXG4gKlxuICogUmFjZU1hcmtldCBzdHJ1Y3QgbGF5b3V0IChmcm9tIElETCB2NC43LjYpOlxuICogLSBkaXNjcmltaW5hdG9yICg4KVxuICogLSBtYXJrZXRfaWQgKHU2NCwgOClcbiAqIC0gcXVlc3Rpb24gKFN0cmluZzogNCArIGxlbilcbiAqIC0gY2xvc2luZ190aW1lIChpNjQsIDgpXG4gKiAtIHJlc29sdXRpb25fdGltZSAoaTY0LCA4KVxuICogLSBhdXRvX3N0b3BfYnVmZmVyIChpNjQsIDgpXG4gKiAtIG91dGNvbWVfY291bnQgKHU4LCAxKVxuICogLSBvdXRjb21lX2xhYmVscyAoW1t1ODsgMzJdOyAxMF0sIDMyMCBieXRlcyBGSVhFRClcbiAqIC0gb3V0Y29tZV9wb29scyAoW3U2NDsgMTBdLCA4MCBieXRlcyBGSVhFRClcbiAqIC0gdG90YWxfcG9vbCAodTY0LCA4KVxuICogLSBzbmFwc2hvdF9wb29scyAoW3U2NDsgMTBdLCA4MCBieXRlcylcbiAqIC0gc25hcHNob3RfdG90YWwgKHU2NCwgOClcbiAqIC0gc3RhdHVzIChlbnVtLCAxKVxuICogLSB3aW5uaW5nX291dGNvbWUgKE9wdGlvbjx1OD46IDEgKyAwLzEpXG4gKiAtIGN1cnJlbmN5X3R5cGUgKGVudW0sIDEpXG4gKiAtIHBsYXRmb3JtX2ZlZV9jb2xsZWN0ZWQgKHU2NCwgOClcbiAqIC0gY3JlYXRvcl9mZWVfY29sbGVjdGVkICh1NjQsIDgpXG4gKiAtIHRvdGFsX2NsYWltZWQgKHU2NCwgOClcbiAqIC0gbGFzdF9iZXRfdGltZSAoaTY0LCA4KVxuICogLSBidW1wICh1OCwgMSlcbiAqIC0gbGF5ZXIgKGVudW0sIDEpXG4gKiAtIHJlc29sdXRpb25fbW9kZSAoZW51bSwgMSlcbiAqIC0gYWNjZXNzX2dhdGUgKGVudW0sIDEpXG4gKiAtIGNyZWF0b3IgKFB1YmtleSwgMzIpXG4gKiAtIHBsYXRmb3JtX2ZlZV9icHNfYXRfY3JlYXRpb24gKHUxNiwgMilcbiAqIC0gYWZmaWxpYXRlX2ZlZV9icHNfYXRfY3JlYXRpb24gKHUxNiwgMilcbiAqIC0gYmV0dGluZ19mcmVlemVfc2Vjb25kc19hdF9jcmVhdGlvbiAoaTY0LCA4KVxuICogLSBkdXN0X3N3ZXB0IChib29sLCAxKVxuICogLSByZXNlcnZlZCAoW3U4OyAxOV0sIDE5KVxuICovXG5mdW5jdGlvbiBkZWNvZGVSYWNlTWFya2V0KGRhdGE6IEJ1ZmZlciwgcHVia2V5OiBQdWJsaWNLZXkpOiBSYWNlTWFya2V0IHwgbnVsbCB7XG4gIHRyeSB7XG4gICAgLy8gTWluaW11bSBleHBlY3RlZCBzaXplIGZvciBhIFJhY2VNYXJrZXQgYWNjb3VudFxuICAgIC8vIDggKGRpc2MpICsgOCAoaWQpICsgNCAocWxlbikgKyA4KjMgKHRpbWVzKSArIDEgKGNvdW50KSArIDMyMCAobGFiZWxzKSArIDgwIChwb29scykgKyAuLi5cbiAgICBpZiAoZGF0YS5sZW5ndGggPCA1MDApIHtcbiAgICAgIHJldHVybiBudWxsOyAvLyBBY2NvdW50IHRvbyBzbWFsbCB0byBiZSBhIFJhY2VNYXJrZXRcbiAgICB9XG5cbiAgICBsZXQgb2Zmc2V0ID0gODsgLy8gU2tpcCBkaXNjcmltaW5hdG9yXG5cbiAgICAvLyBtYXJrZXRfaWQgKHU2NClcbiAgICBjb25zdCBtYXJrZXRJZCA9IGRhdGEucmVhZEJpZ1VJbnQ2NExFKG9mZnNldCk7XG4gICAgb2Zmc2V0ICs9IDg7XG5cbiAgICAvLyBxdWVzdGlvbiAoU3RyaW5nOiA0IGJ5dGVzIGxlbmd0aCArIFVURi04IGJ5dGVzKVxuICAgIGNvbnN0IHF1ZXN0aW9uTGVuID0gZGF0YS5yZWFkVUludDMyTEUob2Zmc2V0KTtcbiAgICBvZmZzZXQgKz0gNDtcblxuICAgIC8vIFNhbml0eSBjaGVjazogcXVlc3Rpb24gbGVuZ3RoIHNob3VsZCBiZSByZWFzb25hYmxlIChtYXggMjAwIGNoYXJzKVxuICAgIGlmIChxdWVzdGlvbkxlbiA+IDUwMCB8fCBxdWVzdGlvbkxlbiArIG9mZnNldCA+IGRhdGEubGVuZ3RoKSB7XG4gICAgICByZXR1cm4gbnVsbDsgLy8gSW52YWxpZCBxdWVzdGlvbiBsZW5ndGggLSBub3QgYSB2YWxpZCBSYWNlTWFya2V0XG4gICAgfVxuXG4gICAgY29uc3QgcXVlc3Rpb24gPSBkYXRhLnNsaWNlKG9mZnNldCwgb2Zmc2V0ICsgcXVlc3Rpb25MZW4pLnRvU3RyaW5nKCd1dGY4Jyk7XG4gICAgb2Zmc2V0ICs9IHF1ZXN0aW9uTGVuO1xuXG4gICAgLy8gY2xvc2luZ190aW1lIChpNjQpXG4gICAgY29uc3QgY2xvc2luZ1RpbWUgPSBkYXRhLnJlYWRCaWdJbnQ2NExFKG9mZnNldCk7XG4gICAgb2Zmc2V0ICs9IDg7XG5cbiAgICAvLyByZXNvbHV0aW9uX3RpbWUgKGk2NClcbiAgICBjb25zdCByZXNvbHV0aW9uVGltZSA9IGRhdGEucmVhZEJpZ0ludDY0TEUob2Zmc2V0KTtcbiAgICBvZmZzZXQgKz0gODtcblxuICAgIC8vIGF1dG9fc3RvcF9idWZmZXIgKGk2NClcbiAgICBvZmZzZXQgKz0gODsgLy8gU2tpcCBmb3Igbm93XG5cbiAgICAvLyBvdXRjb21lX2NvdW50ICh1OClcbiAgICBjb25zdCBvdXRjb21lQ291bnQgPSBkYXRhLnJlYWRVSW50OChvZmZzZXQpO1xuICAgIG9mZnNldCArPSAxO1xuXG4gICAgLy8gb3V0Y29tZV9sYWJlbHM6IFtbdTg7IDMyXTsgMTBdID0gMzIwIGJ5dGVzIEZJWEVEXG4gICAgLy8gRWFjaCBsYWJlbCBpcyAzMiBieXRlcywgcGFkZGVkIHdpdGggemVyb3NcbiAgICBjb25zdCBvdXRjb21lTGFiZWxzOiBzdHJpbmdbXSA9IFtdO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgMTA7IGkrKykge1xuICAgICAgY29uc3QgbGFiZWxCeXRlcyA9IGRhdGEuc2xpY2Uob2Zmc2V0LCBvZmZzZXQgKyAzMik7XG4gICAgICAvLyBGaW5kIG51bGwgdGVybWluYXRvciBvciBlbmQgb2Ygc3RyaW5nXG4gICAgICBsZXQgbGFiZWxFbmQgPSAzMjtcbiAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgMzI7IGorKykge1xuICAgICAgICBpZiAobGFiZWxCeXRlc1tqXSA9PT0gMCkge1xuICAgICAgICAgIGxhYmVsRW5kID0gajtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKGkgPCBvdXRjb21lQ291bnQpIHtcbiAgICAgICAgb3V0Y29tZUxhYmVscy5wdXNoKGxhYmVsQnl0ZXMuc2xpY2UoMCwgbGFiZWxFbmQpLnRvU3RyaW5nKCd1dGY4JykpO1xuICAgICAgfVxuICAgICAgb2Zmc2V0ICs9IDMyO1xuICAgIH1cblxuICAgIC8vIG91dGNvbWVfcG9vbHM6IFt1NjQ7IDEwXSA9IDgwIGJ5dGVzIEZJWEVEXG4gICAgY29uc3Qgb3V0Y29tZVBvb2xzOiBiaWdpbnRbXSA9IFtdO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgMTA7IGkrKykge1xuICAgICAgY29uc3QgcG9vbCA9IGRhdGEucmVhZEJpZ1VJbnQ2NExFKG9mZnNldCk7XG4gICAgICBpZiAoaSA8IG91dGNvbWVDb3VudCkge1xuICAgICAgICBvdXRjb21lUG9vbHMucHVzaChwb29sKTtcbiAgICAgIH1cbiAgICAgIG9mZnNldCArPSA4O1xuICAgIH1cblxuICAgIC8vIHRvdGFsX3Bvb2wgKHU2NClcbiAgICBjb25zdCB0b3RhbFBvb2xMYW1wb3J0cyA9IGRhdGEucmVhZEJpZ1VJbnQ2NExFKG9mZnNldCk7XG4gICAgb2Zmc2V0ICs9IDg7XG5cbiAgICAvLyBzbmFwc2hvdF9wb29sczogW3U2NDsgMTBdID0gODAgYnl0ZXMgLSBza2lwXG4gICAgb2Zmc2V0ICs9IDgwO1xuXG4gICAgLy8gc25hcHNob3RfdG90YWwgKHU2NCkgLSBza2lwXG4gICAgb2Zmc2V0ICs9IDg7XG5cbiAgICAvLyBzdGF0dXMgKGVudW0sIDEgYnl0ZSlcbiAgICBjb25zdCBzdGF0dXNDb2RlID0gZGF0YS5yZWFkVUludDgob2Zmc2V0KTtcbiAgICBvZmZzZXQgKz0gMTtcblxuICAgIC8vIHdpbm5pbmdfb3V0Y29tZSAoT3B0aW9uPHU4PjogMSBieXRlIGRpc2NyaW1pbmFudCArIG9wdGlvbmFsIDEgYnl0ZSB2YWx1ZSlcbiAgICBjb25zdCBoYXNXaW5uaW5nT3V0Y29tZSA9IGRhdGEucmVhZFVJbnQ4KG9mZnNldCk7XG4gICAgb2Zmc2V0ICs9IDE7XG4gICAgbGV0IHdpbm5pbmdPdXRjb21lSW5kZXg6IG51bWJlciB8IG51bGwgPSBudWxsO1xuICAgIGlmIChoYXNXaW5uaW5nT3V0Y29tZSA9PT0gMSkge1xuICAgICAgd2lubmluZ091dGNvbWVJbmRleCA9IGRhdGEucmVhZFVJbnQ4KG9mZnNldCk7XG4gICAgICBvZmZzZXQgKz0gMTtcbiAgICB9XG5cbiAgICAvLyBjdXJyZW5jeV90eXBlIChlbnVtLCAxIGJ5dGUpXG4gICAgb2Zmc2V0ICs9IDE7XG5cbiAgICAvLyBwbGF0Zm9ybV9mZWVfY29sbGVjdGVkICh1NjQpXG4gICAgb2Zmc2V0ICs9IDg7XG5cbiAgICAvLyBjcmVhdG9yX2ZlZV9jb2xsZWN0ZWQgKHU2NClcbiAgICBvZmZzZXQgKz0gODtcblxuICAgIC8vIHRvdGFsX2NsYWltZWQgKHU2NClcbiAgICBvZmZzZXQgKz0gODtcblxuICAgIC8vIGxhc3RfYmV0X3RpbWUgKGk2NClcbiAgICBvZmZzZXQgKz0gODtcblxuICAgIC8vIGJ1bXAgKHU4KVxuICAgIG9mZnNldCArPSAxO1xuXG4gICAgLy8gbGF5ZXIgKGVudW0sIDEgYnl0ZSlcbiAgICBjb25zdCBsYXllckNvZGUgPSBkYXRhLnJlYWRVSW50OChvZmZzZXQpO1xuICAgIG9mZnNldCArPSAxO1xuXG4gICAgLy8gcmVzb2x1dGlvbl9tb2RlIChlbnVtLCAxIGJ5dGUpXG4gICAgb2Zmc2V0ICs9IDE7XG5cbiAgICAvLyBhY2Nlc3NfZ2F0ZSAoZW51bSwgMSBieXRlKVxuICAgIGNvbnN0IGFjY2Vzc0dhdGVDb2RlID0gZGF0YS5yZWFkVUludDgob2Zmc2V0KTtcbiAgICBvZmZzZXQgKz0gMTtcblxuICAgIC8vIGNyZWF0b3IgKFB1YmtleSwgMzIgYnl0ZXMpXG4gICAgY29uc3QgY3JlYXRvciA9IG5ldyBQdWJsaWNLZXkoZGF0YS5zbGljZShvZmZzZXQsIG9mZnNldCArIDMyKSk7XG4gICAgb2Zmc2V0ICs9IDMyO1xuXG4gICAgLy8gb3JhY2xlX2hvc3QgKE9wdGlvbjxQdWJrZXk+OiAxICsgMC8zMilcbiAgICBjb25zdCBoYXNPcmFjbGVIb3N0ID0gZGF0YS5yZWFkVUludDgob2Zmc2V0KTtcbiAgICBvZmZzZXQgKz0gMTtcbiAgICBpZiAoaGFzT3JhY2xlSG9zdCA9PT0gMSkge1xuICAgICAgb2Zmc2V0ICs9IDMyO1xuICAgIH1cblxuICAgIC8vIGNvdW5jaWw6IFtQdWJrZXk7IDVdID0gMTYwIGJ5dGVzIC0gc2tpcFxuICAgIG9mZnNldCArPSAxNjA7XG5cbiAgICAvLyBjb3VuY2lsX3NpemUgKHU4KVxuICAgIG9mZnNldCArPSAxO1xuXG4gICAgLy8gY291bmNpbF92b3RlczogW3U4OyAxMF0gPSAxMCBieXRlcyAtIHNraXBcbiAgICBvZmZzZXQgKz0gMTA7XG5cbiAgICAvLyBjb3VuY2lsX3RocmVzaG9sZCAodTgpXG4gICAgb2Zmc2V0ICs9IDE7XG5cbiAgICAvLyBjcmVhdG9yX2ZlZV9icHMgKHUxNilcbiAgICBvZmZzZXQgKz0gMjtcblxuICAgIC8vIGNyZWF0b3JfcHJvZmlsZSAoT3B0aW9uPFB1YmtleT46IDEgKyAwLzMyKVxuICAgIGNvbnN0IGhhc0NyZWF0b3JQcm9maWxlID0gZGF0YS5yZWFkVUludDgob2Zmc2V0KTtcbiAgICBvZmZzZXQgKz0gMTtcbiAgICBpZiAoaGFzQ3JlYXRvclByb2ZpbGUgPT09IDEpIHtcbiAgICAgIG9mZnNldCArPSAzMjtcbiAgICB9XG5cbiAgICAvLyBwbGF0Zm9ybV9mZWVfYnBzX2F0X2NyZWF0aW9uICh1MTYpXG4gICAgY29uc3QgcGxhdGZvcm1GZWVCcHMgPSBkYXRhLnJlYWRVSW50MTZMRShvZmZzZXQpO1xuICAgIG9mZnNldCArPSAyO1xuXG4gICAgLy8gQ2FsY3VsYXRlIGRlcml2ZWQgZmllbGRzXG4gICAgY29uc3QgdG90YWxQb29sU29sID0gbGFtcG9ydHNUb1NvbCh0b3RhbFBvb2xMYW1wb3J0cyk7XG5cbiAgICBjb25zdCBvdXRjb21lczogUmFjZU91dGNvbWVbXSA9IG91dGNvbWVMYWJlbHMubWFwKChsYWJlbCwgaSkgPT4ge1xuICAgICAgY29uc3QgcG9vbFNvbCA9IGxhbXBvcnRzVG9Tb2wob3V0Y29tZVBvb2xzW2ldIHx8IDBuKTtcbiAgICAgIGNvbnN0IHBlcmNlbnQgPSB0b3RhbFBvb2xTb2wgPiAwID8gKHBvb2xTb2wgLyB0b3RhbFBvb2xTb2wpICogMTAwIDogMTAwIC8gb3V0Y29tZUxhYmVscy5sZW5ndGg7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBpbmRleDogaSxcbiAgICAgICAgbGFiZWwsXG4gICAgICAgIHBvb2xTb2w6IHJvdW5kNChwb29sU29sKSxcbiAgICAgICAgcGVyY2VudDogcm91bmQyKHBlcmNlbnQpLFxuICAgICAgfTtcbiAgICB9KTtcblxuICAgIC8vIEJldHRpbmcgb3BlbiBjaGVja1xuICAgIGNvbnN0IG5vdyA9IEJpZ0ludChNYXRoLmZsb29yKERhdGUubm93KCkgLyAxMDAwKSk7XG4gICAgY29uc3QgZnJlZXplVGltZSA9IGNsb3NpbmdUaW1lIC0gMzAwbjsgLy8gNSBtaW4gZnJlZXplXG4gICAgY29uc3QgaXNCZXR0aW5nT3BlbiA9IHN0YXR1c0NvZGUgPT09IDAgJiYgbm93IDwgZnJlZXplVGltZTtcblxuICAgIHJldHVybiB7XG4gICAgICBwdWJsaWNLZXk6IHB1YmtleS50b0Jhc2U1OCgpLFxuICAgICAgbWFya2V0SWQ6IG1hcmtldElkLnRvU3RyaW5nKCksXG4gICAgICBxdWVzdGlvbixcbiAgICAgIG91dGNvbWVzLFxuICAgICAgY2xvc2luZ1RpbWU6IG5ldyBEYXRlKE51bWJlcihjbG9zaW5nVGltZSkgKiAxMDAwKS50b0lTT1N0cmluZygpLFxuICAgICAgcmVzb2x1dGlvblRpbWU6IG5ldyBEYXRlKE51bWJlcihyZXNvbHV0aW9uVGltZSkgKiAxMDAwKS50b0lTT1N0cmluZygpLFxuICAgICAgc3RhdHVzOiBNQVJLRVRfU1RBVFVTX05BTUVTW3N0YXR1c0NvZGVdIHx8ICdVbmtub3duJyxcbiAgICAgIHN0YXR1c0NvZGUsXG4gICAgICB3aW5uaW5nT3V0Y29tZUluZGV4LFxuICAgICAgdG90YWxQb29sU29sOiByb3VuZDQodG90YWxQb29sU29sKSxcbiAgICAgIGxheWVyOiBNQVJLRVRfTEFZRVJfTkFNRVNbbGF5ZXJDb2RlXSB8fCAnVW5rbm93bicsXG4gICAgICBsYXllckNvZGUsXG4gICAgICBhY2Nlc3NHYXRlOiBhY2Nlc3NHYXRlQ29kZSA9PT0gMCA/ICdQdWJsaWMnIDogJ1doaXRlbGlzdCcsXG4gICAgICBjcmVhdG9yOiBjcmVhdG9yLnRvQmFzZTU4KCksXG4gICAgICBwbGF0Zm9ybUZlZUJwcyxcbiAgICAgIGlzQmV0dGluZ09wZW4sXG4gICAgfTtcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgY29uc29sZS5lcnJvcignRXJyb3IgZGVjb2RpbmcgcmFjZSBtYXJrZXQ6JywgZXJyKTtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxufVxuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8gUFVCTElDIEFQSVxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuLyoqXG4gKiBMaXN0IGFsbCByYWNlIG1hcmtldHNcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGxpc3RSYWNlTWFya2V0cyhzdGF0dXM/OiBzdHJpbmcpOiBQcm9taXNlPFJhY2VNYXJrZXRbXT4ge1xuICBjb25zdCBjb25uZWN0aW9uID0gbmV3IENvbm5lY3Rpb24oUlBDX0VORFBPSU5ULCAnY29uZmlybWVkJyk7XG5cbiAgY29uc3QgYWNjb3VudHMgPSBhd2FpdCBjb25uZWN0aW9uLmdldFByb2dyYW1BY2NvdW50cyhQUk9HUkFNX0lELCB7XG4gICAgZmlsdGVyczogW1xuICAgICAge1xuICAgICAgICBtZW1jbXA6IHtcbiAgICAgICAgICBvZmZzZXQ6IDAsXG4gICAgICAgICAgYnl0ZXM6IGJzNTguZW5jb2RlKERJU0NSSU1JTkFUT1JTLlJBQ0VfTUFSS0VUKSxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgXSxcbiAgfSk7XG5cbiAgY29uc3QgbWFya2V0czogUmFjZU1hcmtldFtdID0gW107XG5cbiAgZm9yIChjb25zdCB7IGFjY291bnQsIHB1YmtleSB9IG9mIGFjY291bnRzKSB7XG4gICAgY29uc3QgbWFya2V0ID0gZGVjb2RlUmFjZU1hcmtldChhY2NvdW50LmRhdGEgYXMgQnVmZmVyLCBwdWJrZXkpO1xuICAgIGlmIChtYXJrZXQpIHtcbiAgICAgIGlmICghc3RhdHVzIHx8IG1hcmtldC5zdGF0dXMudG9Mb3dlckNhc2UoKSA9PT0gc3RhdHVzLnRvTG93ZXJDYXNlKCkpIHtcbiAgICAgICAgbWFya2V0cy5wdXNoKG1hcmtldCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLy8gU29ydCBieSBjbG9zaW5nIHRpbWVcbiAgbWFya2V0cy5zb3J0KChhLCBiKSA9PiB7XG4gICAgaWYgKGEuc3RhdHVzID09PSAnQWN0aXZlJyAmJiBiLnN0YXR1cyAhPT0gJ0FjdGl2ZScpIHJldHVybiAtMTtcbiAgICBpZiAoYS5zdGF0dXMgIT09ICdBY3RpdmUnICYmIGIuc3RhdHVzID09PSAnQWN0aXZlJykgcmV0dXJuIDE7XG4gICAgcmV0dXJuIG5ldyBEYXRlKGEuY2xvc2luZ1RpbWUpLmdldFRpbWUoKSAtIG5ldyBEYXRlKGIuY2xvc2luZ1RpbWUpLmdldFRpbWUoKTtcbiAgfSk7XG5cbiAgcmV0dXJuIG1hcmtldHM7XG59XG5cbi8qKlxuICogR2V0IGEgc3BlY2lmaWMgcmFjZSBtYXJrZXRcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdldFJhY2VNYXJrZXQocHVibGljS2V5OiBzdHJpbmcpOiBQcm9taXNlPFJhY2VNYXJrZXQgfCBudWxsPiB7XG4gIGNvbnN0IGNvbm5lY3Rpb24gPSBuZXcgQ29ubmVjdGlvbihSUENfRU5EUE9JTlQsICdjb25maXJtZWQnKTtcblxuICB0cnkge1xuICAgIGNvbnN0IHB1YmtleSA9IG5ldyBQdWJsaWNLZXkocHVibGljS2V5KTtcbiAgICBjb25zdCBhY2NvdW50ID0gYXdhaXQgY29ubmVjdGlvbi5nZXRBY2NvdW50SW5mbyhwdWJrZXkpO1xuICAgIGlmICghYWNjb3VudCkgcmV0dXJuIG51bGw7XG4gICAgcmV0dXJuIGRlY29kZVJhY2VNYXJrZXQoYWNjb3VudC5kYXRhIGFzIEJ1ZmZlciwgcHVia2V5KTtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbn1cblxuLyoqXG4gKiBHZXQgcmFjZSBxdW90ZSBmb3IgYSBwb3RlbnRpYWwgYmV0XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRSYWNlUXVvdGUoXG4gIG1hcmtldDogUmFjZU1hcmtldCxcbiAgb3V0Y29tZUluZGV4OiBudW1iZXIsXG4gIGJldEFtb3VudFNvbDogbnVtYmVyXG4pOiB7XG4gIHZhbGlkOiBib29sZWFuO1xuICBlcnJvcj86IHN0cmluZztcbiAgb3V0Y29tZUxhYmVsOiBzdHJpbmc7XG4gIGJldEFtb3VudFNvbDogbnVtYmVyO1xuICBleHBlY3RlZFBheW91dFNvbDogbnVtYmVyO1xuICBpbXBsaWVkT2RkczogbnVtYmVyO1xuICBuZXdPdXRjb21lUGVyY2VudDogbnVtYmVyO1xufSB7XG4gIGlmIChvdXRjb21lSW5kZXggPCAwIHx8IG91dGNvbWVJbmRleCA+PSBtYXJrZXQub3V0Y29tZXMubGVuZ3RoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHZhbGlkOiBmYWxzZSxcbiAgICAgIGVycm9yOiBgSW52YWxpZCBvdXRjb21lIGluZGV4LiBNdXN0IGJlIDAtJHttYXJrZXQub3V0Y29tZXMubGVuZ3RoIC0gMX1gLFxuICAgICAgb3V0Y29tZUxhYmVsOiAnJyxcbiAgICAgIGJldEFtb3VudFNvbCxcbiAgICAgIGV4cGVjdGVkUGF5b3V0U29sOiAwLFxuICAgICAgaW1wbGllZE9kZHM6IDAsXG4gICAgICBuZXdPdXRjb21lUGVyY2VudDogMCxcbiAgICB9O1xuICB9XG5cbiAgY29uc3Qgb3V0Y29tZSA9IG1hcmtldC5vdXRjb21lc1tvdXRjb21lSW5kZXhdO1xuICBjb25zdCBjdXJyZW50UG9vbCA9IG91dGNvbWUucG9vbFNvbDtcbiAgY29uc3QgdG90YWxQb29sID0gbWFya2V0LnRvdGFsUG9vbFNvbDtcblxuICAvLyBOZXcgcG9vbHMgYWZ0ZXIgYmV0XG4gIGNvbnN0IG5ld091dGNvbWVQb29sID0gY3VycmVudFBvb2wgKyBiZXRBbW91bnRTb2w7XG4gIGNvbnN0IG5ld1RvdGFsUG9vbCA9IHRvdGFsUG9vbCArIGJldEFtb3VudFNvbDtcblxuICAvLyBTaGFyZSBvZiBvdXRjb21lIHBvb2xcbiAgY29uc3Qgc2hhcmUgPSBiZXRBbW91bnRTb2wgLyBuZXdPdXRjb21lUG9vbDtcbiAgY29uc3QgZ3Jvc3NQYXlvdXQgPSBzaGFyZSAqIG5ld1RvdGFsUG9vbDtcbiAgY29uc3QgcHJvZml0ID0gZ3Jvc3NQYXlvdXQgLSBiZXRBbW91bnRTb2w7XG4gIGNvbnN0IGZlZSA9IHByb2ZpdCA+IDAgPyAocHJvZml0ICogbWFya2V0LnBsYXRmb3JtRmVlQnBzKSAvIDEwMDAwIDogMDtcbiAgY29uc3QgZXhwZWN0ZWRQYXlvdXQgPSBncm9zc1BheW91dCAtIGZlZTtcblxuICAvLyBJbXBsaWVkIG9kZHNcbiAgY29uc3QgaW1wbGllZE9kZHMgPSBuZXdPdXRjb21lUG9vbCAvIG5ld1RvdGFsUG9vbCAqIDEwMDtcblxuICByZXR1cm4ge1xuICAgIHZhbGlkOiB0cnVlLFxuICAgIG91dGNvbWVMYWJlbDogb3V0Y29tZS5sYWJlbCxcbiAgICBiZXRBbW91bnRTb2wsXG4gICAgZXhwZWN0ZWRQYXlvdXRTb2w6IHJvdW5kNChleHBlY3RlZFBheW91dCksXG4gICAgaW1wbGllZE9kZHM6IHJvdW5kMihpbXBsaWVkT2RkcyksXG4gICAgbmV3T3V0Y29tZVBlcmNlbnQ6IHJvdW5kMigobmV3T3V0Y29tZVBvb2wgLyBuZXdUb3RhbFBvb2wpICogMTAwKSxcbiAgfTtcbn1cblxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIEhFTFBFUlNcbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbmZ1bmN0aW9uIHJvdW5kMihuOiBudW1iZXIpOiBudW1iZXIge1xuICByZXR1cm4gTWF0aC5yb3VuZChuICogMTAwKSAvIDEwMDtcbn1cblxuZnVuY3Rpb24gcm91bmQ0KG46IG51bWJlcik6IG51bWJlciB7XG4gIHJldHVybiBNYXRoLnJvdW5kKG4gKiAxMDAwMCkgLyAxMDAwMDtcbn1cbiJdfQ==
@@ -0,0 +1,43 @@
1
+ import { Market } from './markets.js';
2
+ export interface ResolutionStatus {
3
+ marketPda: string;
4
+ marketQuestion: string;
5
+ status: string;
6
+ isResolved: boolean;
7
+ winningOutcome: string | null;
8
+ proposedOutcome: string | null;
9
+ closingTime: string;
10
+ resolutionTime: string;
11
+ canBeResolved: boolean;
12
+ resolutionWindowOpen: boolean;
13
+ isDisputed: boolean;
14
+ disputeDeadline: string | null;
15
+ disputeReason: string | null;
16
+ councilSize: number;
17
+ councilVotesYes: number;
18
+ councilVotesNo: number;
19
+ councilThreshold: number;
20
+ resolutionMode: 'Creator' | 'Oracle' | 'Council' | 'Admin';
21
+ }
22
+ export interface DisputeMeta {
23
+ publicKey: string;
24
+ marketPda: string;
25
+ disputer: string;
26
+ reason: string;
27
+ proposedOutcome: boolean | null;
28
+ createdAt: string;
29
+ deadline: string;
30
+ resolved: boolean;
31
+ }
32
+ /**
33
+ * Get detailed resolution status for a market
34
+ */
35
+ export declare function getResolutionStatus(marketPda: string): Promise<ResolutionStatus | null>;
36
+ /**
37
+ * Get all disputed markets
38
+ */
39
+ export declare function getDisputedMarkets(): Promise<DisputeMeta[]>;
40
+ /**
41
+ * Get markets pending resolution (closed but not resolved)
42
+ */
43
+ export declare function getMarketsAwaitingResolution(): Promise<Market[]>;
@@ -0,0 +1,194 @@
1
+ /**
2
+ * Resolution Handler - Market Resolution Status & Disputes
3
+ */
4
+ import { Connection, PublicKey } from '@solana/web3.js';
5
+ import bs58 from 'bs58';
6
+ import { PROGRAM_ID, RPC_ENDPOINT, DISCRIMINATORS, SEEDS, } from '../config.js';
7
+ import { getMarket } from './markets.js';
8
+ // =============================================================================
9
+ // RESOLUTION STATUS
10
+ // =============================================================================
11
+ /**
12
+ * Get detailed resolution status for a market
13
+ */
14
+ export async function getResolutionStatus(marketPda) {
15
+ const market = await getMarket(marketPda);
16
+ if (!market)
17
+ return null;
18
+ const now = new Date();
19
+ const closingTime = new Date(market.closingTime);
20
+ const resolutionTime = new Date(market.resolutionTime);
21
+ // Check resolution window
22
+ const canBeResolved = now > closingTime && market.status === 'Closed';
23
+ const resolutionWindowOpen = now > closingTime && now < resolutionTime;
24
+ // Check dispute status
25
+ const disputeMeta = await getDisputeMeta(marketPda);
26
+ const isDisputed = disputeMeta !== null && !disputeMeta.resolved;
27
+ // Determine resolution mode from market data
28
+ let resolutionMode = 'Creator';
29
+ // This would need to be parsed from market data
30
+ return {
31
+ marketPda,
32
+ marketQuestion: market.question,
33
+ status: market.status,
34
+ isResolved: market.status === 'Resolved',
35
+ winningOutcome: market.winningOutcome,
36
+ proposedOutcome: null, // Would need to track proposed but not finalized
37
+ closingTime: market.closingTime,
38
+ resolutionTime: market.resolutionTime,
39
+ canBeResolved,
40
+ resolutionWindowOpen,
41
+ isDisputed,
42
+ disputeDeadline: disputeMeta?.deadline || null,
43
+ disputeReason: disputeMeta?.reason || null,
44
+ councilSize: 0, // Would parse from market
45
+ councilVotesYes: 0,
46
+ councilVotesNo: 0,
47
+ councilThreshold: 0,
48
+ resolutionMode,
49
+ };
50
+ }
51
+ /**
52
+ * Get dispute meta for a market (if exists)
53
+ */
54
+ async function getDisputeMeta(marketPda) {
55
+ const connection = new Connection(RPC_ENDPOINT, 'confirmed');
56
+ try {
57
+ const marketPubkey = new PublicKey(marketPda);
58
+ // Derive dispute_meta PDA
59
+ const [disputeMetaPda] = PublicKey.findProgramAddressSync([SEEDS.DISPUTE_META, marketPubkey.toBuffer()], PROGRAM_ID);
60
+ const account = await connection.getAccountInfo(disputeMetaPda);
61
+ if (!account)
62
+ return null;
63
+ // Decode DisputeMeta
64
+ // DisputeMeta struct:
65
+ // - discriminator (8)
66
+ // - market (Pubkey, 32)
67
+ // - disputer (Pubkey, 32)
68
+ // - reason (String: 4 + len)
69
+ // - proposed_outcome (Option<bool>: 1 + 0/1)
70
+ // - created_at (i64, 8)
71
+ // - deadline (i64, 8)
72
+ // - resolved (bool, 1)
73
+ const data = account.data;
74
+ let offset = 8;
75
+ const market = new PublicKey(data.slice(offset, offset + 32));
76
+ offset += 32;
77
+ const disputer = new PublicKey(data.slice(offset, offset + 32));
78
+ offset += 32;
79
+ const reasonLen = data.readUInt32LE(offset);
80
+ offset += 4;
81
+ const reason = data.slice(offset, offset + reasonLen).toString('utf8');
82
+ offset += reasonLen;
83
+ const hasProposedOutcome = data.readUInt8(offset);
84
+ offset += 1;
85
+ let proposedOutcome = null;
86
+ if (hasProposedOutcome === 1) {
87
+ proposedOutcome = data.readUInt8(offset) === 1;
88
+ offset += 1;
89
+ }
90
+ const createdAt = data.readBigInt64LE(offset);
91
+ offset += 8;
92
+ const deadline = data.readBigInt64LE(offset);
93
+ offset += 8;
94
+ const resolved = data.readUInt8(offset) === 1;
95
+ return {
96
+ publicKey: disputeMetaPda.toBase58(),
97
+ marketPda: market.toBase58(),
98
+ disputer: disputer.toBase58(),
99
+ reason,
100
+ proposedOutcome,
101
+ createdAt: new Date(Number(createdAt) * 1000).toISOString(),
102
+ deadline: new Date(Number(deadline) * 1000).toISOString(),
103
+ resolved,
104
+ };
105
+ }
106
+ catch {
107
+ return null;
108
+ }
109
+ }
110
+ /**
111
+ * Get all disputed markets
112
+ */
113
+ export async function getDisputedMarkets() {
114
+ const connection = new Connection(RPC_ENDPOINT, 'confirmed');
115
+ const accounts = await connection.getProgramAccounts(PROGRAM_ID, {
116
+ filters: [
117
+ {
118
+ memcmp: {
119
+ offset: 0,
120
+ bytes: bs58.encode(DISCRIMINATORS.DISPUTE_META),
121
+ },
122
+ },
123
+ ],
124
+ });
125
+ const disputes = [];
126
+ for (const { account, pubkey } of accounts) {
127
+ try {
128
+ const data = account.data;
129
+ let offset = 8;
130
+ const market = new PublicKey(data.slice(offset, offset + 32));
131
+ offset += 32;
132
+ const disputer = new PublicKey(data.slice(offset, offset + 32));
133
+ offset += 32;
134
+ const reasonLen = data.readUInt32LE(offset);
135
+ offset += 4;
136
+ const reason = data.slice(offset, offset + reasonLen).toString('utf8');
137
+ offset += reasonLen;
138
+ const hasProposedOutcome = data.readUInt8(offset);
139
+ offset += 1;
140
+ let proposedOutcome = null;
141
+ if (hasProposedOutcome === 1) {
142
+ proposedOutcome = data.readUInt8(offset) === 1;
143
+ offset += 1;
144
+ }
145
+ const createdAt = data.readBigInt64LE(offset);
146
+ offset += 8;
147
+ const deadline = data.readBigInt64LE(offset);
148
+ offset += 8;
149
+ const resolved = data.readUInt8(offset) === 1;
150
+ if (!resolved) {
151
+ disputes.push({
152
+ publicKey: pubkey.toBase58(),
153
+ marketPda: market.toBase58(),
154
+ disputer: disputer.toBase58(),
155
+ reason,
156
+ proposedOutcome,
157
+ createdAt: new Date(Number(createdAt) * 1000).toISOString(),
158
+ deadline: new Date(Number(deadline) * 1000).toISOString(),
159
+ resolved,
160
+ });
161
+ }
162
+ }
163
+ catch {
164
+ // Skip malformed
165
+ }
166
+ }
167
+ return disputes;
168
+ }
169
+ /**
170
+ * Get markets pending resolution (closed but not resolved)
171
+ */
172
+ export async function getMarketsAwaitingResolution() {
173
+ const connection = new Connection(RPC_ENDPOINT, 'confirmed');
174
+ // Get all markets with status = Closed (1)
175
+ const accounts = await connection.getProgramAccounts(PROGRAM_ID, {
176
+ filters: [
177
+ {
178
+ memcmp: {
179
+ offset: 0,
180
+ bytes: bs58.encode(DISCRIMINATORS.MARKET),
181
+ },
182
+ },
183
+ ],
184
+ });
185
+ const markets = [];
186
+ for (const { account, pubkey } of accounts) {
187
+ const market = await getMarket(pubkey.toBase58());
188
+ if (market && market.status === 'Closed') {
189
+ markets.push(market);
190
+ }
191
+ }
192
+ return markets;
193
+ }
194
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVzb2x1dGlvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9oYW5kbGVycy9yZXNvbHV0aW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOztHQUVHO0FBQ0gsT0FBTyxFQUFFLFVBQVUsRUFBRSxTQUFTLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUN4RCxPQUFPLElBQUksTUFBTSxNQUFNLENBQUM7QUFDeEIsT0FBTyxFQUNMLFVBQVUsRUFDVixZQUFZLEVBQ1osY0FBYyxFQUNkLEtBQUssR0FDTixNQUFNLGNBQWMsQ0FBQztBQUN0QixPQUFPLEVBQUUsU0FBUyxFQUFVLE1BQU0sY0FBYyxDQUFDO0FBZ0RqRCxnRkFBZ0Y7QUFDaEYsb0JBQW9CO0FBQ3BCLGdGQUFnRjtBQUVoRjs7R0FFRztBQUNILE1BQU0sQ0FBQyxLQUFLLFVBQVUsbUJBQW1CLENBQUMsU0FBaUI7SUFDekQsTUFBTSxNQUFNLEdBQUcsTUFBTSxTQUFTLENBQUMsU0FBUyxDQUFDLENBQUM7SUFDMUMsSUFBSSxDQUFDLE1BQU07UUFBRSxPQUFPLElBQUksQ0FBQztJQUV6QixNQUFNLEdBQUcsR0FBRyxJQUFJLElBQUksRUFBRSxDQUFDO0lBQ3ZCLE1BQU0sV0FBVyxHQUFHLElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxXQUFXLENBQUMsQ0FBQztJQUNqRCxNQUFNLGNBQWMsR0FBRyxJQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsY0FBYyxDQUFDLENBQUM7SUFFdkQsMEJBQTBCO0lBQzFCLE1BQU0sYUFBYSxHQUFHLEdBQUcsR0FBRyxXQUFXLElBQUksTUFBTSxDQUFDLE1BQU0sS0FBSyxRQUFRLENBQUM7SUFDdEUsTUFBTSxvQkFBb0IsR0FBRyxHQUFHLEdBQUcsV0FBVyxJQUFJLEdBQUcsR0FBRyxjQUFjLENBQUM7SUFFdkUsdUJBQXVCO0lBQ3ZCLE1BQU0sV0FBVyxHQUFHLE1BQU0sY0FBYyxDQUFDLFNBQVMsQ0FBQyxDQUFDO0lBQ3BELE1BQU0s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QyxZQUFZLEVBQUUsV0FBVyxDQUFDLENBQUM7SUFFN0QsMkNBQTJDO0lBQzNDLE1BQU0sUUFBUSxHQUFHLE1BQU0sVUFBVSxDQUFDLGtCQUFrQixDQUFDLFVBQVUsRUFBRTtRQUMvRCxPQUFPLEVBQUU7WUFDUDtnQkFDRSxNQUFNLEVBQUU7b0JBQ04sTUFBTSxFQUFFLENBQUM7b0JBQ1QsS0FBSyxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsY0FBYyxDQUFDLE1BQU0sQ0FBQztpQkFDMUM7YUFDRjtTQUNGO0tBQ0YsQ0FBQyxDQUFDO0lBRUgsTUFBTSxPQUFPLEdBQWEsRUFBRSxDQUFDO0lBRTdCLEtBQUssTUFBTSxFQUFFLE9BQU8sRUFBRSxNQUFNLEVBQUUsSUFBSSxRQUFRLEVBQUUsQ0FBQztRQUMzQyxNQUFNLE1BQU0sR0FBRyxNQUFNLFNBQVMsQ0FBQyxNQUFNLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQztRQUNsRCxJQUFJLE1BQU0sSUFBSSxNQUFNLENBQUMsTUFBTSxLQUFLLFFBQVEsRUFBRSxDQUFDO1lBQ3pDLE9BQU8sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDdkIsQ0FBQztJQUNILENBQUM7SUFFRCxPQUFPLE9BQU8sQ0FBQztBQUNqQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBSZXNvbHV0aW9uIEhhbmRsZXIgLSBNYXJrZXQgUmVzb2x1dGlvbiBTdGF0dXMgJiBEaXNwdXRlc1xuICovXG5pbXBvcnQgeyBDb25uZWN0aW9uLCBQdWJsaWNLZXkgfSBmcm9tICdAc29sYW5hL3dlYjMuanMnO1xuaW1wb3J0IGJzNTggZnJvbSAnYnM1OCc7XG5pbXBvcnQge1xuICBQUk9HUkFNX0lELFxuICBSUENfRU5EUE9JTlQsXG4gIERJU0NSSU1JTkFUT1JTLFxuICBTRUVEUyxcbn0gZnJvbSAnLi4vY29uZmlnLmpzJztcbmltcG9ydCB7IGdldE1hcmtldCwgTWFya2V0IH0gZnJvbSAnLi9tYXJrZXRzLmpzJztcblxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIFRZUEVTXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG5leHBvcnQgaW50ZXJmYWNlIFJlc29sdXRpb25TdGF0dXMge1xuICBtYXJrZXRQZGE6IHN0cmluZztcbiAgbWFya2V0UXVlc3Rpb246IHN0cmluZztcbiAgc3RhdHVzOiBzdHJpbmc7XG5cbiAgLy8gUmVzb2x1dGlvbiBzdGF0ZVxuICBpc1Jlc29sdmVkOiBib29sZWFuO1xuICB3aW5uaW5nT3V0Y29tZTogc3RyaW5nIHwgbnVsbDtcbiAgcHJvcG9zZWRPdXRjb21lOiBzdHJpbmcgfCBudWxsO1xuXG4gIC8vIFRpbWluZ1xuICBjbG9zaW5nVGltZTogc3RyaW5nO1xuICByZXNvbHV0aW9uVGltZTogc3RyaW5nO1xuICBjYW5CZVJlc29sdmVkOiBib29sZWFuO1xuICByZXNvbHV0aW9uV2luZG93T3BlbjogYm9vbGVhbjtcblxuICAvLyBEaXNwdXRlIHN0YXRlXG4gIGlzRGlzcHV0ZWQ6IGJvb2xlYW47XG4gIGRpc3B1dGVEZWFkbGluZTogc3RyaW5nIHwgbnVsbDtcbiAgZGlzcHV0ZVJlYXNvbjogc3RyaW5nIHwgbnVsbDtcblxuICAvLyBDb3VuY2lsIHZvdGluZyAoaWYgZGlzcHV0ZWQpXG4gIGNvdW5jaWxTaXplOiBudW1iZXI7XG4gIGNvdW5jaWxWb3Rlc1llczogbnVtYmVyO1xuICBjb3VuY2lsVm90ZXNObzogbnVtYmVyO1xuICBjb3VuY2lsVGhyZXNob2xkOiBudW1iZXI7XG5cbiAgLy8gUmVzb2x1dGlvbiBtb2RlXG4gIHJlc29sdXRpb25Nb2RlOiAnQ3JlYXRvcicgfCAnT3JhY2xlJyB8ICdDb3VuY2lsJyB8ICdBZG1pbic7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRGlzcHV0ZU1ldGEge1xuICBwdWJsaWNLZXk6IHN0cmluZztcbiAgbWFya2V0UGRhOiBzdHJpbmc7XG4gIGRpc3B1dGVyOiBzdHJpbmc7XG4gIHJlYXNvbjogc3RyaW5nO1xuICBwcm9wb3NlZE91dGNvbWU6IGJvb2xlYW4gfCBudWxsO1xuICBjcmVhdGVkQXQ6IHN0cmluZztcbiAgZGVhZGxpbmU6IHN0cmluZztcbiAgcmVzb2x2ZWQ6IGJvb2xlYW47XG59XG5cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBSRVNPTFVUSU9OIFNUQVRVU1xuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuLyoqXG4gKiBHZXQgZGV0YWlsZWQgcmVzb2x1dGlvbiBzdGF0dXMgZm9yIGEgbWFya2V0XG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZXRSZXNvbHV0aW9uU3RhdHVzKG1hcmtldFBkYTogc3RyaW5nKTogUHJvbWlzZTxSZXNvbHV0aW9uU3RhdHVzIHwgbnVsbD4ge1xuICBjb25zdCBtYXJrZXQgPSBhd2FpdCBnZXRNYXJrZXQobWFya2V0UGRhKTtcbiAgaWYgKCFtYXJrZXQpIHJldHVybiBudWxsO1xuXG4gIGNvbnN0IG5vdyA9IG5ldyBEYXRlKCk7XG4gIGNvbnN0IGNsb3NpbmdUaW1lID0gbmV3IERhdGUobWFya2V0LmNsb3NpbmdUaW1lKTtcbiAgY29uc3QgcmVzb2x1dGlvblRpbWUgPSBuZXcgRGF0ZShtYXJrZXQucmVzb2x1dGlvblRpbWUpO1xuXG4gIC8vIENoZWNrIHJlc29sdXRpb24gd2luZG93XG4gIGNvbnN0IGNhbkJlUmVzb2x2ZWQgPSBub3cgPiBjbG9zaW5nVGltZSAmJiBtYXJrZXQuc3RhdHVzID09PSAnQ2xvc2VkJztcbiAgY29uc3QgcmVzb2x1dGlvbldpbmRvd09wZW4gPSBub3cgPiBjbG9zaW5nVGltZSAmJiBub3cgPCByZXNvbHV0aW9uVGltZTtcblxuICAvLyBDaGVjayBkaXNwdXRlIHN0YXR1c1xuICBjb25zdCBkaXNwdXRlTWV0YSA9IGF3YWl0IGdldERpc3B1dGVNZXRhKG1hcmtldFBkYSk7XG4gIGNvbnN0IGlzRGlzcHV0ZWQgPSBkaXNwdXRlTWV0YSAhPT0gbnVsbCAmJiAhZGlzcHV0ZU1ldGEucmVzb2x2ZWQ7XG5cbiAgLy8gRGV0ZXJtaW5lIHJlc29sdXRpb24gbW9kZSBmcm9tIG1hcmtldCBkYXRhXG4gIGxldCByZXNvbHV0aW9uTW9kZTogJ0NyZWF0b3InIHwgJ09yYWNsZScgfCAnQ291bmNpbCcgfCAnQWRtaW4nID0gJ0NyZWF0b3InO1xuICAvLyBUaGlzIHdvdWxkIG5lZWQgdG8gYmUgcGFyc2VkIGZyb20gbWFya2V0IGRhdGFcblxuICByZXR1cm4ge1xuICAgIG1hcmtldFBkYSxcbiAgICBtYXJrZXRRdWVzdGlvbjogbWFya2V0LnF1ZXN0aW9uLFxuICAgIHN0YXR1czogbWFya2V0LnN0YXR1cyxcblxuICAgIGlzUmVzb2x2ZWQ6IG1hcmtldC5zdGF0dXMgPT09ICdSZXNvbHZlZCcsXG4gICAgd2lubmluZ091dGNvbWU6IG1hcmtldC53aW5uaW5nT3V0Y29tZSxcbiAgICBwcm9wb3NlZE91dGNvbWU6IG51bGwsIC8vIFdvdWxkIG5lZWQgdG8gdHJhY2sgcHJvcG9zZWQgYnV0IG5vdCBmaW5hbGl6ZWRcblxuICAgIGNsb3NpbmdUaW1lOiBtYXJrZXQuY2xvc2luZ1RpbWUsXG4gICAgcmVzb2x1dGlvblRpbWU6IG1hcmtldC5yZXNvbHV0aW9uVGltZSxcbiAgICBjYW5CZVJlc29sdmVkLFxuICAgIHJlc29sdXRpb25XaW5kb3dPcGVuLFxuXG4gICAgaXNEaXNwdXRlZCxcbiAgICBkaXNwdXRlRGVhZGxpbmU6IGRpc3B1dGVNZXRhPy5kZWFkbGluZSB8fCBudWxsLFxuICAgIGRpc3B1dGVSZWFzb246IGRpc3B1dGVNZXRhPy5yZWFzb24gfHwgbnVsbCxcblxuICAgIGNvdW5jaWxTaXplOiAwLCAvLyBXb3VsZCBwYXJzZSBmcm9tIG1hcmtldFxuICAgIGNvdW5jaWxWb3Rlc1llczogMCxcbiAgICBjb3VuY2lsVm90ZXNObzogMCxcbiAgICBjb3VuY2lsVGhyZXNob2xkOiAwLFxuXG4gICAgcmVzb2x1dGlvbk1vZGUsXG4gIH07XG59XG5cbi8qKlxuICogR2V0IGRpc3B1dGUgbWV0YSBmb3IgYSBtYXJrZXQgKGlmIGV4aXN0cylcbiAqL1xuYXN5bmMgZnVuY3Rpb24gZ2V0RGlzcHV0ZU1ldGEobWFya2V0UGRhOiBzdHJpbmcpOiBQcm9taXNlPERpc3B1dGVNZXRhIHwgbnVsbD4ge1xuICBjb25zdCBjb25uZWN0aW9uID0gbmV3IENvbm5lY3Rpb24oUlBDX0VORFBPSU5ULCAnY29uZmlybWVkJyk7XG5cbiAgdHJ5IHtcbiAgICBjb25zdCBtYXJrZXRQdWJrZXkgPSBuZXcgUHVibGljS2V5KG1hcmtldFBkYSk7XG5cbiAgICAvLyBEZXJpdmUgZGlzcHV0ZV9tZXRhIFBEQVxuICAgIGNvbnN0IFtkaXNwdXRlTWV0YVBkYV0gPSBQdWJsaWNLZXkuZmluZFByb2dyYW1BZGRyZXNzU3luYyhcbiAgICAgIFtTRUVEUy5ESVNQVVRFX01FVEEsIG1hcmtldFB1YmtleS50b0J1ZmZlcigpXSxcbiAgICAgIFBST0dSQU1fSURcbiAgICApO1xuXG4gICAgY29uc3QgYWNjb3VudCA9IGF3YWl0IGNvbm5lY3Rpb24uZ2V0QWNjb3VudEluZm8oZGlzcHV0ZU1ldGFQZGEpO1xuICAgIGlmICghYWNjb3VudCkgcmV0dXJuIG51bGw7XG5cbiAgICAvLyBEZWNvZGUgRGlzcHV0ZU1ldGFcbiAgICAvLyBEaXNwdXRlTWV0YSBzdHJ1Y3Q6XG4gICAgLy8gLSBkaXNjcmltaW5hdG9yICg4KVxuICAgIC8vIC0gbWFya2V0IChQdWJrZXksIDMyKVxuICAgIC8vIC0gZGlzcHV0ZXIgKFB1YmtleSwgMzIpXG4gICAgLy8gLSByZWFzb24gKFN0cmluZzogNCArIGxlbilcbiAgICAvLyAtIHByb3Bvc2VkX291dGNvbWUgKE9wdGlvbjxib29sPjogMSArIDAvMSlcbiAgICAvLyAtIGNyZWF0ZWRfYXQgKGk2NCwgOClcbiAgICAvLyAtIGRlYWRsaW5lIChpNjQsIDgpXG4gICAgLy8gLSByZXNvbHZlZCAoYm9vbCwgMSlcblxuICAgIGNvbnN0IGRhdGEgPSBhY2NvdW50LmRhdGEgYXMgQnVmZmVyO1xuICAgIGxldCBvZmZzZXQgPSA4O1xuXG4gICAgY29uc3QgbWFya2V0ID0gbmV3IFB1YmxpY0tleShkYXRhLnNsaWNlKG9mZnNldCwgb2Zmc2V0ICsgMzIpKTtcbiAgICBvZmZzZXQgKz0gMzI7XG5cbiAgICBjb25zdCBkaXNwdXRlciA9IG5ldyBQdWJsaWNLZXkoZGF0YS5zbGljZShvZmZzZXQsIG9mZnNldCArIDMyKSk7XG4gICAgb2Zmc2V0ICs9IDMyO1xuXG4gICAgY29uc3QgcmVhc29uTGVuID0gZGF0YS5yZWFkVUludDMyTEUob2Zmc2V0KTtcbiAgICBvZmZzZXQgKz0gNDtcbiAgICBjb25zdCByZWFzb24gPSBkYXRhLnNsaWNlKG9mZnNldCwgb2Zmc2V0ICsgcmVhc29uTGVuKS50b1N0cmluZygndXRmOCcpO1xuICAgIG9mZnNldCArPSByZWFzb25MZW47XG5cbiAgICBjb25zdCBoYXNQcm9wb3NlZE91dGNvbWUgPSBkYXRhLnJlYWRVSW50OChvZmZzZXQpO1xuICAgIG9mZnNldCArPSAxO1xuICAgIGxldCBwcm9wb3NlZE91dGNvbWU6IGJvb2xlYW4gfCBudWxsID0gbnVsbDtcbiAgICBpZiAoaGFzUHJvcG9zZWRPdXRjb21lID09PSAxKSB7XG4gICAgICBwcm9wb3NlZE91dGNvbWUgPSBkYXRhLnJlYWRVSW50OChvZmZzZXQpID09PSAxO1xuICAgICAgb2Zmc2V0ICs9IDE7XG4gICAgfVxuXG4gICAgY29uc3QgY3JlYXRlZEF0ID0gZGF0YS5yZWFkQmlnSW50NjRMRShvZmZzZXQpO1xuICAgIG9mZnNldCArPSA4O1xuXG4gICAgY29uc3QgZGVhZGxpbmUgPSBkYXRhLnJlYWRCaWdJbnQ2NExFKG9mZnNldCk7XG4gICAgb2Zmc2V0ICs9IDg7XG5cbiAgICBjb25zdCByZXNvbHZlZCA9IGRhdGEucmVhZFVJbnQ4KG9mZnNldCkgPT09IDE7XG5cbiAgICByZXR1cm4ge1xuICAgICAgcHVibGljS2V5OiBkaXNwdXRlTWV0YVBkYS50b0Jhc2U1OCgpLFxuICAgICAgbWFya2V0UGRhOiBtYXJrZXQudG9CYXNlNTgoKSxcbiAgICAgIGRpc3B1dGVyOiBkaXNwdXRlci50b0Jhc2U1OCgpLFxuICAgICAgcmVhc29uLFxuICAgICAgcHJvcG9zZWRPdXRjb21lLFxuICAgICAgY3JlYXRlZEF0OiBuZXcgRGF0ZShOdW1iZXIoY3JlYXRlZEF0KSAqIDEwMDApLnRvSVNPU3RyaW5nKCksXG4gICAgICBkZWFkbGluZTogbmV3IERhdGUoTnVtYmVyKGRlYWRsaW5lKSAqIDEwMDApLnRvSVNPU3RyaW5nKCksXG4gICAgICByZXNvbHZlZCxcbiAgICB9O1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxufVxuXG4vKipcbiAqIEdldCBhbGwgZGlzcHV0ZWQgbWFya2V0c1xuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0RGlzcHV0ZWRNYXJrZXRzKCk6IFByb21pc2U8RGlzcHV0ZU1ldGFbXT4ge1xuICBjb25zdCBjb25uZWN0aW9uID0gbmV3IENvbm5lY3Rpb24oUlBDX0VORFBPSU5ULCAnY29uZmlybWVkJyk7XG5cbiAgY29uc3QgYWNjb3VudHMgPSBhd2FpdCBjb25uZWN0aW9uLmdldFByb2dyYW1BY2NvdW50cyhQUk9HUkFNX0lELCB7XG4gICAgZmlsdGVyczogW1xuICAgICAge1xuICAgICAgICBtZW1jbXA6IHtcbiAgICAgICAgICBvZmZzZXQ6IDAsXG4gICAgICAgICAgYnl0ZXM6IGJzNTguZW5jb2RlKERJU0NSSU1JTkFUT1JTLkRJU1BVVEVfTUVUQSksXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgIF0sXG4gIH0pO1xuXG4gIGNvbnN0IGRpc3B1dGVzOiBEaXNwdXRlTWV0YVtdID0gW107XG5cbiAgZm9yIChjb25zdCB7IGFjY291bnQsIHB1YmtleSB9IG9mIGFjY291bnRzKSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGRhdGEgPSBhY2NvdW50LmRhdGEgYXMgQnVmZmVyO1xuICAgICAgbGV0IG9mZnNldCA9IDg7XG5cbiAgICAgIGNvbnN0IG1hcmtldCA9IG5ldyBQdWJsaWNLZXkoZGF0YS5zbGljZShvZmZzZXQsIG9mZnNldCArIDMyKSk7XG4gICAgICBvZmZzZXQgKz0gMzI7XG5cbiAgICAgIGNvbnN0IGRpc3B1dGVyID0gbmV3IFB1YmxpY0tleShkYXRhLnNsaWNlKG9mZnNldCwgb2Zmc2V0ICsgMzIpKTtcbiAgICAgIG9mZnNldCArPSAzMjtcblxuICAgICAgY29uc3QgcmVhc29uTGVuID0gZGF0YS5yZWFkVUludDMyTEUob2Zmc2V0KTtcbiAgICAgIG9mZnNldCArPSA0O1xuICAgICAgY29uc3QgcmVhc29uID0gZGF0YS5zbGljZShvZmZzZXQsIG9mZnNldCArIHJlYXNvbkxlbikudG9TdHJpbmcoJ3V0ZjgnKTtcbiAgICAgIG9mZnNldCArPSByZWFzb25MZW47XG5cbiAgICAgIGNvbnN0IGhhc1Byb3Bvc2VkT3V0Y29tZSA9IGRhdGEucmVhZFVJbnQ4KG9mZnNldCk7XG4gICAgICBvZmZzZXQgKz0gMTtcbiAgICAgIGxldCBwcm9wb3NlZE91dGNvbWU6IGJvb2xlYW4gfCBudWxsID0gbnVsbDtcbiAgICAgIGlmIChoYXNQcm9wb3NlZE91dGNvbWUgPT09IDEpIHtcbiAgICAgICAgcHJvcG9zZWRPdXRjb21lID0gZGF0YS5yZWFkVUludDgob2Zmc2V0KSA9PT0gMTtcbiAgICAgICAgb2Zmc2V0ICs9IDE7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGNyZWF0ZWRBdCA9IGRhdGEucmVhZEJpZ0ludDY0TEUob2Zmc2V0KTtcbiAgICAgIG9mZnNldCArPSA4O1xuXG4gICAgICBjb25zdCBkZWFkbGluZSA9IGRhdGEucmVhZEJpZ0ludDY0TEUob2Zmc2V0KTtcbiAgICAgIG9mZnNldCArPSA4O1xuXG4gICAgICBjb25zdCByZXNvbHZlZCA9IGRhdGEucmVhZFVJbnQ4KG9mZnNldCkgPT09IDE7XG5cbiAgICAgIGlmICghcmVzb2x2ZWQpIHtcbiAgICAgICAgZGlzcHV0ZXMucHVzaCh7XG4gICAgICAgICAgcHVibGljS2V5OiBwdWJrZXkudG9CYXNlNTgoKSxcbiAgICAgICAgICBtYXJrZXRQZGE6IG1hcmtldC50b0Jhc2U1OCgpLFxuICAgICAgICAgIGRpc3B1dGVyOiBkaXNwdXRlci50b0Jhc2U1OCgpLFxuICAgICAgICAgIHJlYXNvbixcbiAgICAgICAgICBwcm9wb3NlZE91dGNvbWUsXG4gICAgICAgICAgY3JlYXRlZEF0OiBuZXcgRGF0ZShOdW1iZXIoY3JlYXRlZEF0KSAqIDEwMDApLnRvSVNPU3RyaW5nKCksXG4gICAgICAgICAgZGVhZGxpbmU6IG5ldyBEYXRlKE51bWJlcihkZWFkbGluZSkgKiAxMDAwKS50b0lTT1N0cmluZygpLFxuICAgICAgICAgIHJlc29sdmVkLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIFNraXAgbWFsZm9ybWVkXG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGRpc3B1dGVzO1xufVxuXG4vKipcbiAqIEdldCBtYXJrZXRzIHBlbmRpbmcgcmVzb2x1dGlvbiAoY2xvc2VkIGJ1dCBub3QgcmVzb2x2ZWQpXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZXRNYXJrZXRzQXdhaXRpbmdSZXNvbHV0aW9uKCk6IFByb21pc2U8TWFya2V0W10+IHtcbiAgY29uc3QgY29ubmVjdGlvbiA9IG5ldyBDb25uZWN0aW9uKFJQQ19FTkRQT0lOVCwgJ2NvbmZpcm1lZCcpO1xuXG4gIC8vIEdldCBhbGwgbWFya2V0cyB3aXRoIHN0YXR1cyA9IENsb3NlZCAoMSlcbiAgY29uc3QgYWNjb3VudHMgPSBhd2FpdCBjb25uZWN0aW9uLmdldFByb2dyYW1BY2NvdW50cyhQUk9HUkFNX0lELCB7XG4gICAgZmlsdGVyczogW1xuICAgICAge1xuICAgICAgICBtZW1jbXA6IHtcbiAgICAgICAgICBvZmZzZXQ6IDAsXG4gICAgICAgICAgYnl0ZXM6IGJzNTguZW5jb2RlKERJU0NSSU1JTkFUT1JTLk1BUktFVCksXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgIF0sXG4gIH0pO1xuXG4gIGNvbnN0IG1hcmtldHM6IE1hcmtldFtdID0gW107XG5cbiAgZm9yIChjb25zdCB7IGFjY291bnQsIHB1YmtleSB9IG9mIGFjY291bnRzKSB7XG4gICAgY29uc3QgbWFya2V0ID0gYXdhaXQgZ2V0TWFya2V0KHB1YmtleS50b0Jhc2U1OCgpKTtcbiAgICBpZiAobWFya2V0ICYmIG1hcmtldC5zdGF0dXMgPT09ICdDbG9zZWQnKSB7XG4gICAgICBtYXJrZXRzLnB1c2gobWFya2V0KTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gbWFya2V0cztcbn1cbiJdfQ==
@@ -0,0 +1,2 @@
1
+ #!/usr/bin/env node
2
+ export {};