@bitgo/sdk-coin-sui 2.0.1 → 3.0.1
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.
- package/.eslintignore +1 -0
- package/CHANGELOG.md +37 -0
- package/dist/src/lib/constants.d.ts +3 -15
- package/dist/src/lib/constants.d.ts.map +1 -1
- package/dist/src/lib/constants.js +7 -20
- package/dist/src/lib/iface.d.ts +35 -181
- package/dist/src/lib/iface.d.ts.map +1 -1
- package/dist/src/lib/iface.js +11 -38
- package/dist/src/lib/index.d.ts +2 -0
- package/dist/src/lib/index.d.ts.map +1 -1
- package/dist/src/lib/index.js +6 -2
- package/dist/src/lib/keyPair.d.ts +4 -0
- package/dist/src/lib/keyPair.d.ts.map +1 -1
- package/dist/src/lib/keyPair.js +7 -10
- package/dist/src/lib/mystenlab/builder/Inputs.d.ts +66 -0
- package/dist/src/lib/mystenlab/builder/Inputs.d.ts.map +1 -0
- package/dist/src/lib/mystenlab/builder/Inputs.js +56 -0
- package/dist/src/lib/mystenlab/builder/TransactionBlock.d.ts +616 -0
- package/dist/src/lib/mystenlab/builder/TransactionBlock.d.ts.map +1 -0
- package/dist/src/lib/mystenlab/builder/TransactionBlock.js +260 -0
- package/dist/src/lib/mystenlab/builder/TransactionDataBlock.d.ts +566 -0
- package/dist/src/lib/mystenlab/builder/TransactionDataBlock.d.ts.map +1 -0
- package/dist/src/lib/mystenlab/builder/TransactionDataBlock.js +171 -0
- package/dist/src/lib/mystenlab/builder/Transactions.d.ts +992 -0
- package/dist/src/lib/mystenlab/builder/Transactions.d.ts.map +1 -0
- package/dist/src/lib/mystenlab/builder/Transactions.js +119 -0
- package/dist/src/lib/mystenlab/builder/bcs.d.ts +25 -0
- package/dist/src/lib/mystenlab/builder/bcs.d.ts.map +1 -0
- package/dist/src/lib/mystenlab/builder/bcs.js +141 -0
- package/dist/src/lib/mystenlab/builder/index.d.ts +5 -0
- package/dist/src/lib/mystenlab/builder/index.d.ts.map +1 -0
- package/dist/src/lib/mystenlab/builder/index.js +17 -0
- package/dist/src/lib/mystenlab/builder/serializer.d.ts +4 -0
- package/dist/src/lib/mystenlab/builder/serializer.d.ts.map +1 -0
- package/dist/src/lib/mystenlab/builder/serializer.js +101 -0
- package/dist/src/lib/mystenlab/builder/utils.d.ts +10 -0
- package/dist/src/lib/mystenlab/builder/utils.d.ts.map +1 -0
- package/dist/src/lib/mystenlab/builder/utils.js +10 -0
- package/dist/src/lib/mystenlab/cryptography/hash.d.ts +8 -0
- package/dist/src/lib/mystenlab/cryptography/hash.d.ts.map +1 -0
- package/dist/src/lib/mystenlab/cryptography/hash.js +22 -0
- package/dist/src/lib/mystenlab/framework/framework.d.ts +93 -0
- package/dist/src/lib/mystenlab/framework/framework.d.ts.map +1 -0
- package/dist/src/lib/mystenlab/framework/framework.js +138 -0
- package/dist/src/lib/mystenlab/framework/index.d.ts +3 -0
- package/dist/src/lib/mystenlab/framework/index.d.ts.map +1 -0
- package/dist/src/lib/mystenlab/framework/index.js +15 -0
- package/dist/src/lib/mystenlab/framework/sui-system-state.d.ts +12 -0
- package/dist/src/lib/mystenlab/framework/sui-system-state.d.ts.map +1 -0
- package/dist/src/lib/mystenlab/framework/sui-system-state.js +19 -0
- package/dist/src/lib/mystenlab/txn-data-serializers/type-tag-serializer.d.ts +7 -0
- package/dist/src/lib/mystenlab/txn-data-serializers/type-tag-serializer.d.ts.map +1 -0
- package/dist/src/lib/mystenlab/txn-data-serializers/type-tag-serializer.js +119 -0
- package/dist/src/lib/mystenlab/types/coin.d.ts +89 -0
- package/dist/src/lib/mystenlab/types/coin.d.ts.map +1 -0
- package/dist/src/lib/mystenlab/types/coin.js +32 -0
- package/dist/src/lib/mystenlab/types/common.d.ts +45 -0
- package/dist/src/lib/mystenlab/types/common.d.ts.map +1 -0
- package/dist/src/lib/mystenlab/types/common.js +84 -0
- package/dist/src/lib/mystenlab/types/events.d.ts +198 -0
- package/dist/src/lib/mystenlab/types/events.d.ts.map +1 -0
- package/dist/src/lib/mystenlab/types/events.js +46 -0
- package/dist/src/lib/mystenlab/types/index.d.ts +9 -0
- package/dist/src/lib/mystenlab/types/index.d.ts.map +1 -0
- package/dist/src/lib/mystenlab/types/index.js +21 -0
- package/dist/src/lib/mystenlab/types/normalized.d.ts +254 -0
- package/dist/src/lib/mystenlab/types/normalized.d.ts.map +1 -0
- package/dist/src/lib/mystenlab/types/normalized.js +111 -0
- package/dist/src/lib/mystenlab/types/objects.d.ts +806 -0
- package/dist/src/lib/mystenlab/types/objects.d.ts.map +1 -0
- package/dist/src/lib/mystenlab/types/objects.js +302 -0
- package/dist/src/lib/mystenlab/types/option.d.ts +8 -0
- package/dist/src/lib/mystenlab/types/option.d.ts.map +1 -0
- package/dist/src/lib/mystenlab/types/option.js +14 -0
- package/dist/src/lib/mystenlab/types/sui-bcs.d.ts +111 -0
- package/dist/src/lib/mystenlab/types/sui-bcs.d.ts.map +1 -0
- package/dist/src/lib/mystenlab/types/sui-bcs.js +107 -0
- package/dist/src/lib/mystenlab/types/transactions.d.ts +6703 -0
- package/dist/src/lib/mystenlab/types/transactions.d.ts.map +1 -0
- package/dist/src/lib/mystenlab/types/transactions.js +405 -0
- package/dist/src/lib/mystenlab/types/validator.d.ts +641 -0
- package/dist/src/lib/mystenlab/types/validator.d.ts.map +1 -0
- package/dist/src/lib/mystenlab/types/validator.js +156 -0
- package/dist/src/lib/stakingBuilder.d.ts +24 -35
- package/dist/src/lib/stakingBuilder.d.ts.map +1 -1
- package/dist/src/lib/stakingBuilder.js +93 -129
- package/dist/src/lib/stakingTransaction.d.ts +5 -21
- package/dist/src/lib/stakingTransaction.d.ts.map +1 -1
- package/dist/src/lib/stakingTransaction.js +77 -219
- package/dist/src/lib/transaction.d.ts +8 -6
- package/dist/src/lib/transaction.d.ts.map +1 -1
- package/dist/src/lib/transaction.js +74 -124
- package/dist/src/lib/transactionBuilder.d.ts +9 -9
- package/dist/src/lib/transactionBuilder.d.ts.map +1 -1
- package/dist/src/lib/transactionBuilder.js +27 -16
- package/dist/src/lib/transactionBuilderFactory.d.ts +8 -5
- package/dist/src/lib/transactionBuilderFactory.d.ts.map +1 -1
- package/dist/src/lib/transactionBuilderFactory.js +17 -11
- package/dist/src/lib/transferBuilder.d.ts +15 -10
- package/dist/src/lib/transferBuilder.d.ts.map +1 -1
- package/dist/src/lib/transferBuilder.js +38 -101
- package/dist/src/lib/transferTransaction.d.ts +5 -4
- package/dist/src/lib/transferTransaction.d.ts.map +1 -1
- package/dist/src/lib/transferTransaction.js +45 -96
- package/dist/src/lib/unstakingBuilder.d.ts +55 -0
- package/dist/src/lib/unstakingBuilder.d.ts.map +1 -0
- package/dist/src/lib/unstakingBuilder.js +148 -0
- package/dist/src/lib/unstakingTransaction.d.ts +51 -0
- package/dist/src/lib/unstakingTransaction.d.ts.map +1 -0
- package/dist/src/lib/unstakingTransaction.js +206 -0
- package/dist/src/lib/utils.d.ts +30 -92
- package/dist/src/lib/utils.d.ts.map +1 -1
- package/dist/src/lib/utils.js +115 -177
- package/dist/src/sui.d.ts.map +1 -1
- package/dist/src/sui.js +23 -13
- package/package.json +9 -9
- package/dist/src/lib/bcs.d.ts +0 -3
- package/dist/src/lib/bcs.d.ts.map +0 -1
- package/dist/src/lib/bcs.js +0 -109
- package/dist/src/lib/txnSchema.d.ts +0 -7
- package/dist/src/lib/txnSchema.d.ts.map +0 -1
- package/dist/src/lib/txnSchema.js +0 -81
|
@@ -0,0 +1,171 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.TransactionBlockDataBuilder = exports.TRANSACTION_DATA_MAX_SIZE = exports.SerializedTransactionDataBuilder = exports.TransactionExpiration = void 0;
|
|
4
|
+
const bcs_1 = require("@mysten/bcs");
|
|
5
|
+
const superstruct_1 = require("superstruct");
|
|
6
|
+
const hash_1 = require("../cryptography/hash");
|
|
7
|
+
const types_1 = require("../types");
|
|
8
|
+
const bcs_2 = require("./bcs");
|
|
9
|
+
const Transactions_1 = require("./Transactions");
|
|
10
|
+
const Inputs_1 = require("./Inputs");
|
|
11
|
+
const utils_1 = require("./utils");
|
|
12
|
+
exports.TransactionExpiration = superstruct_1.optional(superstruct_1.nullable(superstruct_1.union([superstruct_1.object({ Epoch: superstruct_1.integer() }), superstruct_1.object({ None: superstruct_1.union([superstruct_1.literal(true), superstruct_1.literal(null)]) })])));
|
|
13
|
+
const SuiAddress = superstruct_1.string();
|
|
14
|
+
const StringEncodedBigint = superstruct_1.define('StringEncodedBigint', (val) => {
|
|
15
|
+
if (!['string', 'number', 'bigint'].includes(typeof val))
|
|
16
|
+
return false;
|
|
17
|
+
try {
|
|
18
|
+
BigInt(val);
|
|
19
|
+
return true;
|
|
20
|
+
}
|
|
21
|
+
catch {
|
|
22
|
+
return false;
|
|
23
|
+
}
|
|
24
|
+
});
|
|
25
|
+
const GasConfig = superstruct_1.object({
|
|
26
|
+
budget: superstruct_1.optional(StringEncodedBigint),
|
|
27
|
+
price: superstruct_1.optional(StringEncodedBigint),
|
|
28
|
+
payment: superstruct_1.optional(superstruct_1.array(types_1.SuiObjectRef)),
|
|
29
|
+
owner: superstruct_1.optional(SuiAddress),
|
|
30
|
+
});
|
|
31
|
+
exports.SerializedTransactionDataBuilder = superstruct_1.object({
|
|
32
|
+
version: superstruct_1.literal(1),
|
|
33
|
+
sender: superstruct_1.optional(SuiAddress),
|
|
34
|
+
expiration: exports.TransactionExpiration,
|
|
35
|
+
gasConfig: GasConfig,
|
|
36
|
+
inputs: superstruct_1.array(Transactions_1.TransactionBlockInput),
|
|
37
|
+
transactions: superstruct_1.array(Transactions_1.TransactionType),
|
|
38
|
+
});
|
|
39
|
+
function prepareSuiAddress(address) {
|
|
40
|
+
return types_1.normalizeSuiAddress(address).replace('0x', '');
|
|
41
|
+
}
|
|
42
|
+
// NOTE: This value should be kept in sync with the corresponding value in
|
|
43
|
+
// crates/sui-protocol-config/src/lib.rs
|
|
44
|
+
exports.TRANSACTION_DATA_MAX_SIZE = 128 * 1024;
|
|
45
|
+
class TransactionBlockDataBuilder {
|
|
46
|
+
constructor(clone) {
|
|
47
|
+
var _a, _b, _c;
|
|
48
|
+
this.version = 1;
|
|
49
|
+
this.sender = clone === null || clone === void 0 ? void 0 : clone.sender;
|
|
50
|
+
this.expiration = clone === null || clone === void 0 ? void 0 : clone.expiration;
|
|
51
|
+
this.gasConfig = (_a = clone === null || clone === void 0 ? void 0 : clone.gasConfig) !== null && _a !== void 0 ? _a : {};
|
|
52
|
+
this.inputs = (_b = clone === null || clone === void 0 ? void 0 : clone.inputs) !== null && _b !== void 0 ? _b : [];
|
|
53
|
+
this.transactions = (_c = clone === null || clone === void 0 ? void 0 : clone.transactions) !== null && _c !== void 0 ? _c : [];
|
|
54
|
+
}
|
|
55
|
+
static fromKindBytes(bytes) {
|
|
56
|
+
const kind = bcs_2.builder.de('TransactionKind', bytes);
|
|
57
|
+
const programmableTx = kind === null || kind === void 0 ? void 0 : kind.ProgrammableTransaction;
|
|
58
|
+
if (!programmableTx) {
|
|
59
|
+
throw new Error('Unable to deserialize from bytes.');
|
|
60
|
+
}
|
|
61
|
+
const serialized = utils_1.create({
|
|
62
|
+
version: 1,
|
|
63
|
+
gasConfig: {},
|
|
64
|
+
inputs: programmableTx.inputs.map((value, index) => utils_1.create({
|
|
65
|
+
kind: 'Input',
|
|
66
|
+
value,
|
|
67
|
+
index,
|
|
68
|
+
type: superstruct_1.is(value, Inputs_1.PureCallArg) ? 'pure' : 'object',
|
|
69
|
+
}, Transactions_1.TransactionBlockInput)),
|
|
70
|
+
transactions: programmableTx.transactions,
|
|
71
|
+
}, exports.SerializedTransactionDataBuilder);
|
|
72
|
+
return TransactionBlockDataBuilder.restore(serialized);
|
|
73
|
+
}
|
|
74
|
+
static fromBytes(bytes) {
|
|
75
|
+
var _a;
|
|
76
|
+
const rawData = bcs_2.builder.de('TransactionData', bytes);
|
|
77
|
+
const data = rawData === null || rawData === void 0 ? void 0 : rawData.V1;
|
|
78
|
+
const programmableTx = (_a = data === null || data === void 0 ? void 0 : data.kind) === null || _a === void 0 ? void 0 : _a.ProgrammableTransaction;
|
|
79
|
+
if (!data || !programmableTx) {
|
|
80
|
+
throw new Error('Unable to deserialize from bytes.');
|
|
81
|
+
}
|
|
82
|
+
const serialized = utils_1.create({
|
|
83
|
+
version: 1,
|
|
84
|
+
sender: data.sender,
|
|
85
|
+
expiration: data.expiration,
|
|
86
|
+
gasConfig: data.gasData,
|
|
87
|
+
inputs: programmableTx.inputs.map((value, index) => utils_1.create({
|
|
88
|
+
kind: 'Input',
|
|
89
|
+
value,
|
|
90
|
+
index,
|
|
91
|
+
type: superstruct_1.is(value, Inputs_1.PureCallArg) ? 'pure' : 'object',
|
|
92
|
+
}, Transactions_1.TransactionBlockInput)),
|
|
93
|
+
transactions: programmableTx.transactions,
|
|
94
|
+
}, exports.SerializedTransactionDataBuilder);
|
|
95
|
+
return TransactionBlockDataBuilder.restore(serialized);
|
|
96
|
+
}
|
|
97
|
+
static restore(data) {
|
|
98
|
+
superstruct_1.assert(data, exports.SerializedTransactionDataBuilder);
|
|
99
|
+
const transactionData = new TransactionBlockDataBuilder();
|
|
100
|
+
Object.assign(transactionData, data);
|
|
101
|
+
return transactionData;
|
|
102
|
+
}
|
|
103
|
+
/**
|
|
104
|
+
* Generate transaction digest.
|
|
105
|
+
*
|
|
106
|
+
* @param bytes BCS serialized transaction data
|
|
107
|
+
* @returns transaction digest.
|
|
108
|
+
*/
|
|
109
|
+
static getDigestFromBytes(bytes) {
|
|
110
|
+
const hash = hash_1.hashTypedData('TransactionData', bytes);
|
|
111
|
+
return bcs_1.toB58(hash);
|
|
112
|
+
}
|
|
113
|
+
build({ overrides, onlyTransactionKind, } = {}) {
|
|
114
|
+
var _a, _b, _c;
|
|
115
|
+
// Resolve inputs down to values:
|
|
116
|
+
const inputs = this.inputs.map((input) => {
|
|
117
|
+
superstruct_1.assert(input.value, Inputs_1.BuilderCallArg);
|
|
118
|
+
return input.value;
|
|
119
|
+
});
|
|
120
|
+
const kind = {
|
|
121
|
+
ProgrammableTransaction: {
|
|
122
|
+
inputs,
|
|
123
|
+
transactions: this.transactions,
|
|
124
|
+
},
|
|
125
|
+
};
|
|
126
|
+
if (onlyTransactionKind) {
|
|
127
|
+
return bcs_2.builder.ser('TransactionKind', kind, { maxSize: exports.TRANSACTION_DATA_MAX_SIZE }).toBytes();
|
|
128
|
+
}
|
|
129
|
+
const expiration = (_a = overrides === null || overrides === void 0 ? void 0 : overrides.expiration) !== null && _a !== void 0 ? _a : this.expiration;
|
|
130
|
+
const sender = (_b = overrides === null || overrides === void 0 ? void 0 : overrides.sender) !== null && _b !== void 0 ? _b : this.sender;
|
|
131
|
+
const gasConfig = { ...this.gasConfig, ...overrides === null || overrides === void 0 ? void 0 : overrides.gasConfig };
|
|
132
|
+
if (!sender) {
|
|
133
|
+
throw new Error('Missing transaction sender');
|
|
134
|
+
}
|
|
135
|
+
if (!gasConfig.budget) {
|
|
136
|
+
throw new Error('Missing gas budget');
|
|
137
|
+
}
|
|
138
|
+
if (!gasConfig.payment) {
|
|
139
|
+
throw new Error('Missing gas payment');
|
|
140
|
+
}
|
|
141
|
+
if (!gasConfig.price) {
|
|
142
|
+
throw new Error('Missing gas price');
|
|
143
|
+
}
|
|
144
|
+
const transactionData = {
|
|
145
|
+
sender: prepareSuiAddress(sender),
|
|
146
|
+
expiration: expiration ? expiration : { None: true },
|
|
147
|
+
gasData: {
|
|
148
|
+
payment: gasConfig.payment,
|
|
149
|
+
owner: prepareSuiAddress((_c = this.gasConfig.owner) !== null && _c !== void 0 ? _c : sender),
|
|
150
|
+
price: BigInt(gasConfig.price),
|
|
151
|
+
budget: BigInt(gasConfig.budget),
|
|
152
|
+
},
|
|
153
|
+
kind: {
|
|
154
|
+
ProgrammableTransaction: {
|
|
155
|
+
inputs,
|
|
156
|
+
transactions: this.transactions,
|
|
157
|
+
},
|
|
158
|
+
},
|
|
159
|
+
};
|
|
160
|
+
return bcs_2.builder.ser('TransactionData', { V1: transactionData }, { maxSize: exports.TRANSACTION_DATA_MAX_SIZE }).toBytes();
|
|
161
|
+
}
|
|
162
|
+
getDigest() {
|
|
163
|
+
const bytes = this.build({ onlyTransactionKind: false });
|
|
164
|
+
return TransactionBlockDataBuilder.getDigestFromBytes(bytes);
|
|
165
|
+
}
|
|
166
|
+
snapshot() {
|
|
167
|
+
return utils_1.create(this, exports.SerializedTransactionDataBuilder);
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
exports.TransactionBlockDataBuilder = TransactionBlockDataBuilder;
|
|
171
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiVHJhbnNhY3Rpb25EYXRhQmxvY2suanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvbGliL215c3RlbmxhYi9idWlsZGVyL1RyYW5zYWN0aW9uRGF0YUJsb2NrLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLHFDQUFvQztBQUNwQyw2Q0FhcUI7QUFDckIsK0NBQXFEO0FBQ3JELG9DQUE2RDtBQUM3RCwrQkFBZ0M7QUFDaEMsaURBQXdFO0FBQ3hFLHFDQUF1RDtBQUN2RCxtQ0FBaUM7QUFFcEIsUUFBQSxxQkFBcUIsR0FBRyxzQkFBUSxDQUMzQyxzQkFBUSxDQUFDLG1CQUFLLENBQUMsQ0FBQyxvQkFBTSxDQUFDLEVBQUUsS0FBSyxFQUFFLHFCQUFPLEVBQUUsRUFBRSxDQUFDLEVBQUUsb0JBQU0sQ0FBQyxFQUFFLElBQUksRUFBRSxtQkFBSyxDQUFDLENBQUMscUJBQU8sQ0FBQyxJQUFJLENBQUMsRUFBRSxxQkFBTyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQ3pHLENBQUM7QUFHRixNQUFNLFVBQVUsR0FBRyxvQkFBTSxFQUFFLENBQUM7QUFFNUIsTUFBTSxtQkFBbUIsR0FBRyxvQkFBTSxDQUFTLHFCQUFxQixFQUFFLENBQUMsR0FBRyxFQUFFLEVBQUU7SUFDeEUsSUFBSSxDQUFDLENBQUMsUUFBUSxFQUFFLFFBQVEsRUFBRSxRQUFRLENBQUMsQ0FBQyxRQUFRLENBQUMsT0FBTyxHQUFHLENBQUM7UUFBRSxPQUFPLEtBQUssQ0FBQztJQUV2RSxJQUFJO1FBQ0YsTUFBTSxDQUFDLEdBQWEsQ0FBQyxDQUFDO1FBQ3RCLE9BQU8sSUFBSSxDQUFDO0tBQ2I7SUFBQyxNQUFNO1FBQ04sT0FBTyxLQUFLLENBQUM7S0FDZDtBQUNILENBQUMsQ0FBQyxDQUFDO0FBRUgsTUFBTSxTQUFTLEdBQUcsb0JBQU0sQ0FBQztJQUN2QixNQUFNLEVBQUUsc0JBQVEsQ0FB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RSxlQUFlLEVBQUUsRUFBRSxFQUFFLE9BQU8sRUFBRSxpQ0FBeUIsRUFBRSxDQUFDLENBQUMsT0FBTyxFQUFFLENBQUM7SUFDbkgsQ0FBQztJQUVELFNBQVM7UUFDUCxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLEVBQUUsbUJBQW1CLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQztRQUN6RCxPQUFPLDJCQUEyQixDQUFDLGtCQUFrQixDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQy9ELENBQUM7SUFFRCxRQUFRO1FBQ04sT0FBTyxjQUFNLENBQUMsSUFBSSxFQUFFLHdDQUFnQyxDQUFDLENBQUM7SUFDeEQsQ0FBQztDQUNGO0FBektELGtFQXlLQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IHRvQjU4IH0gZnJvbSAnQG15c3Rlbi9iY3MnO1xuaW1wb3J0IHtcbiAgYXJyYXksXG4gIGFzc2VydCxcbiAgZGVmaW5lLFxuICBJbmZlcixcbiAgaW50ZWdlcixcbiAgaXMsXG4gIGxpdGVyYWwsXG4gIG51bGxhYmxlLFxuICBvYmplY3QsXG4gIG9wdGlvbmFsLFxuICBzdHJpbmcsXG4gIHVuaW9uLFxufSBmcm9tICdzdXBlcnN0cnVjdCc7XG5pbXBvcnQgeyBoYXNoVHlwZWREYXRhIH0gZnJvbSAnLi4vY3J5cHRvZ3JhcGh5L2hhc2gnO1xuaW1wb3J0IHsgbm9ybWFsaXplU3VpQWRkcmVzcywgU3VpT2JqZWN0UmVmIH0gZnJvbSAnLi4vdHlwZXMnO1xuaW1wb3J0IHsgYnVpbGRlciB9IGZyb20gJy4vYmNzJztcbmltcG9ydCB7IFRyYW5zYWN0aW9uVHlwZSwgVHJhbnNhY3Rpb25CbG9ja0lucHV0IH0gZnJvbSAnLi9UcmFuc2FjdGlvbnMnO1xuaW1wb3J0IHsgQnVpbGRlckNhbGxBcmcsIFB1cmVDYWxsQXJnIH0gZnJvbSAnLi9JbnB1dHMnO1xuaW1wb3J0IHsgY3JlYXRlIH0gZnJvbSAnLi91dGlscyc7XG5cbmV4cG9ydCBjb25zdCBUcmFuc2FjdGlvbkV4cGlyYXRpb24gPSBvcHRpb25hbChcbiAgbnVsbGFibGUodW5pb24oW29iamVjdCh7IEVwb2NoOiBpbnRlZ2VyKCkgfSksIG9iamVjdCh7IE5vbmU6IHVuaW9uKFtsaXRlcmFsKHRydWUpLCBsaXRlcmFsKG51bGwpXSkgfSldKSlcbik7XG5leHBvcnQgdHlwZSBUcmFuc2FjdGlvbkV4cGlyYXRpb24gPSBJbmZlcjx0eXBlb2YgVHJhbnNhY3Rpb25FeHBpcmF0aW9uPjtcblxuY29uc3QgU3VpQWRkcmVzcyA9IHN0cmluZygpO1xuXG5jb25zdCBTdHJpbmdFbmNvZGVkQmlnaW50ID0gZGVmaW5lPHN0cmluZz4oJ1N0cmluZ0VuY29kZWRCaWdpbnQnLCAodmFsKSA9PiB7XG4gIGlmICghWydzdHJpbmcnLCAnbnVtYmVyJywgJ2JpZ2ludCddLmluY2x1ZGVzKHR5cGVvZiB2YWwpKSByZXR1cm4gZmFsc2U7XG5cbiAgdHJ5IHtcbiAgICBCaWdJbnQodmFsIGFzIHN0cmluZyk7XG4gICAgcmV0dXJuIHRydWU7XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxufSk7XG5cbmNvbnN0IEdhc0NvbmZpZyA9IG9iamVjdCh7XG4gIGJ1ZGdldDogb3B0aW9uYWwoU3RyaW5nRW5jb2RlZEJpZ2ludCksXG4gIHByaWNlOiBvcHRpb25hbChTdHJpbmdFbmNvZGVkQmlnaW50KSxcbiAgcGF5bWVudDogb3B0aW9uYWwoYXJyYXkoU3VpT2JqZWN0UmVmKSksXG4gIG93bmVyOiBvcHRpb25hbChTdWlBZGRyZXNzKSxcbn0pO1xudHlwZSBHYXNDb25maWcgPSBJbmZlcjx0eXBlb2YgR2FzQ29uZmlnPjtcblxuZXhwb3J0IGNvbnN0IFNlcmlhbGl6ZWRUcmFuc2FjdGlvbkRhdGFCdWlsZGVyID0gb2JqZWN0KHtcbiAgdmVyc2lvbjogbGl0ZXJhbCgxKSxcbiAgc2VuZGVyOiBvcHRpb25hbChTdWlBZGRyZXNzKSxcbiAgZXhwaXJhdGlvbjogVHJhbnNhY3Rpb25FeHBpcmF0aW9uLFxuICBnYXNDb25maWc6IEdhc0NvbmZpZyxcbiAgaW5wdXRzOiBhcnJheShUcmFuc2FjdGlvbkJsb2NrSW5wdXQpLFxuICB0cmFuc2FjdGlvbnM6IGFycmF5KFRyYW5zYWN0aW9uVHlwZSksXG59KTtcbmV4cG9ydCB0eXBlIFNlcmlhbGl6ZWRUcmFuc2FjdGlvbkRhdGFCdWlsZGVyID0gSW5mZXI8dHlwZW9mIFNlcmlhbGl6ZWRUcmFuc2FjdGlvbkRhdGFCdWlsZGVyPjtcblxuZnVuY3Rpb24gcHJlcGFyZVN1aUFkZHJlc3MoYWRkcmVzczogc3RyaW5nKSB7XG4gIHJldHVybiBub3JtYWxpemVTdWlBZGRyZXNzKGFkZHJlc3MpLnJlcGxhY2UoJzB4JywgJycpO1xufVxuXG4vLyBOT1RFOiBUaGlzIHZhbHVlIHNob3VsZCBiZSBrZXB0IGluIHN5bmMgd2l0aCB0aGUgY29ycmVzcG9uZGluZyB2YWx1ZSBpblxuLy8gY3JhdGVzL3N1aS1wcm90b2NvbC1jb25maWcvc3JjL2xpYi5yc1xuZXhwb3J0IGNvbnN0IFRSQU5TQUNUSU9OX0RBVEFfTUFYX1NJWkUgPSAxMjggKiAxMDI0O1xuXG5leHBvcnQgY2xhc3MgVHJhbnNhY3Rpb25CbG9ja0RhdGFCdWlsZGVyIHtcbiAgc3RhdGljIGZyb21LaW5kQnl0ZXMoYnl0ZXM6IFVpbnQ4QXJyYXkpIHtcbiAgICBjb25zdCBraW5kID0gYnVpbGRlci5kZSgnVHJhbnNhY3Rpb25LaW5kJywgYnl0ZXMpO1xuICAgIGNvbnN0IHByb2dyYW1tYWJsZVR4ID0ga2luZD8uUHJvZ3JhbW1hYmxlVHJhbnNhY3Rpb247XG4gICAgaWYgKCFwcm9ncmFtbWFibGVUeCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdVbmFibGUgdG8gZGVzZXJpYWxpemUgZnJvbSBieXRlcy4nKTtcbiAgICB9XG5cbiAgICBjb25zdCBzZXJpYWxpemVkID0gY3JlYXRlKFxuICAgICAge1xuICAgICAgICB2ZXJzaW9uOiAxLFxuICAgICAgICBnYXNDb25maWc6IHt9LFxuICAgICAgICBpbnB1dHM6IHByb2dyYW1tYWJsZVR4LmlucHV0cy5tYXAoKHZhbHVlOiB1bmtub3duLCBpbmRleDogbnVtYmVyKSA9PlxuICAgICAgICAgIGNyZWF0ZShcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAga2luZDogJ0lucHV0JyxcbiAgICAgICAgICAgICAgdmFsdWUsXG4gICAgICAgICAgICAgIGluZGV4LFxuICAgICAgICAgICAgICB0eXBlOiBpcyh2YWx1ZSwgUHVyZUNhbGxBcmcpID8gJ3B1cmUnIDogJ29iamVjdCcsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgVHJhbnNhY3Rpb25CbG9ja0lucHV0XG4gICAgICAgICAgKVxuICAgICAgICApLFxuICAgICAgICB0cmFuc2FjdGlvbnM6IHByb2dyYW1tYWJsZVR4LnRyYW5zYWN0aW9ucyxcbiAgICAgIH0sXG4gICAgICBTZXJpYWxpemVkVHJhbnNhY3Rpb25EYXRhQnVpbGRlclxuICAgICk7XG5cbiAgICByZXR1cm4gVHJhbnNhY3Rpb25CbG9ja0RhdGFCdWlsZGVyLnJlc3RvcmUoc2VyaWFsaXplZCk7XG4gIH1cblxuICBzdGF0aWMgZnJvbUJ5dGVzKGJ5dGVzOiBVaW50OEFycmF5KSB7XG4gICAgY29uc3QgcmF3RGF0YSA9IGJ1aWxkZXIuZGUoJ1RyYW5zYWN0aW9uRGF0YScsIGJ5dGVzKTtcbiAgICBjb25zdCBkYXRhID0gcmF3RGF0YT8uVjE7XG4gICAgY29uc3QgcHJvZ3JhbW1hYmxlVHggPSBkYXRhPy5raW5kPy5Qcm9ncmFtbWFibGVUcmFuc2FjdGlvbjtcbiAgICBpZiAoIWRhdGEgfHwgIXByb2dyYW1tYWJsZVR4KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1VuYWJsZSB0byBkZXNlcmlhbGl6ZSBmcm9tIGJ5dGVzLicpO1xuICAgIH1cblxuICAgIGNvbnN0IHNlcmlhbGl6ZWQgPSBjcmVhdGUoXG4gICAgICB7XG4gICAgICAgIHZlcnNpb246IDEsXG4gICAgICAgIHNlbmRlcjogZGF0YS5zZW5kZXIsXG4gICAgICAgIGV4cGlyYXRpb246IGRhdGEuZXhwaXJhdGlvbixcbiAgICAgICAgZ2FzQ29uZmlnOiBkYXRhLmdhc0RhdGEsXG4gICAgICAgIGlucHV0czogcHJvZ3JhbW1hYmxlVHguaW5wdXRzLm1hcCgodmFsdWU6IHVua25vd24sIGluZGV4OiBudW1iZXIpID0+XG4gICAgICAgICAgY3JlYXRlKFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBraW5kOiAnSW5wdXQnLFxuICAgICAgICAgICAgICB2YWx1ZSxcbiAgICAgICAgICAgICAgaW5kZXgsXG4gICAgICAgICAgICAgIHR5cGU6IGlzKHZhbHVlLCBQdXJlQ2FsbEFyZykgPyAncHVyZScgOiAnb2JqZWN0JyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBUcmFuc2FjdGlvbkJsb2NrSW5wdXRcbiAgICAgICAgICApXG4gICAgICAgICksXG4gICAgICAgIHRyYW5zYWN0aW9uczogcHJvZ3JhbW1hYmxlVHgudHJhbnNhY3Rpb25zLFxuICAgICAgfSxcbiAgICAgIFNlcmlhbGl6ZWRUcmFuc2FjdGlvbkRhdGFCdWlsZGVyXG4gICAgKTtcblxuICAgIHJldHVybiBUcmFuc2FjdGlvbkJsb2NrRGF0YUJ1aWxkZXIucmVzdG9yZShzZXJpYWxpemVkKTtcbiAgfVxuXG4gIHN0YXRpYyByZXN0b3JlKGRhdGE6IFNlcmlhbGl6ZWRUcmFuc2FjdGlvbkRhdGFCdWlsZGVyKSB7XG4gICAgYXNzZXJ0KGRhdGEsIFNlcmlhbGl6ZWRUcmFuc2FjdGlvbkRhdGFCdWlsZGVyKTtcbiAgICBjb25zdCB0cmFuc2FjdGlvbkRhdGEgPSBuZXcgVHJhbnNhY3Rpb25CbG9ja0RhdGFCdWlsZGVyKCk7XG4gICAgT2JqZWN0LmFzc2lnbih0cmFuc2FjdGlvbkRhdGEsIGRhdGEpO1xuICAgIHJldHVybiB0cmFuc2FjdGlvbkRhdGE7XG4gIH1cblxuICAvKipcbiAgICogR2VuZXJhdGUgdHJhbnNhY3Rpb24gZGlnZXN0LlxuICAgKlxuICAgKiBAcGFyYW0gYnl0ZXMgQkNTIHNlcmlhbGl6ZWQgdHJhbnNhY3Rpb24gZGF0YVxuICAgKiBAcmV0dXJucyB0cmFuc2FjdGlvbiBkaWdlc3QuXG4gICAqL1xuICBzdGF0aWMgZ2V0RGlnZXN0RnJvbUJ5dGVzKGJ5dGVzOiBVaW50OEFycmF5KSB7XG4gICAgY29uc3QgaGFzaCA9IGhhc2hUeXBlZERhdGEoJ1RyYW5zYWN0aW9uRGF0YScsIGJ5dGVzKTtcbiAgICByZXR1cm4gdG9CNTgoaGFzaCk7XG4gIH1cblxuICB2ZXJzaW9uID0gMSBhcyBjb25zdDtcbiAgc2VuZGVyPzogc3RyaW5nO1xuICBleHBpcmF0aW9uPzogVHJhbnNhY3Rpb25FeHBpcmF0aW9uO1xuICBnYXNDb25maWc6IEdhc0NvbmZpZztcbiAgaW5wdXRzOiBUcmFuc2FjdGlvbkJsb2NrSW5wdXRbXTtcbiAgdHJhbnNhY3Rpb25zOiBUcmFuc2FjdGlvblR5cGVbXTtcblxuICBjb25zdHJ1Y3RvcihjbG9uZT86IFRyYW5zYWN0aW9uQmxvY2tEYXRhQnVpbGRlcikge1xuICAgIHRoaXMuc2VuZGVyID0gY2xvbmU/LnNlbmRlcjtcbiAgICB0aGlzLmV4cGlyYXRpb24gPSBjbG9uZT8uZXhwaXJhdGlvbjtcbiAgICB0aGlzLmdhc0NvbmZpZyA9IGNsb25lPy5nYXNDb25maWcgPz8ge307XG4gICAgdGhpcy5pbnB1dHMgPSBjbG9uZT8uaW5wdXRzID8/IFtdO1xuICAgIHRoaXMudHJhbnNhY3Rpb25zID0gY2xvbmU/LnRyYW5zYWN0aW9ucyA/PyBbXTtcbiAgfVxuXG4gIGJ1aWxkKHtcbiAgICBvdmVycmlkZXMsXG4gICAgb25seVRyYW5zYWN0aW9uS2luZCxcbiAgfToge1xuICAgIG92ZXJyaWRlcz86IFBpY2s8UGFydGlhbDxUcmFuc2FjdGlvbkJsb2NrRGF0YUJ1aWxkZXI+LCAnc2VuZGVyJyB8ICdnYXNDb25maWcnIHwgJ2V4cGlyYXRpb24nPjtcbiAgICBvbmx5VHJhbnNhY3Rpb25LaW5kPzogYm9vbGVhbjtcbiAgfSA9IHt9KSB7XG4gICAgLy8gUmVzb2x2ZSBpbnB1dHMgZG93biB0byB2YWx1ZXM6XG4gICAgY29uc3QgaW5wdXRzID0gdGhpcy5pbnB1dHMubWFwKChpbnB1dCkgPT4ge1xuICAgICAgYXNzZXJ0KGlucHV0LnZhbHVlLCBCdWlsZGVyQ2FsbEFyZyk7XG4gICAgICByZXR1cm4gaW5wdXQudmFsdWU7XG4gICAgfSk7XG5cbiAgICBjb25zdCBraW5kID0ge1xuICAgICAgUHJvZ3JhbW1hYmxlVHJhbnNhY3Rpb246IHtcbiAgICAgICAgaW5wdXRzLFxuICAgICAgICB0cmFuc2FjdGlvbnM6IHRoaXMudHJhbnNhY3Rpb25zLFxuICAgICAgfSxcbiAgICB9O1xuXG4gICAgaWYgKG9ubHlUcmFuc2FjdGlvbktpbmQpIHtcbiAgICAgIHJldHVybiBidWlsZGVyLnNlcignVHJhbnNhY3Rpb25LaW5kJywga2luZCwgeyBtYXhTaXplOiBUUkFOU0FDVElPTl9EQVRBX01BWF9TSVpFIH0pLnRvQnl0ZXMoKTtcbiAgICB9XG5cbiAgICBjb25zdCBleHBpcmF0aW9uID0gb3ZlcnJpZGVzPy5leHBpcmF0aW9uID8/IHRoaXMuZXhwaXJhdGlvbjtcbiAgICBjb25zdCBzZW5kZXIgPSBvdmVycmlkZXM/LnNlbmRlciA/PyB0aGlzLnNlbmRlcjtcbiAgICBjb25zdCBnYXNDb25maWcgPSB7IC4uLnRoaXMuZ2FzQ29uZmlnLCAuLi5vdmVycmlkZXM/Lmdhc0NvbmZpZyB9O1xuXG4gICAgaWYgKCFzZW5kZXIpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignTWlzc2luZyB0cmFuc2FjdGlvbiBzZW5kZXInKTtcbiAgICB9XG5cbiAgICBpZiAoIWdhc0NvbmZpZy5idWRnZXQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignTWlzc2luZyBnYXMgYnVkZ2V0Jyk7XG4gICAgfVxuXG4gICAgaWYgKCFnYXNDb25maWcucGF5bWVudCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdNaXNzaW5nIGdhcyBwYXltZW50Jyk7XG4gICAgfVxuXG4gICAgaWYgKCFnYXNDb25maWcucHJpY2UpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignTWlzc2luZyBnYXMgcHJpY2UnKTtcbiAgICB9XG5cbiAgICBjb25zdCB0cmFuc2FjdGlvbkRhdGEgPSB7XG4gICAgICBzZW5kZXI6IHByZXBhcmVTdWlBZGRyZXNzKHNlbmRlciksXG4gICAgICBleHBpcmF0aW9uOiBleHBpcmF0aW9uID8gZXhwaXJhdGlvbiA6IHsgTm9uZTogdHJ1ZSB9LFxuICAgICAgZ2FzRGF0YToge1xuICAgICAgICBwYXltZW50OiBnYXNDb25maWcucGF5bWVudCxcbiAgICAgICAgb3duZXI6IHByZXBhcmVTdWlBZGRyZXNzKHRoaXMuZ2FzQ29uZmlnLm93bmVyID8/IHNlbmRlciksXG4gICAgICAgIHByaWNlOiBCaWdJbnQoZ2FzQ29uZmlnLnByaWNlKSxcbiAgICAgICAgYnVkZ2V0OiBCaWdJbnQoZ2FzQ29uZmlnLmJ1ZGdldCksXG4gICAgICB9LFxuICAgICAga2luZDoge1xuICAgICAgICBQcm9ncmFtbWFibGVUcmFuc2FjdGlvbjoge1xuICAgICAgICAgIGlucHV0cyxcbiAgICAgICAgICB0cmFuc2FjdGlvbnM6IHRoaXMudHJhbnNhY3Rpb25zLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICB9O1xuXG4gICAgcmV0dXJuIGJ1aWxkZXIuc2VyKCdUcmFuc2FjdGlvbkRhdGEnLCB7IFYxOiB0cmFuc2FjdGlvbkRhdGEgfSwgeyBtYXhTaXplOiBUUkFOU0FDVElPTl9EQVRBX01BWF9TSVpFIH0pLnRvQnl0ZXMoKTtcbiAgfVxuXG4gIGdldERpZ2VzdCgpIHtcbiAgICBjb25zdCBieXRlcyA9IHRoaXMuYnVpbGQoeyBvbmx5VHJhbnNhY3Rpb25LaW5kOiBmYWxzZSB9KTtcbiAgICByZXR1cm4gVHJhbnNhY3Rpb25CbG9ja0RhdGFCdWlsZGVyLmdldERpZ2VzdEZyb21CeXRlcyhieXRlcyk7XG4gIH1cblxuICBzbmFwc2hvdCgpOiBTZXJpYWxpemVkVHJhbnNhY3Rpb25EYXRhQnVpbGRlciB7XG4gICAgcmV0dXJuIGNyZWF0ZSh0aGlzLCBTZXJpYWxpemVkVHJhbnNhY3Rpb25EYXRhQnVpbGRlcik7XG4gIH1cbn1cbiJdfQ==
|