@bitgo/abstract-utxo 9.8.0 → 9.10.0

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 (46) hide show
  1. package/CHANGELOG.md +14 -0
  2. package/dist/src/descriptor/NamedDescriptor.d.ts +8 -2
  3. package/dist/src/descriptor/NamedDescriptor.d.ts.map +1 -1
  4. package/dist/src/descriptor/NamedDescriptor.js +30 -5
  5. package/dist/src/descriptor/createWallet/createDescriptorWallet.d.ts +20 -0
  6. package/dist/src/descriptor/createWallet/createDescriptorWallet.d.ts.map +1 -0
  7. package/dist/src/descriptor/createWallet/createDescriptorWallet.js +74 -0
  8. package/dist/src/descriptor/createWallet/createDescriptors.d.ts +12 -0
  9. package/dist/src/descriptor/createWallet/createDescriptors.d.ts.map +1 -0
  10. package/dist/src/descriptor/createWallet/createDescriptors.js +31 -0
  11. package/dist/src/descriptor/createWallet/index.d.ts +3 -0
  12. package/dist/src/descriptor/createWallet/index.d.ts.map +1 -0
  13. package/dist/src/descriptor/createWallet/index.js +19 -0
  14. package/dist/src/descriptor/index.d.ts +1 -0
  15. package/dist/src/descriptor/index.d.ts.map +1 -1
  16. package/dist/src/descriptor/index.js +36 -2
  17. package/dist/src/transaction/descriptor/parse.d.ts +6 -2
  18. package/dist/src/transaction/descriptor/parse.d.ts.map +1 -1
  19. package/dist/src/transaction/descriptor/parse.js +6 -6
  20. package/dist/src/transaction/descriptor/parseToAmountType.d.ts.map +1 -1
  21. package/dist/src/transaction/descriptor/parseToAmountType.js +4 -1
  22. package/dist/src/transaction/descriptor/verifyTransaction.d.ts +5 -5
  23. package/dist/src/transaction/descriptor/verifyTransaction.d.ts.map +1 -1
  24. package/dist/src/transaction/descriptor/verifyTransaction.js +1 -1
  25. package/dist/src/transaction/fixedScript/parseTransaction.d.ts +5 -7
  26. package/dist/src/transaction/fixedScript/parseTransaction.d.ts.map +1 -1
  27. package/dist/src/transaction/fixedScript/parseTransaction.js +27 -30
  28. package/dist/src/transaction/outputDifference.d.ts +40 -0
  29. package/dist/src/transaction/outputDifference.d.ts.map +1 -0
  30. package/dist/src/transaction/outputDifference.js +47 -0
  31. package/dist/test/descriptor/NamedDescriptor.d.ts +2 -0
  32. package/dist/test/descriptor/NamedDescriptor.d.ts.map +1 -0
  33. package/dist/test/descriptor/NamedDescriptor.js +19 -0
  34. package/dist/test/descriptor/createWallet/createDescriptors.d.ts +2 -0
  35. package/dist/test/descriptor/createWallet/createDescriptors.d.ts.map +1 -0
  36. package/dist/test/descriptor/createWallet/createDescriptors.js +21 -0
  37. package/dist/test/transaction/descriptor/outputDifference.js +41 -25
  38. package/dist/test/transaction/descriptor/parse.js +14 -1
  39. package/dist/tsconfig.tsbuildinfo +1 -1
  40. package/package.json +4 -4
  41. package/dist/src/transaction/descriptor/outputDifference.d.ts +0 -30
  42. package/dist/src/transaction/descriptor/outputDifference.d.ts.map +0 -1
  43. package/dist/src/transaction/descriptor/outputDifference.js +0 -38
  44. package/dist/test/outputDifference.d.ts +0 -2
  45. package/dist/test/outputDifference.d.ts.map +0 -1
  46. package/dist/test/outputDifference.js +0 -86
@@ -1 +1 @@
1
- {"version":3,"file":"parseTransaction.d.ts","sourceRoot":"","sources":["../../../../src/transaction/fixedScript/parseTransaction.ts"],"names":[],"mappings":"AAMA,OAAO,EACL,gBAAgB,EAEhB,MAAM,EAEN,iBAAiB,EACjB,uBAAuB,EACxB,MAAM,wBAAwB,CAAC;AAKhC;;;;GAIG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,EAAE,CAY5E;AAED,wBAAsB,gBAAgB,CAAC,OAAO,SAAS,MAAM,GAAG,MAAM,EACpE,IAAI,EAAE,gBAAgB,EACtB,MAAM,EAAE,uBAAuB,CAAC,OAAO,CAAC,GACvC,OAAO,CAAC,iBAAiB,CAAC,OAAO,CAAC,CAAC,CAsLrC"}
1
+ {"version":3,"file":"parseTransaction.d.ts","sourceRoot":"","sources":["../../../../src/transaction/fixedScript/parseTransaction.ts"],"names":[],"mappings":"AAMA,OAAO,EACL,gBAAgB,EAIhB,iBAAiB,EACjB,uBAAuB,EACxB,MAAM,wBAAwB,CAAC;AAEhC,OAAO,EAAE,gBAAgB,EAAoB,MAAM,qBAAqB,CAAC;AAKzE,MAAM,MAAM,4BAA4B,CAAC,MAAM,IAAI,gBAAgB,CAAC,MAAM,CAAC,GAAG;IAC5E,QAAQ,EAAE,OAAO,GAAG,SAAS,CAAC;CAC/B,CAAC;AAEF,wBAAsB,gBAAgB,CAAC,OAAO,SAAS,MAAM,GAAG,MAAM,EACpE,IAAI,EAAE,gBAAgB,EACtB,MAAM,EAAE,uBAAuB,CAAC,OAAO,CAAC,GACvC,OAAO,CAAC,iBAAiB,CAAC,OAAO,CAAC,CAAC,CAwMrC"}
@@ -36,29 +36,14 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
36
36
  return (mod && mod.__esModule) ? mod : { "default": mod };
37
37
  };
38
38
  Object.defineProperty(exports, "__esModule", { value: true });
39
- exports.outputDifference = outputDifference;
40
39
  exports.parseTransaction = parseTransaction;
41
40
  const assert_1 = __importDefault(require("assert"));
42
41
  const lodash_1 = __importDefault(require("lodash"));
43
42
  const utxolib = __importStar(require("@bitgo/utxo-lib"));
44
43
  const keychains_1 = require("../../keychains");
44
+ const outputDifference_1 = require("../outputDifference");
45
+ const recipient_1 = require("../recipient");
45
46
  const parseOutput_1 = require("./parseOutput");
46
- /**
47
- * @param first
48
- * @param second
49
- * @returns {Array} All outputs that are in the first array but not in the second
50
- */
51
- function outputDifference(first, second) {
52
- const keyFunc = ({ address, amount }) => `${address}:${amount}`;
53
- const groupedOutputs = lodash_1.default.groupBy(first, keyFunc);
54
- second.forEach((output) => {
55
- const group = groupedOutputs[keyFunc(output)];
56
- if (group) {
57
- group.pop();
58
- }
59
- });
60
- return lodash_1.default.flatten(lodash_1.default.values(groupedOutputs));
61
- }
62
47
  async function parseTransaction(coin, params) {
63
48
  const { txParams, txPrebuild, wallet, verification = {}, reqId } = params;
64
49
  if (!lodash_1.default.isUndefined(verification.disableNetworking) && !lodash_1.default.isBoolean(verification.disableNetworking)) {
@@ -122,7 +107,6 @@ async function parseTransaction(coin, params) {
122
107
  }));
123
108
  }
124
109
  }
125
- const missingOutputs = outputDifference(expectedOutputs, allOutputs);
126
110
  // get the keychains from the custom change wallet if needed
127
111
  let customChange;
128
112
  const { customChangeWalletId = undefined } = wallet.coinSpecific() || {};
@@ -169,14 +153,20 @@ async function parseTransaction(coin, params) {
169
153
  }));
170
154
  const needsCustomChangeKeySignatureVerification = allOutputDetails.some((output) => output?.needsCustomChangeKeySignatureVerification);
171
155
  const changeOutputs = lodash_1.default.filter(allOutputDetails, { external: false });
172
- // these are all the outputs that were not originally explicitly specified in recipients
173
- // ideally change outputs or a paygo output that might have been added
174
- const implicitOutputs = outputDifference(allOutputDetails, expectedOutputs);
175
- const explicitOutputs = outputDifference(allOutputDetails, implicitOutputs);
156
+ function toComparableOutputsWithExternal(outputs) {
157
+ return outputs.map((output) => ({
158
+ script: (0, recipient_1.fromExtendedAddressFormatToScript)(output.address, coin.network),
159
+ value: output.amount === 'max' ? 'max' : BigInt(output.amount),
160
+ external: output.external,
161
+ }));
162
+ }
163
+ const missingOutputs = (0, outputDifference_1.outputDifference)(toComparableOutputsWithExternal(expectedOutputs), toComparableOutputsWithExternal(allOutputs));
164
+ const implicitOutputs = (0, outputDifference_1.outputDifference)(toComparableOutputsWithExternal(allOutputDetails), toComparableOutputsWithExternal(expectedOutputs));
165
+ const explicitOutputs = (0, outputDifference_1.outputDifference)(toComparableOutputsWithExternal(allOutputDetails), implicitOutputs);
176
166
  // these are all the non-wallet outputs that had been originally explicitly specified in recipients
177
- const explicitExternalOutputs = lodash_1.default.filter(explicitOutputs, { external: true });
167
+ const explicitExternalOutputs = explicitOutputs.filter((output) => output.external);
178
168
  // this is the sum of all the originally explicitly specified non-wallet output values
179
- const explicitExternalSpendAmount = utxolib.bitgo.toTNumber(explicitExternalOutputs.reduce((sum, o) => sum + BigInt(o.amount), BigInt(0)), coin.amountType);
169
+ const explicitExternalSpendAmount = utxolib.bitgo.toTNumber(explicitExternalOutputs.reduce((sum, o) => sum + BigInt(o.value), BigInt(0)), coin.amountType);
180
170
  /**
181
171
  * The calculation of the implicit external spend amount pertains to verifying the pay-as-you-go-fee BitGo
182
172
  * automatically applies to transactions sending money out of the wallet. The logic is fairly straightforward
@@ -187,15 +177,22 @@ async function parseTransaction(coin, params) {
187
177
  */
188
178
  // make sure that all the extra addresses are change addresses
189
179
  // get all the additional external outputs the server added and calculate their values
190
- const implicitExternalOutputs = lodash_1.default.filter(implicitOutputs, { external: true });
191
- const implicitExternalSpendAmount = utxolib.bitgo.toTNumber(implicitExternalOutputs.reduce((sum, o) => sum + BigInt(o.amount), BigInt(0)), coin.amountType);
180
+ const implicitExternalOutputs = implicitOutputs.filter((output) => output.external);
181
+ const implicitExternalSpendAmount = utxolib.bitgo.toTNumber(implicitExternalOutputs.reduce((sum, o) => sum + BigInt(o.value), BigInt(0)), coin.amountType);
182
+ function toOutputs(outputs) {
183
+ return outputs.map((output) => ({
184
+ address: (0, recipient_1.toExtendedAddressFormat)(output.script, coin.network),
185
+ amount: output.value.toString(),
186
+ external: output.external,
187
+ }));
188
+ }
192
189
  return {
193
190
  keychains,
194
191
  keySignatures: (0, keychains_1.getKeySignatures)(wallet) ?? {},
195
192
  outputs: allOutputDetails,
196
- missingOutputs,
197
- explicitExternalOutputs,
198
- implicitExternalOutputs,
193
+ missingOutputs: toOutputs(missingOutputs),
194
+ explicitExternalOutputs: toOutputs(explicitExternalOutputs),
195
+ implicitExternalOutputs: toOutputs(implicitExternalOutputs),
199
196
  changeOutputs,
200
197
  explicitExternalSpendAmount,
201
198
  implicitExternalSpendAmount,
@@ -203,4 +200,4 @@ async function parseTransaction(coin, params) {
203
200
  customChange,
204
201
  };
205
202
  }
