@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.
Files changed (122) hide show
  1. package/.eslintignore +1 -0
  2. package/CHANGELOG.md +37 -0
  3. package/dist/src/lib/constants.d.ts +3 -15
  4. package/dist/src/lib/constants.d.ts.map +1 -1
  5. package/dist/src/lib/constants.js +7 -20
  6. package/dist/src/lib/iface.d.ts +35 -181
  7. package/dist/src/lib/iface.d.ts.map +1 -1
  8. package/dist/src/lib/iface.js +11 -38
  9. package/dist/src/lib/index.d.ts +2 -0
  10. package/dist/src/lib/index.d.ts.map +1 -1
  11. package/dist/src/lib/index.js +6 -2
  12. package/dist/src/lib/keyPair.d.ts +4 -0
  13. package/dist/src/lib/keyPair.d.ts.map +1 -1
  14. package/dist/src/lib/keyPair.js +7 -10
  15. package/dist/src/lib/mystenlab/builder/Inputs.d.ts +66 -0
  16. package/dist/src/lib/mystenlab/builder/Inputs.d.ts.map +1 -0
  17. package/dist/src/lib/mystenlab/builder/Inputs.js +56 -0
  18. package/dist/src/lib/mystenlab/builder/TransactionBlock.d.ts +616 -0
  19. package/dist/src/lib/mystenlab/builder/TransactionBlock.d.ts.map +1 -0
  20. package/dist/src/lib/mystenlab/builder/TransactionBlock.js +260 -0
  21. package/dist/src/lib/mystenlab/builder/TransactionDataBlock.d.ts +566 -0
  22. package/dist/src/lib/mystenlab/builder/TransactionDataBlock.d.ts.map +1 -0
  23. package/dist/src/lib/mystenlab/builder/TransactionDataBlock.js +171 -0
  24. package/dist/src/lib/mystenlab/builder/Transactions.d.ts +992 -0
  25. package/dist/src/lib/mystenlab/builder/Transactions.d.ts.map +1 -0
  26. package/dist/src/lib/mystenlab/builder/Transactions.js +119 -0
  27. package/dist/src/lib/mystenlab/builder/bcs.d.ts +25 -0
  28. package/dist/src/lib/mystenlab/builder/bcs.d.ts.map +1 -0
  29. package/dist/src/lib/mystenlab/builder/bcs.js +141 -0
  30. package/dist/src/lib/mystenlab/builder/index.d.ts +5 -0
  31. package/dist/src/lib/mystenlab/builder/index.d.ts.map +1 -0
  32. package/dist/src/lib/mystenlab/builder/index.js +17 -0
  33. package/dist/src/lib/mystenlab/builder/serializer.d.ts +4 -0
  34. package/dist/src/lib/mystenlab/builder/serializer.d.ts.map +1 -0
  35. package/dist/src/lib/mystenlab/builder/serializer.js +101 -0
  36. package/dist/src/lib/mystenlab/builder/utils.d.ts +10 -0
  37. package/dist/src/lib/mystenlab/builder/utils.d.ts.map +1 -0
  38. package/dist/src/lib/mystenlab/builder/utils.js +10 -0
  39. package/dist/src/lib/mystenlab/cryptography/hash.d.ts +8 -0
  40. package/dist/src/lib/mystenlab/cryptography/hash.d.ts.map +1 -0
  41. package/dist/src/lib/mystenlab/cryptography/hash.js +22 -0
  42. package/dist/src/lib/mystenlab/framework/framework.d.ts +93 -0
  43. package/dist/src/lib/mystenlab/framework/framework.d.ts.map +1 -0
  44. package/dist/src/lib/mystenlab/framework/framework.js +138 -0
  45. package/dist/src/lib/mystenlab/framework/index.d.ts +3 -0
  46. package/dist/src/lib/mystenlab/framework/index.d.ts.map +1 -0
  47. package/dist/src/lib/mystenlab/framework/index.js +15 -0
  48. package/dist/src/lib/mystenlab/framework/sui-system-state.d.ts +12 -0
  49. package/dist/src/lib/mystenlab/framework/sui-system-state.d.ts.map +1 -0
  50. package/dist/src/lib/mystenlab/framework/sui-system-state.js +19 -0
  51. package/dist/src/lib/mystenlab/txn-data-serializers/type-tag-serializer.d.ts +7 -0
  52. package/dist/src/lib/mystenlab/txn-data-serializers/type-tag-serializer.d.ts.map +1 -0
  53. package/dist/src/lib/mystenlab/txn-data-serializers/type-tag-serializer.js +119 -0
  54. package/dist/src/lib/mystenlab/types/coin.d.ts +89 -0
  55. package/dist/src/lib/mystenlab/types/coin.d.ts.map +1 -0
  56. package/dist/src/lib/mystenlab/types/coin.js +32 -0
  57. package/dist/src/lib/mystenlab/types/common.d.ts +45 -0
  58. package/dist/src/lib/mystenlab/types/common.d.ts.map +1 -0
  59. package/dist/src/lib/mystenlab/types/common.js +84 -0
  60. package/dist/src/lib/mystenlab/types/events.d.ts +198 -0
  61. package/dist/src/lib/mystenlab/types/events.d.ts.map +1 -0
  62. package/dist/src/lib/mystenlab/types/events.js +46 -0
  63. package/dist/src/lib/mystenlab/types/index.d.ts +9 -0
  64. package/dist/src/lib/mystenlab/types/index.d.ts.map +1 -0
  65. package/dist/src/lib/mystenlab/types/index.js +21 -0
  66. package/dist/src/lib/mystenlab/types/normalized.d.ts +254 -0
  67. package/dist/src/lib/mystenlab/types/normalized.d.ts.map +1 -0
  68. package/dist/src/lib/mystenlab/types/normalized.js +111 -0
  69. package/dist/src/lib/mystenlab/types/objects.d.ts +806 -0
  70. package/dist/src/lib/mystenlab/types/objects.d.ts.map +1 -0
  71. package/dist/src/lib/mystenlab/types/objects.js +302 -0
  72. package/dist/src/lib/mystenlab/types/option.d.ts +8 -0
  73. package/dist/src/lib/mystenlab/types/option.d.ts.map +1 -0
  74. package/dist/src/lib/mystenlab/types/option.js +14 -0
  75. package/dist/src/lib/mystenlab/types/sui-bcs.d.ts +111 -0
  76. package/dist/src/lib/mystenlab/types/sui-bcs.d.ts.map +1 -0
  77. package/dist/src/lib/mystenlab/types/sui-bcs.js +107 -0
  78. package/dist/src/lib/mystenlab/types/transactions.d.ts +6703 -0
  79. package/dist/src/lib/mystenlab/types/transactions.d.ts.map +1 -0
  80. package/dist/src/lib/mystenlab/types/transactions.js +405 -0
  81. package/dist/src/lib/mystenlab/types/validator.d.ts +641 -0
  82. package/dist/src/lib/mystenlab/types/validator.d.ts.map +1 -0
  83. package/dist/src/lib/mystenlab/types/validator.js +156 -0
  84. package/dist/src/lib/stakingBuilder.d.ts +24 -35
  85. package/dist/src/lib/stakingBuilder.d.ts.map +1 -1
  86. package/dist/src/lib/stakingBuilder.js +93 -129
  87. package/dist/src/lib/stakingTransaction.d.ts +5 -21
  88. package/dist/src/lib/stakingTransaction.d.ts.map +1 -1
  89. package/dist/src/lib/stakingTransaction.js +77 -219
  90. package/dist/src/lib/transaction.d.ts +8 -6
  91. package/dist/src/lib/transaction.d.ts.map +1 -1
  92. package/dist/src/lib/transaction.js +74 -124
  93. package/dist/src/lib/transactionBuilder.d.ts +9 -9
  94. package/dist/src/lib/transactionBuilder.d.ts.map +1 -1
  95. package/dist/src/lib/transactionBuilder.js +27 -16
  96. package/dist/src/lib/transactionBuilderFactory.d.ts +8 -5
  97. package/dist/src/lib/transactionBuilderFactory.d.ts.map +1 -1
  98. package/dist/src/lib/transactionBuilderFactory.js +17 -11
  99. package/dist/src/lib/transferBuilder.d.ts +15 -10
  100. package/dist/src/lib/transferBuilder.d.ts.map +1 -1
  101. package/dist/src/lib/transferBuilder.js +38 -101
  102. package/dist/src/lib/transferTransaction.d.ts +5 -4
  103. package/dist/src/lib/transferTransaction.d.ts.map +1 -1
  104. package/dist/src/lib/transferTransaction.js +45 -96
  105. package/dist/src/lib/unstakingBuilder.d.ts +55 -0
  106. package/dist/src/lib/unstakingBuilder.d.ts.map +1 -0
  107. package/dist/src/lib/unstakingBuilder.js +148 -0
  108. package/dist/src/lib/unstakingTransaction.d.ts +51 -0
  109. package/dist/src/lib/unstakingTransaction.d.ts.map +1 -0
  110. package/dist/src/lib/unstakingTransaction.js +206 -0
  111. package/dist/src/lib/utils.d.ts +30 -92
  112. package/dist/src/lib/utils.d.ts.map +1 -1
  113. package/dist/src/lib/utils.js +115 -177
  114. package/dist/src/sui.d.ts.map +1 -1
  115. package/dist/src/sui.js +23 -13
  116. package/package.json +9 -9
  117. package/dist/src/lib/bcs.d.ts +0 -3
  118. package/dist/src/lib/bcs.d.ts.map +0 -1
  119. package/dist/src/lib/bcs.js +0 -109
  120. package/dist/src/lib/txnSchema.d.ts +0 -7
  121. package/dist/src/lib/txnSchema.d.ts.map +0 -1
  122. package/dist/src/lib/txnSchema.js +0 -81
