@bitgo-beta/sdk-coin-sui 3.0.3-beta.202 → 3.0.3-beta.2021

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 (197) hide show
  1. package/dist/src/index.d.ts +1 -0
  2. package/dist/src/index.d.ts.map +1 -1
  3. package/dist/src/index.js +7 -2
  4. package/dist/src/lib/compareTransactionBlocks.js +2 -3
  5. package/dist/src/lib/constants.d.ts +9 -2
  6. package/dist/src/lib/constants.d.ts.map +1 -1
  7. package/dist/src/lib/constants.js +18 -2
  8. package/dist/src/lib/customTransaction.js +3 -3
  9. package/dist/src/lib/customTransactionBuilder.js +5 -5
  10. package/dist/src/lib/iface.d.ts +80 -12
  11. package/dist/src/lib/iface.d.ts.map +1 -1
  12. package/dist/src/lib/iface.js +34 -5
  13. package/dist/src/lib/index.d.ts +6 -0
  14. package/dist/src/lib/index.d.ts.map +1 -1
  15. package/dist/src/lib/index.js +36 -10
  16. package/dist/src/lib/keyPair.js +24 -10
  17. package/dist/src/lib/mystenlab/builder/Inputs.d.ts +64 -11
  18. package/dist/src/lib/mystenlab/builder/Inputs.d.ts.map +1 -1
  19. package/dist/src/lib/mystenlab/builder/Inputs.js +63 -19
  20. package/dist/src/lib/mystenlab/builder/TransactionBlock.d.ts +88 -355
  21. package/dist/src/lib/mystenlab/builder/TransactionBlock.d.ts.map +1 -1
  22. package/dist/src/lib/mystenlab/builder/TransactionBlock.js +44 -25
  23. package/dist/src/lib/mystenlab/builder/TransactionDataBlock.d.ts +152 -77
  24. package/dist/src/lib/mystenlab/builder/TransactionDataBlock.d.ts.map +1 -1
  25. package/dist/src/lib/mystenlab/builder/TransactionDataBlock.js +54 -44
  26. package/dist/src/lib/mystenlab/builder/Transactions.d.ts +133 -188
  27. package/dist/src/lib/mystenlab/builder/Transactions.d.ts.map +1 -1
  28. package/dist/src/lib/mystenlab/builder/Transactions.js +52 -53
  29. package/dist/src/lib/mystenlab/builder/bcs.d.ts +1 -1
  30. package/dist/src/lib/mystenlab/builder/bcs.d.ts.map +1 -1
  31. package/dist/src/lib/mystenlab/builder/bcs.js +2 -2
  32. package/dist/src/lib/mystenlab/builder/index.js +6 -2
  33. package/dist/src/lib/mystenlab/builder/serializer.js +6 -8
  34. package/dist/src/lib/mystenlab/builder/utils.d.ts +1 -1
  35. package/dist/src/lib/mystenlab/builder/utils.d.ts.map +1 -1
  36. package/dist/src/lib/mystenlab/builder/utils.js +4 -4
  37. package/dist/src/lib/mystenlab/cryptography/hash.js +3 -4
  38. package/dist/src/lib/mystenlab/framework/framework.d.ts +6 -6
  39. package/dist/src/lib/mystenlab/framework/framework.d.ts.map +1 -1
  40. package/dist/src/lib/mystenlab/framework/framework.js +22 -25
  41. package/dist/src/lib/mystenlab/framework/index.js +6 -2
  42. package/dist/src/lib/mystenlab/framework/sui-system-state.js +2 -2
  43. package/dist/src/lib/mystenlab/txn-data-serializers/type-tag-serializer.js +2 -2
  44. package/dist/src/lib/mystenlab/types/coin.d.ts +17 -15
  45. package/dist/src/lib/mystenlab/types/coin.d.ts.map +1 -1
  46. package/dist/src/lib/mystenlab/types/coin.js +20 -19
  47. package/dist/src/lib/mystenlab/types/common.d.ts +8 -8
  48. package/dist/src/lib/mystenlab/types/common.d.ts.map +1 -1
  49. package/dist/src/lib/mystenlab/types/common.js +22 -22
  50. package/dist/src/lib/mystenlab/types/events.d.ts +15 -15
  51. package/dist/src/lib/mystenlab/types/events.d.ts.map +1 -1
  52. package/dist/src/lib/mystenlab/types/events.js +17 -17
  53. package/dist/src/lib/mystenlab/types/index.js +6 -2
  54. package/dist/src/lib/mystenlab/types/normalized.d.ts +21 -21
  55. package/dist/src/lib/mystenlab/types/normalized.d.ts.map +1 -1
  56. package/dist/src/lib/mystenlab/types/normalized.js +41 -41
  57. package/dist/src/lib/mystenlab/types/objects.d.ts +51 -51
  58. package/dist/src/lib/mystenlab/types/objects.d.ts.map +1 -1
  59. package/dist/src/lib/mystenlab/types/objects.js +96 -106
  60. package/dist/src/lib/mystenlab/types/option.d.ts +1 -1
  61. package/dist/src/lib/mystenlab/types/option.d.ts.map +1 -1
  62. package/dist/src/lib/mystenlab/types/option.js +2 -3
  63. package/dist/src/lib/mystenlab/types/sui-bcs.d.ts +55 -29
  64. package/dist/src/lib/mystenlab/types/sui-bcs.d.ts.map +1 -1
  65. package/dist/src/lib/mystenlab/types/sui-bcs.js +29 -5
  66. package/dist/src/lib/mystenlab/types/transactions.d.ts +625 -625
  67. package/dist/src/lib/mystenlab/types/transactions.d.ts.map +1 -1
  68. package/dist/src/lib/mystenlab/types/transactions.js +178 -194
  69. package/dist/src/lib/mystenlab/types/validator.d.ts +13 -13
  70. package/dist/src/lib/mystenlab/types/validator.d.ts.map +1 -1
  71. package/dist/src/lib/mystenlab/types/validator.js +124 -124
  72. package/dist/src/lib/resources/walrusConfig.d.ts +22 -0
  73. package/dist/src/lib/resources/walrusConfig.d.ts.map +1 -0
  74. package/dist/src/lib/resources/walrusConfig.js +37 -0
  75. package/dist/src/lib/rpcClient.d.ts +5 -0
  76. package/dist/src/lib/rpcClient.d.ts.map +1 -0
  77. package/dist/src/lib/rpcClient.js +74 -0
  78. package/dist/src/lib/stakingBuilder.d.ts +10 -0
  79. package/dist/src/lib/stakingBuilder.d.ts.map +1 -1
  80. package/dist/src/lib/stakingBuilder.js +59 -7
  81. package/dist/src/lib/stakingTransaction.d.ts +0 -1
  82. package/dist/src/lib/stakingTransaction.d.ts.map +1 -1
  83. package/dist/src/lib/stakingTransaction.js +36 -18
  84. package/dist/src/lib/tokenTransferBuilder.d.ts +93 -0
  85. package/dist/src/lib/tokenTransferBuilder.d.ts.map +1 -0
  86. package/dist/src/lib/tokenTransferBuilder.js +266 -0
  87. package/dist/src/lib/tokenTransferTransaction.d.ts +59 -0
  88. package/dist/src/lib/tokenTransferTransaction.d.ts.map +1 -0
  89. package/dist/src/lib/tokenTransferTransaction.js +272 -0
  90. package/dist/src/lib/transaction.d.ts +21 -4
  91. package/dist/src/lib/transaction.d.ts.map +1 -1
  92. package/dist/src/lib/transaction.js +144 -17
  93. package/dist/src/lib/transactionBuilder.d.ts +13 -4
  94. package/dist/src/lib/transactionBuilder.d.ts.map +1 -1
  95. package/dist/src/lib/transactionBuilder.js +34 -4
  96. package/dist/src/lib/transactionBuilderFactory.d.ts +11 -2
  97. package/dist/src/lib/transactionBuilderFactory.d.ts.map +1 -1
  98. package/dist/src/lib/transactionBuilderFactory.js +32 -1
  99. package/dist/src/lib/transferBuilder.d.ts +58 -1
  100. package/dist/src/lib/transferBuilder.d.ts.map +1 -1
  101. package/dist/src/lib/transferBuilder.js +310 -24
  102. package/dist/src/lib/transferTransaction.d.ts +6 -1
  103. package/dist/src/lib/transferTransaction.d.ts.map +1 -1
  104. package/dist/src/lib/transferTransaction.js +129 -12
  105. package/dist/src/lib/unstakingBuilder.js +6 -6
  106. package/dist/src/lib/unstakingTransaction.d.ts +0 -1
  107. package/dist/src/lib/unstakingTransaction.d.ts.map +1 -1
  108. package/dist/src/lib/unstakingTransaction.js +31 -17
  109. package/dist/src/lib/utils.d.ts +24 -3
  110. package/dist/src/lib/utils.d.ts.map +1 -1
  111. package/dist/src/lib/utils.js +295 -22
  112. package/dist/src/lib/walrusStakingBuilder.d.ts +77 -0
  113. package/dist/src/lib/walrusStakingBuilder.d.ts.map +1 -0
  114. package/dist/src/lib/walrusStakingBuilder.js +276 -0
  115. package/dist/src/lib/walrusStakingTransaction.d.ts +52 -0
  116. package/dist/src/lib/walrusStakingTransaction.d.ts.map +1 -0
  117. package/dist/src/lib/walrusStakingTransaction.js +289 -0
  118. package/dist/src/lib/walrusWithdrawStakeBuilder.d.ts +36 -0
  119. package/dist/src/lib/walrusWithdrawStakeBuilder.d.ts.map +1 -0
  120. package/dist/src/lib/walrusWithdrawStakeBuilder.js +177 -0
  121. package/dist/src/lib/walrusWithdrawStakeTransaction.d.ts +21 -0
  122. package/dist/src/lib/walrusWithdrawStakeTransaction.d.ts.map +1 -0
  123. package/dist/src/lib/walrusWithdrawStakeTransaction.js +190 -0
  124. package/dist/src/register.d.ts.map +1 -1
  125. package/dist/src/register.js +5 -1
  126. package/dist/src/sui.d.ts +58 -8
  127. package/dist/src/sui.d.ts.map +1 -1
  128. package/dist/src/sui.js +538 -37
  129. package/dist/src/suiToken.d.ts +22 -0
  130. package/dist/src/suiToken.d.ts.map +1 -0
  131. package/dist/src/suiToken.js +61 -0
  132. package/dist/src/tsui.js +1 -1
  133. package/dist/test/integration/index.d.ts +1 -0
  134. package/dist/test/integration/index.d.ts.map +1 -0
  135. package/dist/test/integration/index.js +1 -0
  136. package/dist/test/local_fullnode/RpcClient.d.ts +60 -0
  137. package/dist/test/local_fullnode/RpcClient.d.ts.map +1 -0
  138. package/dist/test/local_fullnode/RpcClient.js +111 -0
  139. package/dist/test/local_fullnode/faucet.d.ts +6 -0
  140. package/dist/test/local_fullnode/faucet.d.ts.map +1 -0
  141. package/dist/test/local_fullnode/faucet.js +17 -0
  142. package/dist/test/local_fullnode/transactions.d.ts +2 -0
  143. package/dist/test/local_fullnode/transactions.d.ts.map +1 -0
  144. package/dist/test/local_fullnode/transactions.js +190 -0
  145. package/dist/test/resources/sui.d.ts +458 -0
  146. package/dist/test/resources/sui.d.ts.map +1 -0
  147. package/dist/test/resources/sui.js +632 -0
  148. package/dist/test/unit/compareTransactionBlocks.d.ts +2 -0
  149. package/dist/test/unit/compareTransactionBlocks.d.ts.map +1 -0
  150. package/dist/test/unit/compareTransactionBlocks.js +64 -0
  151. package/dist/test/unit/getBuilderFactory.d.ts +3 -0
  152. package/dist/test/unit/getBuilderFactory.d.ts.map +1 -0
  153. package/dist/test/unit/getBuilderFactory.js +10 -0
  154. package/dist/test/unit/keyPair.d.ts +2 -0
  155. package/dist/test/unit/keyPair.d.ts.map +1 -0
  156. package/dist/test/unit/keyPair.js +72 -0
  157. package/dist/test/unit/sui.d.ts +2 -0
  158. package/dist/test/unit/sui.d.ts.map +1 -0
  159. package/dist/test/unit/sui.js +2747 -0
  160. package/dist/test/unit/suiToken.d.ts +2 -0
  161. package/dist/test/unit/suiToken.d.ts.map +1 -0
  162. package/dist/test/unit/suiToken.js +39 -0
  163. package/dist/test/unit/transactionBuilder/customTransactionBuilder.d.ts +2 -0
  164. package/dist/test/unit/transactionBuilder/customTransactionBuilder.d.ts.map +1 -0
  165. package/dist/test/unit/transactionBuilder/customTransactionBuilder.js +106 -0
  166. package/dist/test/unit/transactionBuilder/stakingBuilder.d.ts +2 -0
  167. package/dist/test/unit/transactionBuilder/stakingBuilder.d.ts.map +1 -0
  168. package/dist/test/unit/transactionBuilder/stakingBuilder.js +294 -0
  169. package/dist/test/unit/transactionBuilder/tokenTransferBuilder.d.ts +2 -0
  170. package/dist/test/unit/transactionBuilder/tokenTransferBuilder.d.ts.map +1 -0
  171. package/dist/test/unit/transactionBuilder/tokenTransferBuilder.js +431 -0
  172. package/dist/test/unit/transactionBuilder/transactionBuilder.d.ts +2 -0
  173. package/dist/test/unit/transactionBuilder/transactionBuilder.d.ts.map +1 -0
  174. package/dist/test/unit/transactionBuilder/transactionBuilder.js +639 -0
  175. package/dist/test/unit/transactionBuilder/transferBuilder.d.ts +2 -0
  176. package/dist/test/unit/transactionBuilder/transferBuilder.d.ts.map +1 -0
  177. package/dist/test/unit/transactionBuilder/transferBuilder.js +1181 -0
  178. package/dist/test/unit/transactionBuilder/unstakingBuilder.d.ts +2 -0
  179. package/dist/test/unit/transactionBuilder/unstakingBuilder.d.ts.map +1 -0
  180. package/dist/test/unit/transactionBuilder/unstakingBuilder.js +115 -0
  181. package/dist/test/unit/transactionBuilder/walrusStakingBuilder.d.ts +2 -0
  182. package/dist/test/unit/transactionBuilder/walrusStakingBuilder.d.ts.map +1 -0
  183. package/dist/test/unit/transactionBuilder/walrusStakingBuilder.js +289 -0
  184. package/dist/test/unit/transactionBuilder/walrusWithdrawBuilder.d.ts +2 -0
  185. package/dist/test/unit/transactionBuilder/walrusWithdrawBuilder.d.ts.map +1 -0
  186. package/dist/test/unit/transactionBuilder/walrusWithdrawBuilder.js +250 -0
  187. package/dist/test/unit/transferTransaction.d.ts +2 -0
  188. package/dist/test/unit/transferTransaction.d.ts.map +1 -0
  189. package/dist/test/unit/transferTransaction.js +94 -0
  190. package/dist/test/unit/utils.d.ts +2 -0
  191. package/dist/test/unit/utils.d.ts.map +1 -0
  192. package/dist/test/unit/utils.js +186 -0
  193. package/dist/tsconfig.tsbuildinfo +1 -0
  194. package/package.json +16 -12
  195. package/.eslintignore +0 -6
  196. package/.mocharc.yml +0 -7
  197. package/CHANGELOG.md +0 -465
