@bitgo-beta/sdk-coin-sol 7.6.4-beta.613 → 7.6.4-beta.615

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 (76) hide show
  1. package/dist/cjs/src/lib/constants.d.ts +21 -2
  2. package/dist/cjs/src/lib/constants.d.ts.map +1 -1
  3. package/dist/cjs/src/lib/constants.js +22 -2
  4. package/dist/cjs/src/lib/iface.d.ts +59 -2
  5. package/dist/cjs/src/lib/iface.d.ts.map +1 -1
  6. package/dist/cjs/src/lib/iface.js +1 -1
  7. package/dist/cjs/src/lib/index.d.ts +1 -0
  8. package/dist/cjs/src/lib/index.d.ts.map +1 -1
  9. package/dist/cjs/src/lib/index.js +6 -2
  10. package/dist/cjs/src/lib/instructionParamsFactory.d.ts +2 -1
  11. package/dist/cjs/src/lib/instructionParamsFactory.d.ts.map +1 -1
  12. package/dist/cjs/src/lib/instructionParamsFactory.js +42 -1
  13. package/dist/cjs/src/lib/solInstructionFactory.d.ts.map +1 -1
  14. package/dist/cjs/src/lib/solInstructionFactory.js +60 -20
  15. package/dist/cjs/src/lib/token2022Resolve.d.ts +106 -0
  16. package/dist/cjs/src/lib/token2022Resolve.d.ts.map +1 -0
  17. package/dist/cjs/src/lib/token2022Resolve.js +199 -0
  18. package/dist/cjs/src/lib/tokenTransferBuilder.d.ts +27 -1
  19. package/dist/cjs/src/lib/tokenTransferBuilder.d.ts.map +1 -1
  20. package/dist/cjs/src/lib/tokenTransferBuilder.js +44 -3
  21. package/dist/cjs/src/lib/transferBuilderV2.d.ts +27 -1
  22. package/dist/cjs/src/lib/transferBuilderV2.d.ts.map +1 -1
  23. package/dist/cjs/src/lib/transferBuilderV2.js +44 -3
  24. package/dist/cjs/src/lib/utils.d.ts.map +1 -1
  25. package/dist/cjs/src/lib/utils.js +4 -1
  26. package/dist/cjs/src/sol.d.ts +58 -2
  27. package/dist/cjs/src/sol.d.ts.map +1 -1
  28. package/dist/cjs/src/sol.js +90 -1
  29. package/dist/cjs/test/unit/sol.js +248 -1
  30. package/dist/cjs/test/unit/solInstructionFactory.js +127 -17
  31. package/dist/cjs/test/unit/token2022Resolve.d.ts +2 -0
  32. package/dist/cjs/test/unit/token2022Resolve.d.ts.map +1 -0
  33. package/dist/cjs/test/unit/token2022Resolve.js +252 -0
  34. package/dist/cjs/test/unit/transactionBuilder/tokenTransferBuilder.js +100 -1
  35. package/dist/cjs/tsconfig.tsbuildinfo +1 -1
  36. package/dist/esm/lib/constants.d.ts +21 -2
  37. package/dist/esm/lib/constants.d.ts.map +1 -1
  38. package/dist/esm/lib/constants.js +21 -1
  39. package/dist/esm/lib/iface.d.ts +59 -2
  40. package/dist/esm/lib/iface.d.ts.map +1 -1
  41. package/dist/esm/lib/iface.js +1 -1
  42. package/dist/esm/lib/index.d.ts +1 -0
  43. package/dist/esm/lib/index.d.ts.map +1 -1
  44. package/dist/esm/lib/index.js +2 -1
  45. package/dist/esm/lib/instructionParamsFactory.d.ts +2 -1
  46. package/dist/esm/lib/instructionParamsFactory.d.ts.map +1 -1
  47. package/dist/esm/lib/instructionParamsFactory.js +41 -1
  48. package/dist/esm/lib/solInstructionFactory.d.ts.map +1 -1
  49. package/dist/esm/lib/solInstructionFactory.js +61 -21
  50. package/dist/esm/lib/token2022Resolve.d.ts +106 -0
  51. package/dist/esm/lib/token2022Resolve.d.ts.map +1 -0
  52. package/dist/esm/lib/token2022Resolve.js +194 -0
  53. package/dist/esm/lib/tokenTransferBuilder.d.ts +27 -1
  54. package/dist/esm/lib/tokenTransferBuilder.d.ts.map +1 -1
  55. package/dist/esm/lib/tokenTransferBuilder.js +44 -3
  56. package/dist/esm/lib/transferBuilderV2.d.ts +27 -1
  57. package/dist/esm/lib/transferBuilderV2.d.ts.map +1 -1
  58. package/dist/esm/lib/transferBuilderV2.js +44 -3
  59. package/dist/esm/lib/utils.d.ts.map +1 -1
  60. package/dist/esm/lib/utils.js +5 -2
  61. package/dist/esm/sol.d.ts +58 -2
  62. package/dist/esm/sol.d.ts.map +1 -1
  63. package/dist/esm/sol.js +90 -1
  64. package/package.json +7 -7
  65. package/dist/cjs/src/config/token2022StaticConfig.d.ts +0 -3
  66. package/dist/cjs/src/config/token2022StaticConfig.d.ts.map +0 -1
  67. package/dist/cjs/src/config/token2022StaticConfig.js +0 -50
  68. package/dist/cjs/src/lib/token2022Config.d.ts +0 -44
  69. package/dist/cjs/src/lib/token2022Config.d.ts.map +0 -1
  70. package/dist/cjs/src/lib/token2022Config.js +0 -27
  71. package/dist/esm/config/token2022StaticConfig.d.ts +0 -3
  72. package/dist/esm/config/token2022StaticConfig.d.ts.map +0 -1
  73. package/dist/esm/config/token2022StaticConfig.js +0 -47
  74. package/dist/esm/lib/token2022Config.d.ts +0 -44
  75. package/dist/esm/lib/token2022Config.d.ts.map +0 -1
  76. package/dist/esm/lib/token2022Config.js +0 -23