@@ -0,0 +1,260 @@
1
+ "use strict";
2
+ var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, privateMap) {
3
+ if (!privateMap.has(receiver)) {
4
+ throw new TypeError("attempted to get private field on non-instance");
5
+ }
6
+ return privateMap.get(receiver);
7
+ };
8
+ var __classPrivateFieldSet = (this && this.__classPrivateFieldSet) || function (receiver, privateMap, value) {
9
+ if (!privateMap.has(receiver)) {
10
+ throw new TypeError("attempted to set private field on non-instance");
11
+ }
12
+ privateMap.set(receiver, value);
13
+ return value;
14
+ };
15
+ var _blockData;
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ exports.TransactionBlock = void 0;
18
+ const bcs_1 = require("@mysten/bcs");
19
+ const superstruct_1 = require("superstruct");
20
+ const types_1 = require("../types");
21
+ const Transactions_1 = require("./Transactions");
22
+ const Inputs_1 = require("./Inputs");
23
+ const TransactionDataBlock_1 = require("./TransactionDataBlock");
24
+ const utils_1 = require("./utils");
25
+ function createTransactionResult(index) {
26
+ const baseResult = { kind: 'Result', index };
27
+ const nestedResults = [];
28
+ const nestedResultFor = (resultIndex) => {
29
+ var _a;
30
+ return ((_a = nestedResults[resultIndex]) !== null && _a !== void 0 ? _a : (nestedResults[resultIndex] = {
31
+ kind: 'NestedResult',
32
+ index,
33
+ resultIndex,
34
+ }));
35
+ };
36
+ return new Proxy(baseResult, {
37
+ set() {
38
+ throw new Error('The transaction result is a proxy, and does not support setting properties directly');
39
+ },
40
+ // TODO: Instead of making this return a concrete argument, we should ideally
41
+ // make it reference-based (so that this gets resolved at build-time), which
42
+ // allows re-ordering transactions.
43
+ get(target, property) {
44
+ // This allows this transaction argument to be used in the singular form:
45
+ if (property in target) {
46
+ return Reflect.get(target, property);
47
+ }
48
+ // Support destructuring:
49
+ if (property === Symbol.iterator) {
50
+ return function* () {
51
+ let i = 0;
52
+ while (true) {
53
+ yield nestedResultFor(i);
54
+ i++;
55
+ }
56
+ };
57
+ }
58
+ if (typeof property === 'symbol')
59
+ return;
60
+ const resultIndex = parseInt(property, 10);
61
+ if (Number.isNaN(resultIndex) || resultIndex < 0)
62
+ return;
63
+ return nestedResultFor(resultIndex);
64
+ },
65
+ });
66
+ }
67
+ const TRANSACTION_BRAND = Symbol.for('@mysten/transaction');
68
+ // The maximum number of gas objects that can be selected for one transaction.
69
+ const MAX_GAS_OBJECTS = 256;
70
+ // The maximum gas that is allowed.
71
+ const MAX_GAS = 1000000000;
72
+ // A guess about how much overhead each coin provides for gas calculations.
73
+ // @ts-ignore
74
+ const GAS_OVERHEAD_PER_COIN = 10n;
75
+ /**
76
+ * Transaction Builder
77
+ */
78
+ class TransactionBlock {
79
+ constructor(transaction) {
80
+ _blockData.set(this, void 0);
81
+ __classPrivateFieldSet(this, _blockData, new TransactionDataBlock_1.TransactionBlockDataBuilder(transaction ? __classPrivateFieldGet(transaction, _blockData) : undefined));
82
+ }
83
+ /** Returns `true` if the object is an instance of the Transaction builder class. */
84
+ static is(obj) {
85
+ return !!obj && typeof obj === 'object' && obj[TRANSACTION_BRAND] === true;
86
+ }
87
+ /**
88
+ * Converts from a serialize transaction kind (built with `build({ onlyTransactionKind: true })`) to a `Transaction` class.
89
+ * Supports either a byte array, or base64-encoded bytes.
90
+ */
91
+ static fromKind(serialized) {
92
+ const tx = new TransactionBlock();
93
+ __classPrivateFieldSet(tx, _blockData, TransactionDataBlock_1.TransactionBlockDataBuilder.fromKindBytes(typeof serialized === 'string' ? bcs_1.fromB64(serialized) : serialized));
94
+ return tx;
95
+ }
96
+ /**
97
+ * Converts from a serialized transaction format to a `Transaction` class.
98
+ * There are two supported serialized formats:
99
+ * - A string returned from `Transaction#serialize`. The serialized format must be compatible, or it will throw an error.
100
+ * - A byte array (or base64-encoded bytes) containing BCS transaction data.
101
+ */
102
+ static from(serialized) {
103
+ const tx = new TransactionBlock();
104
+ // Check for bytes:
105
+ if (typeof serialized !== 'string' || !serialized.startsWith('{')) {
106
+ __classPrivateFieldSet(tx, _blockData, TransactionDataBlock_1.TransactionBlockDataBuilder.fromBytes(typeof serialized === 'string' ? bcs_1.fromB64(serialized) : serialized));
107
+ }
108
+ else {
109
+ __classPrivateFieldSet(tx, _blockData, TransactionDataBlock_1.TransactionBlockDataBuilder.restore(JSON.parse(serialized)));
110
+ }
111
+ return tx;
112
+ }
113
+ /** A helper to retrieve the Transaction builder `Transactions` */
114
+ static get Transactions() {
115
+ return Transactions_1.Transactions;
116
+ }
117
+ /** A helper to retrieve the Transaction builder `Inputs` */
118
+ static get Inputs() {
119
+ return Inputs_1.Inputs;
120
+ }
121
+ setSender(sender) {
122
+ __classPrivateFieldGet(this, _blockData).sender = sender;
123
+ }
124
+ /**
125
+ * Sets the sender only if it has not already been set.
126
+ * This is useful for sponsored transaction flows where the sender may not be the same as the signer address.
127
+ */
128
+ setSenderIfNotSet(sender) {
129
+ if (!__classPrivateFieldGet(this, _blockData).sender) {
130
+ __classPrivateFieldGet(this, _blockData).sender = sender;
131
+ }
132
+ }
133
+ setExpiration(expiration) {
134
+ __classPrivateFieldGet(this, _blockData).expiration = expiration;
135
+ }
136
+ setGasPrice(price) {
137
+ __classPrivateFieldGet(this, _blockData).gasConfig.price = String(price);
138
+ }
139
+ setGasBudget(budget) {
140
+ __classPrivateFieldGet(this, _blockData).gasConfig.budget = String(budget);
141
+ }
142
+ setGasOwner(owner) {
143
+ __classPrivateFieldGet(this, _blockData).gasConfig.owner = owner;
144
+ }
145
+ setGasPayment(payments) {
146
+ if (payments.length >= MAX_GAS_OBJECTS) {
147
+ throw new Error(`Payment objects exceed maximum amount ${MAX_GAS_OBJECTS}`);
148
+ }
149
+ __classPrivateFieldGet(this, _blockData).gasConfig.payment = payments.map((payment) => superstruct_1.mask(payment, types_1.SuiObjectRef));
150
+ }
151
+ /** Get a snapshot of the transaction data, in JSON form: */
152
+ get blockData() {
153
+ return __classPrivateFieldGet(this, _blockData).snapshot();
154
+ }
155
+ // Used to brand transaction classes so that they can be identified, even between multiple copies
156
+ // of the builder.
157
+ get [(_blockData = new WeakMap(), TRANSACTION_BRAND)]() {
158
+ return true;
159
+ }
160
+ /** Returns an argument for the gas coin, to be used in a transaction. */
161
+ get gas() {
162
+ return { kind: 'GasCoin' };
163
+ }
164
+ /**
165
+ * Dynamically create a new input, which is separate from the `input`. This is important
166
+ * for generated clients to be able to define unique inputs that are non-overlapping with the
167
+ * defined inputs.
168
+ *
169
+ * For `Uint8Array` type automatically convert the input into a `Pure` CallArg, since this
170
+ * is the format required for custom serialization.
171
+ *
172
+ */
173
+ input(type, value) {
174
+ const index = __classPrivateFieldGet(this, _blockData).inputs.length;
175
+ const input = utils_1.create({
176
+ kind: 'Input',
177
+ // bigints can't be serialized to JSON, so just string-convert them here:
178
+ value: typeof value === 'bigint' ? String(value) : value,
179
+ index,
180
+ type,
181
+ }, Transactions_1.TransactionBlockInput);
182
+ __classPrivateFieldGet(this, _blockData).inputs.push(input);
183
+ return input;
184
+ }
185
+ /**
186
+ * Add a new object input to the transaction.
187
+ */
188
+ object(value) {
189
+ const id = Inputs_1.getIdFromCallArg(value);
190
+ // deduplicate
191
+ const inserted = __classPrivateFieldGet(this, _blockData).inputs.find((i) => i.type === 'object' && id === Inputs_1.getIdFromCallArg(i.value));
192
+ return inserted !== null && inserted !== void 0 ? inserted : this.input('object', value);
193
+ }
194
+ /**
195
+ * Add a new non-object input to the transaction.
196
+ */
197
+ pure(
198
+ /**
199
+ * The pure value that will be used as the input value. If this is a Uint8Array, then the value
200
+ * is assumed to be raw bytes, and will be used directly.
201
+ */
202
+ value,
203
+ /**
204
+ * The BCS type to serialize the value into. If not provided, the type will automatically be determined
205
+ * based on how the input is used.
206
+ */
207
+ type) {
208
+ // TODO: we can also do some deduplication here
209
+ return this.input('pure', value instanceof Uint8Array ? Inputs_1.Inputs.Pure(value) : type ? Inputs_1.Inputs.Pure(value, type) : value);
210
+ }
211
+ /** Add a transaction to the transaction block. */
212
+ add(transaction) {
213
+ const index = __classPrivateFieldGet(this, _blockData).transactions.push(transaction);
214
+ return createTransactionResult(index - 1);
215
+ }
216
+ // Method shorthands:
217
+ splitCoins(...args) {
218
+ return this.add(Transactions_1.Transactions.SplitCoins(...args));
219
+ }
220
+ mergeCoins(...args) {
221
+ return this.add(Transactions_1.Transactions.MergeCoins(...args));
222
+ }
223
+ publish(...args) {
224
+ return this.add(Transactions_1.Transactions.Publish(...args));
225
+ }
226
+ moveCall(...args) {
227
+ return this.add(Transactions_1.Transactions.MoveCall(...args));
228
+ }
229
+ transferObjects(...args) {
230
+ return this.add(Transactions_1.Transactions.TransferObjects(...args));
231
+ }
232
+ makeMoveVec(...args) {
233
+ return this.add(Transactions_1.Transactions.MakeMoveVec(...args));
234
+ }
235
+ /**
236
+ * Serialize the transaction to a string so that it can be sent to a separate context.
237
+ * This is different from `build` in that it does not serialize to BCS bytes, and instead
238
+ * uses a separate format that is unique to the transaction builder. This allows
239
+ * us to serialize partially-complete transactions, that can then be completed and
240
+ * built in a separate context.
241
+ *
242
+ * For example, a dapp can construct a transaction, but not provide gas objects
243
+ * or a gas budget. The transaction then can be sent to the wallet, where this
244
+ * information is automatically filled in (e.g. by querying for coin objects
245
+ * and performing a dry run).
246
+ */
247
+ serialize() {
248
+ return JSON.stringify(__classPrivateFieldGet(this, _blockData).snapshot());
249
+ }
250
+ /** Build the transaction to BCS bytes. */
251
+ async build({ onlyTransactionKind } = {}) {
252
+ return __classPrivateFieldGet(this, _blockData).build({ onlyTransactionKind });
253
+ }
254
+ /** Derive transaction digest */
255
+ async getDigest() {
256
+ return __classPrivateFieldGet(this, _blockData).getDigest();
257
+ }
258
+ }
259
+ exports.TransactionBlock = TransactionBlock;
260
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiVHJhbnNhY3Rpb25CbG9jay5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9saWIvbXlzdGVubGFiL2J1aWxkZXIvVHJhbnNhY3Rpb25CbG9jay50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLHFDQUFzQztBQUN0Qyw2Q0FBdUM7QUFDdkMsb0NBQWtEO0FBQ2xELGlEQUEyRztBQUMzRyxxQ0FBbUY7QUFDbkYsaUVBQTRGO0FBQzVGLG1DQUFpQztBQUlqQyxTQUFTLHVCQUF1QixDQUFDLEtBQWE7SUFDNUMsTUFBTSxVQUFVLEdBQXdCLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRSxLQUFLLEVBQUUsQ0FBQztJQUVsRSxNQUFNLGFBQWEsR0FBMEIsRUFBRSxDQUFDO0lBQ2hELE1BQU0sZUFBZSxHQUFHLENBQUMsV0FBbUIsRUFBdUIsRUFBRTs7UUFDbkUsT0FBQSxPQUFDLGFBQWEsQ0FBQyxXQUFXLHFDQUF6QixhQUFhLENBQUMsV0FBVyxJQUFNO1lBQzlCLElBQUksRUFBRSxjQUFjO1lBQ3BCLEtBQUs7WUFDTCxXQUFXO1NBQ1osRUFBQyxDQUFBO0tBQUEsQ0FBQztJQUVMLE9BQU8sSUFBSSxLQUFLLENBQUMsVUFBVSxFQUFFO1FBQzNCLEdBQUc7WUFDRCxNQUFNLElBQUksS0FBSyxDQUFDLHFGQUFxRixDQUFDLENBQUM7UUFDekcsQ0FBQztRQUNELDZFQUE2RTtRQUM3RSw0RUFBNEU7UUFDNUUsbUNBQW1DO1FBQ25DLEdBQUcsQ0FBQyxNQUFNLEVBQUUsUUFBUTtZQUNsQix5RUFBeUU7WUFDekUsSUFBSSxRQUFRLElBQUksTUFBTSxFQUFFO2dCQUN0QixPQUFPLE9BQU8sQ0FBQyxHQUFHLENBQUMsTUFBTSxFQUFFLFFBQVEsQ0FBQyxDQUFDO2FBQ3RDO1lBRUQseUJBQXlCO1lBQ3pCLElBQUksUUFBUSxLQUFLLE1BQU0sQ0FBQyxRQUFRLEVBQUU7Z0JBQ2hDLE9BQU8sUUFBUSxDQUFDO29CQUNkLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztvQkFDVixPQUFPLElBQUksRUFBRTt3QkFDWCxNQUFNLGVBQWUsQ0FBQyxDQUFDLENBQUMsQ0FBQzt3QkFDekIsQ0FBQyxFQUFFLENBQUM7cUJBQ0w7Z0JBQ0gsQ0FBQyxDQUFDO2FBQ0g7WUFFRCxJQUFJLE9BQU8sUUFBUSxLQUFLLFFBQVE7Z0JBQUUsT0FBTztZQUV6QyxNQUFNLFdBQVcsR0FBRyxRQUFRLENBQUMsUUFBUSxFQUFFLEVBQUUsQ0FBQyxDQUFDO1lBQzNDLElBQUksTUFBTSxDQUFDLEtBQUssQ0FBQyxXQUFXLENBQUMsSUFBSSxXQUFXLEdBQUcsQ0FBQztnQkFBRSxPQUFPO1lBQ3pELE9BQU8sZUFBZSxDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBQ3RDLENBQUM7S0FDRixDQUFzQixDQUFDO0FBQzFCLENBQUM7QUFFRCxNQUFNLGlCQUFpQixHQUFHLE1BQU0sQ0FBQyxHQUFHLENBQUMscUJBQXFCLENBQUMsQ0FBQztBQUU1RCw4RUFBOEU7QUFDOUUsTUFBTSxlQUFlLEdBQUcsR0FBRyxDQUFDO0FBRTVCLG1DQUFtQztBQUNuQyxNQUFNLE9BQU8sR0FBRyxVQUFVLENBQUM7QUFFM0IsMkVBQTJFO0FBQzNFLGFBQWE7QUFDYixNQUFNLHFCQUFxQixHQUFHLEdBQUcsQ0FBQztBQU1sQzs7R0FFRztBQUNILE1BQWEsZ0JBQWdCO0lBOEYzQixZQUFZLFdBQThCO1FBWjFDLDZCQUF3QztRQWF0Qyx1QkFBQSxJQUFJLGNBQWMsSUFBSSxrREFBMkIsQ0FBQyxXQUFXLENBQUMsQ0FBQyxpREFBd0IsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxFQUFDO0lBQ3RHLENBQUM7SUEvRkQsb0ZBQW9GO0lBQ3BGLE1BQU0sQ0FBQyxFQUFFLENBQUMsR0FBWTtRQUNwQixPQUFPLENBQUMsQ0FBQyxHQUFHLElBQUksT0FBTyxHQUFHLEtBQUssUUFBUSxJQUFLLEdBQVcsQ0FBQyxpQkFBaUIsQ0FBQyxLQUFLLElBQUksQ0FBQztJQUN0RixDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsTUFBTSxDQUFDLFFBQVEsQ0FBQyxVQUErQjtRQUM3QyxNQUFNLEVBQUUsR0FBRyxJQUFJLGdCQUFnQixFQUFFLENBQUM7UUFFbEMsdUJBQUEsRUFBRSxjQUFjLGtEQUEyQixDQUFDLGFBQWEsQ0FDdkQsT0FBTyxVQUFVLEtBQUssUUFBUSxDQUFDLENBQUMsQ0FBQyxhQUFPLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FDbEUsRUFBQztRQUVGLE9BQU8sRUFBRSxDQUFDO0lBQ1osQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0gsTUFBTSxDQUFDLElBQUksQ0FBQyxVQUErQjtRQUN6QyxNQUFNLEVBQUUsR0FBRyxJQUFJLGdCQUFnQixFQUFFLENBQUM7UUFFbEMsbUJBQW1CO1FBQ25CLElBQUksT0FBTyxVQUFVLEtBQUssUUFBUSxJQUFJLENBQUMsVUFBVSxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsRUFBRTtZQUNqRSx1QkFBQSxFQUFFLGNBQWMsa0RBQTJCLENBQUMsU0FBUyxDQUNuRCxPQUFPLFVBQVUsS0FBSyxRQUFRLENBQUMsQ0FBQyxDQUFDLGFBQU8sQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUNsRSxFQUFDO1NBQ0g7YUFBTTtZQUNMLHVCQUFBLEVBQUUsY0FBYyxrREFBMkIsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxVQUFVLENBQUMsQ0FBQyxFQUFDO1NBQzdFO1FBRUQsT0FBTyxFQUFFLENBQUM7SUFDWixDQUFDO0lBRUQsa0VBQWtFO0lBQ2xFLE1BQU0sS0FBSyxZQUFZO1FBQ3JCLE9BQU8sMkJBQVksQ0FBQztJQUN0QixDQUFDO0lBRUQsNERBQTREO0lBQzVELE1BQU0sS0FBSyxNQUFNO1FBQ2YsT0FBTyxlQUFNLENBQUM7SUFDaEIsQ0FBQztJQUVELFNBQVMsQ0FBQyxNQUFjO1FBQ3RCLHlDQUFnQixNQUFNLEdBQUcsTUFBTSxDQUFDO0lBQ2xDLENBQUM7SUFDRDs7O09BR0c7SUFDSCxpQkFBaUIsQ0FBQyxNQUFjO1FBQzlCLElBQUksQ0FBQyx5Q0FBZ0IsTUFBTSxFQUFFO1lBQzNCLHlDQUFnQixNQUFNLEdBQUcsTUFBTSxDQUFDO1NBQ2pDO0lBQ0gsQ0FBQztJQUNELGFBQWEsQ0FBQyxVQUFrQztRQUM5Qyx5Q0FBZ0IsVUFBVSxHQUFHLFVBQVUsQ0FBQztJQUMxQyxDQUFDO0lBQ0QsV0FBVyxDQUFDLEtBQXNCO1FBQ2hDLHlDQUFnQixTQUFTLENBQUMsS0FBSyxHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUNsRCxDQUFDO0lBQ0QsWUFBWSxDQUFDLE1BQXVCO1FBQ2xDLHlDQUFnQixTQUFTLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUNwRCxDQUFDO0lBQ0QsV0FBVyxDQUFDLEtBQWE7UUFDdkIseUNBQWdCLFNBQVMsQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDO0lBQzFDLENBQUM7SUFDRCxhQUFhLENBQUMsUUFBd0I7UUFDcEMsSUFBSSxRQUFRLENBQUMsTUFBTSxJQUFJLGVBQWUsRUFBRTtZQUN0QyxNQUFNLElBQUksS0FBSyxDQUFDLHlDQUF5QyxlQUFlLEVBQUUsQ0FBQyxDQUFDO1NBQzdFO1FBQ0QseUNBQWdCLFNBQVMsQ0FBQyxPQUFPLEdBQUcsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDLE9BQU8sRUFBRSxFQUFFLENBQUMsa0JBQUksQ0FBQyxPQUFPLEVBQUUsb0JBQVksQ0FBQyxDQUFDLENBQUM7SUFDN0YsQ0FBQztJQUdELDREQUE0RDtJQUM1RCxJQUFJLFNBQVM7UUFDWCxPQUFPLHlDQUFnQixRQUFRLEVBQUUsQ0FBQztJQUNwQyxDQUFDO0lBRUQsaUdBQWlHO0lBQ2pHLGtCQUFrQjtJQUNsQixJQUFJLDhCQUFDLGlCQUFpQixFQUFDO1FBQ3JCLE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztJQU1ELHlFQUF5RTtJQUN6RSxJQUFJLEdBQUc7UUFDTCxPQUFPLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxDQUFDO0lBQzdCLENBQUM7SUFFRDs7Ozs7Ozs7T0FRRztJQUNILEtBQUssQ0FBQyxJQUF1QixFQUFFLEtBQWU7UUFDNUMsTUFBTSxLQUFLLEdBQUcseUNBQWdCLE1BQU0sQ0FBQyxNQUFNLENBQUM7UUFDNUMsTUFBTSxLQUFLLEdBQUcsY0FBTSxDQUNsQjtZQUNFLElBQUksRUFBRSxPQUFPO1lBQ2IseUVBQXlFO1lBQ3pFLEtBQUssRUFBRSxPQUFPLEtBQUssS0FBSyxRQUFRLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSztZQUN4RCxLQUFLO1lBQ0wsSUFBSTtTQUNMLEVBQ0Qsb0NBQXFCLENBQ3RCLENBQUM7UUFDRix5Q0FBZ0IsTUFBTSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUNuQyxPQUFPLEtBQUssQ0FBQztJQUNmLENBQUM7SUFFRDs7T0FFRztJQUNILE1BQU0sQ0FBQyxLQUErQjtRQUNwQyxNQUFNLEVBQUUsR0FBRyx5QkFBZ0IsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUNuQyxjQUFjO1FBQ2QsTUFBTSxRQUFRLEdBQUcseUNBQWdCLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLEtBQUssUUFBUSxJQUFJLEVBQUUsS0FBSyx5QkFBZ0IsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztRQUM3RyxPQUFPLFFBQVEsYUFBUixRQUFRLGNBQVIsUUFBUSxHQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsUUFBUSxFQUFFLEtBQUssQ0FBQyxDQUFDO0lBQ2pELENBQUM7SUFFRDs7T0FFRztJQUNILElBQUk7SUFDRjs7O09BR0c7SUFDSCxLQUFjO0lBQ2Q7OztPQUdHO0lBQ0gsSUFBYTtRQUViLCtDQUErQztRQUMvQyxPQUFPLElBQUksQ0FBQyxLQUFLLENBQ2YsTUFBTSxFQUNOLEtBQUssWUFBWSxVQUFVLENBQUMsQ0FBQyxDQUFDLGVBQU0sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsZUFBTSxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FDM0YsQ0FBQztJQUNKLENBQUM7SUFFRCxrREFBa0Q7SUFDbEQsR0FBRyxDQUFDLFdBQTRCO1FBQzlCLE1BQU0sS0FBSyxHQUFHLHlDQUFnQixZQUFZLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBQzdELE9BQU8sdUJBQXVCLENBQUMsS0FBSyxHQUFHLENBQUMsQ0FBQyxDQUFDO0lBQzVDLENBQUM7SUFFRCxxQkFBcUI7SUFFckIsVUFBVSxDQUFDLEdBQUcsSUFBbUQ7UUFDL0QsT0FBTyxJQUFJLENBQUMsR0FBRyxDQUFDLDJCQUFZLENBQUMsVUFBVSxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQztJQUNwRCxDQUFDO0lBQ0QsVUFBVSxDQUFDLEdBQUcsSUFBbUQ7UUFDL0QsT0FBTyxJQUFJLENBQUMsR0FBRyxDQUFDLDJCQUFZLENBQUMsVUFBVSxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQztJQUNwRCxDQUFDO0lBQ0QsT0FBTyxDQUFDLEdBQUcsSUFBZ0Q7UUFDekQsT0FBTyxJQUFJLENBQUMsR0FBRyxDQUFDLDJCQUFZLENBQUMsT0FBTyxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQztJQUNqRCxDQUFDO0lBQ0QsUUFBUSxDQUFDLEdBQUcsSUFBaUQ7UUFDM0QsT0FBTyxJQUFJLENBQUMsR0FBRyxDQUFDLDJCQUFZLENBQUMsUUFBUSxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQztJQUNsRCxDQUFDO0lBQ0QsZUFBZSxDQUFDLEdBQUcsSUFBd0Q7UUFDekUsT0FBTyxJQUFJLENBQUMsR0FBRyxDQUFDLDJCQUFZLENBQUMsZUFBZSxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQztJQUN6RCxDQUFDO0lBQ0QsV0FBVyxDQUFDLEdBQUcsSUFBb0Q7UUFDakUsT0FBTyxJQUFJLENBQUMsR0FBRyxDQUFDLDJCQUFZLENBQUMsV0FBVyxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQztJQUNyRCxDQUFDO0lBRUQ7Ozs7Ozs7Ozs7O09BV0c7SUFDSCxTQUFTO1FBQ1AsT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDLHlDQUFnQixRQUFRLEVBQUUsQ0FBQyxDQUFDO0lBQ3BELENBQUM7SUFFRCwwQ0FBMEM7SUFDMUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxFQUFFLG1CQUFtQixLQUFtQixFQUFFO1FBQ3BELE9BQU8seUNBQWdCLEtBQUssQ0FBQyxFQUFFLG1CQUFtQixFQUFFLENBQUMsQ0FBQztJQUN4RCxDQUFDO0lBRUQsZ0NBQWdDO0lBQ2hDLEtBQUssQ0FBQyxTQUFTO1FBQ2IsT0FBTyx5Q0FBZ0IsU0FBUyxFQUFFLENBQUM7SUFDckMsQ0FBQztDQUNGO0FBcE5ELDRDQW9OQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGZyb21CNjQgfSBmcm9tICdAbXlzdGVuL2Jjcyc7XG5pbXBvcnQgeyBpcywgbWFzayB9IGZyb20gJ3N1cGVyc3RydWN0JztcbmltcG9ydCB7IE9iamVjdElkLCBTdWlPYmplY3RSZWYgfSBmcm9tICcuLi90eXBlcyc7XG5pbXBvcnQgeyBUcmFuc2FjdGlvbnMsIFRyYW5zYWN0aW9uQXJndW1lbnQsIFRyYW5zYWN0aW9uVHlwZSwgVHJhbnNhY3Rpb25CbG9ja0lucHV0IH0gZnJvbSAnLi9UcmFuc2FjdGlvbnMnO1xuaW1wb3J0IHsgQnVpbGRlckNhbGxBcmcsIGdldElkRnJvbUNhbGxBcmcsIElucHV0cywgT2JqZWN0Q2FsbEFyZyB9IGZyb20gJy4vSW5wdXRzJztcbmltcG9ydCB7IFRyYW5zYWN0aW9uQmxvY2tEYXRhQnVpbGRlciwgVHJhbnNhY3Rpb25FeHBpcmF0aW9uIH0gZnJvbSAnLi9UcmFuc2FjdGlvbkRhdGFCbG9jayc7XG5pbXBvcnQgeyBjcmVhdGUgfSBmcm9tICcuL3V0aWxzJztcblxudHlwZSBUcmFuc2FjdGlvblJlc3VsdCA9IFRyYW5zYWN0aW9uQXJndW1lbnQgJiBUcmFuc2FjdGlvbkFyZ3VtZW50W107XG5cbmZ1bmN0aW9uIGNyZWF0ZVRyYW5zYWN0aW9uUmVzdWx0KGluZGV4OiBudW1iZXIpOiBUcmFuc2FjdGlvblJlc3VsdCB7XG4gIGNvbnN0IGJhc2VSZXN1bHQ6IFRyYW5zYWN0aW9uQXJndW1lbnQgPSB7IGtpbmQ6ICdSZXN1bHQnLCBpbmRleCB9O1xuXG4gIGNvbnN0IG5lc3RlZFJlc3VsdHM6IFRyYW5zYWN0aW9uQXJndW1lbnRbXSA9IFtdO1xuICBjb25zdCBuZXN0ZWRSZXN1bHRGb3IgPSAocmVzdWx0SW5kZXg6IG51bWJlcik6IFRyYW5zYWN0aW9uQXJndW1lbnQgPT5cbiAgICAobmVzdGVkUmVzdWx0c1tyZXN1bHRJbmRleF0gPz89IHtcbiAgICAgIGtpbmQ6ICdOZXN0ZWRSZXN1bHQnLFxuICAgICAgaW5kZXgsXG4gICAgICByZXN1bHRJbmRleCxcbiAgICB9KTtcblxuICByZXR1cm4gbmV3IFByb3h5KGJhc2VSZXN1bHQsIHtcbiAgICBzZXQoKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1RoZSB0cmFuc2FjdGlvbiByZXN1bHQgaXMgYSBwcm94eSwgYW5kIGRvZXMgbm90IHN1cHBvcnQgc2V0dGluZyBwcm9wZXJ0aWVzIGRpcmVjdGx5Jyk7XG4gICAgfSxcbiAgICAvLyBUT0RPOiBJbnN0ZWFkIG9mIG1ha2luZyB0aGlzIHJldHVybiBhIGNvbmNyZXRlIGFyZ3VtZW50LCB3ZSBzaG91bGQgaWRlYWxseVxuICAgIC8vIG1ha2UgaXQgcmVmZXJlbmNlLWJhc2VkIChzbyB0aGF0IHRoaXMgZ2V0cyByZXNvbHZlZCBhdCBidWlsZC10aW1lKSwgd2hpY2hcbiAgICAvLyBhbGxvd3MgcmUtb3JkZXJpbmcgdHJhbnNhY3Rpb25zLlxuICAgIGdldCh0YXJnZXQsIHByb3BlcnR5KSB7XG4gICAgICAvLyBUaGlzIGFsbG93cyB0aGlzIHRyYW5zYWN0aW9uIGFyZ3VtZW50IHRvIGJlIHVzZWQgaW4gdGhlIHNpbmd1bGFyIGZvcm06XG4gICAgICBpZiAocHJvcGVydHkgaW4gdGFyZ2V0KSB7XG4gICAgICAgIHJldHVybiBSZWZsZWN0LmdldCh0YXJnZXQsIHByb3BlcnR5KTtcbiAgICAgIH1cblxuICAgICAgLy8gU3VwcG9ydCBkZXN0cnVjdHVyaW5nOlxuICAgICAgaWYgKHByb3BlcnR5ID09PSBTeW1ib2wuaXRlcmF0b3IpIHtcbiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgICAgbGV0IGkgPSAwO1xuICAgICAgICAgIHdoaWxlICh0cnVlKSB7XG4gICAgICAgICAgICB5aWVsZCBuZXN0ZWRSZXN1bHRGb3IoaSk7XG4gICAgICAgICAgICBpKys7XG4gICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgfVxuXG4gICAgICBpZiAodHlwZW9mIHByb3BlcnR5ID09PSAnc3ltYm9sJykgcmV0dXJuO1xuXG4gICAgICBjb25zdCByZXN1bHRJbmRleCA9IHBhcnNlSW50KHByb3BlcnR5LCAxMCk7XG4gICAgICBpZiAoTnVtYmVyLmlzTmFOKHJlc3VsdEluZGV4KSB8fCByZXN1bHRJbmRleCA8IDApIHJldHVybjtcbiAgICAgIHJldHVybiBuZXN0ZWRSZXN1bHRGb3IocmVzdWx0SW5kZXgpO1xuICAgIH0sXG4gIH0pIGFzIFRyYW5zYWN0aW9uUmVzdWx0O1xufVxuXG5jb25zdCBUUkFOU0FDVElPTl9CUkFORCA9IFN5bWJvbC5mb3IoJ0BteXN0ZW4vdHJhbnNhY3Rpb24nKTtcblxuLy8gVGhlIG1heGltdW0gbnVtYmVyIG9mIGdhcyBvYmplY3RzIHRoYXQgY2FuIGJlIHNlbGVjdGVkIGZvciBvbmUgdHJhbnNhY3Rpb24uXG5jb25zdCBNQVhfR0FTX09CSkVDVFMgPSAyNTY7XG5cbi8vIFRoZSBtYXhpbXVtIGdhcyB0aGF0IGlzIGFsbG93ZWQuXG5jb25zdCBNQVhfR0FTID0gMTAwMDAwMDAwMDtcblxuLy8gQSBndWVzcyBhYm91dCBob3cgbXVjaCBvdmVyaGVhZCBlYWNoIGNvaW4gcHJvdmlkZXMgZm9yIGdhcyBjYWxjdWxhdGlvbnMuXG4vLyBAdHMtaWdub3JlXG5jb25zdCBHQVNfT1ZFUkhFQURfUEVSX0NPSU4gPSAxMG47XG5cbmludGVyZmFjZSBCdWlsZE9wdGlvbnMge1xuICBvbmx5VHJhbnNhY3Rpb25LaW5kPzogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBUcmFuc2FjdGlvbiBCdWlsZGVyXG4gKi9cbmV4cG9ydCBjbGFzcyBUcmFuc2FjdGlvbkJsb2NrIHtcbiAgLyoqIFJldHVybnMgYHRydWVgIGlmIHRoZSBvYmplY3QgaXMgYW4gaW5zdGFuY2Ugb2YgdGhlIFRyYW5zYWN0aW9uIGJ1aWxkZXIgY2xhc3MuICovXG4gIHN0YXRpYyBpcyhvYmo6IHVua25vd24pOiBvYmogaXMgVHJhbnNhY3Rpb25CbG9jayB7XG4gICAgcmV0dXJuICEhb2JqICYmIHR5cGVvZiBvYmogPT09ICdvYmplY3QnICYmIChvYmogYXMgYW55KVtUUkFOU0FDVElPTl9CUkFORF0gPT09IHRydWU7XG4gIH1cblxuICAvKipcbiAgICogQ29udmVydHMgZnJvbSBhIHNlcmlhbGl6ZSB0cmFuc2FjdGlvbiBraW5kIChidWlsdCB3aXRoIGBidWlsZCh7IG9ubHlUcmFuc2FjdGlvbktpbmQ6IHRydWUgfSlgKSB0byBhIGBUcmFuc2FjdGlvbmAgY2xhc3MuXG4gICAqIFN1cHBvcnRzIGVpdGhlciBhIGJ5dGUgYXJyYXksIG9yIGJhc2U2NC1lbmNvZGVkIGJ5dGVzLlxuICAgKi9cbiAgc3RhdGljIGZyb21LaW5kKHNlcmlhbGl6ZWQ6IHN0cmluZyB8IFVpbnQ4QXJyYXkpIHtcbiAgICBjb25zdCB0eCA9IG5ldyBUcmFuc2FjdGlvbkJsb2NrKCk7XG5cbiAgICB0eC4jYmxvY2tEYXRhID0gVHJhbnNhY3Rpb25CbG9ja0RhdGFCdWlsZGVyLmZyb21LaW5kQnl0ZXMoXG4gICAgICB0eXBlb2Ygc2VyaWFsaXplZCA9PT0gJ3N0cmluZycgPyBmcm9tQjY0KHNlcmlhbGl6ZWQpIDogc2VyaWFsaXplZFxuICAgICk7XG5cbiAgICByZXR1cm4gdHg7XG4gIH1cblxuICAvKipcbiAgICogQ29udmVydHMgZnJvbSBhIHNlcmlhbGl6ZWQgdHJhbnNhY3Rpb24gZm9ybWF0IHRvIGEgYFRyYW5zYWN0aW9uYCBjbGFzcy5cbiAgICogVGhlcmUgYXJlIHR3byBzdXBwb3J0ZWQgc2VyaWFsaXplZCBmb3JtYXRzOlxuICAgKiAtIEEgc3RyaW5nIHJldHVybmVkIGZyb20gYFRyYW5zYWN0aW9uI3NlcmlhbGl6ZWAuIFRoZSBzZXJpYWxpemVkIGZvcm1hdCBtdXN0IGJlIGNvbXBhdGlibGUsIG9yIGl0IHdpbGwgdGhyb3cgYW4gZXJyb3IuXG4gICAqIC0gQSBieXRlIGFycmF5IChvciBiYXNlNjQtZW5jb2RlZCBieXRlcykgY29udGFpbmluZyBCQ1MgdHJhbnNhY3Rpb24gZGF0YS5cbiAgICovXG4gIHN0YXRpYyBmcm9tKHNlcmlhbGl6ZWQ6IHN0cmluZyB8IFVpbnQ4QXJyYXkpIHtcbiAgICBjb25zdCB0eCA9IG5ldyBUcmFuc2FjdGlvbkJsb2NrKCk7XG5cbiAgICAvLyBDaGVjayBmb3IgYnl0ZXM6XG4gICAgaWYgKHR5cGVvZiBzZXJpYWxpemVkICE9PSAnc3RyaW5nJyB8fCAhc2VyaWFsaXplZC5zdGFydHNXaXRoKCd7JykpIHtcbiAgICAgIHR4LiNibG9ja0RhdGEgPSBUcmFuc2FjdGlvbkJsb2NrRGF0YUJ1aWxkZXIuZnJvbUJ5dGVzKFxuICAgICAgICB0eXBlb2Ygc2VyaWFsaXplZCA9PT0gJ3N0cmluZycgPyBmcm9tQjY0KHNlcmlhbGl6ZWQpIDogc2VyaWFsaXplZFxuICAgICAgKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdHguI2Jsb2NrRGF0YSA9IFRyYW5zYWN0aW9uQmxvY2tEYXRhQnVpbGRlci5yZXN0b3JlKEpTT04ucGFyc2Uoc2VyaWFsaXplZCkpO1xuICAgIH1cblxuICAgIHJldHVybiB0eDtcbiAgfVxuXG4gIC8qKiBBIGhlbHBlciB0byByZXRyaWV2ZSB0aGUgVHJhbnNhY3Rpb24gYnVpbGRlciBgVHJhbnNhY3Rpb25zYCAqL1xuICBzdGF0aWMgZ2V0IFRyYW5zYWN0aW9ucygpIHtcbiAgICByZXR1cm4gVHJhbnNhY3Rpb25zO1xuICB9XG5cbiAgLyoqIEEgaGVscGVyIHRvIHJldHJpZXZlIHRoZSBUcmFuc2FjdGlvbiBidWlsZGVyIGBJbnB1dHNgICovXG4gIHN0YXRpYyBnZXQgSW5wdXRzKCkge1xuICAgIHJldHVybiBJbnB1dHM7XG4gIH1cblxuICBzZXRTZW5kZXIoc2VuZGVyOiBzdHJpbmcpIHtcbiAgICB0aGlzLiNibG9ja0RhdGEuc2VuZGVyID0gc2VuZGVyO1xuICB9XG4gIC8qKlxuICAgKiBTZXRzIHRoZSBzZW5kZXIgb25seSBpZiBpdCBoYXMgbm90IGFscmVhZHkgYmVlbiBzZXQuXG4gICAqIFRoaXMgaXMgdXNlZnVsIGZvciBzcG9uc29yZWQgdHJhbnNhY3Rpb24gZmxvd3Mgd2hlcmUgdGhlIHNlbmRlciBtYXkgbm90IGJlIHRoZSBzYW1lIGFzIHRoZSBzaWduZXIgYWRkcmVzcy5cbiAgICovXG4gIHNldFNlbmRlcklmTm90U2V0KHNlbmRlcjogc3RyaW5nKSB7XG4gICAgaWYgKCF0aGlzLiNibG9ja0RhdGEuc2VuZGVyKSB7XG4gICAgICB0aGlzLiNibG9ja0RhdGEuc2VuZGVyID0gc2VuZGVyO1xuICAgIH1cbiAgfVxuICBzZXRFeHBpcmF0aW9uKGV4cGlyYXRpb24/OiBUcmFuc2FjdGlvbkV4cGlyYXRpb24pIHtcbiAgICB0aGlzLiNibG9ja0RhdGEuZXhwaXJhdGlvbiA9IGV4cGlyYXRpb247XG4gIH1cbiAgc2V0R2FzUHJpY2UocHJpY2U6IG51bWJlciB8IGJpZ2ludCkge1xuICAgIHRoaXMuI2Jsb2NrRGF0YS5nYXNDb25maWcucHJpY2UgPSBTdHJpbmcocHJpY2UpO1xuICB9XG4gIHNldEdhc0J1ZGdldChidWRnZXQ6IG51bWJlciB8IGJpZ2ludCkge1xuICAgIHRoaXMuI2Jsb2NrRGF0YS5nYXNDb25maWcuYnVkZ2V0ID0gU3RyaW5nKGJ1ZGdldCk7XG4gIH1cbiAgc2V0R2FzT3duZXIob3duZXI6IHN0cmluZykge1xuICAgIHRoaXMuI2Jsb2NrRGF0YS5nYXNDb25maWcub3duZXIgPSBvd25lcjtcbiAgfVxuICBzZXRHYXNQYXltZW50KHBheW1lbnRzOiBTdWlPYmplY3RSZWZbXSkge1xuICAgIGlmIChwYXltZW50cy5sZW5ndGggPj0gTUFYX0dBU19PQkpFQ1RTKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFBheW1lbnQgb2JqZWN0cyBleGNlZWQgbWF4aW11bSBhbW91bnQgJHtNQVhfR0FTX09CSkVDVFN9YCk7XG4gICAgfVxuICAgIHRoaXMuI2Jsb2NrRGF0YS5nYXNDb25maWcucGF5bWVudCA9IHBheW1lbnRzLm1hcCgocGF5bWVudCkgPT4gbWFzayhwYXltZW50LCBTdWlPYmplY3RSZWYpKTtcbiAgfVxuXG4gICNibG9ja0RhdGE6IFRyYW5zYWN0aW9uQmxvY2tEYXRhQnVpbGRlcjtcbiAgLyoqIEdldCBhIHNuYXBzaG90IG9mIHRoZSB0cmFuc2FjdGlvbiBkYXRhLCBpbiBKU09OIGZvcm06ICovXG4gIGdldCBibG9ja0RhdGEoKSB7XG4gICAgcmV0dXJuIHRoaXMuI2Jsb2NrRGF0YS5zbmFwc2hvdCgpO1xuICB9XG5cbiAgLy8gVXNlZCB0byBicmFuZCB0cmFuc2FjdGlvbiBjbGFzc2VzIHNvIHRoYXQgdGhleSBjYW4gYmUgaWRlbnRpZmllZCwgZXZlbiBiZXR3ZWVuIG11bHRpcGxlIGNvcGllc1xuICAvLyBvZiB0aGUgYnVpbGRlci5cbiAgZ2V0IFtUUkFOU0FDVElPTl9CUkFORF0oKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBjb25zdHJ1Y3Rvcih0cmFuc2FjdGlvbj86IFRyYW5zYWN0aW9uQmxvY2spIHtcbiAgICB0aGlzLiNibG9ja0RhdGEgPSBuZXcgVHJhbnNhY3Rpb25CbG9ja0RhdGFCdWlsZGVyKHRyYW5zYWN0aW9uID8gdHJhbnNhY3Rpb24uI2Jsb2NrRGF0YSA6IHVuZGVmaW5lZCk7XG4gIH1cblxuICAvKiogUmV0dXJucyBhbiBhcmd1bWVudCBmb3IgdGhlIGdhcyBjb2luLCB0byBiZSB1c2VkIGluIGEgdHJhbnNhY3Rpb24uICovXG4gIGdldCBnYXMoKTogVHJhbnNhY3Rpb25Bcmd1bWVudCB7XG4gICAgcmV0dXJuIHsga2luZDogJ0dhc0NvaW4nIH07XG4gIH1cblxuICAvKipcbiAgICogRHluYW1pY2FsbHkgY3JlYXRlIGEgbmV3IGlucHV0LCB3aGljaCBpcyBzZXBhcmF0ZSBmcm9tIHRoZSBgaW5wdXRgLiBUaGlzIGlzIGltcG9ydGFudFxuICAgKiBmb3IgZ2VuZXJhdGVkIGNsaWVudHMgdG8gYmUgYWJsZSB0byBkZWZpbmUgdW5pcXVlIGlucHV0cyB0aGF0IGFyZSBub24tb3ZlcmxhcHBpbmcgd2l0aCB0aGVcbiAgICogZGVmaW5lZCBpbnB1dHMuXG4gICAqXG4gICAqIEZvciBgVWludDhBcnJheWAgdHlwZSBhdXRvbWF0aWNhbGx5IGNvbnZlcnQgdGhlIGlucHV0IGludG8gYSBgUHVyZWAgQ2FsbEFyZywgc2luY2UgdGhpc1xuICAgKiBpcyB0aGUgZm9ybWF0IHJlcXVpcmVkIGZvciBjdXN0b20gc2VyaWFsaXphdGlvbi5cbiAgICpcbiAgICovXG4gIGlucHV0KHR5cGU6ICdvYmplY3QnIHwgJ3B1cmUnLCB2YWx1ZT86IHVua25vd24pIHtcbiAgICBjb25zdCBpbmRleCA9IHRoaXMuI2Jsb2NrRGF0YS5pbnB1dHMubGVuZ3RoO1xuICAgIGNvbnN0IGlucHV0ID0gY3JlYXRlKFxuICAgICAge1xuICAgICAgICBraW5kOiAnSW5wdXQnLFxuICAgICAgICAvLyBiaWdpbnRzIGNhbid0IGJlIHNlcmlhbGl6ZWQgdG8gSlNPTiwgc28ganVzdCBzdHJpbmctY29udmVydCB0aGVtIGhlcmU6XG4gICAgICAgIHZhbHVlOiB0eXBlb2YgdmFsdWUgPT09ICdiaWdpbnQnID8gU3RyaW5nKHZhbHVlKSA6IHZhbHVlLFxuICAgICAgICBpbmRleCxcbiAgICAgICAgdHlwZSxcbiAgICAgIH0sXG4gICAgICBUcmFuc2FjdGlvbkJsb2NrSW5wdXRcbiAgICApO1xuICAgIHRoaXMuI2Jsb2NrRGF0YS5pbnB1dHMucHVzaChpbnB1dCk7XG4gICAgcmV0dXJuIGlucHV0O1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZCBhIG5ldyBvYmplY3QgaW5wdXQgdG8gdGhlIHRyYW5zYWN0aW9uLlxuICAgKi9cbiAgb2JqZWN0KHZhbHVlOiBPYmplY3RJZCB8IE9iamVjdENhbGxBcmcpIHtcbiAgICBjb25zdCBpZCA9IGdldElkRnJvbUNhbGxBcmcodmFsdWUpO1xuICAgIC8vIGRlZHVwbGljYXRlXG4gICAgY29uc3QgaW5zZXJ0ZWQgPSB0aGlzLiNibG9ja0RhdGEuaW5wdXRzLmZpbmQoKGkpID0+IGkudHlwZSA9PT0gJ29iamVjdCcgJiYgaWQgPT09IGdldElkRnJvbUNhbGxBcmcoaS52YWx1ZSkpO1xuICAgIHJldHVybiBpbnNlcnRlZCA/PyB0aGlzLmlucHV0KCdvYmplY3QnLCB2YWx1ZSk7XG4gIH1cblxuICAvKipcbiAgICogQWRkIGEgbmV3IG5vbi1vYmplY3QgaW5wdXQgdG8gdGhlIHRyYW5zYWN0aW9uLlxuICAgKi9cbiAgcHVyZShcbiAgICAvKipcbiAgICAgKiBUaGUgcHVyZSB2YWx1ZSB0aGF0IHdpbGwgYmUgdXNlZCBhcyB0aGUgaW5wdXQgdmFsdWUuIElmIHRoaXMgaXMgYSBVaW50OEFycmF5LCB0aGVuIHRoZSB2YWx1ZVxuICAgICAqIGlzIGFzc3VtZWQgdG8gYmUgcmF3IGJ5dGVzLCBhbmQgd2lsbCBiZSB1c2VkIGRpcmVjdGx5LlxuICAgICAqL1xuICAgIHZhbHVlOiB1bmtub3duLFxuICAgIC8qKlxuICAgICAqIFRoZSBCQ1MgdHlwZSB0byBzZXJpYWxpemUgdGhlIHZhbHVlIGludG8uIElmIG5vdCBwcm92aWRlZCwgdGhlIHR5cGUgd2lsbCBhdXRvbWF0aWNhbGx5IGJlIGRldGVybWluZWRcbiAgICAgKiBiYXNlZCBvbiBob3cgdGhlIGlucHV0IGlzIHVzZWQuXG4gICAgICovXG4gICAgdHlwZT86IHN0cmluZ1xuICApIHtcbiAgICAvLyBUT0RPOiB3ZSBjYW4gYWxzbyBkbyBzb21lIGRlZHVwbGljYXRpb24gaGVyZVxuICAgIHJldHVybiB0aGlzLmlucHV0KFxuICAgICAgJ3B1cmUnLFxuICAgICAgdmFsdWUgaW5zdGFuY2VvZiBVaW50OEFycmF5ID8gSW5wdXRzLlB1cmUodmFsdWUpIDogdHlwZSA/IElucHV0cy5QdXJlKHZhbHVlLCB0eXBlKSA6IHZhbHVlXG4gICAgKTtcbiAgfVxuXG4gIC8qKiBBZGQgYSB0cmFuc2FjdGlvbiB0byB0aGUgdHJhbnNhY3Rpb24gYmxvY2suICovXG4gIGFkZCh0cmFuc2FjdGlvbjogVHJhbnNhY3Rpb25UeXBlKSB7XG4gICAgY29uc3QgaW5kZXggPSB0aGlzLiNibG9ja0RhdGEudHJhbnNhY3Rpb25zLnB1c2godHJhbnNhY3Rpb24pO1xuICAgIHJldHVybiBjcmVhdGVUcmFuc2FjdGlvblJlc3VsdChpbmRleCAtIDEpO1xuICB9XG5cbiAgLy8gTWV0aG9kIHNob3J0aGFuZHM6XG5cbiAgc3BsaXRDb2lucyguLi5hcmdzOiBQYXJhbWV0ZXJzPHR5cGVvZiBUcmFuc2FjdGlvbnNbJ1NwbGl0Q29pbnMnXT4pIHtcbiAgICByZXR1cm4gdGhpcy5hZGQoVHJhbnNhY3Rpb25zLlNwbGl0Q29pbnMoLi4uYXJncykpO1xuICB9XG4gIG1lcmdlQ29pbnMoLi4uYXJnczogUGFyYW1ldGVyczx0eXBlb2YgVHJhbnNhY3Rpb25zWydNZXJnZUNvaW5zJ10+KSB7XG4gICAgcmV0dXJuIHRoaXMuYWRkKFRyYW5zYWN0aW9ucy5NZXJnZUNvaW5zKC4uLmFyZ3MpKTtcbiAgfVxuICBwdWJsaXNoKC4uLmFyZ3M6IFBhcmFtZXRlcnM8dHlwZW9mIFRyYW5zYWN0aW9uc1snUHVibGlzaCddPikge1xuICAgIHJldHVybiB0aGlzLmFkZChUcmFuc2FjdGlvbnMuUHVibGlzaCguLi5hcmdzKSk7XG4gIH1cbiAgbW92ZUNhbGwoLi4uYXJnczogUGFyYW1ldGVyczx0eXBlb2YgVHJhbnNhY3Rpb25zWydNb3ZlQ2FsbCddPikge1xuICAgIHJldHVybiB0aGlzLmFkZChUcmFuc2FjdGlvbnMuTW92ZUNhbGwoLi4uYXJncykpO1xuICB9XG4gIHRyYW5zZmVyT2JqZWN0cyguLi5hcmdzOiBQYXJhbWV0ZXJzPHR5cGVvZiBUcmFuc2FjdGlvbnNbJ1RyYW5zZmVyT2JqZWN0cyddPikge1xuICAgIHJldHVybiB0aGlzLmFkZChUcmFuc2FjdGlvbnMuVHJhbnNmZXJPYmplY3RzKC4uLmFyZ3MpKTtcbiAgfVxuICBtYWtlTW92ZVZlYyguLi5hcmdzOiBQYXJhbWV0ZXJzPHR5cGVvZiBUcmFuc2FjdGlvbnNbJ01ha2VNb3ZlVmVjJ10+KSB7XG4gICAgcmV0dXJuIHRoaXMuYWRkKFRyYW5zYWN0aW9ucy5NYWtlTW92ZVZlYyguLi5hcmdzKSk7XG4gIH1cblxuICAvKipcbiAgICogU2VyaWFsaXplIHRoZSB0cmFuc2FjdGlvbiB0byBhIHN0cmluZyBzbyB0aGF0IGl0IGNhbiBiZSBzZW50IHRvIGEgc2VwYXJhdGUgY29udGV4dC5cbiAgICogVGhpcyBpcyBkaWZmZXJlbnQgZnJvbSBgYnVpbGRgIGluIHRoYXQgaXQgZG9lcyBub3Qgc2VyaWFsaXplIHRvIEJDUyBieXRlcywgYW5kIGluc3RlYWRcbiAgICogdXNlcyBhIHNlcGFyYXRlIGZvcm1hdCB0aGF0IGlzIHVuaXF1ZSB0byB0aGUgdHJhbnNhY3Rpb24gYnVpbGRlci4gVGhpcyBhbGxvd3NcbiAgICogdXMgdG8gc2VyaWFsaXplIHBhcnRpYWxseS1jb21wbGV0ZSB0cmFuc2FjdGlvbnMsIHRoYXQgY2FuIHRoZW4gYmUgY29tcGxldGVkIGFuZFxuICAgKiBidWlsdCBpbiBhIHNlcGFyYXRlIGNvbnRleHQuXG4gICAqXG4gICAqIEZvciBleGFtcGxlLCBhIGRhcHAgY2FuIGNvbnN0cnVjdCBhIHRyYW5zYWN0aW9uLCBidXQgbm90IHByb3ZpZGUgZ2FzIG9iamVjdHNcbiAgICogb3IgYSBnYXMgYnVkZ2V0LiBUaGUgdHJhbnNhY3Rpb24gdGhlbiBjYW4gYmUgc2VudCB0byB0aGUgd2FsbGV0LCB3aGVyZSB0aGlzXG4gICAqIGluZm9ybWF0aW9uIGlzIGF1dG9tYXRpY2FsbHkgZmlsbGVkIGluIChlLmcuIGJ5IHF1ZXJ5aW5nIGZvciBjb2luIG9iamVjdHNcbiAgICogYW5kIHBlcmZvcm1pbmcgYSBkcnkgcnVuKS5cbiAgICovXG4gIHNlcmlhbGl6ZSgpIHtcbiAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkodGhpcy4jYmxvY2tEYXRhLnNuYXBzaG90KCkpO1xuICB9XG5cbiAgLyoqIEJ1aWxkIHRoZSB0cmFuc2FjdGlvbiB0byBCQ1MgYnl0ZXMuICovXG4gIGFzeW5jIGJ1aWxkKHsgb25seVRyYW5zYWN0aW9uS2luZCB9OiBCdWlsZE9wdGlvbnMgPSB7fSk6IFByb21pc2U8VWludDhBcnJheT4ge1xuICAgIHJldHVybiB0aGlzLiNibG9ja0RhdGEuYnVpbGQoeyBvbmx5VHJhbnNhY3Rpb25LaW5kIH0pO1xuICB9XG5cbiAgLyoqIERlcml2ZSB0cmFuc2FjdGlvbiBkaWdlc3QgKi9cbiAgYXN5bmMgZ2V0RGlnZXN0KCk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgcmV0dXJuIHRoaXMuI2Jsb2NrRGF0YS5nZXREaWdlc3QoKTtcbiAgfVxufVxuIl19