206
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGFyc2VUcmFuc2FjdGlvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy90cmFuc2FjdGlvbi9maXhlZFNjcmlwdC9wYXJzZVRyYW5zYWN0aW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBdUJBLDRDQVlDO0FBRUQsNENBeUxDO0FBOU5ELG9EQUE0QjtBQUU1QixvREFBdUI7QUFFdkIseURBQTJDO0FBVTNDLCtDQUF1SDtBQUV2SCwrQ0FBaUU7QUFFakU7Ozs7R0FJRztBQUNILFNBQWdCLGdCQUFnQixDQUFDLEtBQWUsRUFBRSxNQUFnQjtJQUNoRSxNQUFNLE9BQU8sR0FBRyxDQUFDLEVBQUUsT0FBTyxFQUFFLE1BQU0sRUFBVSxFQUFVLEVBQUUsQ0FBQyxHQUFHLE9BQU8sSUFBSSxNQUFNLEVBQUUsQ0FBQztJQUNoRixNQUFNLGNBQWMsR0FBRyxnQkFBQyxDQUFDLE9BQU8sQ0FBQyxLQUFLLEVBQUUsT0FBTyxDQUFDLENBQUM7SUFFakQsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDLE1BQU0sRUFBRSxFQUFFO1FBQ3hCLE1BQU0sS0FBSyxHQUFHLGNBQWMsQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQztRQUM5QyxJQUFJLEtBQUssRUFBRSxDQUFDO1lBQ1YsS0FBSyxDQUFDLEdBQUcsRUFBRSxDQUFDO1FBQ2QsQ0FBQztJQUNILENBQUMsQ0FBQyxDQUFDO0lBRUgsT0FBTyxnQkFBQyxDQUFDLE9BQU8sQ0FBQyxnQkFBQyxDQUFDLE1BQU0sQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDO0FBQzdDLENBQUM7QUFFTSxLQUFLLFVBQVUsZ0JBQWdCLENBQ3BDLElBQXNCLEVBQ3RCLE1BQXdDO0lBRXhDLE1BQU0sRUFBRSxRQUFRLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSxZQUFZLEdBQUcsRUFBRSxFQUFFLEtBQUssRUFBRSxHQUFH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QUFFLElBQUksRUFBRSxDQUFDLENBQUM7SUFDOUUsTUFBTSwyQkFBMkIsR0FBRyxPQUFPLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FDekQsdUJBQXVCLENBQUMsTUFBTSxDQUFDLENBQUMsR0FBVyxFQUFFLENBQVMsRUFBRSxFQUFFLENBQUMsR0FBRyxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFXLEVBQ3ZHLElBQUksQ0FBQyxVQUFVLENBQ2hCLENBQUM7SUFFRixPQUFPO1FBQ0wsU0FBUztRQUNULGFBQWEsRUFBRSxJQUFBLDRCQUFnQixFQUFDLE1BQU0sQ0FBQyxJQUFJLEVBQUU7UUFDN0MsT0FBTyxFQUFFLGdCQUFnQjtRQUN6QixjQUFjO1FBQ2QsdUJBQXVCO1FBQ3ZCLHVCQUF1QjtRQUN2QixhQUFhO1FBQ2IsMkJBQTJCO1FBQzNCLDJCQUEyQjtRQUMzQix5Q0FBeUM7UUFDekMsWUFBWTtLQUNiLENBQUM7QUFDSixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IGFzc2VydCBmcm9tICdhc3NlcnQnO1xuXG5pbXBvcnQgXyBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IHsgVHJpcGxlLCBWZXJpZmljYXRpb25PcHRpb25zLCBXYWxsZXQgfSBmcm9tICdAYml0Z28vc2RrLWNvcmUnO1xuaW1wb3J0ICogYXMgdXR4b2xpYiBmcm9tICdAYml0Z28vdXR4by1saWInO1xuXG5pbXBvcnQge1xuICBBYnN0cmFjdFV0eG9Db2luLFxuICBGaXhlZFNjcmlwdFdhbGxldE91dHB1dCxcbiAgT3V0cHV0LFxuICBUcmFuc2FjdGlvbkV4cGxhbmF0aW9uLFxuICBQYXJzZWRUcmFuc2FjdGlvbixcbiAgUGFyc2VUcmFuc2FjdGlvbk9wdGlvbnMsXG59IGZyb20gJy4uLy4uL2Fic3RyYWN0VXR4b0NvaW4nO1xuaW1wb3J0IHsgZmV0Y2hLZXljaGFpbnMsIGdldEtleVNpZ25hdHVyZXMsIHRvS2V5Y2hhaW5UcmlwbGUsIFV0eG9LZXljaGFpbiwgVXR4b05hbWVkS2V5Y2hhaW5zIH0gZnJvbSAnLi4vLi4va2V5Y2hhaW5zJztcblxuaW1wb3J0IHsgQ3VzdG9tQ2hhbmdlT3B0aW9ucywgcGFyc2VPdXRwdXQgfSBmcm9tICcuL3BhcnNlT3V0cHV0JztcblxuLyoqXG4gKiBAcGFyYW0gZmlyc3RcbiAqIEBwYXJhbSBzZWNvbmRcbiAqIEByZXR1cm5zIHtBcnJheX0gQWxsIG91dHB1dHMgdGhhdCBhcmUgaW4gdGhlIGZpcnN0IGFycmF5IGJ1dCBub3QgaW4gdGhlIHNlY29uZFxuICovXG5leHBvcnQgZnVuY3Rpb24gb3V0cHV0RGlmZmVyZW5jZShmaXJzdDogT3V0cHV0W10sIHNlY29uZDogT3V0cHV0W10pOiBPdXRwdXRbXSB7XG4gIGNvbnN0IGtleUZ1bmMgPSAoeyBhZGRyZXNzLCBhbW91bnQgfTogT3V0cHV0KTogc3RyaW5nID0+IGAke2FkZHJlc3N9OiR7YW1vdW50fWA7XG4gIGNvbnN0IGdyb3VwZWRPdXRwdXRzID0gXy5ncm91cEJ5KGZpcnN0LCBrZXlGdW5jKTtcblxuICBzZWNvbmQuZm9yRWFjaCgob3V0cHV0KSA9PiB7XG4gICAgY29uc3QgZ3JvdXAgPSBncm91cGVkT3V0cHV0c1trZXlGdW5jKG91dHB1dCldO1xuICAgIGlmIChncm91cCkge1xuICAgICAgZ3JvdXAucG9wKCk7XG4gICAgfVxuICB9KTtcblxuICByZXR1cm4gXy5mbGF0dGVuKF8udmFsdWVzKGdyb3VwZWRPdXRwdXRzKSk7XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBwYXJzZVRyYW5zYWN0aW9uPFROdW1iZXIgZXh0ZW5kcyBiaWdpbnQgfCBudW1iZXI+KFxuICBjb2luOiBBYnN0cmFjdFV0eG9Db2luLFxuICBwYXJhbXM6IFBhcnNlVHJhbnNhY3Rpb25PcHRpb25zPFROdW1iZXI+XG4pOiBQcm9taXNlPFBhcnNlZFRyYW5zYWN0aW9uPFROdW1iZXI+PiB7XG4gIGNvbnN0IHsgdHhQYXJhbXMsIHR4UHJlYnVpbGQsIHdhbGxldCwgdmVyaWZpY2F0aW9uID0ge30sIHJlcUlkIH0gPSBwYXJhbXM7XG5cbiAgaWYgKCFfLmlzVW5kZWZpbmVkKHZlcmlmaWNhdGlvbi5kaXNhYmxlTmV0d29ya2luZykgJiYgIV8uaXNCb29sZWFuKHZlcmlmaWNhdGlvbi5kaXNhYmxlTmV0d29ya2luZykpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ3ZlcmlmaWNhdGlvbi5kaXNhYmxlTmV0d29ya2luZyBtdXN0IGJlIGEgYm9vbGVhbicpO1xuICB9XG4gIGNvbnN0IGRpc2FibGVOZXR3b3JraW5nID0gdmVyaWZpY2F0aW9uLmRpc2FibGVOZXR3b3JraW5nO1xuXG4gIC8vIG9idGFpbiB0aGUga2V5Y2hhaW5zIGFuZCBrZXkgc2lnbmF0dXJlc1xuICBsZXQga2V5Y2hhaW5zOiBVdHhvTmFtZWRLZXljaGFpbnMgfCBWZXJpZmljYXRpb25PcHRpb25zWydrZXljaGFpbnMnXSB8IHVuZGVmaW5lZCA9IHZlcmlmaWNhdGlvbi5rZXljaGFpbnM7XG4gIGlmICgha2V5Y2hhaW5zKSB7XG4gICAgaWYgKGRpc2FibGVOZXR3b3JraW5nKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2Nhbm5vdCBmZXRjaCBrZXljaGFpbnMgd2l0aG91dCBuZXR3b3JraW5nJyk7XG4gICAgfVxuICAgIGtleWNoYWlucyA9IGF3YWl0IGZldGNoS2V5Y2hhaW5zKGNvaW4sIHdhbGxldCwgcmVxSWQpO1xuICB9XG5cbiAgaWYgKCFVdHhvTmFtZWRLZXljaGFpbnMuaXMoa2V5Y2hhaW5zKSkge1xuICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBrZXljaGFpbnMnKTtcbiAgfVxuXG4gIGNvbnN0IGtleWNoYWluQXJyYXk6IFRyaXBsZTxVdHhvS2V5Y2hhaW4+ID0gdG9LZXljaGFpblRyaXBsZShrZXljaGFpbnMpO1xuXG4gIGlmIChfLmlzVW5kZWZpbmVkKHR4UHJlYnVpbGQudHhIZXgpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdtaXNzaW5nIHJlcXVpcmVkIHR4UHJlYnVpbGQgcHJvcGVydHkgdHhIZXgnKTtcbiAgfVxuXG4gIC8vIG9idGFpbiBhbGwgb3V0cHV0c1xuICBjb25zdCBleHBsYW5hdGlvbjogVHJhbnNhY3Rpb25FeHBsYW5hdGlvbiA9IGF3YWl0IGNvaW4uZXhwbGFpblRyYW5zYWN0aW9uPFROdW1iZXI+KHtcbiAgICB0eEhleDogdHhQcmVidWlsZC50eEhleCxcbiAgICB0eEluZm86IHR4UHJlYnVpbGQudHhJbmZvLFxuICAgIHB1YnM6IGtleWNoYWluQXJyYXkubWFwKChrKSA9PiBrLnB1YikgYXMgVHJpcGxlPHN0cmluZz4sXG4gIH0pO1xuXG4gIGNvbnN0IGFsbE91dHB1dHMgPSBbLi4uZXhwbGFuYXRpb24ub3V0cHV0cywgLi4uZXhwbGFuYXRpb24uY2hhbmdlT3V0cHV0c107XG5cbiAgbGV0IGV4cGVjdGVkT3V0cHV0cztcbiAgaWYgKHR4UGFyYW1zLnJiZlR4SWRzKSB7XG4gICAgYXNzZXJ0KHR4UGFyYW1zLnJiZlR4SWRzLmxlbmd0aCA9PT0gMSk7XG5cbiAgICBjb25zdCB0eFRvQmVSZXBsYWNlZCA9IGF3YWl0IHdhbGxldC5nZXRUcmFuc2FjdGlvbih7IHR4SGFzaDogdHhQYXJhbXMucmJmVHhJZHNbMF0sIGluY2x1ZGVSYmY6IHRydWUgfSk7XG4gICAgZXhwZWN0ZWRPdXRwdXRzID0gdHhUb0JlUmVwbGFjZWQub3V0cHV0cy5mbGF0TWFwKFxuICAgICAgKG91dHB1dDogeyB2YWx1ZVN0cmluZzogc3RyaW5nOyBhZGRyZXNzPzogc3RyaW5nOyB3YWxsZXQ/OiBzdHJpbmcgfSkgPT4ge1xuICAgICAgICAvLyBGb3Igc2VsZi1zZW5kcywgdGhlIHdhbGxldElkIHdpbGwgYmUgdGhlIHNhbWUgYXMgdGhlIHdhbGxldCdzIGlkXG4gICAgICAgIGlmIChvdXRwdXQud2FsbGV0ID09PSB3YWxsZXQuaWQoKSkge1xuICAgICAgICAgIHJldHVybiBbXTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gW2NvaW4udG9DYW5vbmljYWxUcmFuc2FjdGlvblJlY2lwaWVudChvdXRwdXQpXTtcbiAgICAgIH1cbiAgICApO1xuICB9IGVsc2Uge1xuICAgIC8vIHZlcmlmeSB0aGF0IGVhY2ggcmVjaXBpZW50IGZyb20gdHhQYXJhbXMgaGFzIHRoZWlyIG93biBvdXRwdXRcbiAgICBleHBlY3RlZE91dHB1dHMgPSAodHhQYXJhbXMucmVjaXBpZW50cyA/PyBbXSkuZmxhdE1hcCgob3V0cHV0KSA9PiB7XG4gICAgICBpZiAob3V0cHV0LmFkZHJlc3MgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICBpZiAob3V0cHV0LmFtb3VudC50b1N0cmluZygpICE9PSAnMCcpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYE9ubHkgemVybyBhbW91bnRzIGFsbG93ZWQgZm9yIG5vbi1lbmNvZGVhYmxlIHNjcmlwdFB1YmtleXM6ICR7b3V0cHV0fWApO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBbb3V0cHV0XTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBbeyAuLi5vdXRwdXQsIGFkZHJlc3M6IGNvaW4uY2Fub25pY2FsQWRkcmVzcyhvdXRwdXQuYWRkcmVzcykgfV07XG4gICAgfSk7XG4gICAgaWYgKHR4UGFyYW1zLmFsbG93RXh0ZXJuYWxDaGFuZ2VBZGRyZXNzICYmIHR4UGFyYW1zLmNoYW5nZUFkZHJlc3MpIHtcbiAgICAgIC8vIHdoZW4gYW4gZXh0ZXJuYWwgY2hhbmdlIGFkZHJlc3MgaXMgZXhwbGljaXRseSBzcGVjaWZpZWQsIGNvdW50IGFsbCBvdXRwdXRzIGdvaW5nIHRvd2FyZHMgdGhhdFxuICAgICAgLy8gYWRkcmVzcyBpbiB0aGUgZXhwZWN0ZWQgb3V0cHV0cyAocmVnYXJkbGVzcyBvZiB0aGUgb3V0cHV0IGFtb3VudClcbiAgICAgIGV4cGVjdGVkT3V0cHV0cy5wdXNoKFxuICAgICAgICAuLi5hbGxPdXRwdXRzLmZsYXRNYXAoKG91dHB1dCkgPT4ge1xuICAgICAgICAgIGlmIChcbiAgICAgICAgICAgIG91dHB1dC5hZGRyZXNzID09PSB1bmRlZmluZWQgfHxcbiAgICAgICAgICAgIG91dHB1dC5hZGRyZXNzICE9PSBjb2luLmNhbm9uaWNhbEFkZHJlc3ModHhQYXJhbXMuY2hhbmdlQWRkcmVzcyBhcyBzdHJpbmcpXG4gICAgICAgICAgKSB7XG4gICAgICAgICAgICByZXR1cm4gW107XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBbeyAuLi5vdXRwdXQsIGFkZHJlc3M6IGNvaW4uY2Fub25pY2FsQWRkcmVzcyhvdXRwdXQuYWRkcmVzcykgfV07XG4gICAgICAgIH0pXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIGNvbnN0IG1pc3NpbmdPdXRwdXRzID0gb3V0cHV0RGlmZmVyZW5jZShleHBlY3RlZE91dHB1dHMsIGFsbE91dHB1dHMpO1xuXG4gIC8vIGdldCB0aGUga2V5Y2hhaW5zIGZyb20gdGhlIGN1c3RvbSBjaGFuZ2Ugd2FsbGV0IGlmIG5lZWRlZFxuICBsZXQgY3VzdG9tQ2hhbmdlOiBDdXN0b21DaGFuZ2VPcHRpb25zIHwgdW5kZWZpbmVkO1xuICBjb25zdCB7IGN1c3RvbUNoYW5nZVdhbGxldElkID0gdW5kZWZpbmVkIH0gPSB3YWxsZXQuY29pblNwZWNpZmljKCkgfHwge307XG4gIGlmIChjdXN0b21DaGFuZ2VXYWxsZXRJZCkge1xuICAgIC8vIGZldGNoIGtleWNoYWlucyBmcm9tIGN1c3RvbSBjaGFuZ2Ugd2FsbGV0IGZvciBkZXJpdmluZyBhZGRyZXNzZXMuXG4gICAgLy8gVGhlc2Uga2V5Y2hhaW5zIHNob3VsZCBiZSBzaWduZWQgYW5kIHRoaXMgc2hvdWxkIGJlIHZlcmlmaWVkIGluIHZlcmlmeVRyYW5zYWN0aW9uXG4gICAgY29uc3QgY3VzdG9tQ2hhbmdlS2V5U2lnbmF0dXJlcyA9IHdhbGxldC5fd2FsbGV0LmN1c3RvbUNoYW5nZUtleVNpZ25hdHVyZXM7XG4gICAgY29uc3QgY3VzdG9tQ2hhbmdlV2FsbGV0OiBXYWxsZXQgPSBhd2FpdCBjb2luLndhbGxldHMoKS5nZXQoeyBpZDogY3VzdG9tQ2hhbmdlV2FsbGV0SWQgfSk7XG4gICAgY29uc3QgY3VzdG9tQ2hhbmdlS2V5cyA9IGF3YWl0IGZldGNoS2V5Y2hhaW5zKGNvaW4sIGN1c3RvbUNoYW5nZVdhbGxldCwgcmVxSWQpO1xuXG4gICAgaWYgKCFjdXN0b21DaGFuZ2VLZXlzKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ZhaWxlZCB0byBmZXRjaCBrZXljaGFpbnMgZm9yIGN1c3RvbSBjaGFuZ2Ugd2FsbGV0Jyk7XG4gICAgfVxuXG4gICAgaWYgKGN1c3RvbUNoYW5nZUtleXMudXNlciAmJiBjdXN0b21DaGFuZ2VLZXlzLmJhY2t1cCAmJiBjdXN0b21DaGFuZ2VLZXlzLmJpdGdvICYmIGN1c3RvbUNoYW5nZVdhbGxldCkge1xuICAgICAgY29uc3QgY3VzdG9tQ2hhbmdlS2V5Y2hhaW5zOiBUcmlwbGU8VXR4b0tleWNoYWluPiA9IFtcbiAgICAgICAgY3VzdG9tQ2hhbmdlS2V5cy51c2VyLFxuICAgICAgICBjdXN0b21DaGFuZ2VLZXlzLmJhY2t1cCxcbiAgICAgICAgY3VzdG9tQ2hhbmdlS2V5cy5iaXRnbyxcbiAgICAgIF07XG5cbiAgICAgIGN1c3RvbUNoYW5nZSA9IHtcbiAgICAgICAga2V5czogY3VzdG9tQ2hhbmdlS2V5Y2hhaW5zLFxuICAgICAgICBzaWduYXR1cmVzOiBbY3VzdG9tQ2hhbmdlS2V5U2lnbmF0dXJlcy51c2VyLCBjdXN0b21DaGFuZ2VLZXlTaWduYXR1cmVzLmJhY2t1cCwgY3VzdG9tQ2hhbmdlS2V5U2lnbmF0dXJlcy5iaXRnb10sXG4gICAgICB9O1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBMb29wIHRocm91Z2ggYWxsIHRoZSBvdXRwdXRzIGFuZCBjbGFzc2lmeSBlYWNoIG9mIHRoZW0gYXMgZWl0aGVyIGludGVybmFsIHNwZW5kc1xuICAgKiBvciBleHRlcm5hbCBzcGVuZHMgYnkgc2V0dGluZyB0aGUgXCJleHRlcm5hbFwiIHByb3BlcnR5IHRvIHRydWUgb3IgZmFsc2Ugb24gdGhlIG91dHB1dCBvYmplY3QuXG4gICAqL1xuICBjb25zdCBhbGxPdXRwdXREZXRhaWxzOiBPdXRwdXRbXSA9IGF3YWl0IFByb21pc2UuYWxsKFxuICAgIGFsbE91dHB1dHMubWFwKChjdXJyZW50T3V0cHV0KSA9PiB7XG4gICAgICByZXR1cm4gcGFyc2VPdXRwdXQoe1xuICAgICAgICBjdXJyZW50T3V0cHV0LFxuICAgICAgICBjb2luLFxuICAgICAgICB0eFByZWJ1aWxkLFxuICAgICAgICB2ZXJpZmljYXRpb24sXG4gICAgICAgIGtleWNoYWluQXJyYXk6IHRvS2V5Y2hhaW5UcmlwbGUoa2V5Y2hhaW5zKSxcbiAgICAgICAgd2FsbGV0LFxuICAgICAgICB0eFBhcmFtczoge1xuICAgICAgICAgIHJlY2lwaWVudHM6IGV4cGVjdGVkT3V0cHV0cyxcbiAgICAgICAgICBjaGFuZ2VBZGRyZXNzOiB0eFBhcmFtcy5jaGFuZ2VBZGRyZXNzLFxuICAgICAgICB9LFxuICAgICAgICBjdXN0b21DaGFuZ2UsXG4gICAgICAgIHJlcUlkLFxuICAgICAgfSk7XG4gICAgfSlcbiAgKTtcblxuICBjb25zdCBuZWVkc0N1c3RvbUNoYW5nZUtleVNpZ25hdHVyZVZlcmlmaWNhdGlvbiA9IGFsbE91dHB1dERldGFpbHMuc29tZShcbiAgICAob3V0cHV0KSA9PiAob3V0cHV0IGFzIEZpeGVkU2NyaXB0V2FsbGV0T3V0cHV0KT8ubmVlZHNDdXN0b21DaGFuZ2VLZXlTaWduYXR1cmVWZXJpZmljYXRpb25cbiAgKTtcblxuICBjb25zdCBjaGFuZ2VPdXRwdXRzID0gXy5maWx0ZXIoYWxsT3V0cHV0RGV0YWlscywgeyBleHRlcm5hbDogZmFsc2UgfSk7XG5cbiAgLy8gdGhlc2UgYXJlIGFsbCB0aGUgb3V0cHV0cyB0aGF0IHdlcmUgbm90IG9yaWdpbmFsbHkgZXhwbGljaXRseSBzcGVjaWZpZWQgaW4gcmVjaXBpZW50c1xuICAvLyBpZGVhbGx5IGNoYW5nZSBvdXRwdXRzIG9yIGEgcGF5Z28gb3V0cHV0IHRoYXQgbWlnaHQgaGF2ZSBiZWVuIGFkZGVkXG4gIGNvbnN0IGltcGxpY2l0T3V0cHV0cyA9IG91dHB1dERpZmZlcmVuY2UoYWxsT3V0cHV0RGV0YWlscywgZXhwZWN0ZWRPdXRwdXRzKTtcblxuICBjb25zdCBleHBsaWNpdE91dHB1dHMgPSBvdXRwdXREaWZmZXJlbmNlKGFsbE91dHB1dERldGFpbHMsIGltcGxpY2l0T3V0cHV0cyk7XG5cbiAgLy8gdGhlc2UgYXJlIGFsbCB0aGUgbm9uLXdhbGxldCBvdXRwdXRzIHRoYXQgaGFkIGJlZW4gb3JpZ2luYWxseSBleHBsaWNpdGx5IHNwZWNpZmllZCBpbiByZWNpcGllbnRzXG4gIGNvbnN0IGV4cGxpY2l0RXh0ZXJuYWxPdXRwdXRzID0gXy5maWx0ZXIoZXhwbGljaXRPdXRwdXRzLCB7IGV4dGVybmFsOiB0cnVlIH0pO1xuXG4gIC8vIHRoaXMgaXMgdGhlIHN1bSBvZiBhbGwgdGhlIG9yaWdpbmFsbHkgZXhwbGljaXRseSBzcGVjaWZpZWQgbm9uLXdhbGxldCBvdXRwdXQgdmFsdWVzXG4gIGNvbnN0IGV4cGxpY2l0RXh0ZXJuYWxTcGVuZEFtb3VudCA9IHV0eG9saWIuYml0Z28udG9UTnVtYmVyPFROdW1iZXI+KFxuICAgIGV4cGxpY2l0RXh0ZXJuYWxPdXRwdXRzLnJlZHVjZSgoc3VtOiBiaWdpbnQsIG86IE91dHB1dCkgPT4gc3VtICsgQmlnSW50KG8uYW1vdW50KSwgQmlnSW50KDApKSBhcyBiaWdpbnQsXG4gICAgY29pbi5hbW91bnRUeXBlXG4gICk7XG5cbiAgLyoqXG4gICAqIFRoZSBjYWxjdWxhdGlvbiBvZiB0aGUgaW1wbGljaXQgZXh0ZXJuYWwgc3BlbmQgYW1vdW50IHBlcnRhaW5zIHRvIHZlcmlmeWluZyB0aGUgcGF5LWFzLXlvdS1nby1mZWUgQml0R29cbiAgICogYXV0b21hdGljYWxseSBhcHBsaWVzIHRvIHRyYW5zYWN0aW9ucyBzZW5kaW5nIG1vbmV5IG91dCBvZiB0aGUgd2FsbGV0LiBUaGUgbG9naWMgaXMgZmFpcmx5IHN0cmFpZ2h0Zm9yd2FyZFxuICAgKiBpbiB0aGF0IHdlIGNvbXBhcmUgdGhlIGV4dGVybmFsIHNwZW5kIGFtb3VudCB0aGF0IHdhcyBzcGVjaWZpZWQgZXhwbGljaXRseSBieSB0aGUgdXNlciB0byB0aGUgcG9ydGlvblxuICAgKiB0aGF0IHdhcyBzcGVjaWZpZWQgaW1wbGljaXRseS4gVG8gcHJvdGVjdCBjdXN0b21lcnMgZnJvbSBwZW9wbGUgdGFtcGVyaW5nIHdpdGggdGhlIHRyYW5zYWN0aW9uIG91dHB1dHMsIHdlXG4gICAqIGRlZmluZSBhIHRocmVzaG9sZCBmb3IgdGhlIG1heGltdW0gcGVyY2VudGFnZSBvZiB0aGUgaW1wbGljaXQgZXh0ZXJuYWwgc3BlbmQgaW4gcmVsYXRpb24gdG8gdGhlIGV4cGxpY2l0XG4gICAqIGV4dGVybmFsIHNwZW5kLlxuICAgKi9cblxuICAvLyBtYWtlIHN1cmUgdGhhdCBhbGwgdGhlIGV4dHJhIGFkZHJlc3NlcyBhcmUgY2hhbmdlIGFkZHJlc3Nlc1xuICAvLyBnZXQgYWxsIHRoZSBhZGRpdGlvbmFsIGV4dGVybmFsIG91dHB1dHMgdGhlIHNlcnZlciBhZGRlZCBhbmQgY2FsY3VsYXRlIHRoZWlyIHZhbHVlc1xuICBjb25zdCBpbXBsaWNpdEV4dGVybmFsT3V0cHV0cyA9IF8uZmlsdGVyKGltcGxpY2l0T3V0cHV0cywgeyBleHRlcm5hbDogdHJ1ZSB9KTtcbiAgY29uc3QgaW1wbGljaXRFeHRlcm5hbFNwZW5kQW1vdW50ID0gdXR4b2xpYi5iaXRnby50b1ROdW1iZXI8VE51bWJlcj4oXG4gICAgaW1wbGljaXRFeHRlcm5hbE91dHB1dHMucmVkdWNlKChzdW06IGJpZ2ludCwgbzogT3V0cHV0KSA9PiBzdW0gKyBCaWdJbnQoby5hbW91bnQpLCBCaWdJbnQoMCkpIGFzIGJpZ2ludCxcbiAgICBjb2luLmFtb3VudFR5cGVcbiAgKTtcblxuICByZXR1cm4ge1xuICAgIGtleWNoYWlucyxcbiAgICBrZXlTaWduYXR1cmVzOiBnZXRLZXlTaWduYXR1cmVzKHdhbGxldCkgPz8ge30sXG4gICAgb3V0cHV0czogYWxsT3V0cHV0RGV0YWlscyxcbiAgICBtaXNzaW5nT3V0cHV0cyxcbiAgICBleHBsaWNpdEV4dGVybmFsT3V0cHV0cyxcbiAgICBpbXBsaWNpdEV4dGVybmFsT3V0cHV0cyxcbiAgICBjaGFuZ2VPdXRwdXRzLFxuICAgIGV4cGxpY2l0RXh0ZXJuYWxTcGVuZEFtb3VudCxcbiAgICBpbXBsaWNpdEV4dGVybmFsU3BlbmRBbW91bnQsXG4gICAgbmVlZHNDdXN0b21DaGFuZ2VLZXlTaWduYXR1cmVWZXJpZmljYXRpb24sXG4gICAgY3VzdG9tQ2hhbmdlLFxuICB9O1xufVxuIl19
203
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGFyc2VUcmFuc2FjdGlvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy90cmFuc2FjdGlvbi9maXhlZFNjcmlwdC9wYXJzZVRyYW5zYWN0aW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBd0JBLDRDQTJNQztBQW5PRCxvREFBNEI7QUFFNUIsb0RBQXVCO0FBRXZCLHlEQUEyQztBQVUzQywrQ0FBdUg7QUFDdkgsMERBQXlFO0FBQ3pFLDRDQUEwRjtBQUUxRiwrQ0FBaUU7QUFNMUQsS0FBSyxVQUFVLGdCQUFnQixDQUNwQyxJQUFzQixFQUN0QixNQUF3QztJQUV4QyxNQUFNLEVBQUUsUUFBUSxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUUsWUFBWSxHQUFHLEVBQUUsRUFBRSxLQUFLLEVBQUUsR0FBRyxNQUFNLENBQUM7SUFFMUUsSUFBSSxDQUFDLGdCQUFDLENBQUMsV0FBVyxDQUFDLFlBQVksQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsZ0JBQUMsQ0FBQyxTQUFTLENBQUMsWUFBWSxDQUFDLGlCQUFpQixDQUFDLEVBQUUsQ0FBQztRQUNuRyxNQUFNLElBQUksS0FBSyxDQUFDLGtEQUFrRCxDQUFDLENBQUM7SUFDdEUsQ0FBQztJQUNELE1BQU0saUJBQWlCLEdBQUcsWUFBWSxDQUFDLGlCQUFpQixDQUFDO0lBRXpELDBDQUEwQztJQUMxQyxJQUFJLFNBQVMsR0FBc0UsWUFBWSxDQUFDLFNBQVMsQ0FBQztJQUMxRyxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7UUFDZixJQUFJLGlCQUFpQixFQUFFLENBQUM7WUFDdEIsTUFBTSxJQUFJLEtBQUssQ0FBQywyQ0FBMkMsQ0FBQyxDQUFDO1FBQy9ELENBQUM7UUFDRCxTQUFTLEdBQUcsTUFBTSxJQUFBLDBCQUFjLEVBQUMsSUFBSSxFQUFFLE1BQU0sRUFBRSxLQUFLLENBQUMsQ0FBQztJQUN4RCxD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QUssQ0FBQyxTQUFTLENBQ3pELHVCQUF1QixDQUFDLE1BQU0sQ0FBQyxDQUFDLEdBQVcsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLEdBQUcsR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBVyxFQUM5RixJQUFJLENBQUMsVUFBVSxDQUNoQixDQUFDO0lBRUYsU0FBUyxTQUFTLENBQUMsT0FBdUQ7UUFDeEUsT0FBTyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQyxDQUFDO1lBQzlCLE9BQU8sRUFBRSxJQUFBLG1DQUF1QixFQUFDLE1BQU0sQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQztZQUM3RCxNQUFNLEVBQUUsTUFBTSxDQUFDLEtBQUssQ0FBQyxRQUFRLEVBQUU7WUFDL0IsUUFBUSxFQUFFLE1BQU0sQ0FBQyxRQUFRO1NBQzFCLENBQUMsQ0FBQyxDQUFDO0lBQ04sQ0FBQztJQUVELE9BQU87UUFDTCxTQUFTO1FBQ1QsYUFBYSxFQUFFLElBQUEsNEJBQWdCLEVBQUMsTUFBTSxDQUFDLElBQUksRUFBRTtRQUM3QyxPQUFPLEVBQUUsZ0JBQWdCO1FBQ3pCLGNBQWMsRUFBRSxTQUFTLENBQUMsY0FBYyxDQUFDO1FBQ3pDLHVCQUF1QixFQUFFLFNBQVMsQ0FBQyx1QkFBdUIsQ0FBQztRQUMzRCx1QkFBdUIsRUFBRSxTQUFTLENBQUMsdUJBQXVCLENBQUM7UUFDM0QsYUFBYTtRQUNiLDJCQUEyQjtRQUMzQiwyQkFBMkI7UUFDM0IseUNBQXlDO1FBQ3pDLFlBQVk7S0FDYixDQUFDO0FBQ0osQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBhc3NlcnQgZnJvbSAnYXNzZXJ0JztcblxuaW1wb3J0IF8gZnJvbSAnbG9kYXNoJztcbmltcG9ydCB7IFRyaXBsZSwgVmVyaWZpY2F0aW9uT3B0aW9ucywgV2FsbGV0IH0gZnJvbSAnQGJpdGdvL3Nkay1jb3JlJztcbmltcG9ydCAqIGFzIHV0eG9saWIgZnJvbSAnQGJpdGdvL3V0eG8tbGliJztcblxuaW1wb3J0IHtcbiAgQWJzdHJhY3RVdHhvQ29pbixcbiAgRml4ZWRTY3JpcHRXYWxsZXRPdXRwdXQsXG4gIE91dHB1dCxcbiAgVHJhbnNhY3Rpb25FeHBsYW5hdGlvbixcbiAgUGFyc2VkVHJhbnNhY3Rpb24sXG4gIFBhcnNlVHJhbnNhY3Rpb25PcHRpb25zLFxufSBmcm9tICcuLi8uLi9hYnN0cmFjdFV0eG9Db2luJztcbmltcG9ydCB7IGZldGNoS2V5Y2hhaW5zLCBnZXRLZXlTaWduYXR1cmVzLCB0b0tleWNoYWluVHJpcGxlLCBVdHhvS2V5Y2hhaW4sIFV0eG9OYW1lZEtleWNoYWlucyB9IGZyb20gJy4uLy4uL2tleWNoYWlucyc7XG5pbXBvcnQgeyBDb21wYXJhYmxlT3V0cHV0LCBvdXRwdXREaWZmZXJlbmNlIH0gZnJvbSAnLi4vb3V0cHV0RGlmZmVyZW5jZSc7XG5pbXBvcnQgeyBmcm9tRXh0ZW5kZWRBZGRyZXNzRm9ybWF0VG9TY3JpcHQsIHRvRXh0ZW5kZWRBZGRyZXNzRm9ybWF0IH0gZnJvbSAnLi4vcmVjaXBpZW50JztcblxuaW1wb3J0IHsgQ3VzdG9tQ2hhbmdlT3B0aW9ucywgcGFyc2VPdXRwdXQgfSBmcm9tICcuL3BhcnNlT3V0cHV0JztcblxuZXhwb3J0IHR5cGUgQ29tcGFyYWJsZU91dHB1dFdpdGhFeHRlcm5hbDxUVmFsdWU+ID0gQ29tcGFyYWJsZU91dHB1dDxUVmFsdWU+ICYge1xuICBleHRlcm5hbDogYm9vbGVhbiB8IHVuZGVmaW5lZDtcbn07XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBwYXJzZVRyYW5zYWN0aW9uPFROdW1iZXIgZXh0ZW5kcyBiaWdpbnQgfCBudW1iZXI+KFxuICBjb2luOiBBYnN0cmFjdFV0eG9Db2luLFxuICBwYXJhbXM6IFBhcnNlVHJhbnNhY3Rpb25PcHRpb25zPFROdW1iZXI+XG4pOiBQcm9taXNlPFBhcnNlZFRyYW5zYWN0aW9uPFROdW1iZXI+PiB7XG4gIGNvbnN0IHsgdHhQYXJhbXMsIHR4UHJlYnVpbGQsIHdhbGxldCwgdmVyaWZpY2F0aW9uID0ge30sIHJlcUlkIH0gPSBwYXJhbXM7XG5cbiAgaWYgKCFfLmlzVW5kZWZpbmVkKHZlcmlmaWNhdGlvbi5kaXNhYmxlTmV0d29ya2luZykgJiYgIV8uaXNCb29sZWFuKHZlcmlmaWNhdGlvbi5kaXNhYmxlTmV0d29ya2luZykpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ3ZlcmlmaWNhdGlvbi5kaXNhYmxlTmV0d29ya2luZyBtdXN0IGJlIGEgYm9vbGVhbicpO1xuICB9XG4gIGNvbnN0IGRpc2FibGVOZXR3b3JraW5nID0gdmVyaWZpY2F0aW9uLmRpc2FibGVOZXR3b3JraW5nO1xuXG4gIC8vIG9idGFpbiB0aGUga2V5Y2hhaW5zIGFuZCBrZXkgc2lnbmF0dXJlc1xuICBsZXQga2V5Y2hhaW5zOiBVdHhvTmFtZWRLZXljaGFpbnMgfCBWZXJpZmljYXRpb25PcHRpb25zWydrZXljaGFpbnMnXSB8IHVuZGVmaW5lZCA9IHZlcmlmaWNhdGlvbi5rZXljaGFpbnM7XG4gIGlmICgha2V5Y2hhaW5zKSB7XG4gICAgaWYgKGRpc2FibGVOZXR3b3JraW5nKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2Nhbm5vdCBmZXRjaCBrZXljaGFpbnMgd2l0aG91dCBuZXR3b3JraW5nJyk7XG4gICAgfVxuICAgIGtleWNoYWlucyA9IGF3YWl0IGZldGNoS2V5Y2hhaW5zKGNvaW4sIHdhbGxldCwgcmVxSWQpO1xuICB9XG5cbiAgaWYgKCFVdHhvTmFtZWRLZXljaGFpbnMuaXMoa2V5Y2hhaW5zKSkge1xuICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBrZXljaGFpbnMnKTtcbiAgfVxuXG4gIGNvbnN0IGtleWNoYWluQXJyYXk6IFRyaXBsZTxVdHhvS2V5Y2hhaW4+ID0gdG9LZXljaGFpblRyaXBsZShrZXljaGFpbnMpO1xuXG4gIGlmIChfLmlzVW5kZWZpbmVkKHR4UHJlYnVpbGQudHhIZXgpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdtaXNzaW5nIHJlcXVpcmVkIHR4UHJlYnVpbGQgcHJvcGVydHkgdHhIZXgnKTtcbiAgfVxuXG4gIC8vIG9idGFpbiBhbGwgb3V0cHV0c1xuICBjb25zdCBleHBsYW5hdGlvbjogVHJhbnNhY3Rpb25FeHBsYW5hdGlvbiA9IGF3YWl0IGNvaW4uZXhwbGFpblRyYW5zYWN0aW9uPFROdW1iZXI+KHtcbiAgICB0eEhleDogdHhQcmVidWlsZC50eEhleCxcbiAgICB0eEluZm86IHR4UHJlYnVpbGQudHhJbmZvLFxuICAgIHB1YnM6IGtleWNoYWluQXJyYXkubWFwKChrKSA9PiBrLnB1YikgYXMgVHJpcGxlPHN0cmluZz4sXG4gIH0pO1xuXG4gIGNvbnN0IGFsbE91dHB1dHMgPSBbLi4uZXhwbGFuYXRpb24ub3V0cHV0cywgLi4uZXhwbGFuYXRpb24uY2hhbmdlT3V0cHV0c107XG5cbiAgbGV0IGV4cGVjdGVkT3V0cHV0cztcbiAgaWYgKHR4UGFyYW1zLnJiZlR4SWRzKSB7XG4gICAgYXNzZXJ0KHR4UGFyYW1zLnJiZlR4SWRzLmxlbmd0aCA9PT0gMSk7XG5cbiAgICBjb25zdCB0eFRvQmVSZXBsYWNlZCA9IGF3YWl0IHdhbGxldC5nZXRUcmFuc2FjdGlvbih7IHR4SGFzaDogdHhQYXJhbXMucmJmVHhJZHNbMF0sIGluY2x1ZGVSYmY6IHRydWUgfSk7XG4gICAgZXhwZWN0ZWRPdXRwdXRzID0gdHhUb0JlUmVwbGFjZWQub3V0cHV0cy5mbGF0TWFwKFxuICAgICAgKG91dHB1dDogeyB2YWx1ZVN0cmluZzogc3RyaW5nOyBhZGRyZXNzPzogc3RyaW5nOyB3YWxsZXQ/OiBzdHJpbmcgfSkgPT4ge1xuICAgICAgICAvLyBGb3Igc2VsZi1zZW5kcywgdGhlIHdhbGxldElkIHdpbGwgYmUgdGhlIHNhbWUgYXMgdGhlIHdhbGxldCdzIGlkXG4gICAgICAgIGlmIChvdXRwdXQud2FsbGV0ID09PSB3YWxsZXQuaWQoKSkge1xuICAgICAgICAgIHJldHVybiBbXTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gW2NvaW4udG9DYW5vbmljYWxUcmFuc2FjdGlvblJlY2lwaWVudChvdXRwdXQpXTtcbiAgICAgIH1cbiAgICApO1xuICB9IGVsc2Uge1xuICAgIC8vIHZlcmlmeSB0aGF0IGVhY2ggcmVjaXBpZW50IGZyb20gdHhQYXJhbXMgaGFzIHRoZWlyIG93biBvdXRwdXRcbiAgICBleHBlY3RlZE91dHB1dHMgPSAodHhQYXJhbXMucmVjaXBpZW50cyA/PyBbXSkuZmxhdE1hcCgob3V0cHV0KSA9PiB7XG4gICAgICBpZiAob3V0cHV0LmFkZHJlc3MgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICBpZiAob3V0cHV0LmFtb3VudC50b1N0cmluZygpICE9PSAnMCcpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYE9ubHkgemVybyBhbW91bnRzIGFsbG93ZWQgZm9yIG5vbi1lbmNvZGVhYmxlIHNjcmlwdFB1YmtleXM6ICR7b3V0cHV0fWApO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBbb3V0cHV0XTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBbeyAuLi5vdXRwdXQsIGFkZHJlc3M6IGNvaW4uY2Fub25pY2FsQWRkcmVzcyhvdXRwdXQuYWRkcmVzcykgfV07XG4gICAgfSk7XG4gICAgaWYgKHR4UGFyYW1zLmFsbG93RXh0ZXJuYWxDaGFuZ2VBZGRyZXNzICYmIHR4UGFyYW1zLmNoYW5nZUFkZHJlc3MpIHtcbiAgICAgIC8vIHdoZW4gYW4gZXh0ZXJuYWwgY2hhbmdlIGFkZHJlc3MgaXMgZXhwbGljaXRseSBzcGVjaWZpZWQsIGNvdW50IGFsbCBvdXRwdXRzIGdvaW5nIHRvd2FyZHMgdGhhdFxuICAgICAgLy8gYWRkcmVzcyBpbiB0aGUgZXhwZWN0ZWQgb3V0cHV0cyAocmVnYXJkbGVzcyBvZiB0aGUgb3V0cHV0IGFtb3VudClcbiAgICAgIGV4cGVjdGVkT3V0cHV0cy5wdXNoKFxuICAgICAgICAuLi5hbGxPdXRwdXRzLmZsYXRNYXAoKG91dHB1dCkgPT4ge1xuICAgICAgICAgIGlmIChcbiAgICAgICAgICAgIG91dHB1dC5hZGRyZXNzID09PSB1bmRlZmluZWQgfHxcbiAgICAgICAgICAgIG91dHB1dC5hZGRyZXNzICE9PSBjb2luLmNhbm9uaWNhbEFkZHJlc3ModHhQYXJhbXMuY2hhbmdlQWRkcmVzcyBhcyBzdHJpbmcpXG4gICAgICAgICAgKSB7XG4gICAgICAgICAgICByZXR1cm4gW107XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBbeyAuLi5vdXRwdXQsIGFkZHJlc3M6IGNvaW4uY2Fub25pY2FsQWRkcmVzcyhvdXRwdXQuYWRkcmVzcykgfV07XG4gICAgICAgIH0pXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIC8vIGdldCB0aGUga2V5Y2hhaW5zIGZyb20gdGhlIGN1c3RvbSBjaGFuZ2Ugd2FsbGV0IGlmIG5lZWRlZFxuICBsZXQgY3VzdG9tQ2hhbmdlOiBDdXN0b21DaGFuZ2VPcHRpb25zIHwgdW5kZWZpbmVkO1xuICBjb25zdCB7IGN1c3RvbUNoYW5nZVdhbGxldElkID0gdW5kZWZpbmVkIH0gPSB3YWxsZXQuY29pblNwZWNpZmljKCkgfHwge307XG4gIGlmIChjdXN0b21DaGFuZ2VXYWxsZXRJZCkge1xuICAgIC8vIGZldGNoIGtleWNoYWlucyBmcm9tIGN1c3RvbSBjaGFuZ2Ugd2FsbGV0IGZvciBkZXJpdmluZyBhZGRyZXNzZXMuXG4gICAgLy8gVGhlc2Uga2V5Y2hhaW5zIHNob3VsZCBiZSBzaWduZWQgYW5kIHRoaXMgc2hvdWxkIGJlIHZlcmlmaWVkIGluIHZlcmlmeVRyYW5zYWN0aW9uXG4gICAgY29uc3QgY3VzdG9tQ2hhbmdlS2V5U2lnbmF0dXJlcyA9IHdhbGxldC5fd2FsbGV0LmN1c3RvbUNoYW5nZUtleVNpZ25hdHVyZXM7XG4gICAgY29uc3QgY3VzdG9tQ2hhbmdlV2FsbGV0OiBXYWxsZXQgPSBhd2FpdCBjb2luLndhbGxldHMoKS5nZXQoeyBpZDogY3VzdG9tQ2hhbmdlV2FsbGV0SWQgfSk7XG4gICAgY29uc3QgY3VzdG9tQ2hhbmdlS2V5cyA9IGF3YWl0IGZldGNoS2V5Y2hhaW5zKGNvaW4sIGN1c3RvbUNoYW5nZVdhbGxldCwgcmVxSWQpO1xuXG4gICAgaWYgKCFjdXN0b21DaGFuZ2VLZXlzKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ZhaWxlZCB0byBmZXRjaCBrZXljaGFpbnMgZm9yIGN1c3RvbSBjaGFuZ2Ugd2FsbGV0Jyk7XG4gICAgfVxuXG4gICAgaWYgKGN1c3RvbUNoYW5nZUtleXMudXNlciAmJiBjdXN0b21DaGFuZ2VLZXlzLmJhY2t1cCAmJiBjdXN0b21DaGFuZ2VLZXlzLmJpdGdvICYmIGN1c3RvbUNoYW5nZVdhbGxldCkge1xuICAgICAgY29uc3QgY3VzdG9tQ2hhbmdlS2V5Y2hhaW5zOiBUcmlwbGU8VXR4b0tleWNoYWluPiA9IFtcbiAgICAgICAgY3VzdG9tQ2hhbmdlS2V5cy51c2VyLFxuICAgICAgICBjdXN0b21DaGFuZ2VLZXlzLmJhY2t1cCxcbiAgICAgICAgY3VzdG9tQ2hhbmdlS2V5cy5iaXRnbyxcbiAgICAgIF07XG5cbiAgICAgIGN1c3RvbUNoYW5nZSA9IHtcbiAgICAgICAga2V5czogY3VzdG9tQ2hhbmdlS2V5Y2hhaW5zLFxuICAgICAgICBzaWduYXR1cmVzOiBbY3VzdG9tQ2hhbmdlS2V5U2lnbmF0dXJlcy51c2VyLCBjdXN0b21DaGFuZ2VLZXlTaWduYXR1cmVzLmJhY2t1cCwgY3VzdG9tQ2hhbmdlS2V5U2lnbmF0dXJlcy5iaXRnb10sXG4gICAgICB9O1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBMb29wIHRocm91Z2ggYWxsIHRoZSBvdXRwdXRzIGFuZCBjbGFzc2lmeSBlYWNoIG9mIHRoZW0gYXMgZWl0aGVyIGludGVybmFsIHNwZW5kc1xuICAgKiBvciBleHRlcm5hbCBzcGVuZHMgYnkgc2V0dGluZyB0aGUgXCJleHRlcm5hbFwiIHByb3BlcnR5IHRvIHRydWUgb3IgZmFsc2Ugb24gdGhlIG91dHB1dCBvYmplY3QuXG4gICAqL1xuICBjb25zdCBhbGxPdXRwdXREZXRhaWxzOiBPdXRwdXRbXSA9IGF3YWl0IFByb21pc2UuYWxsKFxuICAgIGFsbE91dHB1dHMubWFwKChjdXJyZW50T3V0cHV0KSA9PiB7XG4gICAgICByZXR1cm4gcGFyc2VPdXRwdXQoe1xuICAgICAgICBjdXJyZW50T3V0cHV0LFxuICAgICAgICBjb2luLFxuICAgICAgICB0eFByZWJ1aWxkLFxuICAgICAgICB2ZXJpZmljYXRpb24sXG4gICAgICAgIGtleWNoYWluQXJyYXk6IHRvS2V5Y2hhaW5UcmlwbGUoa2V5Y2hhaW5zKSxcbiAgICAgICAgd2FsbGV0LFxuICAgICAgICB0eFBhcmFtczoge1xuICAgICAgICAgIHJlY2lwaWVudHM6IGV4cGVjdGVkT3V0cHV0cyxcbiAgICAgICAgICBjaGFuZ2VBZGRyZXNzOiB0eFBhcmFtcy5jaGFuZ2VBZGRyZXNzLFxuICAgICAgICB9LFxuICAgICAgICBjdXN0b21DaGFuZ2UsXG4gICAgICAgIHJlcUlkLFxuICAgICAgfSk7XG4gICAgfSlcbiAgKTtcblxuICBjb25zdCBuZWVkc0N1c3RvbUNoYW5nZUtleVNpZ25hdHVyZVZlcmlmaWNhdGlvbiA9IGFsbE91dHB1dERldGFpbHMuc29tZShcbiAgICAob3V0cHV0KSA9PiAob3V0cHV0IGFzIEZpeGVkU2NyaXB0V2FsbGV0T3V0cHV0KT8ubmVlZHNDdXN0b21DaGFuZ2VLZXlTaWduYXR1cmVWZXJpZmljYXRpb25cbiAgKTtcblxuICBjb25zdCBjaGFuZ2VPdXRwdXRzID0gXy5maWx0ZXIoYWxsT3V0cHV0RGV0YWlscywgeyBleHRlcm5hbDogZmFsc2UgfSk7XG5cbiAgZnVuY3Rpb24gdG9Db21wYXJhYmxlT3V0cHV0c1dpdGhFeHRlcm5hbChvdXRwdXRzOiBPdXRwdXRbXSk6IENvbXBhcmFibGVPdXRwdXRXaXRoRXh0ZXJuYWw8YmlnaW50IHwgJ21heCc+W10ge1xuICAgIHJldHVybiBvdXRwdXRzLm1hcCgob3V0cHV0KSA9PiAoe1xuICAgICAgc2NyaXB0OiBmcm9tRXh0ZW5kZWRBZGRyZXNzRm9ybWF0VG9TY3JpcHQob3V0cHV0LmFkZHJlc3MsIGNvaW4ubmV0d29yayksXG4gICAgICB2YWx1ZTogb3V0cHV0LmFtb3VudCA9PT0gJ21heCcgPyAnbWF4JyA6IChCaWdJbnQob3V0cHV0LmFtb3VudCkgYXMgYmlnaW50IHwgJ21heCcpLFxuICAgICAgZXh0ZXJuYWw6IG91dHB1dC5leHRlcm5hbCxcbiAgICB9KSk7XG4gIH1cblxuICBjb25zdCBtaXNzaW5nT3V0cHV0cyA9IG91dHB1dERpZmZlcmVuY2UoXG4gICAgdG9Db21wYXJhYmxlT3V0cHV0c1dpdGhFeHRlcm5hbChleHBlY3RlZE91dHB1dHMpLFxuICAgIHRvQ29tcGFyYWJsZU91dHB1dHNXaXRoRXh0ZXJuYWwoYWxsT3V0cHV0cylcbiAgKTtcblxuICBjb25zdCBpbXBsaWNpdE91dHB1dHMgPSBvdXRwdXREaWZmZXJlbmNlKFxuICAgIHRvQ29tcGFyYWJsZU91dHB1dHNXaXRoRXh0ZXJuYWwoYWxsT3V0cHV0RGV0YWlscyksXG4gICAgdG9Db21wYXJhYmxlT3V0cHV0c1dpdGhFeHRlcm5hbChleHBlY3RlZE91dHB1dHMpXG4gICk7XG4gIGNvbnN0IGV4cGxpY2l0T3V0cHV0cyA9IG91dHB1dERpZmZlcmVuY2UodG9Db21wYXJhYmxlT3V0cHV0c1dpdGhFeHRlcm5hbChhbGxPdXRwdXREZXRhaWxzKSwgaW1wbGljaXRPdXRwdXRzKTtcblxuICAvLyB0aGVzZSBhcmUgYWxsIHRoZSBub24td2FsbGV0IG91dHB1dHMgdGhhdCBoYWQgYmVlbiBvcmlnaW5hbGx5IGV4cGxpY2l0bHkgc3BlY2lmaWVkIGluIHJlY2lwaWVudHNcbiAgY29uc3QgZXhwbGljaXRFeHRlcm5hbE91dHB1dHMgPSBleHBsaWNpdE91dHB1dHMuZmlsdGVyKChvdXRwdXQpID0+IG91dHB1dC5leHRlcm5hbCk7XG4gIC8vIHRoaXMgaXMgdGhlIHN1bSBvZiBhbGwgdGhlIG9yaWdpbmFsbHkgZXhwbGljaXRseSBzcGVjaWZpZWQgbm9uLXdhbGxldCBvdXRwdXQgdmFsdWVzXG4gIGNvbnN0IGV4cGxpY2l0RXh0ZXJuYWxTcGVuZEFtb3VudCA9IHV0eG9saWIuYml0Z28udG9UTnVtYmVyPFROdW1iZXI+KFxuICAgIGV4cGxpY2l0RXh0ZXJuYWxPdXRwdXRzLnJlZHVjZSgoc3VtOiBiaWdpbnQsIG8pID0+IHN1bSArIEJpZ0ludChvLnZhbHVlKSwgQmlnSW50KDApKSBhcyBiaWdpbnQsXG4gICAgY29pbi5hbW91bnRUeXBlXG4gICk7XG5cbiAgLyoqXG4gICAqIFRoZSBjYWxjdWxhdGlvbiBvZiB0aGUgaW1wbGljaXQgZXh0ZXJuYWwgc3BlbmQgYW1vdW50IHBlcnRhaW5zIHRvIHZlcmlmeWluZyB0aGUgcGF5LWFzLXlvdS1nby1mZWUgQml0R29cbiAgICogYXV0b21hdGljYWxseSBhcHBsaWVzIHRvIHRyYW5zYWN0aW9ucyBzZW5kaW5nIG1vbmV5IG91dCBvZiB0aGUgd2FsbGV0LiBUaGUgbG9naWMgaXMgZmFpcmx5IHN0cmFpZ2h0Zm9yd2FyZFxuICAgKiBpbiB0aGF0IHdlIGNvbXBhcmUgdGhlIGV4dGVybmFsIHNwZW5kIGFtb3VudCB0aGF0IHdhcyBzcGVjaWZpZWQgZXhwbGljaXRseSBieSB0aGUgdXNlciB0byB0aGUgcG9ydGlvblxuICAgKiB0aGF0IHdhcyBzcGVjaWZpZWQgaW1wbGljaXRseS4gVG8gcHJvdGVjdCBjdXN0b21lcnMgZnJvbSBwZW9wbGUgdGFtcGVyaW5nIHdpdGggdGhlIHRyYW5zYWN0aW9uIG91dHB1dHMsIHdlXG4gICAqIGRlZmluZSBhIHRocmVzaG9sZCBmb3IgdGhlIG1heGltdW0gcGVyY2VudGFnZSBvZiB0aGUgaW1wbGljaXQgZXh0ZXJuYWwgc3BlbmQgaW4gcmVsYXRpb24gdG8gdGhlIGV4cGxpY2l0XG4gICAqIGV4dGVybmFsIHNwZW5kLlxuICAgKi9cblxuICAvLyBtYWtlIHN1cmUgdGhhdCBhbGwgdGhlIGV4dHJhIGFkZHJlc3NlcyBhcmUgY2hhbmdlIGFkZHJlc3Nlc1xuICAvLyBnZXQgYWxsIHRoZSBhZGRpdGlvbmFsIGV4dGVybmFsIG91dHB1dHMgdGhlIHNlcnZlciBhZGRlZCBhbmQgY2FsY3VsYXRlIHRoZWlyIHZhbHVlc1xuICBjb25zdCBpbXBsaWNpdEV4dGVybmFsT3V0cHV0cyA9IGltcGxpY2l0T3V0cHV0cy5maWx0ZXIoKG91dHB1dCkgPT4gb3V0cHV0LmV4dGVybmFsKTtcbiAgY29uc3QgaW1wbGljaXRFeHRlcm5hbFNwZW5kQW1vdW50ID0gdXR4b2xpYi5iaXRnby50b1ROdW1iZXI8VE51bWJlcj4oXG4gICAgaW1wbGljaXRFeHRlcm5hbE91dHB1dHMucmVkdWNlKChzdW06IGJpZ2ludCwgbykgPT4gc3VtICsgQmlnSW50KG8udmFsdWUpLCBCaWdJbnQoMCkpIGFzIGJpZ2ludCxcbiAgICBjb2luLmFtb3VudFR5cGVcbiAgKTtcblxuICBmdW5jdGlvbiB0b091dHB1dHMob3V0cHV0czogQ29tcGFyYWJsZU91dHB1dFdpdGhFeHRlcm5hbDxiaWdpbnQgfCAnbWF4Jz5bXSk6IE91dHB1dFtdIHtcbiAgICByZXR1cm4gb3V0cHV0cy5tYXAoKG91dHB1dCkgPT4gKHtcbiAgICAgIGFkZHJlc3M6IHRvRXh0ZW5kZWRBZGRyZXNzRm9ybWF0KG91dHB1dC5zY3JpcHQsIGNvaW4ubmV0d29yayksXG4gICAgICBhbW91bnQ6IG91dHB1dC52YWx1ZS50b1N0cmluZygpLFxuICAgICAgZXh0ZXJuYWw6IG91dHB1dC5leHRlcm5hbCxcbiAgICB9KSk7XG4gIH1cblxuICByZXR1cm4ge1xuICAgIGtleWNoYWlucyxcbiAgICBrZXlTaWduYXR1cmVzOiBnZXRLZXlTaWduYXR1cmVzKHdhbGxldCkgPz8ge30sXG4gICAgb3V0cHV0czogYWxsT3V0cHV0RGV0YWlscyxcbiAgICBtaXNzaW5nT3V0cHV0czogdG9PdXRwdXRzKG1pc3NpbmdPdXRwdXRzKSxcbiAgICBleHBsaWNpdEV4dGVybmFsT3V0cHV0czogdG9PdXRwdXRzKGV4cGxpY2l0RXh0ZXJuYWxPdXRwdXRzKSxcbiAgICBpbXBsaWNpdEV4dGVybmFsT3V0cHV0czogdG9PdXRwdXRzKGltcGxpY2l0RXh0ZXJuYWxPdXRwdXRzKSxcbiAgICBjaGFuZ2VPdXRwdXRzLFxuICAgIGV4cGxpY2l0RXh0ZXJuYWxTcGVuZEFtb3VudCxcbiAgICBpbXBsaWNpdEV4dGVybmFsU3BlbmRBbW91bnQsXG4gICAgbmVlZHNDdXN0b21DaGFuZ2VLZXlTaWduYXR1cmVWZXJpZmljYXRpb24sXG4gICAgY3VzdG9tQ2hhbmdlLFxuICB9O1xufVxuIl19
@@ -0,0 +1,40 @@
1
+ export type ComparableOutput<TValue> = {
2
+ script: Buffer;
3
+ value: TValue;
4
+ };
5
+ /** Actual outputs have fixed values. */
6
+ export type ActualOutput = ComparableOutput<bigint>;
7
+ /** Expected outputs can have a fixed value or 'max'. */
8
+ export type ExpectedOutput = ComparableOutput<bigint | 'max'>;
9
+ /**
10
+ * @param a
11
+ * @param b
12
+ * @returns whether the two outputs are equal. Outputs with value `max` are considered equal to any other output with the same script.
13
+ */
14
+ export declare function matchingOutput<TValue>(a: ComparableOutput<TValue>, b: ComparableOutput<TValue>): boolean;
15
+ /**
16
+ * @returns all outputs in the first array that are not in the second array.
17
+ * Outputs can occur more than once in each array.
18
+ * An output with value `max` is considered equal to any other output with the same script.
19
+ */
20
+ export declare function outputDifference<A extends ActualOutput | ExpectedOutput, B extends ActualOutput | ExpectedOutput>(first: A[], second: B[]): A[];
21
+ export type OutputDifferenceWithExpected<TActual extends ActualOutput, TExpected extends ExpectedOutput> = {
22
+ /** These are the external outputs that were expected and found in the transaction. */
23
+ explicitExternalOutputs: TActual[];
24
+ /**
25
+ * These are the surprise external outputs that were not explicitly specified in the transaction.
26
+ * They can be PayGo fees.
27
+ */
28
+ implicitExternalOutputs: TActual[];
29
+ /**
30
+ * These are the outputs that were expected to be in the transaction but were not found.
31
+ */
32
+ missingOutputs: TExpected[];
33
+ };
34
+ /**
35
+ * @param actualExternalOutputs - external outputs in the transaction
36
+ * @param expectedExternalOutputs - external outputs that were expected to be in the transaction
37
+ * @returns the difference between the actual and expected external outputs
38
+ */
39
+ export declare function outputDifferencesWithExpected<TActual extends ActualOutput, TExpected extends ExpectedOutput>(actualExternalOutputs: TActual[], expectedExternalOutputs: TExpected[]): OutputDifferenceWithExpected<TActual, TExpected>;
40
+ //# sourceMappingURL=outputDifference.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"outputDifference.d.ts","sourceRoot":"","sources":["../../../src/transaction/outputDifference.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,gBAAgB,CAAC,MAAM,IAAI;IACrC,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;CACf,CAAC;AAEF,wCAAwC;AACxC,MAAM,MAAM,YAAY,GAAG,gBAAgB,CAAC,MAAM,CAAC,CAAC;AAEpD,wDAAwD;AACxD,MAAM,MAAM,cAAc,GAAG,gBAAgB,CAAC,MAAM,GAAG,KAAK,CAAC,CAAC;AAE9D;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,MAAM,EAAE,CAAC,EAAE,gBAAgB,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,gBAAgB,CAAC,MAAM,CAAC,GAAG,OAAO,CAKxG;AAED;;;;GAIG;AACH,wBAAgB,gBAAgB,CAAC,CAAC,SAAS,YAAY,GAAG,cAAc,EAAE,CAAC,SAAS,YAAY,GAAG,cAAc,EAC/G,KAAK,EAAE,CAAC,EAAE,EACV,MAAM,EAAE,CAAC,EAAE,GACV,CAAC,EAAE,CASL;AAED,MAAM,MAAM,4BAA4B,CAAC,OAAO,SAAS,YAAY,EAAE,SAAS,SAAS,cAAc,IAAI;IACzG,sFAAsF;IACtF,uBAAuB,EAAE,OAAO,EAAE,CAAC;IACnC;;;OAGG;IACH,uBAAuB,EAAE,OAAO,EAAE,CAAC;IACnC;;OAEG;IACH,cAAc,EAAE,SAAS,EAAE,CAAC;CAC7B,CAAC;AAEF;;;;GAIG;AACH,wBAAgB,6BAA6B,CAAC,OAAO,SAAS,YAAY,EAAE,SAAS,SAAS,cAAc,EAC1G,qBAAqB,EAAE,OAAO,EAAE,EAChC,uBAAuB,EAAE,SAAS,EAAE,GACnC,4BAA4B,CAAC,OAAO,EAAE,SAAS,CAAC,CASlD"}
@@ -0,0 +1,47 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.matchingOutput = matchingOutput;
4
+ exports.outputDifference = outputDifference;
5
+ exports.outputDifferencesWithExpected = outputDifferencesWithExpected;
6
+ /**
7
+ * @param a
8
+ * @param b
9
+ * @returns whether the two outputs are equal. Outputs with value `max` are considered equal to any other output with the same script.
10
+ */
11
+ function matchingOutput(a, b) {
12
+ if (a.value === 'max' || b.value === 'max') {
13
+ return a.script.equals(b.script);
14
+ }
15
+ return a.script.equals(b.script) && a.value === b.value;
16
+ }
17
+ /**
18
+ * @returns all outputs in the first array that are not in the second array.
19
+ * Outputs can occur more than once in each array.
20
+ * An output with value `max` is considered equal to any other output with the same script.
21
+ */
22
+ function outputDifference(first, second) {
23
+ first = first.slice();
24
+ for (const output of second) {
25
+ const index = first.findIndex((o) => matchingOutput(o, output));
26
+ if (index !== -1) {
27
+ first.splice(index, 1);
28
+ }
29
+ }
30
+ return first;
31
+ }
32
+ /**
33
+ * @param actualExternalOutputs - external outputs in the transaction
34
+ * @param expectedExternalOutputs - external outputs that were expected to be in the transaction
35
+ * @returns the difference between the actual and expected external outputs
36
+ */
37
+ function outputDifferencesWithExpected(actualExternalOutputs, expectedExternalOutputs) {
38
+ const implicitExternalOutputs = outputDifference(actualExternalOutputs, expectedExternalOutputs);
39
+ const explicitExternalOutputs = outputDifference(actualExternalOutputs, implicitExternalOutputs);
40
+ const missingOutputs = outputDifference(expectedExternalOutputs, actualExternalOutputs);
41
+ return {
42
+ explicitExternalOutputs,
43
+ implicitExternalOutputs,
44
+ missingOutputs,
45
+ };
46
+ }
47
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3V0cHV0RGlmZmVyZW5jZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy90cmFuc2FjdGlvbi9vdXRwdXREaWZmZXJlbmNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBZ0JBLHdDQUtDO0FBT0QsNENBWUM7QUFxQkQsc0VBWUM7QUE5REQ7Ozs7R0FJRztBQUNILFNBQWdCLGNBQWMsQ0FBUyxDQUEyQixFQUFFLENBQTJCO0lBQzdGLElBQUksQ0FBQyxDQUFDLEtBQUssS0FBSyxLQUFLLElBQUksQ0FBQyxDQUFDLEtBQUssS0FBSyxLQUFLLEVBQUUsQ0FBQztRQUMzQyxPQUFPLENBQUMsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUNuQyxDQUFDO0lBQ0QsT0FBTyxDQUFDLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLEtBQUssS0FBSyxDQUFDLENBQUMsS0FBSyxDQUFDO0FBQzFELENBQUM7QUFFRDs7OztHQUlHO0FBQ0gsU0FBZ0IsZ0JBQWdCLENBQzlCLEtBQVUsRUFDVixNQUFXO0lBRVgsS0FBSyxHQUFHLEtBQUssQ0FBQyxLQUFLLEVBQUUsQ0FBQztJQUN0QixLQUFLLE1BQU0sTUFBTSxJQUFJLE1BQU0sRUFBRSxDQUFDO1FBQzVCLE1BQU0sS0FBSyxHQUFHLEtBQUssQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLGNBQWMsQ0FBQyxDQUFDLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQztRQUNoRSxJQUFJLEtBQUssS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDO1lBQ2pCLEtBQUssQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQ3pCLENBQUM7SUFDSCxDQUFDO0lBQ0QsT0FBTyxLQUFLLENBQUM7QUFDZixDQUFDO0FBZ0JEOzs7O0dBSUc7QUFDSCxTQUFnQiw2QkFBNkIsQ0FDM0MscUJBQWdDLEVBQ2hDLHVCQUFvQztJQUVwQyxNQUFNLHVCQUF1QixHQUFHLGdCQUFnQixDQUFDLHFCQUFxQixFQUFFLHVCQUF1QixDQUFDLENBQUM7SUFDakcsTUFBTSx1QkFBdUIsR0FBRyxnQkFBZ0IsQ0FBQyxxQkFBcUIsRUFBRSx1QkFBdUIsQ0FBQyxDQUFDO0lBQ2pHLE1BQU0sY0FBYyxHQUFHLGdCQUFnQixDQUFDLHVCQUF1QixFQUFFLHFCQUFxQixDQUFDLENBQUM7SUFDeEYsT0FBTztRQUNMLHVCQUF1QjtRQUN2Qix1QkFBdUI7UUFDdkIsY0FBYztLQUNmLENBQUM7QUFDSixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IHR5cGUgQ29tcGFyYWJsZU91dHB1dDxUVmFsdWU+ID0ge1xuICBzY3JpcHQ6IEJ1ZmZlcjtcbiAgdmFsdWU6IFRWYWx1ZTtcbn07XG5cbi8qKiBBY3R1YWwgb3V0cHV0cyBoYXZlIGZpeGVkIHZhbHVlcy4gKi9cbmV4cG9ydCB0eXBlIEFjdHVhbE91dHB1dCA9IENvbXBhcmFibGVPdXRwdXQ8YmlnaW50PjtcblxuLyoqIEV4cGVjdGVkIG91dHB1dHMgY2FuIGhhdmUgYSBmaXhlZCB2YWx1ZSBvciAnbWF4Jy4gKi9cbmV4cG9ydCB0eXBlIEV4cGVjdGVkT3V0cHV0ID0gQ29tcGFyYWJsZU91dHB1dDxiaWdpbnQgfCAnbWF4Jz47XG5cbi8qKlxuICogQHBhcmFtIGFcbiAqIEBwYXJhbSBiXG4gKiBAcmV0dXJucyB3aGV0aGVyIHRoZSB0d28gb3V0cHV0cyBhcmUgZXF1YWwuIE91dHB1dHMgd2l0aCB2YWx1ZSBgbWF4YCBhcmUgY29uc2lkZXJlZCBlcXVhbCB0byBhbnkgb3RoZXIgb3V0cHV0IHdpdGggdGhlIHNhbWUgc2NyaXB0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gbWF0Y2hpbmdPdXRwdXQ8VFZhbHVlPihhOiBDb21wYXJhYmxlT3V0cHV0PFRWYWx1ZT4sIGI6IENvbXBhcmFibGVPdXRwdXQ8VFZhbHVlPik6IGJvb2xlYW4ge1xuICBpZiAoYS52YWx1ZSA9PT0gJ21heCcgfHwgYi52YWx1ZSA9PT0gJ21heCcpIHtcbiAgICByZXR1cm4gYS5zY3JpcHQuZXF1YWxzKGIuc2NyaXB0KTtcbiAgfVxuICByZXR1cm4gYS5zY3JpcHQuZXF1YWxzKGIuc2NyaXB0KSAmJiBhLnZhbHVlID09PSBiLnZhbHVlO1xufVxuXG4vKipcbiAqIEByZXR1cm5zIGFsbCBvdXRwdXRzIGluIHRoZSBmaXJzdCBhcnJheSB0aGF0IGFyZSBub3QgaW4gdGhlIHNlY29uZCBhcnJheS5cbiAqIE91dHB1dHMgY2FuIG9jY3VyIG1vcmUgdGhhbiBvbmNlIGluIGVhY2ggYXJyYXkuXG4gKiBBbiBvdXRwdXQgd2l0aCB2YWx1ZSBgbWF4YCBpcyBjb25zaWRlcmVkIGVxdWFsIHRvIGFueSBvdGhlciBvdXRwdXQgd2l0aCB0aGUgc2FtZSBzY3JpcHQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBvdXRwdXREaWZmZXJlbmNlPEEgZXh0ZW5kcyBBY3R1YWxPdXRwdXQgfCBFeHBlY3RlZE91dHB1dCwgQiBleHRlbmRzIEFjdHVhbE91dHB1dCB8IEV4cGVjdGVkT3V0cHV0PihcbiAgZmlyc3Q6IEFbXSxcbiAgc2Vjb25kOiBCW11cbik6IEFbXSB7XG4gIGZpcnN0ID0gZmlyc3Quc2xpY2UoKTtcbiAgZm9yIChjb25zdCBvdXRwdXQgb2Ygc2Vjb25kKSB7XG4gICAgY29uc3QgaW5kZXggPSBmaXJzdC5maW5kSW5kZXgoKG8pID0+IG1hdGNoaW5nT3V0cHV0KG8sIG91dHB1dCkpO1xuICAgIGlmIChpbmRleCAhPT0gLTEpIHtcbiAgICAgIGZpcnN0LnNwbGljZShpbmRleCwgMSk7XG4gICAgfVxuICB9XG4gIHJldHVybiBmaXJzdDtcbn1cblxuZXhwb3J0IHR5cGUgT3V0cHV0RGlmZmVyZW5jZVdpdGhFeHBlY3RlZDxUQWN0dWFsIGV4dGVuZHMgQWN0dWFsT3V0cHV0LCBURXhwZWN0ZWQgZXh0ZW5kcyBFeHBlY3RlZE91dHB1dD4gPSB7XG4gIC8qKiBUaGVzZSBhcmUgdGhlIGV4dGVybmFsIG91dHB1dHMgdGhhdCB3ZXJlIGV4cGVjdGVkIGFuZCBmb3VuZCBpbiB0aGUgdHJhbnNhY3Rpb24uICovXG4gIGV4cGxpY2l0RXh0ZXJuYWxPdXRwdXRzOiBUQWN0dWFsW107XG4gIC8qKlxuICAgKiBUaGVzZSBhcmUgdGhlIHN1cnByaXNlIGV4dGVybmFsIG91dHB1dHMgdGhhdCB3ZXJlIG5vdCBleHBsaWNpdGx5IHNwZWNpZmllZCBpbiB0aGUgdHJhbnNhY3Rpb24uXG4gICAqIFRoZXkgY2FuIGJlIFBheUdvIGZlZXMuXG4gICAqL1xuICBpbXBsaWNpdEV4dGVybmFsT3V0cHV0czogVEFjdHVhbFtdO1xuICAvKipcbiAgICogVGhlc2UgYXJlIHRoZSBvdXRwdXRzIHRoYXQgd2VyZSBleHBlY3RlZCB0byBiZSBpbiB0aGUgdHJhbnNhY3Rpb24gYnV0IHdlcmUgbm90IGZvdW5kLlxuICAgKi9cbiAgbWlzc2luZ091dHB1dHM6IFRFeHBlY3RlZFtdO1xufTtcblxuLyoqXG4gKiBAcGFyYW0gYWN0dWFsRXh0ZXJuYWxPdXRwdXRzIC0gZXh0ZXJuYWwgb3V0cHV0cyBpbiB0aGUgdHJhbnNhY3Rpb25cbiAqIEBwYXJhbSBleHBlY3RlZEV4dGVybmFsT3V0cHV0cyAtIGV4dGVybmFsIG91dHB1dHMgdGhhdCB3ZXJlIGV4cGVjdGVkIHRvIGJlIGluIHRoZSB0cmFuc2FjdGlvblxuICogQHJldHVybnMgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGUgYWN0dWFsIGFuZCBleHBlY3RlZCBleHRlcm5hbCBvdXRwdXRzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBvdXRwdXREaWZmZXJlbmNlc1dpdGhFeHBlY3RlZDxUQWN0dWFsIGV4dGVuZHMgQWN0dWFsT3V0cHV0LCBURXhwZWN0ZWQgZXh0ZW5kcyBFeHBlY3RlZE91dHB1dD4oXG4gIGFjdHVhbEV4dGVybmFsT3V0cHV0czogVEFjdHVhbFtdLFxuICBleHBlY3RlZEV4dGVybmFsT3V0cHV0czogVEV4cGVjdGVkW11cbik6IE91dHB1dERpZmZlcmVuY2VXaXRoRXhwZWN0ZWQ8VEFjdHVhbCwgVEV4cGVjdGVkPiB7XG4gIGNvbnN0IGltcGxpY2l0RXh0ZXJuYWxPdXRwdXRzID0gb3V0cHV0RGlmZmVyZW5jZShhY3R1YWxFeHRlcm5hbE91dHB1dHMsIGV4cGVjdGVkRXh0ZXJuYWxPdXRwdXRzKTtcbiAgY29uc3QgZXhwbGljaXRFeHRlcm5hbE91dHB1dHMgPSBvdXRwdXREaWZmZXJlbmNlKGFjdHVhbEV4dGVybmFsT3V0cHV0cywgaW1wbGljaXRFeHRlcm5hbE91dHB1dHMpO1xuICBjb25zdCBtaXNzaW5nT3V0cHV0cyA9IG91dHB1dERpZmZlcmVuY2UoZXhwZWN0ZWRFeHRlcm5hbE91dHB1dHMsIGFjdHVhbEV4dGVybmFsT3V0cHV0cyk7XG4gIHJldHVybiB7XG4gICAgZXhwbGljaXRFeHRlcm5hbE91dHB1dHMsXG4gICAgaW1wbGljaXRFeHRlcm5hbE91dHB1dHMsXG4gICAgbWlzc2luZ091dHB1dHMsXG4gIH07XG59XG4iXX0=
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=NamedDescriptor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"NamedDescriptor.d.ts","sourceRoot":"","sources":["../../../test/descriptor/NamedDescriptor.ts"],"names":[],"mappings":""}
@@ -0,0 +1,19 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ const assert_1 = __importDefault(require("assert"));
7
+ const NamedDescriptor_1 = require("../../src/descriptor/NamedDescriptor");
8
+ const key_utils_1 = require("../core/key.utils");
9
+ const builder_1 = require("../../src/descriptor/builder");
10
+ const fixtures_utils_1 = require("../core/fixtures.utils");
11
+ describe('NamedDescriptor', function () {
12
+ it('creates named descriptor with signature', async function () {
13
+ const keys = (0, key_utils_1.getKeyTriple)();
14
+ const namedDescriptor = (0, NamedDescriptor_1.createNamedDescriptorWithSignature)('foo', (0, builder_1.getDescriptorFromBuilder)({ name: 'Wsh2Of2', keys, path: '0/*' }), keys[0]);
15
+ assert_1.default.deepStrictEqual(await (0, fixtures_utils_1.getFixture)(__dirname + '/fixtures/NamedDescriptorWithSignature.json', namedDescriptor), namedDescriptor);
16
+ (0, NamedDescriptor_1.assertHasValidSignature)(namedDescriptor, keys[0]);
17
+ });
18
+ });
19
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTmFtZWREZXNjcmlwdG9yLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vdGVzdC9kZXNjcmlwdG9yL05hbWVkRGVzY3JpcHRvci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFBLG9EQUE0QjtBQUU1QiwwRUFBbUg7QUFDbkgsaURBQWlEO0FBQ2pELDBEQUF3RTtBQUN4RSwyREFBb0Q7QUFFcEQsUUFBUSxDQUFDLGlCQUFpQixFQUFFO0lBQzFCLEVBQUUsQ0FBQyx5Q0FBeUMsRUFBRSxLQUFLO1FBQ2pELE1BQU0sSUFBSSxHQUFHLElBQUEsd0JBQVksR0FBRSxDQUFDO1FBQzVCLE1BQU0sZUFBZSxHQUFHLElBQUEsb0RBQWtDLEVBQ3hELEtBQUssRUFDTCxJQUFBLGtDQUF3QixFQUFDLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxDQUFDLEVBQ2hFLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FDUixDQUFDO1FBQ0YsZ0JBQU0sQ0FBQyxlQUFlLENBQ3BCLE1BQU0sSUFBQSwyQkFBVSxFQUFDLFNBQVMsR0FBRyw2Q0FBNkMsRUFBRSxlQUFlLENBQUMsRUFDNUYsZUFBZSxDQUNoQixDQUFDO1FBQ0YsSUFBQSx5Q0FBdUIsRUFBQyxlQUFlLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDcEQsQ0FBQyxDQUFDLENBQUM7QUFDTCxDQUFDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBhc3NlcnQgZnJvbSAnYXNzZXJ0JztcblxuaW1wb3J0IHsgYXNzZXJ0SGFzVmFsaWRTaWduYXR1cmUsIGNyZWF0ZU5hbWVkRGVzY3JpcHRvcldpdGhTaWduYXR1cmUgfSBmcm9tICcuLi8uLi9zcmMvZGVzY3JpcHRvci9OYW1lZERlc2NyaXB0b3InO1xuaW1wb3J0IHsgZ2V0S2V5VHJpcGxlIH0gZnJvbSAnLi4vY29yZS9rZXkudXRpbHMnO1xuaW1wb3J0IHsgZ2V0RGVzY3JpcHRvckZyb21CdWlsZGVyIH0gZnJvbSAnLi4vLi4vc3JjL2Rlc2NyaXB0b3IvYnVpbGRlcic7XG5pbXBvcnQgeyBnZXRGaXh0dXJlIH0gZnJvbSAnLi4vY29yZS9maXh0dXJlcy51dGlscyc7XG5cbmRlc2NyaWJlKCdOYW1lZERlc2NyaXB0b3InLCBmdW5jdGlvbiAoKSB7XG4gIGl0KCdjcmVhdGVzIG5hbWVkIGRlc2NyaXB0b3Igd2l0aCBzaWduYXR1cmUnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgY29uc3Qga2V5cyA9IGdldEtleVRyaXBsZSgpO1xuICAgIGNvbnN0IG5hbWVkRGVzY3JpcHRvciA9IGNyZWF0ZU5hbWVkRGVzY3JpcHRvcldpdGhTaWduYXR1cmUoXG4gICAgICAnZm9vJyxcbiAgICAgIGdldERlc2NyaXB0b3JGcm9tQnVpbGRlcih7IG5hbWU6ICdXc2gyT2YyJywga2V5cywgcGF0aDogJzAvKicgfSksXG4gICAgICBrZXlzWzBdXG4gICAgKTtcbiAgICBhc3NlcnQuZGVlcFN0cmljdEVxdWFsKFxuICAgICAgYXdhaXQgZ2V0Rml4dHVyZShfX2Rpcm5hbWUgKyAnL2ZpeHR1cmVzL05hbWVkRGVzY3JpcHRvcldpdGhTaWduYXR1cmUuanNvbicsIG5hbWVkRGVzY3JpcHRvciksXG4gICAgICBuYW1lZERlc2NyaXB0b3JcbiAgICApO1xuICAgIGFzc2VydEhhc1ZhbGlkU2lnbmF0dXJlKG5hbWVkRGVzY3JpcHRvciwga2V5c1swXSk7XG4gIH0pO1xufSk7XG4iXX0=
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=createDescriptors.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"createDescriptors.d.ts","sourceRoot":"","sources":["../../../../test/descriptor/createWallet/createDescriptors.ts"],"names":[],"mappings":""}
@@ -0,0 +1,21 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ const assert_1 = __importDefault(require("assert"));
7
+ const key_utils_1 = require("../../core/key.utils");
8
+ const NamedDescriptor_1 = require("../../../src/descriptor/NamedDescriptor");
9
+ const createWallet_1 = require("../../../src/descriptor/createWallet");
10
+ const fixtures_utils_1 = require("../../core/fixtures.utils");
11
+ describe('createDescriptors', function () {
12
+ it('should create standard named descriptors', async function () {
13
+ const keys = (0, key_utils_1.getKeyTriple)();
14
+ const namedDescriptors = (0, createWallet_1.DefaultWsh2Of3)(keys[0], keys.slice(1));
15
+ assert_1.default.deepStrictEqual(namedDescriptors, await (0, fixtures_utils_1.getFixture)(__dirname + '/fixtures/DefaultWsh2Of3.json', namedDescriptors));
16
+ for (const namedDescriptor of namedDescriptors) {
17
+ (0, NamedDescriptor_1.assertHasValidSignature)(namedDescriptor, keys[0]);
18
+ }
19
+ });
20
+ });
21
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3JlYXRlRGVzY3JpcHRvcnMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi90ZXN0L2Rlc2NyaXB0b3IvY3JlYXRlV2FsbGV0L2NyZWF0ZURlc2NyaXB0b3JzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEsb0RBQTRCO0FBRTVCLG9EQUFvRDtBQUNwRCw2RUFBa0Y7QUFDbEYsdUVBQXNFO0FBQ3RFLDhEQUF1RDtBQUV2RCxRQUFRLENBQUMsbUJBQW1CLEVBQUU7SUFDNUIsRUFBRSxDQUFDLDBDQUEwQyxFQUFFLEtBQUs7UUFDbEQsTUFBTSxJQUFJLEdBQUcsSUFBQSx3QkFBWSxHQUFFLENBQUM7UUFDNUIsTUFBTSxnQkFBZ0IsR0FBRyxJQUFBLDZCQUFjLEVBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNoRSxnQkFBTSxDQUFDLGVBQWUsQ0FDcEIsZ0JBQWdCLEVBQ2hCLE1BQU0sSUFBQSwyQkFBVSxFQUFDLFNBQVMsR0FBRywrQkFBK0IsRUFBRSxnQkFBZ0IsQ0FBQyxDQUNoRixDQUFDO1FBQ0YsS0FBSyxNQUFNLGVBQWUsSUFBSSxnQkFBZ0IsRUFBRSxDQUFDO1lBQy9DLElBQUEseUNBQXVCLEVBQUMsZUFBZSxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3BELENBQUM7SUFDSCxDQUFDLENBQUMsQ0FBQztBQUNMLENBQUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IGFzc2VydCBmcm9tICdhc3NlcnQnO1xuXG5pbXBvcnQgeyBnZXRLZXlUcmlwbGUgfSBmcm9tICcuLi8uLi9jb3JlL2tleS51dGlscyc7XG5pbXBvcnQgeyBhc3NlcnRIYXNWYWxpZFNpZ25hdHVyZSB9IGZyb20gJy4uLy4uLy4uL3NyYy9kZXNjcmlwdG9yL05hbWVkRGVzY3JpcHRvcic7XG5pbXBvcnQgeyBEZWZhdWx0V3NoMk9mMyB9IGZyb20gJy4uLy4uLy4uL3NyYy9kZXNjcmlwdG9yL2NyZWF0ZVdhbGxldCc7XG5pbXBvcnQgeyBnZXRGaXh0dXJlIH0gZnJvbSAnLi4vLi4vY29yZS9maXh0dXJlcy51dGlscyc7XG5cbmRlc2NyaWJlKCdjcmVhdGVEZXNjcmlwdG9ycycsIGZ1bmN0aW9uICgpIHtcbiAgaXQoJ3Nob3VsZCBjcmVhdGUgc3RhbmRhcmQgbmFtZWQgZGVzY3JpcHRvcnMnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgY29uc3Qga2V5cyA9IGdldEtleVRyaXBsZSgpO1xuICAgIGNvbnN0IG5hbWVkRGVzY3JpcHRvcnMgPSBEZWZhdWx0V3NoMk9mMyhrZXlzWzBdLCBrZXlzLnNsaWNlKDEpKTtcbiAgICBhc3NlcnQuZGVlcFN0cmljdEVxdWFsKFxuICAgICAgbmFtZWREZXNjcmlwdG9ycyxcbiAgICAgIGF3YWl0IGdldEZpeHR1cmUoX19kaXJuYW1lICsgJy9maXh0dXJlcy9EZWZhdWx0V3NoMk9mMy5qc29uJywgbmFtZWREZXNjcmlwdG9ycylcbiAgICApO1xuICAgIGZvciAoY29uc3QgbmFtZWREZXNjcmlwdG9yIG9mIG5hbWVkRGVzY3JpcHRvcnMpIHtcbiAgICAgIGFzc2VydEhhc1ZhbGlkU2lnbmF0dXJlKG5hbWVkRGVzY3JpcHRvciwga2V5c1swXSk7XG4gICAgfVxuICB9KTtcbn0pO1xuIl19
@@ -4,7 +4,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
4
4
  };
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
6
  const assert_1 = __importDefault(require("assert"));
