@allbridge/bridge-core-sdk 3.26.0 → 3.27.0-alpha.10

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 (91) hide show
  1. package/dist/browser/index.js +6 -1
  2. package/dist/browser/index.js.map +4 -4
  3. package/dist/cjs/index.js +6 -1
  4. package/dist/cjs/index.js.map +4 -4
  5. package/dist/esm/index.js +6 -1
  6. package/dist/esm/index.js.map +4 -4
  7. package/dist/src/chains/chain.enums.d.ts +12 -2
  8. package/dist/src/chains/chain.enums.js +10 -0
  9. package/dist/src/chains/chain.enums.js.map +1 -1
  10. package/dist/src/chains/index.js +12 -0
  11. package/dist/src/chains/index.js.map +1 -1
  12. package/dist/src/client/core-api/core-api-mapper.js +2 -0
  13. package/dist/src/client/core-api/core-api-mapper.js.map +1 -1
  14. package/dist/src/client/core-api/core-api.model.d.ts +2 -0
  15. package/dist/src/client/core-api/core-api.model.js.map +1 -1
  16. package/dist/src/configs/mainnet.js +1 -0
  17. package/dist/src/configs/mainnet.js.map +1 -1
  18. package/dist/src/index.d.ts +6 -4
  19. package/dist/src/index.js +5 -11
  20. package/dist/src/index.js.map +1 -1
  21. package/dist/src/services/bridge/alg/index.d.ts +16 -0
  22. package/dist/src/services/bridge/alg/index.js +181 -0
  23. package/dist/src/services/bridge/alg/index.js.map +1 -0
  24. package/dist/src/services/bridge/index.js +21 -0
  25. package/dist/src/services/bridge/index.js.map +1 -1
  26. package/dist/src/services/bridge/models/bridge.model.d.ts +2 -0
  27. package/dist/src/services/bridge/models/bridge.model.js.map +1 -1
  28. package/dist/src/services/bridge/stx/index.d.ts +16 -0
  29. package/dist/src/services/bridge/stx/index.js +127 -0
  30. package/dist/src/services/bridge/stx/index.js.map +1 -0
  31. package/dist/src/services/bridge/sui/index.js.map +1 -1
  32. package/dist/src/services/bridge/utils.d.ts +5 -1
  33. package/dist/src/services/bridge/utils.js +95 -15
  34. package/dist/src/services/bridge/utils.js.map +1 -1
  35. package/dist/src/services/liquidity-pool/alg/index.d.ts +19 -0
  36. package/dist/src/services/liquidity-pool/alg/index.js +134 -0
  37. package/dist/src/services/liquidity-pool/alg/index.js.map +1 -0
  38. package/dist/src/services/liquidity-pool/index.js +21 -0
  39. package/dist/src/services/liquidity-pool/index.js.map +1 -1
  40. package/dist/src/services/liquidity-pool/stx/index.d.ts +21 -0
  41. package/dist/src/services/liquidity-pool/stx/index.js +141 -0
  42. package/dist/src/services/liquidity-pool/stx/index.js.map +1 -0
  43. package/dist/src/services/liquidity-pool/sui/index.js.map +1 -1
  44. package/dist/src/services/liquidity-pool/trx/index.js.map +1 -1
  45. package/dist/src/services/models/alg/BridgeClient.d.ts +2743 -0
  46. package/dist/src/services/models/alg/BridgeClient.js +2685 -0
  47. package/dist/src/services/models/alg/BridgeClient.js.map +1 -0
  48. package/dist/src/services/models/alg/PaddingUtilClient.d.ts +639 -0
  49. package/dist/src/services/models/alg/PaddingUtilClient.js +425 -0
  50. package/dist/src/services/models/alg/PaddingUtilClient.js.map +1 -0
  51. package/dist/src/services/models/alg/PoolClient.d.ts +2268 -0
  52. package/dist/src/services/models/alg/PoolClient.js +2195 -0
  53. package/dist/src/services/models/alg/PoolClient.js.map +1 -0
  54. package/dist/src/services/models/index.d.ts +7 -5
  55. package/dist/src/services/models/index.js.map +1 -1
  56. package/dist/src/services/models/stx/clarigen-types.d.ts +657 -0
  57. package/dist/src/services/models/stx/clarigen-types.js +2296 -0
  58. package/dist/src/services/models/stx/clarigen-types.js.map +1 -0
  59. package/dist/src/services/token/alg/index.d.ts +17 -0
  60. package/dist/src/services/token/alg/index.js +46 -0
  61. package/dist/src/services/token/alg/index.js.map +1 -0
  62. package/dist/src/services/token/index.js +21 -0
  63. package/dist/src/services/token/index.js.map +1 -1
  64. package/dist/src/services/token/stx/index.d.ts +20 -0
  65. package/dist/src/services/token/stx/index.js +59 -0
  66. package/dist/src/services/token/stx/index.js.map +1 -0
  67. package/dist/src/services/token/sui/index.js.map +1 -1
  68. package/dist/src/services/utils/alg/index.d.ts +9 -0
  69. package/dist/src/services/utils/alg/index.js +74 -0
  70. package/dist/src/services/utils/alg/index.js.map +1 -0
  71. package/dist/src/services/utils/stx/get-token-name.d.ts +2 -0
  72. package/dist/src/services/utils/stx/get-token-name.js +15 -0
  73. package/dist/src/services/utils/stx/get-token-name.js.map +1 -0
  74. package/dist/src/services/utils/stx/post-conditions.d.ts +3 -0
  75. package/dist/src/services/utils/stx/post-conditions.js +27 -0
  76. package/dist/src/services/utils/stx/post-conditions.js.map +1 -0
  77. package/dist/src/services/utils/trx/index.js.map +1 -1
  78. package/dist/src/services/yield/index.js +8 -0
  79. package/dist/src/services/yield/index.js.map +1 -1
  80. package/dist/src/tokens-info/tokens-info.model.d.ts +8 -0
  81. package/dist/src/tokens-info/tokens-info.model.js.map +1 -1
  82. package/dist/src/utils/alg/index.d.ts +21 -0
  83. package/dist/src/utils/alg/index.js +67 -0
  84. package/dist/src/utils/alg/index.js.map +1 -0
  85. package/dist/src/utils/index.d.ts +3 -0
  86. package/dist/src/utils/index.js +3 -0
  87. package/dist/src/utils/index.js.map +1 -1
  88. package/dist/src/version.d.ts +1 -1
  89. package/dist/src/version.js +1 -1
  90. package/dist/src/version.js.map +1 -1
  91. package/package.json +9 -2