@@ -0,0 +1,199 @@
1
+ "use strict";
2
+ /**
3
+ * @prettier
4
+ *
5
+ * Reusable Token-2022 resolution logic (Transfer Hook extra accounts and sRFC-37
6
+ * Token ACL permissionless thaw), decoupled from the `Sol` coin class so any caller
7
+ * with its own account-fetcher (e.g. wallet-platform reading chain state via IMS RPC)
8
+ * can resolve these dependencies offline of the SDK's node transport.
9
+ *
10
+ * The resolution functions take a `Connection` (only `getAccountInfo` is required);
11
+ * {@link buildSolAccountConnection} adapts a plain {@link SolAccountFetcher} into the
12
+ * shape `@solana/spl-token`'s transfer-hook helpers expect.
13
+ */
14
+ Object.defineProperty(exports, "__esModule", { value: true });
15
+ exports.buildSolAccountConnection = buildSolAccountConnection;
16
+ exports.resolveTransferHookAccounts = resolveTransferHookAccounts;
17
+ exports.resolvePermissionlessThaw = resolvePermissionlessThaw;
18
+ const spl_token_1 = require("@solana/spl-token");
19
+ const web3_js_1 = require("@solana/web3.js");
20
+ const constants_1 = require("./constants");
21
+ /**
22
+ * Build a minimal `Connection`-like shim backed by a {@link SolAccountFetcher}.
23
+ *
24
+ * `@solana/spl-token`'s transfer-hook resolution helpers only require
25
+ * `getAccountInfo(publicKey)` returning an `AccountInfo<Buffer>`. This adapts a
26
+ * plain address-based fetcher to that shape so any transport can drive the
27
+ * resolution below without opening a dedicated RPC connection.
28
+ *
29
+ * @param {SolAccountFetcher} fetch - fetcher returning decoded account info by address
30
+ * @returns {Connection} a shim exposing `getAccountInfo`, cast to `Connection`
31
+ */
32
+ function buildSolAccountConnection(fetch) {
33
+ const getAccountInfo = async (publicKey, _commitmentOrConfig) => {
34
+ return fetch(publicKey.toBase58());
35
+ };
36
+ return { getAccountInfo };
37
+ }
38
+ /**
39
+ * Map the extra keys appended to a resolved transfer instruction into the
40
+ * serializable {@link ExtraAccountMeta} shape.
41
+ */
42
+ function toExtraAccountMetas(instruction, baseKeyCount) {
43
+ return instruction.keys.slice(baseKeyCount).map((meta) => ({
44
+ pubkey: meta.pubkey.toBase58(),
45
+ isSigner: meta.isSigner,
46
+ isWritable: meta.isWritable,
47
+ }));
48
+ }
49
+ /**
50
+ * Decode the fields of a Token ACL MintConfig account we depend on.
51
+ *
52
+ * Layout: `u8 discriminator, u8 bump, bool enablePermissionlessThaw, bool enablePermissionlessFreeze,
53
+ * pubkey mint(32), pubkey freezeAuthority(32), pubkey gatingProgram(32)`.
54
+ */
55
+ function decodeTokenAclMintConfig(data) {
56
+ const enablePermissionlessThaw = data[2] === 1;
57
+ const gatingProgram = new web3_js_1.PublicKey(data.subarray(68, 100));
58
+ return { enablePermissionlessThaw, gatingProgram };
59
+ }
60
+ /**
61
+ * Resolve the gating program's thaw ExtraAccountMetaList onto a can-thaw context.
62
+ *
63
+ * Mirrors the reference `resolveExtraMetas`: fetch the extra-metas account, unpack its
64
+ * ExtraAccountMeta entries, then resolve each one (fixed address, PDA, or account-data derived)
65
+ * against the accumulating metas using the spl-token transfer-hook helpers. When the extra-metas
66
+ * account does not exist, there are no extras to append.
67
+ */
68
+ async function resolveTokenAclExtraMetas(connection, extraMetasAddress, previousMetas, gatingProgram) {
69
+ const instructionData = Buffer.from([constants_1.THAW_PERMISSIONLESS_IDEMPOTENT_DISCRIMINATOR]);
70
+ const resolvedMetas = [...previousMetas];
71
+ const extraMetasAccount = await connection.getAccountInfo(extraMetasAddress);
72
+ if (!extraMetasAccount) {
73
+ return resolvedMetas;
74
+ }
75
+ const extraAccountMetas = (0, spl_token_1.getExtraAccountMetas)(extraMetasAccount);
76
+ for (const extraAccountMeta of extraAccountMetas) {
77
+ const resolvedMeta = await (0, spl_token_1.resolveExtraAccountMeta)(connection, extraAccountMeta, resolvedMetas, instructionData, gatingProgram);
78
+ resolvedMetas.push(resolvedMeta);
79
+ }
80
+ return resolvedMetas;
81
+ }
82
+ /**
83
+ * Resolve the Token-2022 Transfer Hook extra accounts for a specific transfer.
84
+ *
85
+ * This is generic: it works for any Token-2022 mint by reading the mint's
86
+ * TransferHook extension and the hook program's ExtraAccountMetaList live from
87
+ * the node, then resolving each extra account (including seed-derived PDAs) via
88
+ * the standard `spl-transfer-hook-interface` helpers. The returned metas are in
89
+ * the exact order the hook requires and are suitable for
90
+ * `TokenTransfer.params.transferHookAccounts`.
91
+ *
92
+ * When the mint has no Transfer Hook, this returns an empty array and callers can
93
+ * omit the param.
94
+ *
95
+ * @param {Connection} connection - a `Connection` (or shim) exposing `getAccountInfo`
96
+ * @param params - the transfer parameters
97
+ * @param {string} params.mint - the Token-2022 mint address
98
+ * @param {string} params.source - the source token account (sender ATA)
99
+ * @param {string} params.destination - the destination token account (recipient ATA)
100
+ * @param {string} params.owner - the source account owner / transfer authority
101
+ * @param {string} params.amount - the raw transfer amount in base units
102
+ * @returns {Promise<ExtraAccountMeta[]>} ordered extra account metas, or [] when no hook
103
+ */
104
+ async function resolveTransferHookAccounts(connection, params) {
105
+ const { mint, source, destination, owner, amount } = params;
106
+ const mintPubkey = new web3_js_1.PublicKey(mint);
107
+ // Read the mint and detect whether a Transfer Hook extension is configured.
108
+ const mintAccountInfo = await connection.getAccountInfo(mintPubkey);
109
+ if (!mintAccountInfo) {
110
+ return [];
111
+ }
112
+ const mintState = (0, spl_token_1.unpackMint)(mintPubkey, mintAccountInfo, spl_token_1.TOKEN_2022_PROGRAM_ID);
113
+ const transferHook = (0, spl_token_1.getTransferHook)(mintState);
114
+ if (!transferHook || transferHook.programId.equals(web3_js_1.PublicKey.default)) {
115
+ return [];
116
+ }
117
+ const sourcePubkey = new web3_js_1.PublicKey(source);
118
+ const destinationPubkey = new web3_js_1.PublicKey(destination);
119
+ const ownerPubkey = new web3_js_1.PublicKey(owner);
120
+ const transferAmount = BigInt(amount);
121
+ // Start from a base transferChecked instruction; addExtraAccountMetasForExecute
122
+ // appends the resolved extra accounts, the hook program, and the validation
123
+ // state account in the required order.
124
+ const instruction = (0, spl_token_1.createTransferCheckedInstruction)(sourcePubkey, mintPubkey, destinationPubkey, ownerPubkey, transferAmount, mintState.decimals, [], spl_token_1.TOKEN_2022_PROGRAM_ID);
125
+ const baseKeyCount = instruction.keys.length;
126
+ await (0, spl_token_1.addExtraAccountMetasForExecute)(connection, instruction, transferHook.programId, sourcePubkey, mintPubkey, destinationPubkey, ownerPubkey, transferAmount);
127
+ return toExtraAccountMetas(instruction, baseKeyCount);
128
+ }
129
+ /**
130
+ * Resolve the sRFC-37 Token ACL permissionless-thaw dependencies for a token account.
131
+ *
132
+ * This is generic: it works for ANY allowlist/blocklist (DefaultAccountState) Token-2022 mint
133
+ * gated by the Token ACL program — no issuer is hardcoded. It reads the mint's MintConfig PDA
134
+ * live from the node, and only when permissionless thaw is enabled does it derive the flag /
135
+ * mint-config / thaw-extra-metas PDAs and resolve the gating program's extra account metas (in
136
+ * the exact order the gating program requires, mirroring `resolveExtraMetas`).
137
+ *
138
+ * When the mint is not a Token ACL mint, or permissionless thaw is disabled, this returns
139
+ * `{ applicable: false }` and callers skip the thaw.
140
+ *
141
+ * @param {Connection} connection - a `Connection` (or shim) exposing `getAccountInfo`
142
+ * @param params - the thaw parameters
143
+ * @param {string} params.mint - the Token-2022 mint address
144
+ * @param {string} params.tokenAccount - the token account (ATA) to thaw
145
+ * @param {string} params.tokenAccountOwner - the owner of the token account
146
+ * @param {string} params.authority - the signer invoking the thaw (fee payer / authority)
147
+ * @returns {Promise<ResolvePermissionlessThawResult>} the resolved thaw params, or `{ applicable: false }`
148
+ */
149
+ async function resolvePermissionlessThaw(connection, params) {
150
+ const { mint, tokenAccount, tokenAccountOwner, authority } = params;
151
+ const mintPubkey = new web3_js_1.PublicKey(mint);
152
+ const tokenAccountPubkey = new web3_js_1.PublicKey(tokenAccount);
153
+ const tokenAccountOwnerPubkey = new web3_js_1.PublicKey(tokenAccountOwner);
154
+ const authorityPubkey = new web3_js_1.PublicKey(authority);
155
+ const tokenAclProgramId = new web3_js_1.PublicKey(constants_1.TOKEN_ACL_PROGRAM_ID);
156
+ // 1. Read the mint's MintConfig PDA. Absent => the mint is not a Token ACL mint.
157
+ const [mintConfigPda] = web3_js_1.PublicKey.findProgramAddressSync([Buffer.from(constants_1.TOKEN_ACL_MINT_CONFIG_SEED), mintPubkey.toBuffer()], tokenAclProgramId);
158
+ const mintConfigAccount = await connection.getAccountInfo(mintConfigPda);
159
+ if (!mintConfigAccount) {
160
+ return { applicable: false };
161
+ }
162
+ // 2. Decode the MintConfig; permissionless thaw must be enabled.
163
+ const mintConfig = decodeTokenAclMintConfig(mintConfigAccount.data);
164
+ if (!mintConfig.enablePermissionlessThaw) {
165
+ return { applicable: false };
166
+ }
167
+ const gatingProgramPubkey = mintConfig.gatingProgram;
168
+ // 3. Derive the remaining PDAs (flag account under Token ACL, thaw extra metas under gating).
169
+ const [flagAccountPda] = web3_js_1.PublicKey.findProgramAddressSync([Buffer.from(constants_1.TOKEN_ACL_FLAG_ACCOUNT_SEED), tokenAccountPubkey.toBuffer()], tokenAclProgramId);
170
+ const [thawExtraMetasPda] = web3_js_1.PublicKey.findProgramAddressSync([Buffer.from(constants_1.TOKEN_ACL_THAW_EXTRA_METAS_SEED), mintPubkey.toBuffer()], gatingProgramPubkey);
171
+ // 4. Build the 6-account can-thaw context (all readonly), then resolve the gating program's
172
+ // extra account metas onto it.
173
+ const canThawContext = [
174
+ { pubkey: authorityPubkey, isSigner: false, isWritable: false },
175
+ { pubkey: tokenAccountPubkey, isSigner: false, isWritable: false },
176
+ { pubkey: mintPubkey, isSigner: false, isWritable: false },
177
+ { pubkey: tokenAccountOwnerPubkey, isSigner: false, isWritable: false },
178
+ { pubkey: flagAccountPda, isSigner: false, isWritable: false },
179
+ { pubkey: thawExtraMetasPda, isSigner: false, isWritable: false },
180
+ ];
181
+ const resolvedMetas = await resolveTokenAclExtraMetas(connection, thawExtraMetasPda, canThawContext, gatingProgramPubkey);
182
+ // 5. Drop the first five context accounts; the remainder ([thawExtraMetas, ...extras]) are the
183
+ // accounts appended after the thaw instruction's fixed nine.
184
+ const extraAccounts = resolvedMetas.slice(5).map((meta) => ({
185
+ pubkey: meta.pubkey.toBase58(),
186
+ isSigner: meta.isSigner,
187
+ isWritable: meta.isWritable,
188
+ }));
189
+ return {
190
+ applicable: true,
191
+ gatingProgram: gatingProgramPubkey.toBase58(),
192
+ flagAccount: flagAccountPda.toBase58(),
193
+ mintConfig: mintConfigPda.toBase58(),
194
+ tokenProgram: spl_token_1.TOKEN_2022_PROGRAM_ID.toBase58(),
195
+ systemProgram: web3_js_1.SystemProgram.programId.toBase58(),
196
+ extraAccounts,
197
+ };
198
+ }
199
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidG9rZW4yMDIyUmVzb2x2ZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9saWIvdG9rZW4yMDIyUmVzb2x2ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUE7Ozs7Ozs7Ozs7O0dBV0c7O0FBbUVILDhEQVFDO0FBa0ZELGtFQWlEQztBQXNCRCw4REF3RUM7QUExU0QsaURBUTJCO0FBQzNCLDZDQVF5QjtBQUV6QiwyQ0FNcUI7QUE2QnJCOzs7Ozs7Ozs7O0dBVUc7QUFDSCxTQUFnQix5QkFBeUIsQ0FBQyxLQUF3QjtJQUNoRSxNQUFNLGNBQWMsR0FBRyxLQUFLLEVBQzFCLFNBQXVCLEVBQ3ZCLG1CQUFnQyxFQUNLLEVBQUU7UUFDdkMsT0FBTyxLQUFLLENBQUMsU0FBUyxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUM7SUFDckMsQ0FBQyxDQUFDO0lBQ0YsT0FBTyxFQUFFLGNBQWMsRUFBMkIsQ0FBQztBQUNyRCxDQUFDO0FBRUQ7OztHQUdHO0FBQ0gsU0FBUyxtQkFBbUIsQ0FBQyxXQUFtQyxFQUFFLFlBQW9CO0lBQ3BGLE9BQU8sV0FBVyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsWUFBWSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBQ3pELE1BQU0sRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsRUFBRTtRQUM5QixRQUFRLEVBQUUsSUFBSSxDQUFDLFFBQVE7UUFDdkIsVUFBVSxFQUFFLElBQUksQ0FBQyxVQUFVO0tBQzVCLENBQUMsQ0FBQyxDQUFDO0FBQ04sQ0FBQztBQUVEOzs7OztHQUtHO0FBQ0gsU0FBUyx3QkFBd0IsQ0FBQyxJQUFZO0lBQzVDLE1BQU0sd0JBQXdCLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUMvQyxNQUFNLGFBQWEsR0FBRyxJQUFJLG1CQUFZLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxFQUFF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RUFBRSxVQUFVLEVBQUUsS0FBSyxFQUFFO0tBQ2xFLENBQUM7SUFDRixNQUFNLGFBQWEsR0FBRyxNQUFNLHlCQUF5QixDQUNuRCxVQUFVLEVBQ1YsaUJBQWlCLEVBQ2pCLGNBQWMsRUFDZCxtQkFBbUIsQ0FDcEIsQ0FBQztJQUVGLCtGQUErRjtJQUMvRixnRUFBZ0U7SUFDaEUsTUFBTSxhQUFhLEdBQUcsYUFBYSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFDMUQsTUFBTSxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxFQUFFO1FBQzlCLFFBQVEsRUFBRSxJQUFJLENBQUMsUUFBUTtRQUN2QixVQUFVLEVBQUUsSUFBSSxDQUFDLFVBQVU7S0FDNUIsQ0FBQyxDQUFDLENBQUM7SUFFSixPQUFPO1FBQ0wsVUFBVSxFQUFFLElBQUk7UUFDaEIsYUFBYSxFQUFFLG1CQUFtQixDQUFDLFFBQVEsRUFBRTtRQUM3QyxXQUFXLEVBQUUsY0FBYyxDQUFDLFFBQVEsRUFBRTtRQUN0QyxVQUFVLEVBQUUsYUFBYSxDQUFDLFFBQVEsRUFBRTtRQUNwQyxZQUFZLEVBQUUsaUNBQXFCLENBQUMsUUFBUSxFQUFFO1FBQzlDLGFBQWEsRUFBRSx1QkFBYSxDQUFDLFNBQVMsQ0FBQyxRQUFRLEVBQUU7UUFDakQsYUFBYTtLQUNkLENBQUM7QUFDSixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAcHJldHRpZXJcbiAqXG4gKiBSZXVzYWJsZSBUb2tlbi0yMDIyIHJlc29sdXRpb24gbG9naWMgKFRyYW5zZmVyIEhvb2sgZXh0cmEgYWNjb3VudHMgYW5kIHNSRkMtMzdcbiAqIFRva2VuIEFDTCBwZXJtaXNzaW9ubGVzcyB0aGF3KSwgZGVjb3VwbGVkIGZyb20gdGhlIGBTb2xgIGNvaW4gY2xhc3Mgc28gYW55IGNhbGxlclxuICogd2l0aCBpdHMgb3duIGFjY291bnQtZmV0Y2hlciAoZS5nLiB3YWxsZXQtcGxhdGZvcm0gcmVhZGluZyBjaGFpbiBzdGF0ZSB2aWEgSU1TIFJQQylcbiAqIGNhbiByZXNvbHZlIHRoZXNlIGRlcGVuZGVuY2llcyBvZmZsaW5lIG9mIHRoZSBTREsncyBub2RlIHRyYW5zcG9ydC5cbiAqXG4gKiBUaGUgcmVzb2x1dGlvbiBmdW5jdGlvbnMgdGFrZSBhIGBDb25uZWN0aW9uYCAob25seSBgZ2V0QWNjb3VudEluZm9gIGlzIHJlcXVpcmVkKTtcbiAqIHtAbGluayBidWlsZFNvbEFjY291bnRDb25uZWN0aW9ufSBhZGFwdHMgYSBwbGFpbiB7QGxpbmsgU29sQWNjb3VudEZldGNoZXJ9IGludG8gdGhlXG4gKiBzaGFwZSBgQHNvbGFuYS9zcGwtdG9rZW5gJ3MgdHJhbnNmZXItaG9vayBoZWxwZXJzIGV4cGVjdC5cbiAqL1xuXG5pbXBvcnQge1xuICBUT0tFTl8yMDIyX1BST0dSQU1fSUQsXG4gIGFkZEV4dHJhQWNjb3VudE1ldGFzRm9yRXhlY3V0ZSxcbiAgY3JlYXRlVHJhbnNmZXJDaGVja2VkSW5zdHJ1Y3Rpb24sXG4gIGdldEV4dHJhQWNjb3VudE1ldGFzLFxuICBnZXRUcmFuc2Zlckhvb2ssXG4gIHJlc29sdmVFeHRyYUFjY291bnRNZXRhLFxuICB1bnBhY2tNaW50LFxufSBmcm9tICdAc29sYW5hL3NwbC10b2tlbic7XG5pbXBvcnQge1xuICBBY2NvdW50SW5mbyxcbiAgQWNjb3VudE1ldGEsXG4gIENvbW1pdG1lbnQsXG4gIENvbm5lY3Rpb24sXG4gIFB1YmxpY0tleSBhcyBTb2xQdWJsaWNLZXksXG4gIFN5c3RlbVByb2dyYW0sXG4gIFRyYW5zYWN0aW9uSW5zdHJ1Y3Rpb24sXG59IGZyb20gJ0Bzb2xhbmEvd2ViMy5qcyc7XG5cbmltcG9ydCB7XG4gIFRIQVdfUEVSTUlTU0lPTkxFU1NfSURFTVBPVEVOVF9ESVNDUklNSU5BVE9SLFxuICBUT0tFTl9BQ0xfRkxBR19BQ0NPVU5UX1NFRUQsXG4gIFRPS0VOX0FDTF9NSU5UX0NPTkZJR19TRUVELFxuICBUT0tFTl9BQ0xfUFJPR1JBTV9JRCxcbiAgVE9LRU5fQUNMX1RIQVdfRVhUUkFfTUVUQVNfU0VFRCxcbn0gZnJvbSAnLi9jb25zdGFudHMnO1xuaW1wb3J0IHsgRXh0cmFBY2NvdW50TWV0YSB9IGZyb20gJy4vaWZhY2UnO1xuXG4vKipcbiAqIEEgbWluaW1hbCBhY2NvdW50LWZldGNoZXI6IGdpdmVuIGEgYmFzZTU4IGFkZHJlc3MsIHJldHVybiBpdHMgb24tY2hhaW5cbiAqIHtAbGluayBBY2NvdW50SW5mb30gKHdpdGggYGRhdGFgIGFscmVhZHkgZGVjb2RlZCBpbnRvIGEgYEJ1ZmZlcmApIG9yIGBudWxsYFxuICogd2hlbiB0aGUgYWNjb3VudCBkb2VzIG5vdCBleGlzdC4gQ2FsbGVycyBzdXBwbHkgdGhlaXIgb3duIHRyYW5zcG9ydCAoU0RLIG5vZGVcbiAqIHJlcXVlc3QsIHdhbGxldC1wbGF0Zm9ybSBJTVMgUlBDLCBhIGZ1bGwgYENvbm5lY3Rpb25gLCBldGMuKS5cbiAqL1xuZXhwb3J0IHR5cGUgU29sQWNjb3VudEZldGNoZXIgPSAoYWRkcmVzczogc3RyaW5nKSA9PiBQcm9taXNlPEFjY291bnRJbmZvPEJ1ZmZlcj4gfCBudWxsPjtcblxuLyoqXG4gKiBSZXN1bHQgb2YgcmVzb2x2aW5nIHRoZSBzUkZDLTM3IFRva2VuIEFDTCBwZXJtaXNzaW9ubGVzcyB0aGF3IGZvciBhIG1pbnQgLyB0b2tlbiBhY2NvdW50LlxuICpcbiAqIFdoZW4gYGFwcGxpY2FibGVgIGlzIGZhbHNlICh0aGUgbWludCBoYXMgbm8gVG9rZW4gQUNMIE1pbnRDb25maWcsIG9yIHBlcm1pc3Npb25sZXNzIHRoYXcgaXNcbiAqIGRpc2FibGVkKSBhbGwgb3RoZXIgZmllbGRzIGFyZSBvbWl0dGVkIGFuZCB0aGUgY2FsbGVyIHNob3VsZCBub3QgZW1pdCBhIHRoYXcgaW5zdHJ1Y3Rpb24uXG4gKiBXaGVuIGBhcHBsaWNhYmxlYCBpcyB0cnVlLCB0aGUgZmllbGRzIGFyZSByZWFkeSB0byB0aHJlYWQgaW50byB0aGUgdG9rZW4tdHJhbnNmZXIgYnVpbGRlciB2aWFcbiAqIGBwZXJtaXNzaW9ubGVzc1RoYXcoLi4uKWAuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUmVzb2x2ZVBlcm1pc3Npb25sZXNzVGhhd1Jlc3VsdCB7XG4gIGFwcGxpY2FibGU6IGJvb2xlYW47XG4gIGdhdGluZ1Byb2dyYW0/OiBzdHJpbmc7XG4gIGZsYWdBY2NvdW50Pzogc3RyaW5nO1xuICBtaW50Q29uZmlnPzogc3RyaW5nO1xuICB0b2tlblByb2dyYW0/OiBzdHJpbmc7XG4gIHN5c3RlbVByb2dyYW0/OiBzdHJpbmc7XG4gIGV4dHJhQWNjb3VudHM/OiBFeHRyYUFjY291bnRNZXRhW107XG59XG5cbi8qKlxuICogQnVpbGQgYSBtaW5pbWFsIGBDb25uZWN0aW9uYC1saWtlIHNoaW0gYmFja2VkIGJ5IGEge0BsaW5rIFNvbEFjY291bnRGZXRjaGVyfS5cbiAqXG4gKiBgQHNvbGFuYS9zcGwtdG9rZW5gJ3MgdHJhbnNmZXItaG9vayByZXNvbHV0aW9uIGhlbHBlcnMgb25seSByZXF1aXJlXG4gKiBgZ2V0QWNjb3VudEluZm8ocHVibGljS2V5KWAgcmV0dXJuaW5nIGFuIGBBY2NvdW50SW5mbzxCdWZmZXI+YC4gVGhpcyBhZGFwdHMgYVxuICogcGxhaW4gYWRkcmVzcy1iYXNlZCBmZXRjaGVyIHRvIHRoYXQgc2hhcGUgc28gYW55IHRyYW5zcG9ydCBjYW4gZHJpdmUgdGhlXG4gKiByZXNvbHV0aW9uIGJlbG93IHdpdGhvdXQgb3BlbmluZyBhIGRlZGljYXRlZCBSUEMgY29ubmVjdGlvbi5cbiAqXG4gKiBAcGFyYW0ge1NvbEFjY291bnRGZXRjaGVyfSBmZXRjaCAtIGZldGNoZXIgcmV0dXJuaW5nIGRlY29kZWQgYWNjb3VudCBpbmZvIGJ5IGFkZHJlc3NcbiAqIEByZXR1cm5zIHtDb25uZWN0aW9ufSBhIHNoaW0gZXhwb3NpbmcgYGdldEFjY291bnRJbmZvYCwgY2FzdCB0byBgQ29ubmVjdGlvbmBcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGJ1aWxkU29sQWNjb3VudENvbm5lY3Rpb24oZmV0Y2g6IFNvbEFjY291bnRGZXRjaGVyKTogQ29ubmVjdGlvbiB7XG4gIGNvbnN0IGdldEFjY291bnRJbmZvID0gYXN5bmMgKFxuICAgIHB1YmxpY0tleTogU29sUHVibGljS2V5LFxuICAgIF9jb21taXRtZW50T3JDb25maWc/OiBDb21taXRtZW50XG4gICk6IFByb21pc2U8QWNjb3VudEluZm88QnVmZmVyPiB8IG51bGw+ID0+IHtcbiAgICByZXR1cm4gZmV0Y2gocHVibGljS2V5LnRvQmFzZTU4KCkpO1xuICB9O1xuICByZXR1cm4geyBnZXRBY2NvdW50SW5mbyB9IGFzIHVua25vd24gYXMgQ29ubmVjdGlvbjtcbn1cblxuLyoqXG4gKiBNYXAgdGhlIGV4dHJhIGtleXMgYXBwZW5kZWQgdG8gYSByZXNvbHZlZCB0cmFuc2ZlciBpbnN0cnVjdGlvbiBpbnRvIHRoZVxuICogc2VyaWFsaXphYmxlIHtAbGluayBFeHRyYUFjY291bnRNZXRhfSBzaGFwZS5cbiAqL1xuZnVuY3Rpb24gdG9FeHRyYUFjY291bnRNZXRhcyhpbnN0cnVjdGlvbjogVHJhbnNhY3Rpb25JbnN0cnVjdGlvbiwgYmFzZUtleUNvdW50OiBudW1iZXIpOiBFeHRyYUFjY291bnRNZXRhW10ge1xuICByZXR1cm4gaW5zdHJ1Y3Rpb24ua2V5cy5zbGljZShiYXNlS2V5Q291bnQpLm1hcCgobWV0YSkgPT4gKHtcbiAgICBwdWJrZXk6IG1ldGEucHVia2V5LnRvQmFzZTU4KCksXG4gICAgaXNTaWduZXI6IG1ldGEuaXNTaWduZXIsXG4gICAgaXNXcml0YWJsZTogbWV0YS5pc1dyaXRhYmxlLFxuICB9KSk7XG59XG5cbi8qKlxuICogRGVjb2RlIHRoZSBmaWVsZHMgb2YgYSBUb2tlbiBBQ0wgTWludENvbmZpZyBhY2NvdW50IHdlIGRlcGVuZCBvbi5cbiAqXG4gKiBMYXlvdXQ6IGB1OCBkaXNjcmltaW5hdG9yLCB1OCBidW1wLCBib29sIGVuYWJsZVBlcm1pc3Npb25sZXNzVGhhdywgYm9vbCBlbmFibGVQZXJtaXNzaW9ubGVzc0ZyZWV6ZSxcbiAqIHB1YmtleSBtaW50KDMyKSwgcHVia2V5IGZyZWV6ZUF1dGhvcml0eSgzMiksIHB1YmtleSBnYXRpbmdQcm9ncmFtKDMyKWAuXG4gKi9cbmZ1bmN0aW9uIGRlY29kZVRva2VuQWNsTWludENvbmZpZyhkYXRhOiBCdWZmZXIpOiB7IGVuYWJsZVBlcm1pc3Npb25sZXNzVGhhdzogYm9vbGVhbjsgZ2F0aW5nUHJvZ3JhbTogU29sUHVibGljS2V5IH0ge1xuICBjb25zdCBlbmFibGVQZXJtaXNzaW9ubGVzc1RoYXcgPSBkYXRhWzJdID09PSAxO1xuICBjb25zdCBnYXRpbmdQcm9ncmFtID0gbmV3IFNvbFB1YmxpY0tleShkYXRhLnN1YmFycmF5KDY4LCAxMDApKTtcbiAgcmV0dXJuIHsgZW5hYmxlUGVybWlzc2lvbmxlc3NUaGF3LCBnYXRpbmdQcm9ncmFtIH07XG59XG5cbi8qKlxuICogUmVzb2x2ZSB0aGUgZ2F0aW5nIHByb2dyYW0ncyB0aGF3IEV4dHJhQWNjb3VudE1ldGFMaXN0IG9udG8gYSBjYW4tdGhhdyBjb250ZXh0LlxuICpcbiAqIE1pcnJvcnMgdGhlIHJlZmVyZW5jZSBgcmVzb2x2ZUV4dHJhTWV0YXNgOiBmZXRjaCB0aGUgZXh0cmEtbWV0YXMgYWNjb3VudCwgdW5wYWNrIGl0c1xuICogRXh0cmFBY2NvdW50TWV0YSBlbnRyaWVzLCB0aGVuIHJlc29sdmUgZWFjaCBvbmUgKGZpeGVkIGFkZHJlc3MsIFBEQSwgb3IgYWNjb3VudC1kYXRhIGRlcml2ZWQpXG4gKiBhZ2FpbnN0IHRoZSBhY2N1bXVsYXRpbmcgbWV0YXMgdXNpbmcgdGhlIHNwbC10b2tlbiB0cmFuc2Zlci1ob29rIGhlbHBlcnMuIFdoZW4gdGhlIGV4dHJhLW1ldGFzXG4gKiBhY2NvdW50IGRvZXMgbm90IGV4aXN0LCB0aGVyZSBhcmUgbm8gZXh0cmFzIHRvIGFwcGVuZC5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gcmVzb2x2ZVRva2VuQWNsRXh0cmFNZXRhcyhcbiAgY29ubmVjdGlvbjogQ29ubmVjdGlvbixcbiAgZXh0cmFNZXRhc0FkZHJlc3M6IFNvbFB1YmxpY0tleSxcbiAgcHJldmlvdXNNZXRhczogQWNjb3VudE1ldGFbXSxcbiAgZ2F0aW5nUHJvZ3JhbTogU29sUHVibGljS2V5XG4pOiBQcm9taXNlPEFjY291bnRNZXRhW10+IHtcbiAgY29uc3QgaW5zdHJ1Y3Rpb25EYXRhID0gQnVmZmVyLmZyb20oW1RIQVdfUEVSTUlTU0lPTkxFU1NfSURFTVBPVEVOVF9ESVNDUklNSU5BVE9SXSk7XG4gIGNvbnN0IHJlc29sdmVkTWV0YXM6IEFjY291bnRNZXRhW10gPSBbLi4ucHJldmlvdXNNZXRhc107XG4gIGNvbnN0IGV4dHJhTWV0YXNBY2NvdW50ID0gYXdhaXQgY29ubmVjdGlvbi5nZXRBY2NvdW50SW5mbyhleHRyYU1ldGFzQWRkcmVzcyk7XG4gIGlmICghZXh0cmFNZXRhc0FjY291bnQpIHtcbiAgICByZXR1cm4gcmVzb2x2ZWRNZXRhcztcbiAgfVxuICBjb25zdCBleHRyYUFjY291bnRNZXRhcyA9IGdldEV4dHJhQWNjb3VudE1ldGFzKGV4dHJhTWV0YXNBY2NvdW50KTtcbiAgZm9yIChjb25zdCBleHRyYUFjY291bnRNZXRhIG9mIGV4dHJhQWNjb3VudE1ldGFzKSB7XG4gICAgY29uc3QgcmVzb2x2ZWRNZXRhID0gYXdhaXQgcmVzb2x2ZUV4dHJhQWNjb3VudE1ldGEoXG4gICAgICBjb25uZWN0aW9uLFxuICAgICAgZXh0cmFBY2NvdW50TWV0YSxcbiAgICAgIHJlc29sdmVkTWV0YXMsXG4gICAgICBpbnN0cnVjdGlvbkRhdGEsXG4gICAgICBnYXRpbmdQcm9ncmFtXG4gICAgKTtcbiAgICByZXNvbHZlZE1ldGFzLnB1c2gocmVzb2x2ZWRNZXRhKTtcbiAgfVxuICByZXR1cm4gcmVzb2x2ZWRNZXRhcztcbn1cblxuLyoqXG4gKiBSZXNvbHZlIHRoZSBUb2tlbi0yMDIyIFRyYW5zZmVyIEhvb2sgZXh0cmEgYWNjb3VudHMgZm9yIGEgc3BlY2lmaWMgdHJhbnNmZXIuXG4gKlxuICogVGhpcyBpcyBnZW5lcmljOiBpdCB3b3JrcyBmb3IgYW55IFRva2VuLTIwMjIgbWludCBieSByZWFkaW5nIHRoZSBtaW50J3NcbiAqIFRyYW5zZmVySG9vayBleHRlbnNpb24gYW5kIHRoZSBob29rIHByb2dyYW0ncyBFeHRyYUFjY291bnRNZXRhTGlzdCBsaXZlIGZyb21cbiAqIHRoZSBub2RlLCB0aGVuIHJlc29sdmluZyBlYWNoIGV4dHJhIGFjY291bnQgKGluY2x1ZGluZyBzZWVkLWRlcml2ZWQgUERBcykgdmlhXG4gKiB0aGUgc3RhbmRhcmQgYHNwbC10cmFuc2Zlci1ob29rLWludGVyZmFjZWAgaGVscGVycy4gVGhlIHJldHVybmVkIG1ldGFzIGFyZSBpblxuICogdGhlIGV4YWN0IG9yZGVyIHRoZSBob29rIHJlcXVpcmVzIGFuZCBhcmUgc3VpdGFibGUgZm9yXG4gKiBgVG9rZW5UcmFuc2Zlci5wYXJhbXMudHJhbnNmZXJIb29rQWNjb3VudHNgLlxuICpcbiAqIFdoZW4gdGhlIG1pbnQgaGFzIG5vIFRyYW5zZmVyIEhvb2ssIHRoaXMgcmV0dXJucyBhbiBlbXB0eSBhcnJheSBhbmQgY2FsbGVycyBjYW5cbiAqIG9taXQgdGhlIHBhcmFtLlxuICpcbiAqIEBwYXJhbSB7Q29ubmVjdGlvbn0gY29ubmVjdGlvbiAtIGEgYENvbm5lY3Rpb25gIChvciBzaGltKSBleHBvc2luZyBgZ2V0QWNjb3VudEluZm9gXG4gKiBAcGFyYW0gcGFyYW1zIC0gdGhlIHRyYW5zZmVyIHBhcmFtZXRlcnNcbiAqIEBwYXJhbSB7c3RyaW5nfSBwYXJhbXMubWludCAtIHRoZSBUb2tlbi0yMDIyIG1pbnQgYWRkcmVzc1xuICogQHBhcmFtIHtzdHJpbmd9IHBhcmFtcy5zb3VyY2UgLSB0aGUgc291cmNlIHRva2VuIGFjY291bnQgKHNlbmRlciBBVEEpXG4gKiBAcGFyYW0ge3N0cmluZ30gcGFyYW1zLmRlc3RpbmF0aW9uIC0gdGhlIGRlc3RpbmF0aW9uIHRva2VuIGFjY291bnQgKHJlY2lwaWVudCBBVEEpXG4gKiBAcGFyYW0ge3N0cmluZ30gcGFyYW1zLm93bmVyIC0gdGhlIHNvdXJjZSBhY2NvdW50IG93bmVyIC8gdHJhbnNmZXIgYXV0aG9yaXR5XG4gKiBAcGFyYW0ge3N0cmluZ30gcGFyYW1zLmFtb3VudCAtIHRoZSByYXcgdHJhbnNmZXIgYW1vdW50IGluIGJhc2UgdW5pdHNcbiAqIEByZXR1cm5zIHtQcm9taXNlPEV4dHJhQWNjb3VudE1ldGFbXT59IG9yZGVyZWQgZXh0cmEgYWNjb3VudCBtZXRhcywgb3IgW10gd2hlbiBubyBob29rXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiByZXNvbHZlVHJhbnNmZXJIb29rQWNjb3VudHMoXG4gIGNvbm5lY3Rpb246IENvbm5lY3Rpb24sXG4gIHBhcmFtczogeyBtaW50OiBzdHJpbmc7IHNvdXJjZTogc3RyaW5nOyBkZXN0aW5hdGlvbjogc3RyaW5nOyBvd25lcjogc3RyaW5nOyBhbW91bnQ6IHN0cmluZyB9XG4pOiBQcm9taXNlPEV4dHJhQWNjb3VudE1ldGFbXT4ge1xuICBjb25zdCB7IG1pbnQsIHNvdXJjZSwgZGVzdGluYXRpb24sIG93bmVyLCBhbW91bnQgfSA9IHBhcmFtcztcbiAgY29uc3QgbWludFB1YmtleSA9IG5ldyBTb2xQdWJsaWNLZXkobWludCk7XG5cbiAgLy8gUmVhZCB0aGUgbWludCBhbmQgZGV0ZWN0IHdoZXRoZXIgYSBUcmFuc2ZlciBIb29rIGV4dGVuc2lvbiBpcyBjb25maWd1cmVkLlxuICBjb25zdCBtaW50QWNjb3VudEluZm8gPSBhd2FpdCBjb25uZWN0aW9uLmdldEFjY291bnRJbmZvKG1pbnRQdWJrZXkpO1xuICBpZiAoIW1pbnRBY2NvdW50SW5mbykge1xuICAgIHJldHVybiBbXTtcbiAgfVxuICBjb25zdCBtaW50U3RhdGUgPSB1bnBhY2tNaW50KG1pbnRQdWJrZXksIG1pbnRBY2NvdW50SW5mbywgVE9LRU5fMjAyMl9QUk9HUkFNX0lEKTtcbiAgY29uc3QgdHJhbnNmZXJIb29rID0gZ2V0VHJhbnNmZXJIb29rKG1pbnRTdGF0ZSk7XG4gIGlmICghdHJhbnNmZXJIb29rIHx8IHRyYW5zZmVySG9vay5wcm9ncmFtSWQuZXF1YWxzKFNvbFB1YmxpY0tleS5kZWZhdWx0KSkge1xuICAgIHJldHVybiBbXTtcbiAgfVxuXG4gIGNvbnN0IHNvdXJjZVB1YmtleSA9IG5ldyBTb2xQdWJsaWNLZXkoc291cmNlKTtcbiAgY29uc3QgZGVzdGluYXRpb25QdWJrZXkgPSBuZXcgU29sUHVibGljS2V5KGRlc3RpbmF0aW9uKTtcbiAgY29uc3Qgb3duZXJQdWJrZXkgPSBuZXcgU29sUHVibGljS2V5KG93bmVyKTtcbiAgY29uc3QgdHJhbnNmZXJBbW91bnQgPSBCaWdJbnQoYW1vdW50KTtcblxuICAvLyBTdGFydCBmcm9tIGEgYmFzZSB0cmFuc2ZlckNoZWNrZWQgaW5zdHJ1Y3Rpb247IGFkZEV4dHJhQWNjb3VudE1ldGFzRm9yRXhlY3V0ZVxuICAvLyBhcHBlbmRzIHRoZSByZXNvbHZlZCBleHRyYSBhY2NvdW50cywgdGhlIGhvb2sgcHJvZ3JhbSwgYW5kIHRoZSB2YWxpZGF0aW9uXG4gIC8vIHN0YXRlIGFjY291bnQgaW4gdGhlIHJlcXVpcmVkIG9yZGVyLlxuICBjb25zdCBpbnN0cnVjdGlvbiA9IGNyZWF0ZVRyYW5zZmVyQ2hlY2tlZEluc3RydWN0aW9uKFxuICAgIHNvdXJjZVB1YmtleSxcbiAgICBtaW50UHVia2V5LFxuICAgIGRlc3RpbmF0aW9uUHVia2V5LFxuICAgIG93bmVyUHVia2V5LFxuICAgIHRyYW5zZmVyQW1vdW50LFxuICAgIG1pbnRTdGF0ZS5kZWNpbWFscyxcbiAgICBbXSxcbiAgICBUT0tFTl8yMDIyX1BST0dSQU1fSURcbiAgKTtcbiAgY29uc3QgYmFzZUtleUNvdW50ID0gaW5zdHJ1Y3Rpb24ua2V5cy5sZW5ndGg7XG4gIGF3YWl0IGFkZEV4dHJhQWNjb3VudE1ldGFzRm9yRXhlY3V0ZShcbiAgICBjb25uZWN0aW9uLFxuICAgIGluc3RydWN0aW9uLFxuICAgIHRyYW5zZmVySG9vay5wcm9ncmFtSWQsXG4gICAgc291cmNlUHVia2V5LFxuICAgIG1pbnRQdWJrZXksXG4gICAgZGVzdGluYXRpb25QdWJrZXksXG4gICAgb3duZXJQdWJrZXksXG4gICAgdHJhbnNmZXJBbW91bnRcbiAgKTtcblxuICByZXR1cm4gdG9FeHRyYUFjY291bnRNZXRhcyhpbnN0cnVjdGlvbiwgYmFzZUtleUNvdW50KTtcbn1cblxuLyoqXG4gKiBSZXNvbHZlIHRoZSBzUkZDLTM3IFRva2VuIEFDTCBwZXJtaXNzaW9ubGVzcy10aGF3IGRlcGVuZGVuY2llcyBmb3IgYSB0b2tlbiBhY2NvdW50LlxuICpcbiAqIFRoaXMgaXMgZ2VuZXJpYzogaXQgd29ya3MgZm9yIEFOWSBhbGxvd2xpc3QvYmxvY2tsaXN0IChEZWZhdWx0QWNjb3VudFN0YXRlKSBUb2tlbi0yMDIyIG1pbnRcbiAqIGdhdGVkIGJ5IHRoZSBUb2tlbiBBQ0wgcHJvZ3JhbSDigJQgbm8gaXNzdWVyIGlzIGhhcmRjb2RlZC4gSXQgcmVhZHMgdGhlIG1pbnQncyBNaW50Q29uZmlnIFBEQVxuICogbGl2ZSBmcm9tIHRoZSBub2RlLCBhbmQgb25seSB3aGVuIHBlcm1pc3Npb25sZXNzIHRoYXcgaXMgZW5hYmxlZCBkb2VzIGl0IGRlcml2ZSB0aGUgZmxhZyAvXG4gKiBtaW50LWNvbmZpZyAvIHRoYXctZXh0cmEtbWV0YXMgUERBcyBhbmQgcmVzb2x2ZSB0aGUgZ2F0aW5nIHByb2dyYW0ncyBleHRyYSBhY2NvdW50IG1ldGFzIChpblxuICogdGhlIGV4YWN0IG9yZGVyIHRoZSBnYXRpbmcgcHJvZ3JhbSByZXF1aXJlcywgbWlycm9yaW5nIGByZXNvbHZlRXh0cmFNZXRhc2ApLlxuICpcbiAqIFdoZW4gdGhlIG1pbnQgaXMgbm90IGEgVG9rZW4gQUNMIG1pbnQsIG9yIHBlcm1pc3Npb25sZXNzIHRoYXcgaXMgZGlzYWJsZWQsIHRoaXMgcmV0dXJuc1xuICogYHsgYXBwbGljYWJsZTogZmFsc2UgfWAgYW5kIGNhbGxlcnMgc2tpcCB0aGUgdGhhdy5cbiAqXG4gKiBAcGFyYW0ge0Nvbm5lY3Rpb259IGNvbm5lY3Rpb24gLSBhIGBDb25uZWN0aW9uYCAob3Igc2hpbSkgZXhwb3NpbmcgYGdldEFjY291bnRJbmZvYFxuICogQHBhcmFtIHBhcmFtcyAtIHRoZSB0aGF3IHBhcmFtZXRlcnNcbiAqIEBwYXJhbSB7c3RyaW5nfSBwYXJhbXMubWludCAtIHRoZSBUb2tlbi0yMDIyIG1pbnQgYWRkcmVzc1xuICogQHBhcmFtIHtzdHJpbmd9IHBhcmFtcy50b2tlbkFjY291bnQgLSB0aGUgdG9rZW4gYWNjb3VudCAoQVRBKSB0byB0aGF3XG4gKiBAcGFyYW0ge3N0cmluZ30gcGFyYW1zLnRva2VuQWNjb3VudE93bmVyIC0gdGhlIG93bmVyIG9mIHRoZSB0b2tlbiBhY2NvdW50XG4gKiBAcGFyYW0ge3N0cmluZ30gcGFyYW1zLmF1dGhvcml0eSAtIHRoZSBzaWduZXIgaW52b2tpbmcgdGhlIHRoYXcgKGZlZSBwYXllciAvIGF1dGhvcml0eSlcbiAqIEByZXR1cm5zIHtQcm9taXNlPFJlc29sdmVQZXJtaXNzaW9ubGVzc1RoYXdSZXN1bHQ+fSB0aGUgcmVzb2x2ZWQgdGhhdyBwYXJhbXMsIG9yIGB7IGFwcGxpY2FibGU6IGZhbHNlIH1gXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiByZXNvbHZlUGVybWlzc2lvbmxlc3NUaGF3KFxuICBjb25uZWN0aW9uOiBDb25uZWN0aW9uLFxuICBwYXJhbXM6IHsgbWludDogc3RyaW5nOyB0b2tlbkFjY291bnQ6IHN0cmluZzsgdG9rZW5BY2NvdW50T3duZXI6IHN0cmluZzsgYXV0aG9yaXR5OiBzdHJpbmcgfVxuKTogUHJvbWlzZTxSZXNvbHZlUGVybWlzc2lvbmxlc3NUaGF3UmVzdWx0PiB7XG4gIGNvbnN0IHsgbWludCwgdG9rZW5BY2NvdW50LCB0b2tlbkFjY291bnRPd25lciwgYXV0aG9yaXR5IH0gPSBwYXJhbXM7XG4gIGNvbnN0IG1pbnRQdWJrZXkgPSBuZXcgU29sUHVibGljS2V5KG1pbnQpO1xuICBjb25zdCB0b2tlbkFjY291bnRQdWJrZXkgPSBuZXcgU29sUHVibGljS2V5KHRva2VuQWNjb3VudCk7XG4gIGNvbnN0IHRva2VuQWNjb3VudE93bmVyUHVia2V5ID0gbmV3IFNvbFB1YmxpY0tleSh0b2tlbkFjY291bnRPd25lcik7XG4gIGNvbnN0IGF1dGhvcml0eVB1YmtleSA9IG5ldyBTb2xQdWJsaWNLZXkoYXV0aG9yaXR5KTtcbiAgY29uc3QgdG9rZW5BY2xQcm9ncmFtSWQgPSBuZXcgU29sUHVibGljS2V5KFRPS0VOX0FDTF9QUk9HUkFNX0lEKTtcblxuICAvLyAxLiBSZWFkIHRoZSBtaW50J3MgTWludENvbmZpZyBQREEuIEFic2VudCA9PiB0aGUgbWludCBpcyBub3QgYSBUb2tlbiBBQ0wgbWludC5cbiAgY29uc3QgW21pbnRDb25maWdQZGFdID0gU29sUHVibGljS2V5LmZpbmRQcm9ncmFtQWRkcmVzc1N5bmMoXG4gICAgW0J1ZmZlci5mcm9tKFRPS0VOX0FDTF9NSU5UX0NPTkZJR19TRUVEKSwgbWludFB1YmtleS50b0J1ZmZlcigpXSxcbiAgICB0b2tlbkFjbFByb2dyYW1JZFxuICApO1xuICBjb25zdCBtaW50Q29uZmlnQWNjb3VudCA9IGF3YWl0IGNvbm5lY3Rpb24uZ2V0QWNjb3VudEluZm8obWludENvbmZpZ1BkYSk7XG4gIGlmICghbWludENvbmZpZ0FjY291bnQpIHtcbiAgICByZXR1cm4geyBhcHBsaWNhYmxlOiBmYWxzZSB9O1xuICB9XG5cbiAgLy8gMi4gRGVjb2RlIHRoZSBNaW50Q29uZmlnOyBwZXJtaXNzaW9ubGVzcyB0aGF3IG11c3QgYmUgZW5hYmxlZC5cbiAgY29uc3QgbWludENvbmZpZyA9IGRlY29kZVRva2VuQWNsTWludENvbmZpZyhtaW50Q29uZmlnQWNjb3VudC5kYXRhKTtcbiAgaWYgKCFtaW50Q29uZmlnLmVuYWJsZVBlcm1pc3Npb25sZXNzVGhhdykge1xuICAgIHJldHVybiB7IGFwcGxpY2FibGU6IGZhbHNlIH07XG4gIH1cbiAgY29uc3QgZ2F0aW5nUHJvZ3JhbVB1YmtleSA9IG1pbnRDb25maWcuZ2F0aW5nUHJvZ3JhbTtcblxuICAvLyAzLiBEZXJpdmUgdGhlIHJlbWFpbmluZyBQREFzIChmbGFnIGFjY291bnQgdW5kZXIgVG9rZW4gQUNMLCB0aGF3IGV4dHJhIG1ldGFzIHVuZGVyIGdhdGluZykuXG4gIGNvbnN0IFtmbGFnQWNjb3VudFBkYV0gPSBTb2xQdWJsaWNLZXkuZmluZFByb2dyYW1BZGRyZXNzU3luYyhcbiAgICBbQnVmZmVyLmZyb20oVE9LRU5fQUNMX0ZMQUdfQUNDT1VOVF9TRUVEKSwgdG9rZW5BY2NvdW50UHVia2V5LnRvQnVmZmVyKCldLFxuICAgIHRva2VuQWNsUHJvZ3JhbUlkXG4gICk7XG4gIGNvbnN0IFt0aGF3RXh0cmFNZXRhc1BkYV0gPSBTb2xQdWJsaWNLZXkuZmluZFByb2dyYW1BZGRyZXNzU3luYyhcbiAgICBbQnVmZmVyLmZyb20oVE9LRU5fQUNMX1RIQVdfRVhUUkFfTUVUQVNfU0VFRCksIG1pbnRQdWJrZXkudG9CdWZmZXIoKV0sXG4gICAgZ2F0aW5nUHJvZ3JhbVB1YmtleVxuICApO1xuXG4gIC8vIDQuIEJ1aWxkIHRoZSA2LWFjY291bnQgY2FuLXRoYXcgY29udGV4dCAoYWxsIHJlYWRvbmx5KSwgdGhlbiByZXNvbHZlIHRoZSBnYXRpbmcgcHJvZ3JhbSdzXG4gIC8vICAgIGV4dHJhIGFjY291bnQgbWV0YXMgb250byBpdC5cbiAgY29uc3QgY2FuVGhhd0NvbnRleHQ6IEFjY291bnRNZXRhW10gPSBbXG4gICAgeyBwdWJrZXk6IGF1dGhvcml0eVB1YmtleSwgaXNTaWduZXI6IGZhbHNlLCBpc1dyaXRhYmxlOiBmYWxzZSB9LFxuICAgIHsgcHVia2V5OiB0b2tlbkFjY291bnRQdWJrZXksIGlzU2lnbmVyOiBmYWxzZSwgaXNXcml0YWJsZTogZmFsc2UgfSxcbiAgICB7IHB1YmtleTogbWludFB1YmtleSwgaXNTaWduZXI6IGZhbHNlLCBpc1dyaXRhYmxlOiBmYWxzZSB9LFxuICAgIHsgcHVia2V5OiB0b2tlbkFjY291bnRPd25lclB1YmtleSwgaXNTaWduZXI6IGZhbHNlLCBpc1dyaXRhYmxlOiBmYWxzZSB9LFxuICAgIHsgcHVia2V5OiBmbGFnQWNjb3VudFBkYSwgaXNTaWduZXI6IGZhbHNlLCBpc1dyaXRhYmxlOiBmYWxzZSB9LFxuICAgIHsgcHVia2V5OiB0aGF3RXh0cmFNZXRhc1BkYSwgaXNTaWduZXI6IGZhbHNlLCBpc1dyaXRhYmxlOiBmYWxzZSB9LFxuICBdO1xuICBjb25zdCByZXNvbHZlZE1ldGFzID0gYXdhaXQgcmVzb2x2ZVRva2VuQWNsRXh0cmFNZXRhcyhcbiAgICBjb25uZWN0aW9uLFxuICAgIHRoYXdFeHRyYU1ldGFzUGRhLFxuICAgIGNhblRoYXdDb250ZXh0LFxuICAgIGdhdGluZ1Byb2dyYW1QdWJrZXlcbiAgKTtcblxuICAvLyA1LiBEcm9wIHRoZSBmaXJzdCBmaXZlIGNvbnRleHQgYWNjb3VudHM7IHRoZSByZW1haW5kZXIgKFt0aGF3RXh0cmFNZXRhcywgLi4uZXh0cmFzXSkgYXJlIHRoZVxuICAvLyAgICBhY2NvdW50cyBhcHBlbmRlZCBhZnRlciB0aGUgdGhhdyBpbnN0cnVjdGlvbidzIGZpeGVkIG5pbmUuXG4gIGNvbnN0IGV4dHJhQWNjb3VudHMgPSByZXNvbHZlZE1ldGFzLnNsaWNlKDUpLm1hcCgobWV0YSkgPT4gKHtcbiAgICBwdWJrZXk6IG1ldGEucHVia2V5LnRvQmFzZTU4KCksXG4gICAgaXNTaWduZXI6IG1ldGEuaXNTaWduZXIsXG4gICAgaXNXcml0YWJsZTogbWV0YS5pc1dyaXRhYmxlLFxuICB9KSk7XG5cbiAgcmV0dXJuIHtcbiAgICBhcHBsaWNhYmxlOiB0cnVlLFxuICAgIGdhdGluZ1Byb2dyYW06IGdhdGluZ1Byb2dyYW1QdWJrZXkudG9CYXNlNTgoKSxcbiAgICBmbGFnQWNjb3VudDogZmxhZ0FjY291bnRQZGEudG9CYXNlNTgoKSxcbiAgICBtaW50Q29uZmlnOiBtaW50Q29uZmlnUGRhLnRvQmFzZTU4KCksXG4gICAgdG9rZW5Qcm9ncmFtOiBUT0tFTl8yMDIyX1BST0dSQU1fSUQudG9CYXNlNTgoKSxcbiAgICBzeXN0ZW1Qcm9ncmFtOiBTeXN0ZW1Qcm9ncmFtLnByb2dyYW1JZC50b0Jhc2U1OCgpLFxuICAgIGV4dHJhQWNjb3VudHMsXG4gIH07XG59XG4iXX0=
@@ -1,7 +1,7 @@
1
1
  import { BaseCoin as CoinConfig } from '@bitgo-beta/statics';