7
- const outputDifference_1 = require("../../../src/transaction/descriptor/outputDifference");
7
+ const outputDifference_1 = require("../../../src/transaction/outputDifference");
8
8
  describe('outputDifference', function () {
9
9
  function output(script, value) {
10
10
  const scriptBuffer = Buffer.from(script, 'hex');
@@ -13,31 +13,45 @@ describe('outputDifference', function () {
13
13
  }
14
14
  return {
15
15
  script: Buffer.from(script, 'hex'),
16
- value: BigInt(value),
16
+ value: value === 'max' ? 'max' : BigInt(value),
17
17
  };
18
18
  }
19
19
  const a = output('aa', 1);
20
20
  const a2 = output('aa', 2);
21
- const b = output('bb', 2);
22
- const c = output('cc', 3);
21
+ const aMax = output('aa', 'max');
22
+ const b = output('bb', 1);
23
+ const c = output('cc', 1);
23
24
  describe('equalOutput', function () {
24
25
  it('has expected result', function () {
25
- assert_1.default.deepStrictEqual((0, outputDifference_1.equalOutput)(a, a), true);
26
- assert_1.default.deepStrictEqual((0, outputDifference_1.equalOutput)(a, a2), false);
27
- assert_1.default.deepStrictEqual((0, outputDifference_1.equalOutput)(a, b), false);
26
+ assert_1.default.deepStrictEqual((0, outputDifference_1.matchingOutput)(a, a), true);
27
+ assert_1.default.deepStrictEqual((0, outputDifference_1.matchingOutput)(a, a2), false);
28
+ assert_1.default.deepStrictEqual((0, outputDifference_1.matchingOutput)(a, b), false);
29
+ assert_1.default.deepStrictEqual((0, outputDifference_1.matchingOutput)(aMax, b), false);
30
+ assert_1.default.deepStrictEqual((0, outputDifference_1.matchingOutput)(aMax, a), true);
31
+ assert_1.default.deepStrictEqual((0, outputDifference_1.matchingOutput)(a, aMax), true);
32
+ // this one does not appear in practice but is a valid comparison
33
+ assert_1.default.deepStrictEqual((0, outputDifference_1.matchingOutput)(aMax, aMax), true);
28
34
  });
29
35
  });
30
36
  describe('outputDifference', function () {
31
- assert_1.default.deepStrictEqual((0, outputDifference_1.outputDifference)([], []), []);
32
- assert_1.default.deepStrictEqual((0, outputDifference_1.outputDifference)([a], []), [a]);
33
- assert_1.default.deepStrictEqual((0, outputDifference_1.outputDifference)([], [a]), []);
34
- assert_1.default.deepStrictEqual((0, outputDifference_1.outputDifference)([a], [a]), []);
35
- assert_1.default.deepStrictEqual((0, outputDifference_1.outputDifference)([a, a], [a]), [a]);
36
- assert_1.default.deepStrictEqual((0, outputDifference_1.outputDifference)([a, a, a], [a]), [a, a]);
37
- assert_1.default.deepStrictEqual((0, outputDifference_1.outputDifference)([a, b, c], [a, b]), [c]);
38
- assert_1.default.deepStrictEqual((0, outputDifference_1.outputDifference)([a, b, c, a], [a, b]), [c, a]);
39
- assert_1.default.deepStrictEqual((0, outputDifference_1.outputDifference)([a], [a2]), [a]);
40
- assert_1.default.deepStrictEqual((0, outputDifference_1.outputDifference)([a2], [a]), [a2]);
37
+ it('has expected result', function () {
38
+ assert_1.default.deepStrictEqual((0, outputDifference_1.outputDifference)([], []), []);
39
+ assert_1.default.deepStrictEqual((0, outputDifference_1.outputDifference)([a], []), [a]);
40
+ assert_1.default.deepStrictEqual((0, outputDifference_1.outputDifference)([aMax], []), [aMax]);
41
+ assert_1.default.deepStrictEqual((0, outputDifference_1.outputDifference)([], [a]), []);
42
+ assert_1.default.deepStrictEqual((0, outputDifference_1.outputDifference)([], [aMax]), []);
43
+ assert_1.default.deepStrictEqual((0, outputDifference_1.outputDifference)([a], [a]), []);
44
+ assert_1.default.deepStrictEqual((0, outputDifference_1.outputDifference)([a], [aMax]), []);
45
+ assert_1.default.deepStrictEqual((0, outputDifference_1.outputDifference)([aMax], [a]), []);
46
+ assert_1.default.deepStrictEqual((0, outputDifference_1.outputDifference)([a, a], [a]), [a]);
47
+ assert_1.default.deepStrictEqual((0, outputDifference_1.outputDifference)([a, a], [aMax]), [a]);
48
+ assert_1.default.deepStrictEqual((0, outputDifference_1.outputDifference)([a, a, a], [a]), [a, a]);
49
+ assert_1.default.deepStrictEqual((0, outputDifference_1.outputDifference)([a, b, c], [a, b]), [c]);
50
+ assert_1.default.deepStrictEqual((0, outputDifference_1.outputDifference)([a, b, c], [aMax, b]), [c]);
51
+ assert_1.default.deepStrictEqual((0, outputDifference_1.outputDifference)([a, b, c, a], [a, b]), [c, a]);
52
+ assert_1.default.deepStrictEqual((0, outputDifference_1.outputDifference)([a], [a2]), [a]);
53
+ assert_1.default.deepStrictEqual((0, outputDifference_1.outputDifference)([a2], [a]), [a2]);
54
+ });
41
55
  });
42
56
  describe('outputDifferencesWithExpected', function () {
43
57
  function test(outputs, recipients, expected) {
@@ -48,13 +62,15 @@ describe('outputDifference', function () {
48
62
  missingOutputs: expected.missing,
49
63
  });
50
64
  }
51
- test([a], [], { missing: [], explicit: [], implicit: [a] });
52
- test([], [a], { missing: [a], explicit: [], implicit: [] });
53
- test([a], [a], { missing: [], explicit: [a], implicit: [] });
54
- test([a], [a2], { missing: [a2], explicit: [], implicit: [a] });
55
- test([b], [a], { missing: [a], explicit: [], implicit: [b] });
56
- test([a, a], [a], { missing: [], explicit: [a], implicit: [a] });
57
- test([a, b], [a], { missing: [], explicit: [a], implicit: [b] });
65
+ it('has expected result', function () {
66
+ test([a], [], { missing: [], explicit: [], implicit: [a] });
67
+ test([], [a], { missing: [a], explicit: [], implicit: [] });
68
+ test([a], [a], { missing: [], explicit: [a], implicit: [] });
69
+ test([a], [a2], { missing: [a2], explicit: [], implicit: [a] });
70
+ test([b], [a], { missing: [a], explicit: [], implicit: [b] });
71
+ test([a, a], [a], { missing: [], explicit: [a], implicit: [a] });
72
+ test([a, b], [a], { missing: [], explicit: [a], implicit: [b] });
73
+ });
58
74
  });
59
75
  });
60
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3V0cHV0RGlmZmVyZW5jZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Rlc3QvdHJhbnNhY3Rpb24vZGVzY3JpcHRvci9vdXRwdXREaWZmZXJlbmNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEsb0RBQTRCO0FBRTVCLDJGQUs4RDtBQUU5RCxRQUFRLENBQUMsa0JBQWtCLEVBQUU7SUFDM0IsU0FBUyxNQUFNLENBQUMsTUFBYyxFQUFFLEtBQXNCO1FBQ3BELE1BQU0sWUFBWSxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBQ2hELElBQUksWUFBWSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsS0FBSyxNQUFNLEVBQUUsQ0FBQztZQUM1QyxNQUFNLElBQUksS0FBSyxDQUFDLGdCQUFnQixDQUFDLENBQUM7UUFDcEMsQ0FBQztRQUNELE9BQU87WUFDTCxNQUFNLEVBQUUsTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsS0FBSyxDQUFDO1lBQ2xDLEtBQUssRUFBRSxNQUFNLENBQUMsS0FBSyxDQUFDO1NBQ3JCLENBQUM7SUFDSixDQUFDO0lBRUQsTUFBTSxDQUFDLEdBQUcsTUFBTSxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQztJQUMxQixNQUFNLEVBQUUsR0FBRyxNQUFNLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQzNCLE1BQU0sQ0FBQyxHQUFHLE1BQU0sQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDMUIsTUFBTSxDQUFDLEdBQUcsTUFBTSxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQztJQUUxQixRQUFRLENBQUMsYUFBYSxFQUFFO1FBQ3RCLEVBQUUsQ0FBQyxxQkFBcUIsRUFBRTtZQUN4QixnQkFBTSxDQUFDLGVBQWUsQ0FBQyxJQUFBLDhCQUFXLEVBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLElB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RUFBRSxFQUFFLE9BQU8sRUFBRSxFQUFFLEVBQUUsUUFBUSxFQUFFLEVBQUUsRUFBRSxRQUFRLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDNUQsSUFBSSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsT0FBTyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsUUFBUSxFQUFFLEVBQUUsRUFBRSxRQUFRLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQztRQUM1RCxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsT0FBTyxFQUFFLEVBQUUsRUFBRSxRQUFRLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxRQUFRLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQztRQUM3RCxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsT0FBTyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsUUFBUSxFQUFFLEVBQUUsRUFBRSxRQUFRLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDaEUsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLE9BQU8sRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLFFBQVEsRUFBRSxFQUFFLEVBQUUsUUFBUSxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQzlELElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsT0FBTyxFQUFFLEVBQUUsRUFBRSxRQUFRLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxRQUFRLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDakUsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxPQUFPLEVBQUUsRUFBRSxFQUFFLFFBQVEsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLFFBQVEsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUNuRSxDQUFDLENBQUMsQ0FBQztBQUNMLENBQUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IGFzc2VydCBmcm9tICdhc3NlcnQnO1xuXG5pbXBvcnQge1xuICBDb21wYXJhYmxlT3V0cHV0LFxuICBlcXVhbE91dHB1dCxcbiAgb3V0cHV0RGlmZmVyZW5jZSxcbiAgb3V0cHV0RGlmZmVyZW5jZXNXaXRoRXhwZWN0ZWQsXG59IGZyb20gJy4uLy4uLy4uL3NyYy90cmFuc2FjdGlvbi9kZXNjcmlwdG9yL291dHB1dERpZmZlcmVuY2UnO1xuXG5kZXNjcmliZSgnb3V0cHV0RGlmZmVyZW5jZScsIGZ1bmN0aW9uICgpIHtcbiAgZnVuY3Rpb24gb3V0cHV0KHNjcmlwdDogc3RyaW5nLCB2YWx1ZTogYmlnaW50IHwgbnVtYmVyKSB7XG4gICAgY29uc3Qgc2NyaXB0QnVmZmVyID0gQnVmZmVyLmZyb20oc2NyaXB0LCAnaGV4Jyk7XG4gICAgaWYgKHNjcmlwdEJ1ZmZlci50b1N0cmluZygnaGV4JykgIT09IHNjcmlwdCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIHNjcmlwdCcpO1xuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgc2NyaXB0OiBCdWZmZXIuZnJvbShzY3JpcHQsICdoZXgnKSxcbiAgICAgIHZhbHVlOiBCaWdJbnQodmFsdWUpLFxuICAgIH07XG4gIH1cblxuICBjb25zdCBhID0gb3V0cHV0KCdhYScsIDEpO1xuICBjb25zdCBhMiA9IG91dHB1dCgnYWEnLCAyKTtcbiAgY29uc3QgYiA9IG91dHB1dCgnYmInLCAyKTtcbiAgY29uc3QgYyA9IG91dHB1dCgnY2MnLCAzKTtcblxuICBkZXNjcmliZSgnZXF1YWxPdXRwdXQnLCBmdW5jdGlvbiAoKSB7XG4gICAgaXQoJ2hhcyBleHBlY3RlZCByZXN1bHQnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBhc3NlcnQuZGVlcFN0cmljdEVxdWFsKGVxdWFsT3V0cHV0KGEsIGEpLCB0cnVlKTtcbiAgICAgIGFzc2VydC5kZWVwU3RyaWN0RXF1YWwoZXF1YWxPdXRwdXQoYSwgYTIpLCBmYWxzZSk7XG4gICAgICBhc3NlcnQuZGVlcFN0cmljdEVxdWFsKGVxdWFsT3V0cHV0KGEsIGIpLCBmYWxzZSk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdvdXRwdXREaWZmZXJlbmNlJywgZnVuY3Rpb24gKCkge1xuICAgIGFzc2VydC5kZWVwU3RyaWN0RXF1YWwob3V0cHV0RGlmZmVyZW5jZShbXSwgW10pLCBbXSk7XG4gICAgYXNzZXJ0LmRlZXBTdHJpY3RFcXVhbChvdXRwdXREaWZmZXJlbmNlKFthXSwgW10pLCBbYV0pO1xuICAgIGFzc2VydC5kZWVwU3RyaWN0RXF1YWwob3V0cHV0RGlmZmVyZW5jZShbXSwgW2FdKSwgW10pO1xuICAgIGFzc2VydC5kZWVwU3RyaWN0RXF1YWwob3V0cHV0RGlmZmVyZW5jZShbYV0sIFthXSksIFtdKTtcbiAgICBhc3NlcnQuZGVlcFN0cmljdEVxdWFsKG91dHB1dERpZmZlcmVuY2UoW2EsIGFdLCBbYV0pLCBbYV0pO1xuICAgIGFzc2VydC5kZWVwU3RyaWN0RXF1YWwob3V0cHV0RGlmZmVyZW5jZShbYSwgYSwgYV0sIFthXSksIFthLCBhXSk7XG4gICAgYXNzZXJ0LmRlZXBTdHJpY3RFcXVhbChvdXRwdXREaWZmZXJlbmNlKFthLCBiLCBjXSwgW2EsIGJdKSwgW2NdKTtcbiAgICBhc3NlcnQuZGVlcFN0cmljdEVxdWFsKG91dHB1dERpZmZlcmVuY2UoW2EsIGIsIGMsIGFdLCBbYSwgYl0pLCBbYywgYV0pO1xuXG4gICAgYXNzZXJ0LmRlZXBTdHJpY3RFcXVhbChvdXRwdXREaWZmZXJlbmNlKFthXSwgW2EyXSksIFthXSk7XG4gICAgYXNzZXJ0LmRlZXBTdHJpY3RFcXVhbChvdXRwdXREaWZmZXJlbmNlKFthMl0sIFthXSksIFthMl0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnb3V0cHV0RGlmZmVyZW5jZXNXaXRoRXhwZWN0ZWQnLCBmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gdGVzdChcbiAgICAgIG91dHB1dHM6IENvbXBhcmFibGVPdXRwdXRbXSxcbiAgICAgIHJlY2lwaWVudHM6IENvbXBhcmFibGVPdXRwdXRbXSxcbiAgICAgIGV4cGVjdGVkOiB7XG4gICAgICAgIG1pc3Npbmc6IENvbXBhcmFibGVPdXRwdXRbXTtcbiAgICAgICAgZXhwbGljaXQ6IENvbXBhcmFibGVPdXRwdXRbXTtcbiAgICAgICAgaW1wbGljaXQ6IENvbXBhcmFibGVPdXRwdXRbXTtcbiAgICAgIH1cbiAgICApIHtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IG91dHB1dERpZmZlcmVuY2VzV2l0aEV4cGVjdGVkKG91dHB1dHMsIHJlY2lwaWVudHMpO1xuICAgICAgYXNzZXJ0LmRlZXBTdHJpY3RFcXVhbChyZXN1bHQsIHtcbiAgICAgICAgZXhwbGljaXRFeHRlcm5hbE91dHB1dHM6IGV4cGVjdGVkLmV4cGxpY2l0LFxuICAgICAgICBpbXBsaWNpdEV4dGVybmFsT3V0cHV0czogZXhwZWN0ZWQuaW1wbGljaXQsXG4gICAgICAgIG1pc3NpbmdPdXRwdXRzOiBleHBlY3RlZC5taXNzaW5nLFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgdGVzdChbYV0sIFtdLCB7IG1pc3Npbmc6IFtdLCBleHBsaWNpdDogW10sIGltcGxpY2l0OiBbYV0gfSk7XG4gICAgdGVzdChbXSwgW2FdLCB7IG1pc3Npbmc6IFthXSwgZXhwbGljaXQ6IFtdLCBpbXBsaWNpdDogW10gfSk7XG4gICAgdGVzdChbYV0sIFthXSwgeyBtaXNzaW5nOiBbXSwgZXhwbGljaXQ6IFthXSwgaW1wbGljaXQ6IFtdIH0pO1xuICAgIHRlc3QoW2FdLCBbYTJdLCB7IG1pc3Npbmc6IFthMl0sIGV4cGxpY2l0OiBbXSwgaW1wbGljaXQ6IFthXSB9KTtcbiAgICB0ZXN0KFtiXSwgW2FdLCB7IG1pc3Npbmc6IFthXSwgZXhwbGljaXQ6IFtdLCBpbXBsaWNpdDogW2JdIH0pO1xuICAgIHRlc3QoW2EsIGFdLCBbYV0sIHsgbWlzc2luZzogW10sIGV4cGxpY2l0OiBbYV0sIGltcGxpY2l0OiBbYV0gfSk7XG4gICAgdGVzdChbYSwgYl0sIFthXSwgeyBtaXNzaW5nOiBbXSwgZXhwbGljaXQ6IFthXSwgaW1wbGljaXQ6IFtiXSB9KTtcbiAgfSk7XG59KTtcbiJdfQ==
76
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3V0cHV0RGlmZmVyZW5jZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Rlc3QvdHJhbnNhY3Rpb24vZGVzY3JpcHRvci9vdXRwdXREaWZmZXJlbmNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEsb0RBQTRCO0FBRTVCLGdGQU1tRDtBQUVuRCxRQUFRLENBQUMsa0JBQWtCLEVBQUU7SUFHM0IsU0FBUyxNQUFNLENBQUMsTUFBYyxFQUFFLEtBQThCO1FBQzVELE1BQU0sWUFBWSxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBQ2hELElBQUksWUFBWSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsS0FBSyxNQUFNLEVBQUUsQ0FBQztZQUM1QyxNQUFNLElBQUksS0FBSyxDQUFDLGdCQUFnQixDQUFDLENBQUM7UUFDcEMsQ0FBQztRQUNELE9BQU87WUFDTCxNQUFNLEVBQUUsTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsS0FBSyxDQUFDO1lBQ2xDLEtBQUssRUFBRSxLQUFLLEtBQUssS0FBSyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUM7U0FDL0MsQ0FBQztJQUNKLENBQUM7SUFFRCxNQUFNLENBQUMsR0FBRyxNQUFNLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQzFCLE1BQU0sRUFBRSxHQUFHLE1BQU0sQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDM0IsTUFBTSxJQUFJLEdBQUcsTUFBTSxDQUFDLElBQUksRUFBRSxLQUFLLENBQUMsQ0FBQztJQUNqQyxNQUFNLENBQUMsR0FBRyxNQUFNLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQzFCLE1BQU0sQ0FBQyxHQUFHLE1BQU0sQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFFMUIsUUFBUSxDQUFDLGFBQWEsRUFBRTtRQUN0QixFQUFFLENBQUMscUJBQXFCLEVBQUU7WUFDeEIsZ0JBQU0sQ0FBQyxlQUFlLENBQUMsSUFBQSxpQ0FBYyxFQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQztZQUNuRCxnQkFBTSxDQUFDLGVBQWUsQ0FBQyxJQUFBLGlDQUFjLEVBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEtBQUssQ0FBQyxDQUFDO1lBQ3JELGdCQUFNLENBQUMsZUFBZSxDQUFDLElBQUEsaUNBQWMsRUFBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsS0FBSyxDQUFDLENBQUM7WUFDcEQsZ0JBQU0sQ0FBQyxlQUFlLENBQUMsSUFBQSxpQ0FBYyxFQUFDLElBQUksRUFBRSxDQUFDLENBQUMsRUFBRSxLQUFLLENBQUMsQ0FBQztZQUV2RCxnQkFBTSxDQUFDLGVBQWUsQ0FBQyxJQUFBLGlDQUFjLEVBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDO1lBQ3RELGdCQUFNLENBQUMsZUFBZSxDQUFDLElBQUEsaUNBQWMsRUFBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUM7WUFDdEQsaUVBQWlFO1lBQ2pFLGdCQUFNLENBQUMsZUFBZSxDQUFDLElBQUEsaUNBQWMsRUFBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFDM0QsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDLENBQUMsQ0FBQztJQUVILFFBQVEsQ0FBQyxrQkFBa0IsRUFBRTtRQUMzQixFQUFFLENBQUMscUJBQXFCLEVBQUU7WUFDeEIsZ0JBQU0sQ0FBQyxlQUFlLENBQUMsSUFBQSxtQ0FBZ0IsRUFBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7WUFDckQsZ0JBQU0sQ0FBQyxlQUFlLENBQUMsSUFBQSxtQ0FBZ0IsRUFBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUN2RCxnQkFBTSxDQUFDLGVBQWUsQ0FBQyxJQUFBLG1DQUFnQixFQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO1lBQzdELGdCQUFNLENBQUMsZUFBZSxDQUFDLElBQUEsbUNBQWdCLEVBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQztZQUN0RCxnQkFBTSxDQUFDLGVBQWUsQ0FBQyxJQUFBLG1DQUFnQixFQUFDLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7WUFDekQsZ0JBQU0sQ0FBQyxlQUFlLENBQUMsSUFBQSxtQ0FBZ0IsRUFBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQztZQUN2RCxnQkFBTSxDQUFDLGVBQWUsQ0FBQyxJQUFBLG1DQUFnQixFQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1lBQzFELGdCQUFNLENBQUMsZUFBZSxDQUFDLElBQUEsbUNBQWdCLEVBQUMsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7WUFDMUQsZ0JBQU0sQ0FBQyxlQUFlLENBQUMsSUFBQSxtQ0FBZ0IsRUFBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQzNELGdCQUFNLENBQUMsZUFBZSxDQUFDLElBQUEsbUNBQWdCLEVBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUM5RCxnQkFBTSxDQUFDLGVBQWUsQ0FBQyxJQUFBLG1D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RUFBRSxRQUFRLEVBQUUsRUFBRSxFQUFFLFFBQVEsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztZQUM5RCxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLE9BQU8sRUFBRSxFQUFFLEVBQUUsUUFBUSxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsUUFBUSxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1lBQ2pFLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsT0FBTyxFQUFFLEVBQUUsRUFBRSxRQUFRLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxRQUFRLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDbkUsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDLENBQUMsQ0FBQztBQUNMLENBQUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IGFzc2VydCBmcm9tICdhc3NlcnQnO1xuXG5pbXBvcnQge1xuICBBY3R1YWxPdXRwdXQsXG4gIEV4cGVjdGVkT3V0cHV0LFxuICBtYXRjaGluZ091dHB1dCxcbiAgb3V0cHV0RGlmZmVyZW5jZSxcbiAgb3V0cHV0RGlmZmVyZW5jZXNXaXRoRXhwZWN0ZWQsXG59IGZyb20gJy4uLy4uLy4uL3NyYy90cmFuc2FjdGlvbi9vdXRwdXREaWZmZXJlbmNlJztcblxuZGVzY3JpYmUoJ291dHB1dERpZmZlcmVuY2UnLCBmdW5jdGlvbiAoKSB7XG4gIGZ1bmN0aW9uIG91dHB1dChzY3JpcHQ6IHN0cmluZywgdmFsdWU6IGJpZ2ludCB8IG51bWJlcik6IEFjdHVhbE91dHB1dDtcbiAgZnVuY3Rpb24gb3V0cHV0KHNjcmlwdDogc3RyaW5nLCB2YWx1ZTogJ21heCcpOiBFeHBlY3RlZE91dHB1dDtcbiAgZnVuY3Rpb24gb3V0cHV0KHNjcmlwdDogc3RyaW5nLCB2YWx1ZTogYmlnaW50IHwgbnVtYmVyIHwgJ21heCcpOiBBY3R1YWxPdXRwdXQgfCBFeHBlY3RlZE91dHB1dCB7XG4gICAgY29uc3Qgc2NyaXB0QnVmZmVyID0gQnVmZmVyLmZyb20oc2NyaXB0LCAnaGV4Jyk7XG4gICAgaWYgKHNjcmlwdEJ1ZmZlci50b1N0cmluZygnaGV4JykgIT09IHNjcmlwdCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIHNjcmlwdCcpO1xuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgc2NyaXB0OiBCdWZmZXIuZnJvbShzY3JpcHQsICdoZXgnKSxcbiAgICAgIHZhbHVlOiB2YWx1ZSA9PT0gJ21heCcgPyAnbWF4JyA6IEJpZ0ludCh2YWx1ZSksXG4gICAgfTtcbiAgfVxuXG4gIGNvbnN0IGEgPSBvdXRwdXQoJ2FhJywgMSk7XG4gIGNvbnN0IGEyID0gb3V0cHV0KCdhYScsIDIpO1xuICBjb25zdCBhTWF4ID0gb3V0cHV0KCdhYScsICdtYXgnKTtcbiAgY29uc3QgYiA9IG91dHB1dCgnYmInLCAxKTtcbiAgY29uc3QgYyA9IG91dHB1dCgnY2MnLCAxKTtcblxuICBkZXNjcmliZSgnZXF1YWxPdXRwdXQnLCBmdW5jdGlvbiAoKSB7XG4gICAgaXQoJ2hhcyBleHBlY3RlZCByZXN1bHQnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBhc3NlcnQuZGVlcFN0cmljdEVxdWFsKG1hdGNoaW5nT3V0cHV0KGEsIGEpLCB0cnVlKTtcbiAgICAgIGFzc2VydC5kZWVwU3RyaWN0RXF1YWwobWF0Y2hpbmdPdXRwdXQoYSwgYTIpLCBmYWxzZSk7XG4gICAgICBhc3NlcnQuZGVlcFN0cmljdEVxdWFsKG1hdGNoaW5nT3V0cHV0KGEsIGIpLCBmYWxzZSk7XG4gICAgICBhc3NlcnQuZGVlcFN0cmljdEVxdWFsKG1hdGNoaW5nT3V0cHV0KGFNYXgsIGIpLCBmYWxzZSk7XG5cbiAgICAgIGFzc2VydC5kZWVwU3RyaWN0RXF1YWwobWF0Y2hpbmdPdXRwdXQoYU1heCwgYSksIHRydWUpO1xuICAgICAgYXNzZXJ0LmRlZXBTdHJpY3RFcXVhbChtYXRjaGluZ091dHB1dChhLCBhTWF4KSwgdHJ1ZSk7XG4gICAgICAvLyB0aGlzIG9uZSBkb2VzIG5vdCBhcHBlYXIgaW4gcHJhY3RpY2UgYnV0IGlzIGEgdmFsaWQgY29tcGFyaXNvblxuICAgICAgYXNzZXJ0LmRlZXBTdHJpY3RFcXVhbChtYXRjaGluZ091dHB1dChhTWF4LCBhTWF4KSwgdHJ1ZSk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdvdXRwdXREaWZmZXJlbmNlJywgZnVuY3Rpb24gKCkge1xuICAgIGl0KCdoYXMgZXhwZWN0ZWQgcmVzdWx0JywgZnVuY3Rpb24gKCkge1xuICAgICAgYXNzZXJ0LmRlZXBTdHJpY3RFcXVhbChvdXRwdXREaWZmZXJlbmNlKFtdLCBbXSksIFtdKTtcbiAgICAgIGFzc2VydC5kZWVwU3RyaWN0RXF1YWwob3V0cHV0RGlmZmVyZW5jZShbYV0sIFtdKSwgW2FdKTtcbiAgICAgIGFzc2VydC5kZWVwU3RyaWN0RXF1YWwob3V0cHV0RGlmZmVyZW5jZShbYU1heF0sIFtdKSwgW2FNYXhdKTtcbiAgICAgIGFzc2VydC5kZWVwU3RyaWN0RXF1YWwob3V0cHV0RGlmZmVyZW5jZShbXSwgW2FdKSwgW10pO1xuICAgICAgYXNzZXJ0LmRlZXBTdHJpY3RFcXVhbChvdXRwdXREaWZmZXJlbmNlKFtdLCBbYU1heF0pLCBbXSk7XG4gICAgICBhc3NlcnQuZGVlcFN0cmljdEVxdWFsKG91dHB1dERpZmZlcmVuY2UoW2FdLCBbYV0pLCBbXSk7XG4gICAgICBhc3NlcnQuZGVlcFN0cmljdEVxdWFsKG91dHB1dERpZmZlcmVuY2UoW2FdLCBbYU1heF0pLCBbXSk7XG4gICAgICBhc3NlcnQuZGVlcFN0cmljdEVxdWFsKG91dHB1dERpZmZlcmVuY2UoW2FNYXhdLCBbYV0pLCBbXSk7XG4gICAgICBhc3NlcnQuZGVlcFN0cmljdEVxdWFsKG91dHB1dERpZmZlcmVuY2UoW2EsIGFdLCBbYV0pLCBbYV0pO1xuICAgICAgYXNzZXJ0LmRlZXBTdHJpY3RFcXVhbChvdXRwdXREaWZmZXJlbmNlKFthLCBhXSwgW2FNYXhdKSwgW2FdKTtcbiAgICAgIGFzc2VydC5kZWVwU3RyaWN0RXF1YWwob3V0cHV0RGlmZmVyZW5jZShbYSwgYSwgYV0sIFthXSksIFthLCBhXSk7XG4gICAgICBhc3NlcnQuZGVlcFN0cmljdEVxdWFsKG91dHB1dERpZmZlcmVuY2UoW2EsIGIsIGNdLCBbYSwgYl0pLCBbY10pO1xuICAgICAgYXNzZXJ0LmRlZXBTdHJpY3RFcXVhbChvdXRwdXREaWZmZXJlbmNlKFthLCBiLCBjXSwgW2FNYXgsIGJdKSwgW2NdKTtcbiAgICAgIGFzc2VydC5kZWVwU3RyaWN0RXF1YWwob3V0cHV0RGlmZmVyZW5jZShbYSwgYiwgYywgYV0sIFthLCBiXSksIFtjLCBhXSk7XG5cbiAgICAgIGFzc2VydC5kZWVwU3RyaWN0RXF1YWwob3V0cHV0RGlmZmVyZW5jZShbYV0sIFthMl0pLCBbYV0pO1xuICAgICAgYXNzZXJ0LmRlZXBTdHJpY3RFcXVhbChvdXRwdXREaWZmZXJlbmNlKFthMl0sIFthXSksIFthMl0pO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnb3V0cHV0RGlmZmVyZW5jZXNXaXRoRXhwZWN0ZWQnLCBmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gdGVzdChcbiAgICAgIG91dHB1dHM6IEFjdHVhbE91dHB1dFtdLFxuICAgICAgcmVjaXBpZW50czogRXhwZWN0ZWRPdXRwdXRbXSxcbiAgICAgIGV4cGVjdGVkOiB7XG4gICAgICAgIG1pc3Npbmc6IEV4cGVjdGVkT3V0cHV0W107XG4gICAgICAgIGV4cGxpY2l0OiBBY3R1YWxPdXRwdXRbXTtcbiAgICAgICAgaW1wbGljaXQ6IEFjdHVhbE91dHB1dFtdO1xuICAgICAgfVxuICAgICkge1xuICAgICAgY29uc3QgcmVzdWx0ID0gb3V0cHV0RGlmZmVyZW5jZXNXaXRoRXhwZWN0ZWQob3V0cHV0cywgcmVjaXBpZW50cyk7XG4gICAgICBhc3NlcnQuZGVlcFN0cmljdEVxdWFsKHJlc3VsdCwge1xuICAgICAgICBleHBsaWNpdEV4dGVybmFsT3V0cHV0czogZXhwZWN0ZWQuZXhwbGljaXQsXG4gICAgICAgIGltcGxpY2l0RXh0ZXJuYWxPdXRwdXRzOiBleHBlY3RlZC5pbXBsaWNpdCxcbiAgICAgICAgbWlzc2luZ091dHB1dHM6IGV4cGVjdGVkLm1pc3NpbmcsXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBpdCgnaGFzIGV4cGVjdGVkIHJlc3VsdCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgIHRlc3QoW2FdLCBbXSwgeyBtaXNzaW5nOiBbXSwgZXhwbGljaXQ6IFtdLCBpbXBsaWNpdDogW2FdIH0pO1xuICAgICAgdGVzdChbXSwgW2FdLCB7IG1pc3Npbmc6IFthXSwgZXhwbGljaXQ6IFtdLCBpbXBsaWNpdDogW10gfSk7XG4gICAgICB0ZXN0KFthXSwgW2FdLCB7IG1pc3Npbmc6IFtdLCBleHBsaWNpdDogW2FdLCBpbXBsaWNpdDogW10gfSk7XG4gICAgICB0ZXN0KFthXSwgW2EyXSwgeyBtaXNzaW5nOiBbYTJdLCBleHBsaWNpdDogW10sIGltcGxpY2l0OiBbYV0gfSk7XG4gICAgICB0ZXN0KFtiXSwgW2FdLCB7IG1pc3Npbmc6IFthXSwgZXhwbGljaXQ6IFtdLCBpbXBsaWNpdDogW2JdIH0pO1xuICAgICAgdGVzdChbYSwgYV0sIFthXSwgeyBtaXNzaW5nOiBbXSwgZXhwbGljaXQ6IFthXSwgaW1wbGljaXQ6IFthXSB9KTtcbiAgICAgIHRlc3QoW2EsIGJdLCBbYV0sIHsgbWlzc2luZzogW10sIGV4cGxpY2l0OiBbYV0sIGltcGxpY2l0OiBbYl0gfSk7XG4gICAgfSk7XG4gIH0pO1xufSk7XG4iXX0=
@@ -24,6 +24,12 @@ function toBaseOutputBigInt(output) {
24
24
  function toBaseOutputString(output) {
25
25
  return toBaseOutput(output, 'string');
26
26
  }
27
+ function toMaxOutput(output) {
28
+ return {
29
+ ...output,
30
+ value: 'max',
31
+ };
32
+ }
27
33
  describe('parse', function () {
28
34
  const psbt = (0, mock_utils_1.mockPsbtDefaultWithDescriptorTemplate)('Wsh2Of3');
29
35
  function getBaseParsedTransaction(recipients) {
@@ -33,6 +39,9 @@ describe('parse', function () {
33
39
  it('should return the correct BaseParsedTransactionOutputs', async function () {
34
40
  await (0, fixtures_utils_1.assertEqualFixture)('parseWithoutRecipients.json', (0, toPlainObject_utils_1.toPlainObject)(getBaseParsedTransaction([])));
35
41
  await (0, fixtures_utils_1.assertEqualFixture)('parseWithRecipient.json', (0, toPlainObject_utils_1.toPlainObject)(getBaseParsedTransaction([psbt.txOutputs[0]])));
42
+ await (0, fixtures_utils_1.assertEqualFixture)('parseWithRecipient.json',
43
+ // max recipient: ignore actual value
44
+ (0, toPlainObject_utils_1.toPlainObject)(getBaseParsedTransaction([toMaxOutput(psbt.txOutputs[0])])));
36
45
  });
37
46
  function assertEqualValidationError(actual, expected) {
38
47
  if (actual instanceof verifyTransaction_1.AggregateValidationError) {
@@ -59,7 +68,11 @@ describe('parse', function () {
59
68
  new verifyTransaction_1.ErrorMissingOutputs([{ ...toBaseOutputBigInt(psbt.txOutputs[1]), external: true }]),
60
69
  new verifyTransaction_1.ErrorImplicitExternalOutputs([{ ...toBaseOutputBigInt(psbt.txOutputs[0]), external: true }]),
61
70
  ]));
71
+ assertValidationError(() => (0, verifyTransaction_1.assertExpectedOutputDifference)(getBaseParsedTransaction([toMaxOutput(psbt.txOutputs[1])])), new verifyTransaction_1.AggregateValidationError([
72
+ new verifyTransaction_1.ErrorMissingOutputs([{ ...toBaseOutputBigInt(toMaxOutput(psbt.txOutputs[1])), external: true }]),
73
+ new verifyTransaction_1.ErrorImplicitExternalOutputs([{ ...toBaseOutputBigInt(psbt.txOutputs[0]), external: true }]),
74
+ ]));
62
75
  });
63
76
  });
64
77
  });
65
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGFyc2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi90ZXN0L3RyYW5zYWN0aW9uL2Rlc2NyaXB0b3IvcGFyc2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSxvREFBNEI7QUFJNUIsc0VBQThGO0FBQzlGLHFFQUF3SDtBQUN4SCw2RUFBMkY7QUFDM0Ysd0VBQStEO0FBQy9ELDZGQUsrRDtBQUMvRCw2RkFBcUY7QUFHckYscURBQXNEO0FBRXRELFNBQVMsWUFBWSxDQUFVLE1BQTRCLEVBQUUsVUFBK0I7SUFDMUYsSUFBQSxnQkFBTSxFQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUN2QixPQUFPO1FBQ0wsT0FBTyxFQUFFLE1BQU0sQ0FBQyxPQUFPO1FBQ3ZCLE1BQU0sRUFBRSxJQUFBLGdDQUFZLEVBQUMsTUFBTSxDQUFDLEtBQUssRUFBRSxVQUFVLENBQVk7S0FDMUQsQ0FBQztBQUNKLENBQUM7QUFFRCxTQUFTLGtCQUFrQixDQUFDLE1BQTRCO0lBQ3RELE9BQU8sWUFBWSxDQUFDLE1BQU0sRUFBRSxRQUFRLENBQUMsQ0FBQztBQUN4QyxDQUFDO0FBRUQsU0FBUyxrQkFBa0IsQ0FBQyxNQUE0QjtJQUN0RCxPQUFPLFlBQVksQ0FBQyxNQUFNLEVBQUUsUUFBUSxDQUFDLENBQUM7QUFDeEMsQ0FBQztBQUVELFFBQVEsQ0FBQyxPQUFPLEVBQUU7SUFDaEIsTUFBTSxJQUFJLEdBQUcsSUFBQSxrREFBcUMsRUFBQyxTQUFTLENBQUMsQ0FBQztJQUU5RCxTQUFTLHdCQUF3QixDQUFDLFVBQWtDO1FBQ2xFLE9BQU8sSUFBQSw4Q0FBc0MsRUFDM0MsSUFBSSxFQUNKLElBQUEsbUNBQWdCLEVBQUMsU0FBUyxFQUFFLElBQUEsa0NBQWUsRUFBQyxHQUFHLENBQUMsQ0FBQyxFQUNqRCxVQUFVLENBQUMsR0FBRyxDQUFDLGtCQUFrQixDQUFDLEVBQ2xDLElBQUksQ0FBQyxPQUFPLENBQ2IsQ0FBQztJQUNKLENBQUM7SUFFRCxRQUFRLENBQUMsUUFBUSxFQUFFO1FBQ2pCLEVBQUUsQ0FBQyx3REFBd0QsRUFBRSxLQUFLO1lBQ2hFLE1BQU0sSUFBQSxtQ0FBa0IsRUFBQyw2QkFBNkIsRUFBRSxJQUFBLG1DQUFhLEVBQUMsd0JBQXdCLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ3JHLE1BQU0sSUFBQSxtQ0FBa0IsRUFBQyx5QkFBeUIsRUFBRSxJQUFBLG1DQUFhLEVBQUMsd0JBQXdCLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDcEgsQ0FBQyxDQUFDLENBQUM7UUFFSCxTQUFTLDBCQUEwQixDQUFDLE1BQWUsRUFBRSxRQUFrQztZQUNyRixJQUFJLE1BQU0sWUFBWSw0Q0FBd0IsRUFBRSxDQUFDO2dCQUMvQyxnQkFBTSxDQUFDLGVBQWUsQ0FBQyxNQUFNLENBQUMsTUFBTSxFQUFFLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUN6RCxDQUFDO2lCQUFNLENBQUM7Z0JBQ04sTUFBTSxJQUFJLEtBQUssQ0FBQyx1QkFBdUIsQ0FBQyxDQUFDO1lBQzNDLENBQUM7UUFDSCxDQUFDO1FBRUQsU0FBUyxxQkFBcUIsQ0FBQyxDQUFhLEVBQUUsUUFBa0M7WUFDOUUsZ0JBQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxFQUFFLEVBQUU7Z0JBQ3ZCLDBCQUEwQixDQUFDLEdBQUcsRUFBRSxRQUFRLENBQUMsQ0FBQztnQkFDMUMsT0FBTyxJQUFJLENBQUM7WUFDZCxDQUFDLENBQUMsQ0FBQztRQUNMLENBQUM7UUFFRCxFQUFFLENBQUMsOEJBQThCLEVBQUU7WUFDakMscUJBQXFCLENBQ25CLEdBQUcsRUFBRSxDQUFDLElBQUEsa0RBQThCLEVBQUMsd0JBQXdCLENBQUMsRUFBRSxDQUFDLENBQUMsRUFDbEUsSUFBSSw0Q0FBd0IsQ0FBQztnQkFDM0IsSUFBSSxnREFBNEIsQ0FBQyxDQUFDLEVBQUUsR0FBRyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7YUFDakcsQ0FBQyxDQUNILENBQUM7WUFFRixxQkFBcUIsQ0FDbkIsR0FBRyxFQUFFLENBQUMsSUFBQSxrREFBOEIsRUFBQyx3QkFBd0IsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUNsRSxJQUFJLDRDQUF3QixDQUFDO2dCQUMzQixJQUFJLGdEQUE0QixDQUFDLENBQUMsRUFBRSxHQUFHLGtCQUFrQixDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQzthQUNqRyxDQUFDLENBQ0gsQ0FBQztZQUVGLHFCQUFxQixDQUNuQixHQUFHLEVBQUUsQ0FBQyxJQUFBLGtEQUE4QixFQUFDLHdCQUF3QixDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFDbkYsSUFBSSw0Q0FBd0IsQ0FBQztnQkFDM0IsSUFBSSx1Q0FBbUIsQ0FBQyxDQUFDLEVBQUUsR0FBRyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7Z0JBQ3ZGLElBQUksZ0RBQTRCLENBQUMsQ0FBQyxFQUFFLEdBQUcsa0JBQWtCLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO2FBQ2pHLENBQUMsQ0FDSCxDQUFDO1FBQ0osQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDLENBQUMsQ0FBQztBQUNMLENBQUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IGFzc2VydCBmcm9tICdhc3NlcnQnO1xuXG5pbXBvcnQgKiBhcyB1dHhvbGliIGZyb20gJ0BiaXRnby91dHhvLWxpYic7XG5cbmltcG9ydCB7IG1vY2tQc2J0RGVmYXVsdFdpdGhEZXNjcmlwdG9yVGVtcGxhdGUgfSBmcm9tICcuLi8uLi9jb3JlL2Rlc2NyaXB0b3IvcHNidC9tb2NrLnV0aWxzJztcbmltcG9ydCB7IFBhcnNlZE91dHB1dHNCaWdJbnQsIHRvQmFzZVBhcnNlZFRyYW5zYWN0aW9uT3V0cHV0c0Zyb21Qc2J0IH0gZnJvbSAnLi4vLi4vLi4vc3JjL3RyYW5zYWN0aW9uL2Rlc2NyaXB0b3IvcGFyc2UnO1xuaW1wb3J0IHsgZ2V0RGVmYXVsdFhQdWJzLCBnZXREZXNjcmlwdG9yTWFwIH0gZnJvbSAnLi4vLi4vY29yZS9kZXNjcmlwdG9yL2Rlc2NyaXB0b3IudXRpbHMnO1xuaW1wb3J0IHsgdG9QbGFpbk9iamVjdCB9IGZyb20gJy4uLy4uL2NvcmUvdG9QbGFpbk9iamVjdC51dGlscyc7XG5pbXBvcnQge1xuICBBZ2dyZWdhdGVWYWxpZGF0aW9uRXJyb3IsXG4gIGFzc2VydEV4cGVjdGVkT3V0cHV0RGlmZmVyZW5jZSxcbiAgRXJyb3JJbXBsaWNpdEV4dGVybmFsT3V0cHV0cyxcbiAgRXJyb3JNaXNzaW5nT3V0cHV0cyxcbn0gZnJvbSAnLi4vLi4vLi4vc3JjL3RyYW5zYWN0aW9uL2Rlc2NyaXB0b3IvdmVyaWZ5VHJhbnNhY3Rpb24nO1xuaW1wb3J0IHsgdG9BbW91bnRUeXBlIH0gZnJvbSAnLi4vLi4vLi4vc3JjL3RyYW5zYWN0aW9uL2Rlc2NyaXB0b3IvcGFyc2VUb0Ftb3VudFR5cGUnO1xuaW1wb3J0IHsgQmFzZU91dHB1dCB9IGZyb20gJy4uLy4uLy4uL3NyYyc7XG5cbmltcG9ydCB7IGFzc2VydEVxdWFsRml4dHVyZSB9IGZyb20gJy4vZml4dHVyZXMudXRpbHMnO1xuXG5mdW5jdGlvbiB0b0Jhc2VPdXRwdXQ8VE51bWJlcj4ob3V0cHV0OiB1dHhvbGliLlBzYnRUeE91dHB1dCwgYW1vdW50VHlwZTogJ2JpZ2ludCcgfCAnc3RyaW5nJyk6IEJhc2VPdXRwdXQ8VE51bWJlcj4ge1xuICBhc3NlcnQob3V0cHV0LmFkZHJlc3MpO1xuICByZXR1cm4ge1xuICAgIGFkZHJlc3M6IG91dHB1dC5hZGRyZXNzLFxuICAgIGFtb3VudDogdG9BbW91bnRUeXBlKG91dHB1dC52YWx1ZSwgYW1vdW50VHlwZSkgYXMgVE51bWJlcixcbiAgfTtcbn1cblxuZnVuY3Rpb24gdG9CYXNlT3V0cHV0QmlnSW50KG91dHB1dDogdXR4b2xpYi5Qc2J0VHhPdXRwdXQpOiBCYXNlT3V0cHV0PGJpZ2ludD4ge1xuICByZXR1cm4gdG9CYXNlT3V0cHV0KG91dHB1dCwgJ2JpZ2ludCcpO1xufVxuXG5mdW5jdGlvbiB0b0Jhc2VPdXRwdXRTdHJpbmcob3V0cHV0OiB1dHhvbGliLlBzYnRUeE91dHB1dCk6IEJhc2VPdXRwdXQ8c3RyaW5nPiB7XG4gIHJldHVybiB0b0Jhc2VPdXRwdXQob3V0cHV0LCAnc3RyaW5nJyk7XG59XG5cbmRlc2NyaWJlKCdwYXJzZScsIGZ1bmN0aW9uICgpIHtcbiAgY29uc3QgcHNidCA9IG1vY2tQc2J0RGVmYXVsdFdpdGhEZXNjcmlwdG9yVGVtcGxhdGUoJ1dzaDJPZjMnKTtcblxuICBmdW5jdGlvbiBnZXRCYXNlUGFyc2VkVHJhbnNhY3Rpb24ocmVjaXBpZW50czogdXR4b2xpYi5Qc2J0VHhPdXRwdXRbXSk6IFBhcnNlZE91dHB1dHNCaWdJbnQge1xuICAgIHJldHVybiB0b0Jhc2VQYXJzZWRUcmFuc2FjdGlvbk91dHB1dHNGcm9tUHNidChcbiAgICAgIHBzYnQsXG4gICAgICBnZXREZXNjcmlwdG9yTWFwKCdXc2gyT2YzJywgZ2V0RGVmYXVsdFhQdWJzKCdhJykpLFxuICAgICAgcmVjaXBpZW50cy5tYXAodG9CYXNlT3V0cHV0U3RyaW5nKSxcbiAgICAgIHBzYnQubmV0d29ya1xuICAgICk7XG4gIH1cblxuICBkZXNjcmliZSgndG9CYXNlJywgZnVuY3Rpb24gKCkge1xuICAgIGl0KCdzaG91bGQgcmV0dXJuIHRoZSBjb3JyZWN0IEJhc2VQYXJzZWRUcmFuc2FjdGlvbk91dHB1dHMnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBhd2FpdCBhc3NlcnRFcXVhbEZpeHR1cmUoJ3BhcnNlV2l0aG91dFJlY2lwaWVudHMuanNvbicsIHRvUGxhaW5PYmplY3QoZ2V0QmFzZVBhcnNlZFRyYW5zYWN0aW9uKFtdKSkpO1xuICAgICAgYXdhaXQgYXNzZXJ0RXF1YWxGaXh0dXJlKCdwYXJzZVdpdGhSZWNpcGllbnQuanNvbicsIHRvUGxhaW5PYmplY3QoZ2V0QmFzZVBhcnNlZFRyYW5zYWN0aW9uKFtwc2J0LnR4T3V0cHV0c1swXV0pKSk7XG4gICAgfSk7XG5cbiAgICBmdW5jdGlvbiBhc3NlcnRFcXVhbFZhbGlkYXRpb25FcnJvcihhY3R1YWw6IHVua25vd24sIGV4cGVjdGVkOiBBZ2dyZWdhdGVWYWxpZGF0aW9uRXJyb3IpIHtcbiAgICAgIGlmIChhY3R1YWwgaW5zdGFuY2VvZiBBZ2dyZWdhdGVWYWxpZGF0aW9uRXJyb3IpIHtcbiAgICAgICAgYXNzZXJ0LmRlZXBTdHJpY3RFcXVhbChhY3R1YWwuZXJyb3JzLCBleHBlY3RlZC5lcnJvcnMpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCd1bmV4cGVjdGVkIGVycm9yIHR5cGUnKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiBhc3NlcnRWYWxpZGF0aW9uRXJyb3IoZjogKCkgPT4gdm9pZCwgZXhwZWN0ZWQ6IEFnZ3JlZ2F0ZVZhbGlkYXRpb25FcnJvcikge1xuICAgICAgYXNzZXJ0LnRocm93cyhmLCAoZXJyKSA9PiB7XG4gICAgICAgIGFzc2VydEVxdWFsVmFsaWRhdGlvbkVycm9yKGVyciwgZXhwZWN0ZWQpO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGl0KCdzaG91bGQgdGhyb3cgZXhwZWN0ZWQgZXJyb3JzJywgZnVuY3Rpb24gKCkge1xuICAgICAgYXNzZXJ0VmFsaWRhdGlvbkVycm9yKFxuICAgICAgICAoKSA9PiBhc3NlcnRFeHBlY3RlZE91dHB1dERpZmZlcmVuY2UoZ2V0QmFzZVBhcnNlZFRyYW5zYWN0aW9uKFtdKSksXG4gICAgICAgIG5ldyBBZ2dyZWdhdGVWYWxpZGF0aW9uRXJyb3IoW1xuICAgICAgICAgIG5ldyBFcnJvckltcGxpY2l0RXh0ZXJuYWxPdXRwdXRzKFt7IC4uLnRvQmFzZU91dHB1dEJpZ0ludChwc2J0LnR4T3V0cHV0c1swXSksIGV4dGVybmFsOiB0cnVlIH1dKSxcbiAgICAgICAgXSlcbiAgICAgICk7XG5cbiAgICAgIGFzc2VydFZhbGlkYXRpb25FcnJvcihcbiAgICAgICAgKCkgPT4gYXNzZXJ0RXhwZWN0ZWRPdXRwdXREaWZmZXJlbmNlKGdldEJhc2VQYXJzZWRUcmFuc2FjdGlvbihbXSkpLFxuICAgICAgICBuZXcgQWdncmVnYXRlVmFsaWRhdGlvbkVycm9yKFtcbiAgICAgICAgICBuZXcgRXJyb3JJbXBsaWNpdEV4dGVybmFsT3V0cHV0cyhbeyAuLi50b0Jhc2VPdXRwdXRCaWdJbnQocHNidC50eE91dHB1dHNbMF0pLCBleHRlcm5hbDogdHJ1ZSB9XSksXG4gICAgICAgIF0pXG4gICAgICApO1xuXG4gICAgICBhc3NlcnRWYWxpZGF0aW9uRXJyb3IoXG4gICAgICAgICgpID0+IGFzc2VydEV4cGVjdGVkT3V0cHV0RGlmZmVyZW5jZShnZXRCYXNlUGFyc2VkVHJhbnNhY3Rpb24oW3BzYnQudHhPdXRwdXRzWzFdXSkpLFxuICAgICAgICBuZXcgQWdncmVnYXRlVmFsaWRhdGlvbkVycm9yKFtcbiAgICAgICAgICBuZXcgRXJyb3JNaXNzaW5nT3V0cHV0cyhbeyAuLi50b0Jhc2VPdXRwdXRCaWdJbnQocHNidC50eE91dHB1dHNbMV0pLCBleHRlcm5hbDogdHJ1ZSB9XSksXG4gICAgICAgICAgbmV3IEVycm9ySW1wbGljaXRFeHRlcm5hbE91dHB1dHMoW3sgLi4udG9CYXNlT3V0cHV0QmlnSW50KHBzYnQudHhPdXRwdXRzWzBdKSwgZXh0ZXJuYWw6IHRydWUgfV0pLFxuICAgICAgICBdKVxuICAgICAgKTtcbiAgICB9KTtcbiAgfSk7XG59KTtcbiJdfQ==
78
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGFyc2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi90ZXN0L3RyYW5zYWN0aW9uL2Rlc2NyaXB0b3IvcGFyc2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSxvREFBNEI7QUFFNUIsc0VBQThGO0FBQzlGLHFFQUF3SDtBQUN4SCw2RUFBMkY7QUFDM0Ysd0VBQStEO0FBQy9ELDZGQUsrRDtBQUMvRCw2RkFBcUY7QUFHckYscURBQXNEO0FBT3RELFNBQVMsWUFBWSxDQUFVLE1BQXVCLEVBQUUsVUFBK0I7SUFDckYsSUFBQSxnQkFBTSxFQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUN2QixPQUFPO1FBQ0wsT0FBTyxFQUFFLE1BQU0sQ0FBQyxPQUFPO1FBQ3ZCLE1BQU0sRUFBRSxJQUFBLGdDQUFZLEVBQUMsTUFBTSxDQUFDLEtBQUssRUFBRSxVQUFVLENBQVk7S0FDMUQsQ0FBQztBQUNKLENBQUM7QUFFRCxTQUFTLGtCQUFrQixDQUFDLE1BQXVCO0lBQ2pELE9BQU8sWUFBWSxDQUFDLE1BQU0sRUFBRSxRQUFRLENBQUMsQ0FBQztBQUN4QyxDQUFDO0FBRUQsU0FBUyxrQkFBa0IsQ0FBQyxNQUF1QjtJQUNqRCxPQUFPLFlBQVksQ0FBQyxNQUFNLEVBQUUsUUFBUSxDQUFDLENBQUM7QUFDeEMsQ0FBQztBQUVELFNBQVMsV0FBVyxDQUFDLE1BQXVCO0lBQzFDLE9BQU87UUFDTCxHQUFHLE1BQU07UUFDVCxLQUFLLEVBQUUsS0FBSztLQUNiLENBQUM7QUFDSixDQUFDO0FBRUQsUUFBUSxDQUFDLE9BQU8sRUFBRTtJQUNoQixNQUFNLElBQUksR0FBRyxJQUFBLGtEQUFxQyxFQUFDLFNBQVMsQ0FBQyxDQUFDO0lBRTlELFNBQVMsd0JBQXdCLENBQUMsVUFBNkI7UUFDN0QsT0FBTyxJQUFBLDhDQUFzQyxFQUMzQyxJQUFJLEVBQ0osSUFBQSxtQ0FBZ0IsRUFBQyxTQUFTLEVBQUUsSUFBQSxrQ0FBZSxFQUFD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QUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQzthQUNqRyxDQUFDLENBQ0gsQ0FBQztZQUVGLHFCQUFxQixDQUNuQixHQUFHLEVBQUUsQ0FBQyxJQUFBLGtEQUE4QixFQUFDLHdCQUF3QixDQUFDLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFDaEcsSUFBSSw0Q0FBd0IsQ0FBQztnQkFDM0IsSUFBSSx1Q0FBbUIsQ0FBQyxDQUFDLEVBQUUsR0FBRyxrQkFBa0IsQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7Z0JBQ3BHLElBQUksZ0RBQTRCLENBQUMsQ0FBQyxFQUFFLEdBQUcsa0JBQWtCLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO2FBQ2pHLENBQUMsQ0FDSCxDQUFDO1FBQ0osQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDLENBQUMsQ0FBQztBQUNMLENBQUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IGFzc2VydCBmcm9tICdhc3NlcnQnO1xuXG5pbXBvcnQgeyBtb2NrUHNidERlZmF1bHRXaXRoRGVzY3JpcHRvclRlbXBsYXRlIH0gZnJvbSAnLi4vLi4vY29yZS9kZXNjcmlwdG9yL3BzYnQvbW9jay51dGlscyc7XG5pbXBvcnQgeyBQYXJzZWRPdXRwdXRzQmlnSW50LCB0b0Jhc2VQYXJzZWRUcmFuc2FjdGlvbk91dHB1dHNGcm9tUHNidCB9IGZyb20gJy4uLy4uLy4uL3NyYy90cmFuc2FjdGlvbi9kZXNjcmlwdG9yL3BhcnNlJztcbmltcG9ydCB7IGdldERlZmF1bHRYUHVicywgZ2V0RGVzY3JpcHRvck1hcCB9IGZyb20gJy4uLy4uL2NvcmUvZGVzY3JpcHRvci9kZXNjcmlwdG9yLnV0aWxzJztcbmltcG9ydCB7IHRvUGxhaW5PYmplY3QgfSBmcm9tICcuLi8uLi9jb3JlL3RvUGxhaW5PYmplY3QudXRpbHMnO1xuaW1wb3J0IHtcbiAgQWdncmVnYXRlVmFsaWRhdGlvbkVycm9yLFxuICBhc3NlcnRFeHBlY3RlZE91dHB1dERpZmZlcmVuY2UsXG4gIEVycm9ySW1wbGljaXRFeHRlcm5hbE91dHB1dHMsXG4gIEVycm9yTWlzc2luZ091dHB1dHMsXG59IGZyb20gJy4uLy4uLy4uL3NyYy90cmFuc2FjdGlvbi9kZXNjcmlwdG9yL3ZlcmlmeVRyYW5zYWN0aW9uJztcbmltcG9ydCB7IHRvQW1vdW50VHlwZSB9IGZyb20gJy4uLy4uLy4uL3NyYy90cmFuc2FjdGlvbi9kZXNjcmlwdG9yL3BhcnNlVG9BbW91bnRUeXBlJztcbmltcG9ydCB7IEJhc2VPdXRwdXQgfSBmcm9tICcuLi8uLi8uLi9zcmMnO1xuXG5pbXBvcnQgeyBhc3NlcnRFcXVhbEZpeHR1cmUgfSBmcm9tICcuL2ZpeHR1cmVzLnV0aWxzJztcblxudHlwZSBPdXRwdXRXaXRoVmFsdWU8VCA9IG51bWJlciB8IGJpZ2ludCB8IHN0cmluZz4gPSB7XG4gIGFkZHJlc3M/OiBzdHJpbmc7XG4gIHZhbHVlOiBUO1xufTtcblxuZnVuY3Rpb24gdG9CYXNlT3V0cHV0PFROdW1iZXI+KG91dHB1dDogT3V0cHV0V2l0aFZhbHVlLCBhbW91bnRUeXBlOiAnYmlnaW50JyB8ICdzdHJpbmcnKTogQmFzZU91dHB1dDxUTnVtYmVyPiB7XG4gIGFzc2VydChvdXRwdXQuYWRkcmVzcyk7XG4gIHJldHVybiB7XG4gICAgYWRkcmVzczogb3V0cHV0LmFkZHJlc3MsXG4gICAgYW1vdW50OiB0b0Ftb3VudFR5cGUob3V0cHV0LnZhbHVlLCBhbW91bnRUeXBlKSBhcyBUTnVtYmVyLFxuICB9O1xufVxuXG5mdW5jdGlvbiB0b0Jhc2VPdXRwdXRCaWdJbnQob3V0cHV0OiBPdXRwdXRXaXRoVmFsdWUpOiBCYXNlT3V0cHV0PGJpZ2ludD4ge1xuICByZXR1cm4gdG9CYXNlT3V0cHV0KG91dHB1dCwgJ2JpZ2ludCcpO1xufVxuXG5mdW5jdGlvbiB0b0Jhc2VPdXRwdXRTdHJpbmcob3V0cHV0OiBPdXRwdXRXaXRoVmFsdWUpOiBCYXNlT3V0cHV0PHN0cmluZz4ge1xuICByZXR1cm4gdG9CYXNlT3V0cHV0KG91dHB1dCwgJ3N0cmluZycpO1xufVxuXG5mdW5jdGlvbiB0b01heE91dHB1dChvdXRwdXQ6IE91dHB1dFdpdGhWYWx1ZSk6IE91dHB1dFdpdGhWYWx1ZTwnbWF4Jz4ge1xuICByZXR1cm4ge1xuICAgIC4uLm91dHB1dCxcbiAgICB2YWx1ZTogJ21heCcsXG4gIH07XG59XG5cbmRlc2NyaWJlKCdwYXJzZScsIGZ1bmN0aW9uICgpIHtcbiAgY29uc3QgcHNidCA9IG1vY2tQc2J0RGVmYXVsdFdpdGhEZXNjcmlwdG9yVGVtcGxhdGUoJ1dzaDJPZjMnKTtcblxuICBmdW5jdGlvbiBnZXRCYXNlUGFyc2VkVHJhbnNhY3Rpb24ocmVjaXBpZW50czogT3V0cHV0V2l0aFZhbHVlW10pOiBQYXJzZWRPdXRwdXRzQmlnSW50IHtcbiAgICByZXR1cm4gdG9CYXNlUGFyc2VkVHJhbnNhY3Rpb25PdXRwdXRzRnJvbVBzYnQoXG4gICAgICBwc2J0LFxuICAgICAgZ2V0RGVzY3JpcHRvck1hcCgnV3NoMk9mMycsIGdldERlZmF1bHRYUHVicygnYScpKSxcbiAgICAgIHJlY2lwaWVudHMubWFwKHRvQmFzZU91dHB1dFN0cmluZyksXG4gICAgICBwc2J0Lm5ldHdvcmtcbiAgICApO1xuICB9XG5cbiAgZGVzY3JpYmUoJ3RvQmFzZScsIGZ1bmN0aW9uICgpIHtcbiAgICBpdCgnc2hvdWxkIHJldHVybiB0aGUgY29ycmVjdCBCYXNlUGFyc2VkVHJhbnNhY3Rpb25PdXRwdXRzJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgYXdhaXQgYXNzZXJ0RXF1YWxGaXh0dXJlKCdwYXJzZVdpdGhvdXRSZWNpcGllbnRzLmpzb24nLCB0b1BsYWluT2JqZWN0KGdldEJhc2VQYXJzZWRUcmFuc2FjdGlvbihbXSkpKTtcbiAgICAgIGF3YWl0IGFzc2VydEVxdWFsRml4dHVyZSgncGFyc2VXaXRoUmVjaXBpZW50Lmpzb24nLCB0b1BsYWluT2JqZWN0KGdldEJhc2VQYXJzZWRUcmFuc2FjdGlvbihbcHNidC50eE91dHB1dHNbMF1dKSkpO1xuICAgICAgYXdhaXQgYXNzZXJ0RXF1YWxGaXh0dXJlKFxuICAgICAgICAncGFyc2VXaXRoUmVjaXBpZW50Lmpzb24nLFxuICAgICAgICAvLyBtYXggcmVjaXBpZW50OiBpZ25vcmUgYWN0dWFsIHZhbHVlXG4gICAgICAgIHRvUGxhaW5PYmplY3QoZ2V0QmFzZVBhcnNlZFRyYW5zYWN0aW9uKFt0b01heE91dHB1dChwc2J0LnR4T3V0cHV0c1swXSldKSlcbiAgICAgICk7XG4gICAgfSk7XG5cbiAgICBmdW5jdGlvbiBhc3NlcnRFcXVhbFZhbGlkYXRpb25FcnJvcihhY3R1YWw6IHVua25vd24sIGV4cGVjdGVkOiBBZ2dyZWdhdGVWYWxpZGF0aW9uRXJyb3IpIHtcbiAgICAgIGlmIChhY3R1YWwgaW5zdGFuY2VvZiBBZ2dyZWdhdGVWYWxpZGF0aW9uRXJyb3IpIHtcbiAgICAgICAgYXNzZXJ0LmRlZXBTdHJpY3RFcXVhbChhY3R1YWwuZXJyb3JzLCBleHBlY3RlZC5lcnJvcnMpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCd1bmV4cGVjdGVkIGVycm9yIHR5cGUnKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiBhc3NlcnRWYWxpZGF0aW9uRXJyb3IoZjogKCkgPT4gdm9pZCwgZXhwZWN0ZWQ6IEFnZ3JlZ2F0ZVZhbGlkYXRpb25FcnJvcikge1xuICAgICAgYXNzZXJ0LnRocm93cyhmLCAoZXJyKSA9PiB7XG4gICAgICAgIGFzc2VydEVxdWFsVmFsaWRhdGlvbkVycm9yKGVyciwgZXhwZWN0ZWQpO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGl0KCdzaG91bGQgdGhyb3cgZXhwZWN0ZWQgZXJyb3JzJywgZnVuY3Rpb24gKCkge1xuICAgICAgYXNzZXJ0VmFsaWRhdGlvbkVycm9yKFxuICAgICAgICAoKSA9PiBhc3NlcnRFeHBlY3RlZE91dHB1dERpZmZlcmVuY2UoZ2V0QmFzZVBhcnNlZFRyYW5zYWN0aW9uKFtdKSksXG4gICAgICAgIG5ldyBBZ2dyZWdhdGVWYWxpZGF0aW9uRXJyb3IoW1xuICAgICAgICAgIG5ldyBFcnJvckltcGxpY2l0RXh0ZXJuYWxPdXRwdXRzKFt7IC4uLnRvQmFzZU91dHB1dEJpZ0ludChwc2J0LnR4T3V0cHV0c1swXSksIGV4dGVybmFsOiB0cnVlIH1dKSxcbiAgICAgICAgXSlcbiAgICAgICk7XG5cbiAgICAgIGFzc2VydFZhbGlkYXRpb25FcnJvcihcbiAgICAgICAgKCkgPT4gYXNzZXJ0RXhwZWN0ZWRPdXRwdXREaWZmZXJlbmNlKGdldEJhc2VQYXJzZWRUcmFuc2FjdGlvbihbXSkpLFxuICAgICAgICBuZXcgQWdncmVnYXRlVmFsaWRhdGlvbkVycm9yKFtcbiAgICAgICAgICBuZXcgRXJyb3JJbXBsaWNpdEV4dGVybmFsT3V0cHV0cyhbeyAuLi50b0Jhc2VPdXRwdXRCaWdJbnQocHNidC50eE91dHB1dHNbMF0pLCBleHRlcm5hbDogdHJ1ZSB9XSksXG4gICAgICAgIF0pXG4gICAgICApO1xuXG4gICAgICBhc3NlcnRWYWxpZGF0aW9uRXJyb3IoXG4gICAgICAgICgpID0+IGFzc2VydEV4cGVjdGVkT3V0cHV0RGlmZmVyZW5jZShnZXRCYXNlUGFyc2VkVHJhbnNhY3Rpb24oW3BzYnQudHhPdXRwdXRzWzFdXSkpLFxuICAgICAgICBuZXcgQWdncmVnYXRlVmFsaWRhdGlvbkVycm9yKFtcbiAgICAgICAgICBuZXcgRXJyb3JNaXNzaW5nT3V0cHV0cyhbeyAuLi50b0Jhc2VPdXRwdXRCaWdJbnQocHNidC50eE91dHB1dHNbMV0pLCBleHRlcm5hbDogdHJ1ZSB9XSksXG4gICAgICAgICAgbmV3IEVycm9ySW1wbGljaXRFeHRlcm5hbE91dHB1dHMoW3sgLi4udG9CYXNlT3V0cHV0QmlnSW50KHBzYnQudHhPdXRwdXRzWzBdKSwgZXh0ZXJuYWw6IHRydWUgfV0pLFxuICAgICAgICBdKVxuICAgICAgKTtcblxuICAgICAgYXNzZXJ0VmFsaWRhdGlvbkVycm9yKFxuICAgICAgICAoKSA9PiBhc3NlcnRFeHBlY3RlZE91dHB1dERpZmZlcmVuY2UoZ2V0QmFzZVBhcnNlZFRyYW5zYWN0aW9uKFt0b01heE91dHB1dChwc2J0LnR4T3V0cHV0c1sxXSldKSksXG4gICAgICAgIG5ldyBBZ2dyZWdhdGVWYWxpZGF0aW9uRXJyb3IoW1xuICAgICAgICAgIG5ldyBFcnJvck1pc3NpbmdPdXRwdXRzKFt7IC4uLnRvQmFzZU91dHB1dEJpZ0ludCh0b01heE91dHB1dChwc2J0LnR4T3V0cHV0c1sxXSkpLCBleHRlcm5hbDogdHJ1ZSB9XSksXG4gICAgICAgICAgbmV3IEVycm9ySW1wbGljaXRFeHRlcm5hbE91dHB1dHMoW3sgLi4udG9CYXNlT3V0cHV0QmlnSW50KHBzYnQudHhPdXRwdXRzWzBdKSwgZXh0ZXJuYWw6IHRydWUgfV0pLFxuICAgICAgICBdKVxuICAgICAgKTtcbiAgICB9KTtcbiAgfSk7XG59KTtcbiJdfQ==