@@ -0,0 +1,186 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ var __importDefault = (this && this.__importDefault) || function (mod) {
36
+ return (mod && mod.__esModule) ? mod : { "default": mod };
37
+ };
38
+ Object.defineProperty(exports, "__esModule", { value: true });
39
+ const should_1 = __importDefault(require("should"));
40
+ const testData = __importStar(require("../resources/sui"));
41
+ const utils_1 = __importDefault(require("../../src/lib/utils"));
42
+ const nock_1 = __importDefault(require("nock"));
43
+ describe('Sui util library', function () {
44
+ describe('isValidAddress', function () {
45
+ it('should succeed to validate valid address', function () {
46
+ for (const address of testData.addresses.validAddresses) {
47
+ should_1.default.equal(utils_1.default.isValidAddress(address), true);
48
+ }
49
+ });
50
+ it('should fail to validate invalid addresses', function () {
51
+ for (const address of testData.addresses.invalidAddresses) {
52
+ should_1.default.doesNotThrow(() => utils_1.default.isValidAddress(address));
53
+ should_1.default.equal(utils_1.default.isValidAddress(address), false);
54
+ }
55
+ // @ts-expect-error Testing for missing param, should not throw an error
56
+ should_1.default.doesNotThrow(() => utils_1.default.isValidAddress(undefined));
57
+ // @ts-expect-error Testing for missing param, should return false
58
+ should_1.default.equal(utils_1.default.isValidAddress(undefined), false);
59
+ });
60
+ });
61
+ describe('isValidRawTransaction', function () {
62
+ it('should succeed to validate a valid raw transaction', function () {
63
+ should_1.default.equal(utils_1.default.isValidRawTransaction(testData.TRANSFER), true);
64
+ });
65
+ it('should fail to validate an invalid raw transaction', function () {
66
+ should_1.default.doesNotThrow(() => utils_1.default.isValidRawTransaction(testData.INVALID_RAW_TX));
67
+ should_1.default.equal(utils_1.default.isValidRawTransaction(testData.INVALID_RAW_TX), false);
68
+ });
69
+ });
70
+ describe('normalizeHexId', function () {
71
+ it('should succeed to normalize hexId with no prefix', function () {
72
+ const hexId = 'cba4a48bb0f8b586c167e5dcefaa1c5e96ab3f08';
73
+ const expectedNormalized = '0xcba4a48bb0f8b586c167e5dcefaa1c5e96ab3f08';
74
+ should_1.default.equal(utils_1.default.normalizeHexId(hexId), expectedNormalized);
75
+ });
76
+ it('should return the hexId with prefix already', function () {
77
+ const hexId = '0xcba4a48bb0f8b586c167e5dcefaa1c5e96ab3f08';
78
+ should_1.default.equal(utils_1.default.normalizeHexId(hexId), hexId);
79
+ });
80
+ });
81
+ describe('getBalance', function () {
82
+ const nodeUrl = 'https://fullnode.testnet.sui.io';
83
+ const owner = '0xb7db6234a33f1e35f7114dac69574c6b7b193f3c4a0801e5ddb9fae4009af637';
84
+ afterEach(function () {
85
+ nock_1.default.cleanAll();
86
+ });
87
+ it('should return all funds in address balance when fundsInAddressBalance equals totalBalance', async function () {
88
+ // Real response from testnet: all 2 SUI held in address balance, not in coin objects
89
+ (0, nock_1.default)(nodeUrl)
90
+ .post('/')
91
+ .reply(200, {
92
+ jsonrpc: '2.0',
93
+ id: 1,
94
+ result: {
95
+ coinType: '0x2::sui::SUI',
96
+ coinObjectCount: 1,
97
+ totalBalance: '2000000',
98
+ lockedBalance: {},
99
+ fundsInAddressBalance: '2000000',
100
+ },
101
+ });
102
+ const balanceInfo = await utils_1.default.getBalance(nodeUrl, owner);
103
+ balanceInfo.totalBalance.should.equal('2000000');
104
+ balanceInfo.fundsInAddressBalance.should.equal('2000000');
105
+ balanceInfo.coinObjectBalance.should.equal('0');
106
+ });
107
+ it('should correctly split totalBalance into coinObjectBalance and fundsInAddressBalance', async function () {
108
+ (0, nock_1.default)(nodeUrl)
109
+ .post('/')
110
+ .reply(200, {
111
+ jsonrpc: '2.0',
112
+ id: 1,
113
+ result: {
114
+ coinType: '0x2::sui::SUI',
115
+ coinObjectCount: 2,
116
+ totalBalance: '1900000000',
117
+ lockedBalance: {},
118
+ fundsInAddressBalance: '900000000',
119
+ },
120
+ });
121
+ const balanceInfo = await utils_1.default.getBalance(nodeUrl, owner);
122
+ balanceInfo.totalBalance.should.equal('1900000000');
123
+ balanceInfo.fundsInAddressBalance.should.equal('900000000');
124
+ balanceInfo.coinObjectBalance.should.equal('1000000000');
125
+ });
126
+ it('should handle legacy response without fundsInAddressBalance (all funds in coin objects)', async function () {
127
+ (0, nock_1.default)(nodeUrl)
128
+ .post('/')
129
+ .reply(200, {
130
+ jsonrpc: '2.0',
131
+ id: 1,
132
+ result: {
133
+ coinType: '0x2::sui::SUI',
134
+ coinObjectCount: 1,
135
+ totalBalance: '1900000000',
136
+ lockedBalance: {},
137
+ },
138
+ });
139
+ const balanceInfo = await utils_1.default.getBalance(nodeUrl, owner);
140
+ balanceInfo.totalBalance.should.equal('1900000000');
141
+ balanceInfo.fundsInAddressBalance.should.equal('0');
142
+ balanceInfo.coinObjectBalance.should.equal('1900000000');
143
+ });
144
+ it('should return zero balances for an empty account', async function () {
145
+ (0, nock_1.default)(nodeUrl)
146
+ .post('/')
147
+ .reply(200, {
148
+ jsonrpc: '2.0',
149
+ id: 1,
150
+ result: {
151
+ coinType: '0x2::sui::SUI',
152
+ coinObjectCount: 0,
153
+ totalBalance: '0',
154
+ lockedBalance: {},
155
+ fundsInAddressBalance: '0',
156
+ },
157
+ });
158
+ const balanceInfo = await utils_1.default.getBalance(nodeUrl, owner);
159
+ balanceInfo.totalBalance.should.equal('0');
160
+ balanceInfo.fundsInAddressBalance.should.equal('0');
161
+ balanceInfo.coinObjectBalance.should.equal('0');
162
+ });
163
+ it('should query with a custom coin type', async function () {
164
+ const packageId = '0x36dbef866a1d62bf7328989a10fb2f07d769f4ee587c0de4a0a256e57e0a58a8';
165
+ const coinType = `${packageId}::deep::DEEP`;
166
+ (0, nock_1.default)(nodeUrl)
167
+ .post('/', (body) => body.params[1] === coinType)
168
+ .reply(200, {
169
+ jsonrpc: '2.0',
170
+ id: 1,
171
+ result: {
172
+ coinType,
173
+ coinObjectCount: 1,
174
+ totalBalance: '1000',
175
+ lockedBalance: {},
176
+ fundsInAddressBalance: '0',
177
+ },
178
+ });
179
+ const balanceInfo = await utils_1.default.getBalance(nodeUrl, owner, coinType);
180
+ balanceInfo.totalBalance.should.equal('1000');
181
+ balanceInfo.fundsInAddressBalance.should.equal('0');
182
+ balanceInfo.coinObjectBalance.should.equal('1000');
183
+ });
184
+ });
185
+ });
186
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi90ZXN0L3VuaXQvdXRpbHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSxvREFBNEI7QUFDNUIsMkRBQTZDO0FBQzdDLGdFQUF3QztBQUN4QyxnREFBd0I7QUFFeEIsUUFBUSxDQUFDLGtCQUFrQixFQUFFO0lBQzNCLFFBQVEsQ0FBQyxnQkFBZ0IsRUFBRTtRQUN6QixFQUFFLENBQUMsMENBQTBDLEVBQUU7WUFDN0MsS0FBSyxNQUFNLE9BQU8sSUFBSSxRQUFRLENBQUMsU0FBUyxDQUFDLGNBQWMsRUFBRSxDQUFDO2dCQUN4RCxnQkFBTSxDQUFDLEtBQUssQ0FBQyxlQUFLLENBQUMsY0FBYyxDQUFDLE9BQU8sQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDO1lBQ3BELENBQUM7UUFDSCxDQUFDLENBQUMsQ0FBQztRQUNILEVBQUUsQ0FBQywyQ0FBMkMsRUFBRTtZQUM5QyxLQUFLLE1BQU0sT0FBTyxJQUFJLFFBQVEsQ0FBQyxTQUFTLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztnQkFDMUQsZ0JBQU0sQ0FBQyxZQUFZLENBQUMsR0FBRyxFQUFFLENBQUMsZUFBSyxDQUFDLGNBQWMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDO2dCQUN6RCxnQkFBTSxDQUFDLEtBQUssQ0FBQyxlQUFLLENBQUMsY0FBYyxDQUFDLE9BQU8sQ0FBQyxFQUFFLEtBQUssQ0FBQyxDQUFDO1lBQ3JELENBQUM7WUFDRCx3RUFBd0U7WUFDeEUsZ0JBQU0sQ0FBQyxZQUFZLENBQUMsR0FBRyxFQUFFLENBQUMsZUFBSyxDQUFDLGNBQWMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDO1lBQzNELGtFQUFrRTtZQUNsRSxnQkFBTSxDQUFDLEtBQUssQ0FBQyxlQUFLLENBQUMsY0FBYyxDQUFDLFNBQVMsQ0FBQyxFQUFFLEtBQUssQ0FBQyxDQUFD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RTtnQkFDVixPQUFPLEVBQUUsS0FBSztnQkFDZCxFQUFFLEVBQUUsQ0FBQztnQkFDTCxNQUFNLEVBQUU7b0JBQ04sUUFBUTtvQkFDUixlQUFlLEVBQUUsQ0FBQztvQkFDbEIsWUFBWSxFQUFFLE1BQU07b0JBQ3BCLGFBQWEsRUFBRSxFQUFFO29CQUNqQixxQkFBcUIsRUFBRSxHQUFHO2lCQUMzQjthQUNGLENBQUMsQ0FBQztZQUVMLE1BQU0sV0FBVyxHQUFHLE1BQU0sZUFBSyxDQUFDLFVBQVUsQ0FBQyxPQUFPLEVBQUUsS0FBSyxFQUFFLFFBQVEsQ0FBQyxDQUFDO1lBQ3JFLFdBQVcsQ0FBQyxZQUFZLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUM5QyxXQUFXLENBQUMscUJBQXFCLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUNwRCxXQUFXLENBQUMsaUJBQWlCLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUNyRCxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgc2hvdWxkIGZyb20gJ3Nob3VsZCc7XG5pbXBvcnQgKiBhcyB0ZXN0RGF0YSBmcm9tICcuLi9yZXNvdXJjZXMvc3VpJztcbmltcG9ydCB1dGlscyBmcm9tICcuLi8uLi9zcmMvbGliL3V0aWxzJztcbmltcG9ydCBub2NrIGZyb20gJ25vY2snO1xuXG5kZXNjcmliZSgnU3VpIHV0aWwgbGlicmFyeScsIGZ1bmN0aW9uICgpIHtcbiAgZGVzY3JpYmUoJ2lzVmFsaWRBZGRyZXNzJywgZnVuY3Rpb24gKCkge1xuICAgIGl0KCdzaG91bGQgc3VjY2VlZCB0byB2YWxpZGF0ZSB2YWxpZCBhZGRyZXNzJywgZnVuY3Rpb24gKCkge1xuICAgICAgZm9yIChjb25zdCBhZGRyZXNzIG9mIHRlc3REYXRhLmFkZHJlc3Nlcy52YWxpZEFkZHJlc3Nlcykge1xuICAgICAgICBzaG91bGQuZXF1YWwodXRpbHMuaXNWYWxpZEFkZHJlc3MoYWRkcmVzcyksIHRydWUpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIGl0KCdzaG91bGQgZmFpbCB0byB2YWxpZGF0ZSBpbnZhbGlkIGFkZHJlc3NlcycsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGZvciAoY29uc3QgYWRkcmVzcyBvZiB0ZXN0RGF0YS5hZGRyZXNzZXMuaW52YWxpZEFkZHJlc3Nlcykge1xuICAgICAgICBzaG91bGQuZG9lc05vdFRocm93KCgpID0+IHV0aWxzLmlzVmFsaWRBZGRyZXNzKGFkZHJlc3MpKTtcbiAgICAgICAgc2hvdWxkLmVxdWFsKHV0aWxzLmlzVmFsaWRBZGRyZXNzKGFkZHJlc3MpLCBmYWxzZSk7XG4gICAgICB9XG4gICAgICAvLyBAdHMtZXhwZWN0LWVycm9yIFRlc3RpbmcgZm9yIG1pc3NpbmcgcGFyYW0sIHNob3VsZCBub3QgdGhyb3cgYW4gZXJyb3JcbiAgICAgIHNob3VsZC5kb2VzTm90VGhyb3coKCkgPT4gdXRpbHMuaXNWYWxpZEFkZHJlc3ModW5kZWZpbmVkKSk7XG4gICAgICAvLyBAdHMtZXhwZWN0LWVycm9yIFRlc3RpbmcgZm9yIG1pc3NpbmcgcGFyYW0sIHNob3VsZCByZXR1cm4gZmFsc2VcbiAgICAgIHNob3VsZC5lcXVhbCh1dGlscy5pc1ZhbGlkQWRkcmVzcyh1bmRlZmluZWQpLCBmYWxzZSk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdpc1ZhbGlkUmF3VHJhbnNhY3Rpb24nLCBmdW5jdGlvbiAoKSB7XG4gICAgaXQoJ3Nob3VsZCBzdWNjZWVkIHRvIHZhbGlkYXRlIGEgdmFsaWQgcmF3IHRyYW5zYWN0aW9uJywgZnVuY3Rpb24gKCkge1xuICAgICAgc2hvdWxkLmVxdWFsKHV0aWxzLmlzVmFsaWRSYXdUcmFuc2FjdGlvbih0ZXN0RGF0YS5UUkFOU0ZFUiksIHRydWUpO1xuICAgIH0pO1xuICAgIGl0KCdzaG91bGQgZmFpbCB0byB2YWxpZGF0ZSBhbiBpbnZhbGlkIHJhdyB0cmFuc2FjdGlvbicsIGZ1bmN0aW9uICgpIHtcbiAgICAgIHNob3VsZC5kb2VzTm90VGhyb3coKCkgPT4gdXRpbHMuaXNWYWxpZFJhd1RyYW5zYWN0aW9uKHRlc3REYXRhLklOVkFMSURfUkFXX1RYKSk7XG4gICAgICBzaG91bGQuZXF1YWwodXRpbHMuaXNWYWxpZFJhd1RyYW5zYWN0aW9uKHRlc3REYXRhLklOVkFMSURfUkFXX1RYKSwgZmFsc2UpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnbm9ybWFsaXplSGV4SWQnLCBmdW5jdGlvbiAoKSB7XG4gICAgaXQoJ3Nob3VsZCBzdWNjZWVkIHRvIG5vcm1hbGl6ZSBoZXhJZCB3aXRoIG5vIHByZWZpeCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IGhleElkID0gJ2NiYTRhNDhiYjBmOGI1ODZjMTY3ZTVkY2VmYWExYzVlOTZhYjNmMDgnO1xuICAgICAgY29uc3QgZXhwZWN0ZWROb3JtYWxpemVkID0gJzB4Y2JhNGE0OGJiMGY4YjU4NmMxNjdlNWRjZWZhYTFjNWU5NmFiM2YwOCc7XG4gICAgICBzaG91bGQuZXF1YWwodXRpbHMubm9ybWFsaXplSGV4SWQoaGV4SWQpLCBleHBlY3RlZE5vcm1hbGl6ZWQpO1xuICAgIH0pO1xuICAgIGl0KCdzaG91bGQgcmV0dXJuIHRoZSBoZXhJZCB3aXRoIHByZWZpeCBhbHJlYWR5JywgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgaGV4SWQgPSAnMHhjYmE0YTQ4YmIwZjhiNTg2YzE2N2U1ZGNlZmFhMWM1ZTk2YWIzZjA4JztcbiAgICAgIHNob3VsZC5lcXVhbCh1dGlscy5ub3JtYWxpemVIZXhJZChoZXhJZCksIGhleElkKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ2dldEJhbGFuY2UnLCBmdW5jdGlvbiAoKSB7XG4gICAgY29uc3Qgbm9kZVVybCA9ICdodHRwczovL2Z1bGxub2RlLnRlc3RuZXQuc3VpLmlvJztcbiAgICBjb25zdCBvd25lciA9ICcweGI3ZGI2MjM0YTMzZjFlMzVmNzExNGRhYzY5NTc0YzZiN2IxOTNmM2M0YTA4MDFlNWRkYjlmYWU0MDA5YWY2MzcnO1xuXG4gICAgYWZ0ZXJFYWNoKGZ1bmN0aW9uICgpIHtcbiAgICAgIG5vY2suY2xlYW5BbGwoKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgcmV0dXJuIGFsbCBmdW5kcyBpbiBhZGRyZXNzIGJhbGFuY2Ugd2hlbiBmdW5kc0luQWRkcmVzc0JhbGFuY2UgZXF1YWxzIHRvdGFsQmFsYW5jZScsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIC8vIFJlYWwgcmVzcG9uc2UgZnJvbSB0ZXN0bmV0OiBhbGwgMiBTVUkgaGVsZCBpbiBhZGRyZXNzIGJhbGFuY2UsIG5vdCBpbiBjb2luIG9iamVjdHNcbiAgICAgIG5vY2sobm9kZVVybClcbiAgICAgICAgLnBvc3QoJy8nKVxuICAgICAgICAucmVwbHkoMjAwLCB7XG4gICAgICAgICAganNvbnJwYzogJzIuMCcsXG4gICAgICAgICAgaWQ6IDEsXG4gICAgICAgICAgcmVzdWx0OiB7XG4gICAgICAgICAgICBjb2luVHlwZTogJzB4Mjo6c3VpOjpTVUknLFxuICAgICAgICAgICAgY29pbk9iamVjdENvdW50OiAxLFxuICAgICAgICAgICAgdG90YWxCYWxhbmNlOiAnMjAwMDAwMCcsXG4gICAgICAgICAgICBsb2NrZWRCYWxhbmNlOiB7fSxcbiAgICAgICAgICAgIGZ1bmRzSW5BZGRyZXNzQmFsYW5jZTogJzIwMDAwMDAnLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0pO1xuXG4gICAgICBjb25zdCBiYWxhbmNlSW5mbyA9IGF3YWl0IHV0aWxzLmdldEJhbGFuY2Uobm9kZVVybCwgb3duZXIpO1xuICAgICAgYmFsYW5jZUluZm8udG90YWxCYWxhbmNlLnNob3VsZC5lcXVhbCgnMjAwMDAwMCcpO1xuICAgICAgYmFsYW5jZUluZm8uZnVuZHNJbkFkZHJlc3NCYWxhbmNlLnNob3VsZC5lcXVhbCgnMjAwMDAwMCcpO1xuICAgICAgYmFsYW5jZUluZm8uY29pbk9iamVjdEJhbGFuY2Uuc2hvdWxkLmVxdWFsKCcwJyk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGNvcnJlY3RseSBzcGxpdCB0b3RhbEJhbGFuY2UgaW50byBjb2luT2JqZWN0QmFsYW5jZSBhbmQgZnVuZHNJbkFkZHJlc3NCYWxhbmNlJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgbm9jayhub2RlVXJsKVxuICAgICAgICAucG9zdCgnLycpXG4gICAgICAgIC5yZXBseSgyMDAsIHtcbiAgICAgICAgICBqc29ucnBjOiAnMi4wJyxcbiAgICAgICAgICBpZDogMSxcbiAgICAgICAgICByZXN1bHQ6IHtcbiAgICAgICAgICAgIGNvaW5UeXBlOiAnMHgyOjpzdWk6OlNVSScsXG4gICAgICAgICAgICBjb2luT2JqZWN0Q291bnQ6IDIsXG4gICAgICAgICAgICB0b3RhbEJhbGFuY2U6ICcxOTAwMDAwMDAwJyxcbiAgICAgICAgICAgIGxvY2tlZEJhbGFuY2U6IHt9LFxuICAgICAgICAgICAgZnVuZHNJbkFkZHJlc3NCYWxhbmNlOiAnOTAwMDAwMDAwJyxcbiAgICAgICAgICB9LFxuICAgICAgICB9KTtcblxuICAgICAgY29uc3QgYmFsYW5jZUluZm8gPSBhd2FpdCB1dGlscy5nZXRCYWxhbmNlKG5vZGVVcmwsIG93bmVyKTtcbiAgICAgIGJhbGFuY2VJbmZvLnRvdGFsQmFsYW5jZS5zaG91bGQuZXF1YWwoJzE5MDAwMDAwMDAnKTtcbiAgICAgIGJhbGFuY2VJbmZvLmZ1bmRzSW5BZGRyZXNzQmFsYW5jZS5zaG91bGQuZXF1YWwoJzkwMDAwMDAwMCcpO1xuICAgICAgYmFsYW5jZUluZm8uY29pbk9iamVjdEJhbGFuY2Uuc2hvdWxkLmVxdWFsKCcxMDAwMDAwMDAwJyk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGhhbmRsZSBsZWdhY3kgcmVzcG9uc2Ugd2l0aG91dCBmdW5kc0luQWRkcmVzc0JhbGFuY2UgKGFsbCBmdW5kcyBpbiBjb2luIG9iamVjdHMpJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgbm9jayhub2RlVXJsKVxuICAgICAgICAucG9zdCgnLycpXG4gICAgICAgIC5yZXBseSgyMDAsIHtcbiAgICAgICAgICBqc29ucnBjOiAnMi4wJyxcbiAgICAgICAgICBpZDogMSxcbiAgICAgICAgICByZXN1bHQ6IHtcbiAgICAgICAgICAgIGNvaW5UeXBlOiAnMHgyOjpzdWk6OlNVSScsXG4gICAgICAgICAgICBjb2luT2JqZWN0Q291bnQ6IDEsXG4gICAgICAgICAgICB0b3RhbEJhbGFuY2U6ICcxOTAwMDAwMDAwJyxcbiAgICAgICAgICAgIGxvY2tlZEJhbGFuY2U6IHt9LFxuICAgICAgICAgIH0sXG4gICAgICAgIH0pO1xuXG4gICAgICBjb25zdCBiYWxhbmNlSW5mbyA9IGF3YWl0IHV0aWxzLmdldEJhbGFuY2Uobm9kZVVybCwgb3duZXIpO1xuICAgICAgYmFsYW5jZUluZm8udG90YWxCYWxhbmNlLnNob3VsZC5lcXVhbCgnMTkwMDAwMDAwMCcpO1xuICAgICAgYmFsYW5jZUluZm8uZnVuZHNJbkFkZHJlc3NCYWxhbmNlLnNob3VsZC5lcXVhbCgnMCcpO1xuICAgICAgYmFsYW5jZUluZm8uY29pbk9iamVjdEJhbGFuY2Uuc2hvdWxkLmVxdWFsKCcxOTAwMDAwMDAwJyk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHJldHVybiB6ZXJvIGJhbGFuY2VzIGZvciBhbiBlbXB0eSBhY2NvdW50JywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgbm9jayhub2RlVXJsKVxuICAgICAgICAucG9zdCgnLycpXG4gICAgICAgIC5yZXBseSgyMDAsIHtcbiAgICAgICAgICBqc29ucnBjOiAnMi4wJyxcbiAgICAgICAgICBpZDogMSxcbiAgICAgICAgICByZXN1bHQ6IHtcbiAgICAgICAgICAgIGNvaW5UeXBlOiAnMHgyOjpzdWk6OlNVSScsXG4gICAgICAgICAgICBjb2luT2JqZWN0Q291bnQ6IDAsXG4gICAgICAgICAgICB0b3RhbEJhbGFuY2U6ICcwJyxcbiAgICAgICAgICAgIGxvY2tlZEJhbGFuY2U6IHt9LFxuICAgICAgICAgICAgZnVuZHNJbkFkZHJlc3NCYWxhbmNlOiAnMCcsXG4gICAgICAgICAgfSxcbiAgICAgICAgfSk7XG5cbiAgICAgIGNvbnN0IGJhbGFuY2VJbmZvID0gYXdhaXQgdXRpbHMuZ2V0QmFsYW5jZShub2RlVXJsLCBvd25lcik7XG4gICAgICBiYWxhbmNlSW5mby50b3RhbEJhbGFuY2Uuc2hvdWxkLmVxdWFsKCcwJyk7XG4gICAgICBiYWxhbmNlSW5mby5mdW5kc0luQWRkcmVzc0JhbGFuY2Uuc2hvdWxkLmVxdWFsKCcwJyk7XG4gICAgICBiYWxhbmNlSW5mby5jb2luT2JqZWN0QmFsYW5jZS5zaG91bGQuZXF1YWwoJzAnKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgcXVlcnkgd2l0aCBhIGN1c3RvbSBjb2luIHR5cGUnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBwYWNrYWdlSWQgPSAnMHgzNmRiZWY4NjZhMWQ2MmJmNzMyODk4OWExMGZiMmYwN2Q3NjlmNGVlNTg3YzBkZTRhMGEyNTZlNTdlMGE1OGE4JztcbiAgICAgIGNvbnN0IGNvaW5UeXBlID0gYCR7cGFja2FnZUlkfTo6ZGVlcDo6REVFUGA7XG5cbiAgICAgIG5vY2sobm9kZVVybClcbiAgICAgICAgLnBvc3QoJy8nLCAoYm9keSkgPT4gYm9keS5wYXJhbXNbMV0gPT09IGNvaW5UeXBlKVxuICAgICAgICAucmVwbHkoMjAwLCB7XG4gICAgICAgICAganNvbnJwYzogJzIuMCcsXG4gICAgICAgICAgaWQ6IDEsXG4gICAgICAgICAgcmVzdWx0OiB7XG4gICAgICAgICAgICBjb2luVHlwZSxcbiAgICAgICAgICAgIGNvaW5PYmplY3RDb3VudDogMSxcbiAgICAgICAgICAgIHRvdGFsQmFsYW5jZTogJzEwMDAnLFxuICAgICAgICAgICAgbG9ja2VkQmFsYW5jZToge30sXG4gICAgICAgICAgICBmdW5kc0luQWRkcmVzc0JhbGFuY2U6ICcwJyxcbiAgICAgICAgICB9LFxuICAgICAgICB9KTtcblxuICAgICAgY29uc3QgYmFsYW5jZUluZm8gPSBhd2FpdCB1dGlscy5nZXRCYWxhbmNlKG5vZGVVcmwsIG93bmVyLCBjb2luVHlwZSk7XG4gICAgICBiYWxhbmNlSW5mby50b3RhbEJhbGFuY2Uuc2hvdWxkLmVxdWFsKCcxMDAwJyk7XG4gICAgICBiYWxhbmNlSW5mby5mdW5kc0luQWRkcmVzc0JhbGFuY2Uuc2hvdWxkLmVxdWFsKCcwJyk7XG4gICAgICBiYWxhbmNlSW5mby5jb2luT2JqZWN0QmFsYW5jZS5zaG91bGQuZXF1YWwoJzEwMDAnKTtcbiAgICB9KTtcbiAgfSk7XG59KTtcbiJdfQ==