2
2
  import { TransactionType } from '@bitgo-beta/sdk-core';
3
3
  import { Transaction } from './transaction';
4
- import { TokenAssociateRecipient } from './iface';
4
+ import { ExtraAccountMeta, PermissionlessThawIdempotent, TokenAssociateRecipient } from './iface';
5
5
  import { TransactionBuilder } from './transactionBuilder';
6
6
  export interface SendParams {
7
7
  address: string;
@@ -14,7 +14,33 @@ export interface SendParams {
14
14
  export declare class TokenTransferBuilder extends TransactionBuilder {
15
15
  private _sendParams;
16
16
  private _createAtaParams;
17
+ private _transferHookAccounts?;
18
+ private _permissionlessThaw?;
17
19
  constructor(_coinConfig: Readonly<CoinConfig>);
20
+ /**
21
+ * Set the resolved sRFC-37 Token ACL permissionless-thaw params for this transfer.
22
+ *
23
+ * These must be resolved live by the caller (e.g. via `Sol.resolvePermissionlessThaw`) since
24
+ * builders remain offline and never perform RPC. When set, the built transaction bundles a
25
+ * `PermissionlessThawIdempotent` instruction after any ATA creation and before the transfer, so
26
+ * a freshly created (frozen) allowlist/blocklist token account is thawed atomically with the
27
+ * transfer — all-or-nothing.
28
+ *
29
+ * @param {PermissionlessThawIdempotent['params']} params - resolved thaw params
30
+ * @returns {TokenTransferBuilder} This transaction builder
31
+ */
32
+ permissionlessThaw(params: PermissionlessThawIdempotent['params']): this;
33
+ /**
34
+ * Set the resolved Token-2022 Transfer Hook extra account metas for this transfer.
35
+ *
36
+ * These must be resolved live by the caller (e.g. via `Sol.resolveTransferHookAccounts`)
37
+ * since builders remain offline and never perform RPC. The order is significant and
38
+ * must match the hook's ExtraAccountMetaList.
39
+ *
40
+ * @param {ExtraAccountMeta[]} metas - resolved extra account metas, in hook order
41
+ * @returns {TokenTransferBuilder} This transaction builder
42
+ */
43
+ transferHookAccounts(metas: ExtraAccountMeta[]): this;
18
44
  protected get transactionType(): TransactionType;
19
45
  initBuilder(tx: Transaction): void;
20
46
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"tokenTransferBuilder.d.ts","sourceRoot":"","sources":["../../../../src/lib/tokenTransferBuilder.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,IAAI,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAC7D,OAAO,EAAyB,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAC9E,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAU5C,OAAO,EAAW,uBAAuB,EAAiC,MAAM,SAAS,CAAC;AAE1F,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAG1D,MAAM,WAAW,UAAU;IACzB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAID,qBAAa,oBAAqB,SAAQ,kBAAkB;IAC1D,OAAO,CAAC,WAAW,CAAoB;IACvC,OAAO,CAAC,gBAAgB,CAA4B;gBAExC,WAAW,EAAE,QAAQ,CAAC,UAAU,CAAC;IAK7C,SAAS,KAAK,eAAe,IAAI,eAAe,CAE/C;IAED,WAAW,CAAC,EAAE,EAAE,WAAW,GAAG,IAAI;IA6BlC;;;;;;;;OAQG;IACH,IAAI,CAAC,EAAE,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,YAAY,EAAE,SAAS,EAAE,aAAa,EAAE,EAAE,UAAU,GAAG,IAAI;IAa9F;;;;;;OAMG;IACH,4BAA4B,CAAC,SAAS,EAAE,uBAAuB,GAAG,IAAI;IAmBtE,kBAAkB;cACF,mBAAmB,IAAI,OAAO,CAAC,WAAW,CAAC;CAkG5D"}
1
+ {"version":3,"file":"tokenTransferBuilder.d.ts","sourceRoot":"","sources":["../../../../src/lib/tokenTransferBuilder.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,IAAI,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAC7D,OAAO,EAAyB,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAC9E,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAU5C,OAAO,EAEL,gBAAgB,EAChB,4BAA4B,EAC5B,uBAAuB,EAGxB,MAAM,SAAS,CAAC;AAEjB,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAG1D,MAAM,WAAW,UAAU;IACzB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAID,qBAAa,oBAAqB,SAAQ,kBAAkB;IAC1D,OAAO,CAAC,WAAW,CAAoB;IACvC,OAAO,CAAC,gBAAgB,CAA4B;IACpD,OAAO,CAAC,qBAAqB,CAAC,CAAqB;IACnD,OAAO,CAAC,mBAAmB,CAAC,CAAyC;gBAEzD,WAAW,EAAE,QAAQ,CAAC,UAAU,CAAC;IAK7C;;;;;;;;;;;OAWG;IACH,kBAAkB,CAAC,MAAM,EAAE,4BAA4B,CAAC,QAAQ,CAAC,GAAG,IAAI;IAKxE;;;;;;;;;OASG;IACH,oBAAoB,CAAC,KAAK,EAAE,gBAAgB,EAAE,GAAG,IAAI;IAKrD,SAAS,KAAK,eAAe,IAAI,eAAe,CAE/C;IAED,WAAW,CAAC,EAAE,EAAE,WAAW,GAAG,IAAI;IA6BlC;;;;;;;;OAQG;IACH,IAAI,CAAC,EAAE,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,YAAY,EAAE,SAAS,EAAE,aAAa,EAAE,EAAE,UAAU,GAAG,IAAI;IAa9F;;;;;;OAMG;IACH,4BAA4B,CAAC,SAAS,EAAE,uBAAuB,GAAG,IAAI;IAmBtE,kBAAkB;cACF,mBAAmB,IAAI,OAAO,CAAC,WAAW,CAAC;CA8G5D"}
@@ -17,6 +17,36 @@ class TokenTransferBuilder extends transactionBuilder_1.TransactionBuilder {
17
17
  this._sendParams = [];
18
18
  this._createAtaParams = [];
19
19
  }
20
+ /**
21
+ * Set the resolved sRFC-37 Token ACL permissionless-thaw params for this transfer.
22
+ *
23
+ * These must be resolved live by the caller (e.g. via `Sol.resolvePermissionlessThaw`) since
24
+ * builders remain offline and never perform RPC. When set, the built transaction bundles a
25
+ * `PermissionlessThawIdempotent` instruction after any ATA creation and before the transfer, so
26
+ * a freshly created (frozen) allowlist/blocklist token account is thawed atomically with the
27
+ * transfer — all-or-nothing.
28
+ *
29
+ * @param {PermissionlessThawIdempotent['params']} params - resolved thaw params
30
+ * @returns {TokenTransferBuilder} This transaction builder
31
+ */
32
+ permissionlessThaw(params) {
33
+ this._permissionlessThaw = params;
34
+ return this;
35
+ }
36
+ /**
37
+ * Set the resolved Token-2022 Transfer Hook extra account metas for this transfer.
38
+ *
39
+ * These must be resolved live by the caller (e.g. via `Sol.resolveTransferHookAccounts`)
40
+ * since builders remain offline and never perform RPC. The order is significant and
41
+ * must match the hook's ExtraAccountMetaList.
42
+ *
43
+ * @param {ExtraAccountMeta[]} metas - resolved extra account metas, in hook order
44
+ * @returns {TokenTransferBuilder} This transaction builder
45
+ */
46
+ transferHookAccounts(metas) {
47
+ this._transferHookAccounts = metas;
48
+ return this;
49
+ }
20
50
  get transactionType() {
21
51
  return sdk_core_1.TransactionType.Send;
22
52
  }
@@ -131,6 +161,7 @@ class TokenTransferBuilder extends transactionBuilder_1.TransactionBuilder {
131
161
  tokenAddress: tokenAddress,
132
162
  programId: programId,
133
163
  decimalPlaces: decimals,
164
+ ...(this._transferHookAccounts ? { transferHookAccounts: this._transferHookAccounts } : {}),
134
165
  },
135
166
  };
136
167
  }));