@@ -0,0 +1,2685 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.BridgeClient = exports.BridgeFactory = exports.BridgeParamsFactory = exports.APP_SPEC = void 0;
4
+ const app_arc56_1 = require("@algorandfoundation/algokit-utils/types/app-arc56");
5
+ const app_client_1 = require("@algorandfoundation/algokit-utils/types/app-client");
6
+ const app_factory_1 = require("@algorandfoundation/algokit-utils/types/app-factory");
7
+ exports.APP_SPEC = {
8
+ name: "Bridge",
9
+ structs: {},
10
+ methods: [
11
+ {
12
+ name: "createApplication",
13
+ args: [
14
+ { type: "address", name: "owner" },
15
+ { type: "byte", name: "chainId" },
16
+ { type: "uint64", name: "messenger" },
17
+ { type: "uint64", name: "gasOracle" },
18
+ ],
19
+ returns: { type: "void" },
20
+ actions: { create: ["NoOp"], call: [] },
21
+ readonly: false,
22
+ events: [],
23
+ recommendations: {},
24
+ },
25
+ {
26
+ name: "optInAsset",
27
+ args: [{ type: "uint64", name: "asset" }],
28
+ returns: { type: "void" },
29
+ actions: { create: [], call: ["NoOp"] },
30
+ readonly: false,
31
+ events: [],
32
+ recommendations: {},
33
+ },
34
+ {
35
+ name: "swapAndBridge",
36
+ args: [
37
+ { type: "pay", name: "paymentRef" },
38
+ { type: "axfer", name: "assetTransferRef" },
39
+ { type: "byte[32]", name: "recipient" },
40
+ { type: "byte", name: "destinationChainId" },
41
+ { type: "byte[32]", name: "receiveToken" },
42
+ { type: "byte[32]", name: "nonce" },
43
+ { type: "uint64", name: "budget", defaultValue: { source: "literal", data: "AAAAAAAAA+g=", type: "uint64" } },
44
+ ],
45
+ returns: { type: "void" },
46
+ actions: { create: [], call: ["NoOp"] },
47
+ readonly: false,
48
+ events: [
49
+ {
50
+ name: "BridgingFeeFromTokens",
51
+ args: [
52
+ { type: "uint64", name: "feeFromNative" },
53
+ { type: "uint64", name: "feeFromStable" },
54
+ { type: "uint64", name: "feeStableTokenAmount" },
55
+ ],
56
+ },
57
+ {
58
+ name: "ReceiveFee",
59
+ args: [
60
+ { type: "uint64", name: "bridgeTransactionCost" },
61
+ { type: "uint64", name: "messageTransactionCost" },
62
+ ],
63
+ },
64
+ {
65
+ name: "TokensSent",
66
+ args: [
67
+ { type: "uint64", name: "amount" },
68
+ { type: "byte[32]", name: "recipient" },
69
+ { type: "byte", name: "destinationChainId" },
70
+ { type: "byte[32]", name: "receiveToken" },
71
+ { type: "byte[32]", name: "nonce" },
72
+ { type: "byte", name: "messenger" },
73
+ ],
74
+ },
75
+ ],
76
+ recommendations: {},
77
+ },
78
+ {
79
+ name: "swapAndBridgeWithStable",
80
+ args: [
81
+ { type: "axfer", name: "assetTransferRef" },
82
+ { type: "byte[32]", name: "recipient" },
83
+ { type: "byte", name: "destinationChainId" },
84
+ { type: "byte[32]", name: "receiveToken" },
85
+ { type: "byte[32]", name: "nonce" },
86
+ { type: "uint64", name: "feeTokenAmount" },
87
+ { type: "uint64", name: "budget", defaultValue: { source: "literal", data: "AAAAAAAAA+g=", type: "uint64" } },
88
+ ],
89
+ returns: { type: "void" },
90
+ actions: { create: [], call: ["NoOp"] },
91
+ readonly: false,
92
+ events: [
93
+ {
94
+ name: "BridgingFeeFromTokens",
95
+ args: [
96
+ { type: "uint64", name: "feeFromNative" },
97
+ { type: "uint64", name: "feeFromStable" },
98
+ { type: "uint64", name: "feeStableTokenAmount" },
99
+ ],
100
+ },
101
+ {
102
+ name: "ReceiveFee",
103
+ args: [
104
+ { type: "uint64", name: "bridgeTransactionCost" },
105
+ { type: "uint64", name: "messageTransactionCost" },
106
+ ],
107
+ },
108
+ {
109
+ name: "TokensSent",
110
+ args: [
111
+ { type: "uint64", name: "amount" },
112
+ { type: "byte[32]", name: "recipient" },
113
+ { type: "byte", name: "destinationChainId" },
114
+ { type: "byte[32]", name: "receiveToken" },
115
+ { type: "byte[32]", name: "nonce" },
116
+ { type: "byte", name: "messenger" },
117
+ ],
118
+ },
119
+ ],
120
+ recommendations: {},
121
+ },
122
+ {
123
+ name: "receiveTokens",
124
+ args: [
125
+ { type: "pay", name: "paymentRef" },
126
+ { type: "uint64", name: "amount" },
127
+ { type: "byte[32]", name: "recipient" },
128
+ { type: "byte", name: "sourceChainId" },
129
+ { type: "byte[32]", name: "receiveToken" },
130
+ { type: "byte[32]", name: "nonce" },
131
+ { type: "uint64", name: "receiveAmountMin" },
132
+ ],
133
+ returns: { type: "void" },
134
+ actions: { create: [], call: ["NoOp"] },
135
+ readonly: false,
136
+ events: [
137
+ {
138
+ name: "TokensReceived",
139
+ args: [
140
+ { type: "uint64", name: "receiveAmount" },
141
+ { type: "address", name: "recipient" },
142
+ { type: "byte[32]", name: "nonce" },
143
+ { type: "byte", name: "messenger" },
144
+ { type: "byte[32]", name: "message" },
145
+ ],
146
+ },
147
+ ],
148
+ recommendations: {},
149
+ },
150
+ {
151
+ name: "registerBridge",
152
+ args: [
153
+ { type: "byte", name: "chainId" },
154
+ { type: "byte[32]", name: "bridgeAddress" },
155
+ ],
156
+ returns: { type: "void" },
157
+ actions: { create: [], call: ["NoOp"] },
158
+ readonly: false,
159
+ events: [],
160
+ recommendations: {},
161
+ },
162
+ {
163
+ name: "addBridgeToken",
164
+ args: [
165
+ { type: "byte", name: "chainId" },
166
+ { type: "byte[32]", name: "tokenAddress" },
167
+ ],
168
+ returns: { type: "void" },
169
+ actions: { create: [], call: ["NoOp"] },
170
+ readonly: false,
171
+ events: [],
172
+ recommendations: {},
173
+ },
174
+ {
175
+ name: "removeBridgeToken",
176
+ args: [
177
+ { type: "byte", name: "chainId" },
178
+ { type: "byte[32]", name: "tokenAddress" },
179
+ ],
180
+ returns: { type: "void" },
181
+ actions: { create: [], call: ["NoOp"] },
182
+ readonly: false,
183
+ events: [],
184
+ recommendations: {},
185
+ },
186
+ {
187
+ name: "withdrawGasTokens",
188
+ args: [{ type: "uint64", name: "amount" }],
189
+ returns: { type: "void" },
190
+ actions: { create: [], call: ["NoOp"] },
191
+ readonly: false,
192
+ events: [],
193
+ recommendations: {},
194
+ },
195
+ {
196
+ name: "withdrawBridgingFeeInTokens",
197
+ args: [{ type: "uint64", name: "asset" }],
198
+ returns: { type: "void" },
199
+ actions: { create: [], call: ["NoOp"] },
200
+ readonly: false,
201
+ events: [],
202
+ recommendations: {},
203
+ },
204
+ {
205
+ name: "getBridgingCostInTokens",
206
+ args: [
207
+ { type: "byte", name: "destinationChainId" },
208
+ { type: "uint64", name: "asset" },
209
+ ],
210
+ returns: { type: "uint64" },
211
+ actions: { create: [], call: ["NoOp"] },
212
+ readonly: true,
213
+ events: [],
214
+ recommendations: {},
215
+ },
216
+ {
217
+ name: "hashMessage",
218
+ args: [
219
+ { type: "uint64", name: "amount" },
220
+ { type: "byte[32]", name: "recipient" },
221
+ { type: "byte", name: "sourceChainId" },
222
+ { type: "byte", name: "destinationChainId" },
223
+ { type: "byte[32]", name: "receiveToken" },
224
+ { type: "byte[32]", name: "nonce" },
225
+ ],
226
+ returns: { type: "byte[32]" },
227
+ actions: { create: [], call: ["NoOp"] },
228
+ readonly: true,
229
+ events: [],
230
+ recommendations: {},
231
+ },
232
+ {
233
+ name: "isOtherBridgeTokenSupported",
234
+ args: [
235
+ { type: "byte", name: "chainId" },
236
+ { type: "byte[32]", name: "token" },
237
+ ],
238
+ returns: { type: "bool" },
239
+ actions: { create: [], call: ["NoOp"] },
240
+ readonly: true,
241
+ events: [],
242
+ recommendations: {},
243
+ },
244
+ {
245
+ name: "getTransactionCost",
246
+ args: [{ type: "byte", name: "chainId" }],
247
+ returns: { type: "uint64" },
248
+ actions: { create: [], call: ["NoOp"] },
249
+ readonly: true,
250
+ events: [],
251
+ recommendations: {},
252
+ },
253
+ {
254
+ name: "getReceiveTokensCost",
255
+ args: [],
256
+ returns: { type: "uint64" },
257
+ actions: { create: [], call: ["NoOp"] },
258
+ readonly: true,
259
+ events: [],
260
+ recommendations: {},
261
+ },
262
+ {
263
+ name: "getSendTransactionStorageCost",
264
+ args: [],
265
+ returns: { type: "uint64" },
266
+ actions: { create: [], call: ["NoOp"] },
267
+ readonly: true,
268
+ events: [],
269
+ recommendations: {},
270
+ },
271
+ {
272
+ name: "swap",
273
+ args: [
274
+ { type: "axfer", name: "assetTransferRef", desc: "The token to be swapped." },
275
+ { type: "uint64", name: "receiveAsset", desc: "The token to receive in exchange for the swapped token." },
276
+ { type: "address", name: "recipient", desc: "The address to receive the tokens." },
277
+ {
278
+ type: "uint64",
279
+ name: "receiveAmountMin",
280
+ desc: "The minimum amount of tokens required to receive during the swap.",
281
+ },
282
+ { type: "uint64", name: "budget", defaultValue: { source: "literal", data: "AAAAAAAAA+g=", type: "uint64" } },
283
+ ],
284
+ returns: { type: "void" },
285
+ actions: { create: [], call: ["NoOp"] },
286
+ readonly: false,
287
+ events: [
288
+ {
289
+ name: "Swapped",
290
+ args: [
291
+ { type: "address", name: "sender" },
292
+ { type: "address", name: "recipient" },
293
+ { type: "uint64", name: "tokenId" },
294
+ { type: "uint64", name: "receiveTokenId" },
295
+ { type: "uint64", name: "amount" },
296
+ { type: "uint64", name: "receivedAmount" },
297
+ ],
298
+ },
299
+ ],
300
+ recommendations: {},
301
+ },
302
+ {
303
+ name: "addPool",
304
+ args: [
305
+ { type: "uint64", name: "poolId", desc: "The address of the `Pool` contract." },
306
+ { type: "uint64", name: "asset", desc: "The address of the token in the liquidity pool." },
307
+ ],
308
+ returns: { type: "void" },
309
+ actions: { create: [], call: ["NoOp"] },
310
+ readonly: false,
311
+ events: [],
312
+ recommendations: {},
313
+ },
314
+ {
315
+ name: "removePool",
316
+ args: [{ type: "uint64", name: "tokenId" }],
317
+ returns: { type: "void" },
318
+ actions: { create: [], call: ["NoOp"] },
319
+ readonly: false,
320
+ events: [],
321
+ recommendations: {},
322
+ },
323
+ {
324
+ name: "stopSwap",
325
+ args: [],
326
+ returns: { type: "void" },
327
+ actions: { create: [], call: ["NoOp"] },
328
+ readonly: false,
329
+ events: [],
330
+ recommendations: {},
331
+ },
332
+ {
333
+ name: "startSwap",
334
+ args: [],
335
+ returns: { type: "void" },
336
+ actions: { create: [], call: ["NoOp"] },
337
+ readonly: false,
338
+ events: [],
339
+ recommendations: {},
340
+ },
341
+ {
342
+ name: "setStopAuthority",
343
+ args: [{ type: "address", name: "stopAuthority" }],
344
+ returns: { type: "void" },
345
+ actions: { create: [], call: ["NoOp"] },
346
+ readonly: false,
347
+ events: [],
348
+ recommendations: {},
349
+ },
350
+ {
351
+ name: "setRebalancer",
352
+ args: [{ type: "address", name: "rebalancer" }],
353
+ returns: { type: "void" },
354
+ actions: { create: [], call: ["NoOp"] },
355
+ readonly: false,
356
+ events: [],
357
+ recommendations: {},
358
+ },
359
+ {
360
+ name: "getGasUsage",
361
+ args: [{ type: "byte", name: "chainId" }],
362
+ returns: { type: "uint64" },
363
+ actions: { create: [], call: ["NoOp"] },
364
+ readonly: true,
365
+ events: [],
366
+ recommendations: {},
367
+ },
368
+ {
369
+ name: "setGasUsage",
370
+ args: [
371
+ { type: "byte", name: "chainId" },
372
+ { type: "uint64", name: "gasAmount" },
373
+ ],
374
+ returns: { type: "void" },
375
+ actions: { create: [], call: ["NoOp"] },
376
+ readonly: false,
377
+ events: [],
378
+ recommendations: {},
379
+ },
380
+ {
381
+ name: "setGasOracle",
382
+ args: [{ type: "uint64", name: "gasOracle" }],
383
+ returns: { type: "void" },
384
+ actions: { create: [], call: ["NoOp"] },
385
+ readonly: false,
386
+ events: [],
387
+ recommendations: {},
388
+ },
389
+ {
390
+ name: "getTransactionRelayerCost",
391
+ args: [{ type: "byte", name: "chainId" }],
392
+ returns: { type: "uint64" },
393
+ actions: { create: [], call: ["NoOp"] },
394
+ readonly: true,
395
+ events: [],
396
+ recommendations: {},
397
+ },
398
+ {
399
+ name: "transferOwnership",
400
+ args: [{ type: "address", name: "newOwner" }],
401
+ returns: { type: "void" },
402
+ actions: { create: [], call: ["NoOp"] },
403
+ readonly: false,
404
+ events: [],
405
+ recommendations: {},
406
+ },
407
+ ],
408
+ arcs: [22, 28],
409
+ networks: {},
410
+ state: {
411
+ schema: { global: { ints: 3, bytes: 4 }, local: { ints: 0, bytes: 0 } },
412
+ keys: {
413
+ global: {
414
+ chainId: { keyType: "AVMString", valueType: "byte", key: "Y2hhaW5JZA==" },
415
+ messenger: { keyType: "AVMString", valueType: "AVMUint64", key: "bWVzc2VuZ2Vy" },
416
+ stopAuthority: { keyType: "AVMString", valueType: "address", key: "c3RvcEF1dGhvcml0eQ==" },
417
+ rebalancer: { keyType: "AVMString", valueType: "address", key: "cmViYWxhbmNlcg==" },
418
+ canSwap: { keyType: "AVMString", valueType: "AVMUint64", key: "Y2FuU3dhcA==" },
419
+ gasOracle: { keyType: "AVMString", valueType: "AVMUint64", key: "Z2FzT3JhY2xl" },
420
+ owner: { keyType: "AVMString", valueType: "address", key: "b3duZXI=" },
421
+ },
422
+ local: {},
423
+ box: {},
424
+ },
425
+ maps: {
426
+ global: {},
427
+ local: {},
428
+ box: {
429
+ processedMessages: { keyType: "byte[32]", valueType: "byte[0]", prefix: "bQ==" },
430
+ sentMessages: { keyType: "byte[32]", valueType: "byte[0]", prefix: "cw==" },
431
+ otherBridges: { keyType: "byte", valueType: "byte[32]", prefix: "Yg==" },
432
+ otherBridgeTokens: { keyType: "AVMBytes", valueType: "byte[0]", prefix: "dA==" },
433
+ pools: { keyType: "uint64", valueType: "uint64", prefix: "cA==" },
434
+ fromGasOracleScalingFactor: { keyType: "uint64", valueType: "uint64", prefix: "ZQ==" },
435
+ bridgingFeeConversionScalingFactor: { keyType: "uint64", valueType: "uint64", prefix: "Zg==" },
436
+ gasUsage: { keyType: "byte", valueType: "uint64", prefix: "dQ==" },
437
+ },
438
+ },
439
+ },
440
+ bareActions: { create: [], call: [] },
441
+ sourceInfo: {
442
+ approval: {
443
+ sourceInfo: [
444
+ { pc: [431], errorMessage: "Asset must go to app" },
445
+ { pc: [877, 1323, 2099, 2412, 2424], errorMessage: "Box must have value" },
446
+ { pc: [1835], errorMessage: "Bridge: amount too low for fee" },
447
+ { pc: [1842], errorMessage: "Bridge: bridge to the zero address" },
448
+ { pc: [911], errorMessage: "Bridge: message processed" },
449
+ { pc: [961], errorMessage: "Bridge: no message" },
450
+ { pc: [853, 2063], errorMessage: "Bridge: not enough fee" },
451
+ { pc: [843], errorMessage: "Bridge: source not registered" },
452
+ { pc: [1950], errorMessage: "Bridge: tokens already sent" },
453
+ { pc: [1915], errorMessage: "Bridge: unknown chain or token" },
454
+ { pc: [1902], errorMessage: "Bridge: wrong destination chain" },
455
+ { pc: [953, 1256, 1308, 1995, 2146, 2289, 2395, 2469], errorMessage: "Bytes has valid prefix" },
456
+ { pc: [447], errorMessage: "CloseTo not allowed" },
457
+ { pc: [137], errorMessage: "OnCompletion must be NoOp" },
458
+ { pc: [2484], errorMessage: "Only owner" },
459
+ { pc: [439], errorMessage: "Rekey not allowed" },
460
+ { pc: [1665], errorMessage: "Router: is not stopAuthority" },
461
+ { pc: [2311], errorMessage: "Router: no pool" },
462
+ { pc: [2221], errorMessage: "Router: no receive pool" },
463
+ { pc: [832, 1502, 1825], errorMessage: "Router: swap prohibited" },
464
+ { pc: [1166], errorMessage: "account opted into asset" },
465
+ { pc: [2006, 2319], errorMessage: "application exists" },
466
+ { pc: [1599], errorMessage: "asset exists" },
467
+ {
468
+ pc: [831, 858, 920, 1127, 1174, 1225, 1267, 1501, 1663, 1824, 1896, 1964, 2108, 2113, 2236, 2346, 2430, 2482],
469
+ errorMessage: "check GlobalState exists",
470
+ },
471
+ { pc: [1956], errorMessage: "index access is out of bounds" },
472
+ { pc: [958], errorMessage: "invalid number of bytes for arc4.bool" },
473
+ {
474
+ pc: [
475
+ 504, 642, 658, 666, 711, 727, 735, 791, 807, 818, 1040, 1069, 1098, 1349, 1373, 1381, 1406, 1475, 1686,
476
+ 1703, 1803,
477
+ ],
478
+ errorMessage: "invalid number of bytes for arc4.static_array<arc4.uint8, 32>",
479
+ },
480
+ {
481
+ pc: [
482
+ 520, 529, 561, 674, 743, 752, 779, 826, 1118, 1148, 1213, 1261, 1313, 1340, 1466, 1483, 1492, 1571, 1580,
483
+ 1643, 1746, 1768, 2000, 2151, 2294, 2400, 2474,
484
+ ],
485
+ errorMessage: "invalid number of bytes for arc4.uint64",
486
+ },
487
+ {
488
+ pc: [512, 650, 719, 799, 1032, 1061, 1090, 1205, 1357, 1365, 1398, 1434, 1720, 1738, 1785],
489
+ errorMessage: "invalid number of bytes for arc4.uint8",
490
+ },
491
+ { pc: [899, 2205], errorMessage: "invalid size" },
492
+ { pc: [634, 703, 1458], errorMessage: "transaction type is axfer" },
493
+ { pc: [623, 771], errorMessage: "transaction type is pay" },
494
+ ],
495
+ pcOffsetMethod: "none",
496
+ },
497
+ clear: { sourceInfo: [], pcOffsetMethod: "none" },
498
+ },
499
+ source: {
500
+ approval: "I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBAYWxnb3JhbmRmb3VuZGF0aW9uL2FsZ29yYW5kLXR5cGVzY3JpcHQvYXJjNC9pbmRleC5kLnRzOjpDb250cmFjdC5hcHByb3ZhbFByb2dyYW0oKSAtPiB1aW50NjQ6Cm1haW46CiAgICBpbnRjYmxvY2sgMSAwIDggMzIgMTU3MDAKICAgIGJ5dGVjYmxvY2sgMHgxNTFmN2M3NSAiY2FuU3dhcCIgIm93bmVyIiAiZ2FzT3JhY2xlIiAicmViYWxhbmNlciIgImNoYWluSWQiICJtZXNzZW5nZXIiICJ0IiAicCIgInN0b3BBdXRob3JpdHkiIDB4MDEgMHgwMCAidSIgMHg0MzQxN2FhMyAweGY3NDc1YjgyIDB4MTUxZjdjNzUwMDAwMDAwMDAwMDAzZDU0IDB4MDY4MTAxCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYm56IG1haW5fYWZ0ZXJfaWZfZWxzZUAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3JvdXRlci5hbGdvLnRzOjUyCiAgICAvLyBwcml2YXRlIHJlYmFsYW5jZXIgPSBHbG9iYWxTdGF0ZTxBZGRyZXNzPih7IGluaXRpYWxWYWx1ZTogbmV3IEFkZHJlc3MoYnplcm8oMCkpIH0pOy8vIGNhbiByZXN0cmljdCBkZXBvc2l0IG9yIHdpdGhkcmF3IG9wZXJhdGlvbnMKICAgIGludGNfMSAvLyAwCiAgICBiemVybwogICAgYnl0ZWMgNCAvLyAicmViYWxhbmNlciIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3JvdXRlci5hbGdvLnRzOjUzCiAgICAvLyBjYW5Td2FwID0gR2xvYmFsU3RhdGU8Ym9vbGVhbj4oeyBpbml0aWFsVmFsdWU6IHRydWUgfSk7CiAgICBieXRlY18xIC8vICJjYW5Td2FwIgogICAgaW50Y18wIC8vIDEKICAgIGFwcF9nbG9iYWxfcHV0CgptYWluX2FmdGVyX2lmX2Vsc2VAMjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvYnJpZGdlLmNvbnRyYWN0LmFsZ28udHM6NTUKICAgIC8vIGV4cG9ydCBjbGFzcyBCcmlkZ2UgZXh0ZW5kcyBSb3V0ZXIgaW1wbGVtZW50cyBDb252ZW50aW9uYWxSb3V0aW5nLCBJQnJpZGdlIHsKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gbXVzdCBiZSBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYnogbWFpbl9jcmVhdGVfTm9PcEAzMwogICAgcHVzaGJ5dGVzcyAweDY1ZjcwNTczIDB4M2UzODAyN2MgMHhhNDYwMGFlZCAweGRlNGNhZDRhIDB4NGViYTA3MjEgMHhjNjE3ZWQ3MyAweDU3NTMxNTYwIDB4NjM4MDgyNzggMHgwNjUwN2M2YSAweGY1Zjk2ZWIzIDB4NGIwNjJjYTAgMHhjM2NkZDkyYSAvLyBtZXRob2QgIm9wdEluQXNzZXQodWludDY0KXZvaWQiLCBtZXRob2QgInN3YXBBbmRCcmlkZ2UocGF5LGF4ZmVyLGJ5dGVbMzJdLGJ5dGUsYnl0ZVszMl0sYnl0ZVszMl0sdWludDY0KXZvaWQiLCBtZXRob2QgInN3YXBBbmRCcmlkZ2VXaXRoU3RhYmxlKGF4ZmVyLGJ5dGVbMzJdLGJ5dGUsYnl0ZVszMl0sYnl0ZVszMl0sdWludDY0LHVpbnQ2NCl2b2lkIiwgbWV0aG9kICJyZWNlaXZlVG9rZW5zKHBheSx1aW50NjQsYnl0ZVszMl0sYnl0ZSxieXRlWzMyXSxieXRlWzMyXSx1aW50NjQpdm9pZCIsIG1ldGhvZCAicmVnaXN0ZXJCcmlkZ2UoYnl0ZSxieXRlWzMyXSl2b2lkIiwgbWV0aG9kICJhZGRCcmlkZ2VUb2tlbihieXRlLGJ5dGVbMzJdKXZvaWQiLCBtZXRob2QgInJlbW92ZUJyaWRnZVRva2VuKGJ5dGUsYnl0ZVszMl0pdm9pZCIsIG1ldGhvZCAid2l0aGRyYXdHYXNUb2tlbnModWludDY0KXZvaWQiLCBtZXRob2QgIndpdGhkcmF3QnJpZGdpbmdGZWVJblRva2Vucyh1aW50NjQpdm9pZCIsIG1ldGhvZCAiZ2V0QnJpZGdpbmdDb3N0SW5Ub2tlbnMoYnl0ZSx1aW50NjQpdWludDY0IiwgbWV0aG9kICJoYXNoTWVzc2FnZSh1aW50NjQsYnl0ZVszMl0sYnl0ZSxieXRlLGJ5dGVbMzJdLGJ5dGVbMzJdKWJ5dGVbMzJdIiwgbWV0aG9kICJpc090aGVyQnJpZGdlVG9rZW5TdXBwb3J0ZWQoYnl0ZSxieXRlWzMyXSlib29sIgogICAgYnl0ZWMgMTMgLy8gbWV0aG9kICJnZXRUcmFuc2FjdGlvbkNvc3QoYnl0ZSl1aW50NjQiCiAgICBwdXNoYnl0ZXNzIDB4MDdkZjg0MjkgMHg4MGM1YzcwZiAweDQxMzRkMDY4IDB4ZWYxNWY4NTUgMHg2YjFlZTIyMyAweDE4NzBhNDkyIDB4MzU1NzMyNGQgMHgwNGIxNjFmMSAweGQyYjM1N2ViIC8vIG1ldGhvZCAiZ2V0UmVjZWl2ZVRva2Vuc0Nvc3QoKXVpbnQ2NCIsIG1ldGhvZCAiZ2V0U2VuZFRyYW5zYWN0aW9uU3RvcmFnZUNvc3QoKXVpbnQ2NCIsIG1ldGhvZCAic3dhcChheGZlcix1aW50NjQsYWRkcmVzcyx1aW50NjQsdWludDY0KXZvaWQiLCBtZXRob2QgImFkZFBvb2wodWludDY0LHVpbnQ2NCl2b2lkIiwgbWV0aG9kICJyZW1vdmVQb29sKHVpbnQ2NCl2b2lkIiwgbWV0aG9kICJzdG9wU3dhcCgpdm9pZCIsIG1ldGhvZCAic3RhcnRTd2FwKCl2b2lkIiwgbWV0aG9kICJzZXRTdG9wQXV0aG9yaXR5KGFkZHJlc3Mpdm9pZCIsIG1ldGhvZCAic2V0UmViYWxhbmNlcihhZGRyZXNzKXZvaWQiCiAgICBieXRlYyAxNCAvLyBtZXRob2QgImdldEdhc1VzYWdlKGJ5dGUpdWludDY0IgogICAgcHVzaGJ5dGVzcyAweDBjYTVhZTdhIDB4Mjc0NzBmMDcgMHhjYmZjNmQwMiAweGUxN2JhZmI0IC8vIG1ldGhvZCAic2V0R2FzVXNhZ2UoYnl0ZSx1aW50NjQpdm9pZCIsIG1ldGhvZCAic2V0R2FzT3JhY2xlKHVpbnQ2NCl2b2lkIiwgbWV0aG9kICJnZXRUcmFuc2FjdGlvblJlbGF5ZXJDb3N0KGJ5dGUpdWludDY0IiwgbWV0aG9kICJ0cmFuc2Zlck93bmVyc2hpcChhZGRyZXNzKXZvaWQiCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAwCiAgICBtYXRjaCBvcHRJbkFzc2V0IHN3YXBBbmRCcmlkZ2Ugc3dhcEFuZEJyaWRnZVdpdGhTdGFibGUgcmVjZWl2ZVRva2VucyByZWdpc3RlckJyaWRnZSBhZGRCcmlkZ2VUb2tlbiByZW1vdmVCcmlkZ2VUb2tlbiB3aXRoZHJhd0dhc1Rva2VucyB3aXRoZHJhd0JyaWRnaW5nRmVlSW5Ub2tlbnMgZ2V0QnJpZGdpbmdDb3N0SW5Ub2tlbnMgaGFzaE1lc3NhZ2UgaXNPdGhlckJyaWRnZVRva2VuU3VwcG9ydGVkIGdldFRyYW5zYWN0aW9uQ29zdCBtYWluX2dldFJlY2VpdmVUb2tlbnNDb3N0X3JvdXRlQDE4IG1haW5fZ2V0U2VuZFRyYW5zYWN0aW9uU3RvcmFnZUNvc3Rfcm91dGVAMTkgc3dhcCBhZGRQb29sIHJlbW92ZVBvb2wgc3RvcFN3YXAgc3RhcnRTd2FwIHNldFN0b3BBdXRob3JpdHkgc2V0UmViYWxhbmNlciBnZXRHYXNVc2FnZSBzZXRHYXNVc2FnZSBzZXRHYXNPcmFjbGUgZ2V0VHJhbnNhY3Rpb25SZWxheWVyQ29zdCB0cmFuc2Zlck93bmVyc2hpcAogICAgZXJyCgptYWluX2dldFNlbmRUcmFuc2FjdGlvblN0b3JhZ2VDb3N0X3JvdXRlQDE5OgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9icmlkZ2UuY29udHJhY3QuYWxnby50czozNTEKICAgIC8vIEBhYmltZXRob2QoeyByZWFkb25seTogdHJ1ZSB9KQogICAgYnl0ZWMgMTUgLy8gMHgxNTFmN2M3NTAwMDAwMDAwMDAwMDNkNTQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKbWFpbl9nZXRSZWNlaXZlVG9rZW5zQ29zdF9yb3V0ZUAxODoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvYnJpZGdlLmNvbnRyYWN0LmFsZ28udHM6MzQ0CiAgICAvLyBAYWJpbWV0aG9kKHsgcmVhZG9ubHk6IHRydWUgfSkKICAgIGJ5dGVjIDE1IC8vIDB4MTUxZjdjNzUwMDAwMDAwMDAwMDAzZDU0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCm1haW5fY3JlYXRlX05vT3BAMzM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2JyaWRnZS5jb250cmFjdC5hbGdvLnRzOjU1CiAgICAvLyBleHBvcnQgY2xhc3MgQnJpZGdlIGV4dGVuZHMgUm91dGVyIGltcGxlbWVudHMgQ29udmVudGlvbmFsUm91dGluZywgSUJyaWRnZSB7CiAgICBwdXNoYnl0ZXMgMHg2NjRjYTQwNCAvLyBtZXRob2QgImNyZWF0ZUFwcGxpY2F0aW9uKGFkZHJlc3MsYnl0ZSx1aW50NjQsdWludDY0KXZvaWQiCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAwCiAgICBtYXRjaCBjcmVhdGVBcHBsaWNhdGlvbgogICAgZXJyCgoKLy8gX3B1eWFfbGliLnV0aWwuZW5zdXJlX2J1ZGdldChyZXF1aXJlZF9idWRnZXQ6IHVpbnQ2NCwgZmVlX3NvdXJjZTogdWludDY0KSAtPiB2b2lkOgplbnN1cmVfYnVkZ2V0OgogICAgcHJvdG8gMiAwCiAgICBmcmFtZV9kaWcgLTIKICAgIHB1c2hpbnQgMTAgLy8gMTAKICAgICsKCmVuc3VyZV9idWRnZXRfd2hpbGVfdG9wQDE6CiAgICBmcmFtZV9kaWcgMAogICAgZ2xvYmFsIE9wY29kZUJ1ZGdldAogICAgPgogICAgYnogZW5zdXJlX2J1ZGdldF9hZnRlcl93aGlsZUA2CiAgICBpdHhuX2JlZ2luCiAgICBwdXNoaW50IDYgLy8gYXBwbAogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgcHVzaGludCA1IC8vIERlbGV0ZUFwcGxpY2F0aW9uCiAgICBpdHhuX2ZpZWxkIE9uQ29tcGxldGlvbgogICAgYnl0ZWMgMTYgLy8gMHgwNjgxMDEKICAgIGl0eG5fZmllbGQgQXBwcm92YWxQcm9ncmFtCiAgICBieXRlYyAxNiAvLyAweDA2ODEwMQogICAgaXR4bl9maWVsZCBDbGVhclN0YXRlUHJvZ3JhbQogICAgZnJhbWVfZGlnIC0xCiAgICBzd2l0Y2ggZW5zdXJlX2J1ZGdldF9zd2l0Y2hfY2FzZV8wQDMgZW5zdXJlX2J1ZGdldF9zd2l0Y2hfY2FzZV8xQDQKCmVuc3VyZV9idWRnZXRfc3dpdGNoX2Nhc2VfbmV4dEA1OgogICAgaXR4bl9zdWJtaXQKICAgIGIgZW5zdXJlX2J1ZGdldF93aGlsZV90b3BAMQoKZW5zdXJlX2J1ZGdldF9zd2l0Y2hfY2FzZV8xQDQ6CiAgICBnbG9iYWwgTWluVHhuRmVlCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgYiBlbnN1cmVfYnVkZ2V0X3N3aXRjaF9jYXNlX25leHRANQoKZW5zdXJlX2J1ZGdldF9zd2l0Y2hfY2FzZV8wQDM6CiAgICBpbnRjXzEgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIGIgZW5zdXJlX2J1ZGdldF9zd2l0Y2hfY2FzZV9uZXh0QDUKCmVuc3VyZV9idWRnZXRfYWZ0ZXJfd2hpbGVANjoKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvdXRpbHMuYWxnby50czo6YW1vdW50RnJvbUFzc2V0VHJhbnNmZXIoYXNzZXRUcmFuc2ZlclR4bjogdWludDY0KSAtPiB1aW50NjQ6CmFtb3VudEZyb21Bc3NldFRyYW5zZmVyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy91dGlscy5hbGdvLnRzOjIzCiAgICAvLyBleHBvcnQgZnVuY3Rpb24gYW1vdW50RnJvbUFzc2V0VHJhbnNmZXIoYXNzZXRUcmFuc2ZlclR4bjogZ3R4bi5Bc3NldFRyYW5zZmVyVHhuKTogdWludDY0IHsKICAgIHByb3RvIDEgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy91dGlscy5hbGdvLnRzOjI0CiAgICAvLyBhc3NlcnQoYXNzZXRUcmFuc2ZlclR4bi5hc3NldFJlY2VpdmVyID09PSBHbG9iYWwuY3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcywgYEFzc2V0IG11c3QgZ28gdG8gYXBwYCk7CiAgICBmcmFtZV9kaWcgLTEKICAgIGd0eG5zIEFzc2V0UmVjZWl2ZXIKICAgIGdsb2JhbCBDdXJyZW50QXBwbGljYXRpb25BZGRyZXNzCiAgICA9PQogICAgYXNzZXJ0IC8vIEFzc2V0IG11c3QgZ28gdG8gYXBwCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3V0aWxzLmFsZ28udHM6MjcKICAgIC8vIGFzc2VydChhc3NldFRyYW5zZmVyVHhuLnJla2V5VG8gPT09IEdsb2JhbC56ZXJvQWRkcmVzcywgYFJla2V5IG5vdCBhbGxvd2VkYCk7CiAgICBmcmFtZV9kaWcgLTEKICAgIGd0eG5zIFJla2V5VG8KICAgIGdsb2JhbCBaZXJvQWRkcmVzcwogICAgPT0KICAgIGFzc2VydCAvLyBSZWtleSBub3QgYWxsb3dlZAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy91dGlscy5hbGdvLnRzOjI4CiAgICAvLyBhc3NlcnQoYXNzZXRUcmFuc2ZlclR4bi5hc3NldENsb3NlVG8gPT09IEdsb2JhbC56ZXJvQWRkcmVzcywgYENsb3NlVG8gbm90IGFsbG93ZWRgKTsKICAgIGZyYW1lX2RpZyAtMQogICAgZ3R4bnMgQXNzZXRDbG9zZVRvCiAgICBnbG9iYWwgWmVyb0FkZHJlc3MKICAgID09CiAgICBhc3NlcnQgLy8gQ2xvc2VUbyBub3QgYWxsb3dlZAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy91dGlscy5hbGdvLnRzOjI5CiAgICAvLyByZXR1cm4gYXNzZXRUcmFuc2ZlclR4bi5hc3NldEFtb3VudDsKICAgIGZyYW1lX2RpZyAtMQogICAgZ3R4bnMgQXNzZXRBbW91bnQKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvdXRpbHMuYWxnby50czo6YW1vdW50RnJvbVBheW1lbnQocGF5bWVudFR4bjogdWludDY0KSAtPiB1aW50NjQ6CmFtb3VudEZyb21QYXltZW50OgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy91dGlscy5hbGdvLnRzOjMyCiAgICAvLyBleHBvcnQgZnVuY3Rpb24gYW1vdW50RnJvbVBheW1lbnQocGF5bWVudFR4bjogZ3R4bi5QYXltZW50VHhuKTogdWludDY0IHsKICAgIHByb3RvIDEgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy91dGlscy5hbGdvLnRzOjMzCiAgICAvLyBpZiAocGF5bWVudFR4bi5yZWNlaXZlciAhPT0gR2xvYmFsLmN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MpIHJldHVybiAwOwogICAgZnJhbWVfZGlnIC0xCiAgICBndHhucyBSZWNlaXZlcgogICAgZ2xvYmFsIEN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MKICAgICE9CiAgICBieiBhbW91bnRGcm9tUGF5bWVudF9hZnRlcl9pZl9lbHNlQDIKICAgIGludGNfMSAvLyAwCiAgICByZXRzdWIKCmFtb3VudEZyb21QYXltZW50X2FmdGVyX2lmX2Vsc2VAMjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvdXRpbHMuYWxnby50czozNQogICAgLy8gaWYgKHBheW1lbnRUeG4ucmVrZXlUbyAhPT0gR2xvYmFsLnplcm9BZGRyZXNzKSByZXR1cm4gMDsKICAgIGZyYW1lX2RpZyAtMQogICAgZ3R4bnMgUmVrZXlUbwogICAgZ2xvYmFsIFplcm9BZGRyZXNzCiAgICAhPQogICAgYnogYW1vdW50RnJvbVBheW1lbnRfYWZ0ZXJfaWZfZWxzZUA0CiAgICBpbnRjXzEgLy8gMAogICAgcmV0c3ViCgphbW91bnRGcm9tUGF5bWVudF9hZnRlcl9pZl9lbHNlQDQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3V0aWxzLmFsZ28udHM6MzYKICAgIC8vIGlmIChwYXltZW50VHhuLmNsb3NlUmVtYWluZGVyVG8gIT09IEdsb2JhbC56ZXJvQWRkcmVzcykgcmV0dXJuIDA7CiAgICBmcmFtZV9kaWcgLTEKICAgIGd0eG5zIENsb3NlUmVtYWluZGVyVG8KICAgIGdsb2JhbCBaZXJvQWRkcmVzcwogICAgIT0KICAgIGJ6IGFtb3VudEZyb21QYXltZW50X2FmdGVyX2lmX2Vsc2VANgogICAgaW50Y18xIC8vIDAKICAgIHJldHN1YgoKYW1vdW50RnJvbVBheW1lbnRfYWZ0ZXJfaWZfZWxzZUA2OgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy91dGlscy5hbGdvLnRzOjM4CiAgICAvLyByZXR1cm4gcGF5bWVudFR4bi5hbW91bnQ7CiAgICBmcmFtZV9kaWcgLTEKICAgIGd0eG5zIEFtb3VudAogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9icmlkZ2UuY29udHJhY3QuYWxnby50czo6QnJpZGdlLmNyZWF0ZUFwcGxpY2F0aW9uW3JvdXRpbmddKCkgLT4gdm9pZDoKY3JlYXRlQXBwbGljYXRpb246CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2JyaWRnZS5jb250cmFjdC5hbGdvLnRzOjY5CiAgICAvLyBjcmVhdGVBcHBsaWNhdGlvbihvd25lcjogQWRkcmVzcywgY2hhaW5JZDogQnl0ZSwgbWVzc2VuZ2VyOiBBcHBsaWNhdGlvbiwgZ2FzT3JhY2xlOiBBcHBsaWNhdGlvbik6IHZvaWQgewogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMyAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5zdGF0aWNfYXJyYXk8YXJjNC51aW50OCwgMzI+CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18wIC8vIDEKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQudWludDgKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDMKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzIgLy8gOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50NjQKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDQKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzIgLy8gOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50NjQKICAgIGJ0b2kKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvb3duYWJsZS5hbGdvLnRzOjYKICAgIC8vIHByb3RlY3RlZCBvd25lciA9IEdsb2JhbFN0YXRlPEFkZHJlc3M+KCk7CiAgICBieXRlY18yIC8vICJvd25lciIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvb3duYWJsZS5hbGdvLnRzOjkKICAgIC8vIHRoaXMub3duZXIudmFsdWUgPSBvd25lcjsKICAgIGRpZyA0CiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9nYXMtdXNhZ2UuYWxnby50czo5CiAgICAvLyBnYXNPcmFjbGUgPSBHbG9iYWxTdGF0ZTxBcHBsaWNhdGlvbj4oKTsKICAgIGJ5dGVjXzMgLy8gImdhc09yYWNsZSIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvZ2FzLXVzYWdlLmFsZ28udHM6MTQKICAgIC8vIHRoaXMuZ2FzT3JhY2xlLnZhbHVlID0gZ2FzT3JhY2xlOwogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcm91dGVyLmFsZ28udHM6NDIKICAgIC8vIHByaXZhdGUgc3RvcEF1dGhvcml0eSA9IEdsb2JhbFN0YXRlPEFkZHJlc3M+KCk7Ly8gY2FuIHJlc3RyaWN0IGRlcG9zaXQgb3Igd2l0aGRyYXcgb3BlcmF0aW9ucwogICAgYnl0ZWMgOSAvLyAic3RvcEF1dGhvcml0eSIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcm91dGVyLmFsZ28udHM6NTcKICAgIC8vIHRoaXMuc3RvcEF1dGhvcml0eS52YWx1ZSA9IG93bmVyOwogICAgdW5jb3ZlciAzCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9icmlkZ2UuY29udHJhY3QuYWxnby50czo1NwogICAgLy8gY2hhaW5JZCA9IEdsb2JhbFN0YXRlPEJ5dGU+KCk7CiAgICBieXRlYyA1IC8vICJjaGFpbklkIgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9icmlkZ2UuY29udHJhY3QuYWxnby50czo3MQogICAgLy8gdGhpcy5jaGFpbklkLnZhbHVlID0gY2hhaW5JZDsKICAgIHVuY292ZXIgMgogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvYnJpZGdlLmNvbnRyYWN0LmFsZ28udHM6NTgKICAgIC8vIG1lc3NlbmdlciA9IEdsb2JhbFN0YXRlPEFwcGxpY2F0aW9uPigpOwogICAgYnl0ZWMgNiAvLyAibWVzc2VuZ2VyIgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9icmlkZ2UuY29udHJhY3QuYWxnby50czo3MgogICAgLy8gdGhpcy5tZXNzZW5nZXIudmFsdWUgPSBtZXNzZW5nZXI7CiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9icmlkZ2UuY29udHJhY3QuYWxnby50czo2OQogICAgLy8gY3JlYXRlQXBwbGljYXRpb24ob3duZXI6IEFkZHJlc3MsIGNoYWluSWQ6IEJ5dGUsIG1lc3NlbmdlcjogQXBwbGljYXRpb24sIGdhc09yYWNsZTogQXBwbGljYXRpb24pOiB2b2lkIHsKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2JyaWRnZS5jb250cmFjdC5hbGdvLnRzOjpCcmlkZ2Uub3B0SW5Bc3NldFtyb3V0aW5nXSgpIC0+IHZvaWQ6Cm9wdEluQXNzZXQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2JyaWRnZS5jb250cmFjdC5hbGdvLnRzOjc1CiAgICAvLyBvcHRJbkFzc2V0KGFzc2V0OiBBc3NldCk6IHZvaWQgewogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ2NAogICAgYnRvaQogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9icmlkZ2UuY29udHJhY3QuYWxnby50czo3NgogICAgLy8gdGhpcy5vbmx5T3duZXIoKTsKICAgIGNhbGxzdWIgb25seU93bmVyCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2JyaWRnZS5jb250cmFjdC5hbGdvLnRzOjc5LTg1CiAgICAvLyBpdHhuCiAgICAvLyAgIC5hc3NldFRyYW5zZmVyKHsKICAgIC8vICAgICB4ZmVyQXNzZXQ6IGFzc2V0LAogICAgLy8gICAgIGFzc2V0QW1vdW50OiAwLAogICAgLy8gICAgIGFzc2V0UmVjZWl2ZXI6IEdsb2JhbC5jdXJyZW50QXBwbGljYXRpb25BZGRyZXNzLAogICAgLy8gICB9KQogICAgLy8gICAuc3VibWl0KCk7CiAgICBpdHhuX2JlZ2luCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2JyaWRnZS5jb250cmFjdC5hbGdvLnRzOjgzCiAgICAvLyBhc3NldFJlY2VpdmVyOiBHbG9iYWwuY3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcywKICAgIGdsb2JhbCBDdXJyZW50QXBwbGljYXRpb25BZGRyZXNzCiAgICBpdHhuX2ZpZWxkIEFzc2V0UmVjZWl2ZXIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvYnJpZGdlLmNvbnRyYWN0LmFsZ28udHM6ODIKICAgIC8vIGFzc2V0QW1vdW50OiAwLAogICAgaW50Y18xIC8vIDAKICAgIGl0eG5fZmllbGQgQXNzZXRBbW91bnQKICAgIGl0eG5fZmllbGQgWGZlckFzc2V0CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2JyaWRnZS5jb250cmFjdC5hbGdvLnRzOjc5LTg0CiAgICAvLyBpdHhuCiAgICAvLyAgIC5hc3NldFRyYW5zZmVyKHsKICAgIC8vICAgICB4ZmVyQXNzZXQ6IGFzc2V0LAogICAgLy8gICAgIGFzc2V0QW1vdW50OiAwLAogICAgLy8gICAgIGFzc2V0UmVjZWl2ZXI6IEdsb2JhbC5jdXJyZW50QXBwbGljYXRpb25BZGRyZXNzLAogICAgLy8gICB9KQogICAgcHVzaGludCA0IC8vIDQKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMSAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9icmlkZ2UuY29udHJhY3QuYWxnby50czo3OS04NQogICAgLy8gaXR4bgogICAgLy8gICAuYXNzZXRUcmFuc2Zlcih7CiAgICAvLyAgICAgeGZlckFzc2V0OiBhc3NldCwKICAgIC8vICAgICBhc3NldEFtb3VudDogMCwKICAgIC8vICAgICBhc3NldFJlY2VpdmVyOiBHbG9iYWwuY3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcywKICAgIC8vICAgfSkKICAgIC8vICAgLnN1Ym1pdCgpOwogICAgaXR4bl9zdWJtaXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvYnJpZGdlLmNvbnRyYWN0LmFsZ28udHM6ODcKICAgIC8vIGxvZygnQnJpZGdlOiBvcHQtaW4gY29tcGxldGVkJyk7CiAgICBwdXNoYnl0ZXMgIkJyaWRnZTogb3B0LWluIGNvbXBsZXRlZCIKICAgIGxvZwogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9icmlkZ2UuY29udHJhY3QuYWxnby50czo3NQogICAgLy8gb3B0SW5Bc3NldChhc3NldDogQXNzZXQpOiB2b2lkIHsKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2JyaWRnZS5jb250cmFjdC5hbGdvLnRzOjpCcmlkZ2Uuc3dhcEFuZEJyaWRnZVtyb3V0aW5nXSgpIC0+IHZvaWQ6CnN3YXBBbmRCcmlkZ2U6CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2JyaWRnZS5jb250cmFjdC5hbGdvLnRzOjkwCiAgICAvLyBAYWJpbWV0aG9kKHsgZGVmYXVsdEFyZ3VtZW50czogeyBidWRnZXQ6IHsgY29uc3RhbnQ6IDEwMDAgfSB9IH0pCiAgICB0eG4gR3JvdXBJbmRleAogICAgcHVzaGludCAyIC8vIDIKICAgIC0KICAgIGR1cAogICAgZ3R4bnMgVHlwZUVudW0KICAgIGludGNfMCAvLyBwYXkKICAgID09CiAgICBhc3NlcnQgLy8gdHJhbnNhY3Rpb24gdHlwZSBpcyBwYXkKICAgIHR4biBHcm91cEluZGV4CiAgICBpbnRjXzAgLy8gMQogICAgLQogICAgZHVwCiAgICBndHhucyBUeXBlRW51bQogICAgcHVzaGludCA0IC8vIGF4ZmVyCiAgICA9PQogICAgYXNzZXJ0IC8vIHRyYW5zYWN0aW9uIHR5cGUgaXMgYXhmZXIKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzMgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZHVwCiAgICBsZW4KICAgIGludGNfMCAvLyAxCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ4CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAzCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18zIC8vIDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnN0YXRpY19hcnJheTxhcmM0LnVpbnQ4LCAzMj4KICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDQKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzMgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgNQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ2NAogICAgYnRvaQogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9icmlkZ2UuY29udHJhY3QuYWxnby50czoxMDAKICAgIC8vIHRoaXMuX3N3YXBBbmRCcmlkZ2UoYW1vdW50RnJvbVBheW1lbnQocGF5bWVudFJlZiksIGFzc2V0VHJhbnNmZXJSZWYsIHJlY2lwaWVudCwgZGVzdGluYXRpb25DaGFpbklkLCByZWNlaXZlVG9rZW4sIG5vbmNlLCAwLCBidWRnZXQpOwogICAgdW5jb3ZlciA2CiAgICBjYWxsc3ViIGFtb3VudEZyb21QYXltZW50CiAgICBjb3ZlciA2CiAgICBjb3ZlciA2CiAgICBpbnRjXzEgLy8gMAogICAgdW5jb3ZlciA3CiAgICBjYWxsc3ViIF9zd2FwQW5kQnJpZGdlCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2JyaWRnZS5jb250cmFjdC5hbGdvLnRzOjkwCiAgICAvLyBAYWJpbWV0aG9kKHsgZGVmYXVsdEFyZ3VtZW50czogeyBidWRnZXQ6IHsgY29uc3RhbnQ6IDEwMDAgfSB9IH0pCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9icmlkZ2UuY29udHJhY3QuYWxnby50czo6QnJpZGdlLnN3YXBBbmRCcmlkZ2VXaXRoU3RhYmxlW3JvdXRpbmddKCkgLT4gdm9pZDoKc3dhcEFuZEJyaWRnZVdpdGhTdGFibGU6CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2JyaWRnZS5jb250cmFjdC5hbGdvLnRzOjEwMwogICAgLy8gQGFiaW1ldGhvZCh7IGRlZmF1bHRBcmd1bWVudHM6IHsgYnVkZ2V0OiB7IGNvbnN0YW50OiAxMDAwIH0gfSB9KQogICAgdHhuIEdyb3VwSW5kZXgKICAgIGludGNfMCAvLyAxCiAgICAtCiAgICBkdXAKICAgIGd0eG5zIFR5cGVFbnVtCiAgICBwdXNoaW50IDQgLy8gYXhmZXIKICAgID09CiAgICBhc3NlcnQgLy8gdHJhbnNhY3Rpb24gdHlwZSBpcyBheGZlcgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMyAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5zdGF0aWNfYXJyYXk8YXJjNC51aW50OCwgMzI+CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18wIC8vIDEKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQudWludDgKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDMKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzMgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgNAogICAgZHVwCiAgICBsZW4KICAgIGludGNfMyAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5zdGF0aWNfYXJyYXk8YXJjNC51aW50OCwgMzI+CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyA1CiAgICBkdXAKICAgIGxlbgogICAgaW50Y18yIC8vIDgKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQudWludDY0CiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyA2CiAgICBkdXAKICAgIGxlbgogICAgaW50Y18yIC8vIDgKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQudWludDY0CiAgICBidG9pCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2JyaWRnZS5jb250cmFjdC5hbGdvLnRzOjExMwogICAgLy8gdGhpcy5fc3dhcEFuZEJyaWRnZSgwLCBhc3NldFRyYW5zZmVyUmVmLCByZWNpcGllbnQsIGRlc3RpbmF0aW9uQ2hhaW5JZCwgcmVjZWl2ZVRva2VuLCBub25jZSwgZmVlVG9rZW5BbW91bnQsIGJ1ZGdldCk7CiAgICBpbnRjXzEgLy8gMAogICAgY292ZXIgNwogICAgY2FsbHN1YiBfc3dhcEFuZEJyaWRnZQogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9icmlkZ2UuY29udHJhY3QuYWxnby50czoxMDMKICAgIC8vIEBhYmltZXRob2QoeyBkZWZhdWx0QXJndW1lbnRzOiB7IGJ1ZGdldDogeyBjb25zdGFudDogMTAwMCB9IH0gfSkKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2JyaWRnZS5jb250cmFjdC5hbGdvLnRzOjpCcmlkZ2UucmVjZWl2ZVRva2Vuc1tyb3V0aW5nXSgpIC0+IHZvaWQ6CnJlY2VpdmVUb2tlbnM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2JyaWRnZS5jb250cmFjdC5hbGdvLnRzOjE5MwogICAgLy8gQGFiaW1ldGhvZCgpCiAgICB0eG4gR3JvdXBJbmRleAogICAgaW50Y18wIC8vIDEKICAgIC0KICAgIGR1cAogICAgZ3R4bnMgVHlwZUVudW0KICAgIGludGNfMCAvLyBwYXkKICAgID09CiAgICBhc3NlcnQgLy8gdHJhbnNhY3Rpb24gdHlwZSBpcyBwYXkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzIgLy8gOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50NjQKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGR1cAogICAgY292ZXIgMwogICAgZHVwCiAgICBsZW4KICAgIGludGNfMyAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5zdGF0aWNfYXJyYXk8YXJjNC51aW50OCwgMzI+CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAzCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18wIC8vIDEKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQudWludDgKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDQKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzMgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgNQogICAgZHVwCiAgICBjb3ZlciA2CiAgICBkdXAKICAgIGxlbgogICAgaW50Y18zIC8vIDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnN0YXRpY19hcnJheTxhcmM0LnVpbnQ4LCAzMj4KICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDYKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzIgLy8gOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50NjQKICAgIGJ0b2kKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcm91dGVyLmFsZ28udHM6NjQKICAgIC8vIGFzc2VydCh0aGlzLmNhblN3YXAudmFsdWUsICdSb3V0ZXI6IHN3YXAgcHJvaGliaXRlZCcpOwogICAgaW50Y18xIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcm91dGVyLmFsZ28udHM6NTMKICAgIC8vIGNhblN3YXAgPSBHbG9iYWxTdGF0ZTxib29sZWFuPih7IGluaXRpYWxWYWx1ZTogdHJ1ZSB9KTsKICAgIGJ5dGVjXzEgLy8gImNhblN3YXAiCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3JvdXRlci5hbGdvLnRzOjY0CiAgICAvLyBhc3NlcnQodGhpcy5jYW5Td2FwLnZhbHVlLCAnUm91dGVyOiBzd2FwIHByb2hpYml0ZWQnKTsKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICBhc3NlcnQgLy8gUm91dGVyOiBzd2FwIHByb2hpYml0ZWQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvYnJpZGdlLmNvbnRyYWN0LmFsZ28udHM6NjQKICAgIC8vIG90aGVyQnJpZGdlcyA9IEJveE1hcDxCeXRlLCBTdGF0aWNCeXRlczwzMj4+KHsga2V5UHJlZml4OiAnYicgfSk7CiAgICBwdXNoYnl0ZXMgImIiCiAgICBkaWcgNAogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2JyaWRnZS5jb250cmFjdC5hbGdvLnRzOjIwNAogICAgLy8gYXNzZXJ0KHRoaXMub3RoZXJCcmlkZ2VzKHNvdXJjZUNoYWluSWQpLmV4aXN0cywgJ0JyaWRnZTogc291cmNlIG5vdCByZWdpc3RlcmVkJyk7CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEJyaWRnZTogc291cmNlIG5vdCByZWdpc3RlcmVkCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2JyaWRnZS5jb250cmFjdC5hbGdvLnRzOjIwNgogICAgLy8gY29uc3QgdmFsdWUgPSBhbW91bnRGcm9tUGF5bWVudChwYXltZW50UmVmKTsKICAgIHVuY292ZXIgNwogICAgY2FsbHN1YiBhbW91bnRGcm9tUGF5bWVudAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9icmlkZ2UuY29udHJhY3QuYWxnby50czoyMDcKICAgIC8vIGFzc2VydCh2YWx1ZSA+PSBzdG9yYWdlRmVlLCAnQnJpZGdlOiBub3QgZW5vdWdoIGZlZScpOwogICAgZHVwCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2JyaWRnZS5jb250cmFjdC5hbGdvLnRzOjM0OAogICAgLy8gcmV0dXJuIDE1NzAwOwogICAgaW50YyA0IC8vIDE1NzAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2JyaWRnZS5jb250cmFjdC5hbGdvLnRzOjIwNwogICAgLy8gYXNzZXJ0KHZhbHVlID49IHN0b3JhZ2VGZWUsICdCcmlkZ2U6IG5vdCBlbm91Z2ggZmVlJyk7CiAgICA+PQogICAgYXNzZXJ0IC8vIEJyaWRnZTogbm90IGVub3VnaCBmZWUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvYnJpZGdlLmNvbnRyYWN0LmFsZ28udHM6MjA5CiAgICAvLyBjb25zdCBtZXNzYWdlID0gdGhpcy5oYXNoTWVzc2FnZShhbW91bnQsIHJlY2lwaWVudCwgc291cmNlQ2hhaW5JZCwgdGhpcy5jaGFpbklkLnZhbHVlLCByZWNlaXZlVG9rZW4sIG5vbmNlKTsKICAgIGludGNfMSAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2JyaWRnZS5jb250cmFjdC5hbGdvLnRzOjU3CiAgICAvLyBjaGFpbklkID0gR2xvYmFsU3RhdGU8Qnl0ZT4oKTsKICAgIGJ5dGVjIDUgLy8gImNoYWluSWQiCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2JyaWRnZS5jb250cmFjdC5hbGdvLnRzOjIwOQogICAgLy8gY29uc3QgbWVzc2FnZSA9IHRoaXMuaGFzaE1lc3NhZ2UoYW1vdW50LCByZWNpcGllbnQsIHNvdXJjZUNoYWluSWQsIHRoaXMuY2hhaW5JZC52YWx1ZSwgcmVjZWl2ZVRva2VuLCBub25jZSk7CiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgZGlnIDgKICAgIGRpZyA4CiAgICB1bmNvdmVyIDgKICAgIHVuY292ZXIgMwogICAgZGlnIDgKICAgIHVuY292ZXIgOAogICAgY2FsbHN1YiBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2JyaWRnZS5jb250cmFjdC5hbGdvLnRzOjpCcmlkZ2UuaGFzaE1lc3NhZ2UKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvYnJpZGdlLmNvbnRyYWN0LmFsZ28udHM6MjEwCiAgICAvLyBjb25zdCBtZXNzYWdlV2l0aFNlbmRlciA9IGhhc2hXaXRoU2VuZGVyQWRkcmVzcyhtZXNzYWdlLCB0aGlzLm90aGVyQnJpZGdlcyhzb3VyY2VDaGFpbklkKS52YWx1ZS5ieXRlcyk7CiAgICB1bmNvdmVyIDIKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBCb3ggbXVzdCBoYXZlIHZhbHVlCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3V0aWxzLmFsZ28udHM6NTIKICAgIC8vIGNvbnN0IGg6IGJ5dGVzID0gb3Aua2VjY2FrMjU2KG9wLmNvbmNhdChtZXNzYWdlLmJ5dGVzLCBzZW5kZXJBZGRyZXNzKSk7CiAgICBkaWcgMQogICAgc3dhcAogICAgY29uY2F0CiAgICBrZWNjYWsyNTYKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvdXRpbHMuYWxnby50czo1NQogICAgLy8gY29uc3QgZmlyc3QyID0gb3Auc3Vic3RyaW5nKG1lc3NhZ2UuYnl0ZXMsIDAsIDIpOwogICAgc3dhcAogICAgc3Vic3RyaW5nIDAgMgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy91dGlscy5hbGdvLnRzOjU3CiAgICAvLyBjb25zdCBsYXN0MzAgPSBvcC5zdWJzdHJpbmcoaCwgMiwgMzIpOwogICAgc3dhcAogICAgc3Vic3RyaW5nIDIgMzIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvdXRpbHMuYWxnby50czo2MAogICAgLy8gcmV0dXJuIG5ldyBTdGF0aWNCeXRlczwzMj4ob3AuY29uY2F0KGZpcnN0MiwgbGFzdDMwKSk7CiAgICBjb25jYXQKICAgIGR1cAogICAgY292ZXIgNgogICAgZHVwCiAgICBsZW4KICAgIGludGNfMyAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIHNpemUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvYnJpZGdlLmNvbnRyYWN0LmFsZ28udHM6NjAKICAgIC8vIHByb2Nlc3NlZE1lc3NhZ2VzID0gQm94TWFwPFN0YXRpY0J5dGVzPDMyPiwgU3RhdGljQnl0ZXM+KHsga2V5UHJlZml4OiAnbScgfSk7CiAgICBwdXNoYnl0ZXMgIm0iCiAgICBkaWcgMQogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2JyaWRnZS5jb250cmFjdC5hbGdvLnRzOjIxMgogICAgLy8gYXNzZXJ0KCF0aGlzLnByb2Nlc3NlZE1lc3NhZ2VzKG1lc3NhZ2VXaXRoU2VuZGVyKS5leGlzdHMsICdCcmlkZ2U6IG1lc3NhZ2UgcHJvY2Vzc2VkJyk7CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgIQogICAgYXNzZXJ0IC8vIEJyaWRnZTogbWVzc2FnZSBwcm9jZXNzZWQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvYnJpZGdlLmNvbnRyYWN0LmFsZ28udHM6MjE0CiAgICAvLyB0aGlzLnByb2Nlc3NlZE1lc3NhZ2VzKG1lc3NhZ2VXaXRoU2VuZGVyKS52YWx1ZSA9IG5ldyBTdGF0aWNCeXRlcygpOwogICAgcHVzaGJ5dGVzIDB4CiAgICBib3hfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2JyaWRnZS5jb250cmFjdC5hbGdvLnRzOjIxNy0yMjEKICAgIC8vIGFzc2VydChhYmlDYWxsKHsKICAgIC8vICAgbWV0aG9kOiBNZXNzZW5nZXIucHJvdG90eXBlLnJlY2VpdmVkTWVzc2FnZXMsCiAgICAvLyAgIGFwcElkOiB0aGlzLm1lc3Nlbmdlci52YWx1ZS5pZCwKICAgIC8vICAgYXJnczogW21lc3NhZ2VXaXRoU2VuZGVyXSwKICAgIC8vIH0pLnJldHVyblZhbHVlLCAnQnJpZGdlOiBubyBtZXNzYWdlJyk7CiAgICBpdHhuX2JlZ2luCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2JyaWRnZS5jb250cmFjdC5hbGdvLnRzOjIxOQogICAgLy8gYXBwSWQ6IHRoaXMubWVzc2VuZ2VyLnZhbHVlLmlkLAogICAgaW50Y18xIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvYnJpZGdlLmNvbnRyYWN0LmFsZ28udHM6NTgKICAgIC8vIG1lc3NlbmdlciA9IEdsb2JhbFN0YXRlPEFwcGxpY2F0aW9uPigpOwogICAgYnl0ZWMgNiAvLyAibWVzc2VuZ2VyIgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9icmlkZ2UuY29udHJhY3QuYWxnby50czoyMTkKICAgIC8vIGFwcElkOiB0aGlzLm1lc3Nlbmdlci52YWx1ZS5pZCwKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2JyaWRnZS5jb250cmFjdC5hbGdvLnRzOjIxNy0yMjEKICAgIC8vIGFzc2VydChhYmlDYWxsKHsKICAgIC8vICAgbWV0aG9kOiBNZXNzZW5nZXIucHJvdG90eXBlLnJlY2VpdmVkTWVzc2FnZXMsCiAgICAvLyAgIGFwcElkOiB0aGlzLm1lc3Nlbmdlci52YWx1ZS5pZCwKICAgIC8vICAgYXJnczogW21lc3NhZ2VXaXRoU2VuZGVyXSwKICAgIC8vIH0pLnJldHVyblZhbHVlLCAnQnJpZGdlOiBubyBtZXNzYWdlJyk7CiAgICBwdXNoYnl0ZXMgMHgzM2UxNDdhYSAvLyBtZXRob2QgInJlY2VpdmVkTWVzc2FnZXMoYnl0ZVszMl0pYm9vbCIKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uSUQKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBwdXNoaW50IDYgLy8gYXBwbAogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50Y18xIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICBpdHhuX3N1Ym1pdAogICAgaXR4biBMYXN0TG9nCiAgICBkdXAKICAgIGV4dHJhY3QgNCAwCiAgICBzd2FwCiAgICBleHRyYWN0IDAgNAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICA9PQogICAgYXNzZXJ0IC8vIEJ5dGVzIGhhcyB2YWxpZCBwcmVmaXgKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzAgLy8gMQogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5ib29sCiAgICBpbnRjXzEgLy8gMAogICAgZ2V0Yml0CiAgICBhc3NlcnQgLy8gQnJpZGdlOiBubyBtZXNzYWdlCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2JyaWRnZS5jb250cmFjdC5hbGdvLnRzOjIyMwogICAgLy8gY29uc3QgdG9rZW5JZDogdWludDY0ID0gb3AuZXh0cmFjdFVpbnQ2NChyZWNlaXZlVG9rZW4uYnl0ZXMsIDI0KTsKICAgIHVuY292ZXIgMgogICAgcHVzaGludCAyNCAvLyAyNAogICAgZXh0cmFjdF91aW50NjQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvYnJpZGdlLmNvbnRyYWN0LmFsZ28udHM6MjI1LTIzMAogICAgLy8gY29uc3QgcmVjZWl2ZUFtb3VudCA9IHRoaXMucmVjZWl2ZUFuZFN3YXBGcm9tVlVzZCgKICAgIC8vICAgQXNzZXQodG9rZW5JZCksCiAgICAvLyAgIHJlY2lwaWVudEFkZHJlc3MsCiAgICAvLyAgIGFtb3VudCwKICAgIC8vICAgcmVjZWl2ZUFtb3VudE1pbiwKICAgIC8vICk7CiAgICB1bmNvdmVyIDMKICAgIHVuY292ZXIgNAogICAgdW5jb3ZlciA0CiAgICBjYWxsc3ViIHJlY2VpdmVBbmRTd2FwRnJvbVZVc2QKICAgIHN3YXAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvYnJpZGdlLmNvbnRyYWN0LmFsZ28udHM6MzQ4CiAgICAvLyByZXR1cm4gMTU3MDA7CiAgICBpbnRjIDQgLy8gMTU3MDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvYnJpZGdlLmNvbnRyYWN0LmFsZ28udHM6MjMzCiAgICAvLyBjb25zdCBleHRyYUdhczogdWludDY0ID0gdmFsdWUgLSBzdG9yYWdlRmVlOwogICAgLQogICAgZHVwCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2JyaWRnZS5jb250cmFjdC5hbGdvLnRzOjIzNAogICAgLy8gaWYgKGV4dHJhR2FzID4gMCkgewogICAgYnogcmVjZWl2ZVRva2Vuc19hZnRlcl9pZl9lbHNlQDUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvYnJpZGdlLmNvbnRyYWN0LmFsZ28udHM6MjM1LTIzOAogICAgLy8gaXR4bi5wYXltZW50KHsKICAgIC8vICAgYW1vdW50OiBleHRyYUdhcywKICAgIC8vICAgcmVjZWl2ZXI6IHJlY2lwaWVudEFkZHJlc3MuYnl0ZXMsCiAgICAvLyB9KS5zdWJtaXQoKTsKICAgIGl0eG5fYmVnaW4KICAgIGRpZyA0CiAgICBpdHhuX2ZpZWxkIFJlY2VpdmVyCiAgICBkdXAKICAgIGl0eG5fZmllbGQgQW1vdW50CiAgICBpbnRjXzAgLy8gMQogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50Y18xIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICBpdHhuX3N1Ym1pdAoKcmVjZWl2ZVRva2Vuc19hZnRlcl9pZl9lbHNlQDU6CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2JyaWRnZS5jb250cmFjdC5hbGdvLnRzOjI0MC0yNDYKICAgIC8vIGVtaXQ8VG9rZW5zUmVjZWl2ZWQ+KHsKICAgIC8vICAgcmVjZWl2ZUFtb3VudCwKICAgIC8vICAgcmVjaXBpZW50OiByZWNpcGllbnRBZGRyZXNzLAogICAgLy8gICBub25jZSwKICAgIC8vICAgbWVzc2VuZ2VyOiBBTExCUklER0VfTUVTU0VOR0VSLAogICAgLy8gICBtZXNzYWdlOiBtZXNzYWdlV2l0aFNlbmRlciwKICAgIC8vIH0pOwogICAgZGlnIDEKICAgIGl0b2IKICAgIGRpZyA1CiAgICBjb25jYXQKICAgIGRpZyA0CiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvYnJpZGdlLmNvbnRyYWN0LmFsZ28udHM6MjQ0CiAgICAvLyBtZXNzZW5nZXI6IEFMTEJSSURHRV9NRVNTRU5HRVIsCiAgICBieXRlYyAxMCAvLyAweDAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2JyaWRnZS5jb250cmFjdC5hbGdvLnRzOjI0MC0yNDYKICAgIC8vIGVtaXQ8VG9rZW5zUmVjZWl2ZWQ+KHsKICAgIC8vICAgcmVjZWl2ZUFtb3VudCwKICAgIC8vICAgcmVjaXBpZW50OiByZWNpcGllbnRBZGRyZXNzLAogICAgLy8gICBub25jZSwKICAgIC8vICAgbWVzc2VuZ2VyOiBBTExCUklER0VfTUVTU0VOR0VSLAogICAgLy8gICBtZXNzYWdlOiBtZXNzYWdlV2l0aFNlbmRlciwKICAgIC8vIH0pOwogICAgY29uY2F0CiAgICBkaWcgMwogICAgY29uY2F0CiAgICBwdXNoYnl0ZXMgMHg0NTgzNmFkNiAvLyBtZXRob2QgIlRva2Vuc1JlY2VpdmVkKHVpbnQ2NCxhZGRyZXNzLGJ5dGVbMzJdLGJ5dGUsYnl0ZVszMl0pIgogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvYnJpZGdlLmNvbnRyYWN0LmFsZ28udHM6MTkzCiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2JyaWRnZS5jb250cmFjdC5hbGdvLnRzOjpCcmlkZ2UucmVnaXN0ZXJCcmlkZ2Vbcm91dGluZ10oKSAtPiB2b2lkOgpyZWdpc3RlckJyaWRnZToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvYnJpZGdlLmNvbnRyYWN0LmFsZ28udHM6MjQ5CiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzAgLy8gMQogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50OAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZHVwCiAgICBsZW4KICAgIGludGNfMyAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5zdGF0aWNfYXJyYXk8YXJjNC51aW50OCwgMzI+CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2JyaWRnZS5jb250cmFjdC5hbGdvLnRzOjI1MQogICAgLy8gdGhpcy5vbmx5T3duZXIoKTsKICAgIGNhbGxzdWIgb25seU93bmVyCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2JyaWRnZS5jb250cmFjdC5hbGdvLnRzOjY0CiAgICAvLyBvdGhlckJyaWRnZXMgPSBCb3hNYXA8Qnl0ZSwgU3RhdGljQnl0ZXM8MzI+Pih7IGtleVByZWZpeDogJ2InIH0pOwogICAgcHVzaGJ5dGVzICJiIgogICAgdW5jb3ZlciAyCiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvYnJpZGdlLmNvbnRyYWN0LmFsZ28udHM6MjUyCiAgICAvLyB0aGlzLm90aGVyQnJpZGdlcyhjaGFpbklkKS52YWx1ZSA9IGJyaWRnZUFkZHJlc3M7CiAgICBzd2FwCiAgICBib3hfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2JyaWRnZS5jb250cmFjdC5hbGdvLnRzOjI0OQogICAgLy8gQGFiaW1ldGhvZCgpCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9icmlkZ2UuY29udHJhY3QuYWxnby50czo6QnJpZGdlLmFkZEJyaWRnZVRva2VuW3JvdXRpbmddKCkgLT4gdm9pZDoKYWRkQnJpZGdlVG9rZW46CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2JyaWRnZS5jb250cmFjdC5hbGdvLnRzOjI1NQogICAgLy8gQGFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18wIC8vIDEKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQudWludDgKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzMgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9icmlkZ2UuY29udHJhY3QuYWxnby50czoyNTcKICAgIC8vIHRoaXMub25seU93bmVyKCk7CiAgICBjYWxsc3ViIG9ubHlPd25lcgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9icmlkZ2UuY29udHJhY3QuYWxnby50czozNjEKICAgIC8vIHJldHVybiBjaGFpbklkLmJ5dGVzLmNvbmNhdCh0b2tlbi5ieXRlcyk7CiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvYnJpZGdlLmNvbnRyYWN0LmFsZ28udHM6NjcKICAgIC8vIG90aGVyQnJpZGdlVG9rZW5zID0gQm94TWFwPGJ5dGVzLCBTdGF0aWNCeXRlcz4oeyBrZXlQcmVmaXg6ICd0JyB9KTsKICAgIGJ5dGVjIDcgLy8gInQiCiAgICBzd2FwCiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvYnJpZGdlLmNvbnRyYWN0LmFsZ28udHM6MjU4CiAgICAvLyB0aGlzLm90aGVyQnJpZGdlVG9rZW5zKHRoaXMuX2dldE90aGVyQnJpZGdlVG9rZW5zS2V5KGNoYWluSWQsIHRva2VuQWRkcmVzcykpLnZhbHVlID0gbmV3IFN0YXRpY0J5dGVzKCk7CiAgICBwdXNoYnl0ZXMgMHgKICAgIGJveF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvYnJpZGdlLmNvbnRyYWN0LmFsZ28udHM6MjU1CiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2JyaWRnZS5jb250cmFjdC5hbGdvLnRzOjpCcmlkZ2UucmVtb3ZlQnJpZGdlVG9rZW5bcm91dGluZ10oKSAtPiB2b2lkOgpyZW1vdmVCcmlkZ2VUb2tlbjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvYnJpZGdlLmNvbnRyYWN0LmFsZ28udHM6MjYxCiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzAgLy8gMQogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50OAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZHVwCiAgICBsZW4KICAgIGludGNfMyAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5zdGF0aWNfYXJyYXk8YXJjNC51aW50OCwgMzI+CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2JyaWRnZS5jb250cmFjdC5hbGdvLnRzOjI2MwogICAgLy8gdGhpcy5vbmx5T3duZXIoKTsKICAgIGNhbGxzdWIgb25seU93bmVyCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2JyaWRnZS5jb250cmFjdC5hbGdvLnRzOjM2MQogICAgLy8gcmV0dXJuIGNoYWluSWQuYnl0ZXMuY29uY2F0KHRva2VuLmJ5dGVzKTsKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9icmlkZ2UuY29udHJhY3QuYWxnby50czo2NwogICAgLy8gb3RoZXJCcmlkZ2VUb2tlbnMgPSBCb3hNYXA8Ynl0ZXMsIFN0YXRpY0J5dGVzPih7IGtleVByZWZpeDogJ3QnIH0pOwogICAgYnl0ZWMgNyAvLyAidCIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9icmlkZ2UuY29udHJhY3QuYWxnby50czoyNjQKICAgIC8vIHRoaXMub3RoZXJCcmlkZ2VUb2tlbnModGhpcy5fZ2V0T3RoZXJCcmlkZ2VUb2tlbnNLZXkoY2hhaW5JZCwgdG9rZW5BZGRyZXNzKSkuZGVsZXRlKCk7CiAgICBib3hfZGVsCiAgICBwb3AKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvYnJpZGdlLmNvbnRyYWN0LmFsZ28udHM6MjYxCiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2JyaWRnZS5jb250cmFjdC5hbGdvLnRzOjpCcmlkZ2Uud2l0aGRyYXdHYXNUb2tlbnNbcm91dGluZ10oKSAtPiB2b2lkOgp3aXRoZHJhd0dhc1Rva2VuczoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvYnJpZGdlLmNvbnRyYWN0LmFsZ28udHM6MjY3CiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzIgLy8gOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50NjQKICAgIGJ0b2kKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvYnJpZGdlLmNvbnRyYWN0LmFsZ28udHM6MjY5CiAgICAvLyB0aGlzLm9ubHlPd25lcigpOwogICAgY2FsbHN1YiBvbmx5T3duZXIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvYnJpZGdlLmNvbnRyYWN0LmFsZ28udHM6MjcwCiAgICAvLyBpdHhuLnBheW1lbnQoeyBhbW91bnQ6IGFtb3VudCwgcmVjZWl2ZXI6IHRoaXMub3duZXIudmFsdWUuYnl0ZXMgfSkuc3VibWl0KCk7CiAgICBpdHhuX2JlZ2luCiAgICBpbnRjXzEgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9vd25hYmxlLmFsZ28udHM6NgogICAgLy8gcHJvdGVjdGVkIG93bmVyID0gR2xvYmFsU3RhdGU8QWRkcmVzcz4oKTsKICAgIGJ5dGVjXzIgLy8gIm93bmVyIgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9icmlkZ2UuY29udHJhY3QuYWxnby50czoyNzAKICAgIC8vIGl0eG4ucGF5bWVudCh7IGFtb3VudDogYW1vdW50LCByZWNlaXZlcjogdGhpcy5vd25lci52YWx1ZS5ieXRlcyB9KS5zdWJtaXQoKTsKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICBpdHhuX2ZpZWxkIFJlY2VpdmVyCiAgICBpdHhuX2ZpZWxkIEFtb3VudAogICAgaW50Y18wIC8vIDEKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMSAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgaXR4bl9zdWJtaXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvYnJpZGdlLmNvbnRyYWN0LmFsZ28udHM6MjY3CiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2JyaWRnZS5jb250cmFjdC5hbGdvLnRzOjpCcmlkZ2Uud2l0aGRyYXdCcmlkZ2luZ0ZlZUluVG9rZW5zW3JvdXRpbmddKCkgLT4gdm9pZDoKd2l0aGRyYXdCcmlkZ2luZ0ZlZUluVG9rZW5zOgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9icmlkZ2UuY29udHJhY3QuYWxnby50czoyNzMKICAgIC8vIEBhYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ2NAogICAgYnRvaQogICAgZHVwCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2JyaWRnZS5jb250cmFjdC5hbGdvLnRzOjI3NQogICAgLy8gdGhpcy5vbmx5T3duZXIoKTsKICAgIGNhbGxzdWIgb25seU93bmVyCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2JyaWRnZS5jb250cmFjdC5hbGdvLnRzOjI3NgogICAgLy8gY29uc3QgYXBwQWNjdDogQWNjb3VudCA9IEdsb2JhbC5jdXJyZW50QXBwbGljYXRpb25BZGRyZXNzOwogICAgZ2xvYmFsIEN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MKICAgIGR1cAogICAgY292ZXIgMgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9icmlkZ2UuY29udHJhY3QuYWxnby50czoyNzcKICAgIC8vIGNvbnN0IGJhbGFuY2UgPSBhc3NldC5iYWxhbmNlKGFwcEFjY3QpOwogICAgc3dhcAogICAgYXNzZXRfaG9sZGluZ19nZXQgQXNzZXRCYWxhbmNlCiAgICBzd2FwCiAgICBkdXAKICAgIHVuY292ZXIgMgogICAgYXNzZXJ0IC8vIGFjY291bnQgb3B0ZWQgaW50byBhc3NldAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9icmlkZ2UuY29udHJhY3QuYWxnby50czoyNzgKICAgIC8vIGlmIChiYWxhbmNlID4gVWludDY0KDApKSB7CiAgICBieiB3aXRoZHJhd0JyaWRnaW5nRmVlSW5Ub2tlbnNfYWZ0ZXJfaWZfZWxzZUA0CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2JyaWRnZS5jb250cmFjdC5hbGdvLnRzOjI3OS0yODQKICAgIC8vIGl0eG4uYXNzZXRUcmFuc2Zlcih7CiAgICAvLyAgIHNlbmRlcjogYXBwQWNjdCwKICAgIC8vICAgeGZlckFzc2V0OiBhc3NldCwKICAgIC8vICAgYXNzZXRBbW91bnQ6IGJhbGFuY2UsCiAgICAvLyAgIGFzc2V0UmVjZWl2ZXI6IHRoaXMub3duZXIudmFsdWUuYnl0ZXMsCiAgICAvLyB9KS5zdWJtaXQoKTsKICAgIGl0eG5fYmVnaW4KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvYnJpZGdlLmNvbnRyYWN0LmFsZ28udHM6MjgzCiAgICAvLyBhc3NldFJlY2VpdmVyOiB0aGlzLm93bmVyLnZhbHVlLmJ5dGVzLAogICAgaW50Y18xIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvb3duYWJsZS5hbGdvLnRzOjYKICAgIC8vIHByb3RlY3RlZCBvd25lciA9IEdsb2JhbFN0YXRlPEFkZHJlc3M+KCk7CiAgICBieXRlY18yIC8vICJvd25lciIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvYnJpZGdlLmNvbnRyYWN0LmFsZ28udHM6MjgzCiAgICAvLyBhc3NldFJlY2VpdmVyOiB0aGlzLm93bmVyLnZhbHVlLmJ5dGVzLAogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIGl0eG5fZmllbGQgQXNzZXRSZWNlaXZlcgogICAgZHVwCiAgICBpdHhuX2ZpZWxkIEFzc2V0QW1vdW50CiAgICBkaWcgMgogICAgaXR4bl9maWVsZCBYZmVyQXNzZXQKICAgIGRpZyAxCiAgICBpdHhuX2ZpZWxkIFNlbmRlcgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9icmlkZ2UuY29udHJhY3QuYWxnby50czoyNzktMjg0CiAgICAvLyBpdHhuLmFzc2V0VHJhbnNmZXIoewogICAgLy8gICBzZW5kZXI6IGFwcEFjY3QsCiAgICAvLyAgIHhmZXJBc3NldDogYXNzZXQsCiAgICAvLyAgIGFzc2V0QW1vdW50OiBiYWxhbmNlLAogICAgLy8gICBhc3NldFJlY2VpdmVyOiB0aGlzLm93bmVyLnZhbHVlLmJ5dGVzLAogICAgLy8gfSkuc3VibWl0KCk7CiAgICBwdXNoaW50IDQgLy8gNAogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50Y18xIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICBpdHhuX3N1Ym1pdAoKd2l0aGRyYXdCcmlkZ2luZ0ZlZUluVG9rZW5zX2FmdGVyX2lmX2Vsc2VANDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvYnJpZGdlLmNvbnRyYWN0LmFsZ28udHM6MjczCiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2JyaWRnZS5jb250cmFjdC5hbGdvLnRzOjpCcmlkZ2UuZ2V0QnJpZGdpbmdDb3N0SW5Ub2tlbnNbcm91dGluZ10oKSAtPiB2b2lkOgpnZXRCcmlkZ2luZ0Nvc3RJblRva2VuczoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvYnJpZGdlLmNvbnRyYWN0LmFsZ28udHM6Mjg4CiAgICAvLyBAYWJpbWV0aG9kKHsgcmVhZG9ubHk6IHRydWUgfSkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzAgLy8gMQogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50OAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ2NAogICAgYnRvaQogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9icmlkZ2UuY29udHJhY3QuYWxnby50czoyOTMKICAgIC8vIGNvbnN0IGJyaWRnZUdhc0Ftb3VudDogdWludDY0ID0gdGhpcy5nZXRHYXNVc2FnZShkZXN0aW5hdGlvbkNoYWluSWQpOwogICAgZGlnIDEKICAgIGNhbGxzdWIgc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9nYXMtdXNhZ2UuYWxnby50czo6R2FzVXNhZ2UuZ2V0R2FzVXNhZ2UKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvYnJpZGdlLmNvbnRyYWN0LmFsZ28udHM6Mjk0LTI5OAogICAgLy8gY29uc3QgbWVzc2VuZ2VyR2FzQW1vdW50OiB1aW50NjQgPSBhYmlDYWxsKHsKICAgIC8vICAgbWV0aG9kOiBNZXNzZW5nZXIucHJvdG90eXBlLmdldEdhc1VzYWdlLAogICAgLy8gICBhcHBJZDogdGhpcy5tZXNzZW5nZXIudmFsdWUuaWQsCiAgICAvLyAgIGFyZ3M6IFtkZXN0aW5hdGlvbkNoYWluSWRdLAogICAgLy8gfSkucmV0dXJuVmFsdWU7CiAgICBpdHhuX2JlZ2luCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2JyaWRnZS5jb250cmFjdC5hbGdvLnRzOjI5NgogICAgLy8gYXBwSWQ6IHRoaXMubWVzc2VuZ2VyLnZhbHVlLmlkLAogICAgaW50Y18xIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvYnJpZGdlLmNvbnRyYWN0LmFsZ28udHM6NTgKICAgIC8vIG1lc3NlbmdlciA9IEdsb2JhbFN0YXRlPEFwcGxpY2F0aW9uPigpOwogICAgYnl0ZWMgNiAvLyAibWVzc2VuZ2VyIgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9icmlkZ2UuY29udHJhY3QuYWxnby50czoyOTYKICAgIC8vIGFwcElkOiB0aGlzLm1lc3Nlbmdlci52YWx1ZS5pZCwKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2JyaWRnZS5jb250cmFjdC5hbGdvLnRzOjI5NC0yOTgKICAgIC8vIGNvbnN0IG1lc3Nlbmdlckdhc0Ftb3VudDogdWludDY0ID0gYWJpQ2FsbCh7CiAgICAvLyAgIG1ldGhvZDogTWVzc2VuZ2VyLnByb3RvdHlwZS5nZXRHYXNVc2FnZSwKICAgIC8vICAgYXBwSWQ6IHRoaXMubWVzc2VuZ2VyLnZhbHVlLmlkLAogICAgLy8gICBhcmdzOiBbZGVzdGluYXRpb25DaGFpbklkXSwKICAgIC8vIH0pLnJldHVyblZhbHVlOwogICAgYnl0ZWMgMTQgLy8gbWV0aG9kICJnZXRHYXNVc2FnZShieXRlKXVpbnQ2NCIKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBkaWcgMwogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25JRAogICAgcHVzaGludCA2IC8vIGFwcGwKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMSAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgaXR4bl9zdWJtaXQKICAgIGl0eG4gTGFzdExvZwogICAgZHVwCiAgICBleHRyYWN0IDQgMAogICAgc3dhcAogICAgZXh0cmFjdCAwIDQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgPT0KICAgIGFzc2VydCAvLyBCeXRlcyBoYXMgdmFsaWQgcHJlZml4CiAgICBkdXAKICAgIGxlbgogICAgaW50Y18yIC8vIDgKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQudWludDY0CiAgICBidG9pCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2JyaWRnZS5jb250cmFjdC5hbGdvLnRzOjMwMC0zMDQKICAgIC8vIHJldHVybiBhYmlDYWxsKHsKICAgIC8vICAgbWV0aG9kOiBHYXNPcmFjbGUucHJvdG90eXBlLmdldFRyYW5zYWN0aW9uR2FzQ29zdEluVVNELAogICAgLy8gICBhcHBJZDogdGhpcy5nYXNPcmFjbGUudmFsdWUuaWQsCiAgICAvLyAgIGFyZ3M6IFtkZXN0aW5hdGlvbkNoYWluSWQsIGJyaWRnZUdhc0Ftb3VudCArIG1lc3Nlbmdlckdhc0Ftb3VudF0sCiAgICAvLyB9KS5yZXR1cm5WYWx1ZSAvIHRoaXMuZnJvbUdhc09yYWNsZVNjYWxpbmdGYWN0b3IoYXNzZXQpLnZhbHVlOwogICAgaXR4bl9iZWdpbgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9icmlkZ2UuY29udHJhY3QuYWxnby50czozMDIKICAgIC8vIGFwcElkOiB0aGlzLmdhc09yYWNsZS52YWx1ZS5pZCwKICAgIGludGNfMSAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2dhcy11c2FnZS5hbGdvLnRzOjkKICAgIC8vIGdhc09yYWNsZSA9IEdsb2JhbFN0YXRlPEFwcGxpY2F0aW9uPigpOwogICAgYnl0ZWNfMyAvLyAiZ2FzT3JhY2xlIgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9icmlkZ2UuY29udHJhY3QuYWxnby50czozMDIKICAgIC8vIGFwcElkOiB0aGlzLmdhc09yYWNsZS52YWx1ZS5pZCwKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2JyaWRnZS5jb250cmFjdC5hbGdvLnRzOjMwMwogICAgLy8gYXJnczogW2Rlc3RpbmF0aW9uQ2hhaW5JZCwgYnJpZGdlR2FzQW1vdW50ICsgbWVzc2VuZ2VyR2FzQW1vdW50XSwKICAgIGNvdmVyIDIKICAgICsKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvYnJpZGdlLmNvbnRyYWN0LmFsZ28udHM6MzAwLTMwNAogICAgLy8gcmV0dXJuIGFiaUNhbGwoewogICAgLy8gICBtZXRob2Q6IEdhc09yYWNsZS5wcm90b3R5cGUuZ2V0VHJhbnNhY3Rpb25HYXNDb3N0SW5VU0QsCiAgICAvLyAgIGFwcElkOiB0aGlzLmdhc09yYWNsZS52YWx1ZS5pZCwKICAgIC8vICAgYXJnczogW2Rlc3RpbmF0aW9uQ2hhaW5JZCwgYnJpZGdlR2FzQW1vdW50ICsgbWVzc2VuZ2VyR2FzQW1vdW50XSwKICAgIC8vIH0pLnJldHVyblZhbHVlIC8gdGhpcy5mcm9tR2FzT3JhY2xlU2NhbGluZ0ZhY3Rvcihhc3NldCkudmFsdWU7CiAgICBwdXNoYnl0ZXMgMHg3YmY3ZDUwYyAvLyBtZXRob2QgImdldFRyYW5zYWN0aW9uR2FzQ29zdEluVVNEKGJ5dGUsdWludDY0KXVpbnQ2NCIKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICB1bmNvdmVyIDMKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbklECiAgICBwdXNoaW50IDYgLy8gYXBwbAogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50Y18xIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICBpdHhuX3N1Ym1pdAogICAgaXR4biBMYXN0TG9nCiAgICBkdXAKICAgIGV4dHJhY3QgNCAwCiAgICBzd2FwCiAgICBleHRyYWN0IDAgNAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICA9PQogICAgYXNzZXJ0IC8vIEJ5dGVzIGhhcyB2YWxpZCBwcmVmaXgKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzIgLy8gOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50NjQKICAgIGJ0b2kKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvYnJpZGdlLmNvbnRyYWN0LmFsZ28udHM6MzA0CiAgICAvLyB9KS5yZXR1cm5WYWx1ZSAvIHRoaXMuZnJvbUdhc09yYWNsZVNjYWxpbmdGYWN0b3IoYXNzZXQpLnZhbHVlOwogICAgc3dhcAogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yb3V0ZXIuYWxnby50czozNgogICAgLy8gcHJvdGVjdGVkIGZyb21HYXNPcmFjbGVTY2FsaW5nRmFjdG9yID0gQm94TWFwPEFzc2V0LCB1aW50NjQ+KHsga2V5UHJlZml4OiAnZScgfSk7CiAgICBwdXNoYnl0ZXMgImUiCiAgICBzd2FwCiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvYnJpZGdlLmNvbnRyYWN0LmFsZ28udHM6MzA0CiAgICAvLyB9KS5yZXR1cm5WYWx1ZSAvIHRoaXMuZnJvbUdhc09yYWNsZVNjYWxpbmdGYWN0b3IoYXNzZXQpLnZhbHVlOwogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIEJveCBtdXN0IGhhdmUgdmFsdWUKICAgIGJ0b2kKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvYnJpZGdlLmNvbnRyYWN0LmFsZ28udHM6MzAwLTMwNAogICAgLy8gcmV0dXJuIGFiaUNhbGwoewogICAgLy8gICBtZXRob2Q6IEdhc09yYWNsZS5wcm90b3R5cGUuZ2V0VHJhbnNhY3Rpb25HYXNDb3N0SW5VU0QsCiAgICAvLyAgIGFwcElkOiB0aGlzLmdhc09yYWNsZS52YWx1ZS5pZCwKICAgIC8vICAgYXJnczogW2Rlc3RpbmF0aW9uQ2hhaW5JZCwgYnJpZGdlR2FzQW1vdW50ICsgbWVzc2VuZ2VyR2FzQW1vdW50XSwKICAgIC8vIH0pLnJldHVyblZhbHVlIC8gdGhpcy5mcm9tR2FzT3JhY2xlU2NhbGluZ0ZhY3Rvcihhc3NldCkudmFsdWU7CiAgICAvCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2JyaWRnZS5jb250cmFjdC5hbGdvLnRzOjI4OAogICAgLy8gQGFiaW1ldGhvZCh7IHJlYWRvbmx5OiB0cnVlIH0pCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9icmlkZ2UuY29udHJhY3QuYWxnby50czo6QnJpZGdlLmhhc2hNZXNzYWdlW3JvdXRpbmddKCkgLT4gdm9pZDoKaGFzaE1lc3NhZ2U6CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2JyaWRnZS5jb250cmFjdC5hbGdvLnRzOjMwNwogICAgLy8gQGFiaW1ldGhvZCh7IHJlYWRvbmx5OiB0cnVlIH0pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18yIC8vIDgKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQudWludDY0CiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18zIC8vIDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnN0YXRpY19hcnJheTxhcmM0LnVpbnQ4LCAzMj4KICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDMKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzAgLy8gMQogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50OAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgNAogICAgZHVwCiAgICBsZW4KICAgIGludGNfMCAvLyAxCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ4CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyA1CiAgICBkdXAKICAgIGxlbgogICAgaW50Y18zIC8vIDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnN0YXRpY19hcnJheTxhcmM0LnVpbnQ4LCAzMj4KICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDYKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzMgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgY2FsbHN1YiBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2JyaWRnZS5jb250cmFjdC5hbGdvLnRzOjpCcmlkZ2UuaGFzaE1lc3NhZ2UKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2JyaWRnZS5jb250cmFjdC5hbGdvLnRzOjpCcmlkZ2UuaXNPdGhlckJyaWRnZVRva2VuU3VwcG9ydGVkW3JvdXRpbmddKCkgLT4gdm9pZDoKaXNPdGhlckJyaWRnZVRva2VuU3VwcG9ydGVkOgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9icmlkZ2UuY29udHJhY3QuYWxnby50czozMzQKICAgIC8vIEBhYmltZXRob2QoeyByZWFkb25seTogdHJ1ZSB9KQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMCAvLyAxCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ4CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18zIC8vIDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnN0YXRpY19hcnJheTxhcmM0LnVpbnQ4LCAzMj4KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvYnJpZGdlLmNvbnRyYWN0LmFsZ28udHM6MzYxCiAgICAvLyByZXR1cm4gY2hhaW5JZC5ieXRlcy5jb25jYXQodG9rZW4uYnl0ZXMpOwogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2JyaWRnZS5jb250cmFjdC5hbGdvLnRzOjY3CiAgICAvLyBvdGhlckJyaWRnZVRva2VucyA9IEJveE1hcDxieXRlcywgU3RhdGljQnl0ZXM+KHsga2V5UHJlZml4OiAndCcgfSk7CiAgICBieXRlYyA3IC8vICJ0IgogICAgc3dhcAogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2JyaWRnZS5jb250cmFjdC5hbGdvLnRzOjMzNgogICAgLy8gcmV0dXJuIHRoaXMub3RoZXJCcmlkZ2VUb2tlbnModGhpcy5fZ2V0T3RoZXJCcmlkZ2VUb2tlbnNLZXkoY2hhaW5JZCwgdG9rZW4pKS5leGlzdHM7CiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvYnJpZGdlLmNvbnRyYWN0LmFsZ28udHM6MzM0CiAgICAvLyBAYWJpbWV0aG9kKHsgcmVhZG9ubHk6IHRydWUgfSkKICAgIGJ5dGVjIDExIC8vIDB4MDAKICAgIGludGNfMSAvLyAwCiAgICB1bmNvdmVyIDIKICAgIHNldGJpdAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvYnJpZGdlLmNvbnRyYWN0LmFsZ28udHM6OkJyaWRnZS5nZXRUcmFuc2FjdGlvbkNvc3Rbcm91dGluZ10oKSAtPiB2b2lkOgpnZXRUcmFuc2FjdGlvbkNvc3Q6CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2JyaWRnZS5jb250cmFjdC5hbGdvLnRzOjMzOQogICAgLy8gQGFiaW1ldGhvZCh7IHJlYWRvbmx5OiB0cnVlIH0pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18wIC8vIDEKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQudWludDgKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvYnJpZGdlLmNvbnRyYWN0LmFsZ28udHM6MzQxCiAgICAvLyByZXR1cm4gdGhpcy5nZXRUcmFuc2FjdGlvblJlbGF5ZXJDb3N0KGNoYWluSWQpICsgdGhpcy5nZXRTZW5kVHJhbnNhY3Rpb25TdG9yYWdlQ29zdCgpOwogICAgY2FsbHN1YiBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2dhcy11c2FnZS5hbGdvLnRzOjpHYXNVc2FnZS5nZXRUcmFuc2FjdGlvblJlbGF5ZXJDb3N0CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2JyaWRnZS5jb250cmFjdC5hbGdvLnRzOjM1NQogICAgLy8gcmV0dXJuIDE1NzAwOwogICAgaW50YyA0IC8vIDE1NzAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2JyaWRnZS5jb250cmFjdC5hbGdvLnRzOjM0MQogICAgLy8gcmV0dXJuIHRoaXMuZ2V0VHJhbnNhY3Rpb25SZWxheWVyQ29zdChjaGFpbklkKSArIHRoaXMuZ2V0U2VuZFRyYW5zYWN0aW9uU3RvcmFnZUNvc3QoKTsKICAgICsKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvYnJpZGdlLmNvbnRyYWN0LmFsZ28udHM6MzM5CiAgICAvLyBAYWJpbWV0aG9kKHsgcmVhZG9ubHk6IHRydWUgfSkKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3JvdXRlci5hbGdvLnRzOjpSb3V0ZXIuc3dhcFtyb3V0aW5nXSgpIC0+IHZvaWQ6CnN3YXA6CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3JvdXRlci5hbGdvLnRzOjgxCiAgICAvLyBAYWJpbWV0aG9kKHsgZGVmYXVsdEFyZ3VtZW50czogeyBidWRnZXQ6IHsgY29uc3RhbnQ6IDEwMDAgfSB9IH0pCiAgICB0eG4gR3JvdXBJbmRleAogICAgaW50Y18wIC8vIDEKICAgIC0KICAgIGR1cAogICAgZ3R4bnMgVHlwZUVudW0KICAgIHB1c2hpbnQgNCAvLyBheGZlcgogICAgPT0KICAgIGFzc2VydCAvLyB0cmFuc2FjdGlvbiB0eXBlIGlzIGF4ZmVyCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18yIC8vIDgKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQudWludDY0CiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18zIC8vIDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnN0YXRpY19hcnJheTxhcmM0LnVpbnQ4LCAzMj4KICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDMKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzIgLy8gOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50NjQKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDQKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzIgLy8gOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50NjQKICAgIGJ0b2kKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcm91dGVyLmFsZ28udHM6ODkKICAgIC8vIGVuc3VyZUJ1ZGdldChidWRnZXQsIE9wVXBGZWVTb3VyY2UuR3JvdXBDcmVkaXQpOwogICAgaW50Y18xIC8vIDAKICAgIGNhbGxzdWIgZW5zdXJlX2J1ZGdldAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yb3V0ZXIuYWxnby50czo2NAogICAgLy8gYXNzZXJ0KHRoaXMuY2FuU3dhcC52YWx1ZSwgJ1JvdXRlcjogc3dhcCBwcm9oaWJpdGVkJyk7CiAgICBpbnRjXzEgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yb3V0ZXIuYWxnby50czo1MwogICAgLy8gY2FuU3dhcCA9IEdsb2JhbFN0YXRlPGJvb2xlYW4+KHsgaW5pdGlhbFZhbHVlOiB0cnVlIH0pOwogICAgYnl0ZWNfMSAvLyAiY2FuU3dhcCIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcm91dGVyLmFsZ28udHM6NjQKICAgIC8vIGFzc2VydCh0aGlzLmNhblN3YXAudmFsdWUsICdSb3V0ZXI6IHN3YXAgcHJvaGliaXRlZCcpOwogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIGFzc2VydCAvLyBSb3V0ZXI6IHN3YXAgcHJvaGliaXRlZAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yb3V0ZXIuYWxnby50czo5MQogICAgLy8gY29uc3Qgc2VuZGVyID0gbmV3IEFkZHJlc3MoVHhuLnNlbmRlcik7CiAgICB0eG4gU2VuZGVyCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3JvdXRlci5hbGdvLnRzOjkyCiAgICAvLyBjb25zdCBhbW91bnQgPSBhbW91bnRGcm9tQXNzZXRUcmFuc2Zlcihhc3NldFRyYW5zZmVyUmVmKTsKICAgIGRpZyA0CiAgICBjYWxsc3ViIGFtb3VudEZyb21Bc3NldFRyYW5zZmVyCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3JvdXRlci5hbGdvLnRzOjkzCiAgICAvLyBjb25zdCB2VXNkQW1vdW50ID0gdGhpcy5zZW5kQW5kU3dhcFRvVlVzZChhc3NldFRyYW5zZmVyUmVmLnhmZXJBc3NldCwgc2VuZGVyLCBhbW91bnQpOwogICAgdW5jb3ZlciA1CiAgICBndHhucyBYZmVyQXNzZXQKICAgIGR1cAogICAgZGlnIDMKICAgIGRpZyAzCiAgICBjYWxsc3ViIHNlbmRBbmRTd2FwVG9WVXNkCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3JvdXRlci5hbGdvLnRzOjk0CiAgICAvLyBjb25zdCByZWNlaXZlZEFtb3VudCA9IHRoaXMucmVjZWl2ZUFuZFN3YXBGcm9tVlVzZChyZWNlaXZlQXNzZXQsIHJlY2lwaWVudCwgdlVzZEFtb3VudCwgcmVjZWl2ZUFtb3VudE1pbik7CiAgICBkaWcgNgogICAgZGlnIDYKICAgIHVuY292ZXIgMgogICAgdW5jb3ZlciA2CiAgICBjYWxsc3ViIHJlY2VpdmVBbmRTd2FwRnJvbVZVc2QKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcm91dGVyLmFsZ28udHM6OTUtMTAyCiAgICAvLyBlbWl0PFN3YXBwZWQ+KHsKICAgIC8vICAgc2VuZGVyLAogICAgLy8gICByZWNpcGllbnQsCiAgICAvLyAgIHRva2VuSWQ6IGFzc2V0VHJhbnNmZXJSZWYueGZlckFzc2V0LmlkLAogICAgLy8gICByZWNlaXZlVG9rZW5JZDogcmVjZWl2ZUFzc2V0LmlkLAogICAgLy8gICBhbW91bnQsCiAgICAvLyAgIHJlY2VpdmVkQW1vdW50LAogICAgLy8gfSk7CiAgICB1bmNvdmVyIDMKICAgIHVuY292ZXIgNAogICAgY29uY2F0CiAgICB1bmNvdmVyIDIKICAgIGl0b2IKICAgIGNvbmNhdAogICAgdW5jb3ZlciAzCiAgICBpdG9iCiAgICBjb25jYXQKICAgIHVuY292ZXIgMgogICAgaXRvYgogICAgY29uY2F0CiAgICBzd2FwCiAgICBpdG9iCiAgICBjb25jYXQKICAgIHB1c2hieXRlcyAweDE1NDA0NGIzIC8vIG1ldGhvZCAiU3dhcHBlZChhZGRyZXNzLGFkZHJlc3MsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0KSIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3JvdXRlci5hbGdvLnRzOjgxCiAgICAvLyBAYWJpbWV0aG9kKHsgZGVmYXVsdEFyZ3VtZW50czogeyBidWRnZXQ6IHsgY29uc3RhbnQ6IDEwMDAgfSB9IH0pCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yb3V0ZXIuYWxnby50czo6Um91dGVyLmFkZFBvb2xbcm91dGluZ10oKSAtPiB2b2lkOgphZGRQb29sOgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yb3V0ZXIuYWxnby50czoxMTIKICAgIC8vIEBhYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ2NAogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ2NAogICAgYnRvaQogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yb3V0ZXIuYWxnby50czoxMTQKICAgIC8vIHRoaXMub25seU93bmVyKCk7CiAgICBjYWxsc3ViIG9ubHlPd25lcgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yb3V0ZXIuYWxnby50czoxMTUKICAgIC8vIHRoaXMucG9vbHMoYXNzZXQpLnZhbHVlID0gcG9vbElkOwogICAgZHVwCiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3JvdXRlci5hbGdvLnRzOjM0CiAgICAvLyBwb29scyA9IEJveE1hcDxBc3NldCwgdWludDY0Pih7IGtleVByZWZpeDogJ3AnIH0pOwogICAgYnl0ZWMgOCAvLyAicCIKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcm91dGVyLmFsZ28udHM6MTE1CiAgICAvLyB0aGlzLnBvb2xzKGFzc2V0KS52YWx1ZSA9IHBvb2xJZDsKICAgIHVuY292ZXIgMwogICAgaXRvYgogICAgYm94X3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yb3V0ZXIuYWxnby50czoxMTYKICAgIC8vIGNvbnN0IHRva2VuRGVjaW1hbHMgPSBhc3NldC5kZWNpbWFsczsKICAgIHN3YXAKICAgIGFzc2V0X3BhcmFtc19nZXQgQXNzZXREZWNpbWFscwogICAgYXNzZXJ0IC8vIGFzc2V0IGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yb3V0ZXIuYWxnby50czoxMTcKICAgIC8vIHRoaXMuYnJpZGdpbmdGZWVDb252ZXJzaW9uU2NhbGluZ0ZhY3Rvcihhc3NldCkudmFsdWUgPSAxMCAqKiAoT1JBQ0xFX1BSSUNFX1BSRUNJU0lPTiAtIHRva2VuRGVjaW1hbHMgKyBDSEFJTl9QUkVDSVNJT04pOwogICAgcHVzaGludCA5IC8vIDkKICAgIHN3YXAKICAgIC0KICAgIGR1cAogICAgcHVzaGludCA2IC8vIDYKICAgICsKICAgIHB1c2hpbnQgMTAgLy8gMTAKICAgIHN3YXAKICAgIGV4cAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yb3V0ZXIuYWxnby50czozOQogICAgLy8gcHJvdGVjdGVkIGJyaWRnaW5nRmVlQ29udmVyc2lvblNjYWxpbmdGYWN0b3IgPSBCb3hNYXA8QXNzZXQsIHVpbnQ2ND4oeyBrZXlQcmVmaXg6ICdmJyB9KTsKICAgIHB1c2hieXRlcyAiZiIKICAgIGRpZyAzCiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcm91dGVyLmFsZ28udHM6MTE3CiAgICAvLyB0aGlzLmJyaWRnaW5nRmVlQ29udmVyc2lvblNjYWxpbmdGYWN0b3IoYXNzZXQpLnZhbHVlID0gMTAgKiogKE9SQUNMRV9QUklDRV9QUkVDSVNJT04gLSB0b2tlbkRlY2ltYWxzICsgQ0hBSU5fUFJFQ0lTSU9OKTsKICAgIHN3YXAKICAgIGl0b2IKICAgIGJveF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcm91dGVyLmFsZ28udHM6MTE4CiAgICAvLyB0aGlzLmZyb21HYXNPcmFjbGVTY2FsaW5nRmFjdG9yKGFzc2V0KS52YWx1ZSA9IDEwICoqIChPUkFDTEVfUFJJQ0VfUFJFQ0lTSU9OIC0gdG9rZW5EZWNpbWFscyk7CiAgICBwdXNoaW50IDEwIC8vIDEwCiAgICBzd2FwCiAgICBleHAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcm91dGVyLmFsZ28udHM6MzYKICAgIC8vIHByb3RlY3RlZCBmcm9tR2FzT3JhY2xlU2NhbGluZ0ZhY3RvciA9IEJveE1hcDxBc3NldCwgdWludDY0Pih7IGtleVByZWZpeDogJ2UnIH0pOwogICAgcHVzaGJ5dGVzICJlIgogICAgdW5jb3ZlciAyCiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcm91dGVyLmFsZ28udHM6MTE4CiAgICAvLyB0aGlzLmZyb21HYXNPcmFjbGVTY2FsaW5nRmFjdG9yKGFzc2V0KS52YWx1ZSA9IDEwICoqIChPUkFDTEVfUFJJQ0VfUFJFQ0lTSU9OIC0gdG9rZW5EZWNpbWFscyk7CiAgICBzd2FwCiAgICBpdG9iCiAgICBib3hfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3JvdXRlci5hbGdvLnRzOjExMgogICAgLy8gQGFiaW1ldGhvZCgpCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yb3V0ZXIuYWxnby50czo6Um91dGVyLnJlbW92ZVBvb2xbcm91dGluZ10oKSAtPiB2b2lkOgpyZW1vdmVQb29sOgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yb3V0ZXIuYWxnby50czoxMjEKICAgIC8vIEBhYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ2NAogICAgYnRvaQogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yb3V0ZXIuYWxnby50czoxMjMKICAgIC8vIHRoaXMub25seU93bmVyKCk7CiAgICBjYWxsc3ViIG9ubHlPd25lcgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yb3V0ZXIuYWxnby50czoxMjQKICAgIC8vIHRoaXMucG9vbHModG9rZW5JZCkuZGVsZXRlKCk7CiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3JvdXRlci5hbGdvLnRzOjM0CiAgICAvLyBwb29scyA9IEJveE1hcDxBc3NldCwgdWludDY0Pih7IGtleVByZWZpeDogJ3AnIH0pOwogICAgYnl0ZWMgOCAvLyAicCIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yb3V0ZXIuYWxnby50czoxMjQKICAgIC8vIHRoaXMucG9vbHModG9rZW5JZCkuZGVsZXRlKCk7CiAgICBib3hfZGVsCiAgICBwb3AKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcm91dGVyLmFsZ28udHM6MTIxCiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3JvdXRlci5hbGdvLnRzOjpSb3V0ZXIuc3RvcFN3YXBbcm91dGluZ10oKSAtPiB2b2lkOgpzdG9wU3dhcDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcm91dGVyLmFsZ28udHM6NzEKICAgIC8vIGFzc2VydChvcC5UeG4uc2VuZGVyLmJ5dGVzID09PSB0aGlzLnN0b3BBdXRob3JpdHkudmFsdWUuYnl0ZXMsICdSb3V0ZXI6IGlzIG5vdCBzdG9wQXV0aG9yaXR5Jyk7CiAgICB0eG4gU2VuZGVyCiAgICBpbnRjXzEgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yb3V0ZXIuYWxnby50czo0MgogICAgLy8gcHJpdmF0ZSBzdG9wQXV0aG9yaXR5ID0gR2xvYmFsU3RhdGU8QWRkcmVzcz4oKTsvLyBjYW4gcmVzdHJpY3QgZGVwb3NpdCBvciB3aXRoZHJhdyBvcGVyYXRpb25zCiAgICBieXRlYyA5IC8vICJzdG9wQXV0aG9yaXR5IgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yb3V0ZXIuYWxnby50czo3MQogICAgLy8gYXNzZXJ0KG9wLlR4bi5zZW5kZXIuYnl0ZXMgPT09IHRoaXMuc3RvcEF1dGhvcml0eS52YWx1ZS5ieXRlcywgJ1JvdXRlcjogaXMgbm90IHN0b3BBdXRob3JpdHknKTsKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICA9PQogICAgYXNzZXJ0IC8vIFJvdXRlcjogaXMgbm90IHN0b3BBdXRob3JpdHkKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcm91dGVyLmFsZ28udHM6NTMKICAgIC8vIGNhblN3YXAgPSBHbG9iYWxTdGF0ZTxib29sZWFuPih7IGluaXRpYWxWYWx1ZTogdHJ1ZSB9KTsKICAgIGJ5dGVjXzEgLy8gImNhblN3YXAiCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3JvdXRlci5hbGdvLnRzOjEzMwogICAgLy8gdGhpcy5jYW5Td2FwLnZhbHVlID0gZmFsc2U7CiAgICBpbnRjXzEgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcm91dGVyLmFsZ28udHM6MTMwCiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3JvdXRlci5hbGdvLnRzOjpSb3V0ZXIuc3RhcnRTd2FwW3JvdXRpbmddKCkgLT4gdm9pZDoKc3RhcnRTd2FwOgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yb3V0ZXIuYWxnby50czoxNDEKICAgIC8vIHRoaXMub25seU93bmVyKCk7CiAgICBjYWxsc3ViIG9ubHlPd25lcgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yb3V0ZXIuYWxnby50czo1MwogICAgLy8gY2FuU3dhcCA9IEdsb2JhbFN0YXRlPGJvb2xlYW4+KHsgaW5pdGlhbFZhbHVlOiB0cnVlIH0pOwogICAgYnl0ZWNfMSAvLyAiY2FuU3dhcCIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcm91dGVyLmFsZ28udHM6MTQyCiAgICAvLyB0aGlzLmNhblN3YXAudmFsdWUgPSB0cnVlOwogICAgaW50Y18wIC8vIDEKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3JvdXRlci5hbGdvLnRzOjEzOQogICAgLy8gQGFiaW1ldGhvZCgpCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yb3V0ZXIuYWxnby50czo6Um91dGVyLnNldFN0b3BBdXRob3JpdHlbcm91dGluZ10oKSAtPiB2b2lkOgpzZXRTdG9wQXV0aG9yaXR5OgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yb3V0ZXIuYWxnby50czoxNDgKICAgIC8vIEBhYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMyAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5zdGF0aWNfYXJyYXk8YXJjNC51aW50OCwgMzI+CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3JvdXRlci5hbGdvLnRzOjE1MAogICAgLy8gdGhpcy5vbmx5T3duZXIoKTsKICAgIGNhbGxzdWIgb25seU93bmVyCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3JvdXRlci5hbGdvLnRzOjQyCiAgICAvLyBwcml2YXRlIHN0b3BBdXRob3JpdHkgPSBHbG9iYWxTdGF0ZTxBZGRyZXNzPigpOy8vIGNhbiByZXN0cmljdCBkZXBvc2l0IG9yIHdpdGhkcmF3IG9wZXJhdGlvbnMKICAgIGJ5dGVjIDkgLy8gInN0b3BBdXRob3JpdHkiCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3JvdXRlci5hbGdvLnRzOjE1MQogICAgLy8gdGhpcy5zdG9wQXV0aG9yaXR5LnZhbHVlID0gc3RvcEF1dGhvcml0eTsKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3JvdXRlci5hbGdvLnRzOjE0OAogICAgLy8gQGFiaW1ldGhvZCgpCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yb3V0ZXIuYWxnby50czo6Um91dGVyLnNldFJlYmFsYW5jZXJbcm91dGluZ10oKSAtPiB2b2lkOgpzZXRSZWJhbGFuY2VyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yb3V0ZXIuYWxnby50czoxNTcKICAgIC8vIEBhYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMyAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5zdGF0aWNfYXJyYXk8YXJjNC51aW50OCwgMzI+CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3JvdXRlci5hbGdvLnRzOjE1OQogICAgLy8gdGhpcy5vbmx5T3duZXIoKTsKICAgIGNhbGxzdWIgb25seU93bmVyCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3JvdXRlci5hbGdvLnRzOjUyCiAgICAvLyBwcml2YXRlIHJlYmFsYW5jZXIgPSBHbG9iYWxTdGF0ZTxBZGRyZXNzPih7IGluaXRpYWxWYWx1ZTogbmV3IEFkZHJlc3MoYnplcm8oMCkpIH0pOy8vIGNhbiByZXN0cmljdCBkZXBvc2l0IG9yIHdpdGhkcmF3IG9wZXJhdGlvbnMKICAgIGJ5dGVjIDQgLy8gInJlYmFsYW5jZXIiCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3JvdXRlci5hbGdvLnRzOjE2MAogICAgLy8gdGhpcy5yZWJhbGFuY2VyLnZhbHVlID0gcmViYWxhbmNlcjsKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3JvdXRlci5hbGdvLnRzOjE1NwogICAgLy8gQGFiaW1ldGhvZCgpCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9nYXMtdXNhZ2UuYWxnby50czo6R2FzVXNhZ2UuZ2V0R2FzVXNhZ2Vbcm91dGluZ10oKSAtPiB2b2lkOgpnZXRHYXNVc2FnZToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvZ2FzLXVzYWdlLmFsZ28udHM6MTcKICAgIC8vIEBhYmltZXRob2QoeyByZWFkb25seTogdHJ1ZSB9KQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMCAvLyAxCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ4CiAgICBjYWxsc3ViIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvZ2FzLXVzYWdlLmFsZ28udHM6Okdhc1VzYWdlLmdldEdhc1VzYWdlCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9nYXMtdXNhZ2UuYWxnby50czo6R2FzVXNhZ2Uuc2V0R2FzVXNhZ2Vbcm91dGluZ10oKSAtPiB2b2lkOgpzZXRHYXNVc2FnZToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvZ2FzLXVzYWdlLmFsZ28udHM6MjIKICAgIC8vIEBhYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMCAvLyAxCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ4CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18yIC8vIDgKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQudWludDY0CiAgICBidG9pCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2dhcy11c2FnZS5hbGdvLnRzOjI0CiAgICAvLyB0aGlzLm9ubHlPd25lcigpOwogICAgY2FsbHN1YiBvbmx5T3duZXIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvZ2FzLXVzYWdlLmFsZ28udHM6MTAKICAgIC8vIGdhc1VzYWdlID0gQm94TWFwPEJ5dGUsIHVpbnQ2ND4oeyBrZXlQcmVmaXg6ICd1JyB9KTsKICAgIGJ5dGVjIDEyIC8vICJ1IgogICAgdW5jb3ZlciAyCiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvZ2FzLXVzYWdlLmFsZ28udHM6MjUKICAgIC8vIHRoaXMuZ2FzVXNhZ2UoY2hhaW5JZCkudmFsdWUgPSBnYXNBbW91bnQ7CiAgICBzd2FwCiAgICBpdG9iCiAgICBib3hfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2dhcy11c2FnZS5hbGdvLnRzOjIyCiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2dhcy11c2FnZS5hbGdvLnRzOjpHYXNVc2FnZS5zZXRHYXNPcmFjbGVbcm91dGluZ10oKSAtPiB2b2lkOgpzZXRHYXNPcmFjbGU6CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2dhcy11c2FnZS5hbGdvLnRzOjI4CiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzIgLy8gOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50NjQKICAgIGJ0b2kKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvZ2FzLXVzYWdlLmFsZ28udHM6MzAKICAgIC8vIHRoaXMub25seU93bmVyKCk7CiAgICBjYWxsc3ViIG9ubHlPd25lcgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9nYXMtdXNhZ2UuYWxnby50czo5CiAgICAvLyBnYXNPcmFjbGUgPSBHbG9iYWxTdGF0ZTxBcHBsaWNhdGlvbj4oKTsKICAgIGJ5dGVjXzMgLy8gImdhc09yYWNsZSIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvZ2FzLXVzYWdlLmFsZ28udHM6MzEKICAgIC8vIHRoaXMuZ2FzT3JhY2xlLnZhbHVlID0gZ2FzT3JhY2xlOwogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvZ2FzLXVzYWdlLmFsZ28udHM6MjgKICAgIC8vIEBhYmltZXRob2QoKQogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvZ2FzLXVzYWdlLmFsZ28udHM6Okdhc1VzYWdlLmdldFRyYW5zYWN0aW9uUmVsYXllckNvc3Rbcm91dGluZ10oKSAtPiB2b2lkOgpnZXRUcmFuc2FjdGlvblJlbGF5ZXJDb3N0OgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9nYXMtdXNhZ2UuYWxnby50czozNAogICAgLy8gQGFiaW1ldGhvZCh7IHJlYWRvbmx5OiB0cnVlIH0pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18wIC8vIDEKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQudWludDgKICAgIGNhbGxzdWIgc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9nYXMtdXNhZ2UuYWxnby50czo6R2FzVXNhZ2UuZ2V0VHJhbnNhY3Rpb25SZWxheWVyQ29zdAogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvb3duYWJsZS5hbGdvLnRzOjpPd25hYmxlLnRyYW5zZmVyT3duZXJzaGlwW3JvdXRpbmddKCkgLT4gdm9pZDoKdHJhbnNmZXJPd25lcnNoaXA6CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL293bmFibGUuYWxnby50czoxNgogICAgLy8gQGFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18zIC8vIDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnN0YXRpY19hcnJheTxhcmM0LnVpbnQ4LCAzMj4KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvb3duYWJsZS5hbGdvLnRzOjE4CiAgICAvLyB0aGlzLm9ubHlPd25lcigpOwogICAgY2FsbHN1YiBvbmx5T3duZXIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvb3duYWJsZS5hbGdvLnRzOjYKICAgIC8vIHByb3RlY3RlZCBvd25lciA9IEdsb2JhbFN0YXRlPEFkZHJlc3M+KCk7CiAgICBieXRlY18yIC8vICJvd25lciIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvb3duYWJsZS5hbGdvLnRzOjE5CiAgICAvLyB0aGlzLm93bmVyLnZhbHVlID0gbmV3T3duZXI7CiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9vd25hYmxlLmFsZ28udHM6MTYKICAgIC8vIEBhYmltZXRob2QoKQogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvYnJpZGdlLmNvbnRyYWN0LmFsZ28udHM6OkJyaWRnZS5fc3dhcEFuZEJyaWRnZShmZWVGcm9tTmF0aXZlOiB1aW50NjQsIGFzc2V0VHJhbnNmZXJSZWY6IHVpbnQ2NCwgcmVjaXBpZW50OiBieXRlcywgZGVzdGluYXRpb25DaGFpbklkOiBieXRlcywgcmVjZWl2ZVRva2VuOiBieXRlcywgbm9uY2U6IGJ5dGVzLCBmZWVUb2tlbkFtb3VudDogdWludDY0LCBidWRnZXQ6IHVpbnQ2NCkgLT4gdm9pZDoKX3N3YXBBbmRCcmlkZ2U6CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2JyaWRnZS5jb250cmFjdC5hbGdvLnRzOjExNi0xMjUKICAgIC8vIHByaXZhdGUgX3N3YXBBbmRCcmlkZ2UoCiAgICAvLyAgIGZlZUZyb21OYXRpdmU6IHVpbnQ2NCwKICAgIC8vICAgYXNzZXRUcmFuc2ZlclJlZjogZ3R4bi5Bc3NldFRyYW5zZmVyVHhuLAogICAgLy8gICByZWNpcGllbnQ6IFN0YXRpY0J5dGVzPDMyPiwKICAgIC8vICAgZGVzdGluYXRpb25DaGFpbklkOiBCeXRlLAogICAgLy8gICByZWNlaXZlVG9rZW46IFN0YXRpY0J5dGVzPDMyPiwKICAgIC8vICAgbm9uY2U6IFN0YXRpY0J5dGVzPDMyPiwKICAgIC8vICAgZmVlVG9rZW5BbW91bnQ6IHVpbnQ2NCwKICAgIC8vICAgYnVkZ2V0OiB1aW50NjQsCiAgICAvLyApOiB2b2lkIHsKICAgIHByb3RvIDggMAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9icmlkZ2UuY29udHJhY3QuYWxnby50czoxMjYKICAgIC8vIGVuc3VyZUJ1ZGdldChidWRnZXQsIE9wVXBGZWVTb3VyY2UuR3JvdXBDcmVkaXQpOwogICAgZnJhbWVfZGlnIC0xCiAgICBpbnRjXzEgLy8gMAogICAgY2FsbHN1YiBlbnN1cmVfYnVkZ2V0CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3JvdXRlci5hbGdvLnRzOjY0CiAgICAvLyBhc3NlcnQodGhpcy5jYW5Td2FwLnZhbHVlLCAnUm91dGVyOiBzd2FwIHByb2hpYml0ZWQnKTsKICAgIGludGNfMSAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3JvdXRlci5hbGdvLnRzOjUzCiAgICAvLyBjYW5Td2FwID0gR2xvYmFsU3RhdGU8Ym9vbGVhbj4oeyBpbml0aWFsVmFsdWU6IHRydWUgfSk7CiAgICBieXRlY18xIC8vICJjYW5Td2FwIgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yb3V0ZXIuYWxnby50czo2NAogICAgLy8gYXNzZXJ0KHRoaXMuY2FuU3dhcC52YWx1ZSwgJ1JvdXRlcjogc3dhcCBwcm9oaWJpdGVkJyk7CiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgYXNzZXJ0IC8vIFJvdXRlcjogc3dhcCBwcm9oaWJpdGVkCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2JyaWRnZS5jb250cmFjdC5hbGdvLnRzOjEyOAogICAgLy8gY29uc3QgYW1vdW50ID0gYW1vdW50RnJvbUFzc2V0VHJhbnNmZXIoYXNzZXRUcmFuc2ZlclJlZik7CiAgICBmcmFtZV9kaWcgLTcKICAgIGNhbGxzdWIgYW1vdW50RnJvbUFzc2V0VHJhbnNmZXIKICAgIGR1cAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9icmlkZ2UuY29udHJhY3QuYWxnby50czoxMjkKICAgIC8vIGFzc2VydChhbW91bnQgPiBmZWVUb2tlbkFtb3VudCwgJ0JyaWRnZTogYW1vdW50IHRvbyBsb3cgZm9yIGZlZScpOwogICAgZnJhbWVfZGlnIC0yCiAgICA+CiAgICBhc3NlcnQgLy8gQnJpZGdlOiBhbW91bnQgdG9vIGxvdyBmb3IgZmVlCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2JyaWRnZS5jb250cmFjdC5hbGdvLnRzOjEzMAogICAgLy8gYXNzZXJ0KCFyZWNpcGllbnQuYnl0ZXMuZXF1YWxzKGJ6ZXJvKDMyKSksICdCcmlkZ2U6IGJyaWRnZSB0byB0aGUgemVybyBhZGRyZXNzJyk7CiAgICBpbnRjXzMgLy8gMzIKICAgIGJ6ZXJvCiAgICBmcmFtZV9kaWcgLTYKICAgID09CiAgICAhCiAgICBhc3NlcnQgLy8gQnJpZGdlOiBicmlkZ2UgdG8gdGhlIHplcm8gYWRkcmVzcwogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9icmlkZ2UuY29udHJhY3QuYWxnby50czoxMzIKICAgIC8vIGNvbnN0IGZlZUZyb21TdGFibGU6IHVpbnQ2NCA9IHRoaXMuX2NvbnZlcnRCcmlkZ2luZ0ZlZUluVG9rZW5zVG9OYXRpdmVUb2tlbihhc3NldFRyYW5zZmVyUmVmLnhmZXJBc3NldCwgZmVlVG9rZW5BbW91bnQpOwogICAgZnJhbWVfZGlnIC03CiAgICBndHhucyBYZmVyQXNzZXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvYnJpZGdlLmNvbnRyYWN0LmFsZ28udHM6MzY1CiAgICAvLyBpZiAoZmVlVG9rZW5BbW91bnQgPT09IDApIHJldHVybiAwOwogICAgZnJhbWVfZGlnIC0yCiAgICBibnogX3N3YXBBbmRCcmlkZ2VfYWZ0ZXJfaWZfZWxzZUAzCiAgICBpbnRjXzEgLy8gMAoKX3N3YXBBbmRCcmlkZ2VfYWZ0ZXJfaW5saW5lZF9zbWFydF9jb250cmFjdHMvY29udHJhY3RzL2JyaWRnZS5jb250cmFjdC5hbGdvLnRzOjpCcmlkZ2UuX2NvbnZlcnRCcmlkZ2luZ0ZlZUluVG9rZW5zVG9OYXRpdmVUb2tlbkA1OgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9icmlkZ2UuY29udHJhY3QuYWxnby50czoxMzMKICAgIC8vIGNvbnN0IGJyaWRnaW5nRmVlOiB1aW50NjQgPSBmZWVGcm9tTmF0aXZlICsgZmVlRnJvbVN0YWJsZTsKICAgIGZyYW1lX2RpZyAtOAogICAgZGlnIDEKICAgICsKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvYnJpZGdlLmNvbnRyYWN0LmFsZ28udHM6MTM0CiAgICAvLyBlbWl0PEJyaWRnaW5nRmVlRnJvbVRva2Vucz4oeyBmZWVGcm9tTmF0aXZlLCBmZWVGcm9tU3RhYmxlLCBmZWVTdGFibGVUb2tlbkFtb3VudDogZmVlVG9rZW5BbW91bnQgfSk7CiAgICBmcmFtZV9kaWcgLTgKICAgIGl0b2IKICAgIHVuY292ZXIgMgogICAgaXRvYgogICAgY29uY2F0CiAgICBmcmFtZV9kaWcgLTIKICAgIGl0b2IKICAgIGNvbmNhdAogICAgcHVzaGJ5dGVzIDB4MzZiYWZhZGQgLy8gbWV0aG9kICJCcmlkZ2luZ0ZlZUZyb21Ub2tlbnModWludDY0LHVpbnQ2NCx1aW50NjQpIgogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvYnJpZGdlLmNvbnRyYWN0LmFsZ28udHM6MTM2CiAgICAvLyBjb25zdCBhbW91bnRBZnRlckZlZTogdWludDY0ID0gYW1vdW50IC0gZmVlVG9rZW5BbW91bnQ7CiAgICBmcmFtZV9kaWcgMAogICAgZnJhbWVfZGlnIC0yCiAgICAtCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2JyaWRnZS5jb250cmFjdC5hbGdvLnRzOjEzOAogICAgLy8gY29uc3QgdlVzZEFtb3VudCA9IHRoaXMuc2VuZEFuZFN3YXBUb1ZVc2QoYXNzZXRUcmFuc2ZlclJlZi54ZmVyQXNzZXQsIHNlbmRlciwgYW1vdW50QWZ0ZXJGZWUpOwogICAgZnJhbWVfZGlnIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvYnJpZGdlLmNvbnRyYWN0LmFsZ28udHM6MTM3CiAgICAvLyBjb25zdCBzZW5kZXIgPSBuZXcgQWRkcmVzcyhUeG4uc2VuZGVyKTsKICAgIHR4biBTZW5kZXIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvYnJpZGdlLmNvbnRyYWN0LmFsZ28udHM6MTM4CiAgICAvLyBjb25zdCB2VXNkQW1vdW50ID0gdGhpcy5zZW5kQW5kU3dhcFRvVlVzZChhc3NldFRyYW5zZmVyUmVmLnhmZXJBc3NldCwgc2VuZGVyLCBhbW91bnRBZnRlckZlZSk7CiAgICB1bmNvdmVyIDIKICAgIGNhbGxzdWIgc2VuZEFuZFN3YXBUb1ZVc2QKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvYnJpZGdlLmNvbnRyYWN0LmFsZ28udHM6MTUwCiAgICAvLyBhc3NlcnQoZGVzdGluYXRpb25DaGFpbklkICE9PSB0aGlzLmNoYWluSWQudmFsdWUsICdCcmlkZ2U6IHdyb25nIGRlc3RpbmF0aW9uIGNoYWluJyk7CiAgICBpbnRjXzEgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9icmlkZ2UuY29udHJhY3QuYWxnby50czo1NwogICAgLy8gY2hhaW5JZCA9IEdsb2JhbFN0YXRlPEJ5dGU+KCk7CiAgICBieXRlYyA1IC8vICJjaGFpbklkIgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9icmlkZ2UuY29udHJhY3QuYWxnby50czoxNTAKICAgIC8vIGFzc2VydChkZXN0aW5hdGlvbkNoYWluSWQgIT09IHRoaXMuY2hhaW5JZC52YWx1ZSwgJ0JyaWRnZTogd3JvbmcgZGVzdGluYXRpb24gY2hhaW4nKTsKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICBmcmFtZV9kaWcgLTUKICAgIGRpZyAxCiAgICAhPQogICAgYXNzZXJ0IC8vIEJyaWRnZTogd3JvbmcgZGVzdGluYXRpb24gY2hhaW4KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvYnJpZGdlLmNvbnRyYWN0LmFsZ28udHM6MzYxCiAgICAvLyByZXR1cm4gY2hhaW5JZC5ieXRlcy5jb25jYXQodG9rZW4uYnl0ZXMpOwogICAgZnJhbWVfZGlnIC01CiAgICBmcmFtZV9kaWcgLTQKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9icmlkZ2UuY29udHJhY3QuYWxnby50czo2NwogICAgLy8gb3RoZXJCcmlkZ2VUb2tlbnMgPSBCb3hNYXA8Ynl0ZXMsIFN0YXRpY0J5dGVzPih7IGtleVByZWZpeDogJ3QnIH0pOwogICAgYnl0ZWMgNyAvLyAidCIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9icmlkZ2UuY29udHJhY3QuYWxnby50czoxNTEKICAgIC8vIGFzc2VydCh0aGlzLm90aGVyQnJpZGdlVG9rZW5zKHRoaXMuX2dldE90aGVyQnJpZGdlVG9rZW5zS2V5KGRlc3RpbmF0aW9uQ2hhaW5JZCwgcmVjZWl2ZVRva2VuKSkuZXhpc3RzLCAnQnJpZGdlOiB1bmtub3duIGNoYWluIG9yIHRva2VuJyk7CiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyBCcmlkZ2U6IHVua25vd24gY2hhaW4gb3IgdG9rZW4KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvYnJpZGdlLmNvbnRyYWN0LmFsZ28udHM6MTUzCiAgICAvLyBjb25zdCBtZXNzYWdlID0gdGhpcy5oYXNoTWVzc2FnZShhbW91bnQsIHJlY2lwaWVudCwgdGhpcy5jaGFpbklkLnZhbHVlLCBkZXN0aW5hdGlvbkNoYWluSWQsIHJlY2VpdmVUb2tlbiwgbm9uY2UpOwogICAgZGlnIDEKICAgIGZyYW1lX2RpZyAtNgogICAgdW5jb3ZlciAyCiAgICBmcmFtZV9kaWcgLTUKICAgIGZyYW1lX2RpZyAtNAogICAgZnJhbWVfZGlnIC0zCiAgICBjYWxsc3ViIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvYnJpZGdlLmNvbnRyYWN0LmFsZ28udHM6OkJyaWRnZS5oYXNoTWVzc2FnZQogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9icmlkZ2UuY29udHJhY3QuYWxnby50czozNDEKICAgIC8vIHJldHVybiB0aGlzLmdldFRyYW5zYWN0aW9uUmVsYXllckNvc3QoY2hhaW5JZCkgKyB0aGlzLmdldFNlbmRUcmFuc2FjdGlvblN0b3JhZ2VDb3N0KCk7CiAgICBmcmFtZV9kaWcgLTUKICAgIGNhbGxzdWIgc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9nYXMtdXNhZ2UuYWxnby50czo6R2FzVXNhZ2UuZ2V0VHJhbnNhY3Rpb25SZWxheWVyQ29zdAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9icmlkZ2UuY29udHJhY3QuYWxnby50czozNTUKICAgIC8vIHJldHVybiAxNTcwMDsKICAgIGludGMgNCAvLyAxNTcwMAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9icmlkZ2UuY29udHJhY3QuYWxnby50czozNDEKICAgIC8vIHJldHVybiB0aGlzLmdldFRyYW5zYWN0aW9uUmVsYXllckNvc3QoY2hhaW5JZCkgKyB0aGlzLmdldFNlbmRUcmFuc2FjdGlvblN0b3JhZ2VDb3N0KCk7CiAgICArCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2JyaWRnZS5jb250cmFjdC5hbGdvLnRzOjYyCiAgICAvLyBzZW50TWVzc2FnZXMgPSBCb3hNYXA8U3RhdGljQnl0ZXM8MzI+LCBTdGF0aWNCeXRlcz4oeyBrZXlQcmVmaXg6ICdzJyB9KTsKICAgIHB1c2hieXRlcyAicyIKICAgIGRpZyAyCiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvYnJpZGdlLmNvbnRyYWN0LmFsZ28udHM6MTcyCiAgICAvLyBhc3NlcnQoIXRoaXMuc2VudE1lc3NhZ2VzKG1lc3NhZ2UpLmV4aXN0cywgJ0JyaWRnZTogdG9rZW5zIGFscmVhZHkgc2VudCcpOwogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgICEKICAgIGFzc2VydCAvLyBCcmlkZ2U6IHRva2VucyBhbHJlYWR5IHNlbnQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvYnJpZGdlLmNvbnRyYWN0LmFsZ28udHM6MTc0CiAgICAvLyB0aGlzLnNlbnRNZXNzYWdlcyhtZXNzYWdlKS52YWx1ZSA9IG5ldyBTdGF0aWNCeXRlcygpOwogICAgcHVzaGJ5dGVzIDB4CiAgICBib3hfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2JyaWRnZS5jb250cmFjdC5hbGdvLnRzOjE3NgogICAgLy8gY29uc3QgZGVzdGluYXRpb25DaGFpbklkID0gbWVzc2FnZS5hdCgxKTsKICAgIGRpZyAxCiAgICBleHRyYWN0IDEgMSAvLyBvbiBlcnJvcjogaW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvYnJpZGdlLmNvbnRyYWN0LmFsZ28udHM6MTc3LTE4MQogICAgLy8gY29uc3QgbWVzc2FnZUNvc3QgPSBhYmlDYWxsKHsKICAgIC8vICAgbWV0aG9kOiBNZXNzZW5nZXIucHJvdG90eXBlLmdldFRyYW5zYWN0aW9uQ29zdCwKICAgIC8vICAgYXBwSWQ6IHRoaXMubWVzc2VuZ2VyLnZhbHVlLmlkLAogICAgLy8gICBhcmdzOiBbZGVzdGluYXRpb25DaGFpbklkXSwKICAgIC8vIH0pLnJldHVyblZhbHVlOwogICAgaXR4bl9iZWdpbgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9icmlkZ2UuY29udHJhY3QuYWxnby50czoxNzkKICAgIC8vIGFwcElkOiB0aGlzLm1lc3Nlbmdlci52YWx1ZS5pZCwKICAgIGludGNfMSAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2JyaWRnZS5jb250cmFjdC5hbGdvLnRzOjU4CiAgICAvLyBtZXNzZW5nZXIgPSBHbG9iYWxTdGF0ZTxBcHBsaWNhdGlvbj4oKTsKICAgIGJ5dGVjIDYgLy8gIm1lc3NlbmdlciIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvYnJpZGdlLmNvbnRyYWN0LmFsZ28udHM6MTc5CiAgICAvLyBhcHBJZDogdGhpcy5tZXNzZW5nZXIudmFsdWUuaWQsCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9icmlkZ2UuY29udHJhY3QuYWxnby50czoxNzctMTgxCiAgICAvLyBjb25zdCBtZXNzYWdlQ29zdCA9IGFiaUNhbGwoewogICAgLy8gICBtZXRob2Q6IE1lc3Nlbmdlci5wcm90b3R5cGUuZ2V0VHJhbnNhY3Rpb25Db3N0LAogICAgLy8gICBhcHBJZDogdGhpcy5tZXNzZW5nZXIudmFsdWUuaWQsCiAgICAvLyAgIGFyZ3M6IFtkZXN0aW5hdGlvbkNoYWluSWRdLAogICAgLy8gfSkucmV0dXJuVmFsdWU7CiAgICBieXRlYyAxMyAvLyBtZXRob2QgImdldFRyYW5zYWN0aW9uQ29zdChieXRlKXVpbnQ2NCIKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBzd2FwCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgZHVwCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uSUQKICAgIHB1c2hpbnQgNiAvLyBhcHBsCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzEgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIGl0eG5fc3VibWl0CiAgICBpdHhuIExhc3RMb2cKICAgIGR1cAogICAgZXh0cmFjdCA0IDAKICAgIHN3YXAKICAgIGV4dHJhY3QgMCA0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgID09CiAgICBhc3NlcnQgLy8gQnl0ZXMgaGFzIHZhbGlkIHByZWZpeAogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ2NAogICAgYnRvaQogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9icmlkZ2UuY29udHJhY3QuYWxnby50czoxODUKICAgIC8vIHJlY2VpdmVyOiB0aGlzLm1lc3Nlbmdlci52YWx1ZS5hZGRyZXNzLAogICAgZGlnIDEKICAgIGFwcF9wYXJhbXNfZ2V0IEFwcEFkZHJlc3MKICAgIGFzc2VydCAvLyBhcHBsaWNhdGlvbiBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvYnJpZGdlLmNvbnRyYWN0LmFsZ28udHM6MTg3LTE4OQogICAgLy8gYWJpQ2FsbCh7CiAgICAvLyAgIG1ldGhvZDogTWVzc2VuZ2VyLnByb3RvdHlwZS5zZW5kTWVzc2FnZSwgYXBwSWQ6IHRoaXMubWVzc2VuZ2VyLnZhbHVlLmlkLCBhcmdzOiBbcGF5bWVudFBhcmFtcywgbWVzc2FnZV0sCiAgICAvLyB9KTsKICAgIGl0eG5fYmVnaW4KICAgIGl0eG5fZmllbGQgUmVjZWl2ZXIKICAgIGR1cAogICAgaXR4bl9maWVsZCBBbW91bnQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvYnJpZGdlLmNvbnRyYWN0LmFsZ28udHM6MTgzLTE4NgogICAgLy8gY29uc3QgcGF5bWVudFBhcmFtcyA9IGl0eG4ucGF5bWVudCh7CiAgICAvLyAgIGFtb3VudDogbWVzc2FnZUNvc3QsCiAgICAvLyAgIHJlY2VpdmVyOiB0aGlzLm1lc3Nlbmdlci52YWx1ZS5hZGRyZXNzLAogICAgLy8gfSk7CiAgICBpbnRjXzAgLy8gMQogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50Y18xIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2JyaWRnZS5jb250cmFjdC5hbGdvLnRzOjE4Ny0xODkKICAgIC8vIGFiaUNhbGwoewogICAgLy8gICBtZXRob2Q6IE1lc3Nlbmdlci5wcm90b3R5cGUuc2VuZE1lc3NhZ2UsIGFwcElkOiB0aGlzLm1lc3Nlbmdlci52YWx1ZS5pZCwgYXJnczogW3BheW1lbnRQYXJhbXMsIG1lc3NhZ2VdLAogICAgLy8gfSk7CiAgICBpdHhuX25leHQKICAgIHB1c2hieXRlcyAweGQwMmY1N2Y1IC8vIG1ldGhvZCAic2VuZE1lc3NhZ2UocGF5LGJ5dGVbMzJdKXZvaWQiCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgdW5jb3ZlciAzCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgc3dhcAogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbklECiAgICBwdXNoaW50IDYgLy8gYXBwbAogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50Y18xIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICBpdHhuX3N1Ym1pdAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9icmlkZ2UuY29udHJhY3QuYWxnby50czoxNTYKICAgIC8vIGVtaXQ8UmVjZWl2ZUZlZT4oeyBicmlkZ2VUcmFuc2FjdGlvbkNvc3QsIG1lc3NhZ2VUcmFuc2FjdGlvbkNvc3QgfSk7CiAgICBkaWcgMQogICAgaXRvYgogICAgZGlnIDEKICAgIGl0b2IKICAgIGNvbmNhdAogICAgcHVzaGJ5dGVzIDB4NGI1NTQxOWIgLy8gbWV0aG9kICJSZWNlaXZlRmVlKHVpbnQ2NCx1aW50NjQpIgogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvYnJpZGdlLmNvbnRyYWN0LmFsZ28udHM6MTU3CiAgICAvLyBhc3NlcnQoYnJpZGdpbmdGZWUgPj0gYnJpZGdlVHJhbnNhY3Rpb25Db3N0ICsgbWVzc2FnZVRyYW5zYWN0aW9uQ29zdCwgJ0JyaWRnZTogbm90IGVub3VnaCBmZWUnKTsKICAgICsKICAgIHVuY292ZXIgMgogICAgPD0KICAgIGFzc2VydCAvLyBCcmlkZ2U6IG5vdCBlbm91Z2ggZmVlCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2JyaWRnZS5jb250cmFjdC5hbGdvLnRzOjE1OC0xNjUKICAgIC8vIGVtaXQ8VG9rZW5zU2VudD4oewogICAgLy8gICAgIGFtb3VudCwKICAgIC8vICAgICByZWNpcGllbnQsCiAgICAvLyAgICAgZGVzdGluYXRpb25DaGFpbklkLAogICAgLy8gICAgIHJlY2VpdmVUb2tlbiwKICAgIC8vICAgICBub25jZSwKICAgIC8vICAgICBtZXNzZW5nZXI6IEFMTEJSSURHRV9NRVNTRU5HRVIsCiAgICAvLyAgIH0sCiAgICBpdG9iCiAgICBmcmFtZV9kaWcgLTYKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIC01CiAgICBjb25jYXQKICAgIGZyYW1lX2RpZyAtNAogICAgY29uY2F0CiAgICBmcmFtZV9kaWcgLTMKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9icmlkZ2UuY29udHJhY3QuYWxnby50czoxNjQKICAgIC8vIG1lc3NlbmdlcjogQUxMQlJJREdFX01FU1NFTkdFUiwKICAgIGJ5dGVjIDEwIC8vIDB4MDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvYnJpZGdlLmNvbnRyYWN0LmFsZ28udHM6MTU4LTE2NQogICAgLy8gZW1pdDxUb2tlbnNTZW50Pih7CiAgICAvLyAgICAgYW1vdW50LAogICAgLy8gICAgIHJlY2lwaWVudCwKICAgIC8vICAgICBkZXN0aW5hdGlvbkNoYWluSWQsCiAgICAvLyAgICAgcmVjZWl2ZVRva2VuLAogICAgLy8gICAgIG5vbmNlLAogICAgLy8gICAgIG1lc3NlbmdlcjogQUxMQlJJREdFX01FU1NFTkdFUiwKICAgIC8vICAgfSwKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9icmlkZ2UuY29udHJhY3QuYWxnby50czoxNTgtMTY2CiAgICAvLyBlbWl0PFRva2Vuc1NlbnQ+KHsKICAgIC8vICAgICBhbW91bnQsCiAgICAvLyAgICAgcmVjaXBpZW50LAogICAgLy8gICAgIGRlc3RpbmF0aW9uQ2hhaW5JZCwKICAgIC8vICAgICByZWNlaXZlVG9rZW4sCiAgICAvLyAgICAgbm9uY2UsCiAgICAvLyAgICAgbWVzc2VuZ2VyOiBBTExCUklER0VfTUVTU0VOR0VSLAogICAgLy8gICB9LAogICAgLy8gKTsKICAgIHB1c2hieXRlcyAweDIyOWZiYWVjIC8vIG1ldGhvZCAiVG9rZW5zU2VudCh1aW50NjQsYnl0ZVszMl0sYnl0ZSxieXRlWzMyXSxieXRlWzMyXSxieXRlKSIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICByZXRzdWIKCl9zd2FwQW5kQnJpZGdlX2FmdGVyX2lmX2Vsc2VAMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvYnJpZGdlLmNvbnRyYWN0LmFsZ28udHM6MzY3CiAgICAvLyBjb25zdCBmZWU6IHVpbnQ2NCA9IHRoaXMuYnJpZGdpbmdGZWVDb252ZXJzaW9uU2NhbGluZ0ZhY3Rvcihhc3NldCkudmFsdWUgKiBmZWVUb2tlbkFtb3VudCAvIGFiaUNhbGwoewogICAgZnJhbWVfZGlnIDEKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcm91dGVyLmFsZ28udHM6MzkKICAgIC8vIHByb3RlY3RlZCBicmlkZ2luZ0ZlZUNvbnZlcnNpb25TY2FsaW5nRmFjdG9yID0gQm94TWFwPEFzc2V0LCB1aW50NjQ+KHsga2V5UHJlZml4OiAnZicgfSk7CiAgICBwdXNoYnl0ZXMgImYiCiAgICBzd2FwCiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvYnJpZGdlLmNvbnRyYWN0LmFsZ28udHM6MzY3CiAgICAvLyBjb25zdCBmZWU6IHVpbnQ2NCA9IHRoaXMuYnJpZGdpbmdGZWVDb252ZXJzaW9uU2NhbGluZ0ZhY3Rvcihhc3NldCkudmFsdWUgKiBmZWVUb2tlbkFtb3VudCAvIGFiaUNhbGwoewogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIEJveCBtdXN0IGhhdmUgdmFsdWUKICAgIGJ0b2kKICAgIGZyYW1lX2RpZyAtMgogICAgKgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9icmlkZ2UuY29udHJhY3QuYWxnby50czozNjctMzcxCiAgICAvLyBjb25zdCBmZWU6IHVpbnQ2NCA9IHRoaXMuYnJpZGdpbmdGZWVDb252ZXJzaW9uU2NhbGluZ0ZhY3Rvcihhc3NldCkudmFsdWUgKiBmZWVUb2tlbkFtb3VudCAvIGFiaUNhbGwoewogICAgLy8gICBtZXRob2Q6IEdhc09yYWNsZS5wcm90b3R5cGUuZ2V0UHJpY2UsCiAgICAvLyAgIGFwcElkOiB0aGlzLmdhc09yYWNsZS52YWx1ZS5pZCwKICAgIC8vICAgYXJnczogW3RoaXMuY2hhaW5JZC52YWx1ZV0sCiAgICAvLyB9KS5yZXR1cm5WYWx1ZTsKICAgIGl0eG5fYmVnaW4KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvYnJpZGdlLmNvbnRyYWN0LmFsZ28udHM6MzY5CiAgICAvLyBhcHBJZDogdGhpcy5nYXNPcmFjbGUudmFsdWUuaWQsCiAgICBpbnRjXzEgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9nYXMtdXNhZ2UuYWxnby50czo5CiAgICAvLyBnYXNPcmFjbGUgPSBHbG9iYWxTdGF0ZTxBcHBsaWNhdGlvbj4oKTsKICAgIGJ5dGVjXzMgLy8gImdhc09yYWNsZSIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvYnJpZGdlLmNvbnRyYWN0LmFsZ28udHM6MzY5CiAgICAvLyBhcHBJZDogdGhpcy5nYXNPcmFjbGUudmFsdWUuaWQsCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9icmlkZ2UuY29udHJhY3QuYWxnby50czozNzAKICAgIC8vIGFyZ3M6IFt0aGlzLmNoYWluSWQudmFsdWVdLAogICAgaW50Y18xIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvYnJpZGdlLmNvbnRyYWN0LmFsZ28udHM6NTcKICAgIC8vIGNoYWluSWQgPSBHbG9iYWxTdGF0ZTxCeXRlPigpOwogICAgYnl0ZWMgNSAvLyAiY2hhaW5JZCIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvYnJpZGdlLmNvbnRyYWN0LmFsZ28udHM6MzcwCiAgICAvLyBhcmdzOiBbdGhpcy5jaGFpbklkLnZhbHVlXSwKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2JyaWRnZS5jb250cmFjdC5hbGdvLnRzOjM2Ny0zNzEKICAgIC8vIGNvbnN0IGZlZTogdWludDY0ID0gdGhpcy5icmlkZ2luZ0ZlZUNvbnZlcnNpb25TY2FsaW5nRmFjdG9yKGFzc2V0KS52YWx1ZSAqIGZlZVRva2VuQW1vdW50IC8gYWJpQ2FsbCh7CiAgICAvLyAgIG1ldGhvZDogR2FzT3JhY2xlLnByb3RvdHlwZS5nZXRQcmljZSwKICAgIC8vICAgYXBwSWQ6IHRoaXMuZ2FzT3JhY2xlLnZhbHVlLmlkLAogICAgLy8gICBhcmdzOiBbdGhpcy5jaGFpbklkLnZhbHVlXSwKICAgIC8vIH0pLnJldHVyblZhbHVlOwogICAgcHVzaGJ5dGVzIDB4MWRiNzBjZGQgLy8gbWV0aG9kICJnZXRQcmljZShieXRlKXVpbnQ2NCIKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbklECiAgICBwdXNoaW50IDYgLy8gYXBwbAogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50Y18xIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICBpdHhuX3N1Ym1pdAogICAgaXR4biBMYXN0TG9nCiAgICBkdXAKICAgIGV4dHJhY3QgNCAwCiAgICBzd2FwCiAgICBleHRyYWN0IDAgNAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICA9PQogICAgYXNzZXJ0IC8vIEJ5dGVzIGhhcyB2YWxpZCBwcmVmaXgKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzIgLy8gOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50NjQKICAgIGJ0b2kKICAgIC8KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvYnJpZGdlLmNvbnRyYWN0LmFsZ28udHM6MTMyCiAgICAvLyBjb25zdCBmZWVGcm9tU3RhYmxlOiB1aW50NjQgPSB0aGlzLl9jb252ZXJ0QnJpZGdpbmdGZWVJblRva2Vuc1RvTmF0aXZlVG9rZW4oYXNzZXRUcmFuc2ZlclJlZi54ZmVyQXNzZXQsIGZlZVRva2VuQW1vdW50KTsKICAgIGIgX3N3YXBBbmRCcmlkZ2VfYWZ0ZXJfaW5saW5lZF9zbWFydF9jb250cmFjdHMvY29udHJhY3RzL2JyaWRnZS5jb250cmFjdC5hbGdvLnRzOjpCcmlkZ2UuX2NvbnZlcnRCcmlkZ2luZ0ZlZUluVG9rZW5zVG9OYXRpdmVUb2tlbkA1CgoKLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9icmlkZ2UuY29udHJhY3QuYWxnby50czo6QnJpZGdlLmhhc2hNZXNzYWdlKGFtb3VudDogdWludDY0LCByZWNpcGllbnQ6IGJ5dGVzLCBzb3VyY2VDaGFpbklkOiBieXRlcywgZGVzdGluYXRpb25DaGFpbklkOiBieXRlcywgcmVjZWl2ZVRva2VuOiBieXRlcywgbm9uY2U6IGJ5dGVzKSAtPiBieXRlczoKc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9icmlkZ2UuY29udHJhY3QuYWxnby50czo6QnJpZGdlLmhhc2hNZXNzYWdlOgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9icmlkZ2UuY29udHJhY3QuYWxnby50czozMDctMzE1CiAgICAvLyBAYWJpbWV0aG9kKHsgcmVhZG9ubHk6IHRydWUgfSkKICAgIC8vIGhhc2hNZXNzYWdlKAogICAgLy8gICBhbW91bnQ6IHVpbnQ2NCwKICAgIC8vICAgcmVjaXBpZW50OiBTdGF0aWNCeXRlczwzMj4sCiAgICAvLyAgIHNvdXJjZUNoYWluSWQ6IEJ5dGUsCiAgICAvLyAgIGRlc3RpbmF0aW9uQ2hhaW5JZDogQnl0ZSwKICAgIC8vICAgcmVjZWl2ZVRva2VuOiBTdGF0aWNCeXRlczwzMj4sCiAgICAvLyAgIG5vbmNlOiBTdGF0aWNCeXRlczwzMj4sCiAgICAvLyApOiBTdGF0aWNCeXRlczwzMj4gewogICAgcHJvdG8gNiAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2JyaWRnZS5jb250cmFjdC5hbGdvLnRzOjMxNgogICAgLy8gY29uc3QgYW1vdW50MzIgPSBiemVybygyNCkuY29uY2F0KG9wLml0b2IoYW1vdW50KSk7CiAgICBwdXNoaW50IDI0IC8vIDI0CiAgICBiemVybwogICAgZnJhbWVfZGlnIC02CiAgICBpdG9iCiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvYnJpZGdlLmNvbnRyYWN0LmFsZ28udHM6MzE3CiAgICAvLyBjb25zdCBzb3VyY2VDaGFpbklkMzIgPSBiemVybygzMSkuY29uY2F0KHNvdXJjZUNoYWluSWQuYnl0ZXMpOwogICAgcHVzaGludCAzMSAvLyAzMQogICAgYnplcm8KICAgIGZyYW1lX2RpZyAtNAogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2JyaWRnZS5jb250cmFjdC5hbGdvLnRzOjMxOC0zMTkKICAgIC8vIGNvbnN0IHBhY2tlZCA9IGFtb3VudDMyCiAgICAvLyAgIC5jb25jYXQocmVjaXBpZW50LmJ5dGVzKQogICAgc3dhcAogICAgZnJhbWVfZGlnIC01CiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvYnJpZGdlLmNvbnRyYWN0LmFsZ28udHM6MzE4LTMyMAogICAgLy8gY29uc3QgcGFja2VkID0gYW1vdW50MzIKICAgIC8vICAgLmNvbmNhdChyZWNpcGllbnQuYnl0ZXMpCiAgICAvLyAgIC5jb25jYXQoc291cmNlQ2hhaW5JZDMyKQogICAgc3dhcAogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2JyaWRnZS5jb250cmFjdC5hbGdvLnRzOjMxOC0zMjEKICAgIC8vIGNvbnN0IHBhY2tlZCA9IGFtb3VudDMyCiAgICAvLyAgIC5jb25jYXQocmVjaXBpZW50LmJ5dGVzKQogICAgLy8gICAuY29uY2F0KHNvdXJjZUNoYWluSWQzMikKICAgIC8vICAgLmNvbmNhdChyZWNlaXZlVG9rZW4uYnl0ZXMpCiAgICBmcmFtZV9kaWcgLTIKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9icmlkZ2UuY29udHJhY3QuYWxnby50czozMTgtMzIyCiAgICAvLyBjb25zdCBwYWNrZWQgPSBhbW91bnQzMgogICAgLy8gICAuY29uY2F0KHJlY2lwaWVudC5ieXRlcykKICAgIC8vICAgLmNvbmNhdChzb3VyY2VDaGFpbklkMzIpCiAgICAvLyAgIC5jb25jYXQocmVjZWl2ZVRva2VuLmJ5dGVzKQogICAgLy8gICAuY29uY2F0KG5vbmNlLmJ5dGVzKQogICAgZnJhbWVfZGlnIC0xCiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvYnJpZGdlLmNvbnRyYWN0LmFsZ28udHM6MzIzCiAgICAvLyAuY29uY2F0KEFMTEJSSURHRV9NRVNTRU5HRVIuYnl0ZXMpOwogICAgYnl0ZWMgMTAgLy8gMHgwMQogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9icmlkZ2UuY29udHJhY3QuYWxnby50czozMTgtMzIzCiAgICAvLyBjb25zdCBwYWNrZWQgPSBhbW91bnQzMgogICAgLy8gICAuY29uY2F0KHJlY2lwaWVudC5ieXRlcykKICAgIC8vICAgLmNvbmNhdChzb3VyY2VDaGFpbklkMzIpCiAgICAvLyAgIC5jb25jYXQocmVjZWl2ZVRva2VuLmJ5dGVzKQogICAgLy8gICAuY29uY2F0KG5vbmNlLmJ5dGVzKQogICAgLy8gICAuY29uY2F0KEFMTEJSSURHRV9NRVNTRU5HRVIuYnl0ZXMpOwogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2JyaWRnZS5jb250cmFjdC5hbGdvLnRzOjMyNQogICAgLy8gY29uc3QgaGFzaCA9IG9wLmtlY2NhazI1NihwYWNrZWQpOyAvLyAzMiBieXRlcwogICAga2VjY2FrMjU2CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2JyaWRnZS5jb250cmFjdC5hbGdvLnRzOjMyOAogICAgLy8gY29uc3Qgd2l0aFNyYyA9IG9wLnNldEJ5dGUoaGFzaCwgMCwgb3AuYnRvaShzb3VyY2VDaGFpbklkLmJ5dGVzKSk7CiAgICBmcmFtZV9kaWcgLTQKICAgIGJ0b2kKICAgIGludGNfMSAvLyAwCiAgICBzd2FwCiAgICBzZXRieXRlCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2JyaWRnZS5jb250cmFjdC5hbGdvLnRzOjMyOQogICAgLy8gY29uc3Qgd2l0aERzdCA9IG9wLnNldEJ5dGUod2l0aFNyYywgMSwgb3AuYnRvaShkZXN0aW5hdGlvbkNoYWluSWQuYnl0ZXMpKTsKICAgIGZyYW1lX2RpZyAtMwogICAgYnRvaQogICAgaW50Y18wIC8vIDEKICAgIHN3YXAKICAgIHNldGJ5dGUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvYnJpZGdlLmNvbnRyYWN0LmFsZ28udHM6MzMxCiAgICAvLyByZXR1cm4gbmV3IFN0YXRpY0J5dGVzPDMyPih3aXRoRHN0KTsKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzMgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBzaXplCiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3JvdXRlci5hbGdvLnRzOjpSb3V0ZXIucmVjZWl2ZUFuZFN3YXBGcm9tVlVzZChhc3NldDogdWludDY0LCByZWNpcGllbnQ6IGJ5dGVzLCB2VXNkQW1vdW50OiB1aW50NjQsIHJlY2VpdmVBbW91bnRNaW46IHVpbnQ2NCkgLT4gdWludDY0OgpyZWNlaXZlQW5kU3dhcEZyb21WVXNkOgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yb3V0ZXIuYWxnby50czoxNjMtMTY4CiAgICAvLyBwcm90ZWN0ZWQgcmVjZWl2ZUFuZFN3YXBGcm9tVlVzZCgKICAgIC8vICAgYXNzZXQ6IEFzc2V0LAogICAgLy8gICByZWNpcGllbnQ6IEFkZHJlc3MsCiAgICAvLyAgIHZVc2RBbW91bnQ6IHVpbnQ2NCwKICAgIC8vICAgcmVjZWl2ZUFtb3VudE1pbjogdWludDY0LAogICAgLy8gKTogdWludDY0IHsKICAgIHByb3RvIDQgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yb3V0ZXIuYWxnby50czoxNjkKICAgIC8vIGFzc2VydCh0aGlzLnBvb2xzKGFzc2V0KS5leGlzdHMsICdSb3V0ZXI6IG5vIHJlY2VpdmUgcG9vbCcpOwogICAgZnJhbWVfZGlnIC00CiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3JvdXRlci5hbGdvLnRzOjM0CiAgICAvLyBwb29scyA9IEJveE1hcDxBc3NldCwgdWludDY0Pih7IGtleVByZWZpeDogJ3AnIH0pOwogICAgYnl0ZWMgOCAvLyAicCIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yb3V0ZXIuYWxnby50czoxNjkKICAgIC8vIGFzc2VydCh0aGlzLnBvb2xzKGFzc2V0KS5leGlzdHMsICdSb3V0ZXI6IG5vIHJlY2VpdmUgcG9vbCcpOwogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyBSb3V0ZXI6IG5vIHJlY2VpdmUgcG9vbAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yb3V0ZXIuYWxnby50czoxNzAKICAgIC8vIGNvbnN0IHBvb2xJZCA9IHRoaXMucG9vbHMoYXNzZXQpLnZhbHVlOwogICAgYm94X2dldAogICAgcG9wCiAgICBidG9pCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3JvdXRlci5hbGdvLnRzOjE3MS0xNzUKICAgIC8vIHJldHVybiBhYmlDYWxsKHsKICAgIC8vICAgbWV0aG9kOiBQb29sLnByb3RvdHlwZS5zd2FwRnJvbVZVc2QsCiAgICAvLyAgIGFwcElkOiBwb29sSWQsCiAgICAvLyAgIGFyZ3M6IFtyZWNpcGllbnQsIHZVc2RBbW91bnQsIHJlY2VpdmVBbW91bnRNaW4sIHJlY2lwaWVudCA9PT0gdGhpcy5yZWJhbGFuY2VyLnZhbHVlXSwKICAgIC8vIH0pLnJldHVyblZhbHVlOwogICAgaXR4bl9iZWdpbgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yb3V0ZXIuYWxnby50czoxNzQKICAgIC8vIGFyZ3M6IFtyZWNpcGllbnQsIHZVc2RBbW91bnQsIHJlY2VpdmVBbW91bnRNaW4sIHJlY2lwaWVudCA9PT0gdGhpcy5yZWJhbGFuY2VyLnZhbHVlXSwKICAgIGZyYW1lX2RpZyAtMgogICAgaXRvYgogICAgZnJhbWVfZGlnIC0xCiAgICBpdG9iCiAgICBpbnRjXzEgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yb3V0ZXIuYWxnby50czo1MgogICAgLy8gcHJpdmF0ZSByZWJhbGFuY2VyID0gR2xvYmFsU3RhdGU8QWRkcmVzcz4oeyBpbml0aWFsVmFsdWU6IG5ldyBBZGRyZXNzKGJ6ZXJvKDApKSB9KTsvLyBjYW4gcmVzdHJpY3QgZGVwb3NpdCBvciB3aXRoZHJhdyBvcGVyYXRpb25zCiAgICBieXRlYyA0IC8vICJyZWJhbGFuY2VyIgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yb3V0ZXIuYWxnby50czoxNzQKICAgIC8vIGFyZ3M6IFtyZWNpcGllbnQsIHZVc2RBbW91bnQsIHJlY2VpdmVBbW91bnRNaW4sIHJlY2lwaWVudCA9PT0gdGhpcy5yZWJhbGFuY2VyLnZhbHVlXSwKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICBmcmFtZV9kaWcgLTMKICAgID09CiAgICBieXRlYyAxMSAvLyAweDAwCiAgICBpbnRjXzEgLy8gMAogICAgdW5jb3ZlciAyCiAgICBzZXRiaXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcm91dGVyLmFsZ28udHM6MTcxLTE3NQogICAgLy8gcmV0dXJuIGFiaUNhbGwoewogICAgLy8gICBtZXRob2Q6IFBvb2wucHJvdG90eXBlLnN3YXBGcm9tVlVzZCwKICAgIC8vICAgYXBwSWQ6IHBvb2xJZCwKICAgIC8vICAgYXJnczogW3JlY2lwaWVudCwgdlVzZEFtb3VudCwgcmVjZWl2ZUFtb3VudE1pbiwgcmVjaXBpZW50ID09PSB0aGlzLnJlYmFsYW5jZXIudmFsdWVdLAogICAgLy8gfSkucmV0dXJuVmFsdWU7CiAgICBwdXNoYnl0ZXMgMHgwZDFiNGMwNiAvLyBtZXRob2QgInN3YXBGcm9tVlVzZChhZGRyZXNzLHVpbnQ2NCx1aW50NjQsYm9vbCl1aW50NjQiCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgZnJhbWVfZGlnIC0zCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgdW5jb3ZlciAyCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgc3dhcAogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uSUQKICAgIHB1c2hpbnQgNiAvLyBhcHBsCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzEgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIGl0eG5fc3VibWl0CiAgICBpdHhuIExhc3RMb2cKICAgIGR1cAogICAgZXh0cmFjdCA0IDAKICAgIHN3YXAKICAgIGV4dHJhY3QgMCA0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgID09CiAgICBhc3NlcnQgLy8gQnl0ZXMgaGFzIHZhbGlkIHByZWZpeAogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ2NAogICAgYnRvaQogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yb3V0ZXIuYWxnby50czo6Um91dGVyLnNlbmRBbmRTd2FwVG9WVXNkKGFzc2V0OiB1aW50NjQsIHVzZXI6IGJ5dGVzLCBhbW91bnQ6IHVpbnQ2NCkgLT4gdWludDY0OgpzZW5kQW5kU3dhcFRvVlVzZDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcm91dGVyLmFsZ28udHM6MTc5CiAgICAvLyBwcm90ZWN0ZWQgc2VuZEFuZFN3YXBUb1ZVc2QoYXNzZXQ6IEFzc2V0LCB1c2VyOiBBZGRyZXNzLCBhbW91bnQ6IHVpbnQ2NCk6IHVpbnQ2NCB7CiAgICBwcm90byAzIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcm91dGVyLmFsZ28udHM6MTgwCiAgICAvLyBhc3NlcnQodGhpcy5wb29scyhhc3NldCkuZXhpc3RzLCAnUm91dGVyOiBubyBwb29sJyk7CiAgICBmcmFtZV9kaWcgLTMKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcm91dGVyLmFsZ28udHM6MzQKICAgIC8vIHBvb2xzID0gQm94TWFwPEFzc2V0LCB1aW50NjQ+KHsga2V5UHJlZml4OiAncCcgfSk7CiAgICBieXRlYyA4IC8vICJwIgogICAgc3dhcAogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3JvdXRlci5hbGdvLnRzOjE4MAogICAgLy8gYXNzZXJ0KHRoaXMucG9vbHMoYXNzZXQpLmV4aXN0cywgJ1JvdXRlcjogbm8gcG9vbCcpOwogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyBSb3V0ZXI6IG5vIHBvb2wKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcm91dGVyLmFsZ28udHM6MTgxCiAgICAvLyBjb25zdCBwb29sSWQgPSB0aGlzLnBvb2xzKGFzc2V0KS52YWx1ZTsKICAgIGJveF9nZXQKICAgIHBvcAogICAgYnRvaQogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yb3V0ZXIuYWxnby50czoxODMtMTg4CiAgICAvLyBpdHhuLmFzc2V0VHJhbnNmZXIoewogICAgLy8gICB4ZmVyQXNzZXQ6IGFzc2V0LAogICAgLy8gICBhc3NldEFtb3VudDogYW1vdW50LAogICAgLy8gICBhc3NldFJlY2VpdmVyOiBBcHBsaWNhdGlvbihwb29sSWQpLmFkZHJlc3MsCiAgICAvLyB9KQogICAgLy8gICAuc3VibWl0KCk7CiAgICBpdHhuX2JlZ2luCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3JvdXRlci5hbGdvLnRzOjE4NgogICAgLy8gYXNzZXRSZWNlaXZlcjogQXBwbGljYXRpb24ocG9vbElkKS5hZGRyZXNzLAogICAgZHVwCiAgICBhcHBfcGFyYW1zX2dldCBBcHBBZGRyZXNzCiAgICBhc3NlcnQgLy8gYXBwbGljYXRpb24gZXhpc3RzCiAgICBpdHhuX2ZpZWxkIEFzc2V0UmVjZWl2ZXIKICAgIGZyYW1lX2RpZyAtMQogICAgaXR4bl9maWVsZCBBc3NldEFtb3VudAogICAgZnJhbWVfZGlnIC0zCiAgICBpdHhuX2ZpZWxkIFhmZXJBc3NldAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yb3V0ZXIuYWxnby50czoxODMtMTg3CiAgICAvLyBpdHhuLmFzc2V0VHJhbnNmZXIoewogICAgLy8gICB4ZmVyQXNzZXQ6IGFzc2V0LAogICAgLy8gICBhc3NldEFtb3VudDogYW1vdW50LAogICAgLy8gICBhc3NldFJlY2VpdmVyOiBBcHBsaWNhdGlvbihwb29sSWQpLmFkZHJlc3MsCiAgICAvLyB9KQogICAgcHVzaGludCA0IC8vIDQKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMSAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yb3V0ZXIuYWxnby50czoxODMtMTg4CiAgICAvLyBpdHhuLmFzc2V0VHJhbnNmZXIoewogICAgLy8gICB4ZmVyQXNzZXQ6IGFzc2V0LAogICAgLy8gICBhc3NldEFtb3VudDogYW1vdW50LAogICAgLy8gICBhc3NldFJlY2VpdmVyOiBBcHBsaWNhdGlvbihwb29sSWQpLmFkZHJlc3MsCiAgICAvLyB9KQogICAgLy8gICAuc3VibWl0KCk7CiAgICBpdHhuX3N1Ym1pdAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yb3V0ZXIuYWxnby50czoxOTAtMTk0CiAgICAvLyByZXR1cm4gYWJpQ2FsbCh7CiAgICAvLyAgIG1ldGhvZDogUG9vbC5wcm90b3R5cGUuc3dhcFRvVlVzZCwKICAgIC8vICAgYXBwSWQ6IHBvb2xJZCwKICAgIC8vICAgYXJnczogW3VzZXIsIGFtb3VudCwgdXNlciA9PT0gdGhpcy5yZWJhbGFuY2VyLnZhbHVlXSwKICAgIC8vIH0pLnJldHVyblZhbHVlOwogICAgaXR4bl9iZWdpbgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yb3V0ZXIuYWxnby50czoxOTMKICAgIC8vIGFyZ3M6IFt1c2VyLCBhbW91bnQsIHVzZXIgPT09IHRoaXMucmViYWxhbmNlci52YWx1ZV0sCiAgICBmcmFtZV9kaWcgLTEKICAgIGl0b2IKICAgIGludGNfMSAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3JvdXRlci5hbGdvLnRzOjUyCiAgICAvLyBwcml2YXRlIHJlYmFsYW5jZXIgPSBHbG9iYWxTdGF0ZTxBZGRyZXNzPih7IGluaXRpYWxWYWx1ZTogbmV3IEFkZHJlc3MoYnplcm8oMCkpIH0pOy8vIGNhbiByZXN0cmljdCBkZXBvc2l0IG9yIHdpdGhkcmF3IG9wZXJhdGlvbnMKICAgIGJ5dGVjIDQgLy8gInJlYmFsYW5jZXIiCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3JvdXRlci5hbGdvLnRzOjE5MwogICAgLy8gYXJnczogW3VzZXIsIGFtb3VudCwgdXNlciA9PT0gdGhpcy5yZWJhbGFuY2VyLnZhbHVlXSwKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICBmcmFtZV9kaWcgLTIKICAgID09CiAgICBieXRlYyAxMSAvLyAweDAwCiAgICBpbnRjXzEgLy8gMAogICAgdW5jb3ZlciAyCiAgICBzZXRiaXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcm91dGVyLmFsZ28udHM6MTkwLTE5NAogICAgLy8gcmV0dXJuIGFiaUNhbGwoewogICAgLy8gICBtZXRob2Q6IFBvb2wucHJvdG90eXBlLnN3YXBUb1ZVc2QsCiAgICAvLyAgIGFwcElkOiBwb29sSWQsCiAgICAvLyAgIGFyZ3M6IFt1c2VyLCBhbW91bnQsIHVzZXIgPT09IHRoaXMucmViYWxhbmNlci52YWx1ZV0sCiAgICAvLyB9KS5yZXR1cm5WYWx1ZTsKICAgIHB1c2hieXRlcyAweGQ5NzhhZDE0IC8vIG1ldGhvZCAic3dhcFRvVlVzZChhZGRyZXNzLHVpbnQ2NCxib29sKXVpbnQ2NCIKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBmcmFtZV9kaWcgLTIKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBzd2FwCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25JRAogICAgcHVzaGludCA2IC8vIGFwcGwKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMSAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgaXR4bl9zdWJtaXQKICAgIGl0eG4gTGFzdExvZwogICAgZHVwCiAgICBleHRyYWN0IDQgMAogICAgc3dhcAogICAgZXh0cmFjdCAwIDQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgPT0KICAgIGFzc2VydCAvLyBCeXRlcyBoYXMgdmFsaWQgcHJlZml4CiAgICBkdXAKICAgIGxlbgogICAgaW50Y18yIC8vIDgKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQudWludDY0CiAgICBidG9pCiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2dhcy11c2FnZS5hbGdvLnRzOjpHYXNVc2FnZS5nZXRHYXNVc2FnZShjaGFpbklkOiBieXRlcykgLT4gdWludDY0OgpzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2dhcy11c2FnZS5hbGdvLnRzOjpHYXNVc2FnZS5nZXRHYXNVc2FnZToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvZ2FzLXVzYWdlLmFsZ28udHM6MTctMTgKICAgIC8vIEBhYmltZXRob2QoeyByZWFkb25seTogdHJ1ZSB9KQogICAgLy8gZ2V0R2FzVXNhZ2UoY2hhaW5JZDogQnl0ZSk6IHVpbnQ2NCB7CiAgICBwcm90byAxIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvZ2FzLXVzYWdlLmFsZ28udHM6MTAKICAgIC8vIGdhc1VzYWdlID0gQm94TWFwPEJ5dGUsIHVpbnQ2ND4oeyBrZXlQcmVmaXg6ICd1JyB9KTsKICAgIGJ5dGVjIDEyIC8vICJ1IgogICAgZnJhbWVfZGlnIC0xCiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvZ2FzLXVzYWdlLmFsZ28udHM6MTkKICAgIC8vIHJldHVybiB0aGlzLmdhc1VzYWdlKGNoYWluSWQpLnZhbHVlOwogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIEJveCBtdXN0IGhhdmUgdmFsdWUKICAgIGJ0b2kKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvZ2FzLXVzYWdlLmFsZ28udHM6Okdhc1VzYWdlLmdldFRyYW5zYWN0aW9uUmVsYXllckNvc3QoY2hhaW5JZDogYnl0ZXMpIC0+IHVpbnQ2NDoKc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9nYXMtdXNhZ2UuYWxnby50czo6R2FzVXNhZ2UuZ2V0VHJhbnNhY3Rpb25SZWxheWVyQ29zdDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvZ2FzLXVzYWdlLmFsZ28udHM6MzQtMzUKICAgIC8vIEBhYmltZXRob2QoeyByZWFkb25seTogdHJ1ZSB9KQogICAgLy8gZ2V0VHJhbnNhY3Rpb25SZWxheWVyQ29zdChjaGFpbklkOiBCeXRlKTogdWludDY0IHsKICAgIHByb3RvIDEgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9nYXMtdXNhZ2UuYWxnby50czoxMAogICAgLy8gZ2FzVXNhZ2UgPSBCb3hNYXA8Qnl0ZSwgdWludDY0Pih7IGtleVByZWZpeDogJ3UnIH0pOwogICAgYnl0ZWMgMTIgLy8gInUiCiAgICBmcmFtZV9kaWcgLTEKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9nYXMtdXNhZ2UuYWxnby50czozNgogICAgLy8gY29uc3QgZ2FzQW1vdW50ID0gdGhpcy5nYXNVc2FnZShjaGFpbklkKS52YWx1ZTsKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBCb3ggbXVzdCBoYXZlIHZhbHVlCiAgICBidG9pCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2dhcy11c2FnZS5hbGdvLnRzOjM3LTQxCiAgICAvLyByZXR1cm4gYWJpQ2FsbCh7CiAgICAvLyAgIG1ldGhvZDogR2FzT3JhY2xlLnByb3RvdHlwZS5nZXRUcmFuc2FjdGlvbkdhc0Nvc3RJbk5hdGl2ZVRva2VuLAogICAgLy8gICBhcHBJZDogdGhpcy5nYXNPcmFjbGUudmFsdWUuaWQsCiAgICAvLyAgIGFyZ3M6IFtjaGFpbklkLCBnYXNBbW91bnRdLAogICAgLy8gfSkucmV0dXJuVmFsdWU7CiAgICBpdHhuX2JlZ2luCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2dhcy11c2FnZS5hbGdvLnRzOjM5CiAgICAvLyBhcHBJZDogdGhpcy5nYXNPcmFjbGUudmFsdWUuaWQsCiAgICBpbnRjXzEgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9nYXMtdXNhZ2UuYWxnby50czo5CiAgICAvLyBnYXNPcmFjbGUgPSBHbG9iYWxTdGF0ZTxBcHBsaWNhdGlvbj4oKTsKICAgIGJ5dGVjXzMgLy8gImdhc09yYWNsZSIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvZ2FzLXVzYWdlLmFsZ28udHM6MzkKICAgIC8vIGFwcElkOiB0aGlzLmdhc09yYWNsZS52YWx1ZS5pZCwKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2dhcy11c2FnZS5hbGdvLnRzOjQwCiAgICAvLyBhcmdzOiBbY2hhaW5JZCwgZ2FzQW1vdW50XSwKICAgIHN3YXAKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvZ2FzLXVzYWdlLmFsZ28udHM6MzctNDEKICAgIC8vIHJldHVybiBhYmlDYWxsKHsKICAgIC8vICAgbWV0aG9kOiBHYXNPcmFjbGUucHJvdG90eXBlLmdldFRyYW5zYWN0aW9uR2FzQ29zdEluTmF0aXZlVG9rZW4sCiAgICAvLyAgIGFwcElkOiB0aGlzLmdhc09yYWNsZS52YWx1ZS5pZCwKICAgIC8vICAgYXJnczogW2NoYWluSWQsIGdhc0Ftb3VudF0sCiAgICAvLyB9KS5yZXR1cm5WYWx1ZTsKICAgIHB1c2hieXRlcyAweGMyYWZjY2QxIC8vIG1ldGhvZCAiZ2V0VHJhbnNhY3Rpb25HYXNDb3N0SW5OYXRpdmVUb2tlbihieXRlLHVpbnQ2NCl1aW50NjQiCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgZnJhbWVfZGlnIC0xCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25JRAogICAgcHVzaGludCA2IC8vIGFwcGwKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMSAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgaXR4bl9zdWJtaXQKICAgIGl0eG4gTGFzdExvZwogICAgZHVwCiAgICBleHRyYWN0IDQgMAogICAgc3dhcAogICAgZXh0cmFjdCAwIDQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgPT0KICAgIGFzc2VydCAvLyBCeXRlcyBoYXMgdmFsaWQgcHJlZml4CiAgICBkdXAKICAgIGxlbgogICAgaW50Y18yIC8vIDgKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQudWludDY0CiAgICBidG9pCiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL293bmFibGUuYWxnby50czo6T3duYWJsZS5vbmx5T3duZXIoKSAtPiB2b2lkOgpvbmx5T3duZXI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL293bmFibGUuYWxnby50czoxMwogICAgLy8gYXNzZXJ0KG9wLlR4bi5zZW5kZXIuYnl0ZXMgPT09IHRoaXMub3duZXIudmFsdWUuYnl0ZXMsICdPbmx5IG93bmVyJyk7CiAgICB0eG4gU2VuZGVyCiAgICBpbnRjXzEgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9vd25hYmxlLmFsZ28udHM6NgogICAgLy8gcHJvdGVjdGVkIG93bmVyID0gR2xvYmFsU3RhdGU8QWRkcmVzcz4oKTsKICAgIGJ5dGVjXzIgLy8gIm93bmVyIgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9vd25hYmxlLmFsZ28udHM6MTMKICAgIC8vIGFzc2VydChvcC5UeG4uc2VuZGVyLmJ5dGVzID09PSB0aGlzLm93bmVyLnZhbHVlLmJ5dGVzLCAnT25seSBvd25lcicpOwogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgID09CiAgICBhc3NlcnQgLy8gT25seSBvd25lcgogICAgcmV0c3ViCg==",
501
+ clear: "I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBAYWxnb3JhbmRmb3VuZGF0aW9uL2FsZ29yYW5kLXR5cGVzY3JpcHQvYmFzZS1jb250cmFjdC5kLnRzOjpCYXNlQ29udHJhY3QuY2xlYXJTdGF0ZVByb2dyYW0oKSAtPiB1aW50NjQ6Cm1haW46CiAgICBwdXNoaW50IDEgLy8gMQogICAgcmV0dXJuCg==",
502
+ },
503
+ byteCode: {
504
+ approval: "CyAFAQAIINR6JhEEFR98dQdjYW5Td2FwBW93bmVyCWdhc09yYWNsZQpyZWJhbGFuY2VyB2NoYWluSWQJbWVzc2VuZ2VyAXQBcA1zdG9wQXV0aG9yaXR5AQEBAAF1BENBeqME90dbggwVH3x1AAAAAAAAPVQDBoEBMRhAAAkjrycETGcpImcxGRREMRhBAM2CDARl9wVzBD44AnwEpGAK7QTeTK1KBE66ByEExhftcwRXUxVgBGOAgngEBlB8agT1+W6zBEsGLKAEw83ZKicNggkEB9+EKQSAxccPBEE00GgE7xX4VQRrHuIjBBhwpJIENVcyTQQEsWHxBNKzV+snDoIEBAylrnoEJ0cPBwTL/G0CBOF7r7Q2GgCOGwDZARQBZAGpArACzQLqAwYDJANdA+QEHgRCAAYAAQRXBMsFEwUoBTYFPgVPBWAFcgWQBaEFswAnD7AiQycPsCJDgARmTKQENhoAjgEAiACKAgCL/oEKCIsAMgwNQQAqsYEGshCBBbIZJxCyHicQsh+L/40CAAsABLNC/9syALIBQv/1I7IBQv/viYoBAYv/OBQyChJEi/84IDIDEkSL/zgVMgMSRIv/OBKJigEBi/84BzIKE0EAAiOJi/84IDIDE0EAAiOJi/84CTIDE0EAAiOJi/84CIk2GgFJFSUSRDYaAkkVIhJENhoDSRUkEkQXNhoESRUkEkQXKksEZytMZycJTwNnJwVPAmcnBkxnIkM2GgFJFSQSRBeIB3exMgqyFCOyErIRgQSyECOyAbOAGEJyaWRnZTogb3B0LWluIGNvbXBsZXRlZLAiQzEWgQIJSTgQIhJEMRYiCUk4EIEEEkQ2GgFJFSUSRDYaAkkVIhJENhoDSRUlEkQ2GgRJFSUSRDYaBUkVJBJEF08GiP8cTgZOBiNPB4gEYSJDMRYiCUk4EIEEEkQ2GgFJFSUSRDYaAkkVIhJENhoDSRUlEkQ2GgRJFSUSRDYaBUkVJBJEFzYaBkkVJBJEFyNOB4gEHCJDMRYiCUk4ECISRDYaAUkVJBJEFzYaAklOA0kVJRJENhoDSRUiEkQ2GgRJFSUSRDYaBUlOBkkVJRJENhoGSRUkEkQXIyllRESAAWJLBFBJvUUBRE8HiP50SSEED0QjJwVlREsISwhPCE8DSwhPCIgFA08CvkRLAUxQAkxRAAJMUQIgUElOBkkVJRJEgAFtSwFQSb1FARREgAC/sSMnBmVEgAQz4UeqshqyGLIagQayECOyAbO0PklXBABMVwAEKBJESRUiEkQjU0RPAoEYW08DTwRPBIgEz0whBAlJQQAPsUsEsgdJsggishAjsgGzSwEWSwVQSwRQJwpQSwNQgARFg2rWTFCwIkM2GgFJFSISRDYaAkkVJRJEiAWZgAFiTwJQTL8iQzYaAUkVIhJENhoCSRUlEkSIBXxQJwdMUIAAvyJDNhoBSRUiEkQ2GgJJFSUSRIgFX1AnB0xQvEgiQzYaAUkVJBJEF4gFSrEjKmVEsgeyCCKyECOyAbMiQzYaAUkVJBJEF0mIBSsyCklOAkxwAExJTwJEQQAasSMqZUSyFEmyEksCshFLAbIAgQSyECOyAbMiQzYaAUkVIhJENhoCSRUkEkQXSwGIBJ+xIycGZUQnDrIaSwOyGrIYgQayECOyAbO0PklXBABMVwAEKBJESRUkEkQXsSMrZUROAggWgAR799UMshpPA7IashqyGIEGshAjsgGztD5JVwQATFcABCgSREkVJBJEF0wWgAFlTFC+RBcKFihMULAiQzYaAUkVJBJEFzYaAkkVJRJENhoDSRUiEkQ2GgRJFSISRDYaBUkVJRJENhoGSRUlEkSIAwQoTFCwIkM2GgFJFSISRDYaAkkVJRJEUCcHTFC9RQEnCyNPAlQoTFCwIkM2GgFJFSISRIgD0SEECBYoTFCwIkMxFiIJSTgQgQQSRDYaAUkVJBJEFzYaAkkVJRJENhoDSRUkEkQXNhoESRUkEkQXI4j7kCMpZUREMQBLBIj7v08FOBFJSwNLA4gDB0sGSwZPAk8GiAKiTwNPBFBPAhZQTwMWUE8CFlBMFlCABBVARLNMULAiQzYaAUkVJBJEFzYaAkkVJBJEF4gDfEkWJwhLAVBPAxa/THEBRIEJTAlJgQYIgQpMlIABZksDUEwWv4EKTJSAAWVPAlBMFr8iQzYaAUkVJBJEF4gDPRYnCExQvEgiQzEAIycJZUQSRCkjZyJDiAMjKSJnIkM2GgFJFSUSRIgDEycJTGciQzYaAUkVJRJEiAMCJwRMZyJDNhoBSRUiEkSIAqcWKExQsCJDNhoBSRUiEkQ2GgJJFSQSRBeIAtYnDE8CUEwWvyJDNhoBSRUkEkQXiALAK0xnIkM2GgFJFSISRIgCchYoTFCwIkM2GgFJFSUSRIgCnipMZyJDiggAi/8jiPpNIyllRESL+Yj6fkmL/g1EJa+L+hIURIv5OBGL/kAA7iOL+EsBCIv4Fk8CFlCL/hZQgAQ2uvrdTFCwiwCL/gmLATEATwKIAZUjJwVlRIv7SwETRIv7i/xQJwdMUL1FAURLAYv6TwKL+4v8i/2IAOKL+4gB3yEECIABc0sCUEm9RQEURIAAv0sBVwEBsSMnBmVEJw2yGkyyGkmyGIEGshAjsgGztD5JVwQATFcABCgSREkVJBJEF0sBcghEsbIHSbIIIrIQI7IBtoAE0C9X9bIaTwOyGkyyGIEGshAjsgGzSwEWSwEWUIAES1VBm0xQsAhPAg5EFov6UIv7UIv8UIv9UCcKUIAEIp+67ExQsImLARaAAWZMUL5EF4v+C7EjK2VEIycFZUSABB23DN2yGrIashiBBrIQI7IBs7Q+SVcEAExXAAQoEkRJFSQSRBcKQv7QigYBgRivi/oWUIEfr4v8UEyL+1BMUIv+UIv/UCcKUAKL/BcjTFaL/RciTFZJFSUSRImKBAGL/BYnCExQSb1FAUS+SBexi/4Wi/8WIycEZUSL/RInCyNPAlSABA0bTAayGov9shpPArIaTLIashqyGIEGshAjsgGztD5JVwQATFcABCgSREkVJBJEF4mKAwGL/RYnCExQSb1FAUS+SBexSXIIRLIUi/+yEov9shGBBLIQI7IBs7GL/xYjJwRlRIv+EicLI08CVIAE2XitFLIai/6yGkyyGrIashiBBrIQI7IBs7Q+SVcEAExXAAQoEkRJFSQSRBeJigEBJwyL/1C+RBeJigEBJwyL/1C+RBexIytlREwWgATCr8zRshqL/7IashqyGIEGshAjsgGztD5JVwQATFcABCgSREkVJBJEF4kxACMqZUQSRIk=",
505
+ clear: "C4EBQw==",
506
+ },
507
+ events: [
508
+ {
509
+ name: "BridgingFeeFromTokens",
510
+ args: [
511
+ { type: "uint64", name: "feeFromNative" },
512
+ { type: "uint64", name: "feeFromStable" },
513
+ { type: "uint64", name: "feeStableTokenAmount" },
514
+ ],
515
+ },
516
+ {
517
+ name: "ReceiveFee",
518
+ args: [
519
+ { type: "uint64", name: "bridgeTransactionCost" },
520
+ { type: "uint64", name: "messageTransactionCost" },
521
+ ],
522
+ },
523
+ {
524
+ name: "TokensSent",
525
+ args: [
526
+ { type: "uint64", name: "amount" },
527
+ { type: "byte[32]", name: "recipient" },
528
+ { type: "byte", name: "destinationChainId" },
529
+ { type: "byte[32]", name: "receiveToken" },
530
+ { type: "byte[32]", name: "nonce" },
531
+ { type: "byte", name: "messenger" },
532
+ ],
533
+ },
534
+ {
535
+ name: "TokensReceived",
536
+ args: [
537
+ { type: "uint64", name: "receiveAmount" },
538
+ { type: "address", name: "recipient" },
539
+ { type: "byte[32]", name: "nonce" },
540
+ { type: "byte", name: "messenger" },
541
+ { type: "byte[32]", name: "message" },
542
+ ],
543
+ },
544
+ {
545
+ name: "Swapped",
546
+ args: [
547
+ { type: "address", name: "sender" },
548
+ { type: "address", name: "recipient" },
549
+ { type: "uint64", name: "tokenId" },
550
+ { type: "uint64", name: "receiveTokenId" },
551
+ { type: "uint64", name: "amount" },
552
+ { type: "uint64", name: "receivedAmount" },
553
+ ],
554
+ },
555
+ ],
556
+ templateVariables: {},
557
+ };
558
+ class BinaryStateValue {
559
+ value;
560
+ constructor(value) {
561
+ this.value = value;
562
+ }
563
+ asByteArray() {
564
+ return this.value;
565
+ }
566
+ asString() {
567
+ return this.value !== undefined ? Buffer.from(this.value).toString("utf-8") : undefined;
568
+ }
569
+ }
570
+ /**
571
+ * Exposes methods for constructing `AppClient` params objects for ABI calls to the Bridge smart contract
572
+ */
573
+ class BridgeParamsFactory {
574
+ /**
575
+ * Gets available create ABI call param factories
576
+ */
577
+ static get create() {
578
+ return {
579
+ _resolveByMethod(params) {
580
+ switch (params.method) {
581
+ case "createApplication":
582
+ case "createApplication(address,byte,uint64,uint64)void":
583
+ return BridgeParamsFactory.create.createApplication(params);
584
+ }
585
+ throw new Error(`Unknown ' + verb + ' method`);
586
+ },
587
+ /**
588
+ * Constructs create ABI call params for the Bridge smart contract using the createApplication(address,byte,uint64,uint64)void ABI method
589
+ *
590
+ * @param params Parameters for the call
591
+ * @returns An `AppClientMethodCallParams` object for the call
592
+ */
593
+ createApplication(params) {
594
+ return {
595
+ ...params,
596
+ method: "createApplication(address,byte,uint64,uint64)void",
597
+ args: Array.isArray(params.args)
598
+ ? params.args
599
+ : [params.args.owner, params.args.chainId, params.args.messenger, params.args.gasOracle],
600
+ };
601
+ },
602
+ };
603
+ }
604
+ /**
605
+ * Constructs a no op call for the optInAsset(uint64)void ABI method
606
+ *
607
+ * @param params Parameters for the call
608
+ * @returns An `AppClientMethodCallParams` object for the call
609
+ */
610
+ static optInAsset(params) {
611
+ return {
612
+ ...params,
613
+ method: "optInAsset(uint64)void",
614
+ args: Array.isArray(params.args) ? params.args : [params.args.asset],
615
+ };
616
+ }
617
+ /**
618
+ * Constructs a no op call for the swapAndBridge(pay,axfer,byte[32],byte,byte[32],byte[32],uint64)void ABI method
619
+ *
620
+ * @param params Parameters for the call
621
+ * @returns An `AppClientMethodCallParams` object for the call
622
+ */
623
+ static swapAndBridge(params) {
624
+ return {
625
+ ...params,
626
+ method: "swapAndBridge(pay,axfer,byte[32],byte,byte[32],byte[32],uint64)void",
627
+ args: Array.isArray(params.args)
628
+ ? params.args
629
+ : [
630
+ params.args.paymentRef,
631
+ params.args.assetTransferRef,
632
+ params.args.recipient,
633
+ params.args.destinationChainId,
634
+ params.args.receiveToken,
635
+ params.args.nonce,
636
+ params.args.budget,
637
+ ],
638
+ };
639
+ }
640
+ /**
641
+ * Constructs a no op call for the swapAndBridgeWithStable(axfer,byte[32],byte,byte[32],byte[32],uint64,uint64)void ABI method
642
+ *
643
+ * @param params Parameters for the call
644
+ * @returns An `AppClientMethodCallParams` object for the call
645
+ */
646
+ static swapAndBridgeWithStable(params) {
647
+ return {
648
+ ...params,
649
+ method: "swapAndBridgeWithStable(axfer,byte[32],byte,byte[32],byte[32],uint64,uint64)void",
650
+ args: Array.isArray(params.args)
651
+ ? params.args
652
+ : [
653
+ params.args.assetTransferRef,
654
+ params.args.recipient,
655
+ params.args.destinationChainId,
656
+ params.args.receiveToken,
657
+ params.args.nonce,
658
+ params.args.feeTokenAmount,
659
+ params.args.budget,
660
+ ],
661
+ };
662
+ }
663
+ /**
664
+ * Constructs a no op call for the receiveTokens(pay,uint64,byte[32],byte,byte[32],byte[32],uint64)void ABI method
665
+ *
666
+ * @param params Parameters for the call
667
+ * @returns An `AppClientMethodCallParams` object for the call
668
+ */
669
+ static receiveTokens(params) {
670
+ return {
671
+ ...params,
672
+ method: "receiveTokens(pay,uint64,byte[32],byte,byte[32],byte[32],uint64)void",
673
+ args: Array.isArray(params.args)
674
+ ? params.args
675
+ : [
676
+ params.args.paymentRef,
677
+ params.args.amount,
678
+ params.args.recipient,
679
+ params.args.sourceChainId,
680
+ params.args.receiveToken,
681
+ params.args.nonce,
682
+ params.args.receiveAmountMin,
683
+ ],
684
+ };
685
+ }
686
+ /**
687
+ * Constructs a no op call for the registerBridge(byte,byte[32])void ABI method
688
+ *
689
+ * @param params Parameters for the call
690
+ * @returns An `AppClientMethodCallParams` object for the call
691
+ */
692
+ static registerBridge(params) {
693
+ return {
694
+ ...params,
695
+ method: "registerBridge(byte,byte[32])void",
696
+ args: Array.isArray(params.args) ? params.args : [params.args.chainId, params.args.bridgeAddress],
697
+ };
698
+ }
699
+ /**
700
+ * Constructs a no op call for the addBridgeToken(byte,byte[32])void ABI method
701
+ *
702
+ * @param params Parameters for the call
703
+ * @returns An `AppClientMethodCallParams` object for the call
704
+ */
705
+ static addBridgeToken(params) {
706
+ return {
707
+ ...params,
708
+ method: "addBridgeToken(byte,byte[32])void",
709
+ args: Array.isArray(params.args) ? params.args : [params.args.chainId, params.args.tokenAddress],
710
+ };
711
+ }
712
+ /**
713
+ * Constructs a no op call for the removeBridgeToken(byte,byte[32])void ABI method
714
+ *
715
+ * @param params Parameters for the call
716
+ * @returns An `AppClientMethodCallParams` object for the call
717
+ */
718
+ static removeBridgeToken(params) {
719
+ return {
720
+ ...params,
721
+ method: "removeBridgeToken(byte,byte[32])void",
722
+ args: Array.isArray(params.args) ? params.args : [params.args.chainId, params.args.tokenAddress],
723
+ };
724
+ }
725
+ /**
726
+ * Constructs a no op call for the withdrawGasTokens(uint64)void ABI method
727
+ *
728
+ * @param params Parameters for the call
729
+ * @returns An `AppClientMethodCallParams` object for the call
730
+ */
731
+ static withdrawGasTokens(params) {
732
+ return {
733
+ ...params,
734
+ method: "withdrawGasTokens(uint64)void",
735
+ args: Array.isArray(params.args) ? params.args : [params.args.amount],
736
+ };
737
+ }
738
+ /**
739
+ * Constructs a no op call for the withdrawBridgingFeeInTokens(uint64)void ABI method
740
+ *
741
+ * @param params Parameters for the call
742
+ * @returns An `AppClientMethodCallParams` object for the call
743
+ */
744
+ static withdrawBridgingFeeInTokens(params) {
745
+ return {
746
+ ...params,
747
+ method: "withdrawBridgingFeeInTokens(uint64)void",
748
+ args: Array.isArray(params.args) ? params.args : [params.args.asset],
749
+ };
750
+ }
751
+ /**
752
+ * Constructs a no op call for the getBridgingCostInTokens(byte,uint64)uint64 ABI method
753
+ *
754
+ * @param params Parameters for the call
755
+ * @returns An `AppClientMethodCallParams` object for the call
756
+ */
757
+ static getBridgingCostInTokens(params) {
758
+ return {
759
+ ...params,
760
+ method: "getBridgingCostInTokens(byte,uint64)uint64",
761
+ args: Array.isArray(params.args) ? params.args : [params.args.destinationChainId, params.args.asset],
762
+ };
763
+ }
764
+ /**
765
+ * Constructs a no op call for the hashMessage(uint64,byte[32],byte,byte,byte[32],byte[32])byte[32] ABI method
766
+ *
767
+ * @param params Parameters for the call
768
+ * @returns An `AppClientMethodCallParams` object for the call
769
+ */
770
+ static hashMessage(params) {
771
+ return {
772
+ ...params,
773
+ method: "hashMessage(uint64,byte[32],byte,byte,byte[32],byte[32])byte[32]",
774
+ args: Array.isArray(params.args)
775
+ ? params.args
776
+ : [
777
+ params.args.amount,
778
+ params.args.recipient,
779
+ params.args.sourceChainId,
780
+ params.args.destinationChainId,
781
+ params.args.receiveToken,
782
+ params.args.nonce,
783
+ ],
784
+ };
785
+ }
786
+ /**
787
+ * Constructs a no op call for the isOtherBridgeTokenSupported(byte,byte[32])bool ABI method
788
+ *
789
+ * @param params Parameters for the call
790
+ * @returns An `AppClientMethodCallParams` object for the call
791
+ */
792
+ static isOtherBridgeTokenSupported(params) {
793
+ return {
794
+ ...params,
795
+ method: "isOtherBridgeTokenSupported(byte,byte[32])bool",
796
+ args: Array.isArray(params.args) ? params.args : [params.args.chainId, params.args.token],
797
+ };
798
+ }
799
+ /**
800
+ * Constructs a no op call for the getTransactionCost(byte)uint64 ABI method
801
+ *
802
+ * @param params Parameters for the call
803
+ * @returns An `AppClientMethodCallParams` object for the call
804
+ */
805
+ static getTransactionCost(params) {
806
+ return {
807
+ ...params,
808
+ method: "getTransactionCost(byte)uint64",
809
+ args: Array.isArray(params.args) ? params.args : [params.args.chainId],
810
+ };
811
+ }
812
+ /**
813
+ * Constructs a no op call for the getReceiveTokensCost()uint64 ABI method
814
+ *
815
+ * @param params Parameters for the call
816
+ * @returns An `AppClientMethodCallParams` object for the call
817
+ */
818
+ static getReceiveTokensCost(params) {
819
+ return {
820
+ ...params,
821
+ method: "getReceiveTokensCost()uint64",
822
+ args: Array.isArray(params.args) ? params.args : [],
823
+ };
824
+ }
825
+ /**
826
+ * Constructs a no op call for the getSendTransactionStorageCost()uint64 ABI method
827
+ *
828
+ * @param params Parameters for the call
829
+ * @returns An `AppClientMethodCallParams` object for the call
830
+ */
831
+ static getSendTransactionStorageCost(params) {
832
+ return {
833
+ ...params,
834
+ method: "getSendTransactionStorageCost()uint64",
835
+ args: Array.isArray(params.args) ? params.args : [],
836
+ };
837
+ }
838
+ /**
839
+ * Constructs a no op call for the swap(axfer,uint64,address,uint64,uint64)void ABI method
840
+ *
841
+ * @param params Parameters for the call
842
+ * @returns An `AppClientMethodCallParams` object for the call
843
+ */
844
+ static swap(params) {
845
+ return {
846
+ ...params,
847
+ method: "swap(axfer,uint64,address,uint64,uint64)void",
848
+ args: Array.isArray(params.args)
849
+ ? params.args
850
+ : [
851
+ params.args.assetTransferRef,
852
+ params.args.receiveAsset,
853
+ params.args.recipient,
854
+ params.args.receiveAmountMin,
855
+ params.args.budget,
856
+ ],
857
+ };
858
+ }
859
+ /**
860
+ * Constructs a no op call for the addPool(uint64,uint64)void ABI method
861
+ *
862
+ * @param params Parameters for the call
863
+ * @returns An `AppClientMethodCallParams` object for the call
864
+ */
865
+ static addPool(params) {
866
+ return {
867
+ ...params,
868
+ method: "addPool(uint64,uint64)void",
869
+ args: Array.isArray(params.args) ? params.args : [params.args.poolId, params.args.asset],
870
+ };
871
+ }
872
+ /**
873
+ * Constructs a no op call for the removePool(uint64)void ABI method
874
+ *
875
+ * @param params Parameters for the call
876
+ * @returns An `AppClientMethodCallParams` object for the call
877
+ */
878
+ static removePool(params) {
879
+ return {
880
+ ...params,
881
+ method: "removePool(uint64)void",
882
+ args: Array.isArray(params.args) ? params.args : [params.args.tokenId],
883
+ };
884
+ }
885
+ /**
886
+ * Constructs a no op call for the stopSwap()void ABI method
887
+ *
888
+ * @param params Parameters for the call
889
+ * @returns An `AppClientMethodCallParams` object for the call
890
+ */
891
+ static stopSwap(params) {
892
+ return {
893
+ ...params,
894
+ method: "stopSwap()void",
895
+ args: Array.isArray(params.args) ? params.args : [],
896
+ };
897
+ }
898
+ /**
899
+ * Constructs a no op call for the startSwap()void ABI method
900
+ *
901
+ * @param params Parameters for the call
902
+ * @returns An `AppClientMethodCallParams` object for the call
903
+ */
904
+ static startSwap(params) {
905
+ return {
906
+ ...params,
907
+ method: "startSwap()void",
908
+ args: Array.isArray(params.args) ? params.args : [],
909
+ };
910
+ }
911
+ /**
912
+ * Constructs a no op call for the setStopAuthority(address)void ABI method
913
+ *
914
+ * @param params Parameters for the call
915
+ * @returns An `AppClientMethodCallParams` object for the call
916
+ */
917
+ static setStopAuthority(params) {
918
+ return {
919
+ ...params,
920
+ method: "setStopAuthority(address)void",
921
+ args: Array.isArray(params.args) ? params.args : [params.args.stopAuthority],
922
+ };
923
+ }
924
+ /**
925
+ * Constructs a no op call for the setRebalancer(address)void ABI method
926
+ *
927
+ * @param params Parameters for the call
928
+ * @returns An `AppClientMethodCallParams` object for the call
929
+ */
930
+ static setRebalancer(params) {
931
+ return {
932
+ ...params,
933
+ method: "setRebalancer(address)void",
934
+ args: Array.isArray(params.args) ? params.args : [params.args.rebalancer],
935
+ };
936
+ }
937
+ /**
938
+ * Constructs a no op call for the getGasUsage(byte)uint64 ABI method
939
+ *
940
+ * @param params Parameters for the call
941
+ * @returns An `AppClientMethodCallParams` object for the call
942
+ */
943
+ static getGasUsage(params) {
944
+ return {
945
+ ...params,
946
+ method: "getGasUsage(byte)uint64",
947
+ args: Array.isArray(params.args) ? params.args : [params.args.chainId],
948
+ };
949
+ }
950
+ /**
951
+ * Constructs a no op call for the setGasUsage(byte,uint64)void ABI method
952
+ *
953
+ * @param params Parameters for the call
954
+ * @returns An `AppClientMethodCallParams` object for the call
955
+ */
956
+ static setGasUsage(params) {
957
+ return {
958
+ ...params,
959
+ method: "setGasUsage(byte,uint64)void",
960
+ args: Array.isArray(params.args) ? params.args : [params.args.chainId, params.args.gasAmount],
961
+ };
962
+ }
963
+ /**
964
+ * Constructs a no op call for the setGasOracle(uint64)void ABI method
965
+ *
966
+ * @param params Parameters for the call
967
+ * @returns An `AppClientMethodCallParams` object for the call
968
+ */
969
+ static setGasOracle(params) {
970
+ return {
971
+ ...params,
972
+ method: "setGasOracle(uint64)void",
973
+ args: Array.isArray(params.args) ? params.args : [params.args.gasOracle],
974
+ };
975
+ }
976
+ /**
977
+ * Constructs a no op call for the getTransactionRelayerCost(byte)uint64 ABI method
978
+ *
979
+ * @param params Parameters for the call
980
+ * @returns An `AppClientMethodCallParams` object for the call
981
+ */
982
+ static getTransactionRelayerCost(params) {
983
+ return {
984
+ ...params,
985
+ method: "getTransactionRelayerCost(byte)uint64",
986
+ args: Array.isArray(params.args) ? params.args : [params.args.chainId],
987
+ };
988
+ }
989
+ /**
990
+ * Constructs a no op call for the transferOwnership(address)void ABI method
991
+ *
992
+ * @param params Parameters for the call
993
+ * @returns An `AppClientMethodCallParams` object for the call
994
+ */
995
+ static transferOwnership(params) {
996
+ return {
997
+ ...params,
998
+ method: "transferOwnership(address)void",
999
+ args: Array.isArray(params.args) ? params.args : [params.args.newOwner],
1000
+ };
1001
+ }
1002
+ }
1003
+ exports.BridgeParamsFactory = BridgeParamsFactory;
1004
+ /**
1005
+ * A factory to create and deploy one or more instance of the Bridge smart contract and to create one or more app clients to interact with those (or other) app instances
1006
+ */
1007
+ class BridgeFactory {
1008
+ /**
1009
+ * The underlying `AppFactory` for when you want to have more flexibility
1010
+ */
1011
+ appFactory;
1012
+ /**
1013
+ * Creates a new instance of `BridgeFactory`
1014
+ *
1015
+ * @param params The parameters to initialise the app factory with
1016
+ */
1017
+ constructor(params) {
1018
+ this.appFactory = new app_factory_1.AppFactory({
1019
+ ...params,
1020
+ appSpec: exports.APP_SPEC,
1021
+ });
1022
+ }
1023
+ /** The name of the app (from the ARC-32 / ARC-56 app spec or override). */
1024
+ get appName() {
1025
+ return this.appFactory.appName;
1026
+ }
1027
+ /** The ARC-56 app spec being used */
1028
+ get appSpec() {
1029
+ return exports.APP_SPEC;
1030
+ }
1031
+ /** A reference to the underlying `AlgorandClient` this app factory is using. */
1032
+ get algorand() {
1033
+ return this.appFactory.algorand;
1034
+ }
1035
+ /**
1036
+ * Returns a new `AppClient` client for an app instance of the given ID.
1037
+ *
1038
+ * Automatically populates appName, defaultSender and source maps from the factory
1039
+ * if not specified in the params.
1040
+ * @param params The parameters to create the app client
1041
+ * @returns The `AppClient`
1042
+ */
1043
+ getAppClientById(params) {
1044
+ return new BridgeClient(this.appFactory.getAppClientById(params));
1045
+ }
1046
+ /**
1047
+ * Returns a new `AppClient` client, resolving the app by creator address and name
1048
+ * using AlgoKit app deployment semantics (i.e. looking for the app creation transaction note).
1049
+ *
1050
+ * Automatically populates appName, defaultSender and source maps from the factory
1051
+ * if not specified in the params.
1052
+ * @param params The parameters to create the app client
1053
+ * @returns The `AppClient`
1054
+ */
1055
+ async getAppClientByCreatorAndName(params) {
1056
+ return new BridgeClient(await this.appFactory.getAppClientByCreatorAndName(params));
1057
+ }
1058
+ /**
1059
+ * Idempotently deploys the Bridge smart contract.
1060
+ *
1061
+ * @param params The arguments for the contract calls and any additional parameters for the call
1062
+ * @returns The deployment result
1063
+ */
1064
+ async deploy(params = {}) {
1065
+ const result = await this.appFactory.deploy({
1066
+ ...params,
1067
+ createParams: params.createParams?.method
1068
+ ? BridgeParamsFactory.create._resolveByMethod(params.createParams)
1069
+ : params.createParams
1070
+ ? params.createParams
1071
+ : undefined,
1072
+ });
1073
+ return { result: result.result, appClient: new BridgeClient(result.appClient) };
1074
+ }
1075
+ /**
1076
+ * Get parameters to create transactions (create and deploy related calls) for the current app. A good mental model for this is that these parameters represent a deferred transaction creation.
1077
+ */
1078
+ params = {
1079
+ /**
1080
+ * Gets available create methods
1081
+ */
1082
+ create: {
1083
+ /**
1084
+ * Creates a new instance of the Bridge smart contract using the createApplication(address,byte,uint64,uint64)void ABI method.
1085
+ *
1086
+ * @param params The params for the smart contract call
1087
+ * @returns The create params
1088
+ */
1089
+ createApplication: (params) => {
1090
+ return this.appFactory.params.create(BridgeParamsFactory.create.createApplication(params));
1091
+ },
1092
+ },
1093
+ };
1094
+ /**
1095
+ * Create transactions for the current app
1096
+ */
1097
+ createTransaction = {
1098
+ /**
1099
+ * Gets available create methods
1100
+ */
1101
+ create: {
1102
+ /**
1103
+ * Creates a new instance of the Bridge smart contract using the createApplication(address,byte,uint64,uint64)void ABI method.
1104
+ *
1105
+ * @param params The params for the smart contract call
1106
+ * @returns The create transaction
1107
+ */
1108
+ createApplication: (params) => {
1109
+ return this.appFactory.createTransaction.create(BridgeParamsFactory.create.createApplication(params));
1110
+ },
1111
+ },
1112
+ };
1113
+ /**
1114
+ * Send calls to the current app
1115
+ */
1116
+ send = {
1117
+ /**
1118
+ * Gets available create methods
1119
+ */
1120
+ create: {
1121
+ /**
1122
+ * Creates a new instance of the Bridge smart contract using an ABI method call using the createApplication(address,byte,uint64,uint64)void ABI method.
1123
+ *
1124
+ * @param params The params for the smart contract call
1125
+ * @returns The create result
1126
+ */
1127
+ createApplication: async (params) => {
1128
+ const result = await this.appFactory.send.create(BridgeParamsFactory.create.createApplication(params));
1129
+ return {
1130
+ result: {
1131
+ ...result.result,
1132
+ return: result.result.return,
1133
+ },
1134
+ appClient: new BridgeClient(result.appClient),
1135
+ };
1136
+ },
1137
+ },
1138
+ };
1139
+ }
1140
+ exports.BridgeFactory = BridgeFactory;
1141
+ /**
1142
+ * A client to make calls to the Bridge smart contract
1143
+ */
1144
+ class BridgeClient {
1145
+ /**
1146
+ * The underlying `AppClient` for when you want to have more flexibility
1147
+ */
1148
+ appClient;
1149
+ constructor(appClientOrParams) {
1150
+ this.appClient =
1151
+ appClientOrParams instanceof app_client_1.AppClient
1152
+ ? appClientOrParams
1153
+ : new app_client_1.AppClient({
1154
+ ...appClientOrParams,
1155
+ appSpec: exports.APP_SPEC,
1156
+ });
1157
+ }
1158
+ /**
1159
+ * Checks for decode errors on the given return value and maps the return value to the return type for the given method
1160
+ * @returns The typed return value or undefined if there was no value
1161
+ */
1162
+ decodeReturnValue(method, returnValue) {
1163
+ return returnValue !== undefined
1164
+ ? (0, app_arc56_1.getArc56ReturnValue)(returnValue, this.appClient.getABIMethod(method), exports.APP_SPEC.structs)
1165
+ : undefined;
1166
+ }
1167
+ /**
1168
+ * Returns a new `BridgeClient` client, resolving the app by creator address and name
1169
+ * using AlgoKit app deployment semantics (i.e. looking for the app creation transaction note).
1170
+ * @param params The parameters to create the app client
1171
+ */
1172
+ static async fromCreatorAndName(params) {
1173
+ return new BridgeClient(await app_client_1.AppClient.fromCreatorAndName({ ...params, appSpec: exports.APP_SPEC }));
1174
+ }
1175
+ /**
1176
+ * Returns an `BridgeClient` instance for the current network based on
1177
+ * pre-determined network-specific app IDs specified in the ARC-56 app spec.
1178
+ *
1179
+ * If no IDs are in the app spec or the network isn't recognised, an error is thrown.
1180
+ * @param params The parameters to create the app client
1181
+ */
1182
+ static async fromNetwork(params) {
1183
+ return new BridgeClient(await app_client_1.AppClient.fromNetwork({ ...params, appSpec: exports.APP_SPEC }));
1184
+ }
1185
+ /** The ID of the app instance this client is linked to. */
1186
+ get appId() {
1187
+ return this.appClient.appId;
1188
+ }
1189
+ /** The app address of the app instance this client is linked to. */
1190
+ get appAddress() {
1191
+ return this.appClient.appAddress;
1192
+ }
1193
+ /** The name of the app. */
1194
+ get appName() {
1195
+ return this.appClient.appName;
1196
+ }
1197
+ /** The ARC-56 app spec being used */
1198
+ get appSpec() {
1199
+ return this.appClient.appSpec;
1200
+ }
1201
+ /** A reference to the underlying `AlgorandClient` this app client is using. */
1202
+ get algorand() {
1203
+ return this.appClient.algorand;
1204
+ }
1205
+ /**
1206
+ * Get parameters to create transactions for the current app. A good mental model for this is that these parameters represent a deferred transaction creation.
1207
+ */
1208
+ params = {
1209
+ /**
1210
+ * Makes a clear_state call to an existing instance of the Bridge smart contract.
1211
+ *
1212
+ * @param params The params for the bare (raw) call
1213
+ * @returns The clearState result
1214
+ */
1215
+ clearState: (params) => {
1216
+ return this.appClient.params.bare.clearState(params);
1217
+ },
1218
+ /**
1219
+ * Makes a call to the Bridge smart contract using the `optInAsset(uint64)void` ABI method.
1220
+ *
1221
+ * @param params The params for the smart contract call
1222
+ * @returns The call params
1223
+ */
1224
+ optInAsset: (params) => {
1225
+ return this.appClient.params.call(BridgeParamsFactory.optInAsset(params));
1226
+ },
1227
+ /**
1228
+ * Makes a call to the Bridge smart contract using the `swapAndBridge(pay,axfer,byte[32],byte,byte[32],byte[32],uint64)void` ABI method.
1229
+ *
1230
+ * @param params The params for the smart contract call
1231
+ * @returns The call params
1232
+ */
1233
+ swapAndBridge: (params) => {
1234
+ return this.appClient.params.call(BridgeParamsFactory.swapAndBridge(params));
1235
+ },
1236
+ /**
1237
+ * Makes a call to the Bridge smart contract using the `swapAndBridgeWithStable(axfer,byte[32],byte,byte[32],byte[32],uint64,uint64)void` ABI method.
1238
+ *
1239
+ * @param params The params for the smart contract call
1240
+ * @returns The call params
1241
+ */
1242
+ swapAndBridgeWithStable: (params) => {
1243
+ return this.appClient.params.call(BridgeParamsFactory.swapAndBridgeWithStable(params));
1244
+ },
1245
+ /**
1246
+ * Makes a call to the Bridge smart contract using the `receiveTokens(pay,uint64,byte[32],byte,byte[32],byte[32],uint64)void` ABI method.
1247
+ *
1248
+ * @param params The params for the smart contract call
1249
+ * @returns The call params
1250
+ */
1251
+ receiveTokens: (params) => {
1252
+ return this.appClient.params.call(BridgeParamsFactory.receiveTokens(params));
1253
+ },
1254
+ /**
1255
+ * Makes a call to the Bridge smart contract using the `registerBridge(byte,byte[32])void` ABI method.
1256
+ *
1257
+ * @param params The params for the smart contract call
1258
+ * @returns The call params
1259
+ */
1260
+ registerBridge: (params) => {
1261
+ return this.appClient.params.call(BridgeParamsFactory.registerBridge(params));
1262
+ },
1263
+ /**
1264
+ * Makes a call to the Bridge smart contract using the `addBridgeToken(byte,byte[32])void` ABI method.
1265
+ *
1266
+ * @param params The params for the smart contract call
1267
+ * @returns The call params
1268
+ */
1269
+ addBridgeToken: (params) => {
1270
+ return this.appClient.params.call(BridgeParamsFactory.addBridgeToken(params));
1271
+ },
1272
+ /**
1273
+ * Makes a call to the Bridge smart contract using the `removeBridgeToken(byte,byte[32])void` ABI method.
1274
+ *
1275
+ * @param params The params for the smart contract call
1276
+ * @returns The call params
1277
+ */
1278
+ removeBridgeToken: (params) => {
1279
+ return this.appClient.params.call(BridgeParamsFactory.removeBridgeToken(params));
1280
+ },
1281
+ /**
1282
+ * Makes a call to the Bridge smart contract using the `withdrawGasTokens(uint64)void` ABI method.
1283
+ *
1284
+ * @param params The params for the smart contract call
1285
+ * @returns The call params
1286
+ */
1287
+ withdrawGasTokens: (params) => {
1288
+ return this.appClient.params.call(BridgeParamsFactory.withdrawGasTokens(params));
1289
+ },
1290
+ /**
1291
+ * Makes a call to the Bridge smart contract using the `withdrawBridgingFeeInTokens(uint64)void` ABI method.
1292
+ *
1293
+ * @param params The params for the smart contract call
1294
+ * @returns The call params
1295
+ */
1296
+ withdrawBridgingFeeInTokens: (params) => {
1297
+ return this.appClient.params.call(BridgeParamsFactory.withdrawBridgingFeeInTokens(params));
1298
+ },
1299
+ /**
1300
+ * Makes a call to the Bridge smart contract using the `getBridgingCostInTokens(byte,uint64)uint64` ABI method.
1301
+ *
1302
+ * This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction.
1303
+ *
1304
+ * @param params The params for the smart contract call
1305
+ * @returns The call params
1306
+ */
1307
+ getBridgingCostInTokens: (params) => {
1308
+ return this.appClient.params.call(BridgeParamsFactory.getBridgingCostInTokens(params));
1309
+ },
1310
+ /**
1311
+ * Makes a call to the Bridge smart contract using the `hashMessage(uint64,byte[32],byte,byte,byte[32],byte[32])byte[32]` ABI method.
1312
+ *
1313
+ * This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction.
1314
+ *
1315
+ * @param params The params for the smart contract call
1316
+ * @returns The call params
1317
+ */
1318
+ hashMessage: (params) => {
1319
+ return this.appClient.params.call(BridgeParamsFactory.hashMessage(params));
1320
+ },
1321
+ /**
1322
+ * Makes a call to the Bridge smart contract using the `isOtherBridgeTokenSupported(byte,byte[32])bool` ABI method.
1323
+ *
1324
+ * This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction.
1325
+ *
1326
+ * @param params The params for the smart contract call
1327
+ * @returns The call params
1328
+ */
1329
+ isOtherBridgeTokenSupported: (params) => {
1330
+ return this.appClient.params.call(BridgeParamsFactory.isOtherBridgeTokenSupported(params));
1331
+ },
1332
+ /**
1333
+ * Makes a call to the Bridge smart contract using the `getTransactionCost(byte)uint64` ABI method.
1334
+ *
1335
+ * This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction.
1336
+ *
1337
+ * @param params The params for the smart contract call
1338
+ * @returns The call params
1339
+ */
1340
+ getTransactionCost: (params) => {
1341
+ return this.appClient.params.call(BridgeParamsFactory.getTransactionCost(params));
1342
+ },
1343
+ /**
1344
+ * Makes a call to the Bridge smart contract using the `getReceiveTokensCost()uint64` ABI method.
1345
+ *
1346
+ * This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction.
1347
+ *
1348
+ * @param params The params for the smart contract call
1349
+ * @returns The call params
1350
+ */
1351
+ getReceiveTokensCost: (params = { args: [] }) => {
1352
+ return this.appClient.params.call(BridgeParamsFactory.getReceiveTokensCost(params));
1353
+ },
1354
+ /**
1355
+ * Makes a call to the Bridge smart contract using the `getSendTransactionStorageCost()uint64` ABI method.
1356
+ *
1357
+ * This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction.
1358
+ *
1359
+ * @param params The params for the smart contract call
1360
+ * @returns The call params
1361
+ */
1362
+ getSendTransactionStorageCost: (params = { args: [] }) => {
1363
+ return this.appClient.params.call(BridgeParamsFactory.getSendTransactionStorageCost(params));
1364
+ },
1365
+ /**
1366
+ * Makes a call to the Bridge smart contract using the `swap(axfer,uint64,address,uint64,uint64)void` ABI method.
1367
+ *
1368
+ * @param params The params for the smart contract call
1369
+ * @returns The call params
1370
+ */
1371
+ swap: (params) => {
1372
+ return this.appClient.params.call(BridgeParamsFactory.swap(params));
1373
+ },
1374
+ /**
1375
+ * Makes a call to the Bridge smart contract using the `addPool(uint64,uint64)void` ABI method.
1376
+ *
1377
+ * @param params The params for the smart contract call
1378
+ * @returns The call params
1379
+ */
1380
+ addPool: (params) => {
1381
+ return this.appClient.params.call(BridgeParamsFactory.addPool(params));
1382
+ },
1383
+ /**
1384
+ * Makes a call to the Bridge smart contract using the `removePool(uint64)void` ABI method.
1385
+ *
1386
+ * @param params The params for the smart contract call
1387
+ * @returns The call params
1388
+ */
1389
+ removePool: (params) => {
1390
+ return this.appClient.params.call(BridgeParamsFactory.removePool(params));
1391
+ },
1392
+ /**
1393
+ * Makes a call to the Bridge smart contract using the `stopSwap()void` ABI method.
1394
+ *
1395
+ * @param params The params for the smart contract call
1396
+ * @returns The call params
1397
+ */
1398
+ stopSwap: (params = { args: [] }) => {
1399
+ return this.appClient.params.call(BridgeParamsFactory.stopSwap(params));
1400
+ },
1401
+ /**
1402
+ * Makes a call to the Bridge smart contract using the `startSwap()void` ABI method.
1403
+ *
1404
+ * @param params The params for the smart contract call
1405
+ * @returns The call params
1406
+ */
1407
+ startSwap: (params = { args: [] }) => {
1408
+ return this.appClient.params.call(BridgeParamsFactory.startSwap(params));
1409
+ },
1410
+ /**
1411
+ * Makes a call to the Bridge smart contract using the `setStopAuthority(address)void` ABI method.
1412
+ *
1413
+ * @param params The params for the smart contract call
1414
+ * @returns The call params
1415
+ */
1416
+ setStopAuthority: (params) => {
1417
+ return this.appClient.params.call(BridgeParamsFactory.setStopAuthority(params));
1418
+ },
1419
+ /**
1420
+ * Makes a call to the Bridge smart contract using the `setRebalancer(address)void` ABI method.
1421
+ *
1422
+ * @param params The params for the smart contract call
1423
+ * @returns The call params
1424
+ */
1425
+ setRebalancer: (params) => {
1426
+ return this.appClient.params.call(BridgeParamsFactory.setRebalancer(params));
1427
+ },
1428
+ /**
1429
+ * Makes a call to the Bridge smart contract using the `getGasUsage(byte)uint64` ABI method.
1430
+ *
1431
+ * This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction.
1432
+ *
1433
+ * @param params The params for the smart contract call
1434
+ * @returns The call params
1435
+ */
1436
+ getGasUsage: (params) => {
1437
+ return this.appClient.params.call(BridgeParamsFactory.getGasUsage(params));
1438
+ },
1439
+ /**
1440
+ * Makes a call to the Bridge smart contract using the `setGasUsage(byte,uint64)void` ABI method.
1441
+ *
1442
+ * @param params The params for the smart contract call
1443
+ * @returns The call params
1444
+ */
1445
+ setGasUsage: (params) => {
1446
+ return this.appClient.params.call(BridgeParamsFactory.setGasUsage(params));
1447
+ },
1448
+ /**
1449
+ * Makes a call to the Bridge smart contract using the `setGasOracle(uint64)void` ABI method.
1450
+ *
1451
+ * @param params The params for the smart contract call
1452
+ * @returns The call params
1453
+ */
1454
+ setGasOracle: (params) => {
1455
+ return this.appClient.params.call(BridgeParamsFactory.setGasOracle(params));
1456
+ },
1457
+ /**
1458
+ * Makes a call to the Bridge smart contract using the `getTransactionRelayerCost(byte)uint64` ABI method.
1459
+ *
1460
+ * This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction.
1461
+ *
1462
+ * @param params The params for the smart contract call
1463
+ * @returns The call params
1464
+ */
1465
+ getTransactionRelayerCost: (params) => {
1466
+ return this.appClient.params.call(BridgeParamsFactory.getTransactionRelayerCost(params));
1467
+ },
1468
+ /**
1469
+ * Makes a call to the Bridge smart contract using the `transferOwnership(address)void` ABI method.
1470
+ *
1471
+ * @param params The params for the smart contract call
1472
+ * @returns The call params
1473
+ */
1474
+ transferOwnership: (params) => {
1475
+ return this.appClient.params.call(BridgeParamsFactory.transferOwnership(params));
1476
+ },
1477
+ };
1478
+ /**
1479
+ * Create transactions for the current app
1480
+ */
1481
+ createTransaction = {
1482
+ /**
1483
+ * Makes a clear_state call to an existing instance of the Bridge smart contract.
1484
+ *
1485
+ * @param params The params for the bare (raw) call
1486
+ * @returns The clearState result
1487
+ */
1488
+ clearState: (params) => {
1489
+ return this.appClient.createTransaction.bare.clearState(params);
1490
+ },
1491
+ /**
1492
+ * Makes a call to the Bridge smart contract using the `optInAsset(uint64)void` ABI method.
1493
+ *
1494
+ * @param params The params for the smart contract call
1495
+ * @returns The call transaction
1496
+ */
1497
+ optInAsset: (params) => {
1498
+ return this.appClient.createTransaction.call(BridgeParamsFactory.optInAsset(params));
1499
+ },
1500
+ /**
1501
+ * Makes a call to the Bridge smart contract using the `swapAndBridge(pay,axfer,byte[32],byte,byte[32],byte[32],uint64)void` ABI method.
1502
+ *
1503
+ * @param params The params for the smart contract call
1504
+ * @returns The call transaction
1505
+ */
1506
+ swapAndBridge: (params) => {
1507
+ return this.appClient.createTransaction.call(BridgeParamsFactory.swapAndBridge(params));
1508
+ },
1509
+ /**
1510
+ * Makes a call to the Bridge smart contract using the `swapAndBridgeWithStable(axfer,byte[32],byte,byte[32],byte[32],uint64,uint64)void` ABI method.
1511
+ *
1512
+ * @param params The params for the smart contract call
1513
+ * @returns The call transaction
1514
+ */
1515
+ swapAndBridgeWithStable: (params) => {
1516
+ return this.appClient.createTransaction.call(BridgeParamsFactory.swapAndBridgeWithStable(params));
1517
+ },
1518
+ /**
1519
+ * Makes a call to the Bridge smart contract using the `receiveTokens(pay,uint64,byte[32],byte,byte[32],byte[32],uint64)void` ABI method.
1520
+ *
1521
+ * @param params The params for the smart contract call
1522
+ * @returns The call transaction
1523
+ */
1524
+ receiveTokens: (params) => {
1525
+ return this.appClient.createTransaction.call(BridgeParamsFactory.receiveTokens(params));
1526
+ },
1527
+ /**
1528
+ * Makes a call to the Bridge smart contract using the `registerBridge(byte,byte[32])void` ABI method.
1529
+ *
1530
+ * @param params The params for the smart contract call
1531
+ * @returns The call transaction
1532
+ */
1533
+ registerBridge: (params) => {
1534
+ return this.appClient.createTransaction.call(BridgeParamsFactory.registerBridge(params));
1535
+ },
1536
+ /**
1537
+ * Makes a call to the Bridge smart contract using the `addBridgeToken(byte,byte[32])void` ABI method.
1538
+ *
1539
+ * @param params The params for the smart contract call
1540
+ * @returns The call transaction
1541
+ */
1542
+ addBridgeToken: (params) => {
1543
+ return this.appClient.createTransaction.call(BridgeParamsFactory.addBridgeToken(params));
1544
+ },
1545
+ /**
1546
+ * Makes a call to the Bridge smart contract using the `removeBridgeToken(byte,byte[32])void` ABI method.
1547
+ *
1548
+ * @param params The params for the smart contract call
1549
+ * @returns The call transaction
1550
+ */
1551
+ removeBridgeToken: (params) => {
1552
+ return this.appClient.createTransaction.call(BridgeParamsFactory.removeBridgeToken(params));
1553
+ },
1554
+ /**
1555
+ * Makes a call to the Bridge smart contract using the `withdrawGasTokens(uint64)void` ABI method.
1556
+ *
1557
+ * @param params The params for the smart contract call
1558
+ * @returns The call transaction
1559
+ */
1560
+ withdrawGasTokens: (params) => {
1561
+ return this.appClient.createTransaction.call(BridgeParamsFactory.withdrawGasTokens(params));
1562
+ },
1563
+ /**
1564
+ * Makes a call to the Bridge smart contract using the `withdrawBridgingFeeInTokens(uint64)void` ABI method.
1565
+ *
1566
+ * @param params The params for the smart contract call
1567
+ * @returns The call transaction
1568
+ */
1569
+ withdrawBridgingFeeInTokens: (params) => {
1570
+ return this.appClient.createTransaction.call(BridgeParamsFactory.withdrawBridgingFeeInTokens(params));
1571
+ },
1572
+ /**
1573
+ * Makes a call to the Bridge smart contract using the `getBridgingCostInTokens(byte,uint64)uint64` ABI method.
1574
+ *
1575
+ * This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction.
1576
+ *
1577
+ * @param params The params for the smart contract call
1578
+ * @returns The call transaction
1579
+ */
1580
+ getBridgingCostInTokens: (params) => {
1581
+ return this.appClient.createTransaction.call(BridgeParamsFactory.getBridgingCostInTokens(params));
1582
+ },
1583
+ /**
1584
+ * Makes a call to the Bridge smart contract using the `hashMessage(uint64,byte[32],byte,byte,byte[32],byte[32])byte[32]` ABI method.
1585
+ *
1586
+ * This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction.
1587
+ *
1588
+ * @param params The params for the smart contract call
1589
+ * @returns The call transaction
1590
+ */
1591
+ hashMessage: (params) => {
1592
+ return this.appClient.createTransaction.call(BridgeParamsFactory.hashMessage(params));
1593
+ },
1594
+ /**
1595
+ * Makes a call to the Bridge smart contract using the `isOtherBridgeTokenSupported(byte,byte[32])bool` ABI method.
1596
+ *
1597
+ * This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction.
1598
+ *
1599
+ * @param params The params for the smart contract call
1600
+ * @returns The call transaction
1601
+ */
1602
+ isOtherBridgeTokenSupported: (params) => {
1603
+ return this.appClient.createTransaction.call(BridgeParamsFactory.isOtherBridgeTokenSupported(params));
1604
+ },
1605
+ /**
1606
+ * Makes a call to the Bridge smart contract using the `getTransactionCost(byte)uint64` ABI method.
1607
+ *
1608
+ * This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction.
1609
+ *
1610
+ * @param params The params for the smart contract call
1611
+ * @returns The call transaction
1612
+ */
1613
+ getTransactionCost: (params) => {
1614
+ return this.appClient.createTransaction.call(BridgeParamsFactory.getTransactionCost(params));
1615
+ },
1616
+ /**
1617
+ * Makes a call to the Bridge smart contract using the `getReceiveTokensCost()uint64` ABI method.
1618
+ *
1619
+ * This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction.
1620
+ *
1621
+ * @param params The params for the smart contract call
1622
+ * @returns The call transaction
1623
+ */
1624
+ getReceiveTokensCost: (params = { args: [] }) => {
1625
+ return this.appClient.createTransaction.call(BridgeParamsFactory.getReceiveTokensCost(params));
1626
+ },
1627
+ /**
1628
+ * Makes a call to the Bridge smart contract using the `getSendTransactionStorageCost()uint64` ABI method.
1629
+ *
1630
+ * This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction.
1631
+ *
1632
+ * @param params The params for the smart contract call
1633
+ * @returns The call transaction
1634
+ */
1635
+ getSendTransactionStorageCost: (params = { args: [] }) => {
1636
+ return this.appClient.createTransaction.call(BridgeParamsFactory.getSendTransactionStorageCost(params));
1637
+ },
1638
+ /**
1639
+ * Makes a call to the Bridge smart contract using the `swap(axfer,uint64,address,uint64,uint64)void` ABI method.
1640
+ *
1641
+ * @param params The params for the smart contract call
1642
+ * @returns The call transaction
1643
+ */
1644
+ swap: (params) => {
1645
+ return this.appClient.createTransaction.call(BridgeParamsFactory.swap(params));
1646
+ },
1647
+ /**
1648
+ * Makes a call to the Bridge smart contract using the `addPool(uint64,uint64)void` ABI method.
1649
+ *
1650
+ * @param params The params for the smart contract call
1651
+ * @returns The call transaction
1652
+ */
1653
+ addPool: (params) => {
1654
+ return this.appClient.createTransaction.call(BridgeParamsFactory.addPool(params));
1655
+ },
1656
+ /**
1657
+ * Makes a call to the Bridge smart contract using the `removePool(uint64)void` ABI method.
1658
+ *
1659
+ * @param params The params for the smart contract call
1660
+ * @returns The call transaction
1661
+ */
1662
+ removePool: (params) => {
1663
+ return this.appClient.createTransaction.call(BridgeParamsFactory.removePool(params));
1664
+ },
1665
+ /**
1666
+ * Makes a call to the Bridge smart contract using the `stopSwap()void` ABI method.
1667
+ *
1668
+ * @param params The params for the smart contract call
1669
+ * @returns The call transaction
1670
+ */
1671
+ stopSwap: (params = { args: [] }) => {
1672
+ return this.appClient.createTransaction.call(BridgeParamsFactory.stopSwap(params));
1673
+ },
1674
+ /**
1675
+ * Makes a call to the Bridge smart contract using the `startSwap()void` ABI method.
1676
+ *
1677
+ * @param params The params for the smart contract call
1678
+ * @returns The call transaction
1679
+ */
1680
+ startSwap: (params = { args: [] }) => {
1681
+ return this.appClient.createTransaction.call(BridgeParamsFactory.startSwap(params));
1682
+ },
1683
+ /**
1684
+ * Makes a call to the Bridge smart contract using the `setStopAuthority(address)void` ABI method.
1685
+ *
1686
+ * @param params The params for the smart contract call
1687
+ * @returns The call transaction
1688
+ */
1689
+ setStopAuthority: (params) => {
1690
+ return this.appClient.createTransaction.call(BridgeParamsFactory.setStopAuthority(params));
1691
+ },
1692
+ /**
1693
+ * Makes a call to the Bridge smart contract using the `setRebalancer(address)void` ABI method.
1694
+ *
1695
+ * @param params The params for the smart contract call
1696
+ * @returns The call transaction
1697
+ */
1698
+ setRebalancer: (params) => {
1699
+ return this.appClient.createTransaction.call(BridgeParamsFactory.setRebalancer(params));
1700
+ },
1701
+ /**
1702
+ * Makes a call to the Bridge smart contract using the `getGasUsage(byte)uint64` ABI method.
1703
+ *
1704
+ * This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction.
1705
+ *
1706
+ * @param params The params for the smart contract call
1707
+ * @returns The call transaction
1708
+ */
1709
+ getGasUsage: (params) => {
1710
+ return this.appClient.createTransaction.call(BridgeParamsFactory.getGasUsage(params));
1711
+ },
1712
+ /**
1713
+ * Makes a call to the Bridge smart contract using the `setGasUsage(byte,uint64)void` ABI method.
1714
+ *
1715
+ * @param params The params for the smart contract call
1716
+ * @returns The call transaction
1717
+ */
1718
+ setGasUsage: (params) => {
1719
+ return this.appClient.createTransaction.call(BridgeParamsFactory.setGasUsage(params));
1720
+ },
1721
+ /**
1722
+ * Makes a call to the Bridge smart contract using the `setGasOracle(uint64)void` ABI method.
1723
+ *
1724
+ * @param params The params for the smart contract call
1725
+ * @returns The call transaction
1726
+ */
1727
+ setGasOracle: (params) => {
1728
+ return this.appClient.createTransaction.call(BridgeParamsFactory.setGasOracle(params));
1729
+ },
1730
+ /**
1731
+ * Makes a call to the Bridge smart contract using the `getTransactionRelayerCost(byte)uint64` ABI method.
1732
+ *
1733
+ * This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction.
1734
+ *
1735
+ * @param params The params for the smart contract call
1736
+ * @returns The call transaction
1737
+ */
1738
+ getTransactionRelayerCost: (params) => {
1739
+ return this.appClient.createTransaction.call(BridgeParamsFactory.getTransactionRelayerCost(params));
1740
+ },
1741
+ /**
1742
+ * Makes a call to the Bridge smart contract using the `transferOwnership(address)void` ABI method.
1743
+ *
1744
+ * @param params The params for the smart contract call
1745
+ * @returns The call transaction
1746
+ */
1747
+ transferOwnership: (params) => {
1748
+ return this.appClient.createTransaction.call(BridgeParamsFactory.transferOwnership(params));
1749
+ },
1750
+ };
1751
+ /**
1752
+ * Send calls to the current app
1753
+ */
1754
+ send = {
1755
+ /**
1756
+ * Makes a clear_state call to an existing instance of the Bridge smart contract.
1757
+ *
1758
+ * @param params The params for the bare (raw) call
1759
+ * @returns The clearState result
1760
+ */
1761
+ clearState: (params) => {
1762
+ return this.appClient.send.bare.clearState(params);
1763
+ },
1764
+ /**
1765
+ * Makes a call to the Bridge smart contract using the `optInAsset(uint64)void` ABI method.
1766
+ *
1767
+ * @param params The params for the smart contract call
1768
+ * @returns The call result
1769
+ */
1770
+ optInAsset: async (params) => {
1771
+ const result = await this.appClient.send.call(BridgeParamsFactory.optInAsset(params));
1772
+ return { ...result, return: result.return };
1773
+ },
1774
+ /**
1775
+ * Makes a call to the Bridge smart contract using the `swapAndBridge(pay,axfer,byte[32],byte,byte[32],byte[32],uint64)void` ABI method.
1776
+ *
1777
+ * @param params The params for the smart contract call
1778
+ * @returns The call result
1779
+ */
1780
+ swapAndBridge: async (params) => {
1781
+ const result = await this.appClient.send.call(BridgeParamsFactory.swapAndBridge(params));
1782
+ return {
1783
+ ...result,
1784
+ return: result.return,
1785
+ };
1786
+ },
1787
+ /**
1788
+ * Makes a call to the Bridge smart contract using the `swapAndBridgeWithStable(axfer,byte[32],byte,byte[32],byte[32],uint64,uint64)void` ABI method.
1789
+ *
1790
+ * @param params The params for the smart contract call
1791
+ * @returns The call result
1792
+ */
1793
+ swapAndBridgeWithStable: async (params) => {
1794
+ const result = await this.appClient.send.call(BridgeParamsFactory.swapAndBridgeWithStable(params));
1795
+ return {
1796
+ ...result,
1797
+ return: result.return,
1798
+ };
1799
+ },
1800
+ /**
1801
+ * Makes a call to the Bridge smart contract using the `receiveTokens(pay,uint64,byte[32],byte,byte[32],byte[32],uint64)void` ABI method.
1802
+ *
1803
+ * @param params The params for the smart contract call
1804
+ * @returns The call result
1805
+ */
1806
+ receiveTokens: async (params) => {
1807
+ const result = await this.appClient.send.call(BridgeParamsFactory.receiveTokens(params));
1808
+ return {
1809
+ ...result,
1810
+ return: result.return,
1811
+ };
1812
+ },
1813
+ /**
1814
+ * Makes a call to the Bridge smart contract using the `registerBridge(byte,byte[32])void` ABI method.
1815
+ *
1816
+ * @param params The params for the smart contract call
1817
+ * @returns The call result
1818
+ */
1819
+ registerBridge: async (params) => {
1820
+ const result = await this.appClient.send.call(BridgeParamsFactory.registerBridge(params));
1821
+ return {
1822
+ ...result,
1823
+ return: result.return,
1824
+ };
1825
+ },
1826
+ /**
1827
+ * Makes a call to the Bridge smart contract using the `addBridgeToken(byte,byte[32])void` ABI method.
1828
+ *
1829
+ * @param params The params for the smart contract call
1830
+ * @returns The call result
1831
+ */
1832
+ addBridgeToken: async (params) => {
1833
+ const result = await this.appClient.send.call(BridgeParamsFactory.addBridgeToken(params));
1834
+ return {
1835
+ ...result,
1836
+ return: result.return,
1837
+ };
1838
+ },
1839
+ /**
1840
+ * Makes a call to the Bridge smart contract using the `removeBridgeToken(byte,byte[32])void` ABI method.
1841
+ *
1842
+ * @param params The params for the smart contract call
1843
+ * @returns The call result
1844
+ */
1845
+ removeBridgeToken: async (params) => {
1846
+ const result = await this.appClient.send.call(BridgeParamsFactory.removeBridgeToken(params));
1847
+ return {
1848
+ ...result,
1849
+ return: result.return,
1850
+ };
1851
+ },
1852
+ /**
1853
+ * Makes a call to the Bridge smart contract using the `withdrawGasTokens(uint64)void` ABI method.
1854
+ *
1855
+ * @param params The params for the smart contract call
1856
+ * @returns The call result
1857
+ */
1858
+ withdrawGasTokens: async (params) => {
1859
+ const result = await this.appClient.send.call(BridgeParamsFactory.withdrawGasTokens(params));
1860
+ return {
1861
+ ...result,
1862
+ return: result.return,
1863
+ };
1864
+ },
1865
+ /**
1866
+ * Makes a call to the Bridge smart contract using the `withdrawBridgingFeeInTokens(uint64)void` ABI method.
1867
+ *
1868
+ * @param params The params for the smart contract call
1869
+ * @returns The call result
1870
+ */
1871
+ withdrawBridgingFeeInTokens: async (params) => {
1872
+ const result = await this.appClient.send.call(BridgeParamsFactory.withdrawBridgingFeeInTokens(params));
1873
+ return {
1874
+ ...result,
1875
+ return: result.return,
1876
+ };
1877
+ },
1878
+ /**
1879
+ * Makes a call to the Bridge smart contract using the `getBridgingCostInTokens(byte,uint64)uint64` ABI method.
1880
+ *
1881
+ * This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction.
1882
+ *
1883
+ * @param params The params for the smart contract call
1884
+ * @returns The call result
1885
+ */
1886
+ getBridgingCostInTokens: async (params) => {
1887
+ const result = await this.appClient.send.call(BridgeParamsFactory.getBridgingCostInTokens(params));
1888
+ return {
1889
+ ...result,
1890
+ return: result.return,
1891
+ };
1892
+ },
1893
+ /**
1894
+ * Makes a call to the Bridge smart contract using the `hashMessage(uint64,byte[32],byte,byte,byte[32],byte[32])byte[32]` ABI method.
1895
+ *
1896
+ * This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction.
1897
+ *
1898
+ * @param params The params for the smart contract call
1899
+ * @returns The call result
1900
+ */
1901
+ hashMessage: async (params) => {
1902
+ const result = await this.appClient.send.call(BridgeParamsFactory.hashMessage(params));
1903
+ return {
1904
+ ...result,
1905
+ return: result.return,
1906
+ };
1907
+ },
1908
+ /**
1909
+ * Makes a call to the Bridge smart contract using the `isOtherBridgeTokenSupported(byte,byte[32])bool` ABI method.
1910
+ *
1911
+ * This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction.
1912
+ *
1913
+ * @param params The params for the smart contract call
1914
+ * @returns The call result
1915
+ */
1916
+ isOtherBridgeTokenSupported: async (params) => {
1917
+ const result = await this.appClient.send.call(BridgeParamsFactory.isOtherBridgeTokenSupported(params));
1918
+ return {
1919
+ ...result,
1920
+ return: result.return,
1921
+ };
1922
+ },
1923
+ /**
1924
+ * Makes a call to the Bridge smart contract using the `getTransactionCost(byte)uint64` ABI method.
1925
+ *
1926
+ * This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction.
1927
+ *
1928
+ * @param params The params for the smart contract call
1929
+ * @returns The call result
1930
+ */
1931
+ getTransactionCost: async (params) => {
1932
+ const result = await this.appClient.send.call(BridgeParamsFactory.getTransactionCost(params));
1933
+ return {
1934
+ ...result,
1935
+ return: result.return,
1936
+ };
1937
+ },
1938
+ /**
1939
+ * Makes a call to the Bridge smart contract using the `getReceiveTokensCost()uint64` ABI method.
1940
+ *
1941
+ * This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction.
1942
+ *
1943
+ * @param params The params for the smart contract call
1944
+ * @returns The call result
1945
+ */
1946
+ getReceiveTokensCost: async (params = { args: [] }) => {
1947
+ const result = await this.appClient.send.call(BridgeParamsFactory.getReceiveTokensCost(params));
1948
+ return {
1949
+ ...result,
1950
+ return: result.return,
1951
+ };
1952
+ },
1953
+ /**
1954
+ * Makes a call to the Bridge smart contract using the `getSendTransactionStorageCost()uint64` ABI method.
1955
+ *
1956
+ * This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction.
1957
+ *
1958
+ * @param params The params for the smart contract call
1959
+ * @returns The call result
1960
+ */
1961
+ getSendTransactionStorageCost: async (params = { args: [] }) => {
1962
+ const result = await this.appClient.send.call(BridgeParamsFactory.getSendTransactionStorageCost(params));
1963
+ return {
1964
+ ...result,
1965
+ return: result.return,
1966
+ };
1967
+ },
1968
+ /**
1969
+ * Makes a call to the Bridge smart contract using the `swap(axfer,uint64,address,uint64,uint64)void` ABI method.
1970
+ *
1971
+ * @param params The params for the smart contract call
1972
+ * @returns The call result
1973
+ */
1974
+ swap: async (params) => {
1975
+ const result = await this.appClient.send.call(BridgeParamsFactory.swap(params));
1976
+ return {
1977
+ ...result,
1978
+ return: result.return,
1979
+ };
1980
+ },
1981
+ /**
1982
+ * Makes a call to the Bridge smart contract using the `addPool(uint64,uint64)void` ABI method.
1983
+ *
1984
+ * @param params The params for the smart contract call
1985
+ * @returns The call result
1986
+ */
1987
+ addPool: async (params) => {
1988
+ const result = await this.appClient.send.call(BridgeParamsFactory.addPool(params));
1989
+ return { ...result, return: result.return };
1990
+ },
1991
+ /**
1992
+ * Makes a call to the Bridge smart contract using the `removePool(uint64)void` ABI method.
1993
+ *
1994
+ * @param params The params for the smart contract call
1995
+ * @returns The call result
1996
+ */
1997
+ removePool: async (params) => {
1998
+ const result = await this.appClient.send.call(BridgeParamsFactory.removePool(params));
1999
+ return { ...result, return: result.return };
2000
+ },
2001
+ /**
2002
+ * Makes a call to the Bridge smart contract using the `stopSwap()void` ABI method.
2003
+ *
2004
+ * @param params The params for the smart contract call
2005
+ * @returns The call result
2006
+ */
2007
+ stopSwap: async (params = { args: [] }) => {
2008
+ const result = await this.appClient.send.call(BridgeParamsFactory.stopSwap(params));
2009
+ return { ...result, return: result.return };
2010
+ },
2011
+ /**
2012
+ * Makes a call to the Bridge smart contract using the `startSwap()void` ABI method.
2013
+ *
2014
+ * @param params The params for the smart contract call
2015
+ * @returns The call result
2016
+ */
2017
+ startSwap: async (params = { args: [] }) => {
2018
+ const result = await this.appClient.send.call(BridgeParamsFactory.startSwap(params));
2019
+ return { ...result, return: result.return };
2020
+ },
2021
+ /**
2022
+ * Makes a call to the Bridge smart contract using the `setStopAuthority(address)void` ABI method.
2023
+ *
2024
+ * @param params The params for the smart contract call
2025
+ * @returns The call result
2026
+ */
2027
+ setStopAuthority: async (params) => {
2028
+ const result = await this.appClient.send.call(BridgeParamsFactory.setStopAuthority(params));
2029
+ return {
2030
+ ...result,
2031
+ return: result.return,
2032
+ };
2033
+ },
2034
+ /**
2035
+ * Makes a call to the Bridge smart contract using the `setRebalancer(address)void` ABI method.
2036
+ *
2037
+ * @param params The params for the smart contract call
2038
+ * @returns The call result
2039
+ */
2040
+ setRebalancer: async (params) => {
2041
+ const result = await this.appClient.send.call(BridgeParamsFactory.setRebalancer(params));
2042
+ return { ...result, return: result.return };
2043
+ },
2044
+ /**
2045
+ * Makes a call to the Bridge smart contract using the `getGasUsage(byte)uint64` ABI method.
2046
+ *
2047
+ * This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction.
2048
+ *
2049
+ * @param params The params for the smart contract call
2050
+ * @returns The call result
2051
+ */
2052
+ getGasUsage: async (params) => {
2053
+ const result = await this.appClient.send.call(BridgeParamsFactory.getGasUsage(params));
2054
+ return { ...result, return: result.return };
2055
+ },
2056
+ /**
2057
+ * Makes a call to the Bridge smart contract using the `setGasUsage(byte,uint64)void` ABI method.
2058
+ *
2059
+ * @param params The params for the smart contract call
2060
+ * @returns The call result
2061
+ */
2062
+ setGasUsage: async (params) => {
2063
+ const result = await this.appClient.send.call(BridgeParamsFactory.setGasUsage(params));
2064
+ return {
2065
+ ...result,
2066
+ return: result.return,
2067
+ };
2068
+ },
2069
+ /**
2070
+ * Makes a call to the Bridge smart contract using the `setGasOracle(uint64)void` ABI method.
2071
+ *
2072
+ * @param params The params for the smart contract call
2073
+ * @returns The call result
2074
+ */
2075
+ setGasOracle: async (params) => {
2076
+ const result = await this.appClient.send.call(BridgeParamsFactory.setGasOracle(params));
2077
+ return { ...result, return: result.return };
2078
+ },
2079
+ /**
2080
+ * Makes a call to the Bridge smart contract using the `getTransactionRelayerCost(byte)uint64` ABI method.
2081
+ *
2082
+ * This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction.
2083
+ *
2084
+ * @param params The params for the smart contract call
2085
+ * @returns The call result
2086
+ */
2087
+ getTransactionRelayerCost: async (params) => {
2088
+ const result = await this.appClient.send.call(BridgeParamsFactory.getTransactionRelayerCost(params));
2089
+ return {
2090
+ ...result,
2091
+ return: result.return,
2092
+ };
2093
+ },
2094
+ /**
2095
+ * Makes a call to the Bridge smart contract using the `transferOwnership(address)void` ABI method.
2096
+ *
2097
+ * @param params The params for the smart contract call
2098
+ * @returns The call result
2099
+ */
2100
+ transferOwnership: async (params) => {
2101
+ const result = await this.appClient.send.call(BridgeParamsFactory.transferOwnership(params));
2102
+ return {
2103
+ ...result,
2104
+ return: result.return,
2105
+ };
2106
+ },
2107
+ };
2108
+ /**
2109
+ * Clone this app client with different params
2110
+ *
2111
+ * @param params The params to use for the the cloned app client. Omit a param to keep the original value. Set a param to override the original value. Setting to undefined will clear the original value.
2112
+ * @returns A new app client with the altered params
2113
+ */
2114
+ clone(params) {
2115
+ return new BridgeClient(this.appClient.clone(params));
2116
+ }
2117
+ /**
2118
+ * Makes a readonly (simulated) call to the Bridge smart contract using the `getBridgingCostInTokens(byte,uint64)uint64` ABI method.
2119
+ *
2120
+ * This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction.
2121
+ *
2122
+ * @param params The params for the smart contract call
2123
+ * @returns The call result
2124
+ */
2125
+ async getBridgingCostInTokens(params) {
2126
+ const result = await this.appClient.send.call(BridgeParamsFactory.getBridgingCostInTokens(params));
2127
+ return result.return;
2128
+ }
2129
+ /**
2130
+ * Makes a readonly (simulated) call to the Bridge smart contract using the `hashMessage(uint64,byte[32],byte,byte,byte[32],byte[32])byte[32]` ABI method.
2131
+ *
2132
+ * This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction.
2133
+ *
2134
+ * @param params The params for the smart contract call
2135
+ * @returns The call result
2136
+ */
2137
+ async hashMessage(params) {
2138
+ const result = await this.appClient.send.call(BridgeParamsFactory.hashMessage(params));
2139
+ return result.return;
2140
+ }
2141
+ /**
2142
+ * Makes a readonly (simulated) call to the Bridge smart contract using the `isOtherBridgeTokenSupported(byte,byte[32])bool` ABI method.
2143
+ *
2144
+ * This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction.
2145
+ *
2146
+ * @param params The params for the smart contract call
2147
+ * @returns The call result
2148
+ */
2149
+ async isOtherBridgeTokenSupported(params) {
2150
+ const result = await this.appClient.send.call(BridgeParamsFactory.isOtherBridgeTokenSupported(params));
2151
+ return result.return;
2152
+ }
2153
+ /**
2154
+ * Makes a readonly (simulated) call to the Bridge smart contract using the `getTransactionCost(byte)uint64` ABI method.
2155
+ *
2156
+ * This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction.
2157
+ *
2158
+ * @param params The params for the smart contract call
2159
+ * @returns The call result
2160
+ */
2161
+ async getTransactionCost(params) {
2162
+ const result = await this.appClient.send.call(BridgeParamsFactory.getTransactionCost(params));
2163
+ return result.return;
2164
+ }
2165
+ /**
2166
+ * Makes a readonly (simulated) call to the Bridge smart contract using the `getReceiveTokensCost()uint64` ABI method.
2167
+ *
2168
+ * This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction.
2169
+ *
2170
+ * @param params The params for the smart contract call
2171
+ * @returns The call result
2172
+ */
2173
+ async getReceiveTokensCost(params = { args: [] }) {
2174
+ const result = await this.appClient.send.call(BridgeParamsFactory.getReceiveTokensCost(params));
2175
+ return result.return;
2176
+ }
2177
+ /**
2178
+ * Makes a readonly (simulated) call to the Bridge smart contract using the `getSendTransactionStorageCost()uint64` ABI method.
2179
+ *
2180
+ * This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction.
2181
+ *
2182
+ * @param params The params for the smart contract call
2183
+ * @returns The call result
2184
+ */
2185
+ async getSendTransactionStorageCost(params = { args: [] }) {
2186
+ const result = await this.appClient.send.call(BridgeParamsFactory.getSendTransactionStorageCost(params));
2187
+ return result.return;
2188
+ }
2189
+ /**
2190
+ * Makes a readonly (simulated) call to the Bridge smart contract using the `getGasUsage(byte)uint64` ABI method.
2191
+ *
2192
+ * This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction.
2193
+ *
2194
+ * @param params The params for the smart contract call
2195
+ * @returns The call result
2196
+ */
2197
+ async getGasUsage(params) {
2198
+ const result = await this.appClient.send.call(BridgeParamsFactory.getGasUsage(params));
2199
+ return result.return;
2200
+ }
2201
+ /**
2202
+ * Makes a readonly (simulated) call to the Bridge smart contract using the `getTransactionRelayerCost(byte)uint64` ABI method.
2203
+ *
2204
+ * This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction.
2205
+ *
2206
+ * @param params The params for the smart contract call
2207
+ * @returns The call result
2208
+ */
2209
+ async getTransactionRelayerCost(params) {
2210
+ const result = await this.appClient.send.call(BridgeParamsFactory.getTransactionRelayerCost(params));
2211
+ return result.return;
2212
+ }
2213
+ /**
2214
+ * Methods to access state for the current Bridge app
2215
+ */
2216
+ state = {
2217
+ /**
2218
+ * Methods to access global state for the current Bridge app
2219
+ */
2220
+ global: {
2221
+ /**
2222
+ * Get all current keyed values from global state
2223
+ */
2224
+ getAll: async () => {
2225
+ const result = await this.appClient.state.global.getAll();
2226
+ return {
2227
+ chainId: result.chainId,
2228
+ messenger: result.messenger,
2229
+ stopAuthority: result.stopAuthority,
2230
+ rebalancer: result.rebalancer,
2231
+ canSwap: result.canSwap,
2232
+ gasOracle: result.gasOracle,
2233
+ owner: result.owner,
2234
+ };
2235
+ },
2236
+ /**
2237
+ * Get the current value of the chainId key in global state
2238
+ */
2239
+ chainId: async () => {
2240
+ return (await this.appClient.state.global.getValue("chainId"));
2241
+ },
2242
+ /**
2243
+ * Get the current value of the messenger key in global state
2244
+ */
2245
+ messenger: async () => {
2246
+ return (await this.appClient.state.global.getValue("messenger"));
2247
+ },
2248
+ /**
2249
+ * Get the current value of the stopAuthority key in global state
2250
+ */
2251
+ stopAuthority: async () => {
2252
+ return (await this.appClient.state.global.getValue("stopAuthority"));
2253
+ },
2254
+ /**
2255
+ * Get the current value of the rebalancer key in global state
2256
+ */
2257
+ rebalancer: async () => {
2258
+ return (await this.appClient.state.global.getValue("rebalancer"));
2259
+ },
2260
+ /**
2261
+ * Get the current value of the canSwap key in global state
2262
+ */
2263
+ canSwap: async () => {
2264
+ return (await this.appClient.state.global.getValue("canSwap"));
2265
+ },
2266
+ /**
2267
+ * Get the current value of the gasOracle key in global state
2268
+ */
2269
+ gasOracle: async () => {
2270
+ return (await this.appClient.state.global.getValue("gasOracle"));
2271
+ },
2272
+ /**
2273
+ * Get the current value of the owner key in global state
2274
+ */
2275
+ owner: async () => {
2276
+ return (await this.appClient.state.global.getValue("owner"));
2277
+ },
2278
+ },
2279
+ /**
2280
+ * Methods to access box state for the current Bridge app
2281
+ */
2282
+ box: {
2283
+ /**
2284
+ * Get all current keyed values from box state
2285
+ */
2286
+ getAll: async () => {
2287
+ const result = await this.appClient.state.box.getAll();
2288
+ return {};
2289
+ },
2290
+ /**
2291
+ * Get values from the processedMessages map in box state
2292
+ */
2293
+ processedMessages: {
2294
+ /**
2295
+ * Get all current values of the processedMessages map in box state
2296
+ */
2297
+ getMap: async () => {
2298
+ return (await this.appClient.state.box.getMap("processedMessages"));
2299
+ },
2300
+ /**
2301
+ * Get a current value of the processedMessages map by key from box state
2302
+ */
2303
+ value: async (key) => {
2304
+ return (await this.appClient.state.box.getMapValue("processedMessages", key));
2305
+ },
2306
+ },
2307
+ /**
2308
+ * Get values from the sentMessages map in box state
2309
+ */
2310
+ sentMessages: {
2311
+ /**
2312
+ * Get all current values of the sentMessages map in box state
2313
+ */
2314
+ getMap: async () => {
2315
+ return (await this.appClient.state.box.getMap("sentMessages"));
2316
+ },
2317
+ /**
2318
+ * Get a current value of the sentMessages map by key from box state
2319
+ */
2320
+ value: async (key) => {
2321
+ return (await this.appClient.state.box.getMapValue("sentMessages", key));
2322
+ },
2323
+ },
2324
+ /**
2325
+ * Get values from the otherBridges map in box state
2326
+ */
2327
+ otherBridges: {
2328
+ /**
2329
+ * Get all current values of the otherBridges map in box state
2330
+ */
2331
+ getMap: async () => {
2332
+ return (await this.appClient.state.box.getMap("otherBridges"));
2333
+ },
2334
+ /**
2335
+ * Get a current value of the otherBridges map by key from box state
2336
+ */
2337
+ value: async (key) => {
2338
+ return (await this.appClient.state.box.getMapValue("otherBridges", key));
2339
+ },
2340
+ },
2341
+ /**
2342
+ * Get values from the otherBridgeTokens map in box state
2343
+ */
2344
+ otherBridgeTokens: {
2345
+ /**
2346
+ * Get all current values of the otherBridgeTokens map in box state
2347
+ */
2348
+ getMap: async () => {
2349
+ return (await this.appClient.state.box.getMap("otherBridgeTokens"));
2350
+ },
2351
+ /**
2352
+ * Get a current value of the otherBridgeTokens map by key from box state
2353
+ */
2354
+ value: async (key) => {
2355
+ return (await this.appClient.state.box.getMapValue("otherBridgeTokens", key));
2356
+ },
2357
+ },
2358
+ /**
2359
+ * Get values from the pools map in box state
2360
+ */
2361
+ pools: {
2362
+ /**
2363
+ * Get all current values of the pools map in box state
2364
+ */
2365
+ getMap: async () => {
2366
+ return (await this.appClient.state.box.getMap("pools"));
2367
+ },
2368
+ /**
2369
+ * Get a current value of the pools map by key from box state
2370
+ */
2371
+ value: async (key) => {
2372
+ return (await this.appClient.state.box.getMapValue("pools", key));
2373
+ },
2374
+ },
2375
+ /**
2376
+ * Get values from the fromGasOracleScalingFactor map in box state
2377
+ */
2378
+ fromGasOracleScalingFactor: {
2379
+ /**
2380
+ * Get all current values of the fromGasOracleScalingFactor map in box state
2381
+ */
2382
+ getMap: async () => {
2383
+ return (await this.appClient.state.box.getMap("fromGasOracleScalingFactor"));
2384
+ },
2385
+ /**
2386
+ * Get a current value of the fromGasOracleScalingFactor map by key from box state
2387
+ */
2388
+ value: async (key) => {
2389
+ return (await this.appClient.state.box.getMapValue("fromGasOracleScalingFactor", key));
2390
+ },
2391
+ },
2392
+ /**
2393
+ * Get values from the bridgingFeeConversionScalingFactor map in box state
2394
+ */
2395
+ bridgingFeeConversionScalingFactor: {
2396
+ /**
2397
+ * Get all current values of the bridgingFeeConversionScalingFactor map in box state
2398
+ */
2399
+ getMap: async () => {
2400
+ return (await this.appClient.state.box.getMap("bridgingFeeConversionScalingFactor"));
2401
+ },
2402
+ /**
2403
+ * Get a current value of the bridgingFeeConversionScalingFactor map by key from box state
2404
+ */
2405
+ value: async (key) => {
2406
+ return (await this.appClient.state.box.getMapValue("bridgingFeeConversionScalingFactor", key));
2407
+ },
2408
+ },
2409
+ /**
2410
+ * Get values from the gasUsage map in box state
2411
+ */
2412
+ gasUsage: {
2413
+ /**
2414
+ * Get all current values of the gasUsage map in box state
2415
+ */
2416
+ getMap: async () => {
2417
+ return (await this.appClient.state.box.getMap("gasUsage"));
2418
+ },
2419
+ /**
2420
+ * Get a current value of the gasUsage map by key from box state
2421
+ */
2422
+ value: async (key) => {
2423
+ return (await this.appClient.state.box.getMapValue("gasUsage", key));
2424
+ },
2425
+ },
2426
+ },
2427
+ };
2428
+ newGroup() {
2429
+ const client = this;
2430
+ const composer = this.algorand.newGroup();
2431
+ let promiseChain = Promise.resolve();
2432
+ const resultMappers = [];
2433
+ return {
2434
+ /**
2435
+ * Add a optInAsset(uint64)void method call against the Bridge contract
2436
+ */
2437
+ optInAsset(params) {
2438
+ promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.optInAsset(params)));
2439
+ resultMappers.push(undefined);
2440
+ return this;
2441
+ },
2442
+ /**
2443
+ * Add a swapAndBridge(pay,axfer,byte[32],byte,byte[32],byte[32],uint64)void method call against the Bridge contract
2444
+ */
2445
+ swapAndBridge(params) {
2446
+ promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.swapAndBridge(params)));
2447
+ resultMappers.push(undefined);
2448
+ return this;
2449
+ },
2450
+ /**
2451
+ * Add a swapAndBridgeWithStable(axfer,byte[32],byte,byte[32],byte[32],uint64,uint64)void method call against the Bridge contract
2452
+ */
2453
+ swapAndBridgeWithStable(params) {
2454
+ promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.swapAndBridgeWithStable(params)));
2455
+ resultMappers.push(undefined);
2456
+ return this;
2457
+ },
2458
+ /**
2459
+ * Add a receiveTokens(pay,uint64,byte[32],byte,byte[32],byte[32],uint64)void method call against the Bridge contract
2460
+ */
2461
+ receiveTokens(params) {
2462
+ promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.receiveTokens(params)));
2463
+ resultMappers.push(undefined);
2464
+ return this;
2465
+ },
2466
+ /**
2467
+ * Add a registerBridge(byte,byte[32])void method call against the Bridge contract
2468
+ */
2469
+ registerBridge(params) {
2470
+ promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.registerBridge(params)));
2471
+ resultMappers.push(undefined);
2472
+ return this;
2473
+ },
2474
+ /**
2475
+ * Add a addBridgeToken(byte,byte[32])void method call against the Bridge contract
2476
+ */
2477
+ addBridgeToken(params) {
2478
+ promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.addBridgeToken(params)));
2479
+ resultMappers.push(undefined);
2480
+ return this;
2481
+ },
2482
+ /**
2483
+ * Add a removeBridgeToken(byte,byte[32])void method call against the Bridge contract
2484
+ */
2485
+ removeBridgeToken(params) {
2486
+ promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.removeBridgeToken(params)));
2487
+ resultMappers.push(undefined);
2488
+ return this;
2489
+ },
2490
+ /**
2491
+ * Add a withdrawGasTokens(uint64)void method call against the Bridge contract
2492
+ */
2493
+ withdrawGasTokens(params) {
2494
+ promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.withdrawGasTokens(params)));
2495
+ resultMappers.push(undefined);
2496
+ return this;
2497
+ },
2498
+ /**
2499
+ * Add a withdrawBridgingFeeInTokens(uint64)void method call against the Bridge contract
2500
+ */
2501
+ withdrawBridgingFeeInTokens(params) {
2502
+ promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.withdrawBridgingFeeInTokens(params)));
2503
+ resultMappers.push(undefined);
2504
+ return this;
2505
+ },
2506
+ /**
2507
+ * Add a getBridgingCostInTokens(byte,uint64)uint64 method call against the Bridge contract
2508
+ */
2509
+ getBridgingCostInTokens(params) {
2510
+ promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.getBridgingCostInTokens(params)));
2511
+ resultMappers.push((v) => client.decodeReturnValue("getBridgingCostInTokens(byte,uint64)uint64", v));
2512
+ return this;
2513
+ },
2514
+ /**
2515
+ * Add a hashMessage(uint64,byte[32],byte,byte,byte[32],byte[32])byte[32] method call against the Bridge contract
2516
+ */
2517
+ hashMessage(params) {
2518
+ promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.hashMessage(params)));
2519
+ resultMappers.push((v) => client.decodeReturnValue("hashMessage(uint64,byte[32],byte,byte,byte[32],byte[32])byte[32]", v));
2520
+ return this;
2521
+ },
2522
+ /**
2523
+ * Add a isOtherBridgeTokenSupported(byte,byte[32])bool method call against the Bridge contract
2524
+ */
2525
+ isOtherBridgeTokenSupported(params) {
2526
+ promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.isOtherBridgeTokenSupported(params)));
2527
+ resultMappers.push((v) => client.decodeReturnValue("isOtherBridgeTokenSupported(byte,byte[32])bool", v));
2528
+ return this;
2529
+ },
2530
+ /**
2531
+ * Add a getTransactionCost(byte)uint64 method call against the Bridge contract
2532
+ */
2533
+ getTransactionCost(params) {
2534
+ promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.getTransactionCost(params)));
2535
+ resultMappers.push((v) => client.decodeReturnValue("getTransactionCost(byte)uint64", v));
2536
+ return this;
2537
+ },
2538
+ /**
2539
+ * Add a getReceiveTokensCost()uint64 method call against the Bridge contract
2540
+ */
2541
+ getReceiveTokensCost(params) {
2542
+ promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.getReceiveTokensCost(params)));
2543
+ resultMappers.push((v) => client.decodeReturnValue("getReceiveTokensCost()uint64", v));
2544
+ return this;
2545
+ },
2546
+ /**
2547
+ * Add a getSendTransactionStorageCost()uint64 method call against the Bridge contract
2548
+ */
2549
+ getSendTransactionStorageCost(params) {
2550
+ promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.getSendTransactionStorageCost(params)));
2551
+ resultMappers.push((v) => client.decodeReturnValue("getSendTransactionStorageCost()uint64", v));
2552
+ return this;
2553
+ },
2554
+ /**
2555
+ * Add a swap(axfer,uint64,address,uint64,uint64)void method call against the Bridge contract
2556
+ */
2557
+ swap(params) {
2558
+ promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.swap(params)));
2559
+ resultMappers.push(undefined);
2560
+ return this;
2561
+ },
2562
+ /**
2563
+ * Add a addPool(uint64,uint64)void method call against the Bridge contract
2564
+ */
2565
+ addPool(params) {
2566
+ promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.addPool(params)));
2567
+ resultMappers.push(undefined);
2568
+ return this;
2569
+ },
2570
+ /**
2571
+ * Add a removePool(uint64)void method call against the Bridge contract
2572
+ */
2573
+ removePool(params) {
2574
+ promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.removePool(params)));
2575
+ resultMappers.push(undefined);
2576
+ return this;
2577
+ },
2578
+ /**
2579
+ * Add a stopSwap()void method call against the Bridge contract
2580
+ */
2581
+ stopSwap(params) {
2582
+ promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.stopSwap(params)));
2583
+ resultMappers.push(undefined);
2584
+ return this;
2585
+ },
2586
+ /**
2587
+ * Add a startSwap()void method call against the Bridge contract
2588
+ */
2589
+ startSwap(params) {
2590
+ promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.startSwap(params)));
2591
+ resultMappers.push(undefined);
2592
+ return this;
2593
+ },
2594
+ /**
2595
+ * Add a setStopAuthority(address)void method call against the Bridge contract
2596
+ */
2597
+ setStopAuthority(params) {
2598
+ promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.setStopAuthority(params)));
2599
+ resultMappers.push(undefined);
2600
+ return this;
2601
+ },
2602
+ /**
2603
+ * Add a setRebalancer(address)void method call against the Bridge contract
2604
+ */
2605
+ setRebalancer(params) {
2606
+ promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.setRebalancer(params)));
2607
+ resultMappers.push(undefined);
2608
+ return this;
2609
+ },
2610
+ /**
2611
+ * Add a getGasUsage(byte)uint64 method call against the Bridge contract
2612
+ */
2613
+ getGasUsage(params) {
2614
+ promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.getGasUsage(params)));
2615
+ resultMappers.push((v) => client.decodeReturnValue("getGasUsage(byte)uint64", v));
2616
+ return this;
2617
+ },
2618
+ /**
2619
+ * Add a setGasUsage(byte,uint64)void method call against the Bridge contract
2620
+ */
2621
+ setGasUsage(params) {
2622
+ promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.setGasUsage(params)));
2623
+ resultMappers.push(undefined);
2624
+ return this;
2625
+ },
2626
+ /**
2627
+ * Add a setGasOracle(uint64)void method call against the Bridge contract
2628
+ */
2629
+ setGasOracle(params) {
2630
+ promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.setGasOracle(params)));
2631
+ resultMappers.push(undefined);
2632
+ return this;
2633
+ },
2634
+ /**
2635
+ * Add a getTransactionRelayerCost(byte)uint64 method call against the Bridge contract
2636
+ */
2637
+ getTransactionRelayerCost(params) {
2638
+ promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.getTransactionRelayerCost(params)));
2639
+ resultMappers.push((v) => client.decodeReturnValue("getTransactionRelayerCost(byte)uint64", v));
2640
+ return this;
2641
+ },
2642
+ /**
2643
+ * Add a transferOwnership(address)void method call against the Bridge contract
2644
+ */
2645
+ transferOwnership(params) {
2646
+ promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.transferOwnership(params)));
2647
+ resultMappers.push(undefined);
2648
+ return this;
2649
+ },
2650
+ /**
2651
+ * Add a clear state call to the Bridge contract
2652
+ */
2653
+ clearState(params) {
2654
+ promiseChain = promiseChain.then(() => composer.addAppCall(client.params.clearState(params)));
2655
+ return this;
2656
+ },
2657
+ addTransaction(txn, signer) {
2658
+ promiseChain = promiseChain.then(() => composer.addTransaction(txn, signer));
2659
+ return this;
2660
+ },
2661
+ async composer() {
2662
+ await promiseChain;
2663
+ return composer;
2664
+ },
2665
+ async simulate(options) {
2666
+ await promiseChain;
2667
+ const result = await (!options ? composer.simulate() : composer.simulate(options));
2668
+ return {
2669
+ ...result,
2670
+ returns: result.returns?.map((val, i) => resultMappers[i] !== undefined ? resultMappers[i](val) : val.returnValue),
2671
+ };
2672
+ },
2673
+ async send(params) {
2674
+ await promiseChain;
2675
+ const result = await composer.send(params);
2676
+ return {
2677
+ ...result,
2678
+ returns: result.returns?.map((val, i) => resultMappers[i] !== undefined ? resultMappers[i](val) : val.returnValue),
2679
+ };
2680
+ },
2681
+ };
2682
+ }
2683
+ }
2684
+ exports.BridgeClient = BridgeClient;
2685
+ //# sourceMappingURL=BridgeClient.js.map