@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,362 @@
1
+ /**
2
+ * Market Creation Transaction Builders
3
+ *
4
+ * Builds unsigned transactions for:
5
+ * - create_lab_market_sol (community markets)
6
+ * - create_private_table_sol (invite-only markets)
7
+ * - create_race_market_sol (multi-outcome markets)
8
+ *
9
+ * FIXED: Jan 2026 - Corrected discriminators, offsets, and instruction formats
10
+ */
11
+ import { Connection, PublicKey, Transaction, TransactionInstruction, SystemProgram, } from '@solana/web3.js';
12
+ import { PROGRAM_ID, CONFIG_PDA, SOL_TREASURY_PDA, SEEDS, RPC_ENDPOINT, } from '../config.js';
13
+ // =============================================================================
14
+ // INSTRUCTION DISCRIMINATORS (sha256("global:<name>")[0..8])
15
+ // =============================================================================
16
+ const CREATE_LAB_MARKET_SOL_DISCRIMINATOR = Buffer.from([35, 159, 50, 67, 31, 134, 199, 157]);
17
+ const CREATE_PRIVATE_TABLE_SOL_DISCRIMINATOR = Buffer.from([242, 241, 183, 108, 35, 183, 38, 241]);
18
+ const CREATE_RACE_MARKET_SOL_DISCRIMINATOR = Buffer.from([94, 237, 40, 47, 63, 233, 25, 67]);
19
+ // =============================================================================
20
+ // GLOBAL CONFIG OFFSETS (calculated from IDL struct layout)
21
+ // =============================================================================
22
+ // GlobalConfig struct layout:
23
+ // discriminator (8) + admin (32) + treasury (32) + guardian (32) +
24
+ // _reserved_usdc_mint (32) + _reserved_creation_fee_usdc (8) + creation_fee_sol (8) +
25
+ // _reserved_market_bond_usdc (8) + market_bond_sol (8) + platform_fee_bps (2) + market_count (8)
26
+ const MARKET_COUNT_OFFSET = 8 + 32 + 32 + 32 + 32 + 8 + 8 + 8 + 8 + 2; // = 170
27
+ // =============================================================================
28
+ // PDA DERIVATION
29
+ // =============================================================================
30
+ function deriveMarketPda(marketId) {
31
+ const marketIdBuffer = Buffer.alloc(8);
32
+ marketIdBuffer.writeBigUInt64LE(marketId);
33
+ return PublicKey.findProgramAddressSync([SEEDS.MARKET, marketIdBuffer], PROGRAM_ID);
34
+ }
35
+ function deriveRaceMarketPda(marketId) {
36
+ const marketIdBuffer = Buffer.alloc(8);
37
+ marketIdBuffer.writeBigUInt64LE(marketId);
38
+ return PublicKey.findProgramAddressSync([SEEDS.RACE, marketIdBuffer], PROGRAM_ID);
39
+ }
40
+ function deriveWhitelistPda(marketId) {
41
+ const marketIdBuffer = Buffer.alloc(8);
42
+ marketIdBuffer.writeBigUInt64LE(marketId);
43
+ return PublicKey.findProgramAddressSync([SEEDS.WHITELIST, marketIdBuffer], PROGRAM_ID);
44
+ }
45
+ function deriveCreatorProfilePda(creator) {
46
+ return PublicKey.findProgramAddressSync([Buffer.from('creator_profile'), creator.toBuffer()], PROGRAM_ID);
47
+ }
48
+ // =============================================================================
49
+ // GET MARKET COUNT FROM CONFIG
50
+ // =============================================================================
51
+ export async function getNextMarketId(connection) {
52
+ const conn = connection || new Connection(RPC_ENDPOINT, 'confirmed');
53
+ try {
54
+ const configAccount = await conn.getAccountInfo(CONFIG_PDA);
55
+ if (!configAccount) {
56
+ throw new Error('GlobalConfig not found');
57
+ }
58
+ const data = configAccount.data;
59
+ // market_count at offset 170 (verified against on-chain data)
60
+ const marketCount = data.readBigUInt64LE(MARKET_COUNT_OFFSET);
61
+ // Both regular and race markets use the SAME counter
62
+ // The program uses the CURRENT value (not +1) for PDA derivation
63
+ return {
64
+ marketId: marketCount,
65
+ raceMarketId: marketCount,
66
+ };
67
+ }
68
+ catch (err) {
69
+ // If we can't read config, return safe defaults
70
+ return { marketId: 0n, raceMarketId: 0n };
71
+ }
72
+ }
73
+ // =============================================================================
74
+ // BUILD CREATE LAB MARKET TRANSACTION
75
+ // =============================================================================
76
+ export async function buildCreateLabMarketTransaction(params, connection) {
77
+ const conn = connection || new Connection(RPC_ENDPOINT, 'confirmed');
78
+ const creatorPubkey = new PublicKey(params.creatorWallet);
79
+ // Get current market count for PDA derivation
80
+ const { marketId } = await getNextMarketId(conn);
81
+ const [marketPda] = deriveMarketPda(marketId);
82
+ const [creatorProfilePda] = deriveCreatorProfilePda(creatorPubkey);
83
+ // Check if creator profile exists
84
+ const creatorProfileInfo = await conn.getAccountInfo(creatorProfilePda);
85
+ const hasCreatorProfile = creatorProfileInfo !== null;
86
+ // Set defaults
87
+ const closingTime = BigInt(Math.floor(params.closingTime.getTime() / 1000));
88
+ const resolutionBuffer = BigInt(params.resolutionBuffer ?? 43200); // 12 hours
89
+ const autoStopBuffer = BigInt(params.autoStopBuffer ?? 300); // 5 minutes
90
+ const resolutionMode = params.resolutionMode ?? 1; // CouncilOracle by default
91
+ // For CouncilOracle, creator is default council member
92
+ const council = params.council?.map(p => new PublicKey(p)) ??
93
+ (resolutionMode === 1 ? [creatorPubkey] : []);
94
+ const councilThreshold = params.councilThreshold ?? (council.length > 0 ? 1 : 0);
95
+ // Encode instruction data:
96
+ // discriminator (8) + question (4+len) + closing_time (8) + resolution_buffer (8) +
97
+ // auto_stop_buffer (8) + resolution_mode (1) + council (4+n*32) + council_threshold (1)
98
+ const questionBytes = Buffer.from(params.question, 'utf8');
99
+ const size = 8 + 4 + questionBytes.length + 8 + 8 + 8 + 1 + 4 + (council.length * 32) + 1;
100
+ const data = Buffer.alloc(size);
101
+ let offset = 0;
102
+ CREATE_LAB_MARKET_SOL_DISCRIMINATOR.copy(data, offset);
103
+ offset += 8;
104
+ data.writeUInt32LE(questionBytes.length, offset);
105
+ offset += 4;
106
+ questionBytes.copy(data, offset);
107
+ offset += questionBytes.length;
108
+ data.writeBigInt64LE(closingTime, offset);
109
+ offset += 8;
110
+ data.writeBigInt64LE(resolutionBuffer, offset);
111
+ offset += 8;
112
+ data.writeBigInt64LE(autoStopBuffer, offset);
113
+ offset += 8;
114
+ data.writeUInt8(resolutionMode, offset);
115
+ offset += 1;
116
+ data.writeUInt32LE(council.length, offset);
117
+ offset += 4;
118
+ for (const member of council) {
119
+ member.toBuffer().copy(data, offset);
120
+ offset += 32;
121
+ }
122
+ data.writeUInt8(councilThreshold, offset);
123
+ // Accounts from IDL:
124
+ // config (PDA), market (PDA), treasury, creator (signer), creator_profile (optional), system_program
125
+ const keys = [
126
+ { pubkey: CONFIG_PDA, isSigner: false, isWritable: true },
127
+ { pubkey: marketPda, isSigner: false, isWritable: true },
128
+ { pubkey: SOL_TREASURY_PDA, isSigner: false, isWritable: true },
129
+ { pubkey: creatorPubkey, isSigner: true, isWritable: true },
130
+ // For optional accounts, pass PROGRAM_ID as placeholder if not present
131
+ { pubkey: hasCreatorProfile ? creatorProfilePda : PROGRAM_ID, isSigner: false, isWritable: hasCreatorProfile },
132
+ { pubkey: SystemProgram.programId, isSigner: false, isWritable: false },
133
+ ];
134
+ const instruction = new TransactionInstruction({
135
+ programId: PROGRAM_ID,
136
+ keys,
137
+ data,
138
+ });
139
+ const transaction = new Transaction();
140
+ transaction.add(instruction);
141
+ const { blockhash } = await conn.getLatestBlockhash('finalized');
142
+ transaction.recentBlockhash = blockhash;
143
+ transaction.feePayer = creatorPubkey;
144
+ const serializedTx = transaction.serialize({
145
+ requireAllSignatures: false,
146
+ verifySignatures: false,
147
+ }).toString('base64');
148
+ return {
149
+ transaction,
150
+ serializedTx,
151
+ marketPda: marketPda.toBase58(),
152
+ marketId,
153
+ };
154
+ }
155
+ // =============================================================================
156
+ // BUILD CREATE PRIVATE MARKET TRANSACTION
157
+ // =============================================================================
158
+ export async function buildCreatePrivateMarketTransaction(params, connection) {
159
+ const conn = connection || new Connection(RPC_ENDPOINT, 'confirmed');
160
+ const creatorPubkey = new PublicKey(params.creatorWallet);
161
+ const { marketId } = await getNextMarketId(conn);
162
+ const [marketPda] = deriveMarketPda(marketId);
163
+ const [whitelistPda] = deriveWhitelistPda(marketId);
164
+ const [creatorProfilePda] = deriveCreatorProfilePda(creatorPubkey);
165
+ const creatorProfileInfo = await conn.getAccountInfo(creatorProfilePda);
166
+ const hasCreatorProfile = creatorProfileInfo !== null;
167
+ const closingTime = BigInt(Math.floor(params.closingTime.getTime() / 1000));
168
+ const resolutionBuffer = BigInt(params.resolutionBuffer ?? 43200);
169
+ const autoStopBuffer = BigInt(params.autoStopBuffer ?? 300);
170
+ const resolutionMode = params.resolutionMode ?? 0; // HostOracle for private
171
+ const council = params.council?.map(p => new PublicKey(p)) ?? [];
172
+ const councilThreshold = params.councilThreshold ?? 0;
173
+ // Same instruction format as Lab market
174
+ const questionBytes = Buffer.from(params.question, 'utf8');
175
+ const size = 8 + 4 + questionBytes.length + 8 + 8 + 8 + 1 + 4 + (council.length * 32) + 1;
176
+ const data = Buffer.alloc(size);
177
+ let offset = 0;
178
+ CREATE_PRIVATE_TABLE_SOL_DISCRIMINATOR.copy(data, offset);
179
+ offset += 8;
180
+ data.writeUInt32LE(questionBytes.length, offset);
181
+ offset += 4;
182
+ questionBytes.copy(data, offset);
183
+ offset += questionBytes.length;
184
+ data.writeBigInt64LE(closingTime, offset);
185
+ offset += 8;
186
+ data.writeBigInt64LE(resolutionBuffer, offset);
187
+ offset += 8;
188
+ data.writeBigInt64LE(autoStopBuffer, offset);
189
+ offset += 8;
190
+ data.writeUInt8(resolutionMode, offset);
191
+ offset += 1;
192
+ data.writeUInt32LE(council.length, offset);
193
+ offset += 4;
194
+ for (const member of council) {
195
+ member.toBuffer().copy(data, offset);
196
+ offset += 32;
197
+ }
198
+ data.writeUInt8(councilThreshold, offset);
199
+ // Private market accounts include whitelist PDA
200
+ const keys = [
201
+ { pubkey: CONFIG_PDA, isSigner: false, isWritable: true },
202
+ { pubkey: marketPda, isSigner: false, isWritable: true },
203
+ { pubkey: whitelistPda, isSigner: false, isWritable: true },
204
+ { pubkey: SOL_TREASURY_PDA, isSigner: false, isWritable: true },
205
+ { pubkey: creatorPubkey, isSigner: true, isWritable: true },
206
+ { pubkey: hasCreatorProfile ? creatorProfilePda : PROGRAM_ID, isSigner: false, isWritable: hasCreatorProfile },
207
+ { pubkey: SystemProgram.programId, isSigner: false, isWritable: false },
208
+ ];
209
+ const instruction = new TransactionInstruction({
210
+ programId: PROGRAM_ID,
211
+ keys,
212
+ data,
213
+ });
214
+ const transaction = new Transaction();
215
+ transaction.add(instruction);
216
+ const { blockhash } = await conn.getLatestBlockhash('finalized');
217
+ transaction.recentBlockhash = blockhash;
218
+ transaction.feePayer = creatorPubkey;
219
+ const serializedTx = transaction.serialize({
220
+ requireAllSignatures: false,
221
+ verifySignatures: false,
222
+ }).toString('base64');
223
+ return {
224
+ transaction,
225
+ serializedTx,
226
+ marketPda: marketPda.toBase58(),
227
+ marketId,
228
+ };
229
+ }
230
+ // =============================================================================
231
+ // BUILD CREATE RACE MARKET TRANSACTION
232
+ // =============================================================================
233
+ export async function buildCreateRaceMarketTransaction(params, connection) {
234
+ const conn = connection || new Connection(RPC_ENDPOINT, 'confirmed');
235
+ const creatorPubkey = new PublicKey(params.creatorWallet);
236
+ const { raceMarketId } = await getNextMarketId(conn);
237
+ const [raceMarketPda] = deriveRaceMarketPda(raceMarketId);
238
+ const [creatorProfilePda] = deriveCreatorProfilePda(creatorPubkey);
239
+ const creatorProfileInfo = await conn.getAccountInfo(creatorProfilePda);
240
+ const hasCreatorProfile = creatorProfileInfo !== null;
241
+ const closingTime = BigInt(Math.floor(params.closingTime.getTime() / 1000));
242
+ const resolutionBuffer = BigInt(params.resolutionBuffer ?? 43200);
243
+ const autoStopBuffer = BigInt(params.autoStopBuffer ?? 300);
244
+ const layer = params.layer ?? 1; // Lab by default
245
+ const resolutionMode = params.resolutionMode ?? 1; // CouncilOracle
246
+ const accessGate = params.accessGate ?? 0; // Public
247
+ // Council is Option<Vec<Pubkey>> - encode as 1 (Some) + vec or 0 (None)
248
+ const hasCouncil = params.council && params.council.length > 0;
249
+ const council = hasCouncil ? params.council.map(p => new PublicKey(p)) : [];
250
+ // council_threshold is Option<u8>
251
+ const hasThreshold = params.councilThreshold !== undefined;
252
+ const councilThreshold = params.councilThreshold ?? 0;
253
+ // Encode instruction data:
254
+ // discriminator (8) + question (4+len) + outcome_labels (4 + n*(4+len)) +
255
+ // closing_time (8) + resolution_buffer (8) + auto_stop_buffer (8) +
256
+ // layer (1) + resolution_mode (1) + access_gate (1) +
257
+ // council (1 + 4 + n*32 or just 1) + council_threshold (1 + 1 or just 1)
258
+ const questionBytes = Buffer.from(params.question, 'utf8');
259
+ const outcomeBuffers = params.outcomes.map(o => Buffer.from(o, 'utf8'));
260
+ let outcomesSize = 4; // vec length
261
+ for (const buf of outcomeBuffers) {
262
+ outcomesSize += 4 + buf.length;
263
+ }
264
+ const councilSize = hasCouncil ? (1 + 4 + council.length * 32) : 1;
265
+ const thresholdSize = hasThreshold ? 2 : 1;
266
+ const size = 8 + 4 + questionBytes.length + outcomesSize + 8 + 8 + 8 + 1 + 1 + 1 + councilSize + thresholdSize;
267
+ const data = Buffer.alloc(size);
268
+ let offset = 0;
269
+ CREATE_RACE_MARKET_SOL_DISCRIMINATOR.copy(data, offset);
270
+ offset += 8;
271
+ data.writeUInt32LE(questionBytes.length, offset);
272
+ offset += 4;
273
+ questionBytes.copy(data, offset);
274
+ offset += questionBytes.length;
275
+ data.writeUInt32LE(params.outcomes.length, offset);
276
+ offset += 4;
277
+ for (const buf of outcomeBuffers) {
278
+ data.writeUInt32LE(buf.length, offset);
279
+ offset += 4;
280
+ buf.copy(data, offset);
281
+ offset += buf.length;
282
+ }
283
+ data.writeBigInt64LE(closingTime, offset);
284
+ offset += 8;
285
+ data.writeBigInt64LE(resolutionBuffer, offset);
286
+ offset += 8;
287
+ data.writeBigInt64LE(autoStopBuffer, offset);
288
+ offset += 8;
289
+ data.writeUInt8(layer, offset);
290
+ offset += 1;
291
+ data.writeUInt8(resolutionMode, offset);
292
+ offset += 1;
293
+ data.writeUInt8(accessGate, offset);
294
+ offset += 1;
295
+ // Option<Vec<Pubkey>> - 1 (Some) + vec or 0 (None)
296
+ if (hasCouncil) {
297
+ data.writeUInt8(1, offset);
298
+ offset += 1;
299
+ data.writeUInt32LE(council.length, offset);
300
+ offset += 4;
301
+ for (const member of council) {
302
+ member.toBuffer().copy(data, offset);
303
+ offset += 32;
304
+ }
305
+ }
306
+ else {
307
+ data.writeUInt8(0, offset);
308
+ offset += 1;
309
+ }
310
+ // Option<u8> - 1 (Some) + value or 0 (None)
311
+ if (hasThreshold) {
312
+ data.writeUInt8(1, offset);
313
+ offset += 1;
314
+ data.writeUInt8(councilThreshold, offset);
315
+ offset += 1;
316
+ }
317
+ else {
318
+ data.writeUInt8(0, offset);
319
+ offset += 1;
320
+ }
321
+ // Accounts: config, race_market, creator_profile (optional), treasury, creator, system_program
322
+ const keys = [
323
+ { pubkey: CONFIG_PDA, isSigner: false, isWritable: true },
324
+ { pubkey: raceMarketPda, isSigner: false, isWritable: true },
325
+ { pubkey: hasCreatorProfile ? creatorProfilePda : PROGRAM_ID, isSigner: false, isWritable: hasCreatorProfile },
326
+ { pubkey: SOL_TREASURY_PDA, isSigner: false, isWritable: true },
327
+ { pubkey: creatorPubkey, isSigner: true, isWritable: true },
328
+ { pubkey: SystemProgram.programId, isSigner: false, isWritable: false },
329
+ ];
330
+ const instruction = new TransactionInstruction({
331
+ programId: PROGRAM_ID,
332
+ keys,
333
+ data,
334
+ });
335
+ const transaction = new Transaction();
336
+ transaction.add(instruction);
337
+ const { blockhash } = await conn.getLatestBlockhash('finalized');
338
+ transaction.recentBlockhash = blockhash;
339
+ transaction.feePayer = creatorPubkey;
340
+ const serializedTx = transaction.serialize({
341
+ requireAllSignatures: false,
342
+ verifySignatures: false,
343
+ }).toString('base64');
344
+ return {
345
+ transaction,
346
+ serializedTx,
347
+ marketPda: raceMarketPda.toBase58(),
348
+ marketId: raceMarketId,
349
+ };
350
+ }
351
+ // =============================================================================
352
+ // HELPER: DERIVE PDA PREVIEW
353
+ // =============================================================================
354
+ export function previewMarketPda(marketId) {
355
+ const [pda, bump] = deriveMarketPda(marketId);
356
+ return { marketPda: pda.toBase58(), bump };
357
+ }
358
+ export function previewRaceMarketPda(marketId) {
359
+ const [pda, bump] = deriveRaceMarketPda(marketId);
360
+ return { raceMarketPda: pda.toBase58(), bump };
361
+ }
362
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWFya2V0LWNyZWF0aW9uLXR4LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2J1aWxkZXJzL21hcmtldC1jcmVhdGlvbi10eC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7O0dBU0c7QUFDSCxPQUFPLEVBQ0wsVUFBVSxFQUNWLFNBQVMsRUFDVCxXQUFXLEVBQ1gsc0JBQXNCLEVBQ3RCLGFBQWEsR0FDZCxNQUFNLGlCQUFpQixDQUFDO0FBQ3pCLE9BQU8sRUFDTCxVQUFVLEVBQ1YsVUFBVSxFQUNWLGdCQUFnQixFQUNoQixLQUFLLEVBQ0wsWUFBWSxHQUNiLE1BQU0sY0FBYyxDQUFDO0FBRXRCLGdGQUFnRjtBQUNoRiw2REFBNkQ7QUFDN0QsZ0ZBQWdGO0FBRWhGLE1BQU0sbUNBQW1DLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUUsRUFBRSxHQUFHLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDO0FBQzlGLE1BQU0sc0NBQXNDLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxFQUFFLEVBQUUsR0FBRyxFQUFFLEVBQUUsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDO0FBQ25HLE1BQU0sb0NBQW9DLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUUsRUFBRSxHQUFHLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsR0FBRyxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDO0FBRTdGLGdGQUFnRjtBQUNoRiw0REFBNEQ7QUFDNUQsZ0ZBQWdGO0FBRWhGLDhCQUE4QjtBQUM5QixtRUFBbUU7QUFDbkUsc0ZBQXNGO0FBQ3RGLGlHQUFpRztBQUNqRyxNQUFNLG1CQUFtQixHQUFHLENBQUMsR0FB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QUE2QjtBQUM3QixnRkFBZ0Y7QUFFaEYsTUFBTSxVQUFVLGdCQUFnQixDQUFDLFFBQWdCO0lBSS9DLE1BQU0sQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLEdBQUcsZUFBZSxDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQzlDLE9BQU8sRUFBRSxTQUFTLEVBQUUsR0FBRyxDQUFDLFFBQVEsRUFBRSxFQUFFLElBQUksRUFBRSxDQUFDO0FBQzdDLENBQUM7QUFFRCxNQUFNLFVBQVUsb0JBQW9CLENBQUMsUUFBZ0I7SUFJbkQsTUFBTSxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsR0FBRyxtQkFBbUIsQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUNsRCxPQUFPLEVBQUUsYUFBYSxFQUFFLEdBQUcsQ0FBQyxRQUFRLEVBQUUsRUFBRSxJQUFJLEVBQUUsQ0FBQztBQUNqRCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBNYXJrZXQgQ3JlYXRpb24gVHJhbnNhY3Rpb24gQnVpbGRlcnNcbiAqXG4gKiBCdWlsZHMgdW5zaWduZWQgdHJhbnNhY3Rpb25zIGZvcjpcbiAqIC0gY3JlYXRlX2xhYl9tYXJrZXRfc29sIChjb21tdW5pdHkgbWFya2V0cylcbiAqIC0gY3JlYXRlX3ByaXZhdGVfdGFibGVfc29sIChpbnZpdGUtb25seSBtYXJrZXRzKVxuICogLSBjcmVhdGVfcmFjZV9tYXJrZXRfc29sIChtdWx0aS1vdXRjb21lIG1hcmtldHMpXG4gKlxuICogRklYRUQ6IEphbiAyMDI2IC0gQ29ycmVjdGVkIGRpc2NyaW1pbmF0b3JzLCBvZmZzZXRzLCBhbmQgaW5zdHJ1Y3Rpb24gZm9ybWF0c1xuICovXG5pbXBvcnQge1xuICBDb25uZWN0aW9uLFxuICBQdWJsaWNLZXksXG4gIFRyYW5zYWN0aW9uLFxuICBUcmFuc2FjdGlvbkluc3RydWN0aW9uLFxuICBTeXN0ZW1Qcm9ncmFtLFxufSBmcm9tICdAc29sYW5hL3dlYjMuanMnO1xuaW1wb3J0IHtcbiAgUFJPR1JBTV9JRCxcbiAgQ09ORklHX1BEQSxcbiAgU09MX1RSRUFTVVJZX1BEQSxcbiAgU0VFRFMsXG4gIFJQQ19FTkRQT0lOVCxcbn0gZnJvbSAnLi4vY29uZmlnLmpzJztcblxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIElOU1RSVUNUSU9OIERJU0NSSU1JTkFUT1JTIChzaGEyNTYoXCJnbG9iYWw6PG5hbWU+XCIpWzAuLjhdKVxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuY29uc3QgQ1JFQVRFX0xBQl9NQVJLRVRfU09MX0RJU0NSSU1JTkFUT1IgPSBCdWZmZXIuZnJvbShbMzUsIDE1OSwgNTAsIDY3LCAzMSwgMTM0LCAxOTksIDE1N10pO1xuY29uc3QgQ1JFQVRFX1BSSVZBVEVfVEFCTEVfU09MX0RJU0NSSU1JTkFUT1IgPSBCdWZmZXIuZnJvbShbMjQyLCAyNDEsIDE4MywgMTA4LCAzNSwgMTgzLCAzOCwgMjQxXSk7XG5jb25zdCBDUkVBVEVfUkFDRV9NQVJLRVRfU09MX0RJU0NSSU1JTkFUT1IgPSBCdWZmZXIuZnJvbShbOTQsIDIzNywgNDAsIDQ3LCA2MywgMjMzLCAyNSwgNjddKTtcblxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIEdMT0JBTCBDT05GSUcgT0ZGU0VUUyAoY2FsY3VsYXRlZCBmcm9tIElETCBzdHJ1Y3QgbGF5b3V0KVxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuLy8gR2xvYmFsQ29uZmlnIHN0cnVjdCBsYXlvdXQ6XG4vLyBkaXNjcmltaW5hdG9yICg4KSArIGFkbWluICgzMikgKyB0cmVhc3VyeSAoMzIpICsgZ3VhcmRpYW4gKDMyKSArXG4vLyBfcmVzZXJ2ZWRfdXNkY19taW50ICgzMikgKyBfcmVzZXJ2ZWRfY3JlYXRpb25fZmVlX3VzZGMgKDgpICsgY3JlYXRpb25fZmVlX3NvbCAoOCkgK1xuLy8gX3Jlc2VydmVkX21hcmtldF9ib25kX3VzZGMgKDgpICsgbWFya2V0X2JvbmRfc29sICg4KSArIHBsYXRmb3JtX2ZlZV9icHMgKDIpICsgbWFya2V0X2NvdW50ICg4KVxuY29uc3QgTUFSS0VUX0NPVU5UX09GRlNFVCA9IDggKyAzMiArIDMyICsgMzIgKyAzMiArIDggKyA4ICsgOCArIDggKyAyOyAvLyA9IDE3MFxuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8gVFlQRVNcbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ3JlYXRlTWFya2V0UmVzdWx0IHtcbiAgdHJhbnNhY3Rpb246IFRyYW5zYWN0aW9uO1xuICBzZXJpYWxpemVkVHg6IHN0cmluZztcbiAgbWFya2V0UGRhOiBzdHJpbmc7XG4gIG1hcmtldElkOiBiaWdpbnQ7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ3JlYXRlTGFiTWFya2V0UGFyYW1zIHtcbiAgcXVlc3Rpb246IHN0cmluZztcbiAgY2xvc2luZ1RpbWU6IERhdGU7XG4gIHJlc29sdXRpb25CdWZmZXI/OiBudW1iZXI7ICAgIC8vIHNlY29uZHMgYWZ0ZXIgY2xvc2luZyBiZWZvcmUgcmVzb2x1dGlvbiAoZGVmYXVsdDogNDMyMDAgPSAxMmgpXG4gIGF1dG9TdG9wQnVmZmVyPzogbnVtYmVyOyAgICAgIC8vIHNlY29uZHMgYmVmb3JlIGNsb3NpbmcgdG8gc3RvcCBiZXR0aW5nIChkZWZhdWx0OiAzMDAgPSA1bWluKVxuICByZXNvbHV0aW9uTW9kZT86IG51bWJlcjsgICAgICAvLyAwPUhvc3RPcmFjbGUsIDE9Q291bmNpbE9yYWNsZSAoZGVmYXVsdDogMSlcbiAgY291bmNpbD86IHN0cmluZ1tdOyAgICAgICAgICAgLy8gY291bmNpbCBtZW1iZXIgcHVia2V5cyAocmVxdWlyZWQgaWYgcmVzb2x1dGlvbk1vZGU9MSlcbiAgY291bmNpbFRocmVzaG9sZD86IG51bWJlcjsgICAgLy8gdm90ZXMgbmVlZGVkIChyZXF1aXJlZCBpZiByZXNvbHV0aW9uTW9kZT0xKVxuICBjcmVhdG9yV2FsbGV0OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ3JlYXRlUHJpdmF0ZU1hcmtldFBhcmFtcyB7XG4gIHF1ZXN0aW9uOiBzdHJpbmc7XG4gIGNsb3NpbmdUaW1lOiBEYXRlO1xuICByZXNvbHV0aW9uQnVmZmVyPzogbnVtYmVyO1xuICBhdXRvU3RvcEJ1ZmZlcj86IG51bWJlcjtcbiAgcmVzb2x1dGlvbk1vZGU/OiBudW1iZXI7XG4gIGNvdW5jaWw/OiBzdHJpbmdbXTtcbiAgY291bmNpbFRocmVzaG9sZD86IG51bWJlcjtcbiAgY3JlYXRvcldhbGxldDogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIENyZWF0ZVJhY2VNYXJrZXRQYXJhbXMge1xuICBxdWVzdGlvbjogc3RyaW5nO1xuICBvdXRjb21lczogc3RyaW5nW107ICAgICAgICAgICAvLyAyLTEwIG91dGNvbWUgbGFiZWxzXG4gIGNsb3NpbmdUaW1lOiBEYXRlO1xuICByZXNvbHV0aW9uQnVmZmVyPzogbnVtYmVyO1xuICBhdXRvU3RvcEJ1ZmZlcj86IG51bWJlcjtcbiAgbGF5ZXI/OiBudW1iZXI7ICAgICAgICAgICAgICAgLy8gMT1MYWIsIDI9UHJpdmF0ZSAoZGVmYXVsdDogMSlcbiAgcmVzb2x1dGlvbk1vZGU/OiBudW1iZXI7ICAgICAgLy8gMD1Ib3N0T3JhY2xlLCAxPUNvdW5jaWxPcmFjbGVcbiAgYWNjZXNzR2F0ZT86IG51bWJlcjsgICAgICAgICAgLy8gMD1QdWJsaWMsIDE9V2hpdGVsaXN0XG4gIGNvdW5jaWw/OiBzdHJpbmdbXTtcbiAgY291bmNpbFRocmVzaG9sZD86IG51bWJlcjtcbiAgY3JlYXRvcldhbGxldDogc3RyaW5nO1xufVxuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8gUERBIERFUklWQVRJT05cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbmZ1bmN0aW9uIGRlcml2ZU1hcmtldFBkYShtYXJrZXRJZDogYmlnaW50KTogW1B1YmxpY0tleSwgbnVtYmVyXSB7XG4gIGNvbnN0IG1hcmtldElkQnVmZmVyID0gQnVmZmVyLmFsbG9jKDgpO1xuICBtYXJrZXRJZEJ1ZmZlci53cml0ZUJpZ1VJbnQ2NExFKG1hcmtldElkKTtcbiAgcmV0dXJuIFB1YmxpY0tleS5maW5kUHJvZ3JhbUFkZHJlc3NTeW5jKFxuICAgIFtTRUVEUy5NQVJLRVQsIG1hcmtldElkQnVmZmVyXSxcbiAgICBQUk9HUkFNX0lEXG4gICk7XG59XG5cbmZ1bmN0aW9uIGRlcml2ZVJhY2VNYXJrZXRQZGEobWFya2V0SWQ6IGJpZ2ludCk6IFtQdWJsaWNLZXksIG51bWJlcl0ge1xuICBjb25zdCBtYXJrZXRJZEJ1ZmZlciA9IEJ1ZmZlci5hbGxvYyg4KTtcbiAgbWFya2V0SWRCdWZmZXIud3JpdGVCaWdVSW50NjRMRShtYXJrZXRJZCk7XG4gIHJldHVybiBQdWJsaWNLZXkuZmluZFByb2dyYW1BZGRyZXNzU3luYyhcbiAgICBbU0VFRFMuUkFDRSwgbWFya2V0SWRCdWZmZXJdLFxuICAgIFBST0dSQU1fSURcbiAgKTtcbn1cblxuZnVuY3Rpb24gZGVyaXZlV2hpdGVsaXN0UGRhKG1hcmtldElkOiBiaWdpbnQpOiBbUHVibGljS2V5LCBudW1iZXJdIHtcbiAgY29uc3QgbWFya2V0SWRCdWZmZXIgPSBCdWZmZXIuYWxsb2MoOCk7XG4gIG1hcmtldElkQnVmZmVyLndyaXRlQmlnVUludDY0TEUobWFya2V0SWQpO1xuICByZXR1cm4gUHVibGljS2V5LmZpbmRQcm9ncmFtQWRkcmVzc1N5bmMoXG4gICAgW1NFRURTLldISVRFTElTVCwgbWFya2V0SWRCdWZmZXJdLFxuICAgIFBST0dSQU1fSURcbiAgKTtcbn1cblxuZnVuY3Rpb24gZGVyaXZlQ3JlYXRvclByb2ZpbGVQZGEoY3JlYXRvcjogUHVibGljS2V5KTogW1B1YmxpY0tleSwgbnVtYmVyXSB7XG4gIHJldHVybiBQdWJsaWNLZXkuZmluZFByb2dyYW1BZGRyZXNzU3luYyhcbiAgICBbQnVmZmVyLmZyb20oJ2NyZWF0b3JfcHJvZmlsZScpLCBjcmVhdG9yLnRvQnVmZmVyKCldLFxuICAgIFBST0dSQU1fSURcbiAgKTtcbn1cblxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIEdFVCBNQVJLRVQgQ09VTlQgRlJPTSBDT05GSUdcbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZXROZXh0TWFya2V0SWQoXG4gIGNvbm5lY3Rpb24/OiBDb25uZWN0aW9uXG4pOiBQcm9taXNlPHsgbWFya2V0SWQ6IGJpZ2ludDsgcmFjZU1hcmtldElkOiBiaWdpbnQgfT4ge1xuICBjb25zdCBjb25uID0gY29ubmVjdGlvbiB8fCBuZXcgQ29ubmVjdGlvbihSUENfRU5EUE9JTlQsICdjb25maXJtZWQnKTtcblxuICB0cnkge1xuICAgIGNvbnN0IGNvbmZpZ0FjY291bnQgPSBhd2FpdCBjb25uLmdldEFjY291bnRJbmZvKENPTkZJR19QREEpO1xuICAgIGlmICghY29uZmlnQWNjb3VudCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdHbG9iYWxDb25maWcgbm90IGZvdW5kJyk7XG4gICAgfVxuXG4gICAgY29uc3QgZGF0YSA9IGNvbmZpZ0FjY291bnQuZGF0YTtcbiAgICAvLyBtYXJrZXRfY291bnQgYXQgb2Zmc2V0IDE3MCAodmVyaWZpZWQgYWdhaW5zdCBvbi1jaGFpbiBkYXRhKVxuICAgIGNvbnN0IG1hcmtldENvdW50ID0gZGF0YS5yZWFkQmlnVUludDY0TEUoTUFSS0VUX0NPVU5UX09GRlNFVCk7XG5cbiAgICAvLyBCb3RoIHJlZ3VsYXIgYW5kIHJhY2UgbWFya2V0cyB1c2UgdGhlIFNBTUUgY291bnRlclxuICAgIC8vIFRoZSBwcm9ncmFtIHVzZXMgdGhlIENVUlJFTlQgdmFsdWUgKG5vdCArMSkgZm9yIFBEQSBkZXJpdmF0aW9uXG4gICAgcmV0dXJuIHtcbiAgICAgIG1hcmtldElkOiBtYXJrZXRDb3VudCxcbiAgICAgIHJhY2VNYXJrZXRJZDogbWFya2V0Q291bnQsXG4gICAgfTtcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgLy8gSWYgd2UgY2FuJ3QgcmVhZCBjb25maWcsIHJldHVybiBzYWZlIGRlZmF1bHRzXG4gICAgcmV0dXJuIHsgbWFya2V0SWQ6IDBuLCByYWNlTWFya2V0SWQ6IDBuIH07XG4gIH1cbn1cblxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIEJVSUxEIENSRUFURSBMQUIgTUFSS0VUIFRSQU5TQUNUSU9OXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gYnVpbGRDcmVhdGVMYWJNYXJrZXRUcmFuc2FjdGlvbihcbiAgcGFyYW1zOiBDcmVhdGVMYWJNYXJrZXRQYXJhbXMsXG4gIGNvbm5lY3Rpb24/OiBDb25uZWN0aW9uXG4pOiBQcm9taXNlPENyZWF0ZU1hcmtldFJlc3VsdD4ge1xuICBjb25zdCBjb25uID0gY29ubmVjdGlvbiB8fCBuZXcgQ29ubmVjdGlvbihSUENfRU5EUE9JTlQsICdjb25maXJtZWQnKTtcbiAgY29uc3QgY3JlYXRvclB1YmtleSA9IG5ldyBQdWJsaWNLZXkocGFyYW1zLmNyZWF0b3JXYWxsZXQpO1xuXG4gIC8vIEdldCBjdXJyZW50IG1hcmtldCBjb3VudCBmb3IgUERBIGRlcml2YXRpb25cbiAgY29uc3QgeyBtYXJrZXRJZCB9ID0gYXdhaXQgZ2V0TmV4dE1hcmtldElkKGNvbm4pO1xuICBjb25zdCBbbWFya2V0UGRhXSA9IGRlcml2ZU1hcmtldFBkYShtYXJrZXRJZCk7XG4gIGNvbnN0IFtjcmVhdG9yUHJvZmlsZVBkYV0gPSBkZXJpdmVDcmVhdG9yUHJvZmlsZVBkYShjcmVhdG9yUHVia2V5KTtcblxuICAvLyBDaGVjayBpZiBjcmVhdG9yIHByb2ZpbGUgZXhpc3RzXG4gIGNvbnN0IGNyZWF0b3JQcm9maWxlSW5mbyA9IGF3YWl0IGNvbm4uZ2V0QWNjb3VudEluZm8oY3JlYXRvclByb2ZpbGVQZGEpO1xuICBjb25zdCBoYXNDcmVhdG9yUHJvZmlsZSA9IGNyZWF0b3JQcm9maWxlSW5mbyAhPT0gbnVsbDtcblxuICAvLyBTZXQgZGVmYXVsdHNcbiAgY29uc3QgY2xvc2luZ1RpbWUgPSBCaWdJbnQoTWF0aC5mbG9vcihwYXJhbXMuY2xvc2luZ1RpbWUuZ2V0VGltZSgpIC8gMTAwMCkpO1xuICBjb25zdCByZXNvbHV0aW9uQnVmZmVyID0gQmlnSW50KHBhcmFtcy5yZXNvbHV0aW9uQnVmZmVyID8/IDQzMjAwKTsgLy8gMTIgaG91cnNcbiAgY29uc3QgYXV0b1N0b3BCdWZmZXIgPSBCaWdJbnQocGFyYW1zLmF1dG9TdG9wQnVmZmVyID8/IDMwMCk7IC8vIDUgbWludXRlc1xuICBjb25zdCByZXNvbHV0aW9uTW9kZSA9IHBhcmFtcy5yZXNvbHV0aW9uTW9kZSA/PyAxOyAvLyBDb3VuY2lsT3JhY2xlIGJ5IGRlZmF1bHRcblxuICAvLyBGb3IgQ291bmNpbE9yYWNsZSwgY3JlYXRvciBpcyBkZWZhdWx0IGNvdW5jaWwgbWVtYmVyXG4gIGNvbnN0IGNvdW5jaWwgPSBwYXJhbXMuY291bmNpbD8ubWFwKHAgPT4gbmV3IFB1YmxpY0tleShwKSkgPz9cbiAgICAocmVzb2x1dGlvbk1vZGUgPT09IDEgPyBbY3JlYXRvclB1YmtleV0gOiBbXSk7XG4gIGNvbnN0IGNvdW5jaWxUaHJlc2hvbGQgPSBwYXJhbXMuY291bmNpbFRocmVzaG9sZCA/PyAoY291bmNpbC5sZW5ndGggPiAwID8gMSA6IDApO1xuXG4gIC8vIEVuY29kZSBpbnN0cnVjdGlvbiBkYXRhOlxuICAvLyBkaXNjcmltaW5hdG9yICg4KSArIHF1ZXN0aW9uICg0K2xlbikgKyBjbG9zaW5nX3RpbWUgKDgpICsgcmVzb2x1dGlvbl9idWZmZXIgKDgpICtcbiAgLy8gYXV0b19zdG9wX2J1ZmZlciAoOCkgKyByZXNvbHV0aW9uX21vZGUgKDEpICsgY291bmNpbCAoNCtuKjMyKSArIGNvdW5jaWxfdGhyZXNob2xkICgxKVxuICBjb25zdCBxdWVzdGlvbkJ5dGVzID0gQnVmZmVyLmZyb20ocGFyYW1zLnF1ZXN0aW9uLCAndXRmOCcpO1xuICBjb25zdCBzaXplID0gOCArIDQgKyBxdWVzdGlvbkJ5dGVzLmxlbmd0aCArIDggKyA4ICsgOCArIDEgKyA0ICsgKGNvdW5jaWwubGVuZ3RoICogMzIpICsgMTtcblxuICBjb25zdCBkYXRhID0gQnVmZmVyLmFsbG9jKHNpemUpO1xuICBsZXQgb2Zmc2V0ID0gMDtcblxuICBDUkVBVEVfTEFCX01BUktFVF9TT0xfRElTQ1JJTUlOQVRPUi5jb3B5KGRhdGEsIG9mZnNldCk7IG9mZnNldCArPSA4O1xuICBkYXRhLndyaXRlVUludDMyTEUocXVlc3Rpb25CeXRlcy5sZW5ndGgsIG9mZnNldCk7IG9mZnNldCArPSA0O1xuICBxdWVzdGlvbkJ5dGVzLmNvcHkoZGF0YSwgb2Zmc2V0KTsgb2Zmc2V0ICs9IHF1ZXN0aW9uQnl0ZXMubGVuZ3RoO1xuICBkYXRhLndyaXRlQmlnSW50NjRMRShjbG9zaW5nVGltZSwgb2Zmc2V0KTsgb2Zmc2V0ICs9IDg7XG4gIGRhdGEud3JpdGVCaWdJbnQ2NExFKHJlc29sdXRpb25CdWZmZXIsIG9mZnNldCk7IG9mZnNldCArPSA4O1xuICBkYXRhLndyaXRlQmlnSW50NjRMRShhdXRvU3RvcEJ1ZmZlciwgb2Zmc2V0KTsgb2Zmc2V0ICs9IDg7XG4gIGRhdGEud3JpdGVVSW50OChyZXNvbHV0aW9uTW9kZSwgb2Zmc2V0KTsgb2Zmc2V0ICs9IDE7XG4gIGRhdGEud3JpdGVVSW50MzJMRShjb3VuY2lsLmxlbmd0aCwgb2Zmc2V0KTsgb2Zmc2V0ICs9IDQ7XG4gIGZvciAoY29uc3QgbWVtYmVyIG9mIGNvdW5jaWwpIHtcbiAgICBtZW1iZXIudG9CdWZmZXIoKS5jb3B5KGRhdGEsIG9mZnNldCk7IG9mZnNldCArPSAzMjtcbiAgfVxuICBkYXRhLndyaXRlVUludDgoY291bmNpbFRocmVzaG9sZCwgb2Zmc2V0KTtcblxuICAvLyBBY2NvdW50cyBmcm9tIElETDpcbiAgLy8gY29uZmlnIChQREEpLCBtYXJrZXQgKFBEQSksIHRyZWFzdXJ5LCBjcmVhdG9yIChzaWduZXIpLCBjcmVhdG9yX3Byb2ZpbGUgKG9wdGlvbmFsKSwgc3lzdGVtX3Byb2dyYW1cbiAgY29uc3Qga2V5cyA9IFtcbiAgICB7IHB1YmtleTogQ09ORklHX1BEQSwgaXNTaWduZXI6IGZhbHNlLCBpc1dyaXRhYmxlOiB0cnVlIH0sXG4gICAgeyBwdWJrZXk6IG1hcmtldFBkYSwgaXNTaWduZXI6IGZhbHNlLCBpc1dyaXRhYmxlOiB0cnVlIH0sXG4gICAgeyBwdWJrZXk6IFNPTF9UUkVBU1VSWV9QREEsIGlzU2lnbmVyOiBmYWxzZSwgaXNXcml0YWJsZTogdHJ1ZSB9LFxuICAgIHsgcHVia2V5OiBjcmVhdG9yUHVia2V5LCBpc1NpZ25lcjogdHJ1ZSwgaXNXcml0YWJsZTogdHJ1ZSB9LFxuICAgIC8vIEZvciBvcHRpb25hbCBhY2NvdW50cywgcGFzcyBQUk9HUkFNX0lEIGFzIHBsYWNlaG9sZGVyIGlmIG5vdCBwcmVzZW50XG4gICAgeyBwdWJrZXk6IGhhc0NyZWF0b3JQcm9maWxlID8gY3JlYXRvclByb2ZpbGVQZGEgOiBQUk9HUkFNX0lELCBpc1NpZ25lcjogZmFsc2UsIGlzV3JpdGFibGU6IGhhc0NyZWF0b3JQcm9maWxlIH0sXG4gICAgeyBwdWJrZXk6IFN5c3RlbVByb2dyYW0ucHJvZ3JhbUlkLCBpc1NpZ25lcjogZmFsc2UsIGlzV3JpdGFibGU6IGZhbHNlIH0sXG4gIF07XG5cbiAgY29uc3QgaW5zdHJ1Y3Rpb24gPSBuZXcgVHJhbnNhY3Rpb25JbnN0cnVjdGlvbih7XG4gICAgcHJvZ3JhbUlkOiBQUk9HUkFNX0lELFxuICAgIGtleXMsXG4gICAgZGF0YSxcbiAgfSk7XG5cbiAgY29uc3QgdHJhbnNhY3Rpb24gPSBuZXcgVHJhbnNhY3Rpb24oKTtcbiAgdHJhbnNhY3Rpb24uYWRkKGluc3RydWN0aW9uKTtcblxuICBjb25zdCB7IGJsb2NraGFzaCB9ID0gYXdhaXQgY29ubi5nZXRMYXRlc3RCbG9ja2hhc2goJ2ZpbmFsaXplZCcpO1xuICB0cmFuc2FjdGlvbi5yZWNlbnRCbG9ja2hhc2ggPSBibG9ja2hhc2g7XG4gIHRyYW5zYWN0aW9uLmZlZVBheWVyID0gY3JlYXRvclB1YmtleTtcblxuICBjb25zdCBzZXJpYWxpemVkVHggPSB0cmFuc2FjdGlvbi5zZXJpYWxpemUoe1xuICAgIHJlcXVpcmVBbGxTaWduYXR1cmVzOiBmYWxzZSxcbiAgICB2ZXJpZnlTaWduYXR1cmVzOiBmYWxzZSxcbiAgfSkudG9TdHJpbmcoJ2Jhc2U2NCcpO1xuXG4gIHJldHVybiB7XG4gICAgdHJhbnNhY3Rpb24sXG4gICAgc2VyaWFsaXplZFR4LFxuICAgIG1hcmtldFBkYTogbWFya2V0UGRhLnRvQmFzZTU4KCksXG4gICAgbWFya2V0SWQsXG4gIH07XG59XG5cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBCVUlMRCBDUkVBVEUgUFJJVkFURSBNQVJLRVQgVFJBTlNBQ1RJT05cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBidWlsZENyZWF0ZVByaXZhdGVNYXJrZXRUcmFuc2FjdGlvbihcbiAgcGFyYW1zOiBDcmVhdGVQcml2YXRlTWFya2V0UGFyYW1zLFxuICBjb25uZWN0aW9uPzogQ29ubmVjdGlvblxuKTogUHJvbWlzZTxDcmVhdGVNYXJrZXRSZXN1bHQ+IHtcbiAgY29uc3QgY29ubiA9IGNvbm5lY3Rpb24gfHwgbmV3IENvbm5lY3Rpb24oUlBDX0VORFBPSU5ULCAnY29uZmlybWVkJyk7XG4gIGNvbnN0IGNyZWF0b3JQdWJrZXkgPSBuZXcgUHVibGljS2V5KHBhcmFtcy5jcmVhdG9yV2FsbGV0KTtcblxuICBjb25zdCB7IG1hcmtldElkIH0gPSBhd2FpdCBnZXROZXh0TWFya2V0SWQoY29ubik7XG4gIGNvbnN0IFttYXJrZXRQZGFdID0gZGVyaXZlTWFya2V0UGRhKG1hcmtldElkKTtcbiAgY29uc3QgW3doaXRlbGlzdFBkYV0gPSBkZXJpdmVXaGl0ZWxpc3RQZGEobWFya2V0SWQpO1xuICBjb25zdCBbY3JlYXRvclByb2ZpbGVQZGFdID0gZGVyaXZlQ3JlYXRvclByb2ZpbGVQZGEoY3JlYXRvclB1YmtleSk7XG5cbiAgY29uc3QgY3JlYXRvclByb2ZpbGVJbmZvID0gYXdhaXQgY29ubi5nZXRBY2NvdW50SW5mbyhjcmVhdG9yUHJvZmlsZVBkYSk7XG4gIGNvbnN0IGhhc0NyZWF0b3JQcm9maWxlID0gY3JlYXRvclByb2ZpbGVJbmZvICE9PSBudWxsO1xuXG4gIGNvbnN0IGNsb3NpbmdUaW1lID0gQmlnSW50KE1hdGguZmxvb3IocGFyYW1zLmNsb3NpbmdUaW1lLmdldFRpbWUoKSAvIDEwMDApKTtcbiAgY29uc3QgcmVzb2x1dGlvbkJ1ZmZlciA9IEJpZ0ludChwYXJhbXMucmVzb2x1dGlvbkJ1ZmZlciA/PyA0MzIwMCk7XG4gIGNvbnN0IGF1dG9TdG9wQnVmZmVyID0gQmlnSW50KHBhcmFtcy5hdXRvU3RvcEJ1ZmZlciA/PyAzMDApO1xuICBjb25zdCByZXNvbHV0aW9uTW9kZSA9IHBhcmFtcy5yZXNvbHV0aW9uTW9kZSA/PyAwOyAvLyBIb3N0T3JhY2xlIGZvciBwcml2YXRlXG5cbiAgY29uc3QgY291bmNpbCA9IHBhcmFtcy5jb3VuY2lsPy5tYXAocCA9PiBuZXcgUHVibGljS2V5KHApKSA/PyBbXTtcbiAgY29uc3QgY291bmNpbFRocmVzaG9sZCA9IHBhcmFtcy5jb3VuY2lsVGhyZXNob2xkID8/IDA7XG5cbiAgLy8gU2FtZSBpbnN0cnVjdGlvbiBmb3JtYXQgYXMgTGFiIG1hcmtldFxuICBjb25zdCBxdWVzdGlvbkJ5dGVzID0gQnVmZmVyLmZyb20ocGFyYW1zLnF1ZXN0aW9uLCAndXRmOCcpO1xuICBjb25zdCBzaXplID0gOCArIDQgKyBxdWVzdGlvbkJ5dGVzLmxlbmd0aCArIDggKyA4ICsgOCArIDEgKyA0ICsgKGNvdW5jaWwubGVuZ3RoICogMzIpICsgMTtcblxuICBjb25zdCBkYXRhID0gQnVmZmVyLmFsbG9jKHNpemUpO1xuICBsZXQgb2Zmc2V0ID0gMDtcblxuICBDUkVBVEVfUFJJVkFURV9UQUJMRV9TT0xfRElTQ1JJTUlOQVRPUi5jb3B5KGRhdGEsIG9mZnNldCk7IG9mZnNldCArPSA4O1xuICBkYXRhLndyaXRlVUludDMyTEUocXVlc3Rpb25CeXRlcy5sZW5ndGgsIG9mZnNldCk7IG9mZnNldCArPSA0O1xuICBxdWVzdGlvbkJ5dGVzLmNvcHkoZGF0YSwgb2Zmc2V0KTsgb2Zmc2V0ICs9IHF1ZXN0aW9uQnl0ZXMubGVuZ3RoO1xuICBkYXRhLndyaXRlQmlnSW50NjRMRShjbG9zaW5nVGltZSwgb2Zmc2V0KTsgb2Zmc2V0ICs9IDg7XG4gIGRhdGEud3JpdGVCaWdJbnQ2NExFKHJlc29sdXRpb25CdWZmZXIsIG9mZnNldCk7IG9mZnNldCArPSA4O1xuICBkYXRhLndyaXRlQmlnSW50NjRMRShhdXRvU3RvcEJ1ZmZlciwgb2Zmc2V0KTsgb2Zmc2V0ICs9IDg7XG4gIGRhdGEud3JpdGVVSW50OChyZXNvbHV0aW9uTW9kZSwgb2Zmc2V0KTsgb2Zmc2V0ICs9IDE7XG4gIGRhdGEud3JpdGVVSW50MzJMRShjb3VuY2lsLmxlbmd0aCwgb2Zmc2V0KTsgb2Zmc2V0ICs9IDQ7XG4gIGZvciAoY29uc3QgbWVtYmVyIG9mIGNvdW5jaWwpIHtcbiAgICBtZW1iZXIudG9CdWZmZXIoKS5jb3B5KGRhdGEsIG9mZnNldCk7IG9mZnNldCArPSAzMjtcbiAgfVxuICBkYXRhLndyaXRlVUludDgoY291bmNpbFRocmVzaG9sZCwgb2Zmc2V0KTtcblxuICAvLyBQcml2YXRlIG1hcmtldCBhY2NvdW50cyBpbmNsdWRlIHdoaXRlbGlzdCBQREFcbiAgY29uc3Qga2V5cyA9IFtcbiAgICB7IHB1YmtleTogQ09ORklHX1BEQSwgaXNTaWduZXI6IGZhbHNlLCBpc1dyaXRhYmxlOiB0cnVlIH0sXG4gICAgeyBwdWJrZXk6IG1hcmtldFBkYSwgaXNTaWduZXI6IGZhbHNlLCBpc1dyaXRhYmxlOiB0cnVlIH0sXG4gICAgeyBwdWJrZXk6IHdoaXRlbGlzdFBkYSwgaXNTaWduZXI6IGZhbHNlLCBpc1dyaXRhYmxlOiB0cnVlIH0sXG4gICAgeyBwdWJrZXk6IFNPTF9UUkVBU1VSWV9QREEsIGlzU2lnbmVyOiBmYWxzZSwgaXNXcml0YWJsZTogdHJ1ZSB9LFxuICAgIHsgcHVia2V5OiBjcmVhdG9yUHVia2V5LCBpc1NpZ25lcjogdHJ1ZSwgaXNXcml0YWJsZTogdHJ1ZSB9LFxuICAgIHsgcHVia2V5OiBoYXNDcmVhdG9yUHJvZmlsZSA/IGNyZWF0b3JQcm9maWxlUGRhIDogUFJPR1JBTV9JRCwgaXNTaWduZXI6IGZhbHNlLCBpc1dyaXRhYmxlOiBoYXNDcmVhdG9yUHJvZmlsZSB9LFxuICAgIHsgcHVia2V5OiBTeXN0ZW1Qcm9ncmFtLnByb2dyYW1JZCwgaXNTaWduZXI6IGZhbHNlLCBpc1dyaXRhYmxlOiBmYWxzZSB9LFxuICBdO1xuXG4gIGNvbnN0IGluc3RydWN0aW9uID0gbmV3IFRyYW5zYWN0aW9uSW5zdHJ1Y3Rpb24oe1xuICAgIHByb2dyYW1JZDogUFJPR1JBTV9JRCxcbiAgICBrZXlzLFxuICAgIGRhdGEsXG4gIH0pO1xuXG4gIGNvbnN0IHRyYW5zYWN0aW9uID0gbmV3IFRyYW5zYWN0aW9uKCk7XG4gIHRyYW5zYWN0aW9uLmFkZChpbnN0cnVjdGlvbik7XG5cbiAgY29uc3QgeyBibG9ja2hhc2ggfSA9IGF3YWl0IGNvbm4uZ2V0TGF0ZXN0QmxvY2toYXNoKCdmaW5hbGl6ZWQnKTtcbiAgdHJhbnNhY3Rpb24ucmVjZW50QmxvY2toYXNoID0gYmxvY2toYXNoO1xuICB0cmFuc2FjdGlvbi5mZWVQYXllciA9IGNyZWF0b3JQdWJrZXk7XG5cbiAgY29uc3Qgc2VyaWFsaXplZFR4ID0gdHJhbnNhY3Rpb24uc2VyaWFsaXplKHtcbiAgICByZXF1aXJlQWxsU2lnbmF0dXJlczogZmFsc2UsXG4gICAgdmVyaWZ5U2lnbmF0dXJlczogZmFsc2UsXG4gIH0pLnRvU3RyaW5nKCdiYXNlNjQnKTtcblxuICByZXR1cm4ge1xuICAgIHRyYW5zYWN0aW9uLFxuICAgIHNlcmlhbGl6ZWRUeCxcbiAgICBtYXJrZXRQZGE6IG1hcmtldFBkYS50b0Jhc2U1OCgpLFxuICAgIG1hcmtldElkLFxuICB9O1xufVxuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8gQlVJTEQgQ1JFQVRFIFJBQ0UgTUFSS0VUIFRSQU5TQUNUSU9OXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gYnVpbGRDcmVhdGVSYWNlTWFya2V0VHJhbnNhY3Rpb24oXG4gIHBhcmFtczogQ3JlYXRlUmFjZU1hcmtldFBhcmFtcyxcbiAgY29ubmVjdGlvbj86IENvbm5lY3Rpb25cbik6IFByb21pc2U8Q3JlYXRlTWFya2V0UmVzdWx0PiB7XG4gIGNvbnN0IGNvbm4gPSBjb25uZWN0aW9uIHx8IG5ldyBDb25uZWN0aW9uKFJQQ19FTkRQT0lOVCwgJ2NvbmZpcm1lZCcpO1xuICBjb25zdCBjcmVhdG9yUHVia2V5ID0gbmV3IFB1YmxpY0tleShwYXJhbXMuY3JlYXRvcldhbGxldCk7XG5cbiAgY29uc3QgeyByYWNlTWFya2V0SWQgfSA9IGF3YWl0IGdldE5leHRNYXJrZXRJZChjb25uKTtcbiAgY29uc3QgW3JhY2VNYXJrZXRQZGFdID0gZGVyaXZlUmFjZU1hcmtldFBkYShyYWNlTWFya2V0SWQpO1xuICBjb25zdCBbY3JlYXRvclByb2ZpbGVQZGFdID0gZGVyaXZlQ3JlYXRvclByb2ZpbGVQZGEoY3JlYXRvclB1YmtleSk7XG5cbiAgY29uc3QgY3JlYXRvclByb2ZpbGVJbmZvID0gYXdhaXQgY29ubi5nZXRBY2NvdW50SW5mbyhjcmVhdG9yUHJvZmlsZVBkYSk7XG4gIGNvbnN0IGhhc0NyZWF0b3JQcm9maWxlID0gY3JlYXRvclByb2ZpbGVJbmZvICE9PSBudWxsO1xuXG4gIGNvbnN0IGNsb3NpbmdUaW1lID0gQmlnSW50KE1hdGguZmxvb3IocGFyYW1zLmNsb3NpbmdUaW1lLmdldFRpbWUoKSAvIDEwMDApKTtcbiAgY29uc3QgcmVzb2x1dGlvbkJ1ZmZlciA9IEJpZ0ludChwYXJhbXMucmVzb2x1dGlvbkJ1ZmZlciA/PyA0MzIwMCk7XG4gIGNvbnN0IGF1dG9TdG9wQnVmZmVyID0gQmlnSW50KHBhcmFtcy5hdXRvU3RvcEJ1ZmZlciA/PyAzMDApO1xuICBjb25zdCBsYXllciA9IHBhcmFtcy5sYXllciA/PyAxOyAvLyBMYWIgYnkgZGVmYXVsdFxuICBjb25zdCByZXNvbHV0aW9uTW9kZSA9IHBhcmFtcy5yZXNvbHV0aW9uTW9kZSA/PyAxOyAvLyBDb3VuY2lsT3JhY2xlXG4gIGNvbnN0IGFjY2Vzc0dhdGUgPSBwYXJhbXMuYWNjZXNzR2F0ZSA/PyAwOyAvLyBQdWJsaWNcblxuICAvLyBDb3VuY2lsIGlzIE9wdGlvbjxWZWM8UHVia2V5Pj4gLSBlbmNvZGUgYXMgMSAoU29tZSkgKyB2ZWMgb3IgMCAoTm9uZSlcbiAgY29uc3QgaGFzQ291bmNpbCA9IHBhcmFtcy5jb3VuY2lsICYmIHBhcmFtcy5jb3VuY2lsLmxlbmd0aCA+IDA7XG4gIGNvbnN0IGNvdW5jaWwgPSBoYXNDb3VuY2lsID8gcGFyYW1zLmNvdW5jaWwhLm1hcChwID0+IG5ldyBQdWJsaWNLZXkocCkpIDogW107XG5cbiAgLy8gY291bmNpbF90aHJlc2hvbGQgaXMgT3B0aW9uPHU4PlxuICBjb25zdCBoYXNUaHJlc2hvbGQgPSBwYXJhbXMuY291bmNpbFRocmVzaG9sZCAhPT0gdW5kZWZpbmVkO1xuICBjb25zdCBjb3VuY2lsVGhyZXNob2xkID0gcGFyYW1zLmNvdW5jaWxUaHJlc2hvbGQgPz8gMDtcblxuICAvLyBFbmNvZGUgaW5zdHJ1Y3Rpb24gZGF0YTpcbiAgLy8gZGlzY3JpbWluYXRvciAoOCkgKyBxdWVzdGlvbiAoNCtsZW4pICsgb3V0Y29tZV9sYWJlbHMgKDQgKyBuKig0K2xlbikpICtcbiAgLy8gY2xvc2luZ190aW1lICg4KSArIHJlc29sdXRpb25fYnVmZmVyICg4KSArIGF1dG9fc3RvcF9idWZmZXIgKDgpICtcbiAgLy8gbGF5ZXIgKDEpICsgcmVzb2x1dGlvbl9tb2RlICgxKSArIGFjY2Vzc19nYXRlICgxKSArXG4gIC8vIGNvdW5jaWwgKDEgKyA0ICsgbiozMiBvciBqdXN0IDEpICsgY291bmNpbF90aHJlc2hvbGQgKDEgKyAxIG9yIGp1c3QgMSlcblxuICBjb25zdCBxdWVzdGlvbkJ5dGVzID0gQnVmZmVyLmZyb20ocGFyYW1zLnF1ZXN0aW9uLCAndXRmOCcpO1xuICBjb25zdCBvdXRjb21lQnVmZmVycyA9IHBhcmFtcy5vdXRjb21lcy5tYXAobyA9PiBCdWZmZXIuZnJvbShvLCAndXRmOCcpKTtcblxuICBsZXQgb3V0Y29tZXNTaXplID0gNDsgLy8gdmVjIGxlbmd0aFxuICBmb3IgKGNvbnN0IGJ1ZiBvZiBvdXRjb21lQnVmZmVycykge1xuICAgIG91dGNvbWVzU2l6ZSArPSA0ICsgYnVmLmxlbmd0aDtcbiAgfVxuXG4gIGNvbnN0IGNvdW5jaWxTaXplID0gaGFzQ291bmNpbCA/ICgxICsgNCArIGNvdW5jaWwubGVuZ3RoICogMzIpIDogMTtcbiAgY29uc3QgdGhyZXNob2xkU2l6ZSA9IGhhc1RocmVzaG9sZCA/IDIgOiAxO1xuXG4gIGNvbnN0IHNpemUgPSA4ICsgNCArIHF1ZXN0aW9uQnl0ZXMubGVuZ3RoICsgb3V0Y29tZXNTaXplICsgOCArIDggKyA4ICsgMSArIDEgKyAxICsgY291bmNpbFNpemUgKyB0aHJlc2hvbGRTaXplO1xuICBjb25zdCBkYXRhID0gQnVmZmVyLmFsbG9jKHNpemUpO1xuICBsZXQgb2Zmc2V0ID0gMDtcblxuICBDUkVBVEVfUkFDRV9NQVJLRVRfU09MX0RJU0NSSU1JTkFUT1IuY29weShkYXRhLCBvZmZzZXQpOyBvZmZzZXQgKz0gODtcblxuICBkYXRhLndyaXRlVUludDMyTEUocXVlc3Rpb25CeXRlcy5sZW5ndGgsIG9mZnNldCk7IG9mZnNldCArPSA0O1xuICBxdWVzdGlvbkJ5dGVzLmNvcHkoZGF0YSwgb2Zmc2V0KTsgb2Zmc2V0ICs9IHF1ZXN0aW9uQnl0ZXMubGVuZ3RoO1xuXG4gIGRhdGEud3JpdGVVSW50MzJMRShwYXJhbXMub3V0Y29tZXMubGVuZ3RoLCBvZmZzZXQpOyBvZmZzZXQgKz0gNDtcbiAgZm9yIChjb25zdCBidWYgb2Ygb3V0Y29tZUJ1ZmZlcnMpIHtcbiAgICBkYXRhLndyaXRlVUludDMyTEUoYnVmLmxlbmd0aCwgb2Zmc2V0KTsgb2Zmc2V0ICs9IDQ7XG4gICAgYnVmLmNvcHkoZGF0YSwgb2Zmc2V0KTsgb2Zmc2V0ICs9IGJ1Zi5sZW5ndGg7XG4gIH1cblxuICBkYXRhLndyaXRlQmlnSW50NjRMRShjbG9zaW5nVGltZSwgb2Zmc2V0KTsgb2Zmc2V0ICs9IDg7XG4gIGRhdGEud3JpdGVCaWdJbnQ2NExFKHJlc29sdXRpb25CdWZmZXIsIG9mZnNldCk7IG9mZnNldCArPSA4O1xuICBkYXRhLndyaXRlQmlnSW50NjRMRShhdXRvU3RvcEJ1ZmZlciwgb2Zmc2V0KTsgb2Zmc2V0ICs9IDg7XG5cbiAgZGF0YS53cml0ZVVJbnQ4KGxheWVyLCBvZmZzZXQpOyBvZmZzZXQgKz0gMTtcbiAgZGF0YS53cml0ZVVJbnQ4KHJlc29sdXRpb25Nb2RlLCBvZmZzZXQpOyBvZmZzZXQgKz0gMTtcbiAgZGF0YS53cml0ZVVJbnQ4KGFjY2Vzc0dhdGUsIG9mZnNldCk7IG9mZnNldCArPSAxO1xuXG4gIC8vIE9wdGlvbjxWZWM8UHVia2V5Pj4gLSAxIChTb21lKSArIHZlYyBvciAwIChOb25lKVxuICBpZiAoaGFzQ291bmNpbCkge1xuICAgIGRhdGEud3JpdGVVSW50OCgxLCBvZmZzZXQpOyBvZmZzZXQgKz0gMTtcbiAgICBkYXRhLndyaXRlVUludDMyTEUoY291bmNpbC5sZW5ndGgsIG9mZnNldCk7IG9mZnNldCArPSA0O1xuICAgIGZvciAoY29uc3QgbWVtYmVyIG9mIGNvdW5jaWwpIHtcbiAgICAgIG1lbWJlci50b0J1ZmZlcigpLmNvcHkoZGF0YSwgb2Zmc2V0KTsgb2Zmc2V0ICs9IDMyO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBkYXRhLndyaXRlVUludDgoMCwgb2Zmc2V0KTsgb2Zmc2V0ICs9IDE7XG4gIH1cblxuICAvLyBPcHRpb248dTg+IC0gMSAoU29tZSkgKyB2YWx1ZSBvciAwIChOb25lKVxuICBpZiAoaGFzVGhyZXNob2xkKSB7XG4gICAgZGF0YS53cml0ZVVJbnQ4KDEsIG9mZnNldCk7IG9mZnNldCArPSAxO1xuICAgIGRhdGEud3JpdGVVSW50OChjb3VuY2lsVGhyZXNob2xkLCBvZmZzZXQpOyBvZmZzZXQgKz0gMTtcbiAgfSBlbHNlIHtcbiAgICBkYXRhLndyaXRlVUludDgoMCwgb2Zmc2V0KTsgb2Zmc2V0ICs9IDE7XG4gIH1cblxuICAvLyBBY2NvdW50czogY29uZmlnLCByYWNlX21hcmtldCwgY3JlYXRvcl9wcm9maWxlIChvcHRpb25hbCksIHRyZWFzdXJ5LCBjcmVhdG9yLCBzeXN0ZW1fcHJvZ3JhbVxuICBjb25zdCBrZXlzID0gW1xuICAgIHsgcHVia2V5OiBDT05GSUdfUERBLCBpc1NpZ25lcjogZmFsc2UsIGlzV3JpdGFibGU6IHRydWUgfSxcbiAgICB7IHB1YmtleTogcmFjZU1hcmtldFBkYSwgaXNTaWduZXI6IGZhbHNlLCBpc1dyaXRhYmxlOiB0cnVlIH0sXG4gICAgeyBwdWJrZXk6IGhhc0NyZWF0b3JQcm9maWxlID8gY3JlYXRvclByb2ZpbGVQZGEgOiBQUk9HUkFNX0lELCBpc1NpZ25lcjogZmFsc2UsIGlzV3JpdGFibGU6IGhhc0NyZWF0b3JQcm9maWxlIH0sXG4gICAgeyBwdWJrZXk6IFNPTF9UUkVBU1VSWV9QREEsIGlzU2lnbmVyOiBmYWxzZSwgaXNXcml0YWJsZTogdHJ1ZSB9LFxuICAgIHsgcHVia2V5OiBjcmVhdG9yUHVia2V5LCBpc1NpZ25lcjogdHJ1ZSwgaXNXcml0YWJsZTogdHJ1ZSB9LFxuICAgIHsgcHVia2V5OiBTeXN0ZW1Qcm9ncmFtLnByb2dyYW1JZCwgaXNTaWduZXI6IGZhbHNlLCBpc1dyaXRhYmxlOiBmYWxzZSB9LFxuICBdO1xuXG4gIGNvbnN0IGluc3RydWN0aW9uID0gbmV3IFRyYW5zYWN0aW9uSW5zdHJ1Y3Rpb24oe1xuICAgIHByb2dyYW1JZDogUFJPR1JBTV9JRCxcbiAgICBrZXlzLFxuICAgIGRhdGEsXG4gIH0pO1xuXG4gIGNvbnN0IHRyYW5zYWN0aW9uID0gbmV3IFRyYW5zYWN0aW9uKCk7XG4gIHRyYW5zYWN0aW9uLmFkZChpbnN0cnVjdGlvbik7XG5cbiAgY29uc3QgeyBibG9ja2hhc2ggfSA9IGF3YWl0IGNvbm4uZ2V0TGF0ZXN0QmxvY2toYXNoKCdmaW5hbGl6ZWQnKTtcbiAgdHJhbnNhY3Rpb24ucmVjZW50QmxvY2toYXNoID0gYmxvY2toYXNoO1xuICB0cmFuc2FjdGlvbi5mZWVQYXllciA9IGNyZWF0b3JQdWJrZXk7XG5cbiAgY29uc3Qgc2VyaWFsaXplZFR4ID0gdHJhbnNhY3Rpb24uc2VyaWFsaXplKHtcbiAgICByZXF1aXJlQWxsU2lnbmF0dXJlczogZmFsc2UsXG4gICAgdmVyaWZ5U2lnbmF0dXJlczogZmFsc2UsXG4gIH0pLnRvU3RyaW5nKCdiYXNlNjQnKTtcblxuICByZXR1cm4ge1xuICAgIHRyYW5zYWN0aW9uLFxuICAgIHNlcmlhbGl6ZWRUeCxcbiAgICBtYXJrZXRQZGE6IHJhY2VNYXJrZXRQZGEudG9CYXNlNTgoKSxcbiAgICBtYXJrZXRJZDogcmFjZU1hcmtldElkLFxuICB9O1xufVxuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8gSEVMUEVSOiBERVJJVkUgUERBIFBSRVZJRVdcbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbmV4cG9ydCBmdW5jdGlvbiBwcmV2aWV3TWFya2V0UGRhKG1hcmtldElkOiBiaWdpbnQpOiB7XG4gIG1hcmtldFBkYTogc3RyaW5nO1xuICBidW1wOiBudW1iZXI7XG59IHtcbiAgY29uc3QgW3BkYSwgYnVtcF0gPSBkZXJpdmVNYXJrZXRQZGEobWFya2V0SWQpO1xuICByZXR1cm4geyBtYXJrZXRQZGE6IHBkYS50b0Jhc2U1OCgpLCBidW1wIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBwcmV2aWV3UmFjZU1hcmtldFBkYShtYXJrZXRJZDogYmlnaW50KToge1xuICByYWNlTWFya2V0UGRhOiBzdHJpbmc7XG4gIGJ1bXA6IG51bWJlcjtcbn0ge1xuICBjb25zdCBbcGRhLCBidW1wXSA9IGRlcml2ZVJhY2VNYXJrZXRQZGEobWFya2V0SWQpO1xuICByZXR1cm4geyByYWNlTWFya2V0UGRhOiBwZGEudG9CYXNlNTgoKSwgYnVtcCB9O1xufVxuIl19
@@ -0,0 +1,85 @@
1
+ /**
2
+ * Market Management Transaction Builders
3
+ *
4
+ * Builds unsigned transactions for:
5
+ * - Closing markets (stopping betting)
6
+ * - Extending market deadlines
7
+ */
8
+ import { Connection, Transaction } from '@solana/web3.js';
9
+ /**
10
+ * Build close_market transaction
11
+ * Stops betting on a market (usually done by creator before resolution)
12
+ */
13
+ export declare function buildCloseMarketTransaction(params: {
14
+ marketPda: string;
15
+ callerWallet: string;
16
+ connection?: Connection;
17
+ }): Promise<{
18
+ transaction: Transaction;
19
+ serializedTx: string;
20
+ }>;
21
+ /**
22
+ * Build extend_market transaction
23
+ * Extends the closing time and/or resolution time
24
+ */
25
+ export declare function buildExtendMarketTransaction(params: {
26
+ marketPda: string;
27
+ newClosingTime: number;
28
+ newResolutionTime?: number;
29
+ callerWallet: string;
30
+ connection?: Connection;
31
+ }): Promise<{
32
+ transaction: Transaction;
33
+ serializedTx: string;
34
+ }>;
35
+ /**
36
+ * Build close_race_market transaction
37
+ */
38
+ export declare function buildCloseRaceMarketTransaction(params: {
39
+ raceMarketPda: string;
40
+ callerWallet: string;
41
+ connection?: Connection;
42
+ }): Promise<{
43
+ transaction: Transaction;
44
+ serializedTx: string;
45
+ }>;
46
+ /**
47
+ * Build extend_race_market transaction
48
+ */
49
+ export declare function buildExtendRaceMarketTransaction(params: {
50
+ raceMarketPda: string;
51
+ newClosingTime: number;
52
+ newResolutionTime?: number;
53
+ callerWallet: string;
54
+ connection?: Connection;
55
+ }): Promise<{
56
+ transaction: Transaction;
57
+ serializedTx: string;
58
+ }>;
59
+ /**
60
+ * Build cancel_market transaction
61
+ * Cancels a market and allows all bettors to claim refunds.
62
+ * Only callable by admin or creator (depending on market status).
63
+ */
64
+ export declare function buildCancelMarketTransaction(params: {
65
+ marketPda: string;
66
+ reason: string;
67
+ authorityWallet: string;
68
+ connection?: Connection;
69
+ }): Promise<{
70
+ transaction: Transaction;
71
+ serializedTx: string;
72
+ }>;
73
+ /**
74
+ * Build cancel_race transaction
75
+ * Cancels a race market and allows all bettors to claim refunds.
76
+ */
77
+ export declare function buildCancelRaceTransaction(params: {
78
+ raceMarketPda: string;
79
+ reason: string;
80
+ authorityWallet: string;
81
+ connection?: Connection;
82
+ }): Promise<{
83
+ transaction: Transaction;
84
+ serializedTx: string;
85
+ }>;