@@ -182,15 +213,25 @@ class TokenTransferBuilder extends transactionBuilder_1.TransactionBuilder {
182
213
  fee: this._priorityFee,
183
214
  },
184
215
  };
216
+ // When resolved, emit the permissionless thaw between ATA creation and the transfer so the
217
+ // built order is [CreateATA?, PermissionlessThawIdempotent, TokenTransfer].
218
+ const thawInstructions = this._permissionlessThaw
219
+ ? [{ type: constants_1.InstructionBuilderTypes.PermissionlessThawIdempotent, params: this._permissionlessThaw }]
220
+ : [];
185
221
  if (!this._priorityFee || this._priorityFee === Number(0)) {
186
- this._instructionsData = [...createAtaInstructions, ...sendInstructions];
222
+ this._instructionsData = [...createAtaInstructions, ...thawInstructions, ...sendInstructions];
187
223
  }
188
224
  else {
189
225
  // order is important, createAtaInstructions must be before sendInstructions
190
- this._instructionsData = [addPriorityFeeInstruction, ...createAtaInstructions, ...sendInstructions];
226
+ this._instructionsData = [
227
+ addPriorityFeeInstruction,
228
+ ...createAtaInstructions,
229
+ ...thawInstructions,
230
+ ...sendInstructions,
231
+ ];
191
232
  }
192
233
  return await super.buildImplementation();
193
234
  }
194
235
  }
195
236
  exports.TokenTransferBuilder = TokenTransferBuilder;
196
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidG9rZW5UcmFuc2ZlckJ1aWxkZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbGliL3Rva2VuVHJhbnNmZXJCdWlsZGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7OztBQUNBLG1EQUE4RTtBQUU5RSxtQ0FPaUI7QUFDakIsMkNBQXNEO0FBRXRELG9EQUE0QjtBQUM1Qiw2REFBMEQ7QUFDMUQsb0RBQXVCO0FBV3ZCLE1BQU0sbUJBQW1CLEdBQUcsTUFBTSxDQUFDLHNCQUFzQixDQUFDLENBQUM7QUFFM0QsTUFBYSxvQkFBcUIsU0FBUSx1Q0FBa0I7SUFJMUQsWUFBWSxXQUFpQztRQUMzQyxLQUFLLENBQUMsV0FBVyxDQUFDLENBQUM7UUFKYixnQkFBVyxHQUFpQixFQUFFLENBQUM7UUFLckMsSUFBSSxDQUFDLGdCQUFnQixHQUFHLEVBQUUsQ0FBQztJQUM3QixDQUFDO0lBRUQsSUFBYyxlQUFlO1FBQzNCLE9BQU8sMEJBQWUsQ0FBQyxJQUFJLENBQUM7SUFDOUIsQ0FBQztJQUVELFdBQVcsQ0FBQyxFQUFlO1FBQ3pCLEtBQUssQ0FBQyxXQUFXLENBQUMsRUFBRSxDQUFDLENBQUM7UUFFdEIsS0FBSyxNQUFNLFdBQVcsSUFBSSxJQUFJLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztZQUNqRCxJQUFJLFdBQVcsQ0FBQyxJQUFJLEtBQUssbUNBQXVCLENBQUMsYUFBYSxFQUFFLENBQUM7Z0JBQy9ELE1BQU0sbUJBQW1CLEdBQWtCLFdBQVcsQ0FBQztnQkFDdkQsSUFBSSxDQUFDLE1BQU0sQ0FBQyxtQkFBbUIsQ0FBQyxNQUFNLENBQUMsV0FBVyxDQUFDLENBQUM7Z0JBQ3BELElBQUksQ0FBQyxJQUFJLENBQUM7b0JBQ1IsT0FBTyxFQUFFLG1CQUFtQixDQUFDLE1BQU0sQ0FBQyxTQUFTO29CQUM3QyxNQUFNLEVBQUUsbUJBQW1CLENBQUMsTUFBTSxDQUFDLE1BQU07b0JBQ3pDLFNBQVMsRUFBRSxtQkFBbUIsQ0FB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LGlCQUFpQixHQUFHLENBQUMsR0FBRyxxQkFBcUIsRUFBRSxHQUFHLGdCQUFnQixDQUFDLENBQUM7UUFDM0UsQ0FBQzthQUFNLENBQUM7WUFDTiw0RUFBNEU7WUFDNUUsSUFBSSxDQUFDLGlCQUFpQixHQUFHLENBQUMseUJBQXlCLEVBQUUsR0FBRyxxQkFBcUIsRUFBRSxHQUFHLGdCQUFnQixDQUFDLENBQUM7UUFDdEcsQ0FBQztRQUNELE9BQU8sTUFBTSxLQUFLLENBQUMsbUJBQW1CLEVBQUUsQ0FBQztJQUMzQyxDQUFDO0NBQ0Y7QUE3TEQsb0RBNkxDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQmFzZUNvaW4gYXMgQ29pbkNvbmZpZyB9IGZyb20gJ0BiaXRnby1iZXRhL3N0YXRpY3MnO1xuaW1wb3J0IHsgQnVpbGRUcmFuc2FjdGlvbkVycm9yLCBUcmFuc2FjdGlvblR5cGUgfSBmcm9tICdAYml0Z28tYmV0YS9zZGstY29yZSc7XG5pbXBvcnQgeyBUcmFuc2FjdGlvbiB9IGZyb20gJy4vdHJhbnNhY3Rpb24nO1xuaW1wb3J0IHtcbiAgZ2V0QXNzb2NpYXRlZFRva2VuQWNjb3VudEFkZHJlc3MsXG4gIGdldFNvbFRva2VuRnJvbVRva2VuTmFtZSxcbiAgaXNWYWxpZEFtb3VudCxcbiAgdmFsaWRhdGVBZGRyZXNzLFxuICB2YWxpZGF0ZU1pbnRBZGRyZXNzLFxuICB2YWxpZGF0ZU93bmVyQWRkcmVzcyxcbn0gZnJvbSAnLi91dGlscyc7XG5pbXBvcnQgeyBJbnN0cnVjdGlvbkJ1aWxkZXJUeXBlcyB9IGZyb20gJy4vY29uc3RhbnRzJztcbmltcG9ydCB7IEF0YUluaXQsIFRva2VuQXNzb2NpYXRlUmVjaXBpZW50LCBUb2tlblRyYW5zZmVyLCBTZXRQcmlvcml0eUZlZSB9IGZyb20gJy4vaWZhY2UnO1xuaW1wb3J0IGFzc2VydCBmcm9tICdhc3NlcnQnO1xuaW1wb3J0IHsgVHJhbnNhY3Rpb25CdWlsZGVyIH0gZnJvbSAnLi90cmFuc2FjdGlvbkJ1aWxkZXInO1xuaW1wb3J0IF8gZnJvbSAnbG9kYXNoJztcblxuZXhwb3J0IGludGVyZmFjZSBTZW5kUGFyYW1zIHtcbiAgYWRkcmVzczogc3RyaW5nO1xuICBhbW91bnQ6IHN0cmluZztcbiAgdG9rZW5OYW1lOiBzdHJpbmc7XG4gIHRva2VuQWRkcmVzcz86IHN0cmluZztcbiAgcHJvZ3JhbUlkPzogc3RyaW5nO1xuICBkZWNpbWFsUGxhY2VzPzogbnVtYmVyO1xufVxuXG5jb25zdCBVTlNJR05FRF9CSUdJTlRfTUFYID0gQmlnSW50KCcxODQ0Njc0NDA3MzcwOTU1MTYxNScpO1xuXG5leHBvcnQgY2xhc3MgVG9rZW5UcmFuc2ZlckJ1aWxkZXIgZXh0ZW5kcyBUcmFuc2FjdGlvbkJ1aWxkZXIge1xuICBwcml2YXRlIF9zZW5kUGFyYW1zOiBTZW5kUGFyYW1zW10gPSBbXTtcbiAgcHJpdmF0ZSBfY3JlYXRlQXRhUGFyYW1zOiBUb2tlbkFzc29jaWF0ZVJlY2lwaWVudFtdO1xuXG4gIGNvbnN0cnVjdG9yKF9jb2luQ29uZmlnOiBSZWFkb25seTxDb2luQ29uZmlnPikge1xuICAgIHN1cGVyKF9jb2luQ29uZmlnKTtcbiAgICB0aGlzLl9jcmVhdGVBdGFQYXJhbXMgPSBbXTtcbiAgfVxuXG4gIHByb3RlY3RlZCBnZXQgdHJhbnNhY3Rpb25UeXBlKCk6IFRyYW5zYWN0aW9uVHlwZSB7XG4gICAgcmV0dXJuIFRyYW5zYWN0aW9uVHlwZS5TZW5kO1xuICB9XG5cbiAgaW5pdEJ1aWxkZXIodHg6IFRyYW5zYWN0aW9uKTogdm9pZCB7XG4gICAgc3VwZXIuaW5pdEJ1aWxkZXIodHgpO1xuXG4gICAgZm9yIChjb25zdCBpbnN0cnVjdGlvbiBvZiB0aGlzLl9pbnN0cnVjdGlvbnNEYXRhKSB7XG4gICAgICBpZiAoaW5zdHJ1Y3Rpb24udHlwZSA9PT0gSW5zdHJ1Y3Rpb25CdWlsZGVyVHlwZXMuVG9rZW5UcmFuc2Zlcikge1xuICAgICAgICBjb25zdCB0cmFuc2Zlckluc3RydWN0aW9uOiBUb2tlblRyYW5zZmVyID0gaW5zdHJ1Y3Rpb247XG4gICAgICAgIHRoaXMuc2VuZGVyKHRyYW5zZmVySW5zdHJ1Y3Rpb24ucGFyYW1zLmZyb21BZGRyZXNzKTtcbiAgICAgICAgdGhpcy5zZW5kKHtcbiAgICAgICAgICBhZGRyZXNzOiB0cmFuc2Zlckluc3RydWN0aW9uLnBhcmFtcy50b0FkZHJlc3MsXG4gICAgICAgICAgYW1vdW50OiB0cmFuc2Zlckluc3RydWN0aW9uLnBhcmFtcy5hbW91bnQsXG4gICAgICAgICAgdG9rZW5OYW1lOiB0cmFuc2Zlckluc3RydWN0aW9uLnBhcmFtcy50b2tlbk5hbWUsXG4gICAgICAgICAgdG9rZW5BZGRyZXNzOiB0cmFuc2Zlckluc3RydWN0aW9uLnBhcmFtcy50b2tlbkFkZHJlc3MsXG4gICAgICAgICAgcHJvZ3JhbUlkOiB0cmFuc2Zlckluc3RydWN0aW9uLnBhcmFtcy5wcm9ncmFtSWQsXG4gICAgICAgICAgZGVjaW1hbFBsYWNlczogdHJhbnNmZXJJbnN0cnVjdGlvbi5wYXJhbXMuZGVjaW1hbFBsYWNlcyxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICBpZiAoaW5zdHJ1Y3Rpb24udHlwZSA9PT0gSW5zdHJ1Y3Rpb25CdWlsZGVyVHlwZXMuQ3JlYXRlQXNzb2NpYXRlZFRva2VuQWNjb3VudCkge1xuICAgICAgICBjb25zdCBhdGFJbml0SW5zdHJ1Y3Rpb246IEF0YUluaXQgPSBpbnN0cnVjdGlvbjtcbiAgICAgICAgdGhpcy5fY3JlYXRlQXRhUGFyYW1zLnB1c2goe1xuICAgICAgICAgIG93bmVyQWRkcmVzczogYXRhSW5pdEluc3RydWN0aW9uLnBhcmFtcy5vd25lckFkZHJlc3MsXG4gICAgICAgICAgdG9rZW5OYW1lOiBhdGFJbml0SW5zdHJ1Y3Rpb24ucGFyYW1zLnRva2VuTmFtZSxcbiAgICAgICAgICBhdGFBZGRyZXNzOiBhdGFJbml0SW5zdHJ1Y3Rpb24ucGFyYW1zLmF0YUFkZHJlc3MsXG4gICAgICAgICAgdG9rZW5BZGRyZXNzOiBhdGFJbml0SW5zdHJ1Y3Rpb24ucGFyYW1zLm1pbnRBZGRyZXNzLFxuICAgICAgICAgIHByb2dyYW1JZDogYXRhSW5pdEluc3RydWN0aW9uLnBhcmFtcy5wcm9ncmFtSWQsXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiAgU2V0IGEgdHJhbnNmZXJcbiAgICpcbiAgICogQHBhcmFtIHtTZW5kUGFyYW1zfSBwYXJhbXMgLSBwYXJhbXMgZm9yIHRoZSB0cmFuc2ZlclxuICAgKiBAcGFyYW0ge3N0cmluZ30gcGFyYW1zLmFkZHJlc3MgLSB0aGUgcmVjZWl2ZXIgdG9rZW4gYWRkcmVzc1xuICAgKiBAcGFyYW0ge3N0cmluZ30gcGFyYW1zLmFtb3VudCAtIHRoZSBhbW91bnQgc2VudFxuICAgKiBAcGFyYW0ge3N0cmluZ30gcGFyYW1zLnRva2VuTmFtZSAtIG5hbWUgb2YgdG9rZW4gdGhhdCBpcyBpbnRlbmRlZCB0byBzZW5kXG4gICAqIEByZXR1cm5zIHtUcmFuc2FjdGlvbkJ1aWxkZXJ9IFRoaXMgdHJhbnNhY3Rpb24gYnVpbGRlclxuICAgKi9cbiAgc2VuZCh7IGFkZHJlc3MsIGFtb3VudCwgdG9rZW5OYW1lLCB0b2tlbkFkZHJlc3MsIHByb2dyYW1JZCwgZGVjaW1hbFBsYWNlcyB9OiBTZW5kUGFyYW1zKTogdGhpcyB7XG4gICAgdmFsaWRhdGVBZGRyZXNzKGFkZHJlc3MsICdhZGRyZXNzJyk7XG4gICAgaWYgKCFhbW91bnQgfHwgIWlzVmFsaWRBbW91bnQoYW1vdW50KSkge1xuICAgICAgdGhyb3cgbmV3IEJ1aWxkVHJhbnNhY3Rpb25FcnJvcignSW52YWxpZCBvciBtaXNzaW5nIGFtb3VudCwgZ290OiAnICsgYW1vdW50KTtcbiAgICB9XG4gICAgaWYgKEJpZ0ludChhbW91bnQpID4gVU5TSUdORURfQklHSU5UX01BWCkge1xuICAgICAgdGhyb3cgbmV3IEJ1aWxkVHJhbnNhY3Rpb25FcnJvcihgaW5wdXQgYW1vdW50ICR7YW1vdW50fSBleGNlZWRzIGJpZyBpbnQgbGltaXQgJHtVTlNJR05FRF9CSUdJTlRfTUFYfWApO1xuICAgIH1cblxuICAgIHRoaXMuX3NlbmRQYXJhbXMucHVzaCh7IGFkZHJlc3MsIGFtb3VudCwgdG9rZW5OYW1lOiB0b2tlbk5hbWUsIHRva2VuQWRkcmVzcywgcHJvZ3JhbUlkLCBkZWNpbWFsUGxhY2VzIH0pO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqXG4gICAqIEBwYXJhbSB7VG9rZW5Bc3NvY2lhdGVSZWNpcGllbnR9IHJlY2lwaWVudCAtIHJlY2lwaWVudCBvZiB0aGUgYXNzb2NpYXRlZCB0b2tlbiBhY2NvdW50IGNyZWF0aW9uXG4gICAqIEBwYXJhbSB7c3RyaW5nfSByZWNpcGllbnQub3duZXJBZGRyZXNzIC0gb3duZXIgb2YgdGhlIGFzc29jaWF0ZWQgdG9rZW4gYWNjb3VudFxuICAgKiBAcGFyYW0ge3N0cmluZ30gcmVjaXBpZW50LnRva2VuTmFtZSAtIG5hbWUgb2YgdGhlIHRva2VuIHRoYXQgaXMgaW50ZW5kZWQgdG8gYXNzb2NpYXRlXG4gICAqIEByZXR1cm5zIHtUcmFuc2FjdGlvbkJ1aWxkZXJ9IFRoaXMgdHJhbnNhY3Rpb24gYnVpbGRlclxuICAgKi9cbiAgY3JlYXRlQXNzb2NpYXRlZFRva2VuQWNjb3VudChyZWNpcGllbnQ6IFRva2VuQXNzb2NpYXRlUmVjaXBpZW50KTogdGhpcyB7XG4gICAgdmFsaWRhdGVPd25lckFkZHJlc3MocmVjaXBpZW50Lm93bmVyQWRkcmVzcyk7XG4gICAgbGV0IHRva2VuQWRkcmVzczogc3RyaW5nO1xuICAgIGlmIChyZWNpcGllbnQudG9rZW5BZGRyZXNzKSB7XG4gICAgICB0b2tlbkFkZHJlc3MgPSByZWNpcGllbnQudG9rZW5BZGRyZXNzO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCB0b2tlbiA9IGdldFNvbFRva2VuRnJvbVRva2VuTmFtZShyZWNpcGllbnQudG9rZW5OYW1lKTtcbiAgICAgIGlmICh0b2tlbikge1xuICAgICAgICB0b2tlbkFkZHJlc3MgPSB0b2tlbi50b2tlbkFkZHJlc3M7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aHJvdyBuZXcgQnVpbGRUcmFuc2FjdGlvbkVycm9yKCdJbnZhbGlkIHRva2VuIG5hbWUsIGdvdDogJyArIHJlY2lwaWVudC50b2tlbk5hbWUpO1xuICAgICAgfVxuICAgIH1cbiAgICB2YWxpZGF0ZU1pbnRBZGRyZXNzKHRva2VuQWRkcmVzcyk7XG5cbiAgICB0aGlzLl9jcmVhdGVBdGFQYXJhbXMucHVzaChyZWNpcGllbnQpO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqIEBpbmhlcml0ZG9jICovXG4gIHByb3RlY3RlZCBhc3luYyBidWlsZEltcGxlbWVudGF0aW9uKCk6IFByb21pc2U8VHJhbnNhY3Rpb24+IHtcbiAgICBhc3NlcnQodGhpcy5fc2VuZGVyLCAnU2VuZGVyIG11c3QgYmUgc2V0IGJlZm9yZSBidWlsZGluZyB0aGUgdHJhbnNhY3Rpb24nKTtcbiAgICBjb25zdCBzZW5kSW5zdHJ1Y3Rpb25zID0gYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICB0aGlzLl9zZW5kUGFyYW1zLm1hcChhc3luYyAoc2VuZFBhcmFtczogU2VuZFBhcmFtcyk6IFByb21pc2U8VG9rZW5UcmFuc2Zlcj4gPT4ge1xuICAgICAgICBsZXQgdG9rZW5BZGRyZXNzOiBzdHJpbmc7XG4gICAgICAgIGxldCB0b2tlbk5hbWU6IHN0cmluZztcbiAgICAgICAgbGV0IHByb2dyYW1JZDogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICAgICAgICBsZXQgZGVjaW1hbHM6IG51bWJlciB8IHVuZGVmaW5lZDtcbiAgICAgICAgaWYgKHNlbmRQYXJhbXMudG9rZW5BZGRyZXNzICYmIHNlbmRQYXJhbXMucHJvZ3JhbUlkICYmIHNlbmRQYXJhbXMuZGVjaW1hbFBsYWNlcyAhPSBudWxsKSB7XG4gICAgICAgICAgdG9rZW5BZGRyZXNzID0gc2VuZFBhcmFtcy50b2tlbkFkZHJlc3M7XG4gICAgICAgICAgdG9rZW5OYW1lID0gc2VuZFBhcmFtcy50b2tlbk5hbWU7XG4gICAgICAgICAgcHJvZ3JhbUlkID0gc2VuZFBhcmFtcy5wcm9ncmFtSWQ7XG4gICAgICAgICAgZGVjaW1hbHMgPSBzZW5kUGFyYW1zLmRlY2ltYWxQbGFjZXM7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY29uc3QgY29pbiA9IGdldFNvbFRva2VuRnJvbVRva2VuTmFtZShzZW5kUGFyYW1zLnRva2VuTmFtZSk7XG4gICAgICAgICAgaWYgKGNvaW4pIHtcbiAgICAgICAgICAgIHRva2VuQWRkcmVzcyA9IGNvaW4udG9rZW5BZGRyZXNzO1xuICAgICAgICAgICAgdG9rZW5OYW1lID0gY29pbi5uYW1lO1xuICAgICAgICAgICAgcHJvZ3JhbUlkID0gY29pbi5wcm9ncmFtSWQ7XG4gICAgICAgICAgICBkZWNpbWFscyA9IGNvaW4uZGVjaW1hbFBsYWNlcztcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBDb3VsZCBub3QgZGV0ZXJtaW5lIHRva2VuIGluZm9ybWF0aW9uIGZvciAke3NlbmRQYXJhbXMudG9rZW5OYW1lfWApO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBjb25zdCBzb3VyY2VBZGRyZXNzID0gYXdhaXQgZ2V0QXNzb2NpYXRlZFRva2VuQWNjb3VudEFkZHJlc3ModG9rZW5BZGRyZXNzLCB0aGlzLl9zZW5kZXIsIGZhbHNlLCBwcm9ncmFtSWQpO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIHR5cGU6IEluc3RydWN0aW9uQnVpbGRlclR5cGVzLlRva2VuVHJhbnNmZXIsXG4gICAgICAgICAgcGFyYW1zOiB7XG4gICAgICAgICAgICBmcm9tQWRkcmVzczogdGhpcy5fc2VuZGVyLFxuICAgICAgICAgICAgdG9BZGRyZXNzOiBzZW5kUGFyYW1zLmFkZHJlc3MsXG4gICAgICAgICAgICBhbW91bnQ6IHNlbmRQYXJhbXMuYW1vdW50LFxuICAgICAgICAgICAgdG9rZW5OYW1lOiB0b2tlbk5hbWUsXG4gICAgICAgICAgICBzb3VyY2VBZGRyZXNzOiBzb3VyY2VBZGRyZXNzLFxuICAgICAgICAgICAgdG9rZW5BZGRyZXNzOiB0b2tlbkFkZHJlc3MsXG4gICAgICAgICAgICBwcm9ncmFtSWQ6IHByb2dyYW1JZCxcbiAgICAgICAgICAgIGRlY2ltYWxQbGFjZXM6IGRlY2ltYWxzLFxuICAgICAgICAgIH0sXG4gICAgICAgIH07XG4gICAgICB9KVxuICAgICk7XG4gICAgY29uc3QgdW5pcXVlQ3JlYXRlQXRhUGFyYW1zID0gXy51bmlxQnkodGhpcy5fY3JlYXRlQXRhUGFyYW1zLCAocmVjaXBpZW50OiBUb2tlbkFzc29jaWF0ZVJlY2lwaWVudCkgPT4ge1xuICAgICAgcmV0dXJuIHJlY2lwaWVudC5vd25lckFkZHJlc3MgKyByZWNpcGllbnQudG9rZW5OYW1lO1xuICAgIH0pO1xuICAgIGNvbnN0IGNyZWF0ZUF0YUluc3RydWN0aW9ucyA9IGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgdW5pcXVlQ3JlYXRlQXRhUGFyYW1zLm1hcChhc3luYyAocmVjaXBpZW50OiBUb2tlbkFzc29jaWF0ZVJlY2lwaWVudCk6IFByb21pc2U8QXRhSW5pdD4gPT4ge1xuICAgICAgICBsZXQgdG9rZW5BZGRyZXNzOiBzdHJpbmc7XG4gICAgICAgIGxldCB0b2tlbk5hbWU6IHN0cmluZztcbiAgICAgICAgbGV0IHByb2dyYW1JZDogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICAgICAgICBpZiAocmVjaXBpZW50LnRva2VuQWRkcmVzcyAmJiByZWNpcGllbnQucHJvZ3JhbUlkKSB7XG4gICAgICAgICAgdG9rZW5OYW1lID0gcmVjaXBpZW50LnRva2VuTmFtZTtcbiAgICAgICAgICB0b2tlbkFkZHJlc3MgPSByZWNpcGllbnQudG9rZW5BZGRyZXNzO1xuICAgICAgICAgIHByb2dyYW1JZCA9IHJlY2lwaWVudC5wcm9ncmFtSWQ7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY29uc3QgY29pbiA9IGdldFNvbFRva2VuRnJvbVRva2VuTmFtZShyZWNpcGllbnQudG9rZW5OYW1lKTtcbiAgICAgICAgICBpZiAoY29pbikge1xuICAgICAgICAgICAgdG9rZW5OYW1lID0gY29pbi5uYW1lO1xuICAgICAgICAgICAgdG9rZW5BZGRyZXNzID0gY29pbi50b2tlbkFkZHJlc3M7XG4gICAgICAgICAgICBwcm9ncmFtSWQgPSBjb2luLnByb2dyYW1JZDtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBDb3VsZCBub3QgZGV0ZXJtaW5lIHRva2VuIGluZm9ybWF0aW9uIGZvciAke3JlY2lwaWVudC50b2tlbk5hbWV9YCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gVXNlIHRoZSBwcm92aWRlZCBhdGFBZGRyZXNzIGlmIGl0IGV4aXN0cywgb3RoZXJ3aXNlIGNhbGN1bGF0ZSBpdFxuICAgICAgICBsZXQgYXRhQWRkcmVzcyA9IHJlY2lwaWVudC5hdGFBZGRyZXNzO1xuICAgICAgICBpZiAoIWF0YUFkZHJlc3MpIHtcbiAgICAgICAgICBhdGFBZGRyZXNzID0gYXdhaXQgZ2V0QXNzb2NpYXRlZFRva2VuQWNjb3VudEFkZHJlc3ModG9rZW5BZGRyZXNzLCByZWNpcGllbnQub3duZXJBZGRyZXNzLCBmYWxzZSwgcHJvZ3JhbUlkKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIHR5cGU6IEluc3RydWN0aW9uQnVpbGRlclR5cGVzLkNyZWF0ZUFzc29jaWF0ZWRUb2tlbkFjY291bnQsXG4gICAgICAgICAgcGFyYW1zOiB7XG4gICAgICAgICAgICBvd25lckFkZHJlc3M6IHJlY2lwaWVudC5vd25lckFkZHJlc3MsXG4gICAgICAgICAgICBtaW50QWRkcmVzczogdG9rZW5BZGRyZXNzLFxuICAgICAgICAgICAgYXRhQWRkcmVzcyxcbiAgICAgICAgICAgIC8vIE1hdGNoIHRyYW5zYWN0aW9uQnVpbGRlciBmZWUgcGF5ZXIgc2VsZWN0aW9uOiB3aGVuIGEgZGlzdGluY3QgZmVlIHBheWVyXG4gICAgICAgICAgICAvLyBpcyBzZXQgKGUuZy4gZ2FzIHRhbmspLCBpdCBtdXN0IGZ1bmQgQVRBIHJlbnQg4oCUIG5vdCB0aGUgdG9rZW4gc2VuZGVyLlxuICAgICAgICAgICAgcGF5ZXJBZGRyZXNzOiB0aGlzLl9mZWVQYXllciA/PyB0aGlzLl9zZW5kZXIsXG4gICAgICAgICAgICB0b2tlbk5hbWU6IHRva2VuTmFtZSxcbiAgICAgICAgICAgIHByb2dyYW1JZDogcHJvZ3JhbUlkLFxuICAgICAgICAgIH0sXG4gICAgICAgIH07XG4gICAgICB9KVxuICAgICk7XG4gICAgY29uc3QgYWRkUHJpb3JpdHlGZWVJbnN0cnVjdGlvbjogU2V0UHJpb3JpdHlGZWUgPSB7XG4gICAgICB0eXBlOiBJbnN0cnVjdGlvbkJ1aWxkZXJUeXBlcy5TZXRQcmlvcml0eUZlZSxcbiAgICAgIHBhcmFtczoge1xuICAgICAgICBmZWU6IHRoaXMuX3ByaW9yaXR5RmVlLFxuICAgICAgfSxcbiAgICB9O1xuXG4gICAgaWYgKCF0aGlzLl9wcmlvcml0eUZlZSB8fCB0aGlzLl9wcmlvcml0eUZlZSA9PT0gTnVtYmVyKDApKSB7XG4gICAgICB0aGlzLl9pbnN0cnVjdGlvbnNEYXRhID0gWy4uLmNyZWF0ZUF0YUluc3RydWN0aW9ucywgLi4uc2VuZEluc3RydWN0aW9uc107XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIG9yZGVyIGlzIGltcG9ydGFudCwgY3JlYXRlQXRhSW5zdHJ1Y3Rpb25zIG11c3QgYmUgYmVmb3JlIHNlbmRJbnN0cnVjdGlvbnNcbiAgICAgIHRoaXMuX2luc3RydWN0aW9uc0RhdGEgPSBbYWRkUHJpb3JpdHlGZWVJbnN0cnVjdGlvbiwgLi4uY3JlYXRlQXRhSW5zdHJ1Y3Rpb25zLCAuLi5zZW5kSW5zdHJ1Y3Rpb25zXTtcbiAgICB9XG4gICAgcmV0dXJuIGF3YWl0IHN1cGVyLmJ1aWxkSW1wbGVtZW50YXRpb24oKTtcbiAgfVxufVxuIl19
237
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidG9rZW5UcmFuc2ZlckJ1aWxkZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbGliL3Rva2VuVHJhbnNmZXJCdWlsZGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7OztBQUNBLG1EQUE4RTtBQUU5RSxtQ0FPaUI7QUFDakIsMkNBQXNEO0FBU3RELG9EQUE0QjtBQUM1Qiw2REFBMEQ7QUFDMUQsb0RBQXVCO0FBV3ZCLE1BQU0sbUJBQW1CLEdBQUcsTUFBTSxDQUFDLHNCQUFzQixDQUFDLENBQUM7QUFFM0QsTUFBYSxvQkFBcUIsU0FBUSx1Q0FBa0I7SUFNMUQsWUFBWSxXQUFpQztRQUMzQyxLQUFLLENBQUMsV0FBVyxDQUFDLENBQUM7UUFOYixnQkFBVyxHQUFpQixFQUFFLENBQUM7UUFPckMsSUFBSSxDQUFDLGdCQUFnQixHQUFHLEVBQUUsQ0FBQztJQUM3QixDQUFDO0lBRUQ7Ozs7Ozs7Ozs7O09BV0c7SUFDSCxrQkFBa0IsQ0FBQyxNQUE4QztRQUMvRCxJQUFJLENBQUMsbUJBQW1CLEdBQUcsTUFBTSxDQUFDO1FBQ2xDLE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztJQUVEOzs7Ozs7Ozs7T0FTRztJQUNILG9CQUFvQixDQUFDLEtBQXlCO1FBQzVDLElBQUksQ0FBQyxxQkFBcUIsR0FBRyxLQUFLLENBQUM7UUFDbkMsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBRUQsSUFBYyxlQUFlO1FBQzNCLE9BQU8sMEJBQWUsQ0FBQyxJQUFJLENBQUM7SUFDOUIsQ0FBQztJQUVELFdBQVcsQ0FBQyxFQUFlO1FBQ3pCLEtBQUssQ0FBQyxXQUFXLENBQUMsRUFBRSxDQUFDLENBQUM7UUFFdEIsS0FBSyxNQUFNLFdBQVcsSUFBSSxJQUFJLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztZQUNqRCxJQUFJLFdBQVcsQ0FBQyxJQUFJLEtBQUssbUNBQXVCLENBQUMsYUFBYSxFQUFFLENBQUM7Z0JBQy9ELE1BQU0sbUJBQW1C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Q0FBQyxTQUFTLElBQUksSUFBSSxDQUFDLE9BQU87b0JBQzVDLFNBQVMsRUFBRSxTQUFTO29CQUNwQixTQUFTLEVBQUUsU0FBUztpQkFDckI7YUFDRixDQUFDO1FBQ0osQ0FBQyxDQUFDLENBQ0gsQ0FBQztRQUNGLE1BQU0seUJBQXlCLEdBQW1CO1lBQ2hELElBQUksRUFBRSxtQ0FBdUIsQ0FBQyxjQUFjO1lBQzVDLE1BQU0sRUFBRTtnQkFDTixHQUFHLEVBQUUsSUFBSSxDQUFDLFlBQVk7YUFDdkI7U0FDRixDQUFDO1FBRUYsMkZBQTJGO1FBQzNGLDRFQUE0RTtRQUM1RSxNQUFNLGdCQUFnQixHQUFtQyxJQUFJLENBQUMsbUJBQW1CO1lBQy9FLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxFQUFFLG1DQUF1QixDQUFDLDRCQUE0QixFQUFFLE1BQU0sRUFBRSxJQUFJLENBQUMsbUJBQW1CLEVBQUUsQ0FBQztZQUNwRyxDQUFDLENBQUMsRUFBRSxDQUFDO1FBRVAsSUFBSSxDQUFDLElBQUksQ0FBQyxZQUFZLElBQUksSUFBSSxDQUFDLFlBQVksS0FBSyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztZQUMxRCxJQUFJLENBQUMsaUJBQWlCLEdBQUcsQ0FBQyxHQUFHLHFCQUFxQixFQUFFLEdBQUcsZ0JBQWdCLEVBQUUsR0FBRyxnQkFBZ0IsQ0FBQyxDQUFDO1FBQ2hHLENBQUM7YUFBTSxDQUFDO1lBQ04sNEVBQTRFO1lBQzVFLElBQUksQ0FBQyxpQkFBaUIsR0FBRztnQkFDdkIseUJBQXlCO2dCQUN6QixHQUFHLHFCQUFxQjtnQkFDeEIsR0FBRyxnQkFBZ0I7Z0JBQ25CLEdBQUcsZ0JBQWdCO2FBQ3BCLENBQUM7UUFDSixDQUFDO1FBQ0QsT0FBTyxNQUFNLEtBQUssQ0FBQyxtQkFBbUIsRUFBRSxDQUFDO0lBQzNDLENBQUM7Q0FDRjtBQTNPRCxvREEyT0MiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBCYXNlQ29pbiBhcyBDb2luQ29uZmlnIH0gZnJvbSAnQGJpdGdvLWJldGEvc3RhdGljcyc7XG5pbXBvcnQgeyBCdWlsZFRyYW5zYWN0aW9uRXJyb3IsIFRyYW5zYWN0aW9uVHlwZSB9IGZyb20gJ0BiaXRnby1iZXRhL3Nkay1jb3JlJztcbmltcG9ydCB7IFRyYW5zYWN0aW9uIH0gZnJvbSAnLi90cmFuc2FjdGlvbic7XG5pbXBvcnQge1xuICBnZXRBc3NvY2lhdGVkVG9rZW5BY2NvdW50QWRkcmVzcyxcbiAgZ2V0U29sVG9rZW5Gcm9tVG9rZW5OYW1lLFxuICBpc1ZhbGlkQW1vdW50LFxuICB2YWxpZGF0ZUFkZHJlc3MsXG4gIHZhbGlkYXRlTWludEFkZHJlc3MsXG4gIHZhbGlkYXRlT3duZXJBZGRyZXNzLFxufSBmcm9tICcuL3V0aWxzJztcbmltcG9ydCB7IEluc3RydWN0aW9uQnVpbGRlclR5cGVzIH0gZnJvbSAnLi9jb25zdGFudHMnO1xuaW1wb3J0IHtcbiAgQXRhSW5pdCxcbiAgRXh0cmFBY2NvdW50TWV0YSxcbiAgUGVybWlzc2lvbmxlc3NUaGF3SWRlbXBvdGVudCxcbiAgVG9rZW5Bc3NvY2lhdGVSZWNpcGllbnQsXG4gIFRva2VuVHJhbnNmZXIsXG4gIFNldFByaW9yaXR5RmVlLFxufSBmcm9tICcuL2lmYWNlJztcbmltcG9ydCBhc3NlcnQgZnJvbSAnYXNzZXJ0JztcbmltcG9ydCB7IFRyYW5zYWN0aW9uQnVpbGRlciB9IGZyb20gJy4vdHJhbnNhY3Rpb25CdWlsZGVyJztcbmltcG9ydCBfIGZyb20gJ2xvZGFzaCc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgU2VuZFBhcmFtcyB7XG4gIGFkZHJlc3M6IHN0cmluZztcbiAgYW1vdW50OiBzdHJpbmc7XG4gIHRva2VuTmFtZTogc3RyaW5nO1xuICB0b2tlbkFkZHJlc3M/OiBzdHJpbmc7XG4gIHByb2dyYW1JZD86IHN0cmluZztcbiAgZGVjaW1hbFBsYWNlcz86IG51bWJlcjtcbn1cblxuY29uc3QgVU5TSUdORURfQklHSU5UX01BWCA9IEJpZ0ludCgnMTg0NDY3NDQwNzM3MDk1NTE2MTUnKTtcblxuZXhwb3J0IGNsYXNzIFRva2VuVHJhbnNmZXJCdWlsZGVyIGV4dGVuZHMgVHJhbnNhY3Rpb25CdWlsZGVyIHtcbiAgcHJpdmF0ZSBfc2VuZFBhcmFtczogU2VuZFBhcmFtc1tdID0gW107XG4gIHByaXZhdGUgX2NyZWF0ZUF0YVBhcmFtczogVG9rZW5Bc3NvY2lhdGVSZWNpcGllbnRbXTtcbiAgcHJpdmF0ZSBfdHJhbnNmZXJIb29rQWNjb3VudHM/OiBFeHRyYUFjY291bnRNZXRhW107XG4gIHByaXZhdGUgX3Blcm1pc3Npb25sZXNzVGhhdz86IFBlcm1pc3Npb25sZXNzVGhhd0lkZW1wb3RlbnRbJ3BhcmFtcyddO1xuXG4gIGNvbnN0cnVjdG9yKF9jb2luQ29uZmlnOiBSZWFkb25seTxDb2luQ29uZmlnPikge1xuICAgIHN1cGVyKF9jb2luQ29uZmlnKTtcbiAgICB0aGlzLl9jcmVhdGVBdGFQYXJhbXMgPSBbXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXQgdGhlIHJlc29sdmVkIHNSRkMtMzcgVG9rZW4gQUNMIHBlcm1pc3Npb25sZXNzLXRoYXcgcGFyYW1zIGZvciB0aGlzIHRyYW5zZmVyLlxuICAgKlxuICAgKiBUaGVzZSBtdXN0IGJlIHJlc29sdmVkIGxpdmUgYnkgdGhlIGNhbGxlciAoZS5nLiB2aWEgYFNvbC5yZXNvbHZlUGVybWlzc2lvbmxlc3NUaGF3YCkgc2luY2VcbiAgICogYnVpbGRlcnMgcmVtYWluIG9mZmxpbmUgYW5kIG5ldmVyIHBlcmZvcm0gUlBDLiBXaGVuIHNldCwgdGhlIGJ1aWx0IHRyYW5zYWN0aW9uIGJ1bmRsZXMgYVxuICAgKiBgUGVybWlzc2lvbmxlc3NUaGF3SWRlbXBvdGVudGAgaW5zdHJ1Y3Rpb24gYWZ0ZXIgYW55IEFUQSBjcmVhdGlvbiBhbmQgYmVmb3JlIHRoZSB0cmFuc2Zlciwgc29cbiAgICogYSBmcmVzaGx5IGNyZWF0ZWQgKGZyb3plbikgYWxsb3dsaXN0L2Jsb2NrbGlzdCB0b2tlbiBhY2NvdW50IGlzIHRoYXdlZCBhdG9taWNhbGx5IHdpdGggdGhlXG4gICAqIHRyYW5zZmVyIOKAlCBhbGwtb3Itbm90aGluZy5cbiAgICpcbiAgICogQHBhcmFtIHtQZXJtaXNzaW9ubGVzc1RoYXdJZGVtcG90ZW50WydwYXJhbXMnXX0gcGFyYW1zIC0gcmVzb2x2ZWQgdGhhdyBwYXJhbXNcbiAgICogQHJldHVybnMge1Rva2VuVHJhbnNmZXJCdWlsZGVyfSBUaGlzIHRyYW5zYWN0aW9uIGJ1aWxkZXJcbiAgICovXG4gIHBlcm1pc3Npb25sZXNzVGhhdyhwYXJhbXM6IFBlcm1pc3Npb25sZXNzVGhhd0lkZW1wb3RlbnRbJ3BhcmFtcyddKTogdGhpcyB7XG4gICAgdGhpcy5fcGVybWlzc2lvbmxlc3NUaGF3ID0gcGFyYW1zO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldCB0aGUgcmVzb2x2ZWQgVG9rZW4tMjAyMiBUcmFuc2ZlciBIb29rIGV4dHJhIGFjY291bnQgbWV0YXMgZm9yIHRoaXMgdHJhbnNmZXIuXG4gICAqXG4gICAqIFRoZXNlIG11c3QgYmUgcmVzb2x2ZWQgbGl2ZSBieSB0aGUgY2FsbGVyIChlLmcuIHZpYSBgU29sLnJlc29sdmVUcmFuc2Zlckhvb2tBY2NvdW50c2ApXG4gICAqIHNpbmNlIGJ1aWxkZXJzIHJlbWFpbiBvZmZsaW5lIGFuZCBuZXZlciBwZXJmb3JtIFJQQy4gVGhlIG9yZGVyIGlzIHNpZ25pZmljYW50IGFuZFxuICAgKiBtdXN0IG1hdGNoIHRoZSBob29rJ3MgRXh0cmFBY2NvdW50TWV0YUxpc3QuXG4gICAqXG4gICAqIEBwYXJhbSB7RXh0cmFBY2NvdW50TWV0YVtdfSBtZXRhcyAtIHJlc29sdmVkIGV4dHJhIGFjY291bnQgbWV0YXMsIGluIGhvb2sgb3JkZXJcbiAgICogQHJldHVybnMge1Rva2VuVHJhbnNmZXJCdWlsZGVyfSBUaGlzIHRyYW5zYWN0aW9uIGJ1aWxkZXJcbiAgICovXG4gIHRyYW5zZmVySG9va0FjY291bnRzKG1ldGFzOiBFeHRyYUFjY291bnRNZXRhW10pOiB0aGlzIHtcbiAgICB0aGlzLl90cmFuc2Zlckhvb2tBY2NvdW50cyA9IG1ldGFzO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgcHJvdGVjdGVkIGdldCB0cmFuc2FjdGlvblR5cGUoKTogVHJhbnNhY3Rpb25UeXBlIHtcbiAgICByZXR1cm4gVHJhbnNhY3Rpb25UeXBlLlNlbmQ7XG4gIH1cblxuICBpbml0QnVpbGRlcih0eDogVHJhbnNhY3Rpb24pOiB2b2lkIHtcbiAgICBzdXBlci5pbml0QnVpbGRlcih0eCk7XG5cbiAgICBmb3IgKGNvbnN0IGluc3RydWN0aW9uIG9mIHRoaXMuX2luc3RydWN0aW9uc0RhdGEpIHtcbiAgICAgIGlmIChpbnN0cnVjdGlvbi50eXBlID09PSBJbnN0cnVjdGlvbkJ1aWxkZXJUeXBlcy5Ub2tlblRyYW5zZmVyKSB7XG4gICAgICAgIGNvbnN0IHRyYW5zZmVySW5zdHJ1Y3Rpb246IFRva2VuVHJhbnNmZXIgPSBpbnN0cnVjdGlvbjtcbiAgICAgICAgdGhpcy5zZW5kZXIodHJhbnNmZXJJbnN0cnVjdGlvbi5wYXJhbXMuZnJvbUFkZHJlc3MpO1xuICAgICAgICB0aGlzLnNlbmQoe1xuICAgICAgICAgIGFkZHJlc3M6IHRyYW5zZmVySW5zdHJ1Y3Rpb24ucGFyYW1zLnRvQWRkcmVzcyxcbiAgICAgICAgICBhbW91bnQ6IHRyYW5zZmVySW5zdHJ1Y3Rpb24ucGFyYW1zLmFtb3VudCxcbiAgICAgICAgICB0b2tlbk5hbWU6IHRyYW5zZmVySW5zdHJ1Y3Rpb24ucGFyYW1zLnRva2VuTmFtZSxcbiAgICAgICAgICB0b2tlbkFkZHJlc3M6IHRyYW5zZmVySW5zdHJ1Y3Rpb24ucGFyYW1zLnRva2VuQWRkcmVzcyxcbiAgICAgICAgICBwcm9ncmFtSWQ6IHRyYW5zZmVySW5zdHJ1Y3Rpb24ucGFyYW1zLnByb2dyYW1JZCxcbiAgICAgICAgICBkZWNpbWFsUGxhY2VzOiB0cmFuc2Zlckluc3RydWN0aW9uLnBhcmFtcy5kZWNpbWFsUGxhY2VzLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIGlmIChpbnN0cnVjdGlvbi50eXBlID09PSBJbnN0cnVjdGlvbkJ1aWxkZXJUeXBlcy5DcmVhdGVBc3NvY2lhdGVkVG9rZW5BY2NvdW50KSB7XG4gICAgICAgIGNvbnN0IGF0YUluaXRJbnN0cnVjdGlvbjogQXRhSW5pdCA9IGluc3RydWN0aW9uO1xuICAgICAgICB0aGlzLl9jcmVhdGVBdGFQYXJhbXMucHVzaCh7XG4gICAgICAgICAgb3duZXJBZGRyZXNzOiBhdGFJbml0SW5zdHJ1Y3Rpb24ucGFyYW1zLm93bmVyQWRkcmVzcyxcbiAgICAgICAgICB0b2tlbk5hbWU6IGF0YUluaXRJbnN0cnVjdGlvbi5wYXJhbXMudG9rZW5OYW1lLFxuICAgICAgICAgIGF0YUFkZHJlc3M6IGF0YUluaXRJbnN0cnVjdGlvbi5wYXJhbXMuYXRhQWRkcmVzcyxcbiAgICAgICAgICB0b2tlbkFkZHJlc3M6IGF0YUluaXRJbnN0cnVjdGlvbi5wYXJhbXMubWludEFkZHJlc3MsXG4gICAgICAgICAgcHJvZ3JhbUlkOiBhdGFJbml0SW5zdHJ1Y3Rpb24ucGFyYW1zLnByb2dyYW1JZCxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqICBTZXQgYSB0cmFuc2ZlclxuICAgKlxuICAgKiBAcGFyYW0ge1NlbmRQYXJhbXN9IHBhcmFtcyAtIHBhcmFtcyBmb3IgdGhlIHRyYW5zZmVyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBwYXJhbXMuYWRkcmVzcyAtIHRoZSByZWNlaXZlciB0b2tlbiBhZGRyZXNzXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBwYXJhbXMuYW1vdW50IC0gdGhlIGFtb3VudCBzZW50XG4gICAqIEBwYXJhbSB7c3RyaW5nfSBwYXJhbXMudG9rZW5OYW1lIC0gbmFtZSBvZiB0b2tlbiB0aGF0IGlzIGludGVuZGVkIHRvIHNlbmRcbiAgICogQHJldHVybnMge1RyYW5zYWN0aW9uQnVpbGRlcn0gVGhpcyB0cmFuc2FjdGlvbiBidWlsZGVyXG4gICAqL1xuICBzZW5kKHsgYWRkcmVzcywgYW1vdW50LCB0b2tlbk5hbWUsIHRva2VuQWRkcmVzcywgcHJvZ3JhbUlkLCBkZWNpbWFsUGxhY2VzIH06IFNlbmRQYXJhbXMpOiB0aGlzIHtcbiAgICB2YWxpZGF0ZUFkZHJlc3MoYWRkcmVzcywgJ2FkZHJlc3MnKTtcbiAgICBpZiAoIWFtb3VudCB8fCAhaXNWYWxpZEFtb3VudChhbW91bnQpKSB7XG4gICAgICB0aHJvdyBuZXcgQnVpbGRUcmFuc2FjdGlvbkVycm9yKCdJbnZhbGlkIG9yIG1pc3NpbmcgYW1vdW50LCBnb3Q6ICcgKyBhbW91bnQpO1xuICAgIH1cbiAgICBpZiAoQmlnSW50KGFtb3VudCkgPiBVTlNJR05FRF9CSUdJTlRfTUFYKSB7XG4gICAgICB0aHJvdyBuZXcgQnVpbGRUcmFuc2FjdGlvbkVycm9yKGBpbnB1dCBhbW91bnQgJHthbW91bnR9IGV4Y2VlZHMgYmlnIGludCBsaW1pdCAke1VOU0lHTkVEX0JJR0lOVF9NQVh9YCk7XG4gICAgfVxuXG4gICAgdGhpcy5fc2VuZFBhcmFtcy5wdXNoKHsgYWRkcmVzcywgYW1vdW50LCB0b2tlbk5hbWU6IHRva2VuTmFtZSwgdG9rZW5BZGRyZXNzLCBwcm9ncmFtSWQsIGRlY2ltYWxQbGFjZXMgfSk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICpcbiAgICogQHBhcmFtIHtUb2tlbkFzc29jaWF0ZVJlY2lwaWVudH0gcmVjaXBpZW50IC0gcmVjaXBpZW50IG9mIHRoZSBhc3NvY2lhdGVkIHRva2VuIGFjY291bnQgY3JlYXRpb25cbiAgICogQHBhcmFtIHtzdHJpbmd9IHJlY2lwaWVudC5vd25lckFkZHJlc3MgLSBvd25lciBvZiB0aGUgYXNzb2NpYXRlZCB0b2tlbiBhY2NvdW50XG4gICAqIEBwYXJhbSB7c3RyaW5nfSByZWNpcGllbnQudG9rZW5OYW1lIC0gbmFtZSBvZiB0aGUgdG9rZW4gdGhhdCBpcyBpbnRlbmRlZCB0byBhc3NvY2lhdGVcbiAgICogQHJldHVybnMge1RyYW5zYWN0aW9uQnVpbGRlcn0gVGhpcyB0cmFuc2FjdGlvbiBidWlsZGVyXG4gICAqL1xuICBjcmVhdGVBc3NvY2lhdGVkVG9rZW5BY2NvdW50KHJlY2lwaWVudDogVG9rZW5Bc3NvY2lhdGVSZWNpcGllbnQpOiB0aGlzIHtcbiAgICB2YWxpZGF0ZU93bmVyQWRkcmVzcyhyZWNpcGllbnQub3duZXJBZGRyZXNzKTtcbiAgICBsZXQgdG9rZW5BZGRyZXNzOiBzdHJpbmc7XG4gICAgaWYgKHJlY2lwaWVudC50b2tlbkFkZHJlc3MpIHtcbiAgICAgIHRva2VuQWRkcmVzcyA9IHJlY2lwaWVudC50b2tlbkFkZHJlc3M7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IHRva2VuID0gZ2V0U29sVG9rZW5Gcm9tVG9rZW5OYW1lKHJlY2lwaWVudC50b2tlbk5hbWUpO1xuICAgICAgaWYgKHRva2VuKSB7XG4gICAgICAgIHRva2VuQWRkcmVzcyA9IHRva2VuLnRva2VuQWRkcmVzcztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRocm93IG5ldyBCdWlsZFRyYW5zYWN0aW9uRXJyb3IoJ0ludmFsaWQgdG9rZW4gbmFtZSwgZ290OiAnICsgcmVjaXBpZW50LnRva2VuTmFtZSk7XG4gICAgICB9XG4gICAgfVxuICAgIHZhbGlkYXRlTWludEFkZHJlc3ModG9rZW5BZGRyZXNzKTtcblxuICAgIHRoaXMuX2NyZWF0ZUF0YVBhcmFtcy5wdXNoKHJlY2lwaWVudCk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKiogQGluaGVyaXRkb2MgKi9cbiAgcHJvdGVjdGVkIGFzeW5jIGJ1aWxkSW1wbGVtZW50YXRpb24oKTogUHJvbWlzZTxUcmFuc2FjdGlvbj4ge1xuICAgIGFzc2VydCh0aGlzLl9zZW5kZXIsICdTZW5kZXIgbXVzdCBiZSBzZXQgYmVmb3JlIGJ1aWxkaW5nIHRoZSB0cmFuc2FjdGlvbicpO1xuICAgIGNvbnN0IHNlbmRJbnN0cnVjdGlvbnMgPSBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgIHRoaXMuX3NlbmRQYXJhbXMubWFwKGFzeW5jIChzZW5kUGFyYW1zOiBTZW5kUGFyYW1zKTogUHJvbWlzZTxUb2tlblRyYW5zZmVyPiA9PiB7XG4gICAgICAgIGxldCB0b2tlbkFkZHJlc3M6IHN0cmluZztcbiAgICAgICAgbGV0IHRva2VuTmFtZTogc3RyaW5nO1xuICAgICAgICBsZXQgcHJvZ3JhbUlkOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gICAgICAgIGxldCBkZWNpbWFsczogbnVtYmVyIHwgdW5kZWZpbmVkO1xuICAgICAgICBpZiAoc2VuZFBhcmFtcy50b2tlbkFkZHJlc3MgJiYgc2VuZFBhcmFtcy5wcm9ncmFtSWQgJiYgc2VuZFBhcmFtcy5kZWNpbWFsUGxhY2VzICE9IG51bGwpIHtcbiAgICAgICAgICB0b2tlbkFkZHJlc3MgPSBzZW5kUGFyYW1zLnRva2VuQWRkcmVzcztcbiAgICAgICAgICB0b2tlbk5hbWUgPSBzZW5kUGFyYW1zLnRva2VuTmFtZTtcbiAgICAgICAgICBwcm9ncmFtSWQgPSBzZW5kUGFyYW1zLnByb2dyYW1JZDtcbiAgICAgICAgICBkZWNpbWFscyA9IHNlbmRQYXJhbXMuZGVjaW1hbFBsYWNlcztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjb25zdCBjb2luID0gZ2V0U29sVG9rZW5Gcm9tVG9rZW5OYW1lKHNlbmRQYXJhbXMudG9rZW5OYW1lKTtcbiAgICAgICAgICBpZiAoY29pbikge1xuICAgICAgICAgICAgdG9rZW5BZGRyZXNzID0gY29pbi50b2tlbkFkZHJlc3M7XG4gICAgICAgICAgICB0b2tlbk5hbWUgPSBjb2luLm5hbWU7XG4gICAgICAgICAgICBwcm9ncmFtSWQgPSBjb2luLnByb2dyYW1JZDtcbiAgICAgICAgICAgIGRlY2ltYWxzID0gY29pbi5kZWNpbWFsUGxhY2VzO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYENvdWxkIG5vdCBkZXRlcm1pbmUgdG9rZW4gaW5mb3JtYXRpb24gZm9yICR7c2VuZFBhcmFtcy50b2tlbk5hbWV9YCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHNvdXJjZUFkZHJlc3MgPSBhd2FpdCBnZXRBc3NvY2lhdGVkVG9rZW5BY2NvdW50QWRkcmVzcyh0b2tlbkFkZHJlc3MsIHRoaXMuX3NlbmRlciwgZmFsc2UsIHByb2dyYW1JZCk7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgdHlwZTogSW5zdHJ1Y3Rpb25CdWlsZGVyVHlwZXMuVG9rZW5UcmFuc2ZlcixcbiAgICAgICAgICBwYXJhbXM6IHtcbiAgICAgICAgICAgIGZyb21BZGRyZXNzOiB0aGlzLl9zZW5kZXIsXG4gICAgICAgICAgICB0b0FkZHJlc3M6IHNlbmRQYXJhbXMuYWRkcmVzcyxcbiAgICAgICAgICAgIGFtb3VudDogc2VuZFBhcmFtcy5hbW91bnQsXG4gICAgICAgICAgICB0b2tlbk5hbWU6IHRva2VuTmFtZSxcbiAgICAgICAgICAgIHNvdXJjZUFkZHJlc3M6IHNvdXJjZUFkZHJlc3MsXG4gICAgICAgICAgICB0b2tlbkFkZHJlc3M6IHRva2VuQWRkcmVzcyxcbiAgICAgICAgICAgIHByb2dyYW1JZDogcHJvZ3JhbUlkLFxuICAgICAgICAgICAgZGVjaW1hbFBsYWNlczogZGVjaW1hbHMsXG4gICAgICAgICAgICAuLi4odGhpcy5fdHJhbnNmZXJIb29rQWNjb3VudHMgPyB7IHRyYW5zZmVySG9va0FjY291bnRzOiB0aGlzLl90cmFuc2Zlckhvb2tBY2NvdW50cyB9IDoge30pLFxuICAgICAgICAgIH0sXG4gICAgICAgIH07XG4gICAgICB9KVxuICAgICk7XG4gICAgY29uc3QgdW5pcXVlQ3JlYXRlQXRhUGFyYW1zID0gXy51bmlxQnkodGhpcy5fY3JlYXRlQXRhUGFyYW1zLCAocmVjaXBpZW50OiBUb2tlbkFzc29jaWF0ZVJlY2lwaWVudCkgPT4ge1xuICAgICAgcmV0dXJuIHJlY2lwaWVudC5vd25lckFkZHJlc3MgKyByZWNpcGllbnQudG9rZW5OYW1lO1xuICAgIH0pO1xuICAgIGNvbnN0IGNyZWF0ZUF0YUluc3RydWN0aW9ucyA9IGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgdW5pcXVlQ3JlYXRlQXRhUGFyYW1zLm1hcChhc3luYyAocmVjaXBpZW50OiBUb2tlbkFzc29jaWF0ZVJlY2lwaWVudCk6IFByb21pc2U8QXRhSW5pdD4gPT4ge1xuICAgICAgICBsZXQgdG9rZW5BZGRyZXNzOiBzdHJpbmc7XG4gICAgICAgIGxldCB0b2tlbk5hbWU6IHN0cmluZztcbiAgICAgICAgbGV0IHByb2dyYW1JZDogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICAgICAgICBpZiAocmVjaXBpZW50LnRva2VuQWRkcmVzcyAmJiByZWNpcGllbnQucHJvZ3JhbUlkKSB7XG4gICAgICAgICAgdG9rZW5OYW1lID0gcmVjaXBpZW50LnRva2VuTmFtZTtcbiAgICAgICAgICB0b2tlbkFkZHJlc3MgPSByZWNpcGllbnQudG9rZW5BZGRyZXNzO1xuICAgICAgICAgIHByb2dyYW1JZCA9IHJlY2lwaWVudC5wcm9ncmFtSWQ7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY29uc3QgY29pbiA9IGdldFNvbFRva2VuRnJvbVRva2VuTmFtZShyZWNpcGllbnQudG9rZW5OYW1lKTtcbiAgICAgICAgICBpZiAoY29pbikge1xuICAgICAgICAgICAgdG9rZW5OYW1lID0gY29pbi5uYW1lO1xuICAgICAgICAgICAgdG9rZW5BZGRyZXNzID0gY29pbi50b2tlbkFkZHJlc3M7XG4gICAgICAgICAgICBwcm9ncmFtSWQgPSBjb2luLnByb2dyYW1JZDtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBDb3VsZCBub3QgZGV0ZXJtaW5lIHRva2VuIGluZm9ybWF0aW9uIGZvciAke3JlY2lwaWVudC50b2tlbk5hbWV9YCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gVXNlIHRoZSBwcm92aWRlZCBhdGFBZGRyZXNzIGlmIGl0IGV4aXN0cywgb3RoZXJ3aXNlIGNhbGN1bGF0ZSBpdFxuICAgICAgICBsZXQgYXRhQWRkcmVzcyA9IHJlY2lwaWVudC5hdGFBZGRyZXNzO1xuICAgICAgICBpZiAoIWF0YUFkZHJlc3MpIHtcbiAgICAgICAgICBhdGFBZGRyZXNzID0gYXdhaXQgZ2V0QXNzb2NpYXRlZFRva2VuQWNjb3VudEFkZHJlc3ModG9rZW5BZGRyZXNzLCByZWNpcGllbnQub3duZXJBZGRyZXNzLCBmYWxzZSwgcHJvZ3JhbUlkKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIHR5cGU6IEluc3RydWN0aW9uQnVpbGRlclR5cGVzLkNyZWF0ZUFzc29jaWF0ZWRUb2tlbkFjY291bnQsXG4gICAgICAgICAgcGFyYW1zOiB7XG4gICAgICAgICAgICBvd25lckFkZHJlc3M6IHJlY2lwaWVudC5vd25lckFkZHJlc3MsXG4gICAgICAgICAgICBtaW50QWRkcmVzczogdG9rZW5BZGRyZXNzLFxuICAgICAgICAgICAgYXRhQWRkcmVzcyxcbiAgICAgICAgICAgIC8vIE1hdGNoIHRyYW5zYWN0aW9uQnVpbGRlciBmZWUgcGF5ZXIgc2VsZWN0aW9uOiB3aGVuIGEgZGlzdGluY3QgZmVlIHBheWVyXG4gICAgICAgICAgICAvLyBpcyBzZXQgKGUuZy4gZ2FzIHRhbmspLCBpdCBtdXN0IGZ1bmQgQVRBIHJlbnQg4oCUIG5vdCB0aGUgdG9rZW4gc2VuZGVyLlxuICAgICAgICAgICAgcGF5ZXJBZGRyZXNzOiB0aGlzLl9mZWVQYXllciA/PyB0aGlzLl9zZW5kZXIsXG4gICAgICAgICAgICB0b2tlbk5hbWU6IHRva2VuTmFtZSxcbiAgICAgICAgICAgIHByb2dyYW1JZDogcHJvZ3JhbUlkLFxuICAgICAgICAgIH0sXG4gICAgICAgIH07XG4gICAgICB9KVxuICAgICk7XG4gICAgY29uc3QgYWRkUHJpb3JpdHlGZWVJbnN0cnVjdGlvbjogU2V0UHJpb3JpdHlGZWUgPSB7XG4gICAgICB0eXBlOiBJbnN0cnVjdGlvbkJ1aWxkZXJUeXBlcy5TZXRQcmlvcml0eUZlZSxcbiAgICAgIHBhcmFtczoge1xuICAgICAgICBmZWU6IHRoaXMuX3ByaW9yaXR5RmVlLFxuICAgICAgfSxcbiAgICB9O1xuXG4gICAgLy8gV2hlbiByZXNvbHZlZCwgZW1pdCB0aGUgcGVybWlzc2lvbmxlc3MgdGhhdyBiZXR3ZWVuIEFUQSBjcmVhdGlvbiBhbmQgdGhlIHRyYW5zZmVyIHNvIHRoZVxuICAgIC8vIGJ1aWx0IG9yZGVyIGlzIFtDcmVhdGVBVEE/LCBQZXJtaXNzaW9ubGVzc1RoYXdJZGVtcG90ZW50LCBUb2tlblRyYW5zZmVyXS5cbiAgICBjb25zdCB0aGF3SW5zdHJ1Y3Rpb25zOiBQZXJtaXNzaW9ubGVzc1RoYXdJZGVtcG90ZW50W10gPSB0aGlzLl9wZXJtaXNzaW9ubGVzc1RoYXdcbiAgICAgID8gW3sgdHlwZTogSW5zdHJ1Y3Rpb25CdWlsZGVyVHlwZXMuUGVybWlzc2lvbmxlc3NUaGF3SWRlbXBvdGVudCwgcGFyYW1zOiB0aGlzLl9wZXJtaXNzaW9ubGVzc1RoYXcgfV1cbiAgICAgIDogW107XG5cbiAgICBpZiAoIXRoaXMuX3ByaW9yaXR5RmVlIHx8IHRoaXMuX3ByaW9yaXR5RmVlID09PSBOdW1iZXIoMCkpIHtcbiAgICAgIHRoaXMuX2luc3RydWN0aW9uc0RhdGEgPSBbLi4uY3JlYXRlQXRhSW5zdHJ1Y3Rpb25zLCAuLi50aGF3SW5zdHJ1Y3Rpb25zLCAuLi5zZW5kSW5zdHJ1Y3Rpb25zXTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gb3JkZXIgaXMgaW1wb3J0YW50LCBjcmVhdGVBdGFJbnN0cnVjdGlvbnMgbXVzdCBiZSBiZWZvcmUgc2VuZEluc3RydWN0aW9uc1xuICAgICAgdGhpcy5faW5zdHJ1Y3Rpb25zRGF0YSA9IFtcbiAgICAgICAgYWRkUHJpb3JpdHlGZWVJbnN0cnVjdGlvbixcbiAgICAgICAgLi4uY3JlYXRlQXRhSW5zdHJ1Y3Rpb25zLFxuICAgICAgICAuLi50aGF3SW5zdHJ1Y3Rpb25zLFxuICAgICAgICAuLi5zZW5kSW5zdHJ1Y3Rpb25zLFxuICAgICAgXTtcbiAgICB9XG4gICAgcmV0dXJuIGF3YWl0IHN1cGVyLmJ1aWxkSW1wbGVtZW50YXRpb24oKTtcbiAgfVxufVxuIl19
@@ -2,7 +2,7 @@ import { TransactionBuilder } from './transactionBuilder';
2
2
  import { TransactionType } from '@bitgo-beta/sdk-core';
3
3
  import { Transaction } from './transaction';
4
4
  import { BaseCoin as CoinConfig } from '@bitgo-beta/statics';
5
- import { TokenAssociateRecipient } from './iface';
5
+ import { ExtraAccountMeta, PermissionlessThawIdempotent, TokenAssociateRecipient } from './iface';
6
6
  export interface SendParams {
7
7
  address: string;
8
8
  amount: string;
@@ -14,7 +14,33 @@ export interface SendParams {
14
14
  export declare class TransferBuilderV2 extends TransactionBuilder {
15
15
  private _sendParams;
16
16
  private _createAtaParams;
17
+ private _transferHookAccounts?;
18
+ private _permissionlessThaw?;
17
19
  constructor(_coinConfig: Readonly<CoinConfig>);
20
+ /**
21
+ * Set the resolved sRFC-37 Token ACL permissionless-thaw params for this transfer.
22
+ *
23
+ * These must be resolved live by the caller (e.g. via `Sol.resolvePermissionlessThaw`) since
24
+ * builders remain offline and never perform RPC. When set, the built transaction bundles a
25
+ * `PermissionlessThawIdempotent` instruction after any ATA creation and before the transfer, so
26
+ * a freshly created (frozen) allowlist/blocklist token account is thawed atomically with the
27
+ * transfer — all-or-nothing.
28
+ *
29
+ * @param {PermissionlessThawIdempotent['params']} params - resolved thaw params
30
+ * @returns {TransferBuilderV2} This transaction builder
31
+ */
32
+ permissionlessThaw(params: PermissionlessThawIdempotent['params']): this;
33
+ /**
34
+ * Set the resolved Token-2022 Transfer Hook extra account metas for this transfer.
35
+ *
36
+ * These must be resolved live by the caller (e.g. via `Sol.resolveTransferHookAccounts`)
37
+ * since builders remain offline and never perform RPC. The order is significant and
38
+ * must match the hook's ExtraAccountMetaList.
39
+ *
40
+ * @param {ExtraAccountMeta[]} metas - resolved extra account metas, in hook order
41
+ * @returns {TransferBuilderV2} This transaction builder
42
+ */
43
+ transferHookAccounts(metas: ExtraAccountMeta[]): this;
18
44
  protected get transactionType(): TransactionType;
19
45
  initBuilder(tx: Transaction): void;
20
46
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"transferBuilderV2.d.ts","sourceRoot":"","sources":["../../../../src/lib/transferBuilderV2.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAC1D,OAAO,EAAyB,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAC9E,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAS5C,OAAO,EAAE,QAAQ,IAAI,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAE7D,OAAO,EAAW,uBAAuB,EAA2C,MAAM,SAAS,CAAC;AAIpG,MAAM,WAAW,UAAU;IACzB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAID,qBAAa,iBAAkB,SAAQ,kBAAkB;IACvD,OAAO,CAAC,WAAW,CAAoB;IACvC,OAAO,CAAC,gBAAgB,CAA4B;gBACxC,WAAW,EAAE,QAAQ,CAAC,UAAU,CAAC;IAK7C,SAAS,KAAK,eAAe,IAAI,eAAe,CAE/C;IAED,WAAW,CAAC,EAAE,EAAE,WAAW,GAAG,IAAI;IA8BlC;;;OAGG;IACH,QAAQ,CAAC,YAAY,EAAE,MAAM,GAAG,IAAI;IAMpC;;;;;OAKG;IACH,IAAI,CAAC,UAAU,EAAE,UAAU,GAAG,IAAI;IAiBlC;;;;;;OAMG;IACH,4BAA4B,CAAC,SAAS,EAAE,uBAAuB,GAAG,IAAI;IAmBtE,kBAAkB;cACF,mBAAmB,IAAI,OAAO,CAAC,WAAW,CAAC;CAgH5D"}
1
+ {"version":3,"file":"transferBuilderV2.d.ts","sourceRoot":"","sources":["../../../../src/lib/transferBuilderV2.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAC1D,OAAO,EAAyB,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAC9E,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAS5C,OAAO,EAAE,QAAQ,IAAI,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAE7D,OAAO,EAEL,gBAAgB,EAChB,4BAA4B,EAC5B,uBAAuB,EAIxB,MAAM,SAAS,CAAC;AAIjB,MAAM,WAAW,UAAU;IACzB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAID,qBAAa,iBAAkB,SAAQ,kBAAkB;IACvD,OAAO,CAAC,WAAW,CAAoB;IACvC,OAAO,CAAC,gBAAgB,CAA4B;IACpD,OAAO,CAAC,qBAAqB,CAAC,CAAqB;IACnD,OAAO,CAAC,mBAAmB,CAAC,CAAyC;gBACzD,WAAW,EAAE,QAAQ,CAAC,UAAU,CAAC;IAK7C;;;;;;;;;;;OAWG;IACH,kBAAkB,CAAC,MAAM,EAAE,4BAA4B,CAAC,QAAQ,CAAC,GAAG,IAAI;IAKxE;;;;;;;;;OASG;IACH,oBAAoB,CAAC,KAAK,EAAE,gBAAgB,EAAE,GAAG,IAAI;IAKrD,SAAS,KAAK,eAAe,IAAI,eAAe,CAE/C;IAED,WAAW,CAAC,EAAE,EAAE,WAAW,GAAG,IAAI;IA8BlC;;;OAGG;IACH,QAAQ,CAAC,YAAY,EAAE,MAAM,GAAG,IAAI;IAMpC;;;;;OAKG;IACH,IAAI,CAAC,UAAU,EAAE,UAAU,GAAG,IAAI;IAiBlC;;;;;;OAMG;IACH,4BAA4B,CAAC,SAAS,EAAE,uBAAuB,GAAG,IAAI;IAmBtE,kBAAkB;cACF,mBAAmB,IAAI,OAAO,CAAC,WAAW,CAAC;CA4H